ZGlmZiAtLWdpdCBhL3YxL1JFQURNRS50eHQgYi92MS9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzJlYTQ5Li4wMDAwMDAwCi0tLSBhL3YxL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotMTAvMzAvMjAwMwotCi1XZWxjb21lIHRvIFhtbEJlYW5zIQotCi1BcGFjaGUgWE1MQmVhbnMgaXMgYW4gZWZmb3J0IHVuZGVyZ29pbmcgaW5jdWJhdGlvbiBhdCB0aGUgCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSwgc3BvbnNvcmVkIGJ5IHRoZSBYTUwgcHJvamVjdC4gCi1JbmN1YmF0aW9uIGlzIHJlcXVpcmVkIG9mIGFsbCBuZXdseSBhY2NlcHRlZCBwcm9qZWN0cyB1bnRpbCBhIAotZnVydGhlciByZXZpZXcgaW5kaWNhdGVzIHRoYXQgdGhlIGluZnJhc3RydWN0dXJlLCBjb21tdW5pY2F0aW9ucywgCi1hbmQgZGVjaXNpb24gbWFraW5nIHByb2Nlc3MgaGF2ZSBzdGFiaWxpemVkIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgCi13aXRoIG90aGVyIHN1Y2Nlc3NmdWwgQVNGIHByb2plY3RzLiBXaGlsZSBpbmN1YmF0aW9uIHN0YXR1cyBpcyBub3QgCi1uZWNlc3NhcmlseSBhIHJlZmxlY3Rpb24gb2YgdGhlIGNvbXBsZXRlbmVzcyBvciBzdGFiaWxpdHkgb2YgdGhlIAotY29kZSwgaXQgZG9lcyBpbmRpY2F0ZSB0aGF0IHRoZSBwcm9qZWN0IGhhcyB5ZXQgdG8gYmUgZnVsbHkgCi1lbmRvcnNlZCBieSB0aGUgQVNGLiAKLQotCi1JZiB5b3UndmUgY29tZSBoZXJlIHRvIGxlYXJuIG1vcmUgYWJvdXQgWG1sQmVhbnMsIGhlcmUgYXJlIGEgZmV3Ci1zdGFydGluZyBwb2ludHM6Ci0KLQotCi0KLSgxKSBEb2NzCi0gICAgCi1JZiB5b3UgImFudCBkb2NzIiB0aGVuIHlvdSBjYW4gZ2V0IGphdmFkb2NzIGJ1aWx0IGZvciBhIGJ1bmNoCi1vZiBvdXIgc3R1ZmYuIEluIHBhcnRpY3VsYXIsIGxvb2sgYXQgdGhlIG9yZy5hcGFjaGUueG1sYmVhbnMgcGFja2FnZSwKLXN0YXJ0aW5nIHdpdGggWG1sT2JqZWN0IGFuZCBYbWxDdXJzb3IuCi0KLU5vdCBhIGxvdCBpcyBkb2MnZWQgeWV0LCBzbyB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgb3V0IHRoZSBzYW1wbGVzCi10byBsZWFybiBtb3JlIC0gd2UgcmVhbGx5IG5lZWQgYSBsaXR0bGUgdHV0b3JpYWwuCi0KLUluIHRoZSBtZWFuIHRpbWUsIGlmIHlvdSd2ZSBnb3QgbW9yZSBxdWVzdGlvbnMsIHBsZWFzZSBwb3N0IHlvdXIgcXVlc3Rpb25zCi10byB4bWxiZWFucy11c2VyQHhtbC5hcGFjaGUub3JnICh5b3UgbmVlZCB0byBzdWJzY3JpYmUgcHJpb3IgdG8gcG9zdGluZywKLWJ5IHNlbmRpbmcgYSBibGFuayBtYWlsIHRvIHhtbGJlYW5zLXVzZXItc3Vic2NyaWJlQHhtbC5hcGFjaGUub3JnKS4KLQotCi0KLSgyKSBCdWlsZAotCi1UaGUgZGVmYXVsdCB0YXJnZXQsIGFrYSAiYW50IGRlZmF1bHQiLCBidWlsZHMgZXZlcnl0aGluZyB5b3UgbmVlZAotdG8gdGVzdCBhbmQgcnVuLiAKLQotCi1PdGhlciB0YXJnZXRzOgotICBhbnQgYnVpbGQ6IGJ1aWxkcyBwdWJsaWMgamFycyB0aGF0IGFyZSB1c2VkIGZvciBjb21waWxpbmcgb3RoZXIgYml0cyBvZiB3bHcKLSAgYW50IGRlcGxveTogYnVpbGRzIHhiZWFuLmphciB0b28KLSAgYW50IGRydDogYnVpbGRzIGRydCB0ZXN0cyB0b28KLSAgYW50IGJvb3RzdHJhcDogYnVpbGRzIHhiZWFuLmphciwgdGhlbiBidWlsZHMgaXQgYWdhaW4gdXNpbmcgaXRzZWxmLgotCi0KLUludGVyZmFjZSBKQVJzOgotCi14bWxwdWJsaWMuamFyIC0gdGhlIFhCZWFucyBwdWJsaWMgaW50ZXJmYWNlcywgZm9yIHVzZSBieSBvdXIgdXNlcnMuCi13bHhiZWFuLmphciAtIGludGVyZmFjZXMgc3BlY2lmaWMgdG8gdGhlIElERS9ydW50aW1lLCBub3QgZm9yIHVzZSBieSBvdGhlcnMuCi0KLQotSW1wbGVtZW50YXRpb24gSkFSczoKLQoteGJlYW4uamFyIC0gdGhlIHdob2xlIHhiZWFuLmphciAtIGV2ZXJ5dGhpbmcgeW91IG5lZWQgdG8gcnVuLiBXaGVuIHRoaXMKLSBpcyBvbiB5b3VyIGNsYXNzcGF0aCwgeW91IGRvbid0IG5lZWQgeG1scHVibGljLmphciBvciB3bHhiZWFuLmphcgotCi0KLVRlc3RpbmcgSkFSczoKLQotZHJ0LmphciAtIG91ciBEUlQKLWVudW10ZXN0LmphciwgZWFzeXBvLmphciwgbmFtZXdvcmxkLmphciwgeHN0eXBlcy5qYXIgLSBzYW1wbGUgWEJlYW4gSkFScy4KLQotCi1PdGhlciBKQVJzOgotCi1vbGR4YmVhbi5qYXIgLSBhIGZ1bGx5IGJ1aWx0IHByZXZpb3VzLXZlcnNpb24gb2YgeGJlYW4uamFyLCB1c2VkIGZvcgotICBib290c3RyYXBwaW5nLCBzaW5jZSB4YmVhbnMgYXJlIHVzZWQgaW4gYnVpbGRpbmcgeGJlYW4uamFyIGl0c2VsZi4KLQotCi0KLQotCi0oMykgUnVubmluZwotCi1UaGVyZSBhcmUgYSBmZXcgd2F5cyB5b3UgY2FuIHJ1bi4gIFRoZXJlIGlzIHNvbWUgcHJldHR5IHBsYWluLWphbmUKLUpVbml0IHRlc3RpbmcgY29kZSBjaGVja2VkIGludG8geGJlYW5cdGVzdFxzcmNcZHJ0IHRoYXQgeW91IGNhbgotdXNlIHRvIHNlZSBob3cgdG8gZXhlcmNpc2Ugb3VyIGZ1bmN0aW9uYWxpdHkuIChUaGUgdGVzdHMgaW4gdGhhdAotZGlyZWN0b3J5IGFyZSBvdXIgRGV2ZWxvcGVyIFJlZ3Jlc3Npb24gVGVzdHMuKQotCi1Zb3UgY2FuIHJ1biB0aGUgZHJ0IHVzaW5nIHhiZWFuXGJpblxkcnRbLnNofC5jbWRdLgotCi1Bbm90aGVyIHRvb2wgdGhhdCB5b3UgY2FuIHVzZSBpcyAic2NvbXAiLCB0aGUgWEJlYW4gc2NoZW1hCi1jb21waWxlci4gVGhlIHNjb21wIHNjcmlwdCBpcyBhdCB4YmVhblxiaW5cc2NvbXBbLnNofC5jbWRdLgotCi1UbyBydW4gc2NvbXAsIGp1c3QgcG9pbnQgaXQgYXQgYW4gWFNEIGZpbGUgb3IgYSBkaXJlY3RvcnkgZnVsbAotb2YgWFNEIGZpbGVzLCBhbmQgaXQgd2lsbCBwcm9kdWNlIGFuIG91dHB1dCAuamFyIHdpdGggYWxsIHlvdXIKLXR5cGVzLgotCi1TaW5jZSBzY29tcCBqYXJzIHVwIGl0cyByZXN1bHRzLCBpdCBjYW4gYmUgaGFyZCB0byBzZWUgd2hhdCBpdAotaXMgZG9pbmcuIEJ1dCBpZiB5b3UgdXNlIHRoZSAiLXNyYyBteWRpciIgb3B0aW9uIHdpdGggc2NvbXAsCi15b3UgY2FuIHNwZWNpZnkgYSBkaXJlY3RvcnkgaW50byB3aGljaCBpdCB3aWxsIGR1bXAgLmphdmEgc291cmNlCi1jb2RlIGZpbGVzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgamF2YSB0eXBlcyBpdCBpcyBnZW5lcmF0aW5nLgotCi1GaW5hbGx5LCB0aGVyZSBpcyBhIHV0aWxpdHkgY2FsbGVkICJkdW1weHNiIi4gSWYgeW91IHVuamFyCi1hIGJ1aWx0IHhiZWFuIGphciwgeW91J2xsIG5vdGljZSBhIGJ1bmNoIG9mIC54c2IgZmlsZXMgc2NhdHRlcmVkCi1hYm91dC4gRWFjaCBvbmUgb2YgdGhlc2UgZmlsZXMgcmVwcmVzZW50cyBhIHNjaGVtYSB0eXBlLCBhdHRyaWJ1dGUsCi1vciBlbGVtZW50IGRlZmluaXRpb24sIGFuZCB5b3UgY2FuIHVzZSAiZHVtcHhzYiIgdG8gc2VlIHRoZQotY29udGVudHMuCi0KZGlmZiAtLWdpdCBhL3YxL2Jpbi9kdW1weHNiIGIvdjEvYmluL2R1bXB4c2IKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2NjY1ZjguLjAwMDAwMDAKLS0tIGEvdjEvYmluL2R1bXB4c2IKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jIS8jaW4vc2gKLQotI1hTQiBmaWxlIGR1bXBlcgotI1ByaW50cyB0aGUgY29udGVudHMgb2YgYW4geHNiIGZpbGUgaW4gaHVtYW4tcmVhZG1ibGUgZm9ybQotCi1jcD0KLWNwPSRjcDokWE1MQkVBTlNfSE9NRS9idWlsZC9saWJ1eGJlYW4uamFyCi0KLWphdmEgCi1jbGFzc3BhdGggJGNwIG9yZy5hcGFjaGUueG1sZWVhbnMuaW1wbC50b29sLnBzYkR1bXBlciAkKgpkaWZmIC0tZ2l0IGEvdjEvYmluL2R1bXB4c2IuY21kIGIvdjEvYmluL2R1bXB4c2IuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWI2MmNmLi4wMDAwMDAwCi0tLSBhL3YxL2Jpbi9kdW1weHNiLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLUByZW0gWFNCIGZpbGUgZHVtcGVyCi1AcmVtCi1AcmVtIFByaW50cyB0aGUgY29udGVudHMgb2YgYW4geHNiIGZpbGUgaW4gaHVtYW4tcmVhZGFibGUgZm9ybQotQGVjaG8gb2ZmCi0KLXNldGxvY2FsCi1pZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuWHNiRHVtcGVyICUqCi0KLTpkb25lCmRpZmYgLS1naXQgYS92MS9iaW4vamF4YmMuY21kIGIvdjEvYmluL2pheGJjLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlkMjA3OS4uMDAwMDAwMAotLS0gYS92MS9iaW4vamF4YmMuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotQHJlbSBTY2hlbWEgY29tcGlsZXIKLUByZW0KLUByZW0gQnVpbGRzIGpheGIgdHlwZXMgZnJvbSB4c2QgZmlsZXMuCi0KLUBlY2hvIG9mZgotCi1zZXRsb2NhbAotaWYgIiVYTUxCRUFOU19IT01FJSIgRVFVICIiIChzZXQgWE1MQkVBTlNfSE9NRT0lfmRwMC4uKQotCi1zZXQgY3A9Ci1zZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyCi1zZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcZXh0ZXJuYWxcbGliXGpheGItMS4wXGpheGItYXBpLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJWNwJSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5TY2hlbWFDb21waWxlciAtamF4YiAlKgotCi06ZG9uZQpkaWZmIC0tZ2l0IGEvdjEvYmluL3JhbmRvbS5jbWQgYi92MS9iaW4vcmFuZG9tLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyN2QyNi4uMDAwMDAwMAotLS0gYS92MS9iaW4vcmFuZG9tLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLUBlY2hvIG9mZgotCi1AcmVtIERSVAotQHJlbQotQHJlbSBJbnZva2VzIFJhbmRvbSB0ZXN0Ci0KLXNldGxvY2FsCi1pZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIKLXNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxwcml2YXRlXGxpYlxyYW5kb20uamFyCi1zZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRccHJpdmF0ZVxsaWJcZWFzeXBvLmphcgotCi1yZW0gamF2YSAtZWEgLUR0cmVlYXNzZXJ0cz10cnVlICAtRHhiZWFuLnJvb3RkaXI9JVhNTEJFQU5TX0hPTUUlIC1jbGFzc3BhdGggJWNwJSBSYW5kb20gLW5vcXVlcnkgJSoKLSAgICBqYXZhIC1lYSAtRHRyZWVhc3NlcnRzPWZhbHNlIC1EeGJlYW4ucm9vdGRpcj0lWE1MQkVBTlNfSE9NRSUgLWNsYXNzcGF0aCAlY3AlIFJhbmRvbSAtbm9xdWVyeSAlKgpkaWZmIC0tZ2l0IGEvdjEvYmluL3Njb21wIGIvdjEvYmluL3Njb21wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MzVjYTgzLi4wMDAwMDAwCi0tLSBhL3YxL2Jpbi9zY29tcAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotIyEvYmluL3NoCi0KLSNTY2hlbWEgY29tcGlsZXIKLSNCdWlsZHMgWEJlYW4gdHlwZXMgZnJvbSB4c2QgZmlsZXMuCi0KLWNwPQotY3A9JGNwOiRYTUxCRUFOU19IT01FL2J1aWxkL2FyL3hiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJGNwIG9ydC5hcGFjaGUueG1sYmVhbnNlaW1wbC50b29sbVNjaGVtYUNvbXBpbGVyICQqCmRpZmYgLS1naXQgYS92MS9iaW4vc2NvbXAuY21kIGIvdjEvYmluL3Njb21wLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVlZDAxYi4uMDAwMDAwMAotLS0gYS92MS9iaW4vc2NvbXAuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotQHJlbSBTY2hlbWEgY29tcGlsZXIKLUByZW0KLUByZW0gQnVpbGRzIFhCZWFuIHR5cGVzIGZyb20geHNkIGZpbGVzLgotCi1AZWNobyBvZmYKLQotc2V0bG9jYWwKLWlmICIlWE1MQkVBTlNfSE9NRSUiIEVRVSAiIiAoc2V0IFhNTEJFQU5TX0hPTUU9JX5kcDAuLikKLQotc2V0IGNwPQotc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJWNwJSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5TY2hlbWFDb21waWxlciAlKgotCi06ZG9uZQpkaWZmIC0tZ2l0IGEvdjEvYmluL3Njb3B5LmNtZCBiL3YxL2Jpbi9zY29weS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwOTRjM2EuLjAwMDAwMDAKLS0tIGEvdjEvYmluL3Njb3B5LmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLUByZW0gU2NoZW1hIGNvbXBpbGVyCi1AcmVtCi1AcmVtIEJ1aWxkcyBYQmVhbiB0eXBlcyBmcm9tIHhzZCBmaWxlcy4KLQotQGVjaG8gb2ZmCi0KLXNldGxvY2FsCi1pZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuU2NoZW1hQ29weSAlKgotCi06ZG9uZQpkaWZmIC0tZ2l0IGEvdjEvYmluL3Nkb3dubG9hZC5jbWQgYi92MS9iaW4vc2Rvd25sb2FkLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ1ODI5ZC4uMDAwMDAwMAotLS0gYS92MS9iaW4vc2Rvd25sb2FkLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLUByZW0gU2NoZW1hIGRvd25sb2FkZXIKLUByZW0KLUByZW0gVG9vbCB0byBkb3dubG9hZCBzY2hlbWFzLgotCi1AZWNobyBvZmYKLQotc2V0bG9jYWwKLWlmICIlWE1MQkVBTlNfSE9NRSUiIEVRVSAiIiAoc2V0IFhNTEJFQU5TX0hPTUU9JX5kcDAuLikKLQotc2V0IGNwPQotc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJWNwJSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5TY2hlbWFSZXNvdXJjZU1hbmFnZXIgJSoKLQotOmRvbmUKZGlmZiAtLWdpdCBhL3YxL2Jpbi9zZmFjdG9yLmNtZCBiL3YxL2Jpbi9zZmFjdG9yLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdhMDcwMy4uMDAwMDAwMAotLS0gYS92MS9iaW4vc2ZhY3Rvci5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1AcmVtIFNjaGVtYSBGYWN0b3JpbmcgdG9vbAotQHJlbQotQHJlbSBGYWN0b3JlcyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb3V0IG9mIGEgc2V0IG9mIHNjaGVtYXMgYW5kIHVzZXMgaW1wb3J0cyBpbnN0ZWFkLgotCi1AZWNobyBvZmYKLQotc2V0bG9jYWwKLWlmICIlWE1MQkVBTlNfSE9NRSUiIEVRVSAiIiAoc2V0IFhNTEJFQU5TX0hPTUU9JX5kcDAuLikKLQotc2V0IGNwPQotc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJWNwJSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5GYWN0b3JJbXBvcnRzICUqCi0KLTpkb25lCmRpZmYgLS1naXQgYS92MS9iaW4vdmFsaWRhdGUgYi92MS9iaW4vdmFsaWRhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE5MTNiZDkuLjAwMDAwMDAKLS0tIGEvdjEvYmluL3ZhbGlkYXRlCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIyEvI2luL3NoCi0jCi0jIEluc3RhbmNlIFZhbGlkYXRvcgotIwotIyBWYWxpZGF0ZXMgYW4gaW5zdGFuY2UgYWdhaW5zdCBhIHNjaGVtYS4KLQotQ1A9Ci1DUD0kQ1A6JFhNTEJFQU5TX0hPTUUvYnVpbGQvYXIveGJlYW4uamFyCi0KLWphdmEgLWNsYXNzcCB0aCAkQ1Agb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuSW5zdGFuY2VWYWxpZGF0b3IgJCoKZGlmZiAtLWdpdCBhL3YxL2Jpbi92YWxpZGF0ZS5jbWQgYi92MS9iaW4vdmFsaWRhdGUuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjI4NWNmLi4wMDAwMDAwCi0tLSBhL3YxL2Jpbi92YWxpZGF0ZS5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1AcmVtIEluc3RhbmNlIFZhbGlkYXRvcgotQHJlbQotQHJlbSBWYWxpZGF0ZXMgYW4gaW5zdGFuY2UgYWdhaW5zdCBhIHNjaGVtYS4KLQotQGVjaG8gb2ZmCi0KLXNldGxvY2FsCi1pZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuSW5zdGFuY2VWYWxpZGF0b3IgJSoKLQotOmRvbmUKZGlmZiAtLWdpdCBhL3YxL2Jpbi94cHJldHR5LmNtZCBiL3YxL2Jpbi94cHJldHR5LmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1MWU4YS4uMDAwMDAwMAotLS0gYS92MS9iaW4veHByZXR0eS5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1AZWNobyBvZmYKLQotQHJlbSBJbnZva2VzIHByZXR0eSBwcmludGVyCi0KLXNldGxvY2FsCi1pZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuUHJldHR5UHJpbnRlciAlKgpkaWZmIC0tZ2l0IGEvdjEvYmluL3hzZHRyZWUuY21kIGIvdjEvYmluL3hzZHRyZWUuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzcxYThmLi4wMDAwMDAwCi0tLSBhL3YxL2Jpbi94c2R0cmVlLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLUBlY2hvIG9mZgotCi1AcmVtIEludm9rZXMgdHlwZSBoaWVyYXJjaHkgcHJpbnRlcgotCi1zZXRsb2NhbAotaWYgIiVYTUxCRUFOU19IT01FJSIgRVFVICIiIChzZXQgWE1MQkVBTlNfSE9NRT0lfmRwMC4uKQotCi1zZXQgY3A9Ci1zZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyCi0KLWphdmEgLWNsYXNzcGF0aCAlY3AlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlR5cGVIaWVyYXJjaHlQcmludGVyICUqCmRpZmYgLS1naXQgYS92MS9iaW4veHN0Yy5jbWQgYi92MS9iaW4veHN0Yy5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZWJkNjEuLjAwMDAwMDAKLS0tIGEvdjEvYmluL3hzdGMuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotQGVjaG8gb2ZmCi0KLUByZW0gSW52b2tlcyBYU1RDCi0KLXNldGxvY2FsCi1pZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuWFNUQ1Rlc3RlciAlKgpkaWZmIC0tZ2l0IGEvdjEvYnVpbGQueG1sIGIvdjEvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTdhM2ZkLi4wMDAwMDAwCi0tLSBhL3YxL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg1MyArMCwwIEBACi08cHJvamVjdCBuYW1lPSJYYmVhbiIgZGVmYXVsdD0iZGVmYXVsdCIgYmFzZWRpcj0iLiI+Ci0KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0iamF2YWMxLjQiLz4KLSAgPHByb3BlcnR5IG5hbWU9InByb2R1Y3QudmVyc2lvbiIgdmFsdWU9IjEuMC4wIi8+Ci0KLSAgPHRhcmdldCBuYW1lPSJ1c2FnZSI+Ci0gICAgPGVjaG8gbWVzc2FnZT0iVGhlIGZvbGxvd2luZyBhbnQgdGFyZ2V0cyBhcmUgZGVmaW5lZDoiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJ1c2FnZSAgICAtIHRoaXMgaGVscCB0ZXh0Ii8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iYnVpbGQgICAgLSBidWlsZHMgb3VyIHB1YmxpYyBpbnRlcmZhY2UgamFycyBzbyBvdGhlcnMgY2FuIGNvbXBpbGUiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJkZXBsb3kgICAtIGJ1aWxkcyBvdXIgaW1wbGVtZW50YXRpb24gamFyICh4YmVhbi5qYXIpIi8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iY2xlYW4gICAgLSBjbGVhbnMgb3V0IHRoZSB4YmVhbnMgZGlyZWN0b3JpZXMiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJidWlsZGRydCAtIGJ1aWxkcywgYnV0IGRvZXMgbm90IHJ1biwgdGhlIHhiZWFuIGRydCIvPgotICAgIDxlY2hvIG1lc3NhZ2U9ImRydCAgICAgIC0gcnVucyB0aGUgeGJlYW4gZHJ0Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotICAgIDxkZWxldGUgZGlyPSJidWlsZCIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImRlcGxveSIgZGVwZW5kcz0ic291cmNlcywgeGJlYW4sIGRydC5qYXIsIHJhbmRvbS5qYXIiIC8+Ci0KLSAgPHRhcmdldCBuYW1lPSJzb3VyY2VzIiBkZXBlbmRzPSJkaXJzIj4KLSAgICA8emlwIGRlc3RmaWxlPSJidWlsZC9hci94YmVhbnNyYy56aXAiIGJhc2VkaXI9Ii4iIGV4Y2x1ZGVzPSJidWlsZC8qKiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InhiZWFuIiBkZXBlbmRzPSJ4YmVhbi5qYXIiPgotICAgIDxjb3B5IGZpbGU9ImJ1aWxkL2xpYi94YmVhbi5qYXIiIHRvZmlsZT0iYnVpbGQvYXIveGJlYW4uamFyIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZGlycyI+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQiLz4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9jbGFzc2VzIi8+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQvbGliIi8+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQvYXIiLz4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9zcmMiLz4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlIi8+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzIi8+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQvcHJpdmF0ZS9saWIiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJkcnQiID4KLSAgICAgIDxlY2hvIG1lc3NhZ2U9IlJ1bm5pbmcgcmFuZG9tIHRlc3RlciIvPgotICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iUmFuZG9tIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvYXIveGJlYW4uamFyIi8+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL2Vhc3lwby5qYXIiLz4KLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIvcmFuZG9tLmphciIvPgotICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+Ci0gICAgICAgICA8YXJnIGxpbmU9Ii1zZWVkIDAgLWkgMjAgLW5vcXVlcnkiLz4KLSAgICAgICA8L2phdmE+Ci0KLSAgICA8bWtkaXIgZGlyPSJidWlsZC90ZXN0L291dHB1dCIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IlJ1bm5pbmcgeGJlYW4gcHJvZHVjdCBkcnQgdGVzdHMiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJKVW5pdCBvdXRwdXQgYmVpbmcgc2VudCB0byB4YmVhbi9idWlsZC90ZXN0L291dHB1dC9kcnQtcHJvZHVjdC50eHQiLz4KLSAgICA8anVuaXQgZm9yaz0ieWVzIiBwcmludHN1bW1hcnk9InllcyIgaGFsdG9uZmFpbHVyZT0ieWVzIiBzaG93b3V0cHV0PSJ5ZXMiPgotICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJ4YmVhbi5yb290ZGlyIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0idHJlZWFzc2VydHMiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImV4dGVybmFsL2xpYi9qdW5pdC5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9hci94YmVhbi5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9kcnQuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIvZWFzeXBvLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL3NjaGVtYXMuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIveHN0eXBlcy5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9lbnVtdGVzdC5qYXIiLz4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIvPgotICAgICAgPHRlc3QgbmFtZT0iZHJ0Y2FzZXMuU21va2VUZXN0cyIgb3V0ZmlsZT0iYnVpbGQvdGVzdC9vdXRwdXQvZHJ0LXByb2R1Y3QiIC8+Ci0gICAgPC9qdW5pdD4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJidWlsZGRydCIgZGVwZW5kcz0iZHJ0LmphciwgcmFuZG9tLmphciwgZXJpYyIvPgotCi0gIDx0YXJnZXQgbmFtZT0iZXJpYyIgZGVwZW5kcz0iZXJpY3Rlc3QuamFyIi8+Ci0KLSAgPHRhcmdldCBuYW1lPSJkZWZhdWx0IiBkZXBlbmRzPSJkZXBsb3ksIGJ1aWxkZHJ0Ii8+Ci0KLSAgPHRhcmdldCBuYW1lPSJyZWRlcGxveSIgZGVwZW5kcz0iY2xlYW4sIGRlcGxveSIvPgotCi0gIDwhLS0gb2xkeGJlYW4uamFyIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0YXJnZXQgbmFtZT0ib2xkeGJlYW4uamFyIj4KLSAgICA8Y29weSBmaWxlPSJleHRlcm5hbC9saWIvb2xkeGJlYW4uamFyIiB0b2ZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL29sZHhiZWFuLmphciIvPgotICA8L3RhcmdldD4KLQotICA8IS0tIGJvb3RzdHJhcCB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9ImJvb3RzdHJhcCIgZGVwZW5kcz0ieGJlYW4iPgotCi0gICAgPCEtLSBhZnRlciB4YmVhbi5qYXIgaXMgYnVpbHQsIG1vdmUgaXQgb3V0IG9mIHRoZSB3YXkgYW5kIGNsZWFuIHRoZSBwcm9qZWN0IC0tPgotICAgIDx0ZW1wZmlsZSBwcm9wZXJ0eT0iYm9vdHN0cmFwLmphcmZpbGUiIHByZWZpeD0ib2xkeGJlYW4iIHN1ZmZpeD0iLmphciIvPgotICAgIDxtb3ZlIGZpbGU9ImJ1aWxkL2FyL3hiZWFuLmphciIgdG9maWxlPSIke2Jvb3RzdHJhcC5qYXJmaWxlfSIvPgotICAgIDxhbnRjYWxsIHRhcmdldD0iY2xlYW4iIGluaGVyaXRBbGw9ImZhbHNlIi8+Ci0KLSAgICA8IS0tIHRoZW4gbW92ZSBpdCBiYWNrIGludG8gcGxhY2UgYXMgb2xkeGJlYW4uamFyIGFuZCBkbyBhbm90aGVyIGJ1aWxkIC0tPgotICAgIDxtb3ZlIGZpbGU9IiR7Ym9vdHN0cmFwLmphcmZpbGV9IiB0b2ZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL29sZHhiZWFuLmphciIvPgotICAgIDxhbnRjYWxsIHRhcmdldD0ieGJlYW4iIGluaGVyaXRBbGw9ImZhbHNlIi8+Ci0KLSAgICA8IS0tIGNvbXBhcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaXJzdCBqYXIgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWNvbmQgamFyIC0tPgotICAgIDxhbnRjYWxsIHRhcmdldD0iemlwY29tcGFyZS5jbGFzc2VzIiBpbmhlcml0QWxsPSJmYWxzZSIvPgotICAgIDxqYXZhIGNsYXNzbmFtZT0iemlwY29tcGFyZS5aaXBDb21wYXJlIgotICAgICAgICAgIGNsYXNzcGF0aD0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3ppcGNvbXBhcmUiCi0gICAgICAgICAgZm9yaz0idHJ1ZSIKLSAgICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9ImJ1aWxkL2FyL3hiZWFuLmphciBidWlsZC9wcml2YXRlL2xpYi9vbGR4YmVhbi5qYXIiLz4KLSAgICA8L2phdmE+Ci0KLSAgICA8IS0tIHdoZW4gZXZlcnl0aGluZyBzdWNjZWVkcywgY2hlY2sgb3V0IG9sZHhiZWFuLmphciBmcm9tIHBlcmZvcmNlIC0tPgotICAgIDxlY2hvIG1lc3NhZ2U9Ij09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ii8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iUmVzdWx0cyBtYXRjaCEgQm9vdHN0cmFwIHN1Y2NlZWRlZC4iLz4KLSAgICA8ZWNobyBtZXNzYWdlPSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IkF0dGVtcHRpbmcgdG8gY29weSBvbGR4YmVhbi5qYXIiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJJZiB0aGUgY29weSBmYWlscywgeW91IG11c3QgY2hlY2sgb3V0IG9sZHhiZWFuLmphciIvPgotICAgIDwhLS0gY29weSBvbGR4YmVhbi5qYXIgd2hldGhlciBvciBub3QgcGVyZm9yY2Ugc3VjY2VlZGVkIC0tPgotICAgIDxlY2hvIG1lc3NhZ2U9Im92ZXJ3cml0aW5nIG9sZCBleHRlcm5hbC9saWIvb2xkeGJlYW4uamFyIi8+Ci0gICAgPGNvcHkgZmlsZT0iYnVpbGQvcHJpdmF0ZS9saWIvb2xkeGJlYW4uamFyIiB0b2ZpbGU9ImV4dGVybmFsL2xpYi9vbGR4YmVhbi5qYXIiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSB6aXBjb21wYXJlIChmb3IgY2hlY2tpbmcgYm9vdHN0cmFwKSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0YXJnZXQgbmFtZT0iemlwY29tcGFyZS5jbGFzc2VzIj4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvemlwY29tcGFyZSIvPgotICAgIDxqYXZhYyBzcmNkaXI9InNyYy96aXBjb21wYXJlIgotICAgICAgICAgICBkZXN0ZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvemlwY29tcGFyZSIKLSAgICAgICAgICAgZGVidWc9Im9uIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gdGVzdCB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPHBhdGggaWQ9InRlc3QuY29tcGlsZS5wYXRoIj4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImV4dGVybmFsL2xpYi9qdW5pdC5qYXIiLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIvZWFzeXBvLmphciIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIvZXJpY3NjaGVtYS5qYXIiLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL3NjaGVtYXMuamFyIi8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9lbnVtdGVzdC5qYXIiLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL3hzdHlwZXMuamFyIi8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbGlucHV0c3RyZWFtIi8+Ci0gIDwvcGF0aD4KLQotICA8cGF0aCBpZD0idGVzdC5ydW4ucGF0aCI+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9hci94YmVhbi5qYXIiLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImV4dGVybmFsL2xpYi9qdW5pdC5qYXIiLz4KLSAgPC9wYXRoPgotCi0gIDwhLS0gYnVpbGRkcnQgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPHRhcmdldCBuYW1lPSJkcnQuY2xhc3NlcyIgZGVwZW5kcz0iZGlycywgZWFzeXBvLmphciwgc2NoZW1hcy5qYXIsIHhzdHlwZXMuamFyLCBlbnVtdGVzdC5qYXIiPgotICAgIDxta2RpciBkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy9kcnQiLz4KLSAgICA8amF2YWMKLSAgICAgICBzcmNkaXI9InRlc3Qvc3JjL2RydCIKLSAgICAgICBkZXN0ZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvZHJ0IgotICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jb21waWxlLnBhdGgiCi0gICAgICAgc291cmNlPSIxLjQiCi0gICAgICAgZGVidWc9Im9uIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZHJ0LmphciIgZGVwZW5kcz0iZHJ0LmNsYXNzZXMiPgotICAgIDxqYXIgamFyZmlsZT0iYnVpbGQvcHJpdmF0ZS9saWIvZHJ0LmphciIgYmFzZWRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL2RydCIvPgotICA8L3RhcmdldD4KLQotICA8IS0tIHN0c3NjaGVtYSAoZm9yIHRlc3RpbmcpIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8cGF0aCBpZD0ic2NvbXAucnVuLnBhdGgiPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3hiZWFuLmphciIvPgotICA8L3BhdGg+Ci0KLSAgPHRhcmdldCBuYW1lPSJzdHNzY2hlbWEuY2hlY2siPgotICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0ic3Rzc2NoZW1hLm5vdFJlcXVpcmVkIiB0YXJnZXRmaWxlPSJidWlsZC9wcml2YXRlL2xpYi9zdHNzY2hlbWEuamFyIj4KLSAgICAgIDxzcmNmaWxlcyBkaXI9InRlc3Qvc3JjL3N0c3NjaGVtYSIgaW5jbHVkZXM9IioqLyoueHNkIi8+Ci0gICAgICA8c3JjZmlsZXMgZGlyPSJidWlsZC9hciIgaW5jbHVkZXM9InhiZWFuLmphciIvPgotICAgIDwvdXB0b2RhdGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ic3Rzc2NoZW1hLmphciIgZGVwZW5kcz0ic3Rzc2NoZW1hLmNoZWNrLCBkaXJzLCB4YmVhbiIgdW5sZXNzPSJzdHNzY2hlbWEubm90UmVxdWlyZWQiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9InNjb21wLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KLSAgICAgIDxhcmcgbGluZT0iLW91dCBidWlsZC9wcml2YXRlL2xpYi9zdHNzY2hlbWEuamFyIHRlc3Qvc3JjL3N0c3NjaGVtYSIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBzb2FwdGVzdCB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPHRhcmdldCBuYW1lPSJzb2FwdGVzdC5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzLCBzdHNzY2hlbWEuamFyIj4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvc29hcHRlc3QiLz4KLSAgICA8amF2YWMgc3JjZGlyPSJ0ZXN0L3NyYy9zb2FwdGVzdCIgZGVzdGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3NvYXB0ZXN0IiBzb3VyY2U9IjEuNCIgZGVidWc9Im9uIj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iZXh0ZXJuYWwvbGliL2pkb20uamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iZXh0ZXJuYWwvbGliL2p1bml0LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL3N0c3NjaGVtYS5qYXIiLz4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJzb2FwdGVzdC5qYXIiIGRlcGVuZHM9InNvYXB0ZXN0LmNsYXNzZXMiPgotICAgIDxqYXIgamFyZmlsZT0iYnVpbGQvcHJpdmF0ZS9saWIvc29hcHRlc3QuamFyIiBiYXNlZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvc29hcHRlc3QiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBlcmljdGVzdCB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0YXJnZXQgbmFtZT0iZXJpY3Rlc3QuY2xhc3NlcyIgZGVwZW5kcz0iZGlycywgeGJlYW4sIGVyaWNzY2hlbWEuamFyIj4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvZXJpY3Rlc3QiLz4KLSAgICA8amF2YWMKLSAgICAgICBzcmNkaXI9InRlc3Qvc3JjL2VyaWN0ZXN0IgotICAgICAgIGRlc3RkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy9lcmljdGVzdCIKLSAgICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY29tcGlsZS5wYXRoIgotICAgICAgIHNvdXJjZT0iMS40IgotICAgICAgIGRlYnVnPSJvbiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImVyaWN0ZXN0LmphciIgZGVwZW5kcz0iZXJpY3Rlc3QuY2xhc3NlcyI+Ci0gICAgPGphciBqYXJmaWxlPSJidWlsZC9wcml2YXRlL2xpYi9lcmljdGVzdC5qYXIiIGJhc2VkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy9lcmljdGVzdCIvPgotICA8L3RhcmdldD4KLQotICA8IS0tIHJhbmRvbSB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0YXJnZXQgbmFtZT0icmFuZG9tLmNsYXNzZXMiIGRlcGVuZHM9ImRpcnMsIHhiZWFuLCBlYXN5cG8uamFyIj4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvcmFuZG9tIi8+Ci0gICAgPGphdmFjCi0gICAgICAgc3JjZGlyPSJ0ZXN0L3NyYy9yYW5kb20iCi0gICAgICAgZGVzdGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3JhbmRvbSIKLSAgICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY29tcGlsZS5wYXRoIgotICAgICAgIHNvdXJjZT0iMS40IgotICAgICAgIGRlYnVnPSJvbiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InJhbmRvbS5qYXIiIGRlcGVuZHM9InJhbmRvbS5jbGFzc2VzIj4KLSAgICA8amFyIGphcmZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL3JhbmRvbS5qYXIiIGJhc2VkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy9yYW5kb20iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSB0ZXN0c3RvcmUgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3RzdG9yZS5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzIj4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvdGVzdHN0b3JlIi8+Ci0gICAgPGphdmFjIHNyY2Rpcj0idGVzdC9zcmMvdGVzdHN0b3JlIiBkZXN0ZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvdGVzdHN0b3JlIiBzb3VyY2U9IjEuNCIgZGVidWc9Im9uIj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3NpbXBsZXR5cGVzIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3htbGNvbXAiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvdHlwZXN0b3JlIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3htbHB1YmxpYyIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy90eXBlaW1wbCIvPgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLQotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3RzdG9yZS5qYXIiIGRlcGVuZHM9InRlc3RzdG9yZS5jbGFzc2VzIj4KLSAgICA8amFyIGphcmZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL3Rlc3RzdG9yZS5qYXIiIGJhc2VkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy90ZXN0c3RvcmUiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBzaW1wbGV0eXBlcyAoZm9yIHRlc3RpbmcpIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InNpbXBsZXR5cGVzLmNoZWNrIj4KLSAgICA8dXB0b2RhdGUgcHJvcGVydHk9InNpbXBsZXR5cGVzLm5vdFJlcXVpcmVkIiB0YXJnZXRmaWxlPSJidWlsZC9wcml2YXRlL2xpYi9zaW1wbGV0eXBlcy5qYXIiPgotICAgICAgPHNyY2ZpbGVzIGRpcj0idGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlIiBpbmNsdWRlcz0iKiovKi54c2QiLz4KLSAgICAgIDxzcmNmaWxlcyBkaXI9ImJ1aWxkL3ByaXZhdGUvbGliIiBpbmNsdWRlcz0ieGJlYW4uamFyIi8+Ci0gICAgPC91cHRvZGF0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJzaW1wbGV0eXBlcy5qYXIiIGRlcGVuZHM9InNpbXBsZXR5cGVzLmNoZWNrLCBkaXJzIiB1bmxlc3M9InNpbXBsZXR5cGUubm90UmVxdWlyZWQiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9InNjb21wLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KLSAgICAgIDxhcmcgbGluZT0iLW5hbWUgc2NoZW1hLnRlc3Quc2ltcGxlIC1vdXQgYnVpbGQvcHJpdmF0ZS9saWIvc2ltcGxldHlwZXMuamFyIHRlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZSIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBlYXN5cG8gKGZvciB0ZXN0aW5nKSB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9ImVhc3lwby5jaGVjayI+Ci0gICAgPHVwdG9kYXRlIHByb3BlcnR5PSJlYXN5cG8ubm90UmVxdWlyZWQiIHRhcmdldGZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL2Vhc3lwby5qYXIiPgotICAgICAgPHNyY2ZpbGVzIGRpcj0idGVzdC9zcmMvZWFzeXBvIiBpbmNsdWRlcz0iKiovKiIvPgotICAgICAgPHNyY2ZpbGVzIGRpcj0iYnVpbGQvYXIiIGluY2x1ZGVzPSJ4YmVhbi5qYXIiLz4KLSAgICA8L3VwdG9kYXRlPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImVhc3lwby5qYXIiIGRlcGVuZHM9ImVhc3lwby5jaGVjaywgZGlycywgeGJlYW4iIHVubGVzcz0iZWFzeXBvLm5vdFJlcXVpcmVkIj4KLSAgICA8amF2YSBjbGFzc25hbWU9IiR7c2NoZW1hX2NvbXBpbGVyfSIgY2xhc3NwYXRocmVmPSJzY29tcC5ydW4ucGF0aCIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+Ci0gICAgICA8YXJnIGxpbmU9Ii1vdXQgYnVpbGQvcHJpdmF0ZS9saWIvZWFzeXBvLmphciB0ZXN0L3NyYy9lYXN5cG8iLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gc2NoZW1hcyAoZm9yIHRlc3RpbmcpIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InNjaGVtYXMuY2hlY2siPgotICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0ic2NoZW1hcy5ub3RSZXF1aXJlZCIgdGFyZ2V0ZmlsZT0iYnVpbGQvcHJpdmF0ZS9saWIvc2NoZW1hcy5qYXIiPgotICAgICAgPHNyY2ZpbGVzIGRpcj0idGVzdC9zcmMvc2NoZW1hcyIgaW5jbHVkZXM9IioqLyoueHNkIi8+Ci0gICAgICA8c3JjZmlsZXMgZGlyPSJidWlsZC9hciIgaW5jbHVkZXM9InhiZWFuLmphciIvPgotICAgIDwvdXB0b2RhdGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ic2NoZW1hcy5qYXIiIGRlcGVuZHM9InNjaGVtYXMuY2hlY2ssIGRpcnMsIHhiZWFuIiB1bmxlc3M9InNjaGVtYXMubm90UmVxdWlyZWQiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9InNjb21wLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KLSAgICAgIDxhcmcgbGluZT0iLW91dCBidWlsZC9wcml2YXRlL2xpYi9zY2hlbWFzLmphciB0ZXN0L3NyYy9zY2hlbWFzIi8+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLQotICA8IS0tIGVyaWNzY2hlbWEgKGZvciB0ZXN0aW5nKSB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPHRhcmdldCBuYW1lPSJlcmljc2NoZW1hLmNoZWNrIj4KLSAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImVyaWNzY2hlbWEubm90UmVxdWlyZWQiIHRhcmdldGZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL2VyaWNzY2hlbWEuamFyIj4KLSAgICAgIDxzcmNmaWxlcyBkaXI9InRlc3Qvc3JjL2VyaWNzY2hlbWEiIGluY2x1ZGVzPSIqKi8qLnhzZCIvPgotICAgICAgPHNyY2ZpbGVzIGRpcj0iYnVpbGQvYXIiIGluY2x1ZGVzPSJ4YmVhbi5qYXIiLz4KLSAgICA8L3VwdG9kYXRlPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImVyaWNzY2hlbWEuamFyIiBkZXBlbmRzPSJlcmljc2NoZW1hLmNoZWNrLCBkaXJzLCB4YmVhbiIgdW5sZXNzPSJlcmljc2NoZW1hLm5vdFJlcXVpcmVkIj4KLSAgICA8amF2YSBjbGFzc25hbWU9IiR7c2NoZW1hX2NvbXBpbGVyfSIgY2xhc3NwYXRocmVmPSJzY29tcC5ydW4ucGF0aCIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+Ci0gICAgICA8YXJnIGxpbmU9Ii1zcmMgYnVpbGQvcHJpdmF0ZS9zcmMgLW91dCBidWlsZC9wcml2YXRlL2xpYi9lcmljc2NoZW1hLmphciB0ZXN0L3NyYy9lcmljc2NoZW1hIi8+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLQotICA8IS0tIGVudW10ZXN0IChmb3IgdGVzdGluZykgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9ImVudW10ZXN0LmNoZWNrIj4KLSAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImVudW10ZXN0Lm5vdFJlcXVpcmVkIiB0YXJnZXRmaWxlPSJidWlsZC9wcml2YXRlL2xpYi9lbnVtdGVzdC5qYXIiPgotICAgICAgPHNyY2ZpbGVzIGRpcj0idGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlIiBpbmNsdWRlcz0iKiovKi54c2QiLz4KLSAgICAgIDxzcmNmaWxlcyBkaXI9ImJ1aWxkL2FyIiBpbmNsdWRlcz0ieGJlYW4uamFyIi8+Ci0gICAgPC91cHRvZGF0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJlbnVtdGVzdC5qYXIiIGRlcGVuZHM9ImVudW10ZXN0LmNoZWNrLCBkaXJzLCB4YmVhbiIgdW5sZXNzPSJlbnVtdGVzdC5ub3RSZXF1aXJlZCI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSIke3NjaGVtYV9jb21waWxlcn0iIGNsYXNzcGF0aHJlZj0ic2NvbXAucnVuLnBhdGgiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgotICAgICAgPGFyZyBsaW5lPSItb3V0IGJ1aWxkL3ByaXZhdGUvbGliL2VudW10ZXN0LmphciB0ZXN0L3NyYy9lbnVtdGVzdCIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSB4c3R5cGVzIChmb3IgdGVzdGluZykgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InhzdHlwZXMuY2hlY2siPgotICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0ieHN0eXBlcy5ub3RSZXF1aXJlZCIgdGFyZ2V0ZmlsZT0iYnVpbGQvcHJpdmF0ZS9saWIveHN0eXBlcy5qYXIiPgotICAgICAgPHNyY2ZpbGVzIGRpcj0idGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlIiBpbmNsdWRlcz0iKiovKi54c2QiLz4KLSAgICAgIDxzcmNmaWxlcyBkaXI9ImJ1aWxkL2FyIiBpbmNsdWRlcz0ieGJlYW4uamFyIi8+Ci0gICAgPC91cHRvZGF0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ4c3R5cGVzLmphciIgZGVwZW5kcz0ieHN0eXBlcy5jaGVjaywgZGlycywgeGJlYW4iIHVubGVzcz0ieHN0eXBlcy5ub3RSZXF1aXJlZCI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSIke3NjaGVtYV9jb21waWxlcn0iIGNsYXNzcGF0aHJlZj0ic2NvbXAucnVuLnBhdGgiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgotICAgICAgPGFyZyBsaW5lPSItb3V0IGJ1aWxkL3ByaXZhdGUvbGliL3hzdHlwZXMuamFyIHRlc3Qvc3JjL3hzdHlwZXMiLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gamF2YWRvY3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDwhLS0gQWxsIGRvY3MgdG8gYnVpbGQvZG9jcywgaW5jbHVkaW5nIGd1aWRlIGFuZCBqYXZhZG9jcy4gLS0+Ci0KLSAgPHRhcmdldCBuYW1lPSJkb2NzIiBkZXBlbmRzPSJ4YmVhbiI+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImRvY3MuZGlyIiB2YWx1ZT0iYnVpbGQvZG9jcyIvPgotICAgIDxkZWxldGUgZGlyPSIke2RvY3MuZGlyfSIvPgotICAgIDxta2RpciBkaXI9IiR7ZG9jcy5kaXJ9Ii8+Ci0gICAgPGphdmFkb2MgcGFja2FnZW5hbWVzPSIqIiBzb3VyY2VwYXRoPSJzcmMveG1scHVibGljIiBjbGFzc3BhdGg9IiR7amF2YWRvYy5wYXRofSIgZGVzdGRpcj0iJHtkb2NzLmRpcn0vcmVmZXJlbmNlIiB3aW5kb3d0aXRsZT0iWE1MQmVhbnMgRG9jdW1lbnRhdGlvbiIgc291cmNlPSIxLjQiIHN0eWxlc2hlZXRmaWxlPSJkb2NzL3N0eWxlc2hlZXQuY3NzIj4KLSAgICAgIDxsaW5rIGhyZWY9Imh0dHA6Ly9lLWRvY3MuYmVhLmNvbS93bHMvZG9jczgxL2phdmFkb2NzLyIvPgotICAgICAgPGxpbmsgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpLyIvPgotICAgICAgPGxpbmsgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlLzEuNC9kb2NzL2FwaS8iLz4KLSAgICAgIDxsaW5rIGhyZWY9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94ZXJjZXMtai9hcGlEb2NzLyIvPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9hci94YmVhbi5qYXIiLz4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWRvYz4KLSAgICA8Y29weSBmaWxlPSJkb2NzL3htbGJlYW5zLmNzcyIgdG9maWxlPSIke2RvY3MuZGlyfS94bWxiZWFucy5jc3MiIC8+Ci0gICAgPGNvcHkgdG9kaXI9IiR7ZG9jcy5kaXJ9L2d1aWRlIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0iZG9jcy9ndWlkZSIvPgotICAgIDwvY29weT4KLSAgICA8Y29weSB0b2Rpcj0iJHtkb2NzLmRpcn0vaW1hZ2VzIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0iZG9jcy9pbWFnZXMiLz4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gc3RyZWFtIGNvbmZvcm1hbmNlIHRlc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InN0cmVhbXRlc3QuY2xhc3NlcyIgZGVwZW5kcz0iZGlycyI+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3N0cmVhbXRlc3QiLz4KLSAgICA8amF2YWMKLSAgICAgIHNyY2Rpcj0idGVzdC9zcmMvc3RyZWFtdGVzdCIKLSAgICAgIGRlc3RkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy9zdHJlYW10ZXN0IgotICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNvbXBpbGUucGF0aCIKLSAgICAgIHNvdXJjZT0iMS40IgotICAgICAgZGVidWc9Im9uIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ic3RyZWFtdGVzdC5qYXIiIGRlcGVuZHM9InN0cmVhbXRlc3QuY2xhc3NlcyI+Ci0gICAgPGphciBqYXJmaWxlPSJidWlsZC9wcml2YXRlL2xpYi9zdHJlYW10ZXN0LmphciIgYmFzZWRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3N0cmVhbXRlc3QiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHBhdGggaWQ9InJ1bi5zdHJlYW1jb25mLnBhdGgiPgotICAgIDxwYXRoIHJlZmlkPSJ0ZXN0LnJ1bi5wYXRoIi8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvc3RyZWFtdGVzdC8iLz4KLSAgPC9wYXRoPgotCi0gIDx0YXJnZXQgbmFtZT0ic3RyZWFtY29uZiIgZGVwZW5kcz0ic3RyZWFtdGVzdC5qYXIiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0ic3RyZWFtdGVzdC5YbWxTdHJlYW1Db25mb3JtYW5jZSIKLSAgICAgICAgICBjbGFzc3BhdGhyZWY9InJ1bi5zdHJlYW1jb25mLnBhdGgiCi0gICAgICAgICAgZm9yaz0idHJ1ZSI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KLSAgICAgIDwhLS1hcmcgbGluZT0idGVzdC9jYXNlcy9zdHJlYW1jb25mL3NtYWxsLnhtbCIgLy0tPgotICAgICAgPGFyZyBsaW5lPSJ0ZXN0L2Nhc2VzL3N0cmVhbWNvbmYvZHRkLnhtbCIgLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJkaXN0LXNyYywgZGlzdC1iaW4iPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImRpc3QtYmluIiBkZXBlbmRzPSJ4YmVhbiwgZG9jcyI+Ci0gICAgIDxkZWxldGUgZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufSIvPgotICAgICA8ZGVsZXRlIGZpbGU9ImJ1aWxkL3ByaXZhdGUvaW5jdWJhdGluZy14bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0uemlwIi8+Ci0gICAgIDxkZWxldGUgZmlsZT0iYnVpbGQvcHJpdmF0ZS9pbmN1YmF0aW5nLXhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS50Z3oiLz4KLQotICAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufSIvPgotICAgICA8Y29weSB0b2Rpcj0iYnVpbGQvcHJpdmF0ZS94bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0iPgotICAgICAgICA8ZmlsZXNldCBkaXI9InhraXQiLz4KLSAgICAgPC9jb3B5PgotCi0gICAgIDxta2RpciBkaXI9ImJ1aWxkL3ByaXZhdGUveG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259L2xpYiIvPgotICAgICA8Y29weSB0b2Rpcj0iYnVpbGQvcHJpdmF0ZS94bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vbGliIiBmaWxlPSJidWlsZC9hci94YmVhbi5qYXIiLz4KLQotICAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9zcmMvc2NoZW1hIi8+Ci0gICAgIDxjb3B5IHRvZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9zcmMvc2NoZW1hIj4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdG9vbHNjaGVtYSIvPgotICAgICA8L2NvcHk+Ci0KLSAgICAgPG1rZGlyIGRpcj0iYnVpbGQvcHJpdmF0ZS94bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vZG9jcyIvPgotICAgICA8Y29weSB0b2Rpcj0iYnVpbGQvcHJpdmF0ZS94bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vZG9jcyI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvZG9jcyIvPgotICAgICA8L2NvcHk+Ci0KLSAgICAgPHppcCBkZXN0ZmlsZT0iYnVpbGQvcHJpdmF0ZS9pbmN1YmF0aW5nLXhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS56aXAiCi0gICAgICAgICAgYmFzZWRpcj0iYnVpbGQvcHJpdmF0ZSIKLSAgICAgICAgICBpbmNsdWRlcz0ieG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259LyoqIi8+Ci0gICAgIDx0YXIgZGVzdGZpbGU9ImJ1aWxkL3ByaXZhdGUvaW5jdWJhdGluZy14bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0udGd6IgotICAgICAgICAgIGJhc2VkaXI9ImJ1aWxkL3ByaXZhdGUiCi0gICAgICAgICAgaW5jbHVkZXM9InhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS8qKiIKLSAgICAgICAgICBjb21wcmVzc2lvbj0iZ3ppcCIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImRpc3Qtc3JjIiBkZXBlbmRzPSJjbGVhbiwgZGlycyI+Ci0gICAgIDxkZWxldGUgZmlsZT0iYnVpbGQvcHJpdmF0ZS9pbmN1YmF0aW5nLXhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS1zcmMuemlwIi8+Ci0JIDxkZWxldGUgZmlsZT0iYnVpbGQvcHJpdmF0ZS9pbmN1YmF0aW5nLXhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS1zcmMudGd6Ii8+Ci0KLQkgPHppcCBkZXN0ZmlsZT0iYnVpbGQvcHJpdmF0ZS9pbmN1YmF0aW5nLXhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS1zcmMuemlwIj4KLSAgICAgCTx6aXBmaWxlc2V0Ci0gICAgIAkJZGlyPSIuIgotICAgICAgIAkJaW5jbHVkZXM9IioqIgotICAgICAgIAkJZXhjbHVkZXM9ImJ1aWxkLyoqIgotICAgICAgIAkJcHJlZml4PSJ4bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0iLz4KLSAgICAgPC96aXA+Ci0JIDx0YXIgZGVzdGZpbGU9ImJ1aWxkL3ByaXZhdGUvaW5jdWJhdGluZy14bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0tc3JjLnRneiIKLQkgCSAgY29tcHJlc3Npb249Imd6aXAiPgotICAgICAJPHRhcmZpbGVzZXQKLSAgICAgCQlkaXI9Ii4iCi0gICAgICAgCQlpbmNsdWRlcz0iKioiCi0gICAgICAgCQlleGNsdWRlcz0iYnVpbGQvKioiCi0gICAgICAgCQlwcmVmaXg9InhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufSIvPgotICAgICA8L3Rhcj4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBwcmV2aW91c2x5IGluIHhiZWFuLnhtbCAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InhiZWFuLmphciIKLSAgICAgICAgZGVwZW5kcz0iZGlycywgeG1scHVibGljLmNsYXNzZXMsIHR5cGVzdG9yZS5jbGFzc2VzLAotICAgICAgICAgICAgICAgICBjb21tb24uY2xhc3NlcywgdHlwZWltcGwuY2xhc3NlcywgeG1sY29tcC5jbGFzc2VzLAotICAgICAgICAgICAgICAgICB4bWxzdG9yZS5jbGFzc2VzLAotICAgICAgICAgICAgICAgICBvbGR4YmVhbi5qYXIsIHhzZHNjaGVtYS5jbGFzc2VzLAotICAgICAgICAgICAgICAgICB4bWxpbnB1dHN0cmVhbS5jbGFzc2VzIj4KLSAgICA8amFyIGphcmZpbGU9ImJ1aWxkL2xpYi94YmVhbi5qYXIiIGluZGV4PSJ0cnVlIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxwdWJsaWMiLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy90eXBlc3RvcmUiLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy9jb21tb24iLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy90eXBlaW1wbCIvPgotICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3htbGNvbXAiLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy9jb25maWdzY2hlbWEiLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy90b29sc2NoZW1hIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9ImJ1aWxkL2NsYXNzZXMveHNkc2NoZW1hIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9ImJ1aWxkL2NsYXNzZXMveG1sc2NoZW1hIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9ImJ1aWxkL2NsYXNzZXMveG1sc3RvcmUiLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxpbnB1dHN0cmVhbSIvPgotICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3JlcGFja2FnZSIvPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvbGljZW5zZSIvPgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLQotICA8IS0tIGpheGIgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8cGF0aCBpZD0iamF4Yi5jb21waWxlLnBhdGgiPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iZXh0ZXJuYWwvbGliL2pheGItMS4wL2pheGItYXBpLmphciIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94bWxwdWJsaWMiLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMvdHlwZWltcGwiLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMvY29tbW9uIi8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3R5cGVzdG9yZSIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94bWxpbnB1dHN0cmVhbSIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy9qYXhic2NoZW1hIi8+Ci0gIDwvcGF0aD4KLQotICAgIDx0YXJnZXQgbmFtZT0iamF4YnNjaGVtYS5jaGVjayI+Ci0gICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImpheGJzY2hlbWEubm90UmVxdWlyZWQiPgotICAgICAgICAgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJqYXhic2NoZW1hLm5vdFJlcXVpcmVkIiB0YXJnZXRmaWxlPSJidWlsZC9jbGFzc2VzL2pheGJzY2hlbWEvc2NoZW1hL3N5c3RlbS9KQVhCQ09ORklHL2luZGV4LnhzYiI+Ci0gICAgICAgICAgICAgICAgPHNyY2ZpbGVzIGRpcj0ic3JjL2pheGIvc2NoZW1hIiBpbmNsdWRlcz0iKiovKi54c2Q7KiovKi54c2Rjb25maWciLz4KLSAgICAgICAgICAgIDwvdXB0b2RhdGU+Ci0gICAgICAgIDwvY29uZGl0aW9uPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJqYXhic2NoZW1hLmNsYXNzZXMiIGRlcGVuZHM9ImpheGJzY2hlbWEuY2hlY2ssIHhtbHB1YmxpYy5jbGFzc2VzLCB0eXBlaW1wbC5jbGFzc2VzLCBjb21tb24uY2xhc3NlcywgdHlwZXN0b3JlLmNsYXNzZXMsIHhtbGlucHV0c3RyZWFtLmNsYXNzZXMiIHVubGVzcz0iamF4YnNjaGVtYS5ub3RSZXF1aXJlZCI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSJidWlsZC9jbGFzc2VzL2pheGJzY2hlbWEiLz4KLSAgICAgICAgPGRlbGV0ZSBkaXI9ImJ1aWxkL3NyYy9qYXhic2NoZW1hIi8+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtib290c3RyYXBfc2NoZW1hX2NvbXBpbGVyfSIgY2xhc3NwYXRocmVmPSJib290c3RyYXAucnVuLnBhdGgiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSIke3JlcGFja2FnZV9hcmd9IC1uYW1lIEpBWEJDT05GSUcgLWNwICR7Ym9vdHN0cmFwLmNvbXBpbGUucGF0aH0gLXNyY29ubHkgLWQgYnVpbGQvY2xhc3Nlcy9qYXhic2NoZW1hIC1zcmMgYnVpbGQvc3JjL2pheGJzY2hlbWEgc3JjL2pheGIvc2NoZW1hIi8+Ci0gICAgICAgIDwvamF2YT4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iamF4Yi5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzLCBqYXhic2NoZW1hLmNsYXNzZXMsIHhtbHB1YmxpYy5jbGFzc2VzLCB0eXBlaW1wbC5jbGFzc2VzLCBjb21tb24uY2xhc3NlcywgdHlwZXN0b3JlLmNsYXNzZXMsIHhtbGlucHV0c3RyZWFtLmNsYXNzZXMiPgotICAgICAgICA8bWtkaXIgZGlyPSJidWlsZC9zcmMvamF4YiIvPgotICAgICAgICA8bWtkaXIgZGlyPSJidWlsZC9jbGFzc2VzL2pheGIiLz4KLQotICAgICAgICA8amF2YWMgZGVzdGRpcj0iYnVpbGQvY2xhc3Nlcy9qYXhiIiBjbGFzc3BhdGhyZWY9ImpheGIuY29tcGlsZS5wYXRoIiBzb3VyY2U9IjEuNCIgZGVidWc9Im9uIj4KLSAgICAgICAgICAgIDxzcmMgcGF0aD0ic3JjL2pheGIiLz4KLSAgICAgICAgICAgIDxzcmMgcGF0aD0iYnVpbGQvc3JjL2pheGJzY2hlbWEiLz4KLSAgICAgICAgPC9qYXZhYz4KLSAgICA8L3RhcmdldD4KLQotICA8IS0tIGJ1aWxkIFhNTElucHV0U3RyZWFtIGludGVyZmFjZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPHRhcmdldCBuYW1lPSJ4bWxpbnB1dHN0cmVhbS5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzIj4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9jbGFzc2VzL3htbGlucHV0c3RyZWFtIi8+Ci0gICAgPGphdmFjIHNyY2Rpcj0ic3JjL3htbGlucHV0c3RyZWFtIgotICAgICAgICBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzL3htbGlucHV0c3RyZWFtIgotICAgICAgICBkZWJ1Zz0ib24iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSB4bWxwdWJsaWMgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPHRhcmdldCBuYW1lPSJ4bWxwdWJsaWMuY2xhc3NlcyIgZGVwZW5kcz0iZGlycywgeG1saW5wdXRzdHJlYW0uY2xhc3NlcyI+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxwdWJsaWMiLz4KLSAgICA8amF2YWMgc3JjZGlyPSJzcmMveG1scHVibGljIiBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzL3htbHB1YmxpYyIgc291cmNlPSIxLjQiIGRlYnVnPSJvbiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1saW5wdXRzdHJlYW0iLz4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ4bWxwdWJsaWMuamFyIiBkZXBlbmRzPSJkaXJzLCB4bWxpbnB1dHN0cmVhbS5jbGFzc2VzLCB4bWxwdWJsaWMuY2xhc3NlcywgeG1sc2NoZW1hLmNsYXNzZXMsIHhzZHNjaGVtYS5jbGFzc2VzIj4KLSAgICA8amFyIGphcmZpbGU9ImJ1aWxkL2xpYi94bWxwdWJsaWMuamFyIiAgaW5kZXg9InRydWUiPgotICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3htbHB1YmxpYyIvPgotICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3htbHNjaGVtYSIvPgotICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3hzZHNjaGVtYSIvPgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLQotICA8IS0tIHR5cGVzdG9yZSB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InR5cGVzdG9yZS5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzLCB4bWxwdWJsaWMuY2xhc3NlcywgY29tbW9uLmNsYXNzZXMsIHhtbGlucHV0c3RyZWFtLmNsYXNzZXMiPgotICAgIDxta2RpciBkaXI9ImJ1aWxkL2NsYXNzZXMvdHlwZXN0b3JlIi8+Ci0gICAgPGphdmFjIHNyY2Rpcj0ic3JjL3R5cGVzdG9yZSIgZGVzdGRpcj0iYnVpbGQvY2xhc3Nlcy90eXBlc3RvcmUiIHNvdXJjZT0iMS40IiBkZWJ1Zz0ib24iPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbGlucHV0c3RyZWFtIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94bWxwdWJsaWMiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL2NvbW1vbiIvPgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLQotICA8L3RhcmdldD4KLQotICA8IS0tIGNvbW1vbiB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0YXJnZXQgbmFtZT0iY29tbW9uLmNsYXNzZXMiIGRlcGVuZHM9ImRpcnMsIHhtbHB1YmxpYy5qYXIsIHhtbGlucHV0c3RyZWFtLmNsYXNzZXMiPgotICAgIDxta2RpciBkaXI9ImJ1aWxkL2NsYXNzZXMvY29tbW9uIi8+Ci0gICAgPGphdmFjIHNyY2Rpcj0ic3JjL2NvbW1vbiIgZGVzdGRpcj0iYnVpbGQvY2xhc3Nlcy9jb21tb24iIHNvdXJjZT0iMS40IiBkZWJ1Zz0ib24iPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbGlucHV0c3RyZWFtIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3htbHB1YmxpYy5qYXIiLz4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSB0eXBlaW1wbCB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InR5cGVpbXBsLmNsYXNzZXMiIGRlcGVuZHM9ImRpcnMsIHJlcGFja2FnZS5jbGFzc2VzLCB4bWxwdWJsaWMuY2xhc3NlcywgdHlwZXN0b3JlLmNsYXNzZXMsIHhzZHNjaGVtYS5jbGFzc2VzLCBjb25maWdzY2hlbWEuY2xhc3NlcywgdG9vbHNjaGVtYS5jbGFzc2VzIj4KLSAgICA8bWtkaXIgZGlyPSJidWlsZC9jbGFzc2VzL3R5cGVpbXBsIi8+Ci0gICAgPGphdmFjIGRlc3RkaXI9ImJ1aWxkL2NsYXNzZXMvdHlwZWltcGwiIHNvdXJjZT0iMS40IiBkZWJ1Zz0ib24iPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbGlucHV0c3RyZWFtIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy9jb21tb24iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3JlcGFja2FnZSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMvdHlwZXN0b3JlIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94bWxwdWJsaWMiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbGNvbmZpZyIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMvY29uZmlnc2NoZW1hIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94c2RzY2hlbWEiLz4KLSAgICAgIDwvY2xhc3NwYXRoPgotCi0gICAgICAgIDxzcmMgcGF0aD0ic3JjL3R5cGVpbXBsIi8+Ci0gICAgICAgIDxzcmMgcGF0aD0iYnVpbGQvc3JjL3htbHNjaGVtYSIvPgotICAgICAgICA8c3JjIHBhdGg9ImJ1aWxkL3NyYy94c2RzY2hlbWEiLz4KLSAgICAgICAgPHNyYyBwYXRoPSJidWlsZC9zcmMvY29uZmlnc2NoZW1hIi8+Ci0gICAgICAgIDxzcmMgcGF0aD0iYnVpbGQvc3JjL3Rvb2xzY2hlbWEiLz4KLSAgICAgICAgPHNyYyBwYXRoPSJzcmMveG1sY29uZmlnIi8+Ci0gICAgPC9qYXZhYz4KLQotICAgIDwhLS0gTmVlZCBwcm9wZXJ0aWVzIGZpbGVzIGZvciByZWdleCAtLT4KLSAgICA8Y29weQotICAgICAgdG9kaXI9ImJ1aWxkL2NsYXNzZXMvdHlwZWltcGwiPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdHlwZWltcGwiPgotICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0geG1sY29tcCB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPHRhcmdldCBuYW1lPSJ4bWxjb21wLmNsYXNzZXMiIGRlcGVuZHM9ImRpcnMsIHJlcGFja2FnZS5jbGFzc2VzLCB0eXBlaW1wbC5jbGFzc2VzLCB4bWxwdWJsaWMuY2xhc3NlcywgdHlwZXN0b3JlLmNsYXNzZXMiPgotICAgIDxta2RpciBkaXI9ImJ1aWxkL2NsYXNzZXMveG1sY29tcCIvPgotICAgIDxqYXZhYyBzcmNkaXI9InNyYy94bWxjb21wIiBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzL3htbGNvbXAiIHNvdXJjZT0iMS40IiBkZWJ1Zz0ib24iPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbGlucHV0c3RyZWFtIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94bWxwdWJsaWMiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL2NvbW1vbiIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMvcmVwYWNrYWdlIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy90eXBlaW1wbCIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1sY29uZmlnIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy9jb25maWdzY2hlbWEiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3Rvb2xzY2hlbWEiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3hzZHNjaGVtYSIvPgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhYz4KLQotICA8L3RhcmdldD4KLQotICA8IS0tIHhtbHN0b3JlIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0YXJnZXQgbmFtZT0ieG1sc3RvcmUuY2xhc3NlcyIKLSAgICAgICAgZGVwZW5kcz0iZGlycywgY29tbW9uLmNsYXNzZXMsIHR5cGVzdG9yZS5jbGFzc2VzLCB4bWxwdWJsaWMuY2xhc3NlcyI+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxzdG9yZSIvPgotICAgIDxqYXZhYyBzcmNkaXI9InNyYy94bWxzdG9yZSIgZGVzdGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxzdG9yZSIgc291cmNlPSIxLjQiIGRlYnVnPSJvbiI+Ci0gICAgICA8Y2xhc3NwYXRoIGlkPSJ4bWxzdG9yZS5jb21waWxlLnBhdGgiPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1saW5wdXRzdHJlYW0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3R5cGVzdG9yZSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1scHVibGljIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy9jb21tb24iLz4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBib290c3RyYXAgc2NoZW1hIHRhcmdldCBzdXBwb3J0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLSAgPCEtLSB4c2RzY2hlbWEgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDwhLS0gTm90ZSB0aGF0IHRoaXMgaXMgYSB0cmlja3kgdGFyZ2V0IGJlY2F1c2UgaXQgYm9vdHN0cmFwcyB4YmVhbnMgb24gaXRzZWxmLiAtLT4KLSAgPCEtLSBUaGUgYmFzaWMgc3RyYXRlZ3kgaXMgdG8gcmVseSBvbiB0aGUgb2xkeGJlYW5zLmphciBjaGVja2VkIGludG8gZXh0ZXJuYWwvbGliIC0tPgotCi0gIDxwYXRoIGlkPSJib290c3RyYXAucnVuLnBhdGgiPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIvb2xkeGJlYW4uamFyIi8+Ci0gIDwvcGF0aD4KLQotICA8cGF0aCBpZD0iYm9vdHN0cmFwLmNvbXBpbGUucGF0aCI+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbHB1YmxpYyIvPgotICA8L3BhdGg+Ci0KLSAgPHByb3BlcnR5IG5hbWU9ImJvb3RzdHJhcC5jb21waWxlLnBhdGgiIHJlZmlkPSJib290c3RyYXAuY29tcGlsZS5wYXRoIi8+Ci0KLSAgPHBhdGggaWQ9InhzZHNjaGVtYS5jb21waWxlLnBhdGgiPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94bWxzY2hlbWEiLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1scHVibGljIi8+Ci0gIDwvcGF0aD4KLQotICA8cHJvcGVydHkgbmFtZT0ieHNkc2NoZW1hLmNvbXBpbGUucGF0aCIgcmVmaWQ9InhzZHNjaGVtYS5jb21waWxlLnBhdGgiLz4KLQotICA8dGFyZ2V0IG5hbWU9InhzZHNjaGVtYS5jaGVjayI+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ieHNkc2NoZW1hLm5vdFJlcXVpcmVkIj4KLSAgICAgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJ4c2RzY2hlbWEubm90UmVxdWlyZWQiIHRhcmdldGZpbGU9ImJ1aWxkL2NsYXNzZXMveHNkc2NoZW1hL3NjaGVtYS9zeXN0ZW0vc1hNTFNDSEVNQS9pbmRleC54c2IiPgotICAgICAgICAgIDxzcmNmaWxlcyBkaXI9InNyYy94c2RzY2hlbWEiIGluY2x1ZGVzPSIqKi8qLnhzZCIvPgotICAgICAgICA8L3VwdG9kYXRlPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InhzZHNjaGVtYS5jbGFzc2VzIiBkZXBlbmRzPSJ4c2RzY2hlbWEuY2hlY2ssIHhtbHNjaGVtYS5jbGFzc2VzLCB4bWxwdWJsaWMuY2xhc3Nlcywgb2xkeGJlYW4uamFyIiB1bmxlc3M9InhzZHNjaGVtYS5ub3RSZXF1aXJlZCI+Ci0gICAgPGRlbGV0ZSBkaXI9ImJ1aWxkL2NsYXNzZXMveHNkc2NoZW1hIi8+Ci0gICAgPGRlbGV0ZSBkaXI9ImJ1aWxkL3NyYy94c2RzY2hlbWEiLz4KLSAgICA8amF2YSBjbGFzc25hbWU9IiR7Ym9vdHN0cmFwX3NjaGVtYV9jb21waWxlcn0iIGNsYXNzcGF0aHJlZj0iYm9vdHN0cmFwLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KLSAgICAgIDxhcmcgbGluZT0iJHtyZXBhY2thZ2VfYXJnfSAtbmFtZSBzWE1MU0NIRU1BIC1jcCAke3hzZHNjaGVtYS5jb21waWxlLnBhdGh9IC1zcmNvbmx5IC1kIGJ1aWxkL2NsYXNzZXMveHNkc2NoZW1hIC1zcmMgYnVpbGQvc3JjL3hzZHNjaGVtYSBzcmMveHNkc2NoZW1hL3NjaGVtYSIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSB4bWxzY2hlbWEgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8IS0tIE5vdGUgdGhhdCB0aGlzIGlzIGEgdHJpY2t5IHRhcmdldCBiZWNhdXNlIGl0IGJvb3RzdHJhcHMgeGJlYW5zIG9uIGl0c2VsZi4gLS0+Ci0gIDwhLS0gVGhlIGJhc2ljIHN0cmF0ZWd5IGlzIHRvIHJlbHkgb24gdGhlIG9sZHhiZWFucy5qYXIgY2hlY2tlZCBpbnRvIGV4dGVybmFsL2xpYiAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InhtbHNjaGVtYS5jaGVjayI+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ieG1sc2NoZW1hLm5vdFJlcXVpcmVkIj4KLSAgICAgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJ4bWxzY2hlbWEubm90UmVxdWlyZWQiIHRhcmdldGZpbGU9ImJ1aWxkL2NsYXNzZXMveG1sc2NoZW1hL3NjaGVtYS9zeXN0ZW0vc1hNTExBTkcvaW5kZXgueHNiIj4KLSAgICAgICAgICA8c3JjZmlsZXMgZGlyPSJzcmMveG1sc2NoZW1hIiBpbmNsdWRlcz0iKiovKi54c2QiLz4KLSAgICAgICAgPC91cHRvZGF0ZT4KLSAgICA8L2NvbmRpdGlvbj4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ4bWxzY2hlbWEuY2xhc3NlcyIgZGVwZW5kcz0ieG1sc2NoZW1hLmNoZWNrLCB4bWxwdWJsaWMuY2xhc3Nlcywgb2xkeGJlYW4uamFyIiB1bmxlc3M9InhtbHNjaGVtYS5ub3RSZXF1aXJlZCI+Ci0gICAgPGRlbGV0ZSBkaXI9ImJ1aWxkL2NsYXNzZXMveG1sc2NoZW1hIi8+Ci0gICAgPGRlbGV0ZSBkaXI9ImJ1aWxkL3NyYy94bWxzY2hlbWEiLz4KLSAgICA8amF2YSBjbGFzc25hbWU9IiR7Ym9vdHN0cmFwX3NjaGVtYV9jb21waWxlcn0iIGNsYXNzcGF0aHJlZj0iYm9vdHN0cmFwLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KLSAgICAgIDxhcmcgbGluZT0iJHtyZXBhY2thZ2VfYXJnfSAtbmFtZSBzWE1MTEFORyAtZCBidWlsZC9jbGFzc2VzL3htbHNjaGVtYSAtc3JjIGJ1aWxkL3NyYy94bWxzY2hlbWEgLXNyY29ubHkgc3JjL3htbHNjaGVtYS9zY2hlbWEiLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0geG1sY29uZmlnIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dGFyZ2V0IG5hbWU9InhtbGNvbmZpZy5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzLCB4bWxwdWJsaWMuamFyLCBjb25maWdzY2hlbWEuY2xhc3NlcyI+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxjb25maWciLz4KLSAgICA8amF2YWMgc3JjZGlyPSJzcmMveG1sY29uZmlnIiBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzL3htbGNvbmZpZyIgc291cmNlPSIxLjQiIGRlYnVnPSJvbiI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94bWxwdWJsaWMuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy9jb25maWdzY2hlbWEiLz4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWM+Ci0KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBjb25maWdzY2hlbWEgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8IS0tIE5vdGUgdGhhdCB0aGlzIGlzIGEgdHJpY2t5IHRhcmdldCBiZWNhdXNlIGl0IGJvb3RzdHJhcHMgeGJlYW5zIG9uIGl0c2VsZi4gLS0+Ci0gIDwhLS0gVGhlIGJhc2ljIHN0cmF0ZWd5IGlzIHRvIHJlbHkgb24gdGhlIG9sZHhiZWFucy5qYXIgY2hlY2tlZCBpbnRvIGV4dGVybmFsL2xpYiAtLT4KLQotICA8cHJvcGVydHkgbmFtZT0iYm9vdHN0cmFwLmNvbXBpbGUucGF0aCIgcmVmaWQ9ImJvb3RzdHJhcC5jb21waWxlLnBhdGgiLz4KLQotICA8dGFyZ2V0IG5hbWU9ImNvbmZpZ3NjaGVtYS5jaGVjayI+Ci0gICAgPHVwdG9kYXRlIHByb3BlcnR5PSJjb25maWdzY2hlbWEubm90UmVxdWlyZWQiIHRhcmdldGZpbGU9ImJ1aWxkL2NsYXNzZXMvY29uZmlnc2NoZW1hL3NjaGVtYS9zeXN0ZW0vc1hNTENPTkZJRy9pbmRleC54c2IiPgotICAgICAgPHNyY2ZpbGVzIGRpcj0ic3JjL2NvbmZpZ3NjaGVtYSIgaW5jbHVkZXM9IioqLyoueHNkIi8+Ci0gICAgPC91cHRvZGF0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJjb25maWdzY2hlbWEuY2xhc3NlcyIgZGVwZW5kcz0iY29uZmlnc2NoZW1hLmNoZWNrLCB4bWxwdWJsaWMuY2xhc3Nlcywgb2xkeGJlYW4uamFyIiB1bmxlc3M9ImNvbmZpZ3NjaGVtYS5ub3RSZXF1aXJlZCI+Ci0gICAgPGRlbGV0ZSBkaXI9ImJ1aWxkL2NsYXNzZXMvY29uZmlnc2NoZW1hIi8+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSIke2Jvb3RzdHJhcF9zY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9ImJvb3RzdHJhcC5ydW4ucGF0aCIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+Ci0gICAgICA8YXJnIGxpbmU9IiR7cmVwYWNrYWdlX2FyZ30gLW5hbWUgc1hNTENPTkZJRyAtc3Jjb25seSAtc3JjIGJ1aWxkL3NyYy9jb25maWdzY2hlbWEgLWQgYnVpbGQvY2xhc3Nlcy9jb25maWdzY2hlbWEgc3JjL2NvbmZpZ3NjaGVtYS9zY2hlbWEiLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gdG9vbHNjaGVtYSB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDwhLS0gTm90ZSB0aGF0IHRoaXMgaXMgYSB0cmlja3kgdGFyZ2V0IGJlY2F1c2UgaXQgYm9vdHN0cmFwcyB4YmVhbnMgb24gaXRzZWxmLiAtLT4KLSAgPCEtLSBUaGUgYmFzaWMgc3RyYXRlZ3kgaXMgdG8gcmVseSBvbiB0aGUgb2xkeGJlYW5zLmphciBjaGVja2VkIGludG8gZXh0ZXJuYWwvbGliIC0tPgotCi0gIDxwcm9wZXJ0eSBuYW1lPSJib290c3RyYXAuY29tcGlsZS5wYXRoIiByZWZpZD0iYm9vdHN0cmFwLmNvbXBpbGUucGF0aCIvPgotCi0gIDx0YXJnZXQgbmFtZT0idG9vbHNjaGVtYS5jaGVjayI+Ci0gICAgPHVwdG9kYXRlIHByb3BlcnR5PSJ0b29sc2NoZW1hLm5vdFJlcXVpcmVkIiB0YXJnZXRmaWxlPSJidWlsZC9jbGFzc2VzL3Rvb2xzY2hlbWEvc2NoZW1hL3N5c3RlbS9zWE1MVE9PTFMvaW5kZXgueHNiIj4KLSAgICAgIDxzcmNmaWxlcyBkaXI9InNyYy90b29sc2NoZW1hIiBpbmNsdWRlcz0iKiovKi54c2QiLz4KLSAgICA8L3VwdG9kYXRlPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRvb2xzY2hlbWEuY2xhc3NlcyIgZGVwZW5kcz0idG9vbHNjaGVtYS5jaGVjaywgeG1scHVibGljLmNsYXNzZXMsIG9sZHhiZWFuLmphciIgdW5sZXNzPSJ0b29sc2NoZW1hLm5vdFJlcXVpcmVkIj4KLSAgICA8ZGVsZXRlIGRpcj0iYnVpbGQvY2xhc3Nlcy90b29sc2NoZW1hIi8+Ci0gICAgPG1rZGlyIGRpcj0iYnVpbGQvc3JjL3Rvb2xzY2hlbWEiLz4KLSAgICA8amF2YSBjbGFzc25hbWU9IiR7Ym9vdHN0cmFwX3NjaGVtYV9jb21waWxlcn0iIGNsYXNzcGF0aHJlZj0iYm9vdHN0cmFwLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KLSAgICAgIDxhcmcgbGluZT0iJHtyZXBhY2thZ2VfYXJnfSAtbmFtZSBzWE1MVE9PTFMgLXNyY29ubHkgLXNyYyBidWlsZC9zcmMvdG9vbHNjaGVtYSAtZCBidWlsZC9jbGFzc2VzL3Rvb2xzY2hlbWEgc3JjL3Rvb2xzY2hlbWEiLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tID09PT09ICAgUmVwYWNrYWdpbmcgID09PT09PSAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICAgIDx0YXJnZXQgbmFtZT0iZWRpdF9idWlsZF9zY3JpcHQiPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSJlZGl0aW5nIHJlcGFja2FnZSBidWlsZCBmaWxlOiAke3Rva2VufSAtLT4ke3JlcGxhY2VtZW50fSIvPgotCi0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0icmVwYWNrYWdlLkVkaXRCdWlsZFNjcmlwdCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHtiYXNlZGlyfS9idWlsZC9yZXBhY2thZ2UvYnVpbGQueG1sIi8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSIke3Rva2VufSIvPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHtyZXBsYWNlbWVudH0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3JlcGFja2FnZSIvPgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgIDwvamF2YT4KLSAgICA8L3RhcmdldD4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBhY2thZ2VfYXJnIiB2YWx1ZT0iIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNjaGVtYV9jb21waWxlciIgdmFsdWU9Im9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlNjaGVtYUNvbXBpbGVyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJvb3RzdHJhcF9zY2hlbWFfY29tcGlsZXIiIHZhbHVlPSJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5TY2hlbWFDb21waWxlciIvPgotCi0gICAgPCEtLQotICAgICAgICBQYXJhbXMgdG8gcmVwYWNrYWdlIGFyZToKLQotICAgICAgICAgICAgcmVwYWNrYWdlX3NwZWM6Ci0KLSAgICAgICAgICAgICAgICBPZiB0aGUgZm9ybSBmcm9tX3BrZ18xOnRvX3BrZ18xO2Zyb21fcGtnXzI6dG9fcGtnXzIgd2hpY2ggc3BlY2lmaWVzIHdoaWNoIHBhY2thZ2VzCi0gICAgICAgICAgICAgICAgYXJlIHRvIGJlIGNvbnZlcnRlZCB3aGljaCB3aGljaCB3aGljaCBvdGhlciBwYWNrYWdlcy4gIFJpZ2h0IG5vdywgdGhlcmUgYXJlIHR3by4KLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnhtbGJlYW5zIGFuZCBhcGFjaGUueG1sYmVhbnMuaW1wbCwgdGhlIHB1YmxpYyBhbmQgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgICAgICBwYWNrYWdlcy4KLQotICAgICAgICAgICAgbmV3X3NjaGVtYV9jb21waWxlcgotCi0gICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHdoaWNoIHdpbGwgbmV3IHRoZSBuZXcgc2NoZW1hIGNvbXBpbGVyLiAgV2lsbCByZXBsYWNlCi0gICAgICAgICAgICAgICAgJHtzY2hlbWFfY29tcGlsZXJ9IGR1cmluZyB0aGUgYm9vdHN0cmFwIHByb2Nlc3MuCi0gICAgLS0+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InJlcGFja2FnZSIgZGVwZW5kcz0icmVwYWNrYWdlLmNsYXNzZXMiPgotCi0gICAgICAgIDxlY2hvIG1lc3NhZ2U9IlJlLXBhY2thZ2luZyBYTWxCZWFucyIvPgotCi0gICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgbmFtZT0ibmV3X3JlcGFja2FnZV9hcmciCi0gICAgICAgICAgICB2YWx1ZT0iLXJlcGFja2FnZSAke3JlcGFja2FnZV9zcGVjfSIvPgotCi0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0icmVwYWNrYWdlLlJlcGFja2FnZSIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMvcmVwYWNrYWdlIi8+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iJHtuZXdfcmVwYWNrYWdlX2FyZ30iLz4KLSAgICAgICAgPC9qYXZhPgotCi0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZWRpdF9idWlsZF9zY3JpcHQiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRva2VuIiAgICAgICB2YWx1ZT0icmVwYWNrYWdlX2FyZyIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InJlcGxhY2VtZW50IiB2YWx1ZT0iJHtuZXdfcmVwYWNrYWdlX2FyZ30iLz4KLSAgICAgICAgPC9hbnRjYWxsPgotCi0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZWRpdF9idWlsZF9zY3JpcHQiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRva2VuIiAgICAgICB2YWx1ZT0ic2NoZW1hX2NvbXBpbGVyIi8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0icmVwbGFjZW1lbnQiIHZhbHVlPSIke25ld19zY2hlbWFfY29tcGlsZXJ9Ii8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLQotICAgICAgICA8YW50IGRpcj0iYnVpbGQvcmVwYWNrYWdlIiB0YXJnZXQ9InhiZWFuIiBpbmhlcml0QWxsPSJmYWxzZSIvPgotCi0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZWRpdF9idWlsZF9zY3JpcHQiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRva2VuIiAgICAgICB2YWx1ZT0iYm9vdHN0cmFwX3NjaGVtYV9jb21waWxlciIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InJlcGxhY2VtZW50IiB2YWx1ZT0iJHtuZXdfc2NoZW1hX2NvbXBpbGVyfSIvPgotICAgICAgICA8L2FudGNhbGw+Ci0KLSAgICAgICAgPGFudCBkaXI9ImJ1aWxkL3JlcGFja2FnZSIgdGFyZ2V0PSJib290c3RyYXAiIGluaGVyaXRBbGw9ImZhbHNlIi8+Ci0KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0icmVwYWNrYWdlLmNsYXNzZXMiPgotICAgICAgICA8bWtkaXIgZGlyPSJidWlsZC9jbGFzc2VzL3JlcGFja2FnZSIvPgotICAgICAgICA8amF2YWMgc3JjZGlyPSJzcmMvcmVwYWNrYWdlIiBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzL3JlcGFja2FnZSIgc291cmNlPSIxLjQiIGRlYnVnPSJvbiIvPgotICAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9ndWlkZS9hbnRYbWxiZWFuLmh0bWwgYi92MS9kb2NzL2d1aWRlL2FudFhtbGJlYW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhNGNmNS4uMDAwMDAwMAotLS0gYS92MS9kb2NzL2d1aWRlL2FudFhtbGJlYW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi08IWRvY3R5cGUgSFRNTCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiI+Ci0KLTxodG1sPjwhLS0gSW5zdGFuY2VCZWdpbiB0ZW1wbGF0ZT0iZmlsZTovLy9DfC9wNC9tYWluL2hlbHAvaWRlL2VuL1RlbXBsYXRlcy9Db21tYW5kLmR3dCIgY29kZU91dHNpZGVIVE1MSXNMb2NrZWQ9ImZhbHNlIiAtLT4KLTxoZWFkPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iZG9jdGl0bGUiIC0tPgotPHRpdGxlPnhtbGJlYW4gQW50IFRhc2s8L3RpdGxlPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJtZXRhdGFncyIgLS0+Ci08bWV0YSBuYW1lPSJjb21wb25lbnQiIGNvbnRlbnQ9IiI+Ci08IS0tIEluIHRoZSBkZXNjcmlwdGlvbiBtZXRhdGFnLCBwbGVhc2UgcHJvdmlkZSBhIEJSSUVGIGRlc2NyaXB0aW9uIG9mIHRoZSB0b3BpYyBjb250ZW50cy4gLS0+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iIj4KLTwhLS0gSW4gdGhlIGNvbXBvbmVudCBtZXRhdGFnLCBwbGVhc2UgbGlzdCBrZXl3b3JkcyB0aGF0IHdpbGwgaGVscCBhIHVzZXIgc2VhcmNoIGZvciB0aGlzIHRvcGljLiAtLT4KLTxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotCi08IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci08bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgotPC9oZWFkPgotCi08IS0tKEJvZHkpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPGJvZHk+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJib2R5IiAtLT4KLTxkaXYgaWQ9dG9waWN0aXRsZT4KLSAgPEgxIGNsYXNzPVRpdGxlPnhtbGJlYW4gQW50IFRhc2s8L2gxPgotPC9kaXY+Ci08ZGl2IGlkPXRvcGljdGV4dD4KLSAgPHA+Q29tcGlsZXMgYSBzZXQgb2YgWFNEIGFuZC9vciBXU0RMIGZpbGVzIGludG8gWE1MQmVhbnMuIFRoaXMgaXMgdXNlZnVsIGZvcgotICAgIGJ1aWxkaW5nIGFuIFhNTEJlYW4gSkFSIGZyb20gWFNEIGFuZCBXU0RMIGZpbGVzLiBJZiBkZXNpcmVkLCB0aGUgdGFzayBjYW4KLSAgICBhbHNvIGdlbmVyYXRlIHRoZSBzb3VyY2UgY29kZSB0aGF0IG1ha2VzIHVwIHRoZSBYTUxCZWFuIHR5cGUgc3lzdGVtIHNwZWNpZmllZAotICAgIGJ5IHRoZSBzY2hlbWEgZmlsZXMuPC9wPgotICA8cCBjbGFzcz0ibm90ZXBhcmEiPjxiPk5vdGU6PC9iPiBUaGlzIHRhc2sgZGVwZW5kcyBvbiBhbiBleHRlcm5hbCBsaWJyYXJ5IG5vdAotICAgIGluY2x1ZGVkIGluIHRoZSBBbnQgZGlzdHJpYnV0aW9uIGNhbGxlZCB4YmVhbi5qYXIuICZuYnNwO0l0IGNhbiBiZSBmb3VuZCBpbgotICAgIHRoZSBYTUxCZWFucyBkZXZlbG9wZXIga2l0IGF0IDxhIGhyZWY9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWxiZWFucy8iCi0gICAgICAgIHRhcmdldD0iX2JsYW5rIj5odHRwOi8veG1sLmFwYWNoZS5vcmcveG1sYmVhbnMvPC9hPi4KLSAgICBUaGUgYnVpbGQgc2NyaXB0IHdpbGwgbmVlZCB0byBpbmNsdWRlIGEgdGFza2RlZiBmb3IgeG1sYmVhbiwgd2hpY2ggY291bGQgbG9vawotICAgIGxpa2UgdGhpczo8L3A+Ci08L2Rpdj4KLTxibG9ja3F1b3RlPgotICA8ZGl2IGNsYXNzPSJub3RlcGFyYSI+Ci0gICAgPHByZSBjbGFzcz0ibm90ZXBhcmEiPiZsdDt0YXNrZGVmIG5hbWU9InhtbGJlYW4iIGNsYXNzbmFtZT0iY29tLmJlYS54YmVhbi50b29sLlhNTEJlYW4iIGNsYXNzcGF0aD0icGF0aC90by94YmVhbi5qYXIiLyZndDs8L3ByZT4KLSAgPC9kaXY+Ci08L2Jsb2NrcXVvdGU+Ci08ZGl2PgotPHA+SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgcHJvY2Vzc2VkLiBUaGlzCi0gICAgY2FuIGJlIGRvbmUgd2l0aCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmluY2x1ZGVzPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmluY2x1ZGVzZmlsZTwvc3Bhbj4sCi0gICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmV4Y2x1ZGVzPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmV4Y2x1ZGVzZmlsZTwvc3Bhbj4KLSAgICBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmRlZmF1bHRleGNsdWRlczwvc3Bhbj4gYXR0cmlidXRlcy4gV2l0aCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmluY2x1ZGVzPC9zcGFuPgotICAgIG9yIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pbmNsdWRlc2ZpbGU8L3NwYW4+IGF0dHJpYnV0ZSB5b3Ugc3BlY2lmeSB0aGUKLSAgICBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGluY2x1ZGVkIGJ5IHVzaW5nIHBhdHRlcm5zLiBUaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmV4Y2x1ZGU8L3NwYW4+Ci0gICAgb3IgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmV4Y2x1ZGVzZmlsZTwvc3Bhbj4gYXR0cmlidXRlcyBhcmUgdXNlZCB0byBzcGVjaWZ5Ci0gICAgdGhlIGZpbGVzIHlvdSB3YW50IHRvIGhhdmUgZXhjbHVkZWQuIFRoaXMgaXMgYWxzbyBkb25lIHdpdGggcGF0dGVybnMuIEFuZAotICAgIGZpbmFsbHkgd2l0aCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmRlZmF1bHRleGNsdWRlczwvc3Bhbj4gYXR0cmlidXRlLAotICAgIHlvdSBjYW4gc3BlY2lmeSB3aGV0aGVyIHlvdSB3YW50IHRvIHVzZSBkZWZhdWx0IGV4Y2x1c2lvbnMgb3Igbm90LiBTZWUgdGhlCi0gICAgc2VjdGlvbiBvbiA8YQotIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIiB0YXJnZXQ9Il9ibGFuayI+ZGlyZWN0b3J5Ci0gICAgYmFzZWQgdGFza3M8L2E+IGluIHRoZSA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsLyIgdGFyZ2V0PSJfYmxhbmsiPkFudAotICAgIGRvY3VtZW50YXRpb248L2E+LCBvbiBob3cgdGhlIGluY2x1c2lvbi9leGNsdXNpb24gb2YgZmlsZXMgd29ya3MsIGFuZCBob3cKLSAgICB0byB3cml0ZSBwYXR0ZXJucy48L3A+Ci0gIDxwPlRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCA8YQotIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPkZpbGVTZXQ8L2E+Ci0gICAgYW5kIHN1cHBvcnRzIGFsbCBhdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gKDxjb2RlPmRpcjwvY29kZT4KLSAgICBiZWNvbWVzIDxjb2RlPmJhc2VkaXI8L2NvZGU+KSBhcyB3ZWxsIGFzIHRoZSBuZXN0ZWQgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwKLSAgICA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KLSAgPGgzPlBhcmFtZXRlcnM8L2gzPgotICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotICAgIDx0Ym9keT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnNjaGVtYTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+QSBmaWxlIHRoYXQgcG9pbnRzIHRvIGVpdGhlciBhbiBpbmRpdmlkdWFsIHNjaGVtYSBmaWxlCi0gICAgICAgICAgb3IgYSBkaXJlY3Rvcnkgb2YgZmlsZXMuICZuYnNwO05vdCBhIHBhdGggcmVmZXJlbmNlLiAmbmJzcDtJZiBtdWx0aXBsZQotICAgICAgICAgIHNjaGVtYSBmaWxlcyBuZWVkIHRvIGJlIGJ1aWx0IHRvZ2V0aGVyLCB1c2UgYSBuZXN0ZWQgZmlsZXNldCBpbnN0ZWFkCi0gICAgICAgICAgb2Ygc2V0dGluZyBzY2hlbWEuPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXMsIHVubGVzcyBhIGZpbGVzZXQgZWxlbWVudCBpcyBuZXN0ZWQuPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGZpbGU8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgamFyIGZpbGUgY3JlYXRlZC4mbmJzcDsgRm9yIGluc3RhbmNlLAotICAgICAgICAgICJteVhNTEJlYW4uamFyIiB3aWxsIG91dHB1dCB0aGUgcmVzdWx0cyBvZiB0aGlzIHRhc2sgaW50byBhIGphciB3aXRoCi0gICAgICAgICAgdGhlIHNhbWUgbmFtZS48L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzICJ4bWx0eXBlcy5qYXIiLjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRvd25sb2FkPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5TZXQgdG8gdHJ1ZSB0byBwZXJtaXQgdGhlIGNvbXBpbGVyIHRvIGRvd25sb2FkIFVSTHMgZm9yCi0gICAgICAgICAgaW1wb3J0cyBhbmQgaW5jbHVkZXMuJm5ic3A7IERlZmF1bHRzIHRvIGZhbHNlLCBtZWFuaW5nIGFsbCBpbXBvcnRzIGFuZAotICAgICAgICAgIGluY2x1ZGVzIG11c3QgYmUgY29waWVkIGxvY2FsbHkuPGJyPiA8L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIGZhbHNlLjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgYW50IHRhcmdldCB3aWxsIGNvbnRpbnVlCi0gICAgICAgICAgaWYgdGhlIFhNTEJlYW4gY3JlYXRpb24gZW5jb3VudGVycyBhIGJ1aWxkIGVycm9yLjxicj4gPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyB0cnVlLjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8YnI+IDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Q29udHJvbHMgdGhlIGFtb3VudCBvZiBidWlsZCBtZXNzYWdlIG91dHB1dC48YnI+IDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgaXMgdHJ1ZS48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj50eXBlc3lzdGVtbmFtZTxicj4gPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0aGF0IHRoZSBUeXBlU3lzdGVtSG9sZGVyIGNsYXNzCi0gICAgICAgICAgc2hvdWxkIGJlIGdlbmVyYXRlZCBpbi4mbmJzcDsgTm9ybWFsbHkgdGhpcyBzaG91bGQgYmUgbGVmdCB1bnNwZWNpZmllZC4KLSAgICAgICAgICBOb25lIG9mIHRoZSBYTUxCZWFucyBhcmUgZ2VuZXJhdGVkIGluIHRoaXMgcGFja2FnZS4gVXNlIC54c2Rjb25maWcgZmlsZXMKLSAgICAgICAgICB0byBtb2RpZnkgWE1MQmVhbiBwYWNrYWdlIG9yIGNsYXNzIG5hbWVzLjxicj4gPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Obzxicj4gPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NnZW5kaXI8YnI+IDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0IGEgbG9jYXRpb24gdG8gZ2VuZXJhdGUgQ0xBU1MgZmlsZXMgaW50by48YnI+IDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88YnI+IDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnNyY29ubHk8YnI+IDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+QSB2YWx1ZSBvZiB0cnVlIG1lYW5zIHRoYXQgb25seSBzb3VyY2Ugd2lsbCBiZSBnZW5lcmF0ZWQuPGJyPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IGlzIGZhbHNlLjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnNyY2dlbmRpcjxicj4gPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5TZXQgYSBsb2NhdGlvbiB0byBnZW5lcmF0ZSBKQVZBIGZpbGVzIGludG8uPGJyPiA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPGJyPiA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gdXNlIGlmIHNjaGVtYXMgaW4gdGhlIGZpbGVzZXQgaW1wb3J0Ci0gICAgICAgICAgZGVmaW5pdGlvbnMgdGhhdCBhcmUgc3VwcGxpZWQgYnkgb3RoZXIgY29tcGlsZWQgWE1MQmVhbnMgSkFSIGZpbGVzLAotICAgICAgICAgIG9yIGlmIEpBVkEgZmlsZXMgYXJlIGluIHRoZSBzY2hlbWEgZmlsZXNldC4gQWxzbyBzdXBwb3J0cyBhIG5lc3RlZCBjbGFzc3BhdGguPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aHJlZjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+QWRkcyBhIGNsYXNzcGF0aCwgZ2l2ZW4gYXMgPGEKLSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyIgdGFyZ2V0PSJfYmxhbmsiPnJlZmVyZW5jZTwvYT4KLSAgICAgICAgICB0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5Db21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdAotICAgICAgICAgIG11c3QgYmUgaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlc2ZpbGU8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0bwotICAgICAgICAgIGJlIGFuIGluY2x1ZGUgcGF0dGVybi48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXM8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0Ci0gICAgICAgICAgbXVzdCBiZSBleGNsdWRlZC4gTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbgotICAgICAgICAgIG9taXR0ZWQuPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzZmlsZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvCi0gICAgICAgICAgYmUgYW4gZXhjbHVkZSBwYXR0ZXJuLjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kZWZhdWx0ZXhjbHVkZXM8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3IKLSAgICAgICAgICBub3QgKCJ5ZXMiLyJubyIpLiBEZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZC48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVidWc8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIHNvdXJjZSBzaG91bGQgYmUgY29tcGlsZWQgd2l0aCBkZWJ1ZwotICAgICAgICAgIGluZm9ybWF0aW9uOyBkZWZhdWx0cyB0byA8Y29kZT5vZmY8L2NvZGU+LiBJZiBzZXQgdG8gPGNvZGU+b2ZmPC9jb2RlPiwKLSAgICAgICAgICA8Y29kZT4tZzpub25lPC9jb2RlPiB3aWxsIGJlIHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGZvciBjb21waWxlcnMKLSAgICAgICAgICB0aGF0IHN1cHBvcnQgaXQgKGZvciBvdGhlciBjb21waWxlcnMsIG5vIGNvbW1hbmQgbGluZSBhcmd1bWVudCB3aWxsCi0gICAgICAgICAgYmUgdXNlZCkuIElmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5kZWJ1Z2xldmVsPC9jb2RlPgotICAgICAgICAgIGF0dHJpYnV0ZSBkZXRlcm1pbmVzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQuPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRlYnVnbGV2ZWw8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPktleXdvcmQgbGlzdCB0byBiZSBhcHBlbmRlZCB0byB0aGUgPGNvZGU+LWc8L2NvZGU+IGNvbW1hbmQtbGluZQotICAgICAgICAgIHN3aXRjaC4gVGhpcyB3aWxsIGJlIGlnbm9yZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucyBleGNlcHQgPGNvZGU+bW9kZXJuPC9jb2RlPgotICAgICAgICAgIGFuZCA8Y29kZT5jbGFzc2ljKHZlciAmZ3Q7PSAxLjIpPC9jb2RlPi4gTGVnYWwgdmFsdWVzIGFyZSA8Y29kZT5ub25lPC9jb2RlPgotICAgICAgICAgIG9yIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIGZvbGxvd2luZyBrZXl3b3JkczogPGNvZGU+bGluZXM8L2NvZGU+LAotICAgICAgICAgIDxjb2RlPnZhcnM8L2NvZGU+LCBhbmQgPGNvZGU+c291cmNlPC9jb2RlPi4gSWYgPGNvZGU+ZGVidWdsZXZlbDwvY29kZT4KLSAgICAgICAgICBpcyBub3Qgc3BlY2lmaWVkLCBieSBkZWZhdWx0LCBub3RoaW5nIHdpbGwgYmUgYXBwZW5kZWQgdG8gPGNvZGU+LWc8L2NvZGU+LgotICAgICAgICAgIElmIDxjb2RlPmRlYnVnPC9jb2RlPiBpcyBub3QgdHVybmVkIG9uLCB0aGlzIGF0dHJpYnV0ZSB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5vcHRpbWl6ZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+SW5kaWNhdGVzIHdoZXRoZXIgc291cmNlIHNob3VsZCBiZSBjb21waWxlZCB3aXRoIG9wdGltaXphdGlvbjsKLSAgICAgICAgICBkZWZhdWx0cyB0byA8Y29kZT5vZmY8L2NvZGU+LjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlQW50UnVudGltZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBpbmNsdWRlIHRoZSBBbnQgcnVuLXRpbWUgbGlicmFyaWVzIGluIHRoZQotICAgICAgICAgIGNsYXNzcGF0aDsgZGVmYXVsdHMgdG8gPGNvZGU+eWVzPC9jb2RlPi48L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZUphdmFSdW50aW1lPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGRlZmF1bHQgcnVuLXRpbWUgbGlicmFyaWVzIGZyb20KLSAgICAgICAgICB0aGUgZXhlY3V0aW5nIFZNIGluIHRoZSBjbGFzc3BhdGg7IGRlZmF1bHRzIHRvIDxjb2RlPm5vPC9jb2RlPi48L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9yazwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBleGVjdXRlIDxjb2RlPmphdmFjPC9jb2RlPiB1c2luZyB0aGUgSkRLIGNvbXBpbGVyCi0gICAgICAgICAgZXh0ZXJuYWxseTsgZGVmYXVsdHMgdG8gPGNvZGU+eWVzPC9jb2RlPi48L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIHRydWU8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5leGVjdXRhYmxlPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5Db21wbGV0ZSBwYXRoIHRvIHRoZSA8Y29kZT5qYXZhYzwvY29kZT4gZXhlY3V0YWJsZSB0bwotICAgICAgICAgIHVzZSBpbiBjYXNlIG9mIDxjb2RlPmZvcms9JnF1b3Q7eWVzJnF1b3Q7PC9jb2RlPi4gRGVmYXVsdHMgdG8gdGhlIGNvbXBpbGVyCi0gICAgICAgICAgb2YgdGhlIEphdmEgdmVyc2lvbiB0aGF0IGlzIGN1cnJlbnRseSBydW5uaW5nIEFudC4gSWdub3JlZCBpZiA8Y29kZT5mb3JrPSZxdW90O25vJnF1b3Q7PC9jb2RlPjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5tZW1vcnlJbml0aWFsU2l6ZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciB0aGUgdW5kZXJseWluZyBWTSwKLSAgICAgICAgICBpZiA8Y29kZT5qYXZhYzwvY29kZT4gaXMgcnVuIGV4dGVybmFsbHk7IGlnbm9yZWQgb3RoZXJ3aXNlLiBEZWZhdWx0cwotICAgICAgICAgIHRvIHRoZSBzdGFuZGFyZCBWTSBtZW1vcnkgc2V0dGluZy4gKEV4YW1wbGVzOiA8Y29kZT44Mzg4NjA4MDwvY29kZT4sCi0gICAgICAgICAgPGNvZGU+ODE5MjBrPC9jb2RlPiwgb3IgPGNvZGU+ODBtPC9jb2RlPik8L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bWVtb3J5TWF4aW11bVNpemU8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgdGhlIHVuZGVybHlpbmcgVk0sCi0gICAgICAgICAgaWYgPGNvZGU+amF2YWM8L2NvZGU+IGlzIHJ1biBleHRlcm5hbGx5OyBpZ25vcmVkIG90aGVyd2lzZS4gRGVmYXVsdHMKLSAgICAgICAgICB0byB0aGUgc3RhbmRhcmQgVk0gbWVtb3J5IHNldHRpbmcuIChFeGFtcGxlczogPGNvZGU+ODM4ODYwODA8L2NvZGU+LAotICAgICAgICAgIDxjb2RlPjgxOTIwazwvY29kZT4sIG9yIDxjb2RlPjgwbTwvY29kZT4pPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbXBpbGVyPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY29tcGlsZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlLiBJZiB0aGlzIGF0dHJpYnV0ZQotICAgICAgICAgIGlzIG5vdCBzZXQsIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+YnVpbGQuY29tcGlsZXI8L2NvZGU+IHByb3BlcnR5LCBpZgotICAgICAgICAgIHNldCwgd2lsbCBiZSB1c2VkLiBPdGhlcndpc2UsIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGZvciB0aGUgY3VycmVudCBWTQotICAgICAgICAgIHdpbGwgYmUgdXNlZC4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGJvZHk+Ci0gIDwvdGFibGU+Ci0gIDxoMz5FeGFtcGxlPC9oMz4KLTwvZGl2PgotPGRpdiBpZD10b3BpY3RleHQ+IEJlIHN1cmUgdG8gZGVmaW5lIHRoZSB0YXNrIGluIHlvdXIgc2NyaXB0LCBsaWtlIHRoaXM6PC9kaXY+Ci08ZGl2PgotICA8cHJlPiZsdDt0YXNrZGVmIG5hbWU9InhtbGJlYW4iIGNsYXNzbmFtZT0iY29tLmJlYS54YmVhbi50b29sLlhNTEJlYW4iIGNsYXNzcGF0aD0icGF0aC90by94YmVhbi5qYXIiPC9wcmU+Ci0gIDxwPlRoZSBmb2xsb3dpbmcgYnVpbGRzIGFsbCB0aGUgc2NoZW1hcyBpbiB0aGUgc2NoZW1hcyBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMKLSAgICBhIGphciBjYWxsZWQgJnF1b3Q7U2NoZW1hcy5qYXImcXVvdDsuPC9wPgotPC9kaXY+Ci08ZGl2PgotICA8cHJlPgotJmx0O3htbGJlYW4gc2NoZW1hPSJzY2hlbWFzIiBkZXN0ZmlsZT0iU2NoZW1hcy5qYXIiLyZndDs8L3ByZT4KLSAgVGhlIGZvbGxvd2luZyBjb21waWxlcyB0aGUgc2NoZW1hICZxdW90O291clNjaGVtYS54c2QmcXVvdDsgaW50byB0aGUgZGVmYXVsdAotICBqYXIgJnF1b3Q7eG1sdHlwZXMuamFyJnF1b3Q7LiAmbmJzcDtJZiAmbmJzcDthbnkgaW1wb3J0cyBhbmQgaW5jbHVkZXMgYXJlIGRlZmluZWQKLSAgYnkgcmVtb3RlIFVSTHMsIHRoZXkgYXJlIGRvd25sb2FkZWQgZHVyaW5nIHRoZSBidWlsZC4KLSAgPGRpdj4KLSAgICA8cHJlPiZsdDt4bWxiZWFuIHNjaGVtYT0ic2NoZW1hcy9vdXJTY2hlbWEueHNkIiBkb3dubG9hZD0idHJ1ZSIvJmd0OzwvcHJlPgotICA8L2Rpdj4KLSAgPGRpdj4KLSAgICA8aDQ+VXNpbmcgYSBmaWxlc2V0PC9oND4KLSAgPC9kaXY+Ci0gIDxkaXY+Ci0gICAgPHByZT4mbHQ7eG1sYmVhbiBjbGFzc2dlbmRpcj0iJHtidWlsZC5kaXJ9IiBjbGFzc3BhdGg9IiR7Y2xhc3MucGF0aH0iPGJyPiAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIiZndDs8YnI+ICAmbHQ7ZmlsZXNldCBiYXNlZGlyPSJzcmMiIGV4Y2x1ZGVzPSIqKi8qLnhzZCIvJmd0Ozxicj4gICZsdDtmaWxlc2V0IGJhc2VkaXI9InNjaGVtYXMiIGluY2x1ZGVzPSIqKi8qLioiLyZndDs8YnI+Jmx0Oy94bWxiZWFuJmd0OzwvcHJlPgotICA8L2Rpdj4KLSAgPGRpdj4gR2F0aGVycyBhbGwgdGhlIGZpbGVzIGluIHRoZSBzcmMgZGlyZWN0b3J5IGV4Y2VwdCBYU0QgZmlsZXMsIGFsb25nIHdpdGgKLSAgICBldmVyeSBmaWxlIGluIHRoZSBzY2hlbWFzIGRpcmVjdG9yeSwgYW5kIGNvbXBpbGVzIHRoZW0uIFRoZSBmaWxlc2V0IGNhbiBpbmNsdWRlCi0gICAgc2NoZW1hIGZpbGVzIHRoYXQgcmVmZXIgdG8gcHJldmlvdXNseSBjb21waWxlZCBzY2hlbWEgY29tcG9uZW50cy4mbmJzcDsgVGhlCi0gICAgZmlsZXNldCBjYW4gYWxzbyBjb250YWluIEpBVkEgZmlsZXMuJm5ic3A7IFRoZSBjbGFzc3BhdGggcGFyYW1ldGVyIGRlZmluZXMKLSAgICB0aGUgY2xhc3NwYXRoIG5lY2Vzc2FyeSB0byByZXNvbHZlIGNvbXBpbGVkIHNjaGVtYSBhbmQgamF2YSByZWZlcmVuY2VzLjxicj4KLSAgICA8YnI+Ci0gICAgVGhlIGJ1aWx0IGNsYXNzZXMgd2lsbCBnbyBpbnRvICR7YnVpbGQuZGlyfS48L2Rpdj4KLSAgPGRpdj4KLSAgICA8cCBjbGFzcz1yZWxhdGVkdG9waWNzPlJlbGF0ZWQgVG9waWNzPC9wPgotICAgIDxwPk5vbmUuPC9wPgotICA8L2Rpdj4KLTwvZGl2PgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPC9ib2R5PgotPCEtLSBJbnN0YW5jZUVuZCAtLT48L2h0bWw+CmRpZmYgLS1naXQgYS92MS9kb2NzL2d1aWRlL2NvbkdldHRpbmdTdGFydGVkd2l0aFhNTEJlYW5zLmh0bWwgYi92MS9kb2NzL2d1aWRlL2NvbkdldHRpbmdTdGFydGVkd2l0aFhNTEJlYW5zLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4Yzk4ZmQuLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy9ndWlkZS9jb25HZXR0aW5nU3RhcnRlZHdpdGhYTUxCZWFucy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTE5ICswLDAgQEAKLTwhZG9jdHlwZSBIVE1MIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgRnJhbWVzZXQvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImRvY3RpdGxlIiAtLT4KLTx0aXRsZT5HZXR0aW5nIFN0YXJ0ZWQgd2l0aCBYTUxCZWFuczwvdGl0bGU+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+IAotPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+Ci0KLQotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgotCi08bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9InlvdXIgbmFtZSI+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgdG9waWMgY29udGVudHMuIj4KLTxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSJrZXl3b3JkcyB0byBoZWxwIGluIHNlYXJjaGVzIj4KLTxtZXRhIG5hbWU9ImRhdGUgbGFzdCBtb2RpZmllZCIgY29udGVudD0iMTAvMjUvMDIiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotCi08IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+IAotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTxsaW5rIGhyZWY9Ii4uL3htbGJlYW5zLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Ci08YSBocmVmPSIuLi8uLi8uLi9jb3JlL2luZGV4Lmh0bWwiIGlkPSJpbmRleCI+PC9hPgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL3RvcGljSW5mby5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvQ29va2llQ2xhc3MuanMiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL2Rpc3BsYXlDb250ZW50LmpzIj48L3NjcmlwdD4KLTwvaGVhZD4KLQotPCEtLShCb2R5KT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTxib2R5PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0KLTwvc2NyaXB0PgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iYm9keSIgLS0+IAotPGgxPiBHZXR0aW5nIFN0YXJ0ZWQgd2l0aCBYTUxCZWFuczwvaDE+Ci08ZGl2IGlkPSJ0b3BpY3RleHQiPiAKLSAgPHA+WE1MQmVhbnMgcHJvdmlkZXMgaW50dWl0aXZlIHdheXMgdG8gaGFuZGxlIFhNTCB0aGF0IG1ha2UgaXQgZWFzaWVyIGZvciB5b3UgCi0gICAgdG8gYWNjZXNzIGFuZCBtYW5pcHVsYXRlIFhNTCBkYXRhIGFuZCBkb2N1bWVudHMgaW4gSmF2YS4gPC9wPgotICA8cD5DaGFyYWN0ZXJpc3RpY3Mgb2YgWE1MQmVhbnMgYXBwcm9hY2ggdG8gWE1MOjwvcD4KLTwvZGl2PgotPHVsPgotICA8bGk+IAotICAgIDxkaXY+SXQgcHJvdmlkZXMgYSBmYW1pbGlhciBKYXZhIG9iamVjdC1iYXNlZCB2aWV3IG9mIFhNTCBkYXRhIHdpdGhvdXQgbG9zaW5nIAotICAgICAgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCwgbmF0aXZlIFhNTCBzdHJ1Y3R1cmUuPC9kaXY+Ci0gIDwvbGk+Ci0gIDxsaT4gCi0gICAgPGRpdj5UaGUgWE1MJ3MgaW50ZWdyaXR5IGFzIGEgZG9jdW1lbnQgaXMgbm90IGxvc3Qgd2l0aCBYTUxCZWFucy4gWE1MLW9yaWVudGVkIAotICAgICAgQVBJcyBjb21tb25seSB0YWtlIHRoZSBYTUwgYXBhcnQgaW4gb3JkZXIgdG8gYmluZCB0byBpdHMgcGFydHMuIFdpdGggWE1MQmVhbnMsIAotICAgICAgdGhlIGVudGlyZSBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgaXMgaGFuZGxlZCBhcyBhIHdob2xlLiBUaGUgWE1MIGRhdGEgaXMgCi0gICAgICBzdG9yZWQgaW4gbWVtb3J5IGFzIFhNTC4gVGhpcyBtZWFucyB0aGF0IHRoZSBkb2N1bWVudCBvcmRlciBpcyBwcmVzZXJ2ZWQgCi0gICAgICBhcyB3ZWxsIGFzIHRoZSBvcmlnaW5hbCBlbGVtZW50IGNvbnRlbnQgd2l0aCB3aGl0ZXNwYWNlLjwvZGl2PgotICA8L2xpPgotICA8bGk+IAotICAgIDxkaXY+V2l0aCB0eXBlcyBnZW5lcmF0ZWQgZnJvbSBzY2hlbWEsIGFjY2VzcyB0byBYTUwgaW5zdGFuY2VzIGlzIHRocm91Z2ggCi0gICAgICBKYXZhQmVhbi1saWtlIGFjY2Vzc29ycywgd2l0aCBnZXQgYW5kIHNldCBtZXRob2RzLjwvZGl2PgotICA8L2xpPgotICA8bGk+IAotICAgIDxkaXY+SXQgaXMgZGVzaWduZWQgd2l0aCBYTUwgc2NoZW1hIGluIG1pbmQgZnJvbSB0aGUgYmVnaW5uaW5nICYjODIxMjsgWE1MQmVhbnMgCi0gICAgICBzdXBwb3J0cyBhbGwgWE1MIHNjaGVtYSBkZWZpbml0aW9ucy48L2Rpdj4KLSAgPC9saT4KLSAgPGxpPkFjY2VzcyB0byBYTUwgaXMgZmFzdC48L2xpPgotPC91bD4KLTxkaXY+IAotICA8cD5UaGUgc3RhcnRpbmcgcG9pbnQgZm9yIFhNTEJlYW5zIGlzIFhNTCBzY2hlbWEuIEEgc2NoZW1hIChjb250YWluZWQgaW4gYW4gCi0gICAgWFNEIGZpbGUpIGlzIGFuIFhNTCBkb2N1bWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcnVsZXMgdG8gd2hpY2ggb3RoZXIgWE1MIAotICAgIGRvY3VtZW50cyBtdXN0IGNvbmZvcm0uIFRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb24gcHJvdmlkZXMgYSByaWNoIGRhdGEgCi0gICAgbW9kZWwgdGhhdCBhbGxvd3MgeW91IHRvIGV4cHJlc3Mgc29waGlzdGljYXRlZCBzdHJ1Y3R1cmUgYW5kIGNvbnN0cmFpbnRzIG9uIAotICAgIHlvdXIgZGF0YS4gRm9yIGV4YW1wbGUsIGFuIFhNTCBzY2hlbWEgY2FuIGVuZm9yY2UgY29udHJvbCBvdmVyIGhvdyBkYXRhIGlzIAotICAgIG9yZGVyZWQgaW4gYSBkb2N1bWVudCwgb3IgY29uc3RyYWludHMgb24gcGFydGljdWxhciB2YWx1ZXMgKGZvciBleGFtcGxlLCBhIAotICAgIGJpcnRoIGRhdGUgdGhhdCBtdXN0IGJlIGxhdGVyIHRoYW4gMTkwMCkuIFVuZm9ydHVuYXRlbHksIHRoZSBhYmlsaXR5IHRvIGVuZm9yY2UgCi0gICAgcnVsZXMgbGlrZSB0aGlzIGlzIHR5cGljYWxseSBub3QgYXZhaWxhYmxlIGluIEphdmEgd2l0aG91dCB3cml0aW5nIGN1c3RvbSAKLSAgICBjb2RlLiBYTUxCZWFucyBob25vcnMgc2NoZW1hIGNvbnN0cmFpbnRzLjwvcD4KLSAgPHAgY2xhc3M9Im5vdGVwYXJhIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFdoZXJlIGFuIFhNTCBzY2hlbWEgZGVmaW5lcyBydWxlcyAKLSAgICBmb3IgYW4gWE1MIGRvY3VtZW50LCBhbiBYTUwgPGVtPmluc3RhbmNlPC9lbT4gaXMgYW4gWE1MIGRvY3VtZW50IHRoYXQgY29uZm9ybXMgCi0gICAgdG8gdGhlIHNjaGVtYS48L3A+Ci0gIDxwPllvdSBjb21waWxlIGEgc2NoZW1hIChYU0QpIGZpbGUgdG8gZ2VuZXJhdGUgYSBzZXQgb2YgSmF2YSBpbnRlcmZhY2VzIHRoYXQgCi0gICAgbWlycm9yIHRoZSBzY2hlbWEuIFdpdGggdGhlc2UgdHlwZXMsIHlvdSBwcm9jZXNzIFhNTCBpbnN0YW5jZSBkb2N1bWVudHMgdGhhdCAKLSAgICBjb25mb3JtIHRvIHRoZSBzY2hlbWEuIFlvdSBiaW5kIGFuIFhNTCBpbnN0YW5jZSBkb2N1bWVudCB0byB0aGVzZSB0eXBlczsgY2hhbmdlcyAKLSAgICBtYWRlIHRocm91Z2ggdGhlIEphdmEgaW50ZXJmYWNlIGNoYW5nZSB0aGUgdW5kZXJseWluZyBYTUwgcmVwcmVzZW50YXRpb24uPC9wPgotICA8cD5QcmV2aW91cyBvcHRpb25zIGZvciBoYW5kbGluZyBYTUwgaW5jbHVkZSB1c2luZyBYTUwgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlcyAKLSAgICAoc3VjaCBhcyBET00gb3IgU0FYKSBvciBhbiBYTUwgbWFyc2hhbGxpbmcvYmluZGluZyB0b29sIChzdWNoIGFzIEpBWEIpLiBCZWNhdXNlIAotICAgIGl0IGxhY2tzIHN0cm9uZyBzY2hlbWEtb3JpZW50ZWQgdHlwaW5nLCBuYXZpZ2F0aW9uIGluIGEgRE9NLW9yaWVudGVkIG1vZGVsIAotICAgIGlzIG1vcmUgdGVkaW91cyBhbmQgcmVxdWlyZXMgYW4gdW5kZXJzdGFuZGluZyBvZiB0aGUgY29tcGxldGUgb2JqZWN0IG1vZGVsLiAKLSAgICBKQVhCIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBYTUwgc2NoZW1hIHNwZWNpZmljYXRpb24sIGJ1dCBoYW5kbGVzIG9ubHkgYSAKLSAgICBzdWJzZXQgb2YgaXQ7IFhNTEJlYW5zIHN1cHBvcnRzIGFsbCBvZiBpdC4gQWxzbywgYnkgc3RvcmluZyB0aGUgZGF0YSBpbiBtZW1vcnkgCi0gICAgYXMgWE1MLCBYTUxCZWFucyBpcyBhYmxlIHRvIHJlZHVjZSB0aGUgb3ZlcmhlYWQgb2YgbWFyc2hhbGxpbmcgYW5kIGRlbWFyc2hhbGxpbmcuPC9wPgotICA8aDE+QWNjZXNzaW5nIFhNTCBVc2luZyBJdHMgU2NoZW1hPC9oMT4KLSAgPHA+VG8gZ2V0IGEgZ2xpbXBzZSBvZiB0aGUga2luZHMgb2YgdGhpbmdzIHlvdSBjYW4gZG8gd2l0aCBYTUxCZWFucywgdGFrZSBhIAotICAgIGxvb2sgYXQgYW4gZXhhbXBsZSB1c2luZyBYTUwgZm9yIGEgcHVyY2hhc2Ugb3JkZXIuIFRoZSBwdXJjaGFzZSBvcmRlciBYTUwgCi0gICAgY29udGFpbnMgZGF0YSBleGNoYW5nZWQgYnkgdHdvIHBhcnRpZXMsIHN1Y2ggYXMgdHdvIGNvbXBhbmllcy4gQm90aCBwYXJ0aWVzIAotICAgIG5lZWQgdG8gYmUgYWJsZSB0byByZWx5IG9uIGEgY29uc2lzdGVudCBtZXNzYWdlIHNoYXBlLCBhbmQgYSBzY2hlbWEgc3BlY2lmaWVzIAotICAgIHRoZSBjb21tb24gZ3JvdW5kLiA8L3A+Ci0gIDxwPkhlcmUncyB3aGF0IGEgcHVyY2hhc2Ugb3JkZXIgWE1MIGluc3RhbmNlIG1pZ2h0IGxvb2sgbGlrZS48L3A+Ci0gIDxwcmU+Ci0mbHQ7cG86cHVyY2hhc2Utb3JkZXIgeG1sbnM6cG89Imh0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8iJmd0OwotICAgICZsdDtwbzpjdXN0b21lciZndDsKLSAgICAgICAgJmx0O3BvOm5hbWUmZ3Q7R2xhZHlzIEtyYXZpdHombHQ7L3BvOm5hbWUmZ3Q7Ci0gICAgICAgICZsdDtwbzphZGRyZXNzJmd0O0FueXRvd24sIFBBJmx0Oy9wbzphZGRyZXNzJmd0OwotICAgICZsdDsvcG86Y3VzdG9tZXImZ3Q7Ci0gICAgJmx0O3BvOmRhdGUmZ3Q7MjAwMy0wMS0wN1QxNDoxNjowMC0wNTowMCZsdDsvcG86ZGF0ZSZndDsKLSAgICAmbHQ7cG86bGluZS1pdGVtJmd0OwotICAgICAgICAmbHQ7cG86ZGVzY3JpcHRpb24mZ3Q7QnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDEmbHQ7L3BvOmRlc2NyaXB0aW9uJmd0OwotICAgICAgICAmbHQ7cG86cGVyLXVuaXQtb3VuY2VzJmd0OzUmbHQ7L3BvOnBlci11bml0LW91bmNlcyZndDsKLSAgICAgICAgJmx0O3BvOnByaWNlJmd0OzIxLjc5Jmx0Oy9wbzpwcmljZSZndDsKLSAgICAgICAgJmx0O3BvOnF1YW50aXR5Jmd0OzImbHQ7L3BvOnF1YW50aXR5Jmd0OwotICAgICZsdDsvcG86bGluZS1pdGVtJmd0OwotICAgICZsdDtwbzpsaW5lLWl0ZW0mZ3Q7Ci0gICAgICAgICZsdDtwbzpkZXNjcmlwdGlvbiZndDtCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMiZsdDsvcG86ZGVzY3JpcHRpb24mZ3Q7Ci0gICAgICAgICZsdDtwbzpwZXItdW5pdC1vdW5jZXMmZ3Q7NSZsdDsvcG86cGVyLXVuaXQtb3VuY2VzJmd0OwotICAgICAgICAmbHQ7cG86cHJpY2UmZ3Q7MTkuODkmbHQ7L3BvOnByaWNlJmd0OwotICAgICAgICAmbHQ7cG86cXVhbnRpdHkmZ3Q7MiZsdDsvcG86cXVhbnRpdHkmZ3Q7Ci0gICAgJmx0Oy9wbzpsaW5lLWl0ZW0mZ3Q7Ci0mbHQ7cG86c2hpcHBlciZndDsKLSAgICAgICAgJmx0O3BvOm5hbWUmZ3Q7WmlwU2hpcCZsdDsvcG86bmFtZSZndDsKLSAgICAgICAgJmx0O3BvOnBlci1vdW5jZS1yYXRlJmd0OzAuNzQmbHQ7L3BvOnBlci1vdW5jZS1yYXRlJmd0OwotICAgICZsdDsvcG86c2hpcHBlciZndDsKLSZsdDsvcG86cHVyY2hhc2Utb3JkZXImZ3Q7PC9wcmU+Ci0gIDxwPlRoaXMgWE1MIGluY2x1ZGVzIGEgcm9vdCBlbGVtZW50LCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVyY2hhc2Utb3JkZXI8L3NwYW4+LCAKLSAgICB0aGF0IGhhcyB0aHJlZSBraW5kcyBvZiBjaGlsZCBlbGVtZW50czogPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmN1c3RvbWVyPC9zcGFuPiwgCi0gICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmRhdGU8L3NwYW4+LCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bGluZS1pdGVtPC9zcGFuPiwgCi0gICAgYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zaGlwcGVyPC9zcGFuPi4gQW4gaW50dWl0aXZlLCBvYmplY3QtYmFzZWQgdmlldyAKLSAgICBvZiB0aGlzIFhNTCB3b3VsZCBwcm92aWRlIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXJjaGFzZS1vcmRlcjwvc3Bhbj4gCi0gICAgZWxlbWVudCwgYW5kIGl0IHdvdWxkIGhhdmUgbWV0aG9kcyBmb3IgZ2V0dGluZyB0aGUgZGF0ZSBhbmQgZm9yIGdldHRpbmcgc3Vib3JkaW5hdGUgCi0gICAgb2JqZWN0cyBmb3IgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmN1c3RvbWVyPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmxpbmUtaXRlbTwvc3Bhbj4sIAotICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2hpcHBlcjwvc3Bhbj4gZWxlbWVudHMuIEVhY2ggb2YgdGhlIGxhc3QgdGhyZWUgCi0gICAgd291bGQgaGF2ZSBpdHMgb3duIG1ldGhvZHMgZm9yIGdldHRpbmcgdGhlIGRhdGEgaW5zaWRlIHRoZW0gYXMgd2VsbC48L3A+Ci0gIDxoMj5Mb29raW5nIGF0IHRoZSBTY2hlbWE8L2gyPgotICA8cD5UaGUgZm9sbG93aW5nIFhNTCBpcyB0aGUgdGhlIHNjaGVtYSBmb3IgdGhlIHByZWNlZGluZyBwdXJjaGFzZSBvcmRlciBYTUwuIAotICAgIEl0IGRlZmluZXMgdGhlIFhNTCdzICZxdW90O3NoYXBlJnF1b3Q7ICYjODIxMjsgd2hhdCBpdHMgZWxlbWVudHMgYXJlLCB3aGF0IAotICAgIG9yZGVyIHRoZXkgYXBwZWFyIGluLCB3aGljaCBhcmUgY2hpbGRyZW4gb2Ygd2hpY2gsIGFuZCBzbyBvbi48L3A+Ci08L2Rpdj4KLTxkaXY+IAotICA8cHJlPgotJmx0O3hzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8iCi0gICAgeG1sbnM6cG89Imh0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8iCi0gICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiZndDsKLQkKLSAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJwdXJjaGFzZS1vcmRlciImZ3Q7Ci0gICAgICAgICZsdDt4czpjb21wbGV4VHlwZSZndDsKLSAgICAgICAgICAgICZsdDt4czpzZXF1ZW5jZSZndDsKLSAgICAgICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJjdXN0b21lciIgdHlwZT0icG86Y3VzdG9tZXIiLyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJkYXRlIiB0eXBlPSJ4czpkYXRlVGltZSIvJmd0OwotICAgICAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9ImxpbmUtaXRlbSIgdHlwZT0icG86bGluZS1pdGVtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0ic2hpcHBlciIgdHlwZT0icG86c2hpcHBlciIgbWluT2NjdXJzPSIwIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OwotICAgICAgICAmbHQ7L3hzOmNvbXBsZXhUeXBlJmd0OwotICAgICZsdDsveHM6ZWxlbWVudCZndDsKLSAgICAmbHQ7eHM6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9tZXIiJmd0OwotICAgICAgICAmbHQ7eHM6c2VxdWVuY2UmZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLyZndDsKLSAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9ImFkZHJlc3MiIHR5cGU9InhzOnN0cmluZyIvJmd0OwotICAgICAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OwotICAgICZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7Ci0gICAgJmx0O3hzOmNvbXBsZXhUeXBlIG5hbWU9ImxpbmUtaXRlbSImZ3Q7Ci0gICAgICAgICZsdDt4czpzZXF1ZW5jZSZndDsKLSAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciLyZndDsKLSAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9InBlci11bml0LW91bmNlcyIgdHlwZT0ieHM6ZGVjaW1hbCIvJmd0OwotICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0icHJpY2UiIHR5cGU9InhzOmRvdWJsZSIvJmd0OwotICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0icXVhbnRpdHkiIHR5cGU9InhzOmludCIvJmd0OwotICAgICAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OwotICAgICZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7Ci0gICAgJmx0O3hzOmNvbXBsZXhUeXBlIG5hbWU9InNoaXBwZXIiJmd0OwotICAgICAgICAmbHQ7eHM6c2VxdWVuY2UmZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLyZndDsKLSAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9InBlci1vdW5jZS1yYXRlIiB0eXBlPSJ4czpkZWNpbWFsIi8mZ3Q7Ci0gICAgICAgICZsdDsveHM6c2VxdWVuY2UmZ3Q7Ci0gICAgJmx0Oy94czpjb21wbGV4VHlwZSZndDsKLSZsdDsveHM6c2NoZW1hJmd0OzwvcHJlPgotICA8ZGl2PiAKLSAgICA8cD5UaGlzIHNjaGVtYSBkZXNjcmliZXMgdGhlIHB1cmNoYXNlIG9yZGVyIFhNTCBpbnN0YW5jZSBieSBkZWZpbmluZyB0aGUgZm9sbG93aW5nOjwvcD4KLSAgPC9kaXY+Ci0gIDx1bD4KLSAgICA8bGk+IAotICAgICAgPGRpdj5EZWZpbml0aW9ucyBmb3IgdGhyZWUgY29tcGxleCB0eXBlcyAmIzgyMTI7IGN1c3RvbWVyLCBsaW5lLWl0ZW0sIGFuZCAKLSAgICAgICAgc2hpcHBlci4gVGhlc2UgYXJlIHRoZSB0eXBlcyB1c2VkIGZvciB0aGUgY2hpbGRyZW4gb2YgdGhlIHB1cmNoYXNlLW9yZGVyIAotICAgICAgICBlbGVtZW50LiBJbiBzY2hlbWEsIGEgY29tcGxleCB0eXBlIGlzIG9uZSB0aGF0IGRlZmluZXMgYW4gZWxlbWVudCB0aGF0IAotICAgICAgICBtYXkgaGF2ZSBjaGlsZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcy4gVGhlIHNlcXVlbmNlIGVsZW1lbnQgbmVzdGVkIGluIAotICAgICAgICB0aGUgY29tcGxleCB0eXBlIGxpc3RzIGl0cyBjaGlsZCBlbGVtZW50cy48L2Rpdj4KLSAgICAgIDxwPlRoZXNlIGFyZSBhbHNvIDxlbT5nbG9iYWw8L2VtPiB0eXBlcy4gVGhleSBhcmUgZ2xvYmFsIGJlY2F1c2UgdGhleSBhcmUgCi0gICAgICAgIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHNjaGVtYSAoaW4gb3RoZXIgd29yZHMsIGp1c3QgYmVuZWF0aCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNjaGVtYTwvc3Bhbj4gCi0gICAgICAgIHJvb3QgZWxlbWVudCkuIFRoaXMgbWVhbnMgdGhhdCB0aGV5IG1heSBiZSByZWZlcmVuY2VkIGZyb20gYW55d2hlcmUgZWxzZSAKLSAgICAgICAgaW4gdGhlIHNjaGVtYS48L3A+Ci0gICAgPC9saT4KLSAgPC91bD4KLTwvZGl2PgotPGRpdj4KLSAgPHVsPgotICAgIDxsaT5Vc2Ugb2Ygc2ltcGxlIHR5cGVzIHdpdGhpbiB0aGUgY29tcGxleCB0eXBlcy4gVGhlIG5hbWUsIGFkZHJlc3MsIGFuZCBkZXNjcmlwdGlvbiAKLSAgICAgIGVsZW1lbnRzIChhbW9uZyBvdGhlcnMpIGFyZSB0eXBlZCBhcyBzaW1wbGUgdHlwZXMuIEFzIGl0IGhhcHBlbnMsIHRoZXNlIAotICAgICAgYXJlIGFsc28gPGVtPmJ1aWx0LWluPC9lbT4gdHlwZXMuIEEgYnVpbHQtaW4gdHlwZSAoaGVyZSwgb25lIHdpdGggdGhlICZxdW90O3hzJnF1b3Q7IAotICAgICAgcHJlZml4KSBpcyBwYXJ0IG9mIHRoZSBzY2hlbWEgc3BlY2lmaWNhdGlvbi4gKFRoZSBzcGVjaWZpY2F0aW9uIGRlZmluZXMgCi0gICAgICA0NiBidWlsdC1pbiB0eXBlcy4pPC9saT4KLSAgICA8bGk+QSBnbG9iYWwgZWxlbWVudCBjYWxsZWQgcHVyY2hhc2Utb3JkZXIuIFRoaXMgZWxlbWVudCBkZWZpbml0aW9uIGluY2x1ZGVzIAotICAgICAgYSBuZXN0ZWQgY29tcGxleCB0eXBlIGRlZmluaXRpb24gdGhhdCBzcGVjaWZpZXMgdGhlIGNoaWxkIGVsZW1lbnRzIGZvciBhIAotICAgICAgcHVyY2hhc2Utb3JkZXIgZWxlbWVudC4gTm90aWNlIHRoYXQgdGhlIGNvbXBsZXggdHlwZSBpbmNsdWRlcyByZWZlcmVuY2VzIAotICAgICAgdG8gdGhlIG90aGVyIGNvbXBsZXggdHlwZXMgZGVmaW5lZCBpbiB0aGlzIHNjaGVtYS48L2xpPgotICA8L3VsPgotICA8ZGl2PjwvZGl2PgotICA8cD5JbiBvdGhlciB3b3JkcywgdGhlIHNjaGVtYSBkZWZpbmVzIHR5cGVzIGZvciB0aGUgY2hpbGQgZWxlbWVudHMgYW5kIGRlc2NyaWJlcyAKLSAgICB0aGVpciBwb3NpdGlvbiBhcyBzdWJvcmRpbmF0ZSB0byB0aGUgcm9vdCBlbGVtZW50LCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVyY2hhc2Utb3JkZXI8L3NwYW4+LjwvcD4KLSAgPHA+V2hlbiB5b3UgdXNlIHRoZSBYTUxCZWFuIGNvbXBpbGVyIHdpdGggYW4gWFNEIGZpbGUgc3VjaCBhcyB0aGlzIG9uZSwgeW91IAotICAgIGdlbmVyYXRlIGEgSkFSIGZpbGUgY29udGFpbmluZyB0aGUgaW50ZXJmYWNlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgc2NoZW1hLjwvcD4KLSAgPGgyPldyaXRpbmcgSmF2YSBDb2RlIFRoYXQgVXNlcyB0aGUgSW50ZXJmYWNlczwvaDI+Ci0gIDxwPldpdGggdGhlIFhNTEJlYW5zIGludGVyZmFjZXMgaW4geW91ciBhcHBsaWNhdGlvbiwgeW91IGNhbiB3cml0ZSBjb2RlIHRoYXQgCi0gICAgdXNlcyB0aGUgbmV3IHR5cGVzIHRvIGhhbmRsZSBYTUwgYmFzZWQgb24gdGhlIHNjaGVtYS4gSGVyZSdzIGFuIGV4YW1wbGUgdGhhdCAKLSAgICBleHRyYWN0cyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIG9mIHRoZSBvcmRlcmVkIGl0ZW1zIGluIHRoZSBwdXJjaGFzZSBvcmRlciAKLSAgICBYTUwsIGNvdW50cyB0aGUgaXRlbXMsIGFuZCBjYWxjdWxhdGVzIGEgdG90YWwgb2YgdGhlaXIgcHJpY2VzLiBJbiBwYXJ0aWN1bGFyLCAKLSAgICBsb29rIGF0IHRoZSB1c2Ugb2YgdHlwZXMgZ2VuZXJhdGVkIGZyb20gdGhlIHNjaGVtYSBhbmQgaW1wb3J0ZWQgYXMgcGFydCBvZiAKLSAgICB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPm9yZy5vcGVudXJpLmVhc3lwbzwvc3Bhbj4gcGFja2FnZS4gPC9wPgotICA8cD5UaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnByaW50SXRlbXM8L3NwYW4+IG1ldGhvZCByZWNlaXZlcyBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5GaWxlPC9zcGFuPiAKLSAgICBvYmplY3QgY29udGFpbmluZyB0aGUgcHVyY2hhc2Ugb3JkZXIgWE1MIGZpbGUuPC9wPgotICA8cHJlPgotcGFja2FnZSBkb2NzLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuKjsKLWltcG9ydCBvcmcub3BlbnVyaS5lYXN5cG8uUHVyY2hhc2VPcmRlckRvY3VtZW50OwotaW1wb3J0IG9yZy5vcGVudXJpLmVhc3lwby5QdXJjaGFzZU9yZGVyOwotaW1wb3J0IG9yZy5vcGVudXJpLmVhc3lwby5MaW5lSXRlbTsKLQotcHVibGljIGNsYXNzIFBPSGFuZGxlciAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRJdGVtcyhGaWxlIHBvKSB0aHJvd3MgRXhjZXB0aW9uIAotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogQWxsIFhNTEJlYW5zIHNjaGVtYSB0eXBlcyBwcm92aWRlIGEgbmVzdGVkIEZhY3RvcnkgY2xhc3MgeW91IGNhbgotICAgICAgICAgKiB1c2UgdG8gYmluZCBYTUwgdG8gdGhlIHR5cGUsIG9yIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mIHRoZSB0eXBlLgotICAgICAgICAgKiBOb3RlIHRoYXQgYSAiRG9jdW1lbnQiIHR5cGUgc3VjaCBhcyB0aGlzIG9uZSBpcyBhbiBYTUxCZWFucyAKLSAgICAgICAgICogY29uc3RydWN0IGZvciByZXByZXNlbnRpbmcgYSBnbG9iYWwgZWxlbWVudC4gSXQgcHJvdmlkZXMgYSB3YXkKLSAgICAgICAgICogZm9yIHlvdSB0byBnZXQgYW5kIHNldCB0aGUgY29udGVudHMgb2YgdGhlIGVudGlyZSBlbGVtZW50LgotICAgICAgICAgKgotICAgICAgICAgKiBBbHNvLCBub3RlIHRoYXQgdGhlIHBhcnNlIG1ldGhvZCB3aWxsIG9ubHkgc3VjY2VlZCBpZiB0aGUgCi0gICAgICAgICAqIFhNTCB5b3UncmUgcGFyc2luZyBhcHBlYXJzIHRvIGNvbmZvcm0gdG8gdGhlIHNjaGVtYS4KLSAgICAgICAgICovCi0gICAgICAgIFB1cmNoYXNlT3JkZXJEb2N1bWVudCBwb0RvYyA9Ci0gICAgICAgICAgICBQdXJjaGFzZU9yZGVyRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShwbyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlIFB1cmNoYXNlT3JkZXIgdHlwZSByZXByZXNlbnRzIHRoZSBwdXJjaGFzZS1vcmRlciBlbGVtZW50J3MKLSAgICAgICAgICogY29tcGxleCB0eXBlLgotICAgICAgICAgKi8KLSAgICAgICAgUHVyY2hhc2VPcmRlciBwbyA9IHBvRG9jLmdldFB1cmNoYXNlT3JkZXIoKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBXaGVuIGFuIGVsZW1lbnQgbWF5IG9jY3VyIG1vcmUgdGhhbiBvbmNlIGFzIGEgY2hpbGQgZWxlbWVudCwKLSAgICAgICAgICogdGhlIHNjaGVtYSBjb21waWxlciB3aWxsIGdlbmVyYXRlIG1ldGhvZHMgdGhhdCByZWZlciB0byBhbiAKLSAgICAgICAgICogYXJyYXkgb2YgdGhhdCBlbGVtZW50LiBUaGUgbGluZS1pdGVtIGVsZW1lbnQgaXMgZGVmaW5lZCB3aXRoCi0gICAgICAgICAqIGEgbWF4T2NjdXJzIGF0dHJpYnV0ZSB2YWx1ZSBvZiAidW5ib3VuZGVkIiwgbWVhbmluZyB0aGF0IAotICAgICAgICAgKiBpdCBtYXkgb2NjdXIgYXMgbWFueSB0aW1lcyBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudCBhcyBuZWVkZWQuCi0gICAgICAgICAqIFNvIHRoZXJlIGFyZSBtZXRob2RzIHN1Y2ggYXMgZ2V0TGluZUl0ZW1BcnJheSBhbmQgc2V0TGluZUl0ZW1BcnJheS4gCi0gICAgICAgICAqLwotICAgICAgICBMaW5lSXRlbVtdIGxpbmVpdGVtcyA9IHBvLmdldExpbmVJdGVtQXJyYXkoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQdXJjaGFzZSBvcmRlciBoYXMgIiArIGxpbmVpdGVtcy5sZW5ndGggKyAiIGxpbmUgaXRlbXMuIik7Ci0KLSAgICAgICAgZG91YmxlIHRvdGFsQW1vdW50ID0gMC4wOwotICAgICAgICBpbnQgbnVtYmVyT2ZJdGVtcyA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogTG9vcCB0aHJvdWdoIHRoZSBsaW5lLWl0ZW0gZWxlbWVudHMsIHVzaW5nIGdlbmVyYXRlZCBhY2Nlc3NvcnMgdG8gCi0gICAgICAgICAqIGdldCB2YWx1ZXMgZm9yIGNoaWxkIGVsZW1lbnRzIHN1Y2ggYSBkZXNjcmlwdGlvbiwgcXVhbnRpdHksIGFuZAotICAgICAgICAgKiBwcmljZS4KLSAgICAgICAgICovCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGluZWl0ZW1zLmxlbmd0aDsgaisrKSAKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgTGluZSBpdGVtOiAiICsgaik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgIiAgIERlc2NyaXB0aW9uOiAiICsgbGluZWl0ZW1zW2pdLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICBRdWFudGl0eTogIiArIGxpbmVpdGVtc1tqXS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgUHJpY2U6ICIgKyBsaW5laXRlbXNbal0uZ2V0UHJpY2UoKSk7Ci0gICAgICAgICAgICBudW1iZXJPZkl0ZW1zICs9IGxpbmVpdGVtc1tqXS5nZXRRdWFudGl0eSgpOwotICAgICAgICAgICAgdG90YWxBbW91bnQgKz0gbGluZWl0ZW1zW2pdLmdldFByaWNlKCkgKiBsaW5laXRlbXNbal0uZ2V0UXVhbnRpdHkoKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIGl0ZW1zOiAiICsgbnVtYmVyT2ZJdGVtcyk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgYW1vdW50OiAiICsgdG90YWxBbW91bnQpOwotICAgIH0KLX0KLTwvcHJlPgotICA8cD5Ob3RpY2UgdGhhdCB0eXBlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgc2NoZW1hIHJlZmxlY3Qgd2hhdCdzIGluIHRoZSBYTUw6PC9wPgotPC9kaXY+Ci08dWw+Ci0gIDxsaT4gCi0gICAgPGRpdj5BIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QdXJjaGFzZU9yZGVyRG9jdW1lbnQ8L3NwYW4+IHJlcHJlc2VudHMgdGhlIAotICAgICAgZ2xvYmFsIHJvb3QgZWxlbWVudC48L2Rpdj4KLSAgPC9saT4KLSAgPGxpPiAKLSAgICA8ZGl2PkEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmdldFB1cmNoYXNlT3JkZXI8L3NwYW4+IG1ldGhvZCByZXR1cm5zIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlB1cmNoYXNlT3JkZXJEb2N1bWVudC5QdXJjaGFzZU9yZGVyPC9zcGFuPiAKLSAgICAgIHR5cGUgdGhhdCBjb250YWlucyBjaGlsZCBlbGVtZW50cywgaW5jbHVkaW5nIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5saW5lLWl0ZW08L3NwYW4+LiAKLSAgICAgIEEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmdldExpbmVJdGVtQXJyYXk8L3NwYW4+IG1ldGhvZCByZXR1cm5zIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkxpbmVJdGVtPC9zcGFuPiAKLSAgICAgIGFycmF5IGNvbnRhaW5pbmcgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5saW5lLWl0ZW08L3NwYW4+IGVsZW1lbnRzLjwvZGl2PgotICA8L2xpPgotICA8bGk+T3RoZXIgbWV0aG9kcywgc3VjaCBhcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Z2V0UXVhbnRpdHk8L3NwYW4+LCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Z2V0UHJpY2U8L3NwYW4+LCAKLSAgICBhbmQgc28gb24sIGZvbGxvdyBuYXR1cmFsbHkgZnJvbSB3aGF0IHRoZSBzY2hlbWEgZGVzY3JpYmVzLCByZXR1cm5pbmcgY29ycmVzcG9uZGluZyAKLSAgICBjaGlsZHJlbiBvZiB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmxpbmUtaXRlbTwvc3Bhbj4gZWxlbWVudC48L2xpPgotICA8bGk+VGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGVzZSB0eXBlcyBpcyBkZXJpdmVkIGZyb20gdGhlIHNjaGVtYSdzIAotICAgIHRhcmdldCBuYW1lc3BhY2UuPC9saT4KLTwvdWw+Ci08ZGl2PiAKLSAgPHA+Q2FwaXRhbGl6YXRpb24gYW5kIHB1bmN0dWF0aW9uIGZvciBnZW5lcmF0ZWQgdHlwZSBuYW1lcyBmb2xsb3cgSmF2YSBjb252ZW50aW9uLiAKLSAgICBBbHNvLCB3aGlsZSB0aGlzIGV4YW1wbGUgcGFyc2VzIHRoZSBYTUwgZnJvbSBhIGZpbGUsIG90aGVyIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wYXJzZTwvc3Bhbj4gCi0gICAgbWV0aG9kcyBzdXBwb3J0IGEgSmF2YSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+SW5wdXRTdHJlYW08L3NwYW4+IG9iamVjdCwgCi0gICAgYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+UmVhZGVyPC9zcGFuPiBvYmplY3QsIGFuZCBzbyBvbi48L3A+Ci0gIDxwPlRoZSBwcmVjZWRpbmcgSmF2YSBjb2RlIHByaW50cyB0aGUgZm9sbG93aW5nIHRvIHRoZSBjb25zb2xlOjwvcD4KLTwvZGl2PgotPGRpdj4gCi0gIDxwcmU+Ci1QdXJjaGFzZSBvcmRlciBoYXMgMyBsaW5lIGl0ZW1zLgotIExpbmUgaXRlbSAwCi0gICBEZXNjcmlwdGlvbjogQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDEKLSAgIFF1YW50aXR5OiAyCi0gICBQcmljZTogMjEuNzkKLSBMaW5lIGl0ZW0gMQotICAgRGVzY3JpcHRpb246IEJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAyCi0gICBRdWFudGl0eTogMgotICAgUHJpY2U6IDE5Ljg5Ci1Ub3RhbCBpdGVtczogNAotVG90YWwgYW1vdW50OiA0MS42ODwvcHJlPgotICA8aDI+Q3JlYXRpbmcgTmV3IFhNTCBJbnN0YW5jZXMgZnJvbSBTY2hlbWE8L2gyPgotICA8cD5BcyB5b3UndmUgc2VlbiBYTUxCZWFucyBwcm92aWRlcyBhICZxdW90O2ZhY3RvcnkmcXVvdDsgY2xhc3MgeW91IGNhbiB1c2UgCi0gICAgdG8gY3JlYXRlIG5ldyBpbnN0YW5jZXMuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjcmVhdGVzIGEgbmV3IDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXJjaGFzZS1vcmRlcjwvc3Bhbj4gCi0gICAgZWxlbWVudCBhbmQgYWRkcyBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5jdXN0b21lcjwvc3Bhbj4gY2hpbGQgZWxlbWVudC4gCi0gICAgSXQgdGhlbiBpbnNlcnRzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5uYW1lPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmFkZHJlc3M8L3NwYW4+IAotICAgIGNoaWxkIGVsZW1lbnRzLCBjcmVhdGluZyB0aGUgZWxlbWVudHMgYW5kIHNldHRpbmcgdGhlaXIgdmFsdWVzIHdpdGggYSBzaW5nbGUgCi0gICAgY2FsbCB0byB0aGVpciA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2V0PC9zcGFuPiBtZXRob2RzLjwvcD4KLSAgPHByZT4KLXB1YmxpYyBQdXJjaGFzZU9yZGVyRG9jdW1lbnQgY3JlYXRlUE8oKQotewotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UHVyY2hhc2VPcmRlckRvY3VtZW50IG5ld1BPRG9jID0gUHVyY2hhc2VPcmRlckRvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1B1cmNoYXNlT3JkZXIgbmV3UE8gPSBuZXdQT0RvYy5hZGROZXdQdXJjaGFzZU9yZGVyKCk7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDdXN0b21lciBuZXdDdXN0b21lciA9IG5ld1BPLmFkZE5ld0N1c3RvbWVyKCk7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtuZXdDdXN0b21lci5zZXROYW1lKCZxdW90O0RvcmlzIEtyYXZpdHomcXVvdDspOwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7bmV3Q3VzdG9tZXIuc2V0QWRkcmVzcygmcXVvdDtCZWxsZmxvd2VyLCBDQSZxdW90Oyk7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtyZXR1cm4gbmV3UE9Eb2M7Ci19Ci08L3ByZT4KLSAgPHA+VGhlIGZvbGxvd2luZyBpcyB0aGUgWE1MIHRoYXQgcmVzdWx0cy4gTm90ZSB0aGF0IFhNTEJlYW5zIGFzc2lnbnMgdGhlIGNvcnJlY3QgCi0gICAgbmFtZXNwYWNlIGJhc2VkIG9uIHRoZSBzY2hlbWEsIHVzaW5nIGFuICZxdW90O25zMSZxdW90OyAob3IsICZxdW90O25hbWVzcGFjZSAKLSAgICAxJnF1b3Q7KSBwcmVmaXguIEZvciBwcmFjdGljYWwgcHVycG9zZXMsIHRoZSBwcmVmaXggaXRzZWxmIGRvZXNuJ3QgcmVhbGx5IAotICAgIG1hdHRlciAmIzgyMTI7IGl0J3MgdGhlIG5hbWVzcGFjZSBVUkkgKGh0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8pIHRoYXQgZGVmaW5lcyAKLSAgICB0aGUgbmFtZXNwYWNlLiBUaGUgcHJlZml4IGlzIG1lcmVseSBhIG1hcmtlciB0aGF0IHJlcHJlc2VudHMgaXQuPC9wPgotICA8cHJlPiZsdDtuczE6cHVyY2hhc2Utb3JkZXIgeG1sbnM6bnMxPSZxdW90O2h0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8mcXVvdDsmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7bnMxOmN1c3RvbWVyJmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O25zMTpuYW1lJmd0O0RvcmlzIEtyYXZpdHombHQ7L25zMTpuYW1lJmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O25zMTphZGRyZXNzJmd0O0JlbGxmbG93ZXIsIENBJmx0Oy9uczE6YWRkcmVzcyZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDsvbnMxOmN1c3RvbWVyJmd0OwotJmx0Oy9uczE6cHVyY2hhc2Utb3JkZXImZ3Q7Ci08L3ByZT4KLSAgPHA+Tm90ZSB0aGF0IGFsbCB0eXBlcyAoaW5jbHVkaW5nIHRob3NlIGdlbmVyYXRlZCBmcm9tIHNjaGVtYSkgaW5oZXJpdCBmcm9tIAotICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+LCBhbmQgc28gcHJvdmlkZSBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5GYWN0b3J5PC9zcGFuPiAKLSAgICBjbGFzcy4gRm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSB0eXBlIHN5c3RlbSBpbiB3aGljaCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPiAKLSAgICBmaXRzLCBzZWUgPGEgaHJlZj0iY29uWE1MQmVhbnNTdXBwb3J0QnVpbHRJblNjaGVtYVR5cGVzLmh0bWwiPlhNTEJlYW5zIFN1cHBvcnQgCi0gICAgZm9yIEJ1aWx0LUluIFNjaGVtYSBUeXBlczwvYT4uIEZvciByZWZlcmVuY2UgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxPYmplY3QuaHRtbCI+WG1sT2JqZWN0IAotICAgIEludGVyZmFjZTwvYT4uPC9wPgotICA8aDE+WE1MQmVhbnMgSGllcmFyY2h5PC9oMT4KLSAgPHA+VGhlIGdlbmVyYXRlZCB0eXBlcyB5b3Ugc2F3IHVzZWQgaW4gdGhlIHByZWNlZGluZyBleGFtcGxlIGFyZSBhY3R1YWxseSBwYXJ0IAotICAgIG9mIGEgaGllcmFyY2h5IG9mIFhNTEJlYW5zIHR5cGVzLiBUaGlzIGhpZXJhcmNoeSBpcyBvbmUgb2YgdGhlIHdheXMgaW4gd2hpY2ggCi0gICAgWE1MQmVhbnMgcHJlc2VudHMgYW4gaW50dWl0aXZlIHZpZXcgb2Ygc2NoZW1hLiBBdCB0aGUgdG9wIG9mIHRoZSBoaWVyYXJjaHkgCi0gICAgaXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbE9iamVjdDwvc3Bhbj4sIHRoZSBiYXNlIGludGVyZmFjZSBmb3IgWE1MQmVhbnMgCi0gICAgdHlwZXMuIEJlbmVhdGggdGhpcyBsZXZlbCwgdGhlcmUgYXJlIHR3byBtYWluIHR5cGUgY2F0ZWdvcmllczogZ2VuZXJhdGVkIHR5cGVzIAotICAgIHRoYXQgcmVwcmVzZW50IHVzZXItZGVyaXZlZCBzY2hlbWEgdHlwZXMsIGFuZCBpbmNsdWRlZCB0eXBlcyB0aGF0IHJlcHJlc2VudCAKLSAgICBidWlsdC1pbiBzY2hlbWEgdHlwZXMuPC9wPgotICBUaGlzIHRvcGljIGhhcyBhbHJlYWR5IGludHJvZHVjZWQgZ2VuZXJhdGVkIHR5cGVzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIAotICA8YSBocmVmPSJjb25KYXZhVHlwZXNHZW5lcmF0ZWRGcm9tVXNlckRlcml2ZWQuaHRtbCI+SmF2YSBUeXBlcyBHZW5lcmF0ZWQgZnJvbSAKLSAgVXNlci1EZXJpdmVkIFNjaGVtYSBUeXBlcy48L2E+IAotICA8aDI+QnVpbHQtSW4gVHlwZSBTdXBwb3J0PC9oMj4KLSAgPHA+SW4gYWRkaXRpb24gdG8gdHlwZXMgZ2VuZXJhdGVkIGZyb20gYSBnaXZlbiBzY2hlbWEsIFhNTEJlYW5zIHByb3ZpZGVzIDQ2IAotICAgIEphdmEgdHlwZXMgdGhhdCBtaXJyb3IgdGhlIDQ2IGJ1aWx0LWluIHR5cGVzIGRlZmluZWQgYnkgdGhlIFhNTCBzY2hlbWEgc3BlY2lmaWNhdGlvbi4gCi0gICAgV2hlcmUgc2NoZW1hIGRlZmluZXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOnN0cmluZzwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czpkZWNpbWFsPC9zcGFuPiwgCi0gICAgYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czppbnQ8L3NwYW4+LCBmb3IgZXhhbXBsZSwgWE1MQmVhbnMgcHJvdmlkZXMgCi0gICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFN0cmluZy5odG1sIj5YbWxTdHJpbmc8L2E+PC9zcGFuPiwgCi0gICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERlY2ltYWwuaHRtbCI+WG1sRGVjaW1hbDwvYT48L3NwYW4+LCAKLSAgICBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEludC5odG1sIj5YbWxJbnQ8L2E+PC9zcGFuPi4gCi0gICAgRWFjaCBvZiB0aGVzZSBhbHNvIGluaGVyaXRzIGZyb20gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbE9iamVjdDwvc3Bhbj4sIAotICAgIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBidWlsdC1pbiBzY2hlbWEgdHlwZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6YW55VHlwZTwvc3Bhbj4uPC9wPgotICA8cD5YTUxCZWFucyBwcm92aWRlcyBhIHdheSBmb3IgeW91IHRvIGhhbmRsZSBYTUwgZGF0YSBhcyB0aGVzZSBidWlsdC1pbiB0eXBlcy4gCi0gICAgV2hlcmUgeW91ciBzY2hlbWEgaW5jbHVkZXMgYW4gZWxlbWVudCB3aG9zZSB0eXBlIGlzLCBmb3IgZXhhbXBsZSwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOmludDwvc3Bhbj4sIAotICAgIFhNTEJlYW5zIHdpbGwgcHJvdmlkZSBhIGdlbmVyYXRlZCBtZXRob2QgZGVzaWduZWQgdG8gcmV0dXJuIGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxJbnQ8L3NwYW4+LiAKLSAgICBJbiBhZGRpdGlvbiwgYXMgeW91IHNhdyBpbiB0aGUgcHJlY2VkaW5nIGV4YW1wbGUsIGZvciBtb3N0IHR5cGVzIHRoZXJlIHdpbGwgCi0gICAgYWxzbyBiZSBhIG1ldGhvZCB0aGF0IHJldHVybnMgYSBuYXR1cmFsIEphdmEgdHlwZSBzdWNoIGFzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pbnQ8L3NwYW4+LiAKLSAgICBUaGUgZm9sbG93aW5nIHR3byBsaW5lcyBvZiBjb2RlIHJldHVybiB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnF1YW50aXR5PC9zcGFuPiAKLSAgICBlbGVtZW50J3MgdmFsdWUsIGJ1dCByZXR1cm4gaXQgYXMgZGlmZmVyZW50IHR5cGVzLjwvcD4KLSAgPHByZT4KLS8vIE1ldGhvZHMgdGhhdCByZXR1cm4gc2ltcGxlIHR5cGVzIGJlZ2luIHdpdGggYW4gIngiLgotWG1sSW50IHhtbFF1YW50aXR5ID0gbGluZWl0ZW1zW2pdLnhnZXRRdWFudGl0eSgpOwotLy8gTWV0aG9kcyB0aGF0IHJldHVybiBhIG5hdHVyYWwgSmF2YSB0eXBlIGFyZSB1bmFkb3JuZWQuCi1pbnQgamF2YVF1YW50aXR5ID0gbGluZWl0ZW1zW2pdLmdldFF1YW50aXR5KCk7Ci08L3ByZT4KLSAgPHA+SW4gYSBzZW5zZSBib3RoIGdldCBtZXRob2RzIG5hdmlnYXRlIHRvIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cXVhbnRpdHk8L3NwYW4+IAotICAgIGVsZW1lbnQ7IHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Z2V0UXVhbnRpdHk8L3NwYW4+IG1ldGhvZCBnb2VzIGEgc3RlcCAKLSAgICBmdXJ0aGVyIGFuZCBjb252ZXJ0cyB0aGUgZWxlbWVudHMgdmFsdWUgdG8gdGhlIG1vc3QgYXBwcm9wcmlhdGUgbmF0dXJhbCBKYXZhIAotICAgIHR5cGUgYmVmb3JlIHJldHVybmluZyBpdC4gKFhNTEJlYW5zIGFsc28gcHJvdmlkZXMgYSBtZWFucyBmb3IgdmFsaWRhdGluZyB0aGUgCi0gICAgWE1MIGFzIHlvdSB3b3JrIHdpdGggaXQuKTwvcD4KLSAgPHA+SWYgeW91IGtub3cgYSBiaXQgYWJvdXQgWE1MIHNjaGVtYSwgWE1MQmVhbnMgdHlwZXMgc2hvdWxkIHNlZW0gZmFpcmx5IGludHVpdGl2ZS4gCi0gICAgSWYgeW91IGRvbid0LCB5b3UnbGwgbGVhcm4gYSBsb3QgYnkgZXhwZXJpbWVudGluZyB3aXRoIFhNTEJlYW5zIHVzaW5nIHlvdXIgCi0gICAgb3duIHNjaGVtYXMgYW5kIFhNTCBpbnN0YW5jZXMgYmFzZWQgb24gdGhlbS4gPC9wPgotICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgbWV0aG9kcyBvZiB0eXBlcyBnZW5lcmF0ZWQgZnJvbSBzY2hlbWEsIHNlZSA8YSBocmVmPSJjb25NZXRob2RzRm9yR2VuZXJhdGVkSmF2YVR5cGVzLmh0bWwiPk1ldGhvZHMgCi0gICAgZm9yIFR5cGVzIEdlbmVyYXRlZCBGcm9tIFNjaGVtYTwvYT4uIEZvciBtb3JlIGFib3V0IHRoZSBob3cgWE1MQmVhbnMgcmVwcmVzZW50cyAKLSAgICBidWlsdC1pbiBzY2hlbWEgdHlwZXMsIHNlZSA8YSBocmVmPSJjb25YTUxCZWFuc1N1cHBvcnRCdWlsdEluU2NoZW1hVHlwZXMuaHRtbCI+WE1MQmVhbnMgCi0gICAgU3VwcG9ydCBmb3IgQnVpbHQtSW4gU2NoZW1hIFR5cGVzPC9hPi48L3A+Ci0gIDxoMT5Vc2luZyBYUXVlcnkgRXhwcmVzc2lvbnM8L2gxPgotICA8cD5XaXRoIFhNTEJlYW5zIHlvdSBjYW4gdXNlIFhRdWVyeSB0byBxdWVyeSBYTUwgZm9yIHNwZWNpZmljIHBpZWNlcyBvZiBkYXRhLiAKLSAgICBYUXVlcnkgaXMgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzICZxdW90O1NRTCBmb3IgWE1MJnF1b3Q7IGJlY2F1c2UgaXQgcHJvdmlkZXMgCi0gICAgYSBtZWNoYW5pc20gdG8gYWNjZXNzIGRhdGEgZGlyZWN0bHkgZnJvbSBYTUwgZG9jdW1lbnRzLCBtdWNoIGFzIFNRTCBwcm92aWRlcyAKLSAgICBhIG1lY2hhbmlzbSBmb3IgYWNjZXNzaW5nIGRhdGEgaW4gdHJhZGl0aW9uYWwgZGF0YWJhc2VzLjwvcD4KLSAgPHA+WFF1ZXJ5IGJvcnJvd3Mgc29tZSBvZiBpdHMgc3ludGF4IGZyb20gWFBhdGgsIGEgc3ludGF4IGZvciBzcGVjaWZ5aW5nIG5lc3RlZCAKLSAgICBkYXRhIGluIFhNTC4gVGhlIGZvbGxvd2luZyBleGFtcGxlIHJldHVybnMgYWxsIG9mIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bGluZS1pdGVtPC9zcGFuPiAKLSAgICBlbGVtZW50cyB3aG9zZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHJpY2U8L3NwYW4+IGNoaWxkIGVsZW1lbnRzIGhhdmUgdmFsdWVzIAotICAgIGxlc3MgdGhhbiBvciBlcXVhbCB0byAyMC4wMDo8L3A+Ci0gIDxwcmU+Ci1QdXJjaGFzZU9yZGVyRG9jdW1lbnQgZG9jID0gUHVyY2hhc2VPcmRlckRvY3VtZW50LkZhY3RvcnkucGFyc2UocG8pOwotCi0vKgotICogVGhlIFhRdWVyeSBleHByZXNzaW9uIGlzIHRoZSBmb2xsb3dpbmcgdHdvIHN0cmluZ3MgY29tYmluZWQuIFRoZXkncmUKLSAqIGRlY2xhcmVkIHNlcGFyYXRlbHkgaGVyZSBmb3IgY29udmVuaWVuY2UuIFRoZSBmaXJzdCBzdHJpbmcgZGVjbGFyZXMKLSAqIHRoZSBuYW1lc3BhY2UgcHJlZml4IHRoYXQncyB1c2VkIGluIHRoZSBxdWVyeSBleHByZXNzaW9uOyB0aGUgc2Vjb25kCi0gKiBkZWNsYXJlcyB0aGUgZXhwcmVzc2lvbiBpdHNlbGYuCi0gKi8KLVN0cmluZyBuc1RleHQgPSAiZGVjbGFyZSBuYW1lc3BhY2UgcG8gPSAnaHR0cDovL29wZW51cmkub3JnL2Vhc3lwbyciOwotU3RyaW5nIHBhdGhUZXh0ID0gIiR0aGlzL3BvOnB1cmNoYXNlLW9yZGVyL3BvOmxpbmUtaXRlbVtwbzpwcmljZSA8PSAyMC4wMF0iOwotU3RyaW5nIHF1ZXJ5VGV4dCA9IG5zVGV4dCArIHBhdGhUZXh0OwotCi1YbWxDdXJzb3IgaXRlbUN1cnNvciA9IGRvYy5uZXdDdXJzb3IoKS5leGVjUXVlcnkocXVlcnlUZXh0KTsKLVN5c3RlbS5vdXQucHJpbnRsbihpdGVtQ3Vyc29yLnhtbFRleHQoKSk7Ci08L3ByZT4KLSAgPHA+VGhpcyBjb2RlIGNyZWF0ZXMgYSBuZXcgY3Vyc29yIGF0IHRoZSBzdGFydCBvZiB0aGUgZG9jdW1lbnQuIEZyb20gdGhlcmUsIAotICAgIGl0IHVzZXMgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+IGludGVyZmFjZSdzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5leGVjUXVlcnk8L3NwYW4+IAotICAgIG1ldGhvZCB0byBleGVjdXRlIHRoZSBxdWVyeSBleHByZXNzaW9uLiBJbiB0aGlzIGV4YW1wbGUsIHRoZSBtZXRob2QncyBwYXJhbWV0ZXIgCi0gICAgaXMgYW4gWFF1ZXJ5IGV4cHJlc3Npb24gdGhhdCBzaW1wbHkgc2F5cywgJnF1b3Q7RnJvbSBteSBjdXJyZW50IGxvY2F0aW9uLCAKLSAgICBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVyY2hhc2Utb3JkZXI8L3NwYW4+IGVsZW1lbnQgCi0gICAgYW5kIHJldHJpZXZlIHRob3NlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5saW5lLWl0ZW08L3NwYW4+IGVsZW1lbnRzIHdob3NlIAotICAgIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAyMC4wMC4mcXVvdDsgVGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj4kdGhpczwvc3Bhbj4gCi0gICAgdmFyaWFibGUgbWVhbnMgJnF1b3Q7dGhlIGN1cnJlbnQgcG9zaXRpb24uJnF1b3Q7PC9wPgotICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBYUXVlcnksIHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94cXVlcnkvIiB0YXJnZXQ9Il9ibGFuayI+WFF1ZXJ5IAotICAgIDEuMDogQW4gWE1MIFF1ZXJ5IExhbmd1YWdlPC9hPiBhdCB0aGUgVzNDIHdlYiBzaXRlLjwvcD4KLSAgPGgyPlVzaW5nIFhNTCBDdXJzb3JzPC9oMj4KLSAgPHA+SW4gdGhlIHByZWNlZGluZyBleGFtcGxlIHlvdSBtYXkgaGF2ZSBub3RpY2VkIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ3Vyc29yLmh0bWwiPlhtbEN1cnNvcjwvYT48L3NwYW4+IAotICAgIGludGVyZmFjZS4gSW4gYWRkaXRpb24gdG8gcHJvdmlkaW5nIGEgd2F5IHRvIGV4ZWN1dGUgWFF1ZXJ5IGV4cHJlc3Npb24sIGFuIAotICAgIFhNTCBjdXJzb3JzIG9mZmVycyBhIGZpbmUtZ3JhaW5lZCBtb2RlbCBmb3IgbWFuaXB1bGF0aW5nIGRhdGEuIFRoZSBYTUwgY3Vyc29yIAotICAgIEFQSSwgYW5hbG9nb3VzIHRvIHRoZSBET00ncyBvYmplY3QgQVBJLCBpcyBzaW1wbHkgYSB3YXkgdG8gcG9pbnQgYXQgYSBwYXJ0aWN1bGFyIAotICAgIHBpZWNlIG9mIGRhdGEuIFNvLCBqdXN0IGxpa2UgYSBjdXJzb3IgaGVscHMgbmF2aWdhdGUgdGhyb3VnaCBhIHdvcmQgcHJvY2Vzc2luZyAKLSAgICBkb2N1bWVudCwgdGhlIFhNTCBjdXJzb3IgZGVmaW5lcyBhIGxvY2F0aW9uIGluIFhNTCB3aGVyZSB5b3UgY2FuIHBlcmZvcm0gYWN0aW9ucyAKLSAgICBvbiB0aGUgc2VsZWN0ZWQgWE1MLjwvcD4KLSAgPHA+Q3Vyc29ycyBhcmUgaWRlYWwgZm9yIG1vdmluZyB0aHJvdWdoIGFuIFhNTCBkb2N1bWVudCB3aGVuIHRoZXJlJ3Mgbm8gc2NoZW1hIAotICAgIGF2YWlsYWJsZS4gT25jZSB5b3UndmUgZ290IHRoZSBjdXJzb3IgYXQgdGhlIGxvY2F0aW9uIHlvdSdyZSBpbnRlcmVzdGVkIGluLCAKLSAgICB5b3UgY2FuIHBlcmZvcm0gYSB2YXJpZXR5IG9mIG9wZXJhdGlvbnMgd2l0aCBpdC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gc2V0IAotICAgIGFuZCBnZXQgdmFsdWVzLCBpbnNlcnQgYW5kIHJlbW92ZSBmcmFnbWVudHMgb2YgWE1MLCBjb3B5IGZyYWdtZW50cyBvZiBYTUwgCi0gICAgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGRvY3VtZW50LCBhbmQgbWFrZSBvdGhlciBmaW5lLWdyYWluZWQgY2hhbmdlcyB0byB0aGUgCi0gICAgWE1MIGRvY3VtZW50LjwvcD4KLSAgPHA+VGhlIGZvbGxvd2luZyBleGFtcGxlIHVzZXMgYW4gWE1MIGN1cnNvciB0byBuYXZpZ2F0ZSB0byB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmN1c3RvbWVyPC9zcGFuPiAKLSAgICBlbGVtZW50J3MgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPm5hbWU8L3NwYW4+IGNoaWxkIGVsZW1lbnQuPC9wPgotICA8cHJlPgotUHVyY2hhc2VPcmRlckRvY3VtZW50IGRvYyA9IAotICAgIFB1cmNoYXNlT3JkZXJEb2N1bWVudC5GYWN0b3J5LnBhcnNlKHBvKTsKLQotWG1sQ3Vyc29yIGN1cnNvciA9IGRvYy5uZXdDdXJzb3IoKTsKLWN1cnNvci50b0ZpcnN0Q29udGVudFRva2VuKCk7Ci1jdXJzb3IudG9GaXJzdENoaWxkRWxlbWVudCgpOwotY3Vyc29yLnRvRmlyc3RDaGlsZEVsZW1lbnQoKTsKLVN5c3RlbS5vdXQucHJpbnRsbihjdXJzb3IuZ2V0VGV4dCgpKTsKLQotY3Vyc29yLmRpc3Bvc2UoKTsKLTwvcHJlPgotICA8cD5XaGF0J3MgaGFwcGVuaW5nIGhlcmU/IEFzIHdpdGggdGhlIGVhcmxpZXIgZXhhbXBsZSwgdGhlIGNvZGUgbG9hZHMgdGhlIFhNTCAKLSAgICBmcm9tIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkZpbGU8L3NwYW4+IG9iamVjdC4gQWZ0ZXIgbG9hZGluZyB0aGUgZG9jdW1lbnQsIAotICAgIHRoZSBjb2RlIGNyZWF0ZXMgYSBjdXJzb3IgYXQgaXRzIGJlZ2lubmluZy4gTW92aW5nIHRoZSBjdXJzb3IgYSBmZXcgdGltZXMgCi0gICAgdGFrZXMgaXQgdG8gdGhlIG5lc3RlZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bmFtZSA8L3NwYW4+IGVsZW1lbnQuIE9uY2UgCi0gICAgdGhlcmUsIHRoZSBnZXRUZXh0IG1ldGhvZCByZXRyaWV2ZXMgdGhlIGVsZW1lbnQncyB2YWx1ZS48L3A+Ci0gIDxwPlRoaXMgaXMganVzdCBhbiBpbnRyb2R1Y3Rpb24gdG8gWE1MIGN1cnNvcnMuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHVzaW5nIAotICAgIGN1cnNvcnMsIHNlZSA8YSBocmVmPSJjb25OYXZpZ2F0aW5nWE1Md2l0aEN1cnNvcnMuaHRtbCI+TmF2aWdhdGluZyBYTUwgd2l0aCAKLSAgICBDdXJzb3JzPC9hPi48L3A+Ci0gIDxoMj5XaGVyZSB0byBHbyBOZXh0PC9oMj4KLTwvZGl2PgotPHVsPgotICA8bGk+IAotICAgIDxkaXY+WE1MQmVhbnMgcHJvdmlkZXMgaW50dWl0aXZlIHdheXMgdG8gaGFuZGxlIFhNTCwgcGFydGljdWxhcmx5IGlmIHlvdSdyZSAKLSAgICAgIHN0YXJ0aW5nIHdpdGggc2NoZW1hLiBJZiB5b3UncmUgYWNjZXNzaW5nIFhNTCB0aGF0J3MgYmFzZWQgb24gYSBzY2hlbWEsIAotICAgICAgeW91J2xsIHByb2JhYmx5IGZpbmQgaXQgbW9zdCBlZmZpY2llbnQgdG8gYWNjZXNzIHRoZSBYTUwgdGhyb3VnaCBnZW5lcmF0ZWQgCi0gICAgICB0eXBlcyBzcGVjaWZpYyB0byB0aGUgc2NoZW1hLiBUbyBkbyB0aGlzLCB5b3UgYmVnaW4gYnkgY29tcGlsaW5nIHRoZSBzY2hlbWEgCi0gICAgICB0byBnZW5lcmF0ZSBpbnRlcmZhY2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB1c2luZyBYTUxCZWFucyB0eXBlcyBnZW5lcmF0ZWQgCi0gICAgICBieSBjb21waWxpbmcgc2NoZW1hLCBzZWUgPGEgaHJlZj0iY29uSmF2YVR5cGVzR2VuZXJhdGVkRnJvbVVzZXJEZXJpdmVkLmh0bWwiPkphdmEgCi0gICAgICBUeXBlcyBHZW5lcmF0ZWQgRnJvbSBVc2VyLURlcml2ZWQgU2NoZW1hIFR5cGVzPC9hPiBhbmQgPGEgaHJlZj0iY29uTWV0aG9kc0ZvckdlbmVyYXRlZEphdmFUeXBlcy5odG1sIj5NZXRob2RzIAotICAgICAgZm9yIFR5cGVzIEdlbmVyYXRlZCBGcm9tIFNjaGVtYTwvYT4uPC9kaXY+Ci0gIDwvbGk+Ci0gIDxsaT4gCi0gICAgPGRpdj5Zb3UgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbiByZWFkaW5nIG1vcmUgYWJvdXQgdGhlIHR5cGUgc3lzdGVtIG9uIHdoaWNoIAotICAgICAgWE1MQmVhbnMgaXMgYmFzZWQsIHBhcnRpY3VsYXJseSBpZiB5b3UncmUgdXNpbmcgdHlwZXMgZ2VuZXJhdGVkIGZyb20gc2NoZW1hLiAKLSAgICAgIFhNTEJlYW5zIHByb3ZpZGVzIGEgaGllcmFyY2hpY2FsIHN5c3RlbSBvZiB0eXBlcyB0aGF0IG1pcnJvciB3aGF0IHlvdSBmaW5kIAotICAgICAgaW4gdGhlIFhNTCBzY2hlbWEgc3BlY2lmaWNhdGlvbiBpdHNlbGYuIElmIHlvdSdyZSB3b3JraW5nIHdpdGggc2NoZW1hLCB5b3UgCi0gICAgICBtaWdodCBmaW5kIGl0IGhlbHBzIHRvIHVuZGVyc3RhbmQgaG93IHRoZXNlIHR5cGVzIHdvcmsuIEZvciBtb3JlIGluZm9ybWF0aW9uLCAKLSAgICAgIHNlZSA8YSBocmVmPSJjb25YTUxCZWFuc1N1cHBvcnRCdWlsdEluU2NoZW1hVHlwZXMuaHRtbCI+WE1MQmVhbnMgU3VwcG9ydCAKLSAgICAgIGZvciBCdWlsdC1JbiBTY2hlbWEgVHlwZXM8L2E+IGFuZCA8YSBocmVmPSJjb25JbnRyb1RvVGhlU2NoZW1hVHlwZVN5c3RlbS5odG1sIj5JbnRyb2R1Y3Rpb24gCi0gICAgICB0byBTY2hlbWEgVHlwZSBTaWduYXR1cmVzPC9hPi48L2Rpdj4KLSAgPC9saT4KLSAgPGxpPiAKLSAgICA8ZGl2PlhNTEJlYW5zIHByb3ZpZGVzIGFjY2VzcyB0byBYTUwgdGhyb3VnaCBYUXVlcnksIHdoaWNoIGJvcnJvd3MgcGF0aCBzeW50YXggCi0gICAgICBmcm9tIFhQYXRoLiBXaXRoIFhRdWVyeSwgeW91IGNhbiBzcGVjaWZ5IHNwZWNpZmljIGZyYWdtZW50cyBvZiBYTUwgZGF0YSAKLSAgICAgIHdpdGggb3Igd2l0aG91dCBzY2hlbWEuIFRvIGxlYXJuIG1vcmUgYWJvdXQgdXNpbmcgWFF1ZXJ5IGFuZCBYUGF0aCBpbiBYTUxCZWFucywgCi0gICAgICBzZWUgPGEgaHJlZj0iY29uU2VsZWN0aW5nWE1Md2l0aFhRdWVyeVBhdGhYUGF0aC5odG1sIj5TZWxlY3RpbmcgWE1MIHdpdGggCi0gICAgICBYUXVlcnkgYW5kIFhQYXRoPC9hPi48L2Rpdj4KLSAgPC9saT4KLSAgPGxpPllvdSBjYW4gdXNlIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPiBpbnRlcmZhY2UgZm9yIAotICAgIGZpbmUtZ3JhaW5lZCBuYXZpZ2F0aW9uIGFuZCBtYW5pcHVsYXRpb24gb2YgWE1MLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIAotICAgIDxhIGhyZWY9ImNvbk5hdmlnYXRpbmdYTUx3aXRoQ3Vyc29ycy5odG1sIj5OYXZpZ2F0aW5nIFhNTCB3aXRoIEN1cnNvcnM8L2E+LjwvbGk+Ci08L3VsPgotPGRpdj4KLSAgPHAgY2xhc3M9Im5vdGVwYXJhIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSB4YmVhbi5qYXIgZmlsZSB0aGF0IGNvbnRhaW5zIAotICAgIHRoZSBYTUxCZWFucyBsaWJyYXJ5IGlzIGZ1bGx5IGZ1bmN0aW9uYWwgYXMgYSBzdGFuZGFsb25lIGxpYnJhcnkuPC9wPgotICA8aDE+UmVsYXRlZCBUb3BpY3M8L2gxPgotICA8cD48YSBocmVmPSIuLi8uLi9zYW1wbGVzL25hdlhNTEJlYW5zU2FtcGxlcy5odG1sIj5YTUxCZWFucyBTYW1wbGVzPC9hPjwvcD4KLTwvZGl2PgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPiAKLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCi08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL2RvY3MvZ3VpZGUvY29uSW50cm9Ub1RoZVNjaGVtYVR5cGVTeXN0ZW0uaHRtbCBiL3YxL2RvY3MvZ3VpZGUvY29uSW50cm9Ub1RoZVNjaGVtYVR5cGVTeXN0ZW0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBlODVjNy4uMDAwMDAwMAotLS0gYS92MS9kb2NzL2d1aWRlL2NvbkludHJvVG9UaGVTY2hlbWFUeXBlU3lzdGVtLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotPCFkb2N0eXBlIEhUTUwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iZG9jdGl0bGUiIC0tPgotPHRpdGxlPkludHJvZHVjdGlvbiB0byBTY2hlbWEgVHlwZSBTaWduYXR1cmVzPC90aXRsZT4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4gCi08IS0tKE1ldGEpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JENIQVJTRVQ7Ij4KLQotCi08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJtZXRhdGFncyIgLS0+Ci0KLTxtZXRhIGNvbnRlbnQ9InlvdXIgbmFtZSIgbmFtZT0iYXV0aG9yIj4KLTxtZXRhIGNvbnRlbnQ9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHRvcGljIGNvbnRlbnRzLiIgbmFtZT0iZGVzY3JpcHRpb24iPgotPG1ldGEgY29udGVudD0ia2V5d29yZHMgdG8gaGVscCBpbiBzZWFyY2hlcyIgbmFtZT0ia2V5d29yZHMiPgotPG1ldGEgY29udGVudD0iMTAvMjUvMDIiIG5hbWU9ImRhdGUgbGFzdCBtb2RpZmllZCI+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci0KLTwhLS0oTGlua3MpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJoZWFkIiAtLT4gCi08bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTxhIGhyZWY9Ii4uLy4uLy4uL2NvcmUvaW5kZXguaHRtbCIgaWQ9ImluZGV4Ij48L2E+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvdG9waWNJbmZvLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9Db29raWVDbGFzcy5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvZGlzcGxheUNvbnRlbnQuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08IS0tKEJvZHkpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPGJvZHk+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotPC9zY3JpcHQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJib2R5IiAtLT4gCi08aDE+IEludHJvZHVjdGlvbiB0byBTY2hlbWEgVHlwZSBTaWduYXR1cmVzPC9oMT4KLTxkaXYgaWQ9InRvcGljdGV4dCI+IAotICA8cD5XaGVuIHlvdSBjb21waWxlIHNjaGVtYSwgdGhlIEFQSSBnZW5lcmF0ZWQgZnJvbSB5b3VyIHNjaGVtYSBpcyBpbnRlZ3JhdGVkIAotICAgIHdpdGggdGhlIFhNTEJlYW5zIHR5cGUgc3lzdGVtIHRoYXQgcmVwcmVzZW50cyB0aGUgdW5kZXJseWluZyBYTUwgc2NoZW1hLiBBbGwgCi0gICAgdG9nZXRoZXIsIHRoZXNlIHR5cGVzIG1ha2UgdXAgdGhlIDxlbT5zY2hlbWEgdHlwZSBzeXN0ZW08L2VtPiB0byB3aGljaCB5b3VyIAotICAgIGNvZGUgaGFzIGFjY2Vzcy4gV2hlbiBoYW5kbGluZyBYTUwgYmFzZWQgb24gdGhlIHNjaGVtYSwgeW91IHR5cGljYWxseSBjYWxsIAotICAgIG1ldGhvZHMgb2YgdGhlIEFQSSBnZW5lcmF0ZWQgd2hlbiB5b3UgY29tcGlsZWQgdGhlIHNjaGVtYS4gSG93ZXZlciwgZm9yIHRoZSAKLSAgICBjYXNlcyB3aGVuIHlvdSB3YW50IHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2NoZW1hIGl0c2VsZiwgeW91IHVzZSB0aGUgCi0gICAgc2NoZW1hIHR5cGUgc3lzdGVtIEFQSS48L3A+Ci0gIDxwPkluIHRoZSBYTUxCZWFucyBBUEksIHlvdSBoYXZlIGFjY2VzcyB0byB0aGUgc3lzdGVtIGl0c2VsZiB0aHJvdWdoIDxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGVTeXN0ZW0uaHRtbCI+PHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlNjaGVtYVR5cGVTeXN0ZW08L3NwYW4+PC9hPiAKLSAgICBhbmQgcmVsYXRlZCBjbGFzc2VzLiBUaGVzZSBtYWtlIHVwIGEga2luZCBvZiAmcXVvdDttZXRhLUFQSSwmcXVvdDsgb3IgYSB2aWV3IAotICAgIG9uIHRoZSBzY2hlbWEuIFlvdSBjYW4gdXNlIHRoZSBzY2hlbWEgdHlwZSBzeXN0ZW0gQVBJIHRvIGRpc2NvdmVyIHRoZSB0eXBlIAotICAgIHN5c3RlbSBhdCBydW4gdGltZS4gU2VlIHRoZSByZWZlcmVuY2UgdG9waWMgb24gdGhhdCBpbnRlcmZhY2UgZm9yIGFuIG92ZXJ2aWV3IAotICAgIG9mIHRoZSBzY2hlbWEgdHlwZSBzeXN0ZW0uPC9wPgotICA8aDI+U2NoZW1hIFR5cGUgJnF1b3Q7U2lnbmF0dXJlcyZxdW90OzwvaDI+Ci0gIDxwPkEgc2NoZW1hIGlzIG1hZGUgdXAgb2Ygc2NoZW1hIGNvbXBvbmVudHMuIFNjaGVtYSBjb21wb25lbnRzIGFyZSB0aGUgcGllY2VzIAotICAgIG9mIGEgc2NoZW1hLCBzdWNoIGFzIGEgdHlwZSBkZWZpbml0aW9uLCBhbiBlbGVtZW50IGRlY2xhcmF0aW9uLCBhdHRyaWJ1dGUgCi0gICAgZGVjbGFyYXRpb24sIGFuZCBzbyBvbi4gVG8gbWlycm9yIHRoZXNlIGluIHRoZSBzY2hlbWEgdHlwZSBzeXN0ZW0sIGEgPGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQ29tcG9uZW50Lmh0bWwiPjxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5TY2hlbWFDb21wb25lbnQ8L3NwYW4+PC9hPiAKLSAgICBpbnN0YW5jZSByZXByZXNlbnRzIGEgY29tcG9uZW50IGluIHRoZSB1bmRlcmx5aW5nIHNjaGVtYTsgc2VwYXJhdGUgY29tcG9uZW50cyAKLSAgICBoYXZlIGNvcnJlc3BvbmRpbmcgdHlwZXMuIEZvciBleGFtcGxlIHlvdSB3b3VsZCBoYXZlIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGUuaHRtbCI+U2NoZW1hVHlwZTwvYT48L3NwYW4+IAotICAgIG9iamVjdCBmb3IgYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Q3VzdG9tZXJUeXBlPC9zcGFuPiB5b3VyIHNjaGVtYSBkZWZpbmVkLCAKLSAgICBvciBhIDxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUdsb2JhbEVsZW1lbnQuaHRtbCI+PHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlNjaGVtYUdsb2JhbEVsZW1lbnQ8L3NwYW4+PC9hPiAKLSAgICBvYmplY3QgZm9yIGEgZ2xvYmFsIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QdXJjaGFzZU9yZGVyPC9zcGFuPiBlbGVtZW50LiAKLSAgICBZb3Ugd291bGQgYWxzbyBoYXZlIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlNjaGVtYVR5cGU8L3NwYW4+IGZvciBidWlsdC1pbiAKLSAgICBzY2hlbWEgdHlwZXMsIHN1Y2ggYXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOnN0cmluZzwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOmRhdGV0aW1lPC9zcGFuPi4gCi0gICAgWE1MQmVhbiBwcm92aWRlcyBhICZxdW90O3NpZ25hdHVyZSZxdW90OyB0byBkZXNjcmliZSBlYWNoIHR5cGUuIFlvdSBjYW4gcmV0cmlldmUgCi0gICAgdGhpcyBzaWduYXR1cmUgYnkgY2FsbGluZyB0aGUgU2NoZW1hVHlwZSBjbGFzcydzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj50b1N0cmluZzwvc3Bhbj4gCi0gICAgbWV0aG9kLjwvcD4KLSAgPHA+VGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj50b1N0cmluZzwvc3Bhbj4gbWV0aG9kIHJldHVybnMgWE1MQmVhbnMnIHZlcnNpb24gCi0gICAgb2YgYSB1bmlxdWUgc2lnbmF0dXJlIGZvciBhIHNjaGVtYSB0eXBlLiBUaGlzIHN0cmluZyBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyAKLSAgICBiZWNhdXNlIGl0IGRlc2NyaWJlcyBhIGdpdmVuIHR5cGUgZXZlbiB3aGVuIHRoZSB0eXBlIGRvZXNuJ3QgaGF2ZSBhIG5hbWUuIAotICA8L3A+Ci0gIDxwIGNsYXNzPSJub3RlcGFyYSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJdCdzIGltcG9ydGFudCB0byByZW1lbWJlciB0aGF0IHRoaXMgCi0gICAgc2lnbmF0dXJlIGlzIGFuIFhNTEJlYW5zIGNvbnZlbnRpb24sIHJhdGhlciB0aGFuIGEgc3RhbmRhcmQgZnJvbSB0aGUgc2NoZW1hIAotICAgIHdvcmtpbmcgZ3JvdXAuIFRoZSB3b3JraW5nIGdyb3VwIGhhcyBub3QgeWV0IHN0YW5kYXJkaXplZCBhIHNpZ25hdHVyZSBmb3IgCi0gICAgWE1MIHNjaGVtYSB0eXBlcy4gQXMgYSByZXN1bHQgdGhlIHNpZ25hdHVyZSB5b3UnbGwgc2VlIGZyb20gWE1MQmVhbnMgaXMgc3ViamVjdCAKLSAgICB0byBjaGFuZ2UgJiM4MjEyOyB3aGF0ZXZlciB0aGUgc2NoZW1hIHdvcmtpbmcgZ3JvdXAgY29tZXMgdXAgd2l0aCBpbiB0aGUgZW5kIAotICAgIChpZiBhbnl0aGluZykgaXMgcHJvYmFibHkgd2hhdCB3aWxsIGJlIHVzZWQgYnkgdGhpcyBBUEkuIEluIG90aGVyIHdvcmRzLCBkb24ndCAKLSAgICB3cml0ZSBhIHByb2dyYW0gdG8gZGVjb2RlIHRoZSBzaWduYXR1cmUuPC9wPgotICA8cD5Zb3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uIHRvIHVuZGVyc3RhbmQgaG93IGEgc2lnbmF0dXJlIGlzIGNvbnN0cnVjdGVkLjwvcD4KLTwvZGl2PgotPHVsPgotICA8bGk+IAotICAgIDxkaXY+PHN0cm9uZz5HbG9iYWwgdHlwZXMuPC9zdHJvbmc+IElmIHRoZSB0eXBlIGhhcyBhIG5hbWUsIGl0J3MgYSBnbG9iYWwgCi0gICAgICB0eXBlLiBUaGUgZm9sbG93aW5nIGZvcm0gaXMgdXNlZDo8L2Rpdj4KLSAgICA8ZGl2PiAKLSAgICAgIDxkaXY+IAotICAgICAgICA8cHJlPlQ9Jmx0O2xvY2FsbmFtZSZndDtAJmx0O3RhcmdldE5hbWVzcGFjZSZndDs8L3ByZT4KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotICAgIDxwPlRoZSAmcXVvdDtUJnF1b3Q7IGlzIGZvciAmcXVvdDt0eXBlLCZxdW90OyBvZiBjb3Vyc2UuICZxdW90O2xvY2FsbmFtZSZxdW90OyAKLSAgICAgIGlzIGEgY29udmVudGlvbiB1c2VkIGJ5IHFuYW1lcyAocXVhbGlmaWVkIG5hbWVzKSwgd2hpY2ggaW5jbHVkZSBhIGxvY2FsIAotICAgICAgbmFtZSBhbmQgdGhlIG5hbWVzcGFjZSBVUkkgKGlmIGFueSkuIFNvIGFuIGV4YW1wbGUgbWlnaHQgYmU6PC9wPgotICAgIDxwcmU+VD1jdXN0b21lckBvcGVudXJpLm9yZzwvcHJlPgotICA8L2xpPgotICA8bGk+PHN0cm9uZz5Eb2N1bWVudCB0eXBlcyBhbmQgZ2xvYmFsIGF0dHJpYnV0ZSB0eXBlcy48L3N0cm9uZz4gVGhlc2UgY29ycmVzcG9uZCAKLSAgICB0byBhIHNwZWNpYWwgYW5vbnltb3VzIHR5cGUgY29udGFpbmluZyBvbmUgZ2xvYmFsIGVsZW1lbnQgb3IgYXR0cmlidXRlLiBUaGVzZSAKLSAgICBzcGVjaWFsIHR5cGVzIGFyZSBnZW5lcmF0ZWQgYnkgWE1MQmVhbnMgdG8gcmVwcmVzZW50IGdsb2JhbCB0eXBlcyBkZWNsYXJlZCAKLSAgICB3aXRoIHRoZSAmbHQ7ZWxlbWVudCZndDsgb3IgJmx0O2F0dHJpYnV0ZSZndDsgdGFnIGluIHNjaGVtYS4gQmVjYXVzZSBzdWNoIAotICAgIHR5cGVzIGFyZSB0eXBlcywgYnV0IGFyZSBkZWNsYXJlZCBhcyBlbGVtZW50cyBvciBhdHRyaWJ1dGVzLCB0aGV5IHJlcXVpcmUgCi0gICAgc3BlY2lhbCB0cmVhdG1lbnQuIFRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIGZvcm0gaXMgdXNlZDogCi0gICAgPGRpdj4gCi0gICAgICA8cHJlPgotRD0mbHQ7ZG9jdW1lbnQtZWxlbWVudC1uYW1lJmd0O0AmbHQ7dGFyZ2V0TmFtZXNwYWNlJmd0OwotUj0mbHQ7YXR0cmlidXRlLXR5cGUtbmFtZSZndDtAJmx0O3RhcmdldE5hbWVzcGFjZSZndDsKLTwvcHJlPgotICAgICAgPGRpdj48L2Rpdj4KLSAgICA8L2Rpdj4KLSAgICA8ZGl2PiAKLSAgICAgIDxkaXY+Tm90ZSB0aGF0IHRoZXNlIGFyZSBhbHNvIHRoZSBzaWduYXR1cmVzIG9mIGEgdHlwZSByZXR1cm5lZCBieSBhIEZvb0RvY3VtZW50LnR5cGUgCi0gICAgICAgIG9yIEZvb0F0dHJpYnV0ZS50eXBlIG1ldGhvZCBjYWxsLjwvZGl2PgotICAgIDwvZGl2PgotICA8L2xpPgotICA8bGk+PHN0cm9uZz5Bbm9ueW1vdXMgdHlwZXMuPC9zdHJvbmc+IElmIHRoZSB0eXBlIGlzIGFub255bW91cywgaXQgaXMgZGVmaW5lZCAKLSAgICBhcyBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZSwgb3Igd2l0aGluIGEgZnVydGhlciBhbm9ueW1vdXMgdHlwZS4gSW4gdGhpcyBjYXNlLCAKLSAgICB0aGUgc2lnbmF0dXJlIGlzIGJ1aWx0IGJ5IGVzdGFibGlzaGluZyB0aGUgbG9jYWwgY29udGV4dCAoaW4gb3JkZXIgd29yZHMsIAotICAgIHdoYXQgaXMgdGhlIGFub255bW91cyB0eXBlIG5lc3RlZCBpbj8pLiBGcm9tIHRoZSBsb2NhbCBjb250ZXh0LCB0aGUgbGFyZ2VyIAotICAgIGNvbnRleHQgaXMgYnVpbHQgcmVjdXJzaXZlbHkuIEluIG90aGVyIHdvcmRzLCB0aGUgc2lnbmF0dXJlIGlzIGJ1aWx0IGJ5IGdpdmluZyAKLSAgICBub3Qgb25seSB0aGUgYW5vbnltb3VzIHR5cGUgaXRzZWxmLCBidXQgYWxzbyBieSBkZXNjcmliaW5nIGl0cyBjb250ZXh0LiAKLSAgICA8cD4gVGhlIGZvbGxvd2luZyBydWxlcyBhcmUgdXNlZCBmb3IgYnVpbGRpbmcgYSBzaWduYXR1cmUgZm9yIGFuIGFub255bW91cyAKLSAgICAgIHR5cGUuIDwvcD4KLSAgICA8dWw+Ci0gICAgICA8bGk+IEl0IG1pZ2h0IGJlIGFuIGFub255bW91cyB0eXBlIGRlZmluZWQgaW5zaWRlIGEgbG9jYWwgZWxlbWVudCBvciBhdHRyaWJ1dGUsIAotICAgICAgICB3aGljaCBpbiB0dXJuIGlzIGRlZmluZWQgd2l0aGluIHNvbWV0aGluZyBlbHNlOiAKLSAgICAgICAgPHA+SWYgdGhlIGVsZW1lbnQgaXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiIHN0eWxlPSJsYW5naW5saW5lIj5mb3JtPSZxdW90O3F1YWxpZmllZCZxdW90Ozwvc3Bhbj4gCi0gICAgICAgICAgKHRoZSB1c3VhbCBkZWZhdWx0KTo8L3A+Ci0gICAgICA8L2xpPgotICAgIDwvdWw+Ci0gIDwvbGk+Ci0gIDxibG9ja3F1b3RlPiAKLSAgICA8ZGl2PiAKLSAgICAgIDxwcmU+RT0mbHQ7ZWx0bmFtZSZndDt8Jmx0O3NpZ25hdHVyZSBvZiB0aGUgdHlwZSB3aXRoaW4gd2hpY2ggdGhlIGVsdCBpcyBkZWZpbmVkJmd0OzwvcHJlPgotICAgIDwvZGl2PgotICAgIDxkaXY+SWYgdGhlIGVsZW1lbnQgaXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiIHN0eWxlPSJsYW5naW5saW5lIj5mb3JtPSZxdW90O3VucXVhbGlmaWVkJnF1b3Q7PC9zcGFuPjo8L2Rpdj4KLSAgICA8ZGl2PiAKLSAgICAgIDxwcmU+VT0mbHQ7ZWx0bmFtZSZndDt8Jmx0O3NpZ25hdHVyZSBvZiB0aGUgdHlwZSB3aXRoaW4gd2hpY2ggdGhlIGVsdCBpcyBkZWZpbmVkJmd0OzwvcHJlPgotICAgIDwvZGl2PgotICAgIDxkaXY+SWYgdGhlIGF0dHJpYnV0ZSBpcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSIgc3R5bGU9ImxhbmdsaW5lIj5mb3JtPSZxdW90O3VucXVhbGlmaWVkJnF1b3Q7PC9zcGFuPiAKLSAgICAgICh0aGUgdXN1YWwgZGVmYXVsdCk6PC9kaXY+Ci0gICAgPGRpdj4gCi0gICAgICA8cHJlPkE9Jmx0O2F0dHJuYW1lJmd0O3wmbHQ7c2lnbmF0dXJlIG9mIHRoZSB0eXBlIHdpdGhpbiB0aGUgYXR0ciBpcyBkZWZpbmVkJmd0OzwvcHJlPgotICAgIDwvZGl2PgotICAgIDxkaXY+aWYgdGhlIGF0dHJpYnV0ZSBpcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSIgc3R5bGU9ImxhbmdpbmxpbmUiPmZvcm09JnF1b3Q7cXVhbGlmaWVkJnF1b3Q7PC9zcGFuPjo8L2Rpdj4KLSAgICA8ZGl2PiAKLSAgICAgIDxwcmU+UT0mbHQ7YXR0cm5hbWUmZ3Q7fCZsdDtzaWduYXR1cmUgb2YgdGhlIHR5cGUgd2l0aGluIHRoZSBhdHRyIGlzIGRlZmluZWQmZ3Q7PC9wcmU+Ci0gICAgPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPHVsPgotICAgIDxsaT5JdCBtaWdodCBiZSBhbiBhbm9ueW1vdXMgdHlwZSBkZWZpbmVkIGEgc2ltcGxlIHJlc3RyaWN0aW9uLCB1bmlvbiwgb3IgCi0gICAgICBsaXN0IGRlZmluaXRpb246PC9saT4KLSAgPC91bD4KLSAgPGJsb2NrcXVvdGU+IAotICAgIDxkaXY+IAotICAgICAgPHByZT5NPSN8Jmx0O3NpZ25hdHVyZSBvZiB0aGUgY29udGFpbmluZyB1bmlvbiB0eXBlJmd0OzwvcHJlPgotICAgICAgPHA+KFRoZSAjIGlzIGEgbnVtYmVyIGluZGljYXRpbmcgd2hpY2ggdW5pb24gbWVtYmVyIGl0IGlzLCBieSBzb3VyY2Ugb3JkZXIgCi0gICAgICAgICYjODIxMjsgc3VjaCBhcyAwLDEsMiwgZXRjLik8L3A+Ci0gICAgICA8cHJlPkI9fCZsdDtzaWduYXR1cmUgb2YgdGhlIGNvbnRhaW5pbmcgYmFzZSB0eXBlIGZvciBhIHJlc3RyaWN0aW9uJmd0OzwvcHJlPgotICAgICAgPHByZT5JPXwmbHQ7c2lnbmF0dXJlIG9mIHRoZSBjb250YWluaW5nIGxpc3QgdHlwZSZndDs8L3ByZT4KLSAgICA8L2Rpdj4KLSAgPC9ibG9ja3F1b3RlPgotICA8dWw+Ci0gICAgPGxpPiAKLSAgICAgIDxkaXY+IEluIHRoZSBmdXR1cmUgaWYgYW5vbnltb3VzIHR5cGVzIGFyZSBhbGxvd2VkIGluIHNvbWUgb3RoZXIgY29udGV4dCwgCi0gICAgICAgIHRoZXJlIG1heSBiZSBtb3JlIGNvZGVzLjwvZGl2PgotICAgIDwvbGk+Ci0gIDwvdWw+Ci08L3VsPgotPGgyPkFuIEV4YW1wbGU8L2gyPgotPHA+U28sIGZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHR5cGUgdGhhdCBkZXNjcmliZXMgdGhlIGxpc3QgaXRlbXMgd2l0aGluIGFuIAotICBhdHRyaWJ1dGUgb2YgYW4gaW5zdGFuY2UgdGhhdCBsb29rcyBsaWtlIHRoaXM6PC9wPgotPGJsb2NrcXVvdGU+IAotICA8ZGl2PiAKLSAgICA8cHJlPiAmbHQ7cm9vdCBteWxpc3Q9JnF1b3Q7NDMyIDk5OSAxNDMgMTIzJnF1b3Q7LyZndDs8L3ByZT4KLSAgPC9kaXY+Ci08L2Jsb2NrcXVvdGU+Ci08ZGl2PiBUaGUgc2NoZW1hLCBpZiBkb25lIHdpdGggbG90cyBvZiBuZXN0ZWQgdHlwZXMsIGNvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgCi0gIHRoaXM6PC9kaXY+Ci08YmxvY2txdW90ZT4KLSAgPGRpdj4KLSAgICA8cHJlPgotJmx0O3NjaGVtYSB0YXJnZXROYW1lc3BhY2U9JnF1b3Q7bXlOYW1lc3BhY2UmcXVvdDsgZWxlbWVudEZvcm1EZWZhdWx0PSZxdW90O3F1YWxpZmllZCZxdW90OyZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtlbGVtZW50IG5hbWU9JnF1b3Q7cm9vdCZxdW90OyZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtjb21wbGV4VHlwZSZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDtteWxpc3QmcXVvdDsmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7c2ltcGxlVHlwZSZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtsaXN0Jmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3NpbXBsZVR5cGUmZ3Q7ICZsdDshLS1UaGlzIGlzIHRoZSB0eXBlIHRoYXQgdGhlIHNpZ25hdHVyZSBpcyBmb3IgLS0mZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7cmVzdHJpY3Rpb24gYmFzZT0mcXVvdDt4czpub25OZWdhdGl2ZUludGVnZXImcXVvdDsmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7dG90YWxEaWdpdHMgdmFsdWU9JnF1b3Q7MyZxdW90Oy8mZ3Q7Li4KLTwvcHJlPgotICA8L2Rpdj4KLTwvYmxvY2txdW90ZT4KLTxkaXY+IFRoZSBzaWduYXR1cmUgZm9yIHRoZSBzaW1wbGVUeXBlIGluZGljYXRlZCBpbiB0aGUgZXhhbXBsZSB3b3VsZCBiZTo8L2Rpdj4KLTxibG9ja3F1b3RlPgotICA8cHJlPkk9fEE9bXlsaXN0fEU9cm9vdHxEPXJvb3RAbXlOYW1lc3BhY2U8L3ByZT4KLTwvYmxvY2txdW90ZT4KLTxkaXY+IAotICA8cD5Zb3UgY291bGQgcmVhZCB0aGlzIGFzOiA8L3A+Ci08L2Rpdj4KLTxibG9ja3F1b3RlPgotICA8ZGl2PiZxdW90O1RoZSB0eXBlIG9mIHRoZSBsaXN0IGl0ZW0gfCB3aXRoaW4gdGhlIHR5cGUgb2YgdGhlIG15bGlzdCBhdHRyaWJ1dGUncyAKLSAgICB0eXBlIHwgd2l0aGluIHRoZSB0eXBlIG9mIHRoZSByb290IGVsZW1lbnQgfCB3aXRoaW4gdGhlIGRvY3VtZW50IHR5cGUgZm9yIAotICAgICZsdDtyb290Jmd0OyBkb2N1bWVudHMgfCBpbiB0aGUgbXlOYW1lc3BhY2UgbmFtZXNwYWNlJnF1b3Q7LjwvZGl2PgotPC9ibG9ja3F1b3RlPgotPGRpdj4gCi0gIDxwPk5vdGUgdGhhdCB0aGUgc2lnbmF0dXJlIHN0cnVjdHVyZSBtaXJyb3JzIHRoZSBKYXZhIGNsYXNzIHN0cnVjdHVyZSBnZW5lcmF0ZWQgCi0gICAgYnkgWE1MQmVhbnMgd2hlbiBjb21waWxpbmcgdGhlIHNjaGVtYS4gSW4gb3RoZXIgd29yZHMsIGlmIHlvdSB3ZXJlIHRvIGNvbXBpbGUgCi0gICAgYSBzY2hlbWEgdGhhdCBpbmNsdWRlZCB0aGUgcHJlY2VkaW5nIHNuaXBwZXQsIHlvdSB3b3VsZCBiZSBhYmxlIHRvIGFjY2VzcyAKLSAgICBhbiBpbnN0YW5jZSBvZiB0aGUgc2NoZW1hIHdpdGggSmF2YSBjb2RlIGxpa2UgdGhlIGZvbGxvd2luZzo8L3A+Ci0gIDxwcmU+U2NoZW1hVHlwZSBzVHlwZSA9IFJvb3REb2N1bWVudC5Sb290Lk15TGlzdC5JdGVtLnR5cGU7PC9wcmU+Ci08L2Rpdj4KLTxwIGNsYXNzPSJyZWxhdGVkdG9waWNzIj5SZWxhdGVkIFRvcGljczwvcD4KLTxwPjxhIGhyZWY9ImNvbkdldHRpbmdTdGFydGVkd2l0aFhNTEJlYW5zLmh0bWwiPkdldHRpbmcgU3RhcnRlZCB3aXRoIFhNTEJlYW5zPC9hPjwvcD4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4gCi08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS92MS9kb2NzL2d1aWRlL2NvbkphdmFUeXBlc0dlbmVyYXRlZEZyb21Vc2VyRGVyaXZlZC5odG1sIGIvdjEvZG9jcy9ndWlkZS9jb25KYXZhVHlwZXNHZW5lcmF0ZWRGcm9tVXNlckRlcml2ZWQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIxMTI0Ni4uMDAwMDAwMAotLS0gYS92MS9kb2NzL2d1aWRlL2NvbkphdmFUeXBlc0dlbmVyYXRlZEZyb21Vc2VyRGVyaXZlZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDU4ICswLDAgQEAKLTwhZG9jdHlwZSBIVE1MIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgRnJhbWVzZXQvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImRvY3RpdGxlIiAtLT4gCi08dGl0bGU+SmF2YSBUeXBlcyBHZW5lcmF0ZWQgZnJvbSBTY2hlbWE8L3RpdGxlPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPiAKLQotPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0kQ0hBUlNFVDsiPgotCi0KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9Im1ldGF0YWdzIiAtLT4gCi0KLTxtZXRhIG5hbWU9ImNvbXBvbmVudCIgY29udGVudD0iIj4KLTwhLS0gSW4gdGhlIGRlc2NyaXB0aW9uIG1ldGF0YWcsIHBsZWFzZSBwcm92aWRlIGEgQlJJRUYgZGVzY3JpcHRpb24gb2YgdGhlIHRvcGljIGNvbnRlbnRzLiAtLT4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSIiPgotPCEtLSBJbiB0aGUgY29tcG9uZW50IG1ldGF0YWcsIHBsZWFzZSBsaXN0IGtleXdvcmRzIHRoYXQgd2lsbCBoZWxwIGEgdXNlciBzZWFyY2ggZm9yIHRoaXMgdG9waWMuIC0tPgotPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci0KLTwhLS0oTGlua3MpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJoZWFkIiAtLT4KLQotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLSAKLTwhLS0oTWV0YSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLQotCi08bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9InlvdXIgbmFtZSI+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgdG9waWMgY29udGVudHMuIj4KLTxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSJrZXl3b3JkcyB0byBoZWxwIGluIHNlYXJjaGVzIj4KLTxtZXRhIG5hbWU9ImRhdGUgbGFzdCBtb2RpZmllZCIgY29udGVudD0iMTAvMjUvMDIiPgotPCEtLShMaW5rcyk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0oQm9keSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+PCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTxhIGhyZWY9Ii4uLy4uLy4uL2NvcmUvaW5kZXguaHRtbCIgaWQ9ImluZGV4Ij48L2E+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvdG9waWNJbmZvLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9Db29raWVDbGFzcy5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvZGlzcGxheUNvbnRlbnQuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08IS0tKEJvZHkpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPGJvZHk+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotPC9zY3JpcHQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJib2R5IiAtLT4KLTxoMT4gSmF2YSBUeXBlcyBHZW5lcmF0ZWQgZnJvbSBVc2VyLURlcml2ZWQgU2NoZW1hIFR5cGVzPC9oMT4KLTxkaXYgaWQ9InRvcGljdGV4dCI+IAotICA8cD5XaGVuIHlvdSBjb21waWxlIFhNTCBzY2hlbWEsIHRoZSByZXN1bHRpbmcgQVBJIGlzIG1hZGUgdXAgb2YgdHdvIGNhdGVnb3JpZXMgCi0gICAgb2YgdHlwZXM6IGJ1aWx0LWluIHR5cGVzIHRoYXQgbWlycm9yIHRob3NlIGluIHRoZSBzY2hlbWEgc3BlY2lmaWNhdGlvbiBhbmQgCi0gICAgb3RoZXJzIHRoYXQgYXJlIGdlbmVyYXRlZCBmcm9tIHVzZXItZGVyaXZlZCBzY2hlbWEgdHlwZXMuIFRoaXMgdG9waWMgcHJvdmlkZXMgCi0gICAgYW4gb3ZlcnZpZXcgb2YgdGhlIEphdmEgdHlwZXMgZ2VuZXJhdGVkIGZvciB1c2VyLWRlcml2ZWQgdHlwZXMsIGRlc2NyaWJpbmcgCi0gICAgdGhlIG1ldGhvZHMgdGhlIEphdmEgdHlwZXMgcHJvdmlkZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYnVpbHQtaW4gdHlwZXMsIAotICAgIHNlZSA8YSBocmVmPSJjb25YTUxCZWFuc1N1cHBvcnRCdWlsdEluU2NoZW1hVHlwZXMuaHRtbCI+WE1MQmVhbnMgU3VwcG9ydCBmb3IgCi0gICAgQnVpbHQtSW4gU2NoZW1hIFR5cGVzPC9hPi4gRm9yIHNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZXRob2RzIGV4cG9zZWQgCi0gICAgYnkgZ2VuZXJhdGVkIHR5cGVzLCBzZWUgPGEgaHJlZj0iY29uTWV0aG9kc0ZvckdlbmVyYXRlZEphdmFUeXBlcy5odG1sIj5NZXRob2RzIAotICAgIGZvciBHZW5lcmF0ZWQgSmF2YSBUeXBlczwvYT4uPC9wPgotICA8cD5JbiBnZW5lcmFsLCBhbiBBUEkgZ2VuZXJhdGVkIGZyb20gc2NoZW1hIGlzIGFuIGludHVpdGl2ZSBtZWFucyB0byBhY2Nlc3MgCi0gICAgWE1MIGluc3RhbmNlcyBiYXNlZCBvbiB0aGUgc2NoZW1hLiBZb3UnbGwgcHJvYmFibHkgZmluZCB0aGF0IGZvciBtb3N0IHVzZXMgCi0gICAgaXQncyB1bm5lY2Vzc2FyeSB0byBrbm93IHRoZSBydWxlcyBmb3IgZ2VuZXJhdGluZyBpdCBpbiBvcmRlciB0byB1c2UgaXQuIEhvd2V2ZXIsIAotICAgIGZvciB0aG9zZSBjYXNlcyB3aGVuIGl0J3MgdW5jbGVhciB3aGF0J3MgZ29pbmcgb24gYmVoaW5kIHRoZSBzY2VuZXMgKG9yIGlmIAotICAgIHlvdSdyZSBqdXN0IGN1cmlvdXMpLCB0aGlzIHRvcGljIGRlc2NyaWJlcyB0aGUgcnVsZXMuPC9wPgotICA8cCBjbGFzcz0ibm90ZXBhcmEiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIFhNTEJlYW5zIEFQSSBhbHNvIHByb3ZpZGVzIGEgCi0gICAgd2F5IGZvciB5b3UgdG8gZ2V0IGluZm9ybWF0aW9uIDxlbT5hYm91dCA8L2VtPnRoZSB0eXBlIHN5c3RlbSBpdHNlbGYgJiM4MjEyOyAKLSAgICBpbiBvdGhlciB3b3JkcywgYWJvdXQgdGhlIEFQSSBhbmQgdGhlIHVuZGVybHlpbmcgc2NoZW1hLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgCi0gICAgc2VlIDxhIGhyZWY9ImNvbkludHJvVG9UaGVTY2hlbWFUeXBlU3lzdGVtLmh0bWwiPkludHJvZHVjdGlvbiB0byBTY2hlbWEgVHlwZSAKLSAgICBTaWduYXR1cmVzPC9hPi48L3A+Ci0gIDxwPkVhY2ggb2YgdGhlIHR5cGVzIGdlbmVyYXRlZCB3aGVuIHlvdSBjb21waWxlIGEgc2NoZW1hIGlzIGRlc2lnbmVkIHNwZWNpZmljYWxseSAKLSAgICBmb3IgYWNjZXNzIHRvIFhNTCBpbnN0YW5jZXMgY29uZm9ybWluZyB0byB0aGF0IHBhcnQgb2YgdGhlIHNjaGVtYS4gU3RhcnQgYnkgCi0gICAgdGFraW5nIGEgbG9vayBhdCBhIHNpbXBsZSBYTUwgYW5kIHNjaGVtYSBleGFtcGxlLiBUaGUgZm9sbG93aW5nIHNjaGVtYSBkZXNjcmliZXMgCi0gICAgYW4gWE1MIGRvY3VtZW50IHRvIGNvbnRhaW4gYSBzdG9jayBwcmljZSBxdW90ZS48L3A+Ci0gIDxwcmU+Jmx0O3hzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiJmd0OwotICAgICZsdDt4czplbGVtZW50IG5hbWU9InByaWNlLXF1b3RlIiZndDsKLSAgICAgICAgJmx0O3hzOmNvbXBsZXhUeXBlJmd0OwotICAgICAgICAgICAgJmx0O3hzOnNlcXVlbmNlJmd0OwotICAgICAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9InN0b2NrLXN5bWJvbCIgdHlwZT0ieHM6c3RyaW5nIi8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0ic3RvY2stcHJpY2UiIHR5cGU9InhzOmZsb2F0Ii8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OwotICAgICAgICAmbHQ7L3hzOmNvbXBsZXhUeXBlJmd0OwotICAgICZsdDsveHM6ZWxlbWVudCZndDsKLSZsdDsveHM6c2NoZW1hJmd0OwotPC9wcmU+Ci0gIDxwPlRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBYTUwgdGhhdCBjb25mb3JtcyB0byB0aGlzIHNjaGVtYS48L3A+Ci0gIDxwcmU+Jmx0O3ByaWNlLXF1b3RlJmd0OwotICAgICZsdDtzdG9jay1zeW1ib2wmZ3Q7QkVBUyZsdDsvc3RvY2stc3ltYm9sJmd0OwotICAgICZsdDtzdG9jay1wcmljZSZndDs1OS4yMSZsdDsvc3RvY2stcHJpY2UmZ3Q7Ci0mbHQ7L3ByaWNlLXF1b3RlJmd0OzwvcHJlPgotICA8cD5XaGVuIHlvdSBjb21waWxlIHRoaXMgc2NoZW1hLCB5b3UgZ2V0IHR3byBnZW5lcmF0ZWQgWE1MQmVhbnMgaW50ZXJmYWNlczogCi0gICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPiBQcmljZVF1b3RlRG9jdW1lbnQ8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+UHJpY2VRdW90ZURvY3VtZW50LlByaWNlUXVvdGU8L3NwYW4+LjwvcD4KLSAgPHA+RnJvbSB0aGUgc2NoZW1hIHBvaW50IG9mIHZpZXcsIHRoZSBnZW5lcmF0ZWQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlByaWNlUXVvdGU8L3NwYW4+IAotICAgIGludGVyZmFjZSByZXByZXNlbnRzIHRoZSA8ZW0+Y29tcGxleCB0eXBlPC9lbT4geW91IHNlZSBpbnNpZGUgdGhlIHNjaGVtYSdzIAotICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wcmljZS1xdW90ZTwvc3Bhbj4gZWxlbWVudCBkZWNsYXJhdGlvbi4gTG9va2luZyBhdCAKLSAgICB0aGUgWE1MIGluc3RhbmNlLCB5b3UgY2FuIHNlZSB0aGF0IHRoaXMgY29tcGxleCB0eXBlIHRyYW5zbGF0ZXMgaW50byBhIHNlcXVlbmNlIAotICAgIG9mIHR3byBlbGVtZW50cywgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnN0b2NrLXN5bWJvbDwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zdG9jay1wcmljZTwvc3Bhbj4uIAotICAgIFNvIGl0J3Mgbm90IHN1cnByaXNpbmcgdGhhdCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlByaWNlUXVvdGU8L3NwYW4+IAotICAgIGludGVyZmFjZSBleHBvc2VzIG1ldGhvZHMgc3VjaCBhcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Z2V0U3RvY2tQcmljZTwvc3Bhbj4gCi0gICAgYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zZXRTdG9ja1ByaWNlPC9zcGFuPiB0byBzZXQgdGhlIHZhbHVlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zdG9jay1wcmljZTwvc3Bhbj4gCi0gICAgZWxlbWVudC48L3A+Ci0gIDxwPlRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+UHJpY2VRdW90ZURvY3VtZW50PC9zcGFuPiBpbnRlcmZhY2UsIG9uIHRoZSAKLSAgICBvdGhlciBoYW5kLCByZXByZXNlbnRzIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHJpY2UtcXVvdGU8L3NwYW4+IDxlbT5kb2N1bWVudDwvZW0+IAotICAgIHRoYXQgY29udGFpbnMgdGhlIHJvb3QgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnByaWNlLXF1b3RlPC9zcGFuPiBlbGVtZW50LiAKLSAgICBYTUxCZWFucyBjcmVhdGVzIGEgc3BlY2lhbCAmcXVvdDtkb2N1bWVudCZxdW90OyB0eXBlIGZvciBnbG9iYWwgZWxlbWVudCB0eXBlcy4gCi0gICAgQSBkb2N1bWVudCB0eXBlIHByb3ZpZGVzIGEgd2F5IGZvciB5b3UgdG8gZ2V0IGFuZCBzZXQgdGhlIHZhbHVlIG9mIHRoZSB1bmRlcmx5aW5nIAotICAgIHR5cGUsIGhlcmUgcmVwcmVzZW50ZWQgYnkgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlByaWNlUXVvdGU8L3NwYW4+LiBUaGUgCi0gICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnByaWNlLXF1b3RlPC9zcGFuPiBlbGVtZW50IGlzIGNvbnNpZGVyZWQgYSA8ZW0+Z2xvYmFsPC9lbT4gCi0gICAgZWxlbWVudCBiZWNhdXNlIGl0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gYW55d2hlcmUgZWxzZSBpbiB0aGUgc2NoZW1hLiBGb3IgCi0gICAgZ2xvYmFsIGVsZW1lbnRzLCB0aGUgWE1MQmVhbnMgc2NoZW1hIGNvbXBpbGVyIGdlbmVyYXRlcyBhbiBpbnRlcmZhY2Ugd2hvc2UgCi0gICAgbmFtZSBlbmRzIHdpdGggJnF1b3Q7RG9jdW1lbnQuJnF1b3Q7IFRoaXMgaXMgYmVjYXVzZSBhbiBYTUwgc2NoZW1hIGhhcyBubyAKLSAgICB3YXkgb2YgZGVmaW5pbmcgYSAmcXVvdDtyb290JnF1b3Q7IGVsZW1lbnQ7IGFueSBnbG9iYWwgZWxlbWVudCBjYW4gYmUgdGhlIAotICAgIHJvb3QuPC9wPgotICA8cD5UaGUgZm9sbG93aW5nIGJpdCBvZiBKYXZhIGNvZGUgaWxsdXN0cmF0ZXMgaG93IHlvdSBtaWdodCB1c2UgdGhlc2UgaW50ZXJmYWNlcyAKLSAgICB0byBnZXQgdGhlIHN0b2NrIHByaWNlIGNvbnRhaW5lZCBpbiB0aGUgWE1MLjwvcD4KLSAgPHByZT4KLXB1YmxpYyBzdGF0aWMgZmxvYXQgZ2V0U3RvY2tQcmljZShqYXZhLmlvLkZpbGUgb3JkZXJYTUwpIHRocm93cyBFeGNlcHRpb24gCi17Ci0gICAgUHJpY2VRdW90ZURvY3VtZW50IGRvY1hNTCA9IFByaWNlUXVvdGVEb2N1bWVudC5GYWN0b3J5LnBhcnNlKG9yZGVyWE1MKTsKLSAgICBQcmljZVF1b3RlIHF1b3RlWE1MID0gZG9jWE1MLmdldFByaWNlUXVvdGUoKTsKLSAgICBmbG9hdCBzdG9ja1ByaWNlID0gcXVvdGVYTUwuZ2V0U3RvY2tQcmljZSgpOwotICAgIHJldHVybiBzdG9ja1ByaWNlOwotfQotPC9wcmU+Ci0gIDxwPlRoaXMgY29kZSBsb2FkcyB0aGUgWE1MIGZyb20gYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+RmlsZTwvc3Bhbj4gb2JqZWN0LCAKLSAgICBjb252ZXJ0aW5nIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cGFyc2U8L3NwYW4+IG1ldGhvZCdzIHJldHVybiB2YWx1ZSAKLSAgICB0byBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QcmljZVF1b3RlRG9jdW1lbnQ8L3NwYW4+IGluc3RhbmNlLiBJdCB0aGVuIAotICAgIHVzZXMgdGhpcyBpbnN0YW5jZSB0byBnZXQgYW4gaW5zdGFuY2Ugb2YgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlByaWNlUXVvdGU8L3NwYW4+LiAKLSAgICBXaXRoIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QcmljZVF1b3RlPC9zcGFuPiwgdGhlIGNvZGUgZXh0cmFjdHMgdGhlIHN0b2NrIAotICAgIHByaWNlLiA8L3A+Ci08L2Rpdj4KLTxkaXY+IAotICA8ZGl2IGlkPSJ0b3BpY3RleHQiPiAKLSAgICA8cD5UaGUgWE1MIHNjaGVtYSBzcGVjaWZpY2F0aW9uIHByb3ZpZGVzIGEgcmljaCBzZXQgb2YgcnVsZXMgdGhyb3VnaCB3aGljaCAKLSAgICAgIHlvdSBjYW4gZGVyaXZlIG5ldyB0eXBlcy4gV2hlbiB5b3UgZ2VuZXJhdGUgaW50ZXJmYWNlcyBmcm9tIHlvdXIgc2NoZW1hLCAKLSAgICAgIFhNTEJlYW5zIHVzZXMgdGhlIHNjaGVtYSdzIHJ1bGVzIHRvIGRldGVybWluZSBob3cgdG8gZ2VuZXJhdGUgaW50ZXJmYWNlcy4gCi0gICAgICBUaGUgZm9sbG93aW5nIGRlc2NyaWJlcyBzb21lIG9mIHRoZSBndWlkZWxpbmVzIGJ5IHdoaWNoIHRoaXMgaXMgZG9uZS48L3A+Ci0gICAgPGgyPk5hbWVzIGZvciBJbnRlcmZhY2VzPC9oMj4KLSAgICA8cD5JbnRlcmZhY2VzIGFyZSBnZW5lcmF0ZWQgZm9yIHNjaGVtYSB0eXBlcyAoYm90aCBzaW1wbGUgYW5kIGNvbXBsZXgpLiBBbm9ueW1vdXMgCi0gICAgICBzY2hlbWEgdHlwZXMgcmVzdWx0IGluIGlubmVyIGludGVyZmFjZXMgaW5zaWRlIHRoZSB0eXBlIGludGVyZmFjZSBpbiB3aGljaCAKLSAgICAgIHRoZXkgYXJlIGRlZmluZWQuIFRoZWlyIG5hbWUgY29tZXMgZnJvbSB0aGUgZWxlbWVudCBvciBhdHRyaWJ1dGUgaW4gd2hpY2ggCi0gICAgICB0aGV5IGlzIGRlZmluZWQuPC9wPgotICAgIDxwPk5hbWVzIGZvciBzY2hlbWEgdHlwZXMgYmVjb21lIEphdmEtZnJpZW5kbHkgbmFtZXMgd2hlbiB0aGUgc2NoZW1hIGlzIGNvbXBpbGVkLiAKLSAgICAgIEluIG90aGVyIHdvcmRzLCBuYW1lcyBzdWNoIGFzICJwcmljZS1xdW90ZSIgYmVjb21lICJQcmljZVF1b3RlLiIgSW4gYWRkaXRpb24sIAotICAgICAgYSBzY2hlbWEncyBYTUwgbmFtZXNwYWNlIFVSSXMgYmVjb21lIHBhY2thZ2UgbmFtZXMgZm9yIFhNTEJlYW4gdHlwZXMgZ2VuZXJhdGVkIAotICAgICAgZnJvbSB0aGUgc2NoZW1hLiBUaGUgd2F5IHRoaXMgbmFtZSB0cmFuc2xhdGlvbiBpcyBkb25lIGlzIGRlc2NyaWJlZCBieSBzZWN0aW9uIAotICAgICAgQyBvZiB0aGUgSmF2YSBBUEkgZm9yIFhNTCBCaW5kaW5nIChKQVhCKSBzcGVjaWZpY2F0aW9uIGF0IDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2Rvd25sb2Fkcy9qYXhiLmh0bWwiIHRhcmdldD0iX2JsYW5rIj4gCi0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiLmh0bWwuPC9hPiA8L3A+Ci0gICAgPHA+SGVyZSBhcmUgYSBmZXcgZXhhbXBsZXM6PC9wPgotICAgIDx0YWJsZT4KLSAgICAgIDx0cj4gCi0gICAgICAgIDx0ZD48c3Ryb25nPlNjaGVtYSBUYXJnZXQgTmFtZXNwYWNlPC9zdHJvbmc+PC90ZD4KLSAgICAgICAgPHRkIHdpZHRoPSIxNTUiPjxzdHJvbmc+WE1MIExvY2FsbmFtZTwvc3Ryb25nPjwvdGQ+Ci0gICAgICAgIDx0ZD48c3Ryb25nPkZ1bGx5LVF1YWxpZmllZCBYTUxCZWFuIFR5cGUgTmFtZTwvc3Ryb25nPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPiAKLSAgICAgICAgPHRkPmh0dHA6Ly93d3cubXljb21wYW55LmNvbS8yMDAyL2J1eWVyPC90ZD4KLSAgICAgICAgPHRkIHdpZHRoPSIxNTUiPnB1cmNoYXNlLW9yZGVyLTQ8L3RkPgotICAgICAgICA8dGQ+Y29tLm15Y29tcGFueS54MjAwMi5idXllci5QdXJjaGFzZU9yZGVyNDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPiAKLSAgICAgICAgPHRkPmh0dHA6Ly9teWNvLmNvbS9zYW1wbGUuaHRtbDwvdGQ+Ci0gICAgICAgIDx0ZCB3aWR0aD0iMTU1Ij5TYW1wbGVEb2N1bWVudDwvdGQ+Ci0gICAgICAgIDx0ZD5jb20ubXljby5zYW1wbGUuU2FtcGxlRG9jdW1lbnQ8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4gCi0gICAgICAgIDx0ZD5odHRwOi8vb3BlbnVyaS5vcmcvdGVzdF9jYXNlXzE8L3RkPgotICAgICAgICA8dGQgd2lkdGg9IjE1NSI+dGVzdF90eXBlPC90ZD4KLSAgICAgICAgPHRkPm9yZy5vcGVudXJpLnRlc3RDYXNlMS5UZXN0VHlwZTwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPHA+V2hlbiB0aGVyZSBhcmUgbmFtZSBjb2xsaXNpb25zLCB0aGUgZ2VuZXJhdGVkIHR5cGVzIHdpbGwgaGF2ZSBuYW1lcyB3aXRoIAotICAgICAgbnVtZXJhbHMgYXBwZW5kZWQmbmJzcDuXIGZvciBleGFtcGxlLCAiVGVzdFR5cGUyIi48L3A+Ci0gICAgPGgyPkdsb2JhbCBFbGVtZW50cyBhbmQgQXR0cmlidXRlczwvaDI+Ci0gICAgPHA+SW4gc2NoZW1hLCBnbG9iYWwgZWxlbWVudCBhbmQgYXR0cmlidXRlIGRlZmluaXRpb25zIGFyZSB0aG9zZSB0aGF0IGFyZSAKLSAgICAgIGRlY2xhcmVkIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHNjaGVtYSAodGhhdCBpcywgaW1tZWRpYXRlbHkgd2l0aGluIHRoZSAKLSAgICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zY2hlbWE8L3NwYW4+IHJvb3QgZWxlbWVudCkuIEJlY2F1c2UgdGhleSBhcmUgZ2xvYmFsLCAKLSAgICAgIHRoZXkgbWF5IGJlIHJlZmVyZW5jZWQgZnJvbSBpbnNpZGUgdGhlIHNjaGVtYSBieSBuYW1lLiBUaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmNyZWRpdFJlcG9ydDwvc3Bhbj4gCi0gICAgICAobm90IHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Y3JlZGl0UmVwb3J0VHlwZTwvc3Bhbj4gY29tcGxleCB0eXBlKSAKLSAgICAgIGVsZW1lbnQgZGVmaW5lZCBpbiB0aGUgZm9sbG93aW5nIHNjaGVtYSBpcyBhbiBleGFtcGxlLjwvcD4KLSAgICA8cHJlPgotJmx0O3hzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9JnF1b3Q7aHR0cDovL29wZW51cmkub3JnL3NhbXBsZXMvY3JlZGl0UmVwb3J0JnF1b3Q7IAotICAgIHhtbG5zOmNyPSZxdW90O2h0dHA6Ly9vcGVudXJpLm9yZy9zYW1wbGVzL2NyZWRpdFJlcG9ydCZxdW90OyAKLSAgICB4bWxuczp4cz0mcXVvdDtodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSZxdW90OwotICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0mcXVvdDtxdWFsaWZpZWQmcXVvdDsKLSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0mcXVvdDt1bnF1YWxpZmllZCZxdW90OyZndDsKLSAgICAmbHQ7eHM6Y29tcGxleFR5cGUgbmFtZT0mcXVvdDtjcmVkaXRSZXBvcnRUeXBlJnF1b3Q7Jmd0OwotICAgICAgICAmbHQ7eHM6c2VxdWVuY2UmZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O2JhbmtSZXBvcnQmcXVvdDsgdHlwZT0mcXVvdDt4czpzdHJpbmcmcXVvdDsvJmd0OwotICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0mcXVvdDt0YXhSZXBvcnQmcXVvdDsgdHlwZT0mcXVvdDt4czpzdHJpbmcmcXVvdDsvJmd0OwotICAgICAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OwotICAgICZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7Ci0gICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0mcXVvdDtjcmVkaXRSZXBvcnQmcXVvdDsgdHlwZT0mcXVvdDtjcjpjcmVkaXRSZXBvcnRUeXBlJnF1b3Q7LyZndDsKLSZsdDsveHM6c2NoZW1hJmd0OzwvcHJlPgotICAgIDxwPlhNTEJlYW5zIGdlbmVyYXRlcyBhIHNlcGFyYXRlIGludGVyZmFjZSBmb3IgZWFjaCBvZiB0aGVzZS4gQWxzbywgZ2xvYmFsIAotICAgICAgZWxlbWVudCBhbmQgYXR0cmlidXRlIHR5cGVzIGFyZSBzb21ld2hhdCB1bmlxdWUgaW4gdGhhdCB0aGUgc2NoZW1hIGNvbXBpbGVyIAotICAgICAgd2lsbCBjcmVhdGUgc3BlY2lhbCB0eXBlcyB0byBob2xkIHRoZSBnbG9iYWxseSBkZWZpbmVkIGVsZW1lbnQgb3IgYXR0cmlidXRlLiAKLSAgICAgIFRoZSBuYW1lcyBvZiB0aGVzZSB0eXBlcyB3aWxsIGJlIGFwcGVuZGVkIHdpdGggJnF1b3Q7RG9jdW1lbnQmcXVvdDsgKGZvciAKLSAgICAgIGVsZW1lbnRzKSBvciAmcXVvdDtBdHRyaWJ1dGUmcXVvdDsgKGZvciBhdHRyaWJ1dGVzKS4gWW91IGNhbiByZXRyaWV2ZSB0aGUgCi0gICAgICBlbGVtZW50IG9yIGF0dHJpYnV0ZSBpdHNlbGYgKG9yIGNyZWF0ZSBhIG5ldyBvbmUpIGJ5IGNhbGxpbmcgdGhlIGFjY2Vzc29yIAotICAgICAgbWV0aG9kcyB0aGF0IHRoZSBzcGVjaWFsIHR5cGVzIHByb3ZpZGUuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSB3b3VsZCBjcmVhdGUgCi0gICAgICBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY3JlZGl0UmVwb3J0IGVsZW1lbnQuPC9wPgotICAgIDxwcmU+Ci0vLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHNwZWNpYWwgZG9jdW1lbnQgdHlwZS4KLUNyZWRpdFJlcG9ydERvY3VtZW50IHJlcG9ydERvYyA9IENyZWRpdFJlcG9ydERvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLS8qCi0gKiBVc2UgdGhlIGRvY3VtZW50IHR5cGUgdG8gYWRkIGEgbmV3IGNyZWRpdFJlcG9ydCBlbGVtZW50IHRvIHRoZSBYTUwgaW5zdGFuY2UuCi0gKiBOb3RlIHRoYXQgdGhlIHR5cGUgcmV0dXJuZWQgYnkgdGhlIGFkZE5ld0NyZWRpdFJlcG9ydCBtZXRob2QgaXMgdGhlIAotICogY3JlZGl0UmVwb3J0VHlwZSBjb21wbGV4IHR5cGUgZGVmaW5lZCBmb3IgaXQgaW4gc2NoZW1hLgotICovCi1DcmVkaXRSZXBvcnRUeXBlIHJlcG9ydCA9IHJlcG9ydERvYy5hZGROZXdDcmVkaXRSZXBvcnQoKTsKLTwvcHJlPgotICAgIDxoMj5HbG9iYWwgVXNlci1EZXJpdmVkIFR5cGVzPC9oMj4KLSAgICA8cD5BIDxlbT51c2VyLWRlcml2ZWQ8L2VtPiB0eXBlIGlzIG9uZSBkZWZpbmVkIHdpdGggYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Y29tcGxleFR5cGU8L3NwYW4+IAotICAgICAgb3IgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNpbXBsZVR5cGU8L3NwYW4+IGVsZW1lbnQgaW4gc2NoZW1hLiBVc2VyLWRlcml2ZWQgCi0gICAgICB0eXBlcyBhdCB0aGUgdG9wIGxldmVsIG9mIGEgc2NoZW1hIGFyZSBnbG9iYWwuIFhNTEJlYW5zIGdlbmVyYXRlcyBhbiBpbnRlcmZhY2UgCi0gICAgICBmb3IgZWFjaCBvZiB0aGVzZSwgYXMgaXQgZG9lcyB3aXRoIGdsb2JhbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcy4gVGhlc2UgCi0gICAgICBpbnRlcmZhY2VzIGluY2x1ZGUgbWV0aG9kcyB0aHJvdWdoIHdoaWNoIHlvdSBjYW4gZ2V0IGFuZCBzZXQgdGhlIHR5cGUncyAKLSAgICAgIHZhbHVlcywgaW5jbHVkaW5nIGFueSBuZXN0ZWQgZGVyaXZlZCB0eXBlcyBpdCBtYXkgY29udGFpbi4gVGhlIGZvbGxvd2luZyAKLSAgICAgIHNjaGVtYSBzbmlwcGV0IGRlZmluZXMgYSB1c2VyLWRlcml2ZWQgY29tcGxleCB0eXBlIGNhbGxlZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aXRlbVR5cGU8L3NwYW4+LCAKLSAgICAgIGFsb25nIHdpdGggYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHJpY2VUeXBlPC9zcGFuPiB0aGF0IHVzZXMgaXQgYXMgdGhlIAotICAgICAgdHlwZSBmb3IgYW4gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPml0ZW08L3NwYW4+IGNoaWxkIGVsZW1lbnQuPC9wPgotICAgIDxwcmU+Ci0mbHQ7eHM6Y29tcGxleFR5cGUgbmFtZT0mcXVvdDtpdGVtVHlwZSZxdW90OyZndDsKLSAgICAmbHQ7eHM6c2VxdWVuY2UmZ3Q7Ci0gICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9JnF1b3Q7bmFtZSZxdW90OyB0eXBlPSZxdW90O3hzOnN0cmluZyZxdW90Oy8mZ3Q7Ci0gICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9JnF1b3Q7YW1vdW50JnF1b3Q7IHR5cGU9JnF1b3Q7eHM6aW50JnF1b3Q7LyZndDsKLSAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0mcXVvdDtwcmljZSZxdW90OyB0eXBlPSZxdW90O3hzOmRvdWJsZSZxdW90Oy8mZ3Q7Ci0gICAgJmx0Oy94czpzZXF1ZW5jZSZndDsKLSZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7Ci0mbHQ7eHM6Y29tcGxleFR5cGUgbmFtZT0mcXVvdDtwcmljZVR5cGUmcXVvdDsmZ3Q7Ci0gICAgJmx0O3hzOnNlcXVlbmNlJmd0OwotICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O2l0ZW0mcXVvdDsgdHlwZT0mcXVvdDtwczppdGVtVHlwZSZxdW90OyBtaW5PY2N1cnM9JnF1b3Q7MCZxdW90OyBtYXhPY2N1cnM9JnF1b3Q7dW5ib3VuZGVkJnF1b3Q7LyZndDsKLSAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OwotJmx0Oy94czpjb21wbGV4VHlwZSZndDsKLSZsdDt4czplbGVtZW50IG5hbWU9JnF1b3Q7cHJpY2UmcXVvdDsgdHlwZT0mcXVvdDtwczpwcmljZVR5cGUmcXVvdDsvJmd0OwotPC9wcmU+Ci0gICAgPHA+QnkgZGVmYXVsdCwgdGhlIGdlbmVyYXRlZCBKYXZhIHR5cGUgZm9yIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pdGVtVHlwZTwvc3Bhbj4gCi0gICAgICB3b3VsZCBiZSBhbiBpbnRlcmZhY2UgY2FsbGVkIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5JdGVtVHlwZTwvc3Bhbj4uIFdpdGggCi0gICAgICB0aGlzIHR5cGUsIHlvdSB3b3VsZCBiZSBhYmxlIHRvIGdldCBhbmQgc2V0IHRoZSB2YWx1ZXMgb2YgaXRzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5uYW1lPC9zcGFuPiwgCi0gICAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+YW1vdW50PC9zcGFuPiwgYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wcmljZTwvc3Bhbj4gCi0gICAgICBjaGlsZCBlbGVtZW50cy4gSG93ZXZlciwgYSB1c2VyLWRlcml2ZWQgdHlwZSAoYXMgb3Bwb3NlZCB0byBhbiBlbGVtZW50IG9yIAotICAgICAgYXR0cmlidXRlKSBpcyBhbHdheXMgaW50ZW5kZWQgZm9yIHVzZSBhcyB0aGUgdHlwZSB0byB3aGljaCBhbiBlbGVtZW50IG9yIAotICAgICAgYXR0cmlidXRlIGlzIGJvdW5kLiBJbiBvdGhlciB3b3JkcywgaXQncyBjb250YWluZWQgYnkgYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUuIAotICAgICAgV2hpbGUgeW91IGNhbiBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSB1c2VyLWRlcml2ZWQgdHlwZSwgdGhlIG5ldyBpbnN0YW5jZSdzIAotICAgICAgdW5kZXJseWluZyBYTUwgaXMgYSBmcmFnbWVudC4gQXMgdGhlIGdlbmVyYXRlZCBBUEkgd291bGQgbWFrZSBjbGVhciwgdGhlIAotICAgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPml0ZW1UeXBlPC9zcGFuPiBiZWNvbWVzIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdldCAKLSAgICAgIG1ldGhvZCwgb3IgdGhlIHBhcmFtZXRlciBvZiBhIHNldCBtZXRob2QuPC9wPgotICAgIDxwcmU+Ci0vLyBDcmVhdGUgYSBuZXcgcHJpY2UgZG9jdW1lbnQuCi1QcmljZURvY3VtZW50IHByaWNlRG9jID0gUHJpY2VEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci1QcmljZVR5cGUgcHJpY2UgPSBwcmljZURvYy5nZXRQcmljZSgpOwotCi0vKiAKLSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBJdGVtVHlwZSBhbmQgc2V0IHRoZSB2YWx1ZXMgb2YgaXRzCi0gKiBjaGlsZCBlbGVtZW50cy4KLSAqLwotSXRlbVR5cGUgaXRlbSA9IEl0ZW1UeXBlLkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLWl0ZW0uc2V0TmFtZSgmcXVvdDtiaWN5Y2xlJnF1b3Q7KTsKLWl0ZW0uc2V0QW1vdW50KDEyKTsKLWl0ZW0uc2V0UHJpY2UoNTYwLjAwKTsKLQotLyogCi0gKiBVc2UgdGhlIG5ldyBJdGVtVHlwZSBpbnN0YW5jZSB0byBzZXQgdGhlIHZhbHVlIG9mIHRoZSAKLSAqIHByaWNlIGVsZW1lbnQncyBmaXJzdCBpdGVtIGNoaWxkIGVsZW1lbnQuIE5vdGljZSB0aGF0IHRoZSBzZXQgbWV0aG9kCi0gKiBoZXJlIGlzIGFuICJBcnJheSIgbWV0aG9kLiBUaGlzIGlzIGJlY2F1c2UgdGhlIGl0ZW0gZWxlbWVudAotICogaXMgZGVmaW5lZCB3aXRoIGEgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIGF0dHJpYnV0ZS4gSXQgY2FuIG9jY3VyCi0gKiBtYW55IHRpbWVzIGFzIGEgY2hpbGQgb2YgcHJpY2UuCi0gKi8KLXByaWNlLnNldEl0ZW1BcnJheSgwLCBpdGVtKTsKLTwvcHJlPgotICAgIDxoMj5OZXN0ZWQgRWxlbWVudHMgYW5kIERlcml2ZWQgVHlwZXM8L2gyPgotICAgIDxwPldoZW4geW91ciBzY2hlbWEgaW5jbHVkZXMgbmFtZWQgdHlwZXMgdGhhdCBhcmUgZGVjbGFyZWQgbG9jYWxseZd3aXRoaW4gCi0gICAgICB0aGUgZGVjbGFyYXRpb24gb2YgYW5vdGhlciBlbGVtZW50IG9yIHR5cGWXdGhlIHNjaGVtYSB0eXBlJ3MgZ2VuZXJhdGVkIEphdmEgCi0gICAgICBpbnRlcmZhY2Ugd2lsbCBiZSBhbiBpbm5lciBpbnRlcmZhY2Ugd2l0aGluIHRoZSB0eXBlIGl0J3MgbmVzdGVkIGluLjwvcD4KLSAgICA8cD5Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzY2hlbWEgc25pcHBldCBkZWZpbmVzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5uYW1lPC9zcGFuPiAKLSAgICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Z2VuZGVyPC9zcGFuPiBlbGVtZW50cyBuZXN0ZWQgd2l0aGluIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBlcnNvbjwvc3Bhbj4gCi0gICAgICBjb21wbGV4IHR5cGUuIEluIHBhcnRpY3VsYXIsIG5vdGUgdGhhdCB0aGUgZ2VuZGVyIGVsZW1lbnQgaXMgZGVmaW5lZCBhcyAKLSAgICAgIGRlcml2aW5nIGZyb20gdGhlIHhzOk5NVE9LRU4gYnVpbHQtaW4gdHlwZS48L3A+Ci0gICAgPHByZT4KLSZsdDt4czpjb21wbGV4VHlwZSBuYW1lPSJwZXJzb24iJmd0OwotICAgICZsdDt4czpzZXF1ZW5jZSZndDsKLSAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8mZ3Q7Ci0gICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9ImdlbmRlciImZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHM6c2ltcGxlVHlwZSZndDsKLSAgICAgICAgICAgICAgICAmbHQ7eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiImZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICZsdDt4czplbnVtZXJhdGlvbiB2YWx1ZT0ibWFsZSIvJmd0OwotICAgICAgICAgICAgICAgICAgICAmbHQ7eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZlbWFsZSIvJmd0OwotICAgICAgICAgICAgICAgICZsdDsveHM6cmVzdHJpY3Rpb24mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3hzOnNpbXBsZVR5cGUmZ3Q7Ci0gICAgICAgICZsdDsveHM6ZWxlbWVudCZndDsKLSAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OwotJmx0Oy94czpjb21wbGV4VHlwZSZndDsKLTwvcHJlPgotICAgIDxwPlRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlcyBmb3IgcGVyc29uIGFuZCBnZW5kZXIgd291bGQgYmUgb3JnYW5pemVkIGluIHNvdXJjZSAKLSAgICAgIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcuIE9mIGNvdXJzZSwgeW91IHdvdWxkbid0IHNlZSB0aGUgc291cmNlLCBidXQgCi0gICAgICB5b3UgY2FuIHNlZSBoZXJlIHRoYXQgdGhlIEdlbmRlciBpbnRlcmZhY2UgaXMgbmVzdGVkIHdpdGggUGVyc29uLiBBbHNvLCAKLSAgICAgIG5vdGljZSB0aGF0IGl0IGV4dGVuZHMgWG1sTk1UT0tFTiwgbWlycm9yaW5nIHRoZSBzY2hlbWEuPC9wPgotICAgIDxwcmU+cHVibGljIGludGVyZmFjZSBQZXJzb24gZXh0ZW5kcyBYbWxPYmplY3QKLXsKLSAgICBwdWJsaWMgaW50ZXJmYWNlIEdlbmRlciBleHRlbmRzIFhtbE5NVE9LRU4KLSAgICB7Ci0gICAgICAgIC8vIE1ldGhvZHMgb21pdHRlZCBmb3IgdGhpcyBleGFtcGxlCi0gICAgfQotICAgIC8vIE1ldGhvZHMgb21pdHRlZCBmb3IgdGhpcyBleGFtcGxlCi19Ci08L3ByZT4KLSAgICA8cD5Zb3UgY291bGQgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+R2VuZGVyPC9zcGFuPiAKLSAgICAgIHR5cGUgaW4gdGhpcyB3YXkgKHRoZXJlIGFyZSBhbHNvIHZhcmlvdXMgYWx0ZXJuYXRpdmVzIHRvIHRoaXMpOjwvcD4KLSAgICA8cHJlPgotLy8gQ3JlYXRlIGEgbmV3IFBlcnNvbiBpbnN0YW5jZS4KLVBlcnNvbiBwZXJzb24gPSBQZXJzb24uRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotLyoKLSAqIFNldCB0aGUgZ2VuZGVyIGVsZW1lbnQncyB2YWx1ZSB1c2luZyB0aGUgCi0gKiBlbnVtZXJhdGlvbiBnZW5lcmF0ZWQgZnJvbSB0aGUgc2NoZW1hLgotICovCi1wZXJzb24uc2V0R2VuZGVyKEdlbmRlci5GRU1BTEUpOzwvcHJlPgotICAgIDxoMj5Vc2VyLURlcml2ZWQgU2ltcGxlIFR5cGVzPC9oMj4KLSAgICA8cD5JbiBhZGRpdGlvbiB0byB0aGUgNDYgYnVpbHQtaW4gc2ltcGxlIHR5cGVzIGluIFhNTCBzY2hlbWEsIGEgc2NoZW1hIGNhbiAKLSAgICAgIGluY2x1ZGUgaXRzIG93biBjdXN0b20gc2ltcGxlIHR5cGVzIHVzaW5nIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czpzaW1wbGVUeXBlPC9zcGFuPiAKLSAgICAgIGRlY2xhcmF0aW9ucy4gVGhlc2UgdXNlci1kZXJpdmVkIHNpbXBsZSB0eXBlcyBhcmUgYWx3YXlzIGJhc2VkIG9uIHRoZSBidWlsdC1pbiAKLSAgICAgIFhNTCBzY2hlbWEgdHlwZXMuIFRoZSBidWlsdC1pbiB0eXBlcyBjYW4gYmUgbW9kaWZpZWQgYnkgPGVtPnJlc3RyaWN0aW5nPC9lbT4gCi0gICAgICB0aGVtLCB0YWtpbmcgPGVtPnVuaW9uczwvZW0+IG9mIHRoZW0sIG9yIG1ha2luZyBzcGFjZS1zZXBhcmF0ZWQgPGVtPmxpc3RzPC9lbT4gCi0gICAgICBvZiB0aGVtLiBFYWNoIFhNTCBzaW1wbGUgdHlwZSBpcyB0cmFuc2xhdGVkIGludG8gYSBKYXZhIHR5cGUgdGhhdCBwcm92aWRlcyAKLSAgICAgIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBkYXRhLjwvcD4KLSAgICA8aDM+VW5pb25zPC9oMz4KLSAgICA8cD5JbiBzY2hlbWEsIHlvdSBjYW4gdXNlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czp1bmlvbjwvc3Bhbj4gdG8gc3BlY2lmeSAKLSAgICAgIGEgc2ltcGxlIHR5cGUgdGhhdCBpcyBhbGxvd2VkIHRvIGNvbnRhaW4gdmFsdWVzIG9mIGEgbnVtYmVyIG9mIG90aGVyIHNpbXBsZSAKLSAgICAgIHR5cGVzLiBYTUxCZWFucyBnZW5lcmF0ZXMgYSB0eXBlIGZvciBhIHVuaW9uLCBqdXN0IGFzIGl0IGdlbmVyYXRlcyBhIHR5cGUgCi0gICAgICBmb3IgYW55IG90aGVyIHNjaGVtYSB0eXBlLiBBdCBydW4gdGltZSwgeW91IGNhbiBkaXNjb3ZlciB0aGUgdW5kZXJseWluZyAKLSAgICAgIHR5cGUgb2YgYW4gaW5zdGFuY2Ugb2YgYSB1bmlvbiB0eXBlIGJ5IGNhbGxpbmcgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+IAotICAgICAgaW50ZXJmYWNlJ3MgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmluc3RhbmNlVHlwZTwvc3Bhbj4gbWV0aG9kLiBPbmNlIHlvdSAKLSAgICAgIGhhdmUgZGV0ZXJtaW5lZCB0aGUgdHlwZSwgeW91IGNhbiBjYXN0IGFuIGluc3RhbmNlIG9mIGEgdW5pb24gdHlwZSB0byB0aGUgCi0gICAgICBhY3R1YWwgdW5kZXJseWluZyBpbnN0YW5jZSB0eXBlLjwvcD4KLSAgICA8cHJlPgotJmx0O3hzOnNpbXBsZVR5cGUgbmFtZT0mcXVvdDtpbnRPclN0cmluZyZxdW90OyZndDsKLSAgICAmbHQ7eHM6dW5pb24gbWVtYmVyVHlwZXM9JnF1b3Q7eHM6aW50IHhzOnN0cmluZyZxdW90OyZndDsKLSZsdDsveHM6c2ltcGxlVHlwZSZndDsKLTwvcHJlPgotICAgIDxwPkdpdmVuIHRoZSBwcmVjZWRpbmcgc2NoZW1hIHNuaXBwZXQsIHlvdSBjb3VsZCBzZXQgdGhlIGludE9yU3RyaW5nIHZhbHVlIAotICAgICAgdG8sIHNheSwgNiBvciAmcXVvdDtzaXgmcXVvdDsuIFRoZSB1bmlvbiBvZiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6aW50PC9zcGFuPiAKLSAgICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6c3RyaW5nPC9zcGFuPiBtYWtlcyBib3RoIGFsbG93YWJsZS48L3A+Ci0gICAgPHByZT4KLS8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdHlwZS4KLUludE9yU3RyaW5nIGludE9yU3RyaW5nID0gSW50T3JTdHJpbmcuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotaW50T3JTdHJpbmcuc2V0KCZxdW90OzUmcXVvdDspOwotLy8gVGhpcyBjb2RlIHByaW50cyAiWG1sSW50IiB0byB0aGUgY29uc29sZS4KLVN5c3RlbS5vdXQucHJpbnRsbihpbnRPclN0cmluZy5pbnN0YW5jZVR5cGUoKS5nZXRTaG9ydEphdmFOYW1lKCkpOwotPC9wcmU+Ci0gICAgPGgzPlJlc3RyaWN0aW9uczwvaDM+Ci0gICAgPHA+WE1MIHNjaGVtYSByZXN0cmljdGlvbnMgb24gc2ltcGxlIFhNTEJlYW5zIHR5cGVzIGFyZSBlbmZvcmNlZC4gU28sIGZvciAKLSAgICAgIGV4YW1wbGUsIGl0IGlzIGlsbGVnYWwgdG8gc2V0IGEgbnVtYmVyIG91dHNpZGUgaXRzIHJlc3RyaWN0ZWQgcmFuZ2UuIDwvcD4KLSAgICA8aDQ+TnVtZXJpYyBUeXBlIFJlc3RyaWN0aW9uczwvaDQ+Ci0gICAgPHA+SW4gc2NoZW1hLCB5b3UgY2FuIHJlc3RyaWN0IG51bWVyaWMgdHlwZXMgdG8gYWxsb3csIGZvciBleGFtcGxlLCBvbmx5IGEgCi0gICAgICBwYXJ0aWN1bGFyIHJhbmdlIG9mIHZhbHVlcy4gRm9yIHN1Y2ggYSByZXN0cmljdGlvbiwgWE1MQmVhbnMgdGFpbG9ycyB0aGUgCi0gICAgICByZXN1bHRpbmcgbmF0dXJhbCBKYXZhIGFsdGVybmF0aXZlLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIAotICAgICAgZWxlbWVudCBkZWZpbmVkIGluIHNjaGVtYTo8L3A+Ci0gICAgPHByZT4KLSZsdDt4czplbGVtZW50IG5hbWU9Im51bWJlciImZ3Q7Ci0gICAgJmx0O3hzOnNpbXBsZVR5cGUmZ3Q7Ci0gICAgICAgICZsdDt4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnRlZ2VyIiZndDsKLSAgICAgICAgICAgICZsdDt4czptaW5JbmNsdXNpdmUgdmFsdWU9IjEiLyZndDsKLSAgICAgICAgICAgICZsdDt4czptYXhJbmNsdXNpdmUgdmFsdWU9IjEwMDAwMDAiLyZndDsKLSAgICAgICAgJmx0Oy94czpyZXN0cmljdGlvbiZndDsKLSAgICAmbHQ7L3hzOnNpbXBsZVR5cGUmZ3Q7Ci0mbHQ7L3hzOmVsZW1lbnQmZ3Q7Ci08L3ByZT4KLSAgICA8cD5UaGUgdHlwZSBpcyByZXN0cmljdGVkIGZyb20gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOmludGVnZXI8L3NwYW4+LCAKLSAgICAgIGJ1dCBiZWNhdXNlIHRoZSBudW1iZXIncyByYW5nZSBpcyBsaW1pdGVkIHRvIGJldHdlZW4gMSBhbmQgMTAwMDAwMCwgaXQgd2lsbCAKLSAgICAgIGZpdCBpbnRvIGEgSmF2YSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aW50PC9zcGFuPi4gQSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bG9uZzwvc3Bhbj4gCi0gICAgICBvciA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+amF2YS5tYXRoLkJpZ0ludGVnZXI8L3NwYW4+IHdvdWxkIGJlIHRvbyBiaWcgCi0gICAgICBmb3IgdGhlIG5lZWQuIEluIG90aGVyIHdvcmRzLCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmdldE51bWJlcjwvc3Bhbj4gCi0gICAgICBtZXRob2QgZ2VuZXJhdGVkIGZvciB0aGlzIHR5cGUgd2lsbCByZXR1cm4gYW4gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmludDwvc3Bhbj4sIAotICAgICAgcmF0aGVyIHRoYW4gYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+QmlnSW50ZWdlcjwvc3Bhbj4gb3IgYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bG9uZzwvc3Bhbj4uPC9wPgotICAgIDxwPkJ5IHRoZSBzYW1lIHRva2VuLCBhbiBsb25nIGNhbiBiZSBjb21waWxlZCB0byBhbiBpbnQgaWYgdGhlIHRvdGFsRGlnaXRzIAotICAgICAgYXR0cmlidXRlIGlzICZsdDs9OSwgb3IgdGhlIG1pbiBhbmQgbWF4IGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIHdpdGhpbiAzMi1iaXQgCi0gICAgICAycyBjb21wbGVtZW50IHJhbmdlLjwvcD4KLSAgICA8cD5UaGUgc2luZ2xlIHByaW1pdGl2ZSBYTUwgdHlwZSB4czpkZWNpbWFsIGNhbiBiZSByZXN0cmljdGVkIGluIHNldmVyYWwgd2F5cyAKLSAgICAgIHRoYXQgaW5mbHVlbmNlIHRoZSByZXN1bHRpbmcgbmF0dXJhbCBKYXZhIHR5cGUuIEZvciBleGFtcGxlLCBpdCBjYW4gYmU6PC9wPgotICA8L2Rpdj4KLTwvZGl2PgotPHVsPgotICA8bGk+Ci0gICAgPGRpdj4KLSAgICAgIDxkaXY+Q29tcGlsZWQgdG8gYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+QmlnSW50ZWdlcjwvc3Bhbj4gaWYgaXRzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5mcmFjdGlvbkRpZ2l0PC9zcGFuPiAKLSAgICAgICAgYXR0cmlidXRlIGlzIHNldCB0byAwLiA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxkaXY+Ci0gICAgICA8ZGl2PkNvbXBpbGVkIHRvIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmxvbmc8L3NwYW4+IGlmIGl0cyB0b3RhbERpZ2l0cyAKLSAgICAgICAgYXR0cmlidXRlIGlzICZsdDs9MTgsIG9yIHRoZSBtaW4gYW5kIG1heCBhcmUgd2l0aGluIDY0LWJpdCAycyBjb21wbGVtZW50IAotICAgICAgICByYW5nZS48L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9saT4KLTwvdWw+Ci08ZGl2PgotICA8ZGl2PgotICAgIDxoMz5FbnVtZXJhdGlvbnM8L2gzPgotICAgIDxwPkluIHNjaGVtYSwgeW91IGNhbiBkZXJpdmUgYSBuZXcgdHlwZSBieSByZXN0cmljdGluZyBhIGJ1aWx0LWluIHR5cGUgc28gCi0gICAgICB0aGF0IG9ubHkgYSBmaW5pdGUgc2V0IG9mIHZhbHVlcyBhcmUgYWxsb3dhYmxlLiBXaGVyZSBzY2hlbWEgZG9lcyB0aGlzIGJ5IAotICAgICAgcmVzdHJpY3RpbmcgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOnN0cmluZzwvc3Bhbj4sIFhNTEJlYW5zIGdlbmVyYXRlcyAKLSAgICAgIGEgc3BlY2lhbCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+RW51bTwvc3Bhbj4gdHlwZS4gV2l0aCBhbiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+RW51bTwvc3Bhbj4sIAotICAgICAgeW91IGNhbiBzZWxlY3QgdGhlIGVudW1lcmF0ZWQgdmFsdWUgZWl0aGVyIGJ5IGl0cyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+U3RyaW5nPC9zcGFuPiAKLSAgICAgIHZhbHVlIG9yIGJ5IGEgbnVtZXJpYyBpbmRleC4gVGhlIGluZGV4J3MgdmFsdWUgaXMgZGV0ZXJtaW5lZCBiYXNlZCBvbiB0aGUgCi0gICAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+U3RyaW5nPC9zcGFuPiB2YWx1ZSdzIG9yZGVyIGluIHRoZSBzY2hlbWEuIEhhdmluZyAKLSAgICAgIGFuIGluZGV4IGNhbiBiZSB1c2VmdWwgaW4gSmF2YSBzd2l0Y2ggc3RhdGVtZW50cy48L3A+Ci0gICAgPHA+Rm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhZCBhIGRvY3VtZW50IGNvbnRhaW5pbmcgcHJpY2UgZWxlbWVudHMgd2hvc2UgCi0gICAgICB0eXBlIHdhcyB0aGUgcHJpY2VUeXBlIGRlZmluZWQgaW4gdGhlIGZvbGxvd2luZyBzY2hlbWEgc25pcHBldDo8L3A+Ci0gICAgPHByZT4mbHQ7eHM6Y29tcGxleFR5cGUgbmFtZT0mcXVvdDtwcmljZVR5cGUmcXVvdDsmZ3Q7Ci0gICAgJmx0O3hzOnNlcXVlbmNlJmd0OwotICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O2l0ZW0mcXVvdDsgdHlwZT0mcXVvdDtwczppdGVtVHlwZSZxdW90OyBtaW5PY2N1cnM9JnF1b3Q7MCZxdW90OyAKLSAgICAgICAgICAgICAgbWF4T2NjdXJzPSZxdW90O3VuYm91bmRlZCZxdW90Oy8mZ3Q7Ci0gICAgJmx0Oy94czpzZXF1ZW5jZSZndDsKLSAgICAmbHQ7eHM6YXR0cmlidXRlIG5hbWU9JnF1b3Q7dGhyZXNob2xkJnF1b3Q7Jmd0OwotICAgICAgICAmbHQ7eHM6c2ltcGxlVHlwZSZndDsKLSAgICAgICAgICAgICZsdDt4czpyZXN0cmljdGlvbiBiYXNlPSZxdW90O3hzOnN0cmluZyZxdW90OyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7eHM6ZW51bWVyYXRpb24gdmFsdWU9JnF1b3Q7QmVsb3cxMERvbGxhcnMmcXVvdDsvJmd0OwotICAgICAgICAgICAgICAgICZsdDt4czplbnVtZXJhdGlvbiB2YWx1ZT0mcXVvdDtCZXR3ZWVuMTBBbmQyMERvbGxhcnMmcXVvdDsvJmd0OwotICAgICAgICAgICAgICAgICZsdDt4czplbnVtZXJhdGlvbiB2YWx1ZT0mcXVvdDtBYm92ZTIwRG9sbGFycyZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3hzOnJlc3RyaWN0aW9uJmd0OwotICAgICAgICAmbHQ7L3hzOnNpbXBsZVR5cGUmZ3Q7Ci0gICAgJmx0Oy94czphdHRyaWJ1dGUmZ3Q7Ci0mbHQ7L3hzOmNvbXBsZXhUeXBlJmd0OzwvcHJlPgotICAgIDxwPlVzaW5nIHR5cGVzIGdlbmVyYXRlZCBmcm9tIHRoZSBzY2hlbWEsIHlvdSB3b3VsZCBiZSBhYmxlIHRvIHdyaXRlIHRoZSBmb2xsb3dpbmcgCi0gICAgICBKYXZhIGNvZGUgdG8gJnF1b3Q7c3dpdGNoJnF1b3Q7IG9uIHRoZSB0aHJlc2hvbGQgYXR0cmlidXRlJ3MgZW51bWVyYXRpb246PC9wPgotICAgIDxwcmU+Ci0vKgotICogVXNlIHRoZSBpbnRWYWx1ZSBtZXRob2QgcHJvdmlkZWQgYnkgdGhlIEVudW0gdHlwZSB0byBkZXRlcm1pbmUgdGhlIHRocmVzaG9sZAotICogYXR0cmlidXRlJ3MgY3VycmVudCBlbnVtZXJhdGlvbiB2YWx1ZS4KLSAqLwotc3dpdGNoKHByaWNlRWxlbWVudHNbaV0uZ2V0VGhyZXNob2xkKCkuaW50VmFsdWUoKSkKLXsKLSAgICAvLyBVc2UgdGhlIFRocmVzaG9sZCB0eXBlJ3MgZW51bWVyYXRpb24gdmFsdWVzIHRvIHRlc3QgZm9yIGFuIGF0dHJpYnV0ZSB2YWx1ZS4gCi0gICAgY2FzZSBQcmljZVR5cGUuVGhyZXNob2xkLklOVF9CRUxPV18xMF9ET0xMQVJTOgotICAgICAgICB6ZXJvQnVmZmVyLmFwcGVuZChpdGVtLmdldFRpdGxlKCkgKyAmcXVvdDtcbiZxdW90Oyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUHJpY2VUeXBlLlRocmVzaG9sZC5JTlRfQkVUV0VFTl8xMF9BTkRfMjBfRE9MTEFSUzoKLSAgICAgICAgdGVuQnVmZmVyLmFwcGVuZChpdGVtLmdldFRpdGxlKCkgKyAmcXVvdDtcbiZxdW90Oyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUHJpY2VUeXBlLlRocmVzaG9sZC5JTlRfQUJPVkVfMjBfRE9MTEFSUzoKLSAgICAgICAgdHdlbnR5QnVmZmVyLmFwcGVuZChpdGVtLmdldFRpdGxlKCkgKyAmcXVvdDtcbiZxdW90Oyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigmcXVvdDtZbyEgU29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuZWQhJnF1b3Q7KTsKLSAgICAgICAgYnJlYWs7Ci19PC9wcmU+Ci0gIDwvZGl2PgotICA8cCBjbGFzcz0icmVsYXRlZHRvcGljcyI+UmVsYXRlZCBUb3BpY3M8L3A+Ci0gIDxwPjxhIGhyZWY9ImNvblhNTEJlYW5zU3VwcG9ydEJ1aWx0SW5TY2hlbWFUeXBlcy5odG1sIj5YTUxCZWFucyBTdXBwb3J0IGZvciAKLSAgICBCdWlsdC1JbiBTY2hlbWEgVHlwZXM8L2E+PC9wPgotPC9kaXY+Ci0gPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0KLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9ndWlkZS9jb25NZXRob2RzRm9yR2VuZXJhdGVkSmF2YVR5cGVzLmh0bWwgYi92MS9kb2NzL2d1aWRlL2Nvbk1ldGhvZHNGb3JHZW5lcmF0ZWRKYXZhVHlwZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUxOTBlMi4uMDAwMDAwMAotLS0gYS92MS9kb2NzL2d1aWRlL2Nvbk1ldGhvZHNGb3JHZW5lcmF0ZWRKYXZhVHlwZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi08IWRvY3R5cGUgSFRNTCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJkb2N0aXRsZSIgLS0+Ci08dGl0bGU+TWV0aG9kcyBmb3IgVHlwZXMgR2VuZXJhdGVkIEZyb20gU2NoZW1hPC90aXRsZT4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4gCi08IS0tKE1ldGEpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JENIQVJTRVQ7Ij4KLQotCi08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJtZXRhdGFncyIgLS0+Ci0KLTxtZXRhIG5hbWU9ImNvbXBvbmVudCIgY29udGVudD0iIj4KLTwhLS0gSW4gdGhlIGRlc2NyaXB0aW9uIG1ldGF0YWcsIHBsZWFzZSBwcm92aWRlIGEgQlJJRUYgZGVzY3JpcHRpb24gb2YgdGhlIHRvcGljIGNvbnRlbnRzLiAtLT4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSIiPgotPCEtLSBJbiB0aGUgY29tcG9uZW50IG1ldGF0YWcsIHBsZWFzZSBsaXN0IGtleXdvcmRzIHRoYXQgd2lsbCBoZWxwIGEgdXNlciBzZWFyY2ggZm9yIHRoaXMgdG9waWMuIC0tPgotPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci0KLTwhLS0oTGlua3MpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJoZWFkIiAtLT4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTxsaW5rIGhyZWY9Ii4uL3htbGJlYW5zLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Ci08YSBocmVmPSIuLi8uLi8uLi9jb3JlL2luZGV4Lmh0bWwiIGlkPSJpbmRleCI+PC9hPgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL3RvcGljSW5mby5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvQ29va2llQ2xhc3MuanMiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL2Rpc3BsYXlDb250ZW50LmpzIj48L3NjcmlwdD4KLTwvaGVhZD4KLQotPCEtLShCb2R5KT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTxib2R5PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0KLTwvc2NyaXB0PgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iYm9keSIgLS0+IAotPGRpdiBpZD10b3BpY3RpdGxlPiAKLSAgPHAgY2xhc3M9VGl0bGU+TWV0aG9kcyBmb3IgVHlwZXMgR2VuZXJhdGVkIEZyb20gU2NoZW1hPC9wPgotPC9kaXY+Ci08ZGl2IGlkPXRvcGljdGV4dD4KLSAgPHA+QXMgeW91IG1heSBoYXZlIHNlZW4gaW4gPGEgaHJlZj0iY29uR2V0dGluZ1N0YXJ0ZWR3aXRoWE1MQmVhbnMuaHRtbCI+R2V0dGluZyAKLSAgICBTdGFydGVkIHdpdGggWE1MQmVhbnM8L2E+LCB5b3UgdXNlIHRoZSB0eXBlcyBnZW5lcmF0ZWQgZnJvbSBzY2hlbWEgdG8gYWNjZXNzIAotICAgIFhNTCBpbnN0YW5jZXMgYmFzZWQgb24gdGhlIHNjaGVtYS4gSWYgeW91J3JlIGZhbWlsaWFyIHdpdGggdGhlIEphdmFCZWFucyB0ZWNobm9sb2d5LCAKLSAgICB0aGUgY29udmVudGlvbnMgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIEFQSSB3aWxsIGJlIHJlY29nbml6YWJsZS4gPC9wPgotICA8cD5JbiBnZW5lcmFsLCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBhcmUgdHJlYXRlZCBhcyAmcXVvdDtwcm9wZXJ0aWVzJnF1b3Q7IAotICAgIGluIHRoZSBKYXZhQmVhbnMgc2Vuc2UuIEluIG90aGVyIHdvcmRzLCBhcyB5b3Ugd291bGQgd2l0aCBKYXZhQmVhbnMgcHJvcGVydGllcywgCi0gICAgeW91IG1hbmlwdWxhdGUgcGFydHMgb2YgdGhlIFhNTCB0aHJvdWdoIGFjY2Vzc29yIG1ldGhvZHMgc3VjaCBhcyBnZXRDdXN0b21lcigpIAotICAgICh3aGVyZSB5b3UgaGF2ZSBhICZxdW90O2N1c3RvbWVyJnF1b3Q7IGVsZW1lbnQpLCBzZXRJZChTdHJpbmcpICh3aGVyZSB5b3UgCi0gICAgaGF2ZSBhbiAmcXVvdDtpZCZxdW90OyBhdHRyaWJ1dGUpLCBhbmQgc28gb24uIEhvd2V2ZXIsIGJlY2F1c2Ugc2NoZW1hIHN0cnVjdHVyZXMgCi0gICAgY2FuIGJlIHNvbWV3aGF0IGNvbXBsZXgsIFhNTEJlYW5zIHByb3ZpZGVzIHNldmVyYWwgb3RoZXIgbWV0aG9kIHN0eWxlcyBmb3IgCi0gICAgaGFuZGxpbmcgdGhvc2Ugc3RydWN0dXJlcyBpbiBYTUwgaW5zdGFuY2VzLjwvcD4KLSAgPGRpdj4KLSAgICA8aDI+UHJvdG90eXBlcyBmb3IgTWV0aG9kcyBpbiBHZW5lcmF0ZWQgSW50ZXJmYWNlczwvaDI+Ci0gICAgPHA+U2V2ZXJhbCBtZXRob2RzIGFyZSBnZW5lcmF0ZWQgZm9yIGVhY2ggZWxlbWVudCBvciBhdHRyaWJ1dGUgd2l0aGluIHRoZSAKLSAgICAgIGNvbXBsZXggdHlwZS4gVGhpcyB0b3BpYyBsaXN0cyBlYWNoIG1ldGhvZCB0aGF0IGNvdWxkIGJlIGdlbmVyYXRlZCBmb3IgYSAKLSAgICAgIGdpdmVuIGVsZW1lbnQgb3IgYXR0cmlidXRlLiA8L3A+Ci0gICAgPHA+Tm90ZSB0aGF0IHdoZXRoZXIgb3Igbm90IGEgZ2l2ZW4gbWV0aG9kIGlzIGdlbmVyYXRlZCBpcyBiYXNlZCBvbiBob3cgdGhlIAotICAgICAgZWxlbWVudCBvciBhdHRyaWJ1dGUgaXMgZGVmaW5lZCBpbiBzY2hlbWEuIEZvciBleGFtcGxlLCBhIGN1c3RvbWVyIGVsZW1lbnQgCi0gICAgICBkZWZpbml0aW9uIHdpdGggYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bWF4T2NjdXJzPC9zcGFuPiBhdHRyaWJ1dGUgdmFsdWUgCi0gICAgICBvZiAxIHdpbGwgcmVzdWx0IGluIGEgZ2V0Q3VzdG9tZXIgbWV0aG9kLCBidXQgbm90IGEgZ2V0Q3VzdG9tZXJBcnJheSBtZXRob2QgCi0gICAgICAmIzgyMTI7IGFmdGVyIGFsbCwgb25seSBvbmUgY3VzdG9tZXIgZWxlbWVudCBpcyBwb3NzaWJsZSBpbiBhbiBpbnN0YW5jZSAKLSAgICAgIGRvY3VtZW50LjwvcD4KLSAgICA8cD5Ob3RlLCB0b28sIHRoYXQgdGhlcmUgbWF5IGJlIHR3byBzZXRzIG9mIHBhcmFsbGVsIG1ldGhvZHM6IG9uZSB3aG9zZSBwcm90b3R5cGUgCi0gICAgICBzdGFydHMgd2l0aCBhbiAmcXVvdDt4JnF1b3Q7LiBBbiAmcXVvdDt4JnF1b3Q7IG1ldGhvZCBzdWNoIGFzIHhnZXROYW1lIG9yIAotICAgICAgeHNldE5hbWUgd291bGQgYmUgZ2VuZXJhdGVkIGZvciBlbGVtZW50cyBvciBhdHRyaWJ1dGUgd2hvc2UgdHlwZSBpcyBhIHNpbXBsZSAKLSAgICAgIHR5cGUuIEEgc2ltcGxlIHR5cGUgbWF5IGJlIG9uZSBvZiB0aGUgNDQgYnVpbHQtaW4gc2ltcGxlIHR5cGVzIG9yIG1heSBiZSAKLSAgICAgIGEgcmVzdHJpY3Rpb24gaW4gc2NoZW1hIG9mIG9uZSBvZiB0aG9zZSBidWlsdC1pbiB0eXBlcy4gT2YgY291cnNlLCBhbiBhdHRyaWJ1dGUgCi0gICAgICB3aWxsIGFsd2F5cyBiZSBvZiBhIHNpbXBsZSB0eXBlLiBGb3IgYnVpbHQtaW4gc2ltcGxlIHR5cGVzLCBhbiAmcXVvdDt4JnF1b3Q7IAotICAgICAgbWV0aG9kIHdpbGwgZ2V0IG9yIHNldCBvbmUgb2YgdGhlIHR5cGVzIHByb3ZpZGVkIHdpdGggWE1MQmVhbnMsIHN1Y2ggYXMgCi0gICAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sU3RyaW5nLmh0bWwiPlhtbFN0cmluZzwvYT48L3NwYW4+LCAKLSAgICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJbnRlZ2VyLmh0bWwiPlhtbEludGVnZXI8L2E+PC9zcGFuPiwgCi0gICAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR0RheS5odG1sIj5YbWxHRGF5PC9hPjwvc3Bhbj4sIAotICAgICAgYW5kIHNvIG9uLiBGb3IgZGVyaXZlZCB0eXBlcywgdGhlICZxdW90O3gmcXVvdDsgbWV0aG9kIHdpbGwgZ2V0IG9yIHNldCBhIAotICAgICAgZ2VuZXJhdGVkIHR5cGUuPC9wPgotICAgIDxoMz5TaW5nbGUgT2NjdXJyZW5jZSBNZXRob2RzPC9oMz4KLSAgICA8cD5NZXRob2RzIGdlbmVyYXRlZCBmb3IgZWxlbWVudHMgb3IgYXR0cmlidXRlcyB0aGF0IGFsbG93IGEgc2luZ2xlIG9jY3VycmVuY2UuIAotICAgICAgQW4gZWxlbWVudCBpcyBzaW5ndWxhciBpZiBpdCB3YXMgZGVjbGFyZWQgd2l0aCBtYXhPY2N1cnM9JnF1b3Q7MSZxdW90Oy4gCi0gICAgICBBbiBhdHRyaWJ1dGUgaXMgc2luZ3VsYXIgaWYgaXQgd2FzIG5vdCBkZWNsYXJlZCB3aXRoIHVzZT0mcXVvdDtwcm9oaWJpdGVkJnF1b3Q7LjwvcD4KLSAgICA8cHJlPgotVHlwZSBnZXRGb28oKQotdm9pZCBzZXRGb28oVHlwZSBuZXdWYWx1ZSkKLTwvcHJlPgotICA8L2Rpdj4KLSAgPGJsb2NrcXVvdGU+IAotICAgIDxkaXY+UmV0dXJucyBvciBzZXRzIHRoZSB2YWx1ZSBvZiBGb28uIEdlbmVyYXRlZCB3aGVuIEZvbyBpcyBhbiBhdHRyaWJ1dGUsIAotICAgICAgb3IgaXMgYW4gZWxlbWVudCB0aGF0IGNhbiBvY2N1ciBvbmx5IG9uY2UgYXMgYSBjaGlsZC48L2Rpdj4KLSAgPC9ibG9ja3F1b3RlPgotICA8ZGl2PiAKLSAgICA8aHIgc2l6ZT0iMSI+Ci0gICAgPHByZT5YbWxUeXBlIHhnZXRGb28oKQotdm9pZCB4c2V0Rm9vKFhtbFR5cGUgbmV3VmFsdWUpPC9wcmU+Ci0gIDwvZGl2PgotICA8YmxvY2txdW90ZT4gCi0gICAgPGRpdj5SZXR1cm5zIG9yIHNldHMgdGhlIHZhbHVlIG9mIEZvbyBhcyBhbiBYTUxCZWFuIHNpbXBsZSB0eXBlLiBUaGVzZSBtZXRob2RzIAotICAgICAgYXJlIGdlbmVyYXRlZCBpZiBGb28ncyB0eXBlIGlzIGRlZmluZWQgaW4gc2NoZW1hIGFzIGEgc2ltcGxlVHlwZS48L2Rpdj4KLSAgPC9ibG9ja3F1b3RlPgotICA8ZGl2PiAKLSAgICA8aHIgc2l6ZT0iMSI+Ci0gICAgPHByZT5ib29sZWFuIGlzTmlsRm9vKCkKLXZvaWQgc2V0TmlsRm9vKCk8L3ByZT4KLSAgPC9kaXY+Ci0gIDxibG9ja3F1b3RlPiAKLSAgICA8ZGl2PkRldGVybWluZXMgb3Igc3BlY2lmaWVzIHdoZXRoZXIgdGhlIEZvbyBlbGVtZW50IGlzIG5pbCAoaW4gb3RoZXIgd29yZHMsIAotICAgICAgJnF1b3Q7bnVsbCZxdW90OyBpbiBzY2hlbWEgdGVybXMpLCBtZWFuaW5nIGl0IGNhbiBiZSBlbXB0eS4gQSBuaWwgZWxlbWVudCAKLSAgICAgIGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoaXM6PC9kaXY+Ci0gICAgPGRpdj4gCi0gICAgICA8cHJlPiZsdDtmb28vJmd0OzwvcHJlPgotICAgIDwvZGl2PgotICAgIDxkaXY+VGhlc2UgbWV0aG9kcyBhcmUgb25seSBnZW5lcmF0ZWQgd2hlbiBhbiBlbGVtZW50IHR5cGUgaXMgZGVjbGFyZWQgYXMgCi0gICAgICBuaWxsYWJsZSBpbiBzY2hlbWEgJiM4MjEyOyBpdCBoYXMgYSBuaWxsYWJsZT0mcXVvdDt0cnVlJnF1b3Q7IGF0dHJpYnV0ZS48L2Rpdj4KLSAgPC9ibG9ja3F1b3RlPgotICA8ZGl2PiAKLSAgICA8aHIgc2l6ZT0iMSI+Ci0gICAgPHByZT5YbWxUeXBlIGFkZE5ld0ZvbygpPC9wcmU+Ci0gIDwvZGl2PgotICA8YmxvY2txdW90ZT4gCi0gICAgPGRpdj5BZGRzIGEgbmV3IEZvbyBhcyBhbiBYTUxCZWFuIHNpbXBsZSB0byB0aGUgZG9jdW1lbnQsIG9yIHJldHVybnMgRm9vJ3MgCi0gICAgICB2YWx1ZSBpZiBvbmUgZXhpc3RzIGFscmVhZHkuPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4gCi0gICAgPGhyIHNpemU9IjEiPgotICAgIDxwcmU+Ym9vbGVhbiBpc1NldEZvbygpCi12b2lkIHVuU2V0Rm9vKCk8L3ByZT4KLSAgPC9kaXY+Ci0gIDxibG9ja3F1b3RlPiAKLSAgICA8ZGl2PkRldGVybWluZXMgd2hldGhlciB0aGUgRm9vIGVsZW1lbnQgb3IgYXR0cmlidXRlIGV4aXN0cyBpbiB0aGUgZG9jdW1lbnQ7IAotICAgICAgcmVtb3ZlcyBGb28uIFRoZXNlIG1ldGhvZHMgYXJlIGdlbmVyYXRlZCBmb3IgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgdGhhdCAKLSAgICAgIGFyZSBvcHRpb25hbC4gSW4gc2NoZW1hLCBhbmQgb3B0aW9uYWwgZWxlbWVudCBoYXMgYW4gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPm1pbk9jY3Vyczwvc3Bhbj4gCi0gICAgICBhdHRyaWJ1dGUgc2V0IHRvICZxdW90OzAmcXVvdDs7IGFuIG9wdGlvbmFsIGF0dHJpYnV0ZSBoYXMgYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+dXNlPC9zcGFuPiAKLSAgICAgIGF0dHJpYnV0ZSBzZXQgdG8gJnF1b3Q7b3B0aW9uYWwmcXVvdDsuPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4gCi0gICAgPGhyIHNpemU9IjEiPgotICAgIDxoMz5NdWx0aXBsZSBPY2N1cnJlbmNlIE1ldGhvZHM8L2gzPgotICAgIDxwPk1ldGhvZHMgZ2VuZXJhdGVkIGZvciBlbGVtZW50cyB0aGF0IGFsbG93IG11bHRpcGxlIG9jY3VycmVuY2VzLiA8L3A+Ci0gICAgPHA+QW4gZWxlbWVudCBtYXkgb2NjdXIgbXVsdGlwbGUgdGltZXMgaWYgaXQgaGFzIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPm1heE9jY3Vyczwvc3Bhbj4gCi0gICAgICBhdHRyaWJ1dGUgc2V0IHRvICZxdW90O3VuYm91bmRlZCZxdW90OyBvciBncmVhdGVyIHRoYW4gMS4gQXR0cmlidXRlcyBjYW4ndCAKLSAgICAgIG9jY3VyIG11bHRpcGxlIHRpbWVzLjwvcD4KLSAgICA8cHJlPlR5cGVbXSBnZXRGb29BcnJheSgpCi12b2lkIHNldEZvb0FycmF5KFR5cGVbXSBuZXdWYWx1ZSkgPC9wcmU+Ci0gIDwvZGl2PgotICA8YmxvY2txdW90ZT4gCi0gICAgPGRpdj5SZXR1cm5zIG9yIHNldHMgYWxsIG9mIHRoZSBGb28gZWxlbWVudHMuIDwvZGl2PgotICAgIDxkaXY+IAotICAgICAgPHByZT4KLS8vIEdldCBhbiBhcnJheSBvZiB0aGUgYWxsIG9mIHRoZSBwdXJjaGFzZS1vcmRlciBlbGVtZW50cyBpdGVtIGNoaWxkcmVuLgotSXRlbVtdIGl0ZW1zID0gbXlQTy5nZXRJdGVtQXJyYXkoKTsKLTwvcHJlPgotICAgIDwvZGl2PgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxkaXY+IAotICAgIDxociBzaXplPSIxIj4KLSAgICA8cHJlPlR5cGUgZ2V0Rm9vQXJyYXkoaW50IGluZGV4KQotdm9pZCBzZXRGb29BcnJheShUeXBlIG5ld1ZhbHVlLCBpbnQgaW5kZXgpPC9wcmU+Ci0gIDwvZGl2PgotICA8YmxvY2txdW90ZT4gCi0gICAgPGRpdj5SZXR1cm5zIG9yIHNldHMgdGhlIEZvbyBjaGlsZCBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguPC9kaXY+Ci0gICAgPGRpdj4gCi0gICAgICA8cHJlPi8vIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB0aGlyZCBpdGVtIGNoaWxkIGVsZW1lbnQuCi1teVBPLnNldEl0ZW0obmV3SXRlbSwgMik7PC9wcmU+Ci0gICAgPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4gCi0gICAgPGhyIHNpemU9IjEiPgotICAgIDxwcmU+aW50IHNpemVPZkZvb0FycmF5KCk8L3ByZT4KLSAgPC9kaXY+Ci0gIDxibG9ja3F1b3RlPiAKLSAgICA8ZGl2PlJldHVybnMgdGhlIG51bWJlciBvZiBGb28gY2hpbGQgZWxlbWVudHMuPC9kaXY+Ci0gICAgPGRpdj4gCi0gICAgICA8cHJlPi8vIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtIGNoaWxkIGVsZW1lbnRzLgotaW50IGl0ZW1Db3VudCA9IG15UE8uc2l6ZU9mSXRlbUFycmF5KCk7PC9wcmU+Ci0gICAgPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4gCi0gICAgPGhyIHNpemU9IjEiPgotICAgIDxwcmU+dm9pZCByZW1vdmVGb28oaW50IGluZGV4KTwvcHJlPgotICA8L2Rpdj4KLSAgPGJsb2NrcXVvdGU+IAotICAgIDxkaXY+UmVtb3ZlcyB0aGUgRm9vIGNoaWxkIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC48L2Rpdj4KLSAgPC9ibG9ja3F1b3RlPgotICA8ZGl2PiAKLSAgICA8aHIgc2l6ZT0iMSI+Ci0gICAgPHByZT5YbWxUeXBlW10geGdldEZvb0FycmF5KCkKLXZvaWQgeHNldEZvb0FycmF5KFhtbFR5cGVbXSBhcnJheU9mTmV3VmFsdWVzKTwvcHJlPgotICA8L2Rpdj4KLSAgPGJsb2NrcXVvdGU+IAotICAgIDxkaXY+UmV0dXJucyBvciBzZXRzIGFsbCBvZiB0aGUgRm9vIGVsZW1lbnRzIGFzIFhNTEJlYW5zIHNpbXBsZSB0eXBlcy4gR2VuZXJhdGVkIAotICAgICAgb25seSB3aGVuIHRoZSBGb28gZWxlbWVudCBpcyBkZWZpbmVkIGFzIGEgc2ltcGxlIHR5cGUuPC9kaXY+Ci0gICAgPGRpdj4gCi0gICAgICA8cHJlPi8qCi0gKiBSZXR1cm5zIHZhbHVlcyBvZiBhbGwgdGhlIHBob25lIGNoaWxkIGVsZW1lbnRzIG9mIGFuIGVtcGxveWVlIGVsZW1lbnQsCi0gKiB3aGVyZSB0aGUgcGhvbmUgZWxlbWVudCBoYXMgYmVlbiBkZWZpbmVkIGFzIHhzOnN0cmluZy4KLSAqLwotWG1sU3RyaW5nW10gZW1wUGhvbmVzID0gY3VycmVudEVtcGxveWVlLnhHZXRQaG9uZUFycmF5KCk7Ci08L3ByZT4KLSAgICA8L2Rpdj4KLSAgPC9ibG9ja3F1b3RlPgotICA8ZGl2PiAKLSAgICA8aHIgc2l6ZT0iMSI+Ci0gICAgPHByZT5YbWxUeXBlIHhnZXRGb29BcnJheShpbnQgaW5kZXgpCi12b2lkIHhzZXRGb29BcnJheShpbnQgaW5kZXgsIFhtbFR5cGUgbmV3VmFsdWUpPC9wcmU+Ci0gIDwvZGl2PgotICA8YmxvY2txdW90ZT4gCi0gICAgPGRpdj5SZXR1cm5zIG9yIHNldHMgdGhlIEZvbyBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIHVzaW5nIGFuIFhNTEJlYW5zIAotICAgICAgc2ltcGxlIHR5cGUgdmFsdWUuIEdlbmVyYXRlZCBmb3IgYW4gZWxlbWVudCBkZWZpbmVkIGFzIGEgc2ltcGxlIHR5cGUgaW4gCi0gICAgICBzY2hlbWEuPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4gCi0gICAgPGhyIHNpemU9IjEiPgotICAgIDxwcmU+dm9pZCBpbnNlcnRGb28oaW50IGluZGV4LCBGb29UeXBlIG5ld1ZhbHVlKTwvcHJlPgotICA8L2Rpdj4KLSAgPGJsb2NrcXVvdGU+IAotICAgIDxkaXY+SW5zZXJ0cyB0aGUgc3BlY2lmaWVkIEZvbyBjaGlsZCBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4gCi0gICAgPGhyIHNpemU9IjEiPgotICAgIDxwcmU+dm9pZCBhZGRGb28oRm9vVHlwZSBuZXdWYWx1ZSk8L3ByZT4KLSAgPC9kaXY+Ci0gIDxibG9ja3F1b3RlPiAKLSAgICA8ZGl2PkFkZHMgdGhlIHNwZWNpZmllZCBGb28gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiBGb28gY2hpbGQgZWxlbWVudHMuPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4gCi0gICAgPGhyIHNpemU9IjEiPgotICAgIDxwcmU+WG1sVHlwZSBpbnNlcnROZXdGb28oaW50IGluZGV4KTwvcHJlPgotICA8L2Rpdj4KLSAgPGJsb2NrcXVvdGU+IAotICAgIDxkaXY+SW5zZXJ0cyBhIG5ldyBGb28gYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgcmV0dXJuaW5nIGFuIFhNTEJlYW5zIHNpbXBsZSAKLSAgICAgIHR5cGUgcmVwcmVzZW50aW5nIHRoZSBuZXcgZWxlbWVudDsgcmV0dXJucyB0aGUgZXhpc3RpbmcgRm9vIGlmIHRoZXJlJ3MgYWxyZWFkeSAKLSAgICAgIG9uZSBhdCBpbmRleC48L2Rpdj4KLSAgPC9ibG9ja3F1b3RlPgotICA8ZGl2PiAKLSAgICA8aHIgc2l6ZT0iMSI+Ci0gICAgPHByZT5YbWxUeXBlIGFkZE5ld0ZvbygpPC9wcmU+Ci0gIDwvZGl2PgotICA8YmxvY2txdW90ZT4gCi0gICAgPGRpdj5BZGRzIGEgbmV3IEZvbyBlbGVtZW50IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgRm9vIGNoaWxkIGVsZW1lbnRzLCAKLSAgICAgIHJldHVybmluZyBhbiBYTUxCZWFucyBzaW1wbGUgdHlwZSByZXByZXNlbnRpbmcgdGhlIG5ld2x5IGFkZGVkIGVsZW1lbnQuPC9kaXY+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGRpdj4gCi0gICAgPGhyIHNpemU9IjEiPgotICAgIDxwcmU+Ym9vbGVhbiBpc05pbEZvb0FycmF5KGludCBpbmRleCkKLXZvaWQgc2V0TmlsRm9vQXJyYXkoaW50IGluZGV4KTwvcHJlPgotICA8L2Rpdj4KLSAgPGJsb2NrcXVvdGU+IAotICAgIDxkaXY+RGV0ZXJtaW5lcyBvciBzcGVjaWZpZXMgd2hldGhlciB0aGUgRm9vIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCAKLSAgICAgIGlzIG5pbC48L2Rpdj4KLSAgPC9ibG9ja3F1b3RlPgotICA8ZGl2PiAKLSAgICA8aHIgc2l6ZT0iMSI+Ci0gIDwvZGl2PgotICA8ZGl2IGlkPSJ0b3BpY3RleHQiPjwvZGl2PgotICA8cCBjbGFzcz1yZWxhdGVkdG9waWNzPlJlbGF0ZWQgVG9waWNzPC9wPgotICA8cD48YSBocmVmPSJjb25KYXZhVHlwZXNHZW5lcmF0ZWRGcm9tVXNlckRlcml2ZWQuaHRtbCI+SmF2YSBUeXBlcyBHZW5lcmF0ZWQgCi0gICAgZnJvbSBVc2VyLURlcml2ZWQgU2NoZW1hIFR5cGVzPC9hPjwvcD4KLTwvZGl2PgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0KLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9ndWlkZS9jb25OYXZpZ2F0aW5nWE1Md2l0aEN1cnNvcnMuaHRtbCBiL3YxL2RvY3MvZ3VpZGUvY29uTmF2aWdhdGluZ1hNTHdpdGhDdXJzb3JzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZTQxNGEuLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy9ndWlkZS9jb25OYXZpZ2F0aW5nWE1Md2l0aEN1cnNvcnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi08IWRvY3R5cGUgSFRNTCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJkb2N0aXRsZSIgLS0+Ci08dGl0bGU+TmF2aWdhdGluZyBYTUwgd2l0aCBDdXJzb3JzPC90aXRsZT4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4gCi08IS0tKE1ldGEpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JENIQVJTRVQ7Ij4KLQotCi08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJtZXRhdGFncyIgLS0+Ci0KLTxtZXRhIGNvbnRlbnQ9InlvdXIgbmFtZSIgbmFtZT0iYXV0aG9yIj4KLTxtZXRhIGNvbnRlbnQ9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHRvcGljIGNvbnRlbnRzLiIgbmFtZT0iZGVzY3JpcHRpb24iPgotPG1ldGEgY29udGVudD0ia2V5d29yZHMgdG8gaGVscCBpbiBzZWFyY2hlcyIgbmFtZT0ia2V5d29yZHMiPgotPG1ldGEgY29udGVudD0iMTAvMjUvMDIiIG5hbWU9ImRhdGUgbGFzdCBtb2RpZmllZCI+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci0KLTwhLS0oTGlua3MpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJoZWFkIiAtLT4gCi08bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTxhIGhyZWY9Ii4uLy4uLy4uL2NvcmUvaW5kZXguaHRtbCIgaWQ9ImluZGV4Ij48L2E+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvdG9waWNJbmZvLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9Db29raWVDbGFzcy5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvZGlzcGxheUNvbnRlbnQuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08IS0tKEJvZHkpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPGJvZHk+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotPC9zY3JpcHQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJib2R5IiAtLT4gCi08aDE+IE5hdmlnYXRpbmcgWE1MIHdpdGggQ3Vyc29ycyA8L2gxPgotPGRpdiBpZD0idG9waWN0ZXh0Ij4gCi0gIDxwPlhNTCBjdXJzb3JzIGFyZSBhIHdheSB0byBuYXZpZ2F0ZSB0aHJvdWdoIGFuIFhNTCBpbnN0YW5jZSBkb2N1bWVudC4gT25jZSAKLSAgICB5b3UgbG9hZCBhbiBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gY3JlYXRlIGEgY3Vyc29yIHRvIHJlcHJlc2VudCBhIHNwZWNpZmljIAotICAgIHBsYWNlIGluIHRoZSBYTUwuIEJlY2F1c2UgeW91IGNhbiB1c2UgYSBjdXJzb3Igd2l0aCBvciB3aXRob3V0IGEgc2NoZW1hIGNvcnJlc3BvbmRpbmcgCi0gICAgdG8gdGhlIFhNTCwgY3Vyc29ycyBhcmUgYW4gaWRlYWwgd2F5IHRvIGhhbmRsZSBYTUwgd2l0aG91dCBhIHNjaGVtYS48L3A+Ci0gIDxwPldpdGggYW4gWE1MIGN1cnNvciwgeW91IGNhbjo8L3A+Ci08L2Rpdj4KLTxVTD4KLSAgPGxpPiAKLSAgICA8ZGl2PjxhIGhyZWY9ImNvblVuZGVyc3RhbmRpbmdYTUxUb2tlbnMuaHRtbCI+VXNlIHRoZSB0b2tlbiBtb2RlbDwvYT4gdG8gbW92ZSAKLSAgICAgIHRocm91Z2ggWE1MIGluIHNtYWxsIGluY3JlbWVudHMsIG9yIGluIGEgbWFubmVyIHNpbWlsYXIgdG8gdXNpbmcgYSBET00tYmFzZWQgCi0gICAgICBtb2RlbC48L2Rpdj4KLSAgPExJPiAKLSAgICA8RElWPkdldCBhbmQgc2V0IHZhbHVlcyB3aXRoaW4gdGhlIFhNTC48L0RJVj4KLSAgPExJPiAKLSAgICA8RElWPjxhIGhyZWY9IiNhZGRpbmdfZWxlbWVudHNfYXR0cmlidXRlcyI+Q2hhbmdlIHRoZSBzdHJ1Y3R1cmU8L2E+IG9mIGFuIAotICAgICAgWE1MIGRvY3VtZW50IGJ5IGluc2VydGluZywgcmVtb3ZpbmcsIGFuZCBtb3ZpbmcgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuPC9ESVY+Ci0gIDxMST4gCi0gICAgPERJVj48YSBocmVmPSJjb25TZWxlY3RpbmdYTUx3aXRoWFF1ZXJ5UGF0aFhQYXRoLmh0bWwiPkV4ZWN1dGUgWFF1ZXJ5IGV4cHJlc3Npb25zPC9hPiAKLSAgICAgIGFnYWluc3QgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGUgY3Vyc29yLjwvRElWPgotICA8TEk+IAotICAgIDxESVY+PGEgaHJlZj0iY29uVXNpbmdCb29rbWFya3NUb0Fubm90YXRlWE1MLmh0bWwiPkluc2VydCBib29rbWFya3M8L2E+IHRvIAotICAgICAgbWFyayBsb2NhdGlvbnMgaW4gWE1MLjwvRElWPgotPC9VTD4KLTxQPldoZW4geW91J3JlIGZpbmlzaGVkIHVzaW5nIGEgY3Vyc29yLCB5b3VyIGNvZGUgc2hvdWxkIGNhbGwgaXRzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5kaXNwb3NlPC9zcGFuPiAKLSAgbWV0aG9kLjwvUD4KLTxoMj5DcmVhdGluZyBhbmQgTW92aW5nIGEgQ3Vyc29yPC9oMj4KLTxQPldpdGggYW4gWE1MIGluc3RhbmNlIGRvY3VtZW50IGJvdW5kIHRvIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxPYmplY3QuaHRtbCI+WG1sT2JqZWN0PC9hPjwvc3Bhbj4gCi0gIChvciBhIHR5cGUgaW5oZXJpdGluZyBmcm9tIGl0KSwgeW91IGNyZWF0ZSBhIG5ldyBjdXJzb3IgYnkgY2FsbGluZyB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPm5ld0N1cnNvcjwvc3Bhbj4gCi0gIG1ldGhvZC4gVGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDdXJzb3IuaHRtbCI+WG1sQ3Vyc29yPC9hPjwvc3Bhbj4gCi0gIGludGVyZmFjZSByZXByZXNlbnRzIGEgY3Vyc29yLiBGcm9tIGEgY3Vyc29yIHN0YW5kcG9pbnQsIGFuIFhNTCBkb2N1bWVudCBpcyAKLSAgYSBjb2xsZWN0aW9uIG9mIDxFTT50b2tlbnM8L0VNPiB0aGF0IHJlcHJlc2VudCB0aGUga2luZHMgb2YgdGhpbmdzIHRoYXQgY2FuIAotICBhcHBlYXIgaW4gWE1MLiBUaGVzZSBpbmNsdWRlJm5ic3A7YXR0cmlidXRlcywgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgZWxlbWVudHMsIAotICBjb21tZW50cywgYW5kIHNvIG9uLiZuYnNwO0VhY2ggcGllY2Ugb2YgaW5mb3JtYXRpb24gaW4gWE1MIGlzIHJlcHJlc2VudGVkIGJ5IAotICBhIDxlbT50b2tlbiB0eXBlPC9lbT4uPC9QPgotPFAgY2xhc3M9Im5vdGVwYXJhIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEZvciBhIG1vcmUgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgCi0gIFhNTCB0b2tlbnMsIHNlZSA8YSBocmVmPSJjb25VbmRlcnN0YW5kaW5nWE1MVG9rZW5zLmh0bWwiPlVuZGVyc3RhbmRpbmcgWE1MIFRva2VuczwvYT4uPC9QPgotPFA+Rm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZSBsb2FkcyB0aGUmbmJzcDtYTUwgaW5zdGFuY2UgZGVzY3JpYmVkIGFib3ZlIAotICBmcm9tIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPkZpbGU8L3NwYW4+IG9iamVjdCwgdGhlbiBjcmVhdGVzIGEgbmV3IGN1cnNvci4gCi0gIFRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+dG9GaXJzdENoaWxkPC9zcGFuPiB0YWtlcyB0aGUgY3Vyc29yIHRvIHRoZSBzdGFydCAKLSAgdGFnIG9mIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+YmF0Y2hXaWRnZXRPcmRlcjwvc3Bhbj4gZG9jdW1lbnQgZWxlbWVudC4gCi0gIFRoZSBjb2RlIHRoZW4gcHJpbnRzIHRoZSB0eXBlIGZvciB0aGUgdG9rZW4gYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLCBhbG9uZyAKLSAgd2l0aCB0aGUgWE1MIHRoZSBjdXJzb3IgcmVwcmVzZW50c5dpbiBvdGhlciB3b3JkcywgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj5Ub2tlbiAKLSAgdHlwZTogU1RBUlQgLzwvc3Bhbj4gYW5kIHRoZSA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPmJhdGNoV2lkZ2V0T3JkZXJFbGVtZW50PC9zcGFuPiAKLSAgYW5kIGl0cyBjb250ZW50cy48L1A+Ci08cHJlPnB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRDdXJzb3IoRmlsZSBvcmRlckZpbGUpIHRocm93cyBFeGNlcHRpb24gCi17Ci0gICAgQmF0Y2hXaWRnZXRPcmRlckRvY3VtZW50IHhtbERvYyA9IEJhdGNoV2lkZ2V0T3JkZXJEb2N1bWVudC5GYWN0b3J5LnBhcnNlKG9yZGVyRmlsZSk7Ci0gICAgWG1sQ3Vyc29yIG9yZGVyQ3Vyc29yID0geG1sRG9jLm5ld0N1cnNvcigpOwotICAgIG9yZGVyQ3Vyc29yLnRvRmlyc3RDaGlsZCgpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVG9rZW4gdHlwZTogIiArIG9yZGVyQ3Vyc29yLmN1cnJlbnRUb2tlblR5cGUoKSArCi0gICAgICAgICIgLyAiICsgb3JkZXJDdXJzb3IueG1sVGV4dCgpKTsKLX0KLTwvcHJlPgotPHAgY2xhc3M9Im5vdGVwYXJhIj48U1RST05HPk5vdGU8L1NUUk9ORz46IFRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPiAKLSAgaW50ZXJmYWNlIHByb3ZpZGVzIG1hbnkgbWV0aG9kcyB5b3UgY2FuIHVzZSB0byBwdXQgYSBjdXJzb3Igd2hlcmUgeW91IHdhbnQgaXQuIAotICBGb3IgYSBsaXN0IG9mIHRob3NlIG1ldGhvZHMsIHNlZSA8YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDdXJzb3IuaHRtbCI+WG1sQ3Vyc29yIAotICBJbnRlcmZhY2U8L2E+LjwvcD4KLTxoMj48YSBuYW1lPSJhZGRpbmdfZWxlbWVudHNfYXR0cmlidXRlcyIgaWQ9ImFkZGluZ19lbGVtZW50c19hdHRyaWJ1dGVzIj48L2E+QWRkaW5nIAotICBFbGVtZW50cyBhbmQgQXR0cmlidXRlczwvaDI+Ci08cD5UaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvcjwvc3Bhbj4gaW50ZXJmYWNlIHByb3ZpZGVzIHNldmVyYWwgbWV0aG9kcyAKLSAgeW91IGNhbiB1c2UgdG8gYWRkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHRvIFhNTC4gPC9wPgotPHA+T25lIHdheSB0byBhZGQgbmV3IFhNTCBpcyB3aXRoIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+YmVnaW5FbGVtZW50PC9zcGFuPiAKLSAgbWV0aG9kLiBUaGlzIG1ldGhvZCBpcyBkZXNpZ25lZCB0byBpbnNlcnQgYSBuZXcgZWxlbWVudCBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24sIAotICBhbmQgZG8gaXQgc28gdGhlIGN1cnNvciBlbmRzIHVwIGJldHdlZW4gdGhlIG5ldyBlbGVtZW50J3MgU1RBUlQgYW5kIEVORCB0b2tlbnMuIAotICBGcm9tIHRoaXMgcG9zaXRpb24sIHlvdSBjYW4gaW5zZXJ0IGF0dHJpYnV0ZXMgKHRoZXkncmUgYXV0b21hdGljYWxseSBwbGFjZWQgCi0gIGluIHRoZSBzdGFydCB0YWcsIHdoZXJlIHRoZXkgYmVsb25nKSBhbmQgaW5zZXJ0IGEgdmFsdWUuIEhlcmUncyBhbiBleGFtcGxlOjwvcD4KLTxwcmU+Ci0vLyBDcmVhdGUgYSBuZXcgY2h1bmsgb2YgWE1MLgotWG1sT2JqZWN0IG5ld1htbCA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0vKiAKLSAqIEluc2VydCBhIG5ldyBjdXJzb3IgYW5kIG1vdmUgaXQgdG8gdGhlIGZpcnN0IFNUQVJUIHRva2VuICh3aGVyZSB0aGUKLSAqIFhNTCBhY3R1YWxseSBiZWdpbnMuCi0gKi8KLVhtbEN1cnNvciBjdXJzb3IgPSBuZXdYbWwubmV3Q3Vyc29yKCk7Ci1jdXJzb3IudG9OZXh0VG9rZW4oKTsKLS8vIEJlZ2luIGEgbmV3IGl0ZW0gZWxlbWVudCB3aG9zZSBuYW1lc3BhY2UgVVJJIGlzICJodHRwOi8vb3BlbnVyaS5vcmciLgotY3Vyc29yLmJlZ2luRWxlbWVudCgmcXVvdDtpdGVtJnF1b3Q7LCAmcXVvdDtodHRwOi8vb3BlbnVyaS5vcmcvJnF1b3Q7KTsKLS8vIEluc2VydCBhbiBJRCBhdHRyaWJ1dGUgb24gdGhlIGl0ZW0gZWxlbWVudCwgYWxvbmcgd2l0aCBhbiBhdHRyaWJ1dGUgdmFsdWUuCi1jdXJzb3IuaW5zZXJ0QXR0cmlidXRlV2l0aFZhbHVlKCZxdW90O2lkJnF1b3Q7LCAmcXVvdDs0MDU2NDA0JnF1b3Q7KTsKLS8vIEluc2VydCAiYmljeWNsZSIgYXMgYW4gZWxlbWVudCB2YWx1ZS4KLWN1cnNvci5pbnNlcnRDaGFycygmcXVvdDtiaWN5Y2xlJnF1b3Q7KTsKLWN1cnNvci5kaXNwb3NlKCk7Ci08L3ByZT4KLTxwPlRoaXMgZXhhbXBsZSByZXN1bHRzIGluIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc6PC9wPgotPHByZT4mbHQ7bnMxOml0ZW0gaWQ9JnF1b3Q7NDA1NjQwNCZxdW90OyB4bWxuczpuczE9JnF1b3Q7aHR0cDovL29wZW51cmkub3JnLyZxdW90OyZndDtiaWN5Y2xlJmx0Oy9uczE6aXRlbSZndDsKLTwvcHJlPgotPGgyPiBVc2luZyBTdG9yZWQgQ3Vyc29yIExvY2F0aW9ucyB3aXRoIHB1c2goKSBhbmQgcG9wKCk8L2gyPgotPGRpdiBpZD0idG9waWN0ZXh0Ij4gCi0gIDxwPldoZW4geW91IHdhbnQgdG8gbW92ZSBhIGN1cnNvciBhcm91bmQsIGJ1dCB3YW50IHRvIGtlZXAgdHJhY2sgb2YgYSBmb3JtZXIgCi0gICAgbG9jYXRpb24sIHlvdSBjYW4gdXNlIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPiBpbnRlcmZhY2UncyAKLSAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+IAotICAgIG1ldGhvZHMuIFRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4gbWV0aG9kIHB1c2hlcyB0aGUgY3Vyc29yJ3MgCi0gICAgY3VycmVudCBsb2NhdGlvbiBvbnRvIGEgc3RhY2sgb2YgbG9jYXRpb25zIG1haW50YWluZWQgZm9yIHRoYXQgcGFydGljdWxhciAKLSAgICBjdXJzb3I7IHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPiBtZXRob2QgcmVtb3ZlcyB0aGUgbG9jYXRpb24gCi0gICAgZnJvbSB0aGUgdG9wIG9mIHRoZSBzdGFjayBhbmQgbW92ZXMgdGhlIGN1cnNvciB0byB0aGF0IGxvY2F0aW9uLjwvcD4KLSAgPHA+Rm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgJmx0O2VtcGxveWVlJmd0OyBlbGVtZW50LCB1c2VkIGluIHRoZSAKLSAgICBleGFtcGxlIGJlbG93LjwvcD4KLSAgPHByZT4KLSZsdDtlbXBsb3llZSZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtuYW1lJmd0O0dsYWR5cyBLcmF2aXR6Jmx0Oy9uYW1lJmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2FkZHJlc3MgbG9jYXRpb249JnF1b3Q7aG9tZSZxdW90OyZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtzdHJlZXQmZ3Q7MTMxMyBNb2NraW5nYmlyZCBMYW5lJmx0Oy9zdHJlZXQmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7Y2l0eSZndDtTZWF0dGxlJmx0Oy9jaXR5Jmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3N0YXRlJmd0O1dBJmx0Oy9zdGF0ZSZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDt6aXAmZ3Q7OTgxMTUmbHQ7L3ppcCZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDsvYWRkcmVzcyZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDthZGRyZXNzIGxvY2F0aW9uPSZxdW90O3dvcmsmcXVvdDsmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7c3RyZWV0Jmd0OzIwMTEgMTUybmQgQXZlbnVlIE5FJmx0Oy9zdHJlZXQmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7Y2l0eSZndDtSZWRtb25kJmx0Oy9jaXR5Jmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3N0YXRlJmd0O1dBJmx0Oy9zdGF0ZSZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDt6aXAmZ3Q7OTgwNTImbHQ7L3ppcCZndDsKLSZuYnNwOyZuYnNwOyAmbmJzcDsmbHQ7L2FkZHJlc3MmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7cGhvbmUgbG9jYXRpb249JnF1b3Q7d29yayZxdW90OyZndDsoNDI1KSA1NTUtNjg5NyZsdDsvcGhvbmUmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7cGhvbmUgbG9jYXRpb249JnF1b3Q7aG9tZSZxdW90OyZndDsoMjA2KSA1NTUtNjU5NCZsdDsvcGhvbmUmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7cGhvbmUgbG9jYXRpb249JnF1b3Q7bW9iaWxlJnF1b3Q7Jmd0OygyMDYpIDU1NS03ODk0Jmx0Oy9waG9uZSZndDsKLSZsdDsvZW1wbG95ZWUmZ3Q7Ci08L3ByZT4KLSAgPHA+VGhlIGZvbGxvd2luZyBKYXZhIGNvZGUgaWxsdXN0cmF0ZXMgaG93IHlvdSBjYW4gdXNlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXNoPC9zcGFuPiAKLSAgICBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBvcDwvc3Bhbj4gdG8gcHV0IHRoZSBjdXJzb3IgYmFjayB0byBhIHNhdmVkIAotICAgIGxvY2F0aW9uIGFmdGVyIGEgYml0IG9mIHRyYXZlbGluZy48L3A+Ci0gIDxwcmU+Ci0vKioKLSAqIFBhc3MgdG8gdGhlIHRyeVNlbGVjdFBhdGggbWV0aG9kIGFuIFhtbE9iamVjdCBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zCi0gKiB0aGUgWE1MIGFib3ZlLgotICovCi1wdWJsaWMgdm9pZCB0cnlTZWxlY3RQYXRoKFhtbE9iamVjdCB4bWwpCi17Ci0gICAgLyogCi0gICAgICogSW5zZXJ0cyB0aGUgY3Vyc29yIGF0IHRoZSBTVEFSVERPQyB0b2tlbiAodGhlIHZlcnkgYmVnaW5uaW5nLCAKLSAgICAgKiBiZWZvcmUgYW55IGVsZW1lbnRzKS4KLSAgICAgKi8KLSAgICBYbWxDdXJzb3IgY3Vyc29yID0geG1sLm5ld0N1cnNvcigpOwotICAgIC8vIE1vdmVzIHRoZSBjdXJzb3IgdG8ganVzdCBiZWZvcmUgJmx0O2VtcGxveWVlJmd0OwotICAgIGN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKLSAgICAvLyBQdXNoZXMgdGhlIGN1cnNvcidzIGN1cnJlbnQgbG9jYXRpb24gb250byB0aGUgc3RhY2suCi0gICAgY3Vyc29yLnB1c2goKTsKLSAgICAvLyBNb3ZlcyB0aGUgY3Vyc29yIHRvIGp1c3QgYmVmb3JlIHRoZSAmcXVvdDt3b3JrJnF1b3Q7ICZsdDtwaG9uZSZndDsgZWxlbWVudC4gICAgICAKLSAgICBjdXJzb3IudG9DaGlsZCgyKTsKLSAgICAvLyBNb3ZlcyB0aGUgY3Vyc29yIHRvIGp1c3QgYmVmb3JlIHRoZSAmcXVvdDtob21lJnF1b3Q7ICZsdDtwaG9uZSZndDsgZWxlbWVudC4KLSAgICBjdXJzb3IudG9OZXh0U2libGluZygpOwotICAgIC8vIE1vdmVzIHRoZSBjdXJzb3IgYmFjayB0byBqdXN0IGJlZm9yZSAmbHQ7ZW1wbG95ZWUmZ3Q7Ci0gICAgY3Vyc29yLnBvcCgpOwotfQotPC9wcmU+Ci0gIDxwPk9mIGNvdXJzZSwgeW91IGNhbiBjYWxsIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXNoPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBvcDwvc3Bhbj4gCi0gICAgbXVsdGlwbGUgdGltZXMuIEVhY2ggbmV3IGNhbGwgdG8gdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXNoPC9zcGFuPiAKLSAgICBtZXRob2QgcHVzaGVzIHRoZSBjdXJyZW50IGxvY2F0aW9uIG9udG8gdGhlIHN0YWNrLiBBcyB5b3UgY2FsbCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBvcDwvc3Bhbj4gCi0gICAgbWV0aG9kLCB5b3UncmUgYWx3YXlzIGdldHRpbmcgd2hhdCdzIG9uIHRvcCBvZiB0aGUgc3RhY2suIFNvIGlmIHlvdSBjYWxsZWQgCi0gICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1c2g8L3NwYW4+IHRocmVlIHRpbWVzIGJlZm9yZSBjYWxsaW5nIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+IAotICAgICYjODIxMjsgMSwgMiwgMyAmIzgyMTI7IGNhbGxpbmcgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBvcDwvc3Bhbj4gdGhyZWUgCi0gICAgdGltZXMgd291bGQgZ2V0IHRob3NlIGxvY2F0aW9ucyBpbiByZXZlcnNlIG9yZGVyICYjODIxMjsgMywgMiwgMS48L3A+Ci0gIDxwPlRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+IAotICAgIG1ldGhvZHMgY2FuIGJlIGhhbmR5IGFzIGFuIGFsdGVybmF0aXZlIHRvIGNyZWF0aW5nIG5ldyBjdXJzb3JzIHRoYXQgYXJlIGRlc2lnbmVkIAotICAgIHNpbXBseSB0byBtYXJrIGEgcGFydGljdWxhciBsb2NhdGlvbiB3aGlsZSB5b3UgbW92ZSBhbm90aGVyIGN1cnNvciBhcm91bmQuIAotICAgIFRoZSByZXNvdXJjZXMgcmVxdWlyZWQgdG8gbWFpbnRhaW4gYSBsb2NhdGlvbiBzdGFjayB0aHJvdWdoIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXNoPC9zcGFuPiAKLSAgICBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBvcDwvc3Bhbj4gYXJlIGZhciBsZXNzIHRoYW4gdGhvc2UgbmVlZGVkIGJ5IAotICAgIGN1cnNvcnMuIDwvcD4KLSAgPEgxPkRpc3Bvc2luZyBvZiBhIEN1cnNvcjwvSDE+Ci0gIDxwPldoZW4geW91J3JlIHRocm91Z2ggd2l0aCBhIGN1cnNvciwgeW91ciBjb2RlIHNob3VsZCBjYWxsIGl0cyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+ZGlzcG9zZTwvc3Bhbj4gCi0gICAgbWV0aG9kIHRvIGluZGljYXRlIHRoYXQgaXQncyBubyBsb25nZXIgbmVlZGVkLjwvcD4KLSAgPHAgY2xhc3M9InJlbGF0ZWR0b3BpY3MiPlJlbGF0ZWQgVG9waWNzPC9wPgotICA8cD48YSBocmVmPSJjb25VbmRlcnN0YW5kaW5nWE1MVG9rZW5zLmh0bWwiPlVuZGVyc3RhbmRpbmcgWE1MIFRva2VuczwvYT48L3A+Ci0gIDxwPjxhIGhyZWY9ImNvbkdldHRpbmdTdGFydGVkd2l0aFhNTEJlYW5zLmh0bWwiPkdldHRpbmcgU3RhcnRlZCB3aXRoIFhNTEJlYW5zPC9hPjwvcD4KLTwvZGl2PgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPiAKLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCi08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL2RvY3MvZ3VpZGUvY29uU2VsZWN0aW5nWE1Md2l0aFhRdWVyeVBhdGhYUGF0aC5odG1sIGIvdjEvZG9jcy9ndWlkZS9jb25TZWxlY3RpbmdYTUx3aXRoWFF1ZXJ5UGF0aFhQYXRoLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZTEzZjguLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy9ndWlkZS9jb25TZWxlY3RpbmdYTUx3aXRoWFF1ZXJ5UGF0aFhQYXRoLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotPCFkb2N0eXBlIEhUTUwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iZG9jdGl0bGUiIC0tPgotPHRpdGxlPlNlbGVjdGluZyBYTUwgd2l0aCBYUXVlcnkgYW5kIFhQYXRoPC90aXRsZT4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4gCi08IS0tKE1ldGEpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JENIQVJTRVQ7Ij4KLQotCi08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJtZXRhdGFncyIgLS0+Ci0KLTxtZXRhIGNvbnRlbnQ9InlvdXIgbmFtZSIgbmFtZT0iYXV0aG9yIj4KLTxtZXRhIGNvbnRlbnQ9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHRvcGljIGNvbnRlbnRzLiIgbmFtZT0iZGVzY3JpcHRpb24iPgotPG1ldGEgY29udGVudD0ia2V5d29yZHMgdG8gaGVscCBpbiBzZWFyY2hlcyIgbmFtZT0ia2V5d29yZHMiPgotPG1ldGEgY29udGVudD0iMTAvMjUvMDIiIG5hbWU9ImRhdGUgbGFzdCBtb2RpZmllZCI+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci0KLTwhLS0oTGlua3MpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJoZWFkIiAtLT4gCi08bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTxhIGhyZWY9Ii4uLy4uLy4uL2NvcmUvaW5kZXguaHRtbCIgaWQ9ImluZGV4Ij48L2E+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvdG9waWNJbmZvLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9Db29raWVDbGFzcy5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvZGlzcGxheUNvbnRlbnQuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08IS0tKEJvZHkpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPGJvZHk+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotPC9zY3JpcHQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJib2R5IiAtLT4gCi08aDE+IFNlbGVjdGluZyBYTUwgd2l0aCBYUXVlcnkgYW5kIFhQYXRoPC9oMT4KLTxkaXYgaWQ9InRvcGljdGV4dCI+IAotICA8cD5Zb3UgY2FuIHVzZSBYUXVlcnkgYW5kIFhQYXRoIHRvIHJldHJpZXZlIHNwZWNpZmljIHBpZWNlcyBvZiBYTUwgYXMgeW91IG1pZ2h0IAotICAgIHJldHJpZXZlIGRhdGEgZnJvbSBhIGRhdGFiYXNlLiBYUXVlcnkgYW5kIFhQYXRoIHByb3ZpZGUgYSBzeW50YXggZm9yIHNwZWNpZnlpbmcgCi0gICAgd2hpY2ggZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgeW91J3JlIGludGVyZXN0ZWQgaW4uIFRoZSBYTUxCZWFucyBBUEkgcHJvdmlkZXMgCi0gICAgdHdvIG1ldGhvZHMgZm9yIGV4ZWN1dGluZyBYUXVlcnkgYW5kIFhQYXRoIGV4cHJlc3Npb25zLCBhbmQgdHdvIGRpZmZlcmluZyAKLSAgICB3YXlzIHRvIHVzZSB0aGVtLiBUaGUgbWV0aG9kcyBhcmUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNlbGVjdFBhdGg8L3NwYW4+IAotICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+ZXhlY1F1ZXJ5PC9zcGFuPiwgYW5kIHlvdSBjYW4gY2FsbCB0aGVtIGZyb20gCi0gICAgPGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sT2JqZWN0Lmh0bWwiPjxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+PC9hPiAKLSAgICAob3IgYW4gb2JqZWN0IGluaGVyaXRpbmcgZnJvbSBpdCkgb3IgPGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ3Vyc29yLmh0bWwiPjxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+PC9hPi4gCi0gICAgVGhlIHJlc3VsdHMgZm9yIHRoZSBtZXRob2RzIGRpZmZlciBzb21ld2hhdC4gPC9wPgotICA8aDI+VXNpbmcgdGhlIHNlbGVjdFBhdGggTWV0aG9kPC9oMj4KLTwvZGl2PgotPGRpdj4KLSAgPHA+VGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zZWxlY3RQYXRoPC9zcGFuPiBtZXRob2QgaXMgdGhlIG1vc3QgZWZmaWNpZW50IAotICAgIHdheSB0byBleGVjdXRlIFhQYXRoIGV4cHJlc3Npb25zLiBUaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNlbGVjdFBhdGg8L3NwYW4+IAotICAgIG1ldGhvZCBpcyBvcHRpbWl6ZWQgZm9yIFhQYXRoLiBXaGVuIHlvdSB1c2UgWFBhdGggd2l0aCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNlbGVjdFBhdGg8L3NwYW4+IAotICAgIG1ldGhvZCwgdGhlIHZhbHVlIHJldHVybmVkIGlzIGFuIGFycmF5IG9mIHZhbHVlcyBmcm9tIHRoZSA8ZW0+Y3VycmVudCBkb2N1bWVudDwvZW0+LiAKLSAgICBJbiBjb250cmFzdCwgd2hlbiB5b3UgdXNlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5leGVjUXVlcnk8L3NwYW4+LCB0aGUgdmFsdWUgCi0gICAgcmV0dXJuZWQgaXMgYSA8ZW0+bmV3IGRvY3VtZW50PC9lbT4uPC9wPgotICA8aDM+Q2FsbGluZyBmcm9tIFhtbE9iamVjdDwvaDM+Ci0gIDxwPldoZW4gY2FsbGVkIGZyb20gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbE9iamVjdDwvc3Bhbj4gKG9yIGEgdHlwZSB0aGF0IAotICAgIGluaGVyaXRzIGZyb20gaXQpLCB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHMuIElmIHRoZSBleHByZXNzaW9uIAotICAgIGlzIGV4ZWN1dGVkIGFnYWluc3QgdHlwZXMgZ2VuZXJhdGVkIGZyb20gc2NoZW1hLCB0aGVuIHRoZSB0eXBlIGZvciB0aGUgcmV0dXJuZWQgCi0gICAgYXJyYXkgaXMgb25lIG9mIHRoZSBKYXZhIHR5cGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjaGVtYS4gPC9wPgotICA8cD5Gb3IgZXhhbXBsZSwgaW1hZ2luZSB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIFhNTCBjb250YWluaW5nIGVtcGxveWVlIGluZm9ybWF0aW9uLiAKLSAgICBZb3UndmUgY29tcGlsZWQgdGhlIHNjaGVtYSBkZXNjcmliaW5nIHRoaXMgWE1MIGFuZCB0aGUgdHlwZXMgZ2VuZXJhdGVkIGZyb20gCi0gICAgc2NoZW1hIGFyZSBhdmFpbGFibGUgdG8geW91ciBjb2RlLjwvcD4KLTxwcmU+Ci0mbHQ7eHE6ZW1wbG95ZWVzIHhtbG5zOnhxPSZxdW90O2h0dHA6Ly9vcGVudXJpLm9yZy9zZWxlY3RQYXRoJnF1b3Q7Jmd0OwotICAgICZsdDt4cTplbXBsb3llZSZndDsKLSAgICAgICAgJmx0O3hxOm5hbWUmZ3Q7RnJlZCBKb25lcyZsdDsveHE6bmFtZSZndDsKLSAgICAgICAgJmx0O3hxOmFkZHJlc3MgbG9jYXRpb249JnF1b3Q7aG9tZSZxdW90OyZndDsKLSAgICAgICAgICAgICZsdDt4cTpzdHJlZXQmZ3Q7OTAwIEF1cm9yYSBBdmUuJmx0Oy94cTpzdHJlZXQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHE6Y2l0eSZndDtTZWF0dGxlJmx0Oy94cTpjaXR5Jmd0OwotICAgICAgICAgICAgJmx0O3hxOnN0YXRlJmd0O1dBJmx0Oy94cTpzdGF0ZSZndDsKLSAgICAgICAgICAgICZsdDt4cTp6aXAmZ3Q7OTgxMTUmbHQ7L3hxOnppcCZndDsKLSAgICAgICAgJmx0Oy94cTphZGRyZXNzJmd0OwotICAgICAgICAmbHQ7eHE6YWRkcmVzcyBsb2NhdGlvbj0mcXVvdDt3b3JrJnF1b3Q7Jmd0OwotICAgICAgICAgICAgJmx0O3hxOnN0cmVldCZndDsyMDExIDE1Mm5kIEF2ZW51ZSBORSZsdDsveHE6c3RyZWV0Jmd0OwotICAgICAgICAgICAgJmx0O3hxOmNpdHkmZ3Q7UmVkbW9uZCZsdDsveHE6Y2l0eSZndDsKLSAgICAgICAgICAgICZsdDt4cTpzdGF0ZSZndDtXQSZsdDsveHE6c3RhdGUmZ3Q7Ci0gICAgICAgICAgICAmbHQ7eHE6emlwJmd0Ozk4MDUyJmx0Oy94cTp6aXAmZ3Q7Ci0gICAgICAgICZsdDsveHE6YWRkcmVzcyZndDsKLSAgICAgICAgJmx0O3hxOnBob25lIGxvY2F0aW9uPSZxdW90O3dvcmsmcXVvdDsmZ3Q7KDQyNSk1NTUtNTY2NSZsdDsveHE6cGhvbmUmZ3Q7Ci0gICAgICAgICZsdDt4cTpwaG9uZSBsb2NhdGlvbj0mcXVvdDtob21lJnF1b3Q7Jmd0OygyMDYpNTU1LTU1NTUmbHQ7L3hxOnBob25lJmd0OwotICAgICAgICAmbHQ7eHE6cGhvbmUgbG9jYXRpb249JnF1b3Q7bW9iaWxlJnF1b3Q7Jmd0OygyMDYpNTU1LTQzMjEmbHQ7L3hxOnBob25lJmd0OwotICAgICZsdDsveHE6ZW1wbG95ZWUmZ3Q7Ci0mbHQ7L3hxOmVtcGxveWVlcyZndDsKLTwvcHJlPgotICBJZiB5b3Ugd2FudGVkIHRvIGZpbmQgdGhlIHBob25lIG51bWJlcnMgd2hvc2UgYXJlYSBjb2RlIHdhcyAyMDYsIHlvdSBjb3VsZCBjYXB0dXJlIAotICB0aGUgWFBhdGggZXhwcmVzc2lvbiBpbiB0aGlzIHdheTogCi0gIDxwcmU+Ci1TdHJpbmcgcXVlcnlFeHByZXNzaW9uID0KLSAgICAmcXVvdDtkZWNsYXJlIG5hbWVzcGFjZSB4cT0naHR0cDovL29wZW51cmkub3JnL3NlbGVjdFBhdGgnJnF1b3Q7ICsKLSAgICAmcXVvdDskdGhpcy94cTplbXBsb3llZXMveHE6ZW1wbG95ZWUveHE6cGhvbmVbY29udGFpbnMoLiwgJygyMDYpJyldJnF1b3Q7Ci08L3ByZT4KLSAgPHA+Tm90aWNlIGluIHRoZSBxdWVyeSBleHByZXNzaW9uIHRoYXQgdGhlIHZhcmlhYmxlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj4kdGhpczwvc3Bhbj4gCi0gICAgcmVwcmVzZW50cyB0aGUgY3VycmVudCBjb250ZXh0IG5vZGUgKHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPiAKLSAgICB0aGF0IHlvdSBhcmUgcXVlcnlpbmcgZnJvbSkuIEluIHRoaXMgZXhhbXBsZSB5b3UgYXJlIHF1ZXJ5aW5nIGZyb20gdGhlIGRvY3VtZW50IAotICAgIGxldmVsIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+LjwvcD4KLSAgPHA+WW91IGNvdWxkIHRoZW4gcHJpbnQgdGhlIHJlc3VsdHMgd2l0aCBjb2RlIHN1Y2ggYXMgdGhlIGZvbGxvd2luZzo8L3A+Ci0gIDxwcmU+Ci0vKiAKLSAqIFJldHJpZXZlIHRoZSBtYXRjaGluZyBwaG9uZSBlbGVtZW50cyBhbmQgYXNzaWduIHRoZSByZXN1bHRzIHRvIHRoZSBjb3JyZXNwb25kaW5nCi0gKiBnZW5lcmF0ZWQgdHlwZS4KLSAqLwotUGhvbmVUeXBlW10gcGhvbmVzID0gKFBob25lVHlwZVtdKWVtcERvYy5zZWxlY3RQYXRoKHF1ZXJ5RXhwcmVzc2lvbik7Ci0vKgotICogTG9vcCB0aHJvdWdoIHRoZSByZXN1bHRzLCBwcmludGluZyB0aGUgdmFsdWUgb2YgdGhlIHBob25lIGVsZW1lbnQuCi0gKi8KLWZvciAoaW50IGkgPSAwOyBpIDwgcGhvbmVzLmxlbmd0aDsgaSsrKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbihwaG9uZXNbaV0uc3RyaW5nVmFsdWUoKSk7Ci19ICA8L3ByZT4KLQotICA8aDM+Q2FsbGluZyBmcm9tIFhtbEN1cnNvcjwvaDM+Ci0gIDxwPldoZW4gY2FsbGVkIGZyb20gYW4gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvcjwvc3Bhbj4gaW5zdGFuY2UsIHRoZSAKLSAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2VsZWN0UGF0aDwvc3Bhbj4gbWV0aG9kIHJldHJpZXZlcyBhIGxpc3Qgb2Ygc2VsZWN0aW9ucywgCi0gICAgb3IgbG9jYXRpb25zIGluIHRoZSBYTUwuIFRoZSBzZWxlY3Rpb25zIGFyZSByZW1lbWJlcmVkIGJ5IHRoZSBjdXJzb3IgaW5zdGFuY2UuIAotICAgIFlvdSBjYW4gdXNlIG1ldGhvZHMgc3VjaCBhcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+dG9OZXh0U2VsZWN0aW9uPC9zcGFuPiAKLSAgICB0byBuYXZpZ2F0ZSBhbW9uZyB0aGVtLjwvcD4KLSAgPGRpdj4KLSAgICA8cD5UaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNlbGVjdFBhdGg8L3NwYW4+IG1ldGhvZCB0YWtlcyBhbiBYUGF0aCBleHByZXNzaW9uLiAKLSAgICAgIElmIHRoZSBleHByZXNzaW9uIHJldHVybnMgYW55IHJlc3VsdHMsIGVhY2ggb2YgdGhvc2UgcmVzdWx0cyBpcyBhZGRlZCBhcyAKLSAgICAgIGEgc2VsZWN0aW9uIHRvIHRoZSBjdXJzb3IncyBsaXN0IG9mIHNlbGVjdGlvbnMuIFlvdSBjYW4gbW92ZSB0aHJvdWdoIHRoZXNlIAotICAgICAgc2VsZWN0aW9ucyBpbiB0aGUgd2F5IHlvdSBtaWdodCB1c2UgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmphdmEudXRpbC5JdGVyYXRvcjwvc3Bhbj4gCi0gICAgICBtZXRob2RzIHRvIG1vdmUgdGhyb3VnaCBhIGNvbGxlY3Rpb24uPC9wPgotICAgIDxwPiBGb3IgZXhhbXBsZSwgZm9yIGEgcGF0aCBzdWNoIGFzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj4kdGhpcy9lbXBsb3llZXMvZW1wbG95ZWU8L3NwYW4+LCAKLSAgICAgIHRoZSByZXN1bHRzIHdvdWxkIGluY2x1ZGUgYSBzZWxlY3Rpb24gZm9yIGVhY2ggZW1wbG95ZWUgZWxlbWVudCBmb3VuZCBieSAKLSAgICAgIHRoZSBleHByZXNzaW9uLiBOb3RlIHRoYXQgdGhlIHZhcmlhYmxlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj4kdGhpczwvc3Bhbj4gCi0gICAgICBpcyBhbHdheXMgYm91bmQgdG8gdGhlIGN1cnJlbnQgY29udGV4dCBub2RlLCB3aGljaCBpbiB0aGlzIGV4YW1wbGUgaXMgdGhlIAotICAgICAgZG9jdW1lbnQuIEFmdGVyIGNhbGxpbmcgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zZWxlY3RQYXRoPC9zcGFuPiBtZXRob2QsIAotICAgICAgeW91IHdvdWxkIHVzZSB2YXJpb3VzICZxdW90O3NlbGVjdGlvbiZxdW90Oy1yZWxhdGVkIG1ldGhvZHMgdG8gd29yayB3aXRoIAotICAgICAgdGhlIHJlc3VsdHMuIFRoZXNlIG1ldGhvZHMgaW5jbHVkZTo8L3A+Ci0gIDwvZGl2PgotICA8dWw+Ci0gICAgPGxpPiAKLSAgICAgIDxkaXY+PHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmdldFNlbGVjdGlvbkNvdW50KCkgPC9zcGFuPnRvIHJldHJpZXZlIHRoZSAKLSAgICAgICAgbnVtYmVyIG9mIHNlbGVjdGlvbnMgcmVzdWx0aW5nIGZyb20gdGhlIHF1ZXJ5LjwvZGl2PgotICAgIDwvbGk+Ci0gICAgPGxpPiAKLSAgICAgIDxkaXY+IDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj50b05leHRTZWxlY3Rpb24oKTwvc3Bhbj4gdG8gbW92ZSB0aGUgY3Vyc29yIAotICAgICAgICB0byB0aGUgbmV4dCBzZWxlY3Rpb24gaW4gdGhlIGxpc3QgKHN1Y2ggYXMgdG8gdGhlIG9uZSBwb2ludGluZyBhdCB0aGUgCi0gICAgICAgIG5leHQgZW1wbG95ZWUgZWxlbWVudCBmb3VuZCkuPC9kaXY+Ci0gICAgPC9saT4KLSAgICA8bGk+IAotICAgICAgPGRpdj4gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnRvU2VsZWN0aW9uKGludCk8L3NwYW4+IHRvIG1vdmUgdGhlIGN1cnNvciAKLSAgICAgICAgdG8gdGhlIHNlbGVjdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IChzdWNoIGFzIHRvIHRoZSB0aGlyZCBlbXBsb3llZSAKLSAgICAgICAgZWxlbWVudCBpbiB0aGUgc2VsZWN0aW9uKS48L2Rpdj4KLSAgICA8L2xpPgotICAgIDxsaT4gCi0gICAgICA8ZGl2PiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aGFzTmV4dFNlbGVjdGlvbigpPC9zcGFuPiB0byBmaW5kIG91dCBpZiAKLSAgICAgICAgdGhlcmUgYXJlIG1vcmUgc2VsZWN0aW9ucyBhZnRlciB0aGUgY3Vyc29yJ3MgY3VycmVudCBwb3NpdGlvbi48L2Rpdj4KLSAgICA8L2xpPgotICAgIDxsaT4gCi0gICAgICA8ZGl2PjxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj4gY2xlYXJTZWxlY3Rpb25zKCk8L3NwYW4+IGNsZWFycyB0aGUgc2VsZWN0aW9ucyAKLSAgICAgICAgZnJvbSB0aGUgY3VycmVudCBjdXJzb3IuIFRoaXMgZG9lc24ndCBtb2RpZnkgdGhlIGRvY3VtZW50IChpbiBvdGhlciB3b3JkcywgCi0gICAgICAgIGl0IGRvZXNuJ3QgZGVsZXRlIHRoZSBzZWxlY3RlZCBYTUwpOyBpdCBtZXJlbHkgY2xlYXJzIHRoZSBzZWxlY3Rpb24gbGlzdCAKLSAgICAgICAgc28gdGhhdCB0aGUgY3Vyc29yIGlzIG5vIGxvbmdlciBrZWVwaW5nIHRyYWNrIG9mIHRob3NlIHBvc2l0aW9ucy48L2Rpdj4KLSAgICA8L2xpPgotICA8L3VsPgotICA8ZGl2PgotICAgIDxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgeW91IG1pZ2h0IHVzZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2VsZWN0UGF0aDwvc3Bhbj4sIAotICAgICAgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1c2g8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPiAKLSAgICAgIG1ldGhvZHMsIHRvIG1hbmV1dmVyIHRocm91Z2ggWE1MLCByZXRyaWV2aW5nIHNwZWNpZmljIHZhbHVlcy4gPC9wPgotICAgIDxwcmU+Ci1wdWJsaWMgdm9pZCBwcmludFppcHNBbmRXb3JrUGhvbmVzKFhtbE9iamVjdCB4bWwpCi17Ci0gICAgLy8gRGVjbGFyZSB0aGUgbmFtZXNwYWNlIHRoYXQgd2lsbCBiZSB1c2VkLgotICAgIFN0cmluZyB4cU5hbWVzcGFjZSA9IAotICAgICAgICAmcXVvdDtkZWNsYXJlIG5hbWVzcGFjZSB4cT0naHR0cDovL29wZW51cmkub3JnL3NlbGVjdFBhdGgnJnF1b3Q7OwotCi0gICAgLy8gSW5zZXJ0IGEgY3Vyc29yIGFuZCBtb3ZlIGl0IHRvIHRoZSBmaXJzdCBlbGVtZW50LgotICAgIFhtbEN1cnNvciBjdXJzb3IgPSB4bWwubmV3Q3Vyc29yKCk7Ci0gICAgY3Vyc29yLnRvRmlyc3RDaGlsZCgpOwotICAgIC8qIAotICAgICAqIFNhdmUgdGhlIGN1cnNvcidzIGN1cnJlbnQgbG9jYXRpb24gYnkgcHVzaGluZyBpdCAKLSAgICAgKiBvbnRvIGEgc3RhY2sgb2Ygc2F2ZWQgbG9jYXRpb25zLgotICAgICAqLwotICAgIGN1cnNvci5wdXNoKCk7Ci0gICAgLy8gUXVlcnkgZm9yIHppcCBlbGVtZW50cy4KLSAgICBjdXJzb3Iuc2VsZWN0UGF0aCh4cU5hbWVzcGFjZSArICZxdW90OyR0aGlzLy94cTp6aXAmcXVvdDspOwotICAgIC8qIAotICAgICAqIExvb3AgdGhyb3VnaCB0aGUgbGlzdCBvZiBzZWxlY3Rpb25zLCBnZXR0aW5nIHRoZSB2YWx1ZSBvZiAKLSAgICAgKiBlYWNoIGVsZW1lbnQuCi0gICAgICovCi0gICAgd2hpbGUgKGN1cnNvci50b05leHRTZWxlY3Rpb24oKSkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjdXJzb3IuZ2V0VGV4dFZhbHVlKCkpOwotICAgIH0KLSAgICAvLyBQb3AgdGhlIHNhdmVkIGxvY2F0aW9uIG9mZiB0aGUgc3RhY2suCi0gICAgY3Vyc29yLnBvcCgpOwotICAgIC8vIFF1ZXJ5IGFnYWluIGZyb20gdGhlIHRvcCwgdGhpcyB0aW1lIGZvciB3b3JrIHBob25lIG51bWJlcnMuCi0gICAgY3Vyc29yLnNlbGVjdFBhdGgoeHFOYW1lc3BhY2UgKyAmcXVvdDskdGhpcy8veHE6cGhvbmVbQGxvY2F0aW9uPSd3b3JrJ10mcXVvdDspOwotICAgIC8qIAotICAgICAqIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgZmlyc3Qgc2VsZWN0aW9uLCB0aGVtIHByaW50IHRoYXQgZWxlbWVudCdzCi0gICAgICogdmFsdWUuCi0gICAgICovCi0gICAgY3Vyc29yLnRvTmV4dFNlbGVjdGlvbigpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbihjdXJzb3IuZ2V0VGV4dFZhbHVlKCkpOwotICAgIC8vIERpc3Bvc2Ugb2YgdGhlIGN1cnNvci4KLSAgICBjdXJzb3IuZGlzcG9zZSgpOwotfQotPC9wcmU+Ci0gICAgPHA+VXNpbmcgc2VsZWN0aW9ucyBpcyBzb21ld2hhdCBsaWtlIHRyYWNraW5nIHRoZSBsb2NhdGlvbnMgb2YgbXVsdGlwbGUgY3Vyc29ycyAKLSAgICAgIHdpdGggYSBzaW5nbGUgY3Vyc29yLiBUaGlzIGJlY29tZXMgZXNwZWNpYWxseSBjbGVhciB3aGVuIHlvdSByZW1vdmUgdGhlIAotICAgICAgWE1MIGFzc29jaWF0ZWQgd2l0aCBhIHNlbGVjdGlvbi4gV2hlbiB5b3UgZG8gc28gdGhlIHNlbGVjdGlvbiBpdHNlbGYgcmVtYWlucyAKLSAgICAgIGF0IHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgcmVtb3ZlZCBYTUwgd2FzLCBidXQgbm93IHRoZSBzZWxlY3Rpb24ncyBsb2NhdGlvbiAKLSAgICAgIGlzIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgWE1MIHRoYXQgd2FzIGFmdGVyIHRoZSBYTUwgeW91IHJlbW92ZWQuIEluIG90aGVyIAotICAgICAgd29yZHMsIHJlbW92aW5nIFhNTCBjcmVhdGVkIGEga2luZCBvZiB2YWN1dW0gdGhhdCB3YXMgZmlsbGVkIGJ5IHRoZSBYTUwgCi0gICAgICBhZnRlciBpdCwgd2hpY2ggc2hpZnRlZCB1cCBpbnRvIHRoZSBzcGFjZSAmIzgyMTI7IHVwIGludG8gcG9zaXRpb24gaW1tZWRpYXRlbHkgCi0gICAgICBhZnRlciB0aGUgc2VsZWN0aW9uIGxvY2F0aW9uLiBUaGlzIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgaWYgdGhlIHNlbGVjdGlvbiAKLSAgICAgIGhhZCBiZWVuIGFub3RoZXIgY3Vyc29yLjwvcD4KLSAgICA8cD5GaW5hbGx5LCB3aGVuIHVzaW5nIHNlbGVjdGlvbnMga2VlcCBpbiBtaW5kIHRoYXQgdGhlIGxpc3Qgb2Ygc2VsZWN0aW9ucyAKLSAgICAgIGlzIGluIGEgc2Vuc2UgJnF1b3Q7bGl2ZSZxdW90Oy4gVGhlIGN1cnNvciB5b3UncmUgd29ya2luZyB3aXRoIGlzIGtlZXBpbmcgCi0gICAgICB0cmFjayBvZiB0aGUgc2VsZWN0aW9ucyBpbiB0aGUgbGlzdC4gSW4gb3RoZXIgd29yZHMsIGJlIHN1cmUgdG8gY2FsbCB0aGUgCi0gICAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Y2xlYXJTZWxlY3Rpb25zPC9zcGFuPiBtZXRob2Qgd2hlbiB5b3UncmUgZmluaXNoZWQgCi0gICAgICB3aXRoIHRoZSBzZWxlY3Rpb25zLCBqdXN0IGFzIHlvdSBzaG91bGQgY2FsbCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvci5kaXNwb3NlKCk8L3NwYW4+IAotICAgICAgbWV0aG9kIHdoZW4geW91J3JlIGZpbmlzaGVkIHVzaW5nIHRoZSBjdXJzb3IuPC9wPgotICA8L2Rpdj4KLSAgPGgyPlVzaW5nIHRoZSBleGVjUXVlcnkgTWV0aG9kPC9oMj4KLSAgPHA+VXNlIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+ZXhlY1F1ZXJ5PC9zcGFuPiBtZXRob2QgdG8gZXhlY3V0ZSBYUXVlcnkgCi0gICAgZXhwcmVzc2lvbnMgdGhhdCBhcmUgbW9yZSBzb3BoaXN0aWNhdGVkIHRoYW4gcGF0aHMuIFRoZXNlIGV4cHJlc3Npb25zIGluY2x1ZGUgCi0gICAgbW9yZSBzb3BoaXN0aWNhdGVkIGxvb3BzIGFuZCBGTFdSIChGb3IsIExldCwgV2hlcmUsIGFuZCBSZXN1bHRzKSBleHByZXNzaW9ucy4gCi0gIDwvcD4KLSAgPHAgY2xhc3M9Im5vdGVwYXJhIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEJlIHN1cmUgdG8gc2VlIHRoZSBzaW1wbGVFeHByZXNzaW9ucyAKLSAgICBzYW1wbGUgaW4gdGhlIFNhbXBsZXNBcHAgYXBwbGljYXRpb24gZm9yIGEgc2FtcGxpbmcgb2YgWFF1ZXJ5IGV4cHJlc3Npb25zIAotICAgIGluIHVzZS48L3A+Ci0gIDxoMz5DYWxsaW5nIGZyb20gWG1sT2JqZWN0PC9oMz4KLSAgPHA+VW5saWtlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zZWxlY3RQYXRoPC9zcGFuPiwgY2FsbGluZyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+ZXhlY1F1ZXJ5PC9zcGFuPiAKLSAgICBmcm9tIGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+IGluc3RhbmNlIHdpbGwgcmV0dXJuIGFuIAotICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+IGFycmF5LiBJZiB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbE9iamVjdDwvc3Bhbj4gCi0gICAgaW5zdGFuY2VzIHJlc3VsdGluZyBmcm9tIHRoZSBYUXVlcnkgbWF0Y2ggYSByZWNvZ25pemVkIFhNTEJlYW5zIHR5cGUgKHRoZSAKLSAgICBuYW1lc3BhY2UgYW5kIHRvcCBsZXZlbCBlbGVtZW50IG5hbWUgbWF0Y2ggdXAgd2l0aCBhbiBYTUxCZWFucyB0eXBlKSB0aGVuIAotICAgIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPiB3aWxsIGJlIHR5cGVkOyBvdGhlcndpc2UgdGhlIAotICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+IHdpbGwgYmUgdW50eXBlZC48L3A+Ci0gIDxoMz5DYWxsaW5nIGZyb20gWG1sQ3Vyc29yPC9oMz4KLTwvZGl2PgotICAKLTxkaXY+IAotICA8cD5DYWxsaW5nIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5leGVjUXVlcnk8L3NwYW4+IGZyb20gYW4gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvcjwvc3Bhbj4gCi0gICAgaW5zdGFuY2UgcmV0dXJucyBhIG5ldyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPiBpbnN0YW5jZS4gCi0gICAgVGhlIGN1cnNvciByZXR1cm5lZCBpcyBwb3NpdGlvbmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgeG1sIGRvY3VtZW50IHJlcHJlc2VudGluZyAKLSAgICB0aGUgcXVlcnkgcmVzdWx0cywgYW5kIHlvdSBjYW4gdXNlIGl0IHRvIG1vdmUgdGhyb3VnaCB0aGUgcmVzdWx0cywgY3Vyc29yLXN0eWxlIAotICAgIChmb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9ImNvbk5hdmlnYXRpbmdYTUx3aXRoQ3Vyc29ycy5odG1sIj5OYXZpZ2F0aW5nIAotICAgIFhNTCB3aXRoIEN1cnNvcnM8L2E+KS4gSWYgdGhlIGRvY3VtZW50IHJlc3VsdGluZyBmcm9tIHRoZSBxdWVyeSBleGVjdXRpb24gCi0gICAgcmVwcmVzZW50cyBhIHJlY29nbml6ZWQgWE1MQmVhbnMgdHlwZSAodGhlIG5hbWVzcGFjZSBhbmQgdG9wIGxldmVsIGVsZW1lbnQgCi0gICAgbmFtZSBtYXRjaCB1cCB3aXRoIGFuIFhNTEJlYW5zIHR5cGUpIHRoZW4gdGhlIGRvY3VtZW50IHJlc3VsdGluZyBmcm9tIHRoZSAKLSAgICB4cXVlcnkgd2lsbCBoYXZlIHRoYXQgSmF2YSB0eXBlOyBvdGhlcndpc2UgdGhlIHJlc3VsdGluZyBkb2N1bWVudCB3aWxsIGJlIAotICAgIHVudHlwZWQuPC9wPgotICA8aDI+UmVsYXRlZCBUb3BpY3M8L2gyPgotPC9kaXY+Ci08cD48YSBocmVmPSJjb25HZXR0aW5nU3RhcnRlZHdpdGhYTUxCZWFucy5odG1sIj5HZXR0aW5nIFN0YXJ0ZWQgd2l0aCBYTUxCZWFuczwvYT48L3A+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+IAotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0KLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9ndWlkZS9jb25VbmRlcnN0YW5kaW5nWE1MVG9rZW5zLmh0bWwgYi92MS9kb2NzL2d1aWRlL2NvblVuZGVyc3RhbmRpbmdYTUxUb2tlbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQzMDJmNC4uMDAwMDAwMAotLS0gYS92MS9kb2NzL2d1aWRlL2NvblVuZGVyc3RhbmRpbmdYTUxUb2tlbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi08IWRvY3R5cGUgSFRNTCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJkb2N0aXRsZSIgLS0+Ci08dGl0bGU+VW5kZXJzdGFuZGluZyBYTUwgVG9rZW5zPC90aXRsZT4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4gCi08IS0tKE1ldGEpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JENIQVJTRVQ7Ij4KLQotCi08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJtZXRhdGFncyIgLS0+Ci0KLTxtZXRhIG5hbWU9ImNvbXBvbmVudCIgY29udGVudD0iIj4KLTwhLS0gSW4gdGhlIGRlc2NyaXB0aW9uIG1ldGF0YWcsIHBsZWFzZSBwcm92aWRlIGEgQlJJRUYgZGVzY3JpcHRpb24gb2YgdGhlIHRvcGljIGNvbnRlbnRzLiAtLT4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSIiPgotPCEtLSBJbiB0aGUgY29tcG9uZW50IG1ldGF0YWcsIHBsZWFzZSBsaXN0IGtleXdvcmRzIHRoYXQgd2lsbCBoZWxwIGEgdXNlciBzZWFyY2ggZm9yIHRoaXMgdG9waWMuIC0tPgotPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci0KLTwhLS0oTGlua3MpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJoZWFkIiAtLT4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTxsaW5rIGhyZWY9Ii4uL3htbGJlYW5zLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Ci08YSBocmVmPSIuLi8uLi8uLi9jb3JlL2luZGV4Lmh0bWwiIGlkPSJpbmRleCI+PC9hPgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL3RvcGljSW5mby5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvQ29va2llQ2xhc3MuanMiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL2Rpc3BsYXlDb250ZW50LmpzIj48L3NjcmlwdD4KLTwvaGVhZD4KLQotPCEtLShCb2R5KT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTxib2R5PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0KLTwvc2NyaXB0PgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iYm9keSIgLS0+IAotPGRpdiBpZD10b3BpY3RpdGxlPiAKLSAgPHAgY2xhc3M9VGl0bGU+VW5kZXJzdGFuZGluZyBYTUwgVG9rZW5zPC9wPgotPC9kaXY+Ci08ZGl2IGlkPXRvcGljdGV4dD4gCi0gIDxwPkFuIFhNTCBjdXJzb3IgKGFuIGluc3RhbmNlIG9mIHRoZSA8YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDdXJzb3IuaHRtbCI+PHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvcjwvc3Bhbj48L2E+IAotICAgIGludGVyZmFjZSkgbW92ZXMgZnJvbSB0b2tlbiB0byB0b2tlbiBhcyB5b3VyIGNvZGUgbW92ZXMgdGhlIGN1cnNvci4gV2hlbiB5b3UgCi0gICAgbW92ZSBhIGN1cnNvciB1c2luZyBhIG1ldGhvZCBzdWNoIGFzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj50b1BhcmVudDwvc3Bhbj4sIAotICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj50b0ZpcnN0QXR0cmlidXRlPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnRvUHJldlNpYmxpbmc8L3NwYW4+LCAKLSAgICBhbmQgc28gb24sIHRoZSBjdXJzb3IgbW92ZXMgdG8gdGhlIHRva2VuIGZpdHRpbmcgdGhlIGRlc2NyaXB0aW9uLiBJZiB0aGVyZSAKLSAgICBpcyBubyBhcHByb3ByaWF0ZSB0b2tlbiB0byBtb3ZlIHRvLCB0aGUgY3Vyc29yIHJlbWFpbnMgd2hlcmUgaXQgaXMsIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+ZmFsc2U8L3NwYW4+IAotICAgIGlzIHJldHVybmVkIHRvIGluZGljYXRlIHRoYXQgaXQgZGlkbid0IG1vdmUuIEZvciBleGFtcGxlLCBpZiB0aGUgY3Vyc29yIGlzIAotICAgIGF0IHRoZSBFTkRET0MgdG9rZW4gKHRoZSBsYXN0IHRhZyBpbiB0aGUgZG9jdW1lbnQpLCBhIGNhbGwgdG8gdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj50b05leHRTaWJsaW5nPC9zcGFuPiAKLSAgICBtZXRob2Qgd2lsbCBub3QgbW92ZSB0aGUgY3Vyc29yIGFuZCB3aWxsIHJldHVybiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+ZmFsc2U8L3NwYW4+IAotICAgIHRvIGluZGljYXRlIHRoYXQgdGhlIG1vdmUgd2FzIHVuc3VjY2Vzc2Z1bC48L3A+Ci0gIDxwPk5vdGUgdGhhdCB3aGlsZSB5b3UgY2FuIGNhbGwgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3IuY3VycmVudFRva2VuVHlwZTwvc3Bhbj4gCi0gICAgbWV0aG9kIHRvIGZpbmQgb3V0IHdoaWNoIHRva2VuIHR5cGUgdGhlIGN1cnNvciBpcyBhdCwgeW91IG1pZ2h0IGZpbmQgaXQgbW9yZSAKLSAgICBjb252ZW5pZW50IHRvIHVzZSBhIG1ldGhvZCBzdWNoIGFzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pc0VuZGRvYzwvc3Bhbj4uIAotICAgIFRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPiBpbnRlcmZhY2UgcHJvdmlkZXMgc2V2ZXJhbCBtZXRob2RzIAotICAgIHRoYXQgbWFrZSBpdCBlYXN5IHRvIGRpc2NvdmVyIHdoZXRoZXIgdGhlIGN1cnNvciB5b3UncmUgbW92aW5nIGlzIGF0IHRoZSB0b2tlbiAKLSAgICB5b3UncmUgbG9va2luZyBmb3IuIFRoZXNlIG1ldGhvZHMsIHN1Y2ggYXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmlzU3RhcnQ8L3NwYW4+LCAKLSAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aXNBdHRyPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmlzVGV4dDwvc3Bhbj4sIAotICAgIGFuZCBzbyBvbiwgcmV0dXJuIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmJvb2xlYW48L3NwYW4+IHZhbHVlIHRoYXQgaW5kaWNhdGVzIAotICAgIHdoZXRoZXIgdGhlIGN1cnNvciBpcyBhdCB0aGUgdG9rZW4gdHlwZSBpbiBxdWVzdGlvbi48L3A+Ci0gIDxQPlRva2VucyBhcmUgcmVwcmVzZW50ZWQgYnkgY29uc3RhbnRzIGluIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ3Vyc29yLlRva2VuVHlwZS5odG1sIj5Ub2tlblR5cGU8L2E+PC9zcGFuPiAKLSAgICBjbGFzcywgYW4gaW5uZXIgY2xhc3Mgb2YgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+IGludGVyZmFjZS4gCi0gICAgRWFjaCBoYXMgYSBjb25zdGFudCB5b3UgY2FuIHVzZSBpbiBzd2l0Y2ggc3RhdGVtZW50cyB0byBwZXJmb3JtIGJ5LXRva2VuIGFjdGlvbnMuIAotICAgIFRoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgdGhlIHRva2VuIHR5cGVzOjwvUD4KLSAgPFRBQkxFIGlkPSJUYWJsZTEiPgotICAgIDxUUj4gCi0gICAgICA8VEQ+PFNUUk9ORz5Ub2tlbiBUeXBlPC9TVFJPTkc+PC9URD4KLSAgICAgIDxURD48U1RST05HPlN3aXRjaCBDb25zdGFudDwvU1RST05HPjwvVEQ+Ci0gICAgICA8VEQ+PFNUUk9ORz5EZXNjcmlwdGlvbjwvU1RST05HPjwvVEQ+Ci0gICAgPC9UUj4KLSAgICA8VFI+IAotICAgICAgPFREPlNUQVJURE9DPC9URD4KLSAgICAgIDxURD5JTlRfU1RBUlRET0M8L1REPgotICAgICAgPFREPlJlcHJlc2VudHMgdGhlIHN0YXJ0IG9mIHRoZSBYTUwuIEFsd2F5cyB0aGUgZmlyc3QgdG9rZW4uIFRoZSBkb2N1bWVudCAKLSAgICAgICAgZWxlbWVudCBpdHNlbGYgaXMgcmVwcmVzZW50ZWQgYnkgYSBTVEFSVCB0b2tlbiwgbm90IHRoZSBTVEFSVERPQyB0b2tlbi48L1REPgotICAgIDwvVFI+Ci0gICAgPFRSPiAKLSAgICAgIDxURD5FTkRET0MgPC9URD4KLSAgICAgIDxURD5JTlRfRU5ERE9DPC9URD4KLSAgICAgIDxURD5SZXByZXNlbnRzIHRoZSBlbmQgb2YgdGhlIFhNTC4gQWx3YXlzIHRoZSBsYXN0IHRva2VuLjwvVEQ+Ci0gICAgPC9UUj4KLSAgICA8VFI+IAotICAgICAgPFREPlNUQVJUIDwvVEQ+Ci0gICAgICA8VEQ+SU5UX1NUQVJUPC9URD4KLSAgICAgIDxURD5SZXByZXNlbnRzIHRoZSBzdGFydCBvZiBhbiBlbGVtZW50LjwvVEQ+Ci0gICAgPC9UUj4KLSAgICA8VFI+IAotICAgICAgPFREPkVORCA8L1REPgotICAgICAgPFREPklOVF9FTkQ8L1REPgotICAgICAgPFREPlJlcHJlc2VudHMgdGhlIGVuZCBvZiBhbiBlbGVtZW50LiBUaGUgRU5EIHRva2VuIGhhcyBubyB2YWx1ZSwgYnV0IG1hcmtzIAotICAgICAgICB0aGUgZWxlbWVudCdzIGVuZC48L1REPgotICAgIDwvVFI+Ci0gICAgPFRSPiAKLSAgICAgIDxURD5URVhUPC9URD4KLSAgICAgIDxURD5JTlRfVEVYVDwvVEQ+Ci0gICAgICA8VEQ+UmVwcmVzZW50cyB0ZXh0LjwvVEQ+Ci0gICAgPC9UUj4KLSAgICA8VFI+IAotICAgICAgPFREPkFUVFIgPC9URD4KLSAgICAgIDxURD5JTlRfQVRUUjwvVEQ+Ci0gICAgICA8VEQ+UmVwcmVzZW50cyBhbiBhdHRyaWJ1dGUuIEFUVFIgdG9rZW5zIGFyZSBhbGxvd2VkIHRvIGFwcGVhciBhZnRlciBhIFNUQVJURE9DIAotICAgICAgICBvciBTVEFSVCB0b2tlbi48L1REPgotICAgIDwvVFI+Ci0gICAgPFRSPiAKLSAgICAgIDxURD5OQU1FU1BBQ0U8L1REPgotICAgICAgPFREPklOVF9OQU1FU1BBQ0U8L1REPgotICAgICAgPFREPlJlcHJlc2VudHMgYSBuYW1lc3BhY2UgKHhtbG5zKSBhdHRyaWJ1dGUuIEFsc28gb25seSBhbGxvd2VkIGFmdGVyIFNUQVJUIAotICAgICAgICBvciBTVEFSVERPQyB0b2tlbnMuPC9URD4KLSAgICA8L1RSPgotICAgIDxUUj4gCi0gICAgICA8VEQ+Q09NTUVOVCA8L1REPgotICAgICAgPFREPklOVF9DT01NRU5UPC9URD4KLSAgICAgIDxURD5SZXByZXNlbnRzIGEgY29tbWVudC48L1REPgotICAgIDwvVFI+Ci0gICAgPFRSPiAKLSAgICAgIDxURD5QUk9DSU5TVCA8L1REPgotICAgICAgPFREPklOVF9QUk9DSU5TVDwvVEQ+Ci0gICAgICA8VEQ+UmVwcmVzZW50cyBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uPC9URD4KLSAgICA8L1RSPgotICA8L1RBQkxFPgotICA8UD5BcyB5b3UgdXNlIGEgY3Vyc29yIHRvIG5hdmlnYXRlIHRocm91Z2ggWE1MLCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlIGNvbnZlbmllbmNlIAotICAgIG1ldGhvZHMgZGVzY3JpYmVkIGFib3ZlIHRvIGRpc2NvdmVyIHdoZXRoZXIgeW91J3JlIGF0IHRoZSB0b2tlbiB5b3UncmUgbG9va2luZyAKLSAgICBmb3IsIG9yIHVzZSB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvci5jdXJyZW50VG9rZW5UeXBlPC9zcGFuPiZuYnNwO21ldGhvZCAKLSAgICB0byBkaXNjb3ZlciB0aGUgY3VycmVudCB0b2tlbidzIHR5cGUuIFRoZSBmb2xsb3dpbmcgZmlndXJlIGlsbHVzdHJhdGVzIGV4YW1wbGUgCi0gICAgbG9jYXRpb25zIGZvciB0b2tlbiB0eXBlczo8L1A+Ci0gIDxQPjxJTUcgc3JjPSIuLi9pbWFnZXMvY29uQ3Vyc29yVG9rZW5Mb2NhdGlvbnMuZ2lmIiB3aWR0aD0iNzI3IiBoZWlnaHQ9IjUzMiI+Ci0gIDxoMj5Td2l0Y2hpbmcgdG8gVGVzdCBmb3IgVG9rZW4gVHlwZXM8L2gyPgotICA8cD5IZXJlJ3MgYSBiaXQgb2YgY29kZSBpbGx1c3RyYXRpbmcgaG93IHlvdSBtaWdodCB1c2UgYSBKYXZhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zd2l0Y2g8L3NwYW4+IAotICAgIHN0YXRlbWVudCB0byB0ZXN0IGZvciB0aGUgU1RBUlQgdG9rZW4gdHlwZS48L3A+Ci0gIDxwcmU+Ci0vLyBUYWtlIGFuIGluY29taW5nIFhtbE9iamVjdCBhbmQgaW5zZXJ0IGEgY3Vyc29yLgotWG1sQ3Vyc29yIGRvY3VtZW50Q3Vyc29yID0geG1sRG9jLm5ld0N1cnNvcigpOwotIAotLyogCi0gKiBMb29wIHRocm91Z2ggdGhlIGRvY3VtZW50LCBwYXNzaW5nIHRoZSBjdXJzb3Igd2hlbiBpdCBzdG9wcyBhdCBlYWNoIHRva2VuIAotICogdG8gYSBmdW5jdGlvbiBkZXNpZ25lZCB0byBkaXNjb3ZlciB0aGUgdG9rZW4gdHlwZS4gQ29udGludWUgdGhlIGxvb3AKLSAqIGFzIGxvbmcgYXQgdGhlIGN1cnNvciBpcyBhdCBhIHRva2VuICh1bnRpbCBpdCByZWFjaGVzIHRoZSBlbmQpLgotICovCi13aGlsZSAoIWRvY3VtZW50Q3Vyc29yLnRvTmV4dFRva2VuKCkuaXNOb25lKCkpIAotewotICAgIC8qCi0gICAgICogVXNlIHRoZSBpbnRWYWx1ZSBtZXRob2QgdG8gcmV0dXJuIHRoZSBpbnQgY29ycmVzcG9uZGluZyB0byB0aGUgCi0JICogY3VycmVudCB0b2tlbiB0eXBlLiBJZiBpdCBpcyB0aGUgdmFsdWUgZm9yIElOVF9TVEFSVCwKLQkgKiB0aGVuIHlvdSBoYXZlIGEgbWF0Y2guCi0JICovCi0gICAgc3dpdGNoIChjdXJzb3IuY3VycmVudFRva2VuVHlwZSgpLmludFZhbHVlKCkpCi0gICAgeyAgICAgICAgCi0gICAgICAgIGNhc2UgVG9rZW5UeXBlLklOVF9TVEFSVDoKLSAgICAgICAgLy8gUHJpbnQgb3V0IHRoZSB0b2tlbiB0eXBlIGFuZCBhIG1lc3NhZ2UuCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjdXJzb3IuY3VycmVudFRva2VuVHlwZSgpICsgCi0gICAgICAgICAgICAiOyBjdXJzb3IgaXMgYXQgdGhlIHN0YXJ0IG9mIGFuIGVsZW1lbnQuIik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLS8vIEJlIHN1cmUgdG8gZGlzcG9zZSBvZiBhIGN1cnNvciB3aGVuIHlvdSdyZSBmaW5pc2hlZC4KLWRvY3VtZW50Q3Vyc29yLmRpc3Bvc2UoKTsKLTwvcHJlPgotICA8cD5UaGUgc2NvcGUgb2YgYW4gWE1MIGN1cnNvciBpcyB0aGUgWE1MIGRvY3VtZW50IGluIHdoaWNoIGl0IGlzIGNyZWF0ZWQuIEZvciAKLSAgICBleGFtcGxlLCB5b3UgY2FuIGNyZWF0ZSBhIGN1cnNvciBhdCB0aGUgb3JkZXJJdGVtIGVsZW1lbnQgaW4gdGhlIGV4YW1wbGUgZWFybGllciAKLSAgICBpbiB0aGlzIHRvcGljLiBJZiB5b3UgdGhlbiB1c2UgdGhhdCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPiAKLSAgICBpbnN0YW5jZSdzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj50b05leHRUb2tlbjwvc3Bhbj4gbWV0aG9kIHRvIG1vdmUgdGhlIAotICAgIGN1cnNvciB1bnRpbCBpdCB3b24ndCBtb3ZlIGFueSBmdXJ0aGVyLCB5b3UnbGwgaGF2ZSByZWFjaGVkIHRoZSBFTkRET0MgdG9rZW4uIAotICAgIEluIHRoaXMgZXhhbXBsZSwgdGhhdCdzIGF0IHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Jmx0Oy9iYXRjaFdpZGdldE9yZGVyJmd0Ozwvc3Bhbj4gCi0gICAgdGFnLiBJbiBvdGhlciB3b3JkcywgdGhlIGN1cnNvcidzIHNjb3BlIGlzIG5vdCBsaW1pdGVkIHRvIHRoZSBlbGVtZW50IGF0IHdoaWNoIAotICAgIGl0IHdhcyBjcmVhdGVkLjwvcD4KLSAgPHAgY2xhc3M9cmVsYXRlZHRvcGljcz5SZWxhdGVkIFRvcGljczwvcD4KLSAgPHA+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ3Vyc29yLlRva2VuVHlwZS5odG1sIj5YbWxDdXJzb3IuVG9rZW5UeXBlIAotICAgIENsYXNzPC9hPjwvcD4KLSAgPHA+PGEgaHJlZj0iY29uTmF2aWdhdGluZ1hNTHdpdGhDdXJzb3JzLmh0bWwiPk5hdmlnYXRpbmcgWE1MIHdpdGggQ3Vyc29yczwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCi08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL2RvY3MvZ3VpZGUvY29uVXNpbmdCb29rbWFya3NUb0Fubm90YXRlWE1MLmh0bWwgYi92MS9kb2NzL2d1aWRlL2NvblVzaW5nQm9va21hcmtzVG9Bbm5vdGF0ZVhNTC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTJlZTk3Li4wMDAwMDAwCi0tLSBhL3YxL2RvY3MvZ3VpZGUvY29uVXNpbmdCb29rbWFya3NUb0Fubm90YXRlWE1MLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08IWRvY3R5cGUgSFRNTCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJkb2N0aXRsZSIgLS0+Ci08dGl0bGU+VXNpbmcgQm9va21hcmtzIHRvIEFubm90YXRlIFhNTDwvdGl0bGU+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+IAotPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+Ci0KLQotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgotCi08bWV0YSBuYW1lPSJjb21wb25lbnQiIGNvbnRlbnQ9IiI+Ci08IS0tIEluIHRoZSBkZXNjcmlwdGlvbiBtZXRhdGFnLCBwbGVhc2UgcHJvdmlkZSBhIEJSSUVGIGRlc2NyaXB0aW9uIG9mIHRoZSB0b3BpYyBjb250ZW50cy4gLS0+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iIj4KLTwhLS0gSW4gdGhlIGNvbXBvbmVudCBtZXRhdGFnLCBwbGVhc2UgbGlzdCBrZXl3b3JkcyB0aGF0IHdpbGwgaGVscCBhIHVzZXIgc2VhcmNoIGZvciB0aGlzIHRvcGljLiAtLT4KLTxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotCi08IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Ci08bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgotPGEgaHJlZj0iLi4vLi4vLi4vY29yZS9pbmRleC5odG1sIiBpZD0iaW5kZXgiPjwvYT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS90b3BpY0luZm8uanMiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL0Nvb2tpZUNsYXNzLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9kaXNwbGF5Q29udGVudC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTwhLS0oQm9keSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08Ym9keT4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCi08L3NjcmlwdD4KLTwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImJvZHkiIC0tPiAKLTxkaXYgaWQ9dG9waWN0aXRsZT4gCi0gIDxwIGNsYXNzPVRpdGxlPlVzaW5nIEJvb2ttYXJrcyB0byBBbm5vdGF0ZSBYTUw8L3A+Ci08L2Rpdj4KLTxkaXYgaWQ9dG9waWN0ZXh0PiAKLSAgPHA+WW91IGNhbiB1c2UgYSBjdXJzb3IgdG8gaW5zZXJ0IGJvb2ttYXJrcyB0aGF0IGFubm90YXRlIFhNTCB3aXRoIG1hcmtlcnMgY29udGFpbmluZyAKLSAgICBpbmZvcm1hdGlvbiB5b3UgZGVzaWduLiBUaGVzZSBib29rbWFya3MgYXJlbid0IHdyaXR0ZW4gaW50byB0aGUgWE1MIGl0c2VsZiwgCi0gICAgYnV0IGluIGEgc2Vuc2UgImhhbmciIGZyb20gdGhlIGxvY2F0aW9uIHdoZXJlIGl0IHdhcyBpbnNlcnRlZC4gSW4gdGhpcyB3YXkgCi0gICAgeW91IGNhbiBhc3NvY2lhdGUgYXJiaXRyYXJ5IHBpZWNlcyBvZiBpbmZvcm1hdGlvbiB3aXRoIHNwZWNpZmljIHBhcnRzIG9mIHRoZSAKLSAgICBYTUwuPC9wPgotICA8UD5Zb3UgZGVzaWduIHlvdXIgb3duIGJvb2ttYXJrIGNsYXNzZXMgYnkgZXh0ZW5kaW5nIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDdXJzb3IuWG1sQm9va21hcmsuaHRtbCI+WG1sQm9va21hcms8L2E+PC9zcGFuPiwgCi0gICAgYSBuZXN0ZWQgY2xhc3Mgb2YgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5odG1sIj5YbWxDdXJzb3I8L2E+PC9zcGFuPi4gCi0gICAgWW91IGNhbiBkZXNpZ24geW91ciBib29rbWFyayBjbGFzcyB0byBjb250YWluIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHlvdXIgCi0gICAgbmVlZHMuIDwvUD4KLSAgPFA+SW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+T3JkZXJCb29rbWFyazwvc3Bhbj4gaXMgCi0gICAgYW4gaW5uZXIgY2xhc3MgdGhhdCBleHRlbmRzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3IuWG1sQm9va21hcms8L3NwYW4+LiAKLSAgICBJdCBtZXJlbHkgc3RvcmVzIGEgcGllY2Ugb2YgdGV4dC48L1A+Ci0gIDxQUkU+Ci0vKiAKLSAqIFRoZSBPcmRlckJvb2ttYXJrIGNsYXNzIGluY2x1ZGVzIGEgY29uc3RydWN0b3IgdGhyb3VnaCB3aGljaCB5b3Ugd2lsbCAKLSAqIGluc2VydCB5b3VyIGJvb2ttYXJrJ3MgY29udGVudC4gSXQgYWxzbyBpbmNsdWRlcyBnZXQgYW5kIHNldCBtZXRob2RzCi0gKiB5b3UgY2FuIHVzZSB0byByZXRyaWV2ZSBhbmQgY2hhbmdlIHRoZSBjb250ZW50LgotICovCi1zdGF0aWMgY2xhc3MgT3JkZXJCb29rbWFyayBleHRlbmRzIFhtbEN1cnNvci5YbWxCb29rbWFyayB7Ci0gICAgcHVibGljIE9yZGVyQm9va21hcmsgKFN0cmluZyB0ZXh0KSB7IFRFWFQgPSB0ZXh0OyB9Ci0gICAgcHVibGljIFN0cmluZyBURVhUOwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsgcmV0dXJuIFRFWFQ7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBuZXdUZXh0KSB7IFRFWFQgPSBuZXdUZXh0OyB9Ci19Ci08L1BSRT4KLSAgPHA+WW91IGNhbiB1c2UgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgdG8gc3RvcmUgYm9va21hcmtzIGF0IHBsYWNlcyBpbiB5b3VyIAotICAgIFhNTC4gVGhlIGZvbGxvd2luZyBleGNlcnB0IG9mIGNvZGUgY3JlYXRlcyBhIGN1cnNvciBhbmQgYW4gaW5zdGFuY2Ugb2YgdGhlIAotICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5PcmRlckJvb2ttYXJrPC9zcGFuPiBjbGFzcy4gVGhlbiBpdCB1c2VzIHRoZSBjdXJzb3IgCi0gICAgdG8gaW5zZXJ0IHRoZSBib29rbWFyayBhdCB0aGUgY3Vyc29yJ3MgY3VycmVudCBsb2NhdGlvbi48L3A+Ci0gIDxwcmU+Ci0gICAgWG1sQ3Vyc29yIG9yZGVyQ3Vyc29yID0geG1sRG9jLm5ld0N1cnNvcigpOwotICAgIE9yZGVyQm9va21hcmsgdGhpc0Jvb2ttYXJrID0gbmV3IE9yZGVyQm9va21hcmsoImZvbyIpOwotICAgIG9yZGVyQ3Vyc29yLnNldEJvb2ttYXJrKHRoaXNBbm5vdGF0aW9uKTsKLTwvcHJlPgotICA8cCBjbGFzcz1yZWxhdGVkdG9waWNzPlJlbGF0ZWQgVG9waWNzPC9wPgotICA8cD48YSBocmVmPSJjb25OYXZpZ2F0aW5nWE1Md2l0aEN1cnNvcnMuaHRtbCI+TmF2aWdhdGluZyBYTUwgd2l0aCBDdXJzb3JzPC9hPjwvcD4KLTwvZGl2PgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0KLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9ndWlkZS9jb25YTUxCZWFuc1N1cHBvcnRCdWlsdEluU2NoZW1hVHlwZXMuaHRtbCBiL3YxL2RvY3MvZ3VpZGUvY29uWE1MQmVhbnNTdXBwb3J0QnVpbHRJblNjaGVtYVR5cGVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNzc1OWUuLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy9ndWlkZS9jb25YTUxCZWFuc1N1cHBvcnRCdWlsdEluU2NoZW1hVHlwZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi08IWRvY3R5cGUgSFRNTCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJkb2N0aXRsZSIgLS0+Ci08dGl0bGU+SmF2YSBUeXBlcyBmb3IgWE1MIFNjaGVtYTwvdGl0bGU+Ci08IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+IAotPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+Ci0KLQotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgotCi08bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9InlvdXIgbmFtZSI+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgdG9waWMgY29udGVudHMuIj4KLTxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSJrZXl3b3JkcyB0byBoZWxwIGluIHNlYXJjaGVzIj4KLTxtZXRhIG5hbWU9ImRhdGUgbGFzdCBtb2RpZmllZCIgY29udGVudD0iMTAvMjUvMDIiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotCi08IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+Ci08bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgotPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTxhIGhyZWY9Ii4uLy4uLy4uL2NvcmUvaW5kZXguaHRtbCIgaWQ9ImluZGV4Ij48L2E+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvdG9waWNJbmZvLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9Db29raWVDbGFzcy5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvZGlzcGxheUNvbnRlbnQuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08IS0tKEJvZHkpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPGJvZHk+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotPC9zY3JpcHQ+Ci08IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJib2R5IiAtLT4gCi08aDE+IFhNTEJlYW5zIFN1cHBvcnQgZm9yIEJ1aWx0LUluIFNjaGVtYSBUeXBlczwvaDE+Ci08cD5KdXN0IGFzIHdpdGggdHlwZXMgaW4gWE1MIHNjaGVtYSwgdGhlIFhNTEJlYW5zIHR5cGVzIGJhc2VkIG9uIHNjaGVtYSBhcmUgYXJyYW5nZWQgCi0gIGluIGEgaGllcmFyY2h5LiBJbiBnZW5lcmFsLCB0aGUgaGllcmFyY2h5IG9mIFhNTEJlYW4gdHlwZXMgbWlycm9ycyB0aGUgaGllcmFyY2h5IAotICBvZiB0aGUgc2NoZW1hIHR5cGVzIHRoZW1zZWx2ZXMuIFhNTCBzY2hlbWEgdHlwZXMgYWxsIGluaGVyaXQgZnJvbSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6YW55VHlwZTwvc3Bhbj4gCi0gICh3aGljaCBpcyBhdCB0aGUgcm9vdCBvZiB0aGUgaGllcmFyY2h5KTsgWE1MQmVhbnMgdHlwZXMgaW5oZXJpdCBmcm9tIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+LjwvcD4KLTxwPkluIFhNTCBzY2hlbWEsIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czphbnlUeXBlPC9zcGFuPiBpcyB0aGUgcm9vdCB0eXBlIAotICBmb3IgdHdvIHR5cGUgY2F0ZWdvcmllczogYnVpbHQtaW4gYW5kIHVzZXItZGVyaXZlZC4gQnVpbHQtaW4gc2NoZW1hIHR5cGVzIGFyZSAKLSAgY29tbW9uIHR5cGVzIGRlZmluZWQgYnkgdGhlIFhNTCBzY2hlbWEgc3BlY2lmaWNhdGlvbi4gVXNlci1kZXJpdmVkIHR5cGVzIGFyZSAKLSAgdGhvc2UgeW91IGRlZmluZSBpbiB5b3VyIHNjaGVtYS4gVGhpcyB0b3BpYyBsaXN0cyB0aGUgYnVpbHQtaW4gdHlwZXMgcHJvdmlkZWQgCi0gIHdpdGggWE1MQmVhbnMuIEZvciBpbmZvcm1hdGlvbiBhYm91dCB1c2VyLWRlcml2ZWQgdHlwZXMgYW5kIHRoZSBKYXZhIHR5cGVzIGdlbmVyYXRlZCAKLSAgZnJvbSB0aGVtLCBzZWUgPGEgaHJlZj0iY29uSmF2YVR5cGVzR2VuZXJhdGVkRnJvbVVzZXJEZXJpdmVkLmh0bWwiPkphdmEgVHlwZXMgR2VuZXJhdGVkIAotICBmcm9tIFVzZXItRGVyaXZlZCBTY2hlbWEgVHlwZXM8L2E+LjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgZmlndXJlIGlsbHVzdHJhdGVzIHRoZSBoaWVyYXJjaHkgb2YgdHlwZXMsIHNob3dpbmcgYm90aCBidWlsdC1pbiAKLSAgc2NoZW1hIHR5cGVzIGFuZCB0aGVpciBYTUxCZWFucyBwYXJhbGxlbHMuIE5vdGljZSwgdG9vLCB0aGF0IG5lYXJseSBhbGwgb2YgdGhlIAotICBidWlsdC1pbiB0eXBlcyBhcmUgYWxzbyBhdmFpbGFibGUgYXMgbmF0dXJhbCBKYXZhIHR5cGVzLjwvcD4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvY29uWE1MVHlwZUhpZXJhcmNoeS5naWYiIHdpZHRoPSI4NjUiIGhlaWdodD0iODg3Ij4gPC9wPgotPGgxPkphdmEgVHlwZXMgUmVwcmVzZW50aW5nIEJ1aWx0LUluIFNjaGVtYSBUeXBlczwvaDE+Ci08cD5BcyB5b3UgY2FuIHNlZSBmcm9tIHRoZSBmaWd1cmUgYWJvdmUsIGFsbCA0NiBidWlsdC1pbiBzY2hlbWEgdHlwZXMgYXJlIHJlcHJlc2VudGVkIAotICBieSBhbiBYTUxCZWFuIHR5cGUgcHJvdmlkZWQgd2l0aCBYTUxCZWFucy4gV2hlbiB1c2luZyBidWlsdC1pbiBYTUxCZWFuIHR5cGVzLCAKLSAga2VlcCBpbiBtaW5kIHRoYXQ6PC9wPgotPHVsPgotICA8bGk+IFNpbmNlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+IGNvcnJlc3BvbmRzIHRvIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6YW55VHlwZTwvc3Bhbj4sIAotICAgIGFsbCBKYXZhIFhNTEJlYW4gdHlwZXMgaW5oZXJpdCBmcm9tIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+LiAKLSAgICBUaGVyZWZvcmUgYWxsIFhNTEJlYW4gdHlwZXMgc2hhcmUgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+IAotICAgIGludGVyZmFjZZJzIGFiaWxpdHkgdG8gY3JlYXRlIGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+IAotICAgIGF0IHRoZSBwb3NpdGlvbiBvZiB0aGUgb2JqZWN0LiBUaGV5IGNhbiBhbHNvIHJlbmRlciB0aGUgWE1MIGFzIHN0cmluZ3Mgb3IgCi0gICAgc3RyZWFtcy4gCi0gIDxsaT4gCi0gICAgPGRpdj5XaGVyZSB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgbmF0dXJhbCBKYXZhIHR5cGUsIHRoZSBYTUxCZWFucyB0eXBlIHByb3ZpZGVzIAotICAgICAgYSB3YXkgdG8gZ2V0IHRoZSB1bmRlcmx5aW5nIFhNTCdzIHZhbHVlIGFzIHRoZSBuYXR1cmFsIHR5cGUuIFNlZSB0aGUgdGFibGUgCi0gICAgICBpbiB0aGlzIHRvcGljIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgbmF0dXJhbCBKYXZhIHR5cGVzIG1hcCB0byBYTUxCZWFucyAKLSAgICAgIHR5cGVzLiA8L2Rpdj4KLSAgCi0gIDxsaT4gVmFsdWVzIGFzc2lnbmVkIHRvIGJ1aWx0LWluIFhNTEJlYW5zIHR5cGVzIGFyZSB2YWxpZGF0ZWQgaW4ga2VlcGluZyB3aXRoIAotICAgIHRoZSBydWxlcyBvZiB0aGUgc2NoZW1hIHR5cGUgdGhleSByZXByZXNlbnQuIFNvLCBmb3IgZXhhbXBsZSwgYW4gYXR0ZW1wdCB0byAKLSAgICBhc3NpZ24gYSBuZWdhdGl2ZSBpbnRlZ2VyIHZhbHVlIHRvIGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxQb3NpdGl2ZUludGVnZXI8L3NwYW4+IAotICAgIHdpbGwgdGhyb3cgYW4gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbFZhbHVlT3V0T2ZSYW5nZTwvc3Bhbj4gZXhjZXB0aW9uLjwvbGk+Ci08L3VsPgotPGRpdj4gCi0gIDxwPlRoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgdGhlIGJ1aWx0LWluIHNjaGVtYSB0eXBlcywgYWxvbmcgd2l0aCB0aGVpciBYTUxCZWFucyAKLSAgICBhbmQgbmF0dXJhbCBKYXZhIHBhcmFsbGVscy4gVW5sZXNzIG90aGVyd2lzZSBub3RlZCwgbmF0dXJhbCBKYXZhIHR5cGVzIGFyZSAKLSAgICBpbiB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmphdmEubGFuZzwvc3Bhbj4gcGFja2FnZTsgWE1MQmVhbiB0eXBlcyBhcmUgCi0gICAgaW4gdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5vcmcuYXBhY2hlLnhtbGJlYW5zPC9zcGFuPiBwYWNrYWdlLjwvcD4KLTwvZGl2PgotPGRpdiBpZD0idG9waWN0ZXh0Ij4gCi0gIDx0YWJsZT4KLSAgICA8dHI+IAotICAgICAgPHRkIHdpZHRoPSIzMCUiPjxzdHJvbmc+QnVpbHQtSW4gU2NoZW1hIFR5cGU8L3N0cm9uZz48L3RkPgotICAgICAgPHRkIHdpZHRoPSIzMSUiPjxzdHJvbmc+WE1MQmVhbiBUeXBlPC9zdHJvbmc+PC90ZD4KLSAgICAgIDx0ZCB3aWR0aD0iMzklIj48c3Ryb25nPk5hdHVyYWwgSmF2YSBUeXBlPC9zdHJvbmc+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+eHM6YW55VHlwZTwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sT2JqZWN0Lmh0bWwiPlhtbE9iamVjdDwvYT48L3RkPgotICAgICAgPHRkPiA8YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxPYmplY3QuaHRtbCI+b3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2R0LWFueVNpbXBsZVR5cGUiIHRhcmdldD0iX2JsYW5rIj54czphbnlTaW1wbGVUeXBlPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQW55U2ltcGxlVHlwZS5odG1sIj5YbWxBbnlTaW1wbGVUeXBlPC9hPjwvdGQ+Ci0gICAgICA8dGQ+IDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TdHJpbmc8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2FueVVSSSIgdGFyZ2V0PSJfYmxhbmsiPnhzOmFueVVSSTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEFueVVSSS5odG1sIj5YbWxBbnlVUkk8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNiYXNlNjRCaW5hcnkiIHRhcmdldD0iX2JsYW5rIj54czpiYXNlNjRCaW5hcnk8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCYXNlNjRCaW5hcnkuaHRtbCI+WG1sQmFzZTY0QmluYXJ5PC9hPjwvdGQ+Ci0gICAgICA8dGQ+Ynl0ZVtdPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2Jvb2xlYW4iIHRhcmdldD0iX2JsYW5rIj54czpib29sZWFuPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQm9vbGVhbi5odG1sIj5YbWxCb29sZWFuPC9hPjwvdGQ+Ci0gICAgICA8dGQ+Ym9vbGVhbjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNieXRlIiB0YXJnZXQ9Il9ibGFuayI+eHM6Ynl0ZTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEJ5dGUuaHRtbCI+WG1sQnl0ZTwvYT48L3RkPgotICAgICAgPHRkPmJ5dGU8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZCBoZWlnaHQ9IjE3Ij48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZSIgdGFyZ2V0PSJfYmxhbmsiPnhzOmRhdGU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEYXRlLmh0bWwiPlhtbERhdGU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS91dGlsL0NhbGVuZGFyLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5qYXZhLnV0aWwuQ2FsZW5kYXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RhdGVUaW1lIiB0YXJnZXQ9Il9ibGFuayI+eHM6ZGF0ZVRpbWU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEYXRlVGltZS5odG1sIj5YbWxEYXRlVGltZTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL3V0aWwvQ2FsZW5kYXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEudXRpbC5DYWxlbmRhcjwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCIgdGFyZ2V0PSJfYmxhbmsiPnhzOmRlY2ltYWw8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEZWNpbWFsLmh0bWwiPlhtbERlY2ltYWw8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS9tYXRoL0JpZ0RlY2ltYWwuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEubWF0aC5CaWdEZWNpbWFsPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkb3VibGUiIHRhcmdldD0iX2JsYW5rIj54czpkb3VibGU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEb3VibGUuaHRtbCI+WG1sRG91YmxlPC9hPjwvdGQ+Ci0gICAgICA8dGQ+ZG91YmxlPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2R1cmF0aW9uIiB0YXJnZXQ9Il9ibGFuayI+eHM6ZHVyYXRpb248L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEdXJhdGlvbi5odG1sIj5YbWxEdXJhdGlvbjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL0dEdXJhdGlvbi5odG1sIj5vcmcuYXBhY2hlLnhtbGJlYW5zLkdEdXJhdGlvbjwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jRU5USVRJRVMiIHRhcmdldD0iX2JsYW5rIj54czpFTlRJVElFUzwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEVOVElUSUVTLmh0bWwiPlhtbEVOVElUSUVTPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvYXBpL2phdmEvbGFuZy9TdHJpbmcuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlN0cmluZzwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jRU5USVRZIiB0YXJnZXQ9Il9ibGFuayI+eHM6RU5USVRZPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRU5USVRZLmh0bWwiPlhtbEVOVElUWTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TdHJpbmc8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2Zsb2F0IiB0YXJnZXQ9Il9ibGFuayI+eHM6ZmxvYXQ8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxGbG9hdC5odG1sIj5YbWxGbG9hdDwvYT48L3RkPgotICAgICAgPHRkPmZsb2F0PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dEYXkiIHRhcmdldD0iX2JsYW5rIj54czpnRGF5PC9hPjwvdGQ+Ci0gICAgICA8dGQ+PHA+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR0RheS5odG1sIj5YbWxHRGF5PC9hPjwvcD48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL3V0aWwvQ2FsZW5kYXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEudXRpbC5DYWxlbmRhcjwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ01vbnRoIiB0YXJnZXQ9Il9ibGFuayI+eHM6Z01vbnRoPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR01vbnRoLmh0bWwiPlhtbEdNb250aDwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL3V0aWwvQ2FsZW5kYXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEudXRpbC5DYWxlbmRhcjwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ01vbnRoRGF5IiB0YXJnZXQ9Il9ibGFuayI+eHM6Z01vbnRoRGF5PC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR01vbnRoRGF5Lmh0bWwiPlhtbEdNb250aERheTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL3V0aWwvQ2FsZW5kYXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEudXRpbC5DYWxlbmRhcjwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ1llYXIiIHRhcmdldD0iX2JsYW5rIj54czpnWWVhcjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdZZWFyLmh0bWwiPlhtbEdZZWFyPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvdXRpbC9DYWxlbmRhci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS51dGlsLkNhbGVuZGFyPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnWWVhck1vbnRoIiB0YXJnZXQ9Il9ibGFuayI+eHM6Z1llYXJNb250aDwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdZZWFyTW9udGguaHRtbCI+WG1sR1llYXJNb250aDwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL3V0aWwvQ2FsZW5kYXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEudXRpbC5DYWxlbmRhcjwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jaGV4QmluYXJ5IiB0YXJnZXQ9Il9ibGFuayI+eHM6aGV4QmluYXJ5PC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSGV4QmluYXJ5Lmh0bWwiPlhtbEhleEJpbmFyeTwvYT48L3RkPgotICAgICAgPHRkPmJ5dGVbXTwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNJRCIgdGFyZ2V0PSJfYmxhbmsiPnhzOklEPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSUQuaHRtbCI+WG1sSUQ8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNJRFJFRiIgdGFyZ2V0PSJfYmxhbmsiPnhzOklEUkVGPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSURSRUYuaHRtbCI+WG1sSURSRUY8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNJRFJFRlMiIHRhcmdldD0iX2JsYW5rIj54czpJRFJFRlM8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJRFJFRlMuaHRtbCI+WG1sSURSRUZTPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvYXBpL2phdmEvbGFuZy9TdHJpbmcuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlN0cmluZzwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jaW50IiB0YXJnZXQ9Il9ibGFuayI+eHM6aW50PC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSW50Lmh0bWwiPlhtbEludDwvYT48L3RkPgotICAgICAgPHRkPmludDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNpbnRlZ2VyIiB0YXJnZXQ9Il9ibGFuayI+eHM6aW50ZWdlcjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEludGVnZXIuaHRtbCI+WG1sSW50ZWdlcjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL21hdGgvQmlnSW50ZWdlci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS5tYXRoLkJpZ0ludGVnZXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2xhbmd1YWdlIiB0YXJnZXQ9Il9ibGFuayI+eHM6bGFuZ3VhZ2U8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxMYW5ndWFnZS5odG1sIj5YbWxMYW5ndWFnZTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TdHJpbmc8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2xvbmciIHRhcmdldD0iX2JsYW5rIj54czpsb25nPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTG9uZy5odG1sIj5YbWxMb25nPC9hPjwvdGQ+Ci0gICAgICA8dGQ+bG9uZzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOYW1lIiB0YXJnZXQ9Il9ibGFuayI+eHM6TmFtZTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5hbWUuaHRtbCI+WG1sTmFtZTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TdHJpbmc8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05DTmFtZSIgdGFyZ2V0PSJfYmxhbmsiPnhzOk5DTmFtZTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5DTmFtZS5odG1sIj5YbWxOQ05BTUU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNuZWdhdGl2ZUludGVnZXIiIHRhcmdldD0iX2JsYW5rIj54czpuZWdhdGl2ZUludGVnZXI8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOZWdhdGl2ZUludGVnZXIuaHRtbCI+WG1sTmVnYXRpdmVJbnRlZ2VyPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvbWF0aC9CaWdJbnRlZ2VyLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5qYXZhLm1hdGguQmlnSW50ZWdlcjwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk1UT0tFTiIgdGFyZ2V0PSJfYmxhbmsiPnhzOk5NVE9LRU48L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOTVRPS0VOLmh0bWwiPlhtbE5NVE9LRU48L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOTVRPS0VOUyIgdGFyZ2V0PSJfYmxhbmsiPnhzOk5NVE9LRU5TPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTk1UT0tFTlMuaHRtbCI+WG1sTk1UT0tFTlM8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNub25OZWdhdGl2ZUludGVnZXIiIHRhcmdldD0iX2JsYW5rIj54czpub25OZWdhdGl2ZUludGVnZXI8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOb25OZWdhdGl2ZUludGVnZXIuaHRtbCI+WG1sTm9uTmVnYXRpdmVJbnRlZ2VyPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvbWF0aC9CaWdJbnRlZ2VyLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5qYXZhLm1hdGguQmlnSW50ZWdlcjwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9uUG9zaXRpdmVJbnRlZ2VyIiB0YXJnZXQ9Il9ibGFuayI+eHM6bm9uUG9zaXRpdmVJbnRlZ2VyPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTm9uUG9zaXRpdmVJbnRlZ2VyLmh0bWwiPlhtbE5vblBvc2l0aXZlSW50ZWdlcjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL21hdGgvQmlnSW50ZWdlci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS5tYXRoLkJpZ0ludGVnZXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25vcm1hbGl6ZWRTdHJpbmciIHRhcmdldD0iX2JsYW5rIj54czpub3JtYWxpemVkU3RyaW5nPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTm9ybWFsaXplZFN0cmluZy5odG1sIj5YbWxOb3JtYWxpemVkU3RyaW5nPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvYXBpL2phdmEvbGFuZy9TdHJpbmcuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlN0cmluZzwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk9UQVRJT04iIHRhcmdldD0iX2JsYW5rIj54czpOT1RBVElPTjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5PVEFUSU9OLmh0bWwiPlhtbE5PVEFUSU9OPC9hPjwvdGQ+Ci0gICAgICA8dGQ+IE5vdCBzdXBwb3J0ZWQ8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jcG9zaXRpdmVJbnRlZ2VyIiB0YXJnZXQ9Il9ibGFuayI+eHM6cG9zaXRpdmVJbnRlZ2VyPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sUG9zaXRpdmVJbnRlZ2VyLmh0bWwiPlhtbFBvc2l0aXZlSW50ZWdlcjwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL21hdGgvQmlnSW50ZWdlci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS5tYXRoLkJpZ0ludGVnZXI8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI1FOYW1lIiB0YXJnZXQ9Il9ibGFuayI+eHM6UU5hbWU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxRTmFtZS5odG1sIj5YbWxRTmFtZTwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS8xLjQvZG9jcy9hcGkvamF2YXgveG1sL25hbWVzcGFjZS9RTmFtZS5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jc2hvcnQiIHRhcmdldD0iX2JsYW5rIj54czpzaG9ydDwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFNob3J0Lmh0bWwiPlhtbFNob3J0PC9hPjwvdGQ+Ci0gICAgICA8dGQ+c2hvcnQ8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jc3RyaW5nIiB0YXJnZXQ9Il9ibGFuayI+eHM6c3RyaW5nPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sU3RyaW5nLmh0bWwiPlhtbFN0cmluZzwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TdHJpbmc8L2E+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4gCi0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3RpbWUiIHRhcmdldD0iX2JsYW5rIj54czp0aW1lPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVGltZS5odG1sIj5YbWxUaW1lPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvdXRpbC9DYWxlbmRhci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS51dGlsLkNhbGVuZGFyPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN0b2tlbiIgdGFyZ2V0PSJfYmxhbmsiPnhzOnRva2VuPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVG9rZW4uaHRtbCI+WG1sVG9rZW48L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZEJ5dGUiIHRhcmdldD0iX2JsYW5rIj54czp1bnNpZ25lZEJ5dGU8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxVbnNpZ25lZEJ5dGUuaHRtbCI+WG1sVW5zaWduZWRCeXRlPC9hPjwvdGQ+Ci0gICAgICA8dGQ+c2hvcnQ8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRJbnQiIHRhcmdldD0iX2JsYW5rIj54czp1bnNpZ25lZEludDwvYT48L3RkPgotICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkSW50Lmh0bWwiPlhtbFVuc2lnbmVkSW50PC9hPjwvdGQ+Ci0gICAgICA8dGQ+bG9uZzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+IAotICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZExvbmciIHRhcmdldD0iX2JsYW5rIj54czp1bnNpZ25lZExvbmc8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxVbnNpZ25lZExvbmcuaHRtbCI+WG1sVW5zaWduZWRMb25nPC9hPjwvdGQ+Ci0gICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvbWF0aC9CaWdJbnRlZ2VyLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5qYXZhLm1hdGguQmlnSW50ZWdlcjwvYT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPiAKLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRTaG9ydCIgdGFyZ2V0PSJfYmxhbmsiPnhzOnVuc2lnbmVkU2hvcnQ8L2E+PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxVbnNpZ25lZFNob3J0Lmh0bWwiPlhtbFVuc2lnbmVkU2hvcnQ8L2E+PC90ZD4KLSAgICAgIDx0ZD5pbnQ8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KLTxkaXY+IAotICA8cCBjbGFzcz0icmVsYXRlZHRvcGljcyI+UmVsYXRlZCBUb3BpY3M8L3A+Ci0gIDxwPjxhIGhyZWY9ImNvbkdldHRpbmdTdGFydGVkd2l0aFhNTEJlYW5zLmh0bWwiPkdldHRpbmcgU3RhcnRlZCB3aXRoIFhNTEJlYW5zPC9hPjwvcD4KLTwvZGl2PgotPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPiAKLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCi08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL2RvY3MvaW1hZ2VzL2NvbkN1cnNvclRva2VuTG9jYXRpb25zLmdpZiBiL3YxL2RvY3MvaW1hZ2VzL2NvbkN1cnNvclRva2VuTG9jYXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU2NmQzOC4uMDAwMDAwMAotLS0gYS92MS9kb2NzL2ltYWdlcy9jb25DdXJzb3JUb2tlbkxvY2F0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS9kb2NzL2ltYWdlcy9jb25YTUxUeXBlSGllcmFyY2h5LmdpZiBiL3YxL2RvY3MvaW1hZ2VzL2NvblhNTFR5cGVIaWVyYXJjaHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzBjMzI2Li4wMDAwMDAwCi0tLSBhL3YxL2RvY3MvaW1hZ2VzL2NvblhNTFR5cGVIaWVyYXJjaHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9zdHlsZXNoZWV0LmNzcyBiL3YxL2RvY3Mvc3R5bGVzaGVldC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWQ4MDMuLjAwMDAwMDAKLS0tIGEvdjEvZG9jcy9zdHlsZXNoZWV0LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIEphdmFkb2Mgc3R5bGUgc2hlZXQgKi8KLQotLyogRGVmaW5lIGNvbG9ycywgZm9udHMgYW5kIG90aGVyIHN0eWxlIGF0dHJpYnV0ZXMgaGVyZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMgKi8KLQotLyogUGFnZSBiYWNrZ3JvdW5kIGNvbG9yICovCi1ib2R5IHsgCQotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYgCi19Ci0KLWJvZHkgewotLyoJcGFkZGluZzogMHB4IDBweCAwcHggMTVweDsgKi8KLQliYWNrZ3JvdW5kOiAjZmZmZmZmOwotCWNvbG9yOiAjMDAwMDA7Ci0JZm9udC1zaXplOiA4MCU7Ci19Ci0KLS8qIFRhYmxlIGNvbG9ycyAqLwotLlRhYmxlSGVhZGluZ0NvbG9yICAgICB7IGJhY2tncm91bmQ6ICNDQ0NDRkYgfSAvKiBEYXJrIG1hdXZlICovCi0uVGFibGVTdWJIZWFkaW5nQ29sb3IgIHsgYmFja2dyb3VuZDogI0VFRUVGRiB9IC8qIExpZ2h0IG1hdXZlICovCi0uVGFibGVSb3dDb2xvciAgICAgICAgIHsgYmFja2dyb3VuZDogI0ZGRkZGRiB9IC8qIFdoaXRlICovCi0KLS8qIEZvbnQgdXNlZCBpbiBsZWZ0LWhhbmQgZnJhbWUgbGlzdHMgKi8KLS5GcmFtZVRpdGxlRm9udCAgIHsgZm9udC1zaXplOiAxMHB0czsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbi1zZXJpZiB9Ci0uRnJhbWVIZWFkaW5nRm9udCB7IGZvbnQtc2l6ZTogMTBwdHM7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW4tc2VyaWYgfQotLkZyYW1lSXRlbUZvbnQgICAgeyBmb250LXNpemU6IDEwcHRzOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2FuLXNlcmlmIH0KLQotLyogRXhhbXBsZSBvZiBzbWFsbGVyLCBzYW5zLXNlcmlmIGZvbnQgaW4gZnJhbWVzICovCi0vKiAuRnJhbWVJdGVtRm9udCAgeyBmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmIH0gKi8KLQotLyogTmF2aWdhdGlvbiBiYXIgZm9udHMgYW5kIGNvbG9ycyAqLwotLk5hdkJhckNlbGwxICAgIHsgYmFja2dyb3VuZC1jb2xvcjojRUVFRUZGO30vKiBMaWdodCBtYXV2ZSAqLwotLk5hdkJhckNlbGwxUmV2IHsgYmFja2dyb3VuZC1jb2xvcjojMDAwMDhCO30vKiBEYXJrIEJsdWUgKi8KLS5OYXZCYXJGb250MSAgICB7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBjb2xvcjojMDAwMDAwO30KLS5OYXZCYXJGb250MVJldiB7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBjb2xvcjojRkZGRkZGO30KLQotLk5hdkJhckNlbGwyICAgIHsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGJhY2tncm91bmQtY29sb3I6I0ZGRkZGRjt9Ci0uTmF2QmFyQ2VsbDMgICAgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgYmFja2dyb3VuZC1jb2xvcjojRkZGRkZGO30KLQpkaWZmIC0tZ2l0IGEvdjEvZG9jcy94bWxiZWFucy5jc3MgYi92MS9kb2NzL3htbGJlYW5zLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY2MjA2MS4uMDAwMDAwMAotLS0gYS92MS9kb2NzL3htbGJlYW5zLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDQ4MiArMCwwIEBACi0vKiAgVGhlIHN0eWxlcyBtb3N0IGxpa2VseSB0byBiZSB1c2VkIGFyZToKLQktIFRpdGxlOiBUaGUgdGl0bGUgb2YgdGhlIHRvcGljCi0JLSBoMSwgaDIsIGgzOiBGaXJzdCwgc2Vjb25kLCBhbmQgdGhpcmQtbGV2ZWwgaGVhZGluZ3Mgd2l0aGluIHRoZSBib2R5IG9mIGEgdG9waWMKLQktIHJlbGF0ZWRUb3BpY3M6IFJlbGF0ZWQgVG9waWNzCi0JLSBwcm9jVGl0bGU6IFdpdGhpbiBIb3cgRG8gSTouLi4gdG9waWNzLCBmb3IgaGVhZGluZ3Mgd2l0aGluIHRoZSBib2R5IG9mIGEgdG9waWMgdGhhdCBhcmUgZm9sbG93ZWQgYnkKLQkgIGJ1bGxldGVkIHByb2NlZHVyZXMgKCJUbyBkbyB0aGlzIikuCi0JLSBwcmU6IEZvciBjb2RlIGJsb2NrcwotCS0gbGFuZ2lubGluZTogRm9yIGNvZGUgZnJhZ21lbnRzIHdpdGhpbiBhIChub24tY29kZSkgcmVndWxhciBzZWN0aW9uLgotCS0gbm90ZXBhcmE6IE5vdGVzCSAKLSovCi1oMSwKLWgyLAotaDMsCi1oNCwKLWg1LAotcCwKLXByb2N0aXRsZSwKLXJlbGF0ZWR0b3BpY3MgewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWNvbG9yOiAjMDAwMDAwOwotfQotCi0vKiBVc2UgaDEgZm9yIGFsbCBmaXJzdC1sZXZlbCBoZWFkaW5ncyB3aXRoaW4gdGhlIGJvZHkgb2YgYSB0b3BpYy4gCi0gICBGb3IgdGhlIHRvcGljIHRpdGxlLCB1c2UgdGhlIFRpdGxlIHN0eWxlLiAqLwotaDEgewotCWZvbnQtc2l6ZTogMTM1JTsKLQltYXJnaW4tdG9wOiAuNWVtOwotCW1hcmdpbi1ib3R0b206IC41ZW07Ci19Ci0KLS8qIFVzZSBoMiBmb3IgYWxsIHNlY29uZC1sZXZlbCBoZWFkaW5ncy4gKi8KLWgyIHsKLQlmb250LXNpemU6IDEyNSU7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IC42ZW07Ci19Ci0KLS8qIFVzZSBoMyBmb3IgYWxsIHRoaXJkLWxldmVsIGhlYWRpbmdzLiAqLwotaDMgewotCWZvbnQtc2l6ZTogMTEwJTsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogLjZlbTsKLX0KLQotLyogVXNlIGg0IGZvciBhbGwgZm91cnRoLWxldmVsIGhlYWRpbmdzLiAKLSAgIE5vdGU6IHRoaXMgc3R5bGUgbG9va3MgaWRlbnRpY2FsIHRvIHRoZSByZWxhdGVkdG9waWNzIGFuZCBwcm9jdGl0bGUgc3R5bGVzLiAqLwotaDQgewotCWZvbnQtc2l6ZTogMTA1JTsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogLjZlbTsKLX0KLQotLyogVXNlIGg1IGZvciBhbGwgZmlmdGgtbGV2ZWwgaGVhZGluZy4gIAotICAgQ3VycmVudGx5LCB0aGVyZSBhcmUgbm8gaDVzIGluIHVzZSBpbiB0aGUgZG9jdW1lbnQuKi8KLWg1IHsKLQlmb250LXNpemU6IDEwMCU7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IC42ZW07Ci19Ci0KLS8qIFVzZSB0aGUgVGl0bGUgc3R5bGUgZm9yIHRoZSB0aXRsZSBvZiBhIHRvcGljLiAqLwotcC5UaXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTQyJTsKLX0KLQotLyogVGhpcyBkZXByYXRlZCB0YWcgY3JlYXRlcyBhIGRpdiB0aGF0IGRlc2lnbmF0ZXMgdGhlIHRpdGxlLiAqLwotI3RvcGljdGl0bGUgewotfQotCi0vKiBUaGlzIGRlcHJlY2F0ZWQgdGFnIGNyZWF0ZXMgYSBkaXZlIHRoYXQgZGVzaWduYXRlcyBhbGwgYm9keSB0ZXh0LiAqLwotI3RvcGljdGV4dCB7Ci19Ci0KLS8qIFVzZWQgZm9yIGZpZ3VyZSBjYXB0aW9ucy4qLwotcC5hcnR0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IEJvbGQ7Ci19Ci0gIAotLyogVGhlIGF0dHJpYnV0ZSBzdHlsZSByZXNlbWJsZXMgdGhlIG5hdnRpdGxlIGFuZCBwYXJ0ZGVzYyBzdHlsZXMgaW4gdGhhdCBpdCBrZWVwcyB0aGUgbmV4dCBwYXJhZ3JhcGggCi0gICBmbHVzaCB3aXRoIGl0LiBVc2UgaXQgd2hlbiB5b3UgbGlzdCB0aGUgYXR0cmlidXRlcyBvZiBzeW50YXggaW4gYSByZWZlcmVuY2UgdG9waWMuCi0gICBUaGUgYXJndW1lbnQgc3R5bGUgc2hvdWxkIGFsd2F5cyBiZSBmb2xsb3dlZCBieSB0aGUgcGFydGRlc2Mgc3R5bGUuICovCi1wLmF0dHJpYnV0ZSB7Ci0JbWFyZ2luLXRvcDogLjZlbTsKLQltYXJnaW4tYm90dG9tOiAwcHg7Ci0JZm9udC13ZWlnaHQ6IEJvbGQ7Ci0JCi19Ci0KLS8qIFN0YW5kYXJkIEhUTUwgdGFnLiAqLwotYm9keSB7Ci0JcGFkZGluZzogMHB4IDBweCAwcHggMTVweDsKLQliYWNrZ3JvdW5kOiAjZmZmZmZmOwotCWNvbG9yOiAjMDAwMDA7Ci0JZm9udC1zaXplOiA4MCU7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci19Ci0KLS8qIFN0YW5kYXJkIEhUTUwgdGFnLiAqLwotc3Bhbi5ib2xkIHsKLQlmb250LXdlaWdodDogQm9sZDsKLX0KLQotLyogU3RhbmRhcmQgSFRNTCB0YWcuICovCi1ibG9ja3F1b3RlIHsKLQltYXJnaW46IDBlbSAwZW0gMGVtIDJlbTsKLQlwYWRkaW5nOiAwcHg7Ci19Ci0KLS8qIFVzZSB0aGUgZmlsZXBhdGggc3R5bGUgdG8gZGVzaWduYXRlIGZpbGUgcGF0aHMuIEl0IGlzIGN1cnJlbnRseSBhIG1vbm9zcGFjZSBmaWxlLiAqLwotc3Bhbi5maWxlcGF0aCB7Ci0JZm9udDogMTAwJSBDb3VyaWVyIE5ldyBDb3VyaWVyIG1vbm87Ci0JZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIG1vbm9zcGFjZTsKLX0KLQotLyogVGhlIGxhbmdpbmxpbmUgc3R5bGUsIGxpa2UgdXNlcmlucHV0IGFuZCBmaWxlcGF0aCwgYWxzbyByZW5kZXJzIHRleHQgbW9ub3NwYWNlLiBVc2UgdGhpcwotICAgdG8gZGVub3RlIGFueSBpbmRpdmlkdWFsIGluc3RhbmNlIG9mIGNvZGUgaW4gdGhlIGNvbnRleHQgb2Ygbm9uLWNvZGVkIHRleHQuIEZvciBleGFtcGxlLCAKLSAgIHlvdSB3b3VsZCB1c2UgdGhpcyB0byBkZW5vdGUgdGhlIG5hbWUgb2YgYSBjbGFzcyB3aGVuIHlvdSdyZSBkZXNjcmliaW5nIGl0IGluIHRoZSBwYXJhZ3JhcGggdGhhdAotICAgcHJlY2VkZXMgYSBjb2RlIHNhbXBsZS4gVG8gZGVub3RlIGEgY29kZSBzYW1wbGUsIGhvd2V2ZXIsIHVzZSB0aGUgPHByZT4gdGFnLiAqLwotc3Bhbi5sYW5naW5saW5lIHsKLQlmb250OiAxMDAlIENvdXJpZXIgTmV3IENvdXJpZXIgbW9ubzsKLQlmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgbW9ub3NwYWNlOwotfQotCi0vKiBUaGUgbGlzdHBsYWluIHN0eWxlIG5hcnJvd3MgdGhlIG1hcmdpbiBiZXR3ZWVuIHRoZSBmb3JtYXR0ZWQgbGluZSBhbmQgdGhlIG9uZSBiZWZvcmUgaXQuCi0gICBJdCBpcyB0byBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSBzZWNvbmQgcGFyYWdyYXBoIGluIGEgbGlzdCBpdGVtLCBhbG9uZyB3aXRoIHRoZSBpbmRlbnQgYW5kCi0gICB1bmluZGVudCBidXR0b25zIGluIERyZWFtd2VhdmVyLiAqLwotcC5saXN0cGxhaW4gewotCW1hcmdpbi10b3A6IDAuN2VtOwotCW1hcmdpbi1ib3R0b206IDA7Ci0JcGFkZGluZzogMGVtOwotfQotCi0vKiBBbGwgdGV4dCBpbiB0aGUgbmF2dGl0bGUgc3R5bGUgc2hvdWxkIGluY2x1ZGUgYSBsaW5rIHRvIGFub3RoZXIgdG9waWMuCi0gICBUaGUgbmF2dGl0bGUgc3R5bGUgaXMgdXNlZCBpbiBuYXZpZ2F0aW9uYWwgbm9kZSB0b3BpY3MsIGluIENsYXNzIHJlZmVyZW5jZQotICAgdG9waWNzLCBhbmQgaW4gTWV0aG9kIHJlZmVyZW5jZSB0b3BpY3MuIEZvciBleGFtcGxlLCBpbiB0aGUgIlRvcGljcyAKLSAgIEluY2x1ZGVkIGluIHRoaXMgU2VjdGlvbiIgc2VjdGlvbiBvZiBhIG5hdmlnYXRpb24gdG9waWMsIHlvdSBpbmNsdWRlIHRoZSBsaW5rcyB0byBhbGwgb2YgCi0gICB0aGUgdG9waWNzIGluIHRoYXQgY2hhcHRlciwgYWxvbmcgd2l0aCBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHdoYXQgeW91J2xsIGZpbmQgaW4gZWFjaC4gVXNlIHRoZQotICAgbmF2dGl0bGUgc3R5bGUgZm9yIHRoZSBsaW5rZWQgdGV4dC4gSXQgZGlmZmVycyBmcm9tIGEgbm9ybWFsIHBhcmFncmFwaCBzdHlsZSBpbiB0aGF0IGl0IGRvZXMgbm90IAotICAgaW5jbHVkZSBhbiBleHRyYSBwYXJhZ3JhcGggYnJlYWsgYmV0d2VlbiB0aGUgbGluayBhbmQgdGhlIGRlc2NyaXB0aXZlIHRleHQuICovCi1wLm5hdnRpdGxlIHsKLQltYXJnaW4tdG9wOiAuNmVtOwotCW1hcmdpbi1ib3R0b206IDBlbTsKLX0KLQotLyogVGhlIG5hdmRlc2Mgc3R5bGUgaXMgdXNlZCBpbiBuYXZpZ2F0aW9uYWwgbm9kZSB0b3BpY3MsIGluIENsYXNzIHJlZmVyZW5jZQotICAgdG9waWNzLCBhbmQgaW4gTWV0aG9kIHJlZmVyZW5jZSB0b3BpY3MuIEZvciBleGFtcGxlLCBpbiB0aGUgIlRvcGljcyBJbmNsdWRlZCBpbiB0aGlzIFNlY3Rpb24iIAotICAgc2VjdGlvbiBvZiBhIG5hdmlnYXRpb24gdG9waWMsIHlvdSBpbmNsdWRlIHRoZSBsaW5rcyB0byBhbGwgb2YgdGhlIHRvcGljcyBpbiB0aGF0IGNoYXB0ZXIsCi0gICBhbG9uZyB3aXRoIGEgYnJpZWYgZGVzY3JpcHRpb24gb2Ygd2hhdCB5b3UnbGwgZmluZCBpbiBlYWNoLiBVc2UgdGhpcyBzdHlsZSBmb3IgdGhlIGRlc2NyaXB0aXZlIHRleHQuIAotICAgSXQgaW5kZW50cyB0aGUgdGV4dCBvbmUgdGFiIHN0b3AgYW5kIGtlZXBzIHRoZSBtYXJnaW4gYmV0d2VlbiB0aGlzIHN0eWxlIGFuZCB0aGUgbmF2dGl0bGUgc3R5bGUgc21hbGwuICAqLwotcC5uYXZkZXNjIHsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JbWFyZ2luLWxlZnQ6IDEuOWVtOwotCW1hcmdpbi10b3A6IDBlbTsKLX0KLQotLyogVGhlIG5vdGVwYXJhIHN0eWxlIGluZGVudHMgeW91ciB0ZXh0IHRvIHRoZSB0YWIgc3RvcCBmb3Igbm90ZQotICAgdGV4dC4gWW91IHNob3VsZCBhbHdheXMgYmVnaW4gTm90ZSB0ZXh0IHdpdGggdGhlIHdvcmQgIk5vdGU6IiBpbgotICAgYm9sZGZhY2UuICovCi1wLm5vdGVwYXJhIHsKLQltYXJnaW4tbGVmdDogMmVtOwotCW1hcmdpbi1yaWdodDogMmVtOwotCW1hcmdpbi1ib3R0b206IDEuNWVtOwotfQotCi0vKiBUaGUgcGFydG5hbWUgc3R5bGUgcmVzZW1ibGVzIHRoZSBuYXZ0aXRsZSBzdHlsZSBpbiB0aGF0IGl0IGtlZXBzIHRoZSBuZXh0IHBhcmFncmFwaCBmbHVzaCB3aXRoIGl0LiAKLSAgIFlvdSB1c2UgaXQgd2hlbiB5b3UgbGlzdCB0aGUgcGFyYW1ldGVycyBpbiBhIHJlZmVyZW5jZSB0b3BpYy4gSXQgaXMgYWxzbyB1c2VkIGN1cnJlbnRseSBpbiB0aGUgCi0gICBnbG9zc2FyeSB0byBkZXNpZ25hdGUgZ2xvc3NhcnkgZW50cmllcy4gSXQgcmVuZGVycyB0ZXh0IGl0YWxpYy4KLSAgIFRoZSBwYXJ0bmFtZSBzdHlsZSBzaG91bGQgYWx3YXlzIGJlIGZvbGxvd2VkIGJ5IHRoZSBwYXJ0ZGVzYyBzdHlsZS4qLwotcC5wYXJ0bmFtZSB7Ci0JbWFyZ2luLXRvcDogLjZlbTsKLQltYXJnaW4tYm90dG9tOiAwcHg7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0vKiBVc2UgdGhlIHBhcnRkZXNjIHN0eWxlIHdoZW4geW91IGRlc2NyaWJlIHRoZSBmdW5jdGlvbiBvZiB0aGUgcHJvcGVydGllcywgcGFyYW1ldGVycywgb3IgZXhjZXB0aW9ucyAKLSAgIGxpc3RlZCBpbiBhIHJlZmVyZW5jZSB0b3BpYy4gSXQgaXMgYWxzbyB1c2VkIGN1cnJlbnRseSBpbiB0aGUgZ2xvc3NhcnkgdG8gZGVzaWduYXRlIGdsb3NzYXJ5IAotICAgZGVmaW5pdGlvbnMuIFRoZSBzdHlsZSBpbmRlbnRzIHRoZSBkZXNjcmlwdGlvbiBzbGlnaHRseS4KLSAgIFRoZSBwYXJ0ZGVzYyBzdHlsZSBzaG91bGQgYWx3YXlzIGZvbGxvdyB0aGUgcGFydG5hbWUgb3IgYXR0cmlidXRlIHN0eWxlLiovCi1wLnBhcnRkZXNjIHsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JbWFyZ2luLWxlZnQ6IDEuOWVtOwotCW1hcmdpbi10b3A6IDBlbTsKLQotfQotCi0vKiBUaGUgcG9pbnQgb2YgdGhlIHByb2N0aXRsZSBzdHlsZSBpcyB0aGUgc2FtZSBhcyB0aGUgcG9pbnQgb2YgdGhlIHJlbGF0ZWR0b3BpY3Mgc3R5bGUuICAKLSAgIEl0IGFwcGxpZXMgdG8gYWxsIGhlYWRpbmdzIHRoYXQgYmVnaW4gd2l0aCAiVG8gW2RvIHNvbWV0aGluZ10iLiBJdCBsb29rcyBpZGVudGljYWwgdG8gdGhlIGg0IHN0eWxlLiAgKi8KLXAucHJvY3RpdGxlIHsKLQlmb250LXNpemU6IDExMCU7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IC42ZW07Ci0JZm9udC13ZWlnaHQ6IEJvbGQ7Ci0KLX0KLQotLyogVXNlIHRoZSByZWxhdGVkdG9waWNzIHN0eWxlLCBmb3IgdGhlIHdvcmRzICJSZWxhdGVkIFRvcGljcyIgYXQgdGhlIGVuZCBvZiBhIHRvcGljLiAKLSAgIEl0IGxvb2tzIGlkZW50aWNhbCB0byB0aGUgaDQgc3R5bGUuICovCi1wLnJlbGF0ZWR0b3BpY3MgewotCWZvbnQtc2l6ZTogMTIwJTsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogLjZlbTsKLQlmb250LXdlaWdodDogQm9sZDsKLX0KLQotLyogVGhlIHN5bnRheCBzdHlsZSByZW5kZXJzIHRleHQgYm9sZC4gVXNlIGl0IHRvIHN0eWxlIGFsbCBzeW50YXggbGluZXMgdW5kZXIgdGhlCi0gICBTeW50YXggaGVhZGluZyBvZiByZWZlcmVuY2UgdG9waWNzLiAqLwotcC5zeW50YXggewotCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci0JbGluZS1oZWlnaHQ6IG5vcm1hbDsKLQlmb250LXdlaWdodDogQm9sZDsKLX0KLQotLyogVXNlIHRoZSBzeW50YXhpbmRlbnQgc3R5bGUgdG8gaW5kZW50IHN1Yi1wcm9wZXJ0aWVzIG9mIHN5bnRheCBkZWNsYXJhdGlvbnMuICovCi1wLnN5bnRheGluZGVudCB7Ci0JZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKLQlsaW5lLWhlaWdodDogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBCb2xkOwotCW1hcmdpbi1sZWZ0OiAxLjVlbTsKLQltYXJnaW4tdG9wOiAwZW07Ci0JbWFyZ2luLWJvdHRvbTogMHB4OwotfQotCi0KLXAuZmlsZXVybCB7Ci0JZm9udC1zaXplOiA4cHQ7Ci19Ci0KLXAubW9kaWZpZWRkYXRlIHsKLQlmb250LXNpemU6IDhwdDsKLX0KLQotLyogVGhlIHN5bnRheHBhcnRuYW1lIGNoYXJhY3RlciBzdHlsZSByZW5kZXJzIHRleHQgaXRhbGljLiBVc2UgaXQgdG8gZGVzaWduYXRlIAotICAgc3ludGF4IGVsZW1lbnRzIGluIHJlZmVyZW5jZSB0b3BpY3MuKi8KLXNwYW4uc3ludGF4cGFydG5hbWUgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQlmb250LXdlaWdodDogbm9ybWFsOwotfQotCi0vKiBUaGVzZSBzcGVjaWZpY2F0aW9ucyBkaWN0YXRlIHRoZSBtYXJnaW5zIGFuZCB3aWR0aCBvZiB0YWJsZXMuICovCi10YWJsZSB7Ci0Jd2lkdGg6IDkwJTsKLQltYXJnaW4tdG9wOiAuNmVtOwotCW1hcmdpbi1ib3R0b206IC4zZW07Ci19Ci0KLS8qIFRoZSBiYWNrZ3JvdW5kIG9mIGhlYWRlciBjZWxscyBpcyBncmV5LCBhbmQgdGhlIHRleHQgaXMgYm90dG9tLWFsaWduZWQuICovCi10aCB7Ci0JcGFkZGluZy1sZWZ0OiA4cHg7Ci0JcGFkZGluZy1yaWdodDogOHB4OwotCWJhY2tncm91bmQ6ICNjY2NjY2M7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQlmb250LXNpemU6IDgwJTsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQl2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOwotfQotCi0vKiBUaGUgdGV4dCBpbiBub3JtYWwgdGFibGUgY2VsbHMgaXMgdG9wLWFsaWduZWQuICovCi10ZCB7Ci0JcGFkZGluZy1sZWZ0OiA4cHg7Ci0JcGFkZGluZy1yaWdodDogOHB4OwotCWJhY2tncm91bmQ6ICNmZmZmZmY7Ci0JdmVydGljYWwtYWxpZ246IHRvcDsKLQlmb250LXNpemU6IDgwJTsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLX0KLQotLyogVGhpcyBzdHlsZSBjcmVhdGVzIHNwYWNlIGFib3ZlIGFuZCBiZWxvdyB0YWJsZSB0ZXh0IGJldHdlZW4gcGFyYWdyYXBoIGFuZCB0aGUgdGFibGUgYm9yZGVycy4gKi8KLXAudGFibGV0ZXh0IHsKLQltYXJnaW4tdG9wOiAuNmVtOwotCW1hcmdpbi1ib3R0b206IC42ZW07Ci19Ci0KLS8qIFRoZSBlZGl0b3IgdXNlcyB0aGlzIHN0eWxlIHdoZW4gY3JlYXRpbmcgdGVtcGxhdGUgZ3VpZGVzIHRvIGRlc2lnbmF0ZSBhIHN0eWxlIGFubm90YXRpb24uIAotICAgWW91IHByb2JhYmx5IHdvbid0IHdhbnQgdG8gdXNlIGl0IGFueXdoZXJlIGVsc2UgaW4gdGhlIGd1aWRlLiAqLwotc3Bhbi50ZW1wbGF0ZSB7Ci0JY29sb3I6ICNGRjAwRkY7CQotfQotCi1hLnRvYy1ub2RlIHsKLQlmb250LXNpemU6MTFweDsKLQljb2xvcjowMDAwMDA7Ci0JbWFyZ2luLWxlZnQ6IDBweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci0JbWFyZ2luLWJvdHRvbTogMHB4OwotICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Ci0gICAgZm9udC1mYW1pbHk6IFRhaG9tYTsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiNGRkZGRkY7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7ICAgICAgICAKLX0KLQotLyogVGhlIHVzZXJpbnB1dCBzdHlsZSByZW5kZXJzIHRleHQgbW9ub3NwYWNlLlVzZSB0aGlzIHN0eWxlIHRvIGhpZ2hsaWdodCB0ZXh0IHRoYXQgYSB1c2VyIAotICAgdHlwZXMgaW50byBhIHRleHQgZmllbGQuICAqLwotc3Bhbi51c2VyaW5wdXQgewotCWZvbnQ6IDEwMCUgQ291cmllciBOZXcgQ291cmllciBtb25vOwotCWZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBtb25vc3BhY2U7Ci19Ci0KLS8qIFN0YW5kYXJkIEhUTUwgdGFncy4gKi8KLXVsLAotb2wgewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWxpc3Qtc3R5bGUtcG9zaXRpb246IG91dHNpZGU7Ci0JbGlzdC1zdHlsZS1pbWFnZTogbm9uZTsKLQltYXJnaW4tdG9wOiAwZW07Ci0JbWFyZ2luLWJvdHRvbTogMGVtOwotfQotCi0vKiBTdGFuZGFyZCBIVE1MIHRhZy4gKi8KLW9sIHsKLQlsaXN0LXN0eWxlLXR5cGU6IDE7Ci0JbWFyZ2luLWxlZnQ6IDJlbTsKLX0KLQotLyogU3RhbmRhcmQgSFRNTCB0YWcuICovCi11bCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBkaXNjOwotCW1hcmdpbi1sZWZ0OiAxLjVlbTsKLX0KLQotLyogU3RhbmRhcmQgSFRNTCB0YWcuICovCi1saSB7Ci0JbWFyZ2luLXRvcDogMS4zZW07IAotCW1hcmdpbi1ib3R0b206IDBlbTsKLX0KLQotYTpsaW5rIHsKLQljb2xvcjogIzMzNjZDQzsKLX0KLWE6aG92ZXIgewotCXgtdGV4dC11bmRlcmxpbmU6IG5vcm1hbDsKLQkvKmJlZ2luIWthZG92e3sqLyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgLyp9fWVuZCFrYWRvdiovIAotfQotCi1hOmFjdGl2ZSB7Ci0JeC10ZXh0LXVuZGVybGluZTogbm9ybWFsOwotCS8qYmVnaW4ha2Fkb3Z7eyovIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyAvKn19ZW5kIWthZG92Ki8gCi19Ci0KLWE6dmlzaXRlZCB7Ci0JY29sb3I6ICM4MDMzODA7Ci19Ci0KLWEgewotCXgtdGV4dC11bmRlcmxpbmU6IG9mZjsKLQl4LXRleHQtb3ZlcmxpbmU6IG9mZjsKLQl4LXRleHQtbGluZS10aHJvdWdoOiBvZmY7Ci0JLypiZWdpbiFrYWRvdnt7Ki8gdGV4dC1kZWNvcmF0aW9uOiBub25lIG5vbmUgbm9uZTsgLyp9fWVuZCFrYWRvdiovIAotfQotYTpsaW5rIHsKLQljb2xvcjogIzMzNjZDQzsKLX0KLQotYTpob3ZlciB7Ci0JeC10ZXh0LXVuZGVybGluZTogbm9ybWFsOwotCS8qYmVnaW4ha2Fkb3Z7eyovIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyAvKn19ZW5kIWthZG92Ki8gCi19Ci0KLWE6YWN0aXZlIHsKLQl4LXRleHQtdW5kZXJsaW5lOiBub3JtYWw7Ci0JLypiZWdpbiFrYWRvdnt7Ki8gdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IC8qfX1lbmQha2Fkb3YqLyAKLX0KLQotYTp2aXNpdGVkIHsKLQljb2xvcjogIzAwMDA2NjsKLX0KLQotZGl2LmZvb3RlciB7Ci19Ci0KLS5idXR0b25jbGFzcwotewotCWZvbnQtc2l6ZToxMHB4OwotCWhlaWdodDoyMHB4OwotfQotCi0uZm9ybWNsYXNzCi17Ci0JZm9udC1zaXplOjEwcHg7Ci0JaGVpZ2h0OjE3cHg7Ci19Ci0KLQotCi0KLS8qREVQUkVDQVRFRCovCi1wLmNvZGVibG9jayB7Ci0JZm9udC1zaXplOiAxMDAlOwotCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci0JbGluZS1oZWlnaHQ6IDFlbTsKLQl4LXRleHQtdGFiLXN0b3BzOiByZXBlYXQgMWluOwotCXdoaXRlLXNwYWNlOiBub3dyYXA7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JY3Vyc29yOiB0ZXh0OwotCXBhZGRpbmctcmlnaHQ6IDFlbTsKLQlwYWRkaW5nLWxlZnQ6IDFlbTsKLQlwYWRkaW5nLXRvcDogMGVtOwotCXBhZGRpbmctYm90dG9tOiAwZW07Ci0JbWFyZ2luLWJvdHRvbTogMGVtOwotCW1hcmdpbi10b3A6IDBlbTsKLQl4LXRleHQtdW5kZXJsaW5lOiBPZmY7Ci0JLypiZWdpbiFrYWRvdnt7Ki8gdGV4dC1kZWNvcmF0aW9uOiBub25lOyAvKn19ZW5kIWthZG92Ki8gCi19Ci0KLS8qIERFUFJFQ0FURUQgKi8KLXAuYnVsbGV0aW5kZW50MSB7Ci0JbWFyZ2luLWxlZnQ6IDEuNWVtOwotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMDsKLX0KLQotLyogREVQUkVDQVRFRCAqLwotcC5idWxsZXRpbmRlbnQyIHsKLQltYXJnaW4tbGVmdDogNS4xZW07Ci0JbWFyZ2luLXRvcDogMDsKLQltYXJnaW4tYm90dG9tOiAwOwotfQotCi0vKiBERVBSRUNBVEVEICovCi1wLmJ1bGxldGluZGVudDMgewotCW1hcmdpbi1sZWZ0OiA0LjNlbTsKLX0KLQotLyogREVQUkVDQVRFRCAqLwotcC5pbmRlbnQxIHsKLQltYXJnaW4tbGVmdDogMS41ZW07Ci0JbWFyZ2luLXJpZ2h0OiAxLjllbTsKLX0KLQotLyogREVQUkVDQVRFRCAqLwotcC5pbmRlbnQyIHsKLQltYXJnaW4tbGVmdDogMi45ZW07Ci0JbWFyZ2luLXJpZ2h0OiAxLjllbTsKLX0KLQotLyogREVQUkVDQVRFRCAqLwotcC5pbmRlbnQzIHsKLQltYXJnaW4tbGVmdDogNC4zZW07Ci0JbWFyZ2luLXJpZ2h0OiAxLjllbTsKLX0KLQotLyogREVQUkVDQVRFRCAqLwotcC5udW1iZXJlZGluZGVudDEgewotCW1hcmdpbi1sZWZ0OiAyLjJlbTsKLQltYXJnaW4tdG9wOiAwOwotCW1hcmdpbi1ib3R0b206IDA7Ci19Ci0KLS8qIERFUFJFQ0FURUQgKi8KLXAubnVtYmVyZWRpbmRlbnQyIHsKLQltYXJnaW4tbGVmdDogNi4zZW07Ci0JbWFyZ2luLXRvcDogMDsKLQltYXJnaW4tYm90dG9tOiAwOwotfQotCi0vKiBERVBSRUNBVEVEICovCi1wLm51bWJlcmVkaW5kZW50MyB7Ci0JbWFyZ2luLWxlZnQ6IDEwLjVlbTsKLQltYXJnaW4tdG9wOiAwOwotCW1hcmdpbi1ib3R0b206IDA7Ci19CQotCi0vKiBERVBSRUNBVEVEICovCi1wLnRhYmxldGl0bGUgewotCW1hcmdpbi1sZWZ0OiAwOwotCWZvbnQtd2VpZ2h0OiBCb2xkOwotfQotCi0KLS8qIFRoZXNlIHN0eWxlcyBhcmUgdXNlZCBieSB0aGUgc2VhcmNoIHJlc3VsdHMgcGFnZSAqLwotCi0uc2VhcmNoLW5vZGUgewotCWZvbnQtc2l6ZToxMHB4OwotCWNvbG9yOjAwMDAwMDsKLX0KLQotYS5zZWFyY2gtbm9kZSB7Ci0JZm9udC1zaXplOjEwcHg7Ci0JY29sb3I6MDAwMDAwOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL2RvY3MveG1sYmVhbnRhc2suaHRtbCBiL3YxL2RvY3MveG1sYmVhbnRhc2suaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjOTFlNS4uMDAwMDAwMAotLS0gYS92MS9kb2NzL3htbGJlYW50YXNrLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotICAgICAgICAgICAgICAgICAgICAgCi0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KLSAgPHRpdGxlPlhNTEJlYW4gVGFzazwvdGl0bGU+Ci08L2hlYWQ+Ci0gIDxib2R5PgotICAgICAgICAgICAgCi08aDI+PGEgbmFtZT0ieG1sYmVhbiI+WE1MQmVhbjwvYT48L2gyPgotICAgICAgICAgICAKLTxoMz5EZXNjcmlwdGlvbjwvaDM+Ci0gICAgICAgICAgICAgIAotPHA+Q29tcGlsZSBhIHNldCBvZiBYU0RzIGFuZC9vciBXU0RMcyBpbnRvIHhiZWFucy4gVGhpcyBpcyB1c2VmdWwgZm9yIGJ1aWxkaW5nCi0gYW4gWE1MQmVhbiBqYXIgZnJvbSAuWFNEIGFuZCAuV1NETCBmaWxlcy4gJm5ic3A7VGhlIHRhc2sgY2FuIGFsc28gZ2VuZXJhdGUKLSB0aGUgc291cmNlIGNvZGUgdGhhdCBtYWtlcyB1cCB0aGUgeGJlYW4gdHlwZSBzeXN0ZW0gc3BlY2lmaWVkIGJ5IHRoZSBzY2hlbWEKLSBmaWxlcyBpZiBkZXNpcmVkLjwvcD4KLSAgICAgICAgICAgICAgCi08cD48Yj5Ob3RlOjwvYj4gVGhpcyB0YXNrIGRlcGVuZHMgb24gYW4gZXh0ZXJuYWwgbGlicmFyeSBub3QgaW5jbHVkZWQgaW4KLXRoZSAgQW50IGRpc3RyaWJ1dGlvbiBjYWxsZWQgeGJlYW4uamFyLiAmbmJzcDtJdCBjYW4gYmUgZm91bmQgaW4gdGhlIFhNTEJlYW5zCi0gZGV2ZWxvcGVyIGtpdCBhdCA8YQotIGhyZWY9Imh0dHA6Ly9kZXYyZGV2LmJlYS5jb20vdGVjaG5vbG9naWVzL3htbGJlYW5zLyI+aHR0cDovL2RldjJkZXYuYmVhLmNvbS90ZWNobm9sb2dpZXMveG1sYmVhbnMvPC9hPi4gCi1UaGUgYnVpbGQgc2NyaXB0IHdpbGwgbmVlZCB0byBpbmNsdWRlIGEgdGFza2RlZiBmb3IgeG1sYmVhbiwgd2hpY2ggY291bGQgbG9vawotbGlrZSB0aGlzOjxicj4KLSA8L3A+Ci0gCi08cHJlPiZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7dGFza2RlZiBuYW1lPSJ4bWxiZWFuIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlhNTEJlYW4iIGNsYXNzcGF0aD0icGF0aC90by94YmVhbi5qYXIiLyZndDs8L3ByZT4KLSAKLTxwPiAgIDwvcD4KLSAgICAgICAgICAgCi08cD5JdCBpcyBwb3NzaWJsZSB0byByZWZpbmUgdGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyBwcm9jZXNzZWQuIFRoaXMgCi0gIGNhbiBiZSBkb25lIHdpdGggdGhlIDxpPmluY2x1ZGVzPC9pPiwgPGk+aW5jbHVkZXNmaWxlPC9pPiwgPGk+ZXhjbHVkZXM8L2k+LCAKLSAgPGk+ZXhjbHVkZXNmaWxlPC9pPiBhbmQgPGk+ZGVmYXVsdGV4Y2x1ZGVzPC9pPiBhdHRyaWJ1dGVzLiBXaXRoIHRoZSA8aT5pbmNsdWRlczwvaT4gCi0gIG9yIDxpPmluY2x1ZGVzZmlsZTwvaT4gYXR0cmlidXRlIHlvdSBzcGVjaWZ5IHRoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIAotaW5jbHVkZWQgIGJ5IHVzaW5nIHBhdHRlcm5zLiBUaGUgPGk+ZXhjbHVkZTwvaT4gb3IgPGk+ZXhjbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGUgCi1pcyAgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGV4Y2x1ZGVkLiBUaGlzIGlzIGFsc28gZG9uZSAKLXdpdGggIHBhdHRlcm5zLiBBbmQgZmluYWxseSB3aXRoIHRoZSA8aT5kZWZhdWx0ZXhjbHVkZXM8L2k+IGF0dHJpYnV0ZSwgeW91IAotY2FuIHNwZWNpZnkgd2hldGhlciB5b3Ugd2FudCB0byB1c2UgZGVmYXVsdCBleGNsdXNpb25zIG9yIG5vdC4gU2VlIHRoZSBzZWN0aW9uIAotIG9uIDxhCi0gaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MiPmRpcmVjdG9yeQotIGJhc2VkIHRhc2tzPC9hPiwgb24gaG93IHRoZSBpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93Ci10byAgd3JpdGUgcGF0dGVybnMuPC9wPgotICAgICAgICAgICAKLTxwPlRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCA8YQotIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gCi1hbmQgc3VwcG9ydHMgYWxsICAgYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+ICg8Y29kZT5kaXI8L2NvZGU+IAotICBiZWNvbWVzIDxjb2RlPmJhc2VkaXI8L2NvZGU+KSAgIGFzIHdlbGwgYXMgdGhlIG5lc3RlZCA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+LCAKLSAgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiAgIGFuZCA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KLSAgICAgICAgICAgICAgCi08aDM+UGFyYW1ldGVyczwvaDM+Ci0gICAgICAgICAgIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgICAgICAgPHRib2R5PgotICAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+c2NoZW1hPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkEgZmlsZSB0aGF0IHBvaW50cyB0byBlaXRoZXIgYW4gaW5kaXZpZHVhbCBzY2hlbWEKLSBmaWxlIG9yIGEgZGlyZWN0b3J5IG9mIGZpbGVzLiAmbmJzcDtOb3QgYSBwYXRoIHJlZmVyZW5jZS4gJm5ic3A7SWYgbXVsdGlwbGUKLSBzY2hlbWEgZmlsZXMgbmVlZCB0byBiZSBidWlsdCB0b2dldGhlciwgdXNlIGEgbmV4dGVkIGZpbGVzZXQgaW5zdGVhZCBvZgotc2V0dGluZyAgc2NoZW1hLjwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXMsIHVubGVzcyBhIGZpbGVzZXQgZWxlbWVudCBpcwotIG5lc3RlZC48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0ZmlsZTwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIGphciBmaWxlIGNyZWF0ZWQuJm5ic3A7IAotRm9yIGluc3RhbmNlLCAibXlYTUxCZWFuLmphciIgd2lsbCBvdXRwdXQgdGhlIHJlc3VsdHMgb2YgdGhpcyB0YXNrIGludG8gYSAKLWphciB3aXRoIHRoZSBzYW1lIG5hbWUuPC90ZD4KLSAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzICJ4bWx0eXBlcy5qYXIiLjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRvd25sb2FkPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlNldCB0byB0cnVlIHRvIHBlcm1pdCB0aGUgY29tcGlsZXIgdG8gZG93bmxvYWQgCi1VUkxzIGZvciBpbXBvcnRzIGFuZCBpbmNsdWRlcy4mbmJzcDsgRGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgYWxsIGltcG9ydHMgCi1hbmQgaW5jbHVkZXMgbXVzdCBiZSBjb3BpZWQgbG9jYWxseS48YnI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyBmYWxzZS48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gICAgIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIGFudCB0YXJnZXQKLXdpbGwgIGNvbnRpbnVlIGlmIHRoZSBYTUxCZWFuIGNyZWF0aW9uIGVuY291bnRlcnMgYSBidWlsZCBlcnJvci48YnI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyB0cnVlLjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+dmVyYm9zZTxicj4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5Db250cm9scyB0aGUgYW1vdW50IG9mIGJ1aWxkIG1lc3NhZ2Ugb3V0cHV0Ljxicj4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBpcyB0cnVlLjxicj4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+dHlwZXN5c3RlbW5hbWU8YnI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdGhhdCB0aGUgVHlwZVN5c3RlbUhvbGRlcgotY2xhc3Mgc2hvdWxkIGJlIGdlbmVyYXRlZCBpbi4mbmJzcDsgTm9ybWFsbHkgdGhpcyBzaG91bGQgYmUgbGVmdCB1bnNwZWNpZmllZC4KLU5vbmUgb2YgdGhlIHhtbCBiZWFucyBhcmUgZ2VuZXJhdGVkIGluIHRoaXMgcGFja2FnZS4gVXNlIC54c2Rjb25maWcgZmlsZXMKLXRvIG1vZGlmeSB4bWwgYmVhbiBwYWNrYWdlIG9yIGNsYXNzIG5hbWVzLjxicj4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Obzxicj4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NnZW5kaXI8YnI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0IGEgbG9jYXRpb24gdG8gZ2VuZXJhdGUgLmNsYXNzIGZpbGVzIGludG8uPGJyPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPGJyPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5zcmNvbmx5PGJyPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkEgdmFsdWUgb2YgdHJ1ZSBtZWFucyB0aGF0IG9ubHkgc291cmNlIHdpbGwgYmUgZ2VuZXJhdGVkLjxicj4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBpcyBmYWxzZS48YnI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnNyY2dlbmRpcjxicj4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5TZXQgYSBsb2NhdGlvbiB0byBnZW5lcmF0ZSAuamF2YSBmaWxlcyBpbnRvLjxicj4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Obzxicj4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNsYXNzcGF0aCB0byB1c2UgaWYgc2NoZW1hcyBpbiB0aGUgZmlsZXNldAotaW1wb3J0IGRlZmluaXRpb25zIHRoYXQgYXJlIHN1cHBsaWVkIGJ5IG90aGVyIGNvbXBpbGVkIHhtbCBiZWFucyBKQVIgZmlsZXMsCi1vciBpZiAuamF2YSBmaWxlcyBhcmUgaW4gdGhlIHNjaGVtYSBmaWxlc2V0LiAgQWxzbyBzdXBwb3J0cyBhIG5lc3RlZCBjbGFzc3BhdGguPC90ZD4KLSAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkFkZHMgYSBjbGFzc3BhdGgsIGdpdmVuIGFzIDxhCi0gaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4KLXRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5Db21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YKLWZpbGVzICAgdGhhdCBtdXN0IGJlIGluY2x1ZGVkLiAgICAgICBBbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZC48L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlc2ZpbGU8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCi10YWtlbiAgIHRvIGJlICAgICAgIGFuIGluY2x1ZGUgcGF0dGVybjwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZgotZmlsZXMgICB0aGF0IG11c3QgYmUgZXhjbHVkZWQuICAgICAgIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlCi1leGNsdWRlZCAgIHdoZW4gb21pdHRlZC48L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlc2ZpbGU8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCi10YWtlbiAgIHRvIGJlICAgICAgIGFuIGV4Y2x1ZGUgcGF0dGVybjwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRlZmF1bHRleGNsdWRlczwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkCi0gIG9yIG5vdCAgICAgICAoInllcyIvIm5vIikuIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRlYnVnPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIHNvdXJjZSBzaG91bGQgYmUgY29tcGlsZWQgd2l0aAotICAgICAgICAgIGRlYnVnIGluZm9ybWF0aW9uOyBkZWZhdWx0cyB0byA8Y29kZT5vZmY8L2NvZGU+LiAgSWYgc2V0IHRvCi0gICAgICAgICAgPGNvZGU+b2ZmPC9jb2RlPiwgPGNvZGU+LWc6bm9uZTwvY29kZT4gd2lsbCBiZSBwYXNzZWQgb24gdGhlCi0gICAgICAgICAgY29tbWFuZCBsaW5lIGZvciBjb21waWxlcnMgdGhhdCBzdXBwb3J0IGl0IChmb3Igb3RoZXIgY29tcGlsZXJzLCBubwotICAgICAgICAgIGNvbW1hbmQgbGluZSBhcmd1bWVudCB3aWxsIGJlIHVzZWQpLiAgSWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LAotICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+ZGVidWdsZXZlbDwvY29kZT4gYXR0cmlidXRlIGRldGVybWluZXMgdGhlCi0gICAgICAgICAgY29tbWFuZCBsaW5lIGFyZ3VtZW50LjwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRlYnVnbGV2ZWw8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+S2V5d29yZCBsaXN0IHRvIGJlIGFwcGVuZGVkIHRvIHRoZSA8Y29kZT4tZzwvY29kZT4KLSAgICAgICAgICAgIGNvbW1hbmQtbGluZSBzd2l0Y2guICBUaGlzIHdpbGwgYmUgaWdub3JlZCBieSBhbGwgaW1wbGVtZW50YXRpb25zIGV4Y2VwdAotICAgICAgICAgICAgPGNvZGU+bW9kZXJuPC9jb2RlPiBhbmQgPGNvZGU+Y2xhc3NpYyh2ZXIgJmd0Oz0gMS4yKTwvY29kZT4uCi0gICAgICAgICAgICBMZWdhbCB2YWx1ZXMgYXJlIDxjb2RlPm5vbmU8L2NvZGU+IG9yIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlCi0gICAgICAgICAgICBmb2xsb3dpbmcga2V5d29yZHM6Ci0gICAgICAgICAgICA8Y29kZT5saW5lczwvY29kZT4sIDxjb2RlPnZhcnM8L2NvZGU+LCBhbmQgPGNvZGU+c291cmNlPC9jb2RlPi4KLSAgICAgICAgICAgIElmIDxjb2RlPmRlYnVnbGV2ZWw8L2NvZGU+IGlzIG5vdCBzcGVjaWZpZWQsIGJ5IGRlZmF1bHQsCi0gICAgICAgICAgICBub3RoaW5nIHdpbGwgYmUKLSAgICAgICAgICAgIGFwcGVuZGVkIHRvIDxjb2RlPi1nPC9jb2RlPi4gIElmIDxjb2RlPmRlYnVnPC9jb2RlPiBpcyBub3QgdHVybmVkIG9uLAotICAgICAgICAgICAgdGhpcyBhdHRyaWJ1dGUgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPm9wdGltaXplPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIHNvdXJjZSBzaG91bGQgYmUgY29tcGlsZWQgd2l0aAotICAgICAgICAgICAgb3B0aW1pemF0aW9uOyBkZWZhdWx0cyB0byA8Y29kZT5vZmY8L2NvZGU+LjwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVBbnRSdW50aW1lPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgQW50IHJ1bi10aW1lIGxpYnJhcmllcyBpbiB0aGUKLSAgICAgICAgICAgIGNsYXNzcGF0aDsgZGVmYXVsdHMgdG8gPGNvZGU+eWVzPC9jb2RlPi48L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlSmF2YVJ1bnRpbWU8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBpbmNsdWRlIHRoZSBkZWZhdWx0IHJ1bi10aW1lCi0gICAgICAgICAgICBsaWJyYXJpZXMgZnJvbSB0aGUgZXhlY3V0aW5nIFZNIGluIHRoZSBjbGFzc3BhdGg7Ci0gICAgICAgICAgICBkZWZhdWx0cyB0byA8Y29kZT5ubzwvY29kZT4uPC90ZD4KLSAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9yazwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGV4ZWN1dGUgPGNvZGU+amF2YWM8L2NvZGU+IHVzaW5nIHRoZQotICAgICAgICAgICAgSkRLIGNvbXBpbGVyIGV4dGVybmFsbHk7IGRlZmF1bHRzIHRvIDxjb2RlPnllczwvY29kZT4uPC90ZD4KLSAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIHRydWU8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5leGVjdXRhYmxlPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbXBsZXRlIHBhdGggdG8gdGhlIDxjb2RlPmphdmFjPC9jb2RlPgotICAgICAgICAgICAgZXhlY3V0YWJsZSB0byB1c2UgaW4gY2FzZSBvZiA8Y29kZT5mb3JrPSZxdW90O3llcyZxdW90OzwvY29kZT4uCi0gICAgICAgICAgICBEZWZhdWx0cyB0byB0aGUgY29tcGlsZXIgb2YgdGhlIEphdmEgdmVyc2lvbiB0aGF0IGlzIGN1cnJlbnRseQotICAgICAgICAgICAgcnVubmluZyBBbnQuICBJZ25vcmVkIGlmIDxjb2RlPmZvcms9JnF1b3Q7bm8mcXVvdDs8L2NvZGU+PC90ZD4KLSAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bWVtb3J5SW5pdGlhbFNpemU8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciB0aGUgdW5kZXJseWluZyBWTSwKLSAgICAgICAgICAgIGlmIDxjb2RlPmphdmFjPC9jb2RlPiBpcyBydW4gZXh0ZXJuYWxseTsgaWdub3JlZCBvdGhlcndpc2UuIERlZmF1bHRzCi0gICAgICAgICAgICB0byB0aGUgc3RhbmRhcmQgVk0gbWVtb3J5IHNldHRpbmcuCi0gICAgICAgICAgICAoRXhhbXBsZXM6IDxjb2RlPjgzODg2MDgwPC9jb2RlPiwgPGNvZGU+ODE5MjBrPC9jb2RlPiwgb3IKLSAgICAgICAgICAgIDxjb2RlPjgwbTwvY29kZT4pPC90ZD4KLSAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bWVtb3J5TWF4aW11bVNpemU8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciB0aGUgdW5kZXJseWluZyBWTSwKLSAgICAgICAgICAgIGlmIDxjb2RlPmphdmFjPC9jb2RlPiBpcyBydW4gZXh0ZXJuYWxseTsgaWdub3JlZCBvdGhlcndpc2UuIERlZmF1bHRzCi0gICAgICAgICAgICB0byB0aGUgc3RhbmRhcmQgVk0gbWVtb3J5IHNldHRpbmcuCi0gICAgICAgICAgICAoRXhhbXBsZXM6IDxjb2RlPjgzODg2MDgwPC9jb2RlPiwgPGNvZGU+ODE5MjBrPC9jb2RlPiwgb3IKLSAgICAgICAgICAgIDxjb2RlPjgwbTwvY29kZT4pPC90ZD4KLSAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcGlsZXI8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIHRvIHVzZS4KLSAgICAgICAgICAgIElmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBzZXQsIHRoZSB2YWx1ZSBvZiB0aGUKLSAgICAgICAgICAgIDxjb2RlPmJ1aWxkLmNvbXBpbGVyPC9jb2RlPiBwcm9wZXJ0eSwgaWYgc2V0LCB3aWxsIGJlIHVzZWQuCi0gICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGZvciB0aGUgY3VycmVudCBWTSB3aWxsIGJlIHVzZWQuCi0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgIAotICA8L3Rib2R5PiAgICAgCi08L3RhYmxlPgotICAgICAgICAgICAgICAgICAKLTxoMz5FeGFtcGxlPC9oMz4KLSAgICAgICAgICAgCi08YmxvY2txdW90ZT4gICAgICAgICAgICAgICBCZSBzdXJlIHRvIGRlZmluZSB0aGUgdGFzayBpbiB5b3VyIHNjcmlwdCwgbGlrZSAKLXRoaXM6PGJyPgotICAgCi0gIDxwcmU+Jmx0O3Rhc2tkZWYgbmFtZT0ieG1sYmVhbiIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5YTUxCZWFuIiBjbGFzc3BhdGg9InBhdGgvdG8veGJlYW4uamFyIi8mZ3Q7PC9wcmU+Ci0gICAKLSAgPHByZT48YnI+Jmx0O3htbGJlYW4gc2NoZW1hPSJzY2hlbWFzIiBkZXN0ZmlsZT0iU2NoZW1hcy5qYXIiLyZndDs8YnI+PC9wcmU+Ci0gIEJ1aWxkcyBhbGwgdGhlIHNjaGVtYXMgaW4gdGhlIHNjaGVtYXMgZGlyZWN0b3J5IGFuZCBjcmVhdGVzIGEgamFyIGNhbGxlZAotICdTY2hlbWFzLmphcicuPGJyPgotICAgICAgICAgICAgICAgICAgICAKLSAgPHByZT4mbHQ7eG1sYmVhbiBzY2hlbWE9InNjaGVtYXMvb3VyU2NoZW1hLnhzZCIgZG93bmxvYWQ9InRydWUiLyZndDs8YnI+PC9wcmU+Ci0gIENvbXBpbGVzIHRoZSBzY2hlbWEgJ291clNoZW1hLnhzZCcgaW50byB0aGUgZGVmYXVsdCBqYXIgJ3htbHR5cGVzLmphcicuIAotJm5ic3A7SWYgJm5ic3A7YW55IGltcG9ydHMgYW5kIGluY2x1ZGVzIGFyZSBkZWZpbmVkIGJ5IHJlbW90ZSBVUkxzLCB0aGV5IGFyZQotZG93bmxvYWRlZCBkdXJpbmcgdGhlIGJ1aWxkLjxicj4KLSAgICAgICAgICAgICAgICAgICAgICAgCi0gIDxoND5Vc2luZyBhIGZpbGVzZXQ8L2g0PgotICAgICAgICAgICAgICAgICAgICAgICAKLSAgPHByZT4mbHQ7eG1sYmVhbiBjbGFzc2dlbmRpcj0iJHtidWlsZC5kaXJ9IiBjbGFzc3BhdGg9IiR7Y2xhc3MucGF0aH0iPGJyPiAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIiZndDs8YnI+ICAmbHQ7ZmlsZXNldCBiYXNlZGlyPSJzcmMiIGV4Y2x1ZGVzPSIqKi8qLnhzZCIvJmd0Ozxicj4gICZsdDtmaWxlc2V0IGJhc2VkaXI9InNjaGVtYXMiIGluY2x1ZGVzPSIqKi8qLioiLyZndDs8YnI+Jmx0Oy94bWxiZWFuJmd0Ozxicj48L3ByZT4KLSAgR2F0aGVycyBhbGwgdGhlIGZpbGVzIGluIHRoZSAnc3JjJyBkaXJlY3RvcnkgZXhjZXB0IC54c2QgZmlsZXMsIGFsb25nIHdpdGgKLSBldmVyeSBmaWxlIGluIHRoZSAnc2NoZW1hcycgZGlyZWN0b3J5IGFuZCBjb21waWxlcyB0aGVtLiBUaGUgZmlsZXNldCBjYW4KLWluY2x1ZGUgc2NoZW1hIGZpbGVzIHRoYXQgcmVmZXIgdG8gcHJldmlvdXNseSBjb21waWxlZCBzY2hlbWEgY29tcG9uZW50cy4mbmJzcDsKLVRoZSBmaWxlc2V0IGNhbiBhbHNvIGNvbnRhaW4gLmphdmEgZmlsZXMuJm5ic3A7IFRoZSBjbGFzc3BhdGggcGFyYW1ldGVyIGRlZmluZXMKLXRoZSBjbGFzc3BhdGggbmVjZXNzYXJ5IHRvIHJlc29sdmUgY29tcGlsZWQgc2NoZW1hIGFuZCBqYXZhIHJlZmVyZW5jZXMuPGJyPgotICA8YnI+Ci1UaGUgYnVpbHQgY2xhc3NlcyB3aWxsIGdvIGludG8gJHtidWlsZC5kaXJ9Ljxicj4KLSAgICAgICAgICAgICAgICAgICAgICAgCi0gIDxwcmU+PC9wcmU+Ci0gICAgICAgICAgIDwvYmxvY2txdW90ZT4KLSAgICAgICAgICAgCi08aHI+ICAgICAgCi0gICAgICAgPGJyPgotICAgICAgICA8YnI+Ci0gPGJyPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEvZXh0ZXJuYWwvbGliL2p1bml0LmphciBiL3YxL2V4dGVybmFsL2xpYi9qdW5pdC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZTQzYmIuLjAwMDAwMDAKLS0tIGEvdjEvZXh0ZXJuYWwvbGliL2p1bml0LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxL2V4dGVybmFsL2xpYi9vbGR4YmVhbi5qYXIgYi92MS9leHRlcm5hbC9saWIvb2xkeGJlYW4uamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjYxYTUyLi4wMDAwMDAwCi0tLSBhL3YxL2V4dGVybmFsL2xpYi9vbGR4YmVhbi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vQ2hhcnMuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9DaGFycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDQxZDVkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9DaGFycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2hhcnMKLXsKLSAgICBwdWJsaWMgU3RyaW5nIGFzU3RyaW5nICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBzdHJpbmcgPT0gbnVsbAotICAgICAgICAgICAgICAgID8gYnVmZmVyID09IG51bGwgPyAiIiA6IG5ldyBTdHJpbmcoIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGggKQotICAgICAgICAgICAgICAgIDogc3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgc3RyaW5nOwotCi0gICAgcHVibGljIGNoYXJbXSBidWZmZXI7Ci0gICAgcHVibGljIGludCAgICBvZmZzZXQ7Ci0gICAgcHVibGljIGludCAgICBsZW5ndGg7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vRW5jb2RpbmdNYXAuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9FbmNvZGluZ01hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDFiNDJjLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9FbmNvZGluZ01hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEVuY29kaW5nTWFwCi17Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SmF2YTJJQU5BTWFwcGluZyAoIFN0cmluZyBqYXZhICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBfamF2YV90b19pYW5hLmdldCggamF2YS50b1VwcGVyQ2FzZSgpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElBTkEySmF2YU1hcHBpbmcgKCBTdHJpbmcgaWFuYSApCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZykgX2lhbmFfdG9famF2YS5nZXQoIGlhbmEudG9VcHBlckNhc2UoKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgRW5jb2RpbmdNYXAgKCApIHsgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEhhc2hNYXAgX2lhbmFfdG9famF2YSA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSGFzaE1hcCBfamF2YV90b19pYW5hID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIHZvaWQgYWRkTWFwcGluZyAoCi0gICAgICAgIFN0cmluZyBqYXZhLCBTdHJpbmcgaWFuYSwgYm9vbGVhbiBpc0RlZmF1bHQgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0ICFfaWFuYV90b19qYXZhLmNvbnRhaW5zS2V5KCBpYW5hICk7Ci0gICAgICAgIGFzc2VydCBqYXZhLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCBqYXZhICk7Ci0gICAgICAgIGFzc2VydCBpYW5hLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCBpYW5hICk7Ci0gICAgICAgIAotICAgICAgICBfaWFuYV90b19qYXZhLnB1dCggaWFuYSwgamF2YSApOwotCi0gICAgICAgIGlmIChpc0RlZmF1bHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCAhX2phdmFfdG9faWFuYS5jb250YWluc0tleSggamF2YSApOwotICAgICAgICAgICAgX2phdmFfdG9faWFuYS5wdXQoIGphdmEsIGlhbmEgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gY29tcGxldGVNYXBwaW5ncyAoICkKLSAgICB7Ci0gICAgICAgIEhhc2hNYXAgbSA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IF9pYW5hX3RvX2phdmEua2V5U2V0KCkuaXRlcmF0b3IoKSA7IGkuaGFzTmV4dCgpIDsgKQotICAgICAgICAgICAgbS5wdXQoIF9pYW5hX3RvX2phdmEuZ2V0KCBpLm5leHQoKSApLCBudWxsICk7Ci0KLSAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IG0ua2V5U2V0KCkuaXRlcmF0b3IoKSA7IGkuaGFzTmV4dCgpIDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgayA9IGkubmV4dCgpOwotICAgICAgICAgICAgYXNzZXJ0IF9qYXZhX3RvX2lhbmEuY29udGFpbnNLZXkoIGsgKTogazsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgYWRkTWFwcGluZyggIkFTQ0lJIiwgICAgICAgICAiQU5TSV9YMy40LTE5ODYiLCAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJBU0NJSSIsICAgICAgICAgIkFTQ0lJIiwgICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQVNDSUkiLCAgICAgICAgICJDUDM2NyIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkFTQ0lJIiwgICAgICAgICAiQ1NBU0NJSSIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJBU0NJSSIsICAgICAgICAgIklCTS0zNjciLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQVNDSUkiLCAgICAgICAgICJJQk0zNjciLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkFTQ0lJIiwgICAgICAgICAiSVNPLUlSLTYiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJBU0NJSSIsICAgICAgICAgIklTTzY0Ni1VUyIsICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQVNDSUkiLCAgICAgICAgICJJU09fNjQ2LklSVjoxOTkxIiwgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkFTQ0lJIiwgICAgICAgICAiVVMiLCAgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJBU0NJSSIsICAgICAgICAgIlVTLUFTQ0lJIiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQklHNSIsICAgICAgICAgICJCSUc1IiwgICAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkJJRzUiLCAgICAgICAgICAiQ1NCSUc1IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDAzNyIsICAgICAgICAgIkNQMDM3IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AwMzciLCAgICAgICAgICJDU0lCTTAzNyIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMDM3IiwgICAgICAgICAiRUJDRElDLUNQLUNBIiwgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDAzNyIsICAgICAgICAgIkVCQ0RJQy1DUC1OTCIsICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AwMzciLCAgICAgICAgICJFQkNESUMtQ1AtVVMiLCAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMDM3IiwgICAgICAgICAiRUJDRElDLUNQLVdUIiwgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDAzNyIsICAgICAgICAgIklCTS0zNyIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AwMzciLCAgICAgICAgICJJQk0wMzciLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTAyNiIsICAgICAgICAiQ1AxMDI2IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDEwMjYiLCAgICAgICAgIkNTSUJNMTAyNiIsICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMDI2IiwgICAgICAgICJJQk0tMTAyNiIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTAyNiIsICAgICAgICAiSUJNMTAyNiIsICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDEwNDciLCAgICAgICAgIkNQMTA0NyIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMDQ3IiwgICAgICAgICJJQk0tMTA0NyIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTA0NyIsICAgICAgICAiSUJNMTA0NyIsICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDAiLCAgICAgICAgIkNDU0lEMDExNDAiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQwIiwgICAgICAgICJDUDAxMTQwIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MCIsICAgICAgICAiSUJNLTExNDAiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDAiLCAgICAgICAgIklCTTAxMTQwIiwgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQxIiwgICAgICAgICJDQ1NJRDAxMTQxIiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MSIsICAgICAgICAiQ1AwMTE0MSIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDEiLCAgICAgICAgIklCTS0xMTQxIiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQxIiwgICAgICAgICJJQk0wMTE0MSIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MiIsICAgICAgICAiQ0NTSUQwMTE0MiIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDIiLCAgICAgICAgIkNQMDExNDIiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQyIiwgICAgICAgICJJQk0tMTE0MiIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MiIsICAgICAgICAiSUJNMDExNDIiLCAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDMiLCAgICAgICAgIkNDU0lEMDExNDMiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQzIiwgICAgICAgICJDUDAxMTQzIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MyIsICAgICAgICAiSUJNLTExNDMiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDMiLCAgICAgICAgIklCTTAxMTQzIiwgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ0IiwgICAgICAgICJDQ1NJRDAxMTQ0IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NCIsICAgICAgICAiQ1AwMTE0NCIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDQiLCAgICAgICAgIklCTS0xMTQ0IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ0IiwgICAgICAgICJJQk0wMTE0NCIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NSIsICAgICAgICAiQ0NTSUQwMTE0NSIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDUiLCAgICAgICAgIkNQMDExNDUiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ1IiwgICAgICAgICJJQk0tMTE0NSIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NSIsICAgICAgICAiSUJNMDExNDUiLCAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDYiLCAgICAgICAgIkNDU0lEMDExNDYiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ2IiwgICAgICAgICJDUDAxMTQ2IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NiIsICAgICAgICAiSUJNLTExNDYiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDYiLCAgICAgICAgIklCTTAxMTQ2IiwgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ3IiwgICAgICAgICJDQ1NJRDAxMTQ3IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NyIsICAgICAgICAiQ1AwMTE0NyIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDciLCAgICAgICAgIklCTS0xMTQ3IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ3IiwgICAgICAgICJJQk0wMTE0NyIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0OCIsICAgICAgICAiQ0NTSUQwMTE0OCIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDgiLCAgICAgICAgIkNQMDExNDgiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ4IiwgICAgICAgICJJQk0tMTE0OCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0OCIsICAgICAgICAiSUJNMDExNDgiLCAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDkiLCAgICAgICAgIkNDU0lEMDExNDkiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ5IiwgICAgICAgICJDUDAxMTQ5IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0OSIsICAgICAgICAiSUJNLTExNDkiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDkiLCAgICAgICAgIklCTTAxMTQ5IiwgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMjUwIiwgICAgICAgICJXSU5ET1dTLTEyNTAiLCAgICAgICAgICAgdHJ1ZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMjUxIiwgICAgICAgICJXSU5ET1dTLTEyNTEiLCAgICAgICAgICAgdHJ1ZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMjUyIiwgICAgICAgICJXSU5ET1dTLTEyNTIiLCAgICAgICAgICAgdHJ1ZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMjUzIiwgICAgICAgICJXSU5ET1dTLTEyNTMiLCAgICAgICAgICAgdHJ1ZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMjU0IiwgICAgICAgICJXSU5ET1dTLTEyNTQiLCAgICAgICAgICAgdHJ1ZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMjU1IiwgICAgICAgICJXSU5ET1dTLTEyNTUiLCAgICAgICAgICAgdHJ1ZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMjU2IiwgICAgICAgICJXSU5ET1dTLTEyNTYiLCAgICAgICAgICAgdHJ1ZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMjU3IiwgICAgICAgICJXSU5ET1dTLTEyNTciLCAgICAgICAgICAgdHJ1ZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMjU4IiwgICAgICAgICJXSU5ET1dTLTEyNTgiLCAgICAgICAgICAgdHJ1ZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzMiLCAgICAgICAgICJDUDI3MyIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjczIiwgICAgICAgICAiQ1NJQk0yNzMiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI3MyIsICAgICAgICAgIklCTS0yNzMiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzMiLCAgICAgICAgICJJQk0yNzMiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjc3IiwgICAgICAgICAiQ1AyNzciLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI3NyIsICAgICAgICAgIkNTSUJNMjc3IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzciLCAgICAgICAgICJFQkNESUMtQ1AtREsiLCAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjc3IiwgICAgICAgICAiRUJDRElDLUNQLU5PIiwgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI3NyIsICAgICAgICAgIklCTS0yNzciLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzciLCAgICAgICAgICJJQk0yNzciLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjc4IiwgICAgICAgICAiQ1AyNzgiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI3OCIsICAgICAgICAgIkNTSUJNMjc4IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzgiLCAgICAgICAgICJFQkNESUMtQ1AtRkkiLCAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjc4IiwgICAgICAgICAiRUJDRElDLUNQLVNFIiwgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI3OCIsICAgICAgICAgIklCTS0yNzgiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzgiLCAgICAgICAgICJJQk0yNzgiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjgwIiwgICAgICAgICAiQ1AyODAiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI4MCIsICAgICAgICAgIkNTSUJNMjgwIiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODAiLCAgICAgICAgICJFQkNESUMtQ1AtSVQiLCAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjgwIiwgICAgICAgICAiSUJNLTI4MCIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI4MCIsICAgICAgICAgIklCTTI4MCIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODQiLCAgICAgICAgICJDUDI4NCIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjg0IiwgICAgICAgICAiQ1NJQk0yODQiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI4NCIsICAgICAgICAgIkVCQ0RJQy1DUC1FUyIsICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODQiLCAgICAgICAgICJJQk0tMjg0IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjg0IiwgICAgICAgICAiSUJNMjg0IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI4NSIsICAgICAgICAgIkNQMjg1IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODUiLCAgICAgICAgICJDU0lCTTI4NSIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjg1IiwgICAgICAgICAiRUJDRElDLUNQLUdCIiwgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI4NSIsICAgICAgICAgIklCTS0yODUiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODUiLCAgICAgICAgICJJQk0yODUiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjkwIiwgICAgICAgICAiQ1AyOTAiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI5MCIsICAgICAgICAgIkNTSUJNMjkwIiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyOTAiLCAgICAgICAgICJFQkNESUMtSlAtS0FOQSIsICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjkwIiwgICAgICAgICAiSUJNLTI5MCIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI5MCIsICAgICAgICAgIklCTTI5MCIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyOTciLCAgICAgICAgICJDUDI5NyIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjk3IiwgICAgICAgICAiQ1NJQk0yOTciLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDI5NyIsICAgICAgICAgIkVCQ0RJQy1DUC1GUiIsICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyOTciLCAgICAgICAgICJJQk0tMjk3IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQMjk3IiwgICAgICAgICAiSUJNMjk3IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDQyMCIsICAgICAgICAgIkNQNDIwIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MjAiLCAgICAgICAgICJDU0lCTTQyMCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNDIwIiwgICAgICAgICAiRUJDRElDLUNQLUFSMSIsICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDQyMCIsICAgICAgICAgIklCTS00MjAiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MjAiLCAgICAgICAgICJJQk00MjAiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNDI0IiwgICAgICAgICAiQ1A0MjQiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDQyNCIsICAgICAgICAgIkNTSUJNNDI0IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MjQiLCAgICAgICAgICJFQkNESUMtQ1AtSEUiLCAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNDI0IiwgICAgICAgICAiSUJNLTQyNCIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDQyNCIsICAgICAgICAgIklCTTQyNCIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MzciLCAgICAgICAgICI0MzciLCAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNDM3IiwgICAgICAgICAiQ1A0MzciLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDQzNyIsICAgICAgICAgIkNTUEM4Q09ERVBBR0U0MzciLCAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MzciLCAgICAgICAgICJJQk0tNDM3IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNDM3IiwgICAgICAgICAiSUJNNDM3IiwgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDUwMCIsICAgICAgICAgIkNQNTAwIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A1MDAiLCAgICAgICAgICJDU0lCTTUwMCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNTAwIiwgICAgICAgICAiRUJDRElDLUNQLUJFIiwgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDUwMCIsICAgICAgICAgIkVCQ0RJQy1DUC1DSCIsICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A1MDAiLCAgICAgICAgICJJQk0tNTAwIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNTAwIiwgICAgICAgICAiSUJNNTAwIiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDc3NSIsICAgICAgICAgIkNQNzc1IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A3NzUiLCAgICAgICAgICJDU1BDNzc1QkFMVElDIiwgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQNzc1IiwgICAgICAgICAiSUJNLTc3NSIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDc3NSIsICAgICAgICAgIklCTTc3NSIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTAiLCAgICAgICAgICI4NTAiLCAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODUwIiwgICAgICAgICAiQ1A4NTAiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1MCIsICAgICAgICAgIkNTUEM4NTBNVUxUSUxJTkdVQUwiLCAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTAiLCAgICAgICAgICJJQk0tODUwIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODUwIiwgICAgICAgICAiSUJNODUwIiwgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1MiIsICAgICAgICAgIjg1MiIsICAgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTIiLCAgICAgICAgICJDUDg1MiIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODUyIiwgICAgICAgICAiQ1NQQ1A4NTIiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1MiIsICAgICAgICAgIklCTS04NTIiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTIiLCAgICAgICAgICJJQk04NTIiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODU1IiwgICAgICAgICAiODU1IiwgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1NSIsICAgICAgICAgIkNQODU1IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTUiLCAgICAgICAgICJDU0lCTTg1NSIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODU1IiwgICAgICAgICAiSUJNLTg1NSIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1NSIsICAgICAgICAgIklCTTg1NSIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTciLCAgICAgICAgICI4NTciLCAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODU3IiwgICAgICAgICAiQ1A4NTciLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1NyIsICAgICAgICAgIkNTSUJNODU3IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTciLCAgICAgICAgICJJQk0tODU3IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODU3IiwgICAgICAgICAiSUJNODU3IiwgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1OCIsICAgICAgICAgIkNDU0lEMDA4NTgiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTgiLCAgICAgICAgICJDUDAwODU4IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODU4IiwgICAgICAgICAiSUJNLTg1OCIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg1OCIsICAgICAgICAgIklCTTAwODU4IiwgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjAiLCAgICAgICAgICI4NjAiLCAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYwIiwgICAgICAgICAiQ1A4NjAiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MCIsICAgICAgICAgIkNTSUJNODYwIiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjAiLCAgICAgICAgICJJQk0tODYwIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYwIiwgICAgICAgICAiSUJNODYwIiwgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MSIsICAgICAgICAgIjg2MSIsICAgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjEiLCAgICAgICAgICJDUC1JUyIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYxIiwgICAgICAgICAiQ1A4NjEiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MSIsICAgICAgICAgIkNTSUJNODYxIiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjEiLCAgICAgICAgICJJQk0tODYxIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYxIiwgICAgICAgICAiSUJNODYxIiwgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MiIsICAgICAgICAgIjg2MiIsICAgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjIiLCAgICAgICAgICJDUDg2MiIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYyIiwgICAgICAgICAiQ1NQQzg2MkxBVElOSEVCUkVXIiwgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MiIsICAgICAgICAgIklCTS04NjIiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjIiLCAgICAgICAgICJJQk04NjIiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYzIiwgICAgICAgICAiODYzIiwgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MyIsICAgICAgICAgIkNQODYzIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjMiLCAgICAgICAgICJDU0lCTTg2MyIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODYzIiwgICAgICAgICAiSUJNLTg2MyIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MyIsICAgICAgICAgIklCTTg2MyIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjQiLCAgICAgICAgICJDUDg2NCIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY0IiwgICAgICAgICAiQ1NJQk04NjQiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2NCIsICAgICAgICAgIklCTS04NjQiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjQiLCAgICAgICAgICJJQk04NjQiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY1IiwgICAgICAgICAiODY1IiwgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2NSIsICAgICAgICAgIkNQODY1IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjUiLCAgICAgICAgICJDU0lCTTg2NSIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY1IiwgICAgICAgICAiSUJNLTg2NSIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2NSIsICAgICAgICAgIklCTTg2NSIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjYiLCAgICAgICAgICI4NjYiLCAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY2IiwgICAgICAgICAiQ1A4NjYiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2NiIsICAgICAgICAgIkNTSUJNODY2IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjYiLCAgICAgICAgICJJQk0tODY2IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY2IiwgICAgICAgICAiSUJNODY2IiwgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2OCIsICAgICAgICAgIkNQLUFSIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjgiLCAgICAgICAgICJDUDg2OCIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY4IiwgICAgICAgICAiQ1NJQk04NjgiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2OCIsICAgICAgICAgIklCTS04NjgiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjgiLCAgICAgICAgICJJQk04NjgiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY5IiwgICAgICAgICAiQ1AtR1IiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2OSIsICAgICAgICAgIkNQODY5IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjkiLCAgICAgICAgICJDU0lCTTg2OSIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODY5IiwgICAgICAgICAiSUJNLTg2OSIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg2OSIsICAgICAgICAgIklCTTg2OSIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NzAiLCAgICAgICAgICJDUDg3MCIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODcwIiwgICAgICAgICAiQ1NJQk04NzAiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg3MCIsICAgICAgICAgIkVCQ0RJQy1DUC1ST0VDRSIsICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NzAiLCAgICAgICAgICJFQkNESUMtQ1AtWVUiLCAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODcwIiwgICAgICAgICAiSUJNLTg3MCIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg3MCIsICAgICAgICAgIklCTTg3MCIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NzEiLCAgICAgICAgICJDUDg3MSIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODcxIiwgICAgICAgICAiQ1NJQk04NzEiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDg3MSIsICAgICAgICAgIkVCQ0RJQy1DUC1JUyIsICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NzEiLCAgICAgICAgICJJQk0tODcxIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQODcxIiwgICAgICAgICAiSUJNODcxIiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDkxOCIsICAgICAgICAgIkNQOTE4IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A5MTgiLCAgICAgICAgICJDU0lCTTkxOCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQOTE4IiwgICAgICAgICAiRUJDRElDLUNQLUFSMiIsICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDkxOCIsICAgICAgICAgIklCTS05MTgiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A5MTgiLCAgICAgICAgICJJQk05MTgiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQOTI0IiwgICAgICAgICAiQ0NTSUQwMDkyNCIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDkyNCIsICAgICAgICAgIkNQMDA5MjQiLCAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiQ1A5MjQiLCAgICAgICAgICJFQkNESUMtTEFUSU45LS1FVVJPIiwgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkNQOTI0IiwgICAgICAgICAiSUJNLTkyNCIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJDUDkyNCIsICAgICAgICAgIklCTTAwOTI0IiwgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiRVVDSklTIiwgICAgICAgICJDU0VVQ1BLREZNVEpBUEFORVNFIiwgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkVVQ0pJUyIsICAgICAgICAiRVVDLUpQIiwgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJFVUNKSVMiLCAgICAgICAgIkVYVEVOREVEX1VOSVhfQ09ERV9QQUNLRURfRk9STUFUX0ZPUl9KQVBBTkVTRSIsIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJHQjE4MDMwIiwgICAgICAgIkdCMTgwMzAiLCAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiR0IyMzEyIiwgICAgICAgICJDU0dCMjMxMiIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkdCMjMxMiIsICAgICAgICAiR0IyMzEyIiwgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU08yMDIyQ04iLCAgICAgIklTTy0yMDIyLUNOIiwgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPMjAyMktSIiwgICAgICJDU0lTTzIwMjJLUiIsICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzIwMjJLUiIsICAgICAiSVNPLTIwMjItS1IiLCAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzEiLCAgICAgIkNQODE5IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8xIiwgICAgICJDU0lTT0xBVElOMSIsICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMSIsICAgICAiSUJNLTgxOSIsICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzEiLCAgICAgIklCTTgxOSIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8xIiwgICAgICJJU08tODg1OS0xIiwgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMSIsICAgICAiSVNPLUlSLTEwMCIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzEiLCAgICAgIklTT184ODU5LTEiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8xIiwgICAgICJMMSIsICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMSIsICAgICAiTEFUSU4xIiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzIiLCAgICAgIkNTSVNPTEFUSU4yIiwgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8yIiwgICAgICJJU08tODg1OS0yIiwgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMiIsICAgICAiSVNPLUlSLTEwMSIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzIiLCAgICAgIklTT184ODU5LTIiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8yIiwgICAgICJMMiIsICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMiIsICAgICAiTEFUSU4yIiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzMiLCAgICAgIkNTSVNPTEFUSU4zIiwgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8zIiwgICAgICJJU08tODg1OS0zIiwgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMyIsICAgICAiSVNPLUlSLTEwOSIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzMiLCAgICAgIklTT184ODU5LTMiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8zIiwgICAgICJMMyIsICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMyIsICAgICAiTEFUSU4zIiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzQiLCAgICAgIkNTSVNPTEFUSU40IiwgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV80IiwgICAgICJJU08tODg1OS00IiwgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNCIsICAgICAiSVNPLUlSLTExMCIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzQiLCAgICAgIklTT184ODU5LTQiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV80IiwgICAgICJMNCIsICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNCIsICAgICAiTEFUSU40IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzUiLCAgICAgIkNTSVNPTEFUSU5DWVJJTExJQyIsICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV81IiwgICAgICJDWVJJTExJQyIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNSIsICAgICAiSVNPLTg4NTktNSIsICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzUiLCAgICAgIklTTy1JUi0xNDQiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV81IiwgICAgICJJU09fODg1OS01IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNiIsICAgICAiQVJBQklDIiwgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzYiLCAgICAgIkFTTU8tNzA4IiwgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV82IiwgICAgICJDU0lTT0xBVElOQVJBQklDIiwgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNiIsICAgICAiRUNNQS0xMTQiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzYiLCAgICAgIklTTy04ODU5LTYiLCAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV82IiwgICAgICJJU08tSVItMTI3IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNiIsICAgICAiSVNPXzg4NTktNiIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzciLCAgICAgIkNTSVNPTEFUSU5HUkVFSyIsICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV83IiwgICAgICJFQ01BLTExOCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNyIsICAgICAiRUxPVF85MjgiLCAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzciLCAgICAgIkdSRUVLIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV83IiwgICAgICJHUkVFSzgiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNyIsICAgICAiSVNPLTg4NTktNyIsICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzciLCAgICAgIklTTy1JUi0xMjYiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV83IiwgICAgICJJU09fODg1OS03IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfOCIsICAgICAiQ1NJU09MQVRJTkhFQlJFVyIsICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzgiLCAgICAgIkhFQlJFVyIsICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV84IiwgICAgICJJU08tODg1OS04IiwgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfOCIsICAgICAiSVNPLTg4NTktOC1JIiwgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzgiLCAgICAgIklTTy1JUi0xMzgiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV84IiwgICAgICJJU09fODg1OS04IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfOSIsICAgICAiQ1NJU09MQVRJTjUiLCAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzkiLCAgICAgIklTTy04ODU5LTkiLCAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV85IiwgICAgICJJU08tSVItMTQ4IiwgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfOSIsICAgICAiSVNPXzg4NTktOSIsICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzkiLCAgICAgIkw1IiwgICAgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV85IiwgICAgICJMQVRJTjUiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkpJUyIsICAgICAgICAgICAiQ1NJU08yMDIySlAiLCAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJKSVMiLCAgICAgICAgICAgIklTTy0yMDIyLUpQIiwgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSklTMDIwMSIsICAgICAgICJDU0lTTzEzSklTQzYyMjBKUCIsICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkpJUzAyMDEiLCAgICAgICAiWDAyMDEiLCAgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJKSVMwMjA4IiwgICAgICAgIkNTSVNPODdKSVNYMDIwOCIsICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSklTMDIwOCIsICAgICAgICJJU08tSVItODciLCAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkpJUzAyMDgiLCAgICAgICAiWDAyMDgiLCAgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJKSVMwMjA4IiwgICAgICAgIlgwMjA4REJJSklTX1gwMjA4LTE5ODMiLCBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiSklTMDIxMiIsICAgICAgICJDU0lTTzE1OUpJU1gwMjEyMTk5MCIsICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIkpJUzAyMTIiLCAgICAgICAiSVNPLUlSLTE1OSIsICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJKSVMwMjEyIiwgICAgICAgIlgwMjEyIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiS09JOF9SIiwgICAgICAgICJDU0tPSThSIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIktPSThfUiIsICAgICAgICAiS09JOC1SIiwgICAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJLU0M1NjAxIiwgICAgICAgIkVVQy1LUiIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiTVM5MzIiLCAgICAgICAgICJDU1dJTkRPV1MzMUoiLCAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIk1TOTMyIiwgICAgICAgICAiV0lORE9XUy0zMUoiLCAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJTSklTIiwgICAgICAgICAgIkNTU0hJRlRKSVMiLCAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICBhZGRNYXBwaW5nKCAiU0pJUyIsICAgICAgICAgICJNU19LQU5KSSIsICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIlNKSVMiLCAgICAgICAgICAiU0hJRlRfSklTIiwgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJUSVM2MjAiLCAgICAgICAgIlRJUy02MjAiLCAgICAgICAgICAgICAgICB0cnVlICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJVTklDT0RFIiwgICAgICAgIlVURi0xNiIsICAgICAgICAgICAgICAgICB0cnVlICApOwotICAgICAgICBhZGRNYXBwaW5nKCAiVU5JQ09ERUJJRyIsICAgICJVVEYtMTZCRSIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKLSAgICAgICAgYWRkTWFwcGluZyggIlVOSUNPREVMSVRUTEUiLCAiVVRGLTE2TEUiLCAgICAgICAgICAgICAgIHRydWUgICk7Ci0gICAgICAgIGFkZE1hcHBpbmcoICJVVEY4IiwgICAgICAgICAgIlVURi04IiwgICAgICAgICAgICAgICAgICB0cnVlICApOwotCi0gICAgICAgIGFzc2VydCBjb21wbGV0ZU1hcHBpbmdzKCk7Ci0gICAgfTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9HZW5lcmljWG1sSW5wdXRTdHJlYW0uamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9HZW5lcmljWG1sSW5wdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQyOWZhNS4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vR2VuZXJpY1htbElucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5SZWZlcmVuY2VSZXNvbHZlcjsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTEV2ZW50OwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxOYW1lOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1htbElucHV0U3RyZWFtIGltcGxlbWVudHMgWE1MSW5wdXRTdHJlYW0KLXsKLSAgICBwdWJsaWMgR2VuZXJpY1htbElucHV0U3RyZWFtICggKQotICAgIHsKLSAgICAgICAgX21hc3RlciA9IHRoaXM7Ci0gICAgICAgIF9lbGVtZW50Q291bnQgPSAxOyAvLyBHbyBhbGwgdGhlIHdheQotICAgIH0KLQotICAgIHByaXZhdGUgR2VuZXJpY1htbElucHV0U3RyZWFtICggR2VuZXJpY1htbElucHV0U3RyZWFtIG1hc3RlciApCi0gICAgewotICAgICAgICAoX21hc3RlciA9IG1hc3RlcikuZW5zdXJlSW5pdCgpOwotICAgICAgICBfbmV4dEV2ZW50ID0gbWFzdGVyLl9uZXh0RXZlbnQ7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gVGhlIHNvdXJjZSBmb3IgYWxsIGV2ZW50cwotICAgIC8vCi0KLSAgICBwcm90ZWN0ZWQgWE1MRXZlbnQgbmV4dEV2ZW50ICggKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIm5leHRFdmVudCBub3Qgb3ZlcnJpZGRlbiIgKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIHByaXZhdGUgY2xhc3MgRXZlbnRJdGVtCi0gICAgewotICAgICAgICBFdmVudEl0ZW0gKCBYTUxFdmVudCBlICkKLSAgICAgICAgewotICAgICAgICAgICAgX2V2ZW50ID0gZTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpbnQgICAgIGdldFR5cGUgKCApIHsgcmV0dXJuIF9ldmVudC5nZXRUeXBlKCk7IH0KLSAgICAgICAgYm9vbGVhbiBoYXNOYW1lICggKSB7IHJldHVybiBfZXZlbnQuaGFzTmFtZSgpOyB9Ci0gICAgICAgIFhNTE5hbWUgZ2V0TmFtZSAoICkgeyByZXR1cm4gX2V2ZW50LmdldE5hbWUoKTsgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgWE1MRXZlbnQgX2V2ZW50OwotICAgICAgICAKLSAgICAgICAgRXZlbnRJdGVtIF9uZXh0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVJbml0ICggKQotICAgIHsKLSAgICAgICAgaWYgKCFfbWFzdGVyLl9pbml0aWFsaXplZCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX21hc3Rlci5fbmV4dEV2ZW50ID0gZ2V0TmV4dEV2ZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFhNTFN0cmVhbUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBfbWFzdGVyLl9pbml0aWFsaXplZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEV2ZW50SXRlbSBnZXROZXh0RXZlbnQgKCApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhNTEV2ZW50IGUgPSBuZXh0RXZlbnQoKTsKLQotICAgICAgICByZXR1cm4gZSA9PSBudWxsID8gbnVsbCA6IG5ldyBFdmVudEl0ZW0oIGUgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWE1MRXZlbnQgbmV4dCAoICkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW5zdXJlSW5pdCgpOwotICAgICAgICAKLSAgICAgICAgRXZlbnRJdGVtIGN1cnJlbnRFdmVudCA9IF9uZXh0RXZlbnQ7Ci0KLSAgICAgICAgaWYgKF9uZXh0RXZlbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9uZXh0RXZlbnQuX25leHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBfbmV4dEV2ZW50Ll9uZXh0ID0gX21hc3Rlci5nZXROZXh0RXZlbnQoKTsKLQotICAgICAgICAgICAgX25leHRFdmVudCA9IF9uZXh0RXZlbnQuX25leHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY3VycmVudEV2ZW50ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpZiAoY3VycmVudEV2ZW50LmdldFR5cGUoKSA9PSBYTUxFdmVudC5FTkRfRUxFTUVOVCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKC0tX2VsZW1lbnRDb3VudCA8PSAwKQotICAgICAgICAgICAgICAgIF9uZXh0RXZlbnQgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGN1cnJlbnRFdmVudC5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuU1RBUlRfRUxFTUVOVCkKLSAgICAgICAgICAgIF9lbGVtZW50Q291bnQrKzsKLQotICAgICAgICByZXR1cm4gY3VycmVudEV2ZW50Ll9ldmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0ICggKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgewotICAgICAgICBlbnN1cmVJbml0KCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gX25leHRFdmVudCAhPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNraXAgKCApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG5leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBza2lwRWxlbWVudCAoICkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW5zdXJlSW5pdCgpOwotICAgICAgICAKLSAgICAgICAgZm9yICggOyBfbmV4dEV2ZW50ICE9IG51bGwgOyBuZXh0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX25leHRFdmVudC5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuU1RBUlRfRUxFTUVOVCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgZm9yICggOyBfbmV4dEV2ZW50ICE9IG51bGwgOyBuZXh0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgdHlwZSA9IG5leHQoKS5nZXRUeXBlKCk7Ci0KLSAgICAgICAgICAgIGlmICh0eXBlID09IFhNTEV2ZW50LlNUQVJUX0VMRU1FTlQpCi0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gWE1MRXZlbnQuRU5EX0VMRU1FTlQgJiYgLS1jb3VudCA9PSAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhNTEV2ZW50IHBlZWsgKCApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVuc3VyZUluaXQoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBfbmV4dEV2ZW50Ll9ldmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBza2lwICggaW50IGV2ZW50VHlwZSApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVuc3VyZUluaXQoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIDsgX25leHRFdmVudCAhPSBudWxsIDsgbmV4dCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9uZXh0RXZlbnQuZ2V0VHlwZSgpID09IGV2ZW50VHlwZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBza2lwICggWE1MTmFtZSBuYW1lICkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW5zdXJlSW5pdCgpOwotICAgICAgICAKLSAgICAgICAgZm9yICggOyBfbmV4dEV2ZW50ICE9IG51bGwgOyBuZXh0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX25leHRFdmVudC5oYXNOYW1lKCkgJiYgX25leHRFdmVudC5nZXROYW1lKCkuZXF1YWxzKCBuYW1lICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2tpcCAoIFhNTE5hbWUgbmFtZSwgaW50IGV2ZW50VHlwZSApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVuc3VyZUluaXQoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIDsgX25leHRFdmVudCAhPSBudWxsIDsgbmV4dCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9uZXh0RXZlbnQuZ2V0VHlwZSgpID09IGV2ZW50VHlwZSAmJgotICAgICAgICAgICAgICAgICAgX25leHRFdmVudC5oYXNOYW1lKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgX25leHRFdmVudC5nZXROYW1lKCkuZXF1YWxzKCBuYW1lICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFhNTElucHV0U3RyZWFtIGdldFN1YlN0cmVhbSAoICkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW5zdXJlSW5pdCgpOwotICAgICAgICAKLSAgICAgICAgR2VuZXJpY1htbElucHV0U3RyZWFtIHN1YlN0cmVhbSA9IG5ldyBHZW5lcmljWG1sSW5wdXRTdHJlYW0oIHRoaXMgKTsKLQotICAgICAgICBzdWJTdHJlYW0uc2tpcCggWE1MRXZlbnQuU1RBUlRfRUxFTUVOVCApOwotCi0gICAgICAgIHJldHVybiBzdWJTdHJlYW07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UgKCApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIEJVR0JVRyAtIGNhbiBJIGRvIGFueXRoaW5nIGhlcmUsIHJlYWxseT8KLSAgICAgICAgLy8gU0hvdWxkIEkgY291bnQgdGhlIG51bWJlciBvZiBvcGVuIHN1YiBzdHJlYW1zPwotICAgICAgICAvLyBJIGhhdmUgbm8gZGVzdHJ1Y3RvciwgaG93IGNhbiBJIGNsb3NlIHByb3Blcmx5PwotICAgIH0KLQotICAgIHB1YmxpYyBSZWZlcmVuY2VSZXNvbHZlciBnZXRSZWZlcmVuY2VSZXNvbHZlciAoICkKLSAgICB7Ci0gICAgICAgIGVuc3VyZUluaXQoKTsKLSAgICAgICAgCi0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiTm90IGltcGwiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlUmVzb2x2ZXIgKCBSZWZlcmVuY2VSZXNvbHZlciByZXNvbHZlciApCi0gICAgewotICAgICAgICBlbnN1cmVJbml0KCk7Ci0gICAgICAgIAotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIk5vdCBpbXBsIiApOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgIF9pbml0aWFsaXplZDsKLSAgICBwcml2YXRlIEV2ZW50SXRlbSAgICAgICAgICAgICBfbmV4dEV2ZW50OwotICAgIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgICAgIF9lbGVtZW50Q291bnQ7Ci0gICAgcHJpdmF0ZSBHZW5lcmljWG1sSW5wdXRTdHJlYW0gX21hc3RlcjsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9HbG9iYWxMb2NrLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vR2xvYmFsTG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDM5YmYxLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9HbG9iYWxMb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLS8qKgotICogV2hlbmV2ZXIgbXVsdGlwbGUgbG9ja3MgbXVzdCBiZSBhY3F1aXJlZCB3aXRoaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mCi0gKiBYTUwgQmVhbnMsIHRoaXMgR2xvYmFsTG9jayBpcyBhY3F1aXJlZCBmaXJzdCwgYW5kIHRoZW4gcmVsZWFzZWQgd2hlbiBhbGwKLSAqIHRoZSBhY3V0YWxseS1uZWVkZWQgbG9ja3MgaGF2ZSBiZWVuIGFjcXVpcmVkLiAgVGhpcyBwcmV2ZW50cyBkZWFkbG9ja3MuCi0gKi8gCi1wdWJsaWMgY2xhc3MgR2xvYmFsTG9jawotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE11dGV4IEdMT0JBTF9NVVRFWCA9IG5ldyBNdXRleCgpOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhY3F1aXJlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsgR0xPQkFMX01VVEVYLmFjcXVpcmUoKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb0FjcXVpcmUoKSB7IEdMT0JBTF9NVVRFWC50cnlUb0FjcXVpcmUoKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWxlYXNlKCkgeyBHTE9CQUxfTVVURVgucmVsZWFzZSgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vSU9VdGlsLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vSU9VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMjc5MDguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0lPVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKLQotcHVibGljIGNsYXNzIElPVXRpbAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5Q29tcGxldGVseShJbnB1dFN0cmVhbSBpbnB1dCwgT3V0cHV0U3RyZWFtIG91dHB1dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvL2lmIGJvdGggYXJlIGZpbGUgc3RyZWFtcywgdXNlIGNoYW5uZWwgSU8KLSAgICAgICAgaWYgKChvdXRwdXQgaW5zdGFuY2VvZiBGaWxlT3V0cHV0U3RyZWFtKSAmJiAoaW5wdXQgaW5zdGFuY2VvZiBGaWxlSW5wdXRTdHJlYW0pKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWxlQ2hhbm5lbCB0YXJnZXQgPSAoKEZpbGVPdXRwdXRTdHJlYW0pIG91dHB1dCkuZ2V0Q2hhbm5lbCgpOwotICAgICAgICAgICAgICAgIEZpbGVDaGFubmVsIHNvdXJjZSA9ICgoRmlsZUlucHV0U3RyZWFtKSBpbnB1dCkuZ2V0Q2hhbm5lbCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHNvdXJjZS50cmFuc2ZlclRvKDAsIEludGVnZXIuTUFYX1ZBTFVFLCB0YXJnZXQpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHNvdXJjZS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIHRhcmdldC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsgLyogZmFpbG92ZXIgdG8gYnl0ZSBzdHJlYW0gdmVyc2lvbiAqLyB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs4MTkyXTsKLSAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBpbnB1dC5yZWFkKGJ1Zik7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoIDwgMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIG91dHB1dC53cml0ZShidWYsIDAsIGxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeSB7IGlucHV0LmNsb3NlKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkge30KLSAgICAgICAgdHJ5IHsgb3V0cHV0LmNsb3NlKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkge30KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUNvbXBsZXRlbHkoVVJJIGlucHV0LCBVUkkgb3V0cHV0KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShpbnB1dCk7Ci0gICAgICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gbm90QUZpbGUpCi0gICAgICAgICAgICB7fQotICAgICAgICAgICAgCi0gICAgICAgICAgICBGaWxlIG91dCA9IG5ldyBGaWxlKG91dHB1dCk7Ci0gICAgICAgICAgICBGaWxlIGRpciA9IG91dC5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgICAgICBkaXIubWtkaXJzKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpbiA9PSBudWxsKQotICAgICAgICAgICAgICAgIGluID0gaW5wdXQudG9VUkwoKS5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBJT1V0aWwuY29weUNvbXBsZXRlbHkoaW4sIG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgY29weSB0byAiICsgb3V0cHV0KTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0lkZW50aXR5Q29uc3RyYWludC5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0lkZW50aXR5Q29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2FmYjdmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9JZGVudGl0eUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRvckxpc3RlbmVyLkV2ZW50OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIElkZW50aXR5IGNvbnN0cmFpbnQgZW5naW5lLiBQZXJmb3JtcyBzdHJlYW1pbmcgdmFsaWRhdGlvbiBvZiBpZGVudGl0eSBjb25zdHJhaW50cy4KLSAqIFRoaXMgaW5jbHVkZXMga2V5LCBrZXlyZWYsICYgdW5pcXVlLCBhcyB3ZWxsIGFzIElEICYgSURSZWYuCi0gKi8KLXB1YmxpYyBjbGFzcyBJZGVudGl0eUNvbnN0cmFpbnQgewotCi0gICAgcHJpdmF0ZSBDb25zdHJhaW50U3RhdGUgX2NvbnN0cmFpbnRTdGFjazsKLSAgICBwcml2YXRlIEVsZW1lbnRTdGF0ZSBfZWxlbWVudFN0YWNrOwotICAgIHByaXZhdGUgQ29sbGVjdGlvbiBfZXJyb3JMaXN0ZW5lcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2ludmFsaWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF90cmFja0lkcmVmczsgLy8gV2Ugb25seSB0cmFjayBpZHJlZnMgaWYgdmFsaWRhdGluZyBmcm9tIHRoZSByb290IGVsZW1lbnQKLQotICAgIHB1YmxpYyBJZGVudGl0eUNvbnN0cmFpbnQoQ29sbGVjdGlvbiAgZXJyb3JMaXN0ZW5lciwgYm9vbGVhbiB0cmFja0lkcmVmcykgewotICAgICAgICBfZXJyb3JMaXN0ZW5lciA9IGVycm9yTGlzdGVuZXI7Ci0gICAgICAgIF90cmFja0lkcmVmcyA9IHRyYWNrSWRyZWZzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVsZW1lbnQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCwgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50W10gaWNzKSB7Ci0KLSAgICAgICAgLy8gQ29uc3RydWN0IGEgbmV3IHN0YXRlIGZvciB0aGUgZWxlbWVudAotICAgICAgICBuZXdTdGF0ZSgpOwotCi0gICAgICAgIC8vIEZpcnN0IGRpc3BhdGNoIHRoaXMgZWxlbWVudCBldmVudAotICAgICAgICBmb3IgKENvbnN0cmFpbnRTdGF0ZSBjcyA9IF9jb25zdHJhaW50U3RhY2sgOyBjcyAhPSBudWxsIDsgY3MgPSBjcy5fbmV4dCkKLSAgICAgICAgICAgIGNzLmVsZW1lbnQoZSwgc3QpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBTZWxlY3RvclN0YXRlIGZvciBlYWNoIG5ldyBJZGVudGl0eSBDb25zdHJhaW50Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpY3MgIT0gbnVsbCAmJiBpIDwgaWNzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgIG5ld0NvbnN0cmFpbnRTdGF0ZShpY3NbaV0sIGUsIHN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KEV2ZW50IGUpIHsKLSAgICAgICAgLy8gUG9wIHRoZSBlbGVtZW50IHN0YXRlIHN0YWNrIGFuZCBhbnkgY29uc3RyYWludHMgYXQgdGhpcyBkZXB0aAotICAgICAgICBpZiAoX2VsZW1lbnRTdGFjay5faGFzQ29uc3RyYWludHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoQ29uc3RyYWludFN0YXRlIGNzID0gX2NvbnN0cmFpbnRTdGFjayA7IGNzICE9IG51bGwgJiYgY3MgIT0gX2VsZW1lbnRTdGFjay5fc2F2ZVBvaW50IDsgY3MgPSBjcy5fbmV4dCkKLSAgICAgICAgICAgICAgICBjcy5yZW1vdmUoIGUgKTsKLQotICAgICAgICAgICAgX2NvbnN0cmFpbnRTdGFjayA9IF9lbGVtZW50U3RhY2suX3NhdmVQb2ludDsKLSAgICAgICAgfQotCi0gICAgICAgIF9lbGVtZW50U3RhY2sgPSBfZWxlbWVudFN0YWNrLl9uZXh0OwotCi0gICAgICAgIC8vIERpc3BhdGNoIHRoZSBldmVudAotICAgICAgICBmb3IgKENvbnN0cmFpbnRTdGF0ZSBjcyA9IF9jb25zdHJhaW50U3RhY2sgOyBjcyAhPSBudWxsIDsgY3MgPSBjcy5fbmV4dCkKLSAgICAgICAgICAgIGNzLmVuZEVsZW1lbnQoZSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhdHRyKEV2ZW50IGUsIFFOYW1lIG5hbWUsIFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBmb3IgKENvbnN0cmFpbnRTdGF0ZSBjcyA9IF9jb25zdHJhaW50U3RhY2sgOyBjcyAhPSBudWxsIDsgY3MgPSBjcy5fbmV4dCkKLSAgICAgICAgICAgIGNzLmF0dHIoZSwgbmFtZSwgc3QsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXh0KEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBlbXB0eUNvbnRlbnQpIHsKLSAgICAgICAgZm9yIChDb25zdHJhaW50U3RhdGUgY3MgPSBfY29uc3RyYWludFN0YWNrIDsgY3MgIT0gbnVsbCA7IGNzID0gY3MuX25leHQpCi0gICAgICAgICAgICBjcy50ZXh0KGUsIHN0LCB2YWx1ZSwgZW1wdHlDb250ZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICByZXR1cm4gIV9pbnZhbGlkOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBuZXdDb25zdHJhaW50U3RhdGUoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGljLCBFdmVudCBlLCBTY2hlbWFUeXBlIHN0KQotICAgIHsKLSAgICAgICAgaWYgKGljLmdldENvbnN0cmFpbnRDYXRlZ29yeSgpID09IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5DQ19LRVlSRUYpCi0gICAgICAgICAgICBuZXcgS2V5cmVmU3RhdGUoaWMsIGUsIHN0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbmV3IFNlbGVjdG9yU3RhdGUoaWMsIGUsIHN0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYnVpbGRJZFN0YXRlcygpCi0gICAgewotICAgICAgICAvLyBDb25zdHJ1Y3Qgc3RhdGVzIHRvIGhvbGQgdGhlIHZhbHVlcyBmb3IgSURzIGFuZCBJRFJlZnMKLSAgICAgICAgSWRTdGF0ZSBpZHMgPSBuZXcgSWRTdGF0ZSgpOwotICAgICAgICBpZiAoX3RyYWNrSWRyZWZzKQotICAgICAgICAgICAgbmV3IElkUmVmU3RhdGUoaWRzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbmV3U3RhdGUoKSB7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3RUaW1lID0gX2VsZW1lbnRTdGFjayA9PSBudWxsOwotCi0gICAgICAgIEVsZW1lbnRTdGF0ZSBzdCA9IG5ldyBFbGVtZW50U3RhdGUoKTsKLSAgICAgICAgc3QuX25leHQgPSBfZWxlbWVudFN0YWNrOwotICAgICAgICBfZWxlbWVudFN0YWNrID0gc3Q7Ci0KLSAgICAgICAgaWYgKGZpcnN0VGltZSkKLSAgICAgICAgICAgIGJ1aWxkSWRTdGF0ZXMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW1pdEVycm9yICggRXZlbnQgZXZlbnQsIFN0cmluZyBtc2cgKQotICAgIHsKLSAgICAgICAgX2ludmFsaWQgPSB0cnVlOwotCi0gICAgICAgIGlmIChfZXJyb3JMaXN0ZW5lciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgZXZlbnQgIT0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgX2Vycm9yTGlzdGVuZXIuYWRkKAotICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvckN1cnNvciggbXNnLCBldmVudC5nZXRMb2NhdGlvbkFzQ3Vyc29yKCkgKSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFNhdmVQb2ludCggQ29uc3RyYWludFN0YXRlIGNzICkKLSAgICB7Ci0gICAgICAgIGlmICghIF9lbGVtZW50U3RhY2suX2hhc0NvbnN0cmFpbnRzKQotICAgICAgICAgICAgX2VsZW1lbnRTdGFjay5fc2F2ZVBvaW50ID0gY3M7Ci0KLSAgICAgICAgX2VsZW1lbnRTdGFjay5faGFzQ29uc3RyYWludHMgPSB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFhtbE9iamVjdCBuZXdWYWx1ZShTY2hlbWFUeXBlIHN0LCBTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHN0Lm5ld1ZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBiaXQgaGFja3kuIG5ld1ZhbHVlIHRocm93cyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gd2hpY2ggaXMgCi0gICAgICAgICAgICAvLyB1bmNoZWNrZWQgYW5kIGRlY2xhcmVkIGluIHR5cGVpbXBsLiBJIGNhbiBvbmx5IGNhdGNoIGl0cyBwYXJlbnQgY2xhc3MsIAotICAgICAgICAgICAgLy8gdHlwZWltcGwgaXMgYnVpbHQgYWZ0ZXIgY29tbW9uLgotCi0gICAgICAgICAgICAvLyBJZ25vcmUgdGhlc2UgZXhjZXB0aW9ucy4gQXNzdW1lIHRoYXQgdmFsaWRhdGlvbiB3aWxsIGNhdGNoIHRoZW0uCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgc2ltcGxlIHR5cGUgZm9yIHNjaGVtYSB0eXBlLiBJZiB0aGUgc2NoZW1hIHR5cGUgaXMgYWxyZWFkeQotICAgICAqIHNpbXBsZSwganVzdCByZXR1cm4gaXQuIElmIGl0IGlzIGEgY29tcGxleCB0eXBlIHdpdGggc2ltcGxlIGNvbnRlbnQsCi0gICAgICogcmV0dXJuIHRoZSBzaW1wbGUgdHlwZSBpdCBleHRlbmRzLgotICAgICAqLwotICAgIHN0YXRpYyBTY2hlbWFUeXBlIGdldFNpbXBsZVR5cGUoU2NoZW1hVHlwZSBzdCkgCi0gICAgewotICAgICAgICBhc3NlcnQgc3QuaXNTaW1wbGVUeXBlKCkgfHwgc3QuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UIDogCi0gICAgICAgICAgICBzdCArICIgZG9lcyBub3QgaGF2ZSBzaW1wbGUgY29udGVudC4iOwotCi0gICAgICAgIHdoaWxlICghIHN0LmlzU2ltcGxlVHlwZSgpICkKLSAgICAgICAgICAgIHN0ID0gc3QuZ2V0QmFzZVR5cGUoKTsKLQotICAgICAgICByZXR1cm4gc3Q7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gaGFzU2ltcGxlQ29udGVudChTY2hlbWFUeXBlIHN0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHN0LmlzU2ltcGxlVHlwZSgpIHx8IHN0LmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29uc3RyYWludFN0YXRlIHsKLSAgICAgICAgQ29uc3RyYWludFN0YXRlIF9uZXh0OwotCi0gICAgICAgIENvbnN0cmFpbnRTdGF0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNldFNhdmVQb2ludChfY29uc3RyYWludFN0YWNrKTsKLSAgICAgICAgICAgIF9uZXh0ID0gX2NvbnN0cmFpbnRTdGFjazsKLSAgICAgICAgICAgIF9jb25zdHJhaW50U3RhY2sgPSB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgYWJzdHJhY3Qgdm9pZCBlbGVtZW50KEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QpOwotICAgICAgICBhYnN0cmFjdCB2b2lkIGVuZEVsZW1lbnQoRXZlbnQgZSk7Ci0gICAgICAgIGFic3RyYWN0IHZvaWQgYXR0cihFdmVudCBlLCBRTmFtZSBuYW1lLCBTY2hlbWFUeXBlIHN0LCBTdHJpbmcgdmFsdWUpOwotICAgICAgICBhYnN0cmFjdCB2b2lkIHRleHQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGVtcHR5Q29udGVudCk7Ci0gICAgICAgIGFic3RyYWN0IHZvaWQgcmVtb3ZlKEV2ZW50IGUpOwotCi0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIFNlbGVjdG9yU3RhdGUgZXh0ZW5kcyBDb25zdHJhaW50U3RhdGUgewotICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgX2NvbnN0cmFpbnQ7Ci0gICAgICAgIFNldCBfdmFsdWVzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLSAgICAgICAgWFBhdGguRXhlY3V0aW9uQ29udGV4dCBfY29udGV4dDsKLQotICAgICAgICBTZWxlY3RvclN0YXRlKFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBjb25zdHJhaW50LCBFdmVudCBlLCBTY2hlbWFUeXBlIHN0KSB7Ci0gICAgICAgICAgICBfY29uc3RyYWludCA9IGNvbnN0cmFpbnQ7Ci0gICAgICAgICAgICBfY29udGV4dCA9IG5ldyBYUGF0aC5FeGVjdXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICBfY29udGV4dC5pbml0KChYUGF0aClfY29uc3RyYWludC5nZXRTZWxlY3RvclBhdGgoKSk7Ci0KLSAgICAgICAgICAgIGlmICggKCBfY29udGV4dC5zdGFydCgpICYgWFBhdGguRXhlY3V0aW9uQ29udGV4dC5ISVQgKSAhPSAwICkKLSAgICAgICAgICAgICAgICBjcmVhdGVGaWVsZFN0YXRlKGUsIHN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYWRkRmllbGRzKFhtbE9iamVjdExpc3QgZmllbGRzLCBFdmVudCBlKSAKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9jb25zdHJhaW50LmdldENvbnN0cmFpbnRDYXRlZ29yeSgpID09IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5DQ19LRVlSRUYpCi0gICAgICAgICAgICAgICAgX3ZhbHVlcy5hZGQoZmllbGRzKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKF92YWx1ZXMuY29udGFpbnMoZmllbGRzKSkgCi0gICAgICAgICAgICAgICAgZW1pdEVycm9yKGUsICJEdXBsaWNhdGUga2V5ICciICsgZmllbGRzICsgIicgZm9yIGtleSBvciB1bmlxdWUgY29uc3RyYWludCAiICsgUU5hbWVIZWxwZXIucHJldHR5KF9jb25zdHJhaW50LmdldE5hbWUoKSkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIF92YWx1ZXMuYWRkKGZpZWxkcyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGVsZW1lbnQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggKCBfY29udGV4dC5lbGVtZW50KGUuZ2V0TmFtZSgpKSAmIFhQYXRoLkV4ZWN1dGlvbkNvbnRleHQuSElUKSAhPSAwICkKLSAgICAgICAgICAgICAgICBjcmVhdGVGaWVsZFN0YXRlKGUsIHN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZW5kRWxlbWVudChFdmVudCBlKSAKLSAgICAgICAgewotICAgICAgICAgICAgX2NvbnRleHQuZW5kKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGNyZWF0ZUZpZWxkU3RhdGUoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCkgewotICAgICAgICAgICAgbmV3IEZpZWxkU3RhdGUodGhpcywgZSwgc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCByZW1vdmUoRXZlbnQgZSkgewotICAgICAgICAgICAgLy8gQnViYmxlIHVwIGtleSwgdW5pcXVlIHZhbHVlcyB0byBrZXlyZWZzCi0gICAgICAgICAgICBmb3IgKENvbnN0cmFpbnRTdGF0ZSBjcyA9IF9uZXh0IDsgY3MgIT0gbnVsbCA7IGNzID0gY3MuX25leHQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjcyBpbnN0YW5jZW9mIEtleXJlZlN0YXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgS2V5cmVmU3RhdGUga3IgPSAoS2V5cmVmU3RhdGUpY3M7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrci5fY29uc3RyYWludC5nZXRSZWZlcmVuY2VkS2V5KCkgPT0gdGhpcykKLSAgICAgICAgICAgICAgICAgICAgICAgIGtyLmFkZEtleVZhbHVlcyhfdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGF0dHIoRXZlbnQgZSwgUU5hbWUgbmFtZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlKSB7fQotICAgICAgICB2b2lkIHRleHQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGVtcHR5Q29udGVudCkge30KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgS2V5cmVmU3RhdGUgZXh0ZW5kcyBTZWxlY3RvclN0YXRlIHsKLSAgICAgICAgU2V0IF9rZXlWYWx1ZXMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgIEtleXJlZlN0YXRlKFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBjb25zdHJhaW50LCBFdmVudCBlLCBTY2hlbWFUeXBlIHN0KSB7Ci0gICAgICAgICAgICBzdXBlcihjb25zdHJhaW50LCBlLCBzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkZEtleVZhbHVlcyhmaW5hbCBTZXQgdmFsdWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBCVUc6IHJlbW92ZSBkdXBsaWNhdGVzCi0gICAgICAgICAgICBfa2V5VmFsdWVzLmFkZEFsbCh2YWx1ZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCByZW1vdmUoRXZlbnQgZSkgewotICAgICAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBrZXlzIGF0IHRoZSBzYW1lIHN0YWNrIGxldmVsIGFzIHRoaXMKLSAgICAgICAgICAgIC8vIHRoYXQgbWF5IGNvbnRyaWJ1dGUga2V5IHZhbHVlcyB0byBtZQotICAgICAgICAgICAgZm9yIChDb25zdHJhaW50U3RhdGUgY3MgPSBfbmV4dCA7IGNzICE9IG51bGwgJiYgY3MgIT0gX2VsZW1lbnRTdGFjay5fc2F2ZVBvaW50IDsgY3MgPSBjcy5fbmV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY3MgaW5zdGFuY2VvZiBTZWxlY3RvclN0YXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3JTdGF0ZSBzZWwgPSAoU2VsZWN0b3JTdGF0ZSljczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbC5fY29uc3RyYWludCA9PSBfY29uc3RyYWludC5nZXRSZWZlcmVuY2VkS2V5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRLZXlWYWx1ZXMoc2VsLl92YWx1ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAvLyB2YWxpZGF0ZSBhbGwgdmFsdWVzIGhhdmUgYmVlbiBzZWVuCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gX3ZhbHVlcy5pdGVyYXRvcigpIDsgaXQuaGFzTmV4dCgpIDsgKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgWG1sT2JqZWN0TGlzdCBmaWVsZHMgPSAoWG1sT2JqZWN0TGlzdClpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpZWxkcy51bmZpbGxlZCgpIDwgMCAmJiAhIF9rZXlWYWx1ZXMuY29udGFpbnMoZmllbGRzKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcihlLCAiS2V5ICciICsgZmllbGRzICsgIicgbm90IGZvdW5kIChrZXlSZWYgIiArIFFOYW1lSGVscGVyLnByZXR0eShfY29uc3RyYWludC5nZXROYW1lKCkpICsgIikiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBGaWVsZFN0YXRlIGV4dGVuZHMgQ29uc3RyYWludFN0YXRlIHsKLSAgICAgICAgU2VsZWN0b3JTdGF0ZSBfc2VsZWN0b3I7Ci0gICAgICAgIFhQYXRoLkV4ZWN1dGlvbkNvbnRleHRbXSBfY29udGV4dHM7Ci0gICAgICAgIGJvb2xlYW5bXSBfbmVlZHNWYWx1ZTsKLSAgICAgICAgWG1sT2JqZWN0TGlzdCBfdmFsdWU7Ci0KLSAgICAgICAgRmllbGRTdGF0ZShTZWxlY3RvclN0YXRlIHNlbGVjdG9yLCBFdmVudCBlLCBTY2hlbWFUeXBlIHN0KSB7Ci0KLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRpbmcgbmV3IEZpZWxkIFN0YXRlIGZvcjogIiArIGUuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgX3NlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgaWMgPSBzZWxlY3Rvci5fY29uc3RyYWludDsKLQotICAgICAgICAgICAgaW50IGZpZWxkQ291bnQgPSBpYy5nZXRGaWVsZHMoKS5sZW5ndGg7Ci0gICAgICAgICAgICBfY29udGV4dHMgPSBuZXcgWFBhdGguRXhlY3V0aW9uQ29udGV4dFtmaWVsZENvdW50XTsKLSAgICAgICAgICAgIF9uZWVkc1ZhbHVlID0gbmV3IGJvb2xlYW5bZmllbGRDb3VudF07Ci0gICAgICAgICAgICBfdmFsdWUgPSBuZXcgWG1sT2JqZWN0TGlzdChmaWVsZENvdW50KTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZmllbGRDb3VudCA7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY29udGV4dHNbaV0gPSBuZXcgWFBhdGguRXhlY3V0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgICAgIF9jb250ZXh0c1tpXS5pbml0KChYUGF0aClpYy5nZXRGaWVsZFBhdGgoaSkpOwotICAgICAgICAgICAgICAgIGlmICggKCBfY29udGV4dHNbaV0uc3RhcnQoKSAmIFhQYXRoLkV4ZWN1dGlvbkNvbnRleHQuSElUICkgIT0gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImhpdCBmb3IgZWxlbWVudDogIiArIGUuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1NpbXBsZUNvbnRlbnQoc3QpKQotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKGUsICJJZGVudGl0eSBjb25zdHJhaW50IGZpZWxkIG11c3QgaGF2ZSBzaW1wbGUgY29udGVudCIpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBfbmVlZHNWYWx1ZVtpXSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGVsZW1lbnQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgX2NvbnRleHRzLmxlbmd0aCA7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChfbmVlZHNWYWx1ZVtpXSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcihlLCAiSWRlbnRpdHkgY29uc3RyYWludCBmaWVsZCBtdXN0IGhhdmUgc2ltcGxlIGNvbnRlbnQiKTsKLSAgICAgICAgICAgICAgICAgICAgX25lZWRzVmFsdWVbaV0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IF9jb250ZXh0cy5sZW5ndGggOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoICggX2NvbnRleHRzW2ldLmVsZW1lbnQoZS5nZXROYW1lKCkpICYgWFBhdGguRXhlY3V0aW9uQ29udGV4dC5ISVQpICE9IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEgaGFzU2ltcGxlQ29udGVudChzdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXJyb3IoZSwgIklkZW50aXR5IGNvbnN0cmFpbnQgZmllbGQgbXVzdCBoYXZlIHNpbXBsZSBjb250ZW50Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIF9uZWVkc1ZhbHVlW2ldID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGF0dHIoRXZlbnQgZSwgUU5hbWUgbmFtZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlKSB7Ci0KLSAgICAgICAgICAgIC8vIE51bGwgdmFsdWUgaW5kaWNhdGVzIHByZXZpb3VzbHkgcmVwb3J0ZWQgdmFsaWRhdGlvbiBwcm9ibGVtCi0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBfY29udGV4dHMubGVuZ3RoIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBfY29udGV4dHNbaV0uYXR0cihuYW1lKSApIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0IG8gPSBuZXdWYWx1ZShzdCwgdmFsdWUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnZhbGlkIHZhbHVlcy4gQXNzdW1lIHRoYXQgdmFsaWRhdGlvbiBjYXRjaGVzIHRoZXNlCi0gICAgICAgICAgICAgICAgICAgIGlmIChvID09IG51bGwpIHJldHVybjsKLQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNldCA9IF92YWx1ZS5zZXQobywgaSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCEgc2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKGUsICJNdWx0aXBsZSBpbnN0YW5jZXMgb2YgZmllbGQgd2l0aCB4cGF0aDogJyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfc2VsZWN0b3IuX2NvbnN0cmFpbnQuZ2V0RmllbGRzKClbaV0gKyAiJyBmb3IgYSBzZWxlY3RvciIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICB2b2lkIHRleHQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGVtcHR5Q29udGVudCkgewotCi0gICAgICAgICAgICAvLyBOdWxsIHZhbHVlIGluZGljYXRlcyBwcmV2aW91c2x5IHJlcG9ydGVkIHZhbGlkYXRpb24gcHJvYmxlbQotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgIWVtcHR5Q29udGVudCkgcmV0dXJuOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBfY29udGV4dHMubGVuZ3RoIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBfbmVlZHNWYWx1ZVtpXSApIHsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHlDb250ZW50IHx8ICFoYXNTaW1wbGVDb250ZW50KHN0KSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKGUsICJJZGVudGl0eSBjb25zdHJhaW50IGZpZWxkIG11c3QgaGF2ZSBzaW1wbGUgY29udGVudCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZSBzaW1wbGVUeXBlID0gZ2V0U2ltcGxlVHlwZShzdCk7Ci0gICAgICAgICAgICAgICAgICAgIFhtbE9iamVjdCBvID0gbmV3VmFsdWUoc2ltcGxlVHlwZSwgdmFsdWUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnZhbGlkIHZhbHVlcy4gQXNzdW1lIHRoYXQgdmFsaWRhdGlvbiBjYXRjaGVzIHRoZXNlCi0gICAgICAgICAgICAgICAgICAgIGlmIChvID09IG51bGwpIHJldHVybjsKLQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNldCA9IF92YWx1ZS5zZXQobywgaSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCEgc2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKGUsICJNdWx0aXBsZSBpbnN0YW5jZXMgb2YgZmllbGQgd2l0aCB4cGF0aDogJyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfc2VsZWN0b3IuX2NvbnN0cmFpbnQuZ2V0RmllbGRzKClbaV0gKyAiJyBmb3IgYSBzZWxlY3RvciIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZW5kRWxlbWVudChFdmVudCBlKSB7Ci0gICAgICAgICAgICAvLyByZXNldCBhbnkgIF9uZWVkc1ZhbHVlIGZsYWdzIAotICAgICAgICAgICAgLy8gYXNzdW1lIHRoYXQgaWYgd2UgZGlkbid0IHNlZSB0aGUgdGV4dCwgaXQgd2FzIGJlY2F1c2Ugb2YgYW5vdGhlciB2YWxpZGF0aW9uCi0gICAgICAgICAgICAvLyBlcnJvciwgc28gZG9uJ3QgZW1pdCBhbm90aGVyIG9uZS4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IF9uZWVkc1ZhbHVlLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY29udGV4dHNbaV0uZW5kKCk7Ci0gICAgICAgICAgICAgICAgX25lZWRzVmFsdWVbaV0gPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCByZW1vdmUoRXZlbnQgZSkgCi0gICAgICAgIHsKLQotICAgICAgICAgICAgaWYgKF9zZWxlY3Rvci5fY29uc3RyYWludC5nZXRDb25zdHJhaW50Q2F0ZWdvcnkoKSA9PSBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuQ0NfS0VZICYmCi0gICAgICAgICAgICAgICAgX3ZhbHVlLnVuZmlsbGVkKCkgPj0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8ga2V5cyBtdXN0IGhhdmUgYWxsIHZhbHVlcyBzdXBwbGllZAotICAgICAgICAgICAgICAgIGVtaXRFcnJvcihlLCAiS2V5ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoX3NlbGVjdG9yLl9jb25zdHJhaW50LmdldE5hbWUoKSkgKyAiIGlzIG1pc3NpbmcgZmllbGQgd2l0aCB4cGF0aDogJyIgKyBfc2VsZWN0b3IuX2NvbnN0cmFpbnQuZ2V0RmllbGRzKClbX3ZhbHVlLnVuZmlsbGVkKCldICsgIiciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBGaW5pc2hlZC4gQWRkIHRoZXNlIGZpZWxkcyB0byB0aGUgc2VsZWN0b3Igc3RhdGUKLSAgICAgICAgICAgICAgICBfc2VsZWN0b3IuYWRkRmllbGRzKF92YWx1ZSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBJZFN0YXRlIGV4dGVuZHMgQ29uc3RyYWludFN0YXRlCi0gICAgewotICAgICAgICBTZXQgX3ZhbHVlcyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0KLSAgICAgICAgSWRTdGF0ZSgpIHsgfQotCi0gICAgICAgIHZvaWQgYXR0cihFdmVudCBlLCBRTmFtZSBuYW1lLCBTY2hlbWFUeXBlIHN0LCBTdHJpbmcgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGhhbmRsZVZhbHVlKGUsIHN0LCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHRleHQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGVtcHR5Q29udGVudCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGVtcHR5Q29udGVudCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGhhbmRsZVZhbHVlKGUsIHN0LCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlVmFsdWUoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8vIE51bGwgdmFsdWUgaW5kaWNhdGVzIHByZXZpb3VzbHkgcmVwb3J0ZWQgdmFsaWRhdGlvbiBwcm9ibGVtCi0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgICAgICBpZiAoc3QgPT0gbnVsbCB8fCBzdC5pc05vVHlwZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHZhbHVlcy4gQXNzdW1lIHRoYXQgdmFsaWRhdGlvbiBjYXRjaGVzIHRoZXNlCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoWG1sSUQudHlwZS5pc0Fzc2lnbmFibGVGcm9tKHN0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYbWxPYmplY3RMaXN0IHhtbFZhbHVlID0gbmV3IFhtbE9iamVjdExpc3QoMSk7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0IG8gPSBuZXdWYWx1ZShYbWxJRC50eXBlLCB2YWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW52YWxpZCB2YWx1ZXMuIEFzc3VtZSB0aGF0IHZhbGlkYXRpb24gY2F0Y2hlcyB0aGVzZQotICAgICAgICAgICAgICAgIGlmIChvID09IG51bGwpIHJldHVybjsKLQotICAgICAgICAgICAgICAgIHhtbFZhbHVlLnNldChvLCAwKTsKLQotICAgICAgICAgICAgICAgIGlmIChfdmFsdWVzLmNvbnRhaW5zKHhtbFZhbHVlKSkKLSAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKGUsICJEdXBsaWNhdGUgSUQgdmFsdWUgJyIgKyB2YWx1ZSArICInIik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBfdmFsdWVzLmFkZCh4bWxWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGVsZW1lbnQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCkge30KLSAgICAgICAgdm9pZCBlbmRFbGVtZW50KEV2ZW50IGUpe30KLSAgICAgICAgdm9pZCByZW1vdmUoRXZlbnQgZSl7fQotCi0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIElkUmVmU3RhdGUgZXh0ZW5kcyBDb25zdHJhaW50U3RhdGUKLSAgICB7Ci0gICAgICAgIElkU3RhdGUgX2lkczsKLSAgICAgICAgTGlzdCBfdmFsdWVzOwotCi0gICAgICAgIElkUmVmU3RhdGUoSWRTdGF0ZSBpZHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9pZHMgPSBpZHM7Ci0gICAgICAgICAgICBfdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVZhbHVlKEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gTnVsbCB2YWx1ZSBpbmRpY2F0ZXMgcHJldmlvdXNseSByZXBvcnRlZCB2YWxpZGF0aW9uIHByb2JsZW0KLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm47Ci0KLSAgICAgICAgICAgIGlmIChzdCA9PSBudWxsIHx8IHN0LmlzTm9UeXBlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgdmFsdWVzLiBBc3N1bWUgdGhhdCB2YWxpZGF0aW9uIGNhdGNoZXMgdGhlc2UKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoWG1sSURSRUZTLnR5cGUuaXNBc3NpZ25hYmxlRnJvbShzdCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sSURSRUZTIGx2ID0gKFhtbElEUkVGUyluZXdWYWx1ZShYbWxJRFJFRlMudHlwZSwgdmFsdWUpOwotCi0gICAgICAgICAgICAgICAgLy8gSWdub3JlIGludmFsaWQgdmFsdWVzLiBBc3N1bWUgdGhhdCB2YWxpZGF0aW9uIGNhdGNoZXMgdGhlc2UKLSAgICAgICAgICAgICAgICBpZiAobHYgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgICAgICAgICAgTGlzdCBsID0gbHYueGdldExpc3RWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgLy8gQWRkIG9uZSB2YWx1ZSBmb3IgZWFjaCBpZHJlZiBpbiB0aGUgbGlzdAotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGwuc2l6ZSgpIDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0TGlzdCB4bWxWYWx1ZSA9IG5ldyBYbWxPYmplY3RMaXN0KDEpOwotICAgICAgICAgICAgICAgICAgICBYbWxJRFJFRiBpZHJlZiA9IChYbWxJRFJFRilsLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sVmFsdWUuc2V0KGlkcmVmLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5hZGQoeG1sVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKFhtbElEUkVGLnR5cGUuaXNBc3NpZ25hYmxlRnJvbShzdCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0TGlzdCB4bWxWYWx1ZSA9IG5ldyBYbWxPYmplY3RMaXN0KDEpOwotICAgICAgICAgICAgICAgIFhtbElEUkVGIGlkcmVmID0gKFhtbElEUkVGKXN0Lm5ld1ZhbHVlKHZhbHVlKTsKLQotICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnZhbGlkIHZhbHVlcy4gQXNzdW1lIHRoYXQgdmFsaWRhdGlvbiBjYXRjaGVzIHRoZXNlCi0gICAgICAgICAgICAgICAgaWYgKGlkcmVmID09IG51bGwpIHJldHVybjsKLQotICAgICAgICAgICAgICAgIHhtbFZhbHVlLnNldChpZHJlZiwgMCk7Ci0gICAgICAgICAgICAgICAgX3ZhbHVlcy5hZGQoeG1sVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhdHRyKEV2ZW50IGUsIFFOYW1lIG5hbWUsIFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGhhbmRsZVZhbHVlKGUsIHN0LCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCB0ZXh0KEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBlbXB0eUNvbnRlbnQpIAotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZW1wdHlDb250ZW50KQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaGFuZGxlVmFsdWUoZSwgc3QsIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICB2b2lkIHJlbW92ZShFdmVudCBlKSAKLSAgICAgICAgeyAKLSAgICAgICAgICAgIC8vIFZhbGlkYXRlIGVhY2ggcmVmIGhhcyBhIGNvcnJlc3BvbmRpbmcgSUQKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBfdmFsdWVzLml0ZXJhdG9yKCkgOyBpdC5oYXNOZXh0KCkgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCEgX2lkcy5fdmFsdWVzLmNvbnRhaW5zKG8pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKGUsICJJRCBub3QgZm91bmQgZm9yIElEUmVmIHZhbHVlICciICsgbyArICInIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHZvaWQgZWxlbWVudChFdmVudCBlLCBTY2hlbWFUeXBlIHN0KSB7IH0KLSAgICAgICAgdm9pZCBlbmRFbGVtZW50KEV2ZW50IGUpIHsgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVsZW1lbnRTdGF0ZSB7Ci0gICAgICAgIEVsZW1lbnRTdGF0ZSBfbmV4dDsKLSAgICAgICAgYm9vbGVhbiBfaGFzQ29uc3RyYWludHM7Ci0gICAgICAgIENvbnN0cmFpbnRTdGF0ZSBfc2F2ZVBvaW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9MZXZlbnNodGVpbi5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0xldmVuc2h0ZWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMTgxZTkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0xldmVuc2h0ZWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1wdWJsaWMgY2xhc3MgTGV2ZW5zaHRlaW4KLXsKLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBHZXQgbWluaW11bSBvZiB0aHJlZSB2YWx1ZXMKLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIHByaXZhdGUgc3RhdGljIGludCBtaW5pbXVtKGludCBhLCBpbnQgYiwgaW50IGMpCi0gICAgewotICAgICAgICBpbnQgbWkgPSBhOwotICAgICAgICBpZiAoYiA8IG1pKQotICAgICAgICAgICAgbWkgPSBiOwotICAgICAgICBpZiAoYyA8IG1pKQotICAgICAgICAgICAgbWkgPSBjOwotICAgICAgICByZXR1cm4gbWk7Ci0gICAgfQotCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIC8vIENvbXB1dGUgTGV2ZW5zaHRlaW4gZGlzdGFuY2UKLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZGlzdGFuY2UoU3RyaW5nIHMsIFN0cmluZyB0KQotICAgIHsKLSAgICAgICAgaW50IGRbXVtdOyAvLyBtYXRyaXgKLSAgICAgICAgaW50IG47IC8vIGxlbmd0aCBvZiBzCi0gICAgICAgIGludCBtOyAvLyBsZW5ndGggb2YgdAotICAgICAgICBpbnQgaTsgLy8gaXRlcmF0ZXMgdGhyb3VnaCBzCi0gICAgICAgIGludCBqOyAvLyBpdGVyYXRlcyB0aHJvdWdoIHQKLSAgICAgICAgY2hhciBzX2k7IC8vIGl0aCBjaGFyYWN0ZXIgb2YgcwotICAgICAgICBjaGFyIHRfajsgLy8ganRoIGNoYXJhY3RlciBvZiB0Ci0gICAgICAgIGludCBjb3N0OyAvLyBjb3N0Ci0KLSAgICAgICAgLy8gU3RlcCAxCi0gICAgICAgIG4gPSBzLmxlbmd0aCgpOwotICAgICAgICBtID0gdC5sZW5ndGgoKTsKLSAgICAgICAgaWYgKG4gPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBtOwotICAgICAgICBpZiAobSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgIGQgPSBuZXcgaW50W24rMV1bbSsxXTsKLQotICAgICAgICAvLyBTdGVwIDIKLSAgICAgICAgZm9yIChpID0gMDsgaSA8PSBuOyBpKyspCi0gICAgICAgICAgICBkW2ldWzBdID0gaTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8PSBtOyBqKyspCi0gICAgICAgICAgICBkWzBdW2pdID0gajsKLQotICAgICAgICAvLyBTdGVwIDMKLSAgICAgICAgZm9yIChpID0gMTsgaSA8PSBuOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNfaSA9IHMuY2hhckF0IChpIC0gMSk7Ci0KLSAgICAgICAgICAgIC8vIFN0ZXAgNAotICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8PSBtOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdF9qID0gdC5jaGFyQXQoaiAtIDEpOwotCi0gICAgICAgICAgICAgICAgLy8gU3RlcCA1Ci0gICAgICAgICAgICAgICAgaWYgKHNfaSA9PSB0X2opCi0gICAgICAgICAgICAgICAgICAgIGNvc3QgPSAwOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgY29zdCA9IDE7Ci0KLSAgICAgICAgICAgICAgICAvLyBTdGVwIDYKLSAgICAgICAgICAgICAgICBkW2ldW2pdID0gbWluaW11bShkW2ktMV1bal0rMSwgZFtpXVtqLTFdKzEsIGRbaS0xXVtqLTFdICsgY29zdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdGVwIDcKLSAgICAgICAgcmV0dXJuIGRbbl1bbV07Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vTXV0ZXguamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9NdXRleC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODk2NzQ1Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9NdXRleC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotcHVibGljIGNsYXNzIE11dGV4Ci17Ci0gICAgcHJpdmF0ZSBUaHJlYWQgIG93bmVyICAgICAgPSBudWxsOyAgLy8gT3duZXIgb2YgbXV0ZXgsIG51bGwgaWYgbm9ib2R5Ci0gICAgcHJpdmF0ZSBpbnQgICAgIGxvY2tfY291bnQgPSAwOwotCi0gICAgLyoqCi0gICAgICogQWNxdWlyZSB0aGUgbXV0ZXguIFRoZSBtdXRleCBjYW4gYmUgYWNxdWlyZWQgbXVsdGlwbGUgdGltZXMKLSAgICAgKiBieSB0aGUgc2FtZSB0aHJlYWQsIHByb3ZpZGVkIHRoYXQgaXQgaXMgcmVsZWFzZWQgYXMgbWFueQotICAgICAqIHRpbWVzIGFzIGl0IGlzIGFjcXVpcmVkLiBUaGUgY2FsbGluZyB0aHJlYWQgYmxvY2tzIHVudGlsCi0gICAgICogaXQgaGFzIGFjcXVpcmVkIHRoZSBtdXRleC4gKFRoZXJlIGlzIG5vIHRpbWVvdXQpLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhY3F1aXJlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICB3aGlsZSAodHJ5VG9BY3F1aXJlKCkgPT0gZmFsc2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMud2FpdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXR0ZW1wdHMgdG8gYWNxdWlyZSB0aGUgbXV0ZXguIFJldHVybnMgZmFsc2UgKGFuZCBkb2VzIG5vdAotICAgICAqIGJsb2NrKSBpZiBpdCBjYW4ndCBnZXQgaXQuCi0gICAgICovCi0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gdHJ5VG9BY3F1aXJlKCkKLSAgICB7Ci0gICAgICAgIC8vIFRyeSB0byBnZXQgdGhlIG11dGV4LiBSZXR1cm4gdHJ1ZSBpZiB5b3UgZ290IGl0LgotCi0gICAgICAgIGlmKCBvd25lciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgb3duZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotICAgICAgICAgICAgbG9ja19jb3VudCA9IDE7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBvd25lciA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgKytsb2NrX2NvdW50OwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVsZWFzZSB0aGUgbXV0ZXguIFRoZSBtdXRleCBoYXMgdG8gYmUgcmVsZWFzZWQgYXMgbWFueSB0aW1lcwotICAgICAqIGFzIGl0IHdhcyBhY3F1aXJlZCB0byBhY3R1YWxseSB1bmxvY2sgdGhlIHJlc291cmNlLiBUaGUgbXV0ZXgKLSAgICAgKiBtdXN0IGJlIHJlbGVhc2VkIGJ5IHRoZSB0aHJlYWQgdGhhdCBhY3F1aXJlZCBpdAotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gKGEgUnVudGltZUV4Y2VwdGlvbikgaWYgYSB0aHJlYWQKLSAgICAgKiAgICAgIG90aGVyIHRoYW4gdGhlIGN1cnJlbnQgb3duZXIgdHJpZXMgdG8gcmVsZWFzZSB0aGUgbXV0ZXguCi0gICAgICovCi0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZSgpCi0gICAgewotICAgICAgICBpZiAob3duZXIgIT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRocmVhZCBjYWxsaW5nIHJlbGVhc2UoKSBkb2Vzbid0IG93biBtdXRleCIpOwotCi0gICAgICAgIGlmICgtLWxvY2tfY291bnQgPD0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgb3duZXIgPSBudWxsOwotICAgICAgICAgICAgbm90aWZ5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9OYW1lVXRpbC5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL05hbWVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMGNjNmIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL05hbWVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MTMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgTmFtZVV0aWwKLXsKLSAgICAvLyBwdW5jdHVhdGlvbiBjaGFyYWN0ZXJzCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIEhZUEhFTiA9ICdcdTAwMkQnOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhciBQRVJJT0QgPSAnXHUwMDJFJzsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNoYXIgQ09MT04gID0gJ1x1MDAzQSc7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIFVTQ09SRSA9ICdcdTAwNUYnOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhciBET1QgICAgPSAnXHUwMEI3JzsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNoYXIgVEVMRUlBID0gJ1x1MDM4Nyc7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIEFZQUggICA9ICdcdTA2REQnOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhciBFTEhJWkIgPSAnXHUwNkRFJzsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFNldCBqYXZhV29yZHMgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KAotICAgICAgICBuZXcgU3RyaW5nW10KLSAgICAgICAgewotICAgICAgICAgICAgICAiYWJzdHJhY3QiLAotICAgICAgICAgICAgICAiYm9vbGVhbiIsCi0gICAgICAgICAgICAgICJicmVhayIsCi0gICAgICAgICAgICAgICJieXRlIiwKLSAgICAgICAgICAgICAgImNhc2UiLAotICAgICAgICAgICAgICAiY2F0Y2giLAotICAgICAgICAgICAgICAiY2hhciIsCi0gICAgICAgICAgICAgICJjbGFzcyIsCi0gICAgICAgICAgICAgICJjb25zdCIsCi0gICAgICAgICAgICAgICJjb250aW51ZSIsCi0gICAgICAgICAgICAgICJkZWZhdWx0IiwKLSAgICAgICAgICAgICAgImRvIiwKLSAgICAgICAgICAgICAgImRvdWJsZSIsCi0gICAgICAgICAgICAgICJlbHNlIiwKLSAgICAgICAgICAgICAgImV4dGVuZHMiLAotICAgICAgICAgICAgICAiZmFsc2UiLCAvLyBub3QgYSBrZXl3b3JkCi0gICAgICAgICAgICAgICJmaW5hbCIsCi0gICAgICAgICAgICAgICJmaW5hbGx5IiwKLSAgICAgICAgICAgICAgImZsb2F0IiwKLSAgICAgICAgICAgICAgImZvciIsCi0gICAgICAgICAgICAgICJnb3RvIiwKLSAgICAgICAgICAgICAgImlmIiwKLSAgICAgICAgICAgICAgImltcGxlbWVudHMiLAotICAgICAgICAgICAgICAiaW1wb3J0IiwKLSAgICAgICAgICAgICAgImluc3RhbmNlb2YiLAotICAgICAgICAgICAgICAiaW50IiwKLSAgICAgICAgICAgICAgImludGVyZmFjZSIsCi0gICAgICAgICAgICAgICJsb25nIiwKLSAgICAgICAgICAgICAgIm5hdGl2ZSIsCi0gICAgICAgICAgICAgICJuZXciLAotICAgICAgICAgICAgICAibnVsbCIsIC8vIG5vdCBhIGtleXdvcmQKLSAgICAgICAgICAgICAgInBhY2thZ2UiLAotICAgICAgICAgICAgICAicHJpdmF0ZSIsCi0gICAgICAgICAgICAgICJwcm90ZWN0ZWQiLAotICAgICAgICAgICAgICAicHVibGljIiwKLSAgICAgICAgICAgICAgInJldHVybiIsCi0gICAgICAgICAgICAgICJzaG9ydCIsCi0gICAgICAgICAgICAgICJzdGF0aWMiLAotICAgICAgICAgICAgICAic3VwZXIiLAotICAgICAgICAgICAgICAic3dpdGNoIiwKLSAgICAgICAgICAgICAgInN5bmNocm9uaXplZCIsCi0gICAgICAgICAgICAgICJ0aGlzIiwKLSAgICAgICAgICAgICAgInRocmVhZHNhZmUiLAotICAgICAgICAgICAgICAidGhyb3ciLAotICAgICAgICAgICAgICAidGhyb3dzIiwKLSAgICAgICAgICAgICAgInRyYW5zaWVudCIsCi0gICAgICAgICAgICAgICJ0cnVlIiwgLy8gbm90IGEga2V5d29yZAotICAgICAgICAgICAgICAidHJ5IiwKLSAgICAgICAgICAgICAgInZvaWQiLAotICAgICAgICAgICAgICAidm9sYXRpbGUiLAotICAgICAgICAgICAgICAid2hpbGUiLAotICAgICAgICB9Ci0gICAgKSk7Ci0KLSAgICAvKgotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFNldCBqYXZhTmFtZXMgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KAotICAgICAgICBuZXcgU3RyaW5nW10KLSAgICAgICAgewotICAgICAgICAgICAgIkNoYXJTZXF1ZW5jZSIsCi0gICAgICAgICAgICAiQ2xvbmVhYmxlIiwKLSAgICAgICAgICAgICJDb21wYXJhYmxlIiwKLSAgICAgICAgICAgICJSdW5uYWJsZSIsCi0KLSAgICAgICAgICAgICJCb29sZWFuIiwKLSAgICAgICAgICAgICJCeXRlIiwKLSAgICAgICAgICAgICJDaGFyYWN0ZXIiLAotICAgICAgICAgICAgIkNsYXNzIiwKLSAgICAgICAgICAgICJDbGFzc0xvYWRlciIsCi0gICAgICAgICAgICAiQ29tcGlsZXIiLAotICAgICAgICAgICAgIkRvdWJsZSIsCi0gICAgICAgICAgICAiRmxvYXQiLAotICAgICAgICAgICAgIkluaGVyaXRhYmxlVGhyZWFkTG9jYWwiLAotICAgICAgICAgICAgIkludGVnZXIiLAotICAgICAgICAgICAgIkxvbmciLAotICAgICAgICAgICAgIk1hdGgiLAotICAgICAgICAgICAgIk51bWJlciIsCi0gICAgICAgICAgICAiT2JqZWN0IiwKLSAgICAgICAgICAgICJQYWNrYWdlIiwKLSAgICAgICAgICAgICJQcm9jZXNzIiwKLSAgICAgICAgICAgICJSdW50aW1lIiwKLSAgICAgICAgICAgICJSdW50aW1lUGVybWlzc2lvbiIsCi0gICAgICAgICAgICAiU2VjdXJpdHlNYW5hZ2VyIiwKLSAgICAgICAgICAgICJTaG9ydCIsCi0gICAgICAgICAgICAiU3RhY2tUcmFjZUVsZW1lbnQiLAotICAgICAgICAgICAgIlN0cmljdE1hdGgiLAotICAgICAgICAgICAgIlN0cmluZyIsCi0gICAgICAgICAgICAiU3RyaW5nQnVmZmVyIiwKLSAgICAgICAgICAgICJTeXN0ZW0iLAotICAgICAgICAgICAgIlRocmVhZCIsCi0gICAgICAgICAgICAiVGhyZWFkR3JvdXAiLAotICAgICAgICAgICAgIlRocmVhZExvY2FsIiwKLSAgICAgICAgICAgICJUaHJvd2FibGUiLAotICAgICAgICAgICAgIlZvaWQiLAotCi0gICAgICAgICAgICAiQXJpdGhtZXRpY0V4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJBcnJheVN0b3JlRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJDbGFzc0Nhc3RFeGNlcHRpb24iLAotICAgICAgICAgICAgIkNsYXNzTm90Rm91bmRFeGNlcHRpb24iLAotICAgICAgICAgICAgIkNsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJFeGNlcHRpb24iLAotICAgICAgICAgICAgIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24iLAotICAgICAgICAgICAgIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24iLAotICAgICAgICAgICAgIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iLAotICAgICAgICAgICAgIkluc3RhbnRpYXRpb25FeGNlcHRpb24iLAotICAgICAgICAgICAgIkludGVycnVwdGVkRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiTm9TdWNoRmllbGRFeGNlcHRpb24iLAotICAgICAgICAgICAgIk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiTnVsbFBvaW50ZXJFeGNlcHRpb24iLAotICAgICAgICAgICAgIk51bWJlckZvcm1hdEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiUnVudGltZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiU2VjdXJpdHlFeGNlcHRpb24iLAotICAgICAgICAgICAgIlN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iLAotICAgICAgICAgICAgIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIiwKLQotICAgICAgICAgICAgIkFic3RyYWN0TWV0aG9kRXJyb3IiLAotICAgICAgICAgICAgIkFzc2VydGlvbkVycm9yIiwKLSAgICAgICAgICAgICJDbGFzc0NpcmN1bGFyaXR5RXJyb3IiLAotICAgICAgICAgICAgIkNsYXNzRm9ybWF0RXJyb3IiLAotICAgICAgICAgICAgIkVycm9yIiwKLSAgICAgICAgICAgICJFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IiLAotICAgICAgICAgICAgIklsbGVnYWxBY2Nlc3NFcnJvciIsCi0gICAgICAgICAgICAiSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvciIsCi0gICAgICAgICAgICAiSW5zdGFudGlhdGlvbkVycm9yIiwKLSAgICAgICAgICAgICJJbnRlcm5hbEVycm9yIiwKLSAgICAgICAgICAgICJMaW5rYWdlRXJyb3IiLAotICAgICAgICAgICAgIk5vQ2xhc3NEZWZGb3VuZEVycm9yIiwKLSAgICAgICAgICAgICJOb1N1Y2hGaWVsZEVycm9yIiwKLSAgICAgICAgICAgICJOb1N1Y2hNZXRob2RFcnJvciIsCi0gICAgICAgICAgICAiT3V0T2ZNZW1vcnlFcnJvciIsCi0gICAgICAgICAgICAiU3RhY2tPdmVyZmxvd0Vycm9yIiwKLSAgICAgICAgICAgICJUaHJlYWREZWF0aCIsCi0gICAgICAgICAgICAiVW5rbm93bkVycm9yIiwKLSAgICAgICAgICAgICJVbnNhdGlzZmllZExpbmtFcnJvciIsCi0gICAgICAgICAgICAiVW5zdXBwb3J0ZWRDbGFzc1ZlcnNpb25FcnJvciIsCi0gICAgICAgICAgICAiVmVyaWZ5RXJyb3IiLAotICAgICAgICAgICAgIlZpcnR1YWxNYWNoaW5lRXJyb3IiLAotICAgICAgICB9Ci0gICAgKSk7Ci0gICAgKi8KLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFNldCBqYXZhTmFtZXMgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KAotICAgICAgICBuZXcgU3RyaW5nW10KLSAgICAgICAgewotICAgICAgICAgICAgLy8gMS4gYWxsIHRoZSBKYXZhLmxhbmcgY2xhc3NlcyBbMS40LjEgSkRLXS4KLSAgICAgICAgICAgICJDaGFyU2VxdWVuY2UiLAotICAgICAgICAgICAgIkNsb25lYWJsZSIsCi0gICAgICAgICAgICAiQ29tcGFyYWJsZSIsCi0gICAgICAgICAgICAiUnVubmFibGUiLAotCi0gICAgICAgICAgICAiQm9vbGVhbiIsCi0gICAgICAgICAgICAiQnl0ZSIsCi0gICAgICAgICAgICAiQ2hhcmFjdGVyIiwKLSAgICAgICAgICAgICJDbGFzcyIsCi0gICAgICAgICAgICAiQ2xhc3NMb2FkZXIiLAotICAgICAgICAgICAgIkNvbXBpbGVyIiwKLSAgICAgICAgICAgICJEb3VibGUiLAotICAgICAgICAgICAgIkZsb2F0IiwKLSAgICAgICAgICAgICJJbmhlcml0YWJsZVRocmVhZExvY2FsIiwKLSAgICAgICAgICAgICJJbnRlZ2VyIiwKLSAgICAgICAgICAgICJMb25nIiwKLSAgICAgICAgICAgICJNYXRoIiwKLSAgICAgICAgICAgICJOdW1iZXIiLAotICAgICAgICAgICAgIk9iamVjdCIsCi0gICAgICAgICAgICAiUGFja2FnZSIsCi0gICAgICAgICAgICAiUHJvY2VzcyIsCi0gICAgICAgICAgICAiUnVudGltZSIsCi0gICAgICAgICAgICAiUnVudGltZVBlcm1pc3Npb24iLAotICAgICAgICAgICAgIlNlY3VyaXR5TWFuYWdlciIsCi0gICAgICAgICAgICAiU2hvcnQiLAotICAgICAgICAgICAgIlN0YWNrVHJhY2VFbGVtZW50IiwKLSAgICAgICAgICAgICJTdHJpY3RNYXRoIiwKLSAgICAgICAgICAgICJTdHJpbmciLAotICAgICAgICAgICAgIlN0cmluZ0J1ZmZlciIsCi0gICAgICAgICAgICAiU3lzdGVtIiwKLSAgICAgICAgICAgICJUaHJlYWQiLAotICAgICAgICAgICAgIlRocmVhZEdyb3VwIiwKLSAgICAgICAgICAgICJUaHJlYWRMb2NhbCIsCi0gICAgICAgICAgICAiVGhyb3dhYmxlIiwKLSAgICAgICAgICAgICJWb2lkIiwKLQotICAgICAgICAgICAgIkFyaXRobWV0aWNFeGNlcHRpb24iLAotICAgICAgICAgICAgIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiQXJyYXlTdG9yZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiQ2xhc3NDYXN0RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLAotICAgICAgICAgICAgIklsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24iLAotICAgICAgICAgICAgIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJJbnN0YW50aWF0aW9uRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAiTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24iLAotICAgICAgICAgICAgIk5vU3VjaEZpZWxkRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJOb1N1Y2hNZXRob2RFeGNlcHRpb24iLAotICAgICAgICAgICAgIk51bGxQb2ludGVyRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJOdW1iZXJGb3JtYXRFeGNlcHRpb24iLAotICAgICAgICAgICAgIlJ1bnRpbWVFeGNlcHRpb24iLAotICAgICAgICAgICAgIlNlY3VyaXR5RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIsCi0KLSAgICAgICAgICAgICJBYnN0cmFjdE1ldGhvZEVycm9yIiwKLSAgICAgICAgICAgICJBc3NlcnRpb25FcnJvciIsCi0gICAgICAgICAgICAiQ2xhc3NDaXJjdWxhcml0eUVycm9yIiwKLSAgICAgICAgICAgICJDbGFzc0Zvcm1hdEVycm9yIiwKLSAgICAgICAgICAgICJFcnJvciIsCi0gICAgICAgICAgICAiRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yIiwKLSAgICAgICAgICAgICJJbGxlZ2FsQWNjZXNzRXJyb3IiLAotICAgICAgICAgICAgIkluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3IiLAotICAgICAgICAgICAgIkluc3RhbnRpYXRpb25FcnJvciIsCi0gICAgICAgICAgICAiSW50ZXJuYWxFcnJvciIsCi0gICAgICAgICAgICAiTGlua2FnZUVycm9yIiwKLSAgICAgICAgICAgICJOb0NsYXNzRGVmRm91bmRFcnJvciIsCi0gICAgICAgICAgICAiTm9TdWNoRmllbGRFcnJvciIsCi0gICAgICAgICAgICAiTm9TdWNoTWV0aG9kRXJyb3IiLAotICAgICAgICAgICAgIk91dE9mTWVtb3J5RXJyb3IiLAotICAgICAgICAgICAgIlN0YWNrT3ZlcmZsb3dFcnJvciIsCi0gICAgICAgICAgICAiVGhyZWFkRGVhdGgiLAotICAgICAgICAgICAgIlVua25vd25FcnJvciIsCi0gICAgICAgICAgICAiVW5zYXRpc2ZpZWRMaW5rRXJyb3IiLAotICAgICAgICAgICAgIlVuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3IiLAotICAgICAgICAgICAgIlZlcmlmeUVycm9yIiwKLSAgICAgICAgICAgICJWaXJ0dWFsTWFjaGluZUVycm9yIiwKLQotICAgICAgICAgICAgLy8gMi4gb3RoZXIgY2xhc3NlcyB1c2VkIGFzIHByaW1pdGl2ZSB0eXBlcyBieSB4bWwgYmVhbnMKLSAgICAgICAgICAgICJCaWdJbnRlZ2VyIiwKLSAgICAgICAgICAgICJCaWdEZWNpbWFsIiwKLSAgICAgICAgICAgICJFbnVtIiwKLSAgICAgICAgICAgICJEYXRlIiwKLSAgICAgICAgICAgICJHRGF0ZSIsCi0gICAgICAgICAgICAiR0R1cmF0aW9uIiwKLSAgICAgICAgICAgICJRTmFtZSIsCi0gICAgICAgICAgICAiTGlzdCIsCi0KLSAgICAgICAgICAgIC8vIDMuIHRoZSB0b3AgZmV3IG9yZy5hcGFjaGUueG1sYmVhbnMgbmFtZXMKLSAgICAgICAgICAgICJYbWxPYmplY3QiLAotICAgICAgICAgICAgIlhtbEN1cnNvciIsCi0gICAgICAgICAgICAiWG1sQmVhbnMiLAotICAgICAgICAgICAgIlNjaGVtYVR5cGUiLAotICAgICAgICB9Ci0gICAgKSk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEphdmFJZGVudGlmaWVyKFN0cmluZyBpZCkKLSAgICB7Ci0gICAgICAgIGlmIChpZCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWQgY2Fubm90IGJlIG51bGwiKTsKLQotICAgICAgICBpbnQgbGVuID0gaWQubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChsZW4gPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoamF2YVdvcmRzLmNvbnRhaW5zKGlkKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoaWQuY2hhckF0KDApKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChpZC5jaGFyQXQoaSkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SkFYUlBDQ2xhc3NOYW1lKCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCcuJywgJ18nKTsKLSAgICAgICAgbmFtZSA9IHVwcGVyY2FzZUZpcnN0TGV0dGVyKCBuYW1lICk7Ci0KLSAgICAgICAgaWYgKGlzVmFsaWRKYXZhSWRlbnRpZmVyKG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAiXyIgKyBuYW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SkFYUlBDTWV0aG9kTmFtZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJy4nLCdfJyk7Ci0gICAgICAgIG5hbWUgPSBsb3dlcmNhc2VGaXJzdExldHRlcihuYW1lKTsKLQotICAgICAgICBpZiAoaXNWYWxpZEphdmFJZGVudGlmZXIobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICJfIiArIG5hbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFhNTE5hbWUgZ2V0WE1MTmFtZUZyb21DbGFzcyhDbGFzcyBjbGF6eikKLSAgICB7Ci0gICAgICAgIFN0cmluZyB1cmkgPSBOYW1lVXRpbC5nZXROYW1lc3BhY2VGcm9tUGFja2FnZShjbGF6eik7Ci0gICAgICAgIFN0cmluZyBsbmFtZSA9IE5hbWVVdGlsLmdldFJvb3RDbGFzc05hbWVGcm9tQ2xhc3MoY2xhenouZ2V0TmFtZSgpKTsKLSAgICAgICAgWE1MTmFtZSB4c2RfbmFtZSA9IG5ldyBOYW1lKHVyaSwgbG5hbWUpOwotICAgICAgICByZXR1cm4geHNkX25hbWU7Ci0gICAgfQotICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc05hbWVGcm9tUU5hbWUoUU5hbWUgcW5hbWUpCi0gICAgewotICAgICAgICBTdHJpbmcgamF2YV90eXBlID0gdXBwZXJDYW1lbENhc2UocW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgIFN0cmluZyB1cmkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgU3RyaW5nIGphdmFfcGtnID0gbnVsbDsKLQotICAgICAgICBqYXZhX3BrZyA9IGdldFBhY2thZ2VGcm9tTmFtZXNwYWNlKHVyaSk7Ci0KLSAgICAgICAgaWYgKGphdmFfcGtnICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gamF2YV9wa2cgKyAiLiIgKyBqYXZhX3R5cGU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBqYXZhX3R5cGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTlNfUFJFRklYPSJqYXZhOiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBTkdfUFJFRklYID0gImphdmEuIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWVzcGFjZUZyb21QYWNrYWdlKGZpbmFsIENsYXNzIGNsYXp6KQotICAgIHsKLSAgICAgICAgQ2xhc3MgY3Vycl9jbGF6eiA9IGNsYXp6OwotCi0gICAgICAgIHdoaWxlIChjdXJyX2NsYXp6LmlzQXJyYXkoKSkKLSAgICAgICAgICAgIGN1cnJfY2xhenogPSBjdXJyX2NsYXp6LmdldENvbXBvbmVudFR5cGUoKTsKLQotICAgICAgICBTdHJpbmcgZnVsbG5hbWUgPSBjbGF6ei5nZXROYW1lKCk7Ci0gICAgICAgIGludCBsYXN0ZG90ID0gZnVsbG5hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgU3RyaW5nIHBrZ19uYW1lID0gbGFzdGRvdCA8IDAgPyAiIiA6IGZ1bGxuYW1lLnN1YnN0cmluZygwLCBsYXN0ZG90KTsKLQotICAgICAgICAvL3NwZWNpYWwgY2FzZSBmb3IgYnVpbHRpbiB0eXBlcwotICAgICAgICAvKgotICAgICAgICBpZiAoY3Vycl9jbGF6ei5pc1ByaW1pdGl2ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwa2dfbmFtZSA9IGMuZ2V0SmF2YUxhbmd1YWdlTmFtZXNwYWNlVXJpKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGtnX25hbWUuc3RhcnRzV2l0aChMQU5HX1BSRUZJWCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZW1fc3RyID0gcGtnX25hbWUuc3Vic3RyaW5nKExBTkdfUFJFRklYLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIHBrZ19uYW1lID0gYy5nZXRKYXZhTGFuZ3VhZ2VOYW1lc3BhY2VVcmkoKSArICIuIiArIHJlbV9zdHI7Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLSAgICAgICAgcmV0dXJuIEpBVkFfTlNfUFJFRklYICsgcGtnX25hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VyaVNjaGVtZUNoYXIoY2hhciBjaCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoY2ggPj0gJ2EnICYmIGNoIDw9J3onIHx8Ci0gICAgICAgICAgICBjaCA+PSAnQScgJiYgY2ggPD0nWicgfHwKLSAgICAgICAgICAgIGNoID49ICcwJyAmJiBjaCA8PSc5JyB8fAotICAgICAgICAgICAgY2ggPT0gJy0nIHx8IGNoID09ICcuJyB8fCBjaCA9PSAnKycpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVcmlBbHBoYUNoYXIoY2hhciBjaCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoY2ggPj0gJ2EnICYmIGNoIDw9J3onIHx8IGNoID49ICdBJyAmJiBjaCA8PSAnWicpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kU2NoZW1lQ29sb24oU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIGludCBsZW4gPSB1cmkubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChsZW4gPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKCFpc1VyaUFscGhhQ2hhcih1cmkuY2hhckF0KDApKSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykKLSAgICAgICAgICAgIGlmICghaXNVcmlTY2hlbWVDaGFyKHVyaS5jaGFyQXQoaSkpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoaSA9PSBsZW4pCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGlmICh1cmkuY2hhckF0KGkpICE9ICc6JykKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGpsczc3U3RyaW5nKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChidWYuY2hhckF0KGkpKSkKLSAgICAgICAgICAgICAgICBidWYuc2V0Q2hhckF0KGksICdfJyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1Zi5sZW5ndGgoKSA9PSAwIHx8ICFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGJ1Zi5jaGFyQXQoMCkpKQotICAgICAgICAgICAgYnVmLmluc2VydCgwLCAnXycpOwotICAgICAgICBpZiAoaXNKYXZhUmVzZXJ2ZWRXb3JkKG5hbWUpKQotICAgICAgICAgICAgYnVmLmFwcGVuZCgnXycpOwotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdCBzcGxpdEROUyhTdHJpbmcgZG5zKQotICAgIHsKLSAgICAgICAgLy8gSkFYQiBzYXlzOiBvbmx5IHNwbGl0K3JldmVyc2UgRE5TIGlmIFRMRCBtYXRjaGVzIGtub3duIFRMRHMgb3IgSVNPIDMxNjYKLSAgICAgICAgLy8gV2UgYXJlIGlnbm9yaW5nIHRoaXMgbm93IChUSCkKLQotICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBpbnQgZW5kID0gZG5zLmxlbmd0aCgpOwotICAgICAgICBpbnQgYmVnaW4gPSBkbnMubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgZm9yICggOyBiZWdpbiAhPSAtMSA7IGJlZ2luLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkbnMuY2hhckF0KGJlZ2luKSA9PSAnLicpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGpsczc3U3RyaW5nKGRucy5zdWJzdHJpbmcoYmVnaW4gKyAxLCBlbmQpKSk7Ci0gICAgICAgICAgICAgICAgZW5kID0gYmVnaW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFkZChqbHM3N1N0cmluZyhkbnMuc3Vic3RyaW5nKDAsIGVuZCkpKTsKLQotICAgICAgICAvLyBKQVhCIGRyYWZ0IGV4YW1wbGUgaW1wbGllcyByZW1vdmFsIG9mIHd3dwotICAgICAgICBpZiAocmVzdWx0LnNpemUoKSA+PSAzICYmCi0gICAgICAgICAgICAgICAgKChTdHJpbmcpcmVzdWx0LmdldChyZXN1bHQuc2l6ZSgpIC0gMSkpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJ3d3ciKSkKLSAgICAgICAgICAgIHJlc3VsdC5yZW1vdmUocmVzdWx0LnNpemUoKSAtIDEpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByb2Nlc3NGaWxlbmFtZShTdHJpbmcgZmlsZW5hbWUpCi0gICAgewotICAgICAgICAvLyBKQVhCIHNheXM6IHN0cmlwIDIgb3IgMyBsZXR0ZXIgZXh0ZW5zaW9uIG9yICIuaHRtbCIKLQotICAgICAgICBpbnQgaSA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIGlmIChpID4gMCAmJiAoCi0gICAgICAgICAgICAgICAgaSArIDEgKyAyID09IGZpbGVuYW1lLmxlbmd0aCgpIHx8Ci0gICAgICAgICAgICAgICAgaSArIDEgKyAzID09IGZpbGVuYW1lLmxlbmd0aCgpIHx8Ci0gICAgICAgICAgICAgICAgZmlsZW5hbWUuc3Vic3RyaW5nKGkgKyAxKS50b0xvd2VyQ2FzZSgpID09ICJodG1sIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgaSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmlsZW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZUZyb21OYW1lc3BhY2UoU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIC8vIHNwZWNpYWwgY2FzZTogbm8gbmFtZXNwYWNlIC0+IHBhY2thZ2UgIm5vTmFtZXNwYWNlIgotICAgICAgICBpZiAodXJpID09IG51bGwgfHwgdXJpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gIm5vTmFtZXNwYWNlIjsKLQotICAgICAgICAvLyBhcHBseSBkcmFmdCBKQVhCIHJ1bGVzCi0gICAgICAgIGludCBsZW4gPSB1cmkubGVuZ3RoKCk7Ci0gICAgICAgIGludCBpID0gZmluZFNjaGVtZUNvbG9uKHVyaSk7Ci0gICAgICAgIExpc3QgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBpZiAoIGkgPj0gMCAmJiB1cmkuc3Vic3RyaW5nKDAsIGkpLmVxdWFscygiamF2YSIpKQotICAgICAgICAgICAgcmVzdWx0ID0gIEFycmF5cy5hc0xpc3QodXJpLnN1YnN0cmluZyhpICsgMSkuc3BsaXQoIlxcLiIpKTsKLQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIG91dGVyOiBmb3IgKGkgPSBpICsgMTsgaSA8IGxlbjsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlICh1cmkuY2hhckF0KGkpID09ICcvJykKLSAgICAgICAgICAgICAgICAgICAgaWYgKCsraSA+PSBsZW4pIGJyZWFrIG91dGVyOwotICAgICAgICAgICAgICAgIGludCBzdGFydCA9IGk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHVyaS5jaGFyQXQoaSkgIT0gJy8nKQotICAgICAgICAgICAgICAgICAgICBpZiAoKytpID49IGxlbikgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaW50IGVuZCA9IGk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZCh1cmkuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXN1bHQuc2l6ZSgpID4gMSkKLSAgICAgICAgICAgICAgICByZXN1bHQuc2V0KHJlc3VsdC5zaXplKCkgLSAxLCBwcm9jZXNzRmlsZW5hbWUoKFN0cmluZylyZXN1bHQuZ2V0KHJlc3VsdC5zaXplKCkgLSAxKSkpOwotCi0gICAgICAgICAgICBpZiAocmVzdWx0LnNpemUoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTGlzdCBzcGxpdGRucyA9IHNwbGl0RE5TKChTdHJpbmcpcmVzdWx0LmdldCgwKSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnJlbW92ZSgwKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKDAsIHNwbGl0ZG5zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSByZXN1bHQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQobm9uSmF2YUtleXdvcmQobG93ZXJDYW1lbENhc2UoKFN0cmluZylpdC5uZXh0KCkpKSk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCcuJyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1Zi5zdWJzdHJpbmcoMCwgYnVmLmxlbmd0aCgpIC0gMSk7IC8vIGNob3Agb2ZmIGV4dHJhIGRvdAotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odXBwZXJDYXNlVW5kZXJiYXIoYXJnc1tpXSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB1cHBlci1jYXNlLWFuZC11bmRlcmJhciBzdHJpbmcgdXNpbmcgdGhlIEpBWEIgcnVsZXMuCi0gICAgICogQWx3YXlzIHN0YXJ0cyB3aXRoIGEgY2FwaXRhbCBsZXR0ZXIgdGhhdCBpcyBhIHZhbGlkCi0gICAgICogamF2YSBpZGVudGlmaWVyIHN0YXJ0LiAoSWYgSkFYQiBydWxlcyBkb24ndCBwcm9kdWNlCi0gICAgICogb25lLCB0aGVuICJYXyIgaXMgcHJlcGVuZGVkLikKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1cHBlckNhc2VVbmRlcmJhcihTdHJpbmcgeG1sX25hbWUpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBMaXN0IHdvcmRzID0gc3BsaXRXb3Jkcyh4bWxfbmFtZSk7Ci0KLSAgICAgICAgZmluYWwgaW50IHN6ID0gd29yZHMuc2l6ZSgpIC0gMTsKLSAgICAgICAgaWYgKHN6ID49IDAgJiYgIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoKChTdHJpbmcpd29yZHMuZ2V0KDApKS5jaGFyQXQoMCkpKQotICAgICAgICAgICAgYnVmLmFwcGVuZCgiWF8iKTsKLQotICAgICAgICBmb3IoaW50IGkgPSAwIDsgaSA8IHN6IDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKChTdHJpbmcpd29yZHMuZ2V0KGkpKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoVVNDT1JFKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzeiA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKChTdHJpbmcpd29yZHMuZ2V0KHN6KSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3VwY2FzZSBlbnRpcmUgYnVmZmVyCi0gICAgICAgIGZpbmFsIGludCBsZW4gPSBidWYubGVuZ3RoKCk7Ci0gICAgICAgIGZvcihpbnQgaiA9IDAgOyBqIDwgbGVuIDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBidWYuY2hhckF0KGopOwotICAgICAgICAgICAgYnVmLnNldENoYXJBdChqLCBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjYW1lbC1jYXNlZCBzdHJpbmcgdXNpbmcgdGhlIEpBWEIgcnVsZXMuCi0gICAgICogQWx3YXlzIHN0YXJ0cyB3aXRoIGEgY2FwaXRhbCBsZXR0ZXIgdGhhdCBpcyBhIHZhbGlkCi0gICAgICogamF2YSBpZGVudGlmaWVyIHN0YXJ0LiAoSWYgSkFYQiBydWxlcyBkb24ndCBwcm9kdWNlCi0gICAgICogb25lLCB0aGVuICJYIiBpcyBwcmVwZW5kZWQuKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwcGVyQ2FtZWxDYXNlKFN0cmluZyB4bWxfbmFtZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIExpc3Qgd29yZHMgPSBzcGxpdFdvcmRzKHhtbF9uYW1lKTsKLQotICAgICAgICBpZiAod29yZHMuc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KCgoU3RyaW5nKXdvcmRzLmdldCgwKSkuY2hhckF0KDApKSkKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJYIik7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ciA9IHdvcmRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZShpdHIuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoKFN0cmluZylpdHIubmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNhbWVsLWNhc2VkIHN0cmluZyB1c2luZyB0aGUgSkFYQiBydWxlcywKLSAgICAgKiB3aGVyZSB0aGUgZmlyc3QgY29tcG9uZW50IGlzIGxvd2VyY2FzZWQuIE5vdGUgdGhhdAotICAgICAqIGlmIHRoZSBmaXJzdCBjb21wb25lbnQgaXMgYW4gYWNyb255bSwgdGhlIHdob2xlCi0gICAgICogdGhpZ25zIGdldHMgbG93ZXJjYXNlZC4KLSAgICAgKiBBbHdheXMgc3RhcnRzIHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyIHRoYXQgaXMgYSB2YWxpZAotICAgICAqIGphdmEgaWRlbnRpZmllciBzdGFydC4gKElmIEpBWEIgcnVsZXMgZG9uJ3QgcHJvZHVjZQotICAgICAqIG9uZSwgdGhlbiAieCIgaXMgcHJlcGVuZGVkLikKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBsb3dlckNhbWVsQ2FzZShTdHJpbmcgeG1sX25hbWUpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBMaXN0IHdvcmRzID0gc3BsaXRXb3Jkcyh4bWxfbmFtZSk7Ci0KLSAgICAgICAgaWYgKHdvcmRzLnNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBmaXJzdCA9ICgoU3RyaW5nKXdvcmRzLmdldCgwKSkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgIGNoYXIgZiA9IGZpcnN0LmNoYXJBdCgwKTsKLSAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChmKSkKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJ4Iik7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKGZpcnN0KTsKLQotICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gd29yZHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGl0ci5uZXh0KCk7IC8vIHNraXAgYWxyZWFkeS1sb3dlcmNhc2VkIHdvcmQKLSAgICAgICAgICAgIHdoaWxlKGl0ci5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgoU3RyaW5nKWl0ci5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1cHBlckNhc2VGaXJzdExldHRlcihTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIGlmIChzLmxlbmd0aCgpID09IDAgfHwgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHMuY2hhckF0KDApKSkKLSAgICAgICAgICAgIHJldHVybiBzOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHMpOwotICAgICAgICBidWYuc2V0Q2hhckF0KDAsIENoYXJhY3Rlci50b1VwcGVyQ2FzZShidWYuY2hhckF0KDApKSk7Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAgIHNwbGl0IGFuIHhtbCBuYW1lIGludG8gd29yZHMgdmlhIEpBWEIgYXBwcm9hY2gsIHVwY2FzaW5nIGZpcnN0Ci0gICAgICAgbGV0dGVyIG9mIGVhY2ggd29yZCBhcyBuZWVkZWQsIGlmIHVwY2FzZSBpcyB0cnVlCi0KLSAgICAgICBuY25hbWUgaXMgeG1sIG5jbmFtZSAoaS5lLiBubyBjb2xvbnMpLgotICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRDYXBwZWQoTGlzdCBsaXN0LCBTdHJpbmcgc3RyKQotICAgIHsKLSAgICAgICAgaWYgKHN0ci5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICBsaXN0LmFkZCh1cHBlckNhc2VGaXJzdExldHRlcihzdHIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExpc3Qgc3BsaXRXb3JkcyhTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaW50IGxlbiA9IG5hbWUubGVuZ3RoKCk7Ci0gICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgIGludCBwcmVmaXggPSBTVEFSVDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGN1cnJlbnQgPSBnZXRDaGFyQ2xhc3MobmFtZS5jaGFyQXQoaSkpOwotICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBQVU5DVCAmJiBjdXJyZW50ID09IFBVTkNUKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZENhcHBlZChsaXN0LCBuYW1lLnN1YnN0cmluZyhzdGFydCwgaSkpOwotICAgICAgICAgICAgICAgIHdoaWxlICgoY3VycmVudCA9IGdldENoYXJDbGFzcyhuYW1lLmNoYXJBdChpKSkpID09IFBVTkNUKQotICAgICAgICAgICAgICAgICAgICBpZiAoKytpID49IGxlbikgcmV0dXJuIGxpc3Q7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoKHByZWZpeCA9PSBESUdJVCkgIT0gKGN1cnJlbnQgPT0gRElHSVQpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAocHJlZml4ID09IExPV0VSICYmIGN1cnJlbnQgIT0gTE9XRVIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAoaXNMZXR0ZXIocHJlZml4KSAhPSBpc0xldHRlcihjdXJyZW50KSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkQ2FwcGVkKGxpc3QsIG5hbWUuc3Vic3RyaW5nKHN0YXJ0LCBpKSk7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocHJlZml4ID09IFVQUEVSICYmIGN1cnJlbnQgPT0gTE9XRVIgJiYgaSA+IHN0YXJ0ICsgMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGRDYXBwZWQobGlzdCwgbmFtZS5zdWJzdHJpbmcoc3RhcnQsIGkgLSAxKSk7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBpIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByZWZpeCA9IGN1cnJlbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkQ2FwcGVkKGxpc3QsIG5hbWUuc3Vic3RyaW5nKHN0YXJ0KSk7Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIC8vY2hhciBjbGFzc2VzCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNUQVJUID0gMDsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgUFVOQ1QgPSAxOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBESUdJVCA9IDI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BUksgPSAzOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBVUFBFUiA9IDQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IExPV0VSPSA1OwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBOT0NBU0U9IDY7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRDaGFyQ2xhc3MoY2hhciBjKQotICAgIHsKLSAgICAgICAgLy9vcmRlcmluZyBpcyBpbXBvcnRhbnQgaGVyZS4KLSAgICAgICAgaWYgKGlzUHVuY3R1YXRpb24oYykpCi0gICAgICAgICAgICByZXR1cm4gUFVOQ1Q7Ci0gICAgICAgIGVsc2UgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGMpKQotICAgICAgICAgICAgcmV0dXJuIERJR0lUOwotICAgICAgICBlbHNlIGlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2UoYykpCi0gICAgICAgICAgICByZXR1cm4gVVBQRVI7Ci0gICAgICAgIGVsc2UgaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjKSkKLSAgICAgICAgICAgIHJldHVybiBMT1dFUjsKLSAgICAgICAgZWxzZSBpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGMpKQotICAgICAgICAgICAgcmV0dXJuIE5PQ0FTRTsKLSAgICAgICAgZWxzZSBpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKQotICAgICAgICAgICAgcmV0dXJuIE1BUks7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBQVU5DVDsgLy8gbm90IGNvdmVyZWQgYnkgSkFYQjogdHJlYXQgaXQgYXMgcHVuY3R1YXRpb24KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGV0dGVyKGludCBzdGF0ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoc3RhdGU9PVVQUEVSCi0gICAgICAgICAgICAgIHx8IHN0YXRlPT1MT1dFUgotICAgICAgICAgICAgICB8fCBzdGF0ZT09Tk9DQVNFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQdW5jdHVhdGlvbihjaGFyIGMpCi0gICAgewotICAgICAgICByZXR1cm4gKGMgPT0gSFlQSEVOCi0gICAgICAgICAgICAgIHx8IGMgPT0gUEVSSU9ECi0gICAgICAgICAgICAgIHx8IGMgPT0gQ09MT04KLSAgICAgICAgICAgICAgfHwgYyA9PSBVU0NPUkUKLSAgICAgICAgICAgICAgfHwgYyA9PSBET1QKLSAgICAgICAgICAgICAgfHwgYyA9PSBURUxFSUEKLSAgICAgICAgICAgICAgfHwgYyA9PSBBWUFICi0gICAgICAgICAgICAgIHx8IGMgPT0gRUxISVpCKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlbmRlZCB0byBiZSBhcHBsaWVkIHRvIGEgbG93ZXJjYXNlLXN0YXJ0aW5nIGlkZW50aWZpZXIgdGhhdAotICAgICAqIG1heSBjb2xsaWRlIHdpdGggYSBKYXZhIGtleXdvcmQuICBJZiBpdCBkb2VzIGNvbGxpZGUsIHRoaXMKLSAgICAgKiBwcmVwZW5kcyB0aGUgbGV0dGVyICJ4Ii4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBub25KYXZhS2V5d29yZChTdHJpbmcgd29yZCkKLSAgICB7Ci0gICAgICAgIGlmIChpc0phdmFSZXNlcnZlZFdvcmQod29yZCkpCi0gICAgICAgICAgICByZXR1cm4gJ3gnICsgd29yZDsKLSAgICAgICAgcmV0dXJuIHdvcmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZW5kZWQgdG8gYmUgYXBwbGllZCB0byBhbiB1cHBlcmNhc2Utc3RhcnRpbmcgaWRlbnRpZmllciB0aGF0Ci0gICAgICogbWF5IGNvbGxpZGUgd2l0aCBhIGphdmEubGFuZy4qIGNsYXNzbmFtZS4gIElmIGl0IGRvZXMgY29sbGlkZSwgdGhpcwotICAgICAqIHByZXBlbmRzIHRoZSBsZXR0ZXIgIlgiLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vbkphdmFDb21tb25DbGFzc05hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoaXNKYXZhQ29tbW9uQ2xhc3NOYW1lKG5hbWUpKQotICAgICAgICAgICAgcmV0dXJuICJYIiArIG5hbWU7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNKYXZhUmVzZXJ2ZWRXb3JkKFN0cmluZyB3b3JkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlzSmF2YVJlc2VydmVkV29yZCh3b3JkLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSmF2YVJlc2VydmVkV29yZChTdHJpbmcgd29yZCwgYm9vbGVhbiBpZ25vcmVfY2FzZSkKLSAgICB7Ci0gICAgICAgIGlmIChpZ25vcmVfY2FzZSkKLSAgICAgICAgICAgIHdvcmQgPSB3b3JkLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgIHJldHVybiBqYXZhV29yZHMuY29udGFpbnMod29yZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUNvbW1vbkNsYXNzTmFtZShTdHJpbmcgd29yZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBqYXZhTmFtZXMuY29udGFpbnMod29yZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1ByZWZpeFJlc29sdmVyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vUHJlZml4UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4ZmRhOC4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vUHJlZml4UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotcHVibGljIGludGVyZmFjZSBQcmVmaXhSZXNvbHZlcgotewotICAgIC8qKgotICAgICAqIENhbGVkIHdoZW4gdGhlIHVzZXIgaGFzIGEgcHJlZml4IGFuZCBuZWVkcyB0byBsb29rIHVwIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICogbmFtZXNwYWNlIFVSSS4gSWYgdGhlIHByZWZpeCBpcyBub3QgZGVmaW5lZCBpbiB0aGlzIGNvbnRleHQsIHRoZW4gdGhpcwotICAgICAqIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuICBUaGUgbm8tbmFtZXNwYWNlIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBlbXB0eQotICAgICAqIHN0cmluZyByZXR1cm4gcmVzdWx0LgotICAgICAqIAotICAgICAqIElmIHRoZSBwcmVmaXggaXMgbnVsbCBvciAiIiwgdGhlbiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgaXMgYmVpbmcKLSAgICAgKiByZXF1ZXN0ZWQuCi0gICAgICovCi0gICAgU3RyaW5nIGdldE5hbWVzcGFjZUZvclByZWZpeChTdHJpbmcgcHJlZml4KTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9QdXNoZWRJbnB1dFN0cmVhbS5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1B1c2hlZElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YTk2YTMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1B1c2hlZElucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQdXNoZWRJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGRlZmF1bHRCdWZmZXJTaXplID0gMjA0ODsKLSAgICBwcm90ZWN0ZWQgYnl0ZSBidWZbXTsKLSAgICBwcm90ZWN0ZWQgaW50IHdyaXRlcG9zOwotICAgIHByb3RlY3RlZCBpbnQgcmVhZHBvczsKLSAgICBwcm90ZWN0ZWQgaW50IG1hcmtwb3MgPSAtMTsKLSAgICBwcm90ZWN0ZWQgaW50IG1hcmtsaW1pdDsKLSAgICBwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBJbnRlcm5hbE91dHB1dFN0cmVhbSgpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gbW9yZSBieXRlcyBuZWVkIHRvIGJlIHdyaXR0ZW4gaW50byB0aGlzIHN0cmVhbQotICAgICAqIChhcyBhbiBPdXRwdXRTdHJlYW0pLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCB3cml0ZSBhdCBsZWFzdCBvbmUgYnl0ZSBpZiB0aGUgc3RyZWFtIGlzCi0gICAgICogbm90IGVuZGVkLCBhbmQgaXQgbXVzdCBub3Qgd3JpdGUgYW55IGJ5dGVzIGlmIHRoZSBzdHJlYW0gaGFzCi0gICAgICogYWxyZWFkeSBlbmRlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmaWxsKGludCByZXF1ZXN0ZWRCeXRlcykgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlua2VkIG91dHB1dCBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIHRoZSBvdXRwdXQgc3RyZWFtIHRoYXQgbXVzdCBiZSB3cml0dGVuIHRvIHdoZW5ldmVyCi0gICAgICogdGhlIGZpbGwgbWV0aG9kIGlzIGNhbGxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpCi0gICAgewotICAgICAgICByZXR1cm4gb3V0cHV0U3RyZWFtOwotICAgIH0KLQotICAgIHB1YmxpYyBQdXNoZWRJbnB1dFN0cmVhbSgpCi0gICAgewotICAgICAgICB0aGlzKGRlZmF1bHRCdWZmZXJTaXplKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHVzaGVkSW5wdXRTdHJlYW0oaW50IHNpemUpCi0gICAgewotICAgICAgICBpZiAoc2l6ZSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5lZ2F0aXZlIGluaXRpYWwgYnVmZmVyIHNpemUiKTsKLSAgICAgICAgfQotICAgICAgICBidWYgPSBuZXcgYnl0ZVtzaXplXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYWtlcyByb29tIGZvciBjYiBtb3JlIGJ5dGVzIG9mIGRhdGEKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2hpZnQoaW50IGNiKQotICAgIHsKLSAgICAgICAgaW50IHNhdmVwb3MgPSByZWFkcG9zOwotICAgICAgICBpZiAobWFya3BvcyA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyZWFkcG9zIC0gbWFya3BvcyA+IG1hcmtsaW1pdCkKLSAgICAgICAgICAgICAgICBtYXJrcG9zID0gLTE7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc2F2ZXBvcyA9IG1hcmtwb3M7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc2l6ZSA9IHdyaXRlcG9zIC0gc2F2ZXBvczsKLQotICAgICAgICBpZiAoc2F2ZXBvcyA+IDAgJiYgYnVmLmxlbmd0aCAtIHNpemUgPj0gY2IgJiYgc2l6ZSA8PSBjYikKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWYsIHNhdmVwb3MsIGJ1ZiwgMCwgc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbmV3Y291bnQgPSBzaXplICsgY2I7Ci0gICAgICAgICAgICBieXRlIG5ld2J1ZltdID0gbmV3IGJ5dGVbTWF0aC5tYXgoYnVmLmxlbmd0aCA8PCAxLCBuZXdjb3VudCldOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWYsIHNhdmVwb3MsIG5ld2J1ZiwgMCwgc2l6ZSk7Ci0gICAgICAgICAgICBidWYgPSBuZXdidWY7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2F2ZXBvcyA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlYWRwb3MgLT0gc2F2ZXBvczsKLSAgICAgICAgICAgIGlmIChtYXJrcG9zID4gMCkKLSAgICAgICAgICAgICAgICBtYXJrcG9zIC09IHNhdmVwb3M7Ci0gICAgICAgICAgICB3cml0ZXBvcyAtPSBzYXZlcG9zOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKHJlYWRwb3MgPj0gd3JpdGVwb3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGwoMSk7Ci0gICAgICAgICAgICBpZiAocmVhZHBvcyA+PSB3cml0ZXBvcykKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1ZltyZWFkcG9zKytdICYgMHhmZjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIGNoYXJhY3RlcnMgaW50byBhIHBvcnRpb24gb2YgYW4gYXJyYXksIHJlYWRpbmcgZnJvbSB0aGUgdW5kZXJseWluZwotICAgICAqIHN0cmVhbSBhdCBtb3N0IG9uY2UgaWYgbmVjZXNzYXJ5LgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW50IGF2YWlsID0gd3JpdGVwb3MgLSByZWFkcG9zOwotICAgICAgICBpZiAoYXZhaWwgPCBsZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGwobGVuIC0gYXZhaWwpOwotICAgICAgICAgICAgYXZhaWwgPSB3cml0ZXBvcyAtIHJlYWRwb3M7Ci0gICAgICAgICAgICBpZiAoYXZhaWwgPD0gMCkgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGludCBjbnQgPSAoYXZhaWwgPCBsZW4pID8gYXZhaWwgOiBsZW47Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLCByZWFkcG9zLCBiLCBvZmYsIGNudCk7Ci0gICAgICAgIHJlYWRwb3MgKz0gY250OwotICAgICAgICByZXR1cm4gY250OwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAobiA8PSAwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgbG9uZyBhdmFpbCA9IHdyaXRlcG9zIC0gcmVhZHBvczsKLQotICAgICAgICBpZiAoYXZhaWwgPCBuKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBGaWxsIGluIGJ1ZmZlciB0byBzYXZlIGJ5dGVzIGZvciByZXNldAotICAgICAgICAgICAgbG9uZyByZXEgPSBuIC0gYXZhaWw7Ci0gICAgICAgICAgICBpZiAocmVxID4gSW50ZWdlci5NQVhfVkFMVUUpCi0gICAgICAgICAgICAgICAgcmVxID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgICAgICBmaWxsKChpbnQpcmVxKTsKLSAgICAgICAgICAgIGF2YWlsID0gd3JpdGVwb3MgLSByZWFkcG9zOwotICAgICAgICAgICAgaWYgKGF2YWlsIDw9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHNraXBwZWQgPSAoYXZhaWwgPCBuKSA/IGF2YWlsIDogbjsKLSAgICAgICAgcmVhZHBvcyArPSBza2lwcGVkOwotICAgICAgICByZXR1cm4gc2tpcHBlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBhdmFpbGFibGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyaXRlcG9zIC0gcmVhZHBvczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KQotICAgIHsKLSAgICAgICAgbWFya2xpbWl0ID0gcmVhZGxpbWl0OwotICAgICAgICBtYXJrcG9zID0gcmVhZHBvczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChtYXJrcG9zIDwgMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiUmVzZXR0aW5nIHRvIGludmFsaWQgbWFyayIpOwotICAgICAgICByZWFkcG9zID0gbWFya3BvczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgSW50ZXJuYWxPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh3cml0ZXBvcyArIDEgPiBidWYubGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNoaWZ0KDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmW3dyaXRlcG9zXSA9IChieXRlKWI7Ci0gICAgICAgICAgICB3cml0ZXBvcyArPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKG9mZiA8IDApIHx8IChvZmYgPiBiLmxlbmd0aCkgfHwgKGxlbiA8IDApIHx8Ci0gICAgICAgICAgICAgICAgKChvZmYgKyBsZW4pID4gYi5sZW5ndGgpIHx8ICgob2ZmICsgbGVuKSA8IDApKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChsZW4gPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGlmICh3cml0ZXBvcyArIGxlbiA+IGJ1Zi5sZW5ndGgpCi0gICAgICAgICAgICAgICAgc2hpZnQobGVuKTsKLQotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShiLCBvZmYsIGJ1Ziwgd3JpdGVwb3MsIGxlbik7Ci0gICAgICAgICAgICB3cml0ZXBvcyArPSBsZW47Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vUU5hbWVIZWxwZXIuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9RTmFtZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWQ4N2IwLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9RTmFtZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZQotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxOYW1lOwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUZpZWxkOwotCi1wdWJsaWMgY2xhc3MgUU5hbWVIZWxwZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgV0VMTF9LTk9XTl9QUkVGSVhFUyA9IGJ1aWxkV0tQKCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFhNTE5hbWUgZ2V0WE1MTmFtZShRTmFtZSBxbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChxbmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIFhNTE5hbWVIZWxwZXIuZm9yTE5TKCBxbmFtZS5nZXRMb2NhbFBhcnQoKSwgcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lIGZvckxOUyhTdHJpbmcgbG9jYWxuYW1lLCBTdHJpbmcgdXJpKQotICAgIHsKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKQotICAgICAgICAgICAgdXJpID0gIiI7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUodXJpLCBsb2NhbG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgZm9yTE4oU3RyaW5nIGxvY2FsbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUoIiIsIGxvY2FsbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZSBmb3JQcmV0dHkoU3RyaW5nIHByZXR0eSwgaW50IG9mZnNldCkKLSAgICB7Ci0gICAgICAgIGludCBhdCA9IHByZXR0eS5pbmRleE9mKCdAJywgb2Zmc2V0KTsKLSAgICAgICAgaWYgKGF0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUoIiIsIHByZXR0eS5zdWJzdHJpbmcob2Zmc2V0KSk7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUocHJldHR5LnN1YnN0cmluZyhhdCArIDEpLCBwcmV0dHkuc3Vic3RyaW5nKG9mZnNldCwgYXQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmV0dHkoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIm51bGwiOwotCi0gICAgICAgIGlmIChuYW1lLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGwgfHwgbmFtZS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIG5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0KLSAgICAgICAgcmV0dXJuIG5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyAiQCIgKyBuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBoZXhkaWdpdHMgPSBuZXcgY2hhcltdCi0gICAgICAgIHsnMCcsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJ0EnLCdCJywnQycsJ0QnLCdFJywnRid9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NhZmUoaW50IGMpCi0gICAgewotICAgICAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBwcm9kdWNlcyBhIHN0cmluZyB3aGljaCBpcyBhIHNhZmUgZmlsZW5hbWUgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nIHMuCi0gICAgLy8gVG8gbWFrZSBpdCBhIHNhZmUgZmlsZW5hbWUsIHRoZSBmb2xsb3dpbmcgdHdvIHRyYW5zZm9ybWF0aW9ucyBhcmUgYXBwbGllZDoKLSAgICAvLwotICAgIC8vIDEuIEZpcnN0IGFsbCBub24tYXNjaWktYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQgdXNpbmcKLSAgICAvLyAgICB0aGVpciBVVEY4IGJ5dGUgc2VxdWVuY2UsIGluIHRoZSBmb3JtIF94eF94eF94eCwgZm9yIGV4YW1wbGUsCi0gICAgLy8gICAgIkhlbGxvXzIwVGhlcmUiIGZvciAiSGVsbG8gVGhlcmUiLiAgKE9idmlvdXNseSwgYSBzaW5nbGUgdW5pY29kZQotICAgIC8vICAgIGNoYXJhY3RlciBtYXkgZXhwYW5kIGludG8gYXMgbWFueSBhcyB0aHJlZSBlc2NhcGUgcGF0dGVybnMuKQotICAgIC8vICAgIElmIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIDY0IGNoYXJhY3RlcnMgb3IgZmV3ZXIsIHRoYXQncyB0aGUgcmVzdWx0LgotICAgIC8vCi0gICAgLy8gMi4gSWYgdGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgbG9uZ2VyIHRoYW4gNjQgY2hhcmFjdGVycywgdGhlbiBpdCBpcwotICAgIC8vICAgIGRpc2NhcmRlZC4gIEluc3RlYWQsIHRoZSBTSEExIGFsZ29yaXRobSBpcyBydW4gb24gdGhlIG9yaWdpbmFsCi0gICAgLy8gICAgc3RyaW5nJ3MgVVRGOCByZXByZXNlbnRhdGlvbiwgYW5kIHRoZW4gdGhlIHJlc3VsdGluZyAyMC1ieXRlIG1lc3NhZ2UKLSAgICAvLyAgICBkaWdlc3QgaXMgdHVybmVkIGludG8gYSA0MC1jaGFyYWN0ZXIgaGV4IHN0cmluZzsgdGhlbiAiVVJJX1NIQV8xXyIgaXMKLSAgICAvLyAgICBwcmVwZW5kZWQuCi0gICAgLy8KLSAgICAvLyBUaGUgcmVhc29uIGZvciB0aGUgInNob3J0ZW5pbmciIGlzIHRvIGF2b2lkIGZpbGVuYW1lcyBsb25nZXIgdGhhbiBhYm91dAotICAgIC8vIDI1NiBjaGFyYWN0ZXJzLCB3aGljaCBhcmUgcHJvaGliaXRlZCBvbiBXaW5kb3dzIE5ULgotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05BTUVfTEVOR1RIID0gNjQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBoZXhzYWZlKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSBzLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChpc1NhZmUoY2gpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoY2gpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ5dGVbXSB1dGY4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHV0ZjggPSBzLnN1YnN0cmluZyhpLCBpICsgMSkuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdXRmOC5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnXycpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChoZXhkaWdpdHNbKHV0Zjhbal0gPj4gNCkgJiAweEZdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaGV4ZGlnaXRzW3V0Zjhbal0gJiAweEZdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4gLSBVVEYtOCBpIGFsd2F5cyBzdXBwb3J0ZWQKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiX0JBRF9VVEY4X0NIQVIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzaG9ydCBlbm91Z2g/IERvbmUhCi0gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoKCkgPD0gTUFYX05BTUVfTEVOR1RIKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCi0gICAgICAgIC8vIHRvbyBsb25nPyB1c2UgU0hBMQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgTWVzc2FnZURpZ2VzdCBtZCA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIlNIQSIpOwotICAgICAgICAgICAgYnl0ZVtdIGlucHV0Qnl0ZXMgPSBudWxsOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5wdXRCeXRlcyA9IHMuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuIC0gVVRGLTggaXMgYWx3YXlzIHN1cHBvcnRlZAotICAgICAgICAgICAgICAgIGlucHV0Qnl0ZXMgPSBuZXcgYnl0ZVswXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ5dGVbXSBkaWdlc3QgPSBtZC5kaWdlc3QoaW5wdXRCeXRlcyk7Ci0gICAgICAgICAgICBhc3NlcnQoZGlnZXN0Lmxlbmd0aCA9PSAyMCk7IC8vIFNIQTEgMTYwIGJpdHMgPT0gMjAgYnl0ZXMKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIlVSSV9TSEFfMV8iKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGlnZXN0Lmxlbmd0aDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaGV4ZGlnaXRzWyhkaWdlc3Rbal0gPj4gNCkgJiAweEZdKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGhleGRpZ2l0c1tkaWdlc3Rbal0gJiAweEZdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVzaW5nIGluIGEgSkRLIHdpdGhvdXQgYW4gU0hBIGltcGxlbWVudGF0aW9uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBoZXhzYWZlZGlyKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBpZiAobmFtZS5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsIHx8IG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAiX25vbnMvIiArIGhleHNhZmUobmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIHJldHVybiBoZXhzYWZlKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpICsgIi8iICsgaGV4c2FmZShuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgYnVpbGRXS1AoKQotICAgIHsKLSAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHJlc3VsdC5wdXQoImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsICJ4bWwiKTsKLSAgICAgICAgcmVzdWx0LnB1dCgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAieHMiKTsKLSAgICAgICAgcmVzdWx0LnB1dCgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAieHNpIik7Ci0gICAgICAgIHJlc3VsdC5wdXQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiwgIndzZGwiKTsKLSAgICAgICAgcmVzdWx0LnB1dCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLCAic29hcGVuYyIpOwotICAgICAgICByZXN1bHQucHV0KCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIsICJzb2FwZW52Iik7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkYWJsZShTY2hlbWFUeXBlIHNUeXBlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlYWRhYmxlKHNUeXBlLCBXRUxMX0tOT1dOX1BSRUZJWEVTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkYWJsZShTY2hlbWFUeXBlIHNUeXBlLCBNYXAgbnNQcmVmaXgpCi0gICAgewotICAgICAgICBpZiAoc1R5cGUuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZWFkYWJsZShzVHlwZS5nZXROYW1lKCksIG5zUHJlZml4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzVHlwZS5pc0F0dHJpYnV0ZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICJhdHRyaWJ1dGUgdHlwZSAiICsgcmVhZGFibGUoc1R5cGUuZ2V0QXR0cmlidXRlVHlwZUF0dHJpYnV0ZU5hbWUoKSwgbnNQcmVmaXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNUeXBlLmlzRG9jdW1lbnRUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAiZG9jdW1lbnQgdHlwZSAiICsgcmVhZGFibGUoc1R5cGUuZ2V0RG9jdW1lbnRFbGVtZW50TmFtZSgpLCBuc1ByZWZpeCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc1R5cGUuaXNOb1R5cGUoKSB8fCBzVHlwZS5nZXRPdXRlclR5cGUoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gImludmFsaWQgdHlwZSI7Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFUeXBlIG91dGVyVHlwZSA9IHNUeXBlLmdldE91dGVyVHlwZSgpOwotICAgICAgICBTY2hlbWFGaWVsZCBjb250YWluZXIgPSBzVHlwZS5nZXRDb250YWluZXJGaWVsZCgpOwotCi0gICAgICAgIGlmIChvdXRlclR5cGUuaXNBdHRyaWJ1dGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAidHlwZSBvZiBhdHRyaWJ1dGUgIiArIHJlYWRhYmxlKGNvbnRhaW5lci5nZXROYW1lKCksIG5zUHJlZml4KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvdXRlclR5cGUuaXNEb2N1bWVudFR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICJ0eXBlIG9mIGVsZW1lbnQgIiArIHJlYWRhYmxlKGNvbnRhaW5lci5nZXROYW1lKCksIG5zUHJlZml4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5pc0F0dHJpYnV0ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAidHlwZSBvZiAiICsgY29udGFpbmVyLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSArICIgYXR0cmlidXRlIGluICIgKyByZWFkYWJsZShvdXRlclR5cGUsIG5zUHJlZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gInR5cGUgb2YgIiArIGNvbnRhaW5lci5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiIGVsZW1lbnQgaW4gIiArIHJlYWRhYmxlKG91dGVyVHlwZSwgbnNQcmVmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG91dGVyVHlwZS5nZXRCYXNlVHlwZSgpID09IHNUeXBlKQotICAgICAgICAgICAgcmV0dXJuICJiYXNlIHR5cGUgb2YgIiArIHJlYWRhYmxlKG91dGVyVHlwZSwgbnNQcmVmaXgpOwotICAgICAgICBlbHNlIGlmIChvdXRlclR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCkKLSAgICAgICAgICAgIHJldHVybiAiaXRlbSB0eXBlIG9mICIgKyByZWFkYWJsZShvdXRlclR5cGUsIG5zUHJlZml4KTsKLSAgICAgICAgZWxzZSBpZiAob3V0ZXJUeXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLlVOSU9OKQotICAgICAgICAgICAgcmV0dXJuICJtZW1iZXIgdHlwZSAiICsgc1R5cGUuZ2V0QW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsKCkgKyAiIG9mICIgKyByZWFkYWJsZShvdXRlclR5cGUsIG5zUHJlZml4KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuICJpbm5lciB0eXBlIGluICIgKyByZWFkYWJsZShvdXRlclR5cGUsIG5zUHJlZml4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkYWJsZShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlYWRhYmxlKG5hbWUsIFdFTExfS05PV05fUFJFRklYRVMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRhYmxlKFFOYW1lIG5hbWUsIE1hcCBwcmVmaXhlcykKLSAgICB7Ci0gICAgICAgIGlmIChuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpcHJlZml4ZXMuZ2V0KG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICBpZiAocHJlZml4ICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgIjoiICsgbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgcmV0dXJuIG5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyAiIGluIG5hbWVzcGFjZSAiICsgbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzdWdnZXN0UHJlZml4KFN0cmluZyBuYW1lc3BhY2UpCi0gICAgewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZylXRUxMX0tOT1dOX1BSRUZJWEVTLmdldChuYW1lc3BhY2UpOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgICAgIGludCBsZW4gPSBuYW1lc3BhY2UubGVuZ3RoKCk7Ci0gICAgICAgIGludCBpID0gbmFtZXNwYWNlLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgIGlmIChpID4gMCAmJiBpID09IG5hbWVzcGFjZS5sZW5ndGgoKSAtIDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxlbiA9IGk7Ci0gICAgICAgICAgICBpID0gbmFtZXNwYWNlLmxhc3RJbmRleE9mKCcvJywgaSAtIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgaSArPSAxOyAvLyBza2lwICcvJywgYWxzbyBjb3ZlcnMgLTEgY2FzZS4KLQotICAgICAgICBpZiAobmFtZXNwYWNlLnN0YXJ0c1dpdGgoInd3dy4iLCBpKSkKLSAgICAgICAgewotICAgICAgICAgICAgaSArPSA0OyAvLyAid3d3LiIubGVuZ3RoKCkKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChpIDwgbGVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoWE1MQ2hhci5pc05DTmFtZVN0YXJ0KG5hbWVzcGFjZS5jaGFyQXQoaSkpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaSArPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgZW5kID0gaSArIDE7IGVuZCA8IGxlbjsgZW5kICs9IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghWE1MQ2hhci5pc05DTmFtZShuYW1lc3BhY2UuY2hhckF0KGVuZCkpIHx8ICFDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KG5hbWVzcGFjZS5jaGFyQXQoZW5kKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVuID0gZW5kOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcHJlZml4ZXMgc3RhcnRpbmcgd2l0aCAieG1sIiBhcmUgZm9yYmlkZGVuLCBzbyBjaGFuZ2UgInhtbHMiIC0+ICJ4cyIKLSAgICAgICAgaWYgKG5hbWVzcGFjZS5sZW5ndGgoKSA+PSBpICsgMyAmJiBzdGFydHNXaXRoWG1sKG5hbWVzcGFjZSwgaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2UubGVuZ3RoKCkgPj0gaSArIDQpCi0gICAgICAgICAgICAgICAgcmV0dXJuICJ4IiArIENoYXJhY3Rlci50b0xvd2VyQ2FzZShuYW1lc3BhY2UuY2hhckF0KGkgKyAzKSk7Ci0gICAgICAgICAgICByZXR1cm4gIm5zIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsZW4gLSBpID4gNCkgLy8gZm91ciBvciBsZXNzPyBsZWF2ZSBpdC4KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzVm93ZWwobmFtZXNwYWNlLmNoYXJBdChpICsgMikpICYmICFpc1Zvd2VsKG5hbWVzcGFjZS5jaGFyQXQoaSArIDMpKSkKLSAgICAgICAgICAgICAgICBsZW4gPSBpICsgNDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBsZW4gPSBpICsgMzsgLy8gbW9yZSB0aGFuIGZvdXI/IHRydW5jYXRlIHRvIDMuCi0gICAgICAgIH0KLQotICAgICAgICBpbnQgbjsKLQotICAgICAgICBpZiAobGVuIC0gaSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuICJucyI7Ci0KLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZS5zdWJzdHJpbmcoaSwgbGVuKS50b0xvd2VyQ2FzZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RhcnRzV2l0aFhtbChTdHJpbmcgcywgaW50IGkpCi0gICAgewotICAgICAgICBpZiAocy5sZW5ndGgoKSA8IGkgKyAzKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmIChzLmNoYXJBdChpKSAhPSAnWCcgJiYgcy5jaGFyQXQoaSkgIT0gJ3gnKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAocy5jaGFyQXQoaSArIDEpICE9ICdNJyAmJiBzLmNoYXJBdChpICsgMSkgIT0gJ20nKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAocy5jaGFyQXQoaSArIDIpICE9ICdMJyAmJiBzLmNoYXJBdChpICsgMikgIT0gJ2wnKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWb3dlbChjaGFyIGNoKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChjaCkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAnYSc6Ci0gICAgICAgICAgICBjYXNlICdlJzoKLSAgICAgICAgICAgIGNhc2UgJ2knOgotICAgICAgICAgICAgY2FzZSAnbyc6Ci0gICAgICAgICAgICBjYXNlICd1JzoKLSAgICAgICAgICAgIGNhc2UgJ0EnOgotICAgICAgICAgICAgY2FzZSAnRSc6Ci0gICAgICAgICAgICBjYXNlICdJJzoKLSAgICAgICAgICAgIGNhc2UgJ08nOgotICAgICAgICAgICAgY2FzZSAnVSc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5hbWVzcGFjZShTY2hlbWFUeXBlIHNUeXBlKQotICAgIHsKLSAgICAgICAgd2hpbGUgKHNUeXBlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzVHlwZS5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gc1R5cGUuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKHNUeXBlLmdldENvbnRhaW5lckZpZWxkKCkgIT0gbnVsbCAmJiBzVHlwZS5nZXRDb250YWluZXJGaWVsZCgpLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNUeXBlLmdldENvbnRhaW5lckZpZWxkKCkuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgc1R5cGUgPSBzVHlwZS5nZXRPdXRlclR5cGUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1JlYWRlcklucHV0U3RyZWFtLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vUmVhZGVySW5wdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ3ODJmNS4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vUmVhZGVySW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFJlYWRlcklucHV0U3RyZWFtIGV4dGVuZHMgUHVzaGVkSW5wdXRTdHJlYW0KLXsKLSAgICBwcml2YXRlIFJlYWRlciByZWFkZXI7Ci0gICAgcHJpdmF0ZSBXcml0ZXIgd3JpdGVyOwotICAgIHByaXZhdGUgY2hhcltdIGJ1ZjsKLSAgICBwdWJsaWMgc3RhdGljIGludCBkZWZhdWx0QnVmZmVyU2l6ZSA9IDIwNDg7Ci0KLSAgICBwdWJsaWMgUmVhZGVySW5wdXRTdHJlYW0oUmVhZGVyIHJlYWRlciwgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhpcyhyZWFkZXIsIGVuY29kaW5nLCBkZWZhdWx0QnVmZmVyU2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlYWRlcklucHV0U3RyZWFtKFJlYWRlciByZWFkZXIsIFN0cmluZyBlbmNvZGluZywgaW50IGJ1ZmZlclNpemUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoYnVmZmVyU2l6ZSA8PSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnVmZmVyIHNpemUgPD0gMCIpOwotCi0gICAgICAgIHRoaXMucmVhZGVyID0gcmVhZGVyOwotICAgICAgICB0aGlzLndyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZ2V0T3V0cHV0U3RyZWFtKCksIGVuY29kaW5nKTsKLSAgICAgICAgYnVmID0gbmV3IGNoYXJbYnVmZmVyU2l6ZV07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmlsbChpbnQgcmVxdWVzdGVkQnl0ZXMpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNoYXJzID0gcmVhZGVyLnJlYWQoYnVmKTsKLSAgICAgICAgICAgIGlmIChjaGFycyA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICB3cml0ZXIud3JpdGUoYnVmLCAwLCBjaGFycyk7Ci0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoYXZhaWxhYmxlKCkgPD0gMCk7IC8vIGxvb3AgZm9yIHNhZmV0eSwgaW4gY2FzZSBlbmNvZGluZyBkaWRuJ3QgcHJvZHVjZSBhbnkgYnl0ZXMgeWV0Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1NuaWZmZWRYbWxJbnB1dFN0cmVhbS5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1NuaWZmZWRYbWxJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWZjZjhkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9TbmlmZmVkWG1sSW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci0KLXB1YmxpYyBjbGFzcyBTbmlmZmVkWG1sSW5wdXRTdHJlYW0gZXh0ZW5kcyBCdWZmZXJlZElucHV0U3RyZWFtCi17Ci0gICAgLy8gV2UgZG9uJ3Qgc25pZmYgbW9yZSB0aGFuIDE5MiBieXRlcy4KLSAgICBwdWJsaWMgc3RhdGljIGludCBNQVhfU05JRkZFRF9CWVRFUyA9IDE5MjsKLQotICAgIHB1YmxpYyBTbmlmZmVkWG1sSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyKHN0cmVhbSk7Ci0KLSAgICAgICAgLy8gcmVhZCBieXRlIG9yZGVyIG1hcmtzIGFuZCBkZXRlY3QgRUJDRElDIGV0YwotICAgICAgICBfZW5jb2RpbmcgPSBzbmlmZkZvdXJCeXRlcygpOwotCi0gICAgICAgIGlmIChfZW5jb2RpbmcgIT0gbnVsbCAmJiBfZW5jb2RpbmcuZXF1YWxzKCJJQk0wMzciKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gRmlyc3QgZm91ciBieXRlcyBzdWdnZXN0IEVCQ0RJQyB3aXRoIDw/eG0gYXQgc3RhcnQKLSAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZyA9IHNuaWZmRm9yWG1sRGVjbChfZW5jb2RpbmcpOwotICAgICAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpCi0gICAgICAgICAgICAgICAgX2VuY29kaW5nID0gZW5jb2Rpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX2VuY29kaW5nID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEhhdmVuJ3QgeWV0IGRldGVybWluZWQgZW5jb2Rpbmc6IHNuaWZmIGZvciA8P3htbCBlbmNvZGluZz0iLi4uIj8+Ci0gICAgICAgICAgICAvLyBhc3N1bWluZyB3ZSBjYW4gcmVhZCBpdCBhcyBVVEYtOC4KLSAgICAgICAgICAgIF9lbmNvZGluZyA9IHNuaWZmRm9yWG1sRGVjbCgiVVRGLTgiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfZW5jb2RpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhlIFhNTCBzcGVjIHNheXMgdGhlc2UgdHdvIHRoaW5nczoKLQotICAgICAgICAgICAgLy8gKDEpICJJbiB0aGUgYWJzZW5jZSBvZiBleHRlcm5hbCBjaGFyYWN0ZXIgZW5jb2RpbmcgaW5mb3JtYXRpb24KLSAgICAgICAgICAgIC8vIChzdWNoIGFzIE1JTUUgaGVhZGVycyksIHBhcnNlZCBlbnRpdGllcyB3aGljaCBhcmUgc3RvcmVkIGluIGFuCi0gICAgICAgICAgICAvLyBlbmNvZGluZyBvdGhlciB0aGFuIFVURi04IG9yIFVURi0xNiBtdXN0IGJlZ2luIHdpdGggYSB0ZXh0Ci0gICAgICAgICAgICAvLyBkZWNsYXJhdGlvbiAoc2VlIDQuMy4xIFRoZSBUZXh0IERlY2xhcmF0aW9uKSBjb250YWluaW5nIGFuCi0gICAgICAgICAgICAvLyBlbmNvZGluZyBkZWNsYXJhdGlvbjoiCi0KLSAgICAgICAgICAgIC8vICgyKSAiSW4gdGhlIGFic2VuY2Ugb2YgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgYW4gZXh0ZXJuYWwKLSAgICAgICAgICAgIC8vIHRyYW5zcG9ydCBwcm90b2NvbCAoZS5nLiBIVFRQIG9yIE1JTUUpLCBpdCBpcyBhbiBlcnJvcgotICAgICAgICAgICAgLy8gZm9yIGFuIGVudGl0eSBpbmNsdWRpbmcgYW4gZW5jb2RpbmcgZGVjbGFyYXRpb24gdG8gYmUKLSAgICAgICAgICAgIC8vIHByZXNlbnRlZCB0byB0aGUgWE1MIHByb2Nlc3NvciBpbiBhbiBlbmNvZGluZyBvdGhlciB0aGFuCi0gICAgICAgICAgICAvLyB0aGF0IG5hbWVkIGluIHRoZSBkZWNsYXJhdGlvbiwgb3IgZm9yIGFuIGVudGl0eSB3aGljaCBiZWdpbnMKLSAgICAgICAgICAgIC8vIHdpdGggbmVpdGhlciBhIEJ5dGUgT3JkZXIgTWFyayBub3IgYW4gZW5jb2RpbmcgZGVjbGFyYXRpb24KLSAgICAgICAgICAgIC8vIHRvIHVzZSBhbiBlbmNvZGluZyBvdGhlciB0aGFuIFVURi04LiIKLQotICAgICAgICAgICAgLy8gU2luY2Ugd2UncmUgdXNpbmcgYSBzbmlmZmVkIHN0cmVhbSwgd2UgZG8gbm90IGhhdmUgZXh0ZXJuYWwKLSAgICAgICAgICAgIC8vIGNoYXJhY3RlciBlbmNvZGluZyBpbmZvcm1hdGlvbi4KLQotICAgICAgICAgICAgLy8gU2luY2Ugd2UncmUgaGVyZSwgd2UgYWxzbyBkb24ndCBoYXZlIGEgcmVjb2duaXplZCBieXRlIG9yZGVyCi0gICAgICAgICAgICAvLyBtYXJrIG9yIGFuIGV4cGxpY2l0IGVuY29kaW5nIGRlY2xhcmF0aW9uIHRoYXQgY2FuIGJlIHJlYWQgaW4KLSAgICAgICAgICAgIC8vIGVpdGhlciBBU0NJSSBvciBFQkRJQyBzdHlsZS4KLQotICAgICAgICAgICAgLy8gVGhlcmVmb3JlLCB3ZSBtdXN0IHVzZSBVVEYtOC4KLQotICAgICAgICAgICAgX2VuY29kaW5nID0gIlVURi04IjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IHJlYWRBc011Y2hBc1Bvc3NpYmxlKGJ5dGVbXSBidWYsIGludCBzdGFydEF0LCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGludCB0b3RhbCA9IDA7Ci0gICAgICAgIHdoaWxlICh0b3RhbCA8IGxlbikKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNvdW50ID0gcmVhZChidWYsIHN0YXJ0QXQgKyB0b3RhbCwgbGVuIC0gdG90YWwpOwotICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHRvdGFsICs9IGNvdW50OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b3RhbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzbmlmZkZvdXJCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbWFyayg0KTsKLSAgICAgICAgaW50IHNraXAgPSAwOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzRdOwotICAgICAgICAgICAgaWYgKHJlYWRBc011Y2hBc1Bvc3NpYmxlKGJ1ZiwgMCwgNCkgPCA0KQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgbG9uZyByZXN1bHQgPSAweEZGMDAwMDAwICYgKGJ1ZlswXSA8PCAyNCkgfCAweDAwRkYwMDAwICYgKGJ1ZlsxXSA8PCAxNikgfCAweDAwMDBGRjAwICYgKGJ1ZlsyXSA8PCA4KSB8IDB4MDAwMDAwRkYgJiBidWZbM107Ci0KLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMHgwMDAwRkVGRikKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVDUy00IjsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSAweEZGRkUwMDAwKQotICAgICAgICAgICAgICAgIHJldHVybiAiVUNTLTQiOwotICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ID09IDB4MDAwMDAwM0MpCi0gICAgICAgICAgICAgICAgcmV0dXJuICJVQ1MtNEJFIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSAweDNDMDAwMDAwKQotICAgICAgICAgICAgICAgIHJldHVybiAiVUNTLTRMRSI7Ci0gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gMHgwMDNDMDAzRikKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVURi0xNkJFIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSAweDNDMDAzRjAwKQotICAgICAgICAgICAgICAgIHJldHVybiAiVVRGLTE2TEUiOwotICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ID09IDB4M0MzRjc4NkQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIGxvb2tzIGxpa2UgVVMtQVNDSUkgd2l0aCA8P3htbDogc25pZmYKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSAweDRDNkZBNzk0KQotICAgICAgICAgICAgICAgIHJldHVybiAiSUJNMDM3IjsgLy8gU25pZmYgZm9yIGViZGljIGNvZGVwYWdlCi0gICAgICAgICAgICBlbHNlIGlmICgocmVzdWx0ICYgMHhGRkZGMDAwMCkgPT0gMHhGRUZGMDAwMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVURi0xNiI7Ci0gICAgICAgICAgICBlbHNlIGlmICgocmVzdWx0ICYgMHhGRkZGMDAwMCkgPT0gMHhGRkZFMDAwMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVURi0xNiI7Ci0gICAgICAgICAgICBlbHNlIGlmICgocmVzdWx0ICYgMHhGRkZGRkYwMCkgPT0gMHhFRkJCQkYwMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVURi04IjsKLSAgICAgICAgICAgIGVsc2UgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICByZXNldCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQlVHQlVHIGluIEpESzogQ2hhcnNldC5mb3JOYW1lIGlzIG5vdCB0aHJlYWRzYWZlLCBzbyB3ZSdsbCBwcmltZSBpdAotICAgIC8vIHdpdGggdGhlIGNvbW1vbiBjaGFyc2V0cy4KLQotICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXQgZHVtbXkxID0gQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpOwotICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXQgZHVtbXkyID0gQ2hhcnNldC5mb3JOYW1lKCJVVEYtMTYiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15MyA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTE2QkUiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15NCA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTE2TEUiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15NSA9IENoYXJzZXQuZm9yTmFtZSgiSVNPLTg4NTktMSIpOwotICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXQgZHVtbXk2ID0gQ2hhcnNldC5mb3JOYW1lKCJVUy1BU0NJSSIpOwotICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXQgZHVtbXk3ID0gQ2hhcnNldC5mb3JOYW1lKCJDcDEyNTIiKTsKLQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc25pZmZGb3JYbWxEZWNsKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBtYXJrKE1BWF9TTklGRkVEX0JZVEVTKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlYnVmID0gbmV3IGJ5dGVbTUFYX1NOSUZGRURfQllURVNdOwotICAgICAgICAgICAgaW50IGJ5dGVsaW1pdCA9IHJlYWRBc011Y2hBc1Bvc3NpYmxlKGJ5dGVidWYsIDAsIE1BWF9TTklGRkVEX0JZVEVTKTsKLQotICAgICAgICAgICAgLy8gQlVHQlVHIGluIEpESzogQ2hhcnNldC5mb3JOYW1lIGlzIG5vdCB0aHJlYWRzYWZlLgotICAgICAgICAgICAgQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGVuY29kaW5nKTsKLSAgICAgICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVidWYsIDAsIGJ5dGVsaW1pdCksIGNoYXJzZXQpOwotICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyW2J5dGVsaW1pdF07Ci0gICAgICAgICAgICBpbnQgbGltaXQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGxpbWl0IDwgYnl0ZWxpbWl0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IHJlYWRlci5yZWFkKGJ1ZiwgbGltaXQsIGJ5dGVsaW1pdCAtIGxpbWl0KTsKLSAgICAgICAgICAgICAgICBpZiAoY291bnQgPCAwKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBsaW1pdCArPSBjb3VudDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RYbWxEZWNsRW5jb2RpbmcoYnVmLCAwLCBsaW1pdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICByZXNldCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2VuY29kaW5nOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRYbWxFbmNvZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gX2VuY29kaW5nOwotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIFN0cmluZyBleHRyYWN0WG1sRGVjbEVuY29kaW5nKGNoYXJbXSBidWYsIGludCBvZmZzZXQsIGludCBzaXplKQotICAgIHsKLSAgICAgICAgaW50IGxpbWl0ID0gb2Zmc2V0ICsgc2l6ZTsKLSAgICAgICAgaW50IHhtbHBpID0gZmlyc3RJbmRleE9mKCI8P3htbCIsIGJ1Ziwgb2Zmc2V0LCBsaW1pdCk7Ci0gICAgICAgIGlmICh4bWxwaSA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaSA9IHhtbHBpICsgNTsKLSAgICAgICAgICAgIFNjYW5uZWRBdHRyaWJ1dGUgYXR0ciA9IG5ldyBTY2FubmVkQXR0cmlidXRlKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaSA8IGxpbWl0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkgPSBzY2FuQXR0cmlidXRlKGJ1ZiwgaSwgbGltaXQsIGF0dHIpOwotICAgICAgICAgICAgICAgIGlmIChpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHIubmFtZS5lcXVhbHMoImVuY29kaW5nIikpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyLnZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaXJzdEluZGV4T2YoU3RyaW5nIHMsIGNoYXJbXSBidWYsIGludCBzdGFydEF0LCBpbnQgbGltaXQpCi0gICAgewotICAgICAgICBhc3NlcnQocy5sZW5ndGgoKSA+IDApOwotICAgICAgICBjaGFyW10gbG9va0ZvciA9IHMudG9DaGFyQXJyYXkoKTsKLQotICAgICAgICBjaGFyIGZpcnN0Y2hhciA9IGxvb2tGb3JbMF07Ci0gICAgICAgIHNlYXJjaGluZzogZm9yIChsaW1pdCAtPSBsb29rRm9yLmxlbmd0aDsgc3RhcnRBdCA8IGxpbWl0OyBzdGFydEF0KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChidWZbc3RhcnRBdF0gPT0gZmlyc3RjaGFyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbG9va0Zvci5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWZbc3RhcnRBdCArIGldICE9IGxvb2tGb3JbaV0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHNlYXJjaGluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRBdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbmV4dE5vbm1hdGNoaW5nQnl0ZShjaGFyW10gbG9va0ZvciwgY2hhcltdIGJ1ZiwgaW50IHN0YXJ0QXQsIGludCBsaW1pdCkKLSAgICB7Ci0gICAgICAgIHNlYXJjaGluZzogZm9yICg7IHN0YXJ0QXQgPCBsaW1pdDsgc3RhcnRBdCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgdGhpc2NoYXIgPSBidWZbc3RhcnRBdF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvb2tGb3IubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKHRoaXNjaGFyID09IGxvb2tGb3JbaV0pCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHNlYXJjaGluZzsKLSAgICAgICAgICAgIHJldHVybiBzdGFydEF0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbmV4dE1hdGNoaW5nQnl0ZShjaGFyW10gbG9va0ZvciwgY2hhcltdIGJ1ZiwgaW50IHN0YXJ0QXQsIGludCBsaW1pdCkKLSAgICB7Ci0gICAgICAgIHNlYXJjaGluZzogZm9yICg7IHN0YXJ0QXQgPCBsaW1pdDsgc3RhcnRBdCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgdGhpc2NoYXIgPSBidWZbc3RhcnRBdF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvb2tGb3IubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKHRoaXNjaGFyID09IGxvb2tGb3JbaV0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFydEF0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbmV4dE1hdGNoaW5nQnl0ZShjaGFyIGxvb2tGb3IsIGNoYXJbXSBidWYsIGludCBzdGFydEF0LCBpbnQgbGltaXQpCi0gICAgewotICAgICAgICBzZWFyY2hpbmc6IGZvciAoOyBzdGFydEF0IDwgbGltaXQ7IHN0YXJ0QXQrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJ1ZltzdGFydEF0XSA9PSBsb29rRm9yKQotICAgICAgICAgICAgICAgIHJldHVybiBzdGFydEF0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgY2hhcltdIFdISVRFU1BBQ0UgPSBuZXcgY2hhcltdIHsgJyAnLCAnXHInLCAnXHQnLCAnXG4nIH07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgY2hhcltdIE5PVE5BTUUgPSBuZXcgY2hhcltdIHsgJz0nLCAnICcsICdccicsICdcdCcsICdcbicsICc/JywgJz4nLCAnPCcsICdcJycsICdcIicgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNjYW5uZWRBdHRyaWJ1dGUKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKLSAgICAgICAgcHVibGljIFN0cmluZyB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgc2NhbkF0dHJpYnV0ZShjaGFyW10gYnVmLCBpbnQgc3RhcnRBdCwgaW50IGxpbWl0LCBTY2FubmVkQXR0cmlidXRlIGF0dHIpCi0gICAgewotICAgICAgICBpbnQgbmFtZVN0YXJ0ID0gbmV4dE5vbm1hdGNoaW5nQnl0ZShXSElURVNQQUNFLCBidWYsIHN0YXJ0QXQsIGxpbWl0KTsKLSAgICAgICAgaWYgKG5hbWVTdGFydCA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGludCBuYW1lRW5kID0gbmV4dE1hdGNoaW5nQnl0ZShOT1ROQU1FLCBidWYsIG5hbWVTdGFydCwgbGltaXQpOwotICAgICAgICBpZiAobmFtZUVuZCA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGludCBlcXVhbHMgPSBuZXh0Tm9ubWF0Y2hpbmdCeXRlKFdISVRFU1BBQ0UsIGJ1ZiwgbmFtZUVuZCwgbGltaXQpOwotICAgICAgICBpZiAoZXF1YWxzIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKGJ1ZltlcXVhbHNdICE9ICc9JykKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaW50IHZhbFF1b3RlID0gbmV4dE5vbm1hdGNoaW5nQnl0ZShXSElURVNQQUNFLCBidWYsIGVxdWFscyArIDEsIGxpbWl0KTsKLSAgICAgICAgaWYgKGJ1Zlt2YWxRdW90ZV0gIT0gJ1wnJyAmJiBidWZbdmFsUXVvdGVdICE9ICdcIicpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGludCB2YWxFbmRxdW90ZSA9IG5leHRNYXRjaGluZ0J5dGUoYnVmW3ZhbFF1b3RlXSwgYnVmLCB2YWxRdW90ZSArIDEsIGxpbWl0KTsKLSAgICAgICAgaWYgKHZhbEVuZHF1b3RlIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgYXR0ci5uYW1lID0gbmV3IFN0cmluZyhidWYsIG5hbWVTdGFydCwgbmFtZUVuZCAtIG5hbWVTdGFydCk7Ci0gICAgICAgIGF0dHIudmFsdWUgPSBuZXcgU3RyaW5nKGJ1ZiwgdmFsUXVvdGUgKyAxLCB2YWxFbmRxdW90ZSAtIHZhbFF1b3RlIC0gMSk7Ci0gICAgICAgIHJldHVybiB2YWxFbmRxdW90ZSArIDE7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1NuaWZmZWRYbWxSZWFkZXIuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9TbmlmZmVkWG1sUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYzQ2MTkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1NuaWZmZWRYbWxSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotCi1wdWJsaWMgY2xhc3MgU25pZmZlZFhtbFJlYWRlciBleHRlbmRzIEJ1ZmZlcmVkUmVhZGVyCi17Ci0gICAgLy8gV2UgZG9uJ3Qgc25pZmYgbW9yZSB0aGFuIDE5MiBieXRlcy4KLSAgICBwdWJsaWMgc3RhdGljIGludCBNQVhfU05JRkZFRF9DSEFSUyA9IDE5MjsKLQotICAgIHB1YmxpYyBTbmlmZmVkWG1sUmVhZGVyKFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIocmVhZGVyKTsKLSAgICAgICAgX2VuY29kaW5nID0gc25pZmZGb3JYbWxEZWNsKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgcmVhZEFzTXVjaEFzUG9zc2libGUoY2hhcltdIGJ1ZiwgaW50IHN0YXJ0QXQsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW50IHRvdGFsID0gMDsKLSAgICAgICAgd2hpbGUgKHRvdGFsIDwgbGVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSByZWFkKGJ1Ziwgc3RhcnRBdCArIHRvdGFsLCBsZW4gLSB0b3RhbCk7Ci0gICAgICAgICAgICBpZiAoY291bnQgPCAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgdG90YWwgKz0gY291bnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRvdGFsOwotICAgIH0KLQotICAgIC8vIEJVR0JVRyBpbiBKREs6IENoYXJzZXQuZm9yTmFtZSBpcyBub3QgdGhyZWFkc2FmZSwgc28gd2UnbGwgcHJpbWUgaXQKLSAgICAvLyB3aXRoIHRoZSBjb21tb24gY2hhcnNldHMuCi0KLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15MSA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15MiA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTE2Iik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTMgPSBDaGFyc2V0LmZvck5hbWUoIlVURi0xNkJFIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTQgPSBDaGFyc2V0LmZvck5hbWUoIlVURi0xNkxFIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTUgPSBDaGFyc2V0LmZvck5hbWUoIklTTy04ODU5LTEiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15NiA9IENoYXJzZXQuZm9yTmFtZSgiVVMtQVNDSUkiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15NyA9IENoYXJzZXQuZm9yTmFtZSgiQ3AxMjUyIik7Ci0KLQotICAgIHByaXZhdGUgU3RyaW5nIHNuaWZmRm9yWG1sRGVjbCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbWFyayhNQVhfU05JRkZFRF9DSEFSUyk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbTUFYX1NOSUZGRURfQ0hBUlNdOwotICAgICAgICAgICAgaW50IGxpbWl0ID0gcmVhZEFzTXVjaEFzUG9zc2libGUoYnVmLCAwLCBNQVhfU05JRkZFRF9DSEFSUyk7Ci0gICAgICAgICAgICByZXR1cm4gU25pZmZlZFhtbElucHV0U3RyZWFtLmV4dHJhY3RYbWxEZWNsRW5jb2RpbmcoYnVmLCAwLCBsaW1pdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICByZXNldCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2VuY29kaW5nOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRYbWxFbmNvZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gX2VuY29kaW5nOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9WYWxpZGF0aW9uQ29udGV4dC5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1ZhbGlkYXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYjgwYzIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1ZhbGlkYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbkNvbnRleHQKLXsKLSAgICBwdWJsaWMgdm9pZCBpbnZhbGlkICggU3RyaW5nIG1lc3NhZ2UgKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vVmFsaWRhdG9yTGlzdGVuZXIuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9WYWxpZGF0b3JMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDllYmUxLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9WYWxpZGF0b3JMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBGaXJzdCBldmVudCBtdXN0IGJlIGEgQkVHSU4gd2l0aCBubyBuYW1lICh0byBjb21tdW5pY2F0ZSBhbnkgeHNpCi0gKiBpbmZvcm1hdGlvbikuICBCRUdJTiBhbmQgRU5EIG5lZWQgdG8gbWF0Y2guCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0b3JMaXN0ZW5lcgotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFR0lOICAgID0gMTsgLy8gQmVnaW4gZWxlbWVudAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVORCAgICAgID0gMjsgLy8gRW5kIGVsZW1lbnQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUICAgICA9IDM7IC8vIFRleHQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSICAgICA9IDQ7IC8vIEF0dHIgKG5vbi1uYW1lc3BhY2VzLCBub24geHNpIG9ubHkpCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5EQVRUUlMgPSA1OyAvLyBhZnRlciBCRUdJTiwgYWZ0ZXIgYXR0cnMKLQotICAgIHZvaWQgbmV4dEV2ZW50ICggaW50IGtpbmQsIEV2ZW50IGV2ZW50ICk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFdmVudCBleHRlbmRzIFByZWZpeFJlc29sdmVyCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVTRVJWRSA9IDE7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExBQ0UgID0gMjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MTEFQU0UgPSAzOwotCi0gICAgICAgIFhtbEN1cnNvciBnZXRMb2NhdGlvbkFzQ3Vyc29yICggKTsKLQotICAgICAgICBib29sZWFuIGdldFhzaVR5cGUgICggQ2hhcnMgY2hhcnMgKTsgLy8gQkVHSU4geHNpOnR5cGUKLSAgICAgICAgYm9vbGVhbiBnZXRYc2lOaWwgICAoIENoYXJzIGNoYXJzICk7IC8vIEJFR0lOIHhzaTpuaWwKLSAgICAgICAgYm9vbGVhbiBnZXRYc2lMb2MgICAoIENoYXJzIGNoYXJzICk7IC8vIEJFR0lOIHhzaTpzY2hlbWFMb2NhdGlvbgotICAgICAgICBib29sZWFuIGdldFhzaU5vTG9jICggQ2hhcnMgY2hhcnMgKTsgLy8gQkVHSU4geHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gT24gU1RBUlQgYW5kIEFUVFIKLSAgICAgICAgUU5hbWUgZ2V0TmFtZSAoICk7Ci0gICAgICAgIAotICAgICAgICAvLyBPbiBURVhUIGFuZCBBVFRSCi0gICAgICAgIHZvaWQgZ2V0VGV4dCAoIENoYXJzIGNoYXJzICk7Ci0gICAgICAgIHZvaWQgZ2V0VGV4dCAoIENoYXJzIGNoYXJzLCBpbnQgd3NyICk7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIHRleHRJc1doaXRlc3BhY2UgKCApOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWEJlYW5EZWJ1Zy5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hCZWFuRGVidWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1NjM3ZS4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWEJlYW5EZWJ1Zy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgWEJlYW5EZWJ1ZwotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQUNFX1NDSEVNQV9MT0FESU5HID0gMHgwMDAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRyYWNlUHJvcCA9ICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuZGVidWciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRQcm9wID0gIiI7IC8vICJUUkFDRV9TQ0hFTUFfTE9BRElORyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgX2VuYWJsZWQgPSBpbml0aWFsaXplQml0c0Zyb21Qcm9wZXJ0eSgpOwotICAgIHByaXZhdGUgc3RhdGljIGludCBfaW5kZW50ID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgX2luZGVudHNwYWNlID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGludCBpbml0aWFsaXplQml0c0Zyb21Qcm9wZXJ0eSgpCi0gICAgewotICAgICAgICBpbnQgYml0cyA9IDA7Ci0gICAgICAgIFN0cmluZyBwcm9wID0gU3lzdGVtLmdldFByb3BlcnR5KHRyYWNlUHJvcCwgZGVmYXVsdFByb3ApOwotICAgICAgICBpZiAocHJvcC5pbmRleE9mKCJUUkFDRV9TQ0hFTUFfTE9BRElORyIpID49IDApCi0gICAgICAgICAgICBiaXRzIHw9IFRSQUNFX1NDSEVNQV9MT0FESU5HOwotICAgICAgICByZXR1cm4gYml0czsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIGVuYWJsZShpbnQgYml0cykKLSAgICB7Ci0gICAgICAgIF9lbmFibGVkID0gX2VuYWJsZWQgfCBiaXRzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkaXNhYmxlKGludCBiaXRzKQotICAgIHsKLSAgICAgICAgX2VuYWJsZWQgPSBfZW5hYmxlZCAmIH5iaXRzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShpbnQgYml0cywgU3RyaW5nIG1lc3NhZ2UsIGludCBpbmRlbnQpCi0gICAgewotICAgICAgICBpZiAodGVzdChiaXRzKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChYQmVhbkRlYnVnLmNsYXNzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChpbmRlbnQgPCAwKQotICAgICAgICAgICAgICAgICAgICBfaW5kZW50ICs9IGluZGVudDsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBzcGFjZXMgPSBfaW5kZW50IDwgMCA/ICIiIDogX2luZGVudCA+IF9pbmRlbnRzcGFjZS5sZW5ndGgoKSA/IF9pbmRlbnRzcGFjZSA6IF9pbmRlbnRzcGFjZS5zdWJzdHJpbmcoMCwgX2luZGVudCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxvZ21lc3NhZ2UgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArICI6ICIgKyBzcGFjZXMgKyBtZXNzYWdlICsgIlxuIjsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50KGxvZ21lc3NhZ2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKGluZGVudCA+IDApCi0gICAgICAgICAgICAgICAgICAgIF9pbmRlbnQgKz0gaW5kZW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoaW50IGJpdHMpCi0gICAgewotICAgICAgICByZXR1cm4gKF9lbmFibGVkICYgYml0cykgIT0gMDsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIFByaW50U3RyZWFtIF9lcnI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbG9nKFN0cmluZyBtZXNzYWdlKQotICAgIHsKLSAgICAgICAgbG9nKG1lc3NhZ2UsIG51bGwpOwotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbG9nU3RhY2tUcmFjZShTdHJpbmcgbWVzc2FnZSkKLSAgICB7Ci0gICAgICAgIGxvZyhtZXNzYWdlLCBuZXcgVGhyb3dhYmxlKCkpOwotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIFN0cmluZyBsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBzdGFja1RyYWNlKQotICAgIHsKLSAgICAgICAgaWYgKF9lcnIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsZSBkaWFnbm9zdGljRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInhtbGJlYW5kZWJ1ZyIsICIubG9nIik7Ci0gICAgICAgICAgICAgICAgX2VyciA9IG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShkaWFnbm9zdGljRmlsZSkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRGlhZ25vc3RpYyBYTUwgQmVhbiBkZWJ1ZyBsb2cgZmlsZSBjcmVhdGVkOiAiICsgZGlhZ25vc3RpY0ZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2VyciA9IFN5c3RlbS5lcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgX2Vyci5wcmludGxuKG1lc3NhZ2UpOwotICAgICAgICBpZiAoc3RhY2tUcmFjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGFja1RyYWNlLnByaW50U3RhY2tUcmFjZShfZXJyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUaHJvd2FibGUgbG9nRXhjZXB0aW9uKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgICAgbG9nKHQuZ2V0TWVzc2FnZSgpLCB0KTsKLSAgICAgICAgcmV0dXJuIHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hNTENoYXIuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YTUxDaGFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YTc4OWUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hNTENoYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5MSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBiYXNpYyBYTUwgY2hhcmFjdGVyIHByb3BlcnRpZXMuIFRoZSBkYXRhCi0gKiBpbiB0aGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IGEgY2hhcmFjdGVyIGlzIGEgdmFsaWQKLSAqIFhNTCBjaGFyYWN0ZXIgb3IgaWYgdGhlIGNoYXJhY3RlciBpcyBhIHNwYWNlLCBuYW1lIHN0YXJ0LCBvciBuYW1lCi0gKiBjaGFyYWN0ZXIuCi0gKiA8cD4KLSAqIEEgc2VyaWVzIG9mIGNvbnZlbmllbmNlIG1ldGhvZHMgYXJlIHN1cHBsaWVkIHRvIGVhc2UgdGhlIGJ1cmRlbgotICogb2YgdGhlIGRldmVsb3Blci4gQmVjYXVzZSBpbmxpbmluZyB0aGUgY2hlY2tzIGNhbiBpbXByb3ZlIHBlcgotICogY2hhcmFjdGVyIHBlcmZvcm1hbmNlLCB0aGUgdGFibGVzIG9mIGNoYXJhY3RlciBwcm9wZXJ0aWVzIGFyZQotICogcHVibGljLiBVc2luZyB0aGUgY2hhcmFjdGVyIGFzIGFuIGluZGV4IGludG8gdGhlIDxjb2RlPkNIQVJTPC9jb2RlPgotICogYXJyYXkgYW5kIGFwcGx5aW5nIHRoZSBhcHByb3ByaWF0ZSBtYXNrIGZsYWcgKGUuZy4KLSAqIDxjb2RlPk1BU0tfVkFMSUQ8L2NvZGU+KSwgeWllbGRzIHRoZSBzYW1lIHJlc3VsdHMgYXMgY2FsbGluZyB0aGUKLSAqIGNvbnZlbmllbmNlIG1ldGhvZHMuIFRoZXJlIGlzIG9uZSBleGNlcHRpb246IGNoZWNrIHRoZSBjb21tZW50cwotICogZm9yIHRoZSA8Y29kZT5pc1ZhbGlkPC9jb2RlPiBtZXRob2QgZm9yIGRldGFpbHMuCi0gKgotICogQGF1dGhvciBHbGVubiBNYXJjeSwgSUJNCi0gKiBAYXV0aG9yIEFuZHkgQ2xhcmssIElCTQotICogQGF1dGhvciBFcmljIFllLCBJQk0KLSAqIEBhdXRob3IgQXJuYXVkICBMZSBIb3JzLCBJQk0KLSAqIEBhdXRob3IgUmFodWwgU3JpdmFzdGF2YSwgU3VuIE1pY3Jvc3lzdGVtcyBJbmMuCi0gKgotICogQHZlcnNpb24gJElkOiBYTUxDaGFyLmphdmEsdiAxLjIgMjAwMy8wOS8yNCAyMzozMTowNSBlcmljdmFzIEV4cCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDaGFyIHsKLQotICAgIC8vCi0gICAgLy8gQ29uc3RhbnRzCi0gICAgLy8KLQotICAgIC8qKiBDaGFyYWN0ZXIgZmxhZ3MuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIENIQVJTID0gbmV3IGJ5dGVbMSA8PCAxNl07Ci0KLSAgICAvKiogVmFsaWQgY2hhcmFjdGVyIG1hc2suICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19WQUxJRCA9IDB4MDE7Ci0KLSAgICAvKiogU3BhY2UgY2hhcmFjdGVyIG1hc2suICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19TUEFDRSA9IDB4MDI7Ci0KLSAgICAvKiogTmFtZSBzdGFydCBjaGFyYWN0ZXIgbWFzay4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX05BTUVfU1RBUlQgPSAweDA0OwotCi0gICAgLyoqIE5hbWUgY2hhcmFjdGVyIG1hc2suICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19OQU1FID0gMHgwODsKLQotICAgIC8qKiBQdWJpZCBjaGFyYWN0ZXIgbWFzay4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX1BVQklEID0gMHgxMDsKLSAgICAKLSAgICAvKiogCi0gICAgICogQ29udGVudCBjaGFyYWN0ZXIgbWFzay4gU3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSB0aG9zZSB0aGF0IGNhbgotICAgICAqIGJlIGNvbnNpZGVyZWQgdGhlIHN0YXJ0IG9mIG1hcmt1cCwgc3VjaCBhcyAnJmx0OycgYW5kICcmYW1wOycuIAotICAgICAqIFRoZSB2YXJpb3VzIG5ld2xpbmUgY2hhcmFjdGVycyBhcmUgY29uc2lkZXJlZCBzcGVjaWFsIGFzIHdlbGwuCi0gICAgICogQWxsIG90aGVyIHZhbGlkIFhNTCBjaGFyYWN0ZXJzIGNhbiBiZSBjb25zaWRlcmVkIGNvbnRlbnQuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gZm9yIHRoZSBpbm5lciBsb29wIG9mIGNoYXJhY3RlciBzY2FubmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX0NPTlRFTlQgPSAweDIwOwotCi0gICAgLyoqIE5DTmFtZSBzdGFydCBjaGFyYWN0ZXIgbWFzay4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX05DTkFNRV9TVEFSVCA9IDB4NDA7Ci0KLSAgICAvKiogTkNOYW1lIGNoYXJhY3RlciBtYXNrLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BU0tfTkNOQU1FID0gMHg4MDsKLQotICAgIC8vCi0gICAgLy8gU3RhdGljIGluaXRpYWxpemF0aW9uCi0gICAgLy8KLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICAvLyBbMl0gQ2hhciA6Oj0gI3g5IHwgI3hBIHwgI3hEIHwgWyN4MjAtI3hEN0ZGXSB8Ci0gICAgICAgIC8vICAgICAgICAgICAgICBbI3hFMDAwLSN4RkZGRF0gfCBbI3gxMDAwMC0jeDEwRkZGRl0KLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgY2hhclJhbmdlW10gPSB7IAotICAgICAgICAgICAgMHgwMDA5LCAweDAwMEEsIDB4MDAwRCwgMHgwMDBELCAweDAwMjAsIDB4RDdGRiwgMHhFMDAwLCAweEZGRkQsCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gWzNdIFMgOjo9ICgjeDIwIHwgI3g5IHwgI3hEIHwgI3hBKSsKLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgc3BhY2VDaGFyW10gPSB7IAotICAgICAgICAgICAgMHgwMDIwLCAweDAwMDksIDB4MDAwRCwgMHgwMDBBLAotICAgICAgICB9OwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFs0XSBOYW1lQ2hhciA6Oj0gTGV0dGVyIHwgRGlnaXQgfCAnLicgfCAnLScgfCAnXycgfCAnOicgfAotICAgICAgICAvLyAgICAgICAgICAgICAgICAgIENvbWJpbmluZ0NoYXIgfCBFeHRlbmRlcgotICAgICAgICAvLwotCi0gICAgICAgIGludCBuYW1lQ2hhcltdID0geyAKLSAgICAgICAgICAgIDB4MDAyRCwgMHgwMDJFLCAvLyAnLScgYW5kICcuJwotICAgICAgICB9OwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFs1XSBOYW1lIDo6PSAoTGV0dGVyIHwgJ18nIHwgJzonKSAoTmFtZUNoYXIpKgotICAgICAgICAvLwotCi0gICAgICAgIGludCBuYW1lU3RhcnRDaGFyW10gPSB7IAotICAgICAgICAgICAgMHgwMDNBLCAweDAwNUYsIC8vICc6JyBhbmQgJ18nCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gWzEzXSBQdWJpZENoYXIgOjo9ICN4MjAgfCAweEQgfCAweEEgfCBbYS16QS1aMC05XSB8IFstJygpKywuLzo9PzshKiNAJF8lXQotICAgICAgICAvLwotCi0gICAgICAgIGludCBwdWJpZENoYXJbXSA9IHsKLSAgICAgICAgICAgIDB4MDAwQSwgMHgwMDBELCAweDAwMjAsIDB4MDAyMSwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDNELAotICAgICAgICAgICAgMHgwMDVGCi0gICAgICAgIH07Ci0KLSAgICAgICAgaW50IHB1YmlkUmFuZ2VbXSA9IHsKLSAgICAgICAgICAgIDB4MDAyNywgMHgwMDNCLCAweDAwM0YsIDB4MDA1QSwgMHgwMDYxLCAweDAwN0EKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBbODRdIExldHRlciA6Oj0gQmFzZUNoYXIgfCBJZGVvZ3JhcGhpYwotICAgICAgICAvLwotCi0gICAgICAgIGludCBsZXR0ZXJSYW5nZVtdID0gewotICAgICAgICAgICAgLy8gQmFzZUNoYXIKLSAgICAgICAgICAgIDB4MDA0MSwgMHgwMDVBLCAweDAwNjEsIDB4MDA3QSwgMHgwMEMwLCAweDAwRDYsIDB4MDBEOCwgMHgwMEY2LAotICAgICAgICAgICAgMHgwMEY4LCAweDAxMzEsIDB4MDEzNCwgMHgwMTNFLCAweDAxNDEsIDB4MDE0OCwgMHgwMTRBLCAweDAxN0UsCi0gICAgICAgICAgICAweDAxODAsIDB4MDFDMywgMHgwMUNELCAweDAxRjAsIDB4MDFGNCwgMHgwMUY1LCAweDAxRkEsIDB4MDIxNywKLSAgICAgICAgICAgIDB4MDI1MCwgMHgwMkE4LCAweDAyQkIsIDB4MDJDMSwgMHgwMzg4LCAweDAzOEEsIDB4MDM4RSwgMHgwM0ExLAotICAgICAgICAgICAgMHgwM0EzLCAweDAzQ0UsIDB4MDNEMCwgMHgwM0Q2LCAweDAzRTIsIDB4MDNGMywgMHgwNDAxLCAweDA0MEMsCi0gICAgICAgICAgICAweDA0MEUsIDB4MDQ0RiwgMHgwNDUxLCAweDA0NUMsIDB4MDQ1RSwgMHgwNDgxLCAweDA0OTAsIDB4MDRDNCwKLSAgICAgICAgICAgIDB4MDRDNywgMHgwNEM4LCAweDA0Q0IsIDB4MDRDQywgMHgwNEQwLCAweDA0RUIsIDB4MDRFRSwgMHgwNEY1LAotICAgICAgICAgICAgMHgwNEY4LCAweDA0RjksIDB4MDUzMSwgMHgwNTU2LCAweDA1NjEsIDB4MDU4NiwgMHgwNUQwLCAweDA1RUEsCi0gICAgICAgICAgICAweDA1RjAsIDB4MDVGMiwgMHgwNjIxLCAweDA2M0EsIDB4MDY0MSwgMHgwNjRBLCAweDA2NzEsIDB4MDZCNywKLSAgICAgICAgICAgIDB4MDZCQSwgMHgwNkJFLCAweDA2QzAsIDB4MDZDRSwgMHgwNkQwLCAweDA2RDMsIDB4MDZFNSwgMHgwNkU2LAotICAgICAgICAgICAgMHgwOTA1LCAweDA5MzksIDB4MDk1OCwgMHgwOTYxLCAweDA5ODUsIDB4MDk4QywgMHgwOThGLCAweDA5OTAsCi0gICAgICAgICAgICAweDA5OTMsIDB4MDlBOCwgMHgwOUFBLCAweDA5QjAsIDB4MDlCNiwgMHgwOUI5LCAweDA5REMsIDB4MDlERCwKLSAgICAgICAgICAgIDB4MDlERiwgMHgwOUUxLCAweDA5RjAsIDB4MDlGMSwgMHgwQTA1LCAweDBBMEEsIDB4MEEwRiwgMHgwQTEwLAotICAgICAgICAgICAgMHgwQTEzLCAweDBBMjgsIDB4MEEyQSwgMHgwQTMwLCAweDBBMzIsIDB4MEEzMywgMHgwQTM1LCAweDBBMzYsCi0gICAgICAgICAgICAweDBBMzgsIDB4MEEzOSwgMHgwQTU5LCAweDBBNUMsIDB4MEE3MiwgMHgwQTc0LCAweDBBODUsIDB4MEE4QiwKLSAgICAgICAgICAgIDB4MEE4RiwgMHgwQTkxLCAweDBBOTMsIDB4MEFBOCwgMHgwQUFBLCAweDBBQjAsIDB4MEFCMiwgMHgwQUIzLAotICAgICAgICAgICAgMHgwQUI1LCAweDBBQjksIDB4MEIwNSwgMHgwQjBDLCAweDBCMEYsIDB4MEIxMCwgMHgwQjEzLCAweDBCMjgsCi0gICAgICAgICAgICAweDBCMkEsIDB4MEIzMCwgMHgwQjMyLCAweDBCMzMsIDB4MEIzNiwgMHgwQjM5LCAweDBCNUMsIDB4MEI1RCwKLSAgICAgICAgICAgIDB4MEI1RiwgMHgwQjYxLCAweDBCODUsIDB4MEI4QSwgMHgwQjhFLCAweDBCOTAsIDB4MEI5MiwgMHgwQjk1LAotICAgICAgICAgICAgMHgwQjk5LCAweDBCOUEsIDB4MEI5RSwgMHgwQjlGLCAweDBCQTMsIDB4MEJBNCwgMHgwQkE4LCAweDBCQUEsCi0gICAgICAgICAgICAweDBCQUUsIDB4MEJCNSwgMHgwQkI3LCAweDBCQjksIDB4MEMwNSwgMHgwQzBDLCAweDBDMEUsIDB4MEMxMCwKLSAgICAgICAgICAgIDB4MEMxMiwgMHgwQzI4LCAweDBDMkEsIDB4MEMzMywgMHgwQzM1LCAweDBDMzksIDB4MEM2MCwgMHgwQzYxLAotICAgICAgICAgICAgMHgwQzg1LCAweDBDOEMsIDB4MEM4RSwgMHgwQzkwLCAweDBDOTIsIDB4MENBOCwgMHgwQ0FBLCAweDBDQjMsCi0gICAgICAgICAgICAweDBDQjUsIDB4MENCOSwgMHgwQ0UwLCAweDBDRTEsIDB4MEQwNSwgMHgwRDBDLCAweDBEMEUsIDB4MEQxMCwKLSAgICAgICAgICAgIDB4MEQxMiwgMHgwRDI4LCAweDBEMkEsIDB4MEQzOSwgMHgwRDYwLCAweDBENjEsIDB4MEUwMSwgMHgwRTJFLAotICAgICAgICAgICAgMHgwRTMyLCAweDBFMzMsIDB4MEU0MCwgMHgwRTQ1LCAweDBFODEsIDB4MEU4MiwgMHgwRTg3LCAweDBFODgsCi0gICAgICAgICAgICAweDBFOTQsIDB4MEU5NywgMHgwRTk5LCAweDBFOUYsIDB4MEVBMSwgMHgwRUEzLCAweDBFQUEsIDB4MEVBQiwKLSAgICAgICAgICAgIDB4MEVBRCwgMHgwRUFFLCAweDBFQjIsIDB4MEVCMywgMHgwRUMwLCAweDBFQzQsIDB4MEY0MCwgMHgwRjQ3LAotICAgICAgICAgICAgMHgwRjQ5LCAweDBGNjksIDB4MTBBMCwgMHgxMEM1LCAweDEwRDAsIDB4MTBGNiwgMHgxMTAyLCAweDExMDMsCi0gICAgICAgICAgICAweDExMDUsIDB4MTEwNywgMHgxMTBCLCAweDExMEMsIDB4MTEwRSwgMHgxMTEyLCAweDExNTQsIDB4MTE1NSwKLSAgICAgICAgICAgIDB4MTE1RiwgMHgxMTYxLCAweDExNkQsIDB4MTE2RSwgMHgxMTcyLCAweDExNzMsIDB4MTFBRSwgMHgxMUFGLAotICAgICAgICAgICAgMHgxMUI3LCAweDExQjgsIDB4MTFCQywgMHgxMUMyLCAweDFFMDAsIDB4MUU5QiwgMHgxRUEwLCAweDFFRjksCi0gICAgICAgICAgICAweDFGMDAsIDB4MUYxNSwgMHgxRjE4LCAweDFGMUQsIDB4MUYyMCwgMHgxRjQ1LCAweDFGNDgsIDB4MUY0RCwKLSAgICAgICAgICAgIDB4MUY1MCwgMHgxRjU3LCAweDFGNUYsIDB4MUY3RCwgMHgxRjgwLCAweDFGQjQsIDB4MUZCNiwgMHgxRkJDLAotICAgICAgICAgICAgMHgxRkMyLCAweDFGQzQsIDB4MUZDNiwgMHgxRkNDLCAweDFGRDAsIDB4MUZEMywgMHgxRkQ2LCAweDFGREIsCi0gICAgICAgICAgICAweDFGRTAsIDB4MUZFQywgMHgxRkYyLCAweDFGRjQsIDB4MUZGNiwgMHgxRkZDLCAweDIxMkEsIDB4MjEyQiwKLSAgICAgICAgICAgIDB4MjE4MCwgMHgyMTgyLCAweDMwNDEsIDB4MzA5NCwgMHgzMEExLCAweDMwRkEsIDB4MzEwNSwgMHgzMTJDLAotICAgICAgICAgICAgMHhBQzAwLCAweEQ3QTMsCi0gICAgICAgICAgICAvLyBJZGVvZ3JhcGhpYwotICAgICAgICAgICAgMHgzMDIxLCAweDMwMjksIDB4NEUwMCwgMHg5RkE1LAotICAgICAgICB9OwotICAgICAgICBpbnQgbGV0dGVyQ2hhcltdID0gewotICAgICAgICAgICAgLy8gQmFzZUNoYXIKLSAgICAgICAgICAgIDB4MDM4NiwgMHgwMzhDLCAweDAzREEsIDB4MDNEQywgMHgwM0RFLCAweDAzRTAsIDB4MDU1OSwgMHgwNkQ1LAotICAgICAgICAgICAgMHgwOTNELCAweDA5QjIsIDB4MEE1RSwgMHgwQThELCAweDBBQkQsIDB4MEFFMCwgMHgwQjNELCAweDBCOUMsCi0gICAgICAgICAgICAweDBDREUsIDB4MEUzMCwgMHgwRTg0LCAweDBFOEEsIDB4MEU4RCwgMHgwRUE1LCAweDBFQTcsIDB4MEVCMCwKLSAgICAgICAgICAgIDB4MEVCRCwgMHgxMTAwLCAweDExMDksIDB4MTEzQywgMHgxMTNFLCAweDExNDAsIDB4MTE0QywgMHgxMTRFLAotICAgICAgICAgICAgMHgxMTUwLCAweDExNTksIDB4MTE2MywgMHgxMTY1LCAweDExNjcsIDB4MTE2OSwgMHgxMTc1LCAweDExOUUsCi0gICAgICAgICAgICAweDExQTgsIDB4MTFBQiwgMHgxMUJBLCAweDExRUIsIDB4MTFGMCwgMHgxMUY5LCAweDFGNTksIDB4MUY1QiwKLSAgICAgICAgICAgIDB4MUY1RCwgMHgxRkJFLCAweDIxMjYsIDB4MjEyRSwKLSAgICAgICAgICAgIC8vIElkZW9ncmFwaGljCi0gICAgICAgICAgICAweDMwMDcsCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gWzg3XSBDb21iaW5pbmdDaGFyIDo6PSAuLi4KLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgY29tYmluaW5nQ2hhclJhbmdlW10gPSB7Ci0gICAgICAgICAgICAweDAzMDAsIDB4MDM0NSwgMHgwMzYwLCAweDAzNjEsIDB4MDQ4MywgMHgwNDg2LCAweDA1OTEsIDB4MDVBMSwKLSAgICAgICAgICAgIDB4MDVBMywgMHgwNUI5LCAweDA1QkIsIDB4MDVCRCwgMHgwNUMxLCAweDA1QzIsIDB4MDY0QiwgMHgwNjUyLAotICAgICAgICAgICAgMHgwNkQ2LCAweDA2REMsIDB4MDZERCwgMHgwNkRGLCAweDA2RTAsIDB4MDZFNCwgMHgwNkU3LCAweDA2RTgsCi0gICAgICAgICAgICAweDA2RUEsIDB4MDZFRCwgMHgwOTAxLCAweDA5MDMsIDB4MDkzRSwgMHgwOTRDLCAweDA5NTEsIDB4MDk1NCwKLSAgICAgICAgICAgIDB4MDk2MiwgMHgwOTYzLCAweDA5ODEsIDB4MDk4MywgMHgwOUMwLCAweDA5QzQsIDB4MDlDNywgMHgwOUM4LAotICAgICAgICAgICAgMHgwOUNCLCAweDA5Q0QsIDB4MDlFMiwgMHgwOUUzLCAweDBBNDAsIDB4MEE0MiwgMHgwQTQ3LCAweDBBNDgsCi0gICAgICAgICAgICAweDBBNEIsIDB4MEE0RCwgMHgwQTcwLCAweDBBNzEsIDB4MEE4MSwgMHgwQTgzLCAweDBBQkUsIDB4MEFDNSwKLSAgICAgICAgICAgIDB4MEFDNywgMHgwQUM5LCAweDBBQ0IsIDB4MEFDRCwgMHgwQjAxLCAweDBCMDMsIDB4MEIzRSwgMHgwQjQzLAotICAgICAgICAgICAgMHgwQjQ3LCAweDBCNDgsIDB4MEI0QiwgMHgwQjRELCAweDBCNTYsIDB4MEI1NywgMHgwQjgyLCAweDBCODMsCi0gICAgICAgICAgICAweDBCQkUsIDB4MEJDMiwgMHgwQkM2LCAweDBCQzgsIDB4MEJDQSwgMHgwQkNELCAweDBDMDEsIDB4MEMwMywKLSAgICAgICAgICAgIDB4MEMzRSwgMHgwQzQ0LCAweDBDNDYsIDB4MEM0OCwgMHgwQzRBLCAweDBDNEQsIDB4MEM1NSwgMHgwQzU2LAotICAgICAgICAgICAgMHgwQzgyLCAweDBDODMsIDB4MENCRSwgMHgwQ0M0LCAweDBDQzYsIDB4MENDOCwgMHgwQ0NBLCAweDBDQ0QsCi0gICAgICAgICAgICAweDBDRDUsIDB4MENENiwgMHgwRDAyLCAweDBEMDMsIDB4MEQzRSwgMHgwRDQzLCAweDBENDYsIDB4MEQ0OCwKLSAgICAgICAgICAgIDB4MEQ0QSwgMHgwRDRELCAweDBFMzQsIDB4MEUzQSwgMHgwRTQ3LCAweDBFNEUsIDB4MEVCNCwgMHgwRUI5LAotICAgICAgICAgICAgMHgwRUJCLCAweDBFQkMsIDB4MEVDOCwgMHgwRUNELCAweDBGMTgsIDB4MEYxOSwgMHgwRjcxLCAweDBGODQsCi0gICAgICAgICAgICAweDBGODYsIDB4MEY4QiwgMHgwRjkwLCAweDBGOTUsIDB4MEY5OSwgMHgwRkFELCAweDBGQjEsIDB4MEZCNywKLSAgICAgICAgICAgIDB4MjBEMCwgMHgyMERDLCAweDMwMkEsIDB4MzAyRiwKLSAgICAgICAgfTsKLQotICAgICAgICBpbnQgY29tYmluaW5nQ2hhckNoYXJbXSA9IHsKLSAgICAgICAgICAgIDB4MDVCRiwgMHgwNUM0LCAweDA2NzAsIDB4MDkzQywgMHgwOTRELCAweDA5QkMsIDB4MDlCRSwgMHgwOUJGLAotICAgICAgICAgICAgMHgwOUQ3LCAweDBBMDIsIDB4MEEzQywgMHgwQTNFLCAweDBBM0YsIDB4MEFCQywgMHgwQjNDLCAweDBCRDcsCi0gICAgICAgICAgICAweDBENTcsIDB4MEUzMSwgMHgwRUIxLCAweDBGMzUsIDB4MEYzNywgMHgwRjM5LCAweDBGM0UsIDB4MEYzRiwKLSAgICAgICAgICAgIDB4MEY5NywgMHgwRkI5LCAweDIwRTEsIDB4MzA5OSwgMHgzMDlBLAotICAgICAgICB9OwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFs4OF0gRGlnaXQgOjo9IC4uLgotICAgICAgICAvLwotCi0gICAgICAgIGludCBkaWdpdFJhbmdlW10gPSB7Ci0gICAgICAgICAgICAweDAwMzAsIDB4MDAzOSwgMHgwNjYwLCAweDA2NjksIDB4MDZGMCwgMHgwNkY5LCAweDA5NjYsIDB4MDk2RiwKLSAgICAgICAgICAgIDB4MDlFNiwgMHgwOUVGLCAweDBBNjYsIDB4MEE2RiwgMHgwQUU2LCAweDBBRUYsIDB4MEI2NiwgMHgwQjZGLAotICAgICAgICAgICAgMHgwQkU3LCAweDBCRUYsIDB4MEM2NiwgMHgwQzZGLCAweDBDRTYsIDB4MENFRiwgMHgwRDY2LCAweDBENkYsCi0gICAgICAgICAgICAweDBFNTAsIDB4MEU1OSwgMHgwRUQwLCAweDBFRDksIDB4MEYyMCwgMHgwRjI5LAotICAgICAgICB9OwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFs4OV0gRXh0ZW5kZXIgOjo9IC4uLgotICAgICAgICAvLwotCi0gICAgICAgIGludCBleHRlbmRlclJhbmdlW10gPSB7Ci0gICAgICAgICAgICAweDMwMzEsIDB4MzAzNSwgMHgzMDlELCAweDMwOUUsIDB4MzBGQywgMHgzMEZFLAotICAgICAgICB9OwotCi0gICAgICAgIGludCBleHRlbmRlckNoYXJbXSA9IHsKLSAgICAgICAgICAgIDB4MDBCNywgMHgwMkQwLCAweDAyRDEsIDB4MDM4NywgMHgwNjQwLCAweDBFNDYsIDB4MEVDNiwgMHgzMDA1LAotICAgICAgICB9OwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFNwZWNpYWxDaGFyIDo6PSAnPCcsICcmJywgJ1xuJywgJ1xyJywgJ10nCi0gICAgICAgIC8vCi0KLSAgICAgICAgaW50IHNwZWNpYWxDaGFyW10gPSB7Ci0gICAgICAgICAgICAnPCcsICcmJywgJ1xuJywgJ1xyJywgJ10nLAotICAgICAgICB9OwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEluaXRpYWxpemUKLSAgICAgICAgLy8KLQotICAgICAgICAvLyBzZXQgdmFsaWQgY2hhcmFjdGVycwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYXJSYW5nZS5sZW5ndGg7IGkgKz0gMikgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGNoYXJSYW5nZVtpXTsgaiA8PSBjaGFyUmFuZ2VbaSArIDFdOyBqKyspIHsKLSAgICAgICAgICAgICAgICBDSEFSU1tqXSB8PSBNQVNLX1ZBTElEIHwgTUFTS19DT05URU5UOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmVtb3ZlIHNwZWNpYWwgY2hhcmFjdGVycwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwZWNpYWxDaGFyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBDSEFSU1tzcGVjaWFsQ2hhcltpXV0gPSAoYnl0ZSkoQ0hBUlNbc3BlY2lhbENoYXJbaV1dICYgfk1BU0tfQ09OVEVOVCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgc3BhY2UgY2hhcmFjdGVycwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYWNlQ2hhci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ0hBUlNbc3BhY2VDaGFyW2ldXSB8PSBNQVNLX1NQQUNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IG5hbWUgc3RhcnQgY2hhcmFjdGVycwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVTdGFydENoYXIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENIQVJTW25hbWVTdGFydENoYXJbaV1dIHw9IE1BU0tfTkFNRV9TVEFSVCB8IE1BU0tfTkFNRSB8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFTS19OQ05BTUVfU1RBUlQgfCBNQVNLX05DTkFNRTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxldHRlclJhbmdlLmxlbmd0aDsgaSArPSAyKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gbGV0dGVyUmFuZ2VbaV07IGogPD0gbGV0dGVyUmFuZ2VbaSArIDFdOyBqKyspIHsKLSAgICAgICAgICAgICAgICBDSEFSU1tqXSB8PSBNQVNLX05BTUVfU1RBUlQgfCBNQVNLX05BTUUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BU0tfTkNOQU1FX1NUQVJUIHwgTUFTS19OQ05BTUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZXR0ZXJDaGFyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBDSEFSU1tsZXR0ZXJDaGFyW2ldXSB8PSBNQVNLX05BTUVfU1RBUlQgfCBNQVNLX05BTUUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFTS19OQ05BTUVfU1RBUlQgfCBNQVNLX05DTkFNRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCBuYW1lIGNoYXJhY3RlcnMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lQ2hhci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ0hBUlNbbmFtZUNoYXJbaV1dIHw9IE1BU0tfTkFNRSB8IE1BU0tfTkNOQU1FOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlnaXRSYW5nZS5sZW5ndGg7IGkgKz0gMikgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGRpZ2l0UmFuZ2VbaV07IGogPD0gZGlnaXRSYW5nZVtpICsgMV07IGorKykgewotICAgICAgICAgICAgICAgIENIQVJTW2pdIHw9IE1BU0tfTkFNRSB8IE1BU0tfTkNOQU1FOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tYmluaW5nQ2hhclJhbmdlLmxlbmd0aDsgaSArPSAyKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gY29tYmluaW5nQ2hhclJhbmdlW2ldOyBqIDw9IGNvbWJpbmluZ0NoYXJSYW5nZVtpICsgMV07IGorKykgewotICAgICAgICAgICAgICAgIENIQVJTW2pdIHw9IE1BU0tfTkFNRSB8IE1BU0tfTkNOQU1FOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tYmluaW5nQ2hhckNoYXIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENIQVJTW2NvbWJpbmluZ0NoYXJDaGFyW2ldXSB8PSBNQVNLX05BTUUgfCBNQVNLX05DTkFNRTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuZGVyUmFuZ2UubGVuZ3RoOyBpICs9IDIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBleHRlbmRlclJhbmdlW2ldOyBqIDw9IGV4dGVuZGVyUmFuZ2VbaSArIDFdOyBqKyspIHsKLSAgICAgICAgICAgICAgICBDSEFSU1tqXSB8PSBNQVNLX05BTUUgfCBNQVNLX05DTkFNRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuZGVyQ2hhci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ0hBUlNbZXh0ZW5kZXJDaGFyW2ldXSB8PSBNQVNLX05BTUUgfCBNQVNLX05DTkFNRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlbW92ZSAnOicgZnJvbSBhbGxvd2FibGUgTUFTS19OQ05BTUVfU1RBUlQgYW5kIE1BU0tfTkNOQU1FIGNoYXJzCi0gICAgICAgIENIQVJTWyc6J10gJj0gfihNQVNLX05DTkFNRV9TVEFSVCB8IE1BU0tfTkNOQU1FKTsKLQotICAgICAgICAvLyBzZXQgUHViaWQgY2hhcmFjdGVycwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHB1YmlkQ2hhci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ0hBUlNbcHViaWRDaGFyW2ldXSB8PSBNQVNLX1BVQklEOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHViaWRSYW5nZS5sZW5ndGg7IGkgKz0gMikgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IHB1YmlkUmFuZ2VbaV07IGogPD0gcHViaWRSYW5nZVtpICsgMV07IGorKykgewotICAgICAgICAgICAgICAgIENIQVJTW2pdIHw9IE1BU0tfUFVCSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0gLy8gPGNsaW5pdD4oKQotCi0gICAgLy8KLSAgICAvLyBQdWJsaWMgc3RhdGljIG1ldGhvZHMKLSAgICAvLwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgc3VwcGxlbWVudGFsIGNoYXJhY3Rlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3VwcGxlbWVudGFsKGludCBjKSB7Ci0gICAgICAgIHJldHVybiAoYyA+PSAweDEwMDAwICYmIGMgPD0gMHgxMEZGRkYpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSB0aGUgc3VwcGxlbWVudGFsIGNoYXJhY3RlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbgotICAgICAqIHN1cnJvZ2F0ZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaCBUaGUgaGlnaCBzdXJyb2dhdGUuCi0gICAgICogQHBhcmFtIGwgVGhlIGxvdyBzdXJyb2dhdGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgc3VwcGxlbWVudGFsKGNoYXIgaCwgY2hhciBsKSB7Ci0gICAgICAgIHJldHVybiAoaCAtIDB4RDgwMCkgKiAweDQwMCArIChsIC0gMHhEQzAwKSArIDB4MTAwMDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXBwbGVtZW50YWwgY2hhcmFjdGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgc3VwcGxlbWVudGFsIGNoYXJhY3RlciB0byAic3BsaXQiLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2hhciBoaWdoU3Vycm9nYXRlKGludCBjKSB7Ci0gICAgICAgIHJldHVybiAoY2hhcikgKCgoYyAtIDB4MDAwMTAwMDApID4+IDEwKSArIDB4RDgwMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG93IHN1cnJvZ2F0ZSBvZiBhIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBzdXBwbGVtZW50YWwgY2hhcmFjdGVyIHRvICJzcGxpdCIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjaGFyIGxvd1N1cnJvZ2F0ZShpbnQgYykgewotICAgICAgICByZXR1cm4gKGNoYXIpICgoKGMgLSAweDAwMDEwMDAwKSAmIDB4M0ZGKSArIDB4REMwMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgYSBoaWdoIHN1cnJvZ2F0ZQotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIaWdoU3Vycm9nYXRlKGludCBjKSB7Ci0gICAgICAgIHJldHVybiAoMHhEODAwIDw9IGMgJiYgYyA8PSAweERCRkYpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIGEgbG93IHN1cnJvZ2F0ZQotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb3dTdXJyb2dhdGUoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuICgweERDMDAgPD0gYyAmJiBjIDw9IDB4REZGRik7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgdmFsaWQuIFRoaXMgbWV0aG9kCi0gICAgICogYWxzbyBjaGVja3MgdGhlIHN1cnJvZ2F0ZSBjaGFyYWN0ZXIgcmFuZ2UgZnJvbSAweDEwMDAwIHRvIDB4MTBGRkZGLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBwcm9ncmFtIGNob29zZXMgdG8gYXBwbHkgdGhlIG1hc2sgZGlyZWN0bHkgdG8gdGhlCi0gICAgICogPGNvZGU+Q0hBUlM8L2NvZGU+IGFycmF5LCB0aGVuIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZwotICAgICAqIHRoZSBzdXJyb2dhdGUgY2hhcmFjdGVyIHJhbmdlLgotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChpbnQgYykgewotICAgICAgICByZXR1cm4gKGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfVkFMSUQpICE9IDApIHx8Ci0gICAgICAgICAgICAgICAoMHgxMDAwMCA8PSBjICYmIGMgPD0gMHgxMEZGRkYpOwotICAgIH0gLy8gaXNWYWxpZChpbnQpOmJvb2xlYW4KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBpbnZhbGlkLgotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnZhbGlkKGludCBjKSB7Ci0gICAgICAgIHJldHVybiAhaXNWYWxpZChjKTsKLSAgICB9IC8vIGlzSW52YWxpZChpbnQpOmJvb2xlYW4KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBjYW4gYmUgY29uc2lkZXJlZCBjb250ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250ZW50KGludCBjKSB7Ci0gICAgICAgIHJldHVybiAoYyA8IDB4MTAwMDAgJiYgKENIQVJTW2NdICYgTUFTS19DT05URU5UKSAhPSAwKSB8fAotICAgICAgICAgICAgICAgKDB4MTAwMDAgPD0gYyAmJiBjIDw9IDB4MTBGRkZGKTsKLSAgICB9IC8vIGlzQ29udGVudChpbnQpOmJvb2xlYW4KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBjYW4gYmUgY29uc2lkZXJlZCBtYXJrdXAuCi0gICAgICogTWFya3VwIGNoYXJhY3RlcnMgaW5jbHVkZSAnJmx0OycsICcmYW1wOycsIGFuZCAnJScuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01hcmt1cChpbnQgYykgewotICAgICAgICByZXR1cm4gYyA9PSAnPCcgfHwgYyA9PSAnJicgfHwgYyA9PSAnJSc7Ci0gICAgfSAvLyBpc01hcmt1cChpbnQpOmJvb2xlYW4KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHNwYWNlIGNoYXJhY3RlcgotICAgICAqIGFzIGRlZmluZWQgYnkgcHJvZHVjdGlvbiBbM10gaW4gdGhlIFhNTCAxLjAgc3BlY2lmaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3BhY2UoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfU1BBQ0UpICE9IDA7Ci0gICAgfSAvLyBpc1NwYWNlKGludCk6Ym9vbGVhbgotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgc3BhY2UgY2hhcmFjdGVyCi0gICAgICogYXMgYW1kZW5kZWQgaW4gdGhlIFhNTCAxLjEgc3BlY2lmaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzWE1MMTFTcGFjZShpbnQgYykgewotICAgICAgICByZXR1cm4gKGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfU1BBQ0UpICE9IDApIHx8Ci0gICAgICAgICAgICBjID09IDB4ODUgfHwgYyA9PSAweDIwMjg7Ci0gICAgfSAvLyBpc1hNTDExU3BhY2UoaW50KTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBuYW1lIHN0YXJ0Ci0gICAgICogY2hhcmFjdGVyIGFzIGRlZmluZWQgYnkgcHJvZHVjdGlvbiBbNV0gaW4gdGhlIFhNTCAxLjAKLSAgICAgKiBzcGVjaWZpY2F0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOYW1lU3RhcnQoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfTkFNRV9TVEFSVCkgIT0gMDsKLSAgICB9IC8vIGlzTmFtZVN0YXJ0KGludCk6Ym9vbGVhbgotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgdmFsaWQgbmFtZQotICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzRdIGluIHRoZSBYTUwgMS4wCi0gICAgICogc3BlY2lmaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTmFtZShpbnQgYykgewotICAgICAgICByZXR1cm4gYyA8IDB4MTAwMDAgJiYgKENIQVJTW2NdICYgTUFTS19OQU1FKSAhPSAwOwotICAgIH0gLy8gaXNOYW1lKGludCk6Ym9vbGVhbgotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgdmFsaWQgTkNOYW1lIHN0YXJ0Ci0gICAgICogY2hhcmFjdGVyIGFzIGRlZmluZWQgYnkgcHJvZHVjdGlvbiBbNF0gaW4gTmFtZXNwYWNlcyBpbiBYTUwKLSAgICAgKiByZWNvbW1lbmRhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTkNOYW1lU3RhcnQoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfTkNOQU1FX1NUQVJUKSAhPSAwOwotICAgIH0gLy8gaXNOQ05hbWVTdGFydChpbnQpOmJvb2xlYW4KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHZhbGlkIE5DTmFtZQotICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzVdIGluIE5hbWVzcGFjZXMgaW4gWE1MCi0gICAgICogcmVjb21tZW5kYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05DTmFtZShpbnQgYykgewotICAgICAgICByZXR1cm4gYyA8IDB4MTAwMDAgJiYgKENIQVJTW2NdICYgTUFTS19OQ05BTUUpICE9IDA7Ci0gICAgfSAvLyBpc05DTmFtZShpbnQpOmJvb2xlYW4KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHZhbGlkIFB1YmlkCi0gICAgICogY2hhcmFjdGVyIGFzIGRlZmluZWQgYnkgcHJvZHVjdGlvbiBbMTNdIGluIHRoZSBYTUwgMS4wCi0gICAgICogc3BlY2lmaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHViaWQoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfUFVCSUQpICE9IDA7Ci0gICAgfSAvLyBpc1B1YmlkKGludCk6Ym9vbGVhbgotCi0gICAgLyoKLSAgICAgKiBbNV0gTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykgKE5hbWVDaGFyKSoKLSAgICAgKi8KLSAgICAvKioKLSAgICAgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBOYW1lIGFjY29yZGluZyB0byBbNV0KLSAgICAgKiBpbiB0aGUgWE1MIDEuMCBSZWNvbW1lbmRhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgc3RyaW5nIHRvIGNoZWNrCi0gICAgICogQHJldHVybiB0cnVlIGlmIG5hbWUgaXMgYSB2YWxpZCBOYW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNoYXIgY2ggPSBuYW1lLmNoYXJBdCgwKTsKLSAgICAgICAgaWYoIGlzTmFtZVN0YXJ0KGNoKSA9PSBmYWxzZSkKLSAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKyApIHsKLSAgICAgICAgICAgY2ggPSBuYW1lLmNoYXJBdChpKTsKLSAgICAgICAgICAgaWYoIGlzTmFtZSggY2ggKSA9PSBmYWxzZSApewotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IC8vIGlzVmFsaWROYW1lKFN0cmluZyk6Ym9vbGVhbgotICAgIAotCi0gICAgLyoKLSAgICAgKiBmcm9tIHRoZSBuYW1lc3BhY2UgcmVjCi0gICAgICogWzRdIE5DTmFtZSA6Oj0gKExldHRlciB8ICdfJykgKE5DTmFtZUNoYXIpKgotICAgICAqLwotICAgIC8qKgotICAgICAqIENoZWNrIHRvIHNlZSBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIE5DTmFtZSBhY2NvcmRpbmcgdG8gWzRdCi0gICAgICogZnJvbSB0aGUgWE1MIE5hbWVzcGFjZXMgMS4wIFJlY29tbWVuZGF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBzdHJpbmcgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgbmFtZSBpcyBhIHZhbGlkIE5DTmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTkNOYW1lKFN0cmluZyBuY05hbWUpIHsKLSAgICAgICAgaWYgKG5jTmFtZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjaGFyIGNoID0gbmNOYW1lLmNoYXJBdCgwKTsKLSAgICAgICAgaWYoIGlzTkNOYW1lU3RhcnQoY2gpID09IGZhbHNlKQotICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbmNOYW1lLmxlbmd0aCgpOyBpKysgKSB7Ci0gICAgICAgICAgIGNoID0gbmNOYW1lLmNoYXJBdChpKTsKLSAgICAgICAgICAgaWYoIGlzTkNOYW1lKCBjaCApID09IGZhbHNlICl7Ci0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gLy8gaXNWYWxpZE5DTmFtZShTdHJpbmcpOmJvb2xlYW4KLQotICAgIC8qCi0gICAgICogWzddIE5tdG9rZW4gOjo9IChOYW1lQ2hhcikrCi0gICAgICovCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgTm10b2tlbiBhY2NvcmRpbmcgdG8gWzddCi0gICAgICogaW4gdGhlIFhNTCAxLjAgUmVjb21tZW5kYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBubXRva2VuIHN0cmluZyB0byBjaGVjawotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBubXRva2VuIGlzIGEgdmFsaWQgTm10b2tlbiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZE5tdG9rZW4oU3RyaW5nIG5tdG9rZW4pIHsKLSAgICAgICAgaWYgKG5tdG9rZW4ubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBubXRva2VuLmxlbmd0aCgpOyBpKysgKSB7Ci0gICAgICAgICAgIGNoYXIgY2ggPSBubXRva2VuLmNoYXJBdChpKTsKLSAgICAgICAgICAgaWYoICAhIGlzTmFtZSggY2ggKSApewotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IC8vIGlzVmFsaWROYW1lKFN0cmluZyk6Ym9vbGVhbgotCi0KLQotCi0KLSAgICAvLyBlbmNvZGluZ3MKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5jb2RpbmcgbmFtZSBpcyBhIHZhbGlkIElBTkEgZW5jb2RpbmcuCi0gICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgdmVyaWZ5IHRoYXQgdGhlcmUgaXMgYSBkZWNvZGVyIGF2YWlsYWJsZQotICAgICAqIGZvciB0aGlzIGVuY29kaW5nLCBvbmx5IHRoYXQgdGhlIGNoYXJhY3RlcnMgYXJlIHZhbGlkIGZvciBhbgotICAgICAqIElBTkEgZW5jb2RpbmcgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpYW5hRW5jb2RpbmcgVGhlIElBTkEgZW5jb2RpbmcgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZElBTkFFbmNvZGluZyhTdHJpbmcgaWFuYUVuY29kaW5nKSB7Ci0gICAgICAgIGlmIChpYW5hRW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGxlbmd0aCA9IGlhbmFFbmNvZGluZy5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChsZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBjID0gaWFuYUVuY29kaW5nLmNoYXJBdCgwKTsKLSAgICAgICAgICAgICAgICBpZiAoKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB8fCAoYyA+PSAnYScgJiYgYyA8PSAneicpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBpYW5hRW5jb2RpbmcuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjIDwgJ0EnIHx8IGMgPiAnWicpICYmIChjIDwgJ2EnIHx8IGMgPiAneicpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMgPCAnMCcgfHwgYyA+ICc5JykgJiYgYyAhPSAnLicgJiYgYyAhPSAnXycgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICE9ICctJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gLy8gaXNWYWxpZElBTkFFbmNvZGluZyhTdHJpbmcpOmJvb2xlYW4KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5jb2RpbmcgbmFtZSBpcyBhIHZhbGlkIEphdmEgZW5jb2RpbmcuCi0gICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgdmVyaWZ5IHRoYXQgdGhlcmUgaXMgYSBkZWNvZGVyIGF2YWlsYWJsZQotICAgICAqIGZvciB0aGlzIGVuY29kaW5nLCBvbmx5IHRoYXQgdGhlIGNoYXJhY3RlcnMgYXJlIHZhbGlkIGZvciBhbgotICAgICAqIEphdmEgZW5jb2RpbmcgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBqYXZhRW5jb2RpbmcgVGhlIEphdmEgZW5jb2RpbmcgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEphdmFFbmNvZGluZyhTdHJpbmcgamF2YUVuY29kaW5nKSB7Ci0gICAgICAgIGlmIChqYXZhRW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGxlbmd0aCA9IGphdmFFbmNvZGluZy5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChsZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSBqYXZhRW5jb2RpbmcuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGMgPCAnQScgfHwgYyA+ICdaJykgJiYgKGMgPCAnYScgfHwgYyA+ICd6JykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChjIDwgJzAnIHx8IGMgPiAnOScpICYmIGMgIT0gJy4nICYmIGMgIT0gJ18nICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBjICE9ICctJykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IC8vIGlzVmFsaWRJQU5BRW5jb2RpbmcoU3RyaW5nKTpib29sZWFuCi0KLX0gLy8gY2xhc3MgWE1MQ2hhcgpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hNTE5hbWVIZWxwZXIuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YTUxOYW1lSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNzc2OTguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hNTE5hbWVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcwotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTE5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBYTUxOYW1lSGVscGVyCi17Ci0gICAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRRTmFtZShYTUxOYW1lIHhtbE5hbWUpCi0gICAgewotICAgICAgICBpZiAoeG1sTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIFFOYW1lSGVscGVyLmZvckxOUyggeG1sTmFtZS5nZXRMb2NhbE5hbWUoKSwgeG1sTmFtZS5nZXROYW1lc3BhY2VVcmkoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgWE1MTmFtZSBmb3JMTlMoU3RyaW5nIGxvY2FsbmFtZSwgU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgICAgIHVyaSA9ICIiOwotICAgICAgICByZXR1cm4gbmV3IFhtbE5hbWVJbXBsKHVyaSwgbG9jYWxuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFhNTE5hbWUgZm9yTE4oU3RyaW5nIGxvY2FsbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWG1sTmFtZUltcGwoIiIsIGxvY2FsbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYTUxOYW1lIGZvclByZXR0eShTdHJpbmcgcHJldHR5LCBpbnQgb2Zmc2V0KQotICAgIHsKLSAgICAgICAgaW50IGF0ID0gcHJldHR5LmluZGV4T2YoJ0AnLCBvZmZzZXQpOwotICAgICAgICBpZiAoYXQgPCAwKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOYW1lSW1wbCgiIiwgcHJldHR5LnN1YnN0cmluZyhvZmZzZXQpKTsKLSAgICAgICAgcmV0dXJuIG5ldyBYbWxOYW1lSW1wbChwcmV0dHkuc3Vic3RyaW5nKGF0ICsgMSksIHByZXR0eS5zdWJzdHJpbmcob2Zmc2V0LCBhdCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXR0eShYTUxOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKLQotICAgICAgICBpZiAobmFtZS5nZXROYW1lc3BhY2VVcmkoKSA9PSBudWxsIHx8IG5hbWUuZ2V0TmFtZXNwYWNlVXJpKCkubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsTmFtZSgpOwotCi0gICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsTmFtZSgpICsgIkAiICsgbmFtZS5nZXROYW1lc3BhY2VVcmkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gaGV4ZGlnaXRzID0gbmV3IGNoYXJbXQotICAgICAgICB7JzAnLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCdBJywnQicsJ0MnLCdEJywnRScsJ0YnfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTYWZlKGludCBjKQotICAgIHsKLSAgICAgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGhleHNhZmUoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgY2hhciBjaCA9IHMuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKGlzU2FmZShjaCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIHV0ZjggPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdXRmOCA9IHMuc3Vic3RyaW5nKGksIGkgKyAxKS5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB1dGY4Lmxlbmd0aDsgaisrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCdfJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGhleGRpZ2l0c1sodXRmOFtqXSA+PiA0KSAmIDB4Rl0pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChoZXhkaWdpdHNbdXRmOFtqXSAmIDB4Rl0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiAtIFVURi04IGlzIGFsd2F5cyBzdXBwb3J0ZWQKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiX0JBRF9VVEY4X0NIQVIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGhleHNhZmVkaXIoWE1MTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZXNwYWNlVXJpKCkgPT0gbnVsbCB8fCBuYW1lLmdldE5hbWVzcGFjZVVyaSgpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gIl9ub25zLyIgKyBoZXhzYWZlKG5hbWUuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICByZXR1cm4gaGV4c2FmZShuYW1lLmdldE5hbWVzcGFjZVVyaSgpKSArICIvIiArIGhleHNhZmUobmFtZS5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hQYXRoLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWFBhdGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmOGYxZi4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWFBhdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNDEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWE1MQ2hhcjsKLQotcHVibGljIGNsYXNzIFhQYXRoCi17Ci0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBYUGF0aENvbXBpbGVFeGNlcHRpb24gZXh0ZW5kcyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbiAoIFhtbEVycm9yIGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCBlcnIudG9TdHJpbmcoKSwgbnVsbCwgZXJyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhlY3V0aW9uQ29udGV4dAotICAgIHsKLSAgICAgICAgcHVibGljIEV4ZWN1dGlvbkNvbnRleHQgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9zdGFjayA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJVCAgICAgPSAweDE7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFU0NFTkQgPSAweDI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJTICAgPSAweDQ7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0ICggWFBhdGggeHBhdGggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3hwYXRoICE9IHhwYXRoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF94cGF0aCA9IHhwYXRoOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIF9wYXRocyA9IG5ldyBQYXRoQ29udGV4dCBbIHhwYXRoLl9zZWxlY3Rvci5fcGF0aHMubGVuZ3RoIF07Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IF9wYXRocy5sZW5ndGggOyBpKysgKQotICAgICAgICAgICAgICAgICAgICBfcGF0aHNbIGkgXSA9IG5ldyBQYXRoQ29udGV4dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBfc3RhY2suY2xlYXIoKTsKLQotICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IF9wYXRocy5sZW5ndGggOyBpKysgKQotICAgICAgICAgICAgICAgIF9wYXRoc1sgaSBdLmluaXQoIHhwYXRoLl9zZWxlY3Rvci5fcGF0aHNbIGkgXSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIGludCBzdGFydCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfcGF0aHMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgICAgICAgICByZXN1bHQgfD0gX3BhdGhzWyBpIF0uc3RhcnQoKTsKLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGZpbmFsIGludCBlbGVtZW50ICggUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBuYW1lICE9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF9zdGFjay5hZGQoIG5hbWUgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfcGF0aHMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgICAgICAgICByZXN1bHQgfD0gX3BhdGhzWyBpIF0uZWxlbWVudCggbmFtZSApOwotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBhdHRyICggUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gaGl0ID0gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfcGF0aHMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgICAgICAgICBoaXQgPSBoaXQgfCBfcGF0aHNbIGkgXS5hdHRyKCBuYW1lICk7Ci0KLSAgICAgICAgICAgIHJldHVybiBoaXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmQgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9zdGFjay5yZW1vdmUoIF9zdGFjay5zaXplKCkgLSAxICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfcGF0aHMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgICAgICAgICBfcGF0aHNbIGkgXS5lbmQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQYXRoQ29udGV4dAotICAgICAgICB7Ci0gICAgICAgICAgICBQYXRoQ29udGV4dCAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcHJldiA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdm9pZCBpbml0ICggU3RlcCBzdGVwcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2N1cnIgPSBzdGVwczsKLSAgICAgICAgICAgICAgICBfcHJldi5jbGVhcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIFFOYW1lIHRvcCAoIGludCBpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFFOYW1lKSBFeGVjdXRpb25Db250ZXh0LnRoaXMuX3N0YWNrLmdldCggX3N0YWNrLnNpemUoKSAtIDEgLSBpICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBiYWNrdHJhY2sgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IF9jdXJyICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKF9jdXJyLl9oYXNCYWNrdHJhY2spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfY3VyciA9IF9jdXJyLl9iYWNrdHJhY2s7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgIV9jdXJyLl9kZWVwOwotCi0gICAgICAgICAgICAgICAgX2N1cnIgPSBfY3Vyci5fcHJldjsKLQotICAgICAgICAgICAgICAgIHNlYXJjaDogZm9yICggOyAhX2N1cnIuX2RlZXAgOyBfY3VyciA9IF9jdXJyLl9wcmV2ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIFN0ZXAgcyA9IF9jdXJyIDsgIXMuX2RlZXAgOyBzID0gcy5fcHJldiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcy5tYXRjaCggdG9wKCB0KysgKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgc2VhcmNoOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgc3RhcnQgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IF9jdXJyICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IF9jdXJyLl9wcmV2ID09IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBpZiAoX2N1cnIuX25hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jdXJyLl9mbGFnczsKLQotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzdGVwcyBjb25zaXN0IG9uIG9ubHkgYSB0ZXJtaW5hdG9yLCB0aGVuIHRoZSBwYXRoIGNhbgotICAgICAgICAgICAgICAgIC8vIG9ubHkgYmUgJy4nLiAgSW4gdGhpcyBjYXNlLCB3ZSBnZXQgYSBoaXQsIGJ1dCB0aGVyZSBpcwotICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgZWxzZSB0byBtYXRjaC4gIE5vIG5lZWQgdG8gYmFja3RyYWNrLgotCi0gICAgICAgICAgICAgICAgX2N1cnIgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIEhJVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IGVsZW1lbnQgKCBRTmFtZSBuYW1lICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcHJldi5hZGQoIF9jdXJyICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoX2N1cnIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgX2N1cnIuX25hbWUgIT0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGlmICghX2N1cnIuX2F0dHIgJiYgX2N1cnIubWF0Y2goIG5hbWUgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoX2N1cnIgPSBfY3Vyci5fbmV4dCkuX25hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY3Vyci5fZmxhZ3M7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBiYWNrdHJhY2soKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfY3VyciA9PSBudWxsID8gSElUIDogSElUIHwgX2N1cnIuX2ZsYWdzOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiYWNrdHJhY2soKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoX2N1cnIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChfY3Vyci5tYXRjaCggbmFtZSApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfY3VyciA9IF9jdXJyLl9uZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoX2N1cnIuX2RlZXApCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIF9jdXJyLl9mbGFnczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYm9vbGVhbiBhdHRyICggUU5hbWUgbmFtZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9jdXJyICE9IG51bGwgJiYgX2N1cnIuX2F0dHIgJiYgX2N1cnIubWF0Y2goIG5hbWUgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdm9pZCBlbmQgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2N1cnIgPSAoU3RlcCkgX3ByZXYucmVtb3ZlKCBfcHJldi5zaXplKCkgLSAxICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHByaXZhdGUgU3RlcCBfY3VycjsKLSAgICAgICAgICAgIHByaXZhdGUgTGlzdCBfcHJldjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgWFBhdGggICAgICAgICBfeHBhdGg7Ci0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0ICAgICBfc3RhY2s7Ci0gICAgICAgIHByaXZhdGUgUGF0aENvbnRleHRbXSBfcGF0aHM7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBwdWJsaWMgc3RhdGljIFhQYXRoIGNvbXBpbGVYUGF0aCAoIFN0cmluZyB4cGF0aCApCi0gICAgICAgIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21waWxlWFBhdGgoIHhwYXRoLCAiJHRoaXMiLCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgWFBhdGggY29tcGlsZVhQYXRoICggU3RyaW5nIHhwYXRoLCBTdHJpbmcgY3VycmVudE5vZGVWYXIgKQotICAgICAgICB0aHJvd3MgWFBhdGhDb21waWxlRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gY29tcGlsZVhQYXRoKCB4cGF0aCwgY3VycmVudE5vZGVWYXIsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFhQYXRoIGNvbXBpbGVYUGF0aCAoIFN0cmluZyB4cGF0aCwgTWFwIG5hbWVzcGFjZXMgKQotICAgICAgICAgICAgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBpbGVYUGF0aCggeHBhdGgsICIkdGhpcyIsIG5hbWVzcGFjZXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBYUGF0aCBjb21waWxlWFBhdGggKAotICAgICAgICBTdHJpbmcgeHBhdGgsIFN0cmluZyBjdXJyZW50Tm9kZVZhciwgTWFwIG5hbWVzcGFjZXMgKQotICAgICAgICAgICAgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBuZXcgQ29tcGlsYXRpb25Db250ZXh0KCBuYW1lc3BhY2VzLCBjdXJyZW50Tm9kZVZhciApLgotICAgICAgICAgICAgICAgIGNvbXBpbGUoIHhwYXRoICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tcGlsYXRpb25Db250ZXh0Ci0gICAgewotICAgICAgICBDb21waWxhdGlvbkNvbnRleHQgKCBNYXAgbmFtZXNwYWNlcywgU3RyaW5nIGN1cnJlbnROb2RlVmFyICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0Ci0gICAgICAgICAgICAgICAgX2N1cnJlbnROb2RlVmFyID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgX2N1cnJlbnROb2RlVmFyLnN0YXJ0c1dpdGgoICIkIiApOwotCi0gICAgICAgICAgICBpZiAoY3VycmVudE5vZGVWYXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBfY3VycmVudE5vZGVWYXIgPSAiJHRoaXMiOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIF9jdXJyZW50Tm9kZVZhciA9IGN1cnJlbnROb2RlVmFyOwotCi0gICAgICAgICAgICBfbmFtZXNwYWNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF9leHRlcm5hbE5hbWVzcGFjZXMgPQotICAgICAgICAgICAgICAgIG5hbWVzcGFjZXMgPT0gbnVsbCA/IG5ldyBIYXNoTWFwKCkgOiBuYW1lc3BhY2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgWFBhdGggY29tcGlsZSAoIFN0cmluZyBleHByICkgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBfb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIF9saW5lID0gMTsKLSAgICAgICAgICAgIF9jb2x1bW4gPSAxOwotICAgICAgICAgICAgX2V4cHIgPSBleHByOwotCi0gICAgICAgICAgICByZXR1cm4gdG9rZW5pemVYUGF0aCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnQgY3VyckNoYXIgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjdXJyQ2hhciggMCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnQgY3VyckNoYXIgKCBpbnQgb2Zmc2V0ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgX29mZnNldCArIG9mZnNldCA+PSBfZXhwci5sZW5ndGgoKQotICAgICAgICAgICAgICAgICAgICA/IC0xCi0gICAgICAgICAgICAgICAgICAgIDogX2V4cHIuY2hhckF0KCBfb2Zmc2V0ICsgb2Zmc2V0ICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHZvaWQgYWR2YW5jZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9vZmZzZXQgPCBfZXhwci5sZW5ndGgoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGFyIGNoID0gX2V4cHIuY2hhckF0KCBfb2Zmc2V0ICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgX29mZnNldCsrOwotICAgICAgICAgICAgICAgIF9jb2x1bW4rKzsKLQotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfbGluZSsrOwotICAgICAgICAgICAgICAgICAgICBfY29sdW1uID0gMTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoX29mZnNldCArIDEgPCBfZXhwci5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBuZXh0Q2ggPSBfZXhwci5jaGFyQXQoIF9vZmZzZXQgKyAxICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobmV4dENoID09ICdccicgfHwgbmV4dENoID09ICdcbicpICYmIGNoICE9IG5leHRDaCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb2Zmc2V0Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkdmFuY2UgKCBpbnQgY291bnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgY291bnQgPj0gMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgd2hpbGUgKCBjb3VudC0tID4gMCApCi0gICAgICAgICAgICAgICAgYWR2YW5jZSgpOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gaXNXaGl0ZXNwYWNlICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaXNXaGl0ZXNwYWNlKCAwICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gaXNXaGl0ZXNwYWNlICggaW50IG9mZnNldCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjaCA9IGN1cnJDaGFyKCBvZmZzZXQgKTsKLSAgICAgICAgICAgIHJldHVybiBjaCA9PSAnICcgfHwgY2ggPT0gJ1x0JyB8fCBjaCA9PSAnXG4nIHx8IGNoID09ICdccic7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzTkNOYW1lU3RhcnQgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIGN1cnJDaGFyKCkgPT0gLTEKLSAgICAgICAgICAgICAgICAgICAgPyBmYWxzZSA6Ci0gICAgICAgICAgICAgICAgICAgIFhNTENoYXIuaXNOQ05hbWVTdGFydCggY3VyckNoYXIoKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIGlzTkNOYW1lICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBjdXJyQ2hhcigpID09IC0xCi0gICAgICAgICAgICAgICAgICAgID8gZmFsc2UgOgotICAgICAgICAgICAgICAgICAgICBYTUxDaGFyLmlzTkNOYW1lKCBjdXJyQ2hhcigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gc3RhcnRzV2l0aCAoIFN0cmluZyBzICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHN0YXJ0c1dpdGgoIHMsIDAgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBzdGFydHNXaXRoICggU3RyaW5nIHMsIGludCBvZmZzZXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX29mZnNldCArIG9mZnNldCA+PSBfZXhwci5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBfZXhwci5zdGFydHNXaXRoKCBzLCBfb2Zmc2V0ICsgb2Zmc2V0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbiBuZXdFcnJvciAoIFN0cmluZyBtc2cgKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxFcnJvciBlcnIgPQotICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvckxvY2F0aW9uKAotICAgICAgICAgICAgICAgICAgICBtc2csIFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SLCBudWxsLAotICAgICAgICAgICAgICAgICAgICBfbGluZSwgX2NvbHVtbiwgX29mZnNldCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG5ldyBYUGF0aENvbXBpbGVFeGNlcHRpb24oIGVyciApOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGxvb2t1cFByZWZpeCAoIFN0cmluZyBwcmVmaXggKSB0aHJvd3MgWFBhdGhDb21waWxlRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbmFtZXNwYWNlcy5jb250YWluc0tleSggcHJlZml4ICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIF9uYW1lc3BhY2VzLmdldCggcHJlZml4ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChfZXh0ZXJuYWxOYW1lc3BhY2VzLmNvbnRhaW5zS2V5KCBwcmVmaXggKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgX2V4dGVybmFsTmFtZXNwYWNlcy5nZXQoIHByZWZpeCApOwotCi0gICAgICAgICAgICBpZiAocHJlZml4LmVxdWFscyggInhtbCIgKSkKLSAgICAgICAgICAgICAgICAgIHJldHVybiAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMoICJ4cyIgKSkKLSAgICAgICAgICAgICAgICAgIHJldHVybiAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocHJlZml4LmVxdWFscyggInhzaSIgKSkKLSAgICAgICAgICAgICAgICAgIHJldHVybiAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocHJlZml4LmVxdWFscyggImZuIiApKQotICAgICAgICAgICAgICAgICAgcmV0dXJuICJodHRwOi8vd3d3LnczLm9yZy8yMDAyLzExL3hxdWVyeS1mdW5jdGlvbnMiOwotCi0gICAgICAgICAgICB0aHJvdyBuZXdFcnJvciggIlVuZGVmaW5lZCBwcmVmaXg6ICIgKyBwcmVmaXggKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZVdoaXRlc3BhY2UgKCApIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBzYXdTcGFjZSA9IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB3aGlsZSAoIGlzV2hpdGVzcGFjZSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZHZhbmNlKCk7Ci0gICAgICAgICAgICAgICAgc2F3U3BhY2UgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2F3U3BhY2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRva2VuaXppbmcgd2lsbCBjb25zdW1lIHdoaXRlc3BhY2UgZm9sbG93ZWQgYnkgdGhlIHRva2Vucywgc2VwYXJhdGVkCi0gICAgICAgIC8vIGJ5IHdoaXRlc3BhY2UuICBUaGUgd2hpdGVzcGFjZSBmb2xsb3dpbmcgdGhlIGxhc3QgdG9rZW4gaXMgbm90Ci0gICAgICAgIC8vIGNvbnN1bWVkLgotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHRva2VuaXplICggU3RyaW5nIHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcy5sZW5ndGgoKSA+IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOwotCi0gICAgICAgICAgICB3aGlsZSAoIGlzV2hpdGVzcGFjZSggb2Zmc2V0ICkgKQotICAgICAgICAgICAgICAgIG9mZnNldCsrOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIXN0YXJ0c1dpdGgoIHMsIG9mZnNldCApKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgb2Zmc2V0ICs9IHMubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIGFkdmFuY2UoIG9mZnNldCApOwotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiB0b2tlbml6ZSAoIFN0cmluZyBzMSwgU3RyaW5nIHMyICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IHMxLmxlbmd0aCgpID4gMDsKLSAgICAgICAgICAgIGFzc2VydCBzMi5sZW5ndGgoKSA+IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOwotCi0gICAgICAgICAgICB3aGlsZSAoIGlzV2hpdGVzcGFjZSggb2Zmc2V0ICkgKQotICAgICAgICAgICAgICAgIG9mZnNldCsrOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIXN0YXJ0c1dpdGgoIHMxLCBvZmZzZXQgKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIG9mZnNldCArPSBzMS5sZW5ndGgoKTsKLQotICAgICAgICAgICAgd2hpbGUgKCBpc1doaXRlc3BhY2UoIG9mZnNldCApICkKLSAgICAgICAgICAgICAgICBvZmZzZXQrKzsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFzdGFydHNXaXRoKCBzMiwgb2Zmc2V0ICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgb2Zmc2V0ICs9IHMyLmxlbmd0aCgpOwotCi0gICAgICAgICAgICBhZHZhbmNlKCBvZmZzZXQgKTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gdG9rZW5pemUgKCBTdHJpbmcgczEsIFN0cmluZyBzMiwgU3RyaW5nIHMzICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IHMxLmxlbmd0aCgpID4gMDsKLSAgICAgICAgICAgIGFzc2VydCBzMi5sZW5ndGgoKSA+IDA7Ci0gICAgICAgICAgICBhc3NlcnQgczMubGVuZ3RoKCkgPiAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKLQotICAgICAgICAgICAgd2hpbGUgKCBpc1doaXRlc3BhY2UoIG9mZnNldCApICkKLSAgICAgICAgICAgICAgICBvZmZzZXQrKzsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFzdGFydHNXaXRoKCBzMSwgb2Zmc2V0ICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBvZmZzZXQgKz0gczEubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlICggaXNXaGl0ZXNwYWNlKCBvZmZzZXQgKSApCi0gICAgICAgICAgICAgICAgb2Zmc2V0Kys7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghc3RhcnRzV2l0aCggczIsIG9mZnNldCApKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIG9mZnNldCArPSBzMi5sZW5ndGgoKTsKLQotICAgICAgICAgICAgd2hpbGUgKCBpc1doaXRlc3BhY2UoIG9mZnNldCApICkKLSAgICAgICAgICAgICAgICBvZmZzZXQrKzsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFzdGFydHNXaXRoKCBzMywgb2Zmc2V0ICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBvZmZzZXQgKz0gczMubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBhZHZhbmNlKCBvZmZzZXQgKTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyB0b2tlbml6ZU5DTmFtZSAoICkgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBwYXJzZVdoaXRlc3BhY2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFpc05DTmFtZVN0YXJ0KCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3RXJyb3IoICJFeHBlY3RlZCBub24tY29sb25pemVkIG5hbWUiICk7Ci0KLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgc2IuYXBwZW5kKCAoY2hhcikgY3VyckNoYXIoKSApOwotCi0gICAgICAgICAgICBmb3IgKCBhZHZhbmNlKCkgOyBpc05DTmFtZSgpIDsgYWR2YW5jZSgpICkKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIChjaGFyKSBjdXJyQ2hhcigpICk7Ci0KLSAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBRTmFtZSBnZXRBbnlRTmFtZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSggIiIsICIiICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgUU5hbWUgdG9rZW5pemVRTmFtZSAoICkgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodG9rZW5pemUoICIqIiApKQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRBbnlRTmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgbmNOYW1lID0gdG9rZW5pemVOQ05hbWUoKTsKLQotICAgICAgICAgICAgaWYgKCF0b2tlbml6ZSggIjoiICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSggbG9va3VwUHJlZml4KCAiIiApLCBuY05hbWUgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICBsb29rdXBQcmVmaXgoIG5jTmFtZSApLAotICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZSggIioiICkgPyAiIiA6IHRva2VuaXplTkNOYW1lKCkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW5pemVRdW90ZWRVcmkgKCApIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgY2hhciBxdW90ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHRva2VuaXplKCAiXCIiICkpCi0gICAgICAgICAgICAgICAgcXVvdGUgPSAnIic7Ci0gICAgICAgICAgICBlbHNlICBpZiAodG9rZW5pemUoICInIiApKQotICAgICAgICAgICAgICAgIHF1b3RlID0gJ1wnJzsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXdFcnJvciggIkV4cGVjdGVkIHF1b3RlIChcIiBvciAnKSIgKTsKLQotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjdXJyQ2hhcigpID09IC0xKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXdFcnJvciggIlBhdGggdGVybWluYXRlZCBpbiBVUkkgbGl0ZXJhbCIgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoY3VyckNoYXIoKSA9PSBxdW90ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyQ2hhcigpICE9IHF1b3RlKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggKGNoYXIpIGN1cnJDaGFyKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBhZHZhbmNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdGVwIGFkZFN0ZXAgKCBib29sZWFuIGRlZXAsIGJvb2xlYW4gYXR0ciwgUU5hbWUgbmFtZSwgU3RlcCBzdGVwcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0ZXAgc3RlcCA9IG5ldyBTdGVwKCBkZWVwLCBhdHRyLCBuYW1lICk7Ci0KLSAgICAgICAgICAgIGlmIChzdGVwcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBzdGVwOwotCi0gICAgICAgICAgICBTdGVwIHMgPSBzdGVwczsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgd2hpbGUgKCBzdGVwcy5fbmV4dCAhPSBudWxsICkKLSAgICAgICAgICAgICAgICBzdGVwcyA9IHN0ZXBzLl9uZXh0OwotCi0gICAgICAgICAgICBzdGVwcy5fbmV4dCA9IHN0ZXA7Ci0gICAgICAgICAgICBzdGVwLl9wcmV2ID0gc3RlcHM7Ci0KLSAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdGVwIHRva2VuaXplU3RlcHMgKCApIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRva2VuaXplKCAiLyIgKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXdFcnJvciggIkFic29sdXRlIHBhdGhzIHVuc3VwcG9ydGVkIiApOwotCi0gICAgICAgICAgICBib29sZWFuIGRlZXA7Ci0KLSAgICAgICAgICAgIGlmICh0b2tlbml6ZSggIiQiLCBfY3VycmVudE5vZGVWYXIsICIvLyIgKSB8fCB0b2tlbml6ZSggIi4iLCAiLy8iICkpCi0gICAgICAgICAgICAgICAgZGVlcCA9IHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmICh0b2tlbml6ZSggIiQiLCBfY3VycmVudE5vZGVWYXIsICIvIiApIHx8IHRva2VuaXplKCAiLiIsICIvIiApKQotICAgICAgICAgICAgICAgIGRlZXAgPSBmYWxzZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuaXplKCAiJCIsIF9jdXJyZW50Tm9kZVZhciApIHx8IHRva2VuaXplKCAiLiIgKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gYWRkU3RlcCggZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZGVlcCA9IGZhbHNlOwotCi0gICAgICAgICAgICBTdGVwIHN0ZXBzID0gbnVsbDsKLQotICAgICAgICAgICAgLy8gQ29tcGlsZSB0aGUgc3RlcHMgcmVtb3ZpbmcgLy4gYW5kIG1lcmdpbmQgLy8uIHdpdGggdGhlIG5leHQgc3RlcAotCi0gICAgICAgICAgICBib29sZWFuIGRlZXBEb3QgPSBmYWxzZTsKLQotICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodG9rZW5pemUoICJhdHRyaWJ1dGUiLCAiOjoiICkgfHwgdG9rZW5pemUoICJAIiApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RlcHMgPSBhZGRTdGVwKCBkZWVwLCB0cnVlLCB0b2tlbml6ZVFOYW1lKCksIHN0ZXBzICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFFOYW1lIG5hbWU7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHRva2VuaXplKCAiLiIgKSkKLSAgICAgICAgICAgICAgICAgICAgZGVlcERvdCA9IGRlZXBEb3QgfHwgZGVlcDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICh0b2tlbml6ZSggImNoaWxkIiwgIjo6IiApICYmIChuYW1lID0gdG9rZW5pemVRTmFtZSgpKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBzdGVwcyA9IGFkZFN0ZXAoIGRlZXAsIGZhbHNlLCBuYW1lLCBzdGVwcyApOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKChuYW1lID0gdG9rZW5pemVRTmFtZSgpKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBzdGVwcyA9IGFkZFN0ZXAoIGRlZXAsIGZhbHNlLCBuYW1lLCBzdGVwcyApOwotCi0gICAgICAgICAgICAgICAgaWYgKHRva2VuaXplKCAiLy8iICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkZWVwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZGVlcERvdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh0b2tlbml6ZSggIi8iICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGVlcERvdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZXAgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiB0aGVyZSB3YXMgYSAvLy4gYXQgdGhlIGVuZCBvZiB0aCBwYXRoLCB0aGVuIHdlIG5lZWQgdG8gbWFrZQotICAgICAgICAgICAgLy8gdHdvIHBhdGhzLCBvbmUgd2l0aCAqIGF0IHRoZSBlbmQgYW5kIGFub3RoZXIgd2l0aCBAKiBhdCB0aGUgZW5kLgotCi0gICAgICAgICAgICBpZiAoKF9sYXN0RGVlcERvdCA9IGRlZXBEb3QpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9sYXN0RGVlcERvdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc3RlcHMgPSBhZGRTdGVwKCB0cnVlLCBmYWxzZSwgZ2V0QW55UU5hbWUoKSwgc3RlcHMgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQWRkIHNlbnRpbmFsIHN0ZXAgKF9uYW1lID09IG51bGwpCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBhZGRTdGVwKCBmYWxzZSwgZmFsc2UsIG51bGwsIHN0ZXBzICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY29tcHV0ZUJhY2t0cmFjayAoIFN0ZXAgc3RlcHMgKQotICAgICAgICAgICAgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gQ29tcHV0ZSBzdGF0aWMgYmFja3RyYWNrIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IEkgdXNlIHRoZSBmYWN0IHRoYXQgX2hhc0JhY2t0cmFjayBpcyBpbml0aWFsaXplZCB0bwotICAgICAgICAgICAgLy8gZmFsc2UgYW5kIF9iYWNrdHJhY2sgdG8gbnVsbCBpbiB0aGUgZm9sbG93aW5nIGNvZGUuCi0gICAgICAgICAgICAvLwotCi0gICAgICAgICAgICBTdGVwIHMsIHQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoIHMgPSBzdGVwcyA7IHMgIT0gbnVsbCA7IHMgPSB0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBzZWdtZW50IGZyb20gWyBzLCB0ICkKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKCB0ID0gcy5fbmV4dCA7IHQgIT0gbnVsbCAmJiAhdC5fZGVlcCA7ICkKLSAgICAgICAgICAgICAgICAgICAgdCA9IHQuX25leHQ7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2VnbWVudCBpcyBOT1Qgcm9vdGVkIGF0IC8vLCB0aGVuIHRoZSBiYWNrdHJhY2sgaXMKLSAgICAgICAgICAgICAgICAvLyBudWxsIGZvciB0aGUgZW50aXJlIHNlZ21lbnQsIGluY2x1ZGluZyBwb3NzaWJsZSBhdHRyIGFuZC9vcgotICAgICAgICAgICAgICAgIC8vIHNlbnRpbmFsCi0KLSAgICAgICAgICAgICAgICBpZiAoIXMuX2RlZXApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IgKCBTdGVwIHUgPSBzIDsgdSAhPSB0IDsgdSA9IHUuX25leHQgKQotICAgICAgICAgICAgICAgICAgICAgICAgdS5faGFzQmFja3RyYWNrID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBzZXF1ZW5jZSBbIHMsIHUgKSBvZiBsZW5ndGggbiB3aGljaCBjb250YWluIG5vCi0gICAgICAgICAgICAgICAgLy8gd2lsZCBzdGVwcy4KLQotICAgICAgICAgICAgICAgIGludCBuID0gMDsKLSAgICAgICAgICAgICAgICBTdGVwIHUgPSBzOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKCB1ICE9IHQgJiYgdS5fbmFtZSAhPSBudWxsICYmICF1LmlzV2lsZCgpICYmICF1Ll9hdHRyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG4rKzsKLSAgICAgICAgICAgICAgICAgICAgdSA9IHUuX25leHQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gTm93LCBhcHBseSBLTVAgdG8gWyBzLCB1ICkgZm9yIGZhc3QgYmFja3RyYWNraW5nCi0KLSAgICAgICAgICAgICAgICBRTmFtZSBbXSBwYXR0ZXJuID0gbmV3IFFOYW1lIFsgbiArIDEgXTsKLSAgICAgICAgICAgICAgICBpbnQgW10ga21wID0gbmV3IGludCBbIG4gKyAxIF07Ci0KLSAgICAgICAgICAgICAgICBTdGVwIHYgPSBzOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdHRlcm5bIGkgXSA9IHYuX25hbWU7Ci0gICAgICAgICAgICAgICAgICAgIHYgPSB2Ll9uZXh0OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBhdHRlcm5bIG4gXSA9IGdldEFueVFOYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IGogPSBrbXBbIDAgXSA9IC0xOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKCBpIDwgbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGogPiAtMSAmJiAhcGF0dGVyblsgaSBdLmVxdWFscyggcGF0dGVyblsgaiBdICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgaiA9IGttcFsgaiBdOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuWyArK2kgXS5lcXVhbHMoIHBhdHRlcm5bICsraiBdICkpCi0gICAgICAgICAgICAgICAgICAgICAgICBrbXBbIGkgXSA9IGttcFsgaiBdOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBrbXBbIGkgXSA9IGo7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yICggdiA9IHMgOyB2ICE9IHUgOyB2ID0gdi5fbmV4dCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2Ll9oYXNCYWNrdHJhY2sgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB2Ll9iYWNrdHJhY2sgPSBzOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZm9yICggaiA9IGttcFsgaSBdIDsgaiA+IDAgOyBqLS0gKQotICAgICAgICAgICAgICAgICAgICAgICAgdi5fYmFja3RyYWNrID0gdi5fYmFja3RyYWNrLl9uZXh0OwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIHN1Y2Nlc3MgYmFja3RyYWNrIGFuZCBzdHVmZiBpdCBpbnRvIGFuIGF0dHIgYW5kCi0gICAgICAgICAgICAgICAgLy8gc2VudGluYWwgaWYgdGhleSBleGlzdCBmb3IgdGhpcyBzZWdtZW50Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdiA9IHM7Ci0KLSAgICAgICAgICAgICAgICBpZiAobiA+IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IgKCBqID0ga21wWyBuIC0gMSBdIDsgaiA+IDAgOyBqLS0gKQotICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHYuX25leHQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHUgIT0gdCAmJiB1Ll9hdHRyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdS5faGFzQmFja3RyYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgdS5fYmFja3RyYWNrID0gdjsKLSAgICAgICAgICAgICAgICAgICAgdSA9IHUuX25leHQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHUgIT0gdCAmJiB1Ll9uYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB1Ll9oYXNCYWNrdHJhY2sgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB1Ll9iYWNrdHJhY2sgPSB2OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBwYXJ0IG9mIGEgZGVlcCBzZWdtZW50IGFsd2F5cyBiYWNrdHJhY2tzIHRvIGl0c2VsZgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGFzc2VydCBzLl9kZWVwOwotCi0gICAgICAgICAgICAgICAgcy5faGFzQmFja3RyYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzLl9iYWNrdHJhY2sgPSBzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHRva2VuaXplUGF0aCAoIEFycmF5TGlzdCBwYXRocyApCi0gICAgICAgICAgICB0aHJvd3MgWFBhdGhDb21waWxlRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9sYXN0RGVlcERvdCA9IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdGVwIHN0ZXBzID0gdG9rZW5pemVTdGVwcygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjb21wdXRlQmFja3RyYWNrKCBzdGVwcyApOwotCi0gICAgICAgICAgICBwYXRocy5hZGQoIHN0ZXBzICk7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBsYXN0IHBhdGggZW5kZWQgaW4gLy8uLCB0aGF0IHBhdGggd2lsbCBtYXRjaCBhbGwKLSAgICAgICAgICAgIC8vIGVsZW1lbnRzLCBoZXJlIEkgbWFrZSBhIHBhdGggd2hpY2ggbWF0Y2hlcyBhbGwgYXR0cmlidXRlcy4KLQotICAgICAgICAgICAgaWYgKF9sYXN0RGVlcERvdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfc2F3RGVlcERvdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3RlcCBzID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoIFN0ZXAgdCA9IHN0ZXBzIDsgdCAhPSBudWxsIDsgdCA9IHQuX25leHQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuX25leHQgIT0gbnVsbCAmJiB0Ll9uZXh0Ll9uZXh0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBzID0gYWRkU3RlcCggdC5fZGVlcCwgdHJ1ZSwgdC5fbmFtZSwgcyApOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzID0gYWRkU3RlcCggdC5fZGVlcCwgdC5fYXR0ciwgdC5fbmFtZSwgcyApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNvbXB1dGVCYWNrdHJhY2soIHMgKTsKLQotICAgICAgICAgICAgICAgIHBhdGhzLmFkZCggcyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFNlbGVjdG9yIHRva2VuaXplU2VsZWN0b3IgKCApIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgQXJyYXlMaXN0IHBhdGhzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICB0b2tlbml6ZVBhdGgoIHBhdGhzICk7Ci0KLSAgICAgICAgICAgIHdoaWxlICggdG9rZW5pemUoICJ8IiApICkKLSAgICAgICAgICAgICAgICB0b2tlbml6ZVBhdGgoIHBhdGhzICk7Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0b3IoIChTdGVwW10pIHBhdGhzLnRvQXJyYXkoIG5ldyBTdGVwIFsgMCBdICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgWFBhdGggdG9rZW5pemVYUGF0aCAoICkgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh0b2tlbml6ZSggImRlY2xhcmUiLCAibmFtZXNwYWNlIiApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVdoaXRlc3BhY2UoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ld0Vycm9yKCAiRXhwZWN0ZWQgcHJlZml4IGFmdGVyICdkZWNsYXJlIG5hbWVzcGFjZSciICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHRva2VuaXplTkNOYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2tlbml6ZSggIj0iICkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXdFcnJvciggIkV4cGVjdGVkICc9JyIgKTsKLQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gdG9rZW5pemVRdW90ZWRVcmkoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChfbmFtZXNwYWNlcy5jb250YWluc0tleSggcHJlZml4ICkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ld0Vycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWRlZmluaXRpb24gb2YgbmFtZXNwYWNlIHByZWZpeDogIiArIHByZWZpeCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgX25hbWVzcGFjZXMucHV0KCBwcmVmaXgsIHVyaSApOwotCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAodG9rZW5pemUoICJkZWZhdWx0IiwgImVsZW1lbnQiLCAibmFtZXNwYWNlIiApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2tlbml6ZSggIj0iICkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXdFcnJvciggIkV4cGVjdGVkICc9JyIgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSB0b2tlbml6ZVF1b3RlZFVyaSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9uYW1lc3BhY2VzLmNvbnRhaW5zS2V5KCAiIiApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXdFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVkZWZpbml0aW9uIG9mIGRlZmF1bHQgZWxlbWVudCBuYW1lc3BhY2UiICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBfbmFtZXNwYWNlcy5wdXQoICIiLCB1cmkgKTsKLQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCB0aGUgZGVmYXVsdCBwcmVmaXggbWFwcGluZyBpZiBpdCBoYXMgbm90IGJlZW4gcmVkZWZpbmVkCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghX25hbWVzcGFjZXMuY29udGFpbnNLZXkoICIiICkpCi0gICAgICAgICAgICAgICAgX25hbWVzcGFjZXMucHV0KCAiIiwgIiIgKTsKLQotICAgICAgICAgICAgU2VsZWN0b3Igc2VsZWN0b3IgPSB0b2tlbml6ZVNlbGVjdG9yKCk7Ci0KLSAgICAgICAgICAgIHBhcnNlV2hpdGVzcGFjZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY3VyckNoYXIoKSAhPSAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXdFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgY2hhciAnIiArIChjaGFyKSBjdXJyQ2hhcigpICsgIiciICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgWFBhdGgoIHNlbGVjdG9yLCBfc2F3RGVlcERvdCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX2V4cHI7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIF9zYXdEZWVwRG90OyAgLy8gU2F3IG9uZSBvdmVyYWxsCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBfbGFzdERlZXBEb3Q7Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX2N1cnJlbnROb2RlVmFyOwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBNYXAgX25hbWVzcGFjZXM7Ci0gICAgICAgIHByaXZhdGUgTWFwIF9leHRlcm5hbE5hbWVzcGFjZXM7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIGludCBfb2Zmc2V0OwotICAgICAgICBwcml2YXRlIGludCBfbGluZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgX2NvbHVtbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTdGVwCi0gICAgewotICAgICAgICBTdGVwICggYm9vbGVhbiBkZWVwLCBib29sZWFuIGF0dHIsIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfbmFtZSA9IG5hbWU7Ci0KLSAgICAgICAgICAgIF9kZWVwID0gZGVlcDsKLSAgICAgICAgICAgIF9hdHRyID0gYXR0cjsKLQotICAgICAgICAgICAgaW50IGZsYWdzID0gMDsKLQotICAgICAgICAgICAgaWYgKF9kZWVwIHx8ICFfYXR0cikKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBFeGVjdXRpb25Db250ZXh0LkRFU0NFTkQ7Ci0KLSAgICAgICAgICAgIGlmIChfYXR0cikKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBFeGVjdXRpb25Db250ZXh0LkFUVFJTOwotCi0gICAgICAgICAgICBfZmxhZ3MgPSBmbGFnczsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNXaWxkICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX25hbWUuZ2V0TG9jYWxQYXJ0KCkubGVuZ3RoKCkgPT0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gbWF0Y2ggKCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGxvY2FsID0gX25hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0KLSAgICAgICAgICAgIGlmIChsb2NhbC5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBfbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgIGlmICh1cmkubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdXJpLmVxdWFscyggbmFtZS5nZXROYW1lc3BhY2VVUkkoKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gX25hbWUuZXF1YWxzKCBuYW1lICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBib29sZWFuIF9hdHRyOwotICAgICAgICBmaW5hbCBib29sZWFuIF9kZWVwOwotCi0gICAgICAgIGludCBfZmxhZ3M7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBRTmFtZSBfbmFtZTsKLQotICAgICAgICBTdGVwIF9uZXh0LCBfcHJldjsKLQotICAgICAgICBib29sZWFuIF9oYXNCYWNrdHJhY2s7Ci0gICAgICAgIFN0ZXAgICAgX2JhY2t0cmFjazsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTZWxlY3RvcgotICAgIHsKLSAgICAgICAgU2VsZWN0b3IgKCBTdGVwW10gcGF0aHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGF0aHMgPSBwYXRoczsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0ZXBbXSBfcGF0aHM7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0gICAgCi0gICAgcHJpdmF0ZSBYUGF0aCAoIFNlbGVjdG9yIHNlbGVjdG9yLCBib29sZWFuIHNhd0RlZXBEb3QgKQotICAgIHsKLSAgICAgICAgX3NlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgIF9zYXdEZWVwRG90ID0gc2F3RGVlcERvdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzYXdEZWVwRG90ICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zYXdEZWVwRG90OwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgU2VsZWN0b3IgX3NlbGVjdG9yOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiAgX3Nhd0RlZXBEb3Q7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbEVuY29kaW5nU25pZmZlci5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbEVuY29kaW5nU25pZmZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzgxYWVjLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFbmNvZGluZ1NuaWZmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBYbWxFbmNvZGluZ1NuaWZmZXIKLXsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgIF94bWxlbmNvZGluZzsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgIF9qYXZhZW5jb2Rpbmc7Ci0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBfc3RyZWFtOwotICAgIHByaXZhdGUgUmVhZGVyICAgICAgX3JlYWRlcjsKLQotICAgIC8qKgotICAgICAqIFNuaWZmcyB0aGUgZ2l2ZW4gWE1MIHN0cmVhbSBmb3IgZW5jb2RpbmcgaW5mb3JtYXRpb24uCi0gICAgICoKLSAgICAgKiBBZnRlciBhIHNuaWZmZXIgaXMgY29uc3RydWN0ZWQsIGl0IGNhbiByZXR1cm4gZWl0aGVyIGEgc3RyZWFtCi0gICAgICogKHdoaWNoIGlzIGEgYnVmZmVyZWQgc3RyZWFtIHdyYXBwZXIgb2YgdGhlIG9yaWdpbmFsKSBvciBhIHJlYWRlcgotICAgICAqICh3aGljaCBhcHBsaWVzIHRoZSBwcm9wZXIgZW5jb2RpbmcpLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmVhbSAgICAgICAgICAgVGhlIHN0cmVhbSB0byBzbmlmZgotICAgICAqIEBwYXJhbSBlbmNvZGluZ092ZXJyaWRlIFRoZSBYTUwgKElBTkEpIG5hbWUgZm9yIHRoZSBvdmVycmlkaW5nIGVuY29kaW5nCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBYbWxFbmNvZGluZ1NuaWZmZXIoSW5wdXRTdHJlYW0gc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmdPdmVycmlkZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBfc3RyZWFtID0gc3RyZWFtOwotICAgICAgICAKLSAgICAgICAgaWYgKGVuY29kaW5nT3ZlcnJpZGUgIT0gbnVsbCkKLSAgICAgICAgICAgIF94bWxlbmNvZGluZyA9IEVuY29kaW5nTWFwLmdldEphdmEySUFOQU1hcHBpbmcoZW5jb2RpbmdPdmVycmlkZSk7Ci0KLSAgICAgICAgaWYgKF94bWxlbmNvZGluZyA9PSBudWxsKQotICAgICAgICAgICAgX3htbGVuY29kaW5nID0gZW5jb2RpbmdPdmVycmlkZTsKLQotICAgICAgICBpZiAoX3htbGVuY29kaW5nID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNuaWZmZWRYbWxJbnB1dFN0cmVhbSBzbmlmZmVkID0gbmV3IFNuaWZmZWRYbWxJbnB1dFN0cmVhbShfc3RyZWFtKTsKLSAgICAgICAgICAgIF94bWxlbmNvZGluZyA9IHNuaWZmZWQuZ2V0WG1sRW5jb2RpbmcoKTsKLSAgICAgICAgICAgIGFzc2VydChfeG1sZW5jb2RpbmcgIT0gbnVsbCk7Ci0gICAgICAgICAgICBfc3RyZWFtID0gc25pZmZlZDsKLSAgICAgICAgfQotCi0gICAgICAgIF9qYXZhZW5jb2RpbmcgPSBFbmNvZGluZ01hcC5nZXRJQU5BMkphdmFNYXBwaW5nKF94bWxlbmNvZGluZyk7Ci0gICAgICAgIAotICAgICAgICAvLyB3ZSBhbGxvdyB5b3UgdG8gdXNlIEphdmEncyBlbmNvZGluZyBuYW1lcyBpbiBYTUwgZXZlbiB0aG91Z2ggeW91J3JlCi0gICAgICAgIC8vIG5vdCBzdXBwb3NlZCB0by4KLSAgICAgICAgCi0gICAgICAgIGlmIChfamF2YWVuY29kaW5nID09IG51bGwpCi0gICAgICAgICAgICBfamF2YWVuY29kaW5nID0gX3htbGVuY29kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNuaWZmcyB0aGUgZ2l2ZW4gWE1MIHN0cmVhbSBmb3IgZW5jb2RpbmcgaW5mb3JtYXRpb24uCi0gICAgICoKLSAgICAgKiBBZnRlciBhIHNuaWZmZXIgaXMgY29uc3RydWN0ZWQsIGl0IGNhbiByZXR1cm4gZWl0aGVyIGEgcmVhZGVyCi0gICAgICogKHdoaWNoIGlzIGEgYnVmZmVyZWQgc3RyZWFtIHdyYXBwZXIgb2YgdGhlIG9yaWdpbmFsKSBvciBhIHN0cmVhbQotICAgICAqICh3aGljaCBhcHBsaWVzIHRoZSBwcm9wZXIgZW5jb2RpbmcpLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlYWRlciAgICAgICAgICAgVGhlIHJlYWRlciB0byBzbmlmZgotICAgICAqIEBwYXJhbSBlbmNvZGluZ0RlZmF1bHQgIFRoZSBKYXZhIG5hbWUgZm9yIHRoZSBkZWZhdWx0IGVuY29kaW5nIHRvIGFwcGx5LCBVVEYtOCBpZiBudWxsLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sRW5jb2RpbmdTbmlmZmVyKFJlYWRlciByZWFkZXIsIFN0cmluZyBlbmNvZGluZ0RlZmF1bHQpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChlbmNvZGluZ0RlZmF1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIGVuY29kaW5nRGVmYXVsdCA9ICJVVEYtOCI7Ci0gICAgICAgIAotICAgICAgICBTbmlmZmVkWG1sUmVhZGVyIHNuaWZmZWRSZWFkZXIgPSBuZXcgU25pZmZlZFhtbFJlYWRlcihyZWFkZXIpOwotICAgICAgICBfcmVhZGVyID0gc25pZmZlZFJlYWRlcjsKLSAgICAgICAgX3htbGVuY29kaW5nID0gc25pZmZlZFJlYWRlci5nZXRYbWxFbmNvZGluZygpOwotCi0gICAgICAgIGlmIChfeG1sZW5jb2RpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3htbGVuY29kaW5nID0gRW5jb2RpbmdNYXAuZ2V0SmF2YTJJQU5BTWFwcGluZyhlbmNvZGluZ0RlZmF1bHQpOwotICAgICAgICAgICAgaWYgKF94bWxlbmNvZGluZyAhPSBudWxsKQotICAgICAgICAgICAgICAgIF9qYXZhZW5jb2RpbmcgPSBlbmNvZGluZ0RlZmF1bHQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgX3htbGVuY29kaW5nID0gZW5jb2RpbmdEZWZhdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF94bWxlbmNvZGluZyA9PSBudWxsKQotICAgICAgICAgICAgX3htbGVuY29kaW5nID0gIlVURi04IjsKLSAgICAgICAgCi0gICAgICAgIC8vIHdlIGFsbG93IHlvdSB0byB1c2UgSmF2YSdzIGVuY29kaW5nIG5hbWVzIGluIFhNTCBldmVuIHRob3VnaCB5b3UncmUKLSAgICAgICAgLy8gbm90IHN1cHBvc2VkIHRvLgotICAgICAgICAKLSAgICAgICAgX2phdmFlbmNvZGluZyA9IEVuY29kaW5nTWFwLmdldElBTkEySmF2YU1hcHBpbmcoX3htbGVuY29kaW5nKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChfamF2YWVuY29kaW5nID09IG51bGwpCi0gICAgICAgICAgICBfamF2YWVuY29kaW5nID0gX3htbGVuY29kaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF94bWxlbmNvZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEphdmFFbmNvZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gX2phdmFlbmNvZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0U3RyZWFtKCkKLSAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoX3N0cmVhbSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IF9zdHJlYW07Ci0gICAgICAgICAgICBfc3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBpczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfcmVhZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IFJlYWRlcklucHV0U3RyZWFtKCBfcmVhZGVyLCBfamF2YWVuY29kaW5nICk7Ci0gICAgICAgICAgICBfcmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBpczsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgcHVibGljIFJlYWRlciBnZXRSZWFkZXIgKCApCi0gICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoX3JlYWRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gX3JlYWRlcjsKLSAgICAgICAgICAgIF9yZWFkZXIgPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIHJlYWRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfc3RyZWFtICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIF9zdHJlYW0sIF9qYXZhZW5jb2RpbmcgKTsKLSAgICAgICAgICAgIF9zdHJlYW0gPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIHJlYWRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFcnJvckNvbnRleHQuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFcnJvckNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmZTQ1ZC4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXJyb3JDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWG1sRXJyb3JDb250ZXh0Ci17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOTk9UX0xPQURfWFNEX0ZJTEUgICAgICAgICAgICAgID0gICAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTk5PVF9MT0FEX1hTRF9DT05GSUdfRklMRSAgICAgICA9ICAgMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19TQ0hFTUFfRUxFTUVOVCAgICAgICAgICAgICAgICAgPSAgIDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlTTUFUQ0hFRF9UQVJHRVRfTkFNRVNQQUNFICAgICAgID0gICA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMT0JBTF9UWVBFX01JU1NJTkdfTkFNRSAgICAgICAgICA9ICAgNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgPSAgIDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVEVU5EQU5UX05FU1RFRF9UWVBFICAgICAgICAgICAgID0gICA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfTUlTU0lOR19OQU1FICAgICAgICAgICAgICA9ICAgODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRURVTkRBTlRfREVGQVVMVF9GSVhFRCAgICAgICAgICAgPSAgIDk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfR1JPVVBfTUlTU0lOR19OQU1FICAgICAgICAgID0gIDEwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURV9NSVNTSU5HX05BTUUgICAgICAgICAgICA9ICAxMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVfR1JPVVBfTUlTU0lOR19OQU1FICAgICAgPSAgMTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1lDTElDX0RFUEVOREVOQ1kgICAgICAgICAgICAgICAgID0gIDEzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOSU9OX01FTUJFUl9OT1RfU0lNUExFICAgICAgICAgICA9ICAxNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNUUklDVElPTl9SRURVTkRBTlRfQkFTRSAgICAgICAgPSAgMTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVFJJQ1RJT05fTUlTU0lOR19CQVNFICAgICAgICAgID0gIDE2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTVBMRV9SRVNUUklDVElPTl9OT1RfU0lNUExFICAgICA9ICAxNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9ET0VTX05PVF9BUFBMWSAgICAgICAgICAgICAgPSAgMTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDRVRfRFVQTElDQVRFRCAgICAgICAgICAgICAgICAgID0gIDE5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX1ZBTFVFX01BTEZPUk1FRCAgICAgICAgICAgICA9ICAyMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9GSVhFRCAgICAgICAgICAgICAgICAgICAgICAgPSAgMjE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFMRk9STUVEX05VTUJFUiAgICAgICAgICAgICAgICAgID0gIDIxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJU1RfTUlTU0lOR19JVEVNICAgICAgICAgICAgICAgICA9ICAyMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVNUX0lURU1fTk9UX1NJTVBMRSAgICAgICAgICAgICAgPSAgMjM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElTVF9PRl9MSVNUICAgICAgICAgICAgICAgICAgICAgID0gIDI0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJU1RfV0hJVEVTUEFDRSAgICAgICAgICAgICAgICAgICA9ICAyNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRURVTkRBTlRfQ09OVEVOVF9NT0RFTCAgICAgICAgICAgPSAgMjY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlTU0lOR19SRVNUUklDVElPTl9PUl9FWFRFTlNJT04gID0gIDI3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JU1NJTkdfQkFTRSAgICAgICAgICAgICAgICAgICAgICA9ICAyODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX1JFRl9OT1RfRk9VTkQgICAgICAgICAgICAgPSAgMjk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9FWFRSQV9SRUYgICAgICAgICAgICAgICAgID0gIDMwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTF9DT05URU5UUyAgICAgICAgICAgICAgICAgICAgICA9ICAzMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBMSUNJVF9HUk9VUF9ORUVERUQgICAgICAgICAgICAgPSAgMzI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1JPVVBfTUlTU0lOR19SRUYgICAgICAgICAgICAgICAgID0gIDMzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX0dST1VQX05PVF9GT1VORCAgICAgICAgICAgICA9ICAzNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fTUFYX09DQ1VSUyAgICAgICAgICAgICAgICAgICAgPSAgMzU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX1JFRl9OT1RfRk9VTkQgICAgICAgICAgID0gIDM2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERVUExJQ0FURV9BVFRSSUJVVEVfTkFNRSAgICAgICAgICA9ICAzNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVVBMSUNBVEVfQU5ZX0FUVFJJQlVURSAgICAgICAgICAgPSAgMzg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX0dST1VQX01JU1NJTkdfUkVGICAgICAgID0gIDM5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURV9HUk9VUF9OT1RfRk9VTkQgICAgICAgICA9ICA0MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QTEVYX0JBU0VfTk9UX0NPTVBMRVggICAgICAgICAgPSAgNDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOTk9UX0VYVEVORF9BTEwgICAgICAgICAgICAgICAgID0gIDQyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTVBMRV9CQVNFX05PVF9TSU1QTEUgICAgICAgICAgICA9ICA0MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNFUlZFRF9UWVBFX05BTUUgICAgICAgICAgICAgICAgPSAgNDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUxMRUdBTF9SRVNUUklDVElPTiAgICAgICAgICAgICAgID0gIDQ1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfU0NIRU1BICAgICAgICAgICAgICAgICAgICA9ICA0NjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVVBMSUNBVEVfR0xPQkFMX0VMRU1FTlQgICAgICAgICAgPSAgNDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFVQTElDQVRFX0dMT0JBTF9BVFRSSUJVVEUgICAgICAgID0gIDQ4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERVUExJQ0FURV9HTE9CQUxfVFlQRSAgICAgICAgICAgICA9ICA0OTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNPTlNJU1RFTlRfVFlQRSAgICAgICAgICAgICAgICAgPSAgNTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TVVBQT1JURURfRkVBVFVSRSAgICAgICAgICAgICAgID0gIDUxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BTEZPUk1FRF9TSU1QTEVfVFlQRV9ERUZOICAgICAgICA9ICA1MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX05BTUUgICAgICAgICAgICAgICAgICAgICAgPSAgNTM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOTk9UX0RFUklWRV9GSU5BTCAgICAgICAgICAgICAgID0gIDU0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEQ19OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICA9ICA1NTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQU5OT1RfRklORF9SRVNPVVJDRSAgICAgICAgICAgICAgPSAgNTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9OREVURVJNSU5JU1RJQ19NT0RFTCAgICAgICAgICAgID0gIDU3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhQQVRIX0NPTVBJTEFUSU9OX0ZBSUxVUkUgICAgICAgICA9ICA1ODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU5FUklDX0VSUk9SICAgICAgICAgICAgICAgICAgICAgPSAgNjA7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXJyb3JQcmludGVyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXJyb3JQcmludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2OTU1ZTYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbEVycm9yUHJpbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1wdWJsaWMgY2xhc3MgWG1sRXJyb3JQcmludGVyIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uCi17Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9ub2lzeTsKLSAgICBwcml2YXRlIFVSSSBfYmFzZVVSSTsKLQotICAgIHB1YmxpYyBYbWxFcnJvclByaW50ZXIoYm9vbGVhbiBub2lzeSwgVVJJIGJhc2VVUkkpCi0gICAgewotICAgICAgICBfbm9pc3kgPSBub2lzeTsKLSAgICAgICAgX2Jhc2VVUkkgPSBiYXNlVVJJOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgWG1sRXJyb3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEVycm9yIGVyciA9IChYbWxFcnJvcilvOwotICAgICAgICAgICAgaWYgKGVyci5nZXRTZXZlcml0eSgpID09IFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SIHx8Ci0gICAgICAgICAgICAgICAgZXJyLmdldFNldmVyaXR5KCkgPT0gWG1sRXJyb3IuU0VWRVJJVFlfV0FSTklORykKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZXJyLnRvU3RyaW5nKF9iYXNlVVJJKSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChfbm9pc3kpCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGVyci50b1N0cmluZyhfYmFzZVVSSSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHNpemUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXJyb3JXYXRjaGVyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXJyb3JXYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MGYyMzYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbEVycm9yV2F0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLXB1YmxpYyBjbGFzcyBYbWxFcnJvcldhdGNoZXIgZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb24KLXsKLSAgICBwcml2YXRlIENvbGxlY3Rpb24gX3VuZGVybHlpbmc7Ci0gICAgcHJpdmF0ZSBYbWxFcnJvciBfZmlyc3RFcnJvcjsKLQotICAgIHB1YmxpYyBYbWxFcnJvcldhdGNoZXIoQ29sbGVjdGlvbiB1bmRlcmx5aW5nKQotICAgIHsKLSAgICAgICAgX3VuZGVybHlpbmcgPSB1bmRlcmx5aW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIGlmIChfZmlyc3RFcnJvciA9PSBudWxsICYmIG8gaW5zdGFuY2VvZiBYbWxFcnJvciAmJiAoKFhtbEVycm9yKW8pLmdldFNldmVyaXR5KCkgPT0gWG1sRXJyb3IuU0VWRVJJVFlfRVJST1IpCi0gICAgICAgICAgICBfZmlyc3RFcnJvciA9IChYbWxFcnJvcilvOwotICAgICAgICBpZiAoX3VuZGVybHlpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIF91bmRlcmx5aW5nLmFkZChvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKQotICAgIHsKLSAgICAgICAgaWYgKF91bmRlcmx5aW5nID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCi0gICAgICAgIHJldHVybiBfdW5kZXJseWluZy5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgc2l6ZSgpCi0gICAgewotICAgICAgICBpZiAoX3VuZGVybHlpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIHJldHVybiBfdW5kZXJseWluZy5zaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzRXJyb3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9maXJzdEVycm9yICE9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEVycm9yIGZpcnN0RXJyb3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9maXJzdEVycm9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFdmVudEJhc2UuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFdmVudEJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFkNWM2Mi4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXZlbnRCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxFdmVudDsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLmV2ZW50cy5FbGVtZW50VHlwZU5hbWVzOwotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyB0aGUgdHlwZSBwYXJ0IFhNTEV2ZW50LgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYbWxFdmVudEJhc2UgaW1wbGVtZW50cyBYTUxFdmVudAotewotICAgIHB1YmxpYyBYbWxFdmVudEJhc2UgKCApCi0gICAgewotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgWG1sRXZlbnRCYXNlICggaW50IHR5cGUgKQotICAgIHsKLSAgICAgICAgX3R5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUgKCBpbnQgdHlwZSApCi0gICAgewotICAgICAgICBfdHlwZSA9IHR5cGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVBc1N0cmluZyAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFbGVtZW50VHlwZU5hbWVzLmdldE5hbWUoIF90eXBlICk7Ci0gICAgfQotICAgICAgICAgICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFydEVsZW1lbnQgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGUgPT0gWE1MRXZlbnQuU1RBUlRfRUxFTUVOVDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmRFbGVtZW50ICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90eXBlID09IFhNTEV2ZW50LkVORF9FTEVNRU5UOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VudGl0eVJlZmVyZW5jZSAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZSA9PSBYTUxFdmVudC5FTlRJVFlfUkVGRVJFTkNFOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0UHJlZml4TWFwcGluZyAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZSA9PSBYTUxFdmVudC5TVEFSVF9QUkVGSVhfTUFQUElORzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmRQcmVmaXhNYXBwaW5nICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90eXBlID09IFhNTEV2ZW50LkVORF9QUkVGSVhfTUFQUElORzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNDaGFuZ2VQcmVmaXhNYXBwaW5nICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90eXBlID09IFhNTEV2ZW50LkNIQU5HRV9QUkVGSVhfTUFQUElORzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGUgPT0gWE1MRXZlbnQuUFJPQ0VTU0lOR19JTlNUUlVDVElPTjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNDaGFyYWN0ZXJEYXRhICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90eXBlID09IFhNTEV2ZW50LkNIQVJBQ1RFUl9EQVRBOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NwYWNlICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90eXBlID09IFhNTEV2ZW50LlNQQUNFOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc051bGwgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGUgPT0gWE1MRXZlbnQuTlVMTF9FTEVNRU5UOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0RG9jdW1lbnQgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGUgPT0gWE1MRXZlbnQuU1RBUlRfRE9DVU1FTlQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzRW5kRG9jdW1lbnQgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGUgPT0gWE1MRXZlbnQuRU5EX0RPQ1VNRU5UOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IF90eXBlOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbE5hbWVJbXBsLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sTmFtZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhYTQwOS4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sTmFtZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247Ci0KLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTE5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBYbWxOYW1lSW1wbCBpbXBsZW1lbnRzIFhNTE5hbWUgewotCi0gIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVyaT1udWxsOwotICBwcml2YXRlIFN0cmluZyBsb2NhbE5hbWU9bnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4PW51bGw7Ci0gIHByaXZhdGUgaW50IGhhc2ggPSAwOwotCi0gIHB1YmxpYyBYbWxOYW1lSW1wbCAoKSB7fQotICBwdWJsaWMgWG1sTmFtZUltcGwgKFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgfQotICBwdWJsaWMgWG1sTmFtZUltcGwgKFN0cmluZyBuYW1lc3BhY2VVcmksU3RyaW5nIGxvY2FsTmFtZSkgewotICAgIHNldE5hbWVzcGFjZVVyaShuYW1lc3BhY2VVcmkpOwotICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOwotICB9Ci0gIHB1YmxpYyBYbWxOYW1lSW1wbCAoU3RyaW5nIG5hbWVzcGFjZVVyaSwKLSAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUsCi0gICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4KSB7Ci0gICAgc2V0TmFtZXNwYWNlVXJpKG5hbWVzcGFjZVVyaSk7Ci0gICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0gICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVyaSgpIHsgcmV0dXJuIG5hbWVzcGFjZVVyaTsgfQotICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsgcmV0dXJuIGxvY2FsTmFtZTsgfQotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsgcmV0dXJuIHByZWZpeDsgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZVVyaShTdHJpbmcgbmFtZXNwYWNlVXJpKSB7Ci0gICAgaGFzaCA9IDA7Ci0gICAgaWYgKG5hbWVzcGFjZVVyaSAhPSBudWxsICYmIG5hbWVzcGFjZVVyaS5lcXVhbHMoIiIpKSByZXR1cm47Ci0gICAgdGhpcy5uYW1lc3BhY2VVcmkgPSBuYW1lc3BhY2VVcmk7IAotICB9Ci0gIHB1YmxpYyB2b2lkIHNldExvY2FsTmFtZShTdHJpbmcgbG9jYWxOYW1lKSB7IAotICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOyAKLSAgICBoYXNoID0gMDsKLSAgfQotICBwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkgeyB0aGlzLnByZWZpeCA9IHByZWZpeDsgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKLSAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgIHJldHVybiBwcmVmaXggKyAiOiIgKyBsb2NhbE5hbWU7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGxvY2FsTmFtZTsKLSAgfQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIGlmIChnZXROYW1lc3BhY2VVcmkoKSAhPSBudWxsKQotICAgICAgcmV0dXJuICJbJyIrZ2V0TmFtZXNwYWNlVXJpKCkrIiddOiIrZ2V0UXVhbGlmaWVkTmFtZSgpOwotICAgIGVsc2UgCi0gICAgICByZXR1cm4gZ2V0UXVhbGlmaWVkTmFtZSgpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpIHsKLSAgICBpbnQgdG1wX2hhc2ggPSBoYXNoOwotICAgIGlmICh0bXBfaGFzaCA9PSAwKSB7Ci0gICAgICB0bXBfaGFzaCA9IDE3OwotICAgICAgaWYgKG5hbWVzcGFjZVVyaSAhPSBudWxsKSB7Ci0JdG1wX2hhc2ggPSAzNyp0bXBfaGFzaCArIG5hbWVzcGFjZVVyaS5oYXNoQ29kZSgpOwotICAgICAgfQotICAgICAgaWYgKGxvY2FsTmFtZSAhPSBudWxsKSB7Ci0JdG1wX2hhc2ggPSAzNyp0bXBfaGFzaCArIGxvY2FsTmFtZS5oYXNoQ29kZSgpOwotICAgICAgfQotICAgICAgaGFzaCA9IHRtcF9oYXNoOwotICAgIH0KLSAgICByZXR1cm4gdG1wX2hhc2g7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgIGlmIChvYmogPT0gdGhpcykgcmV0dXJuIHRydWU7Ci0KLSAgICBpZiAob2JqIGluc3RhbmNlb2YgWE1MTmFtZSkgewotICAgICAgZmluYWwgWE1MTmFtZSBuYW1lPSAoWE1MTmFtZSkgb2JqOwotCi0gICAgICBmaW5hbCBTdHJpbmcgbG5hbWUgPSBsb2NhbE5hbWU7Ci0gICAgICBpZiAoIShsbmFtZT09bnVsbCA/IG5hbWUuZ2V0TG9jYWxOYW1lKCk9PW51bGwgOiAKLQkgICAgbG5hbWUuZXF1YWxzKG5hbWUuZ2V0TG9jYWxOYW1lKCkpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGZpbmFsIFN0cmluZyB1cmkgPSBuYW1lc3BhY2VVcmk7Ci0gICAgICByZXR1cm4gKHVyaT09bnVsbCA/IG5hbWUuZ2V0TmFtZXNwYWNlVXJpKCk9PW51bGwgOgotCSAgICAgIHVyaS5lcXVhbHMobmFtZS5nZXROYW1lc3BhY2VVcmkoKSkpOwotCQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxPYmplY3RMaXN0LmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sT2JqZWN0TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWZkY2MwLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxPYmplY3RMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKLQotLyoqCi0gKiBBIGNsYXNzIHRvIGhvbGQgYW5kIGNvbXBhcmUgYSBsaXN0IG9mIFhtbE9iamVjdHMgZm9yIHVzZSBieSBrZXlzCi0gKiBrZXlyZWZzIGR1cmluZyB2YWxpZGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgWG1sT2JqZWN0TGlzdAotewotICAgIHByaXZhdGUgZmluYWwgWG1sT2JqZWN0W10gX29iamVjdHM7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgZW1wdHkgb2JqZWN0IGxpc3Qgb2YgdGhlIGdpdmVuIGZpeGVkIHNpemUuCi0gICAgICovCi0gICAgcHVibGljIFhtbE9iamVjdExpc3QoaW50IG9iamVjdENvdW50KSB7Ci0gICAgICAgIF9vYmplY3RzID0gbmV3IFhtbE9iamVjdFtvYmplY3RDb3VudF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGFuIG9iamVjdCBieSBpbmRleCB1bmxlc3MgYSB2YWx1ZSBoYXMgYmVlbiBwcmV2aW91c2x5Ci0gICAgICogc2V0IGF0IHRoYXQgbG9jYXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSB3YXMgc2V0LCBmYWxzZSBpZiB0aGUgdmFsdWUgaGFzCi0gICAgICogYWxyZWFkeSBiZWVuIHNldAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNldChYbWxPYmplY3QgbywgaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgaWYgKF9vYmplY3RzW2luZGV4XSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIF9vYmplY3RzW2luZGV4XSA9IG87Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgYWxsIHZhbHVlcyBoYXZlIGJlZW4gc2V0LiBOZWVkZWQgZm9yIGtleXMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZmlsbGVkKCkgewotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBfb2JqZWN0cy5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICBpZiAoX29iamVjdHNbaV0gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IGFsbCB2YWx1ZXMgaGF2ZSBiZWVuIHNldC4gTmVlZGVkIGZvciBrZXlzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgdW5maWxsZWQoKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgX29iamVjdHMubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgaWYgKF9vYmplY3RzW2ldID09IG51bGwpIHJldHVybiBpOwotCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKCEoIG8gaW5zdGFuY2VvZiBYbWxPYmplY3RMaXN0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBYbWxPYmplY3RMaXN0IG90aGVyID0gKFhtbE9iamVjdExpc3QpbzsKLQotICAgICAgICBpZiAob3RoZXIuX29iamVjdHMubGVuZ3RoICE9IHRoaXMuX29iamVjdHMubGVuZ3RoKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IF9vYmplY3RzLmxlbmd0aCA7IGkrKykgewotICAgICAgICAgICAgLy8gSWdub3JlIG1pc3NpbmcgdmFsdWVzCi0gICAgICAgICAgICBpZiAoX29iamVjdHNbaV0gPT0gbnVsbCB8fCBvdGhlci5fb2JqZWN0c1tpXSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKCEgX29iamVjdHNbaV0udmFsdWVFcXVhbHMob3RoZXIuX29iamVjdHNbaV0pKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQotICAgIHsKLSAgICAgICAgaW50IGggPSAwOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IF9vYmplY3RzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgIGlmIChfb2JqZWN0c1tpXSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGggPSAzMSAqIGggKyBfb2JqZWN0c1tpXS52YWx1ZUhhc2hDb2RlKCk7Ci0KLSAgICAgICAgcmV0dXJuIGg7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwcmV0dHl0cmltKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgaW50IGVuZDsKLSAgICAgICAgZm9yIChlbmQgPSBzLmxlbmd0aCgpOyBlbmQgPiAwOyBlbmQgLT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFYTUxDaGFyLmlzU3BhY2Uocy5jaGFyQXQoZW5kIC0gMSkpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGludCBzdGFydDsKLSAgICAgICAgZm9yIChzdGFydCA9IDA7IHN0YXJ0IDwgZW5kOyBzdGFydCArPSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIVhNTENoYXIuaXNTcGFjZShzLmNoYXJBdChzdGFydCkpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBfb2JqZWN0cy5sZW5ndGggOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpICE9IDApIGIuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICBiLmFwcGVuZChwcmV0dHl0cmltKCgoU2ltcGxlVmFsdWUpX29iamVjdHNbaV0pLnN0cmluZ1ZhbHVlKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7Ci0gICAgfQotfQotCi0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxXaGl0ZXNwYWNlLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sV2hpdGVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWUyZjJhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxXaGl0ZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi1wdWJsaWMgY2xhc3MgWG1sV2hpdGVzcGFjZQotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdTX1VOU1BFQ0lGSUVEID0gU2NoZW1hVHlwZS5XU19VTlNQRUNJRklFRDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXU19QUkVTRVJWRSA9IFNjaGVtYVR5cGUuV1NfUFJFU0VSVkU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1NfUkVQTEFDRSA9IFNjaGVtYVR5cGUuV1NfUkVQTEFDRTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXU19DT0xMQVBTRSA9IFNjaGVtYVR5cGUuV1NfQ09MTEFQU0U7Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NwYWNlKGNoYXIgY2gpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGNoKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlICcgJzoKLSAgICAgICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgIGNhc2UgJ1x0JzoKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWxsU3BhY2UoU3RyaW5nIHYpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHYubGVuZ3RoKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFpc1NwYWNlKHYuY2hhckF0KGkpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29sbGFwc2UoU3RyaW5nIHYpCi0gICAgewotICAgICAgICByZXR1cm4gY29sbGFwc2UodiwgWG1sV2hpdGVzcGFjZS5XU19DT0xMQVBTRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGFsZ29yaXRobSB1c2VkIGJ5IGFwcGx5X3dzY2Fub246IHNvbWV0aW1lcyB1c2VkIGluIGltcGxzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbGxhcHNlKFN0cmluZyB2LCBpbnQgd3NyKQotICAgIHsKLSAgICAgICAgaWYgKHdzciA9PSBTY2hlbWFUeXBlLldTX1BSRVNFUlZFIHx8IHdzciA9PSBTY2hlbWFUeXBlLldTX1VOU1BFQ0lGSUVEKQotICAgICAgICAgICAgcmV0dXJuIHY7Ci0KLSAgICAgICAgaWYgKHYuaW5kZXhPZignXG4nKSA+PSAwKQotICAgICAgICAgICAgdiA9IHYucmVwbGFjZSgnXG4nLCAnICcpOwotICAgICAgICBpZiAodi5pbmRleE9mKCdcdCcpID49IDApCi0gICAgICAgICAgICB2ID0gdi5yZXBsYWNlKCdcdCcsICcgJyk7Ci0gICAgICAgIGlmICh2LmluZGV4T2YoJ1xyJykgPj0gMCkKLSAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UoJ1xyJywgJyAnKTsKLQotICAgICAgICBpZiAod3NyID09IFNjaGVtYVR5cGUuV1NfUkVQTEFDRSkKLSAgICAgICAgICAgIHJldHVybiB2OwotCi0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgaW50IGxlbiA9IHYubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChsZW4gPT0gMCkKLSAgICAgICAgICAgIHJldHVybiB2OwotCi0gICAgICAgIGludCBpOwotCi0gICAgICAgIC8qIGEgdHJpY2s6IGV4YW1pbmUgZXZlcnkgb3RoZXIgY2hhcmFjdGVyIGxvb2tpbmcgZm9yIHBhaXJzIG9mIHNwYWNlcyAqLwotICAgICAgICBpZiAodi5jaGFyQXQoMCkgIT0gJyAnKQotICAgICAgICB7Ci0gICAgICAgICAgICBleGFtaW5lOiB7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMjsgaiA8IGxlbjsgaiArPSAyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHYuY2hhckF0KGopID09ICcgJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYuY2hhckF0KGogLSAxKSA9PSAnICcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgZXhhbWluZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID09IGxlbiAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgZXhhbWluZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LmNoYXJBdChqKSA9PSAnICcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgZXhhbWluZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaiA9PSBsZW4gJiYgdi5jaGFyQXQoaiAtIDEpID09ICcgJykKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgZXhhbWluZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIGogaXMgcG9pbnRpbmcgYXQgdGhlIGZpcnN0IHdzIHRvIGJlIHJlbW92ZWQsIG9yIHBhc3QgZW5kICovCi0gICAgICAgICAgICBpID0gajsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogaiBpcyBwb2ludGluZyBhdCB0aGUgbGFzdCB3aGl0ZXNwYWNlIGluIHRoZSBpbml0aWFsIHJ1bgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICB3aGlsZSAoaiArIDEgPCB2Lmxlbmd0aCgpICYmIHYuY2hhckF0KGogKyAxKSA9PSAnICcpCi0gICAgICAgICAgICAgICAgaiArPSAxOwotICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBjaGFyW10gY2ggPSB2LnRvQ2hhckFycmF5KCk7Ci0KLSAgICAgICAgc2hpZnRlcjogZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICg7OykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBqIHdhcyB3cyBvciBwYXN0IGVuZCAqLwotICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgICAgICBpZiAoaiA+PSBsZW4pCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrIHNoaWZ0ZXI7Ci0gICAgICAgICAgICAgICAgaWYgKHYuY2hhckF0KGopICE9ICcgJykKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGogd2FzIG5vbndzICovCi0gICAgICAgICAgICAgICAgY2hbaSsrXSA9IGNoW2orK107Ci0gICAgICAgICAgICAgICAgaWYgKGogPj0gbGVuKQotICAgICAgICAgICAgICAgICAgICBicmVhayBzaGlmdGVyOwotICAgICAgICAgICAgICAgIGlmIChjaFtqXSA9PSAnICcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaFtpKytdID0gY2hbaisrXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGogPj0gbGVuKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2hpZnRlcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoW2pdID09ICcgJykKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNoLCAwLCAoaSA9PSAwIHx8IGNoW2kgLSAxXSAhPSAnICcpID8gaSA6IGkgLSAxKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9yZWFkbWUudHh0IGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMjUxNDMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVRoZXJlIGFyZSBpc29sYXRlZCBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSB0YWtlbiBmcm9tIHRoZSBBcGFjaGUKLVhlcmNlcy1KIDIuMCBwcm9qZWN0Ci0KLUl0IGNvbnRhaW5zIHZlcnkgbWlub3IgbW9kaWZpY2F0aW9ucyBpbmNsdWRpbmcgYSBjaGFuZ2UgaW4gbmFtZXNwYWNlLgotCmRpZmYgLS1naXQgYS92MS9zcmMvY29uZmlnc2NoZW1hL3NjaGVtYS94bWxjb25maWcueHNkIGIvdjEvc3JjL2NvbmZpZ3NjaGVtYS9zY2hlbWEveG1sY29uZmlnLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE3ZWQ2Yi4uMDAwMDAwMAotLS0gYS92MS9zcmMvY29uZmlnc2NoZW1hL3NjaGVtYS94bWxjb25maWcueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIHhtbG5zOnhiPSJodHRwOi8vd3d3LmJlYS5jb20vMjAwMi8wOS94YmVhbi9jb25maWciCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuYmVhLmNvbS8yMDAyLzA5L3hiZWFuL2NvbmZpZyIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgCi0gIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIvPiAKLQotICA8eHM6ZWxlbWVudCBuYW1lPSJjb25maWciPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgY29uZmlnIGVsZW1lbnQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IGZvciBhbiAueHNkY29uZmlnIGZpbGUuCi0gICAgICAgICBJdCBjb250YWlucyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHRoYXQgZ3VpZGVzIHRoZSB4c2QgY29tcGlsZXIKLSAgICAgICAgIHdoZW4gaXQgZ2VuZXJhdGVzIEphdmEgY2xhc3Nlcy4gWW91IGNhbiBzcGVjaWZ5IHBhY2thZ2UgbmFtZXMgdG8KLSAgICAgICAgIGJlIHVzZWQgZm9yIHdob2xlIHhtbCBuYW1lc3BhY2VzOyB5b3UgY2FuIHNwZWNpZnkgY2xhc3MgbmFtZXMKLSAgICAgICAgIHRvIHVzZSBmb3IgaW5kaXZpZHVhbCBzY2hlbWEgdHlwZXM7IGFuZCB5b3UgY2FuIHN1cHBseSBleHRlbnNpb24KLSAgICAgICAgIGludGVyZmFjZXMgYW5kIGltcGxlbWVudGF0aW9ucyB0byBiZSBleHRlbmRlZCBieSB0aGUgZ2VuZXJhdGVkCi0gICAgICAgICBKYXZhIGNsYXNzZXMuCi0gICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4Yjpuc2NvbmZpZyI+Ci0gICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgU3BlY2lmaWVzIGNvbmZpZ3VyYXRpb24gZm9yIGEgbmFtZXNwYWNlLgotICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czplbGVtZW50PgotCi0gICAgICAgIDx4czplbGVtZW50IG5hbWU9InFuYW1lIiB0eXBlPSJ4YjpxbmFtZWNvbmZpZyI+Ci0gICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgU3BlY2lmaWVzIGphdmEgbWFwcGluZyBmb3IgYSBxbmFtZS4KLSAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6ZWxlbWVudD4KLQotICAgICAgPC94czpjaG9pY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJuc2NvbmZpZyI+Ci0KLSAgICA8eHM6c2VxdWVuY2U+Ci0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InBhY2thZ2UiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHVzZWQgZm9yIHR5cGVzIGdlbmVyYXRlZCBpbiB0aGlzCi0gICAgICAgICAgICBuYW1lc3BhY2UuCi0gICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAKLSAgICAgIDx4czplbGVtZW50IG5hbWU9InByZWZpeCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEEgcHJlZml4IHRvIGJlIHVzZWQgdG8gcHJlcGVuZCB0byB0b3AtbGV2ZWwgSmF2YSB0eXBlIG5hbWVzCi0gICAgICAgICAgICBnZW5lcmF0ZWQgaW4gdGhpcyBuYW1lc3BhY2UuICAoVGhlIHByZWZpeCBpcyBub3QgdXNlZCBmb3IKLSAgICAgICAgICAgIGlubmVyIEphdmEgdHlwZSBkZWZpbml0aW9ucy4pCi0gICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InN1ZmZpeCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEEgc3VmZml4IHRvIGJlIHVzZWQgdG8gYXBwZW5kIHRvIHRvcC1sZXZlbCBKYXZhIHR5cGUgbmFtZXMKLSAgICAgICAgICAgIGdlbmVyYXRlZCBpbiB0aGlzIG5hbWVzcGFjZS4gKFRoZSBzdWZmaXggaXMgbm90IHVzZWQgZm9yCi0gICAgICAgICAgICBpbm5lciBKYXZhIHR5cGUgZGVmaW5pdGlvbnMuKQotICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPC94czplbGVtZW50PgotCi0gICAgPC94czpzZXF1ZW5jZT4KLQotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXJpIiB0eXBlPSJ4czpuYW1lc3BhY2VMaXN0Ij4KLSAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICBBIGxpc3Qgb2YgYW55IG51bWJlciBvZiBuYW1lc3BhY2UgVVJJcyBvciAjI2xvY2FsIGZvciB0aGUgbm8tbmFtZXNwYWNlLAotICAgICAgICAgIG9yICMjYW55IGZvciBhbGwgbmFtZXNwYWNlcy4KLSAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgPC94czphbm5vdGF0aW9uPgotICAgIDwveHM6YXR0cmlidXRlPgotCi0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InFuYW1lY29uZmlnIj4KLSAgICA8eHM6c2VxdWVuY2UvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6UU5hbWUiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImphdmFuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJuYW1lc3BhY2VMaXN0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgIEEgbGlzdCBvZiBuYW1lc3BhY2UgVVJJcywgd2l0aCAjI2xvY2FsIGZvciBuby11cmk7IG9yICMjYW55IGZvciBhbGwgVVJJcy4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6dW5pb24+Ci0gICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjYW55Ii8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOmxpc3Q+Ci0gICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHM6YW55VVJJIj4KLSAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iIyNsb2NhbCIvPgotICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDwveHM6dW5pb24+Ci0gICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgPC94czpsaXN0PgotICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czp1bmlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSAgCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL2NvbXBpbGVyL0NvbXBvbmVudEluZm8uamF2YSBiL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL2NvbXBpbGVyL0NvbXBvbmVudEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxMWE1MS4uMDAwMDAwMAotLS0gYS92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9jb21waWxlci9Db21wb25lbnRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5jb21waWxlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBvbmVudEluZm8KLXsKLSAgICBwcml2YXRlIFN0cmluZyBfZnVsbEphdmFJbnRmTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBfZnVsbEphdmFJbXBsTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBfc2hvcnRKYXZhSW50Zk5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3Nob3J0SmF2YUltcGxOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF9iYXNlSW50Zk5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2Jhc2VJbXBsTmFtZTsKLSAgICBwcml2YXRlIGludCBfc3VwZXJDdHJBcmdDb3VudDsKLQotICAgIC8vIHJ1bnRpbWUgc3VwcG9ydAotICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiAgICAgX2ltcGxOb3RBdmFpbGFibGU7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBDbGFzcyAgICAgICBfamF2YUltcGxDbGFzczsKLSAgICBwcml2YXRlIHZvbGF0aWxlIENvbnN0cnVjdG9yIF9qYXZhSW1wbENvbnN0cnVjdG9yOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRGdWxsSmF2YUludGZOYW1lKCkgewotICAgICAgICByZXR1cm4gX2Z1bGxKYXZhSW50Zk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTaG9ydEphdmFJbnRmTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIF9zaG9ydEphdmFJbnRmTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGdWxsSmF2YUludGZOYW1lKFN0cmluZyBpbnRmTmFtZSkgewotICAgICAgICBfZnVsbEphdmFJbnRmTmFtZSA9IGludGZOYW1lOwotCi0gICAgICAgIGludCBpbmRleCA9IE1hdGgubWF4KF9mdWxsSmF2YUludGZOYW1lLmxhc3RJbmRleE9mKCckJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mdWxsSmF2YUludGZOYW1lLmxhc3RJbmRleE9mKCcuJykpICsgMTsKLQotICAgICAgICBfc2hvcnRKYXZhSW50Zk5hbWUgPSBfZnVsbEphdmFJbnRmTmFtZS5zdWJzdHJpbmcoaW5kZXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbEphdmFJbXBsTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIF9mdWxsSmF2YUltcGxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnRKYXZhSW1wbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBfc2hvcnRKYXZhSW1wbE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RnVsbEphdmFJbXBsTmFtZShTdHJpbmcgaW1wbE5hbWUpIHsKLSAgICAgICAgX2Z1bGxKYXZhSW1wbE5hbWUgPSBpbXBsTmFtZTsKLQotICAgICAgICBpbnQgaW5kZXggPSBNYXRoLm1heChfZnVsbEphdmFJbXBsTmFtZS5sYXN0SW5kZXhPZignJCcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZnVsbEphdmFJbXBsTmFtZS5sYXN0SW5kZXhPZignLicpKSArIDE7Ci0KLSAgICAgICAgX3Nob3J0SmF2YUltcGxOYW1lID0gX2Z1bGxKYXZhSW1wbE5hbWUuc3Vic3RyaW5nKGluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlSW50Zk5hbWUoU3RyaW5nIGJhc2VUeXBlKQotICAgIHsKLSAgICAgICAgX2Jhc2VJbnRmTmFtZSA9IGJhc2VUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZUludGZOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYmFzZUludGZOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VJbXBsTmFtZShTdHJpbmcgYmFzZXR5cGUpCi0gICAgewotICAgICAgICBfYmFzZUltcGxOYW1lID0gYmFzZXR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXNlSW1wbE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9iYXNlSW1wbE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRTdXBlckN0ckFyZ0NvdW50KCkgewotICAgICAgICByZXR1cm4gX3N1cGVyQ3RyQXJnQ291bnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3VwZXJDdHJBcmdDb3VudChpbnQgY291bnQpIHsKLSAgICAgICAgX3N1cGVyQ3RyQXJnQ291bnQgPSBjb3VudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0SmF2YUltcGxDbGFzcyhDbGFzc0xvYWRlciBjbCkgewotICAgICAgICBpZiAoX2ltcGxOb3RBdmFpbGFibGUpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpZiAoX2phdmFJbXBsQ2xhc3MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0RnVsbEphdmFJbXBsTmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIF9qYXZhSW1wbENsYXNzID0gQ2xhc3MuZm9yTmFtZShnZXRGdWxsSmF2YUltcGxOYW1lKCksIGZhbHNlLCBjbCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBfaW1wbE5vdEF2YWlsYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgX2ltcGxOb3RBdmFpbGFibGUgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIF9qYXZhSW1wbENsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb25zdHJ1Y3RvciBnZXRKYXZhSW1wbENvbnN0cnVjdG9yKENsYXNzTG9hZGVyIGNsKQotICAgIHsKLSAgICAgICAgaWYgKF9qYXZhSW1wbENvbnN0cnVjdG9yID09IG51bGwgJiYgIV9pbXBsTm90QXZhaWxhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBDbGFzcyBpbXBsID0gZ2V0SmF2YUltcGxDbGFzcyhjbCk7Ci0gICAgICAgICAgICBpZiAoaW1wbCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9qYXZhSW1wbENvbnN0cnVjdG9yID0gaW1wbC5nZXRDb25zdHJ1Y3RvcihudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIF9qYXZhSW1wbENvbnN0cnVjdG9yOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvY29tcGlsZXIvRWxlbWVudEluZm8uamF2YSBiL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL2NvbXBpbGVyL0VsZW1lbnRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZTBkM2UuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvY29tcGlsZXIvRWxlbWVudEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuY29tcGlsZXI7Ci0KLXB1YmxpYyBjbGFzcyBFbGVtZW50SW5mbyBleHRlbmRzIENvbXBvbmVudEluZm8gewotICAgIHB1YmxpYyBzdGF0aWMgaW50IE5PX1ZBTFVFID0gLTE7Ci0gICAgcHJpdmF0ZSBpbnQgX3ZhbHVlVHlwZSA9IE5PX1ZBTFVFOwotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWVUeXBlKGludCB2YWx1ZVR5cGUpCi0gICAgewotICAgICAgICBfdmFsdWVUeXBlID0gdmFsdWVUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VmFsdWVUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsdWVUeXBlOwotICAgIH0KLQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvY29tcGlsZXIvSmF4YkNvZGVHZW5lcmF0b3IuamF2YSBiL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL2NvbXBpbGVyL0pheGJDb2RlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MGI4NDcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvY29tcGlsZXIvSmF4YkNvZGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5qYXhiLmNvbXBpbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JXYXRjaGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuY29uZmlnLkpheGJDb25maWdEb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5jb25maWcuSmF4YkNvbmZpZ0RvY3VtZW50LkpheGJDb25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuY29uZmlnLkpheGJDb25maWdEb2N1bWVudC5KYXhiQ29uZmlnLkdsb2JhbEVsZW1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5qYXhiLmNvbmZpZy5KYXhiQ29uZmlnRG9jdW1lbnQuSmF4YkNvbmZpZy5HbG9iYWxUeXBlczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5jb25maWcuR2xvYmFsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5jb25maWcuR2xvYmFsVHlwZTsKLQotcHVibGljIGZpbmFsIGNsYXNzIEpheGJDb2RlR2VuZXJhdG9yCi17Ci0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBpbGUoU2NoZW1hVHlwZVN5c3RlbSBzdHMsIExpc3Qgc291cmNlZmlsZXMsIEZpbGUgc291cmNlZGlyLCBGaWxlIGNsYXNzZXNkaXIsIFhtbEVycm9yV2F0Y2hlciBlcnJvcnMpCi0gICAgewotICAgICAgICBNYXAgY29tcG9uZW50RGF0YSA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIE1hcCBwYWNrYWdlRGF0YSA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIGJvb2xlYW4gZmFpbHVyZSA9IGZhbHNlOwotCi0gICAgICAgIGlmICggISBKYXhiSmF2YWl6ZXIuamF2YWl6ZShzdHMsIGNvbXBvbmVudERhdGEsIHBhY2thZ2VEYXRhLCBlcnJvcnMpICkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBKYXhiQ29uZmlnRG9jdW1lbnQgZG9jID0gSmF4YkNvbmZpZ0RvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgSmF4YkNvbmZpZyByb290ID0gZG9jLmFkZE5ld0pheGJDb25maWcoKTsKLSAgICAgICAgR2xvYmFsRWxlbWVudHMgZWx0cyA9IHJvb3QuYWRkTmV3R2xvYmFsRWxlbWVudHMoKTsKLSAgICAgICAgR2xvYmFsVHlwZXMgdHlwZXMgPSByb290LmFkZE5ld0dsb2JhbFR5cGVzKCk7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHBhY2thZ2VEYXRhLnZhbHVlcygpLml0ZXJhdG9yKCkgOyBpdC5oYXNOZXh0KCkgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBhY2thZ2VJbmZvIHBpID0gKFBhY2thZ2VJbmZvKSBpdC5uZXh0KCk7Ci0KLSAgICAgICAgICAgIFdyaXRlciB3cml0ZXIgPSBudWxsOwotICAgICAgICAgICAgdHJ5IAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEZpcnN0IGNvbnN0cnVjdCB0aGUgamF4Yi5wcm9wZXJ0aWVzIGZpbGUgZm9yIHRoaXMgcGFja2FnZQotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IHBpLmdldFBhY2thZ2VOYW1lKCkucmVwbGFjZSgnLicsICcvJykgKyAiL2pheGIucHJvcGVydGllcyI7Ci0gICAgICAgICAgICAgICAgRmlsZSBzb3VyY2VmaWxlID0gbmV3IEZpbGUoY2xhc3Nlc2RpciwgZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIHNvdXJjZWZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCi0gICAgICAgICAgICAgICAgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoc291cmNlZmlsZSk7Ci0gICAgICAgICAgICAgICAgSmF4YkNvZGVQcmludGVyLnByaW50UGFja2FnZVByb3BlcnRpZXMod3JpdGVyLCBwaSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSU8gRXJyb3IgIiArIGUpOwotICAgICAgICAgICAgICAgIGZhaWx1cmUgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsgaWYgKHdyaXRlciAhPSBudWxsKSB3cml0ZXIuY2xvc2UoKTsgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVE9ETzogZ2VuZXJhdGUgT2JqZWN0RmFjdG9yeSBjbGFzcwotCi0KLSAgICAgICAgICAgIC8vIEdlbmVyYXRlIHRoZSBpbnRlcmZhY2VzICYgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgc2NoZW1hIGNvbXBvbmVudHMKLSAgICAgICAgICAgIExpc3QgYWxsQ29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGFsbENvbXBvbmVudHMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3RzLmdsb2JhbEVsZW1lbnRzKCkpKTsKLSAgICAgICAgICAgIGFsbENvbXBvbmVudHMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3RzLmdsb2JhbFR5cGVzKCkpKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IGFsbENvbXBvbmVudHMuc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFDb21wb25lbnQgc2MgPSAoU2NoZW1hQ29tcG9uZW50KWFsbENvbXBvbmVudHMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIENvbXBvbmVudEluZm8gY2kgPSAoQ29tcG9uZW50SW5mbyljb21wb25lbnREYXRhLmdldChzYyk7Ci0KLSAgICAgICAgICAgICAgICBhZGRDb21wb25lbnRUb0NvbmZpZyhzYywgY2ksIHJvb3QpOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0IGNpICE9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBjaS5nZXRGdWxsSmF2YUludGZOYW1lKCkucmVwbGFjZSgnLicsICcvJykgKyAiLmphdmEiOwotCi0gICAgICAgICAgICAgICAgLy8gcHJpbnQgdGhlIGphdmEgaW50ZXJmYWNlCi0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBGaWxlIHNvdXJjZWZpbGUgPSBuZXcgRmlsZShzb3VyY2VkaXIsICBmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZWZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKHNvdXJjZWZpbGUpOwotICAgICAgICAgICAgICAgICAgICBKYXhiQ29kZVByaW50ZXIucHJpbnRKYXZhSW50ZXJmYWNlKHdyaXRlciwgc2MsIGNpKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZWZpbGVzLmFkZChzb3VyY2VmaWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIklPIEVycm9yICIgKyBlKTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbHVyZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICB0cnkgeyBpZiAod3JpdGVyICE9IG51bGwpIHdyaXRlci5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHByaW50IHRoZSBqYXZhIGltcGwKLQotCi0gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBjaS5nZXRGdWxsSmF2YUltcGxOYW1lKCkucmVwbGFjZSgnLicsICcvJykgKyAiLmphdmEiOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgc291cmNlZmlsZSA9IG5ldyBGaWxlKHNvdXJjZWRpciwgIGZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgc291cmNlZmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoc291cmNlZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIEpheGJDb2RlUHJpbnRlci5wcmludEphdmFJbXBsKHdyaXRlciwgc2MsIGNpKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZWZpbGVzLmFkZChzb3VyY2VmaWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIklPIEVycm9yICIgKyBlKTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbHVyZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICB0cnkgeyBpZiAod3JpdGVyICE9IG51bGwpIHdyaXRlci5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2F2ZSBvdXQgdGhlIGpheGIgY29uZmlnIGZpbGUKLQotICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBudWxsOwotICAgICAgICB0cnkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEZpcnN0IGNvbnN0cnVjdCB0aGUgamF4Yi5wcm9wZXJ0aWVzIGZpbGUgZm9yIHRoaXMgcGFja2FnZQotICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gc3RzLmdldE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSArICIvSmF4YkNvbmZpZy54bWwiOwotICAgICAgICAgICAgRmlsZSBzb3VyY2VmaWxlID0gbmV3IEZpbGUoY2xhc3Nlc2RpciwgZmlsZW5hbWUpOwotICAgICAgICAgICAgc291cmNlZmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0KLSAgICAgICAgICAgIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oc291cmNlZmlsZSk7Ci0gICAgICAgICAgICBkb2Muc2F2ZShvcyk7Ci0gICAgICAgICAgICBvcy5jbG9zZSgpOwotICAgICAgICAgICAgb3MgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIklPIEVycm9yICIgKyBlKTsKLSAgICAgICAgICAgIGZhaWx1cmUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsgaWYgKG9zICE9IG51bGwpIG9zLmNsb3NlKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFpbHVyZTsKLQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGFkZENvbXBvbmVudFRvQ29uZmlnKFNjaGVtYUNvbXBvbmVudCBzYywgQ29tcG9uZW50SW5mbyBjaSwgSmF4YkNvbmZpZyBjb25maWcpCi0gICAgewotICAgICAgICBzd2l0Y2ggKHNjLmdldENvbXBvbmVudFR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICBHbG9iYWxFbGVtZW50IGVsdCA9IGNvbmZpZy5nZXRHbG9iYWxFbGVtZW50cygpLmFkZE5ld0dsb2JhbEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBlbHQuc2V0UW5hbWUoc2MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBlbHQuc2V0SmF2YUltcGwoY2kuZ2V0RnVsbEphdmFJbXBsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL2NvbXBpbGVyL0pheGJDb2RlUHJpbnRlci5qYXZhIGIvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvY29tcGlsZXIvSmF4YkNvZGVQcmludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMGJmY2QuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvY29tcGlsZXIvSmF4YkNvZGVQcmludGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzIgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5jb21waWxlcjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JXYXRjaGVyOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF4YkNvZGVQcmludGVyCi17Ci0gICAgV3JpdGVyIF93cml0ZXI7Ci0gICAgaW50IF9pbmRlbnQ7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUEFSQVRPUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSA9PSBudWxsID8gIlxuIiA6IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0lOREVOVCA9IDQwOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX1NQQUNFUyA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKLSAgICBzdGF0aWMgZmluYWwgaW50IElOREVOVF9JTkNSRU1FTlQgPSA0OwotCi0gICAgcHVibGljIEpheGJDb2RlUHJpbnRlcihXcml0ZXIgd3JpdGVyKQotICAgIHsKLSAgICAgICAgX3dyaXRlciA9IHdyaXRlcjsKLSAgICAgICAgX2luZGVudCA9IDA7Ci0gICAgfQotCi0gICAgdm9pZCBpbmRlbnQoKQotICAgIHsKLSAgICAgICAgX2luZGVudCArPSBJTkRFTlRfSU5DUkVNRU5UOwotICAgIH0KLQotICAgIHZvaWQgb3V0ZGVudCgpCi0gICAgewotICAgICAgICBfaW5kZW50IC09IElOREVOVF9JTkNSRU1FTlQ7Ci0gICAgfQotCi0gICAgdm9pZCBzdGFydEJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBlbWl0KCJ7Iik7Ci0gICAgICAgIGluZGVudCgpOwotICAgIH0KLSAgICB2b2lkIGVuZEJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBvdXRkZW50KCk7Ci0gICAgICAgIGVtaXQoIn0iKTsKLSAgICB9Ci0KLSAgICB2b2lkIGVtaXQoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW50IGluZGVudCA9IF9pbmRlbnQ7Ci0gICAgICAgIGlmIChpbmRlbnQgPiBNQVhfSU5ERU5UIC8gMikKLSAgICAgICAgICAgIGluZGVudCA9IE1BWF9JTkRFTlQgLyA0ICsgaW5kZW50IC8gMjsKLSAgICAgICAgaWYgKGluZGVudCA+IE1BWF9JTkRFTlQpCi0gICAgICAgICAgICBpbmRlbnQgPSBNQVhfSU5ERU5UOwotICAgICAgICBfd3JpdGVyLndyaXRlKE1BWF9TUEFDRVMuc3Vic3RyaW5nKDAsIGluZGVudCkpOwotICAgICAgICBfd3JpdGVyLndyaXRlKHMpOwotICAgICAgICBfd3JpdGVyLndyaXRlKExJTkVfU0VQQVJBVE9SKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRQYWNrYWdlUHJvcGVydGllcyhXcml0ZXIgdywgUGFja2FnZUluZm8gcGkpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSmF4YkNvZGVQcmludGVyIHAgPSBuZXcgSmF4YkNvZGVQcmludGVyKHcpOwotICAgICAgICBwLnByaW50UGFja2FnZVByb3BlcnRpZXMocGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEphdmFJbnRlcmZhY2UoV3JpdGVyIHcsIFNjaGVtYUNvbXBvbmVudCBzYywgQ29tcG9uZW50SW5mbyBjaSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBKYXhiQ29kZVByaW50ZXIgcCA9IG5ldyBKYXhiQ29kZVByaW50ZXIodyk7Ci0KLSAgICAgICAgc3dpdGNoIChzYy5nZXRDb21wb25lbnRUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgcC5wcmludEVsZW1lbnQoKFNjaGVtYUdsb2JhbEVsZW1lbnQpc2MsIChFbGVtZW50SW5mbyljaSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50SmF2YUltcGwoV3JpdGVyIHcsIFNjaGVtYUNvbXBvbmVudCBzYywgQ29tcG9uZW50SW5mbyBjaSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBKYXhiQ29kZVByaW50ZXIgcCA9IG5ldyBKYXhiQ29kZVByaW50ZXIodyk7Ci0KLSAgICAgICAgc3dpdGNoIChzYy5nZXRDb21wb25lbnRUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgcC5wcmludEVsZW1lbnRJbXBsKChTY2hlbWFHbG9iYWxFbGVtZW50KXNjLCAoRWxlbWVudEluZm8pY2kpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcHJpbnRQYWNrYWdlUHJvcGVydGllcyhQYWNrYWdlSW5mbyBwaSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBlbWl0KCIjIiArIG5ldyBEYXRlKCkpOwotICAgICAgICBlbWl0KCJqYXZheC54bWwuYmluZC5jb250ZXh0LmZhY3Rvcnk9b3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIucnVudGltZS5Db250ZXh0SW1wbCIpOwotICAgICAgICBlbWl0KCJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5UeXBlU3lzdGVtSG9sZGVyPSIgKyBwaS5nZXRJbmRleENsYXNzTmFtZSgpKTsKLSAgICB9Ci0KLSAgICB2b2lkIHByaW50RWxlbWVudChTY2hlbWFHbG9iYWxFbGVtZW50IGVsdCwgRWxlbWVudEluZm8gZWkpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcHJpbnRUb3BDb21tZW50KGVsdCwgZWksIHRydWUpOwotICAgICAgICBwcmludFBhY2thZ2UoZWx0LCBlaSwgdHJ1ZSk7Ci0gICAgICAgIHByaW50RWxlbWVudEJvZHkoZWx0LCBlaSk7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludEVsZW1lbnRJbXBsKFNjaGVtYUdsb2JhbEVsZW1lbnQgZWx0LCBFbGVtZW50SW5mbyBlaSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBwcmludFRvcENvbW1lbnQoZWx0LCBlaSwgZmFsc2UpOwotICAgICAgICBwcmludFBhY2thZ2UoZWx0LCBlaSwgZmFsc2UpOwotICAgICAgICBwcmludEVsZW1lbnRJbXBsQm9keShlbHQsIGVpKTsKLSAgICB9Ci0KLSAgICB2b2lkIHByaW50VG9wQ29tbWVudChTY2hlbWFDb21wb25lbnQgc2MsIENvbXBvbmVudEluZm8gY2ksIGJvb2xlYW4gaW50ZikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBlbWl0KCIvKiIpOwotICAgICAgICBlbWl0KCIgKiBYTUwgVHlwZTogICIgKyBzYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBlbWl0KCIgKiBOYW1lc3BhY2U6ICIgKyBzYy5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICBlbWl0KCIgKiBKYXZhIHR5cGU6ICIgKyAoIGludGYgPyBjaS5nZXRGdWxsSmF2YUludGZOYW1lKCkgOiBjaS5nZXRGdWxsSmF2YUltcGxOYW1lKCkpKTsKLSAgICAgICAgZW1pdCgiICoiKTsKLSAgICAgICAgZW1pdCgiICogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgLSBkbyBub3QgbW9kaWZ5LiIpOwotICAgICAgICBlbWl0KCIgKi8iKTsKLSAgICAgICAgZW1pdCgiIik7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFBhY2thZ2UoU2NoZW1hQ29tcG9uZW50IHNjLCBDb21wb25lbnRJbmZvIGNpLCBib29sZWFuIGludGYpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGZxam47Ci0gICAgICAgIGlmIChpbnRmKQotICAgICAgICAgICAgZnFqbiA9IGNpLmdldEZ1bGxKYXZhSW50Zk5hbWUoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnFqbiA9IGNpLmdldEZ1bGxKYXZhSW1wbE5hbWUoKTsKLQotICAgICAgICBpbnQgbGFzdGRvdCA9IGZxam4ubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgYXNzZXJ0IGxhc3Rkb3QgPj0gMDsKLQotICAgICAgICBTdHJpbmcgcGtnID0gZnFqbi5zdWJzdHJpbmcoMCwgbGFzdGRvdCk7Ci0gICAgICAgIGVtaXQoInBhY2thZ2UgIiArIHBrZyArICI7Iik7Ci0gICAgICAgIGVtaXQoIiIpOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRFbGVtZW50Qm9keShTY2hlbWFHbG9iYWxFbGVtZW50IGVsdCwgRWxlbWVudEluZm8gZWkpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcHJpbnRJbm5lckVsZW1lbnRKYXZhRG9jKGVsdCwgZWkpOwotICAgICAgICBzdGFydEludGVyZmFjZShlbHQsIGVpKTsKLSAgICAgICAgc3RhcnRCbG9jaygpOwotCi0gICAgICAgIGlmIChlaS5nZXRWYWx1ZVR5cGUoKSAhPSBFbGVtZW50SW5mby5OT19WQUxVRSkKLSAgICAgICAgICAgIHByaW50UHJvcGVydHkoIlZhbHVlIiwgamF2YVR5cGVGb3JDb2RlKGVpLmdldFZhbHVlVHlwZSgpKSwgbnVsbCwgZmFsc2UsIGVsdC5nZXREZWZhdWx0VGV4dCgpKTsKLQotICAgICAgICBlbmRCbG9jaygpOwotCi0gICAgfQotCi0gICAgdm9pZCBwcmludEVsZW1lbnRJbXBsQm9keShTY2hlbWFHbG9iYWxFbGVtZW50IGVsdCwgRWxlbWVudEluZm8gZWkpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW1pdCgicHVibGljIGNsYXNzICIgKyBlaS5nZXRTaG9ydEphdmFJbXBsTmFtZSgpICsgIiBleHRlbmRzICIgKyBlaS5nZXRCYXNlSW1wbE5hbWUoKSk7Ci0gICAgICAgIGluZGVudCgpOwotICAgICAgICBlbWl0KCJpbXBsZW1lbnRzICIgKyBlaS5nZXRGdWxsSmF2YUludGZOYW1lKCkgKyAiLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdCIpOwotICAgICAgICBvdXRkZW50KCk7Ci0gICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgcHJpbnRFbGVtZW50Q29uc3RydWN0b3IoZWx0LCBlaSk7Ci0KLSAgICAgICAgaWYgKGVpLmdldFZhbHVlVHlwZSgpICE9IEVsZW1lbnRJbmZvLk5PX1ZBTFVFKQotICAgICAgICAgICAgcHJpbnRQcm9wZXJ0eUltcGwoIlZhbHVlIiwgamF2YVR5cGVGb3JDb2RlKGVpLmdldFZhbHVlVHlwZSgpKSwgZWkuZ2V0VmFsdWVUeXBlKCksIG51bGwsIGZhbHNlLCBlbHQuZ2V0RGVmYXVsdFRleHQoKSwgdHJ1ZSk7Ci0KLSAgICAgICAgZW5kQmxvY2soKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHByZXR0eVFOYW1lKFFOYW1lIHFuYW1lKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICBpZiAocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdCArPSAiKEAiICsgcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiKSI7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludEphdmFEb2MoU3RyaW5nIGNvbW1lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW1pdCgiIik7Ci0gICAgICAgIGVtaXQoIi8qKiIpOwotICAgICAgICBlbWl0KCIgKiAiICsgY29tbWVudCk7Ci0gICAgICAgIGVtaXQoIiAqLyIpOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRJbm5lckVsZW1lbnRKYXZhRG9jKFNjaGVtYUdsb2JhbEVsZW1lbnQgZWx0LCBFbGVtZW50SW5mbyBlaSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBlbWl0KCIvKioiKTsKLSAgICAgICAgZW1pdCgiICogSmF2YSBjb250ZW50IGNsYXNzIGZvciBhIHJvb3QgZWxlbWVudCBkZWNsYXJhdGlvbiIpOwotICAgICAgICBlbWl0KCIgKiBjb250YWluaW5nIG9uZSAiICsgcHJldHR5UU5hbWUoZWx0LmdldE5hbWUoKSkgKyAiIGVsZW1lbnQuIik7Ci0gICAgICAgIGVtaXQoIiAqLyIpOwotICAgIH0KLQotICAgIHZvaWQgc3RhcnRJbnRlcmZhY2UoU2NoZW1hQ29tcG9uZW50IHNjLCBDb21wb25lbnRJbmZvIGNpKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBzaG9ydE5hbWUgPSBjaS5nZXRTaG9ydEphdmFJbnRmTmFtZSgpOwotICAgICAgICBTdHJpbmcgZXh0ZW5kID0gbnVsbDsKLQotICAgICAgICBpZiAoc2MuZ2V0Q29tcG9uZW50VHlwZSgpID09IFNjaGVtYUNvbXBvbmVudC5FTEVNRU5UKQotICAgICAgICAgICAgZXh0ZW5kID0gImphdmF4LnhtbC5iaW5kLkVsZW1lbnQiOwotCi0gICAgICAgIGlmIChjaS5nZXRCYXNlSW50Zk5hbWUoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZXh0ZW5kID09IG51bGwpCi0gICAgICAgICAgICAgICAgZXh0ZW5kID0gY2kuZ2V0QmFzZUludGZOYW1lKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZXh0ZW5kICs9ICIsICIgKyBjaS5nZXRCYXNlSW50Zk5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVtaXQoInB1YmxpYyBpbnRlcmZhY2UgIiArIHNob3J0TmFtZSArIChleHRlbmQgIT0gbnVsbCA/ICIgZXh0ZW5kcyAiICsgZXh0ZW5kIDogIiIpKTsKLSAgICB9Ci0KLSAgICB2b2lkIHByaW50UHJvcGVydHkoU3RyaW5nIHByb3BuYW1lLCBTdHJpbmcgamF2YXR5cGUsIFN0cmluZyBjb2xsZWN0aW9udHlwZSwgYm9vbGVhbiBuaWxsYWJsZSwgU3RyaW5nIGRlZmF1bHR0ZXh0KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHByaW50SmF2YURvYygiR2V0cyB0aGUgIiArIHByb3BuYW1lICsgIiBwcm9wZXJ0eSIpOwotICAgICAgICBlbWl0KGphdmF0eXBlICsgIiBnZXQiICsgcHJvcG5hbWUgKyAiKCk7Iik7Ci0KLSAgICAgICAgU3RyaW5nIHNhZmVWYXJOYW1lID0gTmFtZVV0aWwubm9uSmF2YUtleXdvcmQoTmFtZVV0aWwubG93ZXJDYW1lbENhc2UocHJvcG5hbWUpKTsKLQotICAgICAgICBwcmludEphdmFEb2MoIlNldHMgdGhlICIgKyBwcm9wbmFtZSArICIgcHJvcGVydHkiKTsKLSAgICAgICAgZW1pdCgidm9pZCBzZXQiICsgcHJvcG5hbWUgKyAiKCIgKyBqYXZhdHlwZSArICIgIiArIHNhZmVWYXJOYW1lICsgIik7Iik7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFByb3BlcnR5SW1wbChTdHJpbmcgcHJvcG5hbWUsIFN0cmluZyBqYXZhdHlwZSwgaW50IGphdmFUeXBlQ29kZSwgU3RyaW5nIGNvbGxlY3Rpb250eXBlLCBib29sZWFuIG5pbGxhYmxlLCBTdHJpbmcgZGVmYXVsdHRleHQsIGJvb2xlYW4gdmFsdWUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW1pdCgicHVibGljICIgKyBqYXZhdHlwZSArICIgZ2V0IiArIHByb3BuYW1lICsgIigpIik7Ci0gICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgaWYgKHZhbHVlKQotICAgICAgICAgICAgZW1pdCgicmV0dXJuICIgKyBqZ2V0TWV0aG9kTmFtZUZvckphdmFUeXBlQ29kZShqYXZhVHlwZUNvZGUpICsgIjsiKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgOyAvLyBUT0RPCi0gICAgICAgIGVuZEJsb2NrKCk7Ci0KLSAgICAgICAgU3RyaW5nIHNhZmVWYXJOYW1lID0gTmFtZVV0aWwubm9uSmF2YUtleXdvcmQoTmFtZVV0aWwubG93ZXJDYW1lbENhc2UocHJvcG5hbWUpKTsKLQotICAgICAgICBlbWl0KCJwdWJsaWMgdm9pZCBzZXQiICsgcHJvcG5hbWUgKyAiKCIgKyBqYXZhdHlwZSArICIgIiArIHNhZmVWYXJOYW1lICsgIikiKTsKLSAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICBpZiAodmFsdWUpCi0gICAgICAgICAgICBlbWl0KCJzZXQoIiArIHNhZmVWYXJOYW1lICsgIik7Iik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIDsgLy8gVE9ETwotICAgICAgICBlbmRCbG9jaygpOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRFbGVtZW50Q29uc3RydWN0b3IoU2NoZW1hR2xvYmFsRWxlbWVudCBlbHQsIEVsZW1lbnRJbmZvIGVpKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgIFN0cmluZyBzdXBlcmFyZ3MgPSAiIjsKLSAgICAgICAgaWYgKGVpLmdldFN1cGVyQ3RyQXJnQ291bnQoKSA9PSAxKQotICAgICAgICAgICAgc3VwZXJhcmdzID0gInNUeXBlIjsKLSAgICAgICAgZWxzZSBpZiAoZWkuZ2V0U3VwZXJDdHJBcmdDb3VudCgpID09IDIpCi0gICAgICAgICAgICBzdXBlcmFyZ3MgPSAic1R5cGUsIGZhbHNlIjsKLSAgICAgICAgICAgICovCi0KLSAgICAgICAgZW1pdCgicHVibGljICIgKyBlaS5nZXRTaG9ydEphdmFJbXBsTmFtZSgpICsgIigpIik7Ci0gICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgLy8gZW1pdCgic3VwZXIoIiArIHN1cGVyYXJncyArICIpOyIpOwotICAgICAgICBlbmRCbG9jaygpOwotICAgIH0KLQotICAgIFN0cmluZyBqZ2V0TWV0aG9kTmFtZUZvckphdmFUeXBlQ29kZShpbnQgamF2YVR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN3aXRjaCAoamF2YVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CT09MRUFOOgotICAgICAgICAgICAgICAgIHJldHVybiAiYm9vbGVhblZhbHVlKCkiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJmbG9hdFZhbHVlKCkiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRE9VQkxFOgotICAgICAgICAgICAgICAgIHJldHVybiAiZG91YmxlVmFsdWUoKSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFOgotICAgICAgICAgICAgICAgIHJldHVybiAiYnl0ZVZhbHVlKCkiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9TSE9SVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gInNob3J0VmFsdWUoKSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9JTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJpbnRWYWx1ZSgpIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xPTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJsb25nVmFsdWUoKSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CSUdfREVDSU1BTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImJpZ0RlY2ltYWxWYWx1ZSgpIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19JTlRFR0VSOgotICAgICAgICAgICAgICAgIHJldHVybiAiYmlnSW50ZWdlclZhbHVlKCkiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfU1RSSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAic3RyaW5nVmFsdWUoKSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFX0FSUkFZOgotICAgICAgICAgICAgICAgIHJldHVybiAiYnl0ZUFycmF5VmFsdWUoKSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9DQUxFTkRBUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gImNhbGVuZGFyVmFsdWUoKSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9RTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gInFOYW1lVmFsdWUoKSI7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfTElTVDoKLSAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0Lmxpc3RWYWx1ZSgpOyIpOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0VOVU06Ci0gICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuICgiICsgdHlwZSArICIpdGFyZ2V0LmVudW1WYWx1ZSgpOyIpOyBicmVhazsKLSAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGphdmFUeXBlRm9yQ29kZShpbnQgamF2YVR5cGVDb2RlKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChqYXZhVHlwZUNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CT09MRUFOOgotICAgICAgICAgICAgICAgIHJldHVybiAiYm9vbGVhbiI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJmbG9hdCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRE9VQkxFOgotICAgICAgICAgICAgICAgIHJldHVybiAiZG91YmxlIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFOgotICAgICAgICAgICAgICAgIHJldHVybiAiYnl0ZSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJzaG9ydCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfSU5UOgotICAgICAgICAgICAgICAgIHJldHVybiAiaW50IjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MT05HOgotICAgICAgICAgICAgICAgIHJldHVybiAibG9uZyI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CSUdfREVDSU1BTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImphdmEubWF0aC5CaWdEZWNpbWFsIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CSUdfSU5URUdFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gImphdmEubWF0aC5CaWdJbnRlZ2VyIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9TVFJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJqYXZhLmxhbmcuU3RyaW5nIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFX0FSUkFZOgotICAgICAgICAgICAgICAgIHJldHVybiAiYnl0ZVtdIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9RTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0NBTEVOREFSOgotICAgICAgICAgICAgICAgIHJldHVybiAiamF2YS51dGlsLkNhbGVuZGFyIjsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL2NvbXBpbGVyL0pheGJKYXZhaXplci5qYXZhIGIvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvY29tcGlsZXIvSmF4YkphdmFpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMzFjODIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvY29tcGlsZXIvSmF4YkphdmFpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5jb21waWxlcjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uTmFtZVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvcldhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlQ29kZVByaW50ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKLQotcHVibGljIGZpbmFsIGNsYXNzIEpheGJKYXZhaXplcgotewotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBqYXZhaXplKFNjaGVtYVR5cGVTeXN0ZW0gc3RzLCBNYXAgY29tcG9uZW50RGF0YSwgTWFwIHBhY2thZ2VzLCBYbWxFcnJvcldhdGNoZXIgZXJyb3JzKQotICAgIHsKLSAgICAgICAgZmluYWwgTGlzdCBhbGxDb21wb25lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhbGxDb21wb25lbnRzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0cy5nbG9iYWxFbGVtZW50cygpKSk7Ci0gICAgICAgIGFsbENvbXBvbmVudHMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3RzLmdsb2JhbFR5cGVzKCkpKTsKLQotICAgICAgICBhc3NpZ25HbG9iYWxOYW1lcyhhbGxDb21wb25lbnRzLCBjb21wb25lbnREYXRhLCBwYWNrYWdlcyk7Ci0KLSAgICAgICAgLy8gTm93IGZ1bGx5IGphdmFpemUgZXZlcnl0aGluZyBkZWVwbHkKLQotICAgICAgICBmb3IgKGludCBpID0gMCAsIGxlbiA9IGFsbENvbXBvbmVudHMuc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hQ29tcG9uZW50IHNjID0gKFNjaGVtYUNvbXBvbmVudClhbGxDb21wb25lbnRzLmdldChpKTsKLSAgICAgICAgICAgIGphdmFpemVDb21wb25lbnQoc2MsIGNvbXBvbmVudERhdGEsIHBhY2thZ2VzKTsKLSAgICAgICAgICAgIC8vIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChnVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL1RPRE86IGNoZWNrIGZvciBhbnkgcmVhbCBlcnJvcnM6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGFzc2lnbkdsb2JhbE5hbWVzKExpc3QgYWxsQ29tcG9uZW50cywgTWFwIGNvbXBvbmVudERhdGEsIE1hcCBwYWNrYWdlcykKLSAgICB7Ci0gICAgICAgIFNldCB1c2VkTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwICwgbGVuID0gYWxsQ29tcG9uZW50cy5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFDb21wb25lbnQgc2MgPSAoU2NoZW1hQ29tcG9uZW50KWFsbENvbXBvbmVudHMuZ2V0KGkpOwotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IHNjLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgQ29tcG9uZW50SW5mbyBjaSA9IGdldENvbXBvbmVudEluZm8oc2MsIGNvbXBvbmVudERhdGEpOwotCi0gICAgICAgICAgICBjaS5zZXRGdWxsSmF2YUludGZOYW1lKHBpY2tGdWxsSmF2YUludGZOYW1lKHVzZWROYW1lcywgbmFtZSkpOwotICAgICAgICAgICAgY2kuc2V0RnVsbEphdmFJbXBsTmFtZShwaWNrRnVsbEphdmFJbXBsTmFtZSh1c2VkTmFtZXMsIGNpLmdldEZ1bGxKYXZhSW50Zk5hbWUoKSkpOwotCi0gICAgICAgICAgICAvLyBDb25zdHJ1Y3QgYSBuZXcgUGFja2FnZUluZm8gb2JqZWN0IGZvciBlYWNoIHVuaXF1ZSBwYWNrYWdlIG5hbWUKLSAgICAgICAgICAgIFN0cmluZyBwa2duYW1lID0gZ2V0UGFja2FnZU5hbWUoY2kuZ2V0RnVsbEphdmFJbnRmTmFtZSgpKTsKLSAgICAgICAgICAgIGlmICghIHBhY2thZ2VzLmNvbnRhaW5zS2V5KHBrZ25hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhY2thZ2VJbmZvIHBpID0gbmV3IFBhY2thZ2VJbmZvKHBrZ25hbWUpOwotICAgICAgICAgICAgICAgIHBhY2thZ2VzLnB1dChwa2duYW1lLCBwaSk7Ci0gICAgICAgICAgICAgICAgcGkuc2V0SW5kZXhDbGFzc05hbWUoU2NoZW1hVHlwZUNvZGVQcmludGVyLmluZGV4Q2xhc3NGb3JTeXN0ZW0oc2MuZ2V0VHlwZVN5c3RlbSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGphdmFpemVDb21wb25lbnQoU2NoZW1hQ29tcG9uZW50IHNjLCBNYXAgY29tcG9uZW50RGF0YSwgTWFwIHBhY2thZ2VzKQotICAgIHsKLSAgICAgICAgc3dpdGNoKHNjLmdldENvbXBvbmVudFR5cGUoKSkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgamF2YWl6ZUVsZW1lbnQoKFNjaGVtYUdsb2JhbEVsZW1lbnQpc2MsIGNvbXBvbmVudERhdGEsIHBhY2thZ2VzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuVFlQRToKLSAgICAgICAgICAgICAgICBqYXZhaXplVHlwZSgoU2NoZW1hVHlwZSlzYywgY29tcG9uZW50RGF0YSwgcGFja2FnZXMpOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0SmF2YUltcGxDbGFzcyhTY2hlbWFUeXBlIHNUeXBlLCBDb21wb25lbnRJbmZvIGNpKSB7Ci0gICAgICAgIFNjaGVtYVR5cGUgcFR5cGUgPSBzVHlwZS5nZXRQcmltaXRpdmVUeXBlKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNCdWlsdGluID0gc1R5cGUuaXNCdWlsdGluVHlwZSgpOwotICAgICAgICBTdHJpbmcgYmFzZWNsYXNzID0gbnVsbDsKLSAgICAgICAgaW50IGFyZ2NvdW50ID0gaXNCdWlsdGluID8gMCA6IDI7Ci0KLSAgICAgICAgc3dpdGNoIChwVHlwZS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgotICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxBbnlTaW1wbGVUeXBlSW1wbCI7Ci0gICAgICAgICAgICAgICAgaWYgKHBUeXBlICE9IHNUeXBlKQotICAgICAgICAgICAgICAgICAgICBhcmdjb3VudCA9IDI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0J1aWx0aW4pCi0gICAgICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhQm9vbGVhbkhvbGRlckV4IjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhQm9vbGVhbkhvbGRlciI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgotICAgICAgICAgICAgICAgIGlmICghaXNCdWlsdGluKQotICAgICAgICAgICAgICAgICAgICBiYXNlY2xhc3MgPSAgIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUJhc2U2NEhvbGRlckV4IjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhQmFzZTY0SG9sZGVyIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWToKLSAgICAgICAgICAgICAgICBpZiAoIWlzQnVpbHRpbikKLSAgICAgICAgICAgICAgICAgICAgYmFzZWNsYXNzID0gICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFIZXhCaW5hcnlIb2xkZXJFeCI7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBiYXNlY2xhc3MgPSAgIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUhleEJpbmFyeUhvbGRlciI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9VUkk6Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0J1aWx0aW4pCi0gICAgICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhVXJpSG9sZGVyRXgiOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgYmFzZWNsYXNzID0gICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFVcmlIb2xkZXIiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRToKLSAgICAgICAgICAgICAgICBpZiAoIWlzQnVpbHRpbikKLSAgICAgICAgICAgICAgICAgICAgYmFzZWNsYXNzID0gICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFRTmFtZUhvbGRlckV4IjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhUU5hbWVIb2xkZXIiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjoKLSAgICAgICAgICAgICAgICBpZiAoIWlzQnVpbHRpbikKLSAgICAgICAgICAgICAgICAgICAgYmFzZWNsYXNzID0gICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFOb3RhdGlvbkhvbGRlckV4IjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhTm90YXRpb25Ib2xkZXIiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKLSAgICAgICAgICAgICAgICBpZiAoIWlzQnVpbHRpbikKLSAgICAgICAgICAgICAgICAgICAgYmFzZWNsYXNzID0gICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFGbG9hdEhvbGRlckV4IjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhRmxvYXRIb2xkZXIiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0J1aWx0aW4pCi0gICAgICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhRG91YmxlSG9sZGVyRXgiOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgYmFzZWNsYXNzID0gICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFEb3VibGVIb2xkZXIiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICBpZiAoc1R5cGUuaGFzU3RyaW5nRW51bVZhbHVlcygpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YVN0cmluZ0VudW1lcmF0aW9uSG9sZGVyRXgiOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChwVHlwZSAhPSBzVHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhU3RyaW5nSG9sZGVyRXgiOwotICAgICAgICAgICAgICAgICAgICBhcmdjb3VudCA9IDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhU3RyaW5nSG9sZGVyIjsKLSAgICAgICAgICAgICAgICAgICAgYXJnY291bnQgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICAgICAgYmFzZWNsYXNzID0gICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFHRGF0ZUhvbGRlckV4IjsKLSAgICAgICAgICAgICAgICBhcmdjb3VudCA9IDI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRFVSQVRJT046Ci0gICAgICAgICAgICAgICAgYmFzZWNsYXNzID0gICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFHRHVyYXRpb25Ib2xkZXJFeCI7Ci0gICAgICAgICAgICAgICAgYXJnY291bnQgPSAyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgLy8gRGVjaW1hbCB0eXBlcyBhcmUgaGFuZGxlZCBiZWxvdwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSkgOiAidW5yZWNvZ25pemVkIHByaW1pdGl2ZSB0eXBlIjsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoYmFzZWNsYXNzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFyZ2NvdW50ID0gMjsKLSAgICAgICAgICAgIHN3aXRjaCAoc1R5cGUuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgotICAgICAgICAgICAgICAgICAgICBiYXNlY2xhc3MgPSAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhRGVjaW1hbEhvbGRlckV4IjsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgICAgIGJhc2VjbGFzcyA9ICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFJbnRlZ2VySG9sZGVyRXgiOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTE9ORzoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0lOVDoKLSAgICAgICAgICAgICAgICAgICAgYmFzZWNsYXNzID0gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUxvbmdIb2xkZXJFeCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9TSE9SVDoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lOVDoKLSAgICAgICAgICAgICAgICAgICAgYmFzZWNsYXNzID0gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUludEhvbGRlckV4IjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBzVHlwZSA9IHNUeXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjaS5zZXRCYXNlSW1wbE5hbWUoYmFzZWNsYXNzKTsKLSAgICAgICAgY2kuc2V0U3VwZXJDdHJBcmdDb3VudChhcmdjb3VudCk7Ci0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBqYXZhaXplRWxlbWVudChTY2hlbWFMb2NhbEVsZW1lbnQgZWx0LCBNYXAgY29tcG9uZW50RGF0YSwgTWFwIHBhY2thZ2VzKQotICAgIHsKLSAgICAgICAgLy8gVE9ETzogZGVhbCB3aXRoIGxvY2FsIGVsZW1lbnRzIC0gb25seSBnZW4gaW50ZXJmYWNlIHdoZW4gcGFydCBvZiBhIAotICAgICAgICAvLyBnZW5lcmFsIGNvbnRlbnQgbW9kZWwuIFNlZSA1LjcuMQotCi0gICAgICAgIGlmICghICggZWx0IGluc3RhbmNlb2YgU2NoZW1hR2xvYmFsRWxlbWVudCkgKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIEVsZW1lbnRJbmZvIGVpID0gKEVsZW1lbnRJbmZvKWNvbXBvbmVudERhdGEuZ2V0KGVsdCk7Ci0gICAgICAgIFBhY2thZ2VJbmZvIHBpID0gZ2V0UGFja2FnZUluZm8ocGFja2FnZXMsIGVpLmdldEZ1bGxKYXZhSW50Zk5hbWUoKSk7Ci0KLSAgICAgICAgLy8gVE9ETzogZGVhbCB3aXRoIGFub255bW91cyBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBzZWUgNS43LjIKLSAgICAgICAgaWYgKGVsdC5nZXRUeXBlKCkuZ2V0Q29udGVudFR5cGUoKSAhPSBTY2hlbWFUeXBlLk5PVF9DT01QTEVYX1RZUEUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBGb3IgYW4gZWxlbWVudCB3aG9zZSB0eXBlIGRlZmluaXRpb24gaXMgY29tcGxleCwgdGhlIEphdmEgRWxlbWVudCBpbnRlcmZhY2UKLSAgICAgICAgICAgIC8vIGV4dGVuZHMgdGhlIEphdmEgY29udGVudCBpbnRlcmZhY2UgcmVwcmVzZW50aW5nIHRoZSB0eXBlIGRlZmluaXRpb24uCi0gICAgICAgICAgICBUeXBlSW5mbyB0aSA9IChUeXBlSW5mbyljb21wb25lbnREYXRhLmdldChlbHQuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIGVpLnNldEJhc2VJbnRmTmFtZSh0aS5nZXRGdWxsSmF2YUludGZOYW1lKCkpOwotICAgICAgICAgICAgZWkuc2V0QmFzZUltcGxOYW1lKHRpLmdldEZ1bGxKYXZhSW1wbE5hbWUoKSk7Ci0gICAgICAgICAgICBlaS5zZXRTdXBlckN0ckFyZ0NvdW50KDEpOwotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBGb3IgYW4gZWxlbWVudCB3aG9zZSB0eXBlIGRlZmluaXRpb24gaXMgc2ltcGxlLCBUaGUgZ2VuZXJhdGVkIGVsZW1lbnQKLSAgICAgICAgICAgIC8vIGludGVyZmFjZSBoYXMgYSBKYXZhIHNpbXBsZSBjb250ZW50LXByb3BlcnR5IG5hbWVkICJ2YWx1ZSIKLSAgICAgICAgICAgIGVpLnNldFZhbHVlVHlwZSggZ2V0SmF2YVByb3BlcnR5VHlwZShlbHQuZ2V0VHlwZSgpLCBlbHQuaXNOaWxsYWJsZSgpKSApOwotICAgICAgICAgICAgc2V0SmF2YUltcGxDbGFzcyhlbHQuZ2V0VHlwZSgpLCBlaSk7Ci0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgamF2YWl6ZVR5cGUoU2NoZW1hVHlwZSBzdCwgTWFwIGNvbXBvbmVudERhdGEsIE1hcCBwYWNrYWdlcykKLSAgICB7Ci0gICAgICAgIFR5cGVJbmZvIHRpID0gKFR5cGVJbmZvKWNvbXBvbmVudERhdGEuZ2V0KHN0KTsKLQotICAgICAgICBpZiAoc3QuZ2V0QmFzZVR5cGUoKS5lcXVhbHMoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEUpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB0aQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBzdGF0aWMgQ29tcG9uZW50SW5mbyBnZXRDb21wb25lbnRJbmZvKFNjaGVtYUNvbXBvbmVudCBzYywgTWFwIGNvbXBvbmVudERhdGEpCi0gICAgewotICAgICAgICBDb21wb25lbnRJbmZvIGNpID0gKENvbXBvbmVudEluZm8pY29tcG9uZW50RGF0YS5nZXQoc2MpOwotICAgICAgICBpZiAoY2kgIT0gbnVsbCkgcmV0dXJuIGNpOwotCi0gICAgICAgIC8vIENvdWxkIG5vdCBmaW5kIC0gY3JlYXRlIGEgbmV3IHJlY29yZAotICAgICAgICBzd2l0Y2ggKHNjLmdldENvbXBvbmVudFR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICBjaSA9IG5ldyBFbGVtZW50SW5mbygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5UWVBFOgotICAgICAgICAgICAgICAgIGNpID0gbmV3IFR5cGVJbmZvKCk7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGhhbmRsZSBjb21wb25lbnQgb2YgdHlwZTogIiArIHNjLmdldENvbXBvbmVudFR5cGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb21wb25lbnREYXRhLnB1dChzYywgY2kpOwotICAgICAgICByZXR1cm4gY2k7Ci0gICAgfQotCi0gICAgc3RhdGljIFBhY2thZ2VJbmZvIGdldFBhY2thZ2VJbmZvKE1hcCBwYWNrYWdlcywgU3RyaW5nIGZxY24pCi0gICAgewotICAgICAgICBTdHJpbmcgcGtnbmFtZSA9IGdldFBhY2thZ2VOYW1lKGZxY24pOwotICAgICAgICByZXR1cm4gKFBhY2thZ2VJbmZvKXBhY2thZ2VzLmdldChwa2duYW1lKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKFN0cmluZyBmcWNuKQotICAgIHsKLSAgICAgICAgLy8gcmVtb3ZlIGNsYXNzIG5hbWUKLSAgICAgICAgaW50IGxhc3Rkb3QgPSBmcWNuLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIGlmIChsYXN0ZG90IDwgMCkKLSAgICAgICAgICAgIHJldHVybiAiIjsKLQotICAgICAgICAvLyByZW1vdmUgb3V0ZXIgcGFja2FnZSBuYW1lcwotICAgICAgICByZXR1cm4gZnFjbi5zdWJzdHJpbmcoMCwgbGFzdGRvdCk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBwaWNrRnVsbEphdmFJbnRmTmFtZShTZXQgdXNlZE5hbWVzLCBRTmFtZSBxTmFtZSkKLSAgICB7Ci0gICAgICAgIC8vIEJVR0JVRzogVGhpcyB1dGlsIGRvZXMgbm90IGNvcnJlY3RseSBpbXBsZW1lbnQgSkFYQiBuYW1pbmcgcnVsZXMKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBOYW1lVXRpbC5nZXRDbGFzc05hbWVGcm9tUU5hbWUocU5hbWUpOwotCi0gICAgICAgIGlmICh1c2VkTmFtZXMuY29udGFpbnMobmFtZSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOYW1lIGNvbGxpc2lvbiBvbiBxbmFtZTogIiArIHFOYW1lKTsKLQotICAgICAgICBpZiAocmVzZXJ2ZWRHbG9iYWxDbGFzc05hbWUobmFtZSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJRTmFtZSAiICsgcU5hbWUgKyAiIGNvbmZsaWN0cyB3aXRoIGdlbmVyYXRlZCBKQVhCIGNsYXNzIG5hbWUuIik7Ci0gICAgICAgICAgICAKLSAgICAgICAgdXNlZE5hbWVzLmFkZChuYW1lKTsKLQotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHBpY2tGdWxsSmF2YUltcGxOYW1lKFNldCB1c2VkTmFtZXMsIFN0cmluZyBpbnRmTmFtZSkKLSAgICB7Ci0gICAgICAgIC8vIFN0cmlwIG9mZiB0aGUgcGFja2FnZSBmcm9tIHRoZSBjbGFzcyBuYW1lIHNvIHdlIGNhbiByZXBsYWNlIGl0Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBpbnRmTmFtZTsKLSAgICAgICAgU3RyaW5nIHBrZ05hbWUgPSBudWxsOwotICAgICAgICBpbnQgaW5kZXggPSBpbnRmTmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgY2xhc3NOYW1lID0gaW50Zk5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgICAgICBwa2dOYW1lID0gaW50Zk5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZvcm0gdGhlIG5ldyBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmcm9tIHRoZSBuZXcgcGFja2FnZSBuYW1lCi0gICAgICAgIC8vIGFuZCB0aGUgb2xkIGNsYXNzIG5hbWUKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBwa2dOYW1lICsgIi5pbXBsLiIgKyBjbGFzc05hbWUgKyAiSW1wbCI7Ci0KLSAgICAgICAgaWYgKHVzZWROYW1lcy5jb250YWlucyhuYW1lKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlFOYW1lIGNvbmZsaWN0Iik7Ci0KLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgc3RhdGljIGludCBnZXRCdWlsdGluVHlwZUNvZGUoU2NoZW1hVHlwZSB4bWx0eXBlKQotICAgIHsKLSAgICAgICAgd2hpbGUgKCEgeG1sdHlwZS5pc0J1aWx0aW5UeXBlKCkpCi0gICAgICAgICAgICB4bWx0eXBlID0geG1sdHlwZS5nZXRCYXNlVHlwZSgpOwotCi0gICAgICAgIHJldHVybiB4bWx0eXBlLmdldEJ1aWx0aW5UeXBlQ29kZSgpOwotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgZ2V0SmF2YVByb3BlcnR5VHlwZShTY2hlbWFUeXBlIHhtbHR5cGUsIGJvb2xlYW4gbmlsbGFibGUpCi0gICAgewotICAgICAgICBhc3NlcnQgeG1sdHlwZS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuTk9UX0NPTVBMRVhfVFlQRTsKLQotICAgICAgICAvLyBUT0RPOiBoYW5kbGUgbGlzdHMsIHVuaW9ucywgZW51bXMKLQotICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICh4bWx0eXBlLmdldEJ1aWx0aW5UeXBlQ29kZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRToKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NUUklORzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfU1RSSU5HOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JTlRFR0VSOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9CSUdfSU5URUdFUjsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSU5UOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0lOVDsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTE9ORzoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0lOVDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfTE9ORzsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9CWVRFOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9TSE9SVDsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0RFQ0lNQUw7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9GTE9BVDsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9ET1VCTEU7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JPT0xFQU47Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JZVEU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEU7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9RTkFNRTsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0NBTEVOREFSOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURV9BUlJBWTsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURTsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHhtbHR5cGUgPSB4bWx0eXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiByZXNlcnZlZEdsb2JhbENsYXNzTmFtZShTdHJpbmcgZnFjbikKLSAgICB7Ci0gICAgICAgIGludCBpID0gZnFjbi5sYXN0SW5kZXhPZignLicpOwotICAgICAgICBTdHJpbmcgbGFzdFNlZ21lbnQgPSBmcWNuLnN1YnN0cmluZyhpICsgMSk7Ci0KLSAgICAgICAgaWYgKGxhc3RTZWdtZW50LmVxdWFscygiT2JqZWN0RmFjdG9yeSIpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL2NvbXBpbGVyL1BhY2thZ2VJbmZvLmphdmEgYi92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9jb21waWxlci9QYWNrYWdlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzgxZGY1Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL2NvbXBpbGVyL1BhY2thZ2VJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5jb21waWxlcjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgUGFja2FnZUluZm8gCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX3BhY2thZ2VOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF9pbmRleENsYXNzTmFtZTsKLQotICAgIC8qKiBBIGxpc3Qgb2YgdGhlIGNvbXBvbmVudHMgaW4gdGhpcyBwYWNrYWdlIHRoYXQgd2lsbCBuZWVkIGEgZmFjdG9yeSBtZXRob2QgKi8KLSAgICBwcml2YXRlIGZpbmFsIExpc3QgX2NvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwdWJsaWMgUGFja2FnZUluZm8oU3RyaW5nIHBhY2thZ2VOYW1lKQotICAgIHsKLSAgICAgICAgX3BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3BhY2thZ2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEZhY3RvcnlDb21wb25lbnQoQ29tcG9uZW50SW5mbyBjaSkKLSAgICB7Ci0gICAgICAgIF9jb21wb25lbnRzLmFkZChjaSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZmFjdG9yeUNvbXBvbmVudHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jb21wb25lbnRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluZGV4Q2xhc3NOYW1lKFN0cmluZyBpbmRleENsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIF9pbmRleENsYXNzTmFtZSA9IGluZGV4Q2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5kZXhDbGFzc05hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9pbmRleENsYXNzTmFtZTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvY29tcGlsZXIvVHlwZUluZm8uamF2YSBiL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL2NvbXBpbGVyL1R5cGVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYTAxNWEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvY29tcGlsZXIvVHlwZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuY29tcGlsZXI7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlSW5mbyBleHRlbmRzIENvbXBvbmVudEluZm8gewotCi19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL3J1bnRpbWUvQ29udGV4dEltcGwuamF2YSBiL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL3J1bnRpbWUvQ29udGV4dEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcwMjYwMC4uMDAwMDAwMAotLS0gYS92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9ydW50aW1lL0NvbnRleHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5ydW50aW1lOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkRhdGF0eXBlQ29udmVydGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuVHlwZVN0b3JlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlR5cGVTdG9yZVVzZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5jb21waWxlci5FbGVtZW50SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5jb21waWxlci5UeXBlSW5mbzsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5qYXhiLmNvbmZpZy5KYXhiQ29uZmlnRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuY29uZmlnLkpheGJDb25maWdEb2N1bWVudC5KYXhiQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5qYXhiLmNvbmZpZy5KYXhiQ29uZmlnRG9jdW1lbnQuSmF4YkNvbmZpZy5HbG9iYWxFbGVtZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5jb25maWcuSmF4YkNvbmZpZ0RvY3VtZW50LkpheGJDb25maWcuR2xvYmFsVHlwZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuY29uZmlnLkdsb2JhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuY29uZmlnLkdsb2JhbFR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZXh0SW1wbCBleHRlbmRzIEpBWEJDb250ZXh0IGltcGxlbWVudHMgVHlwZVN0b3JlRmFjdG9yeQotewotICAgIHByaXZhdGUgU2NoZW1hVHlwZUxvYWRlciBfc3RsOwotICAgIHByaXZhdGUgTWFwIF9nbG9iYWxFbGVtZW50czsKLQotICAgIHB1YmxpYyBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXIgY3JlYXRlVW5tYXJzaGFsbGVyKCkgCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFVubWFyc2hhbGxlckltcGwoX3N0bCwgdGhpcyk7Ci0gICAgfQotICAgIHB1YmxpYyBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyIGNyZWF0ZU1hcnNoYWxsZXIoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgTWFyc2hhbGxlckltcGwoKTsKLSAgICB9Ci0gICAgcHVibGljIGphdmF4LnhtbC5iaW5kLlZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9ySW1wbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGNyZWF0ZUVsZW1lbnRVc2VyKFNjaGVtYVR5cGUgcGFyZW50VHlwZSwgUU5hbWUgbmFtZSwgUU5hbWUgeHNpVHlwZSkgCi0gICAgewotICAgICAgICBpZiAocGFyZW50VHlwZS5pc0RvY3VtZW50VHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBFbGVtZW50SW5mbyBlaSA9IChFbGVtZW50SW5mbylfZ2xvYmFsRWxlbWVudHMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgaWYgKGVpID09IG51bGwpIHJldHVybiBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDb25zdHJ1Y3RvciBjdHIgPSBlaS5nZXRKYXZhSW1wbENvbnN0cnVjdG9yKHBhcmVudFR5cGUuZ2V0VHlwZVN5c3RlbSgpLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiAoVHlwZVN0b3JlVXNlciljdHIubmV3SW5zdGFuY2UobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIFR5cGVTdG9yZVVzZXIgY3JlYXRlQXR0cmlidXRlVXNlcihTY2hlbWFUeXBlIHBhcmVudFR5cGUsIFFOYW1lIG5hbWUpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQ29udGV4dEltcGwoU2NoZW1hVHlwZUxvYWRlciBzdGwsIE1hcCBnbG9iYWxFbGVtZW50cykKLSAgICB7Ci0gICAgICAgIF9zdGwgPSBzdGw7Ci0gICAgICAgIF9nbG9iYWxFbGVtZW50cyA9IGdsb2JhbEVsZW1lbnRzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSkFYQkNvbnRleHQgY3JlYXRlQ29udGV4dChTdHJpbmcgY29udGV4dFBhdGgsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQotICAgICAgICB0aHJvd3MgSkFYQkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRGF0YXR5cGVDb252ZXJ0ZXIuc2V0RGF0YXR5cGVDb252ZXJ0ZXIoCi0gICAgICAgICAgICBEYXRhdHlwZUNvbnZlcnRlckltcGwuaW5zdGFuY2UpOwotCi0KLSAgICAgICAgU3RyaW5nW10gcGtncyA9IGNvbnRleHRQYXRoLnNwbGl0KCI6Iik7Ci0KLSAgICAgICAgU2NoZW1hVHlwZUxvYWRlcltdIHN0bHMgPSBuZXcgU2NoZW1hVHlwZUxvYWRlcltwa2dzLmxlbmd0aCArIDFdOwotICAgICAgICBzdGxzWzBdID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKTsKLQotICAgICAgICBNYXAgZ2xvYmFsRWxlbWVudHMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHBrZ3MubGVuZ3RoIDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wcyA9IHBrZ3NbaV0ucmVwbGFjZSgnLicsICcvJykgKyAiL2pheGIucHJvcGVydGllcyI7Ci0gICAgICAgICAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKLQotICAgICAgICAgICAgICAgIHAubG9hZChjbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHByb3BzKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGluZGV4Q2xhc3NOYW1lID0gcC5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuVHlwZVN5c3RlbUhvbGRlciIpOwotCi0gICAgICAgICAgICAgICAgaWYgKGluZGV4Q2xhc3NOYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKCJUaGlzIHBhY2thZ2Ugd2FzIG5vdCBjcmVhdGVkIHdpdGggdGhpcyBKYXhiIGltcGwuIik7Ci0KLSAgICAgICAgICAgICAgICBGaWVsZCBmID0gQ2xhc3MuZm9yTmFtZShpbmRleENsYXNzTmFtZSwgZmFsc2UsIGNsYXNzTG9hZGVyKS5nZXRGaWVsZCgidHlwZVN5c3RlbSIpOwotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gc3RzID0gKFNjaGVtYVR5cGVTeXN0ZW0pZi5nZXQobnVsbCk7Ci0gICAgICAgICAgICAgICAgc3Rsc1tpICsgMV0gPSBzdHM7Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3cgbG9hZCB0aGUgSmF4YiBDb25maWcgaW5mbwotICAgICAgICAgICAgICAgIGxvYWRKYXhiQ29uZmlnKGNsYXNzTG9hZGVyLCBzdHMsIGdsb2JhbEVsZW1lbnRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKCIiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJFeGNlcHRpb24oIlRoaXMgcGFja2FnZSB3YXMgbm90IGNyZWF0ZWQgd2l0aCB0aGlzIGpheGIgaW1wbC4iLCAgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSkFYQkV4Y2VwdGlvbigiVGhpcyBwYWNrYWdlIHdhcyBub3QgY3JlYXRlZCB3aXRoIHRoaXMgamF4YiBpbXBsLiIsICBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJFeGNlcHRpb24oIlRoaXMgcGFja2FnZSB3YXMgbm90IGNyZWF0ZWQgd2l0aCB0aGlzIGpheGIgaW1wbC4iLCAgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJFeGNlcHRpb24oIlRoaXMgcGFja2FnZSB3YXMgbm90IGNyZWF0ZWQgd2l0aCB0aGlzIGpheGIgaW1wbC4iLCAgZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgQ29udGV4dEltcGwoWG1sQmVhbnMudHlwZUxvYWRlclVuaW9uKHN0bHMpLCBnbG9iYWxFbGVtZW50cyk7Ci0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBsb2FkSmF4YkNvbmZpZyhDbGFzc0xvYWRlciBjbCwgU2NoZW1hVHlwZVN5c3RlbSBzdHMsIE1hcCBnbG9iYWxFbGVtZW50cykKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IHN0cy5nZXROYW1lKCkucmVwbGFjZSgnLicsICcvJykgKyAiL0pheGJDb25maWcueG1sIjsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBjbC5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVuYW1lKTsKLQotICAgICAgICBKYXhiQ29uZmlnIGNvbmZpZyA9IEpheGJDb25maWdEb2N1bWVudC5GYWN0b3J5LnBhcnNlKGlzKS5nZXRKYXhiQ29uZmlnKCk7Ci0gICAgICAgIEdsb2JhbEVsZW1lbnRbXSBlbHRzID0gY29uZmlnLmdldEdsb2JhbEVsZW1lbnRzKCkuZ2V0R2xvYmFsRWxlbWVudEFycmF5KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZWx0cy5sZW5ndGggOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnRJbmZvIGVpID0gbmV3IEVsZW1lbnRJbmZvKCk7Ci0gICAgICAgICAgICBlaS5zZXRGdWxsSmF2YUltcGxOYW1lKGVsdHNbaV0uZ2V0SmF2YUltcGwoKSk7Ci0gICAgICAgICAgICBnbG9iYWxFbGVtZW50cy5wdXQoZWx0c1tpXS5nZXRRbmFtZSgpLCBlaSk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL3J1bnRpbWUvRGF0YXR5cGVDb252ZXJ0ZXJJbXBsLmphdmEgYi92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9ydW50aW1lL0RhdGF0eXBlQ29udmVydGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTQ0M2VlLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL3J1bnRpbWUvRGF0YXR5cGVDb252ZXJ0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5ydW50aW1lOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuRGF0YXR5cGVDb252ZXJ0ZXJJbnRlcmZhY2U7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC51dGlsLkJhc2U2NDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudXRpbC5IZXhCaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERhdGVUaW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFRpbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFHRGF0ZUhvbGRlckV4OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUJhc2U2NEhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFIZXhCaW5hcnlIb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhSW50ZWdlckhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFEb3VibGVIb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhRmxvYXRIb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhQm9vbGVhbkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFRTmFtZUhvbGRlcjsKLQotCi0vKiAKLSAgIEltcGxlbWVudGF0aW9uIG5vdGU6Ci0KLSAgIFRoZSBwYXJzZSBtZXRob2RzIGFsbCByZXR1cm4gbnVsbCB3aGVuIHBvc3NpYmxlIGFuZCB0aHJvdyBOUEUgd2hlbiB0aGUKLSAgIHJldHVybiB0eXBlIGlzIGEgc2NhbGFyLiBJIGRvbid0IGtub3cgd2h5IHRoZXkgZG8gdGhpcywgYnV0IHRoYXQncyB3aGF0Ci0gICB0aGUgSkFYQiAxLjAgUkkgZG9lcywgc28gSSdtIGNvcHlpbmcuIEl0IHNlZW1zIHRoZXNlIHNob3VsZCBoYXZlIGRlY2xhcmVkCi0gICBleGNlcHRpb25zLCBidXQgdGhleSBkb24ndC4KLSAgIAotKi8KLSAgIAotCi1wdWJsaWMgY2xhc3MgRGF0YXR5cGVDb252ZXJ0ZXJJbXBsIGltcGxlbWVudHMgRGF0YXR5cGVDb252ZXJ0ZXJJbnRlcmZhY2UKLXsKLQotICAgIHByaXZhdGUgRGF0YXR5cGVDb252ZXJ0ZXJJbXBsKCkge30KLSAgICBwdWJsaWMgc3RhdGljIERhdGF0eXBlQ29udmVydGVySW1wbCBpbnN0YW5jZSA9IG5ldyBEYXRhdHlwZUNvbnZlcnRlckltcGwoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgcHJpbnREZWNpbWFsKGphdmEubWF0aC5CaWdEZWNpbWFsIHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgcHJpbnRRTmFtZShRTmFtZSB2YWx1ZSwgTmFtZXNwYWNlQ29udGV4dCBuc2MpCi0gICAgewotICAgICAgICBpZiAobnNjID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FscGFydCA9IHZhbHVlLmdldExvY2FsUGFydCgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgdXJpID0gdmFsdWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9IG5zYy5nZXRQcmVmaXgodXJpKTsKLQotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpCi0gICAgICAgICAgICAvLyB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiTmFtZXNwYWNlIHVyaSAnIiArIHVyaSArICInIG5vdCBib3VuZCBpbiBjdXJyZW50IGNvbnRleHQiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBwcmVmaXggKyAiOiIgKyBsb2NhbHBhcnQ7Ci0KLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyBwcmludEZsb2F0KGZsb2F0IHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEphdmFGbG9hdEhvbGRlci5zZXJpYWxpemUodmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcHJpbnREb3VibGUoZG91YmxlIHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEphdmFEb3VibGVIb2xkZXIuc2VyaWFsaXplKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHByaW50Qm9vbGVhbihib29sZWFuIHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlID8gInRydWUiIDogImZhbHNlIjsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyBwcmludEJ5dGUoYnl0ZSB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBCeXRlLnRvU3RyaW5nKHZhbHVlKTsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyBwcmludERhdGVUaW1lKGphdmEudXRpbC5DYWxlbmRhciB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgR0RhdGUodmFsdWUpLnRvU3RyaW5nKCk7Ci0KLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyBwcmludEJhc2U2NEJpbmFyeShieXRlW10gdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhCYXNlNjQuZW5jb2RlKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBwcmludEhleEJpbmFyeShieXRlW10gdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhIZXhCaW4uZW5jb2RlKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBwcmludFVuc2lnbmVkSW50KGxvbmcgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gTG9uZy50b1N0cmluZyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBwcmludFVuc2lnbmVkU2hvcnQoaW50IHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcodmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcHJpbnRUaW1lKGphdmEudXRpbC5DYWxlbmRhciB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgR0RhdGUodmFsdWUpLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBwcmludERhdGUoamF2YS51dGlsLkNhbGVuZGFyIHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHRGF0ZSh2YWx1ZSkudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHByaW50QW55U2ltcGxlVHlwZShTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBwcmludFN0cmluZyhTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcHJpbnRJbnRlZ2VyKGphdmEubWF0aC5CaWdJbnRlZ2VyIHMpCi0gICAgewotICAgICAgICByZXR1cm4gcy50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcHJpbnRJbnQoaW50IHMpCi0gICAgewotICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHByaW50TG9uZyhsb25nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gTG9uZy50b1N0cmluZyhzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHByaW50U2hvcnQoc2hvcnQgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBTaG9ydC50b1N0cmluZyhzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHBhcnNlU3RyaW5nKFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YS51dGlsLkNhbGVuZGFyIHBhcnNlRGF0ZVRpbWUoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBHRGF0ZSBkYXRlID0gSmF2YUdEYXRlSG9sZGVyRXgubGV4KHMsIFhtbERhdGVUaW1lLnR5cGUsIF9ldmMpOwotICAgICAgICByZXR1cm4gZGF0ZS5nZXRDYWxlbmRhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gcGFyc2VCYXNlNjRCaW5hcnkoU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gSmF2YUJhc2U2NEhvbGRlci5sZXgocywgX2V2Yyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSBwYXJzZUhleEJpbmFyeShTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBKYXZhSGV4QmluYXJ5SG9sZGVyLmxleChzLCBfZXZjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBwYXJzZVVuc2lnbmVkSW50KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgdHJ5IHsgcmV0dXJuIExvbmcucGFyc2VMb25nKHMpOyB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImludmFsaWQgdW5zaWduZWQgaW50ICIgKyBzKTsgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgcGFyc2VVbnNpZ25lZFNob3J0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgdHJ5IHsgcmV0dXJuIEludGVnZXIucGFyc2VJbnQocyk7IH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiaW52YWxpZCB1bnNpZ25lZCBzaG9ydCAiICsgcyk7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YS51dGlsLkNhbGVuZGFyIHBhcnNlVGltZShTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIEdEYXRlIGRhdGUgPSBKYXZhR0RhdGVIb2xkZXJFeC5sZXgocywgWG1sVGltZS50eXBlLCBfZXZjKTsKLSAgICAgICAgcmV0dXJuIGRhdGUuZ2V0Q2FsZW5kYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgcGFyc2VJbnRlZ2VyKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEphdmFJbnRlZ2VySG9sZGVyLmxleChzLCBfZXZjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YS5tYXRoLkJpZ0RlY2ltYWwgcGFyc2VEZWNpbWFsKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgdHJ5IHsgcmV0dXJuIG5ldyBCaWdEZWNpbWFsKHMpOyB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeyByZXR1cm4gbnVsbDsgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgcGFyc2VJbnQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICB0cnkgeyByZXR1cm4gSW50ZWdlci5wYXJzZUludChzKTsgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJpbnZhbGlkIGludCAiICsgcyk7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBwYXJzZUxvbmcoU3RyaW5nIHMpCi0gICAgewotICAgICAgICB0cnkgeyByZXR1cm4gTG9uZy5wYXJzZUxvbmcocyk7IH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiaW52YWxpZCBsb25nICIgKyBzKTsgfQotICAgIH0KLQotICAgIHB1YmxpYyBzaG9ydCBwYXJzZVNob3J0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgdHJ5IHsgcmV0dXJuIFNob3J0LnBhcnNlU2hvcnQocyk7IH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiaW52YWxpZCBzaG9ydCAiICsgcyk7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgcGFyc2VGbG9hdChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBKYXZhRmxvYXRIb2xkZXIudmFsaWRhdGVMZXhpY2FsKHMsIF9ldmMpOwotICAgIH0KLQotICAgIHB1YmxpYyBkb3VibGUgcGFyc2VEb3VibGUoU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gSmF2YURvdWJsZUhvbGRlci52YWxpZGF0ZUxleGljYWwocywgX2V2Yyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcGFyc2VCb29sZWFuKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEphdmFCb29sZWFuSG9sZGVyLnZhbGlkYXRlTGV4aWNhbChzLCBfZXZjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZSBwYXJzZUJ5dGUoU3RyaW5nIHMpCi0gICAgewotICAgICAgICB0cnkgeyByZXR1cm4gQnl0ZS5wYXJzZUJ5dGUocyk7IH0KLSAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJpbnZhbGlkIGJ5dGUgIiArIHMpOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIHBhcnNlUU5hbWUoU3RyaW5nIHMsIE5hbWVzcGFjZUNvbnRleHQgYykKLSAgICB7Ci0gICAgICAgIHJldHVybiBKYXZhUU5hbWVIb2xkZXIudmFsaWRhdGVMZXhpY2FsKHMsIF9ldmMsIAotICAgICAgICAgICAgbmV3IE5hbWVzcGFjZUNvbnRleHRXcmFwcGVyKGMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YS51dGlsLkNhbGVuZGFyIHBhcnNlRGF0ZShTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBKYXZhR0RhdGVIb2xkZXJFeC5sZXgocywgWG1sRGF0ZS50eXBlLCBfZXZjKS5nZXRDYWxlbmRhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcGFyc2VBbnlTaW1wbGVUeXBlKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZhbGlkYXRpb25Db250ZXh0IF9ldmMgPSBuZXcgRXhjZXB0aW9uVmFsaWRhdGlvbkNvbnRleHQoKTsKLSAgICAvKioKLSAgICAgKiBVc2UgX2V2YyB3aGVuIHlvdSB3YW50IHRvIHRocm93IGFuIEV4Y2VwdGlvbiB3aGVuCi0gICAgICogcGFyc2luZyBhIHNpbXBsZSB0eXBlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEV4Y2VwdGlvblZhbGlkYXRpb25Db250ZXh0IGltcGxlbWVudHMgVmFsaWRhdGlvbkNvbnRleHQKLSAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGludmFsaWQoU3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbiggbWVzc2FnZSApOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvcnVudGltZS9NYXJzaGFsbGVySW1wbC5qYXZhIGIvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvcnVudGltZS9NYXJzaGFsbGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjBkOTdjLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9qYXhiL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9qYXhiL3J1bnRpbWUvTWFyc2hhbGxlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5qYXhiLnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLk1hcnNoYWxFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuVmFsaWRhdGlvbkV2ZW50SGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5Qcm9wZXJ0eUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmhlbHBlcnMuQWJzdHJhY3RNYXJzaGFsbGVySW1wbDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5oZWxwZXJzLkRlZmF1bHRWYWxpZGF0aW9uRXZlbnRIYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotCi1wdWJsaWMgY2xhc3MgTWFyc2hhbGxlckltcGwgaW1wbGVtZW50cyBNYXJzaGFsbGVyCi17Ci0gICAgcHJpdmF0ZSBWYWxpZGF0aW9uRXZlbnRIYW5kbGVyIF9oYW5kbGVyID0gbmV3IERlZmF1bHRWYWxpZGF0aW9uRXZlbnRIYW5kbGVyKCk7Ci0gICAgcHJpdmF0ZSBYbWxPcHRpb25zIF9vcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKS5zZXRTYXZlT3V0ZXIoKTsKLQotCi0gICAgc3RhdGljIE1hcCBKQVhCX1RPX1hCRUFOX1BST1BFUlRZX01BUDsKLSAgICBzdGF0aWMgewotICAgICAgICBKQVhCX1RPX1hCRUFOX1BST1BFUlRZX01BUCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIEpBWEJfVE9fWEJFQU5fUFJPUEVSVFlfTUFQLnB1dChKQVhCX0VOQ09ESU5HLCBYbWxPcHRpb25zLkNIQVJBQ1RFUl9FTkNPRElORyk7Ci0gICAgICAgIEpBWEJfVE9fWEJFQU5fUFJPUEVSVFlfTUFQLnB1dChKQVhCX0ZPUk1BVFRFRF9PVVRQVVQsIFhtbE9wdGlvbnMuU0FWRV9QUkVUVFlfUFJJTlQpOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0WGJlYW5Qcm9wRm9ySmF4YlByb3AoU3RyaW5nIGpheGJOYW1lKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKUpBWEJfVE9fWEJFQU5fUFJPUEVSVFlfTUFQLmdldChqYXhiTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3AsIE9iamVjdCB2YWx1ZSkKLSAgICAgICAgdGhyb3dzIFByb3BlcnR5RXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgeGJlYW5Qcm9wID0gZ2V0WGJlYW5Qcm9wRm9ySmF4YlByb3AocHJvcCk7Ci0gICAgICAgIGlmICh4YmVhblByb3AgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9wZXJ0eUV4Y2VwdGlvbihwcm9wICsgIiBpcyB1bnN1cHBvcnRlZC4iKTsKLQotICAgICAgICBfb3B0aW9ucy5wdXQoeGJlYW5Qcm9wLCB2YWx1ZSk7Ci0KLSAgICB9Ci0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcCkKLSAgICAgICAgdGhyb3dzIFByb3BlcnR5RXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgeGJlYW5Qcm9wID0gZ2V0WGJlYW5Qcm9wRm9ySmF4YlByb3AocHJvcCk7Ci0gICAgICAgIGlmICh4YmVhblByb3AgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9wZXJ0eUV4Y2VwdGlvbihwcm9wICsgIiBpcyB1bnN1cHBvcnRlZC4iKTsKLQotICAgICAgICByZXR1cm4gX29wdGlvbnMuZ2V0KHhiZWFuUHJvcCk7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmF4LnhtbC5iaW5kLlZhbGlkYXRpb25FdmVudEhhbmRsZXIgZ2V0RXZlbnRIYW5kbGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaGFuZGxlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFdmVudEhhbmRsZXIoVmFsaWRhdGlvbkV2ZW50SGFuZGxlciBoYW5kbGVyKQotICAgIHsKLSAgICAgICAgX2hhbmRsZXIgPSBoYW5kbGVyOwotICAgIH0KLQotICAgIHZvaWQgbWFyc2hhbChPYmplY3Qgb2JqLCBDb250ZW50SGFuZGxlciBjaCwgTGV4aWNhbEhhbmRsZXIgbGgpCi0gICAgICAgIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uLCBKQVhCRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeG1sb2JqID0gZ2V0WG1sT2JqZWN0KG9iaik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHhtbG9iai5zYXZlKGNoLCAgbGgsIF9vcHRpb25zKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWFyc2hhbChPYmplY3Qgb2JqLCBDb250ZW50SGFuZGxlciBjaCkKLSAgICAgICAgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24sIEpBWEJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG1hcnNoYWwob2JqLCBjaCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWFyc2hhbChPYmplY3Qgb2JqLCBOb2RlIG5vZGUpCi0gICAgICAgIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uLCBKQVhCRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtYXJzaGFsKE9iamVjdCBvYmosIE91dHB1dFN0cmVhbSBvdXQpCi0gICAgICAgIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uLCBKQVhCRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeG1sb2JqID0gZ2V0WG1sT2JqZWN0KG9iaik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHhtbG9iai5zYXZlKG91dCwgX29wdGlvbnMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSkFYQkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1hcnNoYWwoT2JqZWN0IG9iaiwgIFdyaXRlciBvdXQpCi0gICAgICAgIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uLCBKQVhCRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeG1sb2JqID0gZ2V0WG1sT2JqZWN0KG9iaik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHhtbG9iai5zYXZlKG91dCwgIF9vcHRpb25zKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtYXJzaGFsKE9iamVjdCBvYmosIGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0IHJlc3VsdCkKLSAgICAgICAgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24sIEpBWEJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBTQVhSZXN1bHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNBWFJlc3VsdCBzYXhyZXN1bHQgPSAoU0FYUmVzdWx0KXJlc3VsdDsKLSAgICAgICAgICAgIG1hcnNoYWwob2JqLCBzYXhyZXN1bHQuZ2V0SGFuZGxlcigpLCBzYXhyZXN1bHQuZ2V0TGV4aWNhbEhhbmRsZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocmVzdWx0IGluc3RhbmNlb2YgRE9NUmVzdWx0KQotICAgICAgICB7Ci0gICAgICAgICAgICBET01SZXN1bHQgZG9tcmVzdWx0ID0gKERPTVJlc3VsdClyZXN1bHQ7Ci0gICAgICAgICAgICBtYXJzaGFsKG9iaiwgZG9tcmVzdWx0LmdldE5vZGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocmVzdWx0IGluc3RhbmNlb2YgU3RyZWFtUmVzdWx0KQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJlYW1SZXN1bHQgc3IgPSAoU3RyZWFtUmVzdWx0KXJlc3VsdDsKLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IHNyLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgV3JpdGVyIHcgPSBzci5nZXRXcml0ZXIoKTsKLQotICAgICAgICAgICAgaWYgKG9zICE9IG51bGwpCi0gICAgICAgICAgICAgICAgbWFyc2hhbChvYmosIG9zKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHcgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBtYXJzaGFsKG9iaiwgdyk7Ci0gICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJpbnZhbGlkIFJlc3VsdCBwYXJhbWV0ZXIiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiaW52YWxpZCBSZXN1bHQgcGFyYW1ldGVyIik7Ci0gICAgfQotCi0gICAgcHVibGljIG9yZy53M2MuZG9tLk5vZGUgZ2V0Tm9kZShPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHN0YXRpYyBYbWxPYmplY3QgZ2V0WG1sT2JqZWN0KE9iamVjdCBvYmopIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCEgKCBvYmogaW5zdGFuY2VvZiBYbWxPYmplY3QgKSApCi0gICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiQ2Fubm90IG1hcnNoYWwgb2JqZWN0LiBJdCB3YXMgbm90IGNyZWF0ZWQgYnkgdGhpcyBKQVhCIHByb3ZpZGVyLiIpOwotCi0gICAgICAgIHJldHVybiAoWG1sT2JqZWN0KW9iajsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9ydW50aW1lL05hbWVzcGFjZUNvbnRleHRXcmFwcGVyLmphdmEgYi92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9ydW50aW1lL05hbWVzcGFjZUNvbnRleHRXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWFmOTguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvcnVudGltZS9OYW1lc3BhY2VDb250ZXh0V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5ydW50aW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5OYW1lc3BhY2VNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZUNvbnRleHRXcmFwcGVyIGltcGxlbWVudHMgTmFtZXNwYWNlTWFuYWdlcgotewotICAgIHByaXZhdGUgTmFtZXNwYWNlQ29udGV4dCBfY29udGV4dDsKLQotICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0V3JhcHBlcihOYW1lc3BhY2VDb250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBfY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBmaW5kX3ByZWZpeF9mb3JfbnN1cmkoU3RyaW5nIG5zdXJpLCBTdHJpbmcgc3VnZ2VzdGVkX3ByZWZpeCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY29udGV4dC5nZXRQcmVmaXgobnN1cmkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlRm9yUHJlZml4KFN0cmluZyBwcmVmaXgpCi0gICAgewotICAgICAgICByZXR1cm4gX2NvbnRleHQuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvcnVudGltZS9Vbm1hcnNoYWxsZXJJbXBsLmphdmEgYi92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9ydW50aW1lL1VubWFyc2hhbGxlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNmYzBhNS4uMDAwMDAwMAotLS0gYS92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9ydW50aW1lL1VubWFyc2hhbGxlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5qYXhiLnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVySGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuUHJvcGVydHlFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuVmFsaWRhdGlvbkV2ZW50SGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmhlbHBlcnMuRGVmYXVsdFZhbGlkYXRpb25FdmVudEhhbmRsZXI7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmVGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgVW5tYXJzaGFsbGVySW1wbCBpbXBsZW1lbnRzIFVubWFyc2hhbGxlcgotewotICAgIHByaXZhdGUgZmluYWwgU2NoZW1hVHlwZUxvYWRlciBfc3RsOwotCi0gICAgYm9vbGVhbiBfdmFsaWRhdGluZyA9IGZhbHNlOwotICAgIFZhbGlkYXRpb25FdmVudEhhbmRsZXIgX2hhbmRsZXIgPSBuZXcgRGVmYXVsdFZhbGlkYXRpb25FdmVudEhhbmRsZXIoKTsKLSAgICBwcml2YXRlIFhtbE9wdGlvbnMgX29wdGlvbnM7Ci0KLSAgICBVbm1hcnNoYWxsZXJJbXBsKFNjaGVtYVR5cGVMb2FkZXIgc3RsLCBDb250ZXh0SW1wbCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHN0bCAhPSBudWxsOwotICAgICAgICBfc3RsID0gc3RsOwotCi0gICAgICAgIF9vcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgX29wdGlvbnMucHV0KFR5cGVTdG9yZUZhY3RvcnkuS0VZLCAgY29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGluZyhib29sZWFuIHZhbGlkYXRpbmcpCi0gICAgewotICAgICAgICBfdmFsaWRhdGluZyA9IHZhbGlkYXRpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0aW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsaWRhdGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFdmVudEhhbmRsZXIoVmFsaWRhdGlvbkV2ZW50SGFuZGxlciBoYW5kbGVyKSAKLSAgICB7Ci0gICAgICAgIF9oYW5kbGVyID0gaGFuZGxlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmFsaWRhdGlvbkV2ZW50SGFuZGxlciBnZXRFdmVudEhhbmRsZXIoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaGFuZGxlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcCwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgUHJvcGVydHlFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBQcm9wZXJ0eUV4Y2VwdGlvbihwcm9wLCAgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3ApIHRocm93cyBQcm9wZXJ0eUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFByb3BlcnR5RXhjZXB0aW9uKHByb3ApOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdW5tYXJzaGFsKEZpbGUgZikKLSAgICAgICAgdGhyb3dzIEpBWEJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCBvOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbyA9IF9zdGwucGFyc2UoZiwgIG51bGwsICBfb3B0aW9ucyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBvID0gcG9zdFByb2Nlc3Mobyk7Ci0gICAgICAgIHJldHVybiBvOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdW5tYXJzaGFsKFVSTCB1cmwpCi0gICAgICAgIHRocm93cyBKQVhCRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5ZSSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdW5tYXJzaGFsKElucHV0U3RyZWFtIGlzKQotICAgICAgICB0aHJvd3MgSkFYQkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IG87Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvID0gX3N0bC5wYXJzZShpcywgIG51bGwsICBfb3B0aW9ucyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBvID0gcG9zdFByb2Nlc3Mobyk7Ci0gICAgICAgIHJldHVybiBvOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdW5tYXJzaGFsKFJlYWRlciByKQotICAgICAgICB0aHJvd3MgSkFYQkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IG87Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvID0gX3N0bC5wYXJzZShyLCAgbnVsbCwgIF9vcHRpb25zKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSkFYQkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG8gPSBwb3N0UHJvY2VzcyhvKTsKLSAgICAgICAgcmV0dXJuIG87Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB1bm1hcnNoYWwoSW5wdXRTb3VyY2UgcykKLSAgICAgICAgdGhyb3dzIEpBWEJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChzLmdldEJ5dGVTdHJlYW0oKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHVubWFyc2hhbChzLmdldEJ5dGVTdHJlYW0oKSk7Ci0gICAgICAgIGVsc2UgaWYgKHMuZ2V0Q2hhcmFjdGVyU3RyZWFtKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB1bm1hcnNoYWwocy5nZXRDaGFyYWN0ZXJTdHJlYW0oKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKCJJbnZhbGlkIGlucHV0IHNvdXJjZS4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHVubWFyc2hhbChOb2RlIG5vZGUpCi0gICAgICAgIHRocm93cyBKQVhCRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgbzsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG8gPSBfc3RsLnBhcnNlKG5vZGUsICBudWxsLCAgX29wdGlvbnMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBvID0gcG9zdFByb2Nlc3Mobyk7Ci0gICAgICAgIHJldHVybiBvOwotCi0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB1bm1hcnNoYWwoU291cmNlIHNvdXJjZSkKLSAgICAgICAgdGhyb3dzIEpBWEJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTllJIik7Ci0gICAgfQotCi0gICAgWG1sT2JqZWN0IHBvc3RQcm9jZXNzKFhtbE9iamVjdCBvKSB0aHJvd3MgVW5tYXJzaGFsRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoX3ZhbGlkYXRpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVmFsaWRhdG9ySW1wbC52YWxpZGF0ZUltcGwobywgX2hhbmRsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbm1hcnNoYWxFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIFhtbEN1cnNvciBjID0gby5uZXdDdXJzb3IoKTsKLSAgICAgICAgaWYgKGMudG9GaXJzdENoaWxkKCkpCi0gICAgICAgICAgICByZXR1cm4gYy5nZXRPYmplY3QoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy8gc2ltaWxhciB0byBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFNheEhhbmRsZXIKLSAgICBwdWJsaWMgVW5tYXJzaGFsbGVySGFuZGxlciBnZXRVbm1hcnNoYWxsZXJIYW5kbGVyKCkKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTllJIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9ydW50aW1lL1ZhbGlkYXRpb25Mb2NhdG9yRXZlbnRJbXBsLmphdmEgYi92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9ydW50aW1lL1ZhbGlkYXRpb25Mb2NhdG9yRXZlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTZhNTQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvcnVudGltZS9WYWxpZGF0aW9uTG9jYXRvckV2ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIucnVudGltZTsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlZhbGlkYXRpb25FdmVudExvY2F0b3I7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uTG9jYXRvckV2ZW50SW1wbCBpbXBsZW1lbnRzIFZhbGlkYXRpb25FdmVudExvY2F0b3IgCi17Ci0gICAgaW50IF9saW5lTnVtYmVyOwotICAgIGludCBfY29sdW1uTnVtYmVyOwotICAgIGludCBfb2Zmc2V0OwotICAgIFVSTCBfdXJsOwotICAgIFhtbE9iamVjdCBfb2JqZWN0OwotCi0gICAgcHVibGljIHN0YXRpYyBWYWxpZGF0aW9uTG9jYXRvckV2ZW50SW1wbCBjcmVhdGUoWG1sRXJyb3IgZXJyb3IpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25Mb2NhdG9yRXZlbnRJbXBsKGVycm9yLmdldExpbmUoKSwgZXJyb3IuZ2V0Q29sdW1uKCksCi0gICAgICAgICAgICBlcnJvci5nZXRPZmZzZXQoKSwgZXJyb3IuZ2V0T2JqZWN0TG9jYXRpb24oKSwgZXJyb3IuZ2V0U291cmNlTmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25Mb2NhdG9yRXZlbnRJbXBsKGludCBsaW5lTnVtYmVyLCBpbnQgY29sdW1uTnVtYmVyLAotICAgICAgICBpbnQgb2Zmc2V0LCBYbWxPYmplY3Qgb2JqZWN0LCBTdHJpbmcgc291cmNlTmFtZSkKLSAgICB7Ci0gICAgICAgIF9saW5lTnVtYmVyID0gbGluZU51bWJlcjsKLSAgICAgICAgX2NvbHVtbk51bWJlciA9IGNvbHVtbk51bWJlcjsKLSAgICAgICAgX29mZnNldCA9IG9mZnNldDsKLSAgICAgICAgX29iamVjdCA9IG9iamVjdDsKLQotICAgICAgICB0cnkgeyBfdXJsID0gbmV3IFVSTChzb3VyY2VOYW1lKTsgfQotICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHt9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YS5uZXQuVVJMIGdldFVSTCgpCi0gICAgewotICAgICAgICByZXR1cm4gX3VybDsKLSAgICB9Ci0gICAgcHVibGljIGludCBnZXRPZmZzZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9vZmZzZXQ7Ci0gICAgfQotICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpCi0gICAgewotICAgICAgICByZXR1cm4gX2xpbmVOdW1iZXI7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jb2x1bW5OdW1iZXI7Ci0gICAgfQotCi0gICAgcHVibGljIG9yZy53M2MuZG9tLk5vZGUgZ2V0Tm9kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0T2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfb2JqZWN0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2pheGIvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2pheGIvcnVudGltZS9WYWxpZGF0b3JJbXBsLmphdmEgYi92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9ydW50aW1lL1ZhbGlkYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE5OTc0NC4uMDAwMDAwMAotLS0gYS92MS9zcmMvamF4Yi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvamF4Yi9ydW50aW1lL1ZhbGlkYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5qYXhiLnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuVmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuVmFsaWRhdGlvbkV2ZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlZhbGlkYXRpb25FdmVudEhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuUHJvcGVydHlFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuaGVscGVycy5EZWZhdWx0VmFsaWRhdGlvbkV2ZW50SGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5oZWxwZXJzLlZhbGlkYXRpb25FdmVudEltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFcnJvcjsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRvckltcGwgaW1wbGVtZW50cyBWYWxpZGF0b3IgCi17Ci0gICAgVmFsaWRhdGlvbkV2ZW50SGFuZGxlciBfaGFuZGxlciA9IG5ldyBEZWZhdWx0VmFsaWRhdGlvbkV2ZW50SGFuZGxlcigpOwotCi0gICAgcHVibGljIHZvaWQgc2V0RXZlbnRIYW5kbGVyKFZhbGlkYXRpb25FdmVudEhhbmRsZXIgaGFuZGxlcikgCi0gICAgewotICAgICAgICBfaGFuZGxlciA9IGhhbmRsZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFZhbGlkYXRpb25FdmVudEhhbmRsZXIgZ2V0RXZlbnRIYW5kbGVyKCkgCi0gICAgewotICAgICAgICByZXR1cm4gX2hhbmRsZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHRocm93cyBQcm9wZXJ0eUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFByb3BlcnR5RXhjZXB0aW9uKHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgdGhyb3dzIFByb3BlcnR5RXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgUHJvcGVydHlFeGNlcHRpb24ocHJvcGVydHksICB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoT2JqZWN0IG8pIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAobyA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCi0gICAgICAgIGlmICghICggbyBpbnN0YW5jZW9mIFhtbE9iamVjdCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IHZhbGlkYXRlIHRyZWUgcm9vdGVkIGF0IHN1YnJvb3RPYmouIik7Ci0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRlSW1wbCgoWG1sT2JqZWN0KW8sIF9oYW5kbGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJvb3QoT2JqZWN0IG8pIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gdmFsaWRhdGUobyk7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVJbXBsKFhtbE9iamVjdCBvLCBWYWxpZGF0aW9uRXZlbnRIYW5kbGVyIGhhbmRsZXIpCi0gICAgICAgIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgewotCi0gICAgICAgIGFzc2VydCBvICE9IG51bGwgJiYgaGFuZGxlciAhPSBudWxsOwotCi0gICAgICAgIGZpbmFsIExpc3QgbCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZmluYWwgWG1sT3B0aW9ucyBvcHRzID0gbmV3IFhtbE9wdGlvbnMoKS5zZXRFcnJvckxpc3RlbmVyKGwpOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gdmFsaWQgPSBvLnZhbGlkYXRlKG9wdHMpOwotCi0gICAgICAgIC8vIGNvbnZlcnQgdG8gVmFsaWRhdGlvbkV2ZW50IGFuZCBkaXNwYXRjaAotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBsLnNpemUoKSA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgWG1sRXJyb3IgeGUgPSAoWG1sRXJyb3IpbC5nZXQoaSk7Ci0KLSAgICAgICAgICAgIGludCBzZXZlcml0eSA9IHhlLmdldFNldmVyaXR5KCkgPT0gWG1sRXJyb3IuU0VWRVJJVFlfRVJST1IgPyAKLSAgICAgICAgICAgICAgICBWYWxpZGF0aW9uRXZlbnQuRVJST1IgOgotICAgICAgICAgICAgICAgIFZhbGlkYXRpb25FdmVudC5XQVJOSU5HOwotCi0gICAgICAgICAgICBWYWxpZGF0aW9uRXZlbnQgdmUgPSBuZXcgVmFsaWRhdGlvbkV2ZW50SW1wbChzZXZlcml0eSwgeGUuZ2V0TWVzc2FnZSgpLCAKLSAgICAgICAgICAgICAgICBWYWxpZGF0aW9uTG9jYXRvckV2ZW50SW1wbC5jcmVhdGUoeGUpKTsKLQotICAgICAgICAgICAgdHJ5IAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghIGhhbmRsZXIuaGFuZGxlRXZlbnQodmUpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbih2ZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWxpZDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy9qYXhiL3NjaGVtYS9qYXhiY29uZmlnLnhzZCBiL3YxL3NyYy9qYXhiL3NjaGVtYS9qYXhiY29uZmlnLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhZDAyNi4uMDAwMDAwMAotLS0gYS92MS9zcmMvamF4Yi9zY2hlbWEvamF4YmNvbmZpZy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczpqYz0iaHR0cDovL3d3dy5iZWEuY29tLzIwMDMvMDgvamF4Yi9jb25maWciCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuYmVhLmNvbS8yMDAzLzA4L2pheGIvY29uZmlnIgotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAKLSAgPHhzOmVsZW1lbnQgbmFtZT0iamF4Yi1jb25maWciPgotICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLQotICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJnbG9iYWwtZWxlbWVudHMiPgotICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Imdsb2JhbC1lbGVtZW50IiB0eXBlPSJqYzpnbG9iYWwtZWxlbWVudCIvPgotICAgICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZ2xvYmFsLXR5cGVzIiA+Ci0gICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZ2xvYmFsLXR5cGUiIHR5cGU9ImpjOmdsb2JhbC10eXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLQotICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Imdsb2JhbC1lbGVtZW50Ij4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJxbmFtZSIgdHlwZT0ieHM6UU5hbWUiLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJqYXZhLWltcGwiIHR5cGU9InhzOnRva2VuIi8+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJnbG9iYWwtdHlwZSIvPgotCi08L3hzOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2pheGIvc2NoZW1hL2pheGJjb25maWcueHNkY29uZmlnIGIvdjEvc3JjL2pheGIvc2NoZW1hL2pheGJjb25maWcueHNkY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWQwMDMzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9qYXhiL3NjaGVtYS9qYXhiY29uZmlnLnhzZGNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPHhiOmNvbmZpZyB4bWxuczp4Yj0iaHR0cDovL3d3dy5iZWEuY29tLzIwMDIvMDkveGJlYW4vY29uZmlnIj4KLSAgPHhiOm5hbWVzcGFjZSB1cmk9Imh0dHA6Ly93d3cuYmVhLmNvbS8yMDAzLzA4L2pheGIvY29uZmlnIj4KLSAgICA8eGI6cGFja2FnZT5vcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5jb25maWc8L3hiOnBhY2thZ2U+Ci0gIDwveGI6bmFtZXNwYWNlPgotPC94Yjpjb25maWc+CmRpZmYgLS1naXQgYS92MS9zcmMvcmVwYWNrYWdlL3JlcGFja2FnZS9FZGl0QnVpbGRTY3JpcHQuamF2YSBiL3YxL3NyYy9yZXBhY2thZ2UvcmVwYWNrYWdlL0VkaXRCdWlsZFNjcmlwdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmViNTk3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy9yZXBhY2thZ2UvcmVwYWNrYWdlL0VkaXRCdWlsZFNjcmlwdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgcmVwYWNrYWdlOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1wdWJsaWMgY2xhc3MgRWRpdEJ1aWxkU2NyaXB0Ci17Ci0gICAgLy8KLSAgICAvLyB1c2dhZTogZWRpdCBidWlsZGZpbGUgdG9rZW4gbmV3LXZhbHVlCi0gICAgLy8KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluICggU3RyaW5nW10gYXJncyApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAzKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMiICk7Ci0KLSAgICAgICAgYXJnc1sgMCBdID0gYXJnc1sgMCBdLnJlcGxhY2UoICcvJywgRmlsZS5zZXBhcmF0b3JDaGFyICk7Ci0KLSAgICAgICAgRmlsZSBidWlsZEZpbGUgPSBuZXcgRmlsZSggYXJnc1sgMCBdICk7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gcmVhZEZpbGUoIGJ1aWxkRmlsZSApOwotCi0gICAgICAgIFN0cmluZyB0b2tlblN0ciA9ICI8cHJvcGVydHkgbmFtZT1cIiIgKyBhcmdzWyAxIF0gKyAiXCIgdmFsdWU9XCIiOwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpbnQgaSA9IHNiLmluZGV4T2YoIHRva2VuU3RyICk7Ci0KLSAgICAgICAgaWYgKGkgPCAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkNhbid0IGZpbmQgdG9rZW46ICIgKyB0b2tlblN0ciApOwotCi0gICAgICAgIGludCBqID0gaSArIHRva2VuU3RyLmxlbmd0aCgpOwotCi0gICAgICAgIHdoaWxlICggc2IuY2hhckF0KCBqICkgIT0gJyInICkKLSAgICAgICAgICAgIGorKzsKLQotICAgICAgICBzYi5yZXBsYWNlKCBpICsgdG9rZW5TdHIubGVuZ3RoKCksIGosIGFyZ3NbIDIgXSApOwotCi0gICAgICAgIHdyaXRlRmlsZSggYnVpbGRGaWxlLCBzYiApOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgU3RyaW5nQnVmZmVyIHJlYWRGaWxlICggRmlsZSBmICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oIGYgKTsKLSAgICAgICAgUmVhZGVyIHIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIGluICk7Ci0gICAgICAgIFN0cmluZ1dyaXRlciB3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCi0gICAgICAgIGNvcHkoIHIsIHcgKTsKLQotICAgICAgICB3LmNsb3NlKCk7Ci0gICAgICAgIHIuY2xvc2UoKTsKLSAgICAgICAgaW4uY2xvc2UoKTsKLQotICAgICAgICByZXR1cm4gdy5nZXRCdWZmZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIHZvaWQgd3JpdGVGaWxlICggRmlsZSBmLCBTdHJpbmdCdWZmZXIgY2hhcnMgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggZiApOwotICAgICAgICBXcml0ZXIgdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG91dCApOwotICAgICAgICBSZWFkZXIgciA9IG5ldyBTdHJpbmdSZWFkZXIoIGNoYXJzLnRvU3RyaW5nKCkgKTsKLQotICAgICAgICBjb3B5KCByLCB3ICk7Ci0KLSAgICAgICAgci5jbG9zZSgpOwotICAgICAgICB3LmNsb3NlKCk7Ci0gICAgICAgIG91dC5jbG9zZSgpOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdm9pZCBjb3B5ICggUmVhZGVyIHIsIFdyaXRlciB3ICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXIgWyAxMDI0ICogMTYgXTsKLQotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbiA9IHIucmVhZCggYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoICk7Ci0KLSAgICAgICAgICAgIGlmIChuIDwgMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgdy53cml0ZSggYnVmZmVyLCAwLCBuICk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvcmVwYWNrYWdlL3JlcGFja2FnZS9SZXBhY2thZ2UuamF2YSBiL3YxL3NyYy9yZXBhY2thZ2UvcmVwYWNrYWdlL1JlcGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDBjOTNhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy9yZXBhY2thZ2UvcmVwYWNrYWdlL1JlcGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgcmVwYWNrYWdlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC4qOwotCi1wdWJsaWMgY2xhc3MgUmVwYWNrYWdlCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbmV3IFJlcGFja2FnZSgpLnJlcGFja2FnZSggYXJncyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZXBhY2thZ2UgKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDIgfHwgIWFyZ3NbMF0uZXF1YWxzKCAiLXJlcGFja2FnZSIgKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiVXNhZ2U6IHJlcGFja2FnZSAtcmVwYWNrYWdlIFtzcGVjXSIgKTsKLSAgICAgICAgCi0gICAgICAgIF9yZXBhY2thZ2VyID0gbmV3IFJlcGFja2FnZXIoIGFyZ3NbIDEgXSApOwotCi0gICAgICAgIF9mcm9tUGFja2FnZXMgPSBfcmVwYWNrYWdlci5nZXRGcm9tUGFja2FnZXMoKTsKLSAgICAgICAgX3RvUGFja2FnZXMgPSBfcmVwYWNrYWdlci5nZXRUb1BhY2thZ2VzKCk7Ci0gICAgICAgIAotICAgICAgICBfcGFja2FnZVBhdHRlcm4gPQotICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCAiXlxccypwYWNrYWdlXFxzKygoPzpcXHd8XFwuKSopXFxzKjsiLCBQYXR0ZXJuLk1VTFRJTElORSApOwotICAgICAgICAKLSAgICAgICAgX21vdmVBbG9uZ0ZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBfbW92ZWREaXJzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgCi0gICAgICAgIEZpbGUgY3VycmVudERpciAgID0gbmV3IEZpbGUoICIuIiApOwotICAgICAgICBGaWxlIGJ1aWxkRGlyICAgICA9IG5ldyBGaWxlKCBjdXJyZW50RGlyLCAiYnVpbGQiICk7Ci0gICAgICAgIEZpbGUgcmVwYWNrYWdlRGlyID0gbmV3IEZpbGUoIGJ1aWxkRGlyLCAicmVwYWNrYWdlIiApOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkRlbGV0aW5nIHJlcGFja2FnZSBkaXIgLi4uIiApOwotICAgICAgICAKLSAgICAgICAgcmVjdXJzaXZlRGVsZXRlKCByZXBhY2thZ2VEaXIgKTsKLQotICAgICAgICByZXBhY2thZ2VEaXIubWtkaXJzKCk7Ci0gICAgICAgIAotICAgICAgICBBcnJheUxpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgZmlsbEZpbGVzKCBmaWxlcywgY3VycmVudERpciApOwotICAgICAgICAKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiUmVwYWNrYWdpbmcgIiArIGZpbGVzLnNpemUoKSArICIgZmlsZXMgLi4uIiApOwotCi0gICAgICAgIGludCBwcmVmaXhMZW5ndGggPSBjdXJyZW50RGlyLmdldENhbm9uaWNhbFBhdGgoKS5sZW5ndGgoKTsKLQotICAgICAgICBfc291cmNlQmFzZSA9IGN1cnJlbnREaXI7Ci0gICAgICAgIF90YXJnZXRCYXNlID0gcmVwYWNrYWdlRGlyOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBmaWxlcy5zaXplKCkgOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIGZyb20gPSAoRmlsZSkgZmlsZXMuZ2V0KCBpICk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZnJvbS5nZXRDYW5vbmljYWxQYXRoKCkuc3Vic3RyaW5nKCBwcmVmaXhMZW5ndGggKyAxICk7Ci0KLSAgICAgICAgICAgIHJlcGFja2FnZUZpbGUoIG5hbWUgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluaXNoTW92aW5nRmlsZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXBhY2thZ2VGaWxlICggU3RyaW5nIG5hbWUgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCAiLmphdmEiICkpCi0gICAgICAgICAgICByZXBhY2thZ2VKYXZhRmlsZSggbmFtZSApOwotICAgICAgICBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCAiLnhzZGNvbmZpZyIgKSkKLSAgICAgICAgICAgIHJlcGFja2FnZU5vbkphdmFGaWxlKCBuYW1lICk7Ci0gICAgICAgIGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCggImJpbiIgKyBGaWxlLnNlcGFyYXRvckNoYXIgKSkKLSAgICAgICAgICAgIHJlcGFja2FnZU5vbkphdmFGaWxlKCBuYW1lICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1vdmVBbG9uZ1dpdGhKYXZhRmlsZXMoIG5hbWUgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb3ZlQWxvbmdXaXRoSmF2YUZpbGVzKCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBfbW92ZUFsb25nRmlsZXMuYWRkKG5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBmaW5pc2hNb3ZpbmdGaWxlcyAoICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmb3IgKCBJdGVyYXRvciBpID0gX21vdmVBbG9uZ0ZpbGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdG9OYW1lID0gbmFtZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIHNyY0RpciA9IFJlcGFja2FnZXIuZGlyRm9yUGF0aCggbmFtZSApOwotICAgICAgICAgICAgU3RyaW5nIHRvRGlyID0gKFN0cmluZykgX21vdmVkRGlycy5nZXQoIHNyY0RpciApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodG9EaXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0b05hbWUgPSBuZXcgRmlsZSggdG9EaXIsIG5ldyBGaWxlKCBuYW1lICkuZ2V0TmFtZSgpICkudG9TdHJpbmcoKTsgCi0KLSAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCAiLmh0bWwiICkpCi0gICAgICAgICAgICAgICAgcmVwYWNrYWdlTm9uSmF2YUZpbGUoIG5hbWUsIHRvTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNvcHlGaWxlKCBuZXcgRmlsZSggX3NvdXJjZUJhc2UsIG5hbWUgKSwgbmV3IEZpbGUoIF90YXJnZXRCYXNlLCB0b05hbWUgKSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVwYWNrYWdlTm9uSmF2YUZpbGUgKCBTdHJpbmcgbmFtZSApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gcmVhZEZpbGUoIG5ldyBGaWxlKCBfc291cmNlQmFzZSwgbmFtZSApICk7Ci0KLSAgICAgICAgX3JlcGFja2FnZXIucmVwYWNrYWdlKCBzYiApOwotICAgICAgICAKLSAgICAgICAgd3JpdGVGaWxlKCBuZXcgRmlsZSggX3RhcmdldEJhc2UsIG5hbWUgKSwgc2IgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVwYWNrYWdlTm9uSmF2YUZpbGUgKCBTdHJpbmcgc291cmNlTmFtZSwgU3RyaW5nIHRhcmdldE5hbWUgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IHJlYWRGaWxlKCBuZXcgRmlsZSggX3NvdXJjZUJhc2UsIHNvdXJjZU5hbWUgKSApOwotCi0gICAgICAgIF9yZXBhY2thZ2VyLnJlcGFja2FnZSggc2IgKTsKLSAgICAgICAgCi0gICAgICAgIHdyaXRlRmlsZSggbmV3IEZpbGUoIF90YXJnZXRCYXNlLCB0YXJnZXROYW1lICksIHNiICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlcGFja2FnZUphdmFGaWxlICggU3RyaW5nIG5hbWUgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IHJlYWRGaWxlKCBuZXcgRmlsZSggX3NvdXJjZUJhc2UsIG5hbWUgKSApOwotCi0gICAgICAgIE1hdGNoZXIgcGFja2FnZU1hdGNoZXIgPSBfcGFja2FnZVBhdHRlcm4ubWF0Y2hlciggc2IgKTsKLQotICAgICAgICBpZiAocGFja2FnZU1hdGNoZXIuZmluZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcGtnID0gcGFja2FnZU1hdGNoZXIuZ3JvdXAoIDEgKTsKLSAgICAgICAgICAgIGludCBwa2dTdGFydCA9IHBhY2thZ2VNYXRjaGVyLnN0YXJ0KCAxICk7Ci0gICAgICAgICAgICBpbnQgcGtnRW5kID0gcGFja2FnZU1hdGNoZXIuZW5kKCAxICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChwYWNrYWdlTWF0Y2hlci5maW5kKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJUd28gcGFja2FnZSBzcGVjaWZpY2F0aW9ucyBmb3VuZDogIiArIG5hbWUgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTGlzdCBmaWxlUGF0aCA9IFJlcGFja2FnZXIuc3BsaXRQYXRoKCBuYW1lLCBGaWxlLnNlcGFyYXRvckNoYXIgKTsKLSAgICAgICAgICAgIFN0cmluZyBzcmNEaXIgPSBSZXBhY2thZ2VyLmRpckZvclBhdGgoIG5hbWUgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gU29ydCB0aGUgcmVwYWNrYWdlIHNwZWMgc28gdGhhdCBsb25nZXIgZnJvbSdzIGFyZSBmaXJzdCB0byBtYXRjaAotICAgICAgICAgICAgLy8gbG9uZ2VzdCBwYWNrYWdlIGZpcnN0Ci0KLSAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzd2FwcGVkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDEgOyBpIDwgZmlsZVBhdGguc2l6ZSgpIDsgaSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzcGVjMSA9IChTdHJpbmcpIGZpbGVQYXRoLmdldCggaSAtIDEgKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNwZWMyID0gKFN0cmluZykgZmlsZVBhdGguZ2V0KCBpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWMxLmluZGV4T2YoICc6JyApIDwgc3BlYzIuaW5kZXhPZiggJzonICkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoLnNldCggaSAtIDEsIHNwZWMyICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aC5zZXQoIGksIHNwZWMxICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBwZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFzd2FwcGVkKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdCBwa2dQYXRoID0gUmVwYWNrYWdlci5zcGxpdFBhdGgoIHBrZywgJy4nICk7Ci0KLSAgICAgICAgICAgIGludCBmID0gZmlsZVBhdGguc2l6ZSgpIC0gMjsKLQotICAgICAgICAgICAgZm9yICggaW50IGkgPSBwa2dQYXRoLnNpemUoKSAtIDEgOyBpID49IDAgOyBpLS0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghcGtnUGF0aC5nZXQoIGkgKS5lcXVhbHMoIGZpbGVQYXRoLmdldCggZi0tICkgKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJQYWNrYWdlIHNwZWMgZGlmZmVycyBmcm9tIGZpbGUgcGF0aDogIiArIG5hbWUgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdCBjaGFuZ2VUbyA9IG51bGw7Ci0gICAgICAgICAgICBMaXN0IGNoYW5nZUZyb20gPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmcm9tOgotICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IF9mcm9tUGFja2FnZXMuc2l6ZSgpIDsgaSArKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTGlzdCBmcm9tID0gKExpc3QpIF9mcm9tUGFja2FnZXMuZ2V0KCBpICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZnJvbS5zaXplKCkgPD0gcGtnUGF0aC5zaXplKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaiA9IDAgOyBqIDwgZnJvbS5zaXplKCkgOyBqKysgKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmcm9tLmdldCggaiApLmVxdWFscyggcGtnUGF0aC5nZXQoIGogKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgZnJvbTsKLQotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VGcm9tID0gZnJvbTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlVG8gPSAoTGlzdCkgX3RvUGFja2FnZXMuZ2V0KCBpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2hhbmdlVG8gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UGtnID0gIiI7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld05hbWUgPSAiIjsKLQotICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBjaGFuZ2VUby5zaXplKCkgOyBpKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdQa2cgKz0gIi4iOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3TmFtZSArPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG5ld1BrZyArPSBjaGFuZ2VUby5nZXQoIGkgKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3TmFtZSArPSBjaGFuZ2VUby5nZXQoIGkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSBmaWxlUGF0aC5zaXplKCkgLSBwa2dQYXRoLnNpemUoKSAtIDIgOyBpID49IDAgOyBpLS0gKQotICAgICAgICAgICAgICAgICAgICBuZXdOYW1lID0gKFN0cmluZykgZmlsZVBhdGguZ2V0KCBpICkgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyBuZXdOYW1lOwotCi0gICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSBjaGFuZ2VGcm9tLnNpemUoKSA7IGkgPCBwa2dQYXRoLnNpemUoKSA7IGkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuZXdOYW1lICs9IEZpbGUuc2VwYXJhdG9yQ2hhciArIChTdHJpbmcpIHBrZ1BhdGguZ2V0KCBpICk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1BrZyArPSAnLicgKyAoU3RyaW5nKSBwa2dQYXRoLmdldCggaSApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG5ld05hbWUgKz0gRmlsZS5zZXBhcmF0b3JDaGFyICsgKFN0cmluZykgZmlsZVBhdGguZ2V0KCBmaWxlUGF0aC5zaXplKCkgLSAxICk7Ci0KLSAgICAgICAgICAgICAgICBzYi5yZXBsYWNlKCBwa2dTdGFydCwgcGtnRW5kLCBuZXdQa2cgKTsKLQotICAgICAgICAgICAgICAgIG5hbWUgPSBuZXdOYW1lOwotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdEaXIgPSBSZXBhY2thZ2VyLmRpckZvclBhdGgoIG5hbWUgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoIXNyY0Rpci5lcXVhbHMobmV3RGlyKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9tb3ZlZERpcnMucHV0KHNyY0RpciwgbmV3RGlyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBfcmVwYWNrYWdlci5yZXBhY2thZ2UoIHNiICk7Ci0gICAgICAgIAotICAgICAgICB3cml0ZUZpbGUoIG5ldyBGaWxlKCBfdGFyZ2V0QmFzZSwgbmFtZSApLCBzYiApOwotICAgIH0KLQotICAgIHZvaWQgd3JpdGVGaWxlICggRmlsZSBmLCBTdHJpbmdCdWZmZXIgY2hhcnMgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGYuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAKLSAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCBmICk7Ci0gICAgICAgIFdyaXRlciB3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlciggb3V0ICk7Ci0gICAgICAgIFJlYWRlciByID0gbmV3IFN0cmluZ1JlYWRlciggY2hhcnMudG9TdHJpbmcoKSApOwotCi0gICAgICAgIGNvcHkoIHIsIHcgKTsKLQotICAgICAgICByLmNsb3NlKCk7Ci0gICAgICAgIHcuY2xvc2UoKTsKLSAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgfQotICAgIAotICAgIFN0cmluZ0J1ZmZlciByZWFkRmlsZSAoIEZpbGUgZiApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBmICk7Ci0gICAgICAgIFJlYWRlciByID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKCBpbiApOwotICAgICAgICBTdHJpbmdXcml0ZXIgdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQotICAgICAgICBjb3B5KCByLCB3ICk7Ci0KLSAgICAgICAgdy5jbG9zZSgpOwotICAgICAgICByLmNsb3NlKCk7Ci0gICAgICAgIGluLmNsb3NlKCk7Ci0KLSAgICAgICAgcmV0dXJuIHcuZ2V0QnVmZmVyKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlICggRmlsZSBmcm9tLCBGaWxlIHRvICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0by5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgIAotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBmcm9tICk7Ci0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oIHRvICk7Ci0KLSAgICAgICAgY29weSggaW4sIG91dCApOwotICAgICAgICAKLSAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgIGluLmNsb3NlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNvcHkgKCBJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlIFsgMTAyNCAqIDE2IF07Ci0KLSAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG4gPSBpbi5yZWFkKCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGggKTsKLQotICAgICAgICAgICAgaWYgKG4gPCAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBvdXQud3JpdGUoIGJ1ZmZlciwgMCwgbiApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNvcHkgKCBSZWFkZXIgciwgV3JpdGVyIHcgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhciBbIDEwMjQgKiAxNiBdOwotCi0gICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBuID0gci5yZWFkKCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGggKTsKLQotICAgICAgICAgICAgaWYgKG4gPCAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICB3LndyaXRlKCBidWZmZXIsIDAsIG4gKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBmaWxsRmlsZXMgKCBBcnJheUxpc3QgZmlsZXMsIEZpbGUgZmlsZSApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKCFmaWxlLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVzLmFkZCggZmlsZSApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRXhjbHVkZSB0aGUgYnVpbGQgZGlyZWN0b3J5Ci0KLSAgICAgICAgaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFscyggImJ1aWxkIiApKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgLy8gRXhjbHVkZSBDVlMgZGlyZWN0b3JpZXMKLSAgICAgICAgaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFscyggIkNWUyIgKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBTdHJpbmdbXSBlbnRyaWVzID0gZmlsZS5saXN0KCk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IGVudHJpZXMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgICAgIGZpbGxGaWxlcyggZmlsZXMsIG5ldyBGaWxlKCBmaWxlLCBlbnRyaWVzWyBpIF0gKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlY3Vyc2l2ZURlbGV0ZSAoIEZpbGUgZmlsZSApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGVudHJpZXMgPSBmaWxlLmxpc3QoKTsKLQotICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IGVudHJpZXMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgICAgICAgICByZWN1cnNpdmVEZWxldGUoIG5ldyBGaWxlKCBmaWxlLCBlbnRyaWVzWyBpIF0gKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmlsZS5kZWxldGUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpbGUgX3NvdXJjZUJhc2U7Ci0gICAgcHJpdmF0ZSBGaWxlIF90YXJnZXRCYXNlOwotCi0gICAgcHJpdmF0ZSBMaXN0IF9mcm9tUGFja2FnZXM7Ci0gICAgcHJpdmF0ZSBMaXN0IF90b1BhY2thZ2VzOwotICAgIAotICAgIHByaXZhdGUgUGF0dGVybiBfcGFja2FnZVBhdHRlcm47Ci0KLSAgICBwcml2YXRlIFJlcGFja2FnZXIgX3JlcGFja2FnZXI7Ci0gICAgCi0gICAgcHJpdmF0ZSBNYXAgX21vdmVkRGlyczsKLSAgICBwcml2YXRlIExpc3QgX21vdmVBbG9uZ0ZpbGVzOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3JlcGFja2FnZS9yZXBhY2thZ2UvUmVwYWNrYWdlci5qYXZhIGIvdjEvc3JjL3JlcGFja2FnZS9yZXBhY2thZ2UvUmVwYWNrYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjY3Zjg2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy9yZXBhY2thZ2UvcmVwYWNrYWdlL1JlcGFja2FnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIHJlcGFja2FnZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgUmVwYWNrYWdlcgotewotICAgIHB1YmxpYyBSZXBhY2thZ2VyICggU3RyaW5nIHJlcGFja2FnZVNwZWNzICkKLSAgICB7Ci0gICAgICAgIF9mcm9tUGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIF90b1BhY2thZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgTGlzdCByZXBhY2thZ2VzID0gc3BsaXRQYXRoKCByZXBhY2thZ2VTcGVjcywgJzsnICk7Ci0KLSAgICAgICAgLy8gU29ydCB0aGUgcmVwYWNrYWdlIHNwZWMgc28gdGhhdCBsb25nZXIgZnJvbSdzIGFyZSBmaXJzdCB0byBtYXRjaAotICAgICAgICAvLyBsb25nZXN0IHBhY2thZ2UgZmlyc3QKLSAgICAgICAgCi0gICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gc3dhcHBlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDEgOyBpIDwgcmVwYWNrYWdlcy5zaXplKCkgOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBzcGVjMSA9IChTdHJpbmcpIHJlcGFja2FnZXMuZ2V0KCBpIC0gMSApOwotICAgICAgICAgICAgICAgIFN0cmluZyBzcGVjMiA9IChTdHJpbmcpIHJlcGFja2FnZXMuZ2V0KCBpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHNwZWMxLmluZGV4T2YoICc6JyApIDwgc3BlYzIuaW5kZXhPZiggJzonICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBhY2thZ2VzLnNldCggaSAtIDEsIHNwZWMyICk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGFja2FnZXMuc2V0KCBpLCBzcGVjMSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgc3dhcHBlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXN3YXBwZWQpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgcmVwYWNrYWdlcy5zaXplKCkgOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgc3BlYyA9IChTdHJpbmcpIHJlcGFja2FnZXMuZ2V0KCBpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBqID0gc3BlYy5pbmRleE9mKCAnOicgKTsKLQotICAgICAgICAgICAgaWYgKGogPCAwIHx8IHNwZWMuaW5kZXhPZiggJzonLCBqICsgMSApID49IDApCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJJbGxlZ2FsIHJlcGFja2FnZSBzcGVjaWZpY2F0aW9uOiAiICsgc3BlYyApOwotCi0gICAgICAgICAgICBTdHJpbmcgZnJvbSA9IHNwZWMuc3Vic3RyaW5nKCAwLCBqICk7Ci0gICAgICAgICAgICBTdHJpbmcgdG8gPSBzcGVjLnN1YnN0cmluZyggaiArIDEgKTsKLQotICAgICAgICAgICAgX2Zyb21QYWNrYWdlcy5hZGQoIFJlcGFja2FnZXIuc3BsaXRQYXRoKCBmcm9tLCAnLicgKSApOwotICAgICAgICAgICAgX3RvUGFja2FnZXMuYWRkKCBSZXBhY2thZ2VyLnNwbGl0UGF0aCggdG8sICcuJyApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBfZnJvbU1hdGNoZXJzID0gbmV3IE1hdGNoZXIgWyBfZnJvbVBhY2thZ2VzLnNpemUoKSAqIDIgXTsKLSAgICAgICAgX3RvUGFja2FnZU5hbWVzID0gbmV3IFN0cmluZyBbIF9mcm9tUGFja2FnZXMuc2l6ZSgpICogMiBdOwotCi0gICAgICAgIGFkZFBhdHRlcm5zKCAnLicsIDAgKTsKLSAgICAgICAgYWRkUGF0dGVybnMoICcvJywgX2Zyb21QYWNrYWdlcy5zaXplKCkgKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZFBhdHRlcm5zICggY2hhciBzZXAsIGludCBvZmYgKQotICAgIHsKLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IF9mcm9tUGFja2FnZXMuc2l6ZSgpIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdCBmcm9tID0gKExpc3QpIF9mcm9tUGFja2FnZXMuZ2V0KCBpICk7Ci0gICAgICAgICAgICBMaXN0IHRvID0gKExpc3QpIF90b1BhY2thZ2VzLmdldCggaSApOwotCi0gICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9ICIiOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKCBpbnQgaiA9IDAgOyBqIDwgZnJvbS5zaXplKCkgOyBqKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChqID4gMCkKLSAgICAgICAgICAgICAgICAgICAgcGF0dGVybiArPSAiXFwiICsgc2VwOwotCi0gICAgICAgICAgICAgICAgcGF0dGVybiArPSBmcm9tLmdldCggaiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgdG9QYWNrYWdlID0gIiI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoIGludCBqID0gMCA7IGogPCB0by5zaXplKCkgOyBqKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChqID4gMCkKLSAgICAgICAgICAgICAgICAgICAgdG9QYWNrYWdlICs9IHNlcDsKLQotICAgICAgICAgICAgICAgIHRvUGFja2FnZSArPSB0by5nZXQoIGogKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgX2Zyb21NYXRjaGVyc1sgb2ZmICsgaSBdID0gUGF0dGVybi5jb21waWxlKCBwYXR0ZXJuICkubWF0Y2hlciggbnVsbCApOwotICAgICAgICAgICAgX3RvUGFja2FnZU5hbWVzWyBvZmYgKyBpIF0gPSB0b1BhY2thZ2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXBhY2thZ2UgKCBTdHJpbmdCdWZmZXIgc2IgKQotICAgIHsKLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IF9mcm9tTWF0Y2hlcnMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gKE1hdGNoZXIpIF9mcm9tTWF0Y2hlcnNbIGkgXTsKLQotICAgICAgICAgICAgbWF0Y2hlci5yZXNldCggc2IgKTsKLQotICAgICAgICAgICAgd2hpbGUgKCBtYXRjaGVyLmZpbmQoKSApCi0gICAgICAgICAgICAgICAgc2IucmVwbGFjZSggbWF0Y2hlci5zdGFydCgpLCBtYXRjaGVyLmVuZCgpLCBfdG9QYWNrYWdlTmFtZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0RnJvbVBhY2thZ2VzICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9mcm9tUGFja2FnZXM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0VG9QYWNrYWdlcyAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdG9QYWNrYWdlczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBBcnJheUxpc3Qgc3BsaXRQYXRoICggU3RyaW5nIHBhdGgsIGNoYXIgc2VwYXJhdG9yICkKLSAgICB7Ci0gICAgICAgIEFycmF5TGlzdCBjb21wb25lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGkgPSBwYXRoLmluZGV4T2YoIHNlcGFyYXRvciApOwotCi0gICAgICAgICAgICBpZiAoaSA8IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKCBwYXRoLnN1YnN0cmluZyggMCwgaSApICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyggaSArIDEgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXRoLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKCBwYXRoICk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpckZvclBhdGggKCBTdHJpbmcgcGF0aCApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEZpbGUocGF0aCkuZ2V0UGFyZW50KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0IF9mcm9tUGFja2FnZXM7Ci0gICAgcHJpdmF0ZSBMaXN0IF90b1BhY2thZ2VzOwotICAgIAotICAgIHByaXZhdGUgTWF0Y2hlcltdIF9mcm9tTWF0Y2hlcnM7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSAgX3RvUGFja2FnZU5hbWVzOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy90b29sc2NoZW1hL2x0Z2ZtdC54c2QgYi92MS9zcmMvdG9vbHNjaGVtYS9sdGdmbXQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzRlZmVhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90b29sc2NoZW1hL2x0Z2ZtdC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczp0bnM9Imh0dHA6Ly93d3cuYmVhLmNvbS8yMDAzLzA1L3htbGJlYW4vbHRnZm10IgotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmJlYS5jb20vMjAwMy8wNS94bWxiZWFuL2x0Z2ZtdCIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ0ZXN0cyI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ0ZXN0IiB0eXBlPSJ0bnM6dGVzdC1jYXNlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+IAotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRlc3QtY2FzZSI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJmaWxlcyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJmaWxlIiB0eXBlPSJ0bnM6ZmlsZS1kZXNjIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iNCIvPgotICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ib3JpZ2luIiB0eXBlPSJ4czp0b2tlbiIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibW9kaWZpZWQiIHR5cGU9InhzOmJvb2xlYW4iLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJmaWxlLWRlc2MiPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHNEaXIiIHR5cGU9InhzOnRva2VuIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmb2xkZXIiIHR5cGU9InhzOnRva2VuIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaWxlTmFtZSIgdHlwZT0ieHM6dG9rZW4iLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJvbGUiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzY2hlbWEiLz4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imluc3RhbmNlIi8+Ci0gICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZXNvdXJjZSIvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6YXR0cmlidXRlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsaWRpdHkiIHR5cGU9InhzOmJvb2xlYW4iLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS9zcmMvdG9vbHNjaGVtYS9zdWJzdHdzZGwueHNkIGIvdjEvc3JjL3Rvb2xzY2hlbWEvc3Vic3R3c2RsLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JjY2YzYy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdG9vbHNjaGVtYS9zdWJzdHdzZGwueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCEtLQotICAgVGhpcyBzY2hlbWEgc3RhbmRzIGluIGZvciBhIHNjaGVtYSBmb3IgV1NETC4KLQotICAgSXQgaGFzIG5vbmUgb2YgdGhlIHJlYWwgc3RydWN0dXJlIG9mIGEgV1NETCBleGNlcHQgImltcG9ydHMiIGFuZAotICAgdGhlIDJuZC1sZXZlbCB0YWcgbmFtZXMuCi0KLSAgIFdoZW4gY29tcGlsaW5nIHNjaGVtYXMgd2l0aGluIC53c2RsIGZpbGVzLCB3ZSB1c2UgdGhpcyBzY2hlbWEgdG8gbG9hZAotICAgdGhlIFdTREwgZmlsZXMuICBPZiBjb3Vyc2UsIFdTREwgZmlsZXMgYXJlIGFjdHVhbGx5IGluIHRoZQotICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8gbmFtZXNwYWNlLCBidXQgd2UgdXNlIHRoZQotICAgTG9hZFN1YnN0aXR1dGVOYW1lc3BhY2VzIG9wdGlvbiBpbiBvcmRlciB0byBpbnRlcm5hbGx5IHN1YnN0aXR1dGUKLSAgIHRoZSBuYW1lc3BhY2UgYmVsb3cuCi0tLT4KLQotCi08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczp0bnM9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbnRlcm5hbC94bWxiZWFucy93c2Rsc3Vic3QiCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbnRlcm5hbC94bWxiZWFucy93c2Rsc3Vic3QiCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGVmaW5pdGlvbnMiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9ImltcG9ydCIgdHlwZT0idG5zOlRJbXBvcnQiLz4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idHlwZXMiLz4gICAgICAgICAgICAgICAJCQkKLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIvPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJiaW5kaW5nIi8+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9InBvcnRUeXBlIi8+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9InNlcnZpY2UiLz4KLSAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiLz4KLSAgICAgIDwveHM6Y2hvaWNlPgotICAgICAgPHhzOmFueUF0dHJpYnV0ZS8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJUSW1wb3J0Ij4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiLz4JCQotICA8L3hzOmNvbXBsZXhUeXBlPgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3NyYy90b29sc2NoZW1hL3hzZG93bmxvYWQueHNkIGIvdjEvc3JjL3Rvb2xzY2hlbWEveHNkb3dubG9hZC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNjlkMzYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3Rvb2xzY2hlbWEveHNkb3dubG9hZC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczppPSJodHRwOi8vd3d3LmJlYS5jb20vMjAwMy8wMS94bWxiZWFuL3hzZG93bmxvYWQiCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuYmVhLmNvbS8yMDAzLzAxL3htbGJlYW4veHNkb3dubG9hZCIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJkb3dubG9hZGVkLXNjaGVtYXMiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9ImVudHJ5IiB0eXBlPSJpOmRvd25sb2FkZWQtc2NoZW1hLWVudHJ5Ii8+Ci0gICAgICA8L3hzOmNob2ljZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHREaXJlY3RvcnkiIHR5cGU9InhzOnRva2VuIi8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJkb3dubG9hZGVkLXNjaGVtYS1lbnRyeSI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZmlsZW5hbWUiIHR5cGU9InhzOnRva2VuIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaGExIiB0eXBlPSJ4czp0b2tlbiIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2NoZW1hTG9jYXRpb24iIHR5cGU9InhzOmFueVVSSSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czphbnlVUkkiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLTwveHM6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L0JNUGF0dGVybi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9CTVBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI3YzU1ZC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L0JNUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OwotCi1pbXBvcnQgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yOwotCi0vKioKLSAqIEJveWVyLU1vb3JlIHNlYXJjaGVyLgotICovCi1wdWJsaWMgY2xhc3MgQk1QYXR0ZXJuIHsKLSAgICBjaGFyW10gcGF0dGVybjsKLSAgICBpbnRbXSBzaGlmdFRhYmxlOwotICAgIGJvb2xlYW4gaWdub3JlQ2FzZTsKLQotICAgIHB1YmxpYyBCTVBhdHRlcm4oU3RyaW5nIHBhdCwgYm9vbGVhbiBpZ25vcmVDYXNlKSB7Ci0gICAgICAgIHRoaXMocGF0LCAyNTYsIGlnbm9yZUNhc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBCTVBhdHRlcm4oU3RyaW5nIHBhdCwgaW50IHRhYmxlU2l6ZSwgYm9vbGVhbiBpZ25vcmVDYXNlKSB7Ci0gICAgICAgIHRoaXMucGF0dGVybiA9IHBhdC50b0NoYXJBcnJheSgpOwotICAgICAgICB0aGlzLnNoaWZ0VGFibGUgPSBuZXcgaW50W3RhYmxlU2l6ZV07Ci0gICAgICAgIHRoaXMuaWdub3JlQ2FzZSA9IGlnbm9yZUNhc2U7Ci0KLSAgICAgICAgaW50IGxlbmd0aCA9IHBhdHRlcm4ubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLnNoaWZ0VGFibGUubGVuZ3RoOyAgaSArKykKLSAgICAgICAgICAgIHRoaXMuc2hpZnRUYWJsZVtpXSA9IGxlbmd0aDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBsZW5ndGg7ICBpICsrKSB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gdGhpcy5wYXR0ZXJuW2ldOwotICAgICAgICAgICAgaW50IGRpZmYgPSBsZW5ndGgtaS0xOwotICAgICAgICAgICAgaW50IGluZGV4ID0gY2ggJSB0aGlzLnNoaWZ0VGFibGUubGVuZ3RoOwotICAgICAgICAgICAgaWYgKGRpZmYgPCB0aGlzLnNoaWZ0VGFibGVbaW5kZXhdKQotICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRUYWJsZVtpbmRleF0gPSBkaWZmOwotICAgICAgICAgICAgaWYgKHRoaXMuaWdub3JlQ2FzZSkgewotICAgICAgICAgICAgICAgIGNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKTsKLSAgICAgICAgICAgICAgICBpbmRleCA9IGNoICUgdGhpcy5zaGlmdFRhYmxlLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBpZiAoZGlmZiA8IHRoaXMuc2hpZnRUYWJsZVtpbmRleF0pCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRUYWJsZVtpbmRleF0gPSBkaWZmOwotICAgICAgICAgICAgICAgIGNoID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoKTsKLSAgICAgICAgICAgICAgICBpbmRleCA9IGNoICUgdGhpcy5zaGlmdFRhYmxlLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBpZiAoZGlmZiA8IHRoaXMuc2hpZnRUYWJsZVtpbmRleF0pCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRUYWJsZVtpbmRleF0gPSBkaWZmOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIC0xIGlmIDx2YXI+aXRlcmF0b3I8L3Zhcj4gZG9lcyBub3QgY29udGFpbiB0aGlzIHBhdHRlcm4uCi0gICAgICovCi0gICAgcHVibGljIGludCBtYXRjaGVzKENoYXJhY3Rlckl0ZXJhdG9yIGl0ZXJhdG9yLCBpbnQgc3RhcnQsIGludCBsaW1pdCkgewotICAgICAgICBpZiAodGhpcy5pZ25vcmVDYXNlKSAgcmV0dXJuIHRoaXMubWF0Y2hlc0lnbm9yZUNhc2UoaXRlcmF0b3IsIHN0YXJ0LCBsaW1pdCk7Ci0gICAgICAgIGludCBwbGVuZ3RoID0gdGhpcy5wYXR0ZXJuLmxlbmd0aDsKLSAgICAgICAgaWYgKHBsZW5ndGggPT0gMCkgIHJldHVybiBzdGFydDsKLSAgICAgICAgaW50IGluZGV4ID0gc3RhcnQrcGxlbmd0aDsKLSAgICAgICAgd2hpbGUgKGluZGV4IDw9IGxpbWl0KSB7Ci0gICAgICAgICAgICBpbnQgcGluZGV4ID0gcGxlbmd0aDsKLSAgICAgICAgICAgIGludCBuaW5kZXggPSBpbmRleCsxOwotICAgICAgICAgICAgY2hhciBjaDsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpZiAoKGNoID0gaXRlcmF0b3Iuc2V0SW5kZXgoLS1pbmRleCkpICE9IHRoaXMucGF0dGVyblstLXBpbmRleF0pCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGlmIChwaW5kZXggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICAgICAgfSB3aGlsZSAocGluZGV4ID4gMCk7Ci0gICAgICAgICAgICBpbmRleCArPSB0aGlzLnNoaWZ0VGFibGVbY2ggJSB0aGlzLnNoaWZ0VGFibGUubGVuZ3RoXSsxOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgbmluZGV4KSAgaW5kZXggPSBuaW5kZXg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHJldHVybiAtMSBpZiA8dmFyPnN0cjwvdmFyPiBkb2VzIG5vdCBjb250YWluIHRoaXMgcGF0dGVybi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG1hdGNoZXMoU3RyaW5nIHN0ciwgaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKLSAgICAgICAgaWYgKHRoaXMuaWdub3JlQ2FzZSkgIHJldHVybiB0aGlzLm1hdGNoZXNJZ25vcmVDYXNlKHN0ciwgc3RhcnQsIGxpbWl0KTsKLSAgICAgICAgaW50IHBsZW5ndGggPSB0aGlzLnBhdHRlcm4ubGVuZ3RoOwotICAgICAgICBpZiAocGxlbmd0aCA9PSAwKSAgcmV0dXJuIHN0YXJ0OwotICAgICAgICBpbnQgaW5kZXggPSBzdGFydCtwbGVuZ3RoOwotICAgICAgICB3aGlsZSAoaW5kZXggPD0gbGltaXQpIHsKLSAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJTdGFydHMgYXQgIitpbmRleCk7Ci0gICAgICAgICAgICBpbnQgcGluZGV4ID0gcGxlbmd0aDsKLSAgICAgICAgICAgIGludCBuaW5kZXggPSBpbmRleCsxOwotICAgICAgICAgICAgY2hhciBjaDsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpZiAoKGNoID0gc3RyLmNoYXJBdCgtLWluZGV4KSkgIT0gdGhpcy5wYXR0ZXJuWy0tcGluZGV4XSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaWYgKHBpbmRleCA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICAgICAgICB9IHdoaWxlIChwaW5kZXggPiAwKTsKLSAgICAgICAgICAgIGluZGV4ICs9IHRoaXMuc2hpZnRUYWJsZVtjaCAlIHRoaXMuc2hpZnRUYWJsZS5sZW5ndGhdKzE7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCBuaW5kZXgpICBpbmRleCA9IG5pbmRleDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIC8qKgotICAgICAqCi0gICAgICogQHJldHVybiAtMSBpZiA8dmFyPmNoYXJzPC9jaGFyPiBkb2VzIG5vdCBjb250YWluIHRoaXMgcGF0dGVybi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG1hdGNoZXMoY2hhcltdIGNoYXJzLCBpbnQgc3RhcnQsIGludCBsaW1pdCkgewotICAgICAgICBpZiAodGhpcy5pZ25vcmVDYXNlKSAgcmV0dXJuIHRoaXMubWF0Y2hlc0lnbm9yZUNhc2UoY2hhcnMsIHN0YXJ0LCBsaW1pdCk7Ci0gICAgICAgIGludCBwbGVuZ3RoID0gdGhpcy5wYXR0ZXJuLmxlbmd0aDsKLSAgICAgICAgaWYgKHBsZW5ndGggPT0gMCkgIHJldHVybiBzdGFydDsKLSAgICAgICAgaW50IGluZGV4ID0gc3RhcnQrcGxlbmd0aDsKLSAgICAgICAgd2hpbGUgKGluZGV4IDw9IGxpbWl0KSB7Ci0gICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiU3RhcnRzIGF0ICIraW5kZXgpOwotICAgICAgICAgICAgaW50IHBpbmRleCA9IHBsZW5ndGg7Ci0gICAgICAgICAgICBpbnQgbmluZGV4ID0gaW5kZXgrMTsKLSAgICAgICAgICAgIGNoYXIgY2g7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaWYgKChjaCA9IGNoYXJzWy0taW5kZXhdKSAhPSB0aGlzLnBhdHRlcm5bLS1waW5kZXhdKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBpZiAocGluZGV4ID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgICAgIH0gd2hpbGUgKHBpbmRleCA+IDApOwotICAgICAgICAgICAgaW5kZXggKz0gdGhpcy5zaGlmdFRhYmxlW2NoICUgdGhpcy5zaGlmdFRhYmxlLmxlbmd0aF0rMTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IG5pbmRleCkgIGluZGV4ID0gbmluZGV4OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpbnQgbWF0Y2hlc0lnbm9yZUNhc2UoQ2hhcmFjdGVySXRlcmF0b3IgaXRlcmF0b3IsIGludCBzdGFydCwgaW50IGxpbWl0KSB7Ci0gICAgICAgIGludCBwbGVuZ3RoID0gdGhpcy5wYXR0ZXJuLmxlbmd0aDsKLSAgICAgICAgaWYgKHBsZW5ndGggPT0gMCkgIHJldHVybiBzdGFydDsKLSAgICAgICAgaW50IGluZGV4ID0gc3RhcnQrcGxlbmd0aDsKLSAgICAgICAgd2hpbGUgKGluZGV4IDw9IGxpbWl0KSB7Ci0gICAgICAgICAgICBpbnQgcGluZGV4ID0gcGxlbmd0aDsKLSAgICAgICAgICAgIGludCBuaW5kZXggPSBpbmRleCsxOwotICAgICAgICAgICAgY2hhciBjaDsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBjaGFyIGNoMSA9IGNoID0gaXRlcmF0b3Iuc2V0SW5kZXgoLS1pbmRleCk7Ci0gICAgICAgICAgICAgICAgY2hhciBjaDIgPSB0aGlzLnBhdHRlcm5bLS1waW5kZXhdOwotICAgICAgICAgICAgICAgIGlmIChjaDEgIT0gY2gyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoMSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDEpOwotICAgICAgICAgICAgICAgICAgICBjaDIgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoMSAhPSBjaDIgJiYgQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoMSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoMikpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBpbmRleCA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICAgICAgICB9IHdoaWxlIChwaW5kZXggPiAwKTsKLSAgICAgICAgICAgIGluZGV4ICs9IHRoaXMuc2hpZnRUYWJsZVtjaCAlIHRoaXMuc2hpZnRUYWJsZS5sZW5ndGhdKzE7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCBuaW5kZXgpICBpbmRleCA9IG5pbmRleDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIGludCBtYXRjaGVzSWdub3JlQ2FzZShTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKLSAgICAgICAgaW50IHBsZW5ndGggPSB0aGlzLnBhdHRlcm4ubGVuZ3RoOwotICAgICAgICBpZiAocGxlbmd0aCA9PSAwKSAgcmV0dXJuIHN0YXJ0OwotICAgICAgICBpbnQgaW5kZXggPSBzdGFydCtwbGVuZ3RoOwotICAgICAgICB3aGlsZSAoaW5kZXggPD0gbGltaXQpIHsKLSAgICAgICAgICAgIGludCBwaW5kZXggPSBwbGVuZ3RoOwotICAgICAgICAgICAgaW50IG5pbmRleCA9IGluZGV4KzE7Ci0gICAgICAgICAgICBjaGFyIGNoOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGNoYXIgY2gxID0gY2ggPSB0ZXh0LmNoYXJBdCgtLWluZGV4KTsKLSAgICAgICAgICAgICAgICBjaGFyIGNoMiA9IHRoaXMucGF0dGVyblstLXBpbmRleF07Ci0gICAgICAgICAgICAgICAgaWYgKGNoMSAhPSBjaDIpIHsKLSAgICAgICAgICAgICAgICAgICAgY2gxID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoMSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoMiA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2gxICE9IGNoMiAmJiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2gxKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2gyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocGluZGV4ID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgICAgIH0gd2hpbGUgKHBpbmRleCA+IDApOwotICAgICAgICAgICAgaW5kZXggKz0gdGhpcy5zaGlmdFRhYmxlW2NoICUgdGhpcy5zaGlmdFRhYmxlLmxlbmd0aF0rMTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IG5pbmRleCkgIGluZGV4ID0gbmluZGV4OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaW50IG1hdGNoZXNJZ25vcmVDYXNlKGNoYXJbXSBjaGFycywgaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKLSAgICAgICAgaW50IHBsZW5ndGggPSB0aGlzLnBhdHRlcm4ubGVuZ3RoOwotICAgICAgICBpZiAocGxlbmd0aCA9PSAwKSAgcmV0dXJuIHN0YXJ0OwotICAgICAgICBpbnQgaW5kZXggPSBzdGFydCtwbGVuZ3RoOwotICAgICAgICB3aGlsZSAoaW5kZXggPD0gbGltaXQpIHsKLSAgICAgICAgICAgIGludCBwaW5kZXggPSBwbGVuZ3RoOwotICAgICAgICAgICAgaW50IG5pbmRleCA9IGluZGV4KzE7Ci0gICAgICAgICAgICBjaGFyIGNoOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGNoYXIgY2gxID0gY2ggPSBjaGFyc1stLWluZGV4XTsKLSAgICAgICAgICAgICAgICBjaGFyIGNoMiA9IHRoaXMucGF0dGVyblstLXBpbmRleF07Ci0gICAgICAgICAgICAgICAgaWYgKGNoMSAhPSBjaDIpIHsKLSAgICAgICAgICAgICAgICAgICAgY2gxID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoMSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoMiA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2gxICE9IGNoMiAmJiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2gxKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2gyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocGluZGV4ID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgICAgIH0gd2hpbGUgKHBpbmRleCA+IDApOwotICAgICAgICAgICAgaW5kZXggKz0gdGhpcy5zaGlmdFRhYmxlW2NoICUgdGhpcy5zaGlmdFRhYmxlLmxlbmd0aF0rMTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IG5pbmRleCkgIGluZGV4ID0gbmluZGV4OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKgotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludFtdIHNoaWZ0VGFibGUgPSBuZXcgaW50WzI1Nl07Ci0gICAgICAgICAgICBpbml0aWFsaXplQm95ZXJNb29yZShhcmd2WzBdLCBzaGlmdFRhYmxlLCB0cnVlKTsKLSAgICAgICAgICAgIGludCBvID0gLTE7Ci0gICAgICAgICAgICBDaGFyYWN0ZXJJdGVyYXRvciBpdGUgPSBuZXcgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yKGFyZ3ZbMV0pOwotICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgLy9mb3IgKGludCBpID0gMDsgIGkgPCAxMDAwMDsgIGkgKyspCi0gICAgICAgICAgICAgICAgbyA9IHNlYXJjaElnbm9yZUNhc2VzV2l0aEJveWVyTW9vcmUoaXRlLCAwLCBhcmd2WzBdLCBzaGlmdFRhYmxlKTsKLSAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktc3RhcnQ7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3VsdDogIitvKyIsIEVsYXBzZWQ6ICIrc3RhcnQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfSovCi19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvTWF0Y2guamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvTWF0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjZjdiYi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L01hdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXg7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3I7Ci0KLS8qKgotICogCi0gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGhhcyByYW5nZXMgY2FwdHVyZWQgaW4gbWF0Y2hpbmcuCi0gKgotICogQHNlZSBSZWd1bGFyRXhwcmVzc2lvbiNtYXRjaGVzKGNoYXJbXSwgaW50LCBpbnQsIE1hdGNoKQotICogQHNlZSBSZWd1bGFyRXhwcmVzc2lvbiNtYXRjaGVzKGNoYXJbXSwgTWF0Y2gpCi0gKiBAc2VlIFJlZ3VsYXJFeHByZXNzaW9uI21hdGNoZXMoamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yLCBNYXRjaCkKLSAqIEBzZWUgUmVndWxhckV4cHJlc3Npb24jbWF0Y2hlcyhqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCwgTWF0Y2gpCi0gKiBAc2VlIFJlZ3VsYXJFeHByZXNzaW9uI21hdGNoZXMoamF2YS5sYW5nLlN0cmluZywgTWF0Y2gpCi0gKiBAYXV0aG9yIFRBTVVSQSBLZW50ICZsdDtrZW50QHRybC5pYm0uY28uanAmZ3Q7Ci0gKi8KLXB1YmxpYyBjbGFzcyBNYXRjaCBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0gICAgaW50W10gYmVnaW5wb3MgPSBudWxsOwotICAgIGludFtdIGVuZHBvcyA9IG51bGw7Ci0gICAgaW50IG5vZmdyb3VwcyA9IDA7Ci0KLSAgICBDaGFyYWN0ZXJJdGVyYXRvciBjaVNvdXJjZSA9IG51bGw7Ci0gICAgU3RyaW5nIHN0clNvdXJjZSA9IG51bGw7Ci0gICAgY2hhcltdIGNoYXJTb3VyY2UgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWF0Y2goKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBjbG9uZSgpIHsKLSAgICAgICAgTWF0Y2ggbWEgPSBuZXcgTWF0Y2goKTsKLSAgICAgICAgaWYgKHRoaXMubm9mZ3JvdXBzID4gMCkgewotICAgICAgICAgICAgbWEuc2V0TnVtYmVyT2ZHcm91cHModGhpcy5ub2Zncm91cHMpOwotICAgICAgICAgICAgaWYgKHRoaXMuY2lTb3VyY2UgIT0gbnVsbCkgIG1hLnNldFNvdXJjZSh0aGlzLmNpU291cmNlKTsKLSAgICAgICAgICAgIGlmICh0aGlzLnN0clNvdXJjZSAhPSBudWxsKSAgbWEuc2V0U291cmNlKHRoaXMuc3RyU291cmNlKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRoaXMubm9mZ3JvdXBzOyAgaSArKykgewotICAgICAgICAgICAgICAgIG1hLnNldEJlZ2lubmluZyhpLCB0aGlzLmdldEJlZ2lubmluZyhpKSk7Ci0gICAgICAgICAgICAgICAgbWEuc2V0RW5kKGksIHRoaXMuZ2V0RW5kKGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXROdW1iZXJPZkdyb3VwcyhpbnQgbikgewotICAgICAgICBpbnQgb2xkbiA9IHRoaXMubm9mZ3JvdXBzOwotICAgICAgICB0aGlzLm5vZmdyb3VwcyA9IG47Ci0gICAgICAgIGlmIChvbGRuIDw9IDAKLSAgICAgICAgICAgIHx8IG9sZG4gPCBuIHx8IG4qMiA8IG9sZG4pIHsKLSAgICAgICAgICAgIHRoaXMuYmVnaW5wb3MgPSBuZXcgaW50W25dOwotICAgICAgICAgICAgdGhpcy5lbmRwb3MgPSBuZXcgaW50W25dOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IG47ICBpICsrKSB7Ci0gICAgICAgICAgICB0aGlzLmJlZ2lucG9zW2ldID0gLTE7Ci0gICAgICAgICAgICB0aGlzLmVuZHBvc1tpXSA9IC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTb3VyY2UoQ2hhcmFjdGVySXRlcmF0b3IgY2kpIHsKLSAgICAgICAgdGhpcy5jaVNvdXJjZSA9IGNpOwotICAgICAgICB0aGlzLnN0clNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRoaXMuY2hhclNvdXJjZSA9IG51bGw7Ci0gICAgfQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlKFN0cmluZyBzdHIpIHsKLSAgICAgICAgdGhpcy5jaVNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRoaXMuc3RyU291cmNlID0gc3RyOwotICAgICAgICB0aGlzLmNoYXJTb3VyY2UgPSBudWxsOwotICAgIH0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFNvdXJjZShjaGFyW10gY2hhcnMpIHsKLSAgICAgICAgdGhpcy5jaVNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRoaXMuc3RyU291cmNlID0gbnVsbDsKLSAgICAgICAgdGhpcy5jaGFyU291cmNlID0gY2hhcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRCZWdpbm5pbmcoaW50IGluZGV4LCBpbnQgdikgewotICAgICAgICB0aGlzLmJlZ2lucG9zW2luZGV4XSA9IHY7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFbmQoaW50IGluZGV4LCBpbnQgdikgewotICAgICAgICB0aGlzLmVuZHBvc1tpbmRleF0gPSB2OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBncm91cHMuCi0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyAxIHdoZW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBoYXMgbm8gY2FwdHVyaW5nLXBhcmVudGhlc2lzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZHcm91cHMoKSB7Ci0gICAgICAgIGlmICh0aGlzLm5vZmdyb3VwcyA8PSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQSByZXN1bHQgaXMgbm90IHNldC4iKTsKLSAgICAgICAgcmV0dXJuIHRoaXMubm9mZ3JvdXBzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIHN0YXJ0IHBvc2l0aW9uIGluIHRoZSB0YXJnZXQgdGV4dCBtYXRjaGVkIHRvIHNwZWNpZmllZCByZWd1bGFyIGV4cHJlc3Npb24gZ3JvdXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggTGVzcyB0aGFuIDxjb2RlPmdldE51bWJlck9mR3JvdXBzKCk8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0QmVnaW5uaW5nKGludCBpbmRleCkgewotICAgICAgICBpZiAodGhpcy5iZWdpbnBvcyA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQSByZXN1bHQgaXMgbm90IHNldC4iKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCB8fCB0aGlzLm5vZmdyb3VwcyA8PSBpbmRleCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBwYXJhbWV0ZXIgbXVzdCBiZSBsZXNzIHRoYW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArdGhpcy5ub2Zncm91cHMrIjogIitpbmRleCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmJlZ2lucG9zW2luZGV4XTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYW4gZW5kIHBvc2l0aW9uIGluIHRoZSB0YXJnZXQgdGV4dCBtYXRjaGVkIHRvIHNwZWNpZmllZCByZWd1bGFyIGV4cHJlc3Npb24gZ3JvdXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggTGVzcyB0aGFuIDxjb2RlPmdldE51bWJlck9mR3JvdXBzKCk8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RW5kKGludCBpbmRleCkgewotICAgICAgICBpZiAodGhpcy5lbmRwb3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkEgcmVzdWx0IGlzIG5vdCBzZXQuIik7Ci0gICAgICAgIGlmIChpbmRleCA8IDAgfHwgdGhpcy5ub2Zncm91cHMgPD0gaW5kZXgpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcGFyYW1ldGVyIG11c3QgYmUgbGVzcyB0aGFuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK3RoaXMubm9mZ3JvdXBzKyI6ICIraW5kZXgpOwotICAgICAgICByZXR1cm4gdGhpcy5lbmRwb3NbaW5kZXhdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhbiBzdWJzdHJpbmcgb2YgdGhlIHRhcmdldCB0ZXh0IG1hdGNoZWQgdG8gc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBncm91cC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBMZXNzIHRoYW4gPGNvZGU+Z2V0TnVtYmVyT2ZHcm91cHMoKTwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDYXB0dXJlZFRleHQoaW50IGluZGV4KSB7Ci0gICAgICAgIGlmICh0aGlzLmJlZ2lucG9zID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtYXRjaCgpIGhhcyBuZXZlciBiZWVuIGNhbGxlZC4iKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCB8fCB0aGlzLm5vZmdyb3VwcyA8PSBpbmRleCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBwYXJhbWV0ZXIgbXVzdCBiZSBsZXNzIHRoYW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArdGhpcy5ub2Zncm91cHMrIjogIitpbmRleCk7Ci0gICAgICAgIFN0cmluZyByZXQ7Ci0gICAgICAgIGludCBiZWdpbiA9IHRoaXMuYmVnaW5wb3NbaW5kZXhdLCBlbmQgPSB0aGlzLmVuZHBvc1tpbmRleF07Ci0gICAgICAgIGlmIChiZWdpbiA8IDAgfHwgZW5kIDwgMCkgIHJldHVybiBudWxsOwotICAgICAgICBpZiAodGhpcy5jaVNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXQgPSBSRVV0aWwuc3Vic3RyaW5nKHRoaXMuY2lTb3VyY2UsIGJlZ2luLCBlbmQpOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RyU291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldCA9IHRoaXMuc3RyU291cmNlLnN1YnN0cmluZyhiZWdpbiwgZW5kKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IG5ldyBTdHJpbmcodGhpcy5jaGFyU291cmNlLCBiZWdpbiwgZW5kLWJlZ2luKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvT3AuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvT3AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI4MjAzMi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L09wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqLwotY2xhc3MgT3AgewotICAgIHN0YXRpYyBmaW5hbCBpbnQgRE9UID0gMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IENIQVIgPSAxOyAgICAgICAgICAgICAgICAgIC8vIFNpbmdsZSBjaGFyYWN0ZXIKLSAgICBzdGF0aWMgZmluYWwgaW50IFJBTkdFID0gMzsgICAgICAgICAgICAgICAgIC8vIFthLXpBLVpdCi0gICAgc3RhdGljIGZpbmFsIGludCBOUkFOR0UgPSA0OyAgICAgICAgICAgICAgICAvLyBbXmEtekEtWl0KLSAgICBzdGF0aWMgZmluYWwgaW50IEFOQ0hPUiA9IDU7ICAgICAgICAgICAgICAgIC8vIF4gJCAuLi4KLSAgICBzdGF0aWMgZmluYWwgaW50IFNUUklORyA9IDY7ICAgICAgICAgICAgICAgIC8vIGxpdGVyYWwgU3RyaW5nIAotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0xPU1VSRSA9IDc7ICAgICAgICAgICAgICAgLy8gWCoKLSAgICBzdGF0aWMgZmluYWwgaW50IE5PTkdSRUVEWUNMT1NVUkUgPSA4OyAgICAgIC8vIFgqPwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUVVFU1RJT04gPSA5OyAgICAgICAgICAgICAgLy8gWD8KLSAgICBzdGF0aWMgZmluYWwgaW50IE5PTkdSRUVEWVFVRVNUSU9OID0gMTA7ICAgIC8vIFg/PwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVU5JT04gPSAxMTsgICAgICAgICAgICAgICAgLy8gWHxZCi0gICAgc3RhdGljIGZpbmFsIGludCBDQVBUVVJFID0gMTU7ICAgICAgICAgICAgICAvLyAoIGFuZCApCi0gICAgc3RhdGljIGZpbmFsIGludCBCQUNLUkVGRVJFTkNFID0gMTY7ICAgICAgICAvLyBcMSBcMiAuLi4KLSAgICBzdGF0aWMgZmluYWwgaW50IExPT0tBSEVBRCA9IDIwOyAgICAgICAgICAgIC8vICg/PS4uLikKLSAgICBzdGF0aWMgZmluYWwgaW50IE5FR0FUSVZFTE9PS0FIRUFEID0gMjE7ICAgIC8vICg/IS4uLikKLSAgICBzdGF0aWMgZmluYWwgaW50IExPT0tCRUhJTkQgPSAyMjsgICAgICAgICAgIC8vICg/PD0uLi4pCi0gICAgc3RhdGljIGZpbmFsIGludCBORUdBVElWRUxPT0tCRUhJTkQgPSAyMzsgICAvLyAoPzwhLi4uKQotICAgIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVBFTkRFTlQgPSAyNDsgICAgICAgICAgLy8gKD8+Li4uKQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTU9ESUZJRVIgPSAyNTsgICAgICAgICAgICAgLy8gKD9pbXMtaW1zOi4uLikKLSAgICBzdGF0aWMgZmluYWwgaW50IENPTkRJVElPTiA9IDI2OyAgICAgICAgICAgIC8vICg/KC4uKXllc3xubykKLQotICAgIHN0YXRpYyBpbnQgbm9maW5zdGFuY2VzID0gMDsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBDT1VOVCA9IGZhbHNlOwotCi0gICAgc3RhdGljIE9wIGNyZWF0ZURvdCgpIHsKLSAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOwotICAgICAgICByZXR1cm4gbmV3IE9wKE9wLkRPVCk7Ci0gICAgfQotICAgIHN0YXRpYyBDaGFyT3AgY3JlYXRlQ2hhcihpbnQgZGF0YSkgewotICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgKys7Ci0gICAgICAgIHJldHVybiBuZXcgQ2hhck9wKE9wLkNIQVIsIGRhdGEpOwotICAgIH0KLSAgICBzdGF0aWMgQ2hhck9wIGNyZWF0ZUFuY2hvcihpbnQgZGF0YSkgewotICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgKys7Ci0gICAgICAgIHJldHVybiBuZXcgQ2hhck9wKE9wLkFOQ0hPUiwgZGF0YSk7Ci0gICAgfQotICAgIHN0YXRpYyBDaGFyT3AgY3JlYXRlQ2FwdHVyZShpbnQgbnVtYmVyLCBPcCBuZXh0KSB7Ci0gICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKLSAgICAgICAgQ2hhck9wIG9wID0gbmV3IENoYXJPcChPcC5DQVBUVVJFLCBudW1iZXIpOwotICAgICAgICBvcC5uZXh0ID0gbmV4dDsKLSAgICAgICAgcmV0dXJuIG9wOwotICAgIH0KLSAgICBzdGF0aWMgVW5pb25PcCBjcmVhdGVVbmlvbihpbnQgc2l6ZSkgewotICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgKys7Ci0gICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJDcmVhdGVzIFVuaW9uT3AiKTsKLSAgICAgICAgcmV0dXJuIG5ldyBVbmlvbk9wKE9wLlVOSU9OLCBzaXplKTsKLSAgICB9Ci0gICAgc3RhdGljIENoaWxkT3AgY3JlYXRlQ2xvc3VyZShpbnQgaWQpIHsKLSAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOwotICAgICAgICByZXR1cm4gbmV3IE1vZGlmaWVyT3AoT3AuQ0xPU1VSRSwgaWQsIC0xKTsKLSAgICB9Ci0gICAgc3RhdGljIENoaWxkT3AgY3JlYXRlTm9uR3JlZWR5Q2xvc3VyZSgpIHsKLSAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOwotICAgICAgICByZXR1cm4gbmV3IENoaWxkT3AoT3AuTk9OR1JFRURZQ0xPU1VSRSk7Ci0gICAgfQotICAgIHN0YXRpYyBDaGlsZE9wIGNyZWF0ZVF1ZXN0aW9uKGJvb2xlYW4gbm9uZ3JlZWR5KSB7Ci0gICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKLSAgICAgICAgcmV0dXJuIG5ldyBDaGlsZE9wKG5vbmdyZWVkeSA/IE9wLk5PTkdSRUVEWVFVRVNUSU9OIDogT3AuUVVFU1RJT04pOwotICAgIH0KLSAgICBzdGF0aWMgUmFuZ2VPcCBjcmVhdGVSYW5nZShUb2tlbiB0b2spIHsKLSAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOwotICAgICAgICByZXR1cm4gbmV3IFJhbmdlT3AoT3AuUkFOR0UsIHRvayk7Ci0gICAgfQotICAgIHN0YXRpYyBDaGlsZE9wIGNyZWF0ZUxvb2soaW50IHR5cGUsIE9wIG5leHQsIE9wIGJyYW5jaCkgewotICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgKys7Ci0gICAgICAgIENoaWxkT3Agb3AgPSBuZXcgQ2hpbGRPcCh0eXBlKTsKLSAgICAgICAgb3Auc2V0Q2hpbGQoYnJhbmNoKTsKLSAgICAgICAgb3AubmV4dCA9IG5leHQ7Ci0gICAgICAgIHJldHVybiBvcDsKLSAgICB9Ci0gICAgc3RhdGljIENoYXJPcCBjcmVhdGVCYWNrUmVmZXJlbmNlKGludCByZWZubykgewotICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgKys7Ci0gICAgICAgIHJldHVybiBuZXcgQ2hhck9wKE9wLkJBQ0tSRUZFUkVOQ0UsIHJlZm5vKTsKLSAgICB9Ci0gICAgc3RhdGljIFN0cmluZ09wIGNyZWF0ZVN0cmluZyhTdHJpbmcgbGl0ZXJhbCkgewotICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgKys7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nT3AoT3AuU1RSSU5HLCBsaXRlcmFsKTsKLSAgICB9Ci0gICAgc3RhdGljIENoaWxkT3AgY3JlYXRlSW5kZXBlbmRlbnQoT3AgbmV4dCwgT3AgYnJhbmNoKSB7Ci0gICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKLSAgICAgICAgQ2hpbGRPcCBvcCA9IG5ldyBDaGlsZE9wKE9wLklOREVQRU5ERU5UKTsKLSAgICAgICAgb3Auc2V0Q2hpbGQoYnJhbmNoKTsKLSAgICAgICAgb3AubmV4dCA9IG5leHQ7Ci0gICAgICAgIHJldHVybiBvcDsKLSAgICB9Ci0gICAgc3RhdGljIE1vZGlmaWVyT3AgY3JlYXRlTW9kaWZpZXIoT3AgbmV4dCwgT3AgYnJhbmNoLCBpbnQgYWRkLCBpbnQgbWFzaykgewotICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgKys7Ci0gICAgICAgIE1vZGlmaWVyT3Agb3AgPSBuZXcgTW9kaWZpZXJPcChPcC5NT0RJRklFUiwgYWRkLCBtYXNrKTsKLSAgICAgICAgb3Auc2V0Q2hpbGQoYnJhbmNoKTsKLSAgICAgICAgb3AubmV4dCA9IG5leHQ7Ci0gICAgICAgIHJldHVybiBvcDsKLSAgICB9Ci0gICAgc3RhdGljIENvbmRpdGlvbk9wIGNyZWF0ZUNvbmRpdGlvbihPcCBuZXh0LCBpbnQgcmVmLCBPcCBjb25kaXRpb25mbG93LCBPcCB5ZXNmbG93LCBPcCBub2Zsb3cpIHsKLSAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOwotICAgICAgICBDb25kaXRpb25PcCBvcCA9IG5ldyBDb25kaXRpb25PcChPcC5DT05ESVRJT04sIHJlZiwgY29uZGl0aW9uZmxvdywgeWVzZmxvdywgbm9mbG93KTsKLSAgICAgICAgb3AubmV4dCA9IG5leHQ7Ci0gICAgICAgIHJldHVybiBvcDsKLSAgICB9Ci0KLSAgICBpbnQgdHlwZTsKLSAgICBPcCBuZXh0ID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBPcChpbnQgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIGludCBzaXplKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIFVOSU9OCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBPcCBlbGVtZW50QXQoaW50IGluZGV4KSB7ICAgICAgICAgICAgICAgICAgIC8vIGZvciBVTklvTgotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6IHR5cGU9Iit0aGlzLnR5cGUpOwotICAgIH0KLSAgICBPcCBnZXRDaGlsZCgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBDTE9TVVJFLCBRVUVTVElPTgotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6IHR5cGU9Iit0aGlzLnR5cGUpOwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vZGlmaWVyT3AKLSAgICBpbnQgZ2V0RGF0YSgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoYXJPcCAgZm9yIENIQVIsIEJBQ0tSRUZFUkVOQ0UsIENBUFRVUkUsIEFOQ0hPUiwgCi0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogdHlwZT0iK3RoaXMudHlwZSk7Ci0gICAgfQotICAgIGludCBnZXREYXRhMigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW9kaWZpZXJPcAotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6IHR5cGU9Iit0aGlzLnR5cGUpOwotICAgIH0KLSAgICBSYW5nZVRva2VuIGdldFRva2VuKCkgeyAgICAgICAgICAgICAgICAgICAgIC8vIFJBTkdFLCBOUkFOR0UKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiB0eXBlPSIrdGhpcy50eXBlKTsKLSAgICB9Ci0gICAgU3RyaW5nIGdldFN0cmluZygpIHsgICAgICAgICAgICAgICAgICAgICAgICAvLyBTVFJJTkcKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiB0eXBlPSIrdGhpcy50eXBlKTsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgc3RhdGljIGNsYXNzIENoYXJPcCBleHRlbmRzIE9wIHsKLSAgICAgICAgaW50IGNoYXJEYXRhOwotICAgICAgICBDaGFyT3AoaW50IHR5cGUsIGludCBkYXRhKSB7Ci0gICAgICAgICAgICBzdXBlcih0eXBlKTsKLSAgICAgICAgICAgIHRoaXMuY2hhckRhdGEgPSBkYXRhOwotICAgICAgICB9Ci0gICAgICAgIGludCBnZXREYXRhKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhckRhdGE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgc3RhdGljIGNsYXNzIFVuaW9uT3AgZXh0ZW5kcyBPcCB7Ci0gICAgICAgIFZlY3RvciBicmFuY2hlczsKLSAgICAgICAgVW5pb25PcChpbnQgdHlwZSwgaW50IHNpemUpIHsKLSAgICAgICAgICAgIHN1cGVyKHR5cGUpOwotICAgICAgICAgICAgdGhpcy5icmFuY2hlcyA9IG5ldyBWZWN0b3Ioc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCBhZGRFbGVtZW50KE9wIG9wKSB7Ci0gICAgICAgICAgICB0aGlzLmJyYW5jaGVzLmFkZEVsZW1lbnQob3ApOwotICAgICAgICB9Ci0gICAgICAgIGludCBzaXplKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnJhbmNoZXMuc2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIE9wIGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiAoT3ApdGhpcy5icmFuY2hlcy5lbGVtZW50QXQoaW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHN0YXRpYyBjbGFzcyBDaGlsZE9wIGV4dGVuZHMgT3AgewotICAgICAgICBPcCBjaGlsZDsKLSAgICAgICAgQ2hpbGRPcChpbnQgdHlwZSkgewotICAgICAgICAgICAgc3VwZXIodHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCBzZXRDaGlsZChPcCBjaGlsZCkgewotICAgICAgICAgICAgdGhpcy5jaGlsZCA9IGNoaWxkOwotICAgICAgICB9Ci0gICAgICAgIE9wIGdldENoaWxkKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHN0YXRpYyBjbGFzcyBNb2RpZmllck9wIGV4dGVuZHMgQ2hpbGRPcCB7Ci0gICAgICAgIGludCB2MTsKLSAgICAgICAgaW50IHYyOwotICAgICAgICBNb2RpZmllck9wKGludCB0eXBlLCBpbnQgdjEsIGludCB2MikgewotICAgICAgICAgICAgc3VwZXIodHlwZSk7Ci0gICAgICAgICAgICB0aGlzLnYxID0gdjE7Ci0gICAgICAgICAgICB0aGlzLnYyID0gdjI7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGdldERhdGEoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy52MTsKLSAgICAgICAgfQotICAgICAgICBpbnQgZ2V0RGF0YTIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy52MjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgc3RhdGljIGNsYXNzIFJhbmdlT3AgZXh0ZW5kcyBPcCB7Ci0gICAgICAgIFRva2VuIHRvazsKLSAgICAgICAgUmFuZ2VPcChpbnQgdHlwZSwgVG9rZW4gdG9rKSB7Ci0gICAgICAgICAgICBzdXBlcih0eXBlKTsKLSAgICAgICAgICAgIHRoaXMudG9rID0gdG9rOwotICAgICAgICB9Ci0gICAgICAgIFJhbmdlVG9rZW4gZ2V0VG9rZW4oKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFJhbmdlVG9rZW4pdGhpcy50b2s7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHN0YXRpYyBjbGFzcyBTdHJpbmdPcCBleHRlbmRzIE9wIHsKLSAgICAgICAgU3RyaW5nIHN0cmluZzsKLSAgICAgICAgU3RyaW5nT3AoaW50IHR5cGUsIFN0cmluZyBsaXRlcmFsKSB7Ci0gICAgICAgICAgICBzdXBlcih0eXBlKTsKLSAgICAgICAgICAgIHRoaXMuc3RyaW5nID0gbGl0ZXJhbDsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgZ2V0U3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBzdGF0aWMgY2xhc3MgQ29uZGl0aW9uT3AgZXh0ZW5kcyBPcCB7Ci0gICAgICAgIGludCByZWZOdW1iZXI7Ci0gICAgICAgIE9wIGNvbmRpdGlvbjsKLSAgICAgICAgT3AgeWVzOwotICAgICAgICBPcCBubzsKLSAgICAgICAgQ29uZGl0aW9uT3AoaW50IHR5cGUsIGludCByZWZubywgT3AgY29uZGl0aW9uZmxvdywgT3AgeWVzZmxvdywgT3Agbm9mbG93KSB7Ci0gICAgICAgICAgICBzdXBlcih0eXBlKTsKLSAgICAgICAgICAgIHRoaXMucmVmTnVtYmVyID0gcmVmbm87Ci0gICAgICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbmZsb3c7Ci0gICAgICAgICAgICB0aGlzLnllcyA9IHllc2Zsb3c7Ci0gICAgICAgICAgICB0aGlzLm5vID0gbm9mbG93OwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9QYXJzZUV4Y2VwdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9QYXJzZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTQxYWIzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUGFyc2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OwotCi0vKioKLSAqCi0gKiBAYXV0aG9yIFRBTVVSQSBLZW50ICZsdDtrZW50QHRybC5pYm0uY28uanAmZ3Q7Ci0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgIGludCBsb2NhdGlvbjsKLQotICAgIC8qCi0gICAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFN0cmluZyBtZXMpIHsKLSAgICAgICAgdGhpcyhtZXMsIC0xKTsKLSAgICB9Ci0gICAgKi8KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzLCBpbnQgbG9jYXRpb24pIHsKLSAgICAgICAgc3VwZXIobWVzKTsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHJldHVybiAtMSBpZiBsb2NhdGlvbiBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxvY2F0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUGFyc2VyRm9yWE1MU2NoZW1hLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1BhcnNlckZvclhNTFNjaGVtYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmU5YjY1Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUGFyc2VyRm9yWE1MU2NoZW1hLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLS8qKgotICogQSByZWd1bGFyIGV4cHJlc3Npb24gcGFyc2VyIGZvciB0aGUgWE1MIFNoZW1hLgotICoKLSAqIEBhdXRob3IgVEFNVVJBIEtlbnQgJmx0O2tlbnRAdHJsLmlibS5jby5qcCZndDsKLSAqLwotY2xhc3MgUGFyc2VyRm9yWE1MU2NoZW1hIGV4dGVuZHMgUmVnZXhQYXJzZXIgewotCi0gICAgcHVibGljIFBhcnNlckZvclhNTFNjaGVtYSgpIHsKLSAgICAgICAgLy90aGlzLnNldExvY2FsZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLSAgICB9Ci0gICAgcHVibGljIFBhcnNlckZvclhNTFNjaGVtYShMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgIC8vdGhpcy5zZXRMb2NhbGUobG9jYWxlKTsKLSAgICB9Ci0KLSAgICBUb2tlbiBwcm9jZXNzQ2FyZXQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIFRva2VuLmNyZWF0ZUNoYXIoJ14nKTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0RvbGxhcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICByZXR1cm4gVG9rZW4uY3JlYXRlQ2hhcignJCcpOwotICAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0xvb2thaGVhZCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzTmVnYXRpdmVsb29rYWhlYWQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0xvb2tiZWhpbmQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc05lZ2F0aXZlbG9va2JlaGluZCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfQSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfWigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfeigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfYigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfQigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfbHQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2d0KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldCk7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NTdGFyKFRva2VuIHRvaykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIHJldHVybiBUb2tlbi5jcmVhdGVDbG9zdXJlKHRvayk7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NQbHVzKFRva2VuIHRvaykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gWCsgLT4gWFgqCi0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICByZXR1cm4gVG9rZW4uY3JlYXRlQ29uY2F0KHRvaywgVG9rZW4uY3JlYXRlQ2xvc3VyZSh0b2spKTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc1F1ZXN0aW9uKFRva2VuIHRvaykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gWD8gLT4gWHwKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIFRva2VuIHBhciA9IFRva2VuLmNyZWF0ZVVuaW9uKCk7Ci0gICAgICAgIHBhci5hZGRDaGlsZCh0b2spOwotICAgICAgICBwYXIuYWRkQ2hpbGQoVG9rZW4uY3JlYXRlRW1wdHkoKSk7Ci0gICAgICAgIHJldHVybiBwYXI7Ci0gICAgfQotICAgIGJvb2xlYW4gY2hlY2tRdWVzdGlvbihpbnQgb2ZmKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc1BhcmVuKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIFRva2VuIHRvayA9IFRva2VuLmNyZWF0ZVBhcmVuKHRoaXMucGFyc2VSZWdleCgpLCAwKTsKLSAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IHN1cGVyLlRfUlBBUkVOKSAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICB0aGlzLm5leHQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcHMgJyknCi0gICAgICAgIHJldHVybiB0b2s7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NQYXJlbjIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0NvbmRpdGlvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzTW9kaWZpZXJzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldCk7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NJbmRlcGVuZGVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfYygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbkZvclNob3J0aGFuZCgnYycpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfQygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbkZvclNob3J0aGFuZCgnQycpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfaSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbkZvclNob3J0aGFuZCgnaScpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfSSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbkZvclNob3J0aGFuZCgnSScpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IHRoaXMuZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldC0yKTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX1goKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0LTIpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3JlZmVyZW5jZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQtNCk7Ci0gICAgfQotCi0gICAgaW50IHByb2Nlc3NDSWluQ2hhcmFjdGVyQ2xhc3MoUmFuZ2VUb2tlbiB0b2ssIGludCBjKSB7Ci0gICAgICAgIHRvay5tZXJnZVJhbmdlcyh0aGlzLmdldFRva2VuRm9yU2hvcnRoYW5kKGMpKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGEgY2hhcmFjdGVyLWNsYXNzLWV4cHJlc3Npb24sIG5vdCBhIGNoYXJhY3Rlci1jbGFzcy1lc2NhcGUuCi0gICAgICoKLSAgICAgKiBjLWMtZXhwcmVzc2lvbiAgIDo6PSAnWycgYy1ncm91cCAnXScKLSAgICAgKiBjLWdyb3VwICAgICAgICAgIDo6PSBwb3NpdGl2ZS1jLWdyb3VwIHwgbmVnYXRpdmUtYy1ncm91cCB8IGMtYy1zdWJ0cmFjdGlvbgotICAgICAqIHBvc2l0aXZlLWMtZ3JvdXAgOjo9IChjLXJhbmdlIHwgYy1jLWVzY2FwZSkrCi0gICAgICogbmVnYXRpdmUtYy1ncm91cCA6Oj0gJ14nIHBvc2l0aXZlLWMtZ3JvdXAKLSAgICAgKiBjLWMtc3VidHJhY3Rpb24gIDo6PSAocG9zaXRpdmUtYy1ncm91cCB8IG5lZ2F0aXZlLWMtZ3JvdXApIHN1YnRyYWN0aW9uCi0gICAgICogc3VidHJhY3Rpb24gICAgICA6Oj0gJy0nIGMtYy1leHByZXNzaW9uCi0gICAgICogYy1yYW5nZSAgICAgICAgICA6Oj0gc2luZ2xlLXJhbmdlIHwgZnJvbS10by1yYW5nZQotICAgICAqIHNpbmdsZS1yYW5nZSAgICAgOjo9IG11bHRpLWMtZXNjYXBlIHwgY2F0ZWdvcnktYy1lc2NhcGUgfCBibG9jay1jLWVzY2FwZSB8IDxhbnkgWE1MIGNoYXI+Ci0gICAgICogY2Mtbm9ybWFsLWMgICAgICA6Oj0gPGFueSBjaGFyYWN0ZXIgZXhjZXB0IFssIF0sIFw+Ci0gICAgICogZnJvbS10by1yYW5nZSAgICA6Oj0gY2Mtbm9ybWFsLWMgJy0nIGNjLW5vcm1hbC1jCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXNlTnJhZ2UgSWdub3JlZC4KLSAgICAgKiBAcmV0dXJuIFRoaXMgcmV0dXJucyBubyBOcmFnZVRva2VuLgotICAgICAqLwotICAgIHByb3RlY3RlZCBSYW5nZVRva2VuIHBhcnNlQ2hhcmFjdGVyQ2xhc3MoYm9vbGVhbiB1c2VOcmFuZ2UpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuc2V0Q29udGV4dChTX0lOQlJBQ0tFVFMpOwotICAgICAgICB0aGlzLm5leHQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ1snCi0gICAgICAgIGJvb2xlYW4gbnJhbmdlID0gZmFsc2U7Ci0gICAgICAgIFJhbmdlVG9rZW4gYmFzZSA9IG51bGw7Ci0gICAgICAgIFJhbmdlVG9rZW4gdG9rOwotICAgICAgICBpZiAodGhpcy5yZWFkKCkgPT0gVF9DSEFSICYmIHRoaXMuY2hhcmRhdGEgPT0gJ14nKSB7Ci0gICAgICAgICAgICBucmFuZ2UgPSB0cnVlOwotICAgICAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ14nCi0gICAgICAgICAgICBiYXNlID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgICAgIGJhc2UuYWRkUmFuZ2UoMCwgVG9rZW4uVVRGMTZfTUFYKTsKLSAgICAgICAgICAgIHRvayA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICB9Ci0gICAgICAgIGludCB0eXBlOwotICAgICAgICBib29sZWFuIGZpcnN0bG9vcCA9IHRydWU7Ci0gICAgICAgIHdoaWxlICgodHlwZSA9IHRoaXMucmVhZCgpKSAhPSBUX0VPRikgeyAvLyBEb24ndCB1c2UgJ2NvdGludWUnIGZvciB0aGlzIGxvb3AuCi0gICAgICAgICAgICAvLyBzaW5nbGUtcmFuZ2UgfCBmcm9tLXRvLXJhbmdlIHwgc3VidHJhY3Rpb24KLSAgICAgICAgICAgIGlmICh0eXBlID09IFRfQ0hBUiAmJiB0aGlzLmNoYXJkYXRhID09ICddJyAmJiAhZmlyc3Rsb29wKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5yYW5nZSkgewotICAgICAgICAgICAgICAgICAgICBiYXNlLnN1YnRyYWN0UmFuZ2VzKHRvayk7Ci0gICAgICAgICAgICAgICAgICAgIHRvayA9IGJhc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGMgPSB0aGlzLmNoYXJkYXRhOwotICAgICAgICAgICAgYm9vbGVhbiBlbmQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmICh0eXBlID09IFRfQkFDS1NPTElEVVMpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOiAgY2FzZSAnRCc6Ci0gICAgICAgICAgICAgICAgICBjYXNlICd3JzogIGNhc2UgJ1cnOgotICAgICAgICAgICAgICAgICAgY2FzZSAncyc6ICBjYXNlICdTJzoKLSAgICAgICAgICAgICAgICAgICAgdG9rLm1lcmdlUmFuZ2VzKHRoaXMuZ2V0VG9rZW5Gb3JTaG9ydGhhbmQoYykpOwotICAgICAgICAgICAgICAgICAgICBlbmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgY2FzZSAnaSc6ICBjYXNlICdJJzoKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ2MnOiAgY2FzZSAnQyc6Ci0gICAgICAgICAgICAgICAgICAgIGMgPSB0aGlzLnByb2Nlc3NDSWluQ2hhcmFjdGVyQ2xhc3ModG9rLCBjKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMgPCAwKSAgZW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgY2FzZSAncCc6Ci0gICAgICAgICAgICAgICAgICBjYXNlICdQJzoKLSAgICAgICAgICAgICAgICAgICAgaW50IHBzdGFydCA9IHRoaXMub2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBSYW5nZVRva2VuIHRvazIgPSB0aGlzLnByb2Nlc3NCYWNrc29saWR1c19wUChjKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRvazIgPT0gbnVsbCkgIHRocm93IHRoaXMuZXgoInBhcnNlci5hdG9tLjUiLCBwc3RhcnQpOwotICAgICAgICAgICAgICAgICAgICB0b2subWVyZ2VSYW5nZXModG9rMik7Ci0gICAgICAgICAgICAgICAgICAgIGVuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBjID0gdGhpcy5kZWNvZGVFc2NhcGVkKCk7Ci0gICAgICAgICAgICAgICAgfSAvLyBcICsgYwotICAgICAgICAgICAgfSAvLyBiYWNrc29saWR1cwotICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBUX1hNTFNDSEVNQV9DQ19TVUJUUkFDVElPTiAmJiAhZmlyc3Rsb29wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWJyYWN0aW9uCi0gICAgICAgICAgICAgICAgaWYgKG5yYW5nZSkgewotICAgICAgICAgICAgICAgICAgICBiYXNlLnN1YnRyYWN0UmFuZ2VzKHRvayk7Ci0gICAgICAgICAgICAgICAgICAgIHRvayA9IGJhc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFJhbmdlVG9rZW4gcmFuZ2UyID0gdGhpcy5wYXJzZUNoYXJhY3RlckNsYXNzKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB0b2suc3VidHJhY3RSYW5nZXMocmFuZ2UyKTsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSIHx8IHRoaXMuY2hhcmRhdGEgIT0gJ10nKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuNSIsIHRoaXMub2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4aXQgdGhpcyBsb29wCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghZW5kKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBzaG9ydGhhbmRzLi4uCi0gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gVF9DSEFSKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjID09ICdbJykgIHRocm93IHRoaXMuZXgoInBhcnNlci5jYy42IiwgdGhpcy5vZmZzZXQtMik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjID09ICddJykgIHRocm93IHRoaXMuZXgoInBhcnNlci5jYy43IiwgdGhpcy5vZmZzZXQtMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX0NIQVIgfHwgdGhpcy5jaGFyZGF0YSAhPSAnLScpIHsgLy8gSGVyZSBpcyBubyAnLScuCi0gICAgICAgICAgICAgICAgICAgIHRvay5hZGRSYW5nZShjLCBjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvdW5kICctJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgdGhpcyAnLScgaXMgYSBmcm9tLXRvIHRva2VuPz8KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7IC8vIFNraXBzICctJwotICAgICAgICAgICAgICAgICAgICBpZiAoKHR5cGUgPSB0aGlzLnJlYWQoKSkgPT0gVF9FT0YpICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuMiIsIHRoaXMub2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGMgJy0nICddJyAtPiAnLScgaXMgYSBzaW5nbGUtcmFuZ2UuCi0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFRfQ0hBUiAmJiB0aGlzLmNoYXJkYXRhID09ICddJykgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9rLmFkZFJhbmdlKGMsIGMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG9rLmFkZFJhbmdlKCctJywgJy0nKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYyAnLScgJy1bJyAtPiAnLScgaXMgYSBzaW5nbGUtcmFuZ2UuCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gVF9YTUxTQ0hFTUFfQ0NfU1VCVFJBQ1RJT04pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvay5hZGRSYW5nZShjLCBjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvay5hZGRSYW5nZSgnLScsICctJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmFuZ2VlbmQgPSB0aGlzLmNoYXJkYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gVF9DSEFSKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlZW5kID09ICdbJykgIHRocm93IHRoaXMuZXgoInBhcnNlci5jYy42IiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlZW5kID09ICddJykgIHRocm93IHRoaXMuZXgoInBhcnNlci5jYy43IiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBUX0JBQ0tTT0xJRFVTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlZW5kID0gdGhpcy5kZWNvZGVFc2NhcGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvay5hZGRSYW5nZShjLCByYW5nZWVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaXJzdGxvb3AgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGhpcy5yZWFkKCkgPT0gVF9FT0YpCi0gICAgICAgICAgICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuMiIsIHRoaXMub2Zmc2V0KTsKLSAgICAgICAgdG9rLnNvcnRSYW5nZXMoKTsKLSAgICAgICAgdG9rLmNvbXBhY3RSYW5nZXMoKTsKLSAgICAgICAgLy90b2suZHVtcFJhbmdlcygpOwotICAgICAgICB0aGlzLnNldENvbnRleHQoU19OT1JNQUwpOwotICAgICAgICB0aGlzLm5leHQoKTsgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzICddJwotCi0gICAgICAgIHJldHVybiB0b2s7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFJhbmdlVG9rZW4gcGFyc2VTZXRPcGVyYXRpb25zKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgdGhpcy5leCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICB9Ci0gCi0gICAgVG9rZW4gZ2V0VG9rZW5Gb3JTaG9ydGhhbmQoaW50IGNoKSB7Ci0gICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICBjYXNlICdkJzoKLSAgICAgICAgICAgIHJldHVybiBQYXJzZXJGb3JYTUxTY2hlbWEuZ2V0UmFuZ2UoInhtbDppc0RpZ2l0IiwgdHJ1ZSk7Ci0gICAgICAgICAgY2FzZSAnRCc6Ci0gICAgICAgICAgICByZXR1cm4gUGFyc2VyRm9yWE1MU2NoZW1hLmdldFJhbmdlKCJ4bWw6aXNEaWdpdCIsIGZhbHNlKTsKLSAgICAgICAgICBjYXNlICd3JzoKLSAgICAgICAgICAgIHJldHVybiBQYXJzZXJGb3JYTUxTY2hlbWEuZ2V0UmFuZ2UoInhtbDppc1dvcmQiLCB0cnVlKTsKLSAgICAgICAgICBjYXNlICdXJzoKLSAgICAgICAgICAgIHJldHVybiBQYXJzZXJGb3JYTUxTY2hlbWEuZ2V0UmFuZ2UoInhtbDppc1dvcmQiLCBmYWxzZSk7Ci0gICAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICByZXR1cm4gUGFyc2VyRm9yWE1MU2NoZW1hLmdldFJhbmdlKCJ4bWw6aXNTcGFjZSIsIHRydWUpOwotICAgICAgICAgIGNhc2UgJ1MnOgotICAgICAgICAgICAgcmV0dXJuIFBhcnNlckZvclhNTFNjaGVtYS5nZXRSYW5nZSgieG1sOmlzU3BhY2UiLCBmYWxzZSk7Ci0gICAgICAgICAgY2FzZSAnYyc6Ci0gICAgICAgICAgICByZXR1cm4gUGFyc2VyRm9yWE1MU2NoZW1hLmdldFJhbmdlKCJ4bWw6aXNOYW1lQ2hhciIsIHRydWUpOwotICAgICAgICAgIGNhc2UgJ0MnOgotICAgICAgICAgICAgcmV0dXJuIFBhcnNlckZvclhNTFNjaGVtYS5nZXRSYW5nZSgieG1sOmlzTmFtZUNoYXIiLCBmYWxzZSk7Ci0gICAgICAgICAgY2FzZSAnaSc6Ci0gICAgICAgICAgICByZXR1cm4gUGFyc2VyRm9yWE1MU2NoZW1hLmdldFJhbmdlKCJ4bWw6aXNJbml0aWFsTmFtZUNoYXIiLCB0cnVlKTsKLSAgICAgICAgICBjYXNlICdJJzoKLSAgICAgICAgICAgIHJldHVybiBQYXJzZXJGb3JYTUxTY2hlbWEuZ2V0UmFuZ2UoInhtbDppc0luaXRpYWxOYW1lQ2hhciIsIGZhbHNlKTsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiBzaG9ydGhhbmRzOiBcXHUiK0ludGVnZXIudG9TdHJpbmcoY2gsIDE2KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50IGRlY29kZUVzY2FwZWQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9CQUNLU09MSURVUykgIHRocm93IGV4KCJwYXJzZXIubmV4dC4xIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgIGludCBjID0gdGhpcy5jaGFyZGF0YTsKLSAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgY2FzZSAnbic6ICBjID0gJ1xuJzsgIGJyZWFrOyAvLyBMSU5FIEZFRUQgVSswMDBBCi0gICAgICAgICAgY2FzZSAncic6ICBjID0gJ1xyJzsgIGJyZWFrOyAvLyBDUlJJQUdFIFJFVFVSTiBVKzAwMEQKLSAgICAgICAgICBjYXNlICd0JzogIGMgPSAnXHQnOyAgYnJlYWs7IC8vIEhPUklaT05UQUwgVEFCVUxBVElPTiBVKzAwMDkKLQotICAgICAgICAgIGNhc2UgJ2UnOgotICAgICAgICAgIGNhc2UgJ2YnOgotICAgICAgICAgIGNhc2UgJ3gnOgotICAgICAgICAgIGNhc2UgJ3UnOgotICAgICAgICAgIGNhc2UgJ3YnOgotICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldC0yKTsKLSAgICAgICAgICBjYXNlICdBJzoKLSAgICAgICAgICBjYXNlICdaJzoKLSAgICAgICAgICBjYXNlICd6JzoKLSAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS41IiwgdGhpcy5vZmZzZXQtMik7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYzsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBIYXNodGFibGUgcmFuZ2VzID0gbnVsbDsKLSAgICBzdGF0aWMgcHJpdmF0ZSBIYXNodGFibGUgcmFuZ2VzMiA9IG51bGw7Ci0gICAgc3RhdGljIHN5bmNocm9uaXplZCBwcm90ZWN0ZWQgUmFuZ2VUb2tlbiBnZXRSYW5nZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBwb3NpdGl2ZSkgewotICAgICAgICBpZiAocmFuZ2VzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJhbmdlcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgICAgIHJhbmdlczIgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICAgICAgICAgIFRva2VuIHRvayA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgICAgICBzZXR1cFJhbmdlKHRvaywgU1BBQ0VTKTsKLSAgICAgICAgICAgIHJhbmdlcy5wdXQoInhtbDppc1NwYWNlIiwgdG9rKTsKLSAgICAgICAgICAgIHJhbmdlczIucHV0KCJ4bWw6aXNTcGFjZSIsIFRva2VuLmNvbXBsZW1lbnRSYW5nZXModG9rKSk7Ci0KLSAgICAgICAgICAgIHRvayA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgICAgICBzZXR1cFJhbmdlKHRvaywgRElHSVRTKTsKLSAgICAgICAgICAgIHJhbmdlcy5wdXQoInhtbDppc0RpZ2l0IiwgdG9rKTsKLSAgICAgICAgICAgIHJhbmdlczIucHV0KCJ4bWw6aXNEaWdpdCIsIFRva2VuLmNvbXBsZW1lbnRSYW5nZXModG9rKSk7Ci0KLSAgICAgICAgICAgIHRvayA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgICAgICBzZXR1cFJhbmdlKHRvaywgRElHSVRTKTsKLSAgICAgICAgICAgIHJhbmdlcy5wdXQoInhtbDppc0RpZ2l0IiwgdG9rKTsKLSAgICAgICAgICAgIHJhbmdlczIucHV0KCJ4bWw6aXNEaWdpdCIsIFRva2VuLmNvbXBsZW1lbnRSYW5nZXModG9rKSk7Ci0KLSAgICAgICAgICAgIHRvayA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgICAgICBzZXR1cFJhbmdlKHRvaywgTEVUVEVSUyk7Ci0gICAgICAgICAgICB0b2subWVyZ2VSYW5nZXMoKFRva2VuKXJhbmdlcy5nZXQoInhtbDppc0RpZ2l0IikpOwotICAgICAgICAgICAgcmFuZ2VzLnB1dCgieG1sOmlzV29yZCIsIHRvayk7Ci0gICAgICAgICAgICByYW5nZXMyLnB1dCgieG1sOmlzV29yZCIsIFRva2VuLmNvbXBsZW1lbnRSYW5nZXModG9rKSk7Ci0KLSAgICAgICAgICAgIHRvayA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgICAgICBzZXR1cFJhbmdlKHRvaywgTkFNRUNIQVJTKTsKLSAgICAgICAgICAgIHJhbmdlcy5wdXQoInhtbDppc05hbWVDaGFyIiwgdG9rKTsKLSAgICAgICAgICAgIHJhbmdlczIucHV0KCJ4bWw6aXNOYW1lQ2hhciIsIFRva2VuLmNvbXBsZW1lbnRSYW5nZXModG9rKSk7Ci0KLSAgICAgICAgICAgIHRvayA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgICAgICBzZXR1cFJhbmdlKHRvaywgTEVUVEVSUyk7Ci0gICAgICAgICAgICB0b2suYWRkUmFuZ2UoJ18nLCAnXycpOwotICAgICAgICAgICAgdG9rLmFkZFJhbmdlKCc6JywgJzonKTsKLSAgICAgICAgICAgIHJhbmdlcy5wdXQoInhtbDppc0luaXRpYWxOYW1lQ2hhciIsIHRvayk7Ci0gICAgICAgICAgICByYW5nZXMyLnB1dCgieG1sOmlzSW5pdGlhbE5hbWVDaGFyIiwgVG9rZW4uY29tcGxlbWVudFJhbmdlcyh0b2spKTsKLSAgICAgICAgfQotICAgICAgICBSYW5nZVRva2VuIHRvayA9IHBvc2l0aXZlID8gKFJhbmdlVG9rZW4pcmFuZ2VzLmdldChuYW1lKQotICAgICAgICAgICAgOiAoUmFuZ2VUb2tlbilyYW5nZXMyLmdldChuYW1lKTsKLSAgICAgICAgcmV0dXJuIHRvazsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBzZXR1cFJhbmdlKFRva2VuIHJhbmdlLCBTdHJpbmcgc3JjKSB7Ci0gICAgICAgIGludCBsZW4gPSBzcmMubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IGxlbjsgIGkgKz0gMikKLSAgICAgICAgICAgIHJhbmdlLmFkZFJhbmdlKHNyYy5jaGFyQXQoaSksIHNyYy5jaGFyQXQoaSsxKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQUNFUyA9ICJcdFxuXHJcciAgIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRUNIQVJTID0KLSAgICAgICAgIlx1MDAyZFx1MDAyZVx1MDAzMFx1MDAzYVx1MDA0MVx1MDA1YVx1MDA1Zlx1MDA1Zlx1MDA2MVx1MDA3YVx1MDBiN1x1MDBiN1x1MDBjMFx1MDBkNiIKLSAgICAgICAgKyJcdTAwZDhcdTAwZjZcdTAwZjhcdTAxMzFcdTAxMzRcdTAxM2VcdTAxNDFcdTAxNDhcdTAxNGFcdTAxN2VcdTAxODBcdTAxYzNcdTAxY2RcdTAxZjAiCi0gICAgICAgICsiXHUwMWY0XHUwMWY1XHUwMWZhXHUwMjE3XHUwMjUwXHUwMmE4XHUwMmJiXHUwMmMxXHUwMmQwXHUwMmQxXHUwMzAwXHUwMzQ1XHUwMzYwXHUwMzYxIgotICAgICAgICArIlx1MDM4Nlx1MDM4YVx1MDM4Y1x1MDM4Y1x1MDM4ZVx1MDNhMVx1MDNhM1x1MDNjZVx1MDNkMFx1MDNkNlx1MDNkYVx1MDNkYVx1MDNkY1x1MDNkYyIKLSAgICAgICAgKyJcdTAzZGVcdTAzZGVcdTAzZTBcdTAzZTBcdTAzZTJcdTAzZjNcdTA0MDFcdTA0MGNcdTA0MGVcdTA0NGZcdTA0NTFcdTA0NWNcdTA0NWVcdTA0ODEiCi0gICAgICAgICsiXHUwNDgzXHUwNDg2XHUwNDkwXHUwNGM0XHUwNGM3XHUwNGM4XHUwNGNiXHUwNGNjXHUwNGQwXHUwNGViXHUwNGVlXHUwNGY1XHUwNGY4XHUwNGY5IgotICAgICAgICArIlx1MDUzMVx1MDU1Nlx1MDU1OVx1MDU1OVx1MDU2MVx1MDU4Nlx1MDU5MVx1MDVhMVx1MDVhM1x1MDViOVx1MDViYlx1MDViZFx1MDViZlx1MDViZiIKLSAgICAgICAgKyJcdTA1YzFcdTA1YzJcdTA1YzRcdTA1YzRcdTA1ZDBcdTA1ZWFcdTA1ZjBcdTA1ZjJcdTA2MjFcdTA2M2FcdTA2NDBcdTA2NTJcdTA2NjBcdTA2NjkiCi0gICAgICAgICsiXHUwNjcwXHUwNmI3XHUwNmJhXHUwNmJlXHUwNmMwXHUwNmNlXHUwNmQwXHUwNmQzXHUwNmQ1XHUwNmU4XHUwNmVhXHUwNmVkXHUwNmYwXHUwNmY5IgotICAgICAgICArIlx1MDkwMVx1MDkwM1x1MDkwNVx1MDkzOVx1MDkzY1x1MDk0ZFx1MDk1MVx1MDk1NFx1MDk1OFx1MDk2M1x1MDk2Nlx1MDk2Zlx1MDk4MVx1MDk4MyIKLSAgICAgICAgKyJcdTA5ODVcdTA5OGNcdTA5OGZcdTA5OTBcdTA5OTNcdTA5YThcdTA5YWFcdTA5YjBcdTA5YjJcdTA5YjJcdTA5YjZcdTA5YjlcdTA5YmNcdTA5YmMiCi0gICAgICAgICsiXHUwOWJlXHUwOWM0XHUwOWM3XHUwOWM4XHUwOWNiXHUwOWNkXHUwOWQ3XHUwOWQ3XHUwOWRjXHUwOWRkXHUwOWRmXHUwOWUzXHUwOWU2XHUwOWYxIgotICAgICAgICArIlx1MGEwMlx1MGEwMlx1MGEwNVx1MGEwYVx1MGEwZlx1MGExMFx1MGExM1x1MGEyOFx1MGEyYVx1MGEzMFx1MGEzMlx1MGEzM1x1MGEzNVx1MGEzNiIKLSAgICAgICAgKyJcdTBhMzhcdTBhMzlcdTBhM2NcdTBhM2NcdTBhM2VcdTBhNDJcdTBhNDdcdTBhNDhcdTBhNGJcdTBhNGRcdTBhNTlcdTBhNWNcdTBhNWVcdTBhNWUiCi0gICAgICAgICsiXHUwYTY2XHUwYTc0XHUwYTgxXHUwYTgzXHUwYTg1XHUwYThiXHUwYThkXHUwYThkXHUwYThmXHUwYTkxXHUwYTkzXHUwYWE4XHUwYWFhXHUwYWIwIgotICAgICAgICArIlx1MGFiMlx1MGFiM1x1MGFiNVx1MGFiOVx1MGFiY1x1MGFjNVx1MGFjN1x1MGFjOVx1MGFjYlx1MGFjZFx1MGFlMFx1MGFlMFx1MGFlNlx1MGFlZiIKLSAgICAgICAgKyJcdTBiMDFcdTBiMDNcdTBiMDVcdTBiMGNcdTBiMGZcdTBiMTBcdTBiMTNcdTBiMjhcdTBiMmFcdTBiMzBcdTBiMzJcdTBiMzNcdTBiMzZcdTBiMzkiCi0gICAgICAgICsiXHUwYjNjXHUwYjQzXHUwYjQ3XHUwYjQ4XHUwYjRiXHUwYjRkXHUwYjU2XHUwYjU3XHUwYjVjXHUwYjVkXHUwYjVmXHUwYjYxXHUwYjY2XHUwYjZmIgotICAgICAgICArIlx1MGI4Mlx1MGI4M1x1MGI4NVx1MGI4YVx1MGI4ZVx1MGI5MFx1MGI5Mlx1MGI5NVx1MGI5OVx1MGI5YVx1MGI5Y1x1MGI5Y1x1MGI5ZVx1MGI5ZiIKLSAgICAgICAgKyJcdTBiYTNcdTBiYTRcdTBiYThcdTBiYWFcdTBiYWVcdTBiYjVcdTBiYjdcdTBiYjlcdTBiYmVcdTBiYzJcdTBiYzZcdTBiYzhcdTBiY2FcdTBiY2QiCi0gICAgICAgICsiXHUwYmQ3XHUwYmQ3XHUwYmU3XHUwYmVmXHUwYzAxXHUwYzAzXHUwYzA1XHUwYzBjXHUwYzBlXHUwYzEwXHUwYzEyXHUwYzI4XHUwYzJhXHUwYzMzIgotICAgICAgICArIlx1MGMzNVx1MGMzOVx1MGMzZVx1MGM0NFx1MGM0Nlx1MGM0OFx1MGM0YVx1MGM0ZFx1MGM1NVx1MGM1Nlx1MGM2MFx1MGM2MVx1MGM2Nlx1MGM2ZiIKLSAgICAgICAgKyJcdTBjODJcdTBjODNcdTBjODVcdTBjOGNcdTBjOGVcdTBjOTBcdTBjOTJcdTBjYThcdTBjYWFcdTBjYjNcdTBjYjVcdTBjYjlcdTBjYmVcdTBjYzQiCi0gICAgICAgICsiXHUwY2M2XHUwY2M4XHUwY2NhXHUwY2NkXHUwY2Q1XHUwY2Q2XHUwY2RlXHUwY2RlXHUwY2UwXHUwY2UxXHUwY2U2XHUwY2VmXHUwZDAyXHUwZDAzIgotICAgICAgICArIlx1MGQwNVx1MGQwY1x1MGQwZVx1MGQxMFx1MGQxMlx1MGQyOFx1MGQyYVx1MGQzOVx1MGQzZVx1MGQ0M1x1MGQ0Nlx1MGQ0OFx1MGQ0YVx1MGQ0ZCIKLSAgICAgICAgKyJcdTBkNTdcdTBkNTdcdTBkNjBcdTBkNjFcdTBkNjZcdTBkNmZcdTBlMDFcdTBlMmVcdTBlMzBcdTBlM2FcdTBlNDBcdTBlNGVcdTBlNTBcdTBlNTkiCi0gICAgICAgICsiXHUwZTgxXHUwZTgyXHUwZTg0XHUwZTg0XHUwZTg3XHUwZTg4XHUwZThhXHUwZThhXHUwZThkXHUwZThkXHUwZTk0XHUwZTk3XHUwZTk5XHUwZTlmIgotICAgICAgICArIlx1MGVhMVx1MGVhM1x1MGVhNVx1MGVhNVx1MGVhN1x1MGVhN1x1MGVhYVx1MGVhYlx1MGVhZFx1MGVhZVx1MGViMFx1MGViOVx1MGViYlx1MGViZCIKLSAgICAgICAgKyJcdTBlYzBcdTBlYzRcdTBlYzZcdTBlYzZcdTBlYzhcdTBlY2RcdTBlZDBcdTBlZDlcdTBmMThcdTBmMTlcdTBmMjBcdTBmMjlcdTBmMzVcdTBmMzUiCi0gICAgICAgICsiXHUwZjM3XHUwZjM3XHUwZjM5XHUwZjM5XHUwZjNlXHUwZjQ3XHUwZjQ5XHUwZjY5XHUwZjcxXHUwZjg0XHUwZjg2XHUwZjhiXHUwZjkwXHUwZjk1IgotICAgICAgICArIlx1MGY5N1x1MGY5N1x1MGY5OVx1MGZhZFx1MGZiMVx1MGZiN1x1MGZiOVx1MGZiOVx1MTBhMFx1MTBjNVx1MTBkMFx1MTBmNlx1MTEwMFx1MTEwMCIKLSAgICAgICAgKyJcdTExMDJcdTExMDNcdTExMDVcdTExMDdcdTExMDlcdTExMDlcdTExMGJcdTExMGNcdTExMGVcdTExMTJcdTExM2NcdTExM2NcdTExM2VcdTExM2UiCi0gICAgICAgICsiXHUxMTQwXHUxMTQwXHUxMTRjXHUxMTRjXHUxMTRlXHUxMTRlXHUxMTUwXHUxMTUwXHUxMTU0XHUxMTU1XHUxMTU5XHUxMTU5XHUxMTVmXHUxMTYxIgotICAgICAgICArIlx1MTE2M1x1MTE2M1x1MTE2NVx1MTE2NVx1MTE2N1x1MTE2N1x1MTE2OVx1MTE2OVx1MTE2ZFx1MTE2ZVx1MTE3Mlx1MTE3M1x1MTE3NVx1MTE3NSIKLSAgICAgICAgKyJcdTExOWVcdTExOWVcdTExYThcdTExYThcdTExYWJcdTExYWJcdTExYWVcdTExYWZcdTExYjdcdTExYjhcdTExYmFcdTExYmFcdTExYmNcdTExYzIiCi0gICAgICAgICsiXHUxMWViXHUxMWViXHUxMWYwXHUxMWYwXHUxMWY5XHUxMWY5XHUxZTAwXHUxZTliXHUxZWEwXHUxZWY5XHUxZjAwXHUxZjE1XHUxZjE4XHUxZjFkIgotICAgICAgICArIlx1MWYyMFx1MWY0NVx1MWY0OFx1MWY0ZFx1MWY1MFx1MWY1N1x1MWY1OVx1MWY1OVx1MWY1Ylx1MWY1Ylx1MWY1ZFx1MWY1ZFx1MWY1Zlx1MWY3ZCIKLSAgICAgICAgKyJcdTFmODBcdTFmYjRcdTFmYjZcdTFmYmNcdTFmYmVcdTFmYmVcdTFmYzJcdTFmYzRcdTFmYzZcdTFmY2NcdTFmZDBcdTFmZDNcdTFmZDZcdTFmZGIiCi0gICAgICAgICsiXHUxZmUwXHUxZmVjXHUxZmYyXHUxZmY0XHUxZmY2XHUxZmZjXHUyMGQwXHUyMGRjXHUyMGUxXHUyMGUxXHUyMTI2XHUyMTI2XHUyMTJhXHUyMTJiIgotICAgICAgICArIlx1MjEyZVx1MjEyZVx1MjE4MFx1MjE4Mlx1MzAwNVx1MzAwNVx1MzAwN1x1MzAwN1x1MzAyMVx1MzAyZlx1MzAzMVx1MzAzNVx1MzA0MVx1MzA5NCIKLSAgICAgICAgKyJcdTMwOTlcdTMwOWFcdTMwOWRcdTMwOWVcdTMwYTFcdTMwZmFcdTMwZmNcdTMwZmVcdTMxMDVcdTMxMmNcdTRlMDBcdTlmYTVcdWFjMDBcdWQ3YTMiCi0gICAgICAgICsiIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVUVEVSUyA9Ci0gICAgICAgICJcdTAwNDFcdTAwNWFcdTAwNjFcdTAwN2FcdTAwYzBcdTAwZDZcdTAwZDhcdTAwZjZcdTAwZjhcdTAxMzFcdTAxMzRcdTAxM2VcdTAxNDFcdTAxNDgiCi0gICAgICAgICsiXHUwMTRhXHUwMTdlXHUwMTgwXHUwMWMzXHUwMWNkXHUwMWYwXHUwMWY0XHUwMWY1XHUwMWZhXHUwMjE3XHUwMjUwXHUwMmE4XHUwMmJiXHUwMmMxIgotICAgICAgICArIlx1MDM4Nlx1MDM4Nlx1MDM4OFx1MDM4YVx1MDM4Y1x1MDM4Y1x1MDM4ZVx1MDNhMVx1MDNhM1x1MDNjZVx1MDNkMFx1MDNkNlx1MDNkYVx1MDNkYSIKLSAgICAgICAgKyJcdTAzZGNcdTAzZGNcdTAzZGVcdTAzZGVcdTAzZTBcdTAzZTBcdTAzZTJcdTAzZjNcdTA0MDFcdTA0MGNcdTA0MGVcdTA0NGZcdTA0NTFcdTA0NWMiCi0gICAgICAgICsiXHUwNDVlXHUwNDgxXHUwNDkwXHUwNGM0XHUwNGM3XHUwNGM4XHUwNGNiXHUwNGNjXHUwNGQwXHUwNGViXHUwNGVlXHUwNGY1XHUwNGY4XHUwNGY5IgotICAgICAgICArIlx1MDUzMVx1MDU1Nlx1MDU1OVx1MDU1OVx1MDU2MVx1MDU4Nlx1MDVkMFx1MDVlYVx1MDVmMFx1MDVmMlx1MDYyMVx1MDYzYVx1MDY0MVx1MDY0YSIKLSAgICAgICAgKyJcdTA2NzFcdTA2YjdcdTA2YmFcdTA2YmVcdTA2YzBcdTA2Y2VcdTA2ZDBcdTA2ZDNcdTA2ZDVcdTA2ZDVcdTA2ZTVcdTA2ZTZcdTA5MDVcdTA5MzkiCi0gICAgICAgICsiXHUwOTNkXHUwOTNkXHUwOTU4XHUwOTYxXHUwOTg1XHUwOThjXHUwOThmXHUwOTkwXHUwOTkzXHUwOWE4XHUwOWFhXHUwOWIwXHUwOWIyXHUwOWIyIgotICAgICAgICArIlx1MDliNlx1MDliOVx1MDlkY1x1MDlkZFx1MDlkZlx1MDllMVx1MDlmMFx1MDlmMVx1MGEwNVx1MGEwYVx1MGEwZlx1MGExMFx1MGExM1x1MGEyOCIKLSAgICAgICAgKyJcdTBhMmFcdTBhMzBcdTBhMzJcdTBhMzNcdTBhMzVcdTBhMzZcdTBhMzhcdTBhMzlcdTBhNTlcdTBhNWNcdTBhNWVcdTBhNWVcdTBhNzJcdTBhNzQiCi0gICAgICAgICsiXHUwYTg1XHUwYThiXHUwYThkXHUwYThkXHUwYThmXHUwYTkxXHUwYTkzXHUwYWE4XHUwYWFhXHUwYWIwXHUwYWIyXHUwYWIzXHUwYWI1XHUwYWI5IgotICAgICAgICArIlx1MGFiZFx1MGFiZFx1MGFlMFx1MGFlMFx1MGIwNVx1MGIwY1x1MGIwZlx1MGIxMFx1MGIxM1x1MGIyOFx1MGIyYVx1MGIzMFx1MGIzMlx1MGIzMyIKLSAgICAgICAgKyJcdTBiMzZcdTBiMzlcdTBiM2RcdTBiM2RcdTBiNWNcdTBiNWRcdTBiNWZcdTBiNjFcdTBiODVcdTBiOGFcdTBiOGVcdTBiOTBcdTBiOTJcdTBiOTUiCi0gICAgICAgICsiXHUwYjk5XHUwYjlhXHUwYjljXHUwYjljXHUwYjllXHUwYjlmXHUwYmEzXHUwYmE0XHUwYmE4XHUwYmFhXHUwYmFlXHUwYmI1XHUwYmI3XHUwYmI5IgotICAgICAgICArIlx1MGMwNVx1MGMwY1x1MGMwZVx1MGMxMFx1MGMxMlx1MGMyOFx1MGMyYVx1MGMzM1x1MGMzNVx1MGMzOVx1MGM2MFx1MGM2MVx1MGM4NVx1MGM4YyIKLSAgICAgICAgKyJcdTBjOGVcdTBjOTBcdTBjOTJcdTBjYThcdTBjYWFcdTBjYjNcdTBjYjVcdTBjYjlcdTBjZGVcdTBjZGVcdTBjZTBcdTBjZTFcdTBkMDVcdTBkMGMiCi0gICAgICAgICsiXHUwZDBlXHUwZDEwXHUwZDEyXHUwZDI4XHUwZDJhXHUwZDM5XHUwZDYwXHUwZDYxXHUwZTAxXHUwZTJlXHUwZTMwXHUwZTMwXHUwZTMyXHUwZTMzIgotICAgICAgICArIlx1MGU0MFx1MGU0NVx1MGU4MVx1MGU4Mlx1MGU4NFx1MGU4NFx1MGU4N1x1MGU4OFx1MGU4YVx1MGU4YVx1MGU4ZFx1MGU4ZFx1MGU5NFx1MGU5NyIKLSAgICAgICAgKyJcdTBlOTlcdTBlOWZcdTBlYTFcdTBlYTNcdTBlYTVcdTBlYTVcdTBlYTdcdTBlYTdcdTBlYWFcdTBlYWJcdTBlYWRcdTBlYWVcdTBlYjBcdTBlYjAiCi0gICAgICAgICsiXHUwZWIyXHUwZWIzXHUwZWJkXHUwZWJkXHUwZWMwXHUwZWM0XHUwZjQwXHUwZjQ3XHUwZjQ5XHUwZjY5XHUxMGEwXHUxMGM1XHUxMGQwXHUxMGY2IgotICAgICAgICArIlx1MTEwMFx1MTEwMFx1MTEwMlx1MTEwM1x1MTEwNVx1MTEwN1x1MTEwOVx1MTEwOVx1MTEwYlx1MTEwY1x1MTEwZVx1MTExMlx1MTEzY1x1MTEzYyIKLSAgICAgICAgKyJcdTExM2VcdTExM2VcdTExNDBcdTExNDBcdTExNGNcdTExNGNcdTExNGVcdTExNGVcdTExNTBcdTExNTBcdTExNTRcdTExNTVcdTExNTlcdTExNTkiCi0gICAgICAgICsiXHUxMTVmXHUxMTYxXHUxMTYzXHUxMTYzXHUxMTY1XHUxMTY1XHUxMTY3XHUxMTY3XHUxMTY5XHUxMTY5XHUxMTZkXHUxMTZlXHUxMTcyXHUxMTczIgotICAgICAgICArIlx1MTE3NVx1MTE3NVx1MTE5ZVx1MTE5ZVx1MTFhOFx1MTFhOFx1MTFhYlx1MTFhYlx1MTFhZVx1MTFhZlx1MTFiN1x1MTFiOFx1MTFiYVx1MTFiYSIKLSAgICAgICAgKyJcdTExYmNcdTExYzJcdTExZWJcdTExZWJcdTExZjBcdTExZjBcdTExZjlcdTExZjlcdTFlMDBcdTFlOWJcdTFlYTBcdTFlZjlcdTFmMDBcdTFmMTUiCi0gICAgICAgICsiXHUxZjE4XHUxZjFkXHUxZjIwXHUxZjQ1XHUxZjQ4XHUxZjRkXHUxZjUwXHUxZjU3XHUxZjU5XHUxZjU5XHUxZjViXHUxZjViXHUxZjVkXHUxZjVkIgotICAgICAgICArIlx1MWY1Zlx1MWY3ZFx1MWY4MFx1MWZiNFx1MWZiNlx1MWZiY1x1MWZiZVx1MWZiZVx1MWZjMlx1MWZjNFx1MWZjNlx1MWZjY1x1MWZkMFx1MWZkMyIKLSAgICAgICAgKyJcdTFmZDZcdTFmZGJcdTFmZTBcdTFmZWNcdTFmZjJcdTFmZjRcdTFmZjZcdTFmZmNcdTIxMjZcdTIxMjZcdTIxMmFcdTIxMmJcdTIxMmVcdTIxMmUiCi0gICAgICAgICsiXHUyMTgwXHUyMTgyXHUzMDA3XHUzMDA3XHUzMDIxXHUzMDI5XHUzMDQxXHUzMDk0XHUzMGExXHUzMGZhXHUzMTA1XHUzMTJjXHU0ZTAwXHU5ZmE1IgotICAgICAgICArIlx1YWMwMFx1ZDdhMyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJR0lUUyA9Ci0gICAgICAgICJcdTAwMzBcdTAwMzlcdTA2NjBcdTA2NjlcdTA2RjBcdTA2RjlcdTA5NjZcdTA5NkZcdTA5RTZcdTA5RUZcdTBBNjZcdTBBNkZcdTBBRTZcdTBBRUYiCi0gICAgICAgICsiXHUwQjY2XHUwQjZGXHUwQkU3XHUwQkVGXHUwQzY2XHUwQzZGXHUwQ0U2XHUwQ0VGXHUwRDY2XHUwRDZGXHUwRTUwXHUwRTU5XHUwRUQwXHUwRUQ5IgotICAgICAgICArIlx1MEYyMFx1MEYyOSI7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JFQURNRS50eHQgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZjExNjcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotVGhpcyBpcyBhbiBpc29sYXRlZCBkaXJlY3RvcnkgdGhhdCB3YXMgdGFrZW4gZnJvbSB0aGUKLUFwYWNoZSBYZXJjZXMtSiAyLjAgcHJvamVjdC4KLQotSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBtb2RpZmljYXRpb25zOgotCi0oMSkgYSBjaGFuZ2UgaW4gbmFtZXNwYWNlLgotKDIpIHRoZSBhZGRpdGlvbiBvZiBhIFNjaGVtYVJlZ3VsYXJFeHByZXNzaW9uIGNsYXNzIGZvciBmYXN0Ci0gICAgZGV0ZWN0aW9uIG9mIE5DTkFNRSwgZXRjLgotCi1ObyB4YmVhbiBjb2RlIG91dHNpZGUgdGhpcyBkaXJlY3Rvcnkgb3Igb3RoZXIgZGlyZWN0b3JpZXMgd2l0aAotc2ltaWxhciBSRUFETUUgbm90aWNlcyB3YXMgdGFrZW4gZnJvbSBBcGFjaGUuCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JFVXRpbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SRVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJjNzE2OC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JFVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OwotCi1pbXBvcnQgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUkVVdGlsIHsKLSAgICBwcml2YXRlIFJFVXRpbCgpIHsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IGNvbXBvc2VGcm9tU3Vycm9nYXRlcyhpbnQgaGlnaCwgaW50IGxvdykgewotICAgICAgICByZXR1cm4gMHgxMDAwMCArICgoaGlnaC0weGQ4MDApPDwxMCkgKyBsb3ctMHhkYzAwOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzTG93U3Vycm9nYXRlKGludCBjaCkgewotICAgICAgICByZXR1cm4gKGNoICYgMHhmYzAwKSA9PSAweGRjMDA7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNIaWdoU3Vycm9nYXRlKGludCBjaCkgewotICAgICAgICByZXR1cm4gKGNoICYgMHhmYzAwKSA9PSAweGQ4MDA7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZWNvbXBvc2VUb1N1cnJvZ2F0ZXMoaW50IGNoKSB7Ci0gICAgICAgIGNoYXJbXSBjaHMgPSBuZXcgY2hhclsyXTsKLSAgICAgICAgY2ggLT0gMHgxMDAwMDsKLSAgICAgICAgY2hzWzBdID0gKGNoYXIpKChjaD4+MTApKzB4ZDgwMCk7Ci0gICAgICAgIGNoc1sxXSA9IChjaGFyKSgoY2gmMHgzZmYpKzB4ZGMwMCk7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNocyk7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBzdWJzdHJpbmcoQ2hhcmFjdGVySXRlcmF0b3IgaXRlcmF0b3IsIGludCBiZWdpbiwgaW50IGVuZCkgewotICAgICAgICBjaGFyW10gc3JjID0gbmV3IGNoYXJbZW5kLWJlZ2luXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgc3JjLmxlbmd0aDsgIGkgKyspCi0gICAgICAgICAgICBzcmNbaV0gPSBpdGVyYXRvci5zZXRJbmRleChpK2JlZ2luKTsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoc3JjKTsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IGdldE9wdGlvblZhbHVlKGludCBjaCkgewotICAgICAgICBpbnQgcmV0ID0gMDsKLSAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgIGNhc2UgJ2knOgotICAgICAgICAgICAgcmV0ID0gUmVndWxhckV4cHJlc3Npb24uSUdOT1JFX0NBU0U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICdtJzoKLSAgICAgICAgICAgIHJldCA9IFJlZ3VsYXJFeHByZXNzaW9uLk1VTFRJUExFX0xJTkVTOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICByZXQgPSBSZWd1bGFyRXhwcmVzc2lvbi5TSU5HTEVfTElORTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ3gnOgotICAgICAgICAgICAgcmV0ID0gUmVndWxhckV4cHJlc3Npb24uRVhURU5ERURfQ09NTUVOVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ3UnOgotICAgICAgICAgICAgcmV0ID0gUmVndWxhckV4cHJlc3Npb24uVVNFX1VOSUNPREVfQ0FURUdPUlk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICd3JzoKLSAgICAgICAgICAgIHJldCA9IFJlZ3VsYXJFeHByZXNzaW9uLlVOSUNPREVfV09SRF9CT1VOREFSWTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ0YnOgotICAgICAgICAgICAgcmV0ID0gUmVndWxhckV4cHJlc3Npb24uUFJPSElCSVRfRklYRURfU1RSSU5HX09QVElNSVpBVElPTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ0gnOgotICAgICAgICAgICAgcmV0ID0gUmVndWxhckV4cHJlc3Npb24uUFJPSElCSVRfSEVBRF9DSEFSQUNURVJfT1BUSU1JWkFUSU9OOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnWCc6Ci0gICAgICAgICAgICByZXQgPSBSZWd1bGFyRXhwcmVzc2lvbi5YTUxTQ0hFTUFfTU9ERTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJywnOgotICAgICAgICAgICAgcmV0ID0gUmVndWxhckV4cHJlc3Npb24uU1BFQ0lBTF9DT01NQTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IHBhcnNlT3B0aW9ucyhTdHJpbmcgb3B0cykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG9wdHMgPT0gbnVsbCkgIHJldHVybiAwOwotICAgICAgICBpbnQgb3B0aW9ucyA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IG9wdHMubGVuZ3RoKCk7ICBpICsrKSB7Ci0gICAgICAgICAgICBpbnQgdiA9IGdldE9wdGlvblZhbHVlKG9wdHMuY2hhckF0KGkpKTsKLSAgICAgICAgICAgIGlmICh2ID09IDApCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJVbmtub3duIE9wdGlvbjogIitvcHRzLnN1YnN0cmluZyhpKSwgLTEpOwotICAgICAgICAgICAgb3B0aW9ucyB8PSB2OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvcHRpb25zOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgY3JlYXRlT3B0aW9uU3RyaW5nKGludCBvcHRpb25zKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoOSk7Ci0gICAgICAgIGlmICgob3B0aW9ucyAmIFJlZ3VsYXJFeHByZXNzaW9uLlBST0hJQklUX0ZJWEVEX1NUUklOR19PUFRJTUlaQVRJT04pICE9IDApCi0gICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpJ0YnKTsKLSAgICAgICAgaWYgKChvcHRpb25zICYgUmVndWxhckV4cHJlc3Npb24uUFJPSElCSVRfSEVBRF9DSEFSQUNURVJfT1BUSU1JWkFUSU9OKSAhPSAwKQotICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSdIJyk7Ci0gICAgICAgIGlmICgob3B0aW9ucyAmIFJlZ3VsYXJFeHByZXNzaW9uLlhNTFNDSEVNQV9NT0RFKSAhPSAwKQotICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSdYJyk7Ci0gICAgICAgIGlmICgob3B0aW9ucyAmIFJlZ3VsYXJFeHByZXNzaW9uLklHTk9SRV9DQVNFKSAhPSAwKQotICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSdpJyk7Ci0gICAgICAgIGlmICgob3B0aW9ucyAmIFJlZ3VsYXJFeHByZXNzaW9uLk1VTFRJUExFX0xJTkVTKSAhPSAwKQotICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSdtJyk7Ci0gICAgICAgIGlmICgob3B0aW9ucyAmIFJlZ3VsYXJFeHByZXNzaW9uLlNJTkdMRV9MSU5FKSAhPSAwKQotICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSdzJyk7Ci0gICAgICAgIGlmICgob3B0aW9ucyAmIFJlZ3VsYXJFeHByZXNzaW9uLlVTRV9VTklDT0RFX0NBVEVHT1JZKSAhPSAwKQotICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSd1Jyk7Ci0gICAgICAgIGlmICgob3B0aW9ucyAmIFJlZ3VsYXJFeHByZXNzaW9uLlVOSUNPREVfV09SRF9CT1VOREFSWSkgIT0gMCkKLSAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcikndycpOwotICAgICAgICBpZiAoKG9wdGlvbnMgJiBSZWd1bGFyRXhwcmVzc2lvbi5FWFRFTkRFRF9DT01NRU5UKSAhPSAwKQotICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSd4Jyk7Ci0gICAgICAgIGlmICgob3B0aW9ucyAmIFJlZ3VsYXJFeHByZXNzaW9uLlNQRUNJQUxfQ09NTUEpICE9IDApCi0gICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpJywnKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCkuaW50ZXJuKCk7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgc3RhdGljIFN0cmluZyBzdHJpcEV4dGVuZGVkQ29tbWVudChTdHJpbmcgcmVnZXgpIHsKLSAgICAgICAgaW50IGxlbiA9IHJlZ2V4Lmxlbmd0aCgpOwotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4pOwotICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgICAgd2hpbGUgKG9mZnNldCA8IGxlbikgewotICAgICAgICAgICAgaW50IGNoID0gcmVnZXguY2hhckF0KG9mZnNldCsrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzIGEgd2hpdGUgc3BhY2UuCi0gICAgICAgICAgICBpZiAoY2ggPT0gJ1x0JyB8fCBjaCA9PSAnXG4nIHx8IGNoID09ICdcZicgfHwgY2ggPT0gJ1xyJyB8fCBjaCA9PSAnICcpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnIycpIHsgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzIGNocmFjdGVycyBiZXR3ZWVuICcjJyBhbmQgYSBsaW5lIGVuZC4KLSAgICAgICAgICAgICAgICB3aGlsZSAob2Zmc2V0IDwgbGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoID0gcmVnZXguY2hhckF0KG9mZnNldCsrKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICdccicgfHwgY2ggPT0gJ1xuJykKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IG5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RyaXBzIGFuIGVzY2FwZWQgd2hpdGUgc3BhY2UuCi0gICAgICAgICAgICBpZiAoY2ggPT0gJ1xcJyAmJiBvZmZzZXQgPCBsZW4pIHsKLSAgICAgICAgICAgICAgICBpZiAoKG5leHQgPSByZWdleC5jaGFyQXQob2Zmc2V0KSkgPT0gJyMnCi0gICAgICAgICAgICAgICAgICAgIHx8IG5leHQgPT0gJ1x0JyB8fCBuZXh0ID09ICdcbicgfHwgbmV4dCA9PSAnXGYnCi0gICAgICAgICAgICAgICAgICAgIHx8IG5leHQgPT0gJ1xyJyB8fCBuZXh0ID09ICcgJykgewotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKChjaGFyKW5leHQpOwotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlciBlc2NhcGVkIGNoYXJhY3Rlci4KLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgoY2hhciknXFwnKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgoY2hhciluZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzIGlzLgotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpY2gpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAvKioKLSAgICAgKiBTYW1wbGUgZW50cnkuCi0gICAgICogPGRpdj5Vc2FnZTogPEtCRD5vcmcuYXBhY2hlLnhlcmNlcy51dGlscy5yZWdleC5SRVV0aWwgJmx0O3JlZ2V4Jmd0OyAmbHQ7c3RyaW5nJmd0OzwvS0JEPjwvZGl2PgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKLSAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIG9wdGlvbnMgPSAiIjsKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXQgPSBudWxsOwotICAgICAgICAgICAgaWYoIGFyZ3YubGVuZ3RoID09IDAgKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiRXJyb3I6VXNhZ2U6IGphdmEgUkVVdGlsIC1pfC1tfC1zfC11fC13fC1YIHJlZ3VsYXJFeHByZXNzaW9uIFN0cmluZyIgKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCggMCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgYXJndi5sZW5ndGg7ICBpICsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZ3ZbaV0ubGVuZ3RoKCkgPT0gMCB8fCBhcmd2W2ldLmNoYXJBdCgwKSAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBhcmd2W2ldOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0YXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGFyZ3ZbaV07Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVW5uZWNlc3Nhcnk6ICIrYXJndltpXSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmd2W2ldLmVxdWFscygiLWkiKSkgewotICAgICAgICAgICAgICAgICAgICBvcHRpb25zICs9ICJpIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3ZbaV0uZXF1YWxzKCItbSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgKz0gIm0iOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndltpXS5lcXVhbHMoIi1zIikpIHsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyArPSAicyI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmd2W2ldLmVxdWFscygiLXUiKSkgewotICAgICAgICAgICAgICAgICAgICBvcHRpb25zICs9ICJ1IjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3ZbaV0uZXF1YWxzKCItdyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgKz0gInciOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndltpXS5lcXVhbHMoIi1YIikpIHsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyArPSAiWCI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVbmtub3duIG9wdGlvbjogIithcmd2W2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBSZWd1bGFyRXhwcmVzc2lvbiByZWcgPSBuZXcgUmVndWxhckV4cHJlc3Npb24ocGF0dGVybiwgb3B0aW9ucyk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlZ3VsYXJFeHByZXNzaW9uOiAiK3JlZyk7Ci0gICAgICAgICAgICBNYXRjaCBtYXRjaCA9IG5ldyBNYXRjaCgpOwotICAgICAgICAgICAgcmVnLm1hdGNoZXModGFyZ2V0LCBtYXRjaCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBtYXRjaC5nZXROdW1iZXJPZkdyb3VwcygpOyAgaSArKykgewotICAgICAgICAgICAgICAgIGlmIChpID09IDAgKSAgU3lzdGVtLm91dC5wcmludCgiTWF0Y2hlZCByYW5nZSBmb3IgdGhlIHdob2xlIHBhdHRlcm46ICIpOwotICAgICAgICAgICAgICAgIGVsc2UgU3lzdGVtLm91dC5wcmludCgiWyIraSsiXTogIik7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoLmdldEJlZ2lubmluZyhpKSA8IDApCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLTEiKTsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChtYXRjaC5nZXRCZWdpbm5pbmcoaSkrIiwgIittYXRjaC5nZXRFbmQoaSkrIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXCIiK21hdGNoLmdldENhcHR1cmVkVGV4dChpKSsiXCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSB7Ci0gICAgICAgICAgICBpZiAocGF0dGVybiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigib3JnLmFwYWNoZS54ZXJjZXMudXRpbHMucmVnZXguUGFyc2VFeGNlcHRpb246ICIrcGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW5kZW50ID0gIiAgICAgICAgIjsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oaW5kZW50K3BhdHRlcm4pOwotICAgICAgICAgICAgICAgIGludCBsb2MgPSBwZS5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChsb2MgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50KGluZGVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IGxvYzsgIGkgKyspICBTeXN0ZW0uZXJyLnByaW50KCItIik7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiXiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IENBQ0hFU0laRSA9IDIwOwotICAgIHN0YXRpYyBmaW5hbCBSZWd1bGFyRXhwcmVzc2lvbltdIHJlZ2V4Q2FjaGUgPSBuZXcgUmVndWxhckV4cHJlc3Npb25bQ0FDSEVTSVpFXTsKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgUmVndWxhckV4cHJlc3Npb24gaW5zdGFuY2UuCi0gICAgICogVGhpcyBtZXRob2QgY2FjaGVzIGNyZWF0ZWQgaW5zdGFuY2VzLgotICAgICAqCi0gICAgICogQHNlZXEgUmVndWxhckV4cHJlc3Npb24jUmVndWxhckV4cHJlc3Npb24oamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlZ3VsYXJFeHByZXNzaW9uIGNyZWF0ZVJlZ2V4KFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgb3B0aW9ucykKLSAgICAgICAgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgUmVndWxhckV4cHJlc3Npb24gcmUgPSBudWxsOwotICAgICAgICBpbnQgaW50T3B0aW9ucyA9IFJFVXRpbC5wYXJzZU9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoUkVVdGlsLnJlZ2V4Q2FjaGUpIHsKLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBSRVV0aWwuQ0FDSEVTSVpFOyAgaSArKykgewotICAgICAgICAgICAgICAgIFJlZ3VsYXJFeHByZXNzaW9uIGNhY2hlZCA9IFJFVXRpbC5yZWdleENhY2hlW2ldOwotICAgICAgICAgICAgICAgIGlmIChjYWNoZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2FjaGVkLmVxdWFscyhwYXR0ZXJuLCBpbnRPcHRpb25zKSkgewotICAgICAgICAgICAgICAgICAgICByZSA9IGNhY2hlZDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoaSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoUkVVdGlsLnJlZ2V4Q2FjaGUsIDAsIFJFVXRpbC5yZWdleENhY2hlLCAxLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgUkVVdGlsLnJlZ2V4Q2FjaGVbMF0gPSByZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uKHBhdHRlcm4sIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoUkVVdGlsLnJlZ2V4Q2FjaGUsIDAsIFJFVXRpbC5yZWdleENhY2hlLCAxLCBSRVV0aWwuQ0FDSEVTSVpFLTEpOwotICAgICAgICAgICAgICAgIFJFVXRpbC5yZWdleENhY2hlWzBdID0gcmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHNlZSBSZWd1bGFyRXhwcmVzc2lvbiNtYXRjaGVzKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIHJlZ2V4LCBTdHJpbmcgdGFyZ2V0KSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gUkVVdGlsLmNyZWF0ZVJlZ2V4KHJlZ2V4LCBudWxsKS5tYXRjaGVzKHRhcmdldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAc2VlIFJlZ3VsYXJFeHByZXNzaW9uI21hdGNoZXMoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgcmVnZXgsIFN0cmluZyBvcHRpb25zLCBTdHJpbmcgdGFyZ2V0KSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gUkVVdGlsLmNyZWF0ZVJlZ2V4KHJlZ2V4LCBvcHRpb25zKS5tYXRjaGVzKHRhcmdldCk7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBxdW90ZU1ldGEoU3RyaW5nIGxpdGVyYWwpIHsKLSAgICAgICAgaW50IGxlbiA9IGxpdGVyYWwubGVuZ3RoKCk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBsZW47ICBpICsrKSB7Ci0gICAgICAgICAgICBpbnQgY2ggPSBsaXRlcmFsLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmICgiLiorP3tbKCl8XFxeJCIuaW5kZXhPZihjaCkgPj0gMCkgewotICAgICAgICAgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGkrKGxlbi1pKSoyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSAgYnVmZmVyLmFwcGVuZChsaXRlcmFsLnN1YnN0cmluZygwLCBpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpJ1xcJyk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgoY2hhciljaCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpY2gpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWZmZXIgIT0gbnVsbCA/IGJ1ZmZlci50b1N0cmluZygpIDogbGl0ZXJhbDsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBzdGF0aWMgdm9pZCBkdW1wU3RyaW5nKFN0cmluZyB2KSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHYubGVuZ3RoKCk7ICBpICsrKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KEludGVnZXIudG9IZXhTdHJpbmcodi5jaGFyQXQoaSkpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAiKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JhbmdlVG9rZW4uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUmFuZ2VUb2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDJiYmFhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUmFuZ2VUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNoYXJhY3RlciBjbGFzcyBzdWNoIGFzIFthLXpdIG9yIGEgcGVyaW9kLgotICovCi1maW5hbCBjbGFzcyBSYW5nZVRva2VuIGV4dGVuZHMgVG9rZW4gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0KLSAgICBpbnRbXSByYW5nZXM7Ci0gICAgYm9vbGVhbiBzb3J0ZWQ7Ci0gICAgYm9vbGVhbiBjb21wYWN0ZWQ7Ci0gICAgUmFuZ2VUb2tlbiBpY2FzZUNhY2hlID0gbnVsbDsKLSAgICBpbnRbXSBtYXAgPSBudWxsOwotICAgIGludCBub25NYXBJbmRleDsKLQotICAgIFJhbmdlVG9rZW4oaW50IHR5cGUpIHsKLSAgICAgICAgc3VwZXIodHlwZSk7Ci0gICAgICAgIHRoaXMuc2V0U29ydGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBSQU5HRSBvciBOUkFOR0UKLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgdGhpcy5pY2FzZUNhY2hlID0gbnVsbDsKLSAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIlRva2VuI2FkZFJhbmdlKCk6ICIrc3RhcnQrIiAiK2VuZCk7Ci0gICAgICAgIGludCByMSwgcjI7Ci0gICAgICAgIGlmIChzdGFydCA8PSBlbmQpIHsKLSAgICAgICAgICAgIHIxID0gc3RhcnQ7Ci0gICAgICAgICAgICByMiA9IGVuZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHIxID0gZW5kOwotICAgICAgICAgICAgcjIgPSBzdGFydDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBwb3MgPSAwOwotICAgICAgICBpZiAodGhpcy5yYW5nZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5yYW5nZXMgPSBuZXcgaW50WzJdOwotICAgICAgICAgICAgdGhpcy5yYW5nZXNbMF0gPSByMTsKLSAgICAgICAgICAgIHRoaXMucmFuZ2VzWzFdID0gcjI7Ci0gICAgICAgICAgICB0aGlzLnNldFNvcnRlZCh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBvcyA9IHRoaXMucmFuZ2VzLmxlbmd0aDsKLSAgICAgICAgICAgIGlmICh0aGlzLnJhbmdlc1twb3MtMV0rMSA9PSByMSkgewotICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VzW3Bvcy0xXSA9IHIyOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludFtdIHRlbXAgPSBuZXcgaW50W3BvcysyXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGhpcy5yYW5nZXMsIDAsIHRlbXAsIDAsIHBvcyk7Ci0gICAgICAgICAgICB0aGlzLnJhbmdlcyA9IHRlbXA7Ci0gICAgICAgICAgICBpZiAodGhpcy5yYW5nZXNbcG9zLTFdID49IHIxKQotICAgICAgICAgICAgICAgIHRoaXMuc2V0U29ydGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHRoaXMucmFuZ2VzW3BvcysrXSA9IHIxOwotICAgICAgICAgICAgdGhpcy5yYW5nZXNbcG9zXSA9IHIyOwotICAgICAgICAgICAgaWYgKCF0aGlzLnNvcnRlZCkKLSAgICAgICAgICAgICAgICB0aGlzLnNvcnRSYW5nZXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1NvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc29ydGVkOwotICAgIH0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgc2V0U29ydGVkKGJvb2xlYW4gc29ydCkgewotICAgICAgICB0aGlzLnNvcnRlZCA9IHNvcnQ7Ci0gICAgICAgIGlmICghc29ydCkgIHRoaXMuY29tcGFjdGVkID0gZmFsc2U7Ci0gICAgfQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0NvbXBhY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFjdGVkOwotICAgIH0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgc2V0Q29tcGFjdGVkKCkgewotICAgICAgICB0aGlzLmNvbXBhY3RlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc29ydFJhbmdlcygpIHsKLSAgICAgICAgaWYgKHRoaXMuaXNTb3J0ZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKHRoaXMucmFuZ2VzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJEbyBzb3J0aW5nOiAiK3RoaXMucmFuZ2VzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1YmJsZSBzb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaHk/IC0tIEluIG1hbnkgY2FzZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMucmFuZ2VzIGhhcyBmZXcgZWxlbWVudHMuCi0gICAgICAgIGZvciAoaW50IGkgPSB0aGlzLnJhbmdlcy5sZW5ndGgtNDsgIGkgPj0gMDsgIGkgLT0gMikgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7ICBqIDw9IGk7ICBqICs9IDIpIHsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5yYW5nZXNbal0gPiB0aGlzLnJhbmdlc1tqKzJdCi0gICAgICAgICAgICAgICAgICAgIHx8IHRoaXMucmFuZ2VzW2pdID09IHRoaXMucmFuZ2VzW2orMl0gJiYgdGhpcy5yYW5nZXNbaisxXSA+IHRoaXMucmFuZ2VzW2orM10pIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHRtcDsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gdGhpcy5yYW5nZXNbaisyXTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yYW5nZXNbaisyXSA9IHRoaXMucmFuZ2VzW2pdOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmdlc1tqXSA9IHRtcDsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gdGhpcy5yYW5nZXNbaiszXTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yYW5nZXNbaiszXSA9IHRoaXMucmFuZ2VzW2orMV07Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VzW2orMV0gPSB0bXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc2V0U29ydGVkKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRoaXMucmFuZ2VzIGlzIHNvcnRlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21wYWN0UmFuZ2VzKCkgewotICAgICAgICBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0gICAgICAgIGlmICh0aGlzLnJhbmdlcyA9PSBudWxsIHx8IHRoaXMucmFuZ2VzLmxlbmd0aCA8PSAyKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZiAodGhpcy5pc0NvbXBhY3RlZCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpbnQgYmFzZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5kZXggb2Ygd3JpdGluZyBwb2ludAotICAgICAgICBpbnQgdGFyZ2V0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5kZXggb2YgcHJvY2Vzc2luZyBwb2ludAotCi0gICAgICAgIHdoaWxlICh0YXJnZXQgPCB0aGlzLnJhbmdlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgIGlmIChiYXNlICE9IHRhcmdldCkgewotICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VzW2Jhc2VdID0gdGhpcy5yYW5nZXNbdGFyZ2V0KytdOwotICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VzW2Jhc2UrMV0gPSB0aGlzLnJhbmdlc1t0YXJnZXQrK107Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICB0YXJnZXQgKz0gMjsKLSAgICAgICAgICAgIGludCBiYXNlZW5kID0gdGhpcy5yYW5nZXNbYmFzZSsxXTsKLSAgICAgICAgICAgIHdoaWxlICh0YXJnZXQgPCB0aGlzLnJhbmdlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBpZiAoYmFzZWVuZCsxIDwgdGhpcy5yYW5nZXNbdGFyZ2V0XSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaWYgKGJhc2VlbmQrMSA9PSB0aGlzLnJhbmdlc1t0YXJnZXRdKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVG9rZW4jY29tcGFjdFJhbmdlcygpOiBDb21wYWN0aW9uOiBbIit0aGlzLnJhbmdlc1tiYXNlXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCAiK3RoaXMucmFuZ2VzW2Jhc2UrMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0sIFsiK3RoaXMucmFuZ2VzW3RhcmdldF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwgIit0aGlzLnJhbmdlc1t0YXJnZXQrMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0gLT4gWyIrdGhpcy5yYW5nZXNbYmFzZV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwgIit0aGlzLnJhbmdlc1t0YXJnZXQrMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yYW5nZXNbYmFzZSsxXSA9IHRoaXMucmFuZ2VzW3RhcmdldCsxXTsKLSAgICAgICAgICAgICAgICAgICAgYmFzZWVuZCA9IHRoaXMucmFuZ2VzW2Jhc2UrMV07Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmFzZWVuZCA+PSB0aGlzLnJhbmdlc1t0YXJnZXQrMV0pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJUb2tlbiNjb21wYWN0UmFuZ2VzKCk6IENvbXBhY3Rpb246IFsiK3RoaXMucmFuZ2VzW2Jhc2VdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIsICIrdGhpcy5yYW5nZXNbYmFzZSsxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiXSwgWyIrdGhpcy5yYW5nZXNbdGFyZ2V0XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCAiK3RoaXMucmFuZ2VzW3RhcmdldCsxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiXSAtPiBbIit0aGlzLnJhbmdlc1tiYXNlXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCAiK3RoaXMucmFuZ2VzW2Jhc2UrMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ICs9IDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiYXNlZW5kIDwgdGhpcy5yYW5nZXNbdGFyZ2V0KzFdKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVG9rZW4jY29tcGFjdFJhbmdlcygpOiBDb21wYWN0aW9uOiBbIit0aGlzLnJhbmdlc1tiYXNlXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCAiK3RoaXMucmFuZ2VzW2Jhc2UrMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0sIFsiK3RoaXMucmFuZ2VzW3RhcmdldF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwgIit0aGlzLnJhbmdlc1t0YXJnZXQrMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0gLT4gWyIrdGhpcy5yYW5nZXNbYmFzZV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwgIit0aGlzLnJhbmdlc1t0YXJnZXQrMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yYW5nZXNbYmFzZSsxXSA9IHRoaXMucmFuZ2VzW3RhcmdldCsxXTsKLSAgICAgICAgICAgICAgICAgICAgYmFzZWVuZCA9IHRoaXMucmFuZ2VzW2Jhc2UrMV07Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUb2tlbiNjb21wYWN0UmFuZ2VzKCk6IEludGVybmVsIEVycm9yOiBbIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArdGhpcy5yYW5nZXNbYmFzZV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIsIit0aGlzLnJhbmdlc1tiYXNlKzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiXSBbIit0aGlzLnJhbmdlc1t0YXJnZXRdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCIrdGhpcy5yYW5nZXNbdGFyZ2V0KzFdKyJdIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAvLyB3aGlsZQotICAgICAgICAgICAgYmFzZSArPSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJhc2UgIT0gdGhpcy5yYW5nZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICBpbnRbXSByZXN1bHQgPSBuZXcgaW50W2Jhc2VdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0aGlzLnJhbmdlcywgMCwgcmVzdWx0LCAwLCBiYXNlKTsKLSAgICAgICAgICAgIHRoaXMucmFuZ2VzID0gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc2V0Q29tcGFjdGVkKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbWVyZ2VSYW5nZXMoVG9rZW4gdG9rZW4pIHsKLSAgICAgICAgUmFuZ2VUb2tlbiB0b2sgPSAoUmFuZ2VUb2tlbil0b2tlbjsKLSAgICAgICAgdGhpcy5zb3J0UmFuZ2VzKCk7Ci0gICAgICAgIHRvay5zb3J0UmFuZ2VzKCk7Ci0gICAgICAgIGlmICh0b2sucmFuZ2VzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHRoaXMuaWNhc2VDYWNoZSA9IG51bGw7Ci0gICAgICAgIHRoaXMuc2V0U29ydGVkKHRydWUpOwotICAgICAgICBpZiAodGhpcy5yYW5nZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5yYW5nZXMgPSBuZXcgaW50W3Rvay5yYW5nZXMubGVuZ3RoXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodG9rLnJhbmdlcywgMCwgdGhpcy5yYW5nZXMsIDAsIHRvay5yYW5nZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbnRbXSByZXN1bHQgPSBuZXcgaW50W3RoaXMucmFuZ2VzLmxlbmd0aCt0b2sucmFuZ2VzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwLCBqID0gMCwgayA9IDA7ICBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoIHx8IGogPCB0b2sucmFuZ2VzLmxlbmd0aDspIHsKLSAgICAgICAgICAgIGlmIChpID49IHRoaXMucmFuZ2VzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHJlc3VsdFtrKytdID0gdG9rLnJhbmdlc1tqKytdOwotICAgICAgICAgICAgICAgIHJlc3VsdFtrKytdID0gdG9rLnJhbmdlc1tqKytdOwotICAgICAgICAgICAgfSBlbHNlIGlmIChqID49IHRvay5yYW5nZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0W2srK10gPSB0aGlzLnJhbmdlc1tpKytdOwotICAgICAgICAgICAgICAgIHJlc3VsdFtrKytdID0gdGhpcy5yYW5nZXNbaSsrXTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rLnJhbmdlc1tqXSA8IHRoaXMucmFuZ2VzW2ldCi0gICAgICAgICAgICAgICAgICAgICAgIHx8IHRvay5yYW5nZXNbal0gPT0gdGhpcy5yYW5nZXNbaV0gJiYgdG9rLnJhbmdlc1tqKzFdIDwgdGhpcy5yYW5nZXNbaSsxXSkgewotICAgICAgICAgICAgICAgIHJlc3VsdFtrKytdID0gdG9rLnJhbmdlc1tqKytdOwotICAgICAgICAgICAgICAgIHJlc3VsdFtrKytdID0gdG9rLnJhbmdlc1tqKytdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHRbaysrXSA9IHRoaXMucmFuZ2VzW2krK107Ci0gICAgICAgICAgICAgICAgcmVzdWx0W2srK10gPSB0aGlzLnJhbmdlc1tpKytdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRoaXMucmFuZ2VzID0gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHN1YnRyYWN0UmFuZ2VzKFRva2VuIHRva2VuKSB7Ci0gICAgICAgIGlmICh0b2tlbi50eXBlID09IE5SQU5HRSkgewotICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3RSYW5nZXModG9rZW4pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFJhbmdlVG9rZW4gdG9rID0gKFJhbmdlVG9rZW4pdG9rZW47Ci0gICAgICAgIGlmICh0b2sucmFuZ2VzID09IG51bGwgfHwgdGhpcy5yYW5nZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgdGhpcy5pY2FzZUNhY2hlID0gbnVsbDsKLSAgICAgICAgdGhpcy5zb3J0UmFuZ2VzKCk7Ci0gICAgICAgIHRoaXMuY29tcGFjdFJhbmdlcygpOwotICAgICAgICB0b2suc29ydFJhbmdlcygpOwotICAgICAgICB0b2suY29tcGFjdFJhbmdlcygpOwotCi0gICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJUb2tlbiNzdWJzdHJhY3RSYW5nZXMoKTogRW50cnk6ICIrdGhpcy5yYW5nZXMubGVuZ3RoKyIsICIrdG9rLnJhbmdlcy5sZW5ndGgpOwotCi0gICAgICAgIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbdGhpcy5yYW5nZXMubGVuZ3RoK3Rvay5yYW5nZXMubGVuZ3RoXTsKLSAgICAgICAgaW50IHdwID0gMCwgc3JjID0gMCwgc3ViID0gMDsKLSAgICAgICAgd2hpbGUgKHNyYyA8IHRoaXMucmFuZ2VzLmxlbmd0aCAmJiBzdWIgPCB0b2sucmFuZ2VzLmxlbmd0aCkgewotICAgICAgICAgICAgaW50IHNyY2JlZ2luID0gdGhpcy5yYW5nZXNbc3JjXTsKLSAgICAgICAgICAgIGludCBzcmNlbmQgPSB0aGlzLnJhbmdlc1tzcmMrMV07Ci0gICAgICAgICAgICBpbnQgc3ViYmVnaW4gPSB0b2sucmFuZ2VzW3N1Yl07Ci0gICAgICAgICAgICBpbnQgc3ViZW5kID0gdG9rLnJhbmdlc1tzdWIrMV07Ci0gICAgICAgICAgICBpZiAoc3JjZW5kIDwgc3ViYmVnaW4pIHsgICAgICAgICAgICAvLyBOb3Qgb3ZlcmxhcHBlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjOiBvLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWI6ICAgICAgICAgby0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzOiBvLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSBzdWIKLSAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSB0aGlzLnJhbmdlc1tzcmMrK107Ci0gICAgICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gdGhpcy5yYW5nZXNbc3JjKytdOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNlbmQgPj0gc3ViYmVnaW4KLSAgICAgICAgICAgICAgICAgICAgICAgJiYgc3JjYmVnaW4gPD0gc3ViZW5kKSB7IC8vIE92ZXJsYXBwZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzogICAgby0tLS0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ViOiAgby0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWI6ICAgICAgby0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWI6ICAgICAgICAgIG8tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ViOiAgby0tLS0tLS0tLS0tLW8KLSAgICAgICAgICAgICAgICBpZiAoc3ViYmVnaW4gPD0gc3JjYmVnaW4gJiYgc3JjZW5kIDw9IHN1YmVuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjOiAgICBvLS0tLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWI6ICBvLS0tLS0tLS0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzOiBlbXB0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2Ugc3ViCi0gICAgICAgICAgICAgICAgICAgIHNyYyArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViYmVnaW4gPD0gc3JjYmVnaW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzogICAgby0tLS0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ViOiAgby0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXM6ICAgICAgIG8tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlIHNyYyg9cmVzKQotICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmdlc1tzcmNdID0gc3ViZW5kKzE7Ci0gICAgICAgICAgICAgICAgICAgIHN1YiArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjZW5kIDw9IHN1YmVuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjOiAgICBvLS0tLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWI6ICAgICAgICAgIG8tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzOiAgICBvLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSBzdWIKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gc3JjYmVnaW47Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHN1YmJlZ2luLTE7Ci0gICAgICAgICAgICAgICAgICAgIHNyYyArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmM6ICAgIG8tLS0tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1YjogICAgICBvLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlczogICAgby1vICAgIG8tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2Ugc3JjKD1yaWdodCByZXMpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHNyY2JlZ2luOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSBzdWJiZWdpbi0xOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmdlc1tzcmNdID0gc3ViZW5kKzE7Ci0gICAgICAgICAgICAgICAgICAgIHN1YiArPSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViZW5kIDwgc3JjYmVnaW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCBvdmVybGFwcGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmM6ICAgICAgICAgIG8tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1Yjogby0tLS1vCi0gICAgICAgICAgICAgICAgc3ViICs9IDI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUb2tlbiNzdWJ0cmFjdFJhbmdlcygpOiBJbnRlcm5hbCBFcnJvcjogWyIrdGhpcy5yYW5nZXNbc3JjXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCIrdGhpcy5yYW5nZXNbc3JjKzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJdIC0gWyIrdG9rLnJhbmdlc1tzdWJdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIsIit0b2sucmFuZ2VzW3N1YisxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiXSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChzcmMgPCB0aGlzLnJhbmdlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHRoaXMucmFuZ2VzW3NyYysrXTsKLSAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHRoaXMucmFuZ2VzW3NyYysrXTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnJhbmdlcyA9IG5ldyBpbnRbd3BdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdCwgMCwgdGhpcy5yYW5nZXMsIDAsIHdwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMucmFuZ2VzIGlzIHNvcnRlZCBhbmQgY29tcGFjdGVkLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0b2sgSWdub3JlIHdoZXRoZXIgaXQgaXMgTlJBTkdFIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnRlcnNlY3RSYW5nZXMoVG9rZW4gdG9rZW4pIHsKLSAgICAgICAgUmFuZ2VUb2tlbiB0b2sgPSAoUmFuZ2VUb2tlbil0b2tlbjsKLSAgICAgICAgaWYgKHRvay5yYW5nZXMgPT0gbnVsbCB8fCB0aGlzLnJhbmdlcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB0aGlzLmljYXNlQ2FjaGUgPSBudWxsOwotICAgICAgICB0aGlzLnNvcnRSYW5nZXMoKTsKLSAgICAgICAgdGhpcy5jb21wYWN0UmFuZ2VzKCk7Ci0gICAgICAgIHRvay5zb3J0UmFuZ2VzKCk7Ci0gICAgICAgIHRvay5jb21wYWN0UmFuZ2VzKCk7Ci0KLSAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFt0aGlzLnJhbmdlcy5sZW5ndGgrdG9rLnJhbmdlcy5sZW5ndGhdOwotICAgICAgICBpbnQgd3AgPSAwLCBzcmMxID0gMCwgc3JjMiA9IDA7Ci0gICAgICAgIHdoaWxlIChzcmMxIDwgdGhpcy5yYW5nZXMubGVuZ3RoICYmIHNyYzIgPCB0b2sucmFuZ2VzLmxlbmd0aCkgewotICAgICAgICAgICAgaW50IHNyYzFiZWdpbiA9IHRoaXMucmFuZ2VzW3NyYzFdOwotICAgICAgICAgICAgaW50IHNyYzFlbmQgPSB0aGlzLnJhbmdlc1tzcmMxKzFdOwotICAgICAgICAgICAgaW50IHNyYzJiZWdpbiA9IHRvay5yYW5nZXNbc3JjMl07Ci0gICAgICAgICAgICBpbnQgc3JjMmVuZCA9IHRvay5yYW5nZXNbc3JjMisxXTsKLSAgICAgICAgICAgIGlmIChzcmMxZW5kIDwgc3JjMmJlZ2luKSB7ICAgICAgICAgIC8vIE5vdCBvdmVybGFwcGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMxOiBvLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMyOiAgICAgICAgIG8tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlczogIGVtcHR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSBzcmMyCi0gICAgICAgICAgICAgICAgc3JjMSArPSAyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzcmMxZW5kID49IHNyYzJiZWdpbgotICAgICAgICAgICAgICAgICAgICAgICAmJiBzcmMxYmVnaW4gPD0gc3JjMmVuZCkgeyAvLyBPdmVybGFwcGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMxOiAgICBvLS0tLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMyOiAgby0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMyOiAgICAgIG8tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjMjogICAgICAgICAgby0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMyOiAgby0tLS0tLS0tLS0tLW8KLSAgICAgICAgICAgICAgICBpZiAoc3JjMmJlZ2luIDw9IHNyYzJiZWdpbiAmJiBzcmMxZW5kIDw9IHNyYzJlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzE6ICAgIG8tLS0tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzI6ICBvLS0tLS0tLS0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzOiAgICAgby0tLS0tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2Ugc3JjMgotICAgICAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSBzcmMxYmVnaW47Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHNyYzFlbmQ7Ci0gICAgICAgICAgICAgICAgICAgIHNyYzEgKz0gMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNyYzJiZWdpbiA8PSBzcmMxYmVnaW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzE6ICAgIG8tLS0tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzI6ICBvLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlczogICAgIG8tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlIHRoZSByZXN0IG9mIHNyYzEKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gc3JjMWJlZ2luOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSBzcmMyZW5kOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmdlc1tzcmMxXSA9IHNyYzJlbmQrMTsKLSAgICAgICAgICAgICAgICAgICAgc3JjMiArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjMWVuZCA8PSBzcmMyZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMxOiAgICBvLS0tLS0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMyOiAgICAgICAgICBvLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlczogICAgICAgICAgIG8tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlIHNyYzIKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gc3JjMmJlZ2luOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSBzcmMxZW5kOwotICAgICAgICAgICAgICAgICAgICBzcmMxICs9IDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzE6ICAgIG8tLS0tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzI6ICAgICAgby0tLS1vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXM6ICAgICAgIG8tLS0tbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2UgdGhlIHJlc3Qgb2Ygc3JjMQotICAgICAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSBzcmMyYmVnaW47Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHNyYzJlbmQ7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VzW3NyYzFdID0gc3JjMmVuZCsxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjMmVuZCA8IHNyYzFiZWdpbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IG92ZXJsYXBwZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzE6ICAgICAgICAgIG8tLS0tLW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzI6IG8tLS0tbwotICAgICAgICAgICAgICAgIHNyYzIgKz0gMjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRva2VuI2ludGVyc2VjdFJhbmdlcygpOiBJbnRlcm5hbCBFcnJvcjogWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArdGhpcy5yYW5nZXNbc3JjMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwiK3RoaXMucmFuZ2VzW3NyYzErMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0gJiBbIit0b2sucmFuZ2VzW3NyYzJdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIsIit0b2sucmFuZ2VzW3NyYzIrMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoc3JjMSA8IHRoaXMucmFuZ2VzLmxlbmd0aCkgewotICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gdGhpcy5yYW5nZXNbc3JjMSsrXTsKLSAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHRoaXMucmFuZ2VzW3NyYzErK107Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5yYW5nZXMgPSBuZXcgaW50W3dwXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHQsIDAsIHRoaXMucmFuZ2VzLCAwLCB3cCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnJhbmdlcyBpcyBzb3J0ZWQgYW5kIGNvbXBhY3RlZC4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBmb3IgUkFOR0U6IENyZWF0ZXMgY29tcGxlbWVudC4KLSAgICAgKiBmb3IgTlJBTkdFOiBDcmVhdGVzIHRoZSBzYW1lIG1lYW5pbmcgUkFOR0UuCi0gICAgICovCi0gICAgc3RhdGljIFRva2VuIGNvbXBsZW1lbnRSYW5nZXMoVG9rZW4gdG9rZW4pIHsKLSAgICAgICAgaWYgKHRva2VuLnR5cGUgIT0gUkFOR0UgJiYgdG9rZW4udHlwZSAhPSBOUkFOR0UpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUb2tlbiNjb21wbGVtZW50UmFuZ2VzKCk6IG11c3QgYmUgUkFOR0U6ICIrdG9rZW4udHlwZSk7Ci0gICAgICAgIFJhbmdlVG9rZW4gdG9rID0gKFJhbmdlVG9rZW4pdG9rZW47Ci0gICAgICAgIHRvay5zb3J0UmFuZ2VzKCk7Ci0gICAgICAgIHRvay5jb21wYWN0UmFuZ2VzKCk7Ci0gICAgICAgIGludCBsZW4gPSB0b2sucmFuZ2VzLmxlbmd0aCsyOwotICAgICAgICBpZiAodG9rLnJhbmdlc1swXSA9PSAwKQotICAgICAgICAgICAgbGVuIC09IDI7Ci0gICAgICAgIGludCBsYXN0ID0gdG9rLnJhbmdlc1t0b2sucmFuZ2VzLmxlbmd0aC0xXTsKLSAgICAgICAgaWYgKGxhc3QgPT0gVVRGMTZfTUFYKQotICAgICAgICAgICAgbGVuIC09IDI7Ci0gICAgICAgIFJhbmdlVG9rZW4gcmV0ID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgcmV0LnJhbmdlcyA9IG5ldyBpbnRbbGVuXTsKLSAgICAgICAgaW50IHdwID0gMDsKLSAgICAgICAgaWYgKHRvay5yYW5nZXNbMF0gPiAwKSB7Ci0gICAgICAgICAgICByZXQucmFuZ2VzW3dwKytdID0gMDsKLSAgICAgICAgICAgIHJldC5yYW5nZXNbd3ArK10gPSB0b2sucmFuZ2VzWzBdLTE7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDE7ICBpIDwgdG9rLnJhbmdlcy5sZW5ndGgtMjsgIGkgKz0gMikgewotICAgICAgICAgICAgcmV0LnJhbmdlc1t3cCsrXSA9IHRvay5yYW5nZXNbaV0rMTsKLSAgICAgICAgICAgIHJldC5yYW5nZXNbd3ArK10gPSB0b2sucmFuZ2VzW2krMV0tMTsKLSAgICAgICAgfQotICAgICAgICBpZiAobGFzdCAhPSBVVEYxNl9NQVgpIHsKLSAgICAgICAgICAgIHJldC5yYW5nZXNbd3ArK10gPSBsYXN0KzE7Ci0gICAgICAgICAgICByZXQucmFuZ2VzW3dwXSA9IFVURjE2X01BWDsKLSAgICAgICAgfQotICAgICAgICByZXQuc2V0Q29tcGFjdGVkKCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgc3luY2hyb25pemVkIFJhbmdlVG9rZW4gZ2V0Q2FzZUluc2Vuc2l0aXZlVG9rZW4oKSB7Ci0gICAgICAgIGlmICh0aGlzLmljYXNlQ2FjaGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmljYXNlQ2FjaGU7Ci0gICAgICAgICAgICAKLSAgICAgICAgUmFuZ2VUb2tlbiB1cHBlcnMgPSB0aGlzLnR5cGUgPT0gVG9rZW4uUkFOR0UgPyBUb2tlbi5jcmVhdGVSYW5nZSgpIDogVG9rZW4uY3JlYXRlTlJhbmdlKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgIGkgKz0gMikgewotICAgICAgICAgICAgZm9yIChpbnQgY2ggPSB0aGlzLnJhbmdlc1tpXTsgIGNoIDw9IHRoaXMucmFuZ2VzW2krMV07ICBjaCArKykgewotICAgICAgICAgICAgICAgIGlmIChjaCA+IDB4ZmZmZikKLSAgICAgICAgICAgICAgICAgICAgdXBwZXJzLmFkZFJhbmdlKGNoLCBjaCk7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgdWNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKTsKLSAgICAgICAgICAgICAgICAgICAgdXBwZXJzLmFkZFJhbmdlKHVjaCwgdWNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgUmFuZ2VUb2tlbiBsb3dlcnMgPSB0aGlzLnR5cGUgPT0gVG9rZW4uUkFOR0UgPyBUb2tlbi5jcmVhdGVSYW5nZSgpIDogVG9rZW4uY3JlYXRlTlJhbmdlKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHVwcGVycy5yYW5nZXMubGVuZ3RoOyAgaSArPSAyKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBjaCA9IHVwcGVycy5yYW5nZXNbaV07ICBjaCA8PSB1cHBlcnMucmFuZ2VzW2krMV07ICBjaCArKykgewotICAgICAgICAgICAgICAgIGlmIChjaCA+IDB4ZmZmZikKLSAgICAgICAgICAgICAgICAgICAgbG93ZXJzLmFkZFJhbmdlKGNoLCBjaCk7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgdWNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKTsKLSAgICAgICAgICAgICAgICAgICAgbG93ZXJzLmFkZFJhbmdlKHVjaCwgdWNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbG93ZXJzLm1lcmdlUmFuZ2VzKHVwcGVycyk7Ci0gICAgICAgIGxvd2Vycy5tZXJnZVJhbmdlcyh0aGlzKTsKLSAgICAgICAgbG93ZXJzLmNvbXBhY3RSYW5nZXMoKTsKLQotICAgICAgICB0aGlzLmljYXNlQ2FjaGUgPSBsb3dlcnM7Ci0gICAgICAgIHJldHVybiBsb3dlcnM7Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wUmFuZ2VzKCkgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50KCJSQU5HRTogIik7Ci0gICAgICAgIGlmICh0aGlzLnJhbmdlcyA9PSBudWxsKQotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgTlVMTCIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7ICBpICs9IDIpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnQoIlsiK3RoaXMucmFuZ2VzW2ldKyIsIit0aGlzLnJhbmdlc1tpKzFdKyJdICIpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiIik7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBtYXRjaChpbnQgY2gpIHsKLSAgICAgICAgaWYgKHRoaXMubWFwID09IG51bGwpICB0aGlzLmNyZWF0ZU1hcCgpOwotICAgICAgICBib29sZWFuIHJldDsKLSAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBSQU5HRSkgewotICAgICAgICAgICAgaWYgKGNoIDwgTUFQU0laRSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMubWFwW2NoLzMyXSAmICgxPDwoY2gmMHgxZikpKSAhPSAwOwotICAgICAgICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gdGhpcy5ub25NYXBJbmRleDsgIGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7ICBpICs9IDIpIHsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5yYW5nZXNbaV0gPD0gY2ggJiYgY2ggPD0gdGhpcy5yYW5nZXNbaSsxXSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoY2ggPCBNQVBTSVpFKQotICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5tYXBbY2gvMzJdICYgKDE8PChjaCYweDFmKSkpID09IDA7Ci0gICAgICAgICAgICByZXQgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHRoaXMubm9uTWFwSW5kZXg7ICBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyAgaSArPSAyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMucmFuZ2VzW2ldIDw9IGNoICYmIGNoIDw9IHRoaXMucmFuZ2VzW2krMV0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVBTSVpFID0gMjU2OwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVNYXAoKSB7Ci0gICAgICAgIGludCBhc2l6ZSA9IE1BUFNJWkUvMzI7ICAgICAgICAgICAgICAgICAvLyAzMiBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYGludCcuCi0gICAgICAgIHRoaXMubWFwID0gbmV3IGludFthc2l6ZV07Ci0gICAgICAgIHRoaXMubm9uTWFwSW5kZXggPSB0aGlzLnJhbmdlcy5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IGFzaXplOyAgaSArKykgIHRoaXMubWFwW2ldID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyAgaSArPSAyKSB7Ci0gICAgICAgICAgICBpbnQgcyA9IHRoaXMucmFuZ2VzW2ldOwotICAgICAgICAgICAgaW50IGUgPSB0aGlzLnJhbmdlc1tpKzFdOwotICAgICAgICAgICAgaWYgKHMgPCBNQVBTSVpFKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHM7ICBqIDw9IGUgJiYgaiA8IE1BUFNJWkU7ICBqICsrKQotICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcFtqLzMyXSB8PSAxPDwoaiYweDFmKTsgLy8gcyYweDFmIDogMC0zMQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLm5vbk1hcEluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlID49IE1BUFNJWkUpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm5vbk1hcEluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL2ZvciAoaW50IGkgPSAwOyAgaSA8IGFzaXplOyAgaSArKykgIFN5c3RlbS5lcnIucHJpbnRsbigiTWFwOiAiK0ludGVnZXIudG9TdHJpbmcodGhpcy5tYXBbaV0sIDE2KSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgb3B0aW9ucykgewotICAgICAgICBTdHJpbmcgcmV0OwotICAgICAgICBpZiAodGhpcy50eXBlID09IFJBTkdFKSB7Ci0gICAgICAgICAgICBpZiAodGhpcyA9PSBUb2tlbi50b2tlbl9kb3QpCi0gICAgICAgICAgICAgICAgcmV0ID0gIi4iOwotICAgICAgICAgICAgZWxzZSBpZiAodGhpcyA9PSBUb2tlbi50b2tlbl8wdG85KQotICAgICAgICAgICAgICAgIHJldCA9ICJcXGQiOwotICAgICAgICAgICAgZWxzZSBpZiAodGhpcyA9PSBUb2tlbi50b2tlbl93b3JkY2hhcnMpCi0gICAgICAgICAgICAgICAgcmV0ID0gIlxcdyI7Ci0gICAgICAgICAgICBlbHNlIGlmICh0aGlzID09IFRva2VuLnRva2VuX3NwYWNlcykKLSAgICAgICAgICAgICAgICByZXQgPSAiXFxzIjsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlsiKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7ICBpICs9IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChvcHRpb25zICYgUmVndWxhckV4cHJlc3Npb24uU1BFQ0lBTF9DT01NQSkgIT0gMCAmJiBpID4gMCkgIHNiLmFwcGVuZCgiLCIpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yYW5nZXNbaV0gPT0gdGhpcy5yYW5nZXNbaSsxXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGVzY2FwZUNoYXJJbkNoYXJDbGFzcyh0aGlzLnJhbmdlc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGVzY2FwZUNoYXJJbkNoYXJDbGFzcyh0aGlzLnJhbmdlc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSctJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZXNjYXBlQ2hhckluQ2hhckNsYXNzKHRoaXMucmFuZ2VzW2krMV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIl0iKTsKLSAgICAgICAgICAgICAgICByZXQgPSBzYi50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHRoaXMgPT0gVG9rZW4udG9rZW5fbm90XzB0bzkpCi0gICAgICAgICAgICAgICAgcmV0ID0gIlxcRCI7Ci0gICAgICAgICAgICBlbHNlIGlmICh0aGlzID09IFRva2VuLnRva2VuX25vdF93b3JkY2hhcnMpCi0gICAgICAgICAgICAgICAgcmV0ID0gIlxcVyI7Ci0gICAgICAgICAgICBlbHNlIGlmICh0aGlzID09IFRva2VuLnRva2VuX25vdF9zcGFjZXMpCi0gICAgICAgICAgICAgICAgcmV0ID0gIlxcUyI7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJbXiIpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgIGkgKz0gMikgewotICAgICAgICAgICAgICAgICAgICBpZiAoKG9wdGlvbnMgJiBSZWd1bGFyRXhwcmVzc2lvbi5TUEVDSUFMX0NPTU1BKSAhPSAwICYmIGkgPiAwKSAgc2IuYXBwZW5kKCIsIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJhbmdlc1tpXSA9PSB0aGlzLnJhbmdlc1tpKzFdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZXNjYXBlQ2hhckluQ2hhckNsYXNzKHRoaXMucmFuZ2VzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZXNjYXBlQ2hhckluQ2hhckNsYXNzKHRoaXMucmFuZ2VzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJy0nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChlc2NhcGVDaGFySW5DaGFyQ2xhc3ModGhpcy5yYW5nZXNbaSsxXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXSIpOwotICAgICAgICAgICAgICAgIHJldCA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXNjYXBlQ2hhckluQ2hhckNsYXNzKGludCBjaCkgewotICAgICAgICBTdHJpbmcgcmV0OwotICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgY2FzZSAnWyc6ICBjYXNlICddJzogIGNhc2UgJy0nOiAgY2FzZSAnXic6Ci0gICAgICAgICAgY2FzZSAnLCc6ICBjYXNlICdcXCc6Ci0gICAgICAgICAgICByZXQgPSAiXFwiKyhjaGFyKWNoOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnXGYnOiAgcmV0ID0gIlxcZiI7ICBicmVhazsKLSAgICAgICAgICBjYXNlICdcbic6ICByZXQgPSAiXFxuIjsgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ1xyJzogIHJldCA9ICJcXHIiOyAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnXHQnOiAgcmV0ID0gIlxcdCI7ICBicmVhazsKLSAgICAgICAgICBjYXNlIDB4MWI6ICByZXQgPSAiXFxlIjsgIGJyZWFrOwotICAgICAgICAgIC8vY2FzZSAweDBiOiAgcmV0ID0gIlxcdiI7ICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKGNoIDwgMHgyMCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmUgPSAiMCIrSW50ZWdlci50b0hleFN0cmluZyhjaCk7Ci0gICAgICAgICAgICAgICAgcmV0ID0gIlxceCIrcHJlLnN1YnN0cmluZyhwcmUubGVuZ3RoKCktMiwgcHJlLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMHgxMDAwMCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmUgPSAiMCIrSW50ZWdlci50b0hleFN0cmluZyhjaCk7Ci0gICAgICAgICAgICAgICAgcmV0ID0gIlxcdiIrcHJlLnN1YnN0cmluZyhwcmUubGVuZ3RoKCktNiwgcHJlLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHJldCA9ICIiKyhjaGFyKWNoOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JlZ2V4UGFyc2VyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JlZ2V4UGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMDlkOTUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SZWdleFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzMyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleDsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBBIFJlZ3VsYXIgRXhwcmVzc2lvbiBQYXJzZXIuCi0gKi8KLWNsYXNzIFJlZ2V4UGFyc2VyIHsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfQ0hBUiA9IDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUX0VPRiA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUX09SID0gMjsgICAgICAgICAgICAgICAgICAvLyAnfCcKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfU1RBUiA9IDM7ICAgICAgICAgICAgICAgIC8vICcqJwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9QTFVTID0gNDsgICAgICAgICAgICAgICAgLy8gJysnCi0gICAgc3RhdGljIGZpbmFsIGludCBUX1FVRVNUSU9OID0gNTsgICAgICAgICAgICAvLyAnPycKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfTFBBUkVOID0gNjsgICAgICAgICAgICAgIC8vICcoJwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9SUEFSRU4gPSA3OyAgICAgICAgICAgICAgLy8gJyknCi0gICAgc3RhdGljIGZpbmFsIGludCBUX0RPVCA9IDg7ICAgICAgICAgICAgICAgICAvLyAnLicKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfTEJSQUNLRVQgPSA5OyAgICAgICAgICAgIC8vICdbJwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9CQUNLU09MSURVUyA9IDEwOyAgICAgICAgLy8gJ1wnCi0gICAgc3RhdGljIGZpbmFsIGludCBUX0NBUkVUID0gMTE7ICAgICAgICAgICAgICAvLyAnXicKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfRE9MTEFSID0gMTI7ICAgICAgICAgICAgIC8vICckJwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9MUEFSRU4yID0gMTM7ICAgICAgICAgICAgLy8gJyg/OicKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfTE9PS0FIRUFEID0gMTQ7ICAgICAgICAgIC8vICcoPz0nCi0gICAgc3RhdGljIGZpbmFsIGludCBUX05FR0FUSVZFTE9PS0FIRUFEID0gMTU7ICAvLyAnKD8hJwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9MT09LQkVISU5EID0gMTY7ICAgICAgICAgLy8gJyg/PD0nCi0gICAgc3RhdGljIGZpbmFsIGludCBUX05FR0FUSVZFTE9PS0JFSElORCA9IDE3OyAvLyAnKD88IScKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfSU5ERVBFTkRFTlQgPSAxODsgICAgICAgIC8vICcoPz4nCi0gICAgc3RhdGljIGZpbmFsIGludCBUX1NFVF9PUEVSQVRJT05TID0gMTk7ICAgICAvLyAnKD9bJwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9QT1NJWF9DSEFSQ0xBU1NfU1RBUlQgPSAyMDsgLy8gJ1s6JyBpbiBhIGNoYXJhY3RlciBjbGFzcwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9DT01NRU5UID0gMjE7ICAgICAgICAgICAgLy8gJyg/IycKLSAgICBzdGF0aWMgZmluYWwgaW50IFRfTU9ESUZJRVJTID0gMjI7ICAgICAgICAgIC8vICcoPycgW1wtLGEteixBLVpdCi0gICAgc3RhdGljIGZpbmFsIGludCBUX0NPTkRJVElPTiA9IDIzOyAgICAgICAgICAvLyAnKD8oJwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9YTUxTQ0hFTUFfQ0NfU1VCVFJBQ1RJT04gPSAyNDsgLy8gJy1bJyBpbiBhIGNoYXJhY3RlciBjbGFzcwotCi0gICAgc3RhdGljIGNsYXNzIFJlZmVyZW5jZVBvc2l0aW9uIHsKLSAgICAgICAgaW50IHJlZk51bWJlcjsKLSAgICAgICAgaW50IHBvc2l0aW9uOwotICAgICAgICBSZWZlcmVuY2VQb3NpdGlvbihpbnQgbiwgaW50IHBvcykgewotICAgICAgICAgICAgdGhpcy5yZWZOdW1iZXIgPSBuOwotICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCBvZmZzZXQ7Ci0gICAgU3RyaW5nIHJlZ2V4OwotICAgIGludCByZWdleGxlbjsKLSAgICBpbnQgb3B0aW9uczsKLSAgICBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZXM7Ci0gICAgaW50IGNoYXJkYXRhOwotICAgIGludCBuZXh0dG9rZW47Ci0gICAgc3RhdGljIHByb3RlY3RlZCBmaW5hbCBpbnQgU19OT1JNQUwgPSAwOwotICAgIHN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgaW50IFNfSU5CUkFDS0VUUyA9IDE7Ci0gICAgc3RhdGljIHByb3RlY3RlZCBmaW5hbCBpbnQgU19JTlhCUkFDS0VUUyA9IDI7Ci0gICAgaW50IGNvbnRleHQgPSBTX05PUk1BTDsKLSAgICBpbnQgcGFyZW5udW1iZXIgPSAxOwotICAgIGJvb2xlYW4gaGFzQmFja1JlZmVyZW5jZXM7Ci0gICAgVmVjdG9yIHJlZmVyZW5jZXMgPSBudWxsOwotCi0gICAgcHVibGljIFJlZ2V4UGFyc2VyKCkgewotICAgICAgICB0aGlzLnNldExvY2FsZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLSAgICB9Ci0gICAgcHVibGljIFJlZ2V4UGFyc2VyKExvY2FsZSBsb2NhbGUpIHsKLSAgICAgICAgdGhpcy5zZXRMb2NhbGUobG9jYWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy5yZXNvdXJjZXMgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5tZXNzYWdlIiwgbG9jYWxlKTsKLSAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkluc3RhbGxhdGlvbiBQcm9ibGVtPz8/ICBDb3VsZG4ndCBsb2FkIG1lc3NhZ2VzOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArbXJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmaW5hbCBQYXJzZUV4Y2VwdGlvbiBleChTdHJpbmcga2V5LCBpbnQgbG9jKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUGFyc2VFeGNlcHRpb24odGhpcy5yZXNvdXJjZXMuZ2V0U3RyaW5nKGtleSksIGxvYyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzU2V0KGludCBmbGFnKSB7Ci0gICAgICAgIHJldHVybiAodGhpcy5vcHRpb25zICYgZmxhZykgPT0gZmxhZzsKLSAgICB9Ci0KLSAgICBzeW5jaHJvbml6ZWQgVG9rZW4gcGFyc2UoU3RyaW5nIHJlZ2V4LCBpbnQgb3B0aW9ucykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLSAgICAgICAgdGhpcy5vZmZzZXQgPSAwOwotICAgICAgICB0aGlzLnNldENvbnRleHQoU19OT1JNQUwpOwotICAgICAgICB0aGlzLnBhcmVubnVtYmVyID0gMTsKLSAgICAgICAgdGhpcy5oYXNCYWNrUmVmZXJlbmNlcyA9IGZhbHNlOwotICAgICAgICB0aGlzLnJlZ2V4ID0gcmVnZXg7Ci0gICAgICAgIGlmICh0aGlzLmlzU2V0KFJlZ3VsYXJFeHByZXNzaW9uLkVYVEVOREVEX0NPTU1FTlQpKQotICAgICAgICAgICAgdGhpcy5yZWdleCA9IFJFVXRpbC5zdHJpcEV4dGVuZGVkQ29tbWVudCh0aGlzLnJlZ2V4KTsKLSAgICAgICAgdGhpcy5yZWdleGxlbiA9IHRoaXMucmVnZXgubGVuZ3RoKCk7Ci0KLQotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgVG9rZW4gcmV0ID0gdGhpcy5wYXJzZVJlZ2V4KCk7Ci0gICAgICAgIGlmICh0aGlzLm9mZnNldCAhPSB0aGlzLnJlZ2V4bGVuKQotICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wYXJzZS4xIiwgdGhpcy5vZmZzZXQpOwotICAgICAgICBpZiAodGhpcy5yZWZlcmVuY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRoaXMucmVmZXJlbmNlcy5zaXplKCk7ICBpICsrKSB7Ci0gICAgICAgICAgICAgICAgUmVmZXJlbmNlUG9zaXRpb24gcG9zaXRpb24gPSAoUmVmZXJlbmNlUG9zaXRpb24pdGhpcy5yZWZlcmVuY2VzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbm51bWJlciA8PSBwb3NpdGlvbi5yZWZOdW1iZXIpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIucGFyc2UuMiIsIHBvc2l0aW9uLnBvc2l0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICBwdWJsaWMgUmVndWxhckV4cHJlc3Npb24gY3JlYXRlUmVnZXgoU3RyaW5nIHJlZ2V4LCBpbnQgb3B0aW9ucykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgVG9rZW4gdG9rID0gdGhpcy5wYXJzZShyZWdleCwgb3B0aW9ucyk7Ci0gICAgICAgIHJldHVybiBuZXcgUmVndWxhckV4cHJlc3Npb24ocmVnZXgsIHRvaywgdGhpcy5wYXJlbm51bWJlciwgdGhpcy5oYXNCYWNrUmVmZXJlbmNlcywgb3B0aW9ucyk7Ci0gICAgfQotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRDb250ZXh0KGludCBjb24pIHsKLSAgICAgICAgdGhpcy5jb250ZXh0ID0gY29uOwotICAgIH0KLQotICAgIGZpbmFsIGludCByZWFkKCkgewotICAgICAgICByZXR1cm4gdGhpcy5uZXh0dG9rZW47Ci0gICAgfQotCi0gICAgZmluYWwgdm9pZCBuZXh0KCkgewotICAgICAgICBpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5yZWdleGxlbikgewotICAgICAgICAgICAgdGhpcy5jaGFyZGF0YSA9IC0xOwotICAgICAgICAgICAgdGhpcy5uZXh0dG9rZW4gPSBUX0VPRjsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCByZXQ7Ci0gICAgICAgIGludCBjaCA9IHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KyspOwotICAgICAgICB0aGlzLmNoYXJkYXRhID0gY2g7Ci0KLSAgICAgICAgaWYgKHRoaXMuY29udGV4dCA9PSBTX0lOQlJBQ0tFVFMpIHsKLSAgICAgICAgICAgIC8vIEluIGEgY2hhcmFjdGVyIGNsYXNzLCB0aGlzLmNoYXJkYXRhIGhhcyBvbmUgY2hhcmFjdGVyLCB0aGF0IGlzIHRvIHNheSwKLSAgICAgICAgICAgIC8vIGEgcGFpciBvZiBzdXJyb2dhdGVzIGlzIGNvbXBvc2VkIGFuZCBzdG9yZWQgdG8gdGhpcy5jaGFyZGF0YS4KLSAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgICAgIHJldCA9IFRfQkFDS1NPTElEVVM7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMucmVnZXhsZW4pCi0gICAgICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIubmV4dC4xIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgICAgICAgICAgdGhpcy5jaGFyZGF0YSA9IHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KyspOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgJy0nOgotICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2V0KFJlZ3VsYXJFeHByZXNzaW9uLlhNTFNDSEVNQV9NT0RFKQotICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm9mZnNldCA8IHRoaXMucmVnZXhsZW4gJiYgdGhpcy5yZWdleC5jaGFyQXQodGhpcy5vZmZzZXQpID09ICdbJykgewotICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCsrOwotICAgICAgICAgICAgICAgICAgICByZXQgPSBUX1hNTFNDSEVNQV9DQ19TVUJUUkFDVElPTjsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gVF9DSEFSOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgJ1snOgotICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1NldChSZWd1bGFyRXhwcmVzc2lvbi5YTUxTQ0hFTUFfTU9ERSkKLSAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5vZmZzZXQgPCB0aGlzLnJlZ2V4bGVuICYmIHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KSA9PSAnOicpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQrKzsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gVF9QT1NJWF9DSEFSQ0xBU1NfU1RBUlQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gLy8gVGhyb3VnaCBkb3duCi0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIHRoaXMub2Zmc2V0IDwgdGhpcy5yZWdleGxlbikgewotICAgICAgICAgICAgICAgICAgICBpbnQgbG93ID0gdGhpcy5yZWdleC5jaGFyQXQodGhpcy5vZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzTG93U3Vycm9nYXRlKGxvdykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcmRhdGEgPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoLCBsb3cpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0ID0gVF9DSEFSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5uZXh0dG9rZW4gPSByZXQ7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgY2FzZSAnfCc6IHJldCA9IFRfT1I7ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJyonOiByZXQgPSBUX1NUQVI7ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICcrJzogcmV0ID0gVF9QTFVTOyAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnPyc6IHJldCA9IFRfUVVFU1RJT047ICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJyknOiByZXQgPSBUX1JQQVJFTjsgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICcuJzogcmV0ID0gVF9ET1Q7ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnWyc6IHJldCA9IFRfTEJSQUNLRVQ7ICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ14nOiByZXQgPSBUX0NBUkVUOyAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICckJzogcmV0ID0gVF9ET0xMQVI7ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnKCc6Ci0gICAgICAgICAgICByZXQgPSBUX0xQQVJFTjsKLSAgICAgICAgICAgIGlmICh0aGlzLm9mZnNldCA+PSB0aGlzLnJlZ2V4bGVuKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KSAhPSAnPycpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoKyt0aGlzLm9mZnNldCA+PSB0aGlzLnJlZ2V4bGVuKQotICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIubmV4dC4yIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgICAgICBjaCA9IHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KyspOwotICAgICAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgICAgICBjYXNlICc6JzogIHJldCA9IFRfTFBBUkVOMjsgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAnPSc6ICByZXQgPSBUX0xPT0tBSEVBRDsgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJyEnOiAgcmV0ID0gVF9ORUdBVElWRUxPT0tBSEVBRDsgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICdbJzogIHJldCA9IFRfU0VUX09QRVJBVElPTlM7ICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAnPic6ICByZXQgPSBUX0lOREVQRU5ERU5UOyAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJzwnOgotICAgICAgICAgICAgICAgIGlmICh0aGlzLm9mZnNldCA+PSB0aGlzLnJlZ2V4bGVuKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLm5leHQuMiIsIHRoaXMub2Zmc2V0LTMpOwotICAgICAgICAgICAgICAgIGNoID0gdGhpcy5yZWdleC5jaGFyQXQodGhpcy5vZmZzZXQrKyk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoID09ICc9JykgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBUX0xPT0tCRUhJTkQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnIScpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gVF9ORUdBVElWRUxPT0tCRUhJTkQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIubmV4dC4zIiwgdGhpcy5vZmZzZXQtMyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJyMnOgotICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLm9mZnNldCA8IHRoaXMucmVnZXhsZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgY2ggPSB0aGlzLnJlZ2V4LmNoYXJBdCh0aGlzLm9mZnNldCsrKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICcpJykgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJyknKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLm5leHQuNCIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgICAgIHJldCA9IFRfQ09NTUVOVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJy0nIHx8ICdhJyA8PSBjaCAmJiBjaCA8PSAneicgfHwgJ0EnIDw9IGNoICYmIGNoIDw9ICdaJykgey8vIE9wdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgLS07Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IFRfTU9ESUZJRVJTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcoJykgeyAgICAgICAgIC8vIGNvbmRpdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IFRfQ09ORElUSU9OOyAgICAgICAgICAvLyB0aGlzLm9mZnNldHMgcG9pbnRzIHRoZSBuZXh0IG9mICcoJy4KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIubmV4dC4yIiwgdGhpcy5vZmZzZXQtMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgIHJldCA9IFRfQkFDS1NPTElEVVM7Ci0gICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5yZWdleGxlbikKLSAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLm5leHQuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgdGhpcy5jaGFyZGF0YSA9IHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KyspOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0ID0gVF9DSEFSOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubmV4dHRva2VuID0gcmV0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJlZ2V4IDo6PSB0ZXJtIChgfGAgdGVybSkqCi0gICAgICogdGVybSA6Oj0gZmFjdG9yKwotICAgICAqIGZhY3RvciA6Oj0gKCdeJyB8ICckJyB8ICdcQScgfCAnXFonIHwgJ1x6JyB8ICdcYicgfCAnXEInIHwgJ1w8JyB8ICdcPicKLSAgICAgKiAgICAgICAgICAgIHwgYXRvbSAoKCcqJyB8ICcrJyB8ICc/JyB8IG1pbm1heCApICc/Jz8gKT8pCi0gICAgICogICAgICAgICAgICB8ICcoPz0nIHJlZ2V4ICcpJyAgfCAnKD8hJyByZWdleCAnKScgIHwgJyg/Jmx0Oz0nIHJlZ2V4ICcpJyAgfCAnKD8mbHQ7IScgcmVnZXggJyknCi0gICAgICogYXRvbSA6Oj0gY2hhciB8ICcuJyB8IHJhbmdlIHwgJygnIHJlZ2V4ICcpJyB8ICcoPzonIHJlZ2V4ICcpJyB8ICdcJyBbMC05XQotICAgICAqICAgICAgICAgIHwgJ1x3JyB8ICdcVycgfCAnXGQnIHwgJ1xEJyB8ICdccycgfCAnXFMnIHwgY2F0ZWdvcnktYmxvY2sgCi0gICAgICovCi0gICAgVG9rZW4gcGFyc2VSZWdleCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFRva2VuIHRvayA9IHRoaXMucGFyc2VUZXJtKCk7Ci0gICAgICAgIFRva2VuIHBhcmVudCA9IG51bGw7Ci0gICAgICAgIHdoaWxlICh0aGlzLnJlYWQoKSA9PSBUX09SKSB7Ci0gICAgICAgICAgICB0aGlzLm5leHQoKTsgICAgICAgICAgICAgICAgICAgIC8vICd8JwotICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50ID0gVG9rZW4uY3JlYXRlVW5pb24oKTsKLSAgICAgICAgICAgICAgICBwYXJlbnQuYWRkQ2hpbGQodG9rKTsKLSAgICAgICAgICAgICAgICB0b2sgPSBwYXJlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0b2suYWRkQ2hpbGQodGhpcy5wYXJzZVRlcm0oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRvazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0ZXJtIDo6PSBmYWN0b3IrCi0gICAgICovCi0gICAgVG9rZW4gcGFyc2VUZXJtKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGNoID0gdGhpcy5yZWFkKCk7Ci0gICAgICAgIGlmIChjaCA9PSBUX09SIHx8IGNoID09IFRfUlBBUkVOIHx8IGNoID09IFRfRU9GKSB7Ci0gICAgICAgICAgICByZXR1cm4gVG9rZW4uY3JlYXRlRW1wdHkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFRva2VuIHRvayA9IHRoaXMucGFyc2VGYWN0b3IoKTsKLSAgICAgICAgICAgIFRva2VuIGNvbmNhdCA9IG51bGw7Ci0gICAgICAgICAgICB3aGlsZSAoKGNoID0gdGhpcy5yZWFkKCkpICE9IFRfT1IgJiYgY2ggIT0gVF9SUEFSRU4gJiYgY2ggIT0gVF9FT0YpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29uY2F0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uY2F0ID0gVG9rZW4uY3JlYXRlQ29uY2F0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmNhdC5hZGRDaGlsZCh0b2spOwotICAgICAgICAgICAgICAgICAgICB0b2sgPSBjb25jYXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbmNhdC5hZGRDaGlsZCh0aGlzLnBhcnNlRmFjdG9yKCkpOwotICAgICAgICAgICAgICAgIC8vdG9rID0gVG9rZW4uY3JlYXRlQ29uY2F0KHRvaywgdGhpcy5wYXJzZUZhY3RvcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0b2s7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUb2tlbiBwcm9jZXNzQ2FyZXQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX2xpbmViZWdpbm5pbmc7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NEb2xsYXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX2xpbmVlbmQ7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NMb29rYWhlYWQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgVG9rZW4gdG9rID0gVG9rZW4uY3JlYXRlTG9vayhUb2tlbi5MT09LQUhFQUQsIHRoaXMucGFyc2VSZWdleCgpKTsKLSAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfUlBBUkVOKSAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICB0aGlzLm5leHQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJyknCi0gICAgICAgIHJldHVybiB0b2s7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NOZWdhdGl2ZWxvb2thaGVhZCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICBUb2tlbiB0b2sgPSBUb2tlbi5jcmVhdGVMb29rKFRva2VuLk5FR0FUSVZFTE9PS0FIRUFELCB0aGlzLnBhcnNlUmVnZXgoKSk7Ci0gICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX1JQQVJFTikgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICcpJwotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzTG9va2JlaGluZCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICBUb2tlbiB0b2sgPSBUb2tlbi5jcmVhdGVMb29rKFRva2VuLkxPT0tCRUhJTkQsIHRoaXMucGFyc2VSZWdleCgpKTsKLSAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfUlBBUkVOKSAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICB0aGlzLm5leHQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJyknCi0gICAgICAgIHJldHVybiB0b2s7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NOZWdhdGl2ZWxvb2tiZWhpbmQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgVG9rZW4gdG9rID0gVG9rZW4uY3JlYXRlTG9vayhUb2tlbi5ORUdBVElWRUxPT0tCRUhJTkQsIHRoaXMucGFyc2VSZWdleCgpKTsKLSAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfUlBBUkVOKSAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICB0aGlzLm5leHQoKTsgICAgICAgICAgICAgICAgICAgIC8vICcpJwotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfQSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICByZXR1cm4gVG9rZW4udG9rZW5fc3RyaW5nYmVnaW5uaW5nOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfWigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICByZXR1cm4gVG9rZW4udG9rZW5fc3RyaW5nZW5kMjsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX3ooKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX3N0cmluZ2VuZDsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2IoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX3dvcmRlZGdlOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfQigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICByZXR1cm4gVG9rZW4udG9rZW5fbm90X3dvcmRlZGdlOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfbHQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX3dvcmRiZWdpbm5pbmc7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NCYWNrc29saWR1c19ndCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICByZXR1cm4gVG9rZW4udG9rZW5fd29yZGVuZDsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc1N0YXIoVG9rZW4gdG9rKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgaWYgKHRoaXMucmVhZCgpID09IFRfUVVFU1RJT04pIHsKLSAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICAgICAgcmV0dXJuIFRva2VuLmNyZWF0ZU5HQ2xvc3VyZSh0b2spOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHJldHVybiBUb2tlbi5jcmVhdGVDbG9zdXJlKHRvayk7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NQbHVzKFRva2VuIHRvaykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gWCsgLT4gWFgqCi0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICBpZiAodGhpcy5yZWFkKCkgPT0gVF9RVUVTVElPTikgewotICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICByZXR1cm4gVG9rZW4uY3JlYXRlQ29uY2F0KHRvaywgVG9rZW4uY3JlYXRlTkdDbG9zdXJlKHRvaykpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHJldHVybiBUb2tlbi5jcmVhdGVDb25jYXQodG9rLCBUb2tlbi5jcmVhdGVDbG9zdXJlKHRvaykpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzUXVlc3Rpb24oVG9rZW4gdG9rKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICAvLyBYPyAtPiBYfAotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgVG9rZW4gcGFyID0gVG9rZW4uY3JlYXRlVW5pb24oKTsKLSAgICAgICAgaWYgKHRoaXMucmVhZCgpID09IFRfUVVFU1RJT04pIHsKLSAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICAgICAgcGFyLmFkZENoaWxkKFRva2VuLmNyZWF0ZUVtcHR5KCkpOwotICAgICAgICAgICAgcGFyLmFkZENoaWxkKHRvayk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXIuYWRkQ2hpbGQodG9rKTsKLSAgICAgICAgICAgIHBhci5hZGRDaGlsZChUb2tlbi5jcmVhdGVFbXB0eSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFyOwotICAgIH0KLSAgICBib29sZWFuIGNoZWNrUXVlc3Rpb24oaW50IG9mZikgewotICAgICAgICByZXR1cm4gb2ZmIDwgdGhpcy5yZWdleGxlbiAmJiB0aGlzLnJlZ2V4LmNoYXJBdChvZmYpID09ICc/JzsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc1BhcmVuKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIGludCBwID0gdGhpcy5wYXJlbm51bWJlcisrOwotICAgICAgICBUb2tlbiB0b2sgPSBUb2tlbi5jcmVhdGVQYXJlbih0aGlzLnBhcnNlUmVnZXgoKSwgcCk7Ci0gICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX1JQQVJFTikgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzICcpJwotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzUGFyZW4yKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIFRva2VuIHRvayA9IFRva2VuLmNyZWF0ZVBhcmVuKHRoaXMucGFyc2VSZWdleCgpLCAwKTsKLSAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfUlBBUkVOKSAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICB0aGlzLm5leHQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcHMgJyknCi0gICAgICAgIHJldHVybiB0b2s7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NDb25kaXRpb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5vZmZzZXQgcG9pbnRzIHRoZSBuZXh0IG9mICcoJwotICAgICAgICBpZiAodGhpcy5vZmZzZXQrMSA+PSB0aGlzLnJlZ2V4bGVuKSAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuNCIsIHRoaXMub2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcnNlcyBhIGNvbmRpdGlvbi4KLSAgICAgICAgaW50IHJlZm5vID0gLTE7Ci0gICAgICAgIFRva2VuIGNvbmRpdGlvbiA9IG51bGw7Ci0gICAgICAgIGludCBjaCA9IHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KTsKLSAgICAgICAgaWYgKCcxJyA8PSBjaCAmJiBjaCA8PSAnOScpIHsKLSAgICAgICAgICAgIHJlZm5vID0gY2gtJzAnOwotICAgICAgICAgICAgdGhpcy5oYXNCYWNrUmVmZXJlbmNlcyA9IHRydWU7Ci0gICAgICAgICAgICBpZiAodGhpcy5yZWZlcmVuY2VzID09IG51bGwpICB0aGlzLnJlZmVyZW5jZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICB0aGlzLnJlZmVyZW5jZXMuYWRkRWxlbWVudChuZXcgUmVmZXJlbmNlUG9zaXRpb24ocmVmbm8sIHRoaXMub2Zmc2V0KSk7Ci0gICAgICAgICAgICB0aGlzLm9mZnNldCArKzsKLSAgICAgICAgICAgIGlmICh0aGlzLnJlZ2V4LmNoYXJBdCh0aGlzLm9mZnNldCkgIT0gJyknKSAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuMSIsIHRoaXMub2Zmc2V0KTsKLSAgICAgICAgICAgIHRoaXMub2Zmc2V0ICsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGNoID09ICc/JykgIHRoaXMub2Zmc2V0IC0tOyAvLyBQb2ludHMgJygnLgotICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICBjb25kaXRpb24gPSB0aGlzLnBhcnNlRmFjdG9yKCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbi50eXBlKSB7Ci0gICAgICAgICAgICAgIGNhc2UgVG9rZW4uTE9PS0FIRUFEOgotICAgICAgICAgICAgICBjYXNlIFRva2VuLk5FR0FUSVZFTE9PS0FIRUFEOgotICAgICAgICAgICAgICBjYXNlIFRva2VuLkxPT0tCRUhJTkQ6Ci0gICAgICAgICAgICAgIGNhc2UgVG9rZW4uTkVHQVRJVkVMT09LQkVISU5EOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIFRva2VuLkFOQ0hPUjoKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9SUEFSRU4pICB0aHJvdyBleCgicGFyc2VyLmZhY3Rvci4xIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuNSIsIHRoaXMub2Zmc2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFyc2VzIHllcy9uby1wYXR0ZXJucy4KLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIFRva2VuIHllc1BhdHRlcm4gPSB0aGlzLnBhcnNlUmVnZXgoKTsKLSAgICAgICAgVG9rZW4gbm9QYXR0ZXJuID0gbnVsbDsKLSAgICAgICAgaWYgKHllc1BhdHRlcm4udHlwZSA9PSBUb2tlbi5VTklPTikgewotICAgICAgICAgICAgaWYgKHllc1BhdHRlcm4uc2l6ZSgpICE9IDIpICB0aHJvdyBleCgicGFyc2VyLmZhY3Rvci42IiwgdGhpcy5vZmZzZXQpOwotICAgICAgICAgICAgbm9QYXR0ZXJuID0geWVzUGF0dGVybi5nZXRDaGlsZCgxKTsKLSAgICAgICAgICAgIHllc1BhdHRlcm4gPSB5ZXNQYXR0ZXJuLmdldENoaWxkKDApOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX1JQQVJFTikgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIHJldHVybiBUb2tlbi5jcmVhdGVDb25kaXRpb24ocmVmbm8sIGNvbmRpdGlvbiwgeWVzUGF0dGVybiwgbm9QYXR0ZXJuKTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc01vZGlmaWVycygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLm9mZnNldCBwb2ludHMgdGhlIG5leHQgb2YgJz8nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9kaWZpZXJzIDo6PSBbaW1zd10qICgnLScgW2ltc3ddKik/ICc6JwotICAgICAgICBpbnQgYWRkID0gMCwgbWFzayA9IDAsIGNoID0gLTE7Ci0gICAgICAgIHdoaWxlICh0aGlzLm9mZnNldCA8IHRoaXMucmVnZXhsZW4pIHsKLSAgICAgICAgICAgIGNoID0gdGhpcy5yZWdleC5jaGFyQXQodGhpcy5vZmZzZXQpOwotICAgICAgICAgICAgaW50IHYgPSBSRVV0aWwuZ2V0T3B0aW9uVmFsdWUoY2gpOwotICAgICAgICAgICAgaWYgKHYgPT0gMCkgIGJyZWFrOyAgICAgICAgICAgICAgICAgLy8gJy0nIG9yICc6Jz8KLSAgICAgICAgICAgIGFkZCB8PSB2OwotICAgICAgICAgICAgdGhpcy5vZmZzZXQgKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMucmVnZXhsZW4pICB0aHJvdyBleCgicGFyc2VyLmZhY3Rvci4yIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgIGlmIChjaCA9PSAnLScpIHsKLSAgICAgICAgICAgIHRoaXMub2Zmc2V0ICsrOwotICAgICAgICAgICAgd2hpbGUgKHRoaXMub2Zmc2V0IDwgdGhpcy5yZWdleGxlbikgewotICAgICAgICAgICAgICAgIGNoID0gdGhpcy5yZWdleC5jaGFyQXQodGhpcy5vZmZzZXQpOwotICAgICAgICAgICAgICAgIGludCB2ID0gUkVVdGlsLmdldE9wdGlvblZhbHVlKGNoKTsKLSAgICAgICAgICAgICAgICBpZiAodiA9PSAwKSAgYnJlYWs7ICAgICAgICAgICAgIC8vICc6Jz8KLSAgICAgICAgICAgICAgICBtYXNrIHw9IHY7Ci0gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5yZWdleGxlbikgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjIiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgfQotICAgICAgICBUb2tlbiB0b2s7Ci0gICAgICAgIGlmIChjaCA9PSAnOicpIHsKLSAgICAgICAgICAgIHRoaXMub2Zmc2V0ICsrOwotICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVNb2RpZmllckdyb3VwKHRoaXMucGFyc2VSZWdleCgpLCBhZGQsIG1hc2spOwotICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfUlBBUkVOKSAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyknKSB7ICAgICAgICAgICAgICAgICAvLyBzdWNoIGFzICg/LWkpCi0gICAgICAgICAgICB0aGlzLm9mZnNldCArKzsKLSAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlTW9kaWZpZXJHcm91cCh0aGlzLnBhcnNlUmVnZXgoKSwgYWRkLCBtYXNrKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmZhY3Rvci4zIiwgdGhpcy5vZmZzZXQpOwotCi0gICAgICAgIHJldHVybiB0b2s7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NJbmRlcGVuZGVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICBUb2tlbiB0b2sgPSBUb2tlbi5jcmVhdGVMb29rKFRva2VuLklOREVQRU5ERU5ULCB0aGlzLnBhcnNlUmVnZXgoKSk7Ci0gICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX1JQQVJFTikgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzICcpJwotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfYygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBjaDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNdXN0IGJlIGluIDB4MDA0MC0weDAwNWYKLSAgICAgICAgaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMucmVnZXhsZW4KLSAgICAgICAgICAgIHx8ICgoY2gyID0gdGhpcy5yZWdleC5jaGFyQXQodGhpcy5vZmZzZXQrKykpICYgMHhmZmUwKSAhPSAweDAwNDApCi0gICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmF0b20uMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIFRva2VuLmNyZWF0ZUNoYXIoY2gyLTB4NDApOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfQygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQpOwotICAgIH0KLSAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfaSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFRva2VuIHRvayA9IFRva2VuLmNyZWF0ZUNoYXIoJ2knKTsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIHJldHVybiB0b2s7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NCYWNrc29saWR1c19JKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldCk7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NCYWNrc29saWR1c19nKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIHJldHVybiBUb2tlbi5nZXRHcmFwaGVtZVBhdHRlcm4oKTsKLSAgICB9Ci0gICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX1goKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIFRva2VuLmdldENvbWJpbmluZ0NoYXJhY3RlclNlcXVlbmNlKCk7Ci0gICAgfQotICAgIFRva2VuIHByb2Nlc3NCYWNrcmVmZXJlbmNlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHJlZm51bSA9IHRoaXMuY2hhcmRhdGEtJzAnOwotICAgICAgICBUb2tlbiB0b2sgPSBUb2tlbi5jcmVhdGVCYWNrUmVmZXJlbmNlKHJlZm51bSk7Ci0gICAgICAgIHRoaXMuaGFzQmFja1JlZmVyZW5jZXMgPSB0cnVlOwotICAgICAgICBpZiAodGhpcy5yZWZlcmVuY2VzID09IG51bGwpICB0aGlzLnJlZmVyZW5jZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIHRoaXMucmVmZXJlbmNlcy5hZGRFbGVtZW50KG5ldyBSZWZlcmVuY2VQb3NpdGlvbihyZWZudW0sIHRoaXMub2Zmc2V0LTIpKTsKLSAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgIHJldHVybiB0b2s7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogZmFjdG9yIDo6PSAoJ14nIHwgJyQnIHwgJ1xBJyB8ICdcWicgfCAnXHonIHwgJ1xiJyB8ICdcQicgfCAnXDwnIHwgJ1w+JwotICAgICAqICAgICAgICAgICAgfCBhdG9tICgoJyonIHwgJysnIHwgJz8nIHwgbWlubWF4ICkgJz8nPyApPykKLSAgICAgKiAgICAgICAgICAgIHwgJyg/PScgcmVnZXggJyknICB8ICcoPyEnIHJlZ2V4ICcpJyAgfCAnKD8mbHQ7PScgcmVnZXggJyknICB8ICcoPyZsdDshJyByZWdleCAnKScKLSAgICAgKiAgICAgICAgICAgIHwgJyg/IycgW14pXSogJyknCi0gICAgICogbWlubWF4IDo6PSAneycgbWluICgnLCcgbWF4Pyk/ICd9JwotICAgICAqIG1pbiA6Oj0gWzAtOV0rCi0gICAgICogbWF4IDo6PSBbMC05XSsKLSAgICAgKi8KLSAgICBUb2tlbiBwYXJzZUZhY3RvcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7ICAgICAgICAKLSAgICAgICAgaW50IGNoID0gdGhpcy5yZWFkKCk7Ci0gICAgICAgIFRva2VuIHRvazsKLSAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgIGNhc2UgVF9DQVJFVDogICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzQ2FyZXQoKTsKLSAgICAgICAgICBjYXNlIFRfRE9MTEFSOiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0RvbGxhcigpOwotICAgICAgICAgIGNhc2UgVF9MT09LQUhFQUQ6ICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTG9va2FoZWFkKCk7Ci0gICAgICAgICAgY2FzZSBUX05FR0FUSVZFTE9PS0FIRUFEOiByZXR1cm4gdGhpcy5wcm9jZXNzTmVnYXRpdmVsb29rYWhlYWQoKTsKLSAgICAgICAgICBjYXNlIFRfTE9PS0JFSElORDogICAgcmV0dXJuIHRoaXMucHJvY2Vzc0xvb2tiZWhpbmQoKTsKLSAgICAgICAgICBjYXNlIFRfTkVHQVRJVkVMT09LQkVISU5EOiByZXR1cm4gdGhpcy5wcm9jZXNzTmVnYXRpdmVsb29rYmVoaW5kKCk7Ci0KLSAgICAgICAgICBjYXNlIFRfQ09NTUVOVDoKLSAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICAgICAgcmV0dXJuIFRva2VuLmNyZWF0ZUVtcHR5KCk7Ci0KLSAgICAgICAgICBjYXNlIFRfQkFDS1NPTElEVVM6Ci0gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuY2hhcmRhdGEpIHsKLSAgICAgICAgICAgICAgY2FzZSAnQSc6IHJldHVybiB0aGlzLnByb2Nlc3NCYWNrc29saWR1c19BKCk7Ci0gICAgICAgICAgICAgIGNhc2UgJ1onOiByZXR1cm4gdGhpcy5wcm9jZXNzQmFja3NvbGlkdXNfWigpOwotICAgICAgICAgICAgICBjYXNlICd6JzogcmV0dXJuIHRoaXMucHJvY2Vzc0JhY2tzb2xpZHVzX3ooKTsKLSAgICAgICAgICAgICAgY2FzZSAnYic6IHJldHVybiB0aGlzLnByb2Nlc3NCYWNrc29saWR1c19iKCk7Ci0gICAgICAgICAgICAgIGNhc2UgJ0InOiByZXR1cm4gdGhpcy5wcm9jZXNzQmFja3NvbGlkdXNfQigpOwotICAgICAgICAgICAgICBjYXNlICc8JzogcmV0dXJuIHRoaXMucHJvY2Vzc0JhY2tzb2xpZHVzX2x0KCk7Ci0gICAgICAgICAgICAgIGNhc2UgJz4nOiByZXR1cm4gdGhpcy5wcm9jZXNzQmFja3NvbGlkdXNfZ3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggZG93bgotICAgICAgICB9Ci0gICAgICAgIHRvayA9IHRoaXMucGFyc2VBdG9tKCk7Ci0gICAgICAgIGNoID0gdGhpcy5yZWFkKCk7Ci0gICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICBjYXNlIFRfU1RBUjogIHJldHVybiB0aGlzLnByb2Nlc3NTdGFyKHRvayk7Ci0gICAgICAgICAgY2FzZSBUX1BMVVM6ICByZXR1cm4gdGhpcy5wcm9jZXNzUGx1cyh0b2spOwotICAgICAgICAgIGNhc2UgVF9RVUVTVElPTjogcmV0dXJuIHRoaXMucHJvY2Vzc1F1ZXN0aW9uKHRvayk7Ci0gICAgICAgICAgY2FzZSBUX0NIQVI6Ci0gICAgICAgICAgICBpZiAodGhpcy5jaGFyZGF0YSA9PSAneycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMub2Zmc2V0IC0+IG5leHQgb2YgJ3snCi0gICAgICAgICAgICAgICAgaW50IG9mZiA9IHRoaXMub2Zmc2V0OwotICAgICAgICAgICAgICAgIGludCBtaW4gPSAwLCBtYXggPSAtMTsKLSAgICAgICAgICAgICAgICBpZiAob2ZmID49IHRoaXMucmVnZXhsZW4pICBicmVhazsKLSAgICAgICAgICAgICAgICBjaCA9IHRoaXMucmVnZXguY2hhckF0KG9mZisrKTsKLSAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJywnICYmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykpICBicmVhazsKLSAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJywnKSB7ICAgICAgICAgICAgICAgIC8vIDAtOQotICAgICAgICAgICAgICAgICAgICBtaW4gPSBjaC0nMCc7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChvZmYgPCB0aGlzLnJlZ2V4bGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY2ggPSB0aGlzLnJlZ2V4LmNoYXJBdChvZmYrKykpID49ICcwJyAmJiBjaCA8PSAnOScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IG1pbioxMCArY2gtJzAnOwotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPCAwKSAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vaWYgKG9mZiA+PSB0aGlzLnJlZ2V4bGVuKSAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgbWF4ID0gbWluOwotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLCcpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZiA+PSB0aGlzLnJlZ2V4bGVuCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoKGNoID0gdGhpcy5yZWdleC5jaGFyQXQob2ZmKyspKSA8ICcwJyB8fCBjaCA+ICc5JykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGNoICE9ICd9JykKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ30nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXggPSAtMTsgICAgICAgICAgIC8vIHttaW4sfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gY2gtJzAnOyAgICAgICAvLyB7bWluLG1heH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvZmYgPCB0aGlzLnJlZ2V4bGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNoID0gdGhpcy5yZWdleC5jaGFyQXQob2ZmKyspKSA+PSAnMCcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjaCA8PSAnOScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggPSBtYXgqMTAgK2NoLScwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoIDwgMCkgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAobWluID4gbWF4KQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJwYXJzZUZhY3RvcigpOiBtaW4gPiBtYXg6ICIrbWluKyIsICIrbWF4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJ30nKSAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmYgLT4gbmV4dCBvZiAnfScKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja1F1ZXN0aW9uKG9mZikpIHsKLSAgICAgICAgICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlTkdDbG9zdXJlKHRvayk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gb2ZmKzE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlQ2xvc3VyZSh0b2spOwotICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCA9IG9mZjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdG9rLnNldE1pbihtaW4pOwotICAgICAgICAgICAgICAgIHRvay5zZXRNYXgobWF4KTsKLSAgICAgICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiQ0xPU1VSRTogIittaW4rIiwgIittYXgpOwotICAgICAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYXRvbSA6Oj0gY2hhciB8ICcuJyB8IGNoYXItY2xhc3MgfCAnKCcgcmVnZXggJyknIHwgJyg/OicgcmVnZXggJyknIHwgJ1wnIFswLTldCi0gICAgICogICAgICAgICAgfCAnXHcnIHwgJ1xXJyB8ICdcZCcgfCAnXEQnIHwgJ1xzJyB8ICdcUycgfCBjYXRlZ29yeS1ibG9jawotICAgICAqICAgICAgICAgIHwgJyg/PicgcmVnZXggJyknCi0gICAgICogY2hhciA6Oj0gJ1xcJyB8ICdcJyBbZWZucnRdIHwgYm1wLWNvZGUgfCBjaGFyYWN0ZXItMQotICAgICAqLwotICAgIFRva2VuIHBhcnNlQXRvbSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBjaCA9IHRoaXMucmVhZCgpOwotICAgICAgICBUb2tlbiB0b2sgPSBudWxsOwotICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgY2FzZSBUX0xQQVJFTjogICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NQYXJlbigpOwotICAgICAgICAgIGNhc2UgVF9MUEFSRU4yOiAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUGFyZW4yKCk7IC8vICcoPzonCi0gICAgICAgICAgY2FzZSBUX0NPTkRJVElPTjogICAgIHJldHVybiB0aGlzLnByb2Nlc3NDb25kaXRpb24oKTsgLy8gJyg/KCcKLSAgICAgICAgICBjYXNlIFRfTU9ESUZJRVJTOiAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc01vZGlmaWVycygpOyAvLyAoP21vZGlmaWVycyAuLi4gKQotICAgICAgICAgIGNhc2UgVF9JTkRFUEVOREVOVDogICByZXR1cm4gdGhpcy5wcm9jZXNzSW5kZXBlbmRlbnQoKTsKLSAgICAgICAgICBjYXNlIFRfRE9UOgotICAgICAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAvLyBTa2lwcyAnLicKLSAgICAgICAgICAgIHRvayA9IFRva2VuLnRva2VuX2RvdDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIGNoYXItY2xhc3MgOjo9ICdbJyAoICdeJz8gcmFuZ2UgJywnPykrICddJwotICAgICAgICAgICAgICogcmFuZ2UgOjo9ICdcZCcgfCAnXHcnIHwgJ1xzJyB8IGNhdGVnb3J5LWJsb2NrIHwgcmFuZ2UtY2hhcgotICAgICAgICAgICAgICogICAgICAgICAgIHwgcmFuZ2UtY2hhciAnLScgcmFuZ2UtY2hhcgotICAgICAgICAgICAgICogcmFuZ2UtY2hhciA6Oj0gJ1xbJyB8ICdcXScgfCAnXFwnIHwgJ1wnIFssLWVmbnJ0dl0gfCBibXAtY29kZSB8IGNoYXJhY3Rlci0yCi0gICAgICAgICAgICAgKiBibXAtY2hhciA6Oj0gJ1wnICd1JyBbMC05YS1mQS1GXSBbMC05YS1mQS1GXSBbMC05YS1mQS1GXSBbMC05YS1mQS1GXQotICAgICAgICAgICAgICovCi0gICAgICAgICAgY2FzZSBUX0xCUkFDS0VUOiAgICAgIHJldHVybiB0aGlzLnBhcnNlQ2hhcmFjdGVyQ2xhc3ModHJ1ZSk7Ci0gICAgICAgICAgY2FzZSBUX1NFVF9PUEVSQVRJT05TOiByZXR1cm4gdGhpcy5wYXJzZVNldE9wZXJhdGlvbnMoKTsKLQotICAgICAgICAgIGNhc2UgVF9CQUNLU09MSURVUzoKLSAgICAgICAgICAgIHN3aXRjaCAodGhpcy5jaGFyZGF0YSkgewotICAgICAgICAgICAgICBjYXNlICdkJzogIGNhc2UgJ0QnOgotICAgICAgICAgICAgICBjYXNlICd3JzogIGNhc2UgJ1cnOgotICAgICAgICAgICAgICBjYXNlICdzJzogIGNhc2UgJ1MnOgotICAgICAgICAgICAgICAgIHRvayA9IHRoaXMuZ2V0VG9rZW5Gb3JTaG9ydGhhbmQodGhpcy5jaGFyZGF0YSk7Ci0gICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRvazsKLQotICAgICAgICAgICAgICBjYXNlICdlJzogIGNhc2UgJ2YnOiAgY2FzZSAnbic6ICBjYXNlICdyJzoKLSAgICAgICAgICAgICAgY2FzZSAndCc6ICBjYXNlICd1JzogIGNhc2UgJ3YnOiAgY2FzZSAneCc6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2gyID0gdGhpcy5kZWNvZGVFc2NhcGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaDIgPCAweDEwMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVDaGFyKGNoMik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVTdHJpbmcoUkVVdGlsLmRlY29tcG9zZVRvU3Vycm9nYXRlcyhjaDIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlICdjJzogcmV0dXJuIHRoaXMucHJvY2Vzc0JhY2tzb2xpZHVzX2MoKTsKLSAgICAgICAgICAgICAgY2FzZSAnQyc6IHJldHVybiB0aGlzLnByb2Nlc3NCYWNrc29saWR1c19DKCk7Ci0gICAgICAgICAgICAgIGNhc2UgJ2knOiByZXR1cm4gdGhpcy5wcm9jZXNzQmFja3NvbGlkdXNfaSgpOwotICAgICAgICAgICAgICBjYXNlICdJJzogcmV0dXJuIHRoaXMucHJvY2Vzc0JhY2tzb2xpZHVzX0koKTsKLSAgICAgICAgICAgICAgY2FzZSAnZyc6IHJldHVybiB0aGlzLnByb2Nlc3NCYWNrc29saWR1c19nKCk7Ci0gICAgICAgICAgICAgIGNhc2UgJ1gnOiByZXR1cm4gdGhpcy5wcm9jZXNzQmFja3NvbGlkdXNfWCgpOwotICAgICAgICAgICAgICBjYXNlICcxJzogIGNhc2UgJzInOiAgY2FzZSAnMyc6ICBjYXNlICc0JzoKLSAgICAgICAgICAgICAgY2FzZSAnNSc6ICBjYXNlICc2JzogIGNhc2UgJzcnOiAgY2FzZSAnOCc6ICBjYXNlICc5JzoKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzQmFja3JlZmVyZW5jZSgpOwotCi0gICAgICAgICAgICAgIGNhc2UgJ1AnOgotICAgICAgICAgICAgICBjYXNlICdwJzoKLSAgICAgICAgICAgICAgICBpbnQgcHN0YXJ0ID0gdGhpcy5vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgdG9rID0gcHJvY2Vzc0JhY2tzb2xpZHVzX3BQKHRoaXMuY2hhcmRhdGEpOwotICAgICAgICAgICAgICAgIGlmICh0b2sgPT0gbnVsbCkgIHRocm93IHRoaXMuZXgoInBhcnNlci5hdG9tLjUiLCBwc3RhcnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlQ2hhcih0aGlzLmNoYXJkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIFRfQ0hBUjoKLSAgICAgICAgICAgIHRvayA9IFRva2VuLmNyZWF0ZUNoYXIodGhpcy5jaGFyZGF0YSk7Ci0gICAgICAgICAgICBpbnQgaGlnaCA9IHRoaXMuY2hhcmRhdGE7Ci0gICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGhpZ2gpCi0gICAgICAgICAgICAgICAgJiYgdGhpcy5yZWFkKCkgPT0gVF9DSEFSICYmIFJFVXRpbC5pc0xvd1N1cnJvZ2F0ZSh0aGlzLmNoYXJkYXRhKSkgewotICAgICAgICAgICAgICAgIGNoYXJbXSBzdXIgPSBuZXcgY2hhclsyXTsKLSAgICAgICAgICAgICAgICBzdXJbMF0gPSAoY2hhciloaWdoOwotICAgICAgICAgICAgICAgIHN1clsxXSA9IChjaGFyKXRoaXMuY2hhcmRhdGE7Ci0gICAgICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlUGFyZW4oVG9rZW4uY3JlYXRlU3RyaW5nKG5ldyBTdHJpbmcoc3VyKSksIDApOwotICAgICAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmF0b20uNCIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b2s7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFJhbmdlVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX3BQKGludCBjKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIHBvc2l0aXZlID0gYyA9PSAncCc7Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSKSAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmF0b20uMiIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICBSYW5nZVRva2VuIHRvazsKLSAgICAgICAgc3dpdGNoICh0aGlzLmNoYXJkYXRhKSB7Ci0gICAgICAgICAgY2FzZSAnTCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXR0ZXIKLSAgICAgICAgICAgIHRvayA9IFRva2VuLmdldFJhbmdlKCJMIiwgcG9zaXRpdmUpOyAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnTSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXJrCi0gICAgICAgICAgICB0b2sgPSBUb2tlbi5nZXRSYW5nZSgiTSIsIHBvc2l0aXZlKTsgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ04nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTnVtYmVyCi0gICAgICAgICAgICB0b2sgPSBUb2tlbi5nZXRSYW5nZSgiTiIsIHBvc2l0aXZlKTsgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ1onOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VwYXJhdG9yCi0gICAgICAgICAgICB0b2sgPSBUb2tlbi5nZXRSYW5nZSgiWiIsIHBvc2l0aXZlKTsgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ0MnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIKLSAgICAgICAgICAgIHRvayA9IFRva2VuLmdldFJhbmdlKCJDIiwgcG9zaXRpdmUpOyAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnUCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQdW5jdHVhdGlvbgotICAgICAgICAgICAgdG9rID0gVG9rZW4uZ2V0UmFuZ2UoIlAiLCBwb3NpdGl2ZSk7ICBicmVhazsKLSAgICAgICAgICBjYXNlICdTJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN5bWJvbAotICAgICAgICAgICAgdG9rID0gVG9rZW4uZ2V0UmFuZ2UoIlMiLCBwb3NpdGl2ZSk7ICBicmVhazsKLSAgICAgICAgICBjYXNlICd7JzoKLSAgICAgICAgICAgIC8vIHRoaXMub2Zmc2V0IHBvaW50cyB0aGUgbmV4dCBvZiAneycuCi0gICAgICAgICAgICAvL3BzdGFydCA9IHRoaXMub2Zmc2V0OwotICAgICAgICAgICAgaW50IG5hbWVzdGFydCA9IHRoaXMub2Zmc2V0OwotICAgICAgICAgICAgaW50IG5hbWVlbmQgPSB0aGlzLnJlZ2V4LmluZGV4T2YoJ30nLCBuYW1lc3RhcnQpOwotICAgICAgICAgICAgaWYgKG5hbWVlbmQgPCAwKSAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmF0b20uMyIsIHRoaXMub2Zmc2V0KTsKLSAgICAgICAgICAgIFN0cmluZyBwbmFtZSA9IHRoaXMucmVnZXguc3Vic3RyaW5nKG5hbWVzdGFydCwgbmFtZWVuZCk7Ci0gICAgICAgICAgICB0aGlzLm9mZnNldCA9IG5hbWVlbmQrMTsKLSAgICAgICAgICAgIHRvayA9IFRva2VuLmdldFJhbmdlKHBuYW1lLCBwb3NpdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTZXQoUmVndWxhckV4cHJlc3Npb24uWE1MU0NIRU1BX01PREUpKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgIGlmICh0aGlzLmlzU2V0KFJlZ3VsYXJFeHByZXNzaW9uLklHTk9SRV9DQVNFKSkKLSAgICAgICAgICAgICAgdG9rID0gUmFuZ2VUb2tlbi5jcmVhdGVDYXNlSW5zZW5zaXRpdmVUb2tlbih0b2spOwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93IHRoaXMuZXgoInBhcnNlci5hdG9tLjIiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLQotICAgIGludCBwcm9jZXNzQ0lpbkNoYXJhY3RlckNsYXNzKFJhbmdlVG9rZW4gdG9rLCBpbnQgYykgewotICAgICAgICByZXR1cm4gdGhpcy5kZWNvZGVFc2NhcGVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY2hhci1jbGFzcyA6Oj0gJ1snICggJ14nPyByYW5nZSAnLCc/KSsgJ10nCi0gICAgICogcmFuZ2UgOjo9ICdcZCcgfCAnXHcnIHwgJ1xzJyB8IGNhdGVnb3J5LWJsb2NrIHwgcmFuZ2UtY2hhcgotICAgICAqICAgICAgICAgICB8IHJhbmdlLWNoYXIgJy0nIHJhbmdlLWNoYXIKLSAgICAgKiByYW5nZS1jaGFyIDo6PSAnXFsnIHwgJ1xdJyB8ICdcXCcgfCAnXCcgWywtZWZucnR2XSB8IGJtcC1jb2RlIHwgY2hhcmFjdGVyLTIKLSAgICAgKiBibXAtY29kZSA6Oj0gJ1wnICd1JyBbMC05YS1mQS1GXSBbMC05YS1mQS1GXSBbMC05YS1mQS1GXSBbMC05YS1mQS1GXQotICAgICAqLwotICAgIHByb3RlY3RlZCBSYW5nZVRva2VuIHBhcnNlQ2hhcmFjdGVyQ2xhc3MoYm9vbGVhbiB1c2VOcmFuZ2UpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuc2V0Q29udGV4dChTX0lOQlJBQ0tFVFMpOwotICAgICAgICB0aGlzLm5leHQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ1snCi0gICAgICAgIGJvb2xlYW4gbnJhbmdlID0gZmFsc2U7Ci0gICAgICAgIFJhbmdlVG9rZW4gYmFzZSA9IG51bGw7Ci0gICAgICAgIFJhbmdlVG9rZW4gdG9rOwotICAgICAgICBpZiAodGhpcy5yZWFkKCkgPT0gVF9DSEFSICYmIHRoaXMuY2hhcmRhdGEgPT0gJ14nKSB7Ci0gICAgICAgICAgICBucmFuZ2UgPSB0cnVlOwotICAgICAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ14nCi0gICAgICAgICAgICBpZiAodXNlTnJhbmdlKSB7Ci0gICAgICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlTlJhbmdlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJhc2UgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgICAgIGJhc2UuYWRkUmFuZ2UoMCwgVG9rZW4uVVRGMTZfTUFYKTsKLSAgICAgICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgdHlwZTsKLSAgICAgICAgYm9vbGVhbiBmaXJzdGxvb3AgPSB0cnVlOwotICAgICAgICB3aGlsZSAoKHR5cGUgPSB0aGlzLnJlYWQoKSkgIT0gVF9FT0YpIHsKLSAgICAgICAgICAgIGlmICh0eXBlID09IFRfQ0hBUiAmJiB0aGlzLmNoYXJkYXRhID09ICddJyAmJiAhZmlyc3Rsb29wKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZmlyc3Rsb29wID0gZmFsc2U7Ci0gICAgICAgICAgICBpbnQgYyA9IHRoaXMuY2hhcmRhdGE7Ci0gICAgICAgICAgICBib29sZWFuIGVuZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gVF9CQUNLU09MSURVUykgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgewotICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6ICBjYXNlICdEJzoKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ3cnOiAgY2FzZSAnVyc6Ci0gICAgICAgICAgICAgICAgICBjYXNlICdzJzogIGNhc2UgJ1MnOgotICAgICAgICAgICAgICAgICAgICB0b2subWVyZ2VSYW5nZXModGhpcy5nZXRUb2tlbkZvclNob3J0aGFuZChjKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICBjYXNlICdpJzogIGNhc2UgJ0knOgotICAgICAgICAgICAgICAgICAgY2FzZSAnYyc6ICBjYXNlICdDJzoKLSAgICAgICAgICAgICAgICAgICAgYyA9IHRoaXMucHJvY2Vzc0NJaW5DaGFyYWN0ZXJDbGFzcyh0b2ssIGMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYyA8IDApICBlbmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBjYXNlICdwJzoKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ1AnOgotICAgICAgICAgICAgICAgICAgICBpbnQgcHN0YXJ0ID0gdGhpcy5vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIFJhbmdlVG9rZW4gdG9rMiA9IHRoaXMucHJvY2Vzc0JhY2tzb2xpZHVzX3BQKGMpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG9rMiA9PSBudWxsKSAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmF0b20uNSIsIHBzdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIHRvay5tZXJnZVJhbmdlcyh0b2syKTsKLSAgICAgICAgICAgICAgICAgICAgZW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGMgPSB0aGlzLmRlY29kZUVzY2FwZWQoKTsKLSAgICAgICAgICAgICAgICB9IC8vIFwgKyBjCi0gICAgICAgICAgICB9IC8vIGJhY2tzb2xpZHVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQT1NJWCBDaGFyYWN0ZXIgY2xhc3Mgc3VjaCBhcyBbOmFsbnVtOl0KLSAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gVF9QT1NJWF9DSEFSQ0xBU1NfU1RBUlQpIHsKLSAgICAgICAgICAgICAgICBpbnQgbmFtZWVuZCA9IHRoaXMucmVnZXguaW5kZXhPZignOicsIHRoaXMub2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZWVuZCA8IDApIHRocm93IHRoaXMuZXgoInBhcnNlci5jYy4xIiwgdGhpcy5vZmZzZXQpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gcG9zaXRpdmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlZ2V4LmNoYXJBdCh0aGlzLm9mZnNldCkgPT0gJ14nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHRoaXMucmVnZXguc3Vic3RyaW5nKHRoaXMub2Zmc2V0LCBuYW1lZW5kKTsKLSAgICAgICAgICAgICAgICBSYW5nZVRva2VuIHJhbmdlID0gVG9rZW4uZ2V0UmFuZ2UobmFtZSwgcG9zaXRpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTZXQoUmVndWxhckV4cHJlc3Npb24uWE1MU0NIRU1BX01PREUpKTsKLSAgICAgICAgICAgICAgICBpZiAocmFuZ2UgPT0gbnVsbCkgIHRocm93IHRoaXMuZXgoInBhcnNlci5jYy4zIiwgdGhpcy5vZmZzZXQpOwotICAgICAgICAgICAgICAgIHRvay5tZXJnZVJhbmdlcyhyYW5nZSk7Ci0gICAgICAgICAgICAgICAgZW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZWVuZCsxID49IHRoaXMucmVnZXhsZW4gfHwgdGhpcy5yZWdleC5jaGFyQXQobmFtZWVuZCsxKSAhPSAnXScpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IHRoaXMuZXgoInBhcnNlci5jYy4xIiwgbmFtZWVuZCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBuYW1lZW5kKzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghZW5kKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBzaG9ydGhhbmRzLi4uCi0gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUiB8fCB0aGlzLmNoYXJkYXRhICE9ICctJykgeyAvLyBIZXJlIGlzIG5vICctJy4KLSAgICAgICAgICAgICAgICAgICAgdG9rLmFkZFJhbmdlKGMsIGMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dCgpOyAvLyBTa2lwcyAnLScKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlID0gdGhpcy5yZWFkKCkpID09IFRfRU9GKSAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmNjLjIiLCB0aGlzLm9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFRfQ0hBUiAmJiB0aGlzLmNoYXJkYXRhID09ICddJykgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9rLmFkZFJhbmdlKGMsIGMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG9rLmFkZFJhbmdlKCctJywgJy0nKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByYW5nZWVuZCA9IHRoaXMuY2hhcmRhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBUX0JBQ0tTT0xJRFVTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlZW5kID0gdGhpcy5kZWNvZGVFc2NhcGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvay5hZGRSYW5nZShjLCByYW5nZWVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhpcy5pc1NldChSZWd1bGFyRXhwcmVzc2lvbi5TUEVDSUFMX0NPTU1BKQotICAgICAgICAgICAgICAgICYmIHRoaXMucmVhZCgpID09IFRfQ0hBUiAmJiB0aGlzLmNoYXJkYXRhID09ICcsJykKLSAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGhpcy5yZWFkKCkgPT0gVF9FT0YpCi0gICAgICAgICAgICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuMiIsIHRoaXMub2Zmc2V0KTsKLSAgICAgICAgaWYgKCF1c2VOcmFuZ2UgJiYgbnJhbmdlKSB7Ci0gICAgICAgICAgICBiYXNlLnN1YnRyYWN0UmFuZ2VzKHRvayk7Ci0gICAgICAgICAgICB0b2sgPSBiYXNlOwotICAgICAgICB9Ci0gICAgICAgIHRvay5zb3J0UmFuZ2VzKCk7Ci0gICAgICAgIHRvay5jb21wYWN0UmFuZ2VzKCk7Ci0gICAgICAgIC8vdG9rLmR1bXBSYW5nZXMoKTsKLSAgICAgICAgLyoKLSAgICAgICAgaWYgKHRoaXMuaXNTZXQoUmVndWxhckV4cHJlc3Npb24uSUdOT1JFX0NBU0UpKQotICAgICAgICAgICAgdG9rID0gUmFuZ2VUb2tlbi5jcmVhdGVDYXNlSW5zZW5zaXRpdmVUb2tlbih0b2spOwotICAgICAgICAqLwotICAgICAgICB0aGlzLnNldENvbnRleHQoU19OT1JNQUwpOwotICAgICAgICB0aGlzLm5leHQoKTsgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzICddJwotCi0gICAgICAgIHJldHVybiB0b2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogJyg/WycgLi4uICddJyAoKCctJyB8ICcrJyB8ICcmJykgJ1snIC4uLiAnXScpPyAnKScKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUmFuZ2VUb2tlbiBwYXJzZVNldE9wZXJhdGlvbnMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBSYW5nZVRva2VuIHRvayA9IHRoaXMucGFyc2VDaGFyYWN0ZXJDbGFzcyhmYWxzZSk7Ci0gICAgICAgIGludCB0eXBlOwotICAgICAgICB3aGlsZSAoKHR5cGUgPSB0aGlzLnJlYWQoKSkgIT0gVF9SUEFSRU4pIHsKLSAgICAgICAgICAgIGludCBjaCA9IHRoaXMuY2hhcmRhdGE7Ci0gICAgICAgICAgICBpZiAodHlwZSA9PSBUX0NIQVIgJiYgKGNoID09ICctJyB8fCBjaCA9PSAnJicpCi0gICAgICAgICAgICAgICAgfHwgdHlwZSA9PSBUX1BMVVMpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9MQlJBQ0tFVCkgdGhyb3cgZXgoInBhcnNlci5vcGUuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgICAgIFJhbmdlVG9rZW4gdDIgPSB0aGlzLnBhcnNlQ2hhcmFjdGVyQ2xhc3MoZmFsc2UpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFRfUExVUykKLSAgICAgICAgICAgICAgICAgICAgdG9rLm1lcmdlUmFuZ2VzKHQyKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnLScpCi0gICAgICAgICAgICAgICAgICAgIHRvay5zdWJ0cmFjdFJhbmdlcyh0Mik7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJyYnKQotICAgICAgICAgICAgICAgICAgICB0b2suaW50ZXJzZWN0UmFuZ2VzKHQyKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBU1NFUlQiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5vcGUuMiIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICByZXR1cm4gdG9rOwotICAgIH0KLQotICAgIFRva2VuIGdldFRva2VuRm9yU2hvcnRoYW5kKGludCBjaCkgewotICAgICAgICBUb2tlbiB0b2s7Ci0gICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICBjYXNlICdkJzoKLSAgICAgICAgICAgIHRvayA9IHRoaXMuaXNTZXQoUmVndWxhckV4cHJlc3Npb24uVVNFX1VOSUNPREVfQ0FURUdPUlkpCi0gICAgICAgICAgICAgICAgPyBUb2tlbi5nZXRSYW5nZSgiTmQiLCB0cnVlKSA6IFRva2VuLnRva2VuXzB0bzk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICdEJzoKLSAgICAgICAgICAgIHRvayA9IHRoaXMuaXNTZXQoUmVndWxhckV4cHJlc3Npb24uVVNFX1VOSUNPREVfQ0FURUdPUlkpCi0gICAgICAgICAgICAgICAgPyBUb2tlbi5nZXRSYW5nZSgiTmQiLCBmYWxzZSkgOiBUb2tlbi50b2tlbl9ub3RfMHRvOTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ3cnOgotICAgICAgICAgICAgdG9rID0gdGhpcy5pc1NldChSZWd1bGFyRXhwcmVzc2lvbi5VU0VfVU5JQ09ERV9DQVRFR09SWSkKLSAgICAgICAgICAgICAgICA/IFRva2VuLmdldFJhbmdlKCJJc1dvcmQiLCB0cnVlKSA6IFRva2VuLnRva2VuX3dvcmRjaGFyczsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ1cnOgotICAgICAgICAgICAgdG9rID0gdGhpcy5pc1NldChSZWd1bGFyRXhwcmVzc2lvbi5VU0VfVU5JQ09ERV9DQVRFR09SWSkKLSAgICAgICAgICAgICAgICA/IFRva2VuLmdldFJhbmdlKCJJc1dvcmQiLCBmYWxzZSkgOiBUb2tlbi50b2tlbl9ub3Rfd29yZGNoYXJzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICB0b2sgPSB0aGlzLmlzU2V0KFJlZ3VsYXJFeHByZXNzaW9uLlVTRV9VTklDT0RFX0NBVEVHT1JZKQotICAgICAgICAgICAgICAgID8gVG9rZW4uZ2V0UmFuZ2UoIklzU3BhY2UiLCB0cnVlKSA6IFRva2VuLnRva2VuX3NwYWNlczsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgJ1MnOgotICAgICAgICAgICAgdG9rID0gdGhpcy5pc1NldChSZWd1bGFyRXhwcmVzc2lvbi5VU0VfVU5JQ09ERV9DQVRFR09SWSkKLSAgICAgICAgICAgICAgICA/IFRva2VuLmdldFJhbmdlKCJJc1NwYWNlIiwgZmFsc2UpIDogVG9rZW4udG9rZW5fbm90X3NwYWNlczsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogc2hvcnRoYW5kczogXFx1IitJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNikpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICovCi0gICAgaW50IGRlY29kZUVzY2FwZWQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9CQUNLU09MSURVUykgIHRocm93IGV4KCJwYXJzZXIubmV4dC4xIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgIGludCBjID0gdGhpcy5jaGFyZGF0YTsKLSAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgY2FzZSAnZSc6ICBjID0gMHgxYjsgIGJyZWFrOyAvLyBFU0NBUEUgVSswMDFCCi0gICAgICAgICAgY2FzZSAnZic6ICBjID0gJ1xmJzsgIGJyZWFrOyAvLyBGT1JNIEZFRUQgVSswMDBDCi0gICAgICAgICAgY2FzZSAnbic6ICBjID0gJ1xuJzsgIGJyZWFrOyAvLyBMSU5FIEZFRUQgVSswMDBBCi0gICAgICAgICAgY2FzZSAncic6ICBjID0gJ1xyJzsgIGJyZWFrOyAvLyBDUlJJQUdFIFJFVFVSTiBVKzAwMEQKLSAgICAgICAgICBjYXNlICd0JzogIGMgPSAnXHQnOyAgYnJlYWs7IC8vIEhPUklaT05UQUwgVEFCVUxBVElPTiBVKzAwMDkKLSAgICAgICAgICAvL2Nhc2UgJ3YnOiAgYyA9IDB4MGI7ICBicmVhazsgLy8gVkVSVElDQUwgVEFCVUxBVElPTiBVKzAwMEIKLSAgICAgICAgICBjYXNlICd4JzoKLSAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUikgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS4xIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgICAgICBpZiAodGhpcy5jaGFyZGF0YSA9PSAneycpIHsKLSAgICAgICAgICAgICAgICBpbnQgdjEgPSAwOwotICAgICAgICAgICAgICAgIGludCB1diA9IDA7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUikgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS4xIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodjEgPSBoZXhDaGFyKHRoaXMuY2hhcmRhdGEpKSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHV2ID4gdXYqMTYpIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS4yIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgICAgICAgICAgICAgIHV2ID0gdXYqMTYrdjE7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hhcmRhdGEgIT0gJ30nKSAgdGhyb3cgZXgoInBhcnNlci5kZXNjYXBlLjMiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgICAgICAgICBpZiAodXYgPiBUb2tlbi5VVEYxNl9NQVgpICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuNCIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgICAgIGMgPSB1djsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IHYxID0gMDsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSIHx8ICh2MSA9IGhleENoYXIodGhpcy5jaGFyZGF0YSkpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5kZXNjYXBlLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgICAgICAgICBpbnQgdXYgPSB2MTsKLSAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSIHx8ICh2MSA9IGhleENoYXIodGhpcy5jaGFyZGF0YSkpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5kZXNjYXBlLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgICAgICAgICB1diA9IHV2KjE2K3YxOwotICAgICAgICAgICAgICAgIGMgPSB1djsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAndSc6Ci0gICAgICAgICAgICBpbnQgdjEgPSAwOwotICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSIHx8ICh2MSA9IGhleENoYXIodGhpcy5jaGFyZGF0YSkpIDwgMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgaW50IHV2ID0gdjE7Ci0gICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX0NIQVIgfHwgKHYxID0gaGV4Q2hhcih0aGlzLmNoYXJkYXRhKSkgPCAwKQotICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS4xIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgICAgICB1diA9IHV2KjE2K3YxOwotICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSIHx8ICh2MSA9IGhleENoYXIodGhpcy5jaGFyZGF0YSkpIDwgMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgdXYgPSB1dioxNit2MTsKLSAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUiB8fCAodjEgPSBoZXhDaGFyKHRoaXMuY2hhcmRhdGEpKSA8IDApCi0gICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5kZXNjYXBlLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgICAgIHV2ID0gdXYqMTYrdjE7Ci0gICAgICAgICAgICBjID0gdXY7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgJ3YnOgotICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSIHx8ICh2MSA9IGhleENoYXIodGhpcy5jaGFyZGF0YSkpIDwgMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgdXYgPSB2MTsKLSAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUiB8fCAodjEgPSBoZXhDaGFyKHRoaXMuY2hhcmRhdGEpKSA8IDApCi0gICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5kZXNjYXBlLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgICAgIHV2ID0gdXYqMTYrdjE7Ci0gICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX0NIQVIgfHwgKHYxID0gaGV4Q2hhcih0aGlzLmNoYXJkYXRhKSkgPCAwKQotICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS4xIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgICAgICB1diA9IHV2KjE2K3YxOwotICAgICAgICAgICAgdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSIHx8ICh2MSA9IGhleENoYXIodGhpcy5jaGFyZGF0YSkpIDwgMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuMSIsIHRoaXMub2Zmc2V0LTEpOwotICAgICAgICAgICAgdXYgPSB1dioxNit2MTsKLSAgICAgICAgICAgIHRoaXMubmV4dCgpOwotICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUiB8fCAodjEgPSBoZXhDaGFyKHRoaXMuY2hhcmRhdGEpKSA8IDApCi0gICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5kZXNjYXBlLjEiLCB0aGlzLm9mZnNldC0xKTsKLSAgICAgICAgICAgIHV2ID0gdXYqMTYrdjE7Ci0gICAgICAgICAgICB0aGlzLm5leHQoKTsKLSAgICAgICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX0NIQVIgfHwgKHYxID0gaGV4Q2hhcih0aGlzLmNoYXJkYXRhKSkgPCAwKQotICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS4xIiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgICAgICB1diA9IHV2KjE2K3YxOwotICAgICAgICAgICAgaWYgKHV2ID4gVG9rZW4uVVRGMTZfTUFYKSAgdGhyb3cgZXgoInBhcnNlci5kZXNjYXBwZS40IiwgdGhpcy5vZmZzZXQtMSk7Ci0gICAgICAgICAgICBjID0gdXY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICdBJzoKLSAgICAgICAgICBjYXNlICdaJzoKLSAgICAgICAgICBjYXNlICd6JzoKLSAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS41IiwgdGhpcy5vZmZzZXQtMik7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYzsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgaGV4Q2hhcihpbnQgY2gpIHsKLSAgICAgICAgaWYgKGNoIDwgJzAnKSAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoY2ggPiAnZicpICByZXR1cm4gLTE7Ci0gICAgICAgIGlmIChjaCA8PSAnOScpICByZXR1cm4gY2gtJzAnOwotICAgICAgICBpZiAoY2ggPCAnQScpICByZXR1cm4gLTE7Ci0gICAgICAgIGlmIChjaCA8PSAnRicpICByZXR1cm4gY2gtJ0EnKzEwOwotICAgICAgICBpZiAoY2ggPCAnYScpICByZXR1cm4gLTE7Ci0gICAgICAgIHJldHVybiBjaC0nYScrMTA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SZWd1bGFyRXhwcmVzc2lvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SZWd1bGFyRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjQzODJkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUmVndWxhckV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxODggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXg7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3I7Ci0KLS8qKgotICogQSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgZW5naW5lIHVzaW5nIE5vbi1kZXRlcm1pbmlzdGljIEZpbml0ZSBBdXRvbWF0b24gKE5GQSkuCi0gKiBUaGlzIGVuZ2luZSBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBQT1NJWCByZWd1bGFyIGV4cHJlc3Npb24uCi0gKgotICogPGhyIHdpZHRoPSI1MCUiPgotICogPGgzPkhvdyB0byB1c2U8L2gzPgotICoKLSAqIDxkbD4KLSAqICAgPGR0PkEuIFN0YW5kYXJkIHdheQotICogICA8ZGQ+Ci0gKiA8cHJlPgotICogUmVndWxhckV4cHJlc3Npb24gcmUgPSBuZXcgUmVndWxhckV4cHJlc3Npb24oPHZhcj5yZWdleDwvdmFyPik7Ci0gKiBpZiAocmUubWF0Y2hlcyh0ZXh0KSkgeyAuLi4gfQotICogPC9wcmU+Ci0gKgotICogICA8ZHQ+Qi4gQ2FwdHVyaW5nIGdyb3VwcwotICogICA8ZGQ+Ci0gKiA8cHJlPgotICogUmVndWxhckV4cHJlc3Npb24gcmUgPSBuZXcgUmVndWxhckV4cHJlc3Npb24oPHZhcj5yZWdleDwvdmFyPik7Ci0gKiBNYXRjaCBtYXRjaCA9IG5ldyBNYXRjaCgpOwotICogaWYgKHJlLm1hdGNoZXModGV4dCwgbWF0Y2gpKSB7Ci0gKiAgICAgLi4uIC8vIFlvdSBjYW4gcmVmZXIgY2FwdHVyZWQgdGV4dHMgd2l0aCBtZXRob2RzIG9mIHRoZSA8Y29kZT5NYXRjaDwvY29kZT4gY2xhc3MuCi0gKiB9Ci0gKiA8L3ByZT4KLSAqCi0gKiA8L2RsPgotICoKLSAqIDxoND5DYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nPC9oND4KLSAqIDxwcmU+Ci0gKiBSZWd1bGFyRXhwcmVzc2lvbiByZSA9IG5ldyBSZWd1bGFyRXhwcmVzc2lvbig8dmFyPnJlZ2V4PC92YXI+LCAiaSIpOwotICogaWYgKHJlLm1hdGNoZXModGV4dCkgPj0gMCkgeyAuLi59Ci0gKiA8L3ByZT4KLSAqCi0gKiA8aDQ+T3B0aW9uczwvaDQ+Ci0gKiA8cD5Zb3UgY2FuIHNwZWNpZnkgb3B0aW9ucyB0byA8YSBocmVmPSIjUmVndWxhckV4cHJlc3Npb24oamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykiPjxjb2RlPlJlZ3VsYXJFeHByZXNzaW9uKDwvY29kZT48dmFyPnJlZ2V4PC92YXI+PGNvZGU+LCA8L2NvZGU+PHZhcj5vcHRpb25zPC92YXI+PGNvZGU+KTwvY29kZT48L2E+Ci0gKiAgICBvciA8YSBocmVmPSIjc2V0UGF0dGVybihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+PGNvZGU+c2V0UGF0dGVybig8L2NvZGU+PHZhcj5yZWdleDwvdmFyPjxjb2RlPiwgPC9jb2RlPjx2YXI+b3B0aW9uczwvdmFyPjxjb2RlPik8L2NvZGU+PC9hPi4KLSAqICAgIFRoaXMgPHZhcj5vcHRpb25zPC92YXI+IHBhcmFtZXRlciBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMuCi0gKiA8L3A+Ci0gKiA8ZGw+Ci0gKiAgIDxkdD48YSBuYW1lPSJJX09QVElPTiI+PGNvZGU+ImkiPC9jb2RlPjwvYT4KLSAqICAgPGRkPlRoaXMgb3B0aW9uIGluZGljYXRlcyBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLgotICogICA8ZHQ+PGEgbmFtZT0iTV9PUFRJT04iPjxjb2RlPiJtIjwvY29kZT48L2E+Ci0gKiAgIDxkZCBjbGFzcz0iUkVHRVgiPjxrYmQ+Xjwva2JkPiBhbmQgPGtiZD4kPC9rYmQ+IGNvbnNpZGVyIHRoZSBFT0wgY2hhcmFjdGVycyB3aXRoaW4gdGhlIHRleHQuCi0gKiAgIDxkdD48YSBuYW1lPSJTX09QVElPTiI+PGNvZGU+InMiPC9jb2RlPjwvYT4KLSAqICAgPGRkIGNsYXNzPSJSRUdFWCI+PGtiZD4uPC9rYmQ+IG1hdGNoZXMgYW55IG9uZSBjaGFyYWN0ZXIuCi0gKiAgIDxkdD48YSBuYW1lPSJVX09QVElPTiI+PGNvZGU+InUiPC9jb2RlPjwvYT4KLSAqICAgPGRkIGNsYXNzPSJSRUdFWCI+UmVkZWZpbmVzIDxLYmQ+XGQgXEQgXHcgXFcgXHMgXFMgXGIgXEIgXCZsdDsgXD48L2tiZD4gYXMgYmVjb21pbmcgdG8gVW5pY29kZS4KLSAqICAgPGR0PjxhIG5hbWU9IldfT1BUSU9OIj48Y29kZT4idyI8L2NvZGU+PC9hPgotICogICA8ZGQgY2xhc3M9IlJFR0VYIj5CeSB0aGlzIG9wdGlvbiwgPGtiZD5cYiBcQiBcJmx0OyBcPjwva2JkPiBhcmUgcHJvY2Vzc2VkIHdpdGggdGhlIG1ldGhvZCBvZgotICogICAgICAnVW5pY29kZSBSZWd1bGFyIEV4cHJlc3Npb24gR3VpZGVsaW5lcycgUmV2aXNpb24gNC4KLSAqICAgICAgV2hlbiAidyIgYW5kICJ1IiBhcmUgc3BlY2lmaWVkIGF0IHRoZSBzYW1lIHRpbWUsCi0gKiAgICAgIDxrYmQ+XGIgXEIgXCZsdDsgXD48L2tiZD4gYXJlIHByb2Nlc3NlZCBmb3IgdGhlICJ3IiBvcHRpb24uCi0gKiAgIDxkdD48YSBuYW1lPSJDT01NQV9PUFRJT04iPjxjb2RlPiIsIjwvY29kZT48L2E+Ci0gKiAgIDxkZD5UaGUgcGFyc2VyIHRyZWF0cyBhIGNvbW1hIGluIGEgY2hhcmFjdGVyIGNsYXNzIGFzIGEgcmFuZ2Ugc2VwYXJhdG9yLgotICogICAgICA8a2JkIGNsYXNzPSJSRUdFWCI+W2EsYl08L2tiZD4gbWF0Y2hlcyA8a2JkPmE8L2tiZD4gb3IgPGtiZD4sPC9rYmQ+IG9yIDxrYmQ+Yjwva2JkPiB3aXRob3V0IHRoaXMgb3B0aW9uLgotICogICAgICA8a2JkIGNsYXNzPSJSRUdFWCI+W2EsYl08L2tiZD4gbWF0Y2hlcyA8a2JkPmE8L2tiZD4gb3IgPGtiZD5iPC9rYmQ+IHdpdGggdGhpcyBvcHRpb24uCi0gKgotICogICA8ZHQ+PGEgbmFtZT0iWF9PUFRJT04iPjxjb2RlPiJYIjwvY29kZT48L2E+Ci0gKiAgIDxkZCBjbGFzcz0iUkVHRVgiPgotICogICAgICAgQnkgdGhpcyBvcHRpb24sIHRoZSBlbmdpbmUgY29uZm9tcyB0byA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1dELXhtbHNjaGVtYS0yLTIwMDAwNDA3LyNyZWdleHMiPlhNTCBTY2hlbWE6IFJlZ3VsYXIgRXhwcmVzc2lvbjwvYT4uCi0gKiAgICAgICBUaGUgPGNvZGU+bWF0Y2goKTwvY29kZT4gbWV0aG9kIGRvZXMgbm90IGRvIHN1YnNyaW5nIG1hdGNoaW5nCi0gKiAgICAgICBidXQgZW50aXJlIHN0cmluZyBtYXRjaGluZy4KLSAqCi0gKiA8L2RsPgotICogCi0gKiA8aHIgd2lkdGg9IjUwJSI+Ci0gKiA8aDM+U3ludGF4PC9oMz4KLSAqIDx0YWJsZSBib3JkZXI9IjEiIGJnY29sb3I9IiNkZGVlZmYiPgotICogICA8dHI+Ci0gKiAgICA8dGQ+Ci0gKiAgICAgPGg0PkRpZmZlcmVuY2VzIGZyb20gdGhlIFBlcmwgNSByZWd1bGFyIGV4cHJlc3Npb248L2g0PgotICogICAgIDx1bD4KLSAqICAgICAgPGxpPlRoZXJlIGlzIDYtZGlnaXQgaGV4YWRlY2ltYWwgY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9uICAoPGtiZD5cdTAwNWN2PC9rYmQ+PHZhcj5ISEhISEg8L3Zhcj4uKQotICogICAgICA8bGk+U3VwcG9ydHMgc3VidHJhY3Rpb24sIHVuaW9uLCBhbmQgaW50ZXJzZWN0aW9uIG9wZXJhdGlvbnMgZm9yIGNoYXJhY3RlciBjbGFzc2VzLgotICogICAgICA8bGk+Tm90IHN1cHBvcnRlZDogPGtiZD5cPC9rYmQ+PHZhcj5vb288L3Zhcj4gKE9jdGFsIGNoYXJhY3RlciByZXByZXNlbnRhdGlvbnMpLAotICogICAgICAgICAgPEtiZD5cRzwva2JkPiwgPGtiZD5cQzwva2JkPiwgPGtiZD5cbDwva2JkPjx2YXI+YzwvdmFyPiwKLSAqICAgICAgICAgIDxrYmQ+XHUwMDVjIHU8L2tiZD48dmFyPmM8L3Zhcj4sIDxrYmQ+XEw8L2tiZD4sIDxrYmQ+XFU8L2tiZD4sCi0gKiAgICAgICAgICA8a2JkPlxFPC9rYmQ+LCA8a2JkPlxRPC9rYmQ+LCA8a2JkPlxOezwva2JkPjx2YXI+bmFtZTwvdmFyPjxrYmQ+fTwva2JkPiwKLSAqICAgICAgICAgIDxLYmQ+KD97PGtiZD48dmFyPmNvZGU8L3Zhcj48a2JkPn0pPC9rYmQ+LCA8S2JkPig/P3s8a2JkPjx2YXI+Y29kZTwvdmFyPjxrYmQ+fSk8L2tiZD4KLSAqICAgICA8L3VsPgotICogICAgPC90ZD4KLSAqICAgPC90cj4KLSAqIDwvdGFibGU+Ci0gKgotICogPFA+TWV0YSBjaGFyYWN0ZXJzIGFyZSBgPEtCRD4uICogKyA/IHsgWyAoICkgfCBcIF4gJDwvS0JEPicuPC9QPgotICogPHVsPgotICogICA8bGk+Q2hhcmFjdGVyCi0gKiAgICAgPGRsPgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4uPC9rYmQ+IChBIHBlcmlvZCkKLSAqICAgICAgIDxkZD5NYXRjaGVzIGFueSBvbmUgY2hhcmFjdGVyIGV4Y2VwdCB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMuCi0gKiAgICAgICA8ZGQ+TElORSBGRUVEIChVKzAwMEEpLCBDQVJSSUFHRSBSRVRVUk4gKFUrMDAwRCksCi0gKiAgICAgICAgICAgUEFSQUdSQVBIIFNFUEFSQVRPUiAoVSsyMDI5KSwgTElORSBTRVBBUkFUT1IgKFUrMjAyOCkKLSAqICAgICAgIDxkZD5UaGlzIGV4cHJlc3Npb24gbWF0Y2hlcyBvbmUgY29kZSBwb2ludCBpbiBVbmljb2RlLiBJdCBjYW4gbWF0Y2ggYSBwYWlyIG9mIHN1cnJvZ2F0ZXMuCi0gKiAgICAgICA8ZGQ+V2hlbiA8YSBocmVmPSIjU19PUFRJT04iPnRoZSAicyIgb3B0aW9uPC9hPiBpcyBzcGVjaWZpZWQsCi0gKiAgICAgICAgICAgaXQgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGluY2x1ZGluZyB0aGUgYWJvdmUgZm91ciBjaGFyYWN0ZXJzLgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxLYmQ+XGUgXGYgXG4gXHIgXHQ8L2tiZD4KLSAqICAgICAgIDxkZD5NYXRjaGVzIEVTQ0FQRSAoVSswMDFCKSwgRk9STSBGRUVEIChVKzAwMEMpLCBMSU5FIEZFRUQgKFUrMDAwQSksCi0gKiAgICAgICAgICAgQ0FSUklBR0UgUkVUVVJOIChVKzAwMEQpLCBIT1JJWk9OVEFMIFRBQlVMQVRJT04gKFUrMDAwOSkKLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlxjPC9rYmQ+PHZhcj5DPC92YXI+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyBhIGNvbnRyb2wgY2hhcmFjdGVyLgotICogICAgICAgICAgIFRoZSA8dmFyPkM8L3Zhcj4gbXVzdCBiZSBvbmUgb2YgJzxrYmQ+QDwva2JkPicsICc8a2JkPkE8L2tiZD4nLSc8a2JkPlo8L2tiZD4nLAotICogICAgICAgICAgICc8a2JkPls8L2tiZD4nLCAnPGtiZD5cdTAwNWM8L2tiZD4nLCAnPGtiZD5dPC9rYmQ+JywgJzxrYmQ+Xjwva2JkPicsICc8a2JkPl88L2tiZD4nLgotICogICAgICAgICAgIEl0IG1hdGNoZXMgYSBjb250cm9sIGNoYXJhY3RlciBvZiB3aGljaCB0aGUgY2hhcmFjdGVyIGNvZGUgaXMgbGVzcyB0aGFuCi0gKiAgICAgICAgICAgdGhlIGNoYXJhY3RlciBjb2RlIG9mIHRoZSA8dmFyPkM8L3Zhcj4gYnkgMHgwMDQwLgotICogICAgICAgPGRkIGNsYXNzPSJSRUdFWCI+Rm9yIGV4YW1wbGUsIGEgPGtiZD5cY0o8L2tiZD4gbWF0Y2hlcyBhIExJTkUgRkVFRCAoVSswMDBBKSwKLSAqICAgICAgICAgICBhbmQgYSA8a2JkPlxjWzwva2JkPiBtYXRjaGVzIGFuIEVTQ0FQRSAoVSswMDFCKS4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj5hIG5vbi1tZXRhIGNoYXJhY3RlcgotICogICAgICAgPGRkPk1hdGNoZXMgdGhlIGNoYXJhY3Rlci4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48S0JEPlw8L0tCRD4gKyBhIG1ldGEgY2hhcmFjdGVyCi0gKiAgICAgICA8ZGQ+TWF0Y2hlcyB0aGUgbWV0YSBjaGFyYWN0ZXIuCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cdTAwNWN4PC9rYmQ+PHZhcj5ISDwvdmFyPiA8a2JkPlx1MDA1Y3h7PC9rYmQ+PHZhcj5ISEhIPC92YXI+PGtiZD59PC9rYmQ+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyBhIGNoYXJhY3RlciBvZiB3aGljaCBjb2RlIHBvaW50IGlzIDx2YXI+SEg8L3Zhcj4gKEhleGFkZWNpbWFsKSBpbiBVbmljb2RlLgotICogICAgICAgICAgIFlvdSBjYW4gd3JpdGUganVzdCAyIGRpZ2l0cyBmb3IgPGtiZD5cdTAwNWN4PC9rYmQ+PHZhcj5ISDwvdmFyPiwgYW5kCi0gKiAgICAgICAgICAgdmFyaWFibGUgbGVuZ3RoIGRpZ2l0cyBmb3IgPGtiZD5cdTAwNWN4ezwva2JkPjx2YXI+SEhISDwvdmFyPjxrYmQ+fTwva2JkPi4KLSAqCi0gKiAgICAgICA8IS0tCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlx1MDA1YyB1PC9rYmQ+PHZhcj5ISEhIPC92YXI+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyBhIGNoYXJhY3RlciBvZiB3aGljaCBjb2RlIHBvaW50IGlzIDx2YXI+SEhISDwvdmFyPiAoSGV4YWRlY2ltYWwpIGluIFVuaWNvZGUuCi0gKiAgICAgICAtLT4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlx1MDA1Y3Y8L2tiZD48dmFyPkhISEhISDwvdmFyPgotICogICAgICAgPGRkPk1hdGNoZXMgYSBjaGFyYWN0ZXIgb2Ygd2hpY2ggY29kZSBwb2ludCBpcyA8dmFyPkhISEhISDwvdmFyPiAoSGV4YWRlY2ltYWwpIGluIFVuaWNvZGUuCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cZzwva2JkPgotICogICAgICAgPGRkPk1hdGNoZXMgYSBncmFwaGVtZS4KLSAqICAgICAgIDxkZCBjbGFzcz0iUkVHRVgiPkl0IGlzIGVxdWl2YWxlbnQgdG8gPGtiZD4oP1tccHtBU1NJR05FRH1dLVtccHtNfVxwe0N9XSk/KD86XHB7TX18W1x4ezA5NER9XHh7MDlDRH1ceHswQTREfVx4ezBBQ0R9XHh7MEIzRH1ceHswQkNEfVx4ezBDNER9XHh7MENDRH1ceHswRDREfVx4ezBFM0F9XHh7MEY4NH1dXHB7TH18W1x4ezExNjB9LVx4ezExQTd9XXxbXHh7MTFBOH0tXHh7MTFGRn1dfFtceHtGRjlFfVx4e0ZGOUZ9XSkqPC9rYmQ+Ci0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cWDwva2JkPgotICogICAgICAgPGRkIGNsYXNzPSJSRUdFWCI+TWF0Y2hlcyBhIGNvbWJpbmluZyBjaGFyYWN0ZXIgc2VxdWVuY2UuCi0gKiAgICAgICBJdCBpcyBlcXVpdmFsZW50IHRvIDxrYmQ+KD86XFBNXHBNKik8L2tiZD4KLSAqICAgICA8L2RsPgotICogICA8L2xpPgotICoKLSAqICAgPGxpPkNoYXJhY3RlciBjbGFzcwotICogICAgIDxkbD4KLSsgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPls8L2tiZD48dmFyPlI8c3ViPjE8L3N1Yj48L3Zhcj48dmFyPlI8c3ViPjI8L3N1Yj48L3Zhcj48dmFyPi4uLjwvdmFyPjx2YXI+UjxzdWI+bjwvc3ViPjwvdmFyPjxrYmQ+XTwva2JkPiAod2l0aG91dCA8YSBocmVmPSIjQ09NTUFfT1BUSU9OIj4iLCIgb3B0aW9uPC9hPikKLSsgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPls8L2tiZD48dmFyPlI8c3ViPjE8L3N1Yj48L3Zhcj48a2JkPiw8L2tiZD48dmFyPlI8c3ViPjI8L3N1Yj48L3Zhcj48a2JkPiw8L2tiZD48dmFyPi4uLjwvdmFyPjxrYmQ+LDwva2JkPjx2YXI+UjxzdWI+bjwvc3ViPjwvdmFyPjxrYmQ+XTwva2JkPiAod2l0aCA8YSBocmVmPSIjQ09NTUFfT1BUSU9OIj4iLCIgb3B0aW9uPC9hPikKLSAqICAgICAgIDxkZD5Qb3NpdGl2ZSBjaGFyYWN0ZXIgY2xhc3MuICBJdCBtYXRjaGVzIGEgY2hhcmFjdGVyIGluIHJhbmdlcy4KLSAqICAgICAgIDxkZD48dmFyPlI8c3ViPm48L3N1Yj48L3Zhcj46Ci0gKiAgICAgICA8dWw+Ci0gKiAgICAgICAgIDxsaSBjbGFzcz0iUkVHRVgiPkEgY2hhcmFjdGVyIChpbmNsdWRpbmcgPEtiZD5cZSBcZiBcbiBcciBcdDwva2JkPiA8a2JkPlx1MDA1Y3g8L2tiZD48dmFyPkhIPC92YXI+IDxrYmQ+XHUwMDVjeHs8L2tiZD48dmFyPkhISEg8L3Zhcj48a2JkPn08L2tiZD4gPCEtLWtiZD5cdTAwNWMgdTwva2JkPjx2YXI+SEhISDwvdmFyLS0+IDxrYmQ+XHUwMDVjdjwva2JkPjx2YXI+SEhISEhIPC92YXI+KQotICogICAgICAgICAgICAgPHA+VGhpcyByYW5nZSBtYXRjaGVzIHRoZSBjaGFyYWN0ZXIuCi0gKiAgICAgICAgIDxsaSBjbGFzcz0iUkVHRVgiPjx2YXI+QzxzdWI+MTwvc3ViPjwvdmFyPjxrYmQ+LTwva2JkPjx2YXI+QzxzdWI+Mjwvc3ViPjwvdmFyPgotICogICAgICAgICAgICAgPHA+VGhpcyByYW5nZSBtYXRjaGVzIGEgY2hhcmFjdGVyIHdoaWNoIGhhcyBhIGNvZGUgcG9pbnQgdGhhdCBpcyA+PSA8dmFyPkM8c3ViPjE8L3N1Yj48L3Zhcj4ncyBjb2RlIHBvaW50IGFuZCAmbHQ7PSA8dmFyPkM8c3ViPjI8L3N1Yj48L3Zhcj4ncyBjb2RlIHBvaW50LgotKyAqICAgICAgICAgPGxpIGNsYXNzPSJSRUdFWCI+QSBQT1NJWCBjaGFyYWN0ZXIgY2xhc3M6IDxLYmQ+WzphbHBoYTpdIFs6YWxudW06XSBbOmFzY2lpOl0gWzpjbnRybDpdIFs6ZGlnaXQ6XSBbOmdyYXBoOl0gWzpsb3dlcjpdIFs6cHJpbnQ6XSBbOnB1bmN0Ol0gWzpzcGFjZTpdIFs6dXBwZXI6XSBbOnhkaWdpdDpdPC9rYmQ+LAotKyAqICAgICAgICAgICAgIGFuZCBuZWdhdGl2ZSBQT1NJWCBjaGFyYWN0ZXIgY2xhc3NlcyBpbiBQZXJsIGxpa2UgPGtiZD5bOl5hbHBoYTpdPC9rYmQ+Ci0gKiAgICAgICAgICAgICA8cD4uLi4KLSAqICAgICAgICAgPGxpIGNsYXNzPSJSRUdFWCI+PGtiZD5cZCBcRCBccyBcUyBcdyBcVyBccHs8L2tiZD48dmFyPm5hbWU8L3Zhcj48a2JkPn0gXFB7PC9rYmQ+PHZhcj5uYW1lPC92YXI+PGtiZD59PC9rYmQ+Ci0gKiAgICAgICAgICAgICA8cD5UaGVzZSBleHByZXNzaW9ucyBzcGVjaWZpZXMgdGhlIHNhbWUgcmFuZ2VzIGFzIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbnMuCi0gKiAgICAgICA8L3VsPgotICogICAgICAgPHAgY2xhc3M9IlJFR0VYIj5FbnVtZXJhdGVkIHJhbmdlcyBhcmUgbWVyZ2VkICh1bmlvbiBvcGVyYXRpb24pLgotICogICAgICAgICAgPGtiZD5bYS1lYy16XTwva2JkPiBpcyBlcXVpdmFsZW50IHRvIDxrYmQ+W2Etel08L2tiZD4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPltePC9rYmQ+PHZhcj5SPHN1Yj4xPC9zdWI+PC92YXI+PHZhcj5SPHN1Yj4yPC9zdWI+PC92YXI+PHZhcj4uLi48L3Zhcj48dmFyPlI8c3ViPm48L3N1Yj48L3Zhcj48a2JkPl08L2tiZD4gKHdpdGhvdXQgYSA8YSBocmVmPSIjQ09NTUFfT1BUSU9OIj4iLCIgb3B0aW9uPC9hPikKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+W148L2tiZD48dmFyPlI8c3ViPjE8L3N1Yj48L3Zhcj48a2JkPiw8L2tiZD48dmFyPlI8c3ViPjI8L3N1Yj48L3Zhcj48a2JkPiw8L2tiZD48dmFyPi4uLjwvdmFyPjxrYmQ+LDwva2JkPjx2YXI+UjxzdWI+bjwvc3ViPjwvdmFyPjxrYmQ+XTwva2JkPiAod2l0aCBhIDxhIGhyZWY9IiNDT01NQV9PUFRJT04iPiIsIiBvcHRpb248L2E+KQotICogICAgICAgPGRkPk5lZ2F0aXZlIGNoYXJhY3RlciBjbGFzcy4gIEl0IG1hdGNoZXMgYSBjaGFyYWN0ZXIgbm90IGluIHJhbmdlcy4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/Wzwva2JkPjx2YXI+cmFuZ2VzPC92YXI+PGtiZD5dPC9rYmQ+PHZhcj5vcDwvdmFyPjxrYmQ+Wzwva2JkPjx2YXI+cmFuZ2VzPC92YXI+PGtiZD5dPC9rYmQ+PHZhcj5vcDwvdmFyPjxrYmQ+Wzwva2JkPjx2YXI+cmFuZ2VzPC92YXI+PGtiZD5dPC9rYmQ+IC4uLiA8S2JkPik8L2tiZD4KLSAqICAgICAgICg8dmFyPm9wPC92YXI+IGlzIDxrYmQ+LTwva2JkPiBvciA8a2JkPis8L2tiZD4gb3IgPGtiZD4mPC9rYmQ+LikKLSAqICAgICAgIDxkZD5TdWJ0cmFjdGlvbiBvciB1bmlvbiBvciBpbnRlcnNlY3Rpb24gZm9yIGNoYXJhY3RlciBjbGFzc2VzLgotICogICAgICAgPGRkIGNsYXNzPSJSRUdFWCI+Rm9yIGV4bWFwbGUsIDxrYmQ+KD9bQS1aXS1bQ0ZdKTwva2JkPiBpcyBlcXVpdmFsZW50IHRvIDxrYmQ+W0EtQkQtRUctWl08L2tiZD4sIGFuZCA8a2JkPig/WzB4MDAtMHg3Zl0tW0tdJltccHtMdX1dKTwva2JkPiBpcyBlcXVpdmFsZW50IHRvIDxrYmQ+W0EtSkwtWl08L2tiZD4uCi0gKiAgICAgICA8ZGQ+VGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbnMgaXMgYSA8dT5wb3NpdGl2ZSBjaGFyYWN0ZXIgY2xhc3M8L3U+Ci0gKiAgICAgICAgICAgZXZlbiBpZiBhbiBleHByZXNzaW9uIGluY2x1ZGVzIGFueSBuZWdhdGl2ZSBjaGFyYWN0ZXIgY2xhc3Nlcy4KLSAqICAgICAgICAgICBZb3UgaGF2ZSB0byB0YWtlIGNhcmUgb24gdGhpcyBpbiBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLgotICogICAgICAgICAgIEZvciBpbnN0YW5jZSwgPGtiZD4oP1teYl0pPC9rYmQ+IGlzIGVxdWl2YWxlbnQgdG8gPGtiZD5bXHgwMC1hYy1ceHsxMGZmZmZ9XTwva2JkPiwKLSAqICAgICAgICAgICB3aGljaCBpcyBlcXVpdmFsZW50IHRvIDxrYmQ+W15iXTwva2JkPiBpbiBjYXNlLXNlbnNpdGl2ZSBtYXRjaGluZy4KLSAqICAgICAgICAgICBCdXQsIGluIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIDxrYmQ+KD9bXmJdKTwva2JkPiBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgYmVjYXVzZQotICogICAgICAgICAgIGl0IGluY2x1ZGVzICc8a2JkPkI8L2tiZD4nIGFuZCAnPGtiZD5CPC9rYmQ+JyBtYXRjaGVzICc8a2JkPmI8L2tiZD4nCi0gKiAgICAgICAgICAgdGhvdWdoIDxrYmQ+W15iXTwva2JkPiBpcyBwcm9jZXNzZWQgYXMgPGtiZD5bXkJiXTwva2JkPi4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPls8L2tiZD48dmFyPlI8c3ViPjE8L3N1Yj5SPHN1Yj4yPC9zdWI+Li4uPC92YXI+PGtiZD4tWzwva2JkPjx2YXI+UjxzdWI+bjwvc3ViPlI8c3ViPm4rMTwvc3ViPi4uLjwvdmFyPjxrYmQ+XV08L2tiZD4gKHdpdGggYW4gPGEgaHJlZj0iI1hfT1BUSU9OIj4iWCIgb3B0aW9uPC9hPik8L2R0PgotICogICAgICAgPGRkPkNoYXJhY3RlciBjbGFzcyBzdWJ0cmFjdGlvbiBmb3IgdGhlIFhNTCBTY2hlbWEuCi0gKiAgICAgICAgICAgWW91IGNhbiB1c2UgdGhpcyBzeW50YXggd2hlbiB5b3Ugc3BlY2lmeSBhbiA8YSBocmVmPSIjWF9PUFRJT04iPiJYIiBvcHRpb248L2E+LgotICogICAgICAgICAgIAotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cZDwva2JkPgotICogICAgICAgPGRkIGNsYXNzPSJSRUdFWCI+RXF1aXZhbGVudCB0byA8a2JkPlswLTldPC9rYmQ+LgotICogICAgICAgPGRkPldoZW4gPGEgaHJlZj0iI1VfT1BUSU9OIj5hICJ1IiBvcHRpb248L2E+IGlzIHNldCwgaXQgaXMgZXF1aXZhbGVudCB0bwotICogICAgICAgICAgIDxzcGFuIGNsYXNzPSJSRUdFWCI+PGtiZD5ccHtOZH08L2tiZD48L3NwYW4+LgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XEQ8L2tiZD4KLSAqICAgICAgIDxkZCBjbGFzcz0iUkVHRVgiPkVxdWl2YWxlbnQgdG8gPGtiZD5bXjAtOV08L2tiZD4KLSAqICAgICAgIDxkZD5XaGVuIDxhIGhyZWY9IiNVX09QVElPTiI+YSAidSIgb3B0aW9uPC9hPiBpcyBzZXQsIGl0IGlzIGVxdWl2YWxlbnQgdG8KLSAqICAgICAgICAgICA8c3BhbiBjbGFzcz0iUkVHRVgiPjxrYmQ+XFB7TmR9PC9rYmQ+PC9zcGFuPi4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlxzPC9rYmQ+Ci0gKiAgICAgICA8ZGQgY2xhc3M9IlJFR0VYIj5FcXVpdmFsZW50IHRvIDxrYmQ+WyBcZlxuXHJcdF08L2tiZD4KLSAqICAgICAgIDxkZD5XaGVuIDxhIGhyZWY9IiNVX09QVElPTiI+YSAidSIgb3B0aW9uPC9hPiBpcyBzZXQsIGl0IGlzIGVxdWl2YWxlbnQgdG8KLSAqICAgICAgICAgICA8c3BhbiBjbGFzcz0iUkVHRVgiPjxrYmQ+WyBcZlxuXHJcdFxwe1p9XTwva2JkPjwvc3Bhbj4uCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cUzwva2JkPgotICogICAgICAgPGRkIGNsYXNzPSJSRUdFWCI+RXF1aXZhbGVudCB0byA8a2JkPlteIFxmXG5cclx0XTwva2JkPgotICogICAgICAgPGRkPldoZW4gPGEgaHJlZj0iI1VfT1BUSU9OIj5hICJ1IiBvcHRpb248L2E+IGlzIHNldCwgaXQgaXMgZXF1aXZhbGVudCB0bwotICogICAgICAgICAgIDxzcGFuIGNsYXNzPSJSRUdFWCI+PGtiZD5bXiBcZlxuXHJcdFxwe1p9XTwva2JkPjwvc3Bhbj4uCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cdzwva2JkPgotICogICAgICAgPGRkIGNsYXNzPSJSRUdFWCI+RXF1aXZhbGVudCB0byA8a2JkPlthLXpBLVowLTlfXTwva2JkPgotICogICAgICAgPGRkPldoZW4gPGEgaHJlZj0iI1VfT1BUSU9OIj5hICJ1IiBvcHRpb248L2E+IGlzIHNldCwgaXQgaXMgZXF1aXZhbGVudCB0bwotICogICAgICAgICAgIDxzcGFuIGNsYXNzPSJSRUdFWCI+PGtiZD5bXHB7THV9XHB7TGx9XHB7TG99XHB7TmR9X108L2tiZD48L3NwYW4+LgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XFc8L2tiZD4KLSAqICAgICAgIDxkZCBjbGFzcz0iUkVHRVgiPkVxdWl2YWxlbnQgdG8gPGtiZD5bXmEtekEtWjAtOV9dPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+V2hlbiA8YSBocmVmPSIjVV9PUFRJT04iPmEgInUiIG9wdGlvbjwvYT4gaXMgc2V0LCBpdCBpcyBlcXVpdmFsZW50IHRvCi0gKiAgICAgICAgICAgPHNwYW4gY2xhc3M9IlJFR0VYIj48a2JkPlteXHB7THV9XHB7TGx9XHB7TG99XHB7TmR9X108L2tiZD48L3NwYW4+LgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XHB7PC9rYmQ+PHZhcj5uYW1lPC92YXI+PGtiZD59PC9rYmQ+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyBvbmUgY2hhcmFjdGVyIGluIHRoZSBzcGVjaWZpZWQgR2VuZXJhbCBDYXRlZ29yeSAodGhlIHNlY29uZCBmaWVsZCBpbiA8YSBocmVmPSJmdHA6Ly9mdHAudW5pY29kZS5vcmcvUHVibGljL1VOSURBVEEvVW5pY29kZURhdGEudHh0Ij48a2JkPlVuaWNvZGVEYXRhLnR4dDwva2JkPjwvYT4pIG9yIHRoZSBzcGVjaWZpZWQgPGEgaHJlZj0iZnRwOi8vZnRwLnVuaWNvZGUub3JnL1B1YmxpYy9VTklEQVRBL0Jsb2Nrcy50eHQiPkJsb2NrPC9hPi4KLSAqICAgICAgIFRoZSBmb2xsb3dpbmcgbmFtZXMgYXJlIGF2YWlsYWJsZToKLSAqICAgICAgIDxkbD4KLSAqICAgICAgICAgPGR0PlVuaWNvZGUgR2VuZXJhbCBDYXRlZ29yaWVzOgotICogICAgICAgICA8ZGQ+PGtiZD4KLSAqICAgICAgIEwsIE0sIE4sIFosIEMsIFAsIFMsIEx1LCBMbCwgTHQsIExtLCBMbywgTW4sIE1lLCBNYywgTmQsIE5sLCBObywgWnMsIFpsLCBacCwKLSAqICAgICAgIENjLCBDZiwgQ24sIENvLCBDcywgUGQsIFBzLCBQZSwgUGMsIFBvLCBTbSwgU2MsIFNrLCBTbywKLSAqICAgICAgICAgPC9rYmQ+Ci0gKiAgICAgICAgIDxkZD4oQ3VycmVudGx5IHRoZSBDbiBjYXRlZ29yeSBpbmNsdWRlcyBVKzEwMDAwLVUrMTBGRkZGIGNoYXJhY3RlcnMpCi0gKiAgICAgICAgIDxkdD5Vbmljb2RlIEJsb2NrczoKLSAqICAgICAgICAgPGRkPjxrYmQ+Ci0gKiAgICAgICBCYXNpYyBMYXRpbiwgTGF0aW4tMSBTdXBwbGVtZW50LCBMYXRpbiBFeHRlbmRlZC1BLCBMYXRpbiBFeHRlbmRlZC1CLAotICogICAgICAgSVBBIEV4dGVuc2lvbnMsIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycywgQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzLCBHcmVlaywKLSAqICAgICAgIEN5cmlsbGljLCBBcm1lbmlhbiwgSGVicmV3LCBBcmFiaWMsIERldmFuYWdhcmksIEJlbmdhbGksIEd1cm11a2hpLCBHdWphcmF0aSwKLSAqICAgICAgIE9yaXlhLCBUYW1pbCwgVGVsdWd1LCBLYW5uYWRhLCBNYWxheWFsYW0sIFRoYWksIExhbywgVGliZXRhbiwgR2VvcmdpYW4sCi0gKiAgICAgICBIYW5ndWwgSmFtbywgTGF0aW4gRXh0ZW5kZWQgQWRkaXRpb25hbCwgR3JlZWsgRXh0ZW5kZWQsIEdlbmVyYWwgUHVuY3R1YXRpb24sCi0gKiAgICAgICBTdXBlcnNjcmlwdHMgYW5kIFN1YnNjcmlwdHMsIEN1cnJlbmN5IFN5bWJvbHMsIENvbWJpbmluZyBNYXJrcyBmb3IgU3ltYm9scywKLSAqICAgICAgIExldHRlcmxpa2UgU3ltYm9scywgTnVtYmVyIEZvcm1zLCBBcnJvd3MsIE1hdGhlbWF0aWNhbCBPcGVyYXRvcnMsCi0gKiAgICAgICBNaXNjZWxsYW5lb3VzIFRlY2huaWNhbCwgQ29udHJvbCBQaWN0dXJlcywgT3B0aWNhbCBDaGFyYWN0ZXIgUmVjb2duaXRpb24sCi0gKiAgICAgICBFbmNsb3NlZCBBbHBoYW51bWVyaWNzLCBCb3ggRHJhd2luZywgQmxvY2sgRWxlbWVudHMsIEdlb21ldHJpYyBTaGFwZXMsCi0gKiAgICAgICBNaXNjZWxsYW5lb3VzIFN5bWJvbHMsIERpbmdiYXRzLCBDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24sIEhpcmFnYW5hLAotICogICAgICAgS2F0YWthbmEsIEJvcG9tb2ZvLCBIYW5ndWwgQ29tcGF0aWJpbGl0eSBKYW1vLCBLYW5idW4sCi0gKiAgICAgICBFbmNsb3NlZCBDSksgTGV0dGVycyBhbmQgTW9udGhzLCBDSksgQ29tcGF0aWJpbGl0eSwgQ0pLIFVuaWZpZWQgSWRlb2dyYXBocywKLSAqICAgICAgIEhhbmd1bCBTeWxsYWJsZXMsIEhpZ2ggU3Vycm9nYXRlcywgSGlnaCBQcml2YXRlIFVzZSBTdXJyb2dhdGVzLCBMb3cgU3Vycm9nYXRlcywKLSAqICAgICAgIFByaXZhdGUgVXNlLCBDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzLCBBbHBoYWJldGljIFByZXNlbnRhdGlvbiBGb3JtcywKLSAqICAgICAgIEFyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQSwgQ29tYmluaW5nIEhhbGYgTWFya3MsIENKSyBDb21wYXRpYmlsaXR5IEZvcm1zLAotICogICAgICAgU21hbGwgRm9ybSBWYXJpYW50cywgQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CLCBTcGVjaWFscywKLSAqICAgICAgIEhhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zCi0gKiAgICAgICAgIDwva2JkPgotICogICAgICAgICA8ZHQ+T3RoZXJzOgotICogICAgICAgICA8ZGQ+PGtiZD5BTEw8L2tiZD4gKEVxdWl2YWxlbnQgdG8gPGtiZD5bXHUwMDVjdTAwMDAtXHUwMDVjdjEwRkZGRl08L2tiZD4pCi0gKiAgICAgICAgIDxkZD48a2JkPkFTU0dJTkVEPC9rYmQ+ICg8a2JkPlxwe0FTU0lHTkVEfTwva2JkPiBpcyBlcXVpdmFsZW50IHRvIDxrYmQ+XFB7Q259PC9rYmQ+KQotICogICAgICAgICA8ZGQ+PGtiZD5VTkFTU0dJTkVEPC9rYmQ+Ci0gKiAgICAgICAgICAgICAoPGtiZD5ccHtVTkFTU0lHTkVEfTwva2JkPiBpcyBlcXVpdmFsZW50IHRvIDxrYmQ+XHB7Q259PC9rYmQ+KQotICogICAgICAgPC9kbD4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlxQezwva2JkPjx2YXI+bmFtZTwvdmFyPjxrYmQ+fTwva2JkPgotICogICAgICAgPGRkPk1hdGNoZXMgb25lIGNoYXJhY3RlciBub3QgaW4gdGhlIHNwZWNpZmllZCBHZW5lcmFsIENhdGVnb3J5IG9yIHRoZSBzcGVjaWZpZWQgQmxvY2suCi0gKiAgICAgPC9kbD4KLSAqICAgPC9saT4KLSAqCi0gKiAgIDxsaT5TZWxlY3Rpb24gYW5kIFF1YW50aWZpZXIKLSAqICAgICA8ZGw+Ci0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48VkFSPlg8L1ZBUj48a2JkPnw8L2tiZD48VkFSPlk8L1ZBUj4KLSAqICAgICAgIDxkZD4uLi4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48VkFSPlg8L1ZBUj48a2JkPio8L0tCRD4KLSAqICAgICAgIDxkZD5NYXRjaGVzIDAgb3IgbW9yZSA8dmFyPlg8L3Zhcj4uCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PFZBUj5YPC9WQVI+PGtiZD4rPC9LQkQ+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyAxIG9yIG1vcmUgPHZhcj5YPC92YXI+LgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxWQVI+WDwvVkFSPjxrYmQ+PzwvS0JEPgotICogICAgICAgPGRkPk1hdGNoZXMgMCBvciAxIDx2YXI+WDwvdmFyPi4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48dmFyPlg8L3Zhcj48a2JkPns8L2tiZD48dmFyPm51bWJlcjwvdmFyPjxrYmQ+fTwva2JkPgotICogICAgICAgPGRkPk1hdGNoZXMgPHZhcj5udW1iZXI8L3Zhcj4gdGltZXMuCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PHZhcj5YPC92YXI+PGtiZD57PC9rYmQ+PHZhcj5taW48L3Zhcj48a2JkPix9PC9rYmQ+Ci0gKiAgICAgICA8ZGQ+Li4uCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PHZhcj5YPC92YXI+PGtiZD57PC9rYmQ+PHZhcj5taW48L3Zhcj48a2JkPiw8L2tiZD48dmFyPm1heDwvdmFyPjxrYmQ+fTwva2JkPgotICogICAgICAgPGRkPi4uLgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxWQVI+WDwvVkFSPjxrYmQ+Kj88L2tiZD4KLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxWQVI+WDwvVkFSPjxrYmQ+Kz88L2tiZD4KLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxWQVI+WDwvVkFSPjxrYmQ+Pz88L2tiZD4KLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjx2YXI+WDwvdmFyPjxrYmQ+ezwva2JkPjx2YXI+bWluPC92YXI+PGtiZD4sfT88L2tiZD4KLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjx2YXI+WDwvdmFyPjxrYmQ+ezwva2JkPjx2YXI+bWluPC92YXI+PGtiZD4sPC9rYmQ+PHZhcj5tYXg8L3Zhcj48a2JkPn0/PC9rYmQ+Ci0gKiAgICAgICA8ZGQ+Tm9uLWdyZWVkeSBtYXRjaGluZy4KLSAqICAgICA8L2RsPgotICogICA8L2xpPgotICoKLSAqICAgPGxpPkdyb3VwaW5nLCBDYXB0dXJpbmcsIGFuZCBCYWNrLXJlZmVyZW5jZQotICogICAgIDxkbD4KLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxLQkQ+KD86PC9rYmQ+PFZBUj5YPC9WQVI+PGtiZD4pPC9LQkQ+Ci0gKiAgICAgICA8ZGQ+R3JvdXBpbmcuICI8S0JEPmZvbys8L0tCRD4iIG1hdGNoZXMgIjxLQkQ+Zm9vPC9LQkQ+IiBvciAiPEtCRD5mb29vbzwvS0JEPiIuCi0gKiAgICAgICBJZiB5b3Ugd2FudCBpdCBtYXRjaGVzICI8S0JEPmZvb2ZvbzwvS0JEPiIgb3IgIjxLQkQ+Zm9vZm9vZm9vPC9LQkQ+IiwKLSAqICAgICAgIHlvdSBoYXZlIHRvIHdyaXRlICI8S0JEPig/OmZvbykrPC9LQkQ+Ii4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48S0JEPig8L2tiZD48VkFSPlg8L1ZBUj48a2JkPik8L0tCRD4KLSAqICAgICAgIDxkZD5Hcm91cGluZyB3aXRoIGNhcHR1cmluZy4KLSAqIEl0IG1ha2UgYSBncm91cCBhbmQgYXBwbGljYXRpb25zIGNhbiBrbm93Ci0gKiB3aGVyZSBpbiB0YXJnZXQgdGV4dCBhIGdyb3VwIG1hdGNoZWQgd2l0aCBtZXRob2RzIG9mIGEgPGNvZGU+TWF0Y2g8L2NvZGU+IGluc3RhbmNlCi0gKiBhZnRlciA8Y29kZT48YSBocmVmPSIjbWF0Y2hlcyhqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy51dGlscy5yZWdleC5NYXRjaCkiPm1hdGNoZXMoU3RyaW5nLE1hdGNoKTwvYT48L2NvZGU+LgotICogVGhlIDB0aCBncm91cCBtZWFucyB3aG9sZSBvZiB0aGlzIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAqIFRoZSA8VkFSPk48L1ZBUj50aCBnb3J1cCBpcyB0aGUgaW5zaWRlIG9mIHRoZSA8VkFSPk48L1ZBUj50aCBsZWZ0IHBhcmVudGhlc2lzLgotICogCi0gKiAgIDxwPkZvciBpbnN0YW5jZSwgYSByZWd1bGFyIGV4cHJlc3Npb24gaXMKLSAqICAgIjxGT05UIGNvbG9yPWJsdWU+PEtCRD4gKihbXiZsdDs6XSopICsmbHQ7KFteJmd0O10qKSZndDsgKjwvS0JEPjwvRk9OVD4iCi0gKiAgIGFuZCB0YXJnZXQgdGV4dCBpcwotICogICAiPEZPTlQgY29sb3I9cmVkPjxLQkQ+RnJvbTogVEFNVVJBIEtlbnQgJmx0O2tlbnRAdHJsLmlibS5jby5qcCZndDs8L0tCRD48L0ZPTlQ+IjoKLSAqICAgPHVsPgotICogICAgIDxsaT48Y29kZT5NYXRjaC5nZXRDYXB0dXJlZFRleHQoMCk8L2NvZGU+OgotICogICAgICI8Rk9OVCBjb2xvcj1yZWQ+PEtCRD4gVEFNVVJBIEtlbnQgJmx0O2tlbnRAdHJsLmlibS5jby5qcCZndDs8L0tCRD48L0ZPTlQ+IgotICogICAgIDxsaT48Y29kZT5NYXRjaC5nZXRDYXB0dXJlZFRleHQoMSk8L2NvZGU+OiAiPEZPTlQgY29sb3I9cmVkPjxLQkQ+VEFNVVJBIEtlbnQ8L0tCRD48L0ZPTlQ+IgotICogICAgIDxsaT48Y29kZT5NYXRjaC5nZXRDYXB0dXJlZFRleHQoMik8L2NvZGU+OiAiPEZPTlQgY29sb3I9cmVkPjxLQkQ+a2VudEB0cmwuaWJtLmNvLmpwPC9LQkQ+PC9GT05UPiIKLSAqICAgPC91bD4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlwxIFwyIFwzIFw0IFw1IFw2IFw3IFw4IFw5PC9rYmQ+Ci0gKiAgICAgICA8ZGQ+Ci0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4oPz48L2tiZD48dmFyPlg8L3Zhcj48a2JkPik8L2tiZD4KLSAqICAgICAgIDxkZD5JbmRlcGVuZGVudCBleHByZXNzaW9uIGdyb3VwLiAuLi4uLi4uLi4uLi4uLi4uCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4oPzwva2JkPjx2YXI+b3B0aW9uczwvdmFyPjxrYmQ+Ojwva2JkPjx2YXI+WDwvdmFyPjxrYmQ+KTwva2JkPgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4oPzwva2JkPjx2YXI+b3B0aW9uczwvdmFyPjxrYmQ+LTwva2JkPjx2YXI+b3B0aW9uczI8L3Zhcj48a2JkPjo8L2tiZD48dmFyPlg8L3Zhcj48a2JkPik8L2tiZD4KLSAqICAgICAgIDxkZD4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0gKiAgICAgICA8ZGQ+VGhlIDx2YXI+b3B0aW9uczwvdmFyPiBvciB0aGUgPHZhcj5vcHRpb25zMjwvdmFyPiBjb25zaXN0cyBvZiAnaScgJ20nICdzJyAndycuCi0gKiAgICAgICAgICAgTm90ZSB0aGF0IGl0IGNhbiBub3QgY29udGFpbiAndScuCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4oPzwva2JkPjx2YXI+b3B0aW9uczwvdmFyPjxrYmQ+KTwva2JkPgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4oPzwva2JkPjx2YXI+b3B0aW9uczwvdmFyPjxrYmQ+LTwva2JkPjx2YXI+b3B0aW9uczI8L3Zhcj48a2JkPik8L2tiZD4KLSAqICAgICAgIDxkZD4uLi4uLi4KLSAqICAgICAgIDxkZD5UaGVzZSBleHByZXNzaW9ucyBtdXN0IGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBncm91cC4KLSAqICAgICA8L2RsPgotICogICA8L2xpPgotICoKLSAqICAgPGxpPkFuY2hvcgotICogICAgIDxkbD4KLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XEE8L2tiZD4KLSAqICAgICAgIDxkZD5NYXRjaGVzIHRoZSBiZWdpbm5pZyBvZiB0aGUgdGV4dC4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlxaPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyB0aGUgZW5kIG9mIHRoZSB0ZXh0LCBvciBiZWZvcmUgYW4gRU9MIGNoYXJhY3RlciBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LAotICogICAgICAgICAgIG9yIENBUlJJQUdFIFJFVFVSTiArIExJTkUgRkVFRCBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LgotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XHo8L2tiZD4KLSAqICAgICAgIDxkZD5NYXRjaGVzIHRoZSBlbmQgb2YgdGhlIHRleHQuCi0gKgotICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5ePC9rYmQ+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LiAgSXQgaXMgZXF1aXZhbGVudCB0byA8c3BhbiBjbGFzcz0iUkVHRVgiPjxLYmQ+XEE8L2tiZD48L3NwYW4+LgotICogICAgICAgPGRkPldoZW4gPGEgaHJlZj0iI01fT1BUSU9OIj5hICJtIiBvcHRpb248L2E+IGlzIHNldCwKLSAqICAgICAgICAgICBpdCBtYXRjaGVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQsIG9yIGFmdGVyIG9uZSBvZiBFT0wgY2hhcmFjdGVycyAoCi0gKiAgICAgICAgICAgTElORSBGRUVEIChVKzAwMEEpLCBDQVJSSUFHRSBSRVRVUk4gKFUrMDAwRCksIExJTkUgU0VQQVJBVE9SIChVKzIwMjgpLAotICogICAgICAgICAgIFBBUkFHUkFQSCBTRVBBUkFUT1IgKFUrMjAyOSkuKQotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+JDwva2JkPgotICogICAgICAgPGRkPk1hdGNoZXMgdGhlIGVuZCBvZiB0aGUgdGV4dCwgb3IgYmVmb3JlIGFuIEVPTCBjaGFyYWN0ZXIgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dCwKLSAqICAgICAgICAgICBvciBDQVJSSUFHRSBSRVRVUk4gKyBMSU5FIEZFRUQgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dC4KLSAqICAgICAgIDxkZD5XaGVuIDxhIGhyZWY9IiNNX09QVElPTiI+YSAibSIgb3B0aW9uPC9hPiBpcyBzZXQsCi0gKiAgICAgICAgICAgaXQgbWF0Y2hlcyB0aGUgZW5kIG9mIHRoZSB0ZXh0LCBvciBiZWZvcmUgYW4gRU9MIGNoYXJhY3Rlci4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlxiPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+TWF0Y2hlcyB3b3JkIGJvdW5kYXJ5LgotICogICAgICAgICAgIChTZWUgPGEgaHJlZj0iI1dfT1BUSU9OIj5hICJ3IiBvcHRpb248L2E+KQotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XEI8L2tiZD4KLSAqICAgICAgIDxkZD5NYXRjaGVzIG5vbiB3b3JkIGJvdW5kYXJ5LgotICogICAgICAgICAgIChTZWUgPGEgaHJlZj0iI1dfT1BUSU9OIj5hICJ3IiBvcHRpb248L2E+KQotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XCZsdDs8L2tiZD4KLSAqICAgICAgIDxkZD5NYXRjaGVzIHRoZSBiZWdpbm5pbmcgb2YgYSB3b3JkLgotICogICAgICAgICAgIChTZWUgPGEgaHJlZj0iI1dfT1BUSU9OIj5hICJ3IiBvcHRpb248L2E+KQotICoKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XCZndDs8L2tiZD4KLSAqICAgICAgIDxkZD5NYXRjaGVzIHRoZSBlbmQgb2YgYSB3b3JkLgotICogICAgICAgICAgIChTZWUgPGEgaHJlZj0iI1dfT1BUSU9OIj5hICJ3IiBvcHRpb248L2E+KQotICogICAgIDwvZGw+Ci0gKiAgIDwvbGk+Ci0gKiAgIDxsaT5Mb29rYWhlYWQgYW5kIGxvb2tiZWhpbmQKLSAqICAgICA8ZGw+Ci0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/PTwva2JkPjx2YXI+WDwvdmFyPjxrYmQ+KTwva2JkPgotICogICAgICAgPGRkPkxvb2thaGVhZC4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/ITwva2JkPjx2YXI+WDwvdmFyPjxrYmQ+KTwva2JkPgotICogICAgICAgPGRkPk5lZ2F0aXZlIGxvb2thaGVhZC4KLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/Jmx0Oz08L2tiZD48dmFyPlg8L3Zhcj48a2JkPik8L2tiZD4KLSAqICAgICAgIDxkZD5Mb29rYmVoaW5kLgotICogICAgICAgPGRkPihOb3RlIGZvciB0ZXh0IGNhcHR1cmluZy4uLi4uLikKLSAqCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/Jmx0OyE8L2tiZD48dmFyPlg8L3Zhcj48a2JkPik8L2tiZD4KLSAqICAgICAgIDxkZD5OZWdhdGl2ZSBsb29rYmVoaW5kLgotICogICAgIDwvZGw+Ci0gKiAgIDwvbGk+Ci0gKgotICogICA8bGk+TWlzYy4KLSAqICAgICA8ZGw+Ci0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/KDwvS2JkPjx2YXI+Y29uZGl0aW9uPC92YXI+PEtiZD4pPC9rYmQ+PHZhcj55ZXMtcGF0dGVybjwvdmFyPjxrYmQ+fDwva2JkPjx2YXI+bm8tcGF0dGVybjwvdmFyPjxrYmQ+KTwva2JkPiwKLSAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+KD8oPC9rYmQ+PHZhcj5jb25kaXRpb248L3Zhcj48a2JkPik8L2tiZD48dmFyPnllcy1wYXR0ZXJuPC92YXI+PGtiZD4pPC9rYmQ+Ci0gKiAgICAgICA8ZGQ+Li4uLi4uCi0gKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/Izwva2JkPjx2YXI+Y29tbWVudDwvdmFyPjxrYmQ+KTwva2JkPgotICogICAgICAgPGRkPkNvbW1lbnQuICBBIGNvbW1lbnQgc3RyaW5nIGNvbnNpc3RzIG9mIGNoYXJhY3RlcnMgZXhjZXB0ICc8a2JkPik8L2tiZD4nLgotICogICAgICAgICAgIFlvdSBjYW4gbm90IHdyaXRlIGNvbW1lbnRzIGluIGNoYXJhY3RlciBjbGFzc2VzIGFuZCBiZWZvcmUgcXVhbnRpZmllcnMuCi0gKiAgICAgPC9kbD4KLSAqICAgPC9saT4KLSAqIDwvdWw+Ci0gKgotICoKLSAqIDxociB3aWR0aD0iNTAlIj4KLSAqIDxoMz5CTkYgZm9yIHRoZSByZWd1bGFyIGV4cHJlc3Npb248L2gzPgotICogPHByZT4KLSAqIHJlZ2V4IDo6PSAoJyg/JyBvcHRpb25zICcpJyk/IHRlcm0gKCd8JyB0ZXJtKSoKLSAqIHRlcm0gOjo9IGZhY3RvcisKLSAqIGZhY3RvciA6Oj0gYW5jaG9ycyB8IGF0b20gKCgnKicgfCAnKycgfCAnPycgfCBtaW5tYXggKSAnPyc/ICk/Ci0gKiAgICAgICAgICAgIHwgJyg/IycgW14pXSogJyknCi0gKiBtaW5tYXggOjo9ICd7JyAoWzAtOV0rIHwgWzAtOV0rICcsJyB8ICcsJyBbMC05XSsgfCBbMC05XSsgJywnIFswLTldKykgJ30nCi0gKiBhdG9tIDo6PSBjaGFyIHwgJy4nIHwgY2hhci1jbGFzcyB8ICcoJyByZWdleCAnKScgfCAnKD86JyByZWdleCAnKScgfCAnXCcgWzAtOV0KLSAqICAgICAgICAgIHwgJ1x3JyB8ICdcVycgfCAnXGQnIHwgJ1xEJyB8ICdccycgfCAnXFMnIHwgY2F0ZWdvcnktYmxvY2sgfCAnXFgnCi0gKiAgICAgICAgICB8ICcoPz4nIHJlZ2V4ICcpJyB8ICcoPycgb3B0aW9ucyAnOicgcmVnZXggJyknCi0gKiAgICAgICAgICB8ICcoPycgKCcoJyBbMC05XSAnKScgfCAnKCcgYW5jaG9ycyAnKScgfCBsb29rcykgdGVybSAoJ3wnIHRlcm0pPyAnKScKLSAqIG9wdGlvbnMgOjo9IFtpbXN3XSogKCctJyBbaW1zd10rKT8KLSAqIGFuY2hvcnMgOjo9ICdeJyB8ICckJyB8ICdcQScgfCAnXFonIHwgJ1x6JyB8ICdcYicgfCAnXEInIHwgJ1wmbHQ7JyB8ICdcPicKLSAqIGxvb2tzIDo6PSAnKD89JyByZWdleCAnKScgIHwgJyg/IScgcmVnZXggJyknCi0gKiAgICAgICAgICAgfCAnKD8mbHQ7PScgcmVnZXggJyknIHwgJyg/Jmx0OyEnIHJlZ2V4ICcpJwotICogY2hhciA6Oj0gJ1xcJyB8ICdcJyBbZWZucnR2XSB8ICdcYycgW0AtX10gfCBjb2RlLXBvaW50IHwgY2hhcmFjdGVyLTEKLSAqIGNhdGVnb3J5LWJsb2NrIDo6PSAnXCcgW3BQXSBjYXRlZ29yeS1zeW1ib2wtMQotICogICAgICAgICAgICAgICAgICAgIHwgKCdccHsnIHwgJ1xQeycpIChjYXRlZ29yeS1zeW1ib2wgfCBibG9jay1uYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb3RoZXItcHJvcGVydGllcykgJ30nCi0gKiBjYXRlZ29yeS1zeW1ib2wtMSA6Oj0gJ0wnIHwgJ00nIHwgJ04nIHwgJ1onIHwgJ0MnIHwgJ1AnIHwgJ1MnCi0gKiBjYXRlZ29yeS1zeW1ib2wgOjo9IGNhdGVnb3J5LXN5bWJvbC0xIHwgJ0x1JyB8ICdMbCcgfCAnTHQnIHwgJ0xtJyB8IExvJwotICogICAgICAgICAgICAgICAgICAgICB8ICdNbicgfCAnTWUnIHwgJ01jJyB8ICdOZCcgfCAnTmwnIHwgJ05vJwotICogICAgICAgICAgICAgICAgICAgICB8ICdacycgfCAnWmwnIHwgJ1pwJyB8ICdDYycgfCAnQ2YnIHwgJ0NuJyB8ICdDbycgfCAnQ3MnCi0gKiAgICAgICAgICAgICAgICAgICAgIHwgJ1BkJyB8ICdQcycgfCAnUGUnIHwgJ1BjJyB8ICdQbycKLSAqICAgICAgICAgICAgICAgICAgICAgfCAnU20nIHwgJ1NjJyB8ICdTaycgfCAnU28nCi0gKiBibG9jay1uYW1lIDo6PSAoU2VlIGFib3ZlKQotICogb3RoZXItcHJvcGVydGllcyA6Oj0gJ0FMTCcgfCAnQVNTSUdORUQnIHwgJ1VOQVNTSUdORUQnCi0gKiBjaGFyYWN0ZXItMSA6Oj0gKGFueSBjaGFyYWN0ZXIgZXhjZXB0IG1ldGEtY2hhcmFjdGVycykKLSAqCi0gKiBjaGFyLWNsYXNzIDo6PSAnWycgcmFuZ2VzICddJwotICogICAgICAgICAgICAgICAgfCAnKD9bJyByYW5nZXMgJ10nIChbLSsmXSAnWycgcmFuZ2VzICddJyk/ICcpJwotICogcmFuZ2VzIDo6PSAnXic/IChyYW5nZSA8YSBocmVmPSIjQ09NTUFfT1BUSU9OIj4nLCc/PC9hPikrCi0gKiByYW5nZSA6Oj0gJ1xkJyB8ICdcdycgfCAnXHMnIHwgJ1xEJyB8ICdcVycgfCAnXFMnIHwgY2F0ZWdvcnktYmxvY2sKLSAqICAgICAgICAgICB8IHJhbmdlLWNoYXIgfCByYW5nZS1jaGFyICctJyByYW5nZS1jaGFyCi0gKiByYW5nZS1jaGFyIDo6PSAnXFsnIHwgJ1xdJyB8ICdcXCcgfCAnXCcgWywtZWZucnR2XSB8IGNvZGUtcG9pbnQgfCBjaGFyYWN0ZXItMgotICogY29kZS1wb2ludCA6Oj0gJ1x4JyBoZXgtY2hhciBoZXgtY2hhcgotICogICAgICAgICAgICAgICAgfCAnXHh7JyBoZXgtY2hhcisgJ30nCi0gKiA8IS0tICAgICAgICAgICAgICAgfCAnXHUwMDVjIHUnIGhleC1jaGFyIGhleC1jaGFyIGhleC1jaGFyIGhleC1jaGFyCi0gKiAtLT4gICAgICAgICAgICAgICB8ICdcdicgaGV4LWNoYXIgaGV4LWNoYXIgaGV4LWNoYXIgaGV4LWNoYXIgaGV4LWNoYXIgaGV4LWNoYXIKLSAqIGhleC1jaGFyIDo6PSBbMC05YS1mQS1GXQotICogY2hhcmFjdGVyLTIgOjo9IChhbnkgY2hhcmFjdGVyIGV4Y2VwdCBcW10tLCkKLSAqIDwvcHJlPgotICoKLSAqIDxociB3aWR0aD0iNTAlIj4KLSAqIDxoMz5UT0RPPC9oMz4KLSAqIDx1bD4KLSAqICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9yZXBvcnRzL3RyMTgvIj5Vbmljb2RlIFJlZ3VsYXIgRXhwcmVzc2lvbiBHdWlkZWxpbmVzPC9hPgotICogICAgIDx1bD4KLSAqICAgICAgIDxsaT4yLjQgQ2Fub25pY2FsIEVxdWl2YWxlbnRzCi0gKiAgICAgICA8bGk+TGV2ZWwgMwotICogICAgIDwvdWw+Ci0gKiAgIDxsaT5QYXJzaW5nIHBlcmZvcm1hbmNlCi0gKiA8L3VsPgotICoKLSAqIDxociB3aWR0aD0iNTAlIj4KLSAqCi0gKiBAYXV0aG9yIFRBTVVSQSBLZW50ICZsdDtrZW50QHRybC5pYm0uY28uanAmZ3Q7Ci0gKiBAdmVyc2lvbiAkSWQ6IFJlZ3VsYXJFeHByZXNzaW9uLmphdmEsdiAxLjMgMjAwMy8wOS8yNCAyMzozMTowNiBlcmljdmFzIEV4cCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWd1bGFyRXhwcmVzc2lvbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ29tcGlsZXMgYSB0b2tlbiB0cmVlIGludG8gYW4gb3BlcmF0aW9uIGZsb3cuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjb21waWxlKFRva2VuIHRvaykgewotICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25zICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHRoaXMubnVtYmVyT2ZDbG9zdXJlcyA9IDA7Ci0gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IHRoaXMuY29tcGlsZSh0b2ssIG51bGwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIHRva2VuIHRvIGFuIG9wZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIE9wIGNvbXBpbGUoVG9rZW4gdG9rLCBPcCBuZXh0LCBib29sZWFuIHJldmVyc2UpIHsKLSAgICAgICAgT3AgcmV0OwotICAgICAgICBzd2l0Y2ggKHRvay50eXBlKSB7Ci0gICAgICAgIGNhc2UgVG9rZW4uRE9UOgotICAgICAgICAgICAgcmV0ID0gT3AuY3JlYXRlRG90KCk7Ci0gICAgICAgICAgICByZXQubmV4dCA9IG5leHQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFRva2VuLkNIQVI6Ci0gICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVDaGFyKHRvay5nZXRDaGFyKCkpOwotICAgICAgICAgICAgcmV0Lm5leHQgPSBuZXh0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUb2tlbi5BTkNIT1I6Ci0gICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVBbmNob3IodG9rLmdldENoYXIoKSk7Ci0gICAgICAgICAgICByZXQubmV4dCA9IG5leHQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFRva2VuLlJBTkdFOgotICAgICAgICBjYXNlIFRva2VuLk5SQU5HRToKLSAgICAgICAgICAgIHJldCA9IE9wLmNyZWF0ZVJhbmdlKHRvayk7Ci0gICAgICAgICAgICByZXQubmV4dCA9IG5leHQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFRva2VuLkNPTkNBVDoKLSAgICAgICAgICAgIHJldCA9IG5leHQ7Ci0gICAgICAgICAgICBpZiAoIXJldmVyc2UpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gdG9rLnNpemUoKS0xOyAgaSA+PSAwOyAgaSAtLSkgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBjb21waWxlKHRvay5nZXRDaGlsZChpKSwgcmV0LCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0b2suc2l6ZSgpOyAgaSArKykgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBjb21waWxlKHRvay5nZXRDaGlsZChpKSwgcmV0LCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFRva2VuLlVOSU9OOgotICAgICAgICAgICAgT3AuVW5pb25PcCB1bmkgPSBPcC5jcmVhdGVVbmlvbih0b2suc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRvay5zaXplKCk7ICBpICsrKSB7Ci0gICAgICAgICAgICAgICAgdW5pLmFkZEVsZW1lbnQoY29tcGlsZSh0b2suZ2V0Q2hpbGQoaSksIG5leHQsIHJldmVyc2UpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldCA9IHVuaTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldC5uZXh0IGlzIG51bGwuCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFRva2VuLkNMT1NVUkU6Ci0gICAgICAgIGNhc2UgVG9rZW4uTk9OR1JFRURZQ0xPU1VSRToKLSAgICAgICAgICAgIFRva2VuIGNoaWxkID0gdG9rLmdldENoaWxkKDApOwotICAgICAgICAgICAgaW50IG1pbiA9IHRvay5nZXRNaW4oKTsKLSAgICAgICAgICAgIGludCBtYXggPSB0b2suZ2V0TWF4KCk7Ci0gICAgICAgICAgICBpZiAobWluID49IDAgJiYgbWluID09IG1heCkgeyAvLyB7bn0KLSAgICAgICAgICAgICAgICByZXQgPSBuZXh0OwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWluOyAgaSArKykgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBjb21waWxlKGNoaWxkLCByZXQsIHJldmVyc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtaW4gPiAwICYmIG1heCA+IDApCi0gICAgICAgICAgICAgICAgbWF4IC09IG1pbjsKLSAgICAgICAgICAgIGlmIChtYXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gWHsyLDZ9IC0+IFhYKFgoWChYWD8pPyk/KT8KLSAgICAgICAgICAgICAgICByZXQgPSBuZXh0OwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IG1heDsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgT3AuQ2hpbGRPcCBxID0gT3AuY3JlYXRlUXVlc3Rpb24odG9rLnR5cGUgPT0gVG9rZW4uTk9OR1JFRURZQ0xPU1VSRSk7Ci0gICAgICAgICAgICAgICAgICAgIHEubmV4dCA9IG5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIHEuc2V0Q2hpbGQoY29tcGlsZShjaGlsZCwgcmV0LCByZXZlcnNlKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IHE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBPcC5DaGlsZE9wIG9wOwotICAgICAgICAgICAgICAgIGlmICh0b2sudHlwZSA9PSBUb2tlbi5OT05HUkVFRFlDTE9TVVJFKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wID0gT3AuY3JlYXRlTm9uR3JlZWR5Q2xvc3VyZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9rZW4uQ0xPU1VSRQotICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZ2V0TWluTGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gT3AuY3JlYXRlQ2xvc3VyZSh0aGlzLm51bWJlck9mQ2xvc3VyZXMrKyk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gT3AuY3JlYXRlQ2xvc3VyZSgtMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wLm5leHQgPSBuZXh0OwotICAgICAgICAgICAgICAgIG9wLnNldENoaWxkKGNvbXBpbGUoY2hpbGQsIG9wLCByZXZlcnNlKSk7Ci0gICAgICAgICAgICAgICAgcmV0ID0gb3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWluID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IG1pbjsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gY29tcGlsZShjaGlsZCwgcmV0LCByZXZlcnNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFRva2VuLkVNUFRZOgotICAgICAgICAgICAgcmV0ID0gbmV4dDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVG9rZW4uU1RSSU5HOgotICAgICAgICAgICAgcmV0ID0gT3AuY3JlYXRlU3RyaW5nKHRvay5nZXRTdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXQubmV4dCA9IG5leHQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFRva2VuLkJBQ0tSRUZFUkVOQ0U6Ci0gICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVCYWNrUmVmZXJlbmNlKHRvay5nZXRSZWZlcmVuY2VOdW1iZXIoKSk7Ci0gICAgICAgICAgICByZXQubmV4dCA9IG5leHQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFRva2VuLlBBUkVOOgotICAgICAgICAgICAgaWYgKHRvay5nZXRQYXJlbk51bWJlcigpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXQgPSBjb21waWxlKHRvay5nZXRDaGlsZCgwKSwgbmV4dCwgcmV2ZXJzZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHJldmVyc2UpIHsKLSAgICAgICAgICAgICAgICBuZXh0ID0gT3AuY3JlYXRlQ2FwdHVyZSh0b2suZ2V0UGFyZW5OdW1iZXIoKSwgbmV4dCk7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IGNvbXBpbGUodG9rLmdldENoaWxkKDApLCBuZXh0LCByZXZlcnNlKTsKLSAgICAgICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVDYXB0dXJlKC10b2suZ2V0UGFyZW5OdW1iZXIoKSwgbmV4dCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5leHQgPSBPcC5jcmVhdGVDYXB0dXJlKC10b2suZ2V0UGFyZW5OdW1iZXIoKSwgbmV4dCk7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IGNvbXBpbGUodG9rLmdldENoaWxkKDApLCBuZXh0LCByZXZlcnNlKTsKLSAgICAgICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVDYXB0dXJlKHRvay5nZXRQYXJlbk51bWJlcigpLCBuZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVG9rZW4uTE9PS0FIRUFEOgotICAgICAgICAgICAgcmV0ID0gT3AuY3JlYXRlTG9vayhPcC5MT09LQUhFQUQsIG5leHQsIGNvbXBpbGUodG9rLmdldENoaWxkKDApLCBudWxsLCBmYWxzZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVG9rZW4uTkVHQVRJVkVMT09LQUhFQUQ6Ci0gICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVMb29rKE9wLk5FR0FUSVZFTE9PS0FIRUFELCBuZXh0LCBjb21waWxlKHRvay5nZXRDaGlsZCgwKSwgbnVsbCwgZmFsc2UpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRva2VuLkxPT0tCRUhJTkQ6Ci0gICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVMb29rKE9wLkxPT0tCRUhJTkQsIG5leHQsIGNvbXBpbGUodG9rLmdldENoaWxkKDApLCBudWxsLCB0cnVlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUb2tlbi5ORUdBVElWRUxPT0tCRUhJTkQ6Ci0gICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVMb29rKE9wLk5FR0FUSVZFTE9PS0JFSElORCwgbmV4dCwgY29tcGlsZSh0b2suZ2V0Q2hpbGQoMCksIG51bGwsIHRydWUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVG9rZW4uSU5ERVBFTkRFTlQ6Ci0gICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVJbmRlcGVuZGVudChuZXh0LCBjb21waWxlKHRvay5nZXRDaGlsZCgwKSwgbnVsbCwgcmV2ZXJzZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUb2tlbi5NT0RJRklFUkdST1VQOgotICAgICAgICAgICAgcmV0ID0gT3AuY3JlYXRlTW9kaWZpZXIobmV4dCwgY29tcGlsZSh0b2suZ2V0Q2hpbGQoMCksIG51bGwsIHJldmVyc2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUb2tlbi5Nb2RpZmllclRva2VuKXRvaykuZ2V0T3B0aW9ucygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUb2tlbi5Nb2RpZmllclRva2VuKXRvaykuZ2V0T3B0aW9uc01hc2soKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFRva2VuLkNPTkRJVElPTjoKLSAgICAgICAgICAgIFRva2VuLkNvbmRpdGlvblRva2VuIGN0b2sgPSAoVG9rZW4uQ29uZGl0aW9uVG9rZW4pdG9rOwotICAgICAgICAgICAgaW50IHJlZiA9IGN0b2sucmVmTnVtYmVyOwotICAgICAgICAgICAgT3AgY29uZGl0aW9uID0gY3Rvay5jb25kaXRpb24gPT0gbnVsbCA/IG51bGwgOiBjb21waWxlKGN0b2suY29uZGl0aW9uLCBudWxsLCByZXZlcnNlKTsKLSAgICAgICAgICAgIE9wIHllcyA9IGNvbXBpbGUoY3Rvay55ZXMsIG5leHQsIHJldmVyc2UpOwotICAgICAgICAgICAgT3Agbm8gPSBjdG9rLm5vID09IG51bGwgPyBudWxsIDogY29tcGlsZShjdG9rLm5vLCBuZXh0LCByZXZlcnNlKTsKLSAgICAgICAgICAgIHJldCA9IE9wLmNyZWF0ZUNvbmRpdGlvbihuZXh0LCByZWYsIGNvbmRpdGlvbiwgeWVzLCBubyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gdG9rZW4gdHlwZTogIit0b2sudHlwZSk7Ci0gICAgICAgIH0gLy8gc3dpdGNoICh0b2sudHlwZSkKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLQotLy9QdWJsaWMKLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSA8dmFyPnRhcmdldDwvdmFyPiB0ZXh0IDxzdHJvbmc+Y29udGFpbnM8L3N0cm9uZz4gdGhpcyBwYXR0ZXJuIG9yIG5vdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGlzIG1hdGNoZWQgdG8gdGhpcyByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhjaGFyW10gIHRhcmdldCkgewotICAgICAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHRhcmdldCwgMCwgIHRhcmdldCAubGVuZ3RoICwgKE1hdGNoKW51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSA8dmFyPnRhcmdldDwvdmFyPiB0ZXh0IDxzdHJvbmc+Y29udGFpbnM8L3N0cm9uZz4gdGhpcyBwYXR0ZXJuCi0gICAgICogaW4gc3BlY2lmaWVkIHJhbmdlIG9yIG5vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGFydCBTdGFydCBvZmZzZXQgb2YgdGhlIHJhbmdlLgotICAgICAqIEBwYXJhbSBlbmQgIEVuZCBvZmZzZXQgKzEgb2YgdGhlIHJhbmdlLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGlzIG1hdGNoZWQgdG8gdGhpcyByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhjaGFyW10gIHRhcmdldCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXModGFyZ2V0LCBzdGFydCwgZW5kLCAoTWF0Y2gpbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIDx2YXI+dGFyZ2V0PC92YXI+IHRleHQgPHN0cm9uZz5jb250YWluczwvc3Ryb25nPiB0aGlzIHBhdHRlcm4gb3Igbm90LgotICAgICAqCi0gICAgICogQHBhcmFtIG1hdGNoIEEgTWF0Y2ggaW5zdGFuY2UgZm9yIHN0b3JpbmcgbWF0Y2hpbmcgcmVzdWx0LgotICAgICAqIEByZXR1cm4gT2Zmc2V0IG9mIHRoZSBzdGFydCBwb3NpdGlvbiBpbiA8VkFSPnRhcmdldDwvVkFSPjsgb3IgLTEgaWYgbm90IG1hdGNoLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoY2hhcltdICB0YXJnZXQsIE1hdGNoIG1hdGNoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXModGFyZ2V0LCAwLCAgdGFyZ2V0IC5sZW5ndGggLCBtYXRjaCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgPHZhcj50YXJnZXQ8L3Zhcj4gdGV4dCA8c3Ryb25nPmNvbnRhaW5zPC9zdHJvbmc+IHRoaXMgcGF0dGVybgotICAgICAqIGluIHNwZWNpZmllZCByYW5nZSBvciBub3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnQgU3RhcnQgb2Zmc2V0IG9mIHRoZSByYW5nZS4KLSAgICAgKiBAcGFyYW0gZW5kICBFbmQgb2Zmc2V0ICsxIG9mIHRoZSByYW5nZS4KLSAgICAgKiBAcGFyYW0gbWF0Y2ggQSBNYXRjaCBpbnN0YW5jZSBmb3Igc3RvcmluZyBtYXRjaGluZyByZXN1bHQuCi0gICAgICogQHJldHVybiBPZmZzZXQgb2YgdGhlIHN0YXJ0IHBvc2l0aW9uIGluIDxWQVI+dGFyZ2V0PC9WQVI+OyBvciAtMSBpZiBub3QgbWF0Y2guCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhjaGFyW10gIHRhcmdldCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBNYXRjaCBtYXRjaCkgewotCi0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9ucyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRoaXMucHJlcGFyZSgpOwotICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IG5ldyBDb250ZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29udGV4dCBjb24gPSBudWxsOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMuY29udGV4dCkgewotICAgICAgICAgICAgY29uID0gdGhpcy5jb250ZXh0LmludXNlID8gbmV3IENvbnRleHQoKSA6IHRoaXMuY29udGV4dDsKLSAgICAgICAgICAgIGNvbi5yZXNldCh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXMubnVtYmVyT2ZDbG9zdXJlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1hdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1hdGNoLnNldE51bWJlck9mR3JvdXBzKHRoaXMubm9mcGFyZW4pOwotICAgICAgICAgICAgbWF0Y2guc2V0U291cmNlKHRhcmdldCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNCYWNrUmVmZXJlbmNlcykgewotICAgICAgICAgICAgbWF0Y2ggPSBuZXcgTWF0Y2goKTsKLSAgICAgICAgICAgIG1hdGNoLnNldE51bWJlck9mR3JvdXBzKHRoaXMubm9mcGFyZW4pOwotICAgICAgICAgICAgLy8gTmVlZCBub3QgdG8gY2FsbCBzZXRTb3VyY2UoKSBiZWNhdXNlCi0gICAgICAgICAgICAvLyBhIGNhbGxlciBjYW4gbm90IGFjY2VzcyB0aGlzIG1hdGNoIGluc3RhbmNlLgotICAgICAgICB9Ci0gICAgICAgIGNvbi5tYXRjaCA9IG1hdGNoOwotCi0gICAgICAgIGlmICh0aGlzLmlzU2V0KHRoaXMub3B0aW9ucywgWE1MU0NIRU1BX01PREUpKSB7Ci0gICAgICAgICAgICBpbnQgbWF0Y2hFbmQgPSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCB0aGlzLm9wZXJhdGlvbnMsIGNvbi5zdGFydCwgMSwgdGhpcy5vcHRpb25zKTsKLSAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJERUJVRzogbWF0Y2hFbmQ9IittYXRjaEVuZCk7Ci0gICAgICAgICAgICBpZiAobWF0Y2hFbmQgPT0gY29uLmxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbi5tYXRjaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcoMCwgY29uLnN0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEVuZCgwLCBtYXRjaEVuZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlIHBhdHRlcm4gaGFzIG9ubHkgZml4ZWQgc3RyaW5nLgotICAgICAgICAgKiBUaGUgZW5naW5lIHVzZXMgQm95ZXItTW9vcmUuCi0gICAgICAgICAqLwotICAgICAgICBpZiAodGhpcy5maXhlZFN0cmluZ09ubHkpIHsKLSAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJERUJVRzogZml4ZWQtb25seTogIit0aGlzLmZpeGVkU3RyaW5nKTsKLSAgICAgICAgICAgIGludCBvID0gdGhpcy5maXhlZFN0cmluZ1RhYmxlLm1hdGNoZXModGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCk7Ci0gICAgICAgICAgICBpZiAobyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbi5tYXRjaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcoMCwgbyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRFbmQoMCwgbyt0aGlzLmZpeGVkU3RyaW5nLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZSBwYXR0ZXJuIGNvbnRhaW5zIGEgZml4ZWQgc3RyaW5nLgotICAgICAgICAgKiBUaGUgZW5naW5lIGNoZWNrcyB3aXRoIEJveWVyLU1vb3JlIHdoZXRoZXIgdGhlIHRleHQgY29udGFpbnMgdGhlIGZpeGVkIHN0cmluZyBvciBub3QuCi0gICAgICAgICAqIElmIG5vdCwgaXQgcmV0dXJuIHdpdGggZmFsc2UuCi0gICAgICAgICAqLwotICAgICAgICBpZiAodGhpcy5maXhlZFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgbyA9IHRoaXMuZml4ZWRTdHJpbmdUYWJsZS5tYXRjaGVzKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQpOwotICAgICAgICAgICAgaWYgKG8gPCAwKSB7Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIk5vbi1tYXRjaCBpbiBmaXhlZC1zdHJpbmcgc2VhcmNoLiIpOwotICAgICAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludCBsaW1pdCA9IGNvbi5saW1pdC10aGlzLm1pbmxlbmd0aDsKLSAgICAgICAgaW50IG1hdGNoU3RhcnQ7Ci0gICAgICAgIGludCBtYXRjaEVuZCA9IC0xOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBleHByZXNzaW9uIHN0YXJ0cyB3aXRoICIuKiIuCi0gICAgICAgICAqLwotICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25zICE9IG51bGwKLSAgICAgICAgICAgICYmIHRoaXMub3BlcmF0aW9ucy50eXBlID09IE9wLkNMT1NVUkUgJiYgdGhpcy5vcGVyYXRpb25zLmdldENoaWxkKCkudHlwZSA9PSBPcC5ET1QpIHsKLSAgICAgICAgICAgIGlmIChpc1NldCh0aGlzLm9wdGlvbnMsIFNJTkdMRV9MSU5FKSkgewotICAgICAgICAgICAgICAgIG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7Ci0gICAgICAgICAgICAgICAgbWF0Y2hFbmQgPSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCB0aGlzLm9wZXJhdGlvbnMsIGNvbi5zdGFydCwgMSwgdGhpcy5vcHRpb25zKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBwcmV2aW91c0lzRU9MID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7ICBtYXRjaFN0YXJ0IDw9IGxpbWl0OyAgbWF0Y2hTdGFydCArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IFsgIG1hdGNoU3RhcnQgXSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0VPTENoYXIoY2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0lzRU9MID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0lzRU9MKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPD0gKG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgdGhpcy5vcGVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0lzRU9MID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBPcHRpbWl6YXRpb24gYWdhaW5zdCB0aGUgZmlyc3QgY2hhcmFjdGVyLgotICAgICAgICAgKi8KLSAgICAgICAgZWxzZSBpZiAodGhpcy5maXJzdENoYXIgIT0gbnVsbCkgewotICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIkRFQlVHOiB3aXRoIGZpcnN0Y2hhci1tYXRjaGluZzogIit0aGlzLmZpcnN0Q2hhcik7Ci0gICAgICAgICAgICBSYW5nZVRva2VuIHJhbmdlID0gdGhpcy5maXJzdENoYXI7Ci0gICAgICAgICAgICBpZiAodGhpcy5pc1NldCh0aGlzLm9wdGlvbnMsIElHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgIHJhbmdlID0gdGhpcy5maXJzdENoYXIuZ2V0Q2FzZUluc2Vuc2l0aXZlVG9rZW4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7ICBtYXRjaFN0YXJ0IDw9IGxpbWl0OyAgbWF0Y2hTdGFydCArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IFsgIG1hdGNoU3RhcnQgXSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoKSAmJiBtYXRjaFN0YXJ0KzEgPCBjb24ubGltaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyhjaCwgIHRhcmdldCBbICBtYXRjaFN0YXJ0KzEgXSApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChjaCkpICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goY2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjaDEgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpY2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goY2gxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2gxKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoMCA8PSAobWF0Y2hFbmQgPSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCB0aGlzLm9wZXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChtYXRjaFN0YXJ0ID0gY29uLnN0YXJ0OyAgbWF0Y2hTdGFydCA8PSBsaW1pdDsgIG1hdGNoU3RhcnQgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCBbICBtYXRjaFN0YXJ0IF0gOwotICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgbWF0Y2hTdGFydCsxIDwgY29uLmxpbWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoLCAgdGFyZ2V0IFsgIG1hdGNoU3RhcnQrMSBdICk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goY2gpKSAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgwIDw9IChtYXRjaEVuZCA9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIHRoaXMub3BlcmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoU3RhcnQsIDEsIHRoaXMub3B0aW9ucykpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU3RyYWlnaHRmb3J3YXJkIG1hdGNoaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7ICBtYXRjaFN0YXJ0IDw9IGxpbWl0OyAgbWF0Y2hTdGFydCArKykgewotICAgICAgICAgICAgICAgIGlmICgwIDw9IChtYXRjaEVuZCA9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIHRoaXMub3BlcmF0aW9ucywgbWF0Y2hTdGFydCwgMSwgdGhpcy5vcHRpb25zKSkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1hdGNoRW5kID49IDApIHsKLSAgICAgICAgICAgIGlmIChjb24ubWF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcoMCwgbWF0Y2hTdGFydCk7Ci0gICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEVuZCgwLCBtYXRjaEVuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLS8qKgotICogQHJldHVybiAtMSB3aGVuIG5vdCBtYXRjaDsgb2Zmc2V0IG9mIHRoZSBlbmQgb2YgbWF0Y2hlZCBzdHJpbmcgd2hlbiBtYXRjaC4KLSAqLwotICAgIHByaXZhdGUgaW50IG1hdGNoQ2hhckFycmF5IChDb250ZXh0IGNvbiwgT3Agb3AsIGludCBvZmZzZXQsIGludCBkeCwgaW50IG9wdHMpIHsKLQotICAgICAgICBjaGFyW10gdGFyZ2V0ID0gY29uLmNoYXJUYXJnZXQ7Ci0KLQotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgaWYgKG9wID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGlzU2V0KG9wdHMsIFhNTFNDSEVNQV9NT0RFKSAmJiBvZmZzZXQgIT0gY29uLmxpbWl0ID8gLTEgOiBvZmZzZXQ7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0ID4gY29uLmxpbWl0IHx8IG9mZnNldCA8IGNvbi5zdGFydCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICBzd2l0Y2ggKG9wLnR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgT3AuQ0hBUjoKLSAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9IG9wLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBjb24ubGltaXQgfHwgIW1hdGNoSWdub3JlQ2FzZShjaCwgIHRhcmdldCBbICBvZmZzZXQgXSApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBvMSA9IG9mZnNldC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8xID49IGNvbi5saW1pdCB8fCBvMSA8IDAgfHwgIW1hdGNoSWdub3JlQ2FzZShjaCwgIHRhcmdldCBbICBvMSBdICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbzE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSBvcC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gY29uLmxpbWl0IHx8IGNoICE9ICB0YXJnZXQgWyAgb2Zmc2V0IF0gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBvMSA9IG9mZnNldC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8xID49IGNvbi5saW1pdCB8fCBvMSA8IDAgfHwgY2ggIT0gIHRhcmdldCBbICBvMSBdICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuRE9UOgotICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBjb24ubGltaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgWyAgb2Zmc2V0IF0gOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgU0lOR0xFX0xJTkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgb2Zmc2V0KzEgPCBjb24ubGltaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG9mZnNldCsxIDwgY29uLmxpbWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyhjaCwgIHRhcmdldCBbICArK29mZnNldCBdICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNFT0xDaGFyKGNoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBvMSA9IG9mZnNldC0xOwotICAgICAgICAgICAgICAgICAgICBpZiAobzEgPj0gY29uLmxpbWl0IHx8IG8xIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCBbICBvMSBdIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIFNJTkdMRV9MSU5FKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0xvd1N1cnJvZ2F0ZShjaCkgJiYgbzEtMSA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8xIC0tOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0xvd1N1cnJvZ2F0ZShjaCkgJiYgbzEtMSA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyggdGFyZ2V0IFsgIC0tbzEgXSAsIGNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNFT0xDaGFyKGNoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbzE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5SQU5HRToKLSAgICAgICAgICAgIGNhc2UgT3AuTlJBTkdFOgotICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBjb24ubGltaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgWyAgb2Zmc2V0IF0gOwotICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgb2Zmc2V0KzEgPCBjb24ubGltaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoY2gsICB0YXJnZXQgWyAgKytvZmZzZXQgXSApOwotICAgICAgICAgICAgICAgICAgICBSYW5nZVRva2VuIHRvayA9IG9wLmdldFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBJR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvayA9IHRvay5nZXRDYXNlSW5zZW5zaXRpdmVUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2goY2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID49IDB4MTAwMDApICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1Y2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2godWNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXRvay5tYXRjaChDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKGNoKSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG8xID0gb2Zmc2V0LTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvMSA+PSBjb24ubGltaXQgfHwgbzEgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IFsgIG8xIF0gOwotICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzTG93U3Vycm9nYXRlKGNoKSAmJiBvMS0xID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoIHRhcmdldCBbICAtLW8xIF0gLCBjaCk7Ci0gICAgICAgICAgICAgICAgICAgIFJhbmdlVG9rZW4gdG9rID0gb3AuZ2V0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9rID0gdG9rLmdldENhc2VJbnNlbnNpdGl2ZVRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaChjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHgxMDAwMCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVjaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaCh1Y2ggPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpY2gpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhdG9rLm1hdGNoKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh1Y2gpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2goY2gpKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG8xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuQU5DSE9SOgotICAgICAgICAgICAgICAgIGJvb2xlYW4gZ28gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wLmdldERhdGEoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgJ14nOgotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgTVVMVElQTEVfTElORVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLnN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQgPiBjb24uc3RhcnQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgWyAgb2Zmc2V0LTEgXSApKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9IGNvbi5zdGFydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdAJzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWwgdXNlIG9ubHkuCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBAIGFsd2F5cyBtYXRjaGVzIGxpbmUgYmVnaW5uaW5ncy4KLSAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5zdGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQgPiBjb24uc3RhcnQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgWyAgb2Zmc2V0LTEgXSApKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICckJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIE1VTFRJUExFX0xJTkVTKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5saW1pdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0IDwgY29uLmxpbWl0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IFsgIG9mZnNldCBdICkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9mZnNldCA9PSBjb24ubGltaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCsxID09IGNvbi5saW1pdCAmJiBpc0VPTENoYXIoIHRhcmdldCBbICBvZmZzZXQgXSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQrMiA9PSBjb24ubGltaXQgJiYgIHRhcmdldCBbICBvZmZzZXQgXSAgPT0gQ0FSUklBR0VfUkVUVVJOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAgdGFyZ2V0IFsgIG9mZnNldCsxIF0gID09IExJTkVfRkVFRCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnQSc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgIT0gY29uLnN0YXJ0KSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ1onOgotICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLmxpbWl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCsxID09IGNvbi5saW1pdCAmJiBpc0VPTENoYXIoIHRhcmdldCBbICBvZmZzZXQgXSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCsyID09IGNvbi5saW1pdCAmJiAgdGFyZ2V0IFsgIG9mZnNldCBdICA9PSBDQVJSSUFHRV9SRVRVUk4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIHRhcmdldCBbICBvZmZzZXQrMSBdICA9PSBMSU5FX0ZFRUQpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ3onOgotICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9IGNvbi5saW1pdCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdiJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5sZW5ndGggPT0gMCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFmdGVyID0gZ2V0V29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlciA9PSBXVF9JR05PUkUpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmVmb3JlID0gZ2V0UHJldmlvdXNXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyID09IGJlZm9yZSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ0InOgotICAgICAgICAgICAgICAgICAgICBpZiAoY29uLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgZ28gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZnRlciA9IGdldFdvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnbyA9IGFmdGVyID09IFdUX0lHTk9SRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBhZnRlciA9PSBnZXRQcmV2aW91c1dvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFnbykgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICc8JzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5sZW5ndGggPT0gMCB8fCBvZmZzZXQgPT0gY29uLmxpbWl0KSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0V29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKSAhPSBXVF9MRVRURVIKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGdldFByZXZpb3VzV29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKSAhPSBXVF9PVEhFUikKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICc+JzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5sZW5ndGggPT0gMCB8fCBvZmZzZXQgPT0gY29uLnN0YXJ0KSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0V29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKSAhPSBXVF9PVEhFUgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgZ2V0UHJldmlvdXNXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpICE9IFdUX0xFVFRFUikKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSAvLyBzd2l0Y2ggYW5jaG9yIHR5cGUKLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuQkFDS1JFRkVSRU5DRToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZWZubyA9IG9wLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlZm5vIDw9IDAgfHwgcmVmbm8gPj0gdGhpcy5ub2ZwYXJlbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogUmVmZXJlbmNlIG51bWJlciBtdXN0IGJlIG1vcmUgdGhhbiB6ZXJvOiAiK3JlZm5vKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5tYXRjaC5nZXRCZWdpbm5pbmcocmVmbm8pIDwgMAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgY29uLm1hdGNoLmdldEVuZChyZWZubykgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAvLyAqKioqKioqKgotICAgICAgICAgICAgICAgICAgICBpbnQgbzIgPSBjb24ubWF0Y2guZ2V0QmVnaW5uaW5nKHJlZm5vKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxpdGVyYWxsZW4gPSBjb24ubWF0Y2guZ2V0RW5kKHJlZm5vKS1vMjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NldChvcHRzLCBJR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXModGFyZ2V0LCBvZmZzZXQsIGNvbi5saW1pdCwgbzIsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlcyh0YXJnZXQsIG9mZnNldC1saXRlcmFsbGVuLCBjb24ubGltaXQsIG8yLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UodGFyZ2V0LCBvZmZzZXQsIGNvbi5saW1pdCwgbzIsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UodGFyZ2V0LCBvZmZzZXQtbGl0ZXJhbGxlbiwgY29uLmxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbzIsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPcC5TVFJJTkc6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGl0ZXJhbCA9IG9wLmdldFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBpbnQgbGl0ZXJhbGxlbiA9IGxpdGVyYWwubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzKHRhcmdldCwgb2Zmc2V0LCBjb24ubGltaXQsIGxpdGVyYWwsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlcyh0YXJnZXQsIG9mZnNldC1saXRlcmFsbGVuLCBjb24ubGltaXQsIGxpdGVyYWwsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzSWdub3JlQ2FzZSh0YXJnZXQsIG9mZnNldCwgY29uLmxpbWl0LCBsaXRlcmFsLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKHRhcmdldCwgb2Zmc2V0LWxpdGVyYWxsZW4sIGNvbi5saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdGVyYWwsIGxpdGVyYWxsZW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IGxpdGVyYWxsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLkNMT1NVUkU6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBTYXZlcyBjdXJyZW50IHBvc2l0aW9uIHRvIGF2b2lkCi0gICAgICAgICAgICAgICAgICAgICAqIHplcm8td2lkdGggcmVwZWF0cy4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGludCBpZCA9IG9wLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmV2aW91c09mZnNldCA9IGNvbi5vZmZzZXRzW2lkXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c09mZnNldCA8IDAgfHwgcHJldmlvdXNPZmZzZXQgIT0gb2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uLm9mZnNldHNbaWRdID0gb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb24ub2Zmc2V0c1tpZF0gPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpZCA+PSAwKSAgY29uLm9mZnNldHNbaWRdID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuUVVFU1RJT046Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuTk9OR1JFRURZQ0xPU1VSRToKLSAgICAgICAgICAgIGNhc2UgT3AuTk9OR1JFRURZUVVFU1RJT046Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AubmV4dCwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9wID0gb3AuZ2V0Q2hpbGQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuVU5JT046Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgb3Auc2l6ZSgpOyAgaSArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AuZWxlbWVudEF0KGkpLCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVOSU9OOiAiK2krIiwgcmV0PSIrcmV0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuQ0FQVFVSRToKLSAgICAgICAgICAgICAgICBpbnQgcmVmbm8gPSBvcC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbi5tYXRjaCAhPSBudWxsICYmIHJlZm5vID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgc2F2ZSA9IGNvbi5tYXRjaC5nZXRCZWdpbm5pbmcocmVmbm8pOwotICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0QmVnaW5uaW5nKHJlZm5vLCBvZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AubmV4dCwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSAgY29uLm1hdGNoLnNldEJlZ2lubmluZyhyZWZubywgc2F2ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb24ubWF0Y2ggIT0gbnVsbCAmJiByZWZubyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gLXJlZm5vOwotICAgICAgICAgICAgICAgICAgICBpbnQgc2F2ZSA9IGNvbi5tYXRjaC5nZXRFbmQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0RW5kKGluZGV4LCBvZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AubmV4dCwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSAgY29uLm1hdGNoLnNldEVuZChpbmRleCwgc2F2ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5MT09LQUhFQUQ6Ci0gICAgICAgICAgICAgICAgaWYgKDAgPiB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIDEsIG9wdHMpKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT3AuTkVHQVRJVkVMT09LQUhFQUQ6Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCAxLCBvcHRzKSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9wLkxPT0tCRUhJTkQ6Ci0gICAgICAgICAgICAgICAgaWYgKDAgPiB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIC0xLCBvcHRzKSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9wLk5FR0FUSVZFTE9PS0JFSElORDoKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIC0xLCBvcHRzKSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuSU5ERVBFTkRFTlQ6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcmV0OwotICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLk1PRElGSUVSOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxvY2Fsb3B0cyA9IG9wdHM7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2Fsb3B0cyB8PSBvcC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2Fsb3B0cyAmPSB+b3AuZ2V0RGF0YTIoKTsKLSAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIk1PRElGSUVSOiAiK0ludGVnZXIudG9TdHJpbmcob3B0cywgMTYpKyIgLT4gIitJbnRlZ2VyLnRvU3RyaW5nKGxvY2Fsb3B0cywgMTYpKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgZHgsIGxvY2Fsb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcmV0OwotICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLkNPTkRJVElPTjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE9wLkNvbmRpdGlvbk9wIGNvcCA9IChPcC5Db25kaXRpb25PcClvcDsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtYXRjaHAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvcC5yZWZOdW1iZXIgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29wLnJlZk51bWJlciA+PSB0aGlzLm5vZnBhcmVuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogUmVmZXJlbmNlIG51bWJlciBtdXN0IGJlIG1vcmUgdGhhbiB6ZXJvOiAiK2NvcC5yZWZOdW1iZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hwID0gY29uLm1hdGNoLmdldEJlZ2lubmluZyhjb3AucmVmTnVtYmVyKSA+PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjb24ubWF0Y2guZ2V0RW5kKGNvcC5yZWZOdW1iZXIpID49IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaHAgPSAwIDw9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIGNvcC5jb25kaXRpb24sIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNocCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBjb3AueWVzOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvcC5ubyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcCA9IGNvcC5ubzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gY29wLm5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gb3BlcmF0aW9uIHR5cGU6ICIrb3AudHlwZSk7Ci0gICAgICAgICAgICB9IC8vIHN3aXRjaCAob3AudHlwZSkKLSAgICAgICAgfSAvLyB3aGlsZQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBnZXRQcmV2aW91c1dvcmRUeXBlKGNoYXJbXSAgdGFyZ2V0LCBpbnQgYmVnaW4sIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IG9wdHMpIHsKLSAgICAgICAgaW50IHJldCA9IGdldFdvcmRUeXBlKHRhcmdldCwgYmVnaW4sIGVuZCwgLS1vZmZzZXQsIG9wdHMpOwotICAgICAgICB3aGlsZSAocmV0ID09IFdUX0lHTk9SRSkKLSAgICAgICAgICAgIHJldCA9IGdldFdvcmRUeXBlKHRhcmdldCwgYmVnaW4sIGVuZCwgLS1vZmZzZXQsIG9wdHMpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBnZXRXb3JkVHlwZShjaGFyW10gIHRhcmdldCwgaW50IGJlZ2luLCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgb3B0cykgewotICAgICAgICBpZiAob2Zmc2V0IDwgYmVnaW4gfHwgb2Zmc2V0ID49IGVuZCkgIHJldHVybiBXVF9PVEhFUjsKLSAgICAgICAgcmV0dXJuIGdldFdvcmRUeXBlMCggdGFyZ2V0IFsgIG9mZnNldCBdICwgb3B0cyk7Ci0gICAgfQotCi0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhjaGFyW10gIHRhcmdldCwgaW50IG9mZnNldCwgaW50IGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydCwgaW50IHBhcnRsZW4pIHsKLSAgICAgICAgaWYgKG9mZnNldCA8IDApICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChsaW1pdC1vZmZzZXQgPCBwYXJ0bGVuKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChwYXJ0bGVuLS0gPiAwKSB7Ci0gICAgICAgICAgICBpZiAoIHRhcmdldCBbICBvZmZzZXQrKyBdICAhPSBwYXJ0LmNoYXJBdChpKyspKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHJlZ2lvbk1hdGNoZXMoY2hhcltdICB0YXJnZXQsIGludCBvZmZzZXQsIGludCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldDIsIGludCBwYXJ0bGVuKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAobGltaXQtb2Zmc2V0IDwgcGFydGxlbikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaW50IGkgPSBvZmZzZXQyOwotICAgICAgICB3aGlsZSAocGFydGxlbi0tID4gMCkgewotICAgICAgICAgICAgaWYgKCB0YXJnZXQgWyAgb2Zmc2V0KysgXSAgIT0gIHRhcmdldCBbICBpKysgXSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotLyoqCi0gKiBAc2VlIGphdmEubGFuZy5TdHJpbmcjcmVnaW9uTWF0Y2hlcwotICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShjaGFyW10gIHRhcmdldCwgaW50IG9mZnNldCwgaW50IGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnQsIGludCBwYXJ0bGVuKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAobGltaXQtb2Zmc2V0IDwgcGFydGxlbikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAocGFydGxlbi0tID4gMCkgewotICAgICAgICAgICAgY2hhciBjaDEgPSAgdGFyZ2V0IFsgIG9mZnNldCsrIF0gOwotICAgICAgICAgICAgY2hhciBjaDIgPSBwYXJ0LmNoYXJBdChpKyspOwotICAgICAgICAgICAgaWYgKGNoMSA9PSBjaDIpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBjaGFyIHVjaDEgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gxKTsKLSAgICAgICAgICAgIGNoYXIgdWNoMiA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDIpOwotICAgICAgICAgICAgaWYgKHVjaDEgPT0gdWNoMikKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoMSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaDIpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKGNoYXJbXSAgdGFyZ2V0LCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0MiwgaW50IHBhcnRsZW4pIHsKLSAgICAgICAgaWYgKG9mZnNldCA8IDApICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChsaW1pdC1vZmZzZXQgPCBwYXJ0bGVuKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpbnQgaSA9IG9mZnNldDI7Ci0gICAgICAgIHdoaWxlIChwYXJ0bGVuLS0gPiAwKSB7Ci0gICAgICAgICAgICBjaGFyIGNoMSA9ICB0YXJnZXQgWyAgb2Zmc2V0KysgXSA7Ci0gICAgICAgICAgICBjaGFyIGNoMiA9ICB0YXJnZXQgWyAgaSsrIF0gOwotICAgICAgICAgICAgaWYgKGNoMSA9PSBjaDIpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBjaGFyIHVjaDEgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gxKTsKLSAgICAgICAgICAgIGNoYXIgdWNoMiA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDIpOwotICAgICAgICAgICAgaWYgKHVjaDEgPT0gdWNoMikKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoMSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaDIpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLQotCi0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgPHZhcj50YXJnZXQ8L3Zhcj4gdGV4dCA8c3Ryb25nPmNvbnRhaW5zPC9zdHJvbmc+IHRoaXMgcGF0dGVybiBvciBub3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBpcyBtYXRjaGVkIHRvIHRoaXMgcmVndWxhciBleHByZXNzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nICB0YXJnZXQpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlcyh0YXJnZXQsIDAsICB0YXJnZXQgLmxlbmd0aCgpICwgKE1hdGNoKW51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSA8dmFyPnRhcmdldDwvdmFyPiB0ZXh0IDxzdHJvbmc+Y29udGFpbnM8L3N0cm9uZz4gdGhpcyBwYXR0ZXJuCi0gICAgICogaW4gc3BlY2lmaWVkIHJhbmdlIG9yIG5vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGFydCBTdGFydCBvZmZzZXQgb2YgdGhlIHJhbmdlLgotICAgICAqIEBwYXJhbSBlbmQgIEVuZCBvZmZzZXQgKzEgb2YgdGhlIHJhbmdlLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGlzIG1hdGNoZWQgdG8gdGhpcyByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgIHRhcmdldCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXModGFyZ2V0LCBzdGFydCwgZW5kLCAoTWF0Y2gpbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIDx2YXI+dGFyZ2V0PC92YXI+IHRleHQgPHN0cm9uZz5jb250YWluczwvc3Ryb25nPiB0aGlzIHBhdHRlcm4gb3Igbm90LgotICAgICAqCi0gICAgICogQHBhcmFtIG1hdGNoIEEgTWF0Y2ggaW5zdGFuY2UgZm9yIHN0b3JpbmcgbWF0Y2hpbmcgcmVzdWx0LgotICAgICAqIEByZXR1cm4gT2Zmc2V0IG9mIHRoZSBzdGFydCBwb3NpdGlvbiBpbiA8VkFSPnRhcmdldDwvVkFSPjsgb3IgLTEgaWYgbm90IG1hdGNoLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nICB0YXJnZXQsIE1hdGNoIG1hdGNoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXModGFyZ2V0LCAwLCAgdGFyZ2V0IC5sZW5ndGgoKSAsIG1hdGNoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgPHZhcj50YXJnZXQ8L3Zhcj4gdGV4dCA8c3Ryb25nPmNvbnRhaW5zPC9zdHJvbmc+IHRoaXMgcGF0dGVybgotICAgICAqIGluIHNwZWNpZmllZCByYW5nZSBvciBub3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnQgU3RhcnQgb2Zmc2V0IG9mIHRoZSByYW5nZS4KLSAgICAgKiBAcGFyYW0gZW5kICBFbmQgb2Zmc2V0ICsxIG9mIHRoZSByYW5nZS4KLSAgICAgKiBAcGFyYW0gbWF0Y2ggQSBNYXRjaCBpbnN0YW5jZSBmb3Igc3RvcmluZyBtYXRjaGluZyByZXN1bHQuCi0gICAgICogQHJldHVybiBPZmZzZXQgb2YgdGhlIHN0YXJ0IHBvc2l0aW9uIGluIDxWQVI+dGFyZ2V0PC9WQVI+OyBvciAtMSBpZiBub3QgbWF0Y2guCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgIHRhcmdldCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBNYXRjaCBtYXRjaCkgewotCi0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9ucyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRoaXMucHJlcGFyZSgpOwotICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IG5ldyBDb250ZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29udGV4dCBjb24gPSBudWxsOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMuY29udGV4dCkgewotICAgICAgICAgICAgY29uID0gdGhpcy5jb250ZXh0LmludXNlID8gbmV3IENvbnRleHQoKSA6IHRoaXMuY29udGV4dDsKLSAgICAgICAgICAgIGNvbi5yZXNldCh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXMubnVtYmVyT2ZDbG9zdXJlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1hdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1hdGNoLnNldE51bWJlck9mR3JvdXBzKHRoaXMubm9mcGFyZW4pOwotICAgICAgICAgICAgbWF0Y2guc2V0U291cmNlKHRhcmdldCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNCYWNrUmVmZXJlbmNlcykgewotICAgICAgICAgICAgbWF0Y2ggPSBuZXcgTWF0Y2goKTsKLSAgICAgICAgICAgIG1hdGNoLnNldE51bWJlck9mR3JvdXBzKHRoaXMubm9mcGFyZW4pOwotICAgICAgICAgICAgLy8gTmVlZCBub3QgdG8gY2FsbCBzZXRTb3VyY2UoKSBiZWNhdXNlCi0gICAgICAgICAgICAvLyBhIGNhbGxlciBjYW4gbm90IGFjY2VzcyB0aGlzIG1hdGNoIGluc3RhbmNlLgotICAgICAgICB9Ci0gICAgICAgIGNvbi5tYXRjaCA9IG1hdGNoOwotCi0gICAgICAgIGlmICh0aGlzLmlzU2V0KHRoaXMub3B0aW9ucywgWE1MU0NIRU1BX01PREUpKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oInRhcmdldCBzdHJpbmc9Iit0YXJnZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgdGhpcy5vcGVyYXRpb25zLCBjb24uc3RhcnQsIDEsIHRoaXMub3B0aW9ucyk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIm1hdGNoRW5kPSIrbWF0Y2hFbmQpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiY29uLmxpbWl0PSIrY29uLmxpbWl0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtYXRjaEVuZCA9PSBjb24ubGltaXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29uLm1hdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEJlZ2lubmluZygwLCBjb24uc3RhcnQpOwotICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0RW5kKDAsIG1hdGNoRW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBUaGUgcGF0dGVybiBoYXMgb25seSBmaXhlZCBzdHJpbmcuCi0gICAgICAgICAqIFRoZSBlbmdpbmUgdXNlcyBCb3llci1Nb29yZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICh0aGlzLmZpeGVkU3RyaW5nT25seSkgewotICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIkRFQlVHOiBmaXhlZC1vbmx5OiAiK3RoaXMuZml4ZWRTdHJpbmcpOwotICAgICAgICAgICAgaW50IG8gPSB0aGlzLmZpeGVkU3RyaW5nVGFibGUubWF0Y2hlcyh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0KTsKLSAgICAgICAgICAgIGlmIChvID49IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoY29uLm1hdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEJlZ2lubmluZygwLCBvKTsKLSAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEVuZCgwLCBvK3RoaXMuZml4ZWRTdHJpbmcubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlIHBhdHRlcm4gY29udGFpbnMgYSBmaXhlZCBzdHJpbmcuCi0gICAgICAgICAqIFRoZSBlbmdpbmUgY2hlY2tzIHdpdGggQm95ZXItTW9vcmUgd2hldGhlciB0aGUgdGV4dCBjb250YWlucyB0aGUgZml4ZWQgc3RyaW5nIG9yIG5vdC4KLSAgICAgICAgICogSWYgbm90LCBpdCByZXR1cm4gd2l0aCBmYWxzZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICh0aGlzLmZpeGVkU3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBvID0gdGhpcy5maXhlZFN0cmluZ1RhYmxlLm1hdGNoZXModGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCk7Ci0gICAgICAgICAgICBpZiAobyA8IDApIHsKLSAgICAgICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiTm9uLW1hdGNoIGluIGZpeGVkLXN0cmluZyBzZWFyY2guIik7Ci0gICAgICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGxpbWl0ID0gY29uLmxpbWl0LXRoaXMubWlubGVuZ3RoOwotICAgICAgICBpbnQgbWF0Y2hTdGFydDsKLSAgICAgICAgaW50IG1hdGNoRW5kID0gLTE7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGV4cHJlc3Npb24gc3RhcnRzIHdpdGggIi4qIi4KLSAgICAgICAgICovCi0gICAgICAgIGlmICh0aGlzLm9wZXJhdGlvbnMgIT0gbnVsbAotICAgICAgICAgICAgJiYgdGhpcy5vcGVyYXRpb25zLnR5cGUgPT0gT3AuQ0xPU1VSRSAmJiB0aGlzLm9wZXJhdGlvbnMuZ2V0Q2hpbGQoKS50eXBlID09IE9wLkRPVCkgewotICAgICAgICAgICAgaWYgKGlzU2V0KHRoaXMub3B0aW9ucywgU0lOR0xFX0xJTkUpKSB7Ci0gICAgICAgICAgICAgICAgbWF0Y2hTdGFydCA9IGNvbi5zdGFydDsKLSAgICAgICAgICAgICAgICBtYXRjaEVuZCA9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIHRoaXMub3BlcmF0aW9ucywgY29uLnN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHByZXZpb3VzSXNFT0wgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAobWF0Y2hTdGFydCA9IGNvbi5zdGFydDsgIG1hdGNoU3RhcnQgPD0gbGltaXQ7ICBtYXRjaFN0YXJ0ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLmNoYXJBdCggIG1hdGNoU3RhcnQgKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0VPTENoYXIoY2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0lzRU9MID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0lzRU9MKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPD0gKG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgdGhpcy5vcGVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0lzRU9MID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBPcHRpbWl6YXRpb24gYWdhaW5zdCB0aGUgZmlyc3QgY2hhcmFjdGVyLgotICAgICAgICAgKi8KLSAgICAgICAgZWxzZSBpZiAodGhpcy5maXJzdENoYXIgIT0gbnVsbCkgewotICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIkRFQlVHOiB3aXRoIGZpcnN0Y2hhci1tYXRjaGluZzogIit0aGlzLmZpcnN0Q2hhcik7Ci0gICAgICAgICAgICBSYW5nZVRva2VuIHJhbmdlID0gdGhpcy5maXJzdENoYXI7Ci0gICAgICAgICAgICBpZiAodGhpcy5pc1NldCh0aGlzLm9wdGlvbnMsIElHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgIHJhbmdlID0gdGhpcy5maXJzdENoYXIuZ2V0Q2FzZUluc2Vuc2l0aXZlVG9rZW4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7ICBtYXRjaFN0YXJ0IDw9IGxpbWl0OyAgbWF0Y2hTdGFydCArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IC5jaGFyQXQoICBtYXRjaFN0YXJ0ICkgOwotICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgbWF0Y2hTdGFydCsxIDwgY29uLmxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoY2gsICB0YXJnZXQgLmNoYXJBdCggIG1hdGNoU3RhcnQrMSApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlLm1hdGNoKGNoKSkgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNoMSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSgoY2hhciljaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChjaDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlLm1hdGNoKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjaDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICgwIDw9IChtYXRjaEVuZCA9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIHRoaXMub3BlcmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoU3RhcnQsIDEsIHRoaXMub3B0aW9ucykpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7ICBtYXRjaFN0YXJ0IDw9IGxpbWl0OyAgbWF0Y2hTdGFydCArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IC5jaGFyQXQoICBtYXRjaFN0YXJ0ICkgOwotICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgbWF0Y2hTdGFydCsxIDwgY29uLmxpbWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoLCAgdGFyZ2V0IC5jaGFyQXQoICBtYXRjaFN0YXJ0KzEgKSApOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlLm1hdGNoKGNoKSkgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoMCA8PSAobWF0Y2hFbmQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCB0aGlzLm9wZXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFN0cmFpZ2h0Zm9yd2FyZCBtYXRjaGluZy4KLSAgICAgICAgICovCi0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZm9yIChtYXRjaFN0YXJ0ID0gY29uLnN0YXJ0OyAgbWF0Y2hTdGFydCA8PSBsaW1pdDsgIG1hdGNoU3RhcnQgKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSAobWF0Y2hFbmQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCB0aGlzLm9wZXJhdGlvbnMsIG1hdGNoU3RhcnQsIDEsIHRoaXMub3B0aW9ucykpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYXRjaEVuZCA+PSAwKSB7Ci0gICAgICAgICAgICBpZiAoY29uLm1hdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0QmVnaW5uaW5nKDAsIG1hdGNoU3RhcnQpOwotICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRFbmQoMCwgbWF0Y2hFbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiAtMSB3aGVuIG5vdCBtYXRjaDsgb2Zmc2V0IG9mIHRoZSBlbmQgb2YgbWF0Y2hlZCBzdHJpbmcgd2hlbiBtYXRjaC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtYXRjaFN0cmluZyAoQ29udGV4dCBjb24sIE9wIG9wLCBpbnQgb2Zmc2V0LCBpbnQgZHgsIGludCBvcHRzKSB7Ci0KLQotCi0KLSAgICAgICAgU3RyaW5nIHRhcmdldCA9IGNvbi5zdHJUYXJnZXQ7Ci0KLQotCi0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGlmIChvcCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBpc1NldChvcHRzLCBYTUxTQ0hFTUFfTU9ERSkgJiYgb2Zmc2V0ICE9IGNvbi5saW1pdCA/IC0xIDogb2Zmc2V0OwotICAgICAgICAgICAgaWYgKG9mZnNldCA+IGNvbi5saW1pdCB8fCBvZmZzZXQgPCBjb24uc3RhcnQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgc3dpdGNoIChvcC50eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIE9wLkNIQVI6Ci0gICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSBvcC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gY29uLmxpbWl0IHx8ICFtYXRjaElnbm9yZUNhc2UoY2gsICB0YXJnZXQgLmNoYXJBdCggIG9mZnNldCApICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG8xID0gb2Zmc2V0LTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobzEgPj0gY29uLmxpbWl0IHx8IG8xIDwgMCB8fCAhbWF0Y2hJZ25vcmVDYXNlKGNoLCAgdGFyZ2V0IC5jaGFyQXQoICBvMSApICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbzE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSBvcC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gY29uLmxpbWl0IHx8IGNoICE9ICB0YXJnZXQgLmNoYXJBdCggIG9mZnNldCApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbzEgPSBvZmZzZXQtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvMSA+PSBjb24ubGltaXQgfHwgbzEgPCAwIHx8IGNoICE9ICB0YXJnZXQgLmNoYXJBdCggIG8xICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG8xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5ET1Q6Ci0gICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IGNvbi5saW1pdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCAuY2hhckF0KCAgb2Zmc2V0ICkgOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgU0lOR0xFX0xJTkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgb2Zmc2V0KzEgPCBjb24ubGltaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG9mZnNldCsxIDwgY29uLmxpbWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyhjaCwgIHRhcmdldCAuY2hhckF0KCAgKytvZmZzZXQgKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRU9MQ2hhcihjaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQgbzEgPSBvZmZzZXQtMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG8xID49IGNvbi5saW1pdCB8fCBvMSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLmNoYXJBdCggIG8xICkgOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgU0lOR0xFX0xJTkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzTG93U3Vycm9nYXRlKGNoKSAmJiBvMS0xID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbzEgLS07Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzTG93U3Vycm9nYXRlKGNoKSAmJiBvMS0xID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKCB0YXJnZXQgLmNoYXJBdCggIC0tbzEgKSAsIGNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNFT0xDaGFyKGNoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbzE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5SQU5HRToKLSAgICAgICAgICAgIGNhc2UgT3AuTlJBTkdFOgotICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBjb24ubGltaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLmNoYXJBdCggIG9mZnNldCApIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG9mZnNldCsxIDwgY29uLmxpbWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoLCAgdGFyZ2V0IC5jaGFyQXQoICArK29mZnNldCApICk7Ci0gICAgICAgICAgICAgICAgICAgIFJhbmdlVG9rZW4gdG9rID0gb3AuZ2V0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9rID0gdG9rLmdldENhc2VJbnNlbnNpdGl2ZVRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaChjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHgxMDAwMCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVjaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaCh1Y2ggPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpY2gpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhdG9rLm1hdGNoKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh1Y2gpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2goY2gpKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQgbzEgPSBvZmZzZXQtMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG8xID49IGNvbi5saW1pdCB8fCBvMSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLmNoYXJBdCggIG8xICkgOwotICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzTG93U3Vycm9nYXRlKGNoKSAmJiBvMS0xID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoIHRhcmdldCAuY2hhckF0KCAgLS1vMSApICwgY2gpOwotICAgICAgICAgICAgICAgICAgICBSYW5nZVRva2VuIHRvayA9IG9wLmdldFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBJR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvayA9IHRvay5nZXRDYXNlSW5zZW5zaXRpdmVUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2goY2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID49IDB4MTAwMDApICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1Y2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2godWNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXRvay5tYXRjaChDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKGNoKSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLkFOQ0hPUjoKLSAgICAgICAgICAgICAgICBib29sZWFuIGdvID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChvcC5nZXREYXRhKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlICdeJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIE1VTFRJUExFX0xJTkVTKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5zdGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0ID4gY29uLnN0YXJ0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IC5jaGFyQXQoICBvZmZzZXQtMSApICkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgIT0gY29uLnN0YXJ0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ0AnOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbCB1c2Ugb25seS4KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEAgYWx3YXlzIG1hdGNoZXMgbGluZSBiZWdpbm5pbmdzLgotICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLnN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCA+IGNvbi5zdGFydCAmJiBpc0VPTENoYXIoIHRhcmdldCAuY2hhckF0KCAgb2Zmc2V0LTEgKSApKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICckJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIE1VTFRJUExFX0xJTkVTKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5saW1pdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0IDwgY29uLmxpbWl0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IC5jaGFyQXQoICBvZmZzZXQgKSApKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLmxpbWl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQrMSA9PSBjb24ubGltaXQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgLmNoYXJBdCggIG9mZnNldCApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCsyID09IGNvbi5saW1pdCAmJiAgdGFyZ2V0IC5jaGFyQXQoICBvZmZzZXQgKSAgPT0gQ0FSUklBR0VfUkVUVVJOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAgdGFyZ2V0IC5jaGFyQXQoICBvZmZzZXQrMSApICA9PSBMSU5FX0ZFRUQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ0EnOgotICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9IGNvbi5zdGFydCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdaJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5saW1pdAotICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQrMSA9PSBjb24ubGltaXQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgLmNoYXJBdCggIG9mZnNldCApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0KzIgPT0gY29uLmxpbWl0ICYmICB0YXJnZXQgLmNoYXJBdCggIG9mZnNldCApICA9PSBDQVJSSUFHRV9SRVRVUk4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIHRhcmdldCAuY2hhckF0KCAgb2Zmc2V0KzEgKSAgPT0gTElORV9GRUVEKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICd6JzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPSBjb24ubGltaXQpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnYic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb24ubGVuZ3RoID09IDApICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZnRlciA9IGdldFdvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXIgPT0gV1RfSUdOT1JFKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJlZm9yZSA9IGdldFByZXZpb3VzV29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlciA9PSBiZWZvcmUpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdCJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWZ0ZXIgPSBnZXRXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ28gPSBhZnRlciA9PSBXVF9JR05PUkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgYWZ0ZXIgPT0gZ2V0UHJldmlvdXNXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZ28pICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnPCc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb24ubGVuZ3RoID09IDAgfHwgb2Zmc2V0ID09IGNvbi5saW1pdCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldFdvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cykgIT0gV1RfTEVUVEVSCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRQcmV2aW91c1dvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cykgIT0gV1RfT1RIRVIpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnPic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb24ubGVuZ3RoID09IDAgfHwgb2Zmc2V0ID09IGNvbi5zdGFydCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldFdvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cykgIT0gV1RfT1RIRVIKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGdldFByZXZpb3VzV29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKSAhPSBXVF9MRVRURVIpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gLy8gc3dpdGNoIGFuY2hvciB0eXBlCi0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLkJBQ0tSRUZFUkVOQ0U6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgcmVmbm8gPSBvcC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWZubyA8PSAwIHx8IHJlZm5vID49IHRoaXMubm9mcGFyZW4pCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6IFJlZmVyZW5jZSBudW1iZXIgbXVzdCBiZSBtb3JlIHRoYW4gemVybzogIityZWZubyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb24ubWF0Y2guZ2V0QmVnaW5uaW5nKHJlZm5vKSA8IDAKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbi5tYXRjaC5nZXRFbmQocmVmbm8pIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgLy8gKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgaW50IG8yID0gY29uLm1hdGNoLmdldEJlZ2lubmluZyhyZWZubyk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsaXRlcmFsbGVuID0gY29uLm1hdGNoLmdldEVuZChyZWZubyktbzI7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzKHRhcmdldCwgb2Zmc2V0LCBjb24ubGltaXQsIG8yLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXModGFyZ2V0LCBvZmZzZXQtbGl0ZXJhbGxlbiwgY29uLmxpbWl0LCBvMiwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLT0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKHRhcmdldCwgb2Zmc2V0LCBjb24ubGltaXQsIG8yLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKHRhcmdldCwgb2Zmc2V0LWxpdGVyYWxsZW4sIGNvbi5saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8yLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT3AuU1RSSU5HOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpdGVyYWwgPSBvcC5nZXRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxpdGVyYWxsZW4gPSBsaXRlcmFsLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlcyh0YXJnZXQsIG9mZnNldCwgY29uLmxpbWl0LCBsaXRlcmFsLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXModGFyZ2V0LCBvZmZzZXQtbGl0ZXJhbGxlbiwgY29uLmxpbWl0LCBsaXRlcmFsLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UodGFyZ2V0LCBvZmZzZXQsIGNvbi5saW1pdCwgbGl0ZXJhbCwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzSWdub3JlQ2FzZSh0YXJnZXQsIG9mZnNldC1saXRlcmFsbGVuLCBjb24ubGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXRlcmFsLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5DTE9TVVJFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogU2F2ZXMgY3VycmVudCBwb3NpdGlvbiB0byBhdm9pZAotICAgICAgICAgICAgICAgICAgICAgKiB6ZXJvLXdpZHRoIHJlcGVhdHMuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpbnQgaWQgPSBvcC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJldmlvdXNPZmZzZXQgPSBjb24ub2Zmc2V0c1tpZF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNPZmZzZXQgPCAwIHx8IHByZXZpb3VzT2Zmc2V0ICE9IG9mZnNldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbi5vZmZzZXRzW2lkXSA9IG9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uLm9mZnNldHNbaWRdID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlkID49IDApICBjb24ub2Zmc2V0c1tpZF0gPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5RVUVTVElPTjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5OT05HUkVFRFlDTE9TVVJFOgotICAgICAgICAgICAgY2FzZSBPcC5OT05HUkVFRFlRVUVTVElPTjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5uZXh0LCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5nZXRDaGlsZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5VTklPTjoKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBvcC5zaXplKCk7ICBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5lbGVtZW50QXQoaSksIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVU5JT046ICIraSsiLCByZXQ9IityZXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgICAgY2FzZSBPcC5DQVBUVVJFOgotICAgICAgICAgICAgICAgIGludCByZWZubyA9IG9wLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICBpZiAoY29uLm1hdGNoICE9IG51bGwgJiYgcmVmbm8gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzYXZlID0gY29uLm1hdGNoLmdldEJlZ2lubmluZyhyZWZubyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcocmVmbm8sIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5uZXh0LCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApICBjb24ubWF0Y2guc2V0QmVnaW5uaW5nKHJlZm5vLCBzYXZlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbi5tYXRjaCAhPSBudWxsICYmIHJlZm5vIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAtcmVmbm87Ci0gICAgICAgICAgICAgICAgICAgIGludCBzYXZlID0gY29uLm1hdGNoLmdldEVuZChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRFbmQoaW5kZXgsIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5uZXh0LCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApICBjb24ubWF0Y2guc2V0RW5kKGluZGV4LCBzYXZlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLkxPT0tBSEVBRDoKLSAgICAgICAgICAgICAgICBpZiAoMCA+IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgMSwgb3B0cykpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPcC5ORUdBVElWRUxPT0tBSEVBRDoKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIDEsIG9wdHMpKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT3AuTE9PS0JFSElORDoKLSAgICAgICAgICAgICAgICBpZiAoMCA+IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgLTEsIG9wdHMpKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT3AuTkVHQVRJVkVMT09LQkVISU5EOgotICAgICAgICAgICAgICAgIGlmICgwIDw9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgLTEsIG9wdHMpKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5JTkRFUEVOREVOVDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuTU9ESUZJRVI6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgbG9jYWxvcHRzID0gb3B0czsKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxvcHRzIHw9IG9wLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxvcHRzICY9IH5vcC5nZXREYXRhMigpOwotICAgICAgICAgICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiTU9ESUZJRVI6ICIrSW50ZWdlci50b1N0cmluZyhvcHRzLCAxNikrIiAtPiAiK0ludGVnZXIudG9TdHJpbmcobG9jYWxvcHRzLCAxNikpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCBkeCwgbG9jYWxvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuQ09ORElUSU9OOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgT3AuQ29uZGl0aW9uT3AgY29wID0gKE9wLkNvbmRpdGlvbk9wKW9wOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1hdGNocCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29wLnJlZk51bWJlciA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3AucmVmTnVtYmVyID49IHRoaXMubm9mcGFyZW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiBSZWZlcmVuY2UgbnVtYmVyIG11c3QgYmUgbW9yZSB0aGFuIHplcm86ICIrY29wLnJlZk51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaHAgPSBjb24ubWF0Y2guZ2V0QmVnaW5uaW5nKGNvcC5yZWZOdW1iZXIpID49IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbi5tYXRjaC5nZXRFbmQoY29wLnJlZk51bWJlcikgPj0gMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNocCA9IDAgPD0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgY29wLmNvbmRpdGlvbiwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcCA9IGNvcC55ZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29wLm5vICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gY29wLm5vOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBjb3AubmV4dDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biBvcGVyYXRpb24gdHlwZTogIitvcC50eXBlKTsKLSAgICAgICAgICAgIH0gLy8gc3dpdGNoIChvcC50eXBlKQotICAgICAgICB9IC8vIHdoaWxlCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGdldFByZXZpb3VzV29yZFR5cGUoU3RyaW5nICB0YXJnZXQsIGludCBiZWdpbiwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgb3B0cykgewotICAgICAgICBpbnQgcmV0ID0gZ2V0V29yZFR5cGUodGFyZ2V0LCBiZWdpbiwgZW5kLCAtLW9mZnNldCwgb3B0cyk7Ci0gICAgICAgIHdoaWxlIChyZXQgPT0gV1RfSUdOT1JFKQotICAgICAgICAgICAgcmV0ID0gZ2V0V29yZFR5cGUodGFyZ2V0LCBiZWdpbiwgZW5kLCAtLW9mZnNldCwgb3B0cyk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGdldFdvcmRUeXBlKFN0cmluZyAgdGFyZ2V0LCBpbnQgYmVnaW4sIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBvcHRzKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgPCBiZWdpbiB8fCBvZmZzZXQgPj0gZW5kKSAgcmV0dXJuIFdUX09USEVSOwotICAgICAgICByZXR1cm4gZ2V0V29yZFR5cGUwKCB0YXJnZXQgLmNoYXJBdCggIG9mZnNldCApICwgb3B0cyk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHJlZ2lvbk1hdGNoZXMoU3RyaW5nIHRleHQsIGludCBvZmZzZXQsIGludCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnQsIGludCBwYXJ0bGVuKSB7Ci0gICAgICAgIGlmIChsaW1pdC1vZmZzZXQgPCBwYXJ0bGVuKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gdGV4dC5yZWdpb25NYXRjaGVzKG9mZnNldCwgcGFydCwgMCwgcGFydGxlbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiByZWdpb25NYXRjaGVzKFN0cmluZyB0ZXh0LCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQyLCBpbnQgcGFydGxlbikgewotICAgICAgICBpZiAobGltaXQtb2Zmc2V0IDwgcGFydGxlbikgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRleHQucmVnaW9uTWF0Y2hlcyhvZmZzZXQsIHRleHQsIG9mZnNldDIsIHBhcnRsZW4pOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoU3RyaW5nIHRleHQsIGludCBvZmZzZXQsIGludCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0LCBpbnQgcGFydGxlbikgewotICAgICAgICByZXR1cm4gdGV4dC5yZWdpb25NYXRjaGVzKHRydWUsIG9mZnNldCwgcGFydCwgMCwgcGFydGxlbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShTdHJpbmcgdGV4dCwgaW50IG9mZnNldCwgaW50IGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldDIsIGludCBwYXJ0bGVuKSB7Ci0gICAgICAgIGlmIChsaW1pdC1vZmZzZXQgPCBwYXJ0bGVuKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gdGV4dC5yZWdpb25NYXRjaGVzKHRydWUsIG9mZnNldCwgdGV4dCwgb2Zmc2V0MiwgcGFydGxlbik7Ci0gICAgfQotCi0KLQotCi0KLQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIDx2YXI+dGFyZ2V0PC92YXI+IHRleHQgPHN0cm9uZz5jb250YWluczwvc3Ryb25nPiB0aGlzIHBhdHRlcm4gb3Igbm90LgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgaXMgbWF0Y2hlZCB0byB0aGlzIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKENoYXJhY3Rlckl0ZXJhdG9yIHRhcmdldCkgewotICAgICAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHRhcmdldCwgKE1hdGNoKW51bGwpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIDx2YXI+dGFyZ2V0PC92YXI+IHRleHQgPHN0cm9uZz5jb250YWluczwvc3Ryb25nPiB0aGlzIHBhdHRlcm4gb3Igbm90LgotICAgICAqCi0gICAgICogQHBhcmFtIG1hdGNoIEEgTWF0Y2ggaW5zdGFuY2UgZm9yIHN0b3JpbmcgbWF0Y2hpbmcgcmVzdWx0LgotICAgICAqIEByZXR1cm4gT2Zmc2V0IG9mIHRoZSBzdGFydCBwb3NpdGlvbiBpbiA8VkFSPnRhcmdldDwvVkFSPjsgb3IgLTEgaWYgbm90IG1hdGNoLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoQ2hhcmFjdGVySXRlcmF0b3IgIHRhcmdldCwgTWF0Y2ggbWF0Y2gpIHsKLSAgICAgICAgaW50IHN0YXJ0ID0gdGFyZ2V0LmdldEJlZ2luSW5kZXgoKTsKLSAgICAgICAgaW50IGVuZCA9IHRhcmdldC5nZXRFbmRJbmRleCgpOwotCi0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdGlvbnMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aGlzLnByZXBhcmUoKTsKLSAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBuZXcgQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIENvbnRleHQgY29uID0gbnVsbDsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzLmNvbnRleHQpIHsKLSAgICAgICAgICAgIGNvbiA9IHRoaXMuY29udGV4dC5pbnVzZSA/IG5ldyBDb250ZXh0KCkgOiB0aGlzLmNvbnRleHQ7Ci0gICAgICAgICAgICBjb24ucmVzZXQodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzLm51bWJlck9mQ2xvc3VyZXMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXRjaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtYXRjaC5zZXROdW1iZXJPZkdyb3Vwcyh0aGlzLm5vZnBhcmVuKTsKLSAgICAgICAgICAgIG1hdGNoLnNldFNvdXJjZSh0YXJnZXQpOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaGFzQmFja1JlZmVyZW5jZXMpIHsKLSAgICAgICAgICAgIG1hdGNoID0gbmV3IE1hdGNoKCk7Ci0gICAgICAgICAgICBtYXRjaC5zZXROdW1iZXJPZkdyb3Vwcyh0aGlzLm5vZnBhcmVuKTsKLSAgICAgICAgICAgIC8vIE5lZWQgbm90IHRvIGNhbGwgc2V0U291cmNlKCkgYmVjYXVzZQotICAgICAgICAgICAgLy8gYSBjYWxsZXIgY2FuIG5vdCBhY2Nlc3MgdGhpcyBtYXRjaCBpbnN0YW5jZS4KLSAgICAgICAgfQotICAgICAgICBjb24ubWF0Y2ggPSBtYXRjaDsKLQotICAgICAgICBpZiAodGhpcy5pc1NldCh0aGlzLm9wdGlvbnMsIFhNTFNDSEVNQV9NT0RFKSkgewotICAgICAgICAgICAgaW50IG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCB0aGlzLm9wZXJhdGlvbnMsIGNvbi5zdGFydCwgMSwgdGhpcy5vcHRpb25zKTsKLSAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJERUJVRzogbWF0Y2hFbmQ9IittYXRjaEVuZCk7Ci0gICAgICAgICAgICBpZiAobWF0Y2hFbmQgPT0gY29uLmxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbi5tYXRjaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcoMCwgY29uLnN0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEVuZCgwLCBtYXRjaEVuZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlIHBhdHRlcm4gaGFzIG9ubHkgZml4ZWQgc3RyaW5nLgotICAgICAgICAgKiBUaGUgZW5naW5lIHVzZXMgQm95ZXItTW9vcmUuCi0gICAgICAgICAqLwotICAgICAgICBpZiAodGhpcy5maXhlZFN0cmluZ09ubHkpIHsKLSAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJERUJVRzogZml4ZWQtb25seTogIit0aGlzLmZpeGVkU3RyaW5nKTsKLSAgICAgICAgICAgIGludCBvID0gdGhpcy5maXhlZFN0cmluZ1RhYmxlLm1hdGNoZXModGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCk7Ci0gICAgICAgICAgICBpZiAobyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbi5tYXRjaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcoMCwgbyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRFbmQoMCwgbyt0aGlzLmZpeGVkU3RyaW5nLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZSBwYXR0ZXJuIGNvbnRhaW5zIGEgZml4ZWQgc3RyaW5nLgotICAgICAgICAgKiBUaGUgZW5naW5lIGNoZWNrcyB3aXRoIEJveWVyLU1vb3JlIHdoZXRoZXIgdGhlIHRleHQgY29udGFpbnMgdGhlIGZpeGVkIHN0cmluZyBvciBub3QuCi0gICAgICAgICAqIElmIG5vdCwgaXQgcmV0dXJuIHdpdGggZmFsc2UuCi0gICAgICAgICAqLwotICAgICAgICBpZiAodGhpcy5maXhlZFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgbyA9IHRoaXMuZml4ZWRTdHJpbmdUYWJsZS5tYXRjaGVzKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQpOwotICAgICAgICAgICAgaWYgKG8gPCAwKSB7Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIk5vbi1tYXRjaCBpbiBmaXhlZC1zdHJpbmcgc2VhcmNoLiIpOwotICAgICAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludCBsaW1pdCA9IGNvbi5saW1pdC10aGlzLm1pbmxlbmd0aDsKLSAgICAgICAgaW50IG1hdGNoU3RhcnQ7Ci0gICAgICAgIGludCBtYXRjaEVuZCA9IC0xOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBleHByZXNzaW9uIHN0YXJ0cyB3aXRoICIuKiIuCi0gICAgICAgICAqLwotICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25zICE9IG51bGwKLSAgICAgICAgICAgICYmIHRoaXMub3BlcmF0aW9ucy50eXBlID09IE9wLkNMT1NVUkUgJiYgdGhpcy5vcGVyYXRpb25zLmdldENoaWxkKCkudHlwZSA9PSBPcC5ET1QpIHsKLSAgICAgICAgICAgIGlmIChpc1NldCh0aGlzLm9wdGlvbnMsIFNJTkdMRV9MSU5FKSkgewotICAgICAgICAgICAgICAgIG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7Ci0gICAgICAgICAgICAgICAgbWF0Y2hFbmQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIHRoaXMub3BlcmF0aW9ucywgY29uLnN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHByZXZpb3VzSXNFT0wgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAobWF0Y2hTdGFydCA9IGNvbi5zdGFydDsgIG1hdGNoU3RhcnQgPD0gbGltaXQ7ICBtYXRjaFN0YXJ0ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLnNldEluZGV4KCAgbWF0Y2hTdGFydCApIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzRU9MQ2hhcihjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzSXNFT0wgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzSXNFT0wpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA8PSAobWF0Y2hFbmQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIHRoaXMub3BlcmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0lzRU9MID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBPcHRpbWl6YXRpb24gYWdhaW5zdCB0aGUgZmlyc3QgY2hhcmFjdGVyLgotICAgICAgICAgKi8KLSAgICAgICAgZWxzZSBpZiAodGhpcy5maXJzdENoYXIgIT0gbnVsbCkgewotICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIkRFQlVHOiB3aXRoIGZpcnN0Y2hhci1tYXRjaGluZzogIit0aGlzLmZpcnN0Q2hhcik7Ci0gICAgICAgICAgICBSYW5nZVRva2VuIHJhbmdlID0gdGhpcy5maXJzdENoYXI7Ci0gICAgICAgICAgICBpZiAodGhpcy5pc1NldCh0aGlzLm9wdGlvbnMsIElHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgIHJhbmdlID0gdGhpcy5maXJzdENoYXIuZ2V0Q2FzZUluc2Vuc2l0aXZlVG9rZW4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7ICBtYXRjaFN0YXJ0IDw9IGxpbWl0OyAgbWF0Y2hTdGFydCArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IC5zZXRJbmRleCggIG1hdGNoU3RhcnQgKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoKSAmJiBtYXRjaFN0YXJ0KzEgPCBjb24ubGltaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyhjaCwgIHRhcmdldCAuc2V0SW5kZXgoICBtYXRjaFN0YXJ0KzEgKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChjaCkpICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goY2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjaDEgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpY2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goY2gxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2gxKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoMCA8PSAobWF0Y2hFbmQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIHRoaXMub3BlcmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hTdGFydCwgMSwgdGhpcy5vcHRpb25zKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAobWF0Y2hTdGFydCA9IGNvbi5zdGFydDsgIG1hdGNoU3RhcnQgPD0gbGltaXQ7ICBtYXRjaFN0YXJ0ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLnNldEluZGV4KCAgbWF0Y2hTdGFydCApIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG1hdGNoU3RhcnQrMSA8IGNvbi5saW1pdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyhjaCwgIHRhcmdldCAuc2V0SW5kZXgoICBtYXRjaFN0YXJ0KzEgKSApOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlLm1hdGNoKGNoKSkgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoMCA8PSAobWF0Y2hFbmQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIHRoaXMub3BlcmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hTdGFydCwgMSwgdGhpcy5vcHRpb25zKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBTdHJhaWdodGZvcndhcmQgbWF0Y2hpbmcuCi0gICAgICAgICAqLwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZvciAobWF0Y2hTdGFydCA9IGNvbi5zdGFydDsgIG1hdGNoU3RhcnQgPD0gbGltaXQ7ICBtYXRjaFN0YXJ0ICsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gKG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCB0aGlzLm9wZXJhdGlvbnMsIG1hdGNoU3RhcnQsIDEsIHRoaXMub3B0aW9ucykpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYXRjaEVuZCA+PSAwKSB7Ci0gICAgICAgICAgICBpZiAoY29uLm1hdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0QmVnaW5uaW5nKDAsIG1hdGNoU3RhcnQpOwotICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRFbmQoMCwgbWF0Y2hFbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiAtMSB3aGVuIG5vdCBtYXRjaDsgb2Zmc2V0IG9mIHRoZSBlbmQgb2YgbWF0Y2hlZCBzdHJpbmcgd2hlbiBtYXRjaC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChDb250ZXh0IGNvbiwgT3Agb3AsIGludCBvZmZzZXQsIGludCBkeCwgaW50IG9wdHMpIHsKLQotCi0gICAgICAgIENoYXJhY3Rlckl0ZXJhdG9yIHRhcmdldCA9IGNvbi5jaVRhcmdldDsKLQotCi0KLQotCi0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGlmIChvcCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBpc1NldChvcHRzLCBYTUxTQ0hFTUFfTU9ERSkgJiYgb2Zmc2V0ICE9IGNvbi5saW1pdCA/IC0xIDogb2Zmc2V0OwotICAgICAgICAgICAgaWYgKG9mZnNldCA+IGNvbi5saW1pdCB8fCBvZmZzZXQgPCBjb24uc3RhcnQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgc3dpdGNoIChvcC50eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIE9wLkNIQVI6Ci0gICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSBvcC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gY29uLmxpbWl0IHx8ICFtYXRjaElnbm9yZUNhc2UoY2gsICB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0ICkgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbzEgPSBvZmZzZXQtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvMSA+PSBjb24ubGltaXQgfHwgbzEgPCAwIHx8ICFtYXRjaElnbm9yZUNhc2UoY2gsICB0YXJnZXQgLnNldEluZGV4KCAgbzEgKSApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG8xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gb3AuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IGNvbi5saW1pdCB8fCBjaCAhPSAgdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbzEgPSBvZmZzZXQtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvMSA+PSBjb24ubGltaXQgfHwgbzEgPCAwIHx8IGNoICE9ICB0YXJnZXQgLnNldEluZGV4KCAgbzEgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbzE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLkRPVDoKLSAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gY29uLmxpbWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCApIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIFNJTkdMRV9MSU5FKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG9mZnNldCsxIDwgY29uLmxpbWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoKSAmJiBvZmZzZXQrMSA8IGNvbi5saW1pdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoY2gsICB0YXJnZXQgLnNldEluZGV4KCAgKytvZmZzZXQgKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRU9MQ2hhcihjaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQgbzEgPSBvZmZzZXQtMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG8xID49IGNvbi5saW1pdCB8fCBvMSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLnNldEluZGV4KCAgbzEgKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBTSU5HTEVfTElORSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNMb3dTdXJyb2dhdGUoY2gpICYmIG8xLTEgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvMSAtLTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNMb3dTdXJyb2dhdGUoY2gpICYmIG8xLTEgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoIHRhcmdldCAuc2V0SW5kZXgoICAtLW8xICkgLCBjaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRU9MQ2hhcihjaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG8xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuUkFOR0U6Ci0gICAgICAgICAgICBjYXNlIE9wLk5SQU5HRToKLSAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gY29uLmxpbWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCApIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG9mZnNldCsxIDwgY29uLmxpbWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoLCAgdGFyZ2V0IC5zZXRJbmRleCggICsrb2Zmc2V0ICkgKTsKLSAgICAgICAgICAgICAgICAgICAgUmFuZ2VUb2tlbiB0b2sgPSBvcC5nZXRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSB0b2suZ2V0Q2FzZUluc2Vuc2l0aXZlVG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKGNoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA+PSAweDEwMDAwKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdWNoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKHVjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSgoY2hhciljaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICF0b2subWF0Y2goQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaChjaCkpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBvMSA9IG9mZnNldC0xOwotICAgICAgICAgICAgICAgICAgICBpZiAobzEgPj0gY29uLmxpbWl0IHx8IG8xIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCAuc2V0SW5kZXgoICBvMSApIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0xvd1N1cnJvZ2F0ZShjaCkgJiYgbzEtMSA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKCB0YXJnZXQgLnNldEluZGV4KCAgLS1vMSApICwgY2gpOwotICAgICAgICAgICAgICAgICAgICBSYW5nZVRva2VuIHRvayA9IG9wLmdldFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBJR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvayA9IHRvay5nZXRDYXNlSW5zZW5zaXRpdmVUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2goY2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID49IDB4MTAwMDApICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1Y2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2godWNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXRvay5tYXRjaChDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKGNoKSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLkFOQ0hPUjoKLSAgICAgICAgICAgICAgICBib29sZWFuIGdvID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChvcC5nZXREYXRhKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlICdeJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIE1VTFRJUExFX0xJTkVTKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5zdGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0ID4gY29uLnN0YXJ0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldC0xICkgKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPSBjb24uc3RhcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnQCc6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsIHVzZSBvbmx5LgotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQCBhbHdheXMgbWF0Y2hlcyBsaW5lIGJlZ2lubmluZ3MuCi0gICAgICAgICAgICAgICAgICAgIGlmICghKG9mZnNldCA9PSBjb24uc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0ID4gY29uLnN0YXJ0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldC0xICkgKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnJCc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBNVUxUSVBMRV9MSU5FUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9mZnNldCA9PSBjb24ubGltaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCA8IGNvbi5saW1pdCAmJiBpc0VPTENoYXIoIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQgKSApKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLmxpbWl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQrMSA9PSBjb24ubGltaXQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0ICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0KzIgPT0gY29uLmxpbWl0ICYmICB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0ICkgID09IENBUlJJQUdFX1JFVFVSTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQrMSApICA9PSBMSU5FX0ZFRUQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ0EnOgotICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9IGNvbi5zdGFydCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdaJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5saW1pdAotICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQrMSA9PSBjb24ubGltaXQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0ICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQrMiA9PSBjb24ubGltaXQgJiYgIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQgKSAgPT0gQ0FSUklBR0VfUkVUVVJOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICYmICB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0KzEgKSAgPT0gTElORV9GRUVEKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICd6JzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPSBjb24ubGltaXQpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnYic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb24ubGVuZ3RoID09IDApICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZnRlciA9IGdldFdvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXIgPT0gV1RfSUdOT1JFKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJlZm9yZSA9IGdldFByZXZpb3VzV29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlciA9PSBiZWZvcmUpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdCJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWZ0ZXIgPSBnZXRXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ28gPSBhZnRlciA9PSBXVF9JR05PUkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgYWZ0ZXIgPT0gZ2V0UHJldmlvdXNXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZ28pICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnPCc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb24ubGVuZ3RoID09IDAgfHwgb2Zmc2V0ID09IGNvbi5saW1pdCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldFdvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cykgIT0gV1RfTEVUVEVSCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRQcmV2aW91c1dvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cykgIT0gV1RfT1RIRVIpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnPic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb24ubGVuZ3RoID09IDAgfHwgb2Zmc2V0ID09IGNvbi5zdGFydCkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldFdvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cykgIT0gV1RfT1RIRVIKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGdldFByZXZpb3VzV29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKSAhPSBXVF9MRVRURVIpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gLy8gc3dpdGNoIGFuY2hvciB0eXBlCi0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLkJBQ0tSRUZFUkVOQ0U6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgcmVmbm8gPSBvcC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWZubyA8PSAwIHx8IHJlZm5vID49IHRoaXMubm9mcGFyZW4pCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6IFJlZmVyZW5jZSBudW1iZXIgbXVzdCBiZSBtb3JlIHRoYW4gemVybzogIityZWZubyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb24ubWF0Y2guZ2V0QmVnaW5uaW5nKHJlZm5vKSA8IDAKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbi5tYXRjaC5nZXRFbmQocmVmbm8pIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgLy8gKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgaW50IG8yID0gY29uLm1hdGNoLmdldEJlZ2lubmluZyhyZWZubyk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsaXRlcmFsbGVuID0gY29uLm1hdGNoLmdldEVuZChyZWZubyktbzI7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzKHRhcmdldCwgb2Zmc2V0LCBjb24ubGltaXQsIG8yLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXModGFyZ2V0LCBvZmZzZXQtbGl0ZXJhbGxlbiwgY29uLmxpbWl0LCBvMiwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLT0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKHRhcmdldCwgb2Zmc2V0LCBjb24ubGltaXQsIG8yLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKHRhcmdldCwgb2Zmc2V0LWxpdGVyYWxsZW4sIGNvbi5saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8yLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT3AuU1RSSU5HOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpdGVyYWwgPSBvcC5nZXRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxpdGVyYWxsZW4gPSBsaXRlcmFsLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlcyh0YXJnZXQsIG9mZnNldCwgY29uLmxpbWl0LCBsaXRlcmFsLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXModGFyZ2V0LCBvZmZzZXQtbGl0ZXJhbGxlbiwgY29uLmxpbWl0LCBsaXRlcmFsLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UodGFyZ2V0LCBvZmZzZXQsIGNvbi5saW1pdCwgbGl0ZXJhbCwgbGl0ZXJhbGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGl0ZXJhbGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzSWdub3JlQ2FzZSh0YXJnZXQsIG9mZnNldC1saXRlcmFsbGVuLCBjb24ubGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXRlcmFsLCBsaXRlcmFsbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBsaXRlcmFsbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5DTE9TVVJFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogU2F2ZXMgY3VycmVudCBwb3NpdGlvbiB0byBhdm9pZAotICAgICAgICAgICAgICAgICAgICAgKiB6ZXJvLXdpZHRoIHJlcGVhdHMuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpbnQgaWQgPSBvcC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJldmlvdXNPZmZzZXQgPSBjb24ub2Zmc2V0c1tpZF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNPZmZzZXQgPCAwIHx8IHByZXZpb3VzT2Zmc2V0ICE9IG9mZnNldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbi5vZmZzZXRzW2lkXSA9IG9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uLm9mZnNldHNbaWRdID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIGR4LCBvcHRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlkID49IDApICBjb24ub2Zmc2V0c1tpZF0gPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5RVUVTVElPTjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLk5PTkdSRUVEWUNMT1NVUkU6Ci0gICAgICAgICAgICBjYXNlIE9wLk5PTkdSRUVEWVFVRVNUSU9OOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgb3AubmV4dCwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9wID0gb3AuZ2V0Q2hpbGQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT3AuVU5JT046Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgb3Auc2l6ZSgpOyAgaSArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCBvcC5lbGVtZW50QXQoaSksIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVU5JT046ICIraSsiLCByZXQ9IityZXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgICAgY2FzZSBPcC5DQVBUVVJFOgotICAgICAgICAgICAgICAgIGludCByZWZubyA9IG9wLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICBpZiAoY29uLm1hdGNoICE9IG51bGwgJiYgcmVmbm8gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzYXZlID0gY29uLm1hdGNoLmdldEJlZ2lubmluZyhyZWZubyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcocmVmbm8sIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIG9wLm5leHQsIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcocmVmbm8sIHNhdmUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uLm1hdGNoICE9IG51bGwgJiYgcmVmbm8gPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IC1yZWZubzsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNhdmUgPSBjb24ubWF0Y2guZ2V0RW5kKGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEVuZChpbmRleCwgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgb3AubmV4dCwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSAgY29uLm1hdGNoLnNldEVuZChpbmRleCwgc2F2ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5MT09LQUhFQUQ6Ci0gICAgICAgICAgICAgICAgaWYgKDAgPiB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgMSwgb3B0cykpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPcC5ORUdBVElWRUxPT0tBSEVBRDoKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgMSwgb3B0cykpICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPcC5MT09LQkVISU5EOgotICAgICAgICAgICAgICAgIGlmICgwID4gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIC0xLCBvcHRzKSkgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9wLk5FR0FUSVZFTE9PS0JFSElORDoKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgLTEsIG9wdHMpKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5JTkRFUEVOREVOVDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgZHgsIG9wdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHJldDsKLSAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBPcC5NT0RJRklFUjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsb2NhbG9wdHMgPSBvcHRzOwotICAgICAgICAgICAgICAgICAgICBsb2NhbG9wdHMgfD0gb3AuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBsb2NhbG9wdHMgJj0gfm9wLmdldERhdGEyKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJNT0RJRklFUjogIitJbnRlZ2VyLnRvU3RyaW5nKG9wdHMsIDE2KSsiIC0+ICIrSW50ZWdlci50b1N0cmluZyhsb2NhbG9wdHMsIDE2KSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgZHgsIGxvY2Fsb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcmV0OwotICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9wLkNPTkRJVElPTjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE9wLkNvbmRpdGlvbk9wIGNvcCA9IChPcC5Db25kaXRpb25PcClvcDsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtYXRjaHAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvcC5yZWZOdW1iZXIgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29wLnJlZk51bWJlciA+PSB0aGlzLm5vZnBhcmVuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogUmVmZXJlbmNlIG51bWJlciBtdXN0IGJlIG1vcmUgdGhhbiB6ZXJvOiAiK2NvcC5yZWZOdW1iZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hwID0gY29uLm1hdGNoLmdldEJlZ2lubmluZyhjb3AucmVmTnVtYmVyKSA+PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjb24ubWF0Y2guZ2V0RW5kKGNvcC5yZWZOdW1iZXIpID49IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaHAgPSAwIDw9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgY29wLmNvbmRpdGlvbiwgb2Zmc2V0LCBkeCwgb3B0cyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcCA9IGNvcC55ZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29wLm5vICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gY29wLm5vOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBjb3AubmV4dDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biBvcGVyYXRpb24gdHlwZTogIitvcC50eXBlKTsKLSAgICAgICAgICAgIH0gLy8gc3dpdGNoIChvcC50eXBlKQotICAgICAgICB9IC8vIHdoaWxlCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGdldFByZXZpb3VzV29yZFR5cGUoQ2hhcmFjdGVySXRlcmF0b3IgIHRhcmdldCwgaW50IGJlZ2luLCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBvcHRzKSB7Ci0gICAgICAgIGludCByZXQgPSBnZXRXb3JkVHlwZSh0YXJnZXQsIGJlZ2luLCBlbmQsIC0tb2Zmc2V0LCBvcHRzKTsKLSAgICAgICAgd2hpbGUgKHJldCA9PSBXVF9JR05PUkUpCi0gICAgICAgICAgICByZXQgPSBnZXRXb3JkVHlwZSh0YXJnZXQsIGJlZ2luLCBlbmQsIC0tb2Zmc2V0LCBvcHRzKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZ2V0V29yZFR5cGUoQ2hhcmFjdGVySXRlcmF0b3IgIHRhcmdldCwgaW50IGJlZ2luLCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgb3B0cykgewotICAgICAgICBpZiAob2Zmc2V0IDwgYmVnaW4gfHwgb2Zmc2V0ID49IGVuZCkgIHJldHVybiBXVF9PVEhFUjsKLSAgICAgICAgcmV0dXJuIGdldFdvcmRUeXBlMCggdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCApICwgb3B0cyk7Ci0gICAgfQotCi0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhDaGFyYWN0ZXJJdGVyYXRvciAgdGFyZ2V0LCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0LCBpbnQgcGFydGxlbikgewotICAgICAgICBpZiAob2Zmc2V0IDwgMCkgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGxpbWl0LW9mZnNldCA8IHBhcnRsZW4pCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKHBhcnRsZW4tLSA+IDApIHsKLSAgICAgICAgICAgIGlmICggdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCsrICkgICE9IHBhcnQuY2hhckF0KGkrKykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhDaGFyYWN0ZXJJdGVyYXRvciAgdGFyZ2V0LCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQyLCBpbnQgcGFydGxlbikgewotICAgICAgICBpZiAob2Zmc2V0IDwgMCkgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGxpbWl0LW9mZnNldCA8IHBhcnRsZW4pCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGludCBpID0gb2Zmc2V0MjsKLSAgICAgICAgd2hpbGUgKHBhcnRsZW4tLSA+IDApIHsKLSAgICAgICAgICAgIGlmICggdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCsrICkgICE9ICB0YXJnZXQgLnNldEluZGV4KCAgaSsrICkgKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcjcmVnaW9uTWF0Y2hlcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoQ2hhcmFjdGVySXRlcmF0b3IgIHRhcmdldCwgaW50IG9mZnNldCwgaW50IGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnQsIGludCBwYXJ0bGVuKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAobGltaXQtb2Zmc2V0IDwgcGFydGxlbikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAocGFydGxlbi0tID4gMCkgewotICAgICAgICAgICAgY2hhciBjaDEgPSAgdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCsrICkgOwotICAgICAgICAgICAgY2hhciBjaDIgPSBwYXJ0LmNoYXJBdChpKyspOwotICAgICAgICAgICAgaWYgKGNoMSA9PSBjaDIpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBjaGFyIHVjaDEgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gxKTsKLSAgICAgICAgICAgIGNoYXIgdWNoMiA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDIpOwotICAgICAgICAgICAgaWYgKHVjaDEgPT0gdWNoMikKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoMSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaDIpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKENoYXJhY3Rlckl0ZXJhdG9yICB0YXJnZXQsIGludCBvZmZzZXQsIGludCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQyLCBpbnQgcGFydGxlbikgewotICAgICAgICBpZiAob2Zmc2V0IDwgMCkgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGxpbWl0LW9mZnNldCA8IHBhcnRsZW4pCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGludCBpID0gb2Zmc2V0MjsKLSAgICAgICAgd2hpbGUgKHBhcnRsZW4tLSA+IDApIHsKLSAgICAgICAgICAgIGNoYXIgY2gxID0gIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQrKyApIDsKLSAgICAgICAgICAgIGNoYXIgY2gyID0gIHRhcmdldCAuc2V0SW5kZXgoICBpKysgKSA7Ci0gICAgICAgICAgICBpZiAoY2gxID09IGNoMikKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGNoYXIgdWNoMSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDEpOwotICAgICAgICAgICAgY2hhciB1Y2gyID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoMik7Ci0gICAgICAgICAgICBpZiAodWNoMSA9PSB1Y2gyKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh1Y2gxKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoMikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIC8qKgotICAgICAqIEEgcmVndWxhciBleHByZXNzaW9uLgotICAgICAqIEBzZXJpYWwKLSAgICAgKi8KLSAgICBTdHJpbmcgcmVnZXg7Ci0gICAgLyoqCi0gICAgICogQHNlcmlhbAotICAgICAqLwotICAgIGludCBvcHRpb25zOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBwYXJlbnRoZXNpcyBpbiB0aGUgcmVndWxhciBleHByZXNzaW9uLgotICAgICAqIEBzZXJpYWwKLSAgICAgKi8KLSAgICBpbnQgbm9mcGFyZW47Ci0gICAgLyoqCi0gICAgICogSW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICAgKiBAc2VyaWFsCi0gICAgICovCi0gICAgVG9rZW4gdG9rZW50cmVlOwotCi0gICAgYm9vbGVhbiBoYXNCYWNrUmVmZXJlbmNlcyA9IGZhbHNlOwotCi0gICAgdHJhbnNpZW50IGludCBtaW5sZW5ndGg7Ci0gICAgdHJhbnNpZW50IE9wIG9wZXJhdGlvbnMgPSBudWxsOwotICAgIHRyYW5zaWVudCBpbnQgbnVtYmVyT2ZDbG9zdXJlczsKLSAgICB0cmFuc2llbnQgQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKLSAgICB0cmFuc2llbnQgUmFuZ2VUb2tlbiBmaXJzdENoYXIgPSBudWxsOwotCi0gICAgdHJhbnNpZW50IFN0cmluZyBmaXhlZFN0cmluZyA9IG51bGw7Ci0gICAgdHJhbnNpZW50IGludCBmaXhlZFN0cmluZ09wdGlvbnM7Ci0gICAgdHJhbnNpZW50IEJNUGF0dGVybiBmaXhlZFN0cmluZ1RhYmxlID0gbnVsbDsKLSAgICB0cmFuc2llbnQgYm9vbGVhbiBmaXhlZFN0cmluZ09ubHkgPSBmYWxzZTsKLQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIENvbnRleHQgewotICAgICAgICBDaGFyYWN0ZXJJdGVyYXRvciBjaVRhcmdldDsKLSAgICAgICAgU3RyaW5nIHN0clRhcmdldDsKLSAgICAgICAgY2hhcltdIGNoYXJUYXJnZXQ7Ci0gICAgICAgIGludCBzdGFydDsKLSAgICAgICAgaW50IGxpbWl0OwotICAgICAgICBpbnQgbGVuZ3RoOwotICAgICAgICBNYXRjaCBtYXRjaDsKLSAgICAgICAgYm9vbGVhbiBpbnVzZSA9IGZhbHNlOwotICAgICAgICBpbnRbXSBvZmZzZXRzOwotCi0gICAgICAgIENvbnRleHQoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcmVzZXRDb21tb24oaW50IG5vZmNsb3N1cmVzKSB7Ci0gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMubGltaXQtdGhpcy5zdGFydDsKLSAgICAgICAgICAgIHRoaXMuaW51c2UgPSB0cnVlOwotICAgICAgICAgICAgdGhpcy5tYXRjaCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAodGhpcy5vZmZzZXRzID09IG51bGwgfHwgdGhpcy5vZmZzZXRzLmxlbmd0aCAhPSBub2ZjbG9zdXJlcykKLSAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHMgPSBuZXcgaW50W25vZmNsb3N1cmVzXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IG5vZmNsb3N1cmVzOyAgaSArKykgIHRoaXMub2Zmc2V0c1tpXSA9IC0xOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQgcmVzZXQoQ2hhcmFjdGVySXRlcmF0b3IgdGFyZ2V0LCBpbnQgc3RhcnQsIGludCBsaW1pdCwgaW50IG5vZmNsb3N1cmVzKSB7Ci0gICAgICAgICAgICB0aGlzLmNpVGFyZ2V0ID0gdGFyZ2V0OwotICAgICAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0OwotICAgICAgICAgICAgdGhpcy5saW1pdCA9IGxpbWl0OwotICAgICAgICAgICAgdGhpcy5yZXNldENvbW1vbihub2ZjbG9zdXJlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCByZXNldChTdHJpbmcgdGFyZ2V0LCBpbnQgc3RhcnQsIGludCBsaW1pdCwgaW50IG5vZmNsb3N1cmVzKSB7Ci0gICAgICAgICAgICB0aGlzLnN0clRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgIHRoaXMubGltaXQgPSBsaW1pdDsKLSAgICAgICAgICAgIHRoaXMucmVzZXRDb21tb24obm9mY2xvc3VyZXMpOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQgcmVzZXQoY2hhcltdIHRhcmdldCwgaW50IHN0YXJ0LCBpbnQgbGltaXQsIGludCBub2ZjbG9zdXJlcykgewotICAgICAgICAgICAgdGhpcy5jaGFyVGFyZ2V0ID0gdGFyZ2V0OwotICAgICAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0OwotICAgICAgICAgICAgdGhpcy5saW1pdCA9IGxpbWl0OwotICAgICAgICAgICAgdGhpcy5yZXNldENvbW1vbihub2ZjbG9zdXJlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmVwYXJlcyBmb3IgbWF0Y2hpbmcuICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQganVzdCBiZWZvcmUgc3RhcnRpbmcgbWF0Y2hpbmcuCi0gICAgICovCi0gICAgdm9pZCBwcmVwYXJlKCkgewotICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgPSAwOwotICAgICAgICB0aGlzLmNvbXBpbGUodGhpcy50b2tlbnRyZWUpOwotICAgICAgICAvKgotICAgICAgICBpZiAgKHRoaXMub3BlcmF0aW9ucy50eXBlID09IE9wLkNMT1NVUkUgJiYgdGhpcy5vcGVyYXRpb25zLmdldENoaWxkKCkudHlwZSA9PSBPcC5ET1QpIHsgLy8gLioKLSAgICAgICAgICAgIE9wIGFuY2hvciA9IE9wLmNyZWF0ZUFuY2hvcihpc1NldCh0aGlzLm9wdGlvbnMsIFNJTkdMRV9MSU5FKSA/ICdBJyA6ICdAJyk7Ci0gICAgICAgICAgICBhbmNob3IubmV4dCA9IHRoaXMub3BlcmF0aW9uczsKLSAgICAgICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IGFuY2hvcjsKLSAgICAgICAgfQotICAgICAgICAqLwotICAgICAgICBpZiAoT3AuQ09VTlQpICBTeXN0ZW0uZXJyLnByaW50bG4oIkRFQlVHOiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnM6ICIrT3Aubm9maW5zdGFuY2VzKTsKLQotICAgICAgICB0aGlzLm1pbmxlbmd0aCA9IHRoaXMudG9rZW50cmVlLmdldE1pbkxlbmd0aCgpOwotCi0gICAgICAgIHRoaXMuZmlyc3RDaGFyID0gbnVsbDsKLSAgICAgICAgaWYgKCFpc1NldCh0aGlzLm9wdGlvbnMsIFBST0hJQklUX0hFQURfQ0hBUkFDVEVSX09QVElNSVpBVElPTikKLSAgICAgICAgICAgICYmICFpc1NldCh0aGlzLm9wdGlvbnMsIFhNTFNDSEVNQV9NT0RFKSkgewotICAgICAgICAgICAgUmFuZ2VUb2tlbiBmaXJzdENoYXIgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgaW50IGZyZXN1bHQgPSB0aGlzLnRva2VudHJlZS5hbmFseXplRmlyc3RDaGFyYWN0ZXIoZmlyc3RDaGFyLCB0aGlzLm9wdGlvbnMpOwotICAgICAgICAgICAgaWYgKGZyZXN1bHQgPT0gVG9rZW4uRkNfVEVSTUlOQUwpIHsKLSAgICAgICAgICAgICAgICBmaXJzdENoYXIuY29tcGFjdFJhbmdlcygpOwotICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RDaGFyID0gZmlyc3RDaGFyOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJERUJVRzogVXNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb3B0aW1pemF0aW9uOiAiK2ZpcnN0Q2hhcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25zICE9IG51bGwKLSAgICAgICAgICAgICYmICh0aGlzLm9wZXJhdGlvbnMudHlwZSA9PSBPcC5TVFJJTkcgfHwgdGhpcy5vcGVyYXRpb25zLnR5cGUgPT0gT3AuQ0hBUikKLSAgICAgICAgICAgICYmIHRoaXMub3BlcmF0aW9ucy5uZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50KCIgKioqIE9ubHkgZml4ZWQgc3RyaW5nISAqKiogIik7Ci0gICAgICAgICAgICB0aGlzLmZpeGVkU3RyaW5nT25seSA9IHRydWU7Ci0gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25zLnR5cGUgPT0gT3AuU1RSSU5HKQotICAgICAgICAgICAgICAgIHRoaXMuZml4ZWRTdHJpbmcgPSB0aGlzLm9wZXJhdGlvbnMuZ2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wZXJhdGlvbnMuZ2V0RGF0YSgpID49IDB4MTAwMDApIHsgLy8gT3AuQ0hBUgotICAgICAgICAgICAgICAgIHRoaXMuZml4ZWRTdHJpbmcgPSBSRVV0aWwuZGVjb21wb3NlVG9TdXJyb2dhdGVzKHRoaXMub3BlcmF0aW9ucy5nZXREYXRhKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjaGFyW10gYWMgPSBuZXcgY2hhclsxXTsKLSAgICAgICAgICAgICAgICBhY1swXSA9IChjaGFyKXRoaXMub3BlcmF0aW9ucy5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5maXhlZFN0cmluZyA9IG5ldyBTdHJpbmcoYWMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5maXhlZFN0cmluZ09wdGlvbnMgPSB0aGlzLm9wdGlvbnM7Ci0gICAgICAgICAgICB0aGlzLmZpeGVkU3RyaW5nVGFibGUgPSBuZXcgQk1QYXR0ZXJuKHRoaXMuZml4ZWRTdHJpbmcsIDI1NiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXQodGhpcy5maXhlZFN0cmluZ09wdGlvbnMsIElHTk9SRV9DQVNFKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWlzU2V0KHRoaXMub3B0aW9ucywgUFJPSElCSVRfRklYRURfU1RSSU5HX09QVElNSVpBVElPTikKLSAgICAgICAgICAgICAgICAgICAmJiAhaXNTZXQodGhpcy5vcHRpb25zLCBYTUxTQ0hFTUFfTU9ERSkpIHsKLSAgICAgICAgICAgIFRva2VuLkZpeGVkU3RyaW5nQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBUb2tlbi5GaXhlZFN0cmluZ0NvbnRhaW5lcigpOwotICAgICAgICAgICAgdGhpcy50b2tlbnRyZWUuZmluZEZpeGVkU3RyaW5nKGNvbnRhaW5lciwgdGhpcy5vcHRpb25zKTsKLSAgICAgICAgICAgIHRoaXMuZml4ZWRTdHJpbmcgPSBjb250YWluZXIudG9rZW4gPT0gbnVsbCA/IG51bGwgOiBjb250YWluZXIudG9rZW4uZ2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICB0aGlzLmZpeGVkU3RyaW5nT3B0aW9ucyA9IGNvbnRhaW5lci5vcHRpb25zOwotICAgICAgICAgICAgaWYgKHRoaXMuZml4ZWRTdHJpbmcgIT0gbnVsbCAmJiB0aGlzLmZpeGVkU3RyaW5nLmxlbmd0aCgpIDwgMikKLSAgICAgICAgICAgICAgICB0aGlzLmZpeGVkU3RyaW5nID0gbnVsbDsKLSAgICAgICAgICAgIC8vIFRoaXMgcGF0dGVybiBoYXMgYSBmaXhlZCBzdHJpbmcgb2Ygd2hpY2ggbGVuZ3RoIGlzIG1vcmUgdGhhbiBvbmUuCi0gICAgICAgICAgICBpZiAodGhpcy5maXhlZFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5maXhlZFN0cmluZ1RhYmxlID0gbmV3IEJNUGF0dGVybih0aGlzLmZpeGVkU3RyaW5nLCAyNTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NldCh0aGlzLmZpeGVkU3RyaW5nT3B0aW9ucywgSUdOT1JFX0NBU0UpKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJERUJVRzogVGhlIGxvbmdlc3QgZml4ZWQgc3RyaW5nOiAiK3RoaXMuZml4ZWRTdHJpbmcubGVuZ3RoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLyIgLy8rdGhpcy5maXhlZFN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIvIitSRVV0aWwuY3JlYXRlT3B0aW9uU3RyaW5nKHRoaXMuZml4ZWRTdHJpbmdPcHRpb25zKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnQoIlN0cmluZzogIik7Ci0gICAgICAgICAgICAgICAgICAgIFJFVXRpbC5kdW1wU3RyaW5nKHRoaXMuZml4ZWRTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuIG9wdGlvbi4KLSAgICAgKiBJZiB5b3Ugc3BlY2lmeSB0aGlzIG9wdGlvbiwgPHNwYW4gY2xhc3M9IlJFR0VYIj48a2JkPig8L2tiZD48dmFyPlg8L3Zhcj48a2JkPik8L2tiZD48L3NwYW4+Ci0gICAgICogY2FwdHVyZXMgbWF0Y2hlZCB0ZXh0LCBhbmQgPHNwYW4gY2xhc3M9IlJFR0VYIj48a2JkPig6Pzwva2JkPjx2YXI+WDwvdmFyPjxrYmQ+KTwva2JkPjwvc3Bhbj4KLSAgICAgKiBkb2VzIG5vdCBjYXB0dXJlLgotICAgICAqCi0gICAgICogQHNlZSAjUmVndWxhckV4cHJlc3Npb24oamF2YS5sYW5nLlN0cmluZyxpbnQpCi0gICAgICogQHNlZSAjc2V0UGF0dGVybihqYXZhLmxhbmcuU3RyaW5nLGludCkKLSAgICBzdGF0aWMgZmluYWwgaW50IE1BUktfUEFSRU5TID0gMTw8MDsKLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqICJpIgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSUdOT1JFX0NBU0UgPSAxPDwxOwotCi0gICAgLyoqCi0gICAgICogInMiCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIGludCBTSU5HTEVfTElORSA9IDE8PDI7Ci0KLSAgICAvKioKLSAgICAgKiAibSIKLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IE1VTFRJUExFX0xJTkVTID0gMTw8MzsKLQotICAgIC8qKgotICAgICAqICJ4IgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRVhURU5ERURfQ09NTUVOVCA9IDE8PDQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG9wdGlvbiByZWRlZmluZXMgPHNwYW4gY2xhc3M9IlJFR0VYIj48a2JkPlxkIFxEIFx3IFxXIFxzIFxTPC9rYmQ+PC9zcGFuPi4KLSAgICAgKgotICAgICAqIEBzZWUgI1JlZ3VsYXJFeHByZXNzaW9uKGphdmEubGFuZy5TdHJpbmcsaW50KQotICAgICAqIEBzZWUgI3NldFBhdHRlcm4oamF2YS5sYW5nLlN0cmluZyxpbnQpCi0gICAgICogQHNlZSAjVU5JQ09ERV9XT1JEX0JPVU5EQVJZCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIGludCBVU0VfVU5JQ09ERV9DQVRFR09SWSA9IDE8PDU7IC8vICJ1IgotCi0gICAgLyoqCi0gICAgICogQW4gb3B0aW9uLgotICAgICAqIFRoaXMgZW5hYmxlcyB0byBwcm9jZXNzIGxvY2FsZS1pbmRlcGVuZGVudCB3b3JkIGJvdW5kYXJ5IGZvciA8c3BhbiBjbGFzcz0iUkVHRVgiPjxrYmQ+XGIgXEIgXCZsdDsgXD48L2tiZD48L3NwYW4+LgotICAgICAqIDxwPkJ5IGRlZmF1bHQsIHRoZSBlbmdpbmUgY29uc2lkZXJzIGEgcG9zaXRpb24gYmV0d2VlbiBhIHdvcmQgY2hhcmFjdGVyCi0gICAgICogKDxzcGFuIGNsYXNzPSJSRUdFWCI+PEtiZD5cdzwva2JkPjwvc3Bhbj4pIGFuZCBhIG5vbiB3b3JkIGNoYXJhY3RlcgotICAgICAqIGlzIGEgd29yZCBib3VuZGFyeS4KLSAgICAgKiA8cD5CeSB0aGlzIG9wdGlvbiwgdGhlIGVuZ2luZSBjaGVja3Mgd29yZCBib3VuZGFyaWVzIHdpdGggdGhlIG1ldGhvZCBvZgotICAgICAqICdVbmljb2RlIFJlZ3VsYXIgRXhwcmVzc2lvbiBHdWlkZWxpbmVzJyBSZXZpc2lvbiA0LgotICAgICAqCi0gICAgICogQHNlZSAjUmVndWxhckV4cHJlc3Npb24oamF2YS5sYW5nLlN0cmluZyxpbnQpCi0gICAgICogQHNlZSAjc2V0UGF0dGVybihqYXZhLmxhbmcuU3RyaW5nLGludCkKLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFVOSUNPREVfV09SRF9CT1VOREFSWSA9IDE8PDY7IC8vICJ3IgotCi0gICAgLyoqCi0gICAgICogIkgiCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIGludCBQUk9ISUJJVF9IRUFEX0NIQVJBQ1RFUl9PUFRJTUlaQVRJT04gPSAxPDw3OwotICAgIC8qKgotICAgICAqICJGIgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUFJPSElCSVRfRklYRURfU1RSSU5HX09QVElNSVpBVElPTiA9IDE8PDg7Ci0gICAgLyoqCi0gICAgICogIlgiLiBYTUwgU2NoZW1hIG1vZGUuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIGludCBYTUxTQ0hFTUFfTU9ERSA9IDE8PDk7Ci0gICAgLyoqCi0gICAgICogIiwiLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU1BFQ0lBTF9DT01NQSA9IDE8PDEwOwotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzU2V0KGludCBvcHRpb25zLCBpbnQgZmxhZykgewotICAgICAgICByZXR1cm4gKG9wdGlvbnMgJiBmbGFnKSA9PSBmbGFnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgUmVndWxhckV4cHJlc3Npb24gaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVnZXggQSByZWd1bGFyIGV4cHJlc3Npb24KLSAgICAgKiBAZXhjZXB0aW9uIG9yZy5hcGFjaGUueGVyY2VzLnV0aWxzLnJlZ2V4LlBhcnNlRXhjZXB0aW9uIDxWQVI+cmVnZXg8L1ZBUj4gaXMgbm90IGNvbmZvcm1pbmcgdG8gdGhlIHN5bnRheC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVndWxhckV4cHJlc3Npb24oU3RyaW5nIHJlZ2V4KSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLnNldFBhdHRlcm4ocmVnZXgsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgUmVndWxhckV4cHJlc3Npb24gaW5zdGFuY2Ugd2l0aCBvcHRpb25zLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlZ2V4IEEgcmVndWxhciBleHByZXNzaW9uCi0gICAgICogQHBhcmFtIG9wdGlvbnMgQSBTdHJpbmcgY29uc2lzdGVkIG9mICJpIiAibSIgInMiICJ1IiAidyIgIiwiICJYIgotICAgICAqIEBleGNlcHRpb24gb3JnLmFwYWNoZS54ZXJjZXMudXRpbHMucmVnZXguUGFyc2VFeGNlcHRpb24gPFZBUj5yZWdleDwvVkFSPiBpcyBub3QgY29uZm9ybWluZyB0byB0aGUgc3ludGF4LgotICAgICAqLwotICAgIHB1YmxpYyBSZWd1bGFyRXhwcmVzc2lvbihTdHJpbmcgcmVnZXgsIFN0cmluZyBvcHRpb25zKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLnNldFBhdHRlcm4ocmVnZXgsIG9wdGlvbnMpOwotICAgIH0KLQotICAgIFJlZ3VsYXJFeHByZXNzaW9uKFN0cmluZyByZWdleCwgVG9rZW4gdG9rLCBpbnQgcGFyZW5zLCBib29sZWFuIGhhc0JhY2tSZWZlcmVuY2VzLCBpbnQgb3B0aW9ucykgewotICAgICAgICB0aGlzLnJlZ2V4ID0gcmVnZXg7Ci0gICAgICAgIHRoaXMudG9rZW50cmVlID0gdG9rOwotICAgICAgICB0aGlzLm5vZnBhcmVuID0gcGFyZW5zOwotICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotICAgICAgICB0aGlzLmhhc0JhY2tSZWZlcmVuY2VzID0gaGFzQmFja1JlZmVyZW5jZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuKFN0cmluZyBuZXdQYXR0ZXJuKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLnNldFBhdHRlcm4obmV3UGF0dGVybiwgdGhpcy5vcHRpb25zKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgbmV3UGF0dGVybiwgaW50IG9wdGlvbnMpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMucmVnZXggPSBuZXdQYXR0ZXJuOwotICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotICAgICAgICBSZWdleFBhcnNlciBycCA9IHRoaXMuaXNTZXQodGhpcy5vcHRpb25zLCBSZWd1bGFyRXhwcmVzc2lvbi5YTUxTQ0hFTUFfTU9ERSkKLSAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBQYXJzZXJGb3JYTUxTY2hlbWEoKSA6IG5ldyBSZWdleFBhcnNlcigpOwotICAgICAgICB0aGlzLnRva2VudHJlZSA9IHJwLnBhcnNlKHRoaXMucmVnZXgsIHRoaXMub3B0aW9ucyk7Ci0gICAgICAgIHRoaXMubm9mcGFyZW4gPSBycC5wYXJlbm51bWJlcjsKLSAgICAgICAgdGhpcy5oYXNCYWNrUmVmZXJlbmNlcyA9IHJwLmhhc0JhY2tSZWZlcmVuY2VzOwotCi0gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG51bGw7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IG51bGw7Ci0gICAgfQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgbmV3UGF0dGVybiwgU3RyaW5nIG9wdGlvbnMpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuc2V0UGF0dGVybihuZXdQYXR0ZXJuLCBSRVV0aWwucGFyc2VPcHRpb25zKG9wdGlvbnMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVnZXg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwcmVzZW50cyB0aGlzIGluc3RlbmNlIGluIFN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gdGhpcy50b2tlbnRyZWUudG9TdHJpbmcodGhpcy5vcHRpb25zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgb3B0aW9uIHN0cmluZy4KLSAgICAgKiBUaGUgb3JkZXIgb2YgbGV0dGVycyBpbiBpdCBtYXkgYmUgZGlmZmVyZW50IGZyb20gYSBzdHJpbmcgc3BlY2lmaWVkCi0gICAgICogaW4gYSBjb25zdHJ1Y3RvciBvciA8Y29kZT5zZXRQYXR0ZXJuKCk8L2NvZGU+LgotICAgICAqCi0gICAgICogQHNlZSAjUmVndWxhckV4cHJlc3Npb24oamF2YS5sYW5nLlN0cmluZyxqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqIEBzZWUgI3NldFBhdHRlcm4oamF2YS5sYW5nLlN0cmluZyxqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3B0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIFJFVXRpbC5jcmVhdGVPcHRpb25TdHJpbmcodGhpcy5vcHRpb25zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJuIHRydWUgaWYgcGF0dGVybnMgYXJlIHRoZSBzYW1lIGFuZCB0aGUgb3B0aW9ucyBhcmUgZXF1aXZhbGVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqID09IG51bGwpICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFJlZ3VsYXJFeHByZXNzaW9uKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgUmVndWxhckV4cHJlc3Npb24gciA9IChSZWd1bGFyRXhwcmVzc2lvbilvYmo7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlZ2V4LmVxdWFscyhyLnJlZ2V4KSAmJiB0aGlzLm9wdGlvbnMgPT0gci5vcHRpb25zOwotICAgIH0KLQotICAgIGJvb2xlYW4gZXF1YWxzKFN0cmluZyBwYXR0ZXJuLCBpbnQgb3B0aW9ucykgewotICAgICAgICByZXR1cm4gdGhpcy5yZWdleC5lcXVhbHMocGF0dGVybikgJiYgdGhpcy5vcHRpb25zID09IG9wdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gKHRoaXMucmVnZXgrIi8iK3RoaXMuZ2V0T3B0aW9ucygpKS5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBncm91cHMuCi0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyAxIHdoZW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBoYXMgbm8gY2FwdHVyaW5nLXBhcmVudGhlc2lzLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZkdyb3VwcygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubm9mcGFyZW47Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdUX0lHTk9SRSA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdUX0xFVFRFUiA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdUX09USEVSID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZ2V0V29yZFR5cGUwKGNoYXIgY2gsIGludCBvcHRzKSB7Ci0gICAgICAgIGlmICghaXNTZXQob3B0cywgVU5JQ09ERV9XT1JEX0JPVU5EQVJZKSkgewotICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIFVTRV9VTklDT0RFX0NBVEVHT1JZKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoVG9rZW4uZ2V0UmFuZ2UoIklzV29yZCIsIHRydWUpLm1hdGNoKGNoKSkgPyBXVF9MRVRURVIgOiBXVF9PVEhFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpc1dvcmRDaGFyKGNoKSA/IFdUX0xFVFRFUiA6IFdUX09USEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChDaGFyYWN0ZXIuZ2V0VHlwZShjaCkpIHsKLSAgICAgICAgY2FzZSBDaGFyYWN0ZXIuVVBQRVJDQVNFX0xFVFRFUjogICAgICAvLyBMCi0gICAgICAgIGNhc2UgQ2hhcmFjdGVyLkxPV0VSQ0FTRV9MRVRURVI6ICAgICAgLy8gTAotICAgICAgICBjYXNlIENoYXJhY3Rlci5USVRMRUNBU0VfTEVUVEVSOiAgICAgIC8vIEwKLSAgICAgICAgY2FzZSBDaGFyYWN0ZXIuTU9ESUZJRVJfTEVUVEVSOiAgICAgICAvLyBMCi0gICAgICAgIGNhc2UgQ2hhcmFjdGVyLk9USEVSX0xFVFRFUjogICAgICAgICAgLy8gTAotICAgICAgICBjYXNlIENoYXJhY3Rlci5MRVRURVJfTlVNQkVSOiAgICAgICAgIC8vIE4KLSAgICAgICAgY2FzZSBDaGFyYWN0ZXIuREVDSU1BTF9ESUdJVF9OVU1CRVI6ICAvLyBOCi0gICAgICAgIGNhc2UgQ2hhcmFjdGVyLk9USEVSX05VTUJFUjogICAgICAgICAgLy8gTgotICAgICAgICBjYXNlIENoYXJhY3Rlci5DT01CSU5JTkdfU1BBQ0lOR19NQVJLOiAvLyBNYwotICAgICAgICAgICAgcmV0dXJuIFdUX0xFVFRFUjsKLQotICAgICAgICBjYXNlIENoYXJhY3Rlci5GT1JNQVQ6ICAgICAgICAgICAgICAgIC8vIENmCi0gICAgICAgIGNhc2UgQ2hhcmFjdGVyLk5PTl9TUEFDSU5HX01BUks6ICAgICAgLy8gTW4KLSAgICAgICAgY2FzZSBDaGFyYWN0ZXIuRU5DTE9TSU5HX01BUks6ICAgICAgICAvLyBNYwotICAgICAgICAgICAgcmV0dXJuIFdUX0lHTk9SRTsKLQotICAgICAgICBjYXNlIENoYXJhY3Rlci5DT05UUk9MOiAgICAgICAgICAgICAgIC8vIENjCi0gICAgICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICBjYXNlICdcdTAwMEInOgotICAgICAgICAgICAgY2FzZSAnXGYnOgotICAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgICAgIHJldHVybiBXVF9PVEhFUjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdUX0lHTk9SRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIFdUX09USEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgc3RhdGljIGZpbmFsIGludCBMSU5FX0ZFRUQgPSAweDAwMEE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDQVJSSUFHRV9SRVRVUk4gPSAweDAwMEQ7Ci0gICAgc3RhdGljIGZpbmFsIGludCBMSU5FX1NFUEFSQVRPUiA9IDB4MjAyODsKLSAgICBzdGF0aWMgZmluYWwgaW50IFBBUkFHUkFQSF9TRVBBUkFUT1IgPSAweDIwMjk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzRU9MQ2hhcihpbnQgY2gpIHsKLSAgICAgICAgcmV0dXJuIGNoID09IExJTkVfRkVFRCB8fCBjaCA9PSBDQVJSSUFHRV9SRVRVUk4gfHwgY2ggPT0gTElORV9TRVBBUkFUT1IKLSAgICAgICAgfHwgY2ggPT0gUEFSQUdSQVBIX1NFUEFSQVRPUjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzV29yZENoYXIoaW50IGNoKSB7IC8vIExlZ2FjeSB3b3JkIGNoYXJhY3RlcnMKLSAgICAgICAgaWYgKGNoID09ICdfJykgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoY2ggPCAnMCcpICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChjaCA+ICd6JykgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGNoIDw9ICc5JykgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoY2ggPCAnQScpICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChjaCA8PSAnWicpICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGNoIDwgJ2EnKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIG1hdGNoSWdub3JlQ2FzZShpbnQgY2hhcmRhdGEsIGludCBjaCkgewotICAgICAgICBpZiAoY2hhcmRhdGEgPT0gY2gpICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGNoYXJkYXRhID4gMHhmZmZmIHx8IGNoID4gMHhmZmZmKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjaGFyIHVjaDEgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpY2hhcmRhdGEpOwotICAgICAgICBjaGFyIHVjaDIgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpY2gpOwotICAgICAgICBpZiAodWNoMSA9PSB1Y2gyKSAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoMSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaDIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvU2NoZW1hUmVndWxhckV4cHJlc3Npb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvU2NoZW1hUmVndWxhckV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyYWRlOC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1NjaGVtYVJlZ3VsYXJFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWE1MQ2hhcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFSZWd1bGFyRXhwcmVzc2lvbiBleHRlbmRzIFJlZ3VsYXJFeHByZXNzaW9uCi17Ci0gICAgcHJpdmF0ZSBTY2hlbWFSZWd1bGFyRXhwcmVzc2lvbihTdHJpbmcgcGF0dGVybikKLSAgICB7Ci0gICAgICAgIHN1cGVyKHBhdHRlcm4sICJYIik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZWd1bGFyRXhwcmVzc2lvbiBmb3JQYXR0ZXJuKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgU2NoZW1hUmVndWxhckV4cHJlc3Npb24gdHJlID0gKFNjaGVtYVJlZ3VsYXJFeHByZXNzaW9uKWtub3duUGF0dGVybnMuZ2V0KHMpOwotICAgICAgICBpZiAodHJlICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gdHJlOwotICAgICAgICByZXR1cm4gbmV3IFJlZ3VsYXJFeHByZXNzaW9uKHMsICJYIik7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIE1hcCBrbm93blBhdHRlcm5zID0gYnVpbGRLbm93blBhdHRlcm5NYXAoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBidWlsZEtub3duUGF0dGVybk1hcCgpCi0gICAgewotICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgcmVzdWx0LnB1dCgiXFxjKyIsIG5ldyBTY2hlbWFSZWd1bGFyRXhwcmVzc2lvbigiXFxjKyIpCi0gICAgICAgICAgICB7IHB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIHMpIHsgcmV0dXJuIFhNTENoYXIuaXNWYWxpZE5tdG9rZW4ocyk7IH0gfSApOwotICAgICAgICByZXN1bHQucHV0KCJcXGlcXGMqIiwgbmV3IFNjaGVtYVJlZ3VsYXJFeHByZXNzaW9uKCJcXGlcXGMqIikKLSAgICAgICAgICAgIHsgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgcykgeyByZXR1cm4gWE1MQ2hhci5pc1ZhbGlkTmFtZShzKTsgfSB9ICk7Ci0gICAgICAgIHJlc3VsdC5wdXQoIltcXGktWzpdXVtcXGMtWzpdXSoiLCBuZXcgU2NoZW1hUmVndWxhckV4cHJlc3Npb24oIltcXGktWzpdXVtcXGMtWzpdXSoiKQotICAgICAgICAgICAgeyBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBzKSB7IHJldHVybiBYTUxDaGFyLmlzVmFsaWROQ05hbWUocyk7IH0gfSApOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvVG9rZW4uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkzMTJlZS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1Rva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5vZGUgaW4gcGFyc2UgdHJlZS4KLSAqLwotY2xhc3MgVG9rZW4gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ09VTlRUT0tFTlMgPSB0cnVlOwotICAgIHN0YXRpYyBpbnQgdG9rZW5zID0gMDsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUiA9IDA7ICAgICAgICAgICAgICAgICAgLy8gTGl0ZXJhbCBjaGFyCi0gICAgc3RhdGljIGZpbmFsIGludCBET1QgPSAxMTsgICAgICAgICAgICAgICAgICAvLyAuCi0gICAgc3RhdGljIGZpbmFsIGludCBDT05DQVQgPSAxOyAgICAgICAgICAgICAgICAvLyBYWQotICAgIHN0YXRpYyBmaW5hbCBpbnQgVU5JT04gPSAyOyAgICAgICAgICAgICAgICAgLy8gWHxZfFoKLSAgICBzdGF0aWMgZmluYWwgaW50IENMT1NVUkUgPSAzOyAgICAgICAgICAgICAgIC8vIFgqCi0gICAgc3RhdGljIGZpbmFsIGludCBSQU5HRSA9IDQ7ICAgICAgICAgICAgICAgICAvLyBbYS16QS1aXSBldGMuCi0gICAgc3RhdGljIGZpbmFsIGludCBOUkFOR0UgPSA1OyAgICAgICAgICAgICAgICAvLyBbXmEtekEtWl0gZXRjLgotICAgIHN0YXRpYyBmaW5hbCBpbnQgUEFSRU4gPSA2OyAgICAgICAgICAgICAgICAgLy8gKFgpIG9yICg/OlgpCi0gICAgc3RhdGljIGZpbmFsIGludCBFTVBUWSA9IDc7ICAgICAgICAgICAgICAgICAvLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQU5DSE9SID0gODsgICAgICAgICAgICAgICAgLy8gXiAkIFxiIFxCIFw8IFw+IFxBIFxaIFx6Ci0gICAgc3RhdGljIGZpbmFsIGludCBOT05HUkVFRFlDTE9TVVJFID0gOTsgICAgICAvLyAqPyArPwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HID0gMTA7ICAgICAgICAgICAgICAgLy8gc3RyaW5ncwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQkFDS1JFRkVSRU5DRSA9IDEyOyAgICAgICAgLy8gYmFjayByZWZlcmVuY2VzCi0gICAgc3RhdGljIGZpbmFsIGludCBMT09LQUhFQUQgPSAyMDsgICAgICAgICAgICAvLyAoPz0uLi4pCi0gICAgc3RhdGljIGZpbmFsIGludCBORUdBVElWRUxPT0tBSEVBRCA9IDIxOyAgICAvLyAoPyEuLi4pCi0gICAgc3RhdGljIGZpbmFsIGludCBMT09LQkVISU5EID0gMjI7ICAgICAgICAgICAvLyAoPzw9Li4uKQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTkVHQVRJVkVMT09LQkVISU5EID0gMjM7ICAgLy8gKD88IS4uLikKLSAgICBzdGF0aWMgZmluYWwgaW50IElOREVQRU5ERU5UID0gMjQ7ICAgICAgICAgIC8vICg/Pi4uLikKLSAgICBzdGF0aWMgZmluYWwgaW50IE1PRElGSUVSR1JPVVAgPSAyNTsgICAgICAgIC8vICg/aW1zLWltczouLi4pCi0gICAgc3RhdGljIGZpbmFsIGludCBDT05ESVRJT04gPSAyNjsgICAgICAgICAgICAvLyAoPyguLi4peWVzfG5vKQotCi0gICAgc3RhdGljIGZpbmFsIGludCBVVEYxNl9NQVggPSAweDEwZmZmZjsKLQotICAgIGludCB0eXBlOwotCi0gICAgc3RhdGljIFRva2VuIHRva2VuX2RvdDsKLSAgICBzdGF0aWMgVG9rZW4gdG9rZW5fMHRvOTsKLSAgICBzdGF0aWMgVG9rZW4gdG9rZW5fd29yZGNoYXJzOwotICAgIHN0YXRpYyBUb2tlbiB0b2tlbl9ub3RfMHRvOTsKLSAgICBzdGF0aWMgVG9rZW4gdG9rZW5fbm90X3dvcmRjaGFyczsKLSAgICBzdGF0aWMgVG9rZW4gdG9rZW5fc3BhY2VzOwotICAgIHN0YXRpYyBUb2tlbiB0b2tlbl9ub3Rfc3BhY2VzOwotICAgIHN0YXRpYyBUb2tlbiB0b2tlbl9lbXB0eTsKLSAgICBzdGF0aWMgVG9rZW4gdG9rZW5fbGluZWJlZ2lubmluZzsKLSAgICBzdGF0aWMgVG9rZW4gdG9rZW5fbGluZWJlZ2lubmluZzI7Ci0gICAgc3RhdGljIFRva2VuIHRva2VuX2xpbmVlbmQ7Ci0gICAgc3RhdGljIFRva2VuIHRva2VuX3N0cmluZ2JlZ2lubmluZzsKLSAgICBzdGF0aWMgVG9rZW4gdG9rZW5fc3RyaW5nZW5kOwotICAgIHN0YXRpYyBUb2tlbiB0b2tlbl9zdHJpbmdlbmQyOwotICAgIHN0YXRpYyBUb2tlbiB0b2tlbl93b3JkZWRnZTsKLSAgICBzdGF0aWMgVG9rZW4gdG9rZW5fbm90X3dvcmRlZGdlOwotICAgIHN0YXRpYyBUb2tlbiB0b2tlbl93b3JkYmVnaW5uaW5nOwotICAgIHN0YXRpYyBUb2tlbiB0b2tlbl93b3JkZW5kOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIFRva2VuLnRva2VuX2VtcHR5ID0gbmV3IFRva2VuKFRva2VuLkVNUFRZKTsKLQotICAgICAgICBUb2tlbi50b2tlbl9saW5lYmVnaW5uaW5nID0gVG9rZW4uY3JlYXRlQW5jaG9yKCdeJyk7Ci0gICAgICAgIFRva2VuLnRva2VuX2xpbmViZWdpbm5pbmcyID0gVG9rZW4uY3JlYXRlQW5jaG9yKCdAJyk7Ci0gICAgICAgIFRva2VuLnRva2VuX2xpbmVlbmQgPSBUb2tlbi5jcmVhdGVBbmNob3IoJyQnKTsKLSAgICAgICAgVG9rZW4udG9rZW5fc3RyaW5nYmVnaW5uaW5nID0gVG9rZW4uY3JlYXRlQW5jaG9yKCdBJyk7Ci0gICAgICAgIFRva2VuLnRva2VuX3N0cmluZ2VuZCA9IFRva2VuLmNyZWF0ZUFuY2hvcigneicpOwotICAgICAgICBUb2tlbi50b2tlbl9zdHJpbmdlbmQyID0gVG9rZW4uY3JlYXRlQW5jaG9yKCdaJyk7Ci0gICAgICAgIFRva2VuLnRva2VuX3dvcmRlZGdlID0gVG9rZW4uY3JlYXRlQW5jaG9yKCdiJyk7Ci0gICAgICAgIFRva2VuLnRva2VuX25vdF93b3JkZWRnZSA9IFRva2VuLmNyZWF0ZUFuY2hvcignQicpOwotICAgICAgICBUb2tlbi50b2tlbl93b3JkYmVnaW5uaW5nID0gVG9rZW4uY3JlYXRlQW5jaG9yKCc8Jyk7Ci0gICAgICAgIFRva2VuLnRva2VuX3dvcmRlbmQgPSBUb2tlbi5jcmVhdGVBbmNob3IoJz4nKTsKLQotICAgICAgICBUb2tlbi50b2tlbl9kb3QgPSBuZXcgVG9rZW4oVG9rZW4uRE9UKTsKLQotICAgICAgICBUb2tlbi50b2tlbl8wdG85ID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgVG9rZW4udG9rZW5fMHRvOS5hZGRSYW5nZSgnMCcsICc5Jyk7Ci0gICAgICAgIFRva2VuLnRva2VuX3dvcmRjaGFycyA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgIFRva2VuLnRva2VuX3dvcmRjaGFycy5hZGRSYW5nZSgnMCcsICc5Jyk7Ci0gICAgICAgIFRva2VuLnRva2VuX3dvcmRjaGFycy5hZGRSYW5nZSgnQScsICdaJyk7Ci0gICAgICAgIFRva2VuLnRva2VuX3dvcmRjaGFycy5hZGRSYW5nZSgnXycsICdfJyk7Ci0gICAgICAgIFRva2VuLnRva2VuX3dvcmRjaGFycy5hZGRSYW5nZSgnYScsICd6Jyk7Ci0gICAgICAgIFRva2VuLnRva2VuX3NwYWNlcyA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgIFRva2VuLnRva2VuX3NwYWNlcy5hZGRSYW5nZSgnXHQnLCAnXHQnKTsKLSAgICAgICAgVG9rZW4udG9rZW5fc3BhY2VzLmFkZFJhbmdlKCdcbicsICdcbicpOwotICAgICAgICBUb2tlbi50b2tlbl9zcGFjZXMuYWRkUmFuZ2UoJ1xmJywgJ1xmJyk7Ci0gICAgICAgIFRva2VuLnRva2VuX3NwYWNlcy5hZGRSYW5nZSgnXHInLCAnXHInKTsKLSAgICAgICAgVG9rZW4udG9rZW5fc3BhY2VzLmFkZFJhbmdlKCcgJywgJyAnKTsKLQotICAgICAgICBUb2tlbi50b2tlbl9ub3RfMHRvOSA9IFRva2VuLmNvbXBsZW1lbnRSYW5nZXMoVG9rZW4udG9rZW5fMHRvOSk7Ci0gICAgICAgIFRva2VuLnRva2VuX25vdF93b3JkY2hhcnMgPSBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKFRva2VuLnRva2VuX3dvcmRjaGFycyk7Ci0gICAgICAgIFRva2VuLnRva2VuX25vdF9zcGFjZXMgPSBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKFRva2VuLnRva2VuX3NwYWNlcyk7Ci0gICAgfQotCi0gICAgc3RhdGljIFRva2VuLlBhcmVuVG9rZW4gY3JlYXRlTG9vayhpbnQgdHlwZSwgVG9rZW4gY2hpbGQpIHsKLSAgICAgICAgaWYgKENPVU5UVE9LRU5TKSAgVG9rZW4udG9rZW5zICsrOwotICAgICAgICByZXR1cm4gbmV3IFRva2VuLlBhcmVuVG9rZW4odHlwZSwgY2hpbGQsIDApOwotICAgIH0KLSAgICBzdGF0aWMgVG9rZW4uUGFyZW5Ub2tlbiBjcmVhdGVQYXJlbihUb2tlbiBjaGlsZCwgaW50IHBudW1iZXIpIHsKLSAgICAgICAgaWYgKENPVU5UVE9LRU5TKSAgVG9rZW4udG9rZW5zICsrOwotICAgICAgICByZXR1cm4gbmV3IFRva2VuLlBhcmVuVG9rZW4oVG9rZW4uUEFSRU4sIGNoaWxkLCBwbnVtYmVyKTsKLSAgICB9Ci0gICAgc3RhdGljIFRva2VuLkNsb3N1cmVUb2tlbiBjcmVhdGVDbG9zdXJlKFRva2VuIHRvaykgewotICAgICAgICBpZiAoQ09VTlRUT0tFTlMpICBUb2tlbi50b2tlbnMgKys7Ci0gICAgICAgIHJldHVybiBuZXcgVG9rZW4uQ2xvc3VyZVRva2VuKFRva2VuLkNMT1NVUkUsIHRvayk7Ci0gICAgfQotICAgIHN0YXRpYyBUb2tlbi5DbG9zdXJlVG9rZW4gY3JlYXRlTkdDbG9zdXJlKFRva2VuIHRvaykgewotICAgICAgICBpZiAoQ09VTlRUT0tFTlMpICBUb2tlbi50b2tlbnMgKys7Ci0gICAgICAgIHJldHVybiBuZXcgVG9rZW4uQ2xvc3VyZVRva2VuKFRva2VuLk5PTkdSRUVEWUNMT1NVUkUsIHRvayk7Ci0gICAgfQotICAgIHN0YXRpYyBUb2tlbi5Db25jYXRUb2tlbiBjcmVhdGVDb25jYXQoVG9rZW4gdG9rMSwgVG9rZW4gdG9rMikgewotICAgICAgICBpZiAoQ09VTlRUT0tFTlMpICBUb2tlbi50b2tlbnMgKys7Ci0gICAgICAgIHJldHVybiBuZXcgVG9rZW4uQ29uY2F0VG9rZW4odG9rMSwgdG9rMik7Ci0gICAgfQotICAgIHN0YXRpYyBUb2tlbi5VbmlvblRva2VuIGNyZWF0ZUNvbmNhdCgpIHsKLSAgICAgICAgaWYgKENPVU5UVE9LRU5TKSAgVG9rZW4udG9rZW5zICsrOwotICAgICAgICByZXR1cm4gbmV3IFRva2VuLlVuaW9uVG9rZW4oVG9rZW4uQ09OQ0FUKTsgLy8gKioqIEl0IGlzIG5vdCBhIGJ1Zy4KLSAgICB9Ci0gICAgc3RhdGljIFRva2VuLlVuaW9uVG9rZW4gY3JlYXRlVW5pb24oKSB7Ci0gICAgICAgIGlmIChDT1VOVFRPS0VOUykgIFRva2VuLnRva2VucyArKzsKLSAgICAgICAgcmV0dXJuIG5ldyBUb2tlbi5VbmlvblRva2VuKFRva2VuLlVOSU9OKTsKLSAgICB9Ci0gICAgc3RhdGljIFRva2VuIGNyZWF0ZUVtcHR5KCkgewotICAgICAgICByZXR1cm4gVG9rZW4udG9rZW5fZW1wdHk7Ci0gICAgfQotICAgIHN0YXRpYyBSYW5nZVRva2VuIGNyZWF0ZVJhbmdlKCkgewotICAgICAgICBpZiAoQ09VTlRUT0tFTlMpICBUb2tlbi50b2tlbnMgKys7Ci0gICAgICAgIHJldHVybiBuZXcgUmFuZ2VUb2tlbihUb2tlbi5SQU5HRSk7Ci0gICAgfQotICAgIHN0YXRpYyBSYW5nZVRva2VuIGNyZWF0ZU5SYW5nZSgpIHsKLSAgICAgICAgaWYgKENPVU5UVE9LRU5TKSAgVG9rZW4udG9rZW5zICsrOwotICAgICAgICByZXR1cm4gbmV3IFJhbmdlVG9rZW4oVG9rZW4uTlJBTkdFKTsKLSAgICB9Ci0gICAgc3RhdGljIFRva2VuLkNoYXJUb2tlbiBjcmVhdGVDaGFyKGludCBjaCkgewotICAgICAgICBpZiAoQ09VTlRUT0tFTlMpICBUb2tlbi50b2tlbnMgKys7Ci0gICAgICAgIHJldHVybiBuZXcgVG9rZW4uQ2hhclRva2VuKFRva2VuLkNIQVIsIGNoKTsKLSAgICB9Ci0gICAgc3RhdGljIHByaXZhdGUgVG9rZW4uQ2hhclRva2VuIGNyZWF0ZUFuY2hvcihpbnQgY2gpIHsKLSAgICAgICAgaWYgKENPVU5UVE9LRU5TKSAgVG9rZW4udG9rZW5zICsrOwotICAgICAgICByZXR1cm4gbmV3IFRva2VuLkNoYXJUb2tlbihUb2tlbi5BTkNIT1IsIGNoKTsKLSAgICB9Ci0gICAgc3RhdGljIFRva2VuLlN0cmluZ1Rva2VuIGNyZWF0ZUJhY2tSZWZlcmVuY2UoaW50IHJlZm5vKSB7Ci0gICAgICAgIGlmIChDT1VOVFRPS0VOUykgIFRva2VuLnRva2VucyArKzsKLSAgICAgICAgcmV0dXJuIG5ldyBUb2tlbi5TdHJpbmdUb2tlbihUb2tlbi5CQUNLUkVGRVJFTkNFLCBudWxsLCByZWZubyk7Ci0gICAgfQotICAgIHN0YXRpYyBUb2tlbi5TdHJpbmdUb2tlbiBjcmVhdGVTdHJpbmcoU3RyaW5nIHN0cikgewotICAgICAgICBpZiAoQ09VTlRUT0tFTlMpICBUb2tlbi50b2tlbnMgKys7Ci0gICAgICAgIHJldHVybiBuZXcgVG9rZW4uU3RyaW5nVG9rZW4oVG9rZW4uU1RSSU5HLCBzdHIsIDApOwotICAgIH0KLSAgICBzdGF0aWMgVG9rZW4uTW9kaWZpZXJUb2tlbiBjcmVhdGVNb2RpZmllckdyb3VwKFRva2VuIGNoaWxkLCBpbnQgYWRkLCBpbnQgbWFzaykgewotICAgICAgICBpZiAoQ09VTlRUT0tFTlMpICBUb2tlbi50b2tlbnMgKys7Ci0gICAgICAgIHJldHVybiBuZXcgVG9rZW4uTW9kaWZpZXJUb2tlbihjaGlsZCwgYWRkLCBtYXNrKTsKLSAgICB9Ci0gICAgc3RhdGljIFRva2VuLkNvbmRpdGlvblRva2VuIGNyZWF0ZUNvbmRpdGlvbihpbnQgcmVmbm8sIFRva2VuIGNvbmRpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuIHllc3BhdCwgVG9rZW4gbm9wYXQpIHsKLSAgICAgICAgaWYgKENPVU5UVE9LRU5TKSAgVG9rZW4udG9rZW5zICsrOwotICAgICAgICByZXR1cm4gbmV3IFRva2VuLkNvbmRpdGlvblRva2VuKHJlZm5vLCBjb25kaXRpb24sIHllc3BhdCwgbm9wYXQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBUb2tlbihpbnQgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgbnVtYmVyIG9mIGNoaWxkcmVuLgotICAgICAqLwotICAgIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgVG9rZW4gZ2V0Q2hpbGQoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICB2b2lkIGFkZENoaWxkKFRva2VuIHRvaykgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZC4iKTsKLSAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBSQU5HRSBvciBOUkFOR0UKLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNvcnRSYW5nZXMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkLiIpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21wYWN0UmFuZ2VzKCkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZC4iKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgbWVyZ2VSYW5nZXMoVG9rZW4gdG9rKSB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkLiIpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzdWJ0cmFjdFJhbmdlcyhUb2tlbiB0b2spIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIGludGVyc2VjdFJhbmdlcyhUb2tlbiB0b2spIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgfQotICAgIHN0YXRpYyBUb2tlbiBjb21wbGVtZW50UmFuZ2VzKFRva2VuIHRvaykgewotICAgICAgICByZXR1cm4gUmFuZ2VUb2tlbi5jb21wbGVtZW50UmFuZ2VzKHRvayk7Ci0gICAgfQotCi0KLSAgICB2b2lkIHNldE1pbihpbnQgbWluKSB7ICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBDTE9TVVJFCi0gICAgfQotICAgIHZvaWQgc2V0TWF4KGludCBtYXgpIHsgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIENMT1NVUkUKLSAgICB9Ci0gICAgaW50IGdldE1pbigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgQ0xPU1VSRQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGludCBnZXRNYXgoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIENMT1NVUkUKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpbnQgZ2V0UmVmZXJlbmNlTnVtYmVyKCkgeyAgICAgICAgICAgICAgICAgIC8vIGZvciBTVFJJTkcKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIFN0cmluZyBnZXRTdHJpbmcoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIFNUUklORwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0UGFyZW5OdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpbnQgZ2V0Q2hhcigpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKDApOwotICAgIH0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCBvcHRpb25zKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT0gVG9rZW4uRE9UID8gIi4iIDogIiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSG93IG1hbnkgY2hhcmFjdGVycyBhcmUgbmVlZGVkPwotICAgICAqLwotICAgIGZpbmFsIGludCBnZXRNaW5MZW5ndGgoKSB7Ci0gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7Ci0gICAgICAgICAgY2FzZSBDT05DQVQ6Ci0gICAgICAgICAgICBpbnQgc3VtID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRoaXMuc2l6ZSgpOyAgaSArKykKLSAgICAgICAgICAgICAgICBzdW0gKz0gdGhpcy5nZXRDaGlsZChpKS5nZXRNaW5MZW5ndGgoKTsKLSAgICAgICAgICAgIHJldHVybiBzdW07Ci0KLSAgICAgICAgICBjYXNlIENPTkRJVElPTjoKLSAgICAgICAgICBjYXNlIFVOSU9OOgotICAgICAgICAgICAgaWYgKHRoaXMuc2l6ZSgpID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy5nZXRDaGlsZCgwKS5nZXRNaW5MZW5ndGgoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyAgaSA8IHRoaXMuc2l6ZSgpOyAgaSArKykgewotICAgICAgICAgICAgICAgIGludCBtaW4gPSB0aGlzLmdldENoaWxkKGkpLmdldE1pbkxlbmd0aCgpOwotICAgICAgICAgICAgICAgIGlmIChtaW4gPCByZXQpICByZXQgPSBtaW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgICAgICAgY2FzZSBDTE9TVVJFOgotICAgICAgICAgIGNhc2UgTk9OR1JFRURZQ0xPU1VSRToKLSAgICAgICAgICAgIGlmICh0aGlzLmdldE1pbigpID49IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWluKCkgKiB0aGlzLmdldENoaWxkKDApLmdldE1pbkxlbmd0aCgpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICBjYXNlIEVNUFRZOgotICAgICAgICAgIGNhc2UgQU5DSE9SOgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICBjYXNlIERPVDoKLSAgICAgICAgICBjYXNlIENIQVI6Ci0gICAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgICBjYXNlIE5SQU5HRToKLSAgICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgICAgY2FzZSBJTkRFUEVOREVOVDoKLSAgICAgICAgICBjYXNlIFBBUkVOOgotICAgICAgICAgIGNhc2UgTU9ESUZJRVJHUk9VUDoKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENoaWxkKDApLmdldE1pbkxlbmd0aCgpOwotCi0gICAgICAgICAgY2FzZSBCQUNLUkVGRVJFTkNFOgotICAgICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKioqKioqKgotCi0gICAgICAgICAgY2FzZSBTVFJJTkc6Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmcoKS5sZW5ndGgoKTsKLQotICAgICAgICAgIGNhc2UgTE9PS0FIRUFEOgotICAgICAgICAgIGNhc2UgTkVHQVRJVkVMT09LQUhFQUQ6Ci0gICAgICAgICAgY2FzZSBMT09LQkVISU5EOgotICAgICAgICAgIGNhc2UgTkVHQVRJVkVMT09LQkVISU5EOgotICAgICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKioqKiogUmVhbGx5PwotCi0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUb2tlbiNnZXRNaW5MZW5ndGgoKTogSW52YWxpZCBUeXBlOiAiK3RoaXMudHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmaW5hbCBpbnQgZ2V0TWF4TGVuZ3RoKCkgewotICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkgewotICAgICAgICAgIGNhc2UgQ09OQ0FUOgotICAgICAgICAgICAgaW50IHN1bSA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLnNpemUoKTsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgZCA9IHRoaXMuZ2V0Q2hpbGQoaSkuZ2V0TWF4TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGQgPCAwKSAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIHN1bSArPSBkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN1bTsKLQotICAgICAgICAgIGNhc2UgQ09ORElUSU9OOgotICAgICAgICAgIGNhc2UgVU5JT046Ci0gICAgICAgICAgICBpZiAodGhpcy5zaXplKCkgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIGludCByZXQgPSB0aGlzLmdldENoaWxkKDApLmdldE1heExlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7ICByZXQgPj0gMCAmJiBpIDwgdGhpcy5zaXplKCk7ICBpICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IG1heCA9IHRoaXMuZ2V0Q2hpbGQoaSkuZ2V0TWF4TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1heCA8IDApIHsgICAgICAgICAgICAgICAgICAvLyBpbmZpbml0eQotICAgICAgICAgICAgICAgICAgICByZXQgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtYXggPiByZXQpICByZXQgPSBtYXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgICAgICAgY2FzZSBDTE9TVVJFOgotICAgICAgICAgIGNhc2UgTk9OR1JFRURZQ0xPU1VSRToKLSAgICAgICAgICAgIGlmICh0aGlzLmdldE1heCgpID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoaXMuY2hpbGQuZ2V0TWF4TGVuZ3RoKCkgPCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5zIG1pbnVzIHZhbHVlCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWF4KCkgKiB0aGlzLmdldENoaWxkKDApLmdldE1heExlbmd0aCgpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgY2FzZSBFTVBUWToKLSAgICAgICAgICBjYXNlIEFOQ0hPUjoKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgY2FzZSBDSEFSOgotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgY2FzZSBET1Q6Ci0gICAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgICBjYXNlIE5SQU5HRToKLSAgICAgICAgICAgIHJldHVybiAyOwotCi0gICAgICAgICAgY2FzZSBJTkRFUEVOREVOVDoKLSAgICAgICAgICBjYXNlIFBBUkVOOgotICAgICAgICAgIGNhc2UgTU9ESUZJRVJHUk9VUDoKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENoaWxkKDApLmdldE1heExlbmd0aCgpOwotCi0gICAgICAgICAgY2FzZSBCQUNLUkVGRVJFTkNFOgotICAgICAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKioqKioqCi0KLSAgICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFN0cmluZygpLmxlbmd0aCgpOwotCi0gICAgICAgICAgY2FzZSBMT09LQUhFQUQ6Ci0gICAgICAgICAgY2FzZSBORUdBVElWRUxPT0tBSEVBRDoKLSAgICAgICAgICBjYXNlIExPT0tCRUhJTkQ6Ci0gICAgICAgICAgY2FzZSBORUdBVElWRUxPT0tCRUhJTkQ6Ci0gICAgICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAqKioqKiBSZWFsbHk/Ci0KLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRva2VuI2dldE1heExlbmd0aCgpOiBJbnZhbGlkIFR5cGU6ICIrdGhpcy50eXBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkNfQ09OVElOVUUgPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkNfVEVSTUlOQUwgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkNfQU5ZID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzU2V0KGludCBvcHRpb25zLCBpbnQgZmxhZykgewotICAgICAgICByZXR1cm4gKG9wdGlvbnMgJiBmbGFnKSA9PSBmbGFnOwotICAgIH0KLSAgICBmaW5hbCBpbnQgYW5hbHl6ZUZpcnN0Q2hhcmFjdGVyKFJhbmdlVG9rZW4gcmVzdWx0LCBpbnQgb3B0aW9ucykgewotICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkgewotICAgICAgICAgIGNhc2UgQ09OQ0FUOgotICAgICAgICAgICAgaW50IHJldCA9IEZDX0NPTlRJTlVFOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgdGhpcy5zaXplKCk7ICBpICsrKQotICAgICAgICAgICAgICAgIGlmICgocmV0ID0gdGhpcy5nZXRDaGlsZChpKS5hbmFseXplRmlyc3RDaGFyYWN0ZXIocmVzdWx0LCBvcHRpb25zKSkgIT0gRkNfQ09OVElOVUUpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLQotICAgICAgICAgIGNhc2UgVU5JT046Ci0gICAgICAgICAgICBpZiAodGhpcy5zaXplKCkgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkNfQ09OVElOVUU7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIGF8YnxjIC0+IEZDX1RFUk1JTkFMCi0gICAgICAgICAgICAgKiAgYXwufGMgLT4gRkNfQU5ZCi0gICAgICAgICAgICAgKiAgYXxifCAgLT4gRkNfQ09OVElOVUUKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaW50IHJldDIgPSBGQ19DT05USU5VRTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzRW1wdHkgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRoaXMuc2l6ZSgpOyAgaSArKykgewotICAgICAgICAgICAgICAgIHJldDIgPSB0aGlzLmdldENoaWxkKGkpLmFuYWx5emVGaXJzdENoYXJhY3RlcihyZXN1bHQsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgIGlmIChyZXQyID09IEZDX0FOWSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocmV0MiA9PSBGQ19DT05USU5VRSkKLSAgICAgICAgICAgICAgICAgICAgaGFzRW1wdHkgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGhhc0VtcHR5ID8gRkNfQ09OVElOVUUgOiByZXQyOwotCi0gICAgICAgICAgY2FzZSBDT05ESVRJT046Ci0gICAgICAgICAgICBpbnQgcmV0MyA9IHRoaXMuZ2V0Q2hpbGQoMCkuYW5hbHl6ZUZpcnN0Q2hhcmFjdGVyKHJlc3VsdCwgb3B0aW9ucyk7Ci0gICAgICAgICAgICBpZiAodGhpcy5zaXplKCkgPT0gMSkgIHJldHVybiBGQ19DT05USU5VRTsKLSAgICAgICAgICAgIGlmIChyZXQzID09IEZDX0FOWSkgIHJldHVybiByZXQzOwotICAgICAgICAgICAgaW50IHJldDQgPSB0aGlzLmdldENoaWxkKDEpLmFuYWx5emVGaXJzdENoYXJhY3RlcihyZXN1bHQsIG9wdGlvbnMpOwotICAgICAgICAgICAgaWYgKHJldDQgPT0gRkNfQU5ZKSAgcmV0dXJuIHJldDQ7Ci0gICAgICAgICAgICByZXR1cm4gcmV0MyA9PSBGQ19DT05USU5VRSB8fCByZXQ0ID09IEZDX0NPTlRJTlVFID8gRkNfQ09OVElOVUUgOiBGQ19URVJNSU5BTDsKLQotICAgICAgICAgIGNhc2UgQ0xPU1VSRToKLSAgICAgICAgICBjYXNlIE5PTkdSRUVEWUNMT1NVUkU6Ci0gICAgICAgICAgICB0aGlzLmdldENoaWxkKDApLmFuYWx5emVGaXJzdENoYXJhY3RlcihyZXN1bHQsIG9wdGlvbnMpOwotICAgICAgICAgICAgcmV0dXJuIEZDX0NPTlRJTlVFOwotCi0gICAgICAgICAgY2FzZSBFTVBUWToKLSAgICAgICAgICBjYXNlIEFOQ0hPUjoKLSAgICAgICAgICAgIHJldHVybiBGQ19DT05USU5VRTsKLQotICAgICAgICAgIGNhc2UgQ0hBUjoKLSAgICAgICAgICAgIGludCBjaCA9IHRoaXMuZ2V0Q2hhcigpOwotICAgICAgICAgICAgcmVzdWx0LmFkZFJhbmdlKGNoLCBjaCk7Ci0gICAgICAgICAgICBpZiAoY2ggPCAweDEwMDAwICYmIGlzU2V0KG9wdGlvbnMsIFJlZ3VsYXJFeHByZXNzaW9uLklHTk9SRV9DQVNFKSkgewotICAgICAgICAgICAgICAgIGNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkUmFuZ2UoY2gsIGNoKTsKLSAgICAgICAgICAgICAgICBjaCA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSgoY2hhciljaCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZFJhbmdlKGNoLCBjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRkNfVEVSTUlOQUw7Ci0KLSAgICAgICAgICBjYXNlIERPVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICoqKioKLSAgICAgICAgICAgIGlmIChpc1NldChvcHRpb25zLCBSZWd1bGFyRXhwcmVzc2lvbi5TSU5HTEVfTElORSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkNfQ09OVElOVUU7ICAgICAgICAgICAgIC8vICoqKiogV2UgY2FuIG5vdCBvcHRpbWl6ZS4KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZDX0NPTlRJTlVFOwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZFJhbmdlKDAsIFJlZ3VsYXJFeHByZXNzaW9uLkxJTkVfRkVFRC0xKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkUmFuZ2UoUmVndWxhckV4cHJlc3Npb24uTElORV9GRUVEKzEsIFJlZ3VsYXJFeHByZXNzaW9uLkNBUlJJQUdFX1JFVFVSTi0xKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkUmFuZ2UoUmVndWxhckV4cHJlc3Npb24uQ0FSUklBR0VfUkVUVVJOKzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ3VsYXJFeHByZXNzaW9uLkxJTkVfU0VQQVJBVE9SLTEpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRSYW5nZShSZWd1bGFyRXhwcmVzc2lvbi5QQVJBR1JBUEhfU0VQQVJBVE9SKzEsIFVURjE2X01BWCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgICAgICBpZiAoaXNTZXQob3B0aW9ucywgUmVndWxhckV4cHJlc3Npb24uSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0Lm1lcmdlUmFuZ2VzKCgoUmFuZ2VUb2tlbil0aGlzKS5nZXRDYXNlSW5zZW5zaXRpdmVUb2tlbigpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0Lm1lcmdlUmFuZ2VzKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEZDX1RFUk1JTkFMOwotCi0gICAgICAgICAgY2FzZSBOUkFOR0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAqKioqCi0gICAgICAgICAgICBpZiAoaXNTZXQob3B0aW9ucywgUmVndWxhckV4cHJlc3Npb24uSUdOT1JFX0NBU0UpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0Lm1lcmdlUmFuZ2VzKFRva2VuLmNvbXBsZW1lbnRSYW5nZXMoKChSYW5nZVRva2VuKXRoaXMpLmdldENhc2VJbnNlbnNpdGl2ZVRva2VuKCkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0Lm1lcmdlUmFuZ2VzKFRva2VuLmNvbXBsZW1lbnRSYW5nZXModGhpcykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEZDX1RFUk1JTkFMOwotCi0gICAgICAgICAgY2FzZSBJTkRFUEVOREVOVDoKLSAgICAgICAgICBjYXNlIFBBUkVOOgotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hpbGQoMCkuYW5hbHl6ZUZpcnN0Q2hhcmFjdGVyKHJlc3VsdCwgb3B0aW9ucyk7Ci0KLSAgICAgICAgICBjYXNlIE1PRElGSUVSR1JPVVA6Ci0gICAgICAgICAgICBvcHRpb25zIHw9ICgoTW9kaWZpZXJUb2tlbil0aGlzKS5nZXRPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRpb25zICY9IH4oKE1vZGlmaWVyVG9rZW4pdGhpcykuZ2V0T3B0aW9uc01hc2soKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENoaWxkKDApLmFuYWx5emVGaXJzdENoYXJhY3RlcihyZXN1bHQsIG9wdGlvbnMpOwotCi0gICAgICAgICAgY2FzZSBCQUNLUkVGRVJFTkNFOgotICAgICAgICAgICAgcmVzdWx0LmFkZFJhbmdlKDAsIFVURjE2X01BWCk7ICAvLyAqKioqIFdlIGNhbiBub3Qgb3B0aW1pemUuCi0gICAgICAgICAgICByZXR1cm4gRkNfQU5ZOwotCi0gICAgICAgICAgY2FzZSBTVFJJTkc6Ci0gICAgICAgICAgICBpbnQgY2hhID0gdGhpcy5nZXRTdHJpbmcoKS5jaGFyQXQoMCk7Ci0gICAgICAgICAgICBpbnQgY2gyOwotICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2hhKQotICAgICAgICAgICAgICAgICYmIHRoaXMuZ2V0U3RyaW5nKCkubGVuZ3RoKCkgPj0gMgotICAgICAgICAgICAgICAgICYmIFJFVXRpbC5pc0xvd1N1cnJvZ2F0ZSgoY2gyID0gdGhpcy5nZXRTdHJpbmcoKS5jaGFyQXQoMSkpKSkKLSAgICAgICAgICAgICAgICBjaGEgPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoYSwgY2gyKTsKLSAgICAgICAgICAgIHJlc3VsdC5hZGRSYW5nZShjaGEsIGNoYSk7Ci0gICAgICAgICAgICBpZiAoY2hhIDwgMHgxMDAwMCAmJiBpc1NldChvcHRpb25zLCBSZWd1bGFyRXhwcmVzc2lvbi5JR05PUkVfQ0FTRSkpIHsKLSAgICAgICAgICAgICAgICBjaGEgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpY2hhKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkUmFuZ2UoY2hhLCBjaGEpOwotICAgICAgICAgICAgICAgIGNoYSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSgoY2hhciljaGEpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRSYW5nZShjaGEsIGNoYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRkNfVEVSTUlOQUw7Ci0KLSAgICAgICAgICBjYXNlIExPT0tBSEVBRDoKLSAgICAgICAgICBjYXNlIE5FR0FUSVZFTE9PS0FIRUFEOgotICAgICAgICAgIGNhc2UgTE9PS0JFSElORDoKLSAgICAgICAgICBjYXNlIE5FR0FUSVZFTE9PS0JFSElORDoKLSAgICAgICAgICAgIHJldHVybiBGQ19DT05USU5VRTsKLQotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVG9rZW4jYW5hbHl6ZUhlYWRDaGFyYWN0ZXIoKTogSW52YWxpZCBUeXBlOiAiK3RoaXMudHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNTaG9ydGVyVGhhbihUb2tlbiB0b2spIHsKLSAgICAgICAgaWYgKHRvayA9PSBudWxsKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICAvKgotICAgICAgICBpbnQgbXlsZW5ndGg7Ci0gICAgICAgIGlmICh0aGlzLnR5cGUgPT0gU1RSSU5HKSAgbXlsZW5ndGggPSB0aGlzLmdldFN0cmluZygpLmxlbmd0aCgpOwotICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT0gQ0hBUikgIG15bGVuZ3RoID0gdGhpcy5nZXRDaGFyKCkgPj0gMHgxMDAwMCA/IDIgOiAxOwotICAgICAgICBlbHNlIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogSWxsZWdhbCB0eXBlOiAiK3RoaXMudHlwZSk7Ci0gICAgICAgIGludCBvdGhlcmxlbmd0aDsKLSAgICAgICAgaWYgKHRvay50eXBlID09IFNUUklORykgIG90aGVybGVuZ3RoID0gdG9rLmdldFN0cmluZygpLmxlbmd0aCgpOwotICAgICAgICBlbHNlIGlmICh0b2sudHlwZSA9PSBDSEFSKSAgb3RoZXJsZW5ndGggPSB0b2suZ2V0Q2hhcigpID49IDB4MTAwMDAgPyAyIDogMTsKLSAgICAgICAgZWxzZSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6IElsbGVnYWwgdHlwZTogIit0b2sudHlwZSk7Ci0gICAgICAgICovCi0gICAgICAgIGludCBteWxlbmd0aDsKLSAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBTVFJJTkcpICBteWxlbmd0aCA9IHRoaXMuZ2V0U3RyaW5nKCkubGVuZ3RoKCk7Ci0gICAgICAgIGVsc2UgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiBJbGxlZ2FsIHR5cGU6ICIrdGhpcy50eXBlKTsKLSAgICAgICAgaW50IG90aGVybGVuZ3RoOwotICAgICAgICBpZiAodG9rLnR5cGUgPT0gU1RSSU5HKSAgb3RoZXJsZW5ndGggPSB0b2suZ2V0U3RyaW5nKCkubGVuZ3RoKCk7Ci0gICAgICAgIGVsc2UgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiBJbGxlZ2FsIHR5cGU6ICIrdG9rLnR5cGUpOwotICAgICAgICByZXR1cm4gbXlsZW5ndGggPCBvdGhlcmxlbmd0aDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgRml4ZWRTdHJpbmdDb250YWluZXIgewotICAgICAgICBUb2tlbiB0b2tlbiA9IG51bGw7Ci0gICAgICAgIGludCBvcHRpb25zID0gMDsKLSAgICAgICAgRml4ZWRTdHJpbmdDb250YWluZXIoKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmaW5hbCB2b2lkIGZpbmRGaXhlZFN0cmluZyhGaXhlZFN0cmluZ0NvbnRhaW5lciBjb250YWluZXIsIGludCBvcHRpb25zKSB7Ci0gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7Ci0gICAgICAgICAgY2FzZSBDT05DQVQ6Ci0gICAgICAgICAgICBUb2tlbiBwcmV2VG9rZW4gPSBudWxsOwotICAgICAgICAgICAgaW50IHByZXZPcHRpb25zID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRoaXMuc2l6ZSgpOyAgaSArKykgewotICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2hpbGQoaSkuZmluZEZpeGVkU3RyaW5nKGNvbnRhaW5lciwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZXZUb2tlbiA9PSBudWxsIHx8IHByZXZUb2tlbi5pc1Nob3J0ZXJUaGFuKGNvbnRhaW5lci50b2tlbikpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJldlRva2VuID0gY29udGFpbmVyLnRva2VuOwotICAgICAgICAgICAgICAgICAgICBwcmV2T3B0aW9ucyA9IGNvbnRhaW5lci5vcHRpb25zOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRhaW5lci50b2tlbiA9IHByZXZUb2tlbjsKLSAgICAgICAgICAgIGNvbnRhaW5lci5vcHRpb25zID0gcHJldk9wdGlvbnM7Ci0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICBjYXNlIFVOSU9OOgotICAgICAgICAgIGNhc2UgQ0xPU1VSRToKLSAgICAgICAgICBjYXNlIE5PTkdSRUVEWUNMT1NVUkU6Ci0gICAgICAgICAgY2FzZSBFTVBUWToKLSAgICAgICAgICBjYXNlIEFOQ0hPUjoKLSAgICAgICAgICBjYXNlIFJBTkdFOgotICAgICAgICAgIGNhc2UgRE9UOgotICAgICAgICAgIGNhc2UgTlJBTkdFOgotICAgICAgICAgIGNhc2UgQkFDS1JFRkVSRU5DRToKLSAgICAgICAgICBjYXNlIExPT0tBSEVBRDoKLSAgICAgICAgICBjYXNlIE5FR0FUSVZFTE9PS0FIRUFEOgotICAgICAgICAgIGNhc2UgTE9PS0JFSElORDoKLSAgICAgICAgICBjYXNlIE5FR0FUSVZFTE9PS0JFSElORDoKLSAgICAgICAgICBjYXNlIENPTkRJVElPTjoKLSAgICAgICAgICAgIGNvbnRhaW5lci50b2tlbiA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICBjYXNlIENIQVI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBDSEFSIHRva2Vucy4KLSAgICAgICAgICAgIGNvbnRhaW5lci50b2tlbiA9IG51bGw7ICAgICAgICAgICAgIC8vICoqCi0gICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAqKgotCi0gICAgICAgICAgY2FzZSBTVFJJTkc6Ci0gICAgICAgICAgICBjb250YWluZXIudG9rZW4gPSB0aGlzOwotICAgICAgICAgICAgY29udGFpbmVyLm9wdGlvbnMgPSBvcHRpb25zOwotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgY2FzZSBJTkRFUEVOREVOVDoKLSAgICAgICAgICBjYXNlIFBBUkVOOgotICAgICAgICAgICAgdGhpcy5nZXRDaGlsZCgwKS5maW5kRml4ZWRTdHJpbmcoY29udGFpbmVyLCBvcHRpb25zKTsKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgIGNhc2UgTU9ESUZJRVJHUk9VUDoKLSAgICAgICAgICAgIG9wdGlvbnMgfD0gKChNb2RpZmllclRva2VuKXRoaXMpLmdldE9wdGlvbnMoKTsKLSAgICAgICAgICAgIG9wdGlvbnMgJj0gfigoTW9kaWZpZXJUb2tlbil0aGlzKS5nZXRPcHRpb25zTWFzaygpOwotICAgICAgICAgICAgdGhpcy5nZXRDaGlsZCgwKS5maW5kRml4ZWRTdHJpbmcoY29udGFpbmVyLCBvcHRpb25zKTsKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVG9rZW4jZmluZEZpeGVkU3RyaW5nKCk6IEludmFsaWQgVHlwZTogIit0aGlzLnR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbGVhbiBtYXRjaChpbnQgY2gpIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5GQUFycm93I21hdGNoKCk6IEludGVybmFsIGVycm9yOiAiK3RoaXMudHlwZSk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSGFzaHRhYmxlIGNhdGVnb3JpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSGFzaHRhYmxlIGNhdGVnb3JpZXMyID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGNhdGVnb3J5TmFtZXMgPSB7Ci0gICAgICAgICJDbiIsICJMdSIsICJMbCIsICJMdCIsICJMbSIsICJMbyIsICJNbiIsICJNZSIsICJNYyIsICJOZCIsCi0gICAgICAgICJObCIsICJObyIsICJacyIsICJabCIsICJacCIsICJDYyIsICJDZiIsIG51bGwsICJDbyIsICJDcyIsCi0gICAgICAgICJQZCIsICJQcyIsICJQZSIsICJQYyIsICJQbyIsICJTbSIsICJTYyIsICJTayIsICJTbyIsIC8vIDI4Ci0gICAgICAgICJQaSIsICJQZiIsICAvLyAyOSwgMzAKLSAgICAgICAgIkwiLCAiTSIsICJOIiwgIloiLCAiQyIsICJQIiwgIlMiLCAgICAgIC8vIDMxLTM3Ci0gICAgfTsKLQotICAgIC8vIFNjaGVtYSBSZWMuIHtEYXRhdHlwZXN9IC0gUHVuY3R1YXRpb24gCi0gICAgc3RhdGljIGZpbmFsIGludCBDSEFSX0lOSVRfUVVPVEUgID0gMjk7ICAgICAvLyBQaSAtIGluaXRpYWwgcXVvdGUKLSAgICBzdGF0aWMgZmluYWwgaW50IENIQVJfRklOQUxfUVVPVEUgPSAzMDsgICAgIC8vIFBmIC0gZmluYWwgcXVvdGUKLSAgICBzdGF0aWMgZmluYWwgaW50IENIQVJfTEVUVEVSID0gMzE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDSEFSX01BUksgPSAzMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IENIQVJfTlVNQkVSID0gMzM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDSEFSX1NFUEFSQVRPUiA9IDM0OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUl9PVEhFUiA9IDM1OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUl9QVU5DVFVBVElPTiA9IDM2OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUl9TWU1CT0wgPSAzNzsKLSAgICAKLSAgICAvL2Jsb2NrTmFtZXMgaW4gVU5JQ09ERSAzLjEgdGhhdCBzdXBwb3J0ZWQgYnkgWE1MIFNjaGVtYSBSRUMgICAgICAgICAgICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gYmxvY2tOYW1lcyA9IHsKLSAgICAgICAgLyowMDAwLi4wMDdGOyovICJCYXNpYyBMYXRpbiIsCi0gICAgICAgIC8qMDA4MC4uMDBGRjsqLyAiTGF0aW4tMSBTdXBwbGVtZW50IiwKLSAgICAgICAgLyowMTAwLi4wMTdGOyovICJMYXRpbiBFeHRlbmRlZC1BIiwKLSAgICAgICAgLyowMTgwLi4wMjRGOyovICJMYXRpbiBFeHRlbmRlZC1CIiwKLSAgICAgICAgLyowMjUwLi4wMkFGOyovICJJUEEgRXh0ZW5zaW9ucyIsCi0gICAgICAgIC8qMDJCMC4uMDJGRjsqLyAiU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzIiwKLSAgICAgICAgLyowMzAwLi4wMzZGOyovICJDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MiLAotICAgICAgICAvKjAzNzAuLjAzRkY7Ki8gIkdyZWVrIiwKLSAgICAgICAgLyowNDAwLi4wNEZGOyovICJDeXJpbGxpYyIsCi0gICAgICAgIC8qMDUzMC4uMDU4RjsqLyAiQXJtZW5pYW4iLAotICAgICAgICAvKjA1OTAuLjA1RkY7Ki8gIkhlYnJldyIsCi0gICAgICAgIC8qMDYwMC4uMDZGRjsqLyAiQXJhYmljIiwKLSAgICAgICAgLyowNzAwLi4wNzRGOyovICJTeXJpYWMiLCAgCi0gICAgICAgIC8qMDc4MC4uMDdCRjsqLyAiVGhhYW5hIiwKLSAgICAgICAgLyowOTAwLi4wOTdGOyovICJEZXZhbmFnYXJpIiwKLSAgICAgICAgLyowOTgwLi4wOUZGOyovICJCZW5nYWxpIiwKLSAgICAgICAgLyowQTAwLi4wQTdGOyovICJHdXJtdWtoaSIsCi0gICAgICAgIC8qMEE4MC4uMEFGRjsqLyAiR3VqYXJhdGkiLAotICAgICAgICAvKjBCMDAuLjBCN0Y7Ki8gIk9yaXlhIiwKLSAgICAgICAgLyowQjgwLi4wQkZGOyovICJUYW1pbCIsCi0gICAgICAgIC8qMEMwMC4uMEM3RjsqLyAiVGVsdWd1IiwKLSAgICAgICAgLyowQzgwLi4wQ0ZGOyovICJLYW5uYWRhIiwKLSAgICAgICAgLyowRDAwLi4wRDdGOyovICJNYWxheWFsYW0iLAotICAgICAgICAvKjBEODAuLjBERkY7Ki8gIlNpbmhhbGEiLAotICAgICAgICAvKjBFMDAuLjBFN0Y7Ki8gIlRoYWkiLAotICAgICAgICAvKjBFODAuLjBFRkY7Ki8gIkxhbyIsCi0gICAgICAgIC8qMEYwMC4uMEZGRjsqLyAiVGliZXRhbiIsCi0gICAgICAgIC8qMTAwMC4uMTA5RjsqLyAiTXlhbm1hciIsIAotICAgICAgICAvKjEwQTAuLjEwRkY7Ki8gIkdlb3JnaWFuIiwKLSAgICAgICAgLyoxMTAwLi4xMUZGOyovICJIYW5ndWwgSmFtbyIsCi0gICAgICAgIC8qMTIwMC4uMTM3RjsqLyAiRXRoaW9waWMiLAotICAgICAgICAvKjEzQTAuLjEzRkY7Ki8gIkNoZXJva2VlIiwKLSAgICAgICAgLyoxNDAwLi4xNjdGOyovICJVbmlmaWVkIENhbmFkaWFuIEFib3JpZ2luYWwgU3lsbGFiaWNzIiwKLSAgICAgICAgLyoxNjgwLi4xNjlGOyovICJPZ2hhbSIsCi0gICAgICAgIC8qMTZBMC4uMTZGRjsqLyAiUnVuaWMiLAotICAgICAgICAvKjE3ODAuLjE3RkY7Ki8gIktobWVyIiwKLSAgICAgICAgLyoxODAwLi4xOEFGOyovICJNb25nb2xpYW4iLAotICAgICAgICAvKjFFMDAuLjFFRkY7Ki8gIkxhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWwiLAotICAgICAgICAvKjFGMDAuLjFGRkY7Ki8gIkdyZWVrIEV4dGVuZGVkIiwKLSAgICAgICAgLyoyMDAwLi4yMDZGOyovICJHZW5lcmFsIFB1bmN0dWF0aW9uIiwKLSAgICAgICAgLyoyMDcwLi4yMDlGOyovICJTdXBlcnNjcmlwdHMgYW5kIFN1YnNjcmlwdHMiLAotICAgICAgICAvKjIwQTAuLjIwQ0Y7Ki8gIkN1cnJlbmN5IFN5bWJvbHMiLAotICAgICAgICAvKjIwRDAuLjIwRkY7Ki8gIkNvbWJpbmluZyBNYXJrcyBmb3IgU3ltYm9scyIsCi0gICAgICAgIC8qMjEwMC4uMjE0RjsqLyAiTGV0dGVybGlrZSBTeW1ib2xzIiwKLSAgICAgICAgLyoyMTUwLi4yMThGOyovICJOdW1iZXIgRm9ybXMiLAotICAgICAgICAvKjIxOTAuLjIxRkY7Ki8gIkFycm93cyIsCi0gICAgICAgIC8qMjIwMC4uMjJGRjsqLyAiTWF0aGVtYXRpY2FsIE9wZXJhdG9ycyIsCi0gICAgICAgIC8qMjMwMC4uMjNGRjsqLyAiTWlzY2VsbGFuZW91cyBUZWNobmljYWwiLAotICAgICAgICAvKjI0MDAuLjI0M0Y7Ki8gIkNvbnRyb2wgUGljdHVyZXMiLAotICAgICAgICAvKjI0NDAuLjI0NUY7Ki8gIk9wdGljYWwgQ2hhcmFjdGVyIFJlY29nbml0aW9uIiwKLSAgICAgICAgLyoyNDYwLi4yNEZGOyovICJFbmNsb3NlZCBBbHBoYW51bWVyaWNzIiwKLSAgICAgICAgLyoyNTAwLi4yNTdGOyovICJCb3ggRHJhd2luZyIsCi0gICAgICAgIC8qMjU4MC4uMjU5RjsqLyAiQmxvY2sgRWxlbWVudHMiLAotICAgICAgICAvKjI1QTAuLjI1RkY7Ki8gIkdlb21ldHJpYyBTaGFwZXMiLAotICAgICAgICAvKjI2MDAuLjI2RkY7Ki8gIk1pc2NlbGxhbmVvdXMgU3ltYm9scyIsCi0gICAgICAgIC8qMjcwMC4uMjdCRjsqLyAiRGluZ2JhdHMiLAotICAgICAgICAvKjI4MDAuLjI4RkY7Ki8gIkJyYWlsbGUgUGF0dGVybnMiLAotICAgICAgICAvKjJFODAuLjJFRkY7Ki8gIkNKSyBSYWRpY2FscyBTdXBwbGVtZW50IiwKLSAgICAgICAgLyoyRjAwLi4yRkRGOyovICJLYW5neGkgUmFkaWNhbHMiLAotICAgICAgICAvKjJGRjAuLjJGRkY7Ki8gIklkZW9ncmFwaGljIERlc2NyaXB0aW9uIENoYXJhY3RlcnMiLAotICAgICAgICAvKjMwMDAuLjMwM0Y7Ki8gIkNKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvbiIsCi0gICAgICAgIC8qMzA0MC4uMzA5RjsqLyAiSGlyYWdhbmEiLAotICAgICAgICAvKjMwQTAuLjMwRkY7Ki8gIkthdGFrYW5hIiwKLSAgICAgICAgLyozMTAwLi4zMTJGOyovICJCb3BvbW9mbyIsCi0gICAgICAgIC8qMzEzMC4uMzE4RjsqLyAiSGFuZ3VsIENvbXBhdGliaWxpdHkgSmFtbyIsCi0gICAgICAgIC8qMzE5MC4uMzE5RjsqLyAiS2FuYnVuIiwKLSAgICAgICAgLyozMUEwLi4zMUJGOyovICJCb3BvbW9mbyBFeHRlbmRlZCIsCi0gICAgICAgIC8qMzIwMC4uMzJGRjsqLyAiRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRocyIsCi0gICAgICAgIC8qMzMwMC4uMzNGRjsqLyAiQ0pLIENvbXBhdGliaWxpdHkiLAotICAgICAgICAvKjM0MDAuLjREQjU7Ki8gIkNKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEEiLAotICAgICAgICAvKjRFMDAuLjlGRkY7Ki8gIkNKSyBVbmlmaWVkIElkZW9ncmFwaHMiLAotICAgICAgICAvKkEwMDAuLkE0OEY7Ki8gIllpIFN5bGxhYmxlcyIsCi0gICAgICAgIC8qQTQ5MC4uQTRDRjsqLyAiWWkgUmFkaWNhbHMiLAotICAgICAgICAvKkFDMDAuLkQ3QTM7Ki8gIkhhbmd1bCBTeWxsYWJsZXMiLAotICAgICAgICAvKkQ4MDAuLkRCN0Y7Ki8gIkhpZ2ggU3Vycm9nYXRlcyIsCi0gICAgICAgIC8qREI4MC4uREJGRjsqLyAiSGlnaCBQcml2YXRlIFVzZSBTdXJyb2dhdGVzIiwKLSAgICAgICAgLypEQzAwLi5ERkZGOyovICJMb3cgU3Vycm9nYXRlcyIsCi0gICAgICAgIC8qRTAwMC4uRjhGRjsqLyAiUHJpdmF0ZSBVc2UiLAotICAgICAgICAvKkY5MDAuLkZBRkY7Ki8gIkNKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMiLAotICAgICAgICAvKkZCMDAuLkZCNEY7Ki8gIkFscGhhYmV0aWMgUHJlc2VudGF0aW9uIEZvcm1zIiwKLSAgICAgICAgLypGQjUwLi5GREZGOyovICJBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUEiLAotICAgICAgICAvKkZFMjAuLkZFMkY7Ki8gIkNvbWJpbmluZyBIYWxmIE1hcmtzIiwKLSAgICAgICAgLypGRTMwLi5GRTRGOyovICJDSksgQ29tcGF0aWJpbGl0eSBGb3JtcyIsCi0gICAgICAgIC8qRkU1MC4uRkU2RjsqLyAiU21hbGwgRm9ybSBWYXJpYW50cyIsCi0gICAgICAgIC8qRkU3MC4uRkVGRTsqLyAiQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CIiwKLSAgICAgICAgLypGRUZGLi5GRUZGOyovICJTcGVjaWFscyIsCi0gICAgICAgIC8qRkYwMC4uRkZFRjsqLyAiSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMiLAotICAgICAgICAgLy9taXNzaW5nIFNwZWNpYWxzIGFkZCBtYW51YWxseQotICAgICAgICAvKjEwMzAwLi4xMDMyRjsqLyAiT2xkIEl0YWxpYyIsCQkvLyA4NwotICAgICAgICAvKjEwMzMwLi4xMDM0RjsqLyAiR290aGljIiwKLSAgICAgICAgLyoxMDQwMC4uMTA0NEY7Ki8gIkRlc2VyZXQiLAotICAgICAgICAvKjFEMDAwLi4xRDBGRjsqLyAiQnl6YW50aW5lIE11c2ljYWwgU3ltYm9scyIsCi0gICAgICAgIC8qMUQxMDAuLjFEMUZGOyovICJNdXNpY2FsIFN5bWJvbHMiLAotICAgICAgICAvKjFENDAwLi4xRDdGRjsqLyAiTWF0aGVtYXRpY2FsIEFscGhhbnVtZXJpYyBTeW1ib2xzIiwKLSAgICAgICAgLyoyMDAwMC4uMkE2RDY7Ki8gIkNKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEIiLAotICAgICAgICAvKjJGODAwLi4yRkExRjsqLyAiQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyBTdXBwbGVtZW50IiwKLSAgICAgICAgLypFMDAwMC4uRTAwN0Y7Ki8gIlRhZ3MiLAotICAgICAgICAvL21pc3NpbmcgMiBwcml2YXRlIHVzZSBhZGQgbWFudWFsbHkKLQotICAgIH07Ci0gICAgLy9BREQgVEhPU0UgTUFOVUFMTFkKLSAgICAvL0YwMDAwLi5GRkZGRDsgIlByaXZhdGUgVXNlIiwKLSAgICAvLzEwMDAwMC4uMTBGRkZEOyAiUHJpdmF0ZSBVc2UiCi0gICAgLy9GRkYwLi5GRkZEOyAiU3BlY2lhbHMiLCAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGJsb2NrUmFuZ2VzID0gCi0gICAgICAgIlx1MDAwMFx1MDA3Rlx1MDA4MFx1MDBGRlx1MDEwMFx1MDE3Rlx1MDE4MFx1MDI0Rlx1MDI1MFx1MDJBRlx1MDJCMFx1MDJGRlx1MDMwMFx1MDM2RiIKLSAgICAgICAgKyJcdTAzNzBcdTAzRkZcdTA0MDBcdTA0RkZcdTA1MzBcdTA1OEZcdTA1OTBcdTA1RkZcdTA2MDBcdTA2RkZcdTA3MDBcdTA3NEZcdTA3ODBcdTA3QkYiCi0gICAgICAgICsiXHUwOTAwXHUwOTdGXHUwOTgwXHUwOUZGXHUwQTAwXHUwQTdGXHUwQTgwXHUwQUZGXHUwQjAwXHUwQjdGXHUwQjgwXHUwQkZGXHUwQzAwXHUwQzdGXHUwQzgwXHUwQ0ZGIgotICAgICAgICArIlx1MEQwMFx1MEQ3Rlx1MEQ4MFx1MERGRlx1MEUwMFx1MEU3Rlx1MEU4MFx1MEVGRlx1MEYwMFx1MEZGRlx1MTAwMFx1MTA5Rlx1MTBBMFx1MTBGRlx1MTEwMFx1MTFGRiIKLSAgICAgICAgKyJcdTEyMDBcdTEzN0ZcdTEzQTBcdTEzRkZcdTE0MDBcdTE2N0ZcdTE2ODBcdTE2OUZcdTE2QTBcdTE2RkZcdTE3ODBcdTE3RkZcdTE4MDBcdTE4QUZcdTFFMDBcdTFFRkYiCi0gICAgICAgICsiXHUxRjAwXHUxRkZGXHUyMDAwXHUyMDZGXHUyMDcwXHUyMDlGXHUyMEEwXHUyMENGXHUyMEQwXHUyMEZGXHUyMTAwXHUyMTRGXHUyMTUwXHUyMThGXHUyMTkwXHUyMUZGXHUyMjAwXHUyMkZGIgotICAgICAgICArIlx1MjMwMFx1MjNGRlx1MjQwMFx1MjQzRlx1MjQ0MFx1MjQ1Rlx1MjQ2MFx1MjRGRlx1MjUwMFx1MjU3Rlx1MjU4MFx1MjU5Rlx1MjVBMFx1MjVGRlx1MjYwMFx1MjZGRlx1MjcwMFx1MjdCRiIKLSAgICAgICAgKyJcdTI4MDBcdTI4RkZcdTJFODBcdTJFRkZcdTJGMDBcdTJGREZcdTJGRjBcdTJGRkZcdTMwMDBcdTMwM0ZcdTMwNDBcdTMwOUZcdTMwQTBcdTMwRkZcdTMxMDBcdTMxMkZcdTMxMzBcdTMxOEYiCi0gICAgICAgICsiXHUzMTkwXHUzMTlGXHUzMUEwXHUzMUJGXHUzMjAwXHUzMkZGXHUzMzAwXHUzM0ZGXHUzNDAwXHU0REI1XHU0RTAwXHU5RkZGXHVBMDAwXHVBNDhGXHVBNDkwXHVBNENGIgotICAgICAgICArIlx1QUMwMFx1RDdBM1x1RDgwMFx1REI3Rlx1REI4MFx1REJGRlx1REMwMFx1REZGRlx1RTAwMFx1RjhGRlx1RjkwMFx1RkFGRlx1RkIwMFx1RkI0Rlx1RkI1MFx1RkRGRiIKLSAgICAgICAgKyJcdUZFMjBcdUZFMkZcdUZFMzBcdUZFNEZcdUZFNTBcdUZFNkZcdUZFNzBcdUZFRkVcdUZFRkZcdUZFRkZcdUZGMDBcdUZGRUYiOwotICAgIHN0YXRpYyBmaW5hbCBpbnRbXSBub25CTVBCbG9ja1JhbmdlcyA9IHsKLSAgICAgICAgMHgxMDMwMCwgMHgxMDMyRiwgICAgICAgLy8gODcKLSAgICAgICAgMHgxMDMzMCwgMHgxMDM0RiwKLSAgICAgICAgMHgxMDQwMCwgMHgxMDQ0RiwKLSAgICAgICAgMHgxRDAwMCwgMHgxRDBGRiwKLSAgICAgICAgMHgxRDEwMCwgMHgxRDFGRiwKLSAgICAgICAgMHgxRDQwMCwgMHgxRDdGRiwKLSAgICAgICAgMHgyMDAwMCwgMHgyQTZENiwKLSAgICAgICAgMHgyRjgwMCwgMHgyRkExRiwKLSAgICAgICAgMHhFMDAwMCwgMHhFMDA3RgotICAgIH07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PTkJNUF9CTE9DS19TVEFSVCA9IDg3OwotCi0gICAgc3RhdGljIHByb3RlY3RlZCBSYW5nZVRva2VuIGdldFJhbmdlKFN0cmluZyBuYW1lLCBib29sZWFuIHBvc2l0aXZlKSB7Ci0gICAgICAgIGlmIChUb2tlbi5jYXRlZ29yaWVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRva2VuLmNhdGVnb3JpZXMpIHsKLSAgICAgICAgICAgICAgICBUb2tlbltdIHJhbmdlcyA9IG5ldyBUb2tlbltUb2tlbi5jYXRlZ29yeU5hbWVzLmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgcmFuZ2VzLmxlbmd0aDsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcmFuZ2VzW2ldID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IHR5cGU7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgMHgxMDAwMDsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZSA9IENoYXJhY3Rlci5nZXRUeXBlKChjaGFyKWkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBDaGFyYWN0ZXIuU1RBUlRfUFVOQ1RVQVRJT04gfHwgCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IENoYXJhY3Rlci5FTkRfUFVOQ1RVQVRJT04pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vYnVpbGQgdGFibGUgb2YgUGkgdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAweDAwQUIgfHwgaSA9PSAweDIwMTggfHwgaSA9PSAweDIwMUIgfHwgaSA9PSAweDIwMUMgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID09IDB4MjAxRiB8fCBpID09IDB4MjAzOSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDSEFSX0lOSVRfUVVPVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2J1aWxkIHRhYmxlIG9mIFBmIHZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMHgwMEJCIHx8IGkgPT0gMHgyMDE5IHx8IGkgPT0gMHgyMDFEIHx8IGkgPT0gMHgyMDNBICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDSEFSX0ZJTkFMX1FVT1RFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJhbmdlc1t0eXBlXS5hZGRSYW5nZShpLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuVVBQRVJDQVNFX0xFVFRFUjoKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5MT1dFUkNBU0VfTEVUVEVSOgotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLlRJVExFQ0FTRV9MRVRURVI6Ci0gICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuTU9ESUZJRVJfTEVUVEVSOgotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLk9USEVSX0xFVFRFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDSEFSX0xFVFRFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLk5PTl9TUEFDSU5HX01BUks6Ci0gICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuQ09NQklOSU5HX1NQQUNJTkdfTUFSSzoKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5FTkNMT1NJTkdfTUFSSzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDSEFSX01BUks7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5ERUNJTUFMX0RJR0lUX05VTUJFUjoKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5MRVRURVJfTlVNQkVSOgotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLk9USEVSX05VTUJFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDSEFSX05VTUJFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLlNQQUNFX1NFUEFSQVRPUjoKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5MSU5FX1NFUEFSQVRPUjoKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5QQVJBR1JBUEhfU0VQQVJBVE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IENIQVJfU0VQQVJBVE9SOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuQ09OVFJPTDoKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5GT1JNQVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuU1VSUk9HQVRFOgotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLlBSSVZBVEVfVVNFOgotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLlVOQVNTSUdORUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gQ0hBUl9PVEhFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkNPTk5FQ1RPUl9QVU5DVFVBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5EQVNIX1BVTkNUVUFUSU9OOgotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLlNUQVJUX1BVTkNUVUFUSU9OOgotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkVORF9QVU5DVFVBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENIQVJfSU5JVF9RVU9URToKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENIQVJfRklOQUxfUVVPVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuT1RIRVJfUFVOQ1RVQVRJT046Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gQ0hBUl9QVU5DVFVBVElPTjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLk1BVEhfU1lNQk9MOgotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkNVUlJFTkNZX1NZTUJPTDoKLSAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5NT0RJRklFUl9TWU1CT0w6Ci0gICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuT1RIRVJfU1lNQk9MOgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IENIQVJfU1lNQk9MOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJvcmcuYXBhY2hlLnhlcmNlcy51dGlscy5yZWdleC5Ub2tlbiNnZXRSYW5nZSgpOiBVbmtub3duIFVuaWNvZGUgY2F0ZWdvcnk6ICIrdHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmFuZ2VzW3R5cGVdLmFkZFJhbmdlKGksIGkpOwotICAgICAgICAgICAgICAgIH0gLy8gZm9yIGFsbCBjaGFyYWN0ZXJzCi0gICAgICAgICAgICAgICAgcmFuZ2VzW0NoYXJhY3Rlci5VTkFTU0lHTkVEXS5hZGRSYW5nZSgweDEwMDAwLCBUb2tlbi5VVEYxNl9NQVgpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgcmFuZ2VzLmxlbmd0aDsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFRva2VuLmNhdGVnb3J5TmFtZXNbaV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gQ2hhcmFjdGVyLlVOQVNTSUdORUQpIHsgLy8gVW5hc3NpZ25lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlc1tpXS5hZGRSYW5nZSgweDEwMDAwLCBUb2tlbi5VVEYxNl9NQVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllcy5wdXQoVG9rZW4uY2F0ZWdvcnlOYW1lc1tpXSwgcmFuZ2VzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMyLnB1dChUb2tlbi5jYXRlZ29yeU5hbWVzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLmNvbXBsZW1lbnRSYW5nZXMocmFuZ2VzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy9SRVZJU0lUOiBkbyB3ZSByZWFsbHkgbmVlZCB0byBzdXBwb3J0IGJsb2NrIG5hbWVzIGFzIGluIFVuaWNvZGUgMy4xCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICBvciB3ZSBjYW4ganVzdCBjcmVhdGUgYWxsIHRoZSBuYW1lcyBpbiBJc0JMT0NLTkFNRSBmb3JtYXQgKFhNTCBTY2hlbWEgUkVDKT8KLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDUwKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBUb2tlbi5ibG9ja05hbWVzLmxlbmd0aDsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgVG9rZW4gcjEgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgbG9jYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpIDwgTk9OQk1QX0JMT0NLX1NUQVJUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IGkqMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByc3RhcnQgPSBUb2tlbi5ibG9ja1Jhbmdlcy5jaGFyQXQobG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlbmQgPSBUb2tlbi5ibG9ja1Jhbmdlcy5jaGFyQXQobG9jYXRpb24rMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL0RFQlVHSU5HCi0gICAgICAgICAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihuKyIgIiArSW50ZWdlci50b0hleFN0cmluZyhyc3RhcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICsiLSIrIEludGVnZXIudG9IZXhTdHJpbmcocmVuZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcjEuYWRkUmFuZ2UocnN0YXJ0LCByZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gKGkgLSBOT05CTVBfQkxPQ0tfU1RBUlQpICogMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIxLmFkZFJhbmdlKFRva2VuLm5vbkJNUEJsb2NrUmFuZ2VzW2xvY2F0aW9uXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLm5vbkJNUEJsb2NrUmFuZ2VzW2xvY2F0aW9uICsgMV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuID0gVG9rZW4uYmxvY2tOYW1lc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG4uZXF1YWxzKCJTcGVjaWFscyIpKQotICAgICAgICAgICAgICAgICAgICAgICAgcjEuYWRkUmFuZ2UoMHhmZmYwLCAweGZmZmQpOwotICAgICAgICAgICAgICAgICAgICBpZiAobi5lcXVhbHMoIlByaXZhdGUgVXNlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIxLmFkZFJhbmdlKDB4RjAwMDAsMHhGRkZGRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByMS5hZGRSYW5nZSgweDEwMDAwMCwweDEwRkZGRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllcy5wdXQobiwgcjEpOwotICAgICAgICAgICAgICAgICAgICBUb2tlbi5jYXRlZ29yaWVzMi5wdXQobiwgVG9rZW4uY29tcGxlbWVudFJhbmdlcyhyMSkpOwotICAgICAgICAgICAgICAgICAgICBidWZmZXIuc2V0TGVuZ3RoKDApOwotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJJcyIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobi5pbmRleE9mKCcgJykgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY2kgPSAwOyAgY2kgPCBuLmxlbmd0aCgpOyAgY2kgKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4uY2hhckF0KGNpKSAhPSAnICcpICBidWZmZXIuYXBwZW5kKChjaGFyKW4uY2hhckF0KGNpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKG4pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKGJ1ZmZlci50b1N0cmluZygpLCBuLCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBUUiMxOCAxLjIKLSAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygiQVNTSUdORUQiLCAiQ24iLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoIlVOQVNTSUdORUQiLCAiQ24iLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBUb2tlbiBhbGwgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgICAgIGFsbC5hZGRSYW5nZSgwLCBUb2tlbi5VVEYxNl9NQVgpOwotICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMucHV0KCJBTEwiLCBhbGwpOwotICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMyLnB1dCgiQUxMIiwgVG9rZW4uY29tcGxlbWVudFJhbmdlcyhhbGwpKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJBU1NJR05FRCIpOwotICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoIlVOQVNTSUdORUQiKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJBTEwiKTsKLQotICAgICAgICAgICAgICAgIFRva2VuIGlzYWxwaGEgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgICAgIGlzYWxwaGEubWVyZ2VSYW5nZXMocmFuZ2VzW0NoYXJhY3Rlci5VUFBFUkNBU0VfTEVUVEVSXSk7IC8vIEx1Ci0gICAgICAgICAgICAgICAgaXNhbHBoYS5tZXJnZVJhbmdlcyhyYW5nZXNbQ2hhcmFjdGVyLkxPV0VSQ0FTRV9MRVRURVJdKTsgLy8gTGwKLSAgICAgICAgICAgICAgICBpc2FscGhhLm1lcmdlUmFuZ2VzKHJhbmdlc1tDaGFyYWN0ZXIuT1RIRVJfTEVUVEVSXSk7IC8vIExvCi0gICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllcy5wdXQoIklzQWxwaGEiLCBpc2FscGhhKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5jYXRlZ29yaWVzMi5wdXQoIklzQWxwaGEiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKGlzYWxwaGEpKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJJc0FscGhhIik7Ci0KLSAgICAgICAgICAgICAgICBUb2tlbiBpc2FsbnVtID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICBpc2FsbnVtLm1lcmdlUmFuZ2VzKGlzYWxwaGEpOyAgIC8vIEx1IExsIExvCi0gICAgICAgICAgICAgICAgaXNhbG51bS5tZXJnZVJhbmdlcyhyYW5nZXNbQ2hhcmFjdGVyLkRFQ0lNQUxfRElHSVRfTlVNQkVSXSk7IC8vIE5kCi0gICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllcy5wdXQoIklzQWxudW0iLCBpc2FsbnVtKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5jYXRlZ29yaWVzMi5wdXQoIklzQWxudW0iLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKGlzYWxudW0pKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJJc0FsbnVtIik7Ci0KLSAgICAgICAgICAgICAgICBUb2tlbiBpc3NwYWNlID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICBpc3NwYWNlLm1lcmdlUmFuZ2VzKFRva2VuLnRva2VuX3NwYWNlcyk7Ci0gICAgICAgICAgICAgICAgaXNzcGFjZS5tZXJnZVJhbmdlcyhyYW5nZXNbQ0hBUl9TRVBBUkFUT1JdKTsgLy8gWgotICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMucHV0KCJJc1NwYWNlIiwgaXNzcGFjZSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllczIucHV0KCJJc1NwYWNlIiwgVG9rZW4uY29tcGxlbWVudFJhbmdlcyhpc3NwYWNlKSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiSXNTcGFjZSIpOwotCi0gICAgICAgICAgICAgICAgVG9rZW4gaXN3b3JkID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICBpc3dvcmQubWVyZ2VSYW5nZXMoaXNhbG51bSk7ICAgICAvLyBMdSBMbCBMbyBOZAotICAgICAgICAgICAgICAgIGlzd29yZC5hZGRSYW5nZSgnXycsICdfJyk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllcy5wdXQoIklzV29yZCIsIGlzd29yZCk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllczIucHV0KCJJc1dvcmQiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKGlzd29yZCkpOwotICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoIklzV29yZCIpOwotCi0gICAgICAgICAgICAgICAgVG9rZW4gaXNhc2NpaSA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgICAgICAgICAgaXNhc2NpaS5hZGRSYW5nZSgwLCAxMjcpOwotICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMucHV0KCJJc0FTQ0lJIiwgaXNhc2NpaSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllczIucHV0KCJJc0FTQ0lJIiwgVG9rZW4uY29tcGxlbWVudFJhbmdlcyhpc2FzY2lpKSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiSXNBU0NJSSIpOwotCi0gICAgICAgICAgICAgICAgVG9rZW4gaXNub3RncmFwaCA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgICAgICAgICAgaXNub3RncmFwaC5tZXJnZVJhbmdlcyhyYW5nZXNbQ0hBUl9PVEhFUl0pOwotICAgICAgICAgICAgICAgIGlzbm90Z3JhcGguYWRkUmFuZ2UoJyAnLCAnICcpOwotICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMucHV0KCJJc0dyYXBoIiwgVG9rZW4uY29tcGxlbWVudFJhbmdlcyhpc25vdGdyYXBoKSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllczIucHV0KCJJc0dyYXBoIiwgaXNub3RncmFwaCk7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiSXNHcmFwaCIpOwotCi0gICAgICAgICAgICAgICAgVG9rZW4gaXN4ZGlnaXQgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOwotICAgICAgICAgICAgICAgIGlzeGRpZ2l0LmFkZFJhbmdlKCcwJywgJzknKTsKLSAgICAgICAgICAgICAgICBpc3hkaWdpdC5hZGRSYW5nZSgnQScsICdGJyk7Ci0gICAgICAgICAgICAgICAgaXN4ZGlnaXQuYWRkUmFuZ2UoJ2EnLCAnZicpOwotICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMucHV0KCJJc1hEaWdpdCIsIFRva2VuLmNvbXBsZW1lbnRSYW5nZXMoaXN4ZGlnaXQpKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5jYXRlZ29yaWVzMi5wdXQoIklzWERpZ2l0IiwgaXN4ZGlnaXQpOwotICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoIklzWERpZ2l0Iik7Ci0KLSAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygiSXNEaWdpdCIsICJOZCIsIHRydWUpOwotICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKCJJc1VwcGVyIiwgIkx1IiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoIklzTG93ZXIiLCAiTGwiLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygiSXNDbnRybCIsICJDIiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoIklzUHJpbnQiLCAiQyIsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygiSXNQdW5jdCIsICJQIiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiSXNEaWdpdCIpOwotICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoIklzVXBwZXIiKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJJc0xvd2VyIik7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiSXNDbnRybCIpOwotICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoIklzUHJpbnQiKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJJc1B1bmN0Iik7Ci0KLSAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygiYWxwaGEiLCAiSXNBbHBoYSIsIHRydWUpOwotICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKCJhbG51bSIsICJJc0FsbnVtIiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoImFzY2lpIiwgIklzQVNDSUkiLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygiY250cmwiLCAiSXNDbnRybCIsIHRydWUpOwotICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKCJkaWdpdCIsICJJc0RpZ2l0IiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoImdyYXBoIiwgIklzR3JhcGgiLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygibG93ZXIiLCAiSXNMb3dlciIsIHRydWUpOwotICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKCJwcmludCIsICJJc1ByaW50IiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoInB1bmN0IiwgIklzUHVuY3QiLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygic3BhY2UiLCAiSXNTcGFjZSIsIHRydWUpOwotICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKCJ1cHBlciIsICJJc1VwcGVyIiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoIndvcmQiLCAiSXNXb3JkIiwgdHJ1ZSk7IC8vIFBlcmwgZXh0ZW5zaW9uCi0gICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoInhkaWdpdCIsICJJc1hEaWdpdCIsIHRydWUpOwotICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoImFscGhhIik7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiYWxudW0iKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJhc2NpaSIpOwotICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoImNudHJsIik7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiZGlnaXQiKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJncmFwaCIpOwotICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoImxvd2VyIik7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygicHJpbnQiKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJwdW5jdCIpOwotICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoInNwYWNlIik7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygidXBwZXIiKTsKLSAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJ3b3JkIik7Ci0gICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygieGRpZ2l0Iik7Ci0gICAgICAgICAgICB9IC8vIHN5bmNocm9uaXplZAotICAgICAgICB9IC8vIGlmIG51bGwKLSAgICAgICAgUmFuZ2VUb2tlbiB0b2sgPSBwb3NpdGl2ZSA/IChSYW5nZVRva2VuKVRva2VuLmNhdGVnb3JpZXMuZ2V0KG5hbWUpCi0gICAgICAgICAgICA6IChSYW5nZVRva2VuKVRva2VuLmNhdGVnb3JpZXMyLmdldChuYW1lKTsKLSAgICAgICAgLy9pZiAodG9rID09IG51bGwpIFN5c3RlbS5vdXQucHJpbnRsbihuYW1lKTsKLSAgICAgICAgcmV0dXJuIHRvazsKLSAgICB9Ci0gICAgc3RhdGljIHByb3RlY3RlZCBSYW5nZVRva2VuIGdldFJhbmdlKFN0cmluZyBuYW1lLCBib29sZWFuIHBvc2l0aXZlLCBib29sZWFuIHhzKSB7Ci0gICAgICAgIFJhbmdlVG9rZW4gcmFuZ2UgPSBUb2tlbi5nZXRSYW5nZShuYW1lLCBwb3NpdGl2ZSk7Ci0gICAgICAgIGlmICh4cyAmJiByYW5nZSAhPSBudWxsICYmIFRva2VuLmlzUmVnaXN0ZXJOb25YUyhuYW1lKSkKLSAgICAgICAgICAgIHJhbmdlID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIHJhbmdlOwotICAgIH0KLQotICAgIHN0YXRpYyBIYXNodGFibGUgbm9ueHMgPSBudWxsOwotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBvbmx5IGdldFJhbmdlKCkuCi0gICAgICogU28gdGhpcyBtZXRob2QgbmVlZCBub3QgTVQtc2FmZS4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJOb25YUyhTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAoVG9rZW4ubm9ueHMgPT0gbnVsbCkKLSAgICAgICAgICAgIFRva2VuLm5vbnhzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICBUb2tlbi5ub254cy5wdXQobmFtZSwgbmFtZSk7Ci0gICAgfQotICAgIHN0YXRpYyBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlZ2lzdGVyTm9uWFMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKFRva2VuLm5vbnhzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIC8vREVCVUcKLSAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oImlzUmVnaXN0ZXJOb25YUzogIituYW1lKTsKLSAgICAgICAgcmV0dXJuIFRva2VuLm5vbnhzLmNvbnRhaW5zS2V5KG5hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0QWxpYXMoU3RyaW5nIG5ld05hbWUsIFN0cmluZyBuYW1lLCBib29sZWFuIHBvc2l0aXZlKSB7Ci0gICAgICAgIFRva2VuIHQxID0gKFRva2VuKVRva2VuLmNhdGVnb3JpZXMuZ2V0KG5hbWUpOwotICAgICAgICBUb2tlbiB0MiA9IChUb2tlbilUb2tlbi5jYXRlZ29yaWVzMi5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChwb3NpdGl2ZSkgewotICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllcy5wdXQobmV3TmFtZSwgdDEpOwotICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllczIucHV0KG5ld05hbWUsIHQyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMyLnB1dChuZXdOYW1lLCB0MSk7Ci0gICAgICAgICAgICBUb2tlbi5jYXRlZ29yaWVzLnB1dChuZXdOYW1lLCB0Mik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgdmlyYW1hU3RyaW5nID0KLSAgICAiXHUwOTREIi8vIDtERVZBTkFHQVJJIFNJR04gVklSQU1BO01uOzk7T047Ozs7O047Ozs7OwotICAgICsiXHUwOUNEIi8vO0JFTkdBTEkgU0lHTiBWSVJBTUE7TW47OTtPTjs7Ozs7Tjs7Ozs7Ci0gICAgKyJcdTBBNEQiLy87R1VSTVVLSEkgU0lHTiBWSVJBTUE7TW47OTtPTjs7Ozs7Tjs7Ozs7Ci0gICAgKyJcdTBBQ0QiLy87R1VKQVJBVEkgU0lHTiBWSVJBTUE7TW47OTtPTjs7Ozs7Tjs7Ozs7Ci0gICAgKyJcdTBCNEQiLy87T1JJWUEgU0lHTiBWSVJBTUE7TW47OTtPTjs7Ozs7Tjs7Ozs7Ci0gICAgKyJcdTBCQ0QiLy87VEFNSUwgU0lHTiBWSVJBTUE7TW47OTtPTjs7Ozs7Tjs7Ozs7Ci0gICAgKyJcdTBDNEQiLy87VEVMVUdVIFNJR04gVklSQU1BO01uOzk7T047Ozs7O047Ozs7OwotICAgICsiXHUwQ0NEIi8vO0tBTk5BREEgU0lHTiBWSVJBTUE7TW47OTtPTjs7Ozs7Tjs7Ozs7Ci0gICAgKyJcdTBENEQiLy87TUFMQVlBTEFNIFNJR04gVklSQU1BO01uOzk7T047Ozs7O047Ozs7OwotICAgICsiXHUwRTNBIi8vO1RIQUkgQ0hBUkFDVEVSIFBISU5USFU7TW47OTtPTjs7Ozs7TjtUSEFJIFZPV0VMIFNJR04gUEhJTlRIVTs7OzsKLSAgICArIlx1MEY4NCI7Ly87VElCRVRBTiBNQVJLIEhBTEFOVEE7TW47OTtPTjs7Ozs7TjtUSUJFVEFOIFZJUkFNQTs7OzsKLQotICAgIHN0YXRpYyBwcml2YXRlIFRva2VuIHRva2VuX2dyYXBoZW1lID0gbnVsbDsKLSAgICBzdGF0aWMgc3luY2hyb25pemVkIFRva2VuIGdldEdyYXBoZW1lUGF0dGVybigpIHsKLSAgICAgICAgaWYgKFRva2VuLnRva2VuX2dyYXBoZW1lICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gVG9rZW4udG9rZW5fZ3JhcGhlbWU7Ci0KLSAgICAgICAgVG9rZW4gYmFzZV9jaGFyID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsgIC8vIFt7QVNTSUdORUR9XS1be019LHtDfV0KLSAgICAgICAgYmFzZV9jaGFyLm1lcmdlUmFuZ2VzKFRva2VuLmdldFJhbmdlKCJBU1NJR05FRCIsIHRydWUpKTsKLSAgICAgICAgYmFzZV9jaGFyLnN1YnRyYWN0UmFuZ2VzKFRva2VuLmdldFJhbmdlKCJNIiwgdHJ1ZSkpOwotICAgICAgICBiYXNlX2NoYXIuc3VidHJhY3RSYW5nZXMoVG9rZW4uZ2V0UmFuZ2UoIkMiLCB0cnVlKSk7Ci0KLSAgICAgICAgVG9rZW4gdmlyYW1hID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgVG9rZW4udmlyYW1hU3RyaW5nLmxlbmd0aCgpOyAgaSArKykgewotICAgICAgICAgICAgaW50IGNoID0gdmlyYW1hU3RyaW5nLmNoYXJBdChpKTsKLSAgICAgICAgICAgIHZpcmFtYS5hZGRSYW5nZShpLCBpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRva2VuIGNvbWJpbmVyX3dvX3ZpcmFtYSA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgIGNvbWJpbmVyX3dvX3ZpcmFtYS5tZXJnZVJhbmdlcyhUb2tlbi5nZXRSYW5nZSgiTSIsIHRydWUpKTsKLSAgICAgICAgY29tYmluZXJfd29fdmlyYW1hLmFkZFJhbmdlKDB4MTE2MCwgMHgxMWZmKTsgLy8gaGFuZ3VsX21lZGlhbCBhbmQgaGFuZ3VsX2ZpbmFsCi0gICAgICAgIGNvbWJpbmVyX3dvX3ZpcmFtYS5hZGRSYW5nZSgweGZmOWUsIDB4ZmY5Zik7IC8vIGV4dHJhcwotCi0gICAgICAgIFRva2VuIGxlZnQgPSBUb2tlbi5jcmVhdGVVbmlvbigpOyAgICAgICAvLyBiYXNlX2NoYXI/Ci0gICAgICAgIGxlZnQuYWRkQ2hpbGQoYmFzZV9jaGFyKTsKLSAgICAgICAgbGVmdC5hZGRDaGlsZChUb2tlbi50b2tlbl9lbXB0eSk7Ci0KLSAgICAgICAgVG9rZW4gZm9vID0gVG9rZW4uY3JlYXRlVW5pb24oKTsKLSAgICAgICAgZm9vLmFkZENoaWxkKFRva2VuLmNyZWF0ZUNvbmNhdCh2aXJhbWEsIFRva2VuLmdldFJhbmdlKCJMIiwgdHJ1ZSkpKTsKLSAgICAgICAgZm9vLmFkZENoaWxkKGNvbWJpbmVyX3dvX3ZpcmFtYSk7Ci0KLSAgICAgICAgZm9vID0gVG9rZW4uY3JlYXRlQ2xvc3VyZShmb28pOwotCi0gICAgICAgIGZvbyA9IFRva2VuLmNyZWF0ZUNvbmNhdChsZWZ0LCBmb28pOwotCi0gICAgICAgIFRva2VuLnRva2VuX2dyYXBoZW1lID0gZm9vOwotICAgICAgICByZXR1cm4gVG9rZW4udG9rZW5fZ3JhcGhlbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tYmluZyBDaGFyYWN0ZXIgU2VxdWVuY2UgaW4gUGVybCA1LjYuCi0gICAgICovCi0gICAgc3RhdGljIHByaXZhdGUgVG9rZW4gdG9rZW5fY2NzID0gbnVsbDsKLSAgICBzdGF0aWMgc3luY2hyb25pemVkIFRva2VuIGdldENvbWJpbmluZ0NoYXJhY3RlclNlcXVlbmNlKCkgewotICAgICAgICBpZiAoVG9rZW4udG9rZW5fY2NzICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gVG9rZW4udG9rZW5fY2NzOwotCi0gICAgICAgIFRva2VuIGZvbyA9IFRva2VuLmNyZWF0ZUNsb3N1cmUoVG9rZW4uZ2V0UmFuZ2UoIk0iLCB0cnVlKSk7IC8vIFxwTSoKLSAgICAgICAgZm9vID0gVG9rZW4uY3JlYXRlQ29uY2F0KFRva2VuLmdldFJhbmdlKCJNIiwgZmFsc2UpLCBmb28pOyAvLyBcUE0gKyBccE0qCi0gICAgICAgIFRva2VuLnRva2VuX2NjcyA9IGZvbzsKLSAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX2NjczsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5vZGUgaW4gcGFyc2UgdHJlZS4KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgU3RyaW5nVG9rZW4gZXh0ZW5kcyBUb2tlbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLSAgICAgICAgU3RyaW5nIHN0cmluZzsKLSAgICAgICAgaW50IHJlZk51bWJlcjsKLQotICAgICAgICBTdHJpbmdUb2tlbihpbnQgdHlwZSwgU3RyaW5nIHN0ciwgaW50IG4pIHsKLSAgICAgICAgICAgIHN1cGVyKHR5cGUpOwotICAgICAgICAgICAgdGhpcy5zdHJpbmcgPSBzdHI7Ci0gICAgICAgICAgICB0aGlzLnJlZk51bWJlciA9IG47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0UmVmZXJlbmNlTnVtYmVyKCkgeyAgICAgICAgICAgICAgLy8gZm9yIFNUUklORwotICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmTnVtYmVyOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBnZXRTdHJpbmcoKSB7ICAgICAgICAgICAgICAgICAgICAvLyBmb3IgU1RSSU5HCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IG9wdGlvbnMpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gQkFDS1JFRkVSRU5DRSkKLSAgICAgICAgICAgICAgICByZXR1cm4gIlxcIit0aGlzLnJlZk51bWJlcjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gUkVVdGlsLnF1b3RlTWV0YSh0aGlzLnN0cmluZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBub2RlIGluIHBhcnNlIHRyZWUuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIENvbmNhdFRva2VuIGV4dGVuZHMgVG9rZW4gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0gICAgICAgIFRva2VuIGNoaWxkOwotICAgICAgICBUb2tlbiBjaGlsZDI7Ci0gICAgICAgIAotICAgICAgICBDb25jYXRUb2tlbihUb2tlbiB0MSwgVG9rZW4gdDIpIHsKLSAgICAgICAgICAgIHN1cGVyKFRva2VuLkNPTkNBVCk7Ci0gICAgICAgICAgICB0aGlzLmNoaWxkID0gdDE7Ci0gICAgICAgICAgICB0aGlzLmNoaWxkMiA9IHQyOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgICAgICBUb2tlbiBnZXRDaGlsZChpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBpbmRleCA9PSAwID8gdGhpcy5jaGlsZCA6IHRoaXMuY2hpbGQyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgb3B0aW9ucykgewotICAgICAgICAgICAgU3RyaW5nIHJldDsKLSAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkMi50eXBlID09IENMT1NVUkUgJiYgdGhpcy5jaGlsZDIuZ2V0Q2hpbGQoMCkgPT0gdGhpcy5jaGlsZCkgewotICAgICAgICAgICAgICAgIHJldCA9IHRoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrIisiOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNoaWxkMi50eXBlID09IE5PTkdSRUVEWUNMT1NVUkUgJiYgdGhpcy5jaGlsZDIuZ2V0Q2hpbGQoMCkgPT0gdGhpcy5jaGlsZCkgewotICAgICAgICAgICAgICAgIHJldCA9IHRoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrIis/IjsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHJldCA9IHRoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrdGhpcy5jaGlsZDIudG9TdHJpbmcob3B0aW9ucyk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbm9kZSBpbiBwYXJzZSB0cmVlLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBDaGFyVG9rZW4gZXh0ZW5kcyBUb2tlbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLSAgICAgICAgaW50IGNoYXJkYXRhOwotCi0gICAgICAgIENoYXJUb2tlbihpbnQgdHlwZSwgaW50IGNoKSB7Ci0gICAgICAgICAgICBzdXBlcih0eXBlKTsKLSAgICAgICAgICAgIHRoaXMuY2hhcmRhdGEgPSBjaDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRDaGFyKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhcmRhdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCBvcHRpb25zKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmV0OwotICAgICAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHsKLSAgICAgICAgICAgICAgY2FzZSBDSEFSOgotICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5jaGFyZGF0YSkgewotICAgICAgICAgICAgICAgICAgY2FzZSAnfCc6ICBjYXNlICcqJzogIGNhc2UgJysnOiAgY2FzZSAnPyc6Ci0gICAgICAgICAgICAgICAgICBjYXNlICcoJzogIGNhc2UgJyknOiAgY2FzZSAnLic6ICBjYXNlICdbJzoKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ3snOiAgY2FzZSAnXFwnOgotICAgICAgICAgICAgICAgICAgICByZXQgPSAiXFwiKyhjaGFyKXRoaXMuY2hhcmRhdGE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgY2FzZSAnXGYnOiAgcmV0ID0gIlxcZiI7ICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzogIHJldCA9ICJcXG4iOyAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBjYXNlICdccic6ICByZXQgPSAiXFxyIjsgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgY2FzZSAnXHQnOiAgcmV0ID0gIlxcdCI7ICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGNhc2UgMHgxYjogIHJldCA9ICJcXGUiOyAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIC8vY2FzZSAweDBiOiAgcmV0ID0gIlxcdiI7ICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoYXJkYXRhID49IDB4MTAwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmUgPSAiMCIrSW50ZWdlci50b0hleFN0cmluZyh0aGlzLmNoYXJkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9ICJcXHYiK3ByZS5zdWJzdHJpbmcocHJlLmxlbmd0aCgpLTYsIHByZS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gIiIrKGNoYXIpdGhpcy5jaGFyZGF0YTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSBBTkNIT1I6Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMgPT0gVG9rZW4udG9rZW5fbGluZWJlZ2lubmluZyB8fCB0aGlzID09IFRva2VuLnRva2VuX2xpbmVlbmQpCi0gICAgICAgICAgICAgICAgICAgIHJldCA9ICIiKyhjaGFyKXRoaXMuY2hhcmRhdGE7Ci0gICAgICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gIlxcIisoY2hhcil0aGlzLmNoYXJkYXRhOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIG1hdGNoKGludCBjaCkgewotICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBDSEFSKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNoID09IHRoaXMuY2hhcmRhdGE7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTkZBQXJyb3cjbWF0Y2goKTogSW50ZXJuYWwgZXJyb3I6ICIrdGhpcy50eXBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5vZGUgaW4gcGFyc2UgdHJlZS4KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgQ2xvc3VyZVRva2VuIGV4dGVuZHMgVG9rZW4gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0gICAgICAgIGludCBtaW47Ci0gICAgICAgIGludCBtYXg7Ci0gICAgICAgIFRva2VuIGNoaWxkOwotCi0gICAgICAgIENsb3N1cmVUb2tlbihpbnQgdHlwZSwgVG9rZW4gdG9rKSB7Ci0gICAgICAgICAgICBzdXBlcih0eXBlKTsKLSAgICAgICAgICAgIHRoaXMuY2hpbGQgPSB0b2s7Ci0gICAgICAgICAgICB0aGlzLnNldE1pbigtMSk7Ci0gICAgICAgICAgICB0aGlzLnNldE1heCgtMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIFRva2VuIGdldENoaWxkKGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGQ7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCB2b2lkIHNldE1pbihpbnQgbWluKSB7Ci0gICAgICAgICAgICB0aGlzLm1pbiA9IG1pbjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCB2b2lkIHNldE1heChpbnQgbWF4KSB7Ci0gICAgICAgICAgICB0aGlzLm1heCA9IG1heDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgZ2V0TWluKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMubWluOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBnZXRNYXgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCBvcHRpb25zKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmV0OwotICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBDTE9TVVJFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0TWluKCkgPCAwICYmIHRoaXMuZ2V0TWF4KCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IHRoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrIioiOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRNaW4oKSA9PSB0aGlzLmdldE1heCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IHRoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrInsiK3RoaXMuZ2V0TWluKCkrIn0iOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRNaW4oKSA+PSAwICYmIHRoaXMuZ2V0TWF4KCkgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyJ7Iit0aGlzLmdldE1pbigpKyIsIit0aGlzLmdldE1heCgpKyJ9IjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0TWluKCkgPj0gMCAmJiB0aGlzLmdldE1heCgpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyJ7Iit0aGlzLmdldE1pbigpKyIsfSI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUb2tlbiN0b1N0cmluZygpOiBDTE9TVVJFICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK3RoaXMuZ2V0TWluKCkrIiwgIit0aGlzLmdldE1heCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0TWluKCkgPCAwICYmIHRoaXMuZ2V0TWF4KCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IHRoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrIio/IjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0TWluKCkgPT0gdGhpcy5nZXRNYXgoKSkgewotICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyJ7Iit0aGlzLmdldE1pbigpKyJ9PyI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldE1pbigpID49IDAgJiYgdGhpcy5nZXRNYXgoKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IHRoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrInsiK3RoaXMuZ2V0TWluKCkrIiwiK3RoaXMuZ2V0TWF4KCkrIn0/IjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0TWluKCkgPj0gMCAmJiB0aGlzLmdldE1heCgpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyJ7Iit0aGlzLmdldE1pbigpKyIsfT8iOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVG9rZW4jdG9TdHJpbmcoKTogTk9OR1JFRURZQ0xPU1VSRSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICt0aGlzLmdldE1pbigpKyIsICIrdGhpcy5nZXRNYXgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbm9kZSBpbiBwYXJzZSB0cmVlLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBQYXJlblRva2VuIGV4dGVuZHMgVG9rZW4gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0gICAgICAgIFRva2VuIGNoaWxkOwotICAgICAgICBpbnQgcGFyZW5udW1iZXI7Ci0KLSAgICAgICAgUGFyZW5Ub2tlbihpbnQgdHlwZSwgVG9rZW4gdG9rLCBpbnQgcGFyZW4pIHsKLSAgICAgICAgICAgIHN1cGVyKHR5cGUpOwotICAgICAgICAgICAgdGhpcy5jaGlsZCA9IHRvazsKLSAgICAgICAgICAgIHRoaXMucGFyZW5udW1iZXIgPSBwYXJlbjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzaXplKCkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgVG9rZW4gZ2V0Q2hpbGQoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGlsZDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRQYXJlbk51bWJlcigpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVubnVtYmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgb3B0aW9ucykgewotICAgICAgICAgICAgU3RyaW5nIHJldCA9IG51bGw7Ci0gICAgICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkgewotICAgICAgICAgICAgICBjYXNlIFBBUkVOOgotICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVubnVtYmVyID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gIig/OiIrdGhpcy5jaGlsZC50b1N0cmluZyhvcHRpb25zKSsiKSI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gIigiK3RoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrIikiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlIExPT0tBSEVBRDoKLSAgICAgICAgICAgICAgICByZXQgPSAiKD89Iit0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyIpIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSBORUdBVElWRUxPT0tBSEVBRDoKLSAgICAgICAgICAgICAgICByZXQgPSAiKD8hIit0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyIpIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSBMT09LQkVISU5EOgotICAgICAgICAgICAgICAgIHJldCA9ICIoPzw9Iit0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyIpIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSBORUdBVElWRUxPT0tCRUhJTkQ6Ci0gICAgICAgICAgICAgICAgcmV0ID0gIig/PCEiK3RoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrIikiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIElOREVQRU5ERU5UOgotICAgICAgICAgICAgICAgIHJldCA9ICIoPz4iK3RoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrIikiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICg/KGNvbmRpdGlvbil5ZXMtcGF0dGVybnxuby1wYXR0ZXJuKQotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBDb25kaXRpb25Ub2tlbiBleHRlbmRzIFRva2VuIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotICAgICAgICBpbnQgcmVmTnVtYmVyOwotICAgICAgICBUb2tlbiBjb25kaXRpb247Ci0gICAgICAgIFRva2VuIHllczsKLSAgICAgICAgVG9rZW4gbm87Ci0gICAgICAgIENvbmRpdGlvblRva2VuKGludCByZWZubywgVG9rZW4gY29uZCwgVG9rZW4geWVzcGF0LCBUb2tlbiBub3BhdCkgewotICAgICAgICAgICAgc3VwZXIoVG9rZW4uQ09ORElUSU9OKTsKLSAgICAgICAgICAgIHRoaXMucmVmTnVtYmVyID0gcmVmbm87Ci0gICAgICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmQ7Ci0gICAgICAgICAgICB0aGlzLnllcyA9IHllc3BhdDsKLSAgICAgICAgICAgIHRoaXMubm8gPSBub3BhdDsKLSAgICAgICAgfQotICAgICAgICBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLm5vID09IG51bGwgPyAxIDogMjsKLSAgICAgICAgfQotICAgICAgICBUb2tlbiBnZXRDaGlsZChpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKSAgcmV0dXJuIHRoaXMueWVzOwotICAgICAgICAgICAgaWYgKGluZGV4ID09IDEpICByZXR1cm4gdGhpcy5ubzsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogIitpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCBvcHRpb25zKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmV0OwotICAgICAgICAgICAgaWYgKHJlZk51bWJlciA+IDApIHsKLSAgICAgICAgICAgICAgICByZXQgPSAiKD8oIityZWZOdW1iZXIrIikiOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmRpdGlvbi50eXBlID09IFRva2VuLkFOQ0hPUikgewotICAgICAgICAgICAgICAgIHJldCA9ICIoPygiK3RoaXMuY29uZGl0aW9uKyIpIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gIig/Iit0aGlzLmNvbmRpdGlvbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRoaXMubm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldCArPSB0aGlzLnllcysiKSI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldCArPSB0aGlzLnllcysifCIrdGhpcy5ubysiKSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogKGltcy1pbXM6IC4uLi4gKQotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBNb2RpZmllclRva2VuIGV4dGVuZHMgVG9rZW4gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0gICAgICAgIFRva2VuIGNoaWxkOwotICAgICAgICBpbnQgYWRkOwotICAgICAgICBpbnQgbWFzazsKLQotICAgICAgICBNb2RpZmllclRva2VuKFRva2VuIHRvaywgaW50IGFkZCwgaW50IG1hc2spIHsKLSAgICAgICAgICAgIHN1cGVyKFRva2VuLk1PRElGSUVSR1JPVVApOwotICAgICAgICAgICAgdGhpcy5jaGlsZCA9IHRvazsKLSAgICAgICAgICAgIHRoaXMuYWRkID0gYWRkOwotICAgICAgICAgICAgdGhpcy5tYXNrID0gbWFzazsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzaXplKCkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgVG9rZW4gZ2V0Q2hpbGQoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGlsZDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRPcHRpb25zKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkOwotICAgICAgICB9Ci0gICAgICAgIGludCBnZXRPcHRpb25zTWFzaygpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLm1hc2s7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCBvcHRpb25zKSB7Ci0gICAgICAgICAgICByZXR1cm4gIig/IgotICAgICAgICAgICAgICAgICsodGhpcy5hZGQgPT0gMCA/ICIiIDogUkVVdGlsLmNyZWF0ZU9wdGlvblN0cmluZyh0aGlzLmFkZCkpCi0gICAgICAgICAgICAgICAgKyh0aGlzLm1hc2sgPT0gMCA/ICIiIDogUkVVdGlsLmNyZWF0ZU9wdGlvblN0cmluZyh0aGlzLm1hc2spKQotICAgICAgICAgICAgICAgICsiOiIKLSAgICAgICAgICAgICAgICArdGhpcy5jaGlsZC50b1N0cmluZyhvcHRpb25zKQotICAgICAgICAgICAgICAgICsiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBub2RlIGluIHBhcnNlIHRyZWUuCi0gICAgICogZm9yIFVOSU9OIG9yIENPTkNBVC4KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgVW5pb25Ub2tlbiBleHRlbmRzIFRva2VuIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotICAgICAgICBWZWN0b3IgY2hpbGRyZW47Ci0KLSAgICAgICAgVW5pb25Ub2tlbihpbnQgdHlwZSkgewotICAgICAgICAgICAgc3VwZXIodHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkZENoaWxkKFRva2VuIHRvaykgewotICAgICAgICAgICAgaWYgKHRvayA9PSBudWxsKSAgcmV0dXJuOwotICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgIHRoaXMuY2hpbGRyZW4gPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICBpZiAodGhpcy50eXBlID09IFVOSU9OKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5hZGRFbGVtZW50KHRvayk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBDT05DQVQsIGFuZCBuZXcgY2hpbGQgaXMgQ09OQ0FULgotICAgICAgICAgICAgaWYgKHRvay50eXBlID09IENPTkNBVCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRvay5zaXplKCk7ICBpICsrKQotICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZENoaWxkKHRvay5nZXRDaGlsZChpKSk7IC8vIFJlY3Vyc2lvbgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBzaXplID0gdGhpcy5jaGlsZHJlbi5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5hZGRFbGVtZW50KHRvayk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVG9rZW4gcHJldmlvdXMgPSAoVG9rZW4pdGhpcy5jaGlsZHJlbi5lbGVtZW50QXQoc2l6ZS0xKTsKLSAgICAgICAgICAgIGlmICghKChwcmV2aW91cy50eXBlID09IENIQVIgfHwgcHJldmlvdXMudHlwZSA9PSBTVFJJTkcpCi0gICAgICAgICAgICAgICAgICAmJiAodG9rLnR5cGUgPT0gQ0hBUiB8fCB0b2sudHlwZSA9PSBTVFJJTkcpKSkgewotICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uYWRkRWxlbWVudCh0b2spOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIk1lcmdlICciK3ByZXZpb3VzKyInIGFuZCAnIit0b2srIicuIik7Ci0KLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXI7Ci0gICAgICAgICAgICBpbnQgbmV4dE1heExlbmd0aCA9ICh0b2sudHlwZSA9PSBDSEFSID8gMiA6IHRvay5nZXRTdHJpbmcoKS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBpZiAocHJldmlvdXMudHlwZSA9PSBDSEFSKSB7ICAgICAgICAvLyBSZXBsYWNlIHByZXZpb3VzIHRva2VuIGJ5IFNUUklORwotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMiArIG5leHRNYXhMZW5ndGgpOwotICAgICAgICAgICAgICAgIGludCBjaCA9IHByZXZpb3VzLmdldENoYXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHgxMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChSRVV0aWwuZGVjb21wb3NlVG9TdXJyb2dhdGVzKGNoKSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKChjaGFyKWNoKTsKLSAgICAgICAgICAgICAgICBwcmV2aW91cyA9IFRva2VuLmNyZWF0ZVN0cmluZyhudWxsKTsKLSAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNldEVsZW1lbnRBdChwcmV2aW91cywgc2l6ZS0xKTsKLSAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNUUklORwotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocHJldmlvdXMuZ2V0U3RyaW5nKCkubGVuZ3RoKCkgKyBuZXh0TWF4TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHByZXZpb3VzLmdldFN0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRvay50eXBlID09IENIQVIpIHsKLSAgICAgICAgICAgICAgICBpbnQgY2ggPSB0b2suZ2V0Q2hhcigpOwotICAgICAgICAgICAgICAgIGlmIChjaCA+PSAweDEwMDAwKQotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKFJFVXRpbC5kZWNvbXBvc2VUb1N1cnJvZ2F0ZXMoY2gpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpY2gpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHRvay5nZXRTdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICgoU3RyaW5nVG9rZW4pcHJldmlvdXMpLnN0cmluZyA9IG5ldyBTdHJpbmcoYnVmZmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzaXplKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4gPT0gbnVsbCA/IDAgOiB0aGlzLmNoaWxkcmVuLnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICBUb2tlbiBnZXRDaGlsZChpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiAoVG9rZW4pdGhpcy5jaGlsZHJlbi5lbGVtZW50QXQoaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgb3B0aW9ucykgewotICAgICAgICAgICAgU3RyaW5nIHJldDsKLSAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gQ09OQ0FUKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4uc2l6ZSgpID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgVG9rZW4gY2ggPSB0aGlzLmdldENoaWxkKDApOwotICAgICAgICAgICAgICAgICAgICBUb2tlbiBjaDIgPSB0aGlzLmdldENoaWxkKDEpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2gyLnR5cGUgPT0gQ0xPU1VSRSAmJiBjaDIuZ2V0Q2hpbGQoMCkgPT0gY2gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGNoLnRvU3RyaW5nKG9wdGlvbnMpKyIrIjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaDIudHlwZSA9PSBOT05HUkVFRFlDTE9TVVJFICYmIGNoMi5nZXRDaGlsZCgwKSA9PSBjaCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gY2gudG9TdHJpbmcob3B0aW9ucykrIis/IjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBjaC50b1N0cmluZyhvcHRpb25zKStjaDIudG9TdHJpbmcob3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLmNoaWxkcmVuLnNpemUoKTsgIGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgoKFRva2VuKXRoaXMuY2hpbGRyZW4uZWxlbWVudEF0KGkpKS50b1N0cmluZyhvcHRpb25zKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFN0cmluZyhzYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5zaXplKCkgPT0gMiAmJiB0aGlzLmdldENoaWxkKDEpLnR5cGUgPT0gRU1QVFkpIHsKLSAgICAgICAgICAgICAgICByZXQgPSB0aGlzLmdldENoaWxkKDApLnRvU3RyaW5nKG9wdGlvbnMpKyI/IjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGlsZHJlbi5zaXplKCkgPT0gMgotICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmdldENoaWxkKDApLnR5cGUgPT0gRU1QVFkpIHsKLSAgICAgICAgICAgICAgICByZXQgPSB0aGlzLmdldENoaWxkKDEpLnRvU3RyaW5nKG9wdGlvbnMpKyI/PyI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKChUb2tlbil0aGlzLmNoaWxkcmVuLmVsZW1lbnRBdCgwKSkudG9TdHJpbmcob3B0aW9ucykpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyAgaSA8IHRoaXMuY2hpbGRyZW4uc2l6ZSgpOyAgaSArKykgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpJ3wnKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCgoVG9rZW4pdGhpcy5jaGlsZHJlbi5lbGVtZW50QXQoaSkpLnRvU3RyaW5nKG9wdGlvbnMpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0ID0gbmV3IFN0cmluZyhzYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9tZXNzYWdlLnByb3BlcnRpZXMgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L21lc3NhZ2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJlNDg4MC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L21lc3NhZ2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLXBhcnNlci5wYXJzZS4xPVdyb25nIGNoYXJhY3Rlci4KLXBhcnNlci5wYXJzZS4yPUludmFsaWQgcmVmZXJlbmNlIG51bWJlci4KLXBhcnNlci5uZXh0LjE9QSBjaGFyYWN0ZXIgaXMgcmVxdWlyZWQgYWZ0ZXIgXFwuCi1wYXJzZXIubmV4dC4yPSc/JyBpcyBub3QgZXhwZWN0ZWQuICAnKD86JyBvciAnKD89JyBvciAnKD8hJyBvciAnKD88JyBvciAnKD8jJyBvciAnKD8+Jz8KLXBhcnNlci5uZXh0LjM9Jyg/PD0nIG9yICcoPzwhJyBpcyBleHBlY3RlZC4KLXBhcnNlci5uZXh0LjQ9QSBjb21tZW50IGlzIG5vdCB0ZXJtaW5hdGVkLgotcGFyc2VyLmZhY3Rvci4xPScpJyBpcyBleHBlY3RlZC4KLXBhcnNlci5mYWN0b3IuMj1VbmV4cGVjdGVkIGVuZCBvZiB0aGUgcGF0dGVybiBpbiBhIG1vZGlmaWVyIGdyb3VwLgotcGFyc2VyLmZhY3Rvci4zPSc6JyBpcyBleHBlY3RlZC4KLXBhcnNlci5mYWN0b3IuND1VbmV4cGVjdGVkIGVuZCBvZiB0aGUgcGF0dGVybiBpbiBhIGNvbmRpdGlvbmFsIGdyb3VwLgotcGFyc2VyLmZhY3Rvci41PUEgYmFjayByZWZlcmVuY2Ugb3IgYW4gYW5jaG9yIG9yIGEgbG9va2FoZWFkIG9yIGEgbG9va2JlaGluZCBpcyBleHBlY3RlZCBpbiBhIGNvbmRpdGlvbmFsIHBhdHRlcm4uCi1wYXJzZXIuZmFjdG9yLjY9VGhlcmUgYXJlIG1vcmUgdGhhbiB0aHJlZSBjaG9pc2VzIGluIGEgY29uZGl0aW9uYWwgZ3JvdXAuCi1wYXJzZXIuYXRvbS4xPUEgY2hhcmFjdGVyIGluIFUrMDA0MC1VKzAwNWYgbXVzdCBmb2xsb3cgXFxjLgotcGFyc2VyLmF0b20uMj1BIENhdGVnb3J5IGNoYXJhY3RlciBvciAneycgaXMgcmVxdWlyZWQuCi1wYXJzZXIuYXRvbS4zPUEgcHJvcGVydHkgbmFtZSBpcyBub3QgY2xvc2VkIGJ5ICd9Jy4KLXBhcnNlci5hdG9tLjQ9VW5leHBlY3RlZCBtZXRhIGNoYXJhY3Rlci4KLXBhcnNlci5hdG9tLjU9VW5rbm93biBwcm9wZXJ0eS4KLXBhcnNlci5jYy4xPUEgUE9TSVggY2hhcmFjdGVyIGNsYXNzIG11c3QgYmUgY2xvc2VkIGJ5ICc6XScuCi1wYXJzZXIuY2MuMj1VbmV4cGVjdGVkIGVuZCBvZiB0aGUgcGF0dGVybiBpbiBhIGNoYXJhY3RlciBjbGFzcy4KLXBhcnNlci5jYy4zPVVua25vd24gbmFtZSBmb3IgYSBQT1NJWCBjaGFyYWN0ZXIgY2xhc3MuCi1wYXJzZXIuY2MuND0nLScgaXMgaW52YWxpZCBoZXJlLgotcGFyc2VyLmNjLjU9J10nIGlzIGV4cGVjdGVkLgotcGFyc2VyLmNjLjY9J1snIGlzIGludmFsaWQgaW4gYSBjaGFyYWNlciBjbGFzcy4gIFdyaXRlICdcXFsnLgotcGFyc2VyLmNjLjc9J10nIGlzIGludmFsaWQgaW4gYSBjaGFyYWNlciBjbGFzcy4gIFdyaXRlICdcXF0nLgotcGFyc2VyLm9wZS4xPSdbJyBpcyBleHBlY3RlZC4KLXBhcnNlci5vcGUuMj0nKScgb3IgJy1bJyBvciAnK1snIG9yICcmWycgaXMgZXhwZWN0ZWQuCi1wYXJzZXIuZGVzY2FwZS4xPUludmFsaWQgVW5pY29kZSBoZXggbm90YXRpb24uCi1wYXJzZXIuZGVzY2FwZS4yPU92ZXJmbG93IGluIGEgaGV4IG5vdGF0aW9uLgotcGFyc2VyLmRlc2NhcGUuMz0nXFx4eycgbXVzdCBiZSBjbG9zZWQgYnkgJ30nLgotcGFyc2VyLmRlc2NhcGUuND1JbnZhbGlkIFVuaWNvZGUgY29kZSBwb2ludC4KLXBhcnNlci5kZXNjYXBlLjU9QW4gYW5jaG9yIG11c3Qgbm90IGJlIGhlcmUuCi1wYXJzZXIucHJvY2Vzcy4xPVRoaXMgZXhwcmVzc2lvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBjdXJyZW50IG9wdGlvbiBzZXR0aW5nLgpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9tZXNzYWdlX2ZyLnByb3BlcnRpZXMgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L21lc3NhZ2VfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzZTk4MS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L21lc3NhZ2VfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSBwYXJzZXIucGFyc2UuMT1DYXJhY3RcdTAwZThyZSBpbnZhbGlkZS4KLXBhcnNlci5wYXJzZS4yPU51bVx1MDBlOXJvIGRlIHJcdTAwZTlmXHUwMGU5cmVuY2UgaW52YWxpZGUuCi1wYXJzZXIubmV4dC4xPVVuIFxcIGRvaXQgXHUwMGVhdHJlIHN1aXZpIGQndW4gY2FyYWN0XHUwMGU4cmUuCi1wYXJzZXIubmV4dC4yPSc/JyBuJ2VzdCBwYXMgcG9zc2libGUgaWNpLiAgJyg/Oicgb3UgJyg/PScgb3UgJyg/IScgb3UgJyg/PCcgb3UgJyg/Iycgb3UgJyg/Pic/Ci1wYXJzZXIubmV4dC4zPScoPzw9JyBvdSAnKD88IScgc29udCBhdHRlbmR1cy4KLXBhcnNlci5uZXh0LjQ9VW4gY29tbWVudGFpcmUgbidlc3QgcGFzIGZlcm1cdTAwZTkuCi1wYXJzZXIuZmFjdG9yLjE9JyknIG1hbnF1YW50LgotcGFyc2VyLmZhY3Rvci4yPUZpbiBwclx1MDBlOW1hdHVyXHUwMGU5ZSBkZSBtb3RpZiBkYW5zIHVuIGdyb3VwZSBtb2RpZmlhbnQuCi1wYXJzZXIuZmFjdG9yLjM9JzonIG1hbnF1YW50LgotcGFyc2VyLmZhY3Rvci40PUZpbiBwclx1MDBlOW1hdHVyXHUwMGU5ZSBkZSBtb3RpZiBkYW5zIHVuIGdyb3VwZSBjb25kaXRpb25lbC4KLXBhcnNlci5mYWN0b3IuNT1VbmUgclx1MDBlOWZcdTAwZTlyZW5jZSBhcnJpXHUwMGU4cmUgb3UgdW5lIGFuY3JlIG91IHVuIGxvb2thaGVhZCBvdSB1biBsb29rYmVoaW5kIGVzdCBhdHRlbmR1IGRhbnMgdW4gZ3JvdXBlIGNvbmRpdGlvbmVsLgotcGFyc2VyLmZhY3Rvci42PUlsIHkgYSBwbHVzIGRlIHRyb2lzIGNob2l4IGRhbnMgdW4gZ3JvdXBlIGNvbmRpdGlvbmVsLgotcGFyc2VyLmF0b20uMT1cXGMgZG9pdCBcdTAwZWF0cmUgc3VpdmkgZCd1biBjYXJhY3RcdTAwZThyZSBkYW5zIGwnaW50ZXJ2YWxsZSBVKzAwNDAtVSswMDVmIC4KLXBhcnNlci5hdG9tLjI9VW4gY2FyYWN0XHUwMGU4cmUgZGUgY2F0XHUwMGU5Z29yaWUgb3UgJ3snIGVzdCByZXF1aXMuCi1wYXJzZXIuYXRvbS4zPVVuIG5vbSBkZSBwcm9wcmlcdTAwZTl0XHUwMGU5IG5lIHNlIHRlcm1pbmUgcGFzIHBhciAnfScuCi1wYXJzZXIuYXRvbS40PU1cdTAwZTl0YWNhcmFjdFx1MDBlOHJlIGludGVyZGl0LgotcGFyc2VyLmF0b20uNT1Qcm9wcmlcdTAwZTl0XHUwMGU5IGluY29ubnVlLgotcGFyc2VyLmNjLjE9VW5lIGNsYXNzZSBkZSBjYXJhY3RcdTAwZThyZSBQT1NJWCBkb2l0IFx1MDBlYXRyZSB0ZXJtaW5cdTAwZTllIHBhciAnOl0nLgotcGFyc2VyLmNjLjI9RmluIHByXHUwMGU5bWF0dXJcdTAwZTllIGRlIG1vdGlmIGRhbnMgdW5lIGNsYXNzZSBkZSBjYXJhY3RcdTAwZThyZS4KLXBhcnNlci5jYy4zPU5vbSBpbmNvbm51IHBvdXIgdW5lIGNsYXNzZSBkZSBjYXJhY3RcdTAwZThyZSBQT1NJWC4KLXBhcnNlci5jYy40PSctJyBlc3QgaW52YWxpZGUsIGRhbnMgY2UgY2FzLgotcGFyc2VyLmNjLjU9J10nIG1hbnF1YW50LgotcGFyc2VyLmNjLjY9J1snIGVzdCBpbnZhbGlkZSBkYW5zIHVuZSBjbGFzc2UgZGUgY2FyYWN0XHUwMGU4cmUuIEVjcml2ZXogJ1xcWycuCi1wYXJzZXIuY2MuNz0nXScgZXN0IGludmFsaWRlIGRhbnMgdW5lIGNsYXNzZSBkZSBjYXJhY3RcdTAwZThyZS4gRWNyaXZleiAnXFxdJy4KLXBhcnNlci5vcGUuMT0nWycgZXN0IGF0dGVuZHUuCi1wYXJzZXIub3BlLjI9JyknIG91ICctWycgb3UgJytbJyBvdSAnJlsnIHNvbnQgYXR0ZW5kdXMuCi1wYXJzZXIuZGVzY2FwZS4xPU5vdGF0aW9uIGhleGFkXHUwMGU5Y2ltYWxlIFVuaWNvZGUgaW52YWxpZGUuCi1wYXJzZXIuZGVzY2FwZS4yPURcdTAwZTlwYXNzZW1lbnQgZGUgY2FwYWNpdFx1MDBlOSBkYW5zIHVuZSBleHByZXNzaW9uIGhleGFkXHUwMGU5Y2ltYWxlLgotcGFyc2VyLmRlc2NhcGUuMz0nXFx4eycgZG9pdCBzZSB0ZXJtaW5lciBwYXIgdW4gJ30nLgotcGFyc2VyLmRlc2NhcGUuND1Qb2ludCBkZSBjb2RlIFVuaWNvZGUgaW52YWxpZGUuCi1wYXJzZXIuZGVzY2FwZS41PUFuY3JlIGludGVyZGl0ZSBpY2kuCi1wYXJzZXIucHJvY2Vzcy4xPUNldHRlIGV4cHJlc3Npb24gbidlc3QgcGFzIGF1dG9yaXNcdTAwZTllIGNvbXB0ZSB0ZW51IGRlcyBvcHRpb25zIGVuIGNvdXJzLgpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9tZXNzYWdlX2phLnByb3BlcnRpZXMgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L21lc3NhZ2VfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJlODM5NC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L21lc3NhZ2VfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLXBhcnNlci5wYXJzZS4xPVx1MzA3OFx1MzA5M1x1MzA2YVx1NjU4N1x1NWI1Ny4KLXBhcnNlci5wYXJzZS4yPVx1NWI1OFx1NTcyOFx1MzA1N1x1MzA2YVx1MzA0NFx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1NzU2YVx1NTNmN1x1MzA2N1x1MzA1OS4KLXBhcnNlci5uZXh0LjE9XFwgXHUzMDZlXHU1ZjhjXHUzMDZiMVx1NjU4N1x1NWI1N1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OS4KLXBhcnNlci5uZXh0LjI9Jz8nIFx1MzA5Mlx1MzA1M1x1MzA1M1x1MzA2Ylx1NjZmOFx1MzA0Zlx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5My4gXHUzMDgyXHUzMDU3XHUzMDRiXHUzMDU3XHUzMDY2ICcoPzonIFx1MzA0YiAnKD89JyBcdTMwNGIgJyg/IScgXHUzMDRiICcoPzwnIFx1MzA0YiAnKD8jJyBcdTMwNGIgJyg/PicgXHUzMDY3XHUzMDU5XHUzMDRiPwotcGFyc2VyLm5leHQuMz0nKD88PScgXHUzMDRiICcoPzwhJyBcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkuCi1wYXJzZXIubmV4dC40PVx1OGEzYlx1OTFjOFx1MzA0Y1x1OTU4OVx1MzA1OFx1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5My4KLXBhcnNlci5mYWN0b3IuMT0nKScgXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5LgotcGFyc2VyLmZhY3Rvci4yPVx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmM1x1NGVkOFx1MzA0ZFx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA2ZVx1NGUyZFx1MzA2N1x1MzBkMVx1MzBiZlx1MzBmY1x1MzBmM1x1MzA0Y1x1N2Q0Mlx1NGU4Nlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4KLXBhcnNlci5mYWN0b3IuMz0nOicgXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5LgotcGFyc2VyLmZhY3Rvci40PVx1Njc2MVx1NGVmNlx1NGVkOFx1MzA0ZFx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA2ZVx1NGUyZFx1MzA2N1x1MzBkMVx1MzBiZlx1MzBmY1x1MzBmM1x1MzA0Y1x1N2Q0Mlx1NGU4Nlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4KLXBhcnNlci5mYWN0b3IuNT1cdTY3NjFcdTRlZjZcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjNcdTMwNmJcdTMwNmZcdTMwMDFcdTVmOGNcdTY1YjlcdTUzYzJcdTcxNjdcdTMwZmJcdTMwYTJcdTMwZjNcdTMwYWJcdTMwZmNcdTMwZmJcdTUxNDhcdThhYWRcdTMwN2ZcdTMwZmJcdTVmOGNcdThhYWRcdTMwN2ZcdTMwNmVcdTMwN2ZcdTRmN2ZcdTc1MjhcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNTkuCi1wYXJzZXIuZmFjdG9yLjY9XHU2NzYxXHU0ZWY2XHU0ZWQ4XHUzMDRkXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMDZlXHU0ZTJkXHUzMDZiM1x1NTAwYlx1NGVlNVx1NGUwYVx1MzA2ZVx1OTA3OFx1NjI5ZVx1MzA5Mlx1NjZmOFx1MzA0Zlx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5My4KLXBhcnNlci5hdG9tLjE9XFxjIFx1MzA2ZVx1NWY4Y1x1MzA2Ylx1MzA2Zlx1MzBiM1x1MzBmY1x1MzBjOVx1MzBkZFx1MzBhNFx1MzBmM1x1MzBjOFx1MzA0YyBVKzAwNDBcdWZmNWVVKzAwNWYgXHUzMDZlXHU3YmM0XHU1NmYyXHUzMDZlXHU2NTg3XHU1YjU3XHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5LgotcGFyc2VyLmF0b20uMj0xXHU2NTg3XHU1YjU3XHUzMDZlXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHU2NTg3XHU1YjU3XHUzMDRiICd7JyBcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkuCi1wYXJzZXIuYXRvbS4zPVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1NTQwZFx1MzA0YyAnfScgXHUzMDY3XHU5NTg5XHUzMDU4XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzLgotcGFyc2VyLmF0b20uND1cdTMwZTFcdTMwYmZcdTY1ODdcdTViNTdcdTMwNGNcdTU5MDlcdTMwNmFcdTMwNjhcdTMwNTNcdTMwOGRcdTMwNmJcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTkuCi1wYXJzZXIuYXRvbS41PVx1NjcyYVx1NzdlNVx1MzA2ZVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1NTQwZFx1MzA2N1x1MzA1OS4KLXBhcnNlci5jYy4xPVBPU0lYIFx1NjU4N1x1NWI1N1x1MzBhZlx1MzBlOVx1MzBiOVx1MzA2ZiAnOl0nIFx1MzA2N1x1OTU4OVx1MzA1OFx1MzA4Ylx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OS4KLXBhcnNlci5jYy4yPVx1NjU4N1x1NWI1N1x1MzBhZlx1MzBlOVx1MzBiOVx1NTE4NVx1MzA2N1x1MzBkMVx1MzBiZlx1MzBmY1x1MzBmM1x1MzA0Y1x1N2Q0Mlx1NGU4Nlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4KLXBhcnNlci5jYy4zPVx1NjcyYVx1NzdlNVx1MzA2ZSBQT1NJWCBcdTY1ODdcdTViNTdcdTMwYWZcdTMwZTlcdTMwYjlcdTU0MGRcdTMwNjdcdTMwNTkuCi1wYXJzZXIuY2MuND1cdTMwNTNcdTMwNTNcdTMwNmIgJy0nIFx1MzA5Mlx1NjZmOFx1MzA0Zlx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5My4KLXBhcnNlci5jYy41PSddJyBcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkuCi1wYXJzZXIuY2MuNj1cdTY1ODdcdTViNTdcdTMwYWZcdTMwZTlcdTMwYjlcdTUxODVcdTMwNjdcdTMwNmYgJ1snIFx1MzA5Mlx1NzZmNFx1NjNhNVx1NjZmOFx1MzA0Zlx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5My4gJ1xcWycgXHUzMDY4XHU2NmY4XHUzMDQ0XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0LgotcGFyc2VyLmNjLjc9XHU2NTg3XHU1YjU3XHUzMGFmXHUzMGU5XHUzMGI5XHU1MTg1XHUzMDY3XHUzMDZmICddJyBcdTMwOTJcdTc2ZjRcdTYzYTVcdTY2ZjhcdTMwNGZcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMuICdcXF0nIFx1MzA2OFx1NjZmOFx1MzA0NFx1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NC4KLXBhcnNlci5vcGUuMT0nWycgXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5LgotcGFyc2VyLm9wZS4yPScpJyBcdTMwNGIgJy1bJyBcdTMwNGIgJytbJyBcdTMwNGIgJyZbJyBcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkuCi1wYXJzZXIuZGVzY2FwZS4xPVx1MzBiM1x1MzBmY1x1MzBjOVx1MzBkZFx1MzBhNFx1MzBmM1x1MzBjOFx1MzA2ZTE2XHU5MDMyXHU2NTcwXHU4ODY4XHU4YTE4XHU0ZTJkXHUzMDZiXHU5NTkzXHU5MDU1XHUzMDYzXHUzMDVmXHU2NTg3XHU1YjU3XHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5LgotcGFyc2VyLmRlc2NhcGUuMj1cdTMwYjNcdTMwZmNcdTMwYzlcdTMwZGRcdTMwYTRcdTMwZjNcdTMwYzhcdTMwNmVcdTY1NzBcdTUwMjRcdTMwNGNcdTU5MjdcdTMwNGRcdTMwNTlcdTMwNGVcdTMwN2VcdTMwNTkuCi1wYXJzZXIuZGVzY2FwZS4zPSdcXHh7JyBcdTMwNmYgJ30nIFx1MzA2N1x1OTU4OVx1MzA1OFx1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5My4KLXBhcnNlci5kZXNjYXBlLjQ9VW5pY29kZSBcdTMwNmVcdTMwYjNcdTMwZmNcdTMwYzlcdTMwZGRcdTMwYTRcdTMwZjNcdTMwYzhcdTMwNjhcdTMwNTdcdTMwNjZcdTRlMGRcdTZiNjNcdTMwNjdcdTMwNTkuCi1wYXJzZXIuZGVzY2FwZS41PVx1MzBhMlx1MzBmM1x1MzBhYlx1MzBmY1x1MzA5Mlx1MzA1M1x1MzA1M1x1MzA2Ylx1NjZmOFx1MzA0Zlx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5My4KLXBhcnNlci5wcm9jZXNzLjE9XHUzMDUzXHUzMDZlXHU4ODY4XHU3M2ZlXHUzMDZmXHU3M2ZlXHU1NzI4XHUzMDZlXHUzMGFhXHUzMGQ3XHUzMGI3XHUzMGU3XHUzMGYzXHU4YTJkXHU1YjlhXHUzMDY3XHUzMDZmXHU0ZjdmXHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzLgpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL0J1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZjEyZTEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOTIgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQXR0cmlidXRlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQYXJ0aWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQXR0cmlidXRlTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbEludGVnZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sU3RyaW5nSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlNjaGVtYVJlZ3VsYXJFeHByZXNzaW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1wdWJsaWMgY2xhc3MgQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0gZXh0ZW5kcyBTY2hlbWFUeXBlTG9hZGVyQmFzZSBpbXBsZW1lbnRzIFNjaGVtYVR5cGVTeXN0ZW0KLXsKLSAgICAvLyBUaGUgZ2xvYmFsIGJ1aWx0aW4gdHlwZSBzeXN0ZW0KLSAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0KCkKLSAgICAgICAgeyByZXR1cm4gX2dsb2JhbDsgfQotCi0gICAgLy8gc29tZSBjb25zdGFudHMgdGhhdCBuZWVkIHRvIGJlIGluaXRpYWxpemVkIGVhcmx5Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZVtdIEVNUFRZX1NDSEVNQVRZUEVfQVJSQVkgPSBuZXcgU2NoZW1hVHlwZVswXTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlLlJlZltdIEVNUFRZX1NDSEVNQVRZUEVSRUZfQVJSQVkgPSBuZXcgU2NoZW1hVHlwZS5SZWZbMF07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2NoZW1hR2xvYmFsRWxlbWVudFtdIEVNUFRZX1NDSEVNQUVMRU1FTlRfQVJSQVkgPSBuZXcgU2NoZW1hR2xvYmFsRWxlbWVudFswXTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbXSBFTVBUWV9TQ0hFTUFBVFRSSUJVVEVfQVJSQVkgPSBuZXcgU2NoZW1hR2xvYmFsQXR0cmlidXRlWzBdOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNjaGVtYU1vZGVsR3JvdXBbXSBFTVBUWV9TQ0hFTUFNT0RFTEdST1VQX0FSUkFZID0gbmV3IFNjaGVtYU1vZGVsR3JvdXBbMF07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2NoZW1hQXR0cmlidXRlR3JvdXBbXSBFTVBUWV9TQ0hFTUFBVFRSSUJVVEVHUk9VUF9BUlJBWSA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVHcm91cFswXTsKLQotICAgIHByaXZhdGUgc3RhdGljIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtIF9nbG9iYWwgPSBuZXcgQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0oKTsKLQotICAgIC8vIFVSIHR5cGVzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9BTllfVFlQRSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfQU5ZX1RZUEUpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfQU5ZX1NJTVBMRSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRSk7Ci0KLSAgICAvLyBwcmltaXRpdmVzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9CT09MRUFOID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19CT09MRUFOKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0JBU0VfNjRfQklOQVJZID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9IRVhfQklOQVJZID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0FOWV9VUkkgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0FOWV9VUkkpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfUU5BTUUgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX1FOQU1FKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX05PVEFUSU9OID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19OT1RBVElPTik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9GTE9BVCA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfRkxPQVQpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfRE9VQkxFID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19ET1VCTEUpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfREVDSU1BTCA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfREVDSU1BTCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9TVFJJTkcgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX1NUUklORyk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0RVUkFUSU9OID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19EVVJBVElPTik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9EQVRFX1RJTUUgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9USU1FID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19USU1FKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0RBVEUgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0RBVEUpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfR19ZRUFSX01PTlRIID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEgpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfR19ZRUFSID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19HX1lFQVIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfR19NT05USF9EQVkgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0dfREFZID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19HX0RBWSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9HX01PTlRIID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19HX01PTlRIKTsKLQotICAgIC8vIGRlcml2ZWQgbnVtZXJpY3MKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0lOVEVHRVIgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0lOVEVHRVIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfTE9ORyA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfTE9ORyk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9JTlQgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0lOVCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9TSE9SVCA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfU0hPUlQpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfQllURSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfQllURSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9OT05fUE9TSVRJVkVfSU5URUdFUiA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfTk9OX1BPU0lUSVZFX0lOVEVHRVIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfTkVHQVRJVkVfSU5URUdFUiA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfTkVHQVRJVkVfSU5URUdFUik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9OT05fTkVHQVRJVkVfSU5URUdFUiA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfTk9OX05FR0FUSVZFX0lOVEVHRVIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfUE9TSVRJVkVfSU5URUdFUiA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfUE9TSVRJVkVfSU5URUdFUik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9VTlNJR05FRF9MT05HID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9MT05HKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX1VOU0lHTkVEX0lOVCA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfVU5TSUdORURfSU5UKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX1VOU0lHTkVEX1NIT1JUID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9TSE9SVCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9VTlNJR05FRF9CWVRFID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9CWVRFKTsKLQotICAgIC8vIGRlcml2ZWQgc3RyaW5ncwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfTk9STUFMSVpFRF9TVFJJTkcgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX05PUk1BTElaRURfU1RSSU5HKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX1RPS0VOID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19UT0tFTik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9OQU1FID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19OQU1FKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX05DTkFNRSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfTkNOQU1FKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0xBTkdVQUdFID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19MQU5HVUFHRSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9JRCA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfSUQpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfSURSRUYgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0lEUkVGKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0lEUkVGUyA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfSURSRUZTKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0VOVElUWSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfRU5USVRZKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0VOVElUSUVTID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19FTlRJVElFUyk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9OTVRPS0VOID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19OTVRPS0VOKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX05NVE9LRU5TID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19OTVRPS0VOUyk7Ci0KLSAgICAvLyB0aGUgbm8tdHlwZQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfTk9fVFlQRSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfTk9UX0JVSUxUSU4pOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWYgWE1MU1RSX1BSRVNFUlZFID0gYnVpbGRTdHJpbmcoInByZXNlcnZlIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWYgWE1MU1RSX1JFUExBQ0UgPSBidWlsZFN0cmluZygicHJlc2VydmUiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZiBYTUxTVFJfQ09MTEFQU0UgPSBidWlsZFN0cmluZygicHJlc2VydmUiKTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX05PTkUgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbltdIEZJWEVEX0ZBQ0VUU19OT05FID0gbmV3IGJvb2xlYW5bXQotICAgICAgICB7IGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCi0gICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfV1NfQ09MTEFQU0UgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX1dTX1JFUExBQ0UgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19SRVBMQUNFKSwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfV1NfUFJFU0VSVkUgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19QUkVTRVJWRSksIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX0lOVEVHRVIgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksCi0gICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX0xPTkcgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NSU5fVkFMVUUpKSwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZihMb25nLk1BWF9WQUxVRSkpLCBudWxsLCBudWxsLCBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLAotICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19JTlQgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YoSW50ZWdlci5NSU5fVkFMVUUpKSwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZihJbnRlZ2VyLk1BWF9WQUxVRSkpLCBudWxsLCBudWxsLCBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLAotICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19TSE9SVCA9IG5ldyBYbWxWYWx1ZVJlZltdCi0gICAgICAgIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZihTaG9ydC5NSU5fVkFMVUUpKSwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZihTaG9ydC5NQVhfVkFMVUUpKSwgbnVsbCwgbnVsbCwgYnVpbGRObkludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwKLSAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX0NPTExBUFNFKSwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfQllURSA9IG5ldyBYbWxWYWx1ZVJlZltdCi0gICAgICAgIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZihCeXRlLk1JTl9WQUxVRSkpLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKEJ5dGUuTUFYX1ZBTFVFKSksIG51bGwsIG51bGwsIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksCi0gICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX05PTk5FR0FUSVZFID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwgbnVsbCwgbnVsbCwgbnVsbCwgYnVpbGRObkludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwKLSAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX0NPTExBUFNFKSwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfUE9TSVRJVkUgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLk9ORSksIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksCi0gICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX05PTlBPU0lUSVZFID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwgbnVsbCwgbnVsbCwgYnVpbGRObkludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwKLSAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX0NPTExBUFNFKSwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfTkVHQVRJVkUgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLk9ORS5uZWdhdGUoKSksIG51bGwsIG51bGwsIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksCi0gICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX1VOU0lHTkVEX0xPTkcgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLCBidWlsZEludGVnZXIobmV3IEJpZ0ludGVnZXIoIjE4NDQ2NzQ0MDczNzA5NTUxNjE1IikpLCBudWxsLCBudWxsLCBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLAotICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19VTlNJR05FRF9JTlQgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKDQyOTQ5NjcyOTVMKSksIG51bGwsIG51bGwsIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksCi0gICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX1VOU0lHTkVEX1NIT1JUID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZig2NTUzNSkpLCBudWxsLCBudWxsLCBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLAotICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19VTlNJR05FRF9CWVRFID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZigyNTUpKSwgbnVsbCwgbnVsbCwgYnVpbGRObkludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwKLSAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX0NPTExBUFNFKSwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfQlVJTFRJTl9MSVNUID0gbmV3IFhtbFZhbHVlUmVmW10KLSAgICAgICAgeyBudWxsLCBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyLk9ORSksIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW5bXSBGSVhFRF9GQUNFVFNfV1MgPSBuZXcgYm9vbGVhbltdCi0gICAgICAgIHsgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwKLSAgICAgICAgICB0cnVlLCBmYWxzZSwgZmFsc2UgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW5bXSBGSVhFRF9GQUNFVFNfSU5URUdFUiA9IG5ldyBib29sZWFuW10KLSAgICAgICAgeyBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsCi0gICAgICAgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlIH07Ci0KLSAgICBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfVU5JT04gPSBGQUNFVFNfTk9ORTsKLSAgICBmaW5hbCBzdGF0aWMgYm9vbGVhbltdIEZJWEVEX0ZBQ0VUU19VTklPTiA9IEZJWEVEX0ZBQ0VUU19OT05FOwotCi0gICAgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX0xJU1QgPSBGQUNFVFNfV1NfQ09MTEFQU0U7Ci0gICAgZmluYWwgc3RhdGljIGJvb2xlYW5bXSBGSVhFRF9GQUNFVFNfTElTVCA9IEZJWEVEX0ZBQ0VUU19XUzsKLQotCi0gICAgLyoKLSAgICAgKiBMQVNUIFN0YXRpYyBpbml0aWFsaXplcgotICAgICAqLwotICAgIHN0YXRpYyB7Ci0gICAgICAgIGZvciAoaW50IGkgPSBTY2hlbWFUeXBlLkJUQ19OT1RfQlVJTFRJTjsgaSA8PSBTY2hlbWFUeXBlLkJUQ19MQVNUX0JVSUxUSU47IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgX2dsb2JhbC5maWxsSW5UeXBlKGkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXAgX3R5cGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgU2NoZW1hVHlwZUltcGxbXSBfdHlwZUFycmF5ID0gbmV3IFNjaGVtYVR5cGVJbXBsW1NjaGVtYVR5cGUuQlRDX0xBU1RfQlVJTFRJTiArIDFdOwotICAgIHByaXZhdGUgTWFwIF9oYW5kbGVzVG9PYmplY3RzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIE1hcCBfb2JqZWN0c1RvSGFuZGxlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX3R5cGVzQnlDbGFzc25hbWUgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlSW1wbCBnZXRCdWlsdGluVHlwZShpbnQgYnRjKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90eXBlQXJyYXlbYnRjXTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtKCkKLSAgICB7Ci0gICAgICAgIC8vIFVSIHR5cGVzCi0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19BTllfVFlQRSwgImFueVR5cGUiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3QiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEUsICJhbnlTaW1wbGVUeXBlIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZSIpOwotCi0gICAgICAgIC8vIHByaW1pdGl2ZXMKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0JPT0xFQU4sICJib29sZWFuIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQm9vbGVhbiIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlksICJiYXNlNjRCaW5hcnkiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxCYXNlNjRCaW5hcnkiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlksICJoZXhCaW5hcnkiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxIZXhCaW5hcnkiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0FOWV9VUkksICJhbnlVUkkiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlVUkkiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX1FOQU1FLCAiUU5hbWUiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxRTmFtZSIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfTk9UQVRJT04sICJOT1RBVElPTiIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5PVEFUSU9OIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19GTE9BVCwgImZsb2F0IiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRmxvYXQiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0RPVUJMRSwgImRvdWJsZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERvdWJsZSIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfREVDSU1BTCwgImRlY2ltYWwiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxEZWNpbWFsIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19TVFJJTkcsICJzdHJpbmciLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxTdHJpbmciKTsKLQotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfRFVSQVRJT04sICJkdXJhdGlvbiIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbER1cmF0aW9uIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUUsICJkYXRlVGltZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERhdGVUaW1lIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19USU1FLCAidGltZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFRpbWUiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0RBVEUsICJkYXRlIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGF0ZSIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRILCAiZ1llYXJNb250aCIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEdZZWFyTW9udGgiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0dfWUVBUiwgImdZZWFyIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sR1llYXIiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZLCAiZ01vbnRoRGF5IiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sR01vbnRoRGF5Iik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19HX0RBWSwgImdEYXkiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxHRGF5Iik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19HX01PTlRILCAiZ01vbnRoIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sR01vbnRoIik7Ci0KLSAgICAgICAgLy8gZGVyaXZlZCBudW1lcmljcwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfSU5URUdFUiwgImludGVnZXIiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnRlZ2VyIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19MT05HLCAibG9uZyIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbExvbmciKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0lOVCwgImludCIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludCIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfU0hPUlQsICJzaG9ydCIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFNob3J0Iik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19CWVRFLCAiYnl0ZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJ5dGUiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX05PTl9QT1NJVElWRV9JTlRFR0VSLCAibm9uUG9zaXRpdmVJbnRlZ2VyIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19ORUdBVElWRV9JTlRFR0VSLCAibmVnYXRpdmVJbnRlZ2VyIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTmVnYXRpdmVJbnRlZ2VyIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19OT05fTkVHQVRJVkVfSU5URUdFUiwgIm5vbk5lZ2F0aXZlSW50ZWdlciIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5vbk5lZ2F0aXZlSW50ZWdlciIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfUE9TSVRJVkVfSU5URUdFUiwgInBvc2l0aXZlSW50ZWdlciIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFBvc2l0aXZlSW50ZWdlciIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfVU5TSUdORURfTE9ORywgInVuc2lnbmVkTG9uZyIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFVuc2lnbmVkTG9uZyIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfVU5TSUdORURfSU5ULCAidW5zaWduZWRJbnQiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxVbnNpZ25lZEludCIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfVU5TSUdORURfU0hPUlQsICJ1bnNpZ25lZFNob3J0IiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sVW5zaWduZWRTaG9ydCIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfVU5TSUdORURfQllURSwgInVuc2lnbmVkQnl0ZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFVuc2lnbmVkQnl0ZSIpOwotCi0gICAgICAgIC8vIGRlcml2ZWQgc3RyaW5ncwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfTk9STUFMSVpFRF9TVFJJTkcsICJub3JtYWxpemVkU3RyaW5nIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTm9ybWFsaXplZFN0cmluZyIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfVE9LRU4sICJ0b2tlbiIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFRva2VuIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19OQU1FLCAiTmFtZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5hbWUiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX05DTkFNRSwgIk5DTmFtZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5DTmFtZSIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfTEFOR1VBR0UsICJsYW5ndWFnZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbExhbmd1YWdlIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19JRCwgIklEIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSUQiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0lEUkVGLCAiSURSRUYiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxJRFJFRiIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfSURSRUZTLCAiSURSRUZTIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSURSRUZTIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19FTlRJVFksICJFTlRJVFkiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxFTlRJVFkiKTsKLSAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0VOVElUSUVTLCAiRU5USVRJRVMiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxFTlRJVElFUyIpOwotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfTk1UT0tFTiwgIk5NVE9LRU4iLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxOTVRPS0VOIik7Ci0gICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19OTVRPS0VOUywgIk5NVE9LRU5TIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTk1UT0tFTlMiKTsKLQotICAgICAgICAvLyB0aGUgbm8tdHlwZQotICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfTk9UX0JVSUxUSU4sIG51bGwsIG51bGwpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJzY2hlbWEudHlwZXN5c3RlbS5idWlsdGluIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZURlZmluZWQoU3RyaW5nIG5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGZpbmRUeXBlKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGUpX3R5cGVNYXAuZ2V0KG5hbWUpOwotICAgIH0KLQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZmluZERvY3VtZW50VHlwZShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZmluZEF0dHJpYnV0ZVR5cGUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxFbGVtZW50IGZpbmRFbGVtZW50KFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsQXR0cmlidXRlIGZpbmRBdHRyaWJ1dGUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlLlJlZiBmaW5kVHlwZVJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZSB0eXBlID0gZmluZFR5cGUobmFtZSk7Ci0gICAgICAgIHJldHVybiAodHlwZSA9PSBudWxsID8gbnVsbCA6IHR5cGUuZ2V0UmVmKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlLlJlZiBmaW5kRG9jdW1lbnRUeXBlUmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZmluZEF0dHJpYnV0ZVR5cGVSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxFbGVtZW50LlJlZiBmaW5kRWxlbWVudFJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZS5SZWYgZmluZEF0dHJpYnV0ZVJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYU1vZGVsR3JvdXAuUmVmIGZpbmRNb2RlbEdyb3VwUmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlR3JvdXAuUmVmIGZpbmRBdHRyaWJ1dGVHcm91cFJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWYgZmluZElkZW50aXR5Q29uc3RyYWludFJlZihRTmFtZSBuYW1lKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHR5cGVGb3JDbGFzc25hbWUoU3RyaW5nIGNsYXNzbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU2NoZW1hVHlwZSlfdHlwZXNCeUNsYXNzbmFtZS5nZXQoY2xhc3NuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0U291cmNlQXNTdHJlYW0oU3RyaW5nIHNvdXJjZU5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsgLy8gYnVpbHRpbiBzY2hlbWEgdHlwZSBzeXN0ZW0gaGFzIG5vIHNvdXJjZS4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgdHlwZXMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVtdIGdsb2JhbFR5cGVzKCkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGVbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZVtfdHlwZUFycmF5Lmxlbmd0aCAtIDFdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF90eXBlQXJyYXksIDEsIHJlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZG9jdW1lbnQgdHlwZXMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVtdIGRvY3VtZW50VHlwZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEVNUFRZX1NDSEVNQVRZUEVfQVJSQVk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXR0cmlidXRlIHR5cGVzIGRlZmluZWQgaW4gdGhpcyBsb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYVR5cGVbXSBhdHRyaWJ1dGVUeXBlcygpCi0gICAgewotICAgICAgICByZXR1cm4gRU1QVFlfU0NIRU1BVFlQRV9BUlJBWTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudFtdIGdsb2JhbEVsZW1lbnRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFTVBUWV9TQ0hFTUFFTEVNRU5UX0FSUkFZOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGdsb2JhbCBhdHRyaWJ1dGVzIGRlZmluZWQgaW4gdGhpcyBsb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZVtdIGdsb2JhbEF0dHJpYnV0ZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEVNUFRZX1NDSEVNQUFUVFJJQlVURV9BUlJBWTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtb2RlbCBncm91cHMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cFtdIG1vZGVsR3JvdXBzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFTVBUWV9TQ0hFTUFNT0RFTEdST1VQX0FSUkFZOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBncm91cHMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlR3JvdXBbXSBhdHRyaWJ1dGVHcm91cHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEVNUFRZX1NDSEVNQUFUVFJJQlVURUdST1VQX0FSUkFZOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhhbmRsZSBmb3IgdGhlIGdpdmVuIHR5cGUgd2l0aGluIHRoaXMgbG9hZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgaGFuZGxlRm9yVHlwZShTY2hlbWFUeXBlIHR5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZylfb2JqZWN0c1RvSGFuZGxlcy5nZXQodHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2xhc3Nsb2FkZXIgdXNlZCBieSB0aGlzIGxvYWRlciBmb3IgcmVzb2x2aW5nIHR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyB0aGlzIHR5cGUgdG8gYSBkaXJlY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2F2ZVRvRGlyZWN0b3J5KEZpbGUgY2xhc3NEaXIpCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSBidWlsdGluIHNjaGVtYSB0eXBlIHN5c3RlbSBjYW5ub3QgYmUgc2F2ZWQuIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgWG1sVmFsdWVSZWYgYnVpbGRfd3NzdHJpbmcoaW50IHdzcikKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAod3NyKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuV1NfUFJFU0VSVkU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFhNTFNUUl9QUkVTRVJWRTsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5XU19SRVBMQUNFOgotICAgICAgICAgICAgICAgIHJldHVybiBYTUxTVFJfUkVQTEFDRTsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5XU19DT0xMQVBTRToKLSAgICAgICAgICAgICAgICByZXR1cm4gWE1MU1RSX0NPTExBUFNFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFhtbFZhbHVlUmVmIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIgYmlnSW50KQotICAgIHsKLSAgICAgICAgaWYgKGJpZ0ludCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIGlmIChiaWdJbnQuc2lnbnVtKCkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxJbnRlZ2VySW1wbCBpID0gbmV3IFhtbEludGVnZXJJbXBsKCk7Ci0gICAgICAgICAgICBpLnNldChiaWdJbnQpOwotICAgICAgICAgICAgaS5zZXRJbW11dGFibGUoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVmFsdWVSZWYoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFhtbFZhbHVlUmVmIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyIGJpZ0ludCkKLSAgICB7Ci0gICAgICAgIGlmIChiaWdJbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sSW50ZWdlckltcGwgaSA9IG5ldyBYbWxJbnRlZ2VySW1wbCgpOwotICAgICAgICAgICAgaS5zZXQoYmlnSW50KTsKLSAgICAgICAgICAgIGkuc2V0SW1tdXRhYmxlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFhtbFZhbHVlUmVmKGkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBYbWxWYWx1ZVJlZiBidWlsZFN0cmluZyhTdHJpbmcgc3RyKQotICAgIHsKLSAgICAgICAgaWYgKHN0ciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbFN0cmluZ0ltcGwgaSA9IG5ldyBYbWxTdHJpbmdJbXBsKCk7Ci0gICAgICAgICAgICBpLnNldChzdHIpOwotICAgICAgICAgICAgaS5zZXRJbW11dGFibGUoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVmFsdWVSZWYoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXR1cEJ1aWx0aW4oaW50IGJ0YywgU3RyaW5nIGxvY2FsbmFtZSwgU3RyaW5nIGNsYXNzbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHJlc3VsdCA9IG5ldyBTY2hlbWFUeXBlSW1wbCh0aGlzLCB0cnVlKTsKLSAgICAgICAgUU5hbWUgbmFtZSA9IGxvY2FsbmFtZSA9PSBudWxsID8gbnVsbCA6IFFOYW1lSGVscGVyLmZvckxOUyhsb2NhbG5hbWUsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICBTdHJpbmcgaGFuZGxlID0gIl9CSV8iICsgKGxvY2FsbmFtZSA9PSBudWxsID8gIk5PX1RZUEUiIDogbG9jYWxuYW1lKTsKLSAgICAgICAgcmVzdWx0LnNldE5hbWUobmFtZSk7Ci0gICAgICAgIHJlc3VsdC5zZXRCdWlsdGluVHlwZUNvZGUoYnRjKTsKLSAgICAgICAgaWYgKGNsYXNzbmFtZSAhPSBudWxsKQotICAgICAgICAgICAgcmVzdWx0LnNldEZ1bGxKYXZhTmFtZShjbGFzc25hbWUpOwotCi0gICAgICAgIF90eXBlQXJyYXlbYnRjXSA9IHJlc3VsdDsKLSAgICAgICAgX3R5cGVNYXAucHV0KG5hbWUsIHJlc3VsdCk7Ci0gICAgICAgIF9oYW5kbGVzVG9PYmplY3RzLnB1dChoYW5kbGUsIHJlc3VsdCk7Ci0gICAgICAgIF9vYmplY3RzVG9IYW5kbGVzLnB1dChyZXN1bHQsIGhhbmRsZSk7Ci0gICAgICAgIGlmIChjbGFzc25hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIF90eXBlc0J5Q2xhc3NuYW1lLnB1dChjbGFzc25hbWUsIHJlc3VsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzb2x2ZSgpCi0gICAgewotICAgICAgICAvLyB3ZSdyZSBib3JuIHJlc29sdmVkIGFuZCBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLgotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHR5cGVGb3JIYW5kbGUoU3RyaW5nIGhhbmRsZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU2NoZW1hVHlwZSlfaGFuZGxlc1RvT2JqZWN0cy5nZXQoaGFuZGxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQ29tcG9uZW50IHJlc29sdmVIYW5kbGUoU3RyaW5nIGhhbmRsZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU2NoZW1hQ29tcG9uZW50KV9oYW5kbGVzVG9PYmplY3RzLmdldChoYW5kbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExpbmtzIGEgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaWxsSW5UeXBlKGludCBidGMpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlSW1wbCByZXN1bHQgPSBnZXRCdWlsdGluVHlwZShidGMpOwotICAgICAgICBTY2hlbWFUeXBlIGJhc2U7Ci0gICAgICAgIFNjaGVtYVR5cGUgaXRlbSA9IG51bGw7Ci0gICAgICAgIGludCB2YXJpZXR5ID0gU2NoZW1hVHlwZS5BVE9NSUM7Ci0gICAgICAgIGludCBkZXJpdmF0aW9uVHlwZSA9IFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT047Ci0KLSAgICAgICAgc3dpdGNoIChidGMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UX0JVSUxUSU46Ci0gICAgICAgICAgICAgICAgdmFyaWV0eSA9IFNjaGVtYVR5cGUuTk9UX1NJTVBMRTsKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfQU5ZX1RZUEU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1RZUEU6Ci0gICAgICAgICAgICAgICAgdmFyaWV0eSA9IFNjaGVtYVR5cGUuTk9UX1NJTVBMRTsKLSAgICAgICAgICAgICAgICBiYXNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBkZXJpdmF0aW9uVHlwZSA9IFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT047Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9BTllfVFlQRTsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9VUkk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19USU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9BTllfU0lNUExFOyBicmVhazsKLQotICAgICAgICAgICAgLy8gZGVyaXZlZCBudW1lcmljcwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JTlRFR0VSOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9ERUNJTUFMOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19MT05HOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9JTlRFR0VSOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JTlQ6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX0xPTkc7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NIT1JUOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9JTlQ7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JZVEU6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX1NIT1JUOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT05fUE9TSVRJVkVfSU5URUdFUjoKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfSU5URUdFUjsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTkVHQVRJVkVfSU5URUdFUjoKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfTk9OX1BPU0lUSVZFX0lOVEVHRVI7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PTl9ORUdBVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9JTlRFR0VSOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19QT1NJVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9OT05fTkVHQVRJVkVfSU5URUdFUjsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfTE9ORzoKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfTk9OX05FR0FUSVZFX0lOVEVHRVI7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0lOVDoKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfVU5TSUdORURfTE9ORzsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX1VOU0lHTkVEX0lOVDsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfQllURToKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfVU5TSUdORURfU0hPUlQ7IGJyZWFrOwotCi0gICAgICAgICAgICAvLyBkZXJpdmVkIHN0cmluZ3MKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9STUFMSVpFRF9TVFJJTkc6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX1NUUklORzsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVE9LRU46Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX05PUk1BTElaRURfU1RSSU5HOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OQU1FOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9UT0tFTjsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTkNOQU1FOgotICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9OQU1FOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JRDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSURSRUY6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0VOVElUWToKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfTkNOQU1FOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19MQU5HVUFHRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk1UT0tFTjoKLSAgICAgICAgICAgICAgICBiYXNlID0gU1RfVE9LRU47IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lEUkVGUzoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRU5USVRJRVM6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05NVE9LRU5TOgotICAgICAgICAgICAgICAgIHZhcmlldHkgPSBTY2hlbWFUeXBlLkxJU1Q7Ci0gICAgICAgICAgICAgICAgYmFzZSA9IFNUX0FOWV9TSU1QTEU7Ci0gICAgICAgICAgICAgICAgaWYgKGJ0YyA9PSBTY2hlbWFUeXBlLkJUQ19JRFJFRlMpCi0gICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBTVF9JRFJFRjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChidGMgPT0gU2NoZW1hVHlwZS5CVENfRU5USVRJRVMpCi0gICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBTVF9FTlRJVFk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBpdGVtID0gU1RfTk1UT0tFTjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5zZXREZXJpdmF0aW9uVHlwZShkZXJpdmF0aW9uVHlwZSk7Ci0gICAgICAgIHJlc3VsdC5zZXRTaW1wbGVUeXBlVmFyaWV0eSh2YXJpZXR5KTsKLSAgICAgICAgaWYgKHZhcmlldHkgIT0gU2NoZW1hVHlwZS5OT1RfU0lNUExFKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuc2V0U2ltcGxlVHlwZSh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCAoYnRjID09IFNjaGVtYVR5cGUuQlRDX0FOWV9UWVBFIHx8IGJ0YyA9PSBTY2hlbWFUeXBlLkJUQ19OT1RfQlVJTFRJTik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LnNldEJhc2VUeXBlUmVmKGJhc2UgPT0gbnVsbCA/IG51bGwgOiBiYXNlLmdldFJlZigpKTsKLSAgICAgICAgcmVzdWx0LnNldEJhc2VEZXB0aChiYXNlID09IG51bGwgPyAwIDogKChTY2hlbWFUeXBlSW1wbCliYXNlKS5nZXRCYXNlRGVwdGgoKSArIDEpOwotICAgICAgICByZXN1bHQuc2V0TGlzdEl0ZW1UeXBlUmVmKGl0ZW0gPT0gbnVsbCA/IG51bGwgOiBpdGVtLmdldFJlZigpKTsKLSAgICAgICAgaWYgKGJ0YyA+PSBTY2hlbWFUeXBlLkJUQ19GSVJTVF9QUklNSVRJVkUgJiYgYnRjIDw9IFNjaGVtYVR5cGUuQlRDX0xBU1RfUFJJTUlUSVZFKQotICAgICAgICAgICAgcmVzdWx0LnNldFByaW1pdGl2ZVR5cGVSZWYocmVzdWx0LmdldFJlZigpKTsKLSAgICAgICAgZWxzZSBpZiAodmFyaWV0eSA9PSBTY2hlbWFUeXBlLkFUT01JQykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJhc2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJCYXNlIHdhcyBudWxsIGZvciAiICsgYnRjKTsKLSAgICAgICAgICAgIGlmIChiYXNlLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkJhc2UuZ3B0IHdhcyBudWxsIGZvciAiICsgYnRjKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRQcmltaXRpdmVUeXBlUmVmKGJhc2UuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldFJlZigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhtbFZhbHVlUmVmW10gZmFjZXRzOwotICAgICAgICBib29sZWFuW10gZml4ZWRmOwotICAgICAgICBpbnQgd3NyID0gU2NoZW1hVHlwZS5XU19DT0xMQVBTRTsKLSAgICAgICAgaW50IGRlY2ltYWxTaXplID0gU2NoZW1hVHlwZS5OT1RfREVDSU1BTDsKLQotICAgICAgICAvLyBub3cgc2V0IHVwIGZhY2V0cwotICAgICAgICBzd2l0Y2ggKGJ0YykKLSAgICAgICAgewotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9UWVBFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RfQlVJTFRJTjoKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfTk9ORTsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfTk9ORTsKLSAgICAgICAgICAgICAgICB3c3IgPSBTY2hlbWFUeXBlLldTX1VOU1BFQ0lGSUVEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NUUklORzoKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfV1NfUFJFU0VSVkU7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX05PTkU7Ci0gICAgICAgICAgICAgICAgd3NyID0gU2NoZW1hVHlwZS5XU19QUkVTRVJWRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19USU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19XU19DT0xMQVBTRTsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfV1M7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfV1NfQ09MTEFQU0U7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX1dTOwotICAgICAgICAgICAgICAgIGRlY2ltYWxTaXplID0gU2NoZW1hVHlwZS5TSVpFX0JJR19ERUNJTUFMOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvLyBkZXJpdmVkIG51bWVyaWNzCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgZGVjaW1hbFNpemUgPSBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTE9ORzoKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfTE9ORzsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9MT05HOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lOVDoKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfSU5UOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19JTlRFR0VSOwotICAgICAgICAgICAgICAgIGRlY2ltYWxTaXplID0gU2NoZW1hVHlwZS5TSVpFX0lOVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TSE9SVDoKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfU0hPUlQ7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgZGVjaW1hbFNpemUgPSBTY2hlbWFUeXBlLlNJWkVfU0hPUlQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQllURToKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfQllURTsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9CWVRFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PTl9QT1NJVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19OT05QT1NJVElWRTsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ORUdBVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19ORUdBVElWRTsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT05fTkVHQVRJVkVfSU5URUdFUjoKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfTk9OTkVHQVRJVkU7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgZGVjaW1hbFNpemUgPSBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUE9TSVRJVkVfSU5URUdFUjoKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfUE9TSVRJVkU7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgZGVjaW1hbFNpemUgPSBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfTE9ORzoKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfVU5TSUdORURfTE9ORzsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9JTlQ6Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX1VOU0lHTkVEX0lOVDsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9MT05HOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX1NIT1JUOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19VTlNJR05FRF9TSE9SVDsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9JTlQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfQllURToKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfVU5TSUdORURfQllURTsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKLSAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9TSE9SVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotCi0gICAgICAgICAgICAvLyBkZXJpdmVkIHN0cmluZ3MKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9STUFMSVpFRF9TVFJJTkc6Ci0gICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX1dTX1JFUExBQ0U7Ci0gICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX05PTkU7Ci0gICAgICAgICAgICAgICAgd3NyID0gU2NoZW1hVHlwZS5XU19SRVBMQUNFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RPS0VOOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OQU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OQ05BTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0xBTkdVQUdFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JRDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSURSRUY6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lEUkVGUzoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRU5USVRZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OTVRPS0VOOgotICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19XU19DT0xMQVBTRTsKLSAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfTk9ORTsKLSAgICAgICAgICAgICAgICB3c3IgPSBTY2hlbWFUeXBlLldTX0NPTExBUFNFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0VOVElUSUVTOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OTVRPS0VOUzoKLSAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfQlVJTFRJTl9MSVNUOwotICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19OT05FOwotICAgICAgICAgICAgICAgIHdzciA9IFNjaGVtYVR5cGUuV1NfVU5TUEVDSUZJRUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmdW5kYW1lbnRhbCBmYWNldHMKLSAgICAgICAgaW50IG9yZGVyZWQgPSBTY2hlbWFUeXBlLlVOT1JERVJFRDsKLSAgICAgICAgYm9vbGVhbiBpc051bWVyaWMgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBpc0Zpbml0ZSA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGlzQm91bmRlZCA9IGZhbHNlOwotCi0gICAgICAgIHN3aXRjaCAoYnRjKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1RZUEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVF9CVUlMVElOOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVVJJOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PUk1BTElaRURfU1RSSU5HOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19UT0tFTjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTkFNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTkNOQU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19MQU5HVUFHRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSUQ6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lEUkVGOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JRFJFRlM6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0VOVElUWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk1UT0tFTjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRU5USVRJRVM6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05NVE9LRU5TOgotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46Ci0gICAgICAgICAgICAgICAgaXNGaW5pdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSU5URUdFUjoKLSAgICAgICAgICAgICAgICBpc051bWVyaWMgPSB0cnVlOwotICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBTY2hlbWFUeXBlLlRPVEFMX09SREVSOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICAgICAgb3JkZXJlZCA9IFNjaGVtYVR5cGUuUEFSVElBTF9PUkRFUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19MT05HOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JTlQ6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NIT1JUOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CWVRFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT05fUE9TSVRJVkVfSU5URUdFUjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTkVHQVRJVkVfSU5URUdFUjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9OX05FR0FUSVZFX0lOVEVHRVI6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1BPU0lUSVZFX0lOVEVHRVI6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0xPTkc6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0lOVDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfU0hPUlQ6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0JZVEU6Ci0gICAgICAgICAgICAgICAgaXNOdW1lcmljID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBvcmRlcmVkID0gU2NoZW1hVHlwZS5UT1RBTF9PUkRFUjsKLSAgICAgICAgICAgICAgICBpc0Zpbml0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaXNCb3VuZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5zZXRCYXNpY0ZhY2V0cyhmYWNldHMsIGZpeGVkZik7Ci0gICAgICAgIHJlc3VsdC5zZXRXaGl0ZVNwYWNlUnVsZSh3c3IpOwotICAgICAgICByZXN1bHQuc2V0T3JkZXJlZChvcmRlcmVkKTsKLSAgICAgICAgcmVzdWx0LnNldEJvdW5kZWQoaXNCb3VuZGVkKTsKLSAgICAgICAgcmVzdWx0LnNldE51bWVyaWMoaXNOdW1lcmljKTsKLSAgICAgICAgcmVzdWx0LnNldEZpbml0ZShpc0Zpbml0ZSk7Ci0gICAgICAgIHJlc3VsdC5zZXREZWNpbWFsU2l6ZShkZWNpbWFsU2l6ZSk7Ci0gICAgICAgIHJlc3VsdC5zZXRBbm9ueW1vdXNUeXBlUmVmcyhFTVBUWV9TQ0hFTUFUWVBFUkVGX0FSUkFZKTsKLQotICAgICAgICAvLyBUT0RPOiBzZXQgdXAgcGF0dGVybnMgZm9yIE5DTkFNRSwgbGFuZ3VhZ2UsIGV0Yy4KLQotICAgICAgICBTdHJpbmcgcGF0dGVybiA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gaGFzUGF0dGVybiA9IGZhbHNlOwotCi0gICAgICAgIHN3aXRjaCAoYnRjKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0xBTkdVQUdFOgotICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiW2EtekEtWl17MSw4fSgtW2EtekEtWjAtOV17MSw4fSkqIjsgLy8gd2UgdXNlZCB0byBoYXZlIChbYS16QS1aXXsyfXxbaUldLVthLXpBLVpdK3xbeFhdLVthLXpBLVpdezEsOH0pKC1bYS16QS1aXXsxLDh9KSoiLCBidXQgczRzIHVzZXMgdGhlIG1vcmUgbGVuaWVudCBwYXR0ZXJuIHRvIHRoZSBsZWZ0LiAKLSAgICAgICAgICAgICAgICBoYXNQYXR0ZXJuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk1UT0tFTjoKLSAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIlxcYysiOyAKLSAgICAgICAgICAgICAgICBoYXNQYXR0ZXJuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTkFNRToKLSAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIlxcaVxcYyoiOwotICAgICAgICAgICAgICAgIGhhc1BhdHRlcm4gPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OQ05BTUU6Ci0gICAgICAgICAgICAgICAgcGF0dGVybiA9ICJbXFxpLVs6XV1bXFxjLVs6XV0qIjsKLSAgICAgICAgICAgICAgICBoYXNQYXR0ZXJuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLy8gVGhlc2UgdHlwZXMgaW5oZXJpdCB0aGVpciBwYXR0ZXJucwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JRDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSURSRUY6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0VOVElUWToKLSAgICAgICAgICAgICAgICBoYXNQYXR0ZXJuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXR0ZXJuICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbiBwID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7IHAgPSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguU2NoZW1hUmVndWxhckV4cHJlc3Npb24uZm9yUGF0dGVybihwYXR0ZXJuKTsgfQotICAgICAgICAgICAgY2F0Y2ggKG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5QYXJzZUV4Y2VwdGlvbiBlKSB7IGFzc2VydCBmYWxzZTsgfQotICAgICAgICAgICAgcmVzdWx0LnNldFBhdHRlcm5zKG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bXSB7cH0pOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5zZXRQYXR0ZXJuRmFjZXQoaGFzUGF0dGVybik7Ci0KLQotCi0gICAgICAgIC8vIEFOWV9UWVBFIGhhcyB0byBiZSBhYmxlIHRvIGFjdCBsaWtlIGEgY29tcGxleCB0eXBlCi0gICAgICAgIGlmIChidGMgPT0gU2NoZW1hVHlwZS5CVENfQU5ZX1RZUEUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlSW1wbCBjb250ZW50TW9kZWwgPSBuZXcgU2NoZW1hUGFydGljbGVJbXBsKCk7Ci0gICAgICAgICAgICBjb250ZW50TW9kZWwuc2V0UGFydGljbGVUeXBlKFNjaGVtYVBhcnRpY2xlLldJTERDQVJEKTsKLSAgICAgICAgICAgIGNvbnRlbnRNb2RlbC5zZXRXaWxkY2FyZFNldChRTmFtZVNldC5BTEwpOwotICAgICAgICAgICAgY29udGVudE1vZGVsLnNldFdpbGRjYXJkUHJvY2VzcyhTY2hlbWFQYXJ0aWNsZS5MQVgpOwotICAgICAgICAgICAgY29udGVudE1vZGVsLnNldE1pbk9jY3VycyhCaWdJbnRlZ2VyLlpFUk8pOwotICAgICAgICAgICAgY29udGVudE1vZGVsLnNldE1heE9jY3VycyhudWxsKTsKLSAgICAgICAgICAgIGNvbnRlbnRNb2RlbC5zZXRUcmFuc2l0aW9uUnVsZXMoUU5hbWVTZXQuQUxMLCB0cnVlKTsKLSAgICAgICAgICAgIGNvbnRlbnRNb2RlbC5zZXRUcmFuc2l0aW9uTm90ZXMoUU5hbWVTZXQuQUxMLCB0cnVlKTsKLQotICAgICAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsIGF0dHJNb2RlbCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwoKTsKLSAgICAgICAgICAgIGF0dHJNb2RlbC5zZXRXaWxkY2FyZFByb2Nlc3MoU2NoZW1hQXR0cmlidXRlTW9kZWwuTEFYKTsKLSAgICAgICAgICAgIGF0dHJNb2RlbC5zZXRXaWxkY2FyZFNldChRTmFtZVNldC5BTEwpOwotCi0gICAgICAgICAgICByZXN1bHQuc2V0Q29tcGxleFR5cGVWYXJpZXR5KFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVCk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0Q29udGVudE1vZGVsKGNvbnRlbnRNb2RlbCwgYXR0ck1vZGVsLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVAsIENvbGxlY3Rpb25zLkVNUFRZX01BUCwgZmFsc2UpOwotICAgICAgICAgICAgcmVzdWx0LnNldEFub255bW91c1R5cGVSZWZzKEVNUFRZX1NDSEVNQVRZUEVSRUZfQVJSQVkpOwotICAgICAgICAgICAgcmVzdWx0LnNldFdpbGRjYXJkU3VtbWFyeShRTmFtZVNldC5BTEwsIHRydWUsIFFOYW1lU2V0LkFMTCwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYnRjID09IFNjaGVtYVR5cGUuQlRDX05PVF9CVUlMVElOKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBzbyBkb2VzIHRoZSBub190eXBlIDogaXQgcGVybWl0cyBubyBjb250ZW50cyAoYW5kIGV2ZW4gZW1wdHkgY29udGVudHMgaXMgaW52YWxpZCwgYnV0IHRoYXQncyBzcGVjaWFsLWNhc2VkKQotICAgICAgICAgICAgU2NoZW1hUGFydGljbGVJbXBsIGNvbnRlbnRNb2RlbCA9IG51bGw7IC8vIGVtcHR5Ci0gICAgICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwgYXR0ck1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCgpOyAvLyBlbXB0eQotICAgICAgICAgICAgcmVzdWx0LnNldENvbXBsZXhUeXBlVmFyaWV0eShTY2hlbWFUeXBlLkVNUFRZX0NPTlRFTlQpOwotICAgICAgICAgICAgcmVzdWx0LnNldENvbnRlbnRNb2RlbChjb250ZW50TW9kZWwsIGF0dHJNb2RlbCwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVAsIGZhbHNlKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRBbm9ueW1vdXNUeXBlUmVmcyhFTVBUWV9TQ0hFTUFUWVBFUkVGX0FSUkFZKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRXaWxkY2FyZFN1bW1hcnkoUU5hbWVTZXQuRU1QVFksIGZhbHNlLCBRTmFtZVNldC5FTVBUWSwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldE9yZGVyU2Vuc2l0aXZlKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGUgZ2V0Tm9UeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBTVF9OT19UWVBFOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL0NsYXNzTG9hZGVyUmVzb3VyY2VMb2FkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL0NsYXNzTG9hZGVyUmVzb3VyY2VMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxNTMyZC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9DbGFzc0xvYWRlclJlc291cmNlTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NMb2FkZXJSZXNvdXJjZUxvYWRlciBpbXBsZW1lbnRzIFJlc291cmNlTG9hZGVyCi17Ci0gICAgQ2xhc3NMb2FkZXIgX2NsYXNzTG9hZGVyOwotCi0gICAgQ2xhc3NMb2FkZXJSZXNvdXJjZUxvYWRlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgICB7Ci0gICAgICAgIF9jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyByZXNvdXJjZU5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gX2NsYXNzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHt9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9GaWxlUmVzb3VyY2VMb2FkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL0ZpbGVSZXNvdXJjZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTNjZjU1Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL0ZpbGVSZXNvdXJjZUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlUmVzb3VyY2VMb2FkZXIgaW1wbGVtZW50cyBSZXNvdXJjZUxvYWRlcgotewotICAgIHByaXZhdGUgRmlsZSBfZGlyZWN0b3J5OwotICAgIHByaXZhdGUgWmlwRmlsZSBfemlwZmlsZTsKLQotICAgIHB1YmxpYyBGaWxlUmVzb3VyY2VMb2FkZXIoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgICAgICBfZGlyZWN0b3J5ID0gZmlsZTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBfemlwZmlsZSA9IG5ldyBaaXBGaWxlKGZpbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIHJlc291cmNlTmFtZSkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3ppcGZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IF96aXBmaWxlLmdldEVudHJ5KHJlc291cmNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIHJldHVybiBfemlwZmlsZS5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoX2RpcmVjdG9yeSwgcmVzb3VyY2VOYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgIHsKLSAgICAgICAgaWYgKF96aXBmaWxlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF96aXBmaWxlLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBvaCB3ZWxsLgotICAgICAgICAgICAgfQotICAgICAgICAgICAgX3ppcGZpbGUgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9QYXRoUmVzb3VyY2VMb2FkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1BhdGhSZXNvdXJjZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODU2N2U4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1BhdGhSZXNvdXJjZUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFBhdGhSZXNvdXJjZUxvYWRlciBpbXBsZW1lbnRzIFJlc291cmNlTG9hZGVyCi17Ci0gICAgcHJpdmF0ZSBSZXNvdXJjZUxvYWRlcltdIF9wYXRoOwotCi0gICAgcHVibGljIFBhdGhSZXNvdXJjZUxvYWRlcihSZXNvdXJjZUxvYWRlcltdIGxvYWRlcnBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgX3BhdGggPSBuZXcgUmVzb3VyY2VMb2FkZXJbbG9hZGVycGF0aC5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGxvYWRlcnBhdGgsIDAsIF9wYXRoLCAwLCBfcGF0aC5sZW5ndGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXRoUmVzb3VyY2VMb2FkZXIoRmlsZVtdIGZpbGVwYXRoKQotICAgIHsKLSAgICAgICAgTGlzdCBwYXRobGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VMb2FkZXIgcGF0aCA9IG5ldyBGaWxlUmVzb3VyY2VMb2FkZXIoZmlsZXBhdGhbaV0pOwotICAgICAgICAgICAgICAgIHBhdGhsaXN0LmFkZChwYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBjYW4ndCByZWFkIGEgZmlsZSBvbiBjbGFzc3BhdGg/IHNraXAgaXQuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgX3BhdGggPSAoUmVzb3VyY2VMb2FkZXJbXSlwYXRobGlzdC50b0FycmF5KG5ldyBSZXNvdXJjZUxvYWRlcltwYXRobGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgcmVzb3VyY2VOYW1lKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gcmVzdWx0ID0gX3BhdGhbaV0uZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZU5hbWUpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3BhdGhbaV0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBvaCB3ZWxsLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvUmVzb3VyY2VMb2FkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1Jlc291cmNlTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwODM1ZTYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvUmVzb3VyY2VMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VMb2FkZXIKLXsKLSAgICBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyByZXNvdXJjZU5hbWUpOwotICAgIHZvaWQgY2xvc2UoKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OWZhMzcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKLQotcHVibGljIGNsYXNzIFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbCBpbXBsZW1lbnRzIFNjaGVtYUF0dHJpYnV0ZUdyb3VwCi17Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlU3lzdGVtIF90eXBlU3lzdGVtOwotICAgIHByaXZhdGUgUU5hbWUgX25hbWU7Ci0gICAgcHJpdmF0ZSBYbWxPYmplY3QgX3BhcnNlT2JqZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIF9wYXJzZVROUzsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2NoYW1lbGVvbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gX3JlZGVmaW5pdGlvbjsKLQotICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwoU2NoZW1hVHlwZVN5c3RlbSB0eXBlU3lzdGVtKQotICAgIHsKLSAgICAgICAgX3R5cGVTeXN0ZW0gPSB0eXBlU3lzdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwoU2NoZW1hVHlwZVN5c3RlbSB0eXBlU3lzdGVtLCBRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgdGhpcyh0eXBlU3lzdGVtKTsKLSAgICAgICAgX25hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoUU5hbWUgbmFtZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgYm9vbGVhbiBjaGFtZWxlb24sIGJvb2xlYW4gcmVkZWZpbml0aW9uLCBYbWxPYmplY3QgeCkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBfbmFtZSA9PSBudWxsIHx8IG5hbWUuZXF1YWxzKCBfbmFtZSApOwotCi0gICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICAgICAgX3BhcnNlVE5TID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICBfY2hhbWVsZW9uID0gY2hhbWVsZW9uOwotICAgICAgICBfcmVkZWZpbml0aW9uID0gcmVkZWZpbml0aW9uOwotICAgICAgICBfcGFyc2VPYmplY3QgPSB4OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlU3lzdGVtIGdldFR5cGVTeXN0ZW0oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90eXBlU3lzdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIFNjaGVtYUNvbXBvbmVudC5BVFRSSUJVVEVfR1JPVVA7IH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkKLSAgICAgICAgeyByZXR1cm4gX25hbWU7IH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgZ2V0UGFyc2VPYmplY3QoKQotICAgICAgICB7IHJldHVybiBfcGFyc2VPYmplY3Q7IH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgICAgICAgeyByZXR1cm4gX3BhcnNlVE5TOyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYW1lbGVvbk5hbWVzcGFjZSgpCi0gICAgICAgIHsgcmV0dXJuIF9jaGFtZWxlb24gPyBfcGFyc2VUTlMgOiBudWxsOyB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYUF0dHJpYnV0ZUdyb3VwLlJlZiBfc2VsZnJlZiA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYodGhpcyk7Ci0gICAgCi0gICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZUdyb3VwLlJlZiBnZXRSZWYoKQotICAgICAgICB7IHJldHVybiBfc2VsZnJlZjsgfQotCi0gICAgcHVibGljIFNjaGVtYUNvbXBvbmVudC5SZWYgZ2V0Q29tcG9uZW50UmVmKCkKLSAgICAgICAgeyByZXR1cm4gZ2V0UmVmKCk7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVkZWZpbml0aW9uKCkKLSAgICAgICAgeyByZXR1cm4gX3JlZGVmaW5pdGlvbjsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJkOTkyYS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLQotcHVibGljIGNsYXNzIFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCBpbXBsZW1lbnRzIFNjaGVtYUF0dHJpYnV0ZU1vZGVsCi17Ci0gICAgcHJpdmF0ZSBNYXAgYXR0ck1hcDsKLSAgICBwcml2YXRlIFFOYW1lU2V0IHdjU2V0OwotICAgIHByaXZhdGUgaW50IHdjUHJvY2VzczsKLQotICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwoKQotICAgIHsKLSAgICAgICAgYXR0ck1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIHdjU2V0ID0gbnVsbDsKLSAgICAgICAgd2NQcm9jZXNzID0gTk9ORTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKFNjaGVtYUF0dHJpYnV0ZU1vZGVsIHNhbSkKLSAgICB7Ci0gICAgICAgIGF0dHJNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBpZiAoc2FtID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdjU2V0ID0gbnVsbDsKLSAgICAgICAgICAgIHdjUHJvY2VzcyA9IE5PTkU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZVtdIGF0dHJzID0gc2FtLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXR0ck1hcC5wdXQoYXR0cnNbaV0uZ2V0TmFtZSgpLCBhdHRyc1tpXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzYW0uZ2V0V2lsZGNhcmRQcm9jZXNzKCkgIT0gU2NoZW1hQXR0cmlidXRlTW9kZWwuTk9ORSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3Y1NldCA9IHNhbS5nZXRXaWxkY2FyZFNldCgpOwotICAgICAgICAgICAgICAgIHdjUHJvY2VzcyA9IHNhbS5nZXRXaWxkY2FyZFByb2Nlc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTY2hlbWFMb2NhbEF0dHJpYnV0ZVtdIEVNUFRZX1NMQV9BUlJBWSA9IG5ldyBTY2hlbWFMb2NhbEF0dHJpYnV0ZVswXTsKLQotICAgIHB1YmxpYyBTY2hlbWFMb2NhbEF0dHJpYnV0ZVtdIGdldEF0dHJpYnV0ZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTY2hlbWFMb2NhbEF0dHJpYnV0ZVtdKWF0dHJNYXAudmFsdWVzKCkudG9BcnJheShFTVBUWV9TTEFfQVJSQVkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFMb2NhbEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU2NoZW1hTG9jYWxBdHRyaWJ1dGUpYXR0ck1hcC5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKFNjaGVtYUxvY2FsQXR0cmlidXRlIGF0dHJ1c2UpCi0gICAgewotICAgICAgICBhdHRyTWFwLnB1dChhdHRydXNlLmdldE5hbWUoKSwgYXR0cnVzZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb2hpYml0ZWRBdHRyaWJ1dGUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIGF0dHJNYXAucmVtb3ZlKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZVNldCBnZXRXaWxkY2FyZFNldCgpCi0gICAgewotICAgICAgICByZXR1cm4gd2NTZXQgPT0gbnVsbCA/IFFOYW1lU2V0LkVNUFRZIDogd2NTZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V2lsZGNhcmRTZXQoUU5hbWVTZXQgc2V0KQotICAgIHsKLSAgICAgICAgd2NTZXQgPSBzZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRXaWxkY2FyZFByb2Nlc3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdjUHJvY2VzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaWxkY2FyZFByb2Nlc3MoaW50IHByb2MpCi0gICAgewotICAgICAgICB3Y1Byb2Nlc3MgPSBwcm9jOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4YmMyMy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbCBleHRlbmRzIFNjaGVtYUxvY2FsQXR0cmlidXRlSW1wbAotICAgICAgICBpbXBsZW1lbnRzIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZQotewotICAgIFNjaGVtYVR5cGVTeXN0ZW0gX3R5cGVTeXN0ZW07Ci0gICAgU3RyaW5nIF9maWxlbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBfcGFyc2VUTlM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9jaGFtZWxlb247Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbChTY2hlbWFUeXBlU3lzdGVtIHR5cGVTeXN0ZW0pCi0gICAgewotICAgICAgICBfdHlwZVN5c3RlbSA9IHR5cGVTeXN0ZW07Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0VHlwZVN5c3RlbSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGVTeXN0ZW07Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgaW50IGdldENvbXBvbmVudFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFNjaGVtYUNvbXBvbmVudC5BVFRSSUJVVEU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZmlsZW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZW5hbWUoU3RyaW5nIGZpbGVuYW1lKQotICAgIHsKLSAgICAgICAgX2ZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyc2VDb250ZXh0KFhtbE9iamVjdCBwYXJzZU9iamVjdCwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgYm9vbGVhbiBjaGFtZWxlb24pCi0gICAgewotICAgICAgICBfcGFyc2VPYmplY3QgPSBwYXJzZU9iamVjdDsKLSAgICAgICAgX3BhcnNlVE5TID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICBfY2hhbWVsZW9uID0gY2hhbWVsZW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgZ2V0UGFyc2VPYmplY3QoKQotICAgICAgICB7IHJldHVybiBfcGFyc2VPYmplY3Q7IH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgICAgICAgeyByZXR1cm4gX3BhcnNlVE5TOyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYW1lbGVvbk5hbWVzcGFjZSgpCi0gICAgICAgIHsgcmV0dXJuIF9jaGFtZWxlb24gPyBfcGFyc2VUTlMgOiBudWxsOyB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZS5SZWYgX3NlbGZyZWYgPSBuZXcgU2NoZW1hR2xvYmFsQXR0cmlidXRlLlJlZih0aGlzKTsKLQotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUuUmVmIGdldFJlZigpCi0gICAgICAgIHsgcmV0dXJuIF9zZWxmcmVmOyB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQ29tcG9uZW50LlJlZiBnZXRDb21wb25lbnRSZWYoKQotICAgICAgICB7IHJldHVybiBnZXRSZWYoKTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hR2xvYmFsRWxlbWVudEltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUdsb2JhbEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYjI2ZjMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hR2xvYmFsRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hR2xvYmFsRWxlbWVudEltcGwgZXh0ZW5kcyBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsCi0gICAgICAgIGltcGxlbWVudHMgU2NoZW1hR2xvYmFsRWxlbWVudAotewotICAgIHByaXZhdGUgU2V0IF9zZ01lbWJlcnMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lW10gX25hbWVhcnJheSA9IG5ldyBRTmFtZVswXTsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2ZpbmFsRXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiBfZmluYWxSZXN0OwotICAgIHByaXZhdGUgU2NoZW1hVHlwZVN5c3RlbSBfdHlwZVN5c3RlbTsKLSAgICBwcml2YXRlIFN0cmluZyBfZmlsZW5hbWU7Ci0gICAgLy8gcHJpdmF0ZSBYbWxPYmplY3QgX3BhcnNlT2JqZWN0OyBub3cgaW5oZXJpdGVkIGZyb20gYmFzZQotICAgIHByaXZhdGUgU3RyaW5nIF9wYXJzZVROUzsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2NoYW1lbGVvbjsKLSAgICBwcml2YXRlIFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmIF9zZzsKLQotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxFbGVtZW50SW1wbChTY2hlbWFUeXBlU3lzdGVtIHR5cGVTeXN0ZW0pCi0gICAgewotICAgICAgICBfdHlwZVN5c3RlbSA9IHR5cGVTeXN0ZW07Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0VHlwZVN5c3RlbSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGVTeXN0ZW07Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZmlsZW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZW5hbWUoU3RyaW5nIGZpbGVuYW1lKQotICAgIHsKLSAgICAgICAgX2ZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRGaW5hbChib29sZWFuIGZpbmFsRXh0LCBib29sZWFuIGZpbmFsUmVzdCkKLSAgICB7Ci0gICAgICAgIG11dGF0ZSgpOyBfZmluYWxFeHQgPSBmaW5hbEV4dDsgX2ZpbmFsUmVzdCA9IGZpbmFsUmVzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbXBvbmVudFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFNjaGVtYUNvbXBvbmVudC5FTEVNRU5UOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxFbGVtZW50IHN1YnN0aXR1dGlvbkdyb3VwKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc2cgPT0gbnVsbCA/IG51bGwgOiBfc2cuZ2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3Vic3RpdHV0aW9uR3JvdXAoU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYgc2cpIAotICAgIHsKLSAgICAgICAgX3NnID0gc2c7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lW10gc3Vic3RpdHV0aW9uR3JvdXBNZW1iZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoUU5hbWVbXSlfc2dNZW1iZXJzLnRvQXJyYXkoX25hbWVhcnJheSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkU3Vic3RpdHV0aW9uR3JvdXBNZW1iZXIoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIG11dGF0ZSgpOyBfc2dNZW1iZXJzLmFkZChuYW1lKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGZpbmFsRXh0ZW5zaW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZmluYWxFeHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZmluYWxSZXN0cmljdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX2ZpbmFsUmVzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJzZUNvbnRleHQoWG1sT2JqZWN0IHBhcnNlT2JqZWN0LCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbikKLSAgICB7Ci0gICAgICAgIF9wYXJzZU9iamVjdCA9IHBhcnNlT2JqZWN0OwotICAgICAgICBfcGFyc2VUTlMgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIF9jaGFtZWxlb24gPSBjaGFtZWxlb247Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBnZXRQYXJzZU9iamVjdCgpCi0gICAgICAgIHsgcmV0dXJuIF9wYXJzZU9iamVjdDsgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKQotICAgICAgICB7IHJldHVybiBfcGFyc2VUTlM7IH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkKLSAgICAgICAgeyByZXR1cm4gX2NoYW1lbGVvbiA/IF9wYXJzZVROUyA6IG51bGw7IH0KLQotICAgIHByaXZhdGUgU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYgX3NlbGZyZWYgPSBuZXcgU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYodGhpcyk7Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYgZ2V0UmVmKCkKLSAgICAgICAgeyByZXR1cm4gX3NlbGZyZWY7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFDb21wb25lbnQuUmVmIGdldENvbXBvbmVudFJlZigpCi0gICAgICAgIHsgcmV0dXJuIGdldFJlZigpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YjZiODMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhQYXRoOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsIGltcGxlbWVudHMgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50Ci17Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlU3lzdGVtIF90eXBlU3lzdGVtOwotICAgIHByaXZhdGUgU3RyaW5nIF9zZWxlY3RvcjsKLSAgICBwcml2YXRlIFN0cmluZ1tdIF9maWVsZHM7Ci0gICAgcHJpdmF0ZSBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmIF9rZXk7Ci0gICAgcHJpdmF0ZSBRTmFtZSBfbmFtZTsKLSAgICBwcml2YXRlIGludCBfdHlwZTsKLSAgICBwcml2YXRlIFhtbE9iamVjdCBfcGFyc2U7Ci0gICAgcHJpdmF0ZSBNYXAgX25zTWFwID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotICAgIHByaXZhdGUgU3RyaW5nIF9wYXJzZVROUzsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2NoYW1lbGVvbjsKLQotICAgIC8vIExhemlseSBjb21wdXRlZCBwYXRocwotICAgIHByaXZhdGUgdm9sYXRpbGUgWFBhdGggX3NlbGVjdG9yUGF0aDsKLSAgICBwcml2YXRlIHZvbGF0aWxlIFhQYXRoW10gX2ZpZWxkUGF0aHM7Ci0KLSAgICBwdWJsaWMgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbChTY2hlbWFUeXBlU3lzdGVtIHN5cykgewotICAgICAgICBfdHlwZVN5c3RlbSA9IHN5czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdG9yKCkgewotICAgICAgICByZXR1cm4gX3NlbGVjdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0U2VsZWN0b3JQYXRoKCkgewotICAgICAgICBYUGF0aCBwID0gX3NlbGVjdG9yUGF0aDsKLSAgICAgICAgaWYgKHAgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBidWlsZFBhdGhzKCk7Ci0gICAgICAgICAgICAgICAgcCA9IF9zZWxlY3RvclBhdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoWFBhdGguWFBhdGhDb21waWxlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U6ICJGYWlsZWQgdG8gY29tcGlsZSB4cGF0aC4gU2hvdWxkIGJlIGNhdWdodCBieSBjb21waWxlciAiICsgZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROU01hcChNYXAgbnNNYXApIHsKLSAgICAgICAgX25zTWFwID0gbnNNYXA7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcCBnZXROU01hcCgpIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChfbnNNYXApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdG9yKFN0cmluZyBzZWxlY3RvcikgewotICAgICAgICBhc3NlcnQgc2VsZWN0b3IgIT0gbnVsbDsKLSAgICAgICAgX3NlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmllbGRzKFN0cmluZ1tdIGZpZWxkcykgewotICAgICAgICBhc3NlcnQgZmllbGRzICE9IG51bGwgJiYgZmllbGRzLmxlbmd0aCA+IDA7Ci0gICAgICAgIF9maWVsZHMgPSBmaWVsZHM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEZpZWxkcygpIHsKLSAgICAgICAgU3RyaW5nW10gZmllbGRzID0gbmV3IFN0cmluZ1tfZmllbGRzLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX2ZpZWxkcywgMCwgZmllbGRzLCAwLCBmaWVsZHMubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIGZpZWxkczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkUGF0aChpbnQgaW5kZXgpIHsKLSAgICAgICAgWFBhdGhbXSBwID0gX2ZpZWxkUGF0aHM7Ci0gICAgICAgIGlmIChwID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRQYXRocygpOwotICAgICAgICAgICAgICAgIHAgPSBfZmllbGRQYXRoczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChYUGF0aC5YUGF0aENvbXBpbGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTogIkZhaWxlZCB0byBjb21waWxlIHhwYXRoLiBTaG91bGQgYmUgY2F1Z2h0IGJ5IGNvbXBpbGVyICIgKyBlOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwW2luZGV4XTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBidWlsZFBhdGhzKCkgdGhyb3dzIFhQYXRoLlhQYXRoQ29tcGlsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE86IE5lZWQgdGhlIG5hbWVzcGFjZSBtYXAgLSByZXF1aXJlcyBzdG9yZSBzdXBwb3J0Ci0gICAgICAgIF9zZWxlY3RvclBhdGggPSBYUGF0aC5jb21waWxlWFBhdGgoX3NlbGVjdG9yLCBfbnNNYXApOwotCi0gICAgICAgIF9maWVsZFBhdGhzID0gbmV3IFhQYXRoW19maWVsZHMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgX2ZpZWxkUGF0aHMubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgX2ZpZWxkUGF0aHNbaV0gPSBYUGF0aC5jb21waWxlWFBhdGgoX2ZpZWxkc1tpXSwgX25zTWFwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkS2V5KFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWYga2V5KSB7Ci0gICAgICAgIF9rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBnZXRSZWZlcmVuY2VkS2V5KCkgewotICAgICAgICByZXR1cm4gX2tleS5nZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50Q2F0ZWdvcnkoaW50IHR5cGUpIHsKLSAgICAgICAgYXNzZXJ0IHR5cGUgPj0gQ0NfS0VZICYmIHR5cGUgPD0gQ0NfVU5JUVVFOwotICAgICAgICBfdHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb25zdHJhaW50Q2F0ZWdvcnkoKSB7Ci0gICAgICAgIHJldHVybiBfdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFFOYW1lIG5hbWUpIHsKLSAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbDsKLSAgICAgICAgX25hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gX25hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb21wb25lbnRUeXBlKCkgewotICAgICAgICByZXR1cm4gSURFTlRJVFlfQ09OU1RSQUlOVDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbSBnZXRUeXBlU3lzdGVtKCkgewotICAgICAgICByZXR1cm4gX3R5cGVTeXN0ZW07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyc2VDb250ZXh0KFhtbE9iamVjdCBvLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbikgewotICAgICAgICBfcGFyc2UgPSBvOwotICAgICAgICBfcGFyc2VUTlMgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIF9jaGFtZWxlb24gPSBjaGFtZWxlb247Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBnZXRQYXJzZU9iamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIF9wYXJzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIF9wYXJzZVROUzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYW1lbGVvbk5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIF9jaGFtZWxlb24gPyBfcGFyc2VUTlMgOiBudWxsOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogT25seSBhcHBsaWNhYmxlIHRvIGtleXJlZnMuIE90aGVyIHR5cGVzIGFyZSBpbXBsaWNpdGx5IHJlc29sdmVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRDb25zdHJhaW50Q2F0ZWdvcnkoKSAhPSBDQ19LRVlSRUYgfHwgX2tleSAhPSBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZiBfc2VsZnJlZiA9IG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmKHRoaXMpOwotCi0gICAgcHVibGljIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWYgZ2V0UmVmKCkKLSAgICAgICAgeyByZXR1cm4gX3NlbGZyZWY7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFDb21wb25lbnQuUmVmIGdldENvbXBvbmVudFJlZigpCi0gICAgICAgIHsgcmV0dXJuIGdldFJlZigpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUxvY2FsQXR0cmlidXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTkxZTU1Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUxvY2FsQXR0cmlidXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zb2FwLlNPQVBBcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zb2FwLlNjaGVtYVdTRExBcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5OYW1lc3BhY2VDb250ZXh0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwgaW1wbGVtZW50cyBTY2hlbWFMb2NhbEF0dHJpYnV0ZSwgU2NoZW1hV1NETEFycmF5VHlwZQotewotICAgIHB1YmxpYyBTY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KFFOYW1lIG5hbWUsIFNjaGVtYVR5cGUuUmVmIHR5cGVyZWYsIGludCB1c2UsIFN0cmluZyBkZWZ0ZXh0LCBYbWxPYmplY3QgcGFyc2VPYmplY3QsIFhtbFZhbHVlUmVmIGRlZnZhbHVlLCBib29sZWFuIGlzRml4ZWQsIFNPQVBBcnJheVR5cGUgd3NkbEFycmF5KQotICAgIHsKLSAgICAgICAgaWYgKF94bWxOYW1lICE9IG51bGwgfHwgX3R5cGVyZWYgIT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgX3VzZSA9IHVzZTsKLSAgICAgICAgX3R5cGVyZWYgPSB0eXBlcmVmOwotICAgICAgICBfZGVmYXVsdFRleHQgPSBkZWZ0ZXh0OwotICAgICAgICBfcGFyc2VPYmplY3QgPSBwYXJzZU9iamVjdDsKLSAgICAgICAgX2RlZmF1bHRWYWx1ZSA9IGRlZnZhbHVlOwotICAgICAgICBfaXNEZWZhdWx0ID0gKGRlZnRleHQgIT0gbnVsbCk7Ci0gICAgICAgIF9pc0ZpeGVkID0gaXNGaXhlZDsKLSAgICAgICAgX3htbE5hbWUgPSBuYW1lOwotICAgICAgICBfd3NkbEFycmF5VHlwZSA9IHdzZGxBcnJheTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfZGVmYXVsdFRleHQ7Ci0gICAgLyogcGFja2FnZSAqLyBYbWxWYWx1ZVJlZiBfZGVmYXVsdFZhbHVlOwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNGaXhlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzRGVmYXVsdDsKLSAgICBwcml2YXRlIFFOYW1lIF94bWxOYW1lOwotICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWYgX3R5cGVyZWY7Ci0gICAgcHJpdmF0ZSBTT0FQQXJyYXlUeXBlIF93c2RsQXJyYXlUeXBlOwotICAgIHByaXZhdGUgaW50IF91c2U7Ci0gICAgcHJvdGVjdGVkIFhtbE9iamVjdCBfcGFyc2VPYmplY3Q7IC8vIGZvciBRTmFtZSByZXNvbHV0aW9uCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGVSZXNvbHZlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gKF90eXBlcmVmICE9IG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUeXBlUmVmKFNjaGVtYVR5cGUuUmVmIHR5cGVyZWYpCi0gICAgewotICAgICAgICBpZiAoX3R5cGVyZWYgIT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgX3R5cGVyZWYgPSB0eXBlcmVmOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VXNlKCkKLSAgICAgICAgeyByZXR1cm4gX3VzZTsgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKQotICAgICAgICB7IHJldHVybiBfeG1sTmFtZTsgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGV4dCgpCi0gICAgICAgIHsgcmV0dXJuIF9kZWZhdWx0VGV4dDsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkKLSAgICAgICAgeyByZXR1cm4gX2lzRGVmYXVsdDsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGaXhlZCgpCi0gICAgICAgIHsgcmV0dXJuIF9pc0ZpeGVkOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZSgpCi0gICAgICAgIHsgcmV0dXJuIHRydWU7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGdldFR5cGUoKQotICAgICAgICB7IHJldHVybiBfdHlwZXJlZi5nZXQoKTsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUuUmVmIGdldFR5cGVSZWYoKQotICAgICAgICB7IHJldHVybiBfdHlwZXJlZjsgfQotCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0TWluT2NjdXJzKCkKLSAgICAgICAgeyByZXR1cm4gX3VzZSA9PSBSRVFVSVJFRCA/IEJpZ0ludGVnZXIuT05FIDogQmlnSW50ZWdlci5aRVJPOyB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRNYXhPY2N1cnMoKQotICAgICAgICB7IHJldHVybiBfdXNlID09IFBST0hJQklURUQgPyBCaWdJbnRlZ2VyLlpFUk8gOiBCaWdJbnRlZ2VyLk9ORTsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNOaWxsYWJsZSgpCi0gICAgICAgIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICBwdWJsaWMgU09BUEFycmF5VHlwZSBnZXRXU0RMQXJyYXlUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3dzZGxBcnJheVR5cGU7IH0KLSAgICAKLSAgICBwdWJsaWMgWG1sQW55U2ltcGxlVHlwZSBnZXREZWZhdWx0VmFsdWUoKQotICAgIHsKLSAgICAgICAgaWYgKF9kZWZhdWx0VmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdFZhbHVlLmdldCgpOwotICAgICAgICBpZiAoX2RlZmF1bHRUZXh0ICE9IG51bGwgJiYgWG1sQW55U2ltcGxlVHlwZS50eXBlLmlzQXNzaWduYWJsZUZyb20oZ2V0VHlwZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9wYXJzZU9iamVjdCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wdXNoKG5ldyBOYW1lc3BhY2VDb250ZXh0KF9wYXJzZU9iamVjdCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VHlwZSgpLm5ld1ZhbHVlKF9kZWZhdWx0VGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucG9wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGdldFR5cGUoKS5uZXdWYWx1ZShfZGVmYXVsdFRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShYbWxWYWx1ZVJlZiBkZWZhdWx0UmVmKQotICAgICAgICB7IF9kZWZhdWx0VmFsdWUgPSBkZWZhdWx0UmVmOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFMb2NhbEVsZW1lbnRJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFMb2NhbEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMjIzYWQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hTG9jYWxFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zb2FwLlNPQVBBcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zb2FwLlNjaGVtYVdTRExBcnJheVR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsIGV4dGVuZHMgU2NoZW1hUGFydGljbGVJbXBsCi0gICAgICAgIGltcGxlbWVudHMgU2NoZW1hTG9jYWxFbGVtZW50LCBTY2hlbWFXU0RMQXJyYXlUeXBlCi17Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9ibG9ja0V4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2Jsb2NrUmVzdDsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2Jsb2NrU3Vic3Q7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX2FiczsKLSAgICBwcml2YXRlIFNPQVBBcnJheVR5cGUgX3dzZGxBcnJheVR5cGU7Ci0gICAgcHJpdmF0ZSBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmW10gX2NvbnN0cmFpbnRzID0gbmV3IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWZbMF07Ci0KLQotICAgIHB1YmxpYyBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsKCkKLSAgICB7Ci0gICAgICAgIHNldFBhcnRpY2xlVHlwZShTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBibG9ja0V4dGVuc2lvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX2Jsb2NrRXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGJsb2NrUmVzdHJpY3Rpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9ibG9ja1Jlc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYmxvY2tTdWJzdGl0dXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9ibG9ja1N1YnN0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9hYnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWJzdHJhY3QoYm9vbGVhbiBhYnMpCi0gICAgewotICAgICAgICBfYWJzID0gYWJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJsb2NrKGJvb2xlYW4gZXh0ZW5zaW9uLCBib29sZWFuIHJlc3RyaWN0aW9uLCBib29sZWFuIHN1YnN0aXR1dGlvbikKLSAgICB7Ci0gICAgICAgIG11dGF0ZSgpOwotICAgICAgICBfYmxvY2tFeHQgPSBleHRlbnNpb247Ci0gICAgICAgIF9ibG9ja1Jlc3QgPSByZXN0cmljdGlvbjsKLSAgICAgICAgX2Jsb2NrU3Vic3QgPSBzdWJzdGl0dXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V3NkbEFycmF5VHlwZShTT0FQQXJyYXlUeXBlIGFycmF5VHlwZSkKLSAgICB7Ci0gICAgICAgIF93c2RsQXJyYXlUeXBlID0gYXJyYXlUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQQXJyYXlUeXBlIGdldFdTRExBcnJheVR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF93c2RsQXJyYXlUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElkZW50aXR5Q29uc3RyYWludHMoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZltdIGNvbnN0cmFpbnRzKSB7Ci0gICAgICAgIG11dGF0ZSgpOwotICAgICAgICBfY29uc3RyYWludHMgPSBjb25zdHJhaW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50W10gZ2V0SWRlbnRpdHlDb25zdHJhaW50cygpIHsKLSAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50W10gcmVzdWx0ID0gbmV3IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtfY29uc3RyYWludHMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgcmVzdWx0Lmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgIHJlc3VsdFtpXSA9IF9jb25zdHJhaW50c1tpXS5nZXQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZltdIGdldElkZW50aXR5Q29uc3RyYWludFJlZnMoKSB7Ci0gICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWZbXSByZXN1bHQgPSBuZXcgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZltfY29uc3RyYWludHMubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShfY29uc3RyYWludHMsIDAsIHJlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFNb2RlbEdyb3VwSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hTW9kZWxHcm91cEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhNTUyMS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFNb2RlbEdyb3VwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTW9kZWxHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFNjaGVtYU1vZGVsR3JvdXBJbXBsIGltcGxlbWVudHMgU2NoZW1hTW9kZWxHcm91cAotewotICAgIHByaXZhdGUgU2NoZW1hVHlwZVN5c3RlbSBfdHlwZVN5c3RlbTsKLSAgICBwcml2YXRlIFFOYW1lIF9uYW1lOwotICAgIHByaXZhdGUgWG1sT2JqZWN0IF9wYXJzZU9iamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBfcGFyc2VUTlM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9jaGFtZWxlb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9yZWRlZmluaXRpb247Ci0KLSAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cEltcGwoU2NoZW1hVHlwZVN5c3RlbSB0eXBlU3lzdGVtKQotICAgIHsKLSAgICAgICAgX3R5cGVTeXN0ZW0gPSB0eXBlU3lzdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFNb2RlbEdyb3VwSW1wbChTY2hlbWFUeXBlU3lzdGVtIHR5cGVTeXN0ZW0sIFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICB0aGlzKHR5cGVTeXN0ZW0pOwotICAgICAgICBfbmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChRTmFtZSBuYW1lLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbiwgYm9vbGVhbiByZWRlZmluaXRpb24sIFhtbE9iamVjdCB4KQotICAgIHsKLSAgICAgICAgYXNzZXJ0IF9uYW1lID09IG51bGwgfHwgbmFtZS5lcXVhbHMoIF9uYW1lICk7Ci0gICAgICAgIAotICAgICAgICBfbmFtZSA9IG5hbWU7Ci0gICAgICAgIF9wYXJzZVROUyA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgX2NoYW1lbGVvbiA9IGNoYW1lbGVvbjsKLSAgICAgICAgX3JlZGVmaW5pdGlvbiA9IHJlZGVmaW5pdGlvbjsKLSAgICAgICAgX3BhcnNlT2JqZWN0ID0geDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbSBnZXRUeXBlU3lzdGVtKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZVN5c3RlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbXBvbmVudFR5cGUoKQotICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuTU9ERUxfR1JPVVA7IH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkKLSAgICAgICAgeyByZXR1cm4gX25hbWU7IH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgZ2V0UGFyc2VPYmplY3QoKQotICAgICAgICB7IHJldHVybiBfcGFyc2VPYmplY3Q7IH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgICAgICAgeyByZXR1cm4gX3BhcnNlVE5TOyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYW1lbGVvbk5hbWVzcGFjZSgpCi0gICAgICAgIHsgcmV0dXJuIF9jaGFtZWxlb24gPyBfcGFyc2VUTlMgOiBudWxsOyB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWRlZmluaXRpb24oKQotICAgICAgICB7IHJldHVybiBfcmVkZWZpbml0aW9uOyB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYU1vZGVsR3JvdXAuUmVmIF9zZWxmcmVmID0gbmV3IFNjaGVtYU1vZGVsR3JvdXAuUmVmKHRoaXMpOwotICAgIAotICAgIHB1YmxpYyBTY2hlbWFNb2RlbEdyb3VwLlJlZiBnZXRSZWYoKQotICAgICAgICB7IHJldHVybiBfc2VsZnJlZjsgfQotCi0gICAgcHVibGljIFNjaGVtYUNvbXBvbmVudC5SZWYgZ2V0Q29tcG9uZW50UmVmKCkKLSAgICAgICAgeyByZXR1cm4gZ2V0UmVmKCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVBhcnRpY2xlSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hUGFydGljbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZWEyZDMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hUGFydGljbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQYXJ0aWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxRTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLk5hbWVzcGFjZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFQYXJ0aWNsZUltcGwgaW1wbGVtZW50cyBTY2hlbWFQYXJ0aWNsZQotewotICAgIHByaXZhdGUgaW50IF9wYXJ0aWNsZVR5cGU7Ci0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIF9taW5PY2N1cnM7Ci0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIF9tYXhPY2N1cnM7Ci0gICAgcHJpdmF0ZSBTY2hlbWFQYXJ0aWNsZVtdIF9wYXJ0aWNsZUNoaWxkcmVuOwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNJbW11dGFibGU7Ci0gICAgcHJpdmF0ZSBRTmFtZVNldCBfc3RhcnRTZXQ7Ci0gICAgcHJpdmF0ZSBRTmFtZVNldCBfZXhjbHVkZU5leHRTZXQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9pc1NraXBwYWJsZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzRGV0ZXJtaW5pc3RpYzsKLSAgICBwcml2YXRlIGludCBfaW50TWluT2NjdXJzOwotICAgIHByaXZhdGUgaW50IF9pbnRNYXhPY2N1cnM7Ci0gICAgcHJpdmF0ZSBRTmFtZVNldCBfd2lsZGNhcmRTZXQ7Ci0gICAgcHJpdmF0ZSBpbnQgX3dpbGRjYXJkUHJvY2VzczsKLSAgICBwcml2YXRlIFN0cmluZyBfZGVmYXVsdFRleHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9pc0RlZmF1bHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9pc0ZpeGVkOwotICAgIHByaXZhdGUgUU5hbWUgX3FOYW1lOwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNOaWxsYWJsZTsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUuUmVmIF90eXBlcmVmOwotICAgIHByb3RlY3RlZCBYbWxPYmplY3QgX3BhcnNlT2JqZWN0OwotICAgIHByaXZhdGUgWG1sVmFsdWVSZWYgX2RlZmF1bHRWYWx1ZTsKLQotICAgIHByb3RlY3RlZCB2b2lkIG11dGF0ZSgpCi0gICAgICAgIHsgaWYgKF9pc0ltbXV0YWJsZSkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbW11dGFibGUoKQotICAgICAgICB7IG11dGF0ZSgpOyBfaXNJbW11dGFibGUgPSB0cnVlOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNUcmFuc2l0aW9uUnVsZXMoKQotICAgICAgICB7IHJldHVybiAoX3N0YXJ0U2V0ICE9IG51bGwpOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNUcmFuc2l0aW9uTm90ZXMoKQotICAgICAgICB7IHJldHVybiAoX2V4Y2x1ZGVOZXh0U2V0ICE9IG51bGwpOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2l0aW9uUnVsZXMoUU5hbWVTZXQgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTa2lwcGFibGUpCi0gICAgewotICAgICAgICBfc3RhcnRTZXQgPSBzdGFydDsKLSAgICAgICAgX2lzU2tpcHBhYmxlID0gaXNTa2lwcGFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHJhbnNpdGlvbk5vdGVzKFFOYW1lU2V0IGV4Y2x1ZGVOZXh0LCBib29sZWFuIGlzRGV0ZXJtaW5pc3RpYykKLSAgICB7Ci0gICAgICAgIF9leGNsdWRlTmV4dFNldCA9IGV4Y2x1ZGVOZXh0OwotICAgICAgICBfaXNEZXRlcm1pbmlzdGljID0gaXNEZXRlcm1pbmlzdGljOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNhblN0YXJ0V2l0aEVsZW1lbnQoUU5hbWUgbmFtZSkKLSAgICAgICAgeyByZXR1cm4gbmFtZSAhPSBudWxsICYmIF9zdGFydFNldC5jb250YWlucyhuYW1lKTsgfQotCi0gICAgcHVibGljIFFOYW1lU2V0IGFjY2VwdGVkU3RhcnROYW1lcygpCi0gICAgICAgIHsgcmV0dXJuIF9zdGFydFNldDsgfQotCi0gICAgcHVibGljIFFOYW1lU2V0IGdldEV4Y2x1ZGVOZXh0U2V0KCkKLSAgICAgICAgeyByZXR1cm4gX2V4Y2x1ZGVOZXh0U2V0OyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NraXBwYWJsZSgpCi0gICAgICAgIHsgcmV0dXJuIF9pc1NraXBwYWJsZTsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZXRlcm1pbmlzdGljKCkKLSAgICAgICAgeyByZXR1cm4gX2lzRGV0ZXJtaW5pc3RpYzsgfQotCi0gICAgcHVibGljIGludCBnZXRQYXJ0aWNsZVR5cGUoKQotICAgICAgICB7IHJldHVybiBfcGFydGljbGVUeXBlOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJ0aWNsZVR5cGUoaW50IHBUeXBlKQotICAgICAgICB7IG11dGF0ZSgpOyBfcGFydGljbGVUeXBlID0gcFR5cGU7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2luZ2xldG9uKCkKLSAgICAgICAgeyByZXR1cm4gX21heE9jY3VycyAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgIF9tYXhPY2N1cnMuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgIF9taW5PY2N1cnMuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA9PSAwOyB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRNaW5PY2N1cnMoKQotICAgICAgICB7IHJldHVybiBfbWluT2NjdXJzOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNaW5PY2N1cnMoQmlnSW50ZWdlciBtaW4pCi0gICAgICAgIHsgbXV0YXRlKCk7IF9taW5PY2N1cnMgPSBtaW47IF9pbnRNaW5PY2N1cnMgPSBwZWdCaWdJbnRlZ2VyKG1pbik7IH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SW50TWluT2NjdXJzKCkKLSAgICAgICAgeyByZXR1cm4gX2ludE1pbk9jY3VyczsgfQotCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0TWF4T2NjdXJzKCkKLSAgICAgICAgeyByZXR1cm4gX21heE9jY3VyczsgfQotCi0gICAgcHVibGljIGludCBnZXRJbnRNYXhPY2N1cnMoKQotICAgICAgICB7IHJldHVybiBfaW50TWF4T2NjdXJzOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXhPY2N1cnMoQmlnSW50ZWdlciBtYXgpCi0gICAgICAgIHsgbXV0YXRlKCk7IF9tYXhPY2N1cnMgPSBtYXg7IF9pbnRNYXhPY2N1cnMgPSBwZWdCaWdJbnRlZ2VyKG1heCk7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFQYXJ0aWNsZVtdIGdldFBhcnRpY2xlQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSByZXN1bHQgPSBuZXcgU2NoZW1hUGFydGljbGVbX3BhcnRpY2xlQ2hpbGRyZW4ubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShfcGFydGljbGVDaGlsZHJlbiwgMCwgcmVzdWx0LCAwLCBfcGFydGljbGVDaGlsZHJlbi5sZW5ndGgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcnRpY2xlQ2hpbGRyZW4oU2NoZW1hUGFydGljbGVbXSBjaGlsZHJlbikKLSAgICAgICAgeyBtdXRhdGUoKTsgX3BhcnRpY2xlQ2hpbGRyZW4gPSBjaGlsZHJlbjsgfQotCi0gICAgcHVibGljIFNjaGVtYVBhcnRpY2xlIGdldFBhcnRpY2xlQ2hpbGQoaW50IGkpCi0gICAgICAgIHsgcmV0dXJuIF9wYXJ0aWNsZUNoaWxkcmVuW2ldOyB9Ci0KLSAgICBwdWJsaWMgaW50IGNvdW50T2ZQYXJ0aWNsZUNoaWxkKCkKLSAgICAgICAgeyByZXR1cm4gX3BhcnRpY2xlQ2hpbGRyZW4gPT0gbnVsbCA/IDAgOiBfcGFydGljbGVDaGlsZHJlbi5sZW5ndGg7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdpbGRjYXJkU2V0KFFOYW1lU2V0IHNldCkKLSAgICAgICAgeyBtdXRhdGUoKTsgX3dpbGRjYXJkU2V0ID0gc2V0OyB9Ci0KLSAgICBwdWJsaWMgUU5hbWVTZXQgZ2V0V2lsZGNhcmRTZXQoKQotICAgICAgICB7IHJldHVybiBfd2lsZGNhcmRTZXQ7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdpbGRjYXJkUHJvY2VzcyhpbnQgcHJvY2VzcykKLSAgICAgICAgeyBtdXRhdGUoKTsgX3dpbGRjYXJkUHJvY2VzcyA9IHByb2Nlc3M7IH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0V2lsZGNhcmRQcm9jZXNzKCkKLSAgICAgICAgeyByZXR1cm4gX3dpbGRjYXJkUHJvY2VzczsgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBfbWF4aW50ID0gQmlnSW50ZWdlci52YWx1ZU9mKEludGVnZXIuTUFYX1ZBTFVFKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBwZWdCaWdJbnRlZ2VyKEJpZ0ludGVnZXIgYmkpCi0gICAgewotICAgICAgICBpZiAoYmkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgaWYgKGJpLnNpZ251bSgpIDw9IDApCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKGJpLmNvbXBhcmVUbyhfbWF4aW50KSA+PSAwKQotICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICByZXR1cm4gYmkuaW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpCi0gICAgICAgIHsgcmV0dXJuIF9xTmFtZTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZUFuZFR5cGVSZWYoUU5hbWUgZm9ybW5hbWUsIFNjaGVtYVR5cGUuUmVmIHR5cGVyZWYpCi0gICAgICAgIHsgbXV0YXRlKCk7IF9xTmFtZSA9IGZvcm1uYW1lOyBfdHlwZXJlZiA9IHR5cGVyZWY7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVHlwZVJlc29sdmVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoX3R5cGVyZWYgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVSZWYoU2NoZW1hVHlwZS5SZWYgdHlwZXJlZikKLSAgICB7Ci0gICAgICAgIGlmIChfdHlwZXJlZiAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICBfdHlwZXJlZiA9IHR5cGVyZWY7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGUoKQotICAgICAgICB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0VHlwZSgpCi0gICAgICAgIHsgaWYgKF90eXBlcmVmID09IG51bGwpIHJldHVybiBudWxsOyByZXR1cm4gX3R5cGVyZWYuZ2V0KCk7IH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRleHQoKQotICAgICAgICB7IHJldHVybiBfZGVmYXVsdFRleHQ7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpCi0gICAgICAgIHsgcmV0dXJuIF9pc0RlZmF1bHQ7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRml4ZWQoKQotICAgICAgICB7IHJldHVybiBfaXNGaXhlZDsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgZGVmdGV4dCwgYm9vbGVhbiBpc0ZpeGVkLCBYbWxPYmplY3QgcGFyc2VPYmplY3QpCi0gICAgewotICAgICAgICBtdXRhdGUoKTsKLSAgICAgICAgX2RlZmF1bHRUZXh0ID0gZGVmdGV4dDsKLSAgICAgICAgX2lzRGVmYXVsdCA9IChkZWZ0ZXh0ICE9IG51bGwpOwotICAgICAgICBfaXNGaXhlZCA9IGlzRml4ZWQ7Ci0gICAgICAgIF9wYXJzZU9iamVjdCA9IHBhcnNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTmlsbGFibGUoKQotICAgICAgICB7IHJldHVybiBfaXNOaWxsYWJsZTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmlsbGFibGUoYm9vbGVhbiBuaWxsYWJsZSkKLSAgICAgICAgeyBtdXRhdGUoKTsgX2lzTmlsbGFibGUgPSBuaWxsYWJsZTsgfQotCi0gICAgcHVibGljIFhtbEFueVNpbXBsZVR5cGUgZ2V0RGVmYXVsdFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGlmIChfZGVmYXVsdFZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRWYWx1ZS5nZXQoKTsKLSAgICAgICAgaWYgKF9kZWZhdWx0VGV4dCAhPSBudWxsICYmIFhtbEFueVNpbXBsZVR5cGUudHlwZS5pc0Fzc2lnbmFibGVGcm9tKGdldFR5cGUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfcGFyc2VPYmplY3QgIT0gbnVsbCAmJiBYbWxRTmFtZS50eXBlLmlzQXNzaWduYWJsZUZyb20oZ2V0VHlwZSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucHVzaChuZXcgTmFtZXNwYWNlQ29udGV4dChfcGFyc2VPYmplY3QpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFR5cGUoKS5uZXdWYWx1ZShfZGVmYXVsdFRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnBvcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBnZXRUeXBlKCkubmV3VmFsdWUoX2RlZmF1bHRUZXh0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKFhtbFZhbHVlUmVmIGRlZmF1bHRSZWYpCi0gICAgewotICAgICAgICBtdXRhdGUoKTsKLSAgICAgICAgX2RlZmF1bHRWYWx1ZSA9IGRlZmF1bHRSZWY7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hUHJvcGVydHlJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFQcm9wZXJ0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4MTRjNi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFQcm9wZXJ0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuTmFtZXNwYWNlQ29udGV4dDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hUHJvcGVydHlJbXBsIGltcGxlbWVudHMgU2NoZW1hUHJvcGVydHkKLXsKLSAgICBwcml2YXRlIFFOYW1lIF9uYW1lOwotICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWYgX3R5cGVyZWY7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9pc0F0dHJpYnV0ZTsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUuUmVmIF9jb250YWluZXJUeXBlUmVmOwotICAgIHByaXZhdGUgU3RyaW5nIF9qYXZhUHJvcGVydHlOYW1lOwotICAgIHByaXZhdGUgQmlnSW50ZWdlciBfbWluT2NjdXJzOwotICAgIHByaXZhdGUgQmlnSW50ZWdlciBfbWF4T2NjdXJzOwotICAgIHByaXZhdGUgaW50IF9oYXNOaWxsYWJsZTsKLSAgICBwcml2YXRlIGludCBfaGFzRGVmYXVsdDsKLSAgICBwcml2YXRlIGludCBfaGFzRml4ZWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2RlZmF1bHRUZXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNJbW11dGFibGU7Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlLlJlZiBfamF2YUJhc2VkT25UeXBlUmVmOwotICAgIHByaXZhdGUgYm9vbGVhbiBfZXh0ZW5kc1NpbmdsZXRvbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2V4dGVuZHNBcnJheTsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2V4dGVuZHNPcHRpb247Ci0gICAgcHJpdmF0ZSBpbnQgX2phdmFUeXBlQ29kZTsKLSAgICBwcml2YXRlIFFOYW1lU2V0IF9qYXZhU2V0dGVyRGVsaW1pdGVyOwotICAgIHByaXZhdGUgWG1sVmFsdWVSZWYgX2RlZmF1bHRWYWx1ZTsKLSAgICBwcml2YXRlIFNldCBfYWNjZXB0ZWROYW1lczsKLQotICAgIHByaXZhdGUgdm9pZCBtdXRhdGUoKQotICAgICAgICB7IGlmIChfaXNJbW11dGFibGUpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW1tdXRhYmxlKCkKLSAgICAgICAgeyBtdXRhdGUoKTsgX2lzSW1tdXRhYmxlID0gdHJ1ZTsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0Q29udGFpbmVyVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9jb250YWluZXJUeXBlUmVmLmdldCgpOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXJUeXBlUmVmKFNjaGVtYVR5cGUuUmVmIHR5cGVyZWYpCi0gICAgICAgIHsgbXV0YXRlKCk7IF9jb250YWluZXJUeXBlUmVmID0gdHlwZXJlZjsgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKQotICAgICAgICB7IHJldHVybiBfbmFtZTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShRTmFtZSBuYW1lKQotICAgICAgICB7IG11dGF0ZSgpOyBfbmFtZSA9IG5hbWU7IH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YVByb3BlcnR5TmFtZSgpCi0gICAgICAgIHsgcmV0dXJuIF9qYXZhUHJvcGVydHlOYW1lOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhUHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKQotICAgICAgICB7IG11dGF0ZSgpOyBfamF2YVByb3BlcnR5TmFtZSA9IG5hbWU7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlKCkKLSAgICAgICAgeyByZXR1cm4gX2lzQXR0cmlidXRlOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoYm9vbGVhbiBpc0F0dHJpYnV0ZSkKLSAgICAgICAgeyBtdXRhdGUoKTsgX2lzQXR0cmlidXRlID0gaXNBdHRyaWJ1dGU7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKQotICAgICAgICB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0VHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF90eXBlcmVmLmdldCgpOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlUmVmKFNjaGVtYVR5cGUuUmVmIHR5cGVyZWYpCi0gICAgICAgIHsgbXV0YXRlKCk7IF90eXBlcmVmID0gdHlwZXJlZjsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgamF2YUJhc2VkT25UeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX2phdmFCYXNlZE9uVHlwZVJlZi5nZXQoKTsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXh0ZW5kc0phdmFTaW5nbGV0b24oKQotICAgICAgICB7IHJldHVybiBfZXh0ZW5kc1NpbmdsZXRvbjsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXh0ZW5kc0phdmFBcnJheSgpCi0gICAgICAgIHsgcmV0dXJuIF9leHRlbmRzQXJyYXk7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGV4dGVuZHNKYXZhT3B0aW9uKCkKLSAgICAgICAgeyByZXR1cm4gX2V4dGVuZHNPcHRpb247IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuZHNKYXZhKFNjaGVtYVR5cGUuUmVmIGphdmFCYXNlZE9uVHlwZVJlZiwgYm9vbGVhbiBzaW5nbGV0b24sIGJvb2xlYW4gb3B0aW9uLCBib29sZWFuIGFycmF5KQotICAgIHsKLSAgICAgICAgbXV0YXRlKCk7Ci0gICAgICAgIF9qYXZhQmFzZWRPblR5cGVSZWYgPSBqYXZhQmFzZWRPblR5cGVSZWY7Ci0gICAgICAgIF9leHRlbmRzU2luZ2xldG9uID0gc2luZ2xldG9uOwotICAgICAgICBfZXh0ZW5kc09wdGlvbiA9IG9wdGlvbjsKLSAgICAgICAgX2V4dGVuZHNBcnJheSA9IGFycmF5OwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZVNldCBnZXRKYXZhU2V0dGVyRGVsaW1pdGVyKCkKLSAgICAgICAgeyByZXR1cm4gX2phdmFTZXR0ZXJEZWxpbWl0ZXIgPT0gbnVsbCA/IFFOYW1lU2V0LkVNUFRZIDogX2phdmFTZXR0ZXJEZWxpbWl0ZXI7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmFTZXR0ZXJEZWxpbWl0ZXIoUU5hbWVTZXQgc2V0KQotICAgICAgICB7IG11dGF0ZSgpOyBfamF2YVNldHRlckRlbGltaXRlciA9IHNldDsgfQotCi0gICAgcHVibGljIFFOYW1lW10gYWNjZXB0ZWROYW1lcygpCi0gICAgeyAKLSAgICAgICAgaWYgKF9hY2NlcHRlZE5hbWVzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lW10geyBfbmFtZSB9OwotCi0gICAgICAgIHJldHVybiAoUU5hbWVbXSlfYWNjZXB0ZWROYW1lcy50b0FycmF5KG5ldyBRTmFtZVtfYWNjZXB0ZWROYW1lcy5zaXplKCldKTsgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWNjZXB0ZWROYW1lcyhTZXQgc2V0KQotICAgIHsKLSAgICAgICAgbXV0YXRlKCk7IAotICAgICAgICBfYWNjZXB0ZWROYW1lcyA9IHNldDsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0QWNjZXB0ZWROYW1lcyhRTmFtZVNldCBzZXQpCi0gICAgeyAKLSAgICAgICAgbXV0YXRlKCk7IAotICAgICAgICBfYWNjZXB0ZWROYW1lcyA9IHNldC5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0TWluT2NjdXJzKCkKLSAgICAgICAgeyByZXR1cm4gX21pbk9jY3VyczsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWluT2NjdXJzKEJpZ0ludGVnZXIgbWluKQotICAgICAgICB7IG11dGF0ZSgpOyBfbWluT2NjdXJzID0gbWluOyB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRNYXhPY2N1cnMoKQotICAgICAgICB7IHJldHVybiBfbWF4T2NjdXJzOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXhPY2N1cnMoQmlnSW50ZWdlciBtYXgpCi0gICAgICAgIHsgbXV0YXRlKCk7IF9tYXhPY2N1cnMgPSBtYXg7IH0KLQotICAgIHB1YmxpYyBpbnQgaGFzTmlsbGFibGUoKQotICAgICAgICB7IHJldHVybiBfaGFzTmlsbGFibGU7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5pbGxhYmxlKGludCB3aGVuKQotICAgICAgICB7IG11dGF0ZSgpOyBfaGFzTmlsbGFibGUgPSB3aGVuOyB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc0RlZmF1bHQoKQotICAgICAgICB7IHJldHVybiBfaGFzRGVmYXVsdDsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChpbnQgd2hlbikKLSAgICAgICAgeyBtdXRhdGUoKTsgX2hhc0RlZmF1bHQgPSB3aGVuOyB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc0ZpeGVkKCkKLSAgICAgICAgeyByZXR1cm4gX2hhc0ZpeGVkOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXhlZChpbnQgd2hlbikKLSAgICAgICAgeyBtdXRhdGUoKTsgX2hhc0ZpeGVkID0gd2hlbjsgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGV4dCgpCi0gICAgICAgIHsgcmV0dXJuIF9kZWZhdWx0VGV4dDsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFRleHQoU3RyaW5nIHZhbCkKLSAgICAgICAgeyBtdXRhdGUoKTsgX2RlZmF1bHRUZXh0ID0gdmFsOyB9Ci0KLSAgICBwdWJsaWMgWG1sQW55U2ltcGxlVHlwZSBnZXREZWZhdWx0VmFsdWUoKQotICAgIHsKLSAgICAgICAgaWYgKF9kZWZhdWx0VmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdFZhbHVlLmdldCgpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKFhtbFZhbHVlUmVmIGRlZmF1bHRSZWYpCi0gICAgewotICAgICAgICBtdXRhdGUoKTsKLSAgICAgICAgX2RlZmF1bHRWYWx1ZSA9IGRlZmF1bHRSZWY7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRKYXZhVHlwZUNvZGUoKQotICAgICAgICB7IHJldHVybiBfamF2YVR5cGVDb2RlOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhVHlwZUNvZGUoaW50IGNvZGUpCi0gICAgICAgIHsgbXV0YXRlKCk7IF9qYXZhVHlwZUNvZGUgPSBjb2RlOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFTdHJpbmdFbnVtRW50cnlJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFTdHJpbmdFbnVtRW50cnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NmI4ODYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hU3RyaW5nRW51bUVudHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFTdHJpbmdFbnVtRW50cnk7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFTdHJpbmdFbnVtRW50cnlJbXBsIGltcGxlbWVudHMgU2NoZW1hU3RyaW5nRW51bUVudHJ5Ci17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3N0cmluZzsKLSAgICBwcml2YXRlIGludCBfaW50OwotICAgIHByaXZhdGUgU3RyaW5nIF9lbnVtTmFtZTsKLQotICAgIHB1YmxpYyBTY2hlbWFTdHJpbmdFbnVtRW50cnlJbXBsKFN0cmluZyBzdHIsIGludCBpLCBTdHJpbmcgZW51bU5hbWUpCi0gICAgewotICAgICAgICBfc3RyaW5nID0gc3RyOwotICAgICAgICBfaW50ID0gaTsKLSAgICAgICAgX2VudW1OYW1lID0gZW51bU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zdHJpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRJbnRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2ludDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVudW1OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZW51bU5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUNvZGVQcmludGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlQ29kZVByaW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc1YWY0Ny4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlQ29kZVByaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMzQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVN0cmluZ0VudW1FbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLQotLyoqCi0gKiBQcmludHMgdGhlIGphdmEgY29kZSBmb3IgYSBzaW5nbGUgc2NoZW1hIHR5cGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNjaGVtYVR5cGVDb2RlUHJpbnRlcgotewotICAgIFdyaXRlciBfd3JpdGVyOwotICAgIGludCAgICBfaW5kZW50OwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUEFSQVRPUiA9Ci0gICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSA9PSBudWxsCi0gICAgICAgICAgICA/ICJcbiIKLSAgICAgICAgICAgIDogU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfU1BBQ0VTID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSU5ERU5UX0lOQ1JFTUVOVCA9IDQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFWF9DTEFTU05BTUUgPSAiVHlwZVN5c3RlbUhvbGRlciI7Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZUNvZGVQcmludGVyICggV3JpdGVyIHdyaXRlciApCi0gICAgewotICAgICAgICBfd3JpdGVyID0gd3JpdGVyOwotICAgICAgICBfaW5kZW50ID0gMDsKLSAgICB9Ci0KLSAgICB2b2lkIGluZGVudCgpCi0gICAgewotICAgICAgICBfaW5kZW50ICs9IElOREVOVF9JTkNSRU1FTlQ7Ci0gICAgfQotCi0gICAgdm9pZCBvdXRkZW50KCkKLSAgICB7Ci0gICAgICAgIF9pbmRlbnQgLT0gSU5ERU5UX0lOQ1JFTUVOVDsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZW5jb2RlU3RyaW5nICggU3RyaW5nIHMgKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIHNiLmFwcGVuZCggJyInICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IHMubGVuZ3RoKCkgOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gcy5jaGFyQXQoIGkgKTsKLQotICAgICAgICAgICAgaWYgKGNoID09ICciJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICdcXCcgKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICdcIicgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICdcXCcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAnXFwnICk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAnXFwnICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnXHInKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggJ1xcJyApOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggJ3InICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnXG4nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggJ1xcJyApOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggJ24nICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnXHQnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggJ1xcJyApOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggJ3QnICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBjaCApOwotICAgICAgICB9Ci0KLSAgICAgICAgc2IuYXBwZW5kKCAnIicgKTsKLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGVtaXQoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW50IGluZGVudCA9IF9pbmRlbnQ7Ci0gICAgICAgIAotICAgICAgICBpZiAoaW5kZW50ID4gTUFYX1NQQUNFUy5sZW5ndGgoKSAvIDIpCi0gICAgICAgICAgICBpbmRlbnQgPSBNQVhfU1BBQ0VTLmxlbmd0aCgpIC8gNCArIGluZGVudCAvIDI7Ci0gICAgICAgIAotICAgICAgICBpZiAoaW5kZW50ID4gTUFYX1NQQUNFUy5sZW5ndGgoKSkKLSAgICAgICAgICAgIGluZGVudCA9IE1BWF9TUEFDRVMubGVuZ3RoKCk7Ci0gICAgICAgIAotICAgICAgICBfd3JpdGVyLndyaXRlKE1BWF9TUEFDRVMuc3Vic3RyaW5nKDAsIGluZGVudCkpOwotICAgICAgICBfd3JpdGVyLndyaXRlKHMpOwotICAgICAgICBfd3JpdGVyLndyaXRlKExJTkVfU0VQQVJBVE9SKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnQoTUFYX1NQQUNFUy5zdWJzdHJpbmcoMCwgaW5kZW50KSk7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRUeXBlSW1wbCAoIFdyaXRlciB3cml0ZXIsIFNjaGVtYVR5cGUgc1R5cGUgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG5ldyBTY2hlbWFUeXBlQ29kZVByaW50ZXIoIHdyaXRlciApLnByaW50VHlwZUltcGwoIHNUeXBlLCBzVHlwZS5nZXRUeXBlU3lzdGVtKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRUeXBlICggV3JpdGVyIHdyaXRlciwgU2NoZW1hVHlwZSBzVHlwZSApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbmV3IFNjaGVtYVR5cGVDb2RlUHJpbnRlciggd3JpdGVyICkuIHByaW50VHlwZSggc1R5cGUsIHNUeXBlLmdldFR5cGVTeXN0ZW0oKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludExvYWRlciAoIFdyaXRlciB3cml0ZXIsIFNjaGVtYVR5cGVTeXN0ZW0gc3lzdGVtICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBuZXcgU2NoZW1hVHlwZUNvZGVQcmludGVyKCB3cml0ZXIgKS5wcmludEluZGV4VHlwZSggc3lzdGVtICk7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFR5cGUoU2NoZW1hVHlwZSBzVHlwZSwgU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcHJpbnRUb3BDb21tZW50KHNUeXBlKTsKLSAgICAgICAgcHJpbnRQYWNrYWdlKHNUeXBlLCB0cnVlKTsKLSAgICAgICAgZW1pdCgiIik7Ci0gICAgICAgIHByaW50SW5uZXJUeXBlKHNUeXBlLCBzeXN0ZW0pOwotICAgICAgICBfd3JpdGVyLmZsdXNoKCk7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFR5cGVJbXBsKFNjaGVtYVR5cGUgc1R5cGUsIFNjaGVtYVR5cGVTeXN0ZW0gc3lzdGVtKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHByaW50VG9wQ29tbWVudChzVHlwZSk7Ci0gICAgICAgIHByaW50UGFja2FnZShzVHlwZSwgZmFsc2UpOwotICAgICAgICBwcmludElubmVyVHlwZUltcGwoc1R5cGUsIHN5c3RlbSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbmNlIG5vdCBhbGwgc2NoZW1hIHR5cGVzIGhhdmUgamF2YSB0eXBlcywgdGhpcyBza2lwcwotICAgICAqIG92ZXIgYW55IHRoYXQgZG9uJ3QgYW5kIGdpdmVzIHlvdSB0aGUgbmVhcmVzdCBqYXZhIGJhc2UgdHlwZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZmluZEphdmFUeXBlICggU2NoZW1hVHlwZSBzVHlwZSApCi0gICAgewotICAgICAgICB3aGlsZSAoIHNUeXBlLmdldEZ1bGxKYXZhTmFtZSgpID09IG51bGwgKQotICAgICAgICAgICAgc1R5cGUgPSBzVHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHNUeXBlLmdldEZ1bGxKYXZhTmFtZSgpOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgcHJldHR5UU5hbWUoUU5hbWUgcW5hbWUpCi0gICAgewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIGlmIChxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsKQotICAgICAgICAgICAgcmVzdWx0ICs9ICIoQCIgKyBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSArICIpIjsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2b2lkIHByaW50SW5uZXJUeXBlSmF2YURvYyhTY2hlbWFUeXBlIHNUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFFOYW1lIG5hbWUgPSBzVHlwZS5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzVHlwZS5pc0RvY3VtZW50VHlwZSgpKQotICAgICAgICAgICAgICAgIG5hbWUgPSBzVHlwZS5nZXREb2N1bWVudEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChzVHlwZS5pc0F0dHJpYnV0ZVR5cGUoKSkKLSAgICAgICAgICAgICAgICBuYW1lID0gc1R5cGUuZ2V0QXR0cmlidXRlVHlwZUF0dHJpYnV0ZU5hbWUoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHNUeXBlLmdldENvbnRhaW5lckZpZWxkKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBuYW1lID0gc1R5cGUuZ2V0Q29udGFpbmVyRmllbGQoKS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBlbWl0KCIvKioiKTsKLSAgICAgICAgaWYgKHNUeXBlLmlzRG9jdW1lbnRUeXBlKCkpCi0gICAgICAgICAgICBlbWl0KCIgKiBBIGRvY3VtZW50IGNvbnRhaW5pbmcgb25lICIgKyBwcmV0dHlRTmFtZShuYW1lKSArICIgZWxlbWVudC4iKTsKLSAgICAgICAgZWxzZSBpZiAoc1R5cGUuaXNBdHRyaWJ1dGVUeXBlKCkpCi0gICAgICAgICAgICBlbWl0KCIgKiBBIGRvY3VtZW50IGNvbnRhaW5pbmcgb25lICIgKyBwcmV0dHlRTmFtZShuYW1lKSArICIgYXR0cmlidXRlLiIpOwotICAgICAgICBlbHNlIGlmIChuYW1lICE9IG51bGwpCi0gICAgICAgICAgICBlbWl0KCIgKiBBbiBYTUwgIiArIHByZXR0eVFOYW1lKG5hbWUpICsgIi4iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZW1pdCgiICogQW4gYW5vbnltb3VzIGlubmVyIFhNTCB0eXBlLiIpOwotICAgICAgICBlbWl0KCIgKiIpOwotICAgICAgICBzd2l0Y2ggKHNUeXBlLmdldFNpbXBsZVZhcmlldHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLk5PVF9TSU1QTEU6Ci0gICAgICAgICAgICAgICAgZW1pdCgiICogVGhpcyBpcyBhIGNvbXBsZXggdHlwZS4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5BVE9NSUM6Ci0gICAgICAgICAgICAgICAgZW1pdCgiICogVGhpcyBpcyBhbiBhdG9taWMgdHlwZSB0aGF0IGlzIGEgcmVzdHJpY3Rpb24gb2YgIiArIHNUeXBlLmdldEJhc2VUeXBlKCkuZ2V0RnVsbEphdmFOYW1lKCkgKyAiLiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6Ci0gICAgICAgICAgICAgICAgZW1pdCgiICogVGhpcyBpcyBhIGxpc3QgdHlwZSB3aG9zZSBpdGVtcyBhcmUgIiArIHNUeXBlLmdldExpc3RJdGVtVHlwZSgpLmdldEZ1bGxKYXZhTmFtZSgpICsgIi4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5VTklPTjoKLSAgICAgICAgICAgICAgICBlbWl0KCIgKiBUaGlzIGlzIGEgdW5pb24gdHlwZS4gSW5zdGFuY2VzIGFyZSBvZiBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlczoiKTsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlW10gbWVtYmVycyA9IHNUeXBlLmdldFVuaW9uQ29uc3RpdHVlbnRUeXBlcygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiICogICAgICIgKyBtZW1iZXJzW2ldLmdldEZ1bGxKYXZhTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBlbWl0KCIgKi8iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBpbmRleENsYXNzRm9yU3lzdGVtKFNjaGVtYVR5cGVTeXN0ZW0gc3lzdGVtKQotICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBzeXN0ZW0uZ2V0TmFtZSgpOwotICAgICAgICByZXR1cm4gbmFtZSArICIuIiArIElOREVYX0NMQVNTTkFNRTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHNob3J0SW5kZXhDbGFzc0ZvclN5c3RlbShTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBJTkRFWF9DTEFTU05BTUU7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFN0YXRpY1R5cGVEZWNsYXJhdGlvbihTY2hlbWFUeXBlIHNUeXBlLCBTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZSB0eXBlID0gKG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZSkiICsKLSAgICAgICAgICAgICAgICBpbmRleENsYXNzRm9yU3lzdGVtKHN5c3RlbSkgKwotICAgICAgICAgICAgICAgICIudHlwZVN5c3RlbS5yZXNvbHZlSGFuZGxlKFwiIiArCi0gICAgICAgICAgICAgICAgKChTY2hlbWFUeXBlU3lzdGVtSW1wbClzeXN0ZW0pLmhhbmRsZUZvclR5cGUoc1R5cGUpICsgIlwiKTsiKTsKLSAgICB9Ci0KLSAgICB2b2lkIHByaW50SW5kZXhUeXBlKFNjaGVtYVR5cGVTeXN0ZW0gc3lzdGVtKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBzaG9ydE5hbWUgPSBzaG9ydEluZGV4Q2xhc3NGb3JTeXN0ZW0oc3lzdGVtKTsKLSAgICAgICAgZW1pdCgicGFja2FnZSAiICsgc3lzdGVtLmdldE5hbWUoKSArICI7Iik7Ci0gICAgICAgIGVtaXQoIiIpOwotICAgICAgICBlbWl0KCJwdWJsaWMgZmluYWwgY2xhc3MgIiArIHNob3J0TmFtZSk7Ci0gICAgICAgIGVtaXQoInsiKTsKLSAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgIGVtaXQoInByaXZhdGUgIiArIHNob3J0TmFtZSArICIoKSB7IH0iKTsKLSAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW0gdHlwZVN5c3RlbSA9IGxvYWRUeXBlU3lzdGVtKCk7Iik7Ci0gICAgICAgIGVtaXQoInN0YXRpYyB7IHR5cGVTeXN0ZW0ucmVzb2x2ZSgpOyB9Iik7Ci0gICAgICAgIGVtaXQoInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbSBsb2FkVHlwZVN5c3RlbSgpIik7Ci0gICAgICAgIGVtaXQoInsiKTsKLSAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgIGVtaXQoInRyeSB7IHJldHVybiAob3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtKUNsYXNzLmZvck5hbWUoXCJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlNjaGVtYVR5cGVTeXN0ZW1JbXBsXCIsIHRydWUsICIgKyBzaG9ydE5hbWUgKyAiLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHsgQ2xhc3MuY2xhc3MgfSkubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHsgIiArIHNob3J0TmFtZSArICIuY2xhc3MgfSk7IH0iKTsKLSAgICAgICAgZW1pdCgiY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcIkNhbm5vdCBsb2FkIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5TY2hlbWFUeXBlU3lzdGVtSW1wbDogbWFrZSBzdXJlIHhiZWFuLmphciBpcyBvbiB0aGUgY2xhc3NwYXRoLlwiLCBlKTsgfSIpOwotICAgICAgICBlbWl0KCJjYXRjaCAoRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oXCJDb3VsZCBub3QgaW5zdGFudGlhdGUgU2NoZW1hVHlwZVN5c3RlbUltcGwgKFwiICsgZS50b1N0cmluZygpICsgXCIpOiBpcyB0aGUgdmVyc2lvbiBvZiB4YmVhbi5qYXIgY29ycmVjdD9cIiwgZSk7IH0iKTsKLSAgICAgICAgb3V0ZGVudCgpOwotICAgICAgICBlbWl0KCJ9Iik7Ci0gICAgICAgIG91dGRlbnQoKTsKLSAgICAgICAgZW1pdCgifSIpOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRJbm5lclR5cGUoU2NoZW1hVHlwZSBzVHlwZSwgU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW1pdCgiIik7Ci0KLSAgICAgICAgcHJpbnRJbm5lclR5cGVKYXZhRG9jKHNUeXBlKTsKLQotICAgICAgICBzdGFydEludGVyZmFjZShzVHlwZSk7Ci0gICAgICAgIAotICAgICAgICBwcmludFN0YXRpY1R5cGVEZWNsYXJhdGlvbihzVHlwZSwgc3lzdGVtKTsKLQotICAgICAgICBpZiAoc1R5cGUuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzVHlwZS5oYXNTdHJpbmdFbnVtVmFsdWVzKCkpCi0gICAgICAgICAgICAgICAgcHJpbnRTdHJpbmdFbnVtZXJhdGlvbihzVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eVtdIHByb3BzID0gc1R5cGUuZ2V0RGVyaXZlZFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IHByb3BzW2ldOwotCi0gICAgICAgICAgICAgICAgcHJpbnRQcm9wZXJ0eUdldHRlcnMoCi0gICAgICAgICAgICAgICAgICAgIHByb3AuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBwcm9wLmlzQXR0cmlidXRlKCksCi0gICAgICAgICAgICAgICAgICAgIHByb3AuZ2V0SmF2YVByb3BlcnR5TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBwcm9wLmdldEphdmFUeXBlQ29kZSgpLAotICAgICAgICAgICAgICAgICAgICBqYXZhVHlwZUZvclByb3BlcnR5KHByb3ApLAotICAgICAgICAgICAgICAgICAgICB4bWxUeXBlRm9yUHJvcGVydHkocHJvcCksCi0gICAgICAgICAgICAgICAgICAgIHByb3AuaGFzTmlsbGFibGUoKSAhPSBTY2hlbWFQcm9wZXJ0eS5ORVZFUiwKLSAgICAgICAgICAgICAgICAgICAgcHJvcC5leHRlbmRzSmF2YU9wdGlvbigpLAotICAgICAgICAgICAgICAgICAgICBwcm9wLmV4dGVuZHNKYXZhQXJyYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgcHJvcC5leHRlbmRzSmF2YVNpbmdsZXRvbigpCi0gICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgIGlmICghcHJvcC5pc1JlYWRPbmx5KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcmludFByb3BlcnR5U2V0dGVycygKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3AuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5pc0F0dHJpYnV0ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5nZXRKYXZhUHJvcGVydHlOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmdldEphdmFUeXBlQ29kZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgamF2YVR5cGVGb3JQcm9wZXJ0eShwcm9wKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFR5cGVGb3JQcm9wZXJ0eShwcm9wKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3AuaGFzTmlsbGFibGUoKSAhPSBTY2hlbWFQcm9wZXJ0eS5ORVZFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3AuZXh0ZW5kc0phdmFPcHRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3AuZXh0ZW5kc0phdmFBcnJheSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5leHRlbmRzSmF2YVNpbmdsZXRvbigpCi0gICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaW50TmVzdGVkSW5uZXJUeXBlcyhzVHlwZSwgc3lzdGVtKTsKLQotICAgICAgICBwcmludEZhY3Rvcnkoc1R5cGUpOwotCi0gICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludEZhY3RvcnkoU2NoZW1hVHlwZSBzVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBPbmx5IG5lZWQgZnVsbCBmYWN0b3JpZXMgZm9yIHRvcC1sZXZlbCB0eXBlcwotICAgICAgICBib29sZWFuIGZ1bGxGYWN0b3J5ID0gdHJ1ZTsKLSAgICAgICAgaWYgKHNUeXBlLmlzQW5vbnltb3VzVHlwZSgpICYmICEgc1R5cGUuaXNEb2N1bWVudFR5cGUoKSAmJiAhc1R5cGUuaXNBdHRyaWJ1dGVUeXBlKCkpCi0gICAgICAgICAgICBmdWxsRmFjdG9yeSA9IGZhbHNlOwotCi0gICAgICAgIFN0cmluZyBmdWxsTmFtZSA9IHNUeXBlLmdldEZ1bGxKYXZhTmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpOwotCi0gICAgICAgIGVtaXQoIiIpOwotICAgICAgICBlbWl0KCIvKioiKTsKLSAgICAgICAgZW1pdCgiICogQSBmYWN0b3J5IGNsYXNzIHdpdGggc3RhdGljIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyIpOwotICAgICAgICBlbWl0KCIgKiBvZiB0aGlzIHR5cGUuIik7Ci0gICAgICAgIGVtaXQoIiAqLyIpOwotICAgICAgICBlbWl0KCIiKTsKLSAgICAgICAgLy8gQlVHQlVHIC0gQ2FuIEkgdXNlIHRoZSBuYW1lIGxvYWRlciBoZXJlPyAgY291bGQgaXQgYmUgYQotICAgICAgICAvLyBuZXN0ZWQgdHlwZSBuYW1lPyAgSXQgaXMgbG93ZXIgY2FzZSEKLSAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Iik7Ci0gICAgICAgIGVtaXQoInsiKTsKLSAgICAgICAgaW5kZW50KCk7Ci0KLSAgICAgICAgaWYgKHNUeXBlLmlzU2ltcGxlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgbmV3VmFsdWUoamF2YS5sYW5nLk9iamVjdCBvYmopIHsiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0gICAgICAgIH0KLQotICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgbmV3SW5zdGFuY2UoKSB7Iik7Ci0gICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfSIpOwotICAgICAgICBlbWl0KCIiKTsKLQotICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsiKTsKLSAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Iik7Ci0gICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgIGlmIChmdWxsRmFjdG9yeSkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyAiICsgZnVsbE5hbWUgKyAiIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0KLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geyIpOwotICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Iik7Ci0gICAgICAgICAgICBlbWl0KCIiKTsKLQotICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyAiICsgZnVsbE5hbWUgKyAiIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geyIpOwotICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Iik7Ci0gICAgICAgICAgICBlbWl0KCIiKTsKLQotICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyAiICsgZnVsbE5hbWUgKyAiIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0KLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0KLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Iik7Ci0gICAgICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Iik7Ci0gICAgICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Iik7Ci0gICAgICAgICAgICBlbWl0KCIiKTsKLQotICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyAiICsgZnVsbE5hbWUgKyAiIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Iik7Ci0gICAgICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Iik7Ci0gICAgICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geyIpOwotICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Iik7Ci0gICAgICAgICAgICBlbWl0KCIiKTsKLQotICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyAiICsgZnVsbE5hbWUgKyAiIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Iik7Ci0gICAgICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geyIpOwotICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIiIpOwotCi0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Iik7Ci0gICAgICAgICAgICBlbWl0KCIiKTsKLQotICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Iik7Ci0gICAgICAgICAgICBlbWl0KCIgIHJldHVybiBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0KLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Iik7Ci0gICAgICAgICAgICBlbWl0KCIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVtaXQoInByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQiKTsKLSAgICAgICAgb3V0ZGVudCgpOwotICAgICAgICBlbWl0KCJ9Iik7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludE5lc3RlZElubmVyVHlwZXMoU2NoZW1hVHlwZSBzVHlwZSwgU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZVtdIGFub25UeXBlcyA9IHNUeXBlLmdldEFub255bW91c1R5cGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5vblR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYW5vblR5cGVzW2ldLmlzU2tpcHBlZEFub255bW91c1R5cGUoKSkKLSAgICAgICAgICAgICAgICBwcmludE5lc3RlZElubmVyVHlwZXMoYW5vblR5cGVzW2ldLCBzeXN0ZW0pOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHByaW50SW5uZXJUeXBlKGFub25UeXBlc1tpXSwgc3lzdGVtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcHJpbnRUb3BDb21tZW50KFNjaGVtYVR5cGUgc1R5cGUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW1pdCgiLyoiKTsKLSAgICAgICAgaWYgKHNUeXBlLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0KCIgKiBYTUwgVHlwZTogICIgKyBzVHlwZS5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgZW1pdCgiICogTmFtZXNwYWNlOiAiICsgc1R5cGUuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFFOYW1lIHRoZW5hbWUgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoc1R5cGUuaXNEb2N1bWVudFR5cGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGVuYW1lID0gc1R5cGUuZ2V0RG9jdW1lbnRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAqIEFuIFhNTCBkb2N1bWVudCB0eXBlLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc1R5cGUuaXNBdHRyaWJ1dGVUeXBlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhlbmFtZSA9IHNUeXBlLmdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgZW1pdCgiICogQW4gWE1MIGF0dHJpYnV0ZSB0eXBlLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLQotICAgICAgICAgICAgYXNzZXJ0KCB0aGVuYW1lICE9IG51bGwgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZW1pdCgiICogTG9jYWxuYW1lOiAiICsgdGhlbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICBlbWl0KCIgKiBOYW1lc3BhY2U6ICIgKyB0aGVuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgfQotICAgICAgICBlbWl0KCIgKiBKYXZhIHR5cGU6ICIgKyBzVHlwZS5nZXRGdWxsSmF2YU5hbWUoKSk7Ci0gICAgICAgIGVtaXQoIiAqIik7Ci0gICAgICAgIGVtaXQoIiAqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIC0gZG8gbm90IG1vZGlmeS4iKTsKLSAgICAgICAgZW1pdCgiICovIik7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFBhY2thZ2UoU2NoZW1hVHlwZSBzVHlwZSwgYm9vbGVhbiBpbnRmKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBmcWpuOwotICAgICAgICBpZiAoaW50ZikKLSAgICAgICAgICAgIGZxam4gPSBzVHlwZS5nZXRGdWxsSmF2YU5hbWUoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnFqbiA9IHNUeXBlLmdldEZ1bGxKYXZhSW1wbE5hbWUoKTsKLQotICAgICAgICBpbnQgbGFzdGRvdCA9IGZxam4ubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgaWYgKGxhc3Rkb3QgPCAwKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBTdHJpbmcgcGtnID0gZnFqbi5zdWJzdHJpbmcoMCwgbGFzdGRvdCk7Ci0gICAgICAgIGVtaXQoInBhY2thZ2UgIiArIHBrZyArICI7Iik7Ci0gICAgfQotCi0gICAgdm9pZCBzdGFydEludGVyZmFjZShTY2hlbWFUeXBlIHNUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBzaG9ydE5hbWUgPSBzVHlwZS5nZXRTaG9ydEphdmFOYW1lKCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgYmFzZUludGVyZmFjZSA9IGZpbmRKYXZhVHlwZShzVHlwZS5nZXRCYXNlVHlwZSgpKTsKLQotICAgICAgICAvKgotICAgICAgICBTdHJpbmdCdWZmZXIgc3BlY2lhbGl6ZWRJbnRlcmZhY2VzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIGlmIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5BVE9NSUMgJiYKLSAgICAgICAgICAgIHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSA9PSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgYml0cyA9IHNUeXBlLmdldERlY2ltYWxTaXplKCk7Ci0gICAgICAgICAgICBpZiAoYml0cyA9PSBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVIpCi0gICAgICAgICAgICAgICAgc3BlY2lhbGl6ZWRJbnRlcmZhY2VzLmFwcGVuZCgiLCBvcmcuYXBhY2hlLnhtbGJlYW5zLkJpZ0ludGVnZXJWYWx1ZSIpOwotICAgICAgICAgICAgaWYgKGJpdHMgPT0gU2NoZW1hVHlwZS5TSVpFX0xPTkcpCi0gICAgICAgICAgICAgICAgc3BlY2lhbGl6ZWRJbnRlcmZhY2VzLmFwcGVuZCgiLCBvcmcuYXBhY2hlLnhtbGJlYW5zLkxvbmdWYWx1ZSIpOwotICAgICAgICAgICAgaWYgKGJpdHMgPD0gU2NoZW1hVHlwZS5TSVpFX0lOVCkKLSAgICAgICAgICAgICAgICBzcGVjaWFsaXplZEludGVyZmFjZXMuYXBwZW5kKCIsIG9yZy5hcGFjaGUueG1sYmVhbnMuSW50VmFsdWUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCkKLSAgICAgICAgICAgIHNwZWNpYWxpemVkSW50ZXJmYWNlcy5hcHBlbmQoIiwgb3JnLmFwYWNoZS54bWxiZWFucy5MaXN0VmFsdWUiKTsKLQotICAgICAgICBpZiAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuVU5JT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgY3R5cGUgPSBzVHlwZS5nZXRVbmlvbkNvbW1vbkJhc2VUeXBlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgamF2YVR5cGVIb2xkZXIgPSBqYXZhVHlwZUhvbGRlckZvclR5cGUoY3R5cGUpOwotICAgICAgICAgICAgaWYgKGphdmFUeXBlSG9sZGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3BlY2lhbGl6ZWRJbnRlcmZhY2VzLmFwcGVuZCgiLCAiICsgamF2YVR5cGVIb2xkZXIpOwotICAgICAgICB9Ci0gICAgICAgICovCi0KLSAgICAgICAgZW1pdCgicHVibGljIGludGVyZmFjZSAiICsgc2hvcnROYW1lICsgIiBleHRlbmRzICIgKyBiYXNlSW50ZXJmYWNlKTsKLSAgICAgICAgZW1pdCgieyIpOwotICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgZW1pdFNwZWNpYWxpemVkQWNjZXNzb3JzKHNUeXBlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW1pdFNwZWNpYWxpemVkQWNjZXNzb3JzKFNjaGVtYVR5cGUgc1R5cGUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKHNUeXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkFUT01JQyAmJgotICAgICAgICAgICAgc1R5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpID09IFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBiaXRzID0gc1R5cGUuZ2V0RGVjaW1hbFNpemUoKTsKLSAgICAgICAgICAgIGludCBwYXJlbnRCaXRzID0gc1R5cGUuZ2V0QmFzZVR5cGUoKS5nZXREZWNpbWFsU2l6ZSgpOwotICAgICAgICAgICAgaWYgKGJpdHMgIT0gcGFyZW50Qml0cyB8fCBzVHlwZS5nZXRCYXNlVHlwZSgpLmdldEZ1bGxKYXZhTmFtZSgpID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGJpdHMgPT0gU2NoZW1hVHlwZS5TSVpFX0JJR19JTlRFR0VSKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0QmlnSW50ZWdlclZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoInNldEJpZ0ludGVnZXJWYWx1ZShqYXZhLm1hdGguQmlnSW50ZWdlciBiaSk7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJqYXZhLm1hdGguQmlnSW50ZWdlciBiaWdJbnRlZ2VyVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiLyoqIEBkZXByZWNhdGVkICovIik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0KGphdmEubWF0aC5CaWdJbnRlZ2VyIGJpKTsiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA9PSBTY2hlbWFUeXBlLlNJWkVfTE9ORykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoImxvbmcgZ2V0TG9uZ1ZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0TG9uZ1ZhbHVlKGxvbmcgbCk7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJsb25nIGxvbmdWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCIvKiogQGRlcHJlY2F0ZWQgKi8iKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgidm9pZCBzZXQobG9uZyBsKTsiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA9PSBTY2hlbWFUeXBlLlNJWkVfSU5UKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiaW50IGdldEludFZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0SW50VmFsdWUoaW50IGkpOyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCIvKiogQGRlcHJlY2F0ZWQgKi8iKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiaW50IGludFZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldChpbnQgaSk7Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPT0gU2NoZW1hVHlwZS5TSVpFX1NIT1JUKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgic2hvcnQgZ2V0U2hvcnRWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldFNob3J0VmFsdWUoc2hvcnQgcyk7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJzaG9ydCBzaG9ydFZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldChzaG9ydCBzKTsiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA9PSBTY2hlbWFUeXBlLlNJWkVfQllURSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoImJ5dGUgZ2V0Qnl0ZVZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0Qnl0ZVZhbHVlKGJ5dGUgYik7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCJieXRlIGJ5dGVWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KCIvKiogQGRlcHJlY2F0ZWQgKi8iKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgidm9pZCBzZXQoYnl0ZSBiKTsiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuVU5JT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXQoImphdmEubGFuZy5PYmplY3QgZ2V0T2JqZWN0VmFsdWUoKTsiKTsKLSAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0T2JqZWN0VmFsdWUoamF2YS5sYW5nLk9iamVjdCB2YWwpOyIpOwotICAgICAgICAgICAgZW1pdCgiLyoqIEBkZXByZWNhdGVkICovIik7Ci0gICAgICAgICAgICBlbWl0KCJqYXZhLmxhbmcuT2JqZWN0IG9iamVjdFZhbHVlKCk7Iik7Ci0gICAgICAgICAgICBlbWl0KCIvKiogQGRlcHJlY2F0ZWQgKi8iKTsKLSAgICAgICAgICAgIGVtaXQoInZvaWQgb2JqZWN0U2V0KGphdmEubGFuZy5PYmplY3QgdmFsKTsiKTsKLSAgICAgICAgICAgIGVtaXQoIm9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZSBpbnN0YW5jZVR5cGUoKTsiKTsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgY3R5cGUgPSBzVHlwZS5nZXRVbmlvbkNvbW1vbkJhc2VUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoY3R5cGUgIT0gbnVsbCAmJiBjdHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5VTklPTik7Ci0gICAgICAgICAgICAgICAgZW1pdFNwZWNpYWxpemVkQWNjZXNzb3JzKGN0eXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0KCJqYXZhLnV0aWwuTGlzdCBnZXRMaXN0VmFsdWUoKTsiKTsKLSAgICAgICAgICAgIGVtaXQoImphdmEudXRpbC5MaXN0IHhnZXRMaXN0VmFsdWUoKTsiKTsKLSAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0TGlzdFZhbHVlKGphdmEudXRpbC5MaXN0IGxpc3QpOyIpOwotICAgICAgICAgICAgZW1pdCgiLyoqIEBkZXByZWNhdGVkICovIik7Ci0gICAgICAgICAgICBlbWl0KCJqYXZhLnV0aWwuTGlzdCBsaXN0VmFsdWUoKTsiKTsKLSAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOwotICAgICAgICAgICAgZW1pdCgiamF2YS51dGlsLkxpc3QgeGxpc3RWYWx1ZSgpOyIpOwotICAgICAgICAgICAgZW1pdCgiLyoqIEBkZXByZWNhdGVkICovIik7Ci0gICAgICAgICAgICBlbWl0KCJ2b2lkIHNldChqYXZhLnV0aWwuTGlzdCBsaXN0KTsiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc3RhcnRCbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW1pdCgieyIpOwotICAgICAgICBpbmRlbnQoKTsKLSAgICB9Ci0gICAgdm9pZCBlbmRCbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgb3V0ZGVudCgpOwotICAgICAgICBlbWl0KCJ9Iik7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludEphdmFEb2MoU3RyaW5nIHNlbnRlbmNlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVtaXQoIiIpOwotICAgICAgICBlbWl0KCIvKioiKTsKLSAgICAgICAgZW1pdCgiICogIiArIHNlbnRlbmNlKTsKLSAgICAgICAgZW1pdCgiICovIik7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFNob3J0SmF2YURvYyhTdHJpbmcgc2VudGVuY2UpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZW1pdCgiLyoqICIgKyBzZW50ZW5jZSArICIgKi8iKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU2NoZW1hVHlwZSBmaW5kQmFzZUVudW1UeXBlKFNjaGVtYVR5cGUgc1R5cGUpCi0gICAgewotICAgICAgICB3aGlsZSAoc1R5cGUuZ2V0QmFzZVR5cGUoKS5oYXNTdHJpbmdFbnVtVmFsdWVzKCkpCi0gICAgICAgICAgICBzVHlwZSA9IHNUeXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgIHJldHVybiBzVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBqYXZhU3RyaW5nRXNjYXBlKFN0cmluZyBzdHIpCi0gICAgewotICAgICAgICAvLyBmb3JiaWRkZW46IFxuLCBcciwgXCIsIFxcLgotICAgICAgICB0ZXN0OiB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RyLmNoYXJBdChpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgICAgICAgICBjYXNlICdcIic6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHRlc3Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN0cjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOwotICAgICAgICAgICAgc3dpdGNoIChjaCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXFxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJcXHIiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnXCInOgotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlxcXCIiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlxcXFwiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFN0cmluZ0VudW1lcmF0aW9uKFNjaGVtYVR5cGUgc1R5cGUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZSBiYXNlRW51bVR5cGUgPSBmaW5kQmFzZUVudW1UeXBlKHNUeXBlKTsKLSAgICAgICAgU3RyaW5nIGJhc2VFbnVtQ2xhc3MgPSBiYXNlRW51bVR5cGUuZ2V0RnVsbEphdmFOYW1lKCk7Ci0KLSAgICAgICAgaWYgKGJhc2VFbnVtVHlwZSA9PSBzVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdCgiIik7Ci0gICAgICAgICAgICBlbWl0KCJvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZW51bVZhbHVlKCk7Iik7Ci0gICAgICAgICAgICBlbWl0KCJ2b2lkIHNldChvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZSk7Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBlbWl0KCIiKTsKLSAgICAgICAgU2NoZW1hU3RyaW5nRW51bUVudHJ5W10gZW50cmllcyA9IHNUeXBlLmdldFN0cmluZ0VudW1FbnRyaWVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGVudW1WYWx1ZSA9IGVudHJpZXNbaV0uZ2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICBTdHJpbmcgY29uc3ROYW1lID0gZW50cmllc1tpXS5nZXRFbnVtTmFtZSgpOwotICAgICAgICAgICAgaWYgKGJhc2VFbnVtVHlwZSAhPSBzVHlwZSkKLSAgICAgICAgICAgICAgICBlbWl0KCJzdGF0aWMgZmluYWwgIiArIGJhc2VFbnVtQ2xhc3MgKyAiLkVudW0gIiArIGNvbnN0TmFtZSArICIgPSAiICsgYmFzZUVudW1DbGFzcyArICIuIiArIGNvbnN0TmFtZSArICI7Iik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZW1pdCgic3RhdGljIGZpbmFsIEVudW0gIiArIGNvbnN0TmFtZSArICIgPSBFbnVtLmZvclN0cmluZyhcIiIgKyBqYXZhU3RyaW5nRXNjYXBlKGVudW1WYWx1ZSkgKyAiXCIpOyIpOwotICAgICAgICB9Ci0gICAgICAgIGVtaXQoIiIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBjb25zdE5hbWUgPSAiSU5UXyIgKyBlbnRyaWVzW2ldLmdldEVudW1OYW1lKCk7Ci0gICAgICAgICAgICBpZiAoYmFzZUVudW1UeXBlICE9IHNUeXBlKQotICAgICAgICAgICAgICAgIGVtaXQoInN0YXRpYyBmaW5hbCBpbnQgIiArIGNvbnN0TmFtZSArICIgPSAiICsgYmFzZUVudW1DbGFzcyArICIuIiArIGNvbnN0TmFtZSArICI7Iik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZW1pdCgic3RhdGljIGZpbmFsIGludCAiICsgY29uc3ROYW1lICsgIiA9IEVudW0uIiArIGNvbnN0TmFtZSArICI7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJhc2VFbnVtVHlwZSA9PSBzVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdCgiIik7Ci0gICAgICAgICAgICBlbWl0KCIvKioiKTsKLSAgICAgICAgICAgIGVtaXQoIiAqIEVudW1lcmF0aW9uIHZhbHVlIGNsYXNzIGZvciAiICsgYmFzZUVudW1DbGFzcyArICIuIik7Ci0gICAgICAgICAgICBlbWl0KCIgKiBUaGVzZSBlbnVtIHZhbHVlcyBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOiIpOwotICAgICAgICAgICAgZW1pdCgiICogPHByZT4iKTsKLSAgICAgICAgICAgIGVtaXQoIiAqIGVudW0udG9TdHJpbmcoKTsgLy8gcmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBlbnVtIik7Ci0gICAgICAgICAgICBlbWl0KCIgKiBlbnVtLmludFZhbHVlKCk7IC8vIHJldHVybnMgYW4gaW50IHZhbHVlLCB1c2VmdWwgZm9yIHN3aXRjaGVzIik7Ci0gICAgICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwKQotICAgICAgICAgICAgZW1pdCgiICogLy8gZS5nLiwgY2FzZSBFbnVtLklOVF8iICsgZW50cmllc1swXS5nZXRFbnVtTmFtZSgpKTsKLSAgICAgICAgICAgIGVtaXQoIiAqIEVudW0uZm9yU3RyaW5nKHMpOyAvLyByZXR1cm5zIHRoZSBlbnVtIHZhbHVlIGZvciBhIHN0cmluZyIpOwotICAgICAgICAgICAgZW1pdCgiICogRW51bS5mb3JJbnQoaSk7IC8vIHJldHVybnMgdGhlIGVudW0gdmFsdWUgZm9yIGFuIGludCIpOwotICAgICAgICAgICAgZW1pdCgiICogPC9wcmU+Iik7Ci0gICAgICAgICAgICBlbWl0KCIgKiBFbnVtZXJhdGlvbiBvYmplY3RzIGFyZSBpbW11dGFibGUgc2luZ2xldG9uIG9iamVjdHMgdGhhdCIpOwotICAgICAgICAgICAgZW1pdCgiICogY2FuIGJlIGNvbXBhcmVkIHVzaW5nID09IG9iamVjdCBlcXVhbGl0eS4gVGhleSBoYXZlIG5vIik7Ci0gICAgICAgICAgICBlbWl0KCIgKiBwdWJsaWMgY29uc3RydWN0b3IuIFNlZSB0aGUgY29uc3RhbnRzIGRlZmluZWQgd2l0aGluIHRoaXMiKTsKLSAgICAgICAgICAgIGVtaXQoIiAqIGNsYXNzIGZvciBhbGwgdGhlIHZhbGlkIHZhbHVlcy4iKTsKLSAgICAgICAgICAgIGVtaXQoIiAqLyIpOwotICAgICAgICAgICAgZW1pdCgic3RhdGljIGZpbmFsIGNsYXNzIEVudW0gZXh0ZW5kcyBvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2UiKTsKLSAgICAgICAgICAgIGVtaXQoInsiKTsKLSAgICAgICAgICAgIGluZGVudCgpOwotICAgICAgICAgICAgZW1pdCgiLyoqIik7Ci0gICAgICAgICAgICBlbWl0KCIgKiBSZXR1cm5zIHRoZSBlbnVtIHZhbHVlIGZvciBhIHN0cmluZywgb3IgbnVsbCBpZiBub25lLiIpOwotICAgICAgICAgICAgZW1pdCgiICovIik7Ci0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljIEVudW0gZm9yU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgcykiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgICB7IHJldHVybiAoRW51bSl0YWJsZS5mb3JTdHJpbmcocyk7IH0iKTsKLSAgICAgICAgICAgIGVtaXQoIi8qKiIpOwotICAgICAgICAgICAgZW1pdCgiICogUmV0dXJucyB0aGUgZW51bSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGFuIGludCwgb3IgbnVsbCBpZiBub25lLiIpOwotICAgICAgICAgICAgZW1pdCgiICovIik7Ci0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljIEVudW0gZm9ySW50KGludCBpKSIpOwotICAgICAgICAgICAgZW1pdCgiICAgIHsgcmV0dXJuIChFbnVtKXRhYmxlLmZvckludChpKTsgfSIpOwotICAgICAgICAgICAgZW1pdCgiIik7Ci0gICAgICAgICAgICBlbWl0KCJwcml2YXRlIEVudW0oamF2YS5sYW5nLlN0cmluZyBzLCBpbnQgaSkiKTsKLSAgICAgICAgICAgIGVtaXQoIiAgICB7IHN1cGVyKHMsIGkpOyB9Iik7Ci0gICAgICAgICAgICBlbWl0KCIiKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29uc3ROYW1lID0gIklOVF8iICsgZW50cmllc1tpXS5nZXRFbnVtTmFtZSgpOwotICAgICAgICAgICAgICAgIGludCBpbnRWYWx1ZSA9IGVudHJpZXNbaV0uZ2V0SW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJzdGF0aWMgZmluYWwgaW50ICIgKyBjb25zdE5hbWUgKyAiID0gIiArIGludFZhbHVlICsgIjsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVtaXQoIiIpOwotICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2UuVGFibGUgdGFibGUgPSIpOwotICAgICAgICAgICAgZW1pdCgiICAgIG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2UuVGFibGUiKTsKLSAgICAgICAgICAgIGVtaXQoIigiKTsKLSAgICAgICAgICAgIGluZGVudCgpOwotICAgICAgICAgICAgZW1pdCgibmV3IEVudW1bXSIpOwotICAgICAgICAgICAgZW1pdCgieyIpOwotICAgICAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVudW1WYWx1ZSA9IGVudHJpZXNbaV0uZ2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbnN0TmFtZSA9ICJJTlRfIiArIGVudHJpZXNbaV0uZ2V0RW51bU5hbWUoKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJuZXcgRW51bShcIiIgKyBqYXZhU3RyaW5nRXNjYXBlKGVudW1WYWx1ZSkgKyAiXCIsICIgKyBjb25zdE5hbWUgKyAiKSwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dGRlbnQoKTsKLSAgICAgICAgICAgIGVtaXQoIn0iKTsKLSAgICAgICAgICAgIG91dGRlbnQoKTsKLSAgICAgICAgICAgIGVtaXQoIik7Iik7Ci0gICAgICAgICAgICBlbWl0KCJwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsiKTsKLSAgICAgICAgICAgIGVtaXQoInByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgeyByZXR1cm4gZm9ySW50KGludFZhbHVlKCkpOyB9ICIpOwotICAgICAgICAgICAgb3V0ZGVudCgpOwotICAgICAgICAgICAgZW1pdCgifSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU3RyaW5nIHhtbFR5cGVGb3JQcm9wZXJ0eShTY2hlbWFQcm9wZXJ0eSBzUHJvcCkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUgc1R5cGUgPSBzUHJvcC5qYXZhQmFzZWRPblR5cGUoKTsKLSAgICAgICAgcmV0dXJuIGZpbmRKYXZhVHlwZShzVHlwZSkucmVwbGFjZSgnJCcsICcuJyk7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4geG1sVHlwZUZvclByb3BlcnR5SXNVbmlvbihTY2hlbWFQcm9wZXJ0eSBzUHJvcCkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUgc1R5cGUgPSBzUHJvcC5qYXZhQmFzZWRPblR5cGUoKTsKLSAgICAgICAgcmV0dXJuIChzVHlwZS5pc1NpbXBsZVR5cGUoKSAmJiBzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5VTklPTik7Ci0gICAgfQotCi0gICAgU3RyaW5nIGphdmFUeXBlRm9yUHJvcGVydHkoU2NoZW1hUHJvcGVydHkgc1Byb3ApCi0gICAgewotICAgICAgICAvLyBUaGUgdHlwZSB0byB1c2UgaXMgdGhlIFhNTCBvYmplY3QuLi4uCi0gICAgICAgIGlmIChzUHJvcC5nZXRKYXZhVHlwZUNvZGUoKSA9PSBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlIHNUeXBlID0gc1Byb3AuamF2YUJhc2VkT25UeXBlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmluZEphdmFUeXBlKHNUeXBlKS5yZXBsYWNlKCckJywgJy4nKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoc1Byb3AuZ2V0SmF2YVR5cGVDb2RlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CT09MRUFOOgotICAgICAgICAgICAgICAgIHJldHVybiAiYm9vbGVhbiI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJmbG9hdCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRE9VQkxFOgotICAgICAgICAgICAgICAgIHJldHVybiAiZG91YmxlIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFOgotICAgICAgICAgICAgICAgIHJldHVybiAiYnl0ZSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJzaG9ydCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfSU5UOgotICAgICAgICAgICAgICAgIHJldHVybiAiaW50IjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MT05HOgotICAgICAgICAgICAgICAgIHJldHVybiAibG9uZyI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CSUdfREVDSU1BTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImphdmEubWF0aC5CaWdEZWNpbWFsIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CSUdfSU5URUdFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gImphdmEubWF0aC5CaWdJbnRlZ2VyIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9TVFJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJqYXZhLmxhbmcuU3RyaW5nIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFX0FSUkFZOgotICAgICAgICAgICAgICAgIHJldHVybiAiYnl0ZVtdIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9HREFURToKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuR0RhdGUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEVVJBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuR0R1cmF0aW9uIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9EQVRFOgotICAgICAgICAgICAgICAgIHJldHVybiAiamF2YS51dGlsLkRhdGUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1FOQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiAiamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfTElTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImphdmEudXRpbC5MaXN0IjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9DQUxFTkRBUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gImphdmEudXRpbC5DYWxlbmRhciI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9FTlVNOgotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGUgc1R5cGUgPSBzUHJvcC5qYXZhQmFzZWRPblR5cGUoKS5nZXRCYXNlRW51bVR5cGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmluZEphdmFUeXBlKHNUeXBlKS5yZXBsYWNlKCckJywgJy4nKSArICIuRW51bSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9PQkpFQ1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJqYXZhLmxhbmcuT2JqZWN0IjsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcHJpbnRQcm9wZXJ0eUdldHRlcnMoUU5hbWUgcU5hbWUsIGJvb2xlYW4gaXNBdHRyLAotICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgamF2YVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlLCBTdHJpbmcgeHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmlsbGFibGUsIGJvb2xlYW4gb3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2V2ZXJhbCwgYm9vbGVhbiBzaW5nbGV0b24pCi0gICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgcHJvcGRlc2MgPSAiXCIiICsgcU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyAiXCIiICsgKGlzQXR0ciA/ICIgYXR0cmlidXRlIiA6ICIgZWxlbWVudCIpOwotICAgICAgICBib29sZWFuIHhtbHR5cGUgPSAoamF2YVR5cGUgPT0gU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVCk7Ci0KLSAgICAgICAgaWYgKHNpbmdsZXRvbikKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIkdldHMgZmlyc3QgIiA6ICJHZXRzIHRoZSAiKSArIHByb3BkZXNjKTsKLSAgICAgICAgICAgIGVtaXQodHlwZSArICIgZ2V0IiArIHByb3BlcnR5TmFtZSArICIoKTsiKTsKLQotICAgICAgICAgICAgaWYgKCF4bWx0eXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygoc2V2ZXJhbCA/ICJHZXRzIChhcyB4bWwpIGZpcnN0ICIgOiAiR2V0cyAoYXMgeG1sKSB0aGUgIikgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCh4dHlwZSArICIgeGdldCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCk7Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuaWxsYWJsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiVGVzdHMgZm9yIG5pbCBmaXJzdCAiIDogIlRlc3RzIGZvciBuaWwgIikgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgiYm9vbGVhbiBpc05pbCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCk7Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3B0aW9uYWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50SmF2YURvYygoc2V2ZXJhbCA/ICJUcnVlIGlmIGhhcyBhdCBsZWFzdCBvbmUgIiA6ICJUcnVlIGlmIGhhcyAiKSArIHByb3BkZXNjKTsKLSAgICAgICAgICAgIGVtaXQoImJvb2xlYW4gaXNTZXQiICsgcHJvcGVydHlOYW1lICsgIigpOyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNldmVyYWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBhcnJheU5hbWUgPSBwcm9wZXJ0eU5hbWUgKyAiQXJyYXkiOwotCi0gICAgICAgICAgICBwcmludEphdmFEb2MoIkdldHMgYXJyYXkgb2YgYWxsICIgKyBwcm9wZGVzYyArICJzIik7Ci0gICAgICAgICAgICBlbWl0KHR5cGUgKyAiW10gZ2V0IiArIGFycmF5TmFtZSArICIoKTsiKTsKLQotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJHZXRzIGl0aCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgZW1pdCh0eXBlICsgIiBnZXQiICsgYXJyYXlOYW1lICsgIihpbnQgaSk7Iik7Ci0KLSAgICAgICAgICAgIGlmICgheG1sdHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIkdldHMgKGFzIHhtbCkgYXJyYXkgb2YgYWxsICIgKyBwcm9wZGVzYyArICJzIik7Ci0gICAgICAgICAgICAgICAgZW1pdCh4dHlwZSArICJbXSB4Z2V0IiArIGFycmF5TmFtZSArICIoKTsiKTsKLQotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiR2V0cyAoYXMgeG1sKSBpdGggIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KHh0eXBlICsgIiB4Z2V0IiArIGFycmF5TmFtZSArICIoaW50IGkpOyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobmlsbGFibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJUZXN0cyBmb3IgbmlsIGl0aCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoImJvb2xlYW4gaXNOaWwiICsgYXJyYXlOYW1lICsgIihpbnQgaSk7Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaW50SmF2YURvYygiUmV0dXJucyBudW1iZXIgb2YgIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgIGVtaXQoImludCBzaXplT2YiICsgYXJyYXlOYW1lICsgIigpOyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFByb3BlcnR5U2V0dGVycyhRTmFtZSBxTmFtZSwgYm9vbGVhbiBpc0F0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBqYXZhVHlwZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB4dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuaWxsYWJsZSwgYm9vbGVhbiBvcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXZlcmFsLCBib29sZWFuIHNpbmdsZXRvbikKLSAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBzYWZlVmFyTmFtZSA9IE5hbWVVdGlsLm5vbkphdmFLZXl3b3JkKE5hbWVVdGlsLmxvd2VyQ2FtZWxDYXNlKHByb3BlcnR5TmFtZSkpOwotICAgICAgICBpZiAoc2FmZVZhck5hbWUuZXF1YWxzKCJpIikpCi0gICAgICAgICAgICBzYWZlVmFyTmFtZSA9ICJpVmFsdWUiOwotICAgICAgICBib29sZWFuIHhtbHR5cGUgPSAoamF2YVR5cGUgPT0gU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVCk7Ci0KLSAgICAgICAgU3RyaW5nIHByb3BkZXNjID0gIlwiIiArIHFOYW1lLmdldExvY2FsUGFydCgpICsgIlwiIiArIChpc0F0dHIgPyAiIGF0dHJpYnV0ZSIgOiAiIGVsZW1lbnQiKTsKLQotICAgICAgICBpZiAoc2luZ2xldG9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiU2V0cyBmaXJzdCAiIDogIlNldHMgdGhlICIpICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgZW1pdCgidm9pZCBzZXQiICsgcHJvcGVydHlOYW1lICsgIigiICsgdHlwZSArICIgIiArIHNhZmVWYXJOYW1lICsgIik7Iik7Ci0KLSAgICAgICAgICAgIGlmICgheG1sdHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiU2V0cyAoYXMgeG1sKSBmaXJzdCAiIDogIlNldHMgKGFzIHhtbCkgdGhlICIpICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgeHNldCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCIgKyB4dHlwZSArICIgIiArIHNhZmVWYXJOYW1lICsgIik7Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh4bWx0eXBlICYmICFzZXZlcmFsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiQXBwZW5kcyBhbmQgcmV0dXJucyBhIG5ldyBlbXB0eSAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoeHR5cGUgKyAiIGFkZE5ldyIgKyBwcm9wZXJ0eU5hbWUgKyAiKCk7Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuaWxsYWJsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiTmlscyB0aGUgZmlyc3QgIiA6ICJOaWxzIHRoZSAiKSArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldE5pbCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCk7Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3B0aW9uYWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50SmF2YURvYygoc2V2ZXJhbCA/ICJSZW1vdmVzIGZpcnN0ICIgOiAiVW5zZXRzIHRoZSAiKSArIHByb3BkZXNjKTsKLSAgICAgICAgICAgIGVtaXQoInZvaWQgdW5zZXQiICsgcHJvcGVydHlOYW1lICsgIigpOyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNldmVyYWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBhcnJheU5hbWUgPSBwcm9wZXJ0eU5hbWUgKyAiQXJyYXkiOwotCi0gICAgICAgICAgICBwcmludEphdmFEb2MoIlNldHMgYXJyYXkgb2YgYWxsICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICBlbWl0KCJ2b2lkIHNldCIgKyBhcnJheU5hbWUgKyAiKCIgKyB0eXBlICsgIltdICIgKyBzYWZlVmFyTmFtZSArICJBcnJheSk7Iik7Ci0KLSAgICAgICAgICAgIHByaW50SmF2YURvYygiU2V0cyBpdGggIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0IiArIGFycmF5TmFtZSArICIoaW50IGksICIgKyB0eXBlICsgIiAiICsgc2FmZVZhck5hbWUgKyAiKTsiKTsKLQotICAgICAgICAgICAgaWYgKCF4bWx0eXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiU2V0cyAoYXMgeG1sKSBhcnJheSBvZiBhbGwgIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHhzZXQiICsgYXJyYXlOYW1lICsgIigiICsgeHR5cGUgKyAiW10iICsgc2FmZVZhck5hbWUgKyAiQXJyYXkpOyIpOwotCi0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJTZXRzIChhcyB4bWwpIGl0aCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgeHNldCIgKyBhcnJheU5hbWUgKyAiKGludCBpLCAiICsgeHR5cGUgKyAiICIgKyBzYWZlVmFyTmFtZSArICIpOyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobmlsbGFibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJOaWxzIHRoZSBpdGggIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldE5pbCIgKyBhcnJheU5hbWUgKyAiKGludCBpKTsiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCF4bWx0eXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiSW5zZXJ0cyB0aGUgdmFsdWUgYXMgdGhlIGl0aCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgaW5zZXJ0IiArIHByb3BlcnR5TmFtZSArICIoaW50IGksICIgKyB0eXBlICsgIiAiICsgc2FmZVZhck5hbWUgKyAiKTsiKTsKLQotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiQXBwZW5kcyB0aGUgdmFsdWUgYXMgdGhlIGxhc3QgIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIGFkZCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCIgKyB0eXBlICsgIiAiICsgc2FmZVZhck5hbWUgKyAiKTsiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHhtbHR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJJbnNlcnRzIGFuZCByZXR1cm5zIGEgbmV3IGVtcHR5IHZhbHVlIChhcyB4bWwpIGFzIHRoZSBpdGggIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KHh0eXBlICsgIiBpbnNlcnROZXciICsgcHJvcGVydHlOYW1lICsgIihpbnQgaSk7Iik7Ci0gICAgCi0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJBcHBlbmRzIGFuZCByZXR1cm5zIGEgbmV3IGVtcHR5IHZhbHVlIChhcyB4bWwpIGFzIHRoZSBsYXN0ICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCh4dHlwZSArICIgYWRkTmV3IiArIHByb3BlcnR5TmFtZSArICIoKTsiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJSZW1vdmVzIHRoZSBpdGggIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgIGVtaXQoInZvaWQgcmVtb3ZlIiArIHByb3BlcnR5TmFtZSArICIoaW50IGkpOyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU3RyaW5nIGdldEF0b21pY1Jlc3RyaWN0aW9uVHlwZShTY2hlbWFUeXBlIHNUeXBlKSB7Ci0gICAgICAgIFNjaGVtYVR5cGUgcFR5cGUgPSBzVHlwZS5nZXRQcmltaXRpdmVUeXBlKCk7Ci0gICAgICAgIHN3aXRjaCAocFR5cGUuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sQW55U2ltcGxlVHlwZUltcGwiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgotICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhQm9vbGVhbkhvbGRlckV4IjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFCYXNlNjRIb2xkZXJFeCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFIZXhCaW5hcnlIb2xkZXJFeCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9VUkk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFVcmlIb2xkZXJFeCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhUU5hbWVIb2xkZXJFeCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhTm90YXRpb25Ib2xkZXJFeCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUOgotICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhRmxvYXRIb2xkZXJFeCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YURvdWJsZUhvbGRlckV4IjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHNUeXBlLmdldERlY2ltYWxTaXplKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQklHX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YURlY2ltYWxIb2xkZXJFeCI7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0JJR19JTlRFR0VSOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFJbnRlZ2VySG9sZGVyRXgiOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9MT05HOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFMb25nSG9sZGVyRXgiOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX1NIT1JUOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CWVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFJbnRIb2xkZXJFeCI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgaWYgKHNUeXBlLmhhc1N0cmluZ0VudW1WYWx1ZXMoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFTdHJpbmdFbnVtZXJhdGlvbkhvbGRlckV4IjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhU3RyaW5nSG9sZGVyRXgiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUdEYXRlSG9sZGVyRXgiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhR0R1cmF0aW9uSG9sZGVyRXgiOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpIDogInVucmVjb2duaXplZCBwcmltaXRpdmUgdHlwZSI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU2NoZW1hVHlwZSBmaW5kQmFzZVR5cGUoU2NoZW1hVHlwZSBzVHlwZSkKLSAgICB7Ci0gICAgICAgIHdoaWxlIChzVHlwZS5nZXRGdWxsSmF2YU5hbWUoKSA9PSBudWxsKQotICAgICAgICAgICAgc1R5cGUgPSBzVHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgICByZXR1cm4gc1R5cGU7Ci0gICAgfQotCi0gICAgU3RyaW5nIGdldEJhc2VDbGFzcyhTY2hlbWFUeXBlIHNUeXBlKSB7Ci0gICAgICAgIFNjaGVtYVR5cGUgYmFzZVR5cGUgPSBmaW5kQmFzZVR5cGUoc1R5cGUuZ2V0QmFzZVR5cGUoKSk7Ci0KLSAgICAgICAgc3dpdGNoIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5OT1RfU0lNUExFOgotICAgICAgICAgICAgICAgIC8vIG5vbi1zaW1wbGUtY29udGVudDogaW5oZXJpdCBmcm9tIGJhc2UgdHlwZSBpbXBsCi0gICAgICAgICAgICAgICAgaWYgKCFYbWxPYmplY3QudHlwZS5lcXVhbHMoYmFzZVR5cGUpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVR5cGUuZ2V0RnVsbEphdmFJbXBsTmFtZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxDb21wbGV4Q29udGVudEltcGwiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQVRPTUlDOgotICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBvbmx5IGdldCBjYWxsZWQgZm9yIHJlc3RyaWN0aW9ucwotICAgICAgICAgICAgICAgIGFzc2VydCghIHNUeXBlLmlzQnVpbHRpblR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEF0b21pY1Jlc3RyaWN0aW9uVHlwZShzVHlwZSk7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxMaXN0SW1wbCI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5VTklPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sVW5pb25JbXBsIjsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHByaW50Q29uc3RydWN0b3IoU2NoZW1hVHlwZSBzVHlwZSwgU3RyaW5nIHNob3J0TmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZW1pdCgiIik7Ci0gICAgICAgIGVtaXQoInB1YmxpYyAiICsgc2hvcnROYW1lICsgIihvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGUgc1R5cGUpIik7Ci0gICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgZW1pdCgic3VwZXIoc1R5cGUiICsgKHNUeXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLk5PVF9TSU1QTEUgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgIiArICFzVHlwZS5pc1NpbXBsZVR5cGUoKSkgKwotICAgICAgICAgICAgICIpOyIpOwotICAgICAgICBlbmRCbG9jaygpOwotCi0gICAgICAgIGlmIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5OT1RfU0lNUExFKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0KCIiKTsKLSAgICAgICAgICAgIGVtaXQoInByb3RlY3RlZCAiICsgc2hvcnROYW1lICsgIihvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGUgc1R5cGUsIGJvb2xlYW4gYikiKTsKLSAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgIGVtaXQoInN1cGVyKHNUeXBlLCBiKTsiKTsKLSAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHN0YXJ0Q2xhc3MoU2NoZW1hVHlwZSBzVHlwZSwgYm9vbGVhbiBpc0lubmVyKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBzaG9ydE5hbWUgPSBzVHlwZS5nZXRTaG9ydEphdmFJbXBsTmFtZSgpOwotICAgICAgICBTdHJpbmcgYmFzZUNsYXNzID0gZ2V0QmFzZUNsYXNzKHNUeXBlKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGludGVyZmFjZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGludGVyZmFjZXMuYXBwZW5kKHNUeXBlLmdldEZ1bGxKYXZhTmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpKTsKLQotICAgICAgICBpZiAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuVU5JT04pIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGVbXSBtZW1iZXJUeXBlcyA9IHNUeXBlLmdldFVuaW9uTWVtYmVyVHlwZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG1lbWJlclR5cGVzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgICAgICBpbnRlcmZhY2VzLmFwcGVuZCgiLCAiICsgbWVtYmVyVHlwZXNbaV0uZ2V0RnVsbEphdmFOYW1lKCkucmVwbGFjZSgnJCcsICcuJykpOwotICAgICAgICB9Ci0KLSAgICAgICAgZW1pdCgicHVibGljICIgKyAoIGlzSW5uZXIgPyAic3RhdGljICI6ICIiICkgKyAiY2xhc3MgIiArIHNob3J0TmFtZSArCi0gICAgICAgICAgICAiIGV4dGVuZHMgIiArIGJhc2VDbGFzcyArICIgaW1wbGVtZW50cyAiICsgaW50ZXJmYWNlcy50b1N0cmluZygpKTsKLQotICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgfQotCi0gICAgdm9pZCBtYWtlQXR0cmlidXRlRGVmYXVsdFZhbHVlKFN0cmluZyBqdGFyZ2V0VHlwZSwgU2NoZW1hUHJvcGVydHkgcHJvcCwgU3RyaW5nIGlkZW50aWZpZXIpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGZ1bGxOYW1lID0ganRhcmdldFR5cGU7Ci0gICAgICAgIGlmIChmdWxsTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgZnVsbE5hbWUgPSBwcm9wLmphdmFCYXNlZE9uVHlwZSgpLmdldEZ1bGxKYXZhTmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpOwotCi0gICAgICAgIGVtaXQoInRhcmdldCA9ICgiICsgZnVsbE5hbWUgKyAiKWdldF9kZWZhdWx0X2F0dHJpYnV0ZV92YWx1ZSgiICsgaWRlbnRpZmllciArICIpOyIpOwotICAgIH0KLQotICAgIHZvaWQgbWFrZU1pc3NpbmdWYWx1ZShpbnQgamF2YVR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3dpdGNoIChqYXZhVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JPT0xFQU46Ci0gICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuIGZhbHNlOyIpOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0ZMT0FUOgotICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiAwLjBmOyIpOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RPVUJMRToKLSAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gMC4wOyIpOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfU0hPUlQ6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfSU5UOgotICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiAwOyIpOyBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xPTkc6Ci0gICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuIDBMOyIpOyBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CSUdfREVDSU1BTDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CSUdfSU5URUdFUjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9TVFJJTkc6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURV9BUlJBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9HREFURToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9HRFVSQVRJT046Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfREFURToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9RTkFNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MSVNUOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0NBTEVOREFSOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0VOVU06Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfT0JKRUNUOgotICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiBudWxsOyIpOyBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcHJpbnRKR2V0QXJyYXlWYWx1ZShpbnQgamF2YVR5cGUsIFN0cmluZyB0eXBlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzd2l0Y2ggKGphdmFUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LlhNTF9PQkpFQ1Q6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRU5VTToKLSAgICAgICAgICAgICAgICBlbWl0KHR5cGUgKyAiW10gcmVzdWx0ID0gbmV3ICIgKyB0eXBlICsgIlt0YXJnZXRMaXN0LnNpemUoKV07Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgidGFyZ2V0TGlzdC50b0FycmF5KHJlc3VsdCk7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CT09MRUFOOgotICAgICAgICAgICAgICAgIGVtaXQoImJvb2xlYW5bXSByZXN1bHQgPSBuZXcgYm9vbGVhblt0YXJnZXRMaXN0LnNpemUoKV07Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRCb29sZWFuVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0ZMT0FUOgotICAgICAgICAgICAgICAgIGVtaXQoImZsb2F0W10gcmVzdWx0ID0gbmV3IGZsb2F0W3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldEZsb2F0VmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RPVUJMRToKLSAgICAgICAgICAgICAgICBlbWl0KCJkb3VibGVbXSByZXN1bHQgPSBuZXcgZG91YmxlW3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldERvdWJsZVZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFOgotICAgICAgICAgICAgICAgIGVtaXQoImJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVt0YXJnZXRMaXN0LnNpemUoKV07Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRCeXRlVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NIT1JUOgotICAgICAgICAgICAgICAgIGVtaXQoInNob3J0W10gcmVzdWx0ID0gbmV3IHNob3J0W3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldFNob3J0VmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0lOVDoKLSAgICAgICAgICAgICAgICBlbWl0KCJpbnRbXSByZXN1bHQgPSBuZXcgaW50W3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldEludFZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MT05HOgotICAgICAgICAgICAgICAgIGVtaXQoImxvbmdbXSByZXN1bHQgPSBuZXcgbG9uZ1t0YXJnZXRMaXN0LnNpemUoKV07Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRMb25nVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19ERUNJTUFMOgotICAgICAgICAgICAgICAgIGVtaXQoImphdmEubWF0aC5CaWdEZWNpbWFsW10gcmVzdWx0ID0gbmV3IGphdmEubWF0aC5CaWdEZWNpbWFsW3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldEJpZ0RlY2ltYWxWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgZW1pdCgiamF2YS5tYXRoLkJpZ0ludGVnZXJbXSByZXN1bHQgPSBuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXJbdGFyZ2V0TGlzdC5zaXplKCldOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0QmlnSW50ZWdlclZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9TVFJJTkc6Ci0gICAgICAgICAgICAgICAgZW1pdCgiamF2YS5sYW5nLlN0cmluZ1tdIHJlc3VsdCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nW3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldFN0cmluZ1ZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFX0FSUkFZOgotICAgICAgICAgICAgICAgIGVtaXQoImJ5dGVbXVtdIHJlc3VsdCA9IG5ldyBieXRlW3RhcmdldExpc3Quc2l6ZSgpXVtdOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0Qnl0ZUFycmF5VmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0NBTEVOREFSOgotICAgICAgICAgICAgICAgIGVtaXQoImphdmEudXRpbC5DYWxlbmRhcltdIHJlc3VsdCA9IG5ldyBqYXZhLnV0aWwuQ2FsZW5kYXJbdGFyZ2V0TGlzdC5zaXplKCldOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0Q2FsZW5kYXJWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfREFURToKLSAgICAgICAgICAgICAgICBlbWl0KCJqYXZhLnV0aWwuRGF0ZVtdIHJlc3VsdCA9IG5ldyBqYXZhLnV0aWwuRGF0ZVt0YXJnZXRMaXN0LnNpemUoKV07Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXREYXRlVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEQVRFOgotICAgICAgICAgICAgICAgIGVtaXQoIm9yZy5hcGFjaGUueG1sYmVhbnMuR0RhdGVbXSByZXN1bHQgPSBuZXcgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZVt0YXJnZXRMaXN0LnNpemUoKV07Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRHRGF0ZVZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9HRFVSQVRJT046Ci0gICAgICAgICAgICAgICAgZW1pdCgib3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb25bXSByZXN1bHQgPSBuZXcgb3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb25bdGFyZ2V0TGlzdC5zaXplKCldOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0R0R1cmF0aW9uVmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1FOQU1FOgotICAgICAgICAgICAgICAgIGVtaXQoImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSByZXN1bHQgPSBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVt0YXJnZXRMaXN0LnNpemUoKV07Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRRTmFtZVZhbHVlKCk7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MSVNUOgotICAgICAgICAgICAgICAgIGVtaXQoImphdmEudXRpbC5MaXN0W10gcmVzdWx0ID0gbmV3IGphdmEudXRpbC5MaXN0W3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOwotICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldExpc3RWYWx1ZSgpOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfT0JKRUNUOgotICAgICAgICAgICAgICAgIGVtaXQoIk9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbdGFyZ2V0TGlzdC5zaXplKCldOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0T2JqZWN0VmFsdWUoKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICB9Ci0gICAgICAgIGVtaXQoInJldHVybiByZXN1bHQ7Iik7Ci0gICAgfQotICAgIHZvaWQgcHJpbnRKR2V0VmFsdWUoaW50IGphdmFUeXBlLCBTdHJpbmcgdHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3dpdGNoIChqYXZhVHlwZSkKLSAgICAgICAgewotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LlhNTF9PQkpFQ1Q6Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0OyIpOyBicmVhazsKLQotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQk9PTEVBTjoKLSAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0Qm9vbGVhblZhbHVlKCk7Iik7IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9GTE9BVDoKLSAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0RmxvYXRWYWx1ZSgpOyIpOyBicmVhazsKLQotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRE9VQkxFOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXREb3VibGVWYWx1ZSgpOyIpOyBicmVhazsKLQotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURToKLSAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0Qnl0ZVZhbHVlKCk7Iik7IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9TSE9SVDoKLSAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0U2hvcnRWYWx1ZSgpOyIpOyBicmVhazsKLQotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfSU5UOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRJbnRWYWx1ZSgpOyIpOyBicmVhazsKLQotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfTE9ORzoKLSAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0TG9uZ1ZhbHVlKCk7Iik7IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CSUdfREVDSU1BTDoKLSAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0QmlnRGVjaW1hbFZhbHVlKCk7Iik7IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CSUdfSU5URUdFUjoKLSAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0QmlnSW50ZWdlclZhbHVlKCk7Iik7IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9TVFJJTkc6Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldFN0cmluZ1ZhbHVlKCk7Iik7IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFX0FSUkFZOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRCeXRlQXJyYXlWYWx1ZSgpOyIpOyBicmVhazsKLQotICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfR0RBVEU6Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldEdEYXRlVmFsdWUoKTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEVVJBVElPTjoKLSAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0R0R1cmF0aW9uVmFsdWUoKTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0NBTEVOREFSOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRDYWxlbmRhclZhbHVlKCk7Iik7IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9EQVRFOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXREYXRlVmFsdWUoKTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1FOQU1FOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRRTmFtZVZhbHVlKCk7Iik7IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MSVNUOgotICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRMaXN0VmFsdWUoKTsiKTsgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0VOVU06Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gKCIgKyB0eXBlICsgIil0YXJnZXQuZ2V0RW51bVZhbHVlKCk7Iik7IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9PQkpFQ1Q6Ci0gICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldE9iamVjdFZhbHVlKCk7Iik7IGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU3RyaW5nIGpzZXRNZXRob2QoaW50IGphdmFUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoamF2YVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXQiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRCb29sZWFuVmFsdWUiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0RmxvYXRWYWx1ZSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9ET1VCTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0RG91YmxlVmFsdWUiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURToKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRCeXRlVmFsdWUiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0U2hvcnRWYWx1ZSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9JTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0SW50VmFsdWUiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfTE9ORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRMb25nVmFsdWUiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0QmlnRGVjaW1hbFZhbHVlIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19JTlRFR0VSOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldEJpZ0ludGVnZXJWYWx1ZSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9TVFJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0U3RyaW5nVmFsdWUiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURV9BUlJBWToKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRCeXRlQXJyYXlWYWx1ZSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9HREFURToKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRHRGF0ZVZhbHVlIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEVVJBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRHRHVyYXRpb25WYWx1ZSI7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9DQUxFTkRBUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRDYWxlbmRhclZhbHVlIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RBVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0RGF0ZVZhbHVlIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1FOQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldFFOYW1lVmFsdWUiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfTElTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRMaXN0VmFsdWUiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRU5VTToKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRFbnVtVmFsdWUiOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfT0JKRUNUOgotICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldE9iamVjdFZhbHVlIjsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0SWRlbnRpZmllcihNYXAgcU5hbWVNYXAsIFFOYW1lIHFOYW1lKSB7Ci0gICAgICAgIHJldHVybiAoKFN0cmluZ1tdKXFOYW1lTWFwLmdldChxTmFtZSkpWzBdOwotICAgIH0KLQotICAgIFN0cmluZyBnZXRTZXRJZGVudGlmaWVyKE1hcCBxTmFtZU1hcCwgUU5hbWUgcU5hbWUpIHsKLSAgICAgICAgU3RyaW5nW10gaWRlbnRpZmllcnMgPSAoU3RyaW5nW10pcU5hbWVNYXAuZ2V0KHFOYW1lKTsKLSAgICAgICAgcmV0dXJuIGlkZW50aWZpZXJzWzFdID09IG51bGwgPyBpZGVudGlmaWVyc1swXSA6IGlkZW50aWZpZXJzWzFdOwotICAgIH0KLQotICAgIE1hcCBwcmludFN0YXRpY0ZpZWxkcyhTY2hlbWFQcm9wZXJ0eVtdIHByb3BlcnRpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1hcCByZXN1bHRzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBlbWl0KCIiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBpZGVudGlmaWVycyA9IG5ldyBTdHJpbmdbMl07Ci0gICAgICAgICAgICBmaW5hbCBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gcHJvcGVydGllc1tpXTsKLSAgICAgICAgICAgIGZpbmFsIFFOYW1lIG5hbWUgPSBwcm9wLmdldE5hbWUoKTsKLSAgICAgICAgICAgIHJlc3VsdHMucHV0KG5hbWUsIGlkZW50aWZpZXJzKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBqYXZhTmFtZSA9IHByb3AuZ2V0SmF2YVByb3BlcnR5TmFtZSgpOwotICAgICAgICAgICAgaWRlbnRpZmllcnNbMF0gPSAoamF2YU5hbWUgKyAiJCIgKyAoaSAqIDIpKS50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVyaVN0cmluZyA9ICAiXCIiICsgbmFtZS5nZXROYW1lc3BhY2VVUkkoKSArICJcIiI7Ci0KLSAgICAgICAgICAgIGVtaXQoInByaXZhdGUgc3RhdGljIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgIiArIGlkZW50aWZpZXJzWzBdICsKLSAgICAgICAgICAgICAgICAgIiA9ICIgKTsKLSAgICAgICAgICAgIGluZGVudCgpOwotICAgICAgICAgICAgZW1pdCgibmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIiArCi0gICAgICAgICAgICAgICAgIHVyaVN0cmluZyArICIsIFwiIiArIG5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyAiXCIpOyIpOwotICAgICAgICAgICAgb3V0ZGVudCgpOwotCi0gICAgICAgICAgICBpZiAocHJvcGVydGllc1tpXS5hY2NlcHRlZE5hbWVzKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBRTmFtZVtdIHFuYW1lcyA9IHByb3BlcnRpZXNbaV0uYWNjZXB0ZWROYW1lcygpOwotCi0gICAgICAgICAgICAgICAgaWYgKHFuYW1lcy5sZW5ndGggPiAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcnNbMV0gPSAoamF2YU5hbWUgKyAiJCIgKyAoaSoyKzEpKS50b1VwcGVyQ2FzZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGVtaXQoInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQgIiArIGlkZW50aWZpZXJzWzFdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgPSBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0LmZvckFycmF5KCBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHsgIiApOwotICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAgOyBqIDwgcW5hbWVzLmxlbmd0aCA7IGorKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdCgibmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoXCIiICsgcW5hbWVzW2pdLmdldE5hbWVzcGFjZVVSSSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIsIFwiIiArIHFuYW1lc1tqXS5nZXRMb2NhbFBhcnQoKSArICJcIiksIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBvdXRkZW50KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZW1pdCgifSk7Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVtaXQoIiIpOwotICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICB9Ci0KLSAgICB2b2lkIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBlbWl0KCJzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkiKTsKLSAgICAgICAgZW1pdCgieyIpOwotICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgZW1pdCgiY2hlY2tfb3JwaGFuZWQoKTsiKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG91dGRlbnQoKTsKLSAgICAgICAgZW1pdCgifSIpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGVtaXRBZGRUYXJnZXQoU3RyaW5nIGlkZW50aWZpZXIsIGJvb2xlYW4gaXNBdHRyLCBib29sZWFuIGRlY2xhcmVUYXJnZXQsIFN0cmluZyB4dHlwZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoZGVjbGFyZVRhcmdldCkKLSAgICAgICAgICAgIGVtaXQoeHR5cGUgKyAiIHRhcmdldDsiKTsKLSAgICAgICAgaWYgKGlzQXR0cikKLSAgICAgICAgICAgIGVtaXQoInRhcmdldCA9ICgiICsgeHR5cGUgKyAiKWdldF9zdG9yZSgpLmFkZF9hdHRyaWJ1dGVfdXNlcigiICsgaWRlbnRpZmllciArICIpOyIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlbWl0KCJ0YXJnZXQgPSAoIiArIHh0eXBlICsgIilnZXRfc3RvcmUoKS5hZGRfZWxlbWVudF91c2VyKCIgKyBpZGVudGlmaWVyICsgIik7Iik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVEhJTkcgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERfTkVXX1ZBTFVFID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEhST1dfRVhDRVBUSU9OID0gNDsKLQotICAgIHZvaWQgZW1pdEdldFRhcmdldChTdHJpbmcgc2V0SWRlbnRpZmllciwgCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZGVudGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQXR0ciwgCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbmRleCwgCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBudWxsQmVoYXZpb3VyLAotICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgeHR5cGUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYXNzZXJ0IHNldElkZW50aWZpZXIgIT0gbnVsbCAmJiBpZGVudGlmaWVyICE9IG51bGw7Ci0KLSAgICAgICAgZW1pdCh4dHlwZSArICIgdGFyZ2V0ID0gbnVsbDsiKTsKLQotICAgICAgICBpZiAoaXNBdHRyKQotICAgICAgICAgICAgZW1pdCgidGFyZ2V0ID0gKCIgKyB4dHlwZSArICIpZ2V0X3N0b3JlKCkuZmluZF9hdHRyaWJ1dGVfdXNlcigiICsgaWRlbnRpZmllciArICIpOyIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlbWl0KCJ0YXJnZXQgPSAoIiArIHh0eXBlICsgIilnZXRfc3RvcmUoKS5maW5kX2VsZW1lbnRfdXNlcigiICsgc2V0SWRlbnRpZmllciArICIsICIgKyBpbmRleCArICIpOyIpOwotCi0gICAgICAgIGlmIChudWxsQmVoYXZpb3VyID09IE5PVEhJTkcpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgZW1pdCgiaWYgKHRhcmdldCA9PSBudWxsKSIpOwotCi0gICAgICAgIHN0YXJ0QmxvY2soKTsKLQotICAgICAgICBzd2l0Y2ggKG51bGxCZWhhdmlvdXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgQUREX05FV19WQUxVRToKLSAgICAgICAgICAgICAgICBlbWl0QWRkVGFyZ2V0KGlkZW50aWZpZXIsIGlzQXR0ciwgZmFsc2UsIHh0eXBlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBUSFJPV19FWENFUFRJT046Ci0gICAgICAgICAgICAgICAgZW1pdCgidGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBOT1RISU5HOgotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6ICJCYWQgYmVoYXZpb3VyIHR5cGU6ICIgKyBudWxsQmVoYXZpb3VyOwotICAgICAgICB9Ci0KLSAgICAgICAgZW5kQmxvY2soKTsKLSAgICB9Ci0KLSAgICB2b2lkIHByaW50R2V0dGVySW1wbHMoCi0gICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AsIFFOYW1lIHFOYW1lLCBib29sZWFuIGlzQXR0ciwgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgaW50IGphdmFUeXBlLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHh0eXBlLCBib29sZWFuIG5pbGxhYmxlLAotICAgICAgICBib29sZWFuIG9wdGlvbmFsLCBib29sZWFuIHNldmVyYWwsIGJvb2xlYW4gc2luZ2xldG9uLAotICAgICAgICBib29sZWFuIGlzdW5pb24sCi0gICAgICAgIFN0cmluZyBpZGVudGlmaWVyLCBTdHJpbmcgc2V0SWRlbnRpZmllciApCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBwcm9wZGVzYyA9ICJcIiIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKSArICJcIiIgKyAoaXNBdHRyID8gIiBhdHRyaWJ1dGUiIDogIiBlbGVtZW50Iik7Ci0gICAgICAgIGJvb2xlYW4geG1sdHlwZSA9IChqYXZhVHlwZSA9PSBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUKTsKLSAgICAgICAgU3RyaW5nIGp0YXJnZXRUeXBlID0gKGlzdW5pb24gfHwgIXhtbHR5cGUpID8gIm9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUiIDogeHR5cGU7Ci0KLSAgICAgICAgaWYgKHNpbmdsZXRvbikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVmFsdWUgZ2V0UHJvcCgpCi0gICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiR2V0cyBmaXJzdCAiIDogIkdldHMgdGhlICIpICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgZW1pdCgicHVibGljICIgKyB0eXBlICsgIiBnZXQiICsgcHJvcGVydHlOYW1lICsgIigpIik7Ci0gICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotCi0gICAgICAgICAgICBlbWl0R2V0VGFyZ2V0KHNldElkZW50aWZpZXIsIGlkZW50aWZpZXIsIGlzQXR0ciwgIjAiLCBOT1RISU5HLCBqdGFyZ2V0VHlwZSk7Ci0KLSAgICAgICAgICAgIGlmIChpc0F0dHIgJiYgKHByb3AuaGFzRGVmYXVsdCgpID09IFNjaGVtYVByb3BlcnR5LkNPTlNJU1RFTlRMWSB8fAotICAgICAgICAgICAgICAgICAgICBwcm9wLmhhc0ZpeGVkKCkgPT0gU2NoZW1hUHJvcGVydHkuQ09OU0lTVEVOVExZKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0KCJpZiAodGFyZ2V0ID09IG51bGwpIik7Ci0gICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgICAgIG1ha2VBdHRyaWJ1dGVEZWZhdWx0VmFsdWUoanRhcmdldFR5cGUsIHByb3AsIGlkZW50aWZpZXIpOwotICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbWl0KCJpZiAodGFyZ2V0ID09IG51bGwpIik7Ci0gICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICBtYWtlTWlzc2luZ1ZhbHVlKGphdmFUeXBlKTsKLSAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0KLQotICAgICAgICAgICAgcHJpbnRKR2V0VmFsdWUoamF2YVR5cGUsIHR5cGUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLQotICAgICAgICAgICAgZW5kQmxvY2soKTsKLQotICAgICAgICAgICAgaWYgKCF4bWx0eXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFZhbHVlIHhnZXRQcm9wKCkKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiR2V0cyAoYXMgeG1sKSBmaXJzdCAiIDogIkdldHMgKGFzIHhtbCkgdGhlICIpICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyAiICsgeHR5cGUgKyAiIHhnZXQiICsgcHJvcGVydHlOYW1lICsgIigpIik7Ci0gICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEdldFRhcmdldChzZXRJZGVudGlmaWVyLCBpZGVudGlmaWVyLCBpc0F0dHIsICIwIiwgTk9USElORywgeHR5cGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzQXR0ciAmJiAocHJvcC5oYXNEZWZhdWx0KCkgPT0gU2NoZW1hUHJvcGVydHkuQ09OU0lTVEVOVExZIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmhhc0ZpeGVkKCkgPT0gU2NoZW1hUHJvcGVydHkuQ09OU0lTVEVOVExZKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoImlmICh0YXJnZXQgPT0gbnVsbCkiKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgICAgICAgICBtYWtlQXR0cmlidXRlRGVmYXVsdFZhbHVlKHh0eXBlLCBwcm9wLCBpZGVudGlmaWVyKTsKLSAgICAgICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0OyIpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuaWxsYWJsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBib29sZWFuIGlzTmlsUHJvcCgpCi0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIlRlc3RzIGZvciBuaWwgZmlyc3QgIiA6ICJUZXN0cyBmb3IgbmlsICIpICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyBib29sZWFuIGlzTmlsIiArIHByb3BlcnR5TmFtZSArICIoKSIpOwotICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVtaXRHZXRUYXJnZXQoc2V0SWRlbnRpZmllciwgaWRlbnRpZmllciwgaXNBdHRyLCAiMCIsIE5PVEhJTkcsIHh0eXBlKTsKLQotICAgICAgICAgICAgICAgIGVtaXQoImlmICh0YXJnZXQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuaXNOaWwoKTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbmRCbG9jaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBib29sZWFuIGlzU2V0UHJvcCgpCi0gICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiVHJ1ZSBpZiBoYXMgYXQgbGVhc3Qgb25lICIgOiAiVHJ1ZSBpZiBoYXMgIikgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgYm9vbGVhbiBpc1NldCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCkiKTsKLQotICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLQotICAgICAgICAgICAgaWYgKGlzQXR0cikKLSAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gZ2V0X3N0b3JlKCkuZmluZF9hdHRyaWJ1dGVfdXNlcigiICsgaWRlbnRpZmllciArIikgIT0gbnVsbDsiKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gZ2V0X3N0b3JlKCkuY291bnRfZWxlbWVudHMoIiArIHNldElkZW50aWZpZXIgKyAiKSAhPSAwOyIpOwotCi0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2V2ZXJhbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGFycmF5TmFtZSA9IHByb3BlcnR5TmFtZSArICJBcnJheSI7Ci0KLSAgICAgICAgICAgIC8vIFZhbHVlW10gZ2V0UHJvcCgpCi0gICAgICAgICAgICBwcmludEphdmFEb2MoIkdldHMgYXJyYXkgb2YgYWxsICIgKyBwcm9wZGVzYyArICJzIik7Ci0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgIiArIHR5cGUgKyAiW10gZ2V0IiArIGFycmF5TmFtZSArICIoKSIpOwotICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLQotICAgICAgICAgICAgZW1pdCgiamF2YS51dGlsLkxpc3QgdGFyZ2V0TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Iik7Ci0gICAgICAgICAgICBlbWl0KCJnZXRfc3RvcmUoKS5maW5kX2FsbF9lbGVtZW50X3VzZXJzKCIgKyBzZXRJZGVudGlmaWVyICsgIiwgdGFyZ2V0TGlzdCk7Iik7Ci0KLSAgICAgICAgICAgIHByaW50SkdldEFycmF5VmFsdWUoamF2YVR5cGUsIHR5cGUpOwotCi0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0KLSAgICAgICAgICAgIC8vIFZhbHVlIGdldFByb3AoaW50IGkpCi0gICAgICAgICAgICBwcmludEphdmFEb2MoIkdldHMgaXRoICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgIiArIHR5cGUgKyAiIGdldCIgKyBhcnJheU5hbWUgKyAiKGludCBpKSIpOwotICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLQotICAgICAgICAgICAgZW1pdEdldFRhcmdldChzZXRJZGVudGlmaWVyLCBpZGVudGlmaWVyLCBpc0F0dHIsICJpIiwgVEhST1dfRVhDRVBUSU9OLCBqdGFyZ2V0VHlwZSk7Ci0gICAgICAgICAgICBwcmludEpHZXRWYWx1ZShqYXZhVHlwZSwgdHlwZSk7Ci0KLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgZW5kQmxvY2soKTsKLQotICAgICAgICAgICAgaWYgKCF4bWx0eXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFZhbHVlW10geGdldFByb3AoKQotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiR2V0cyAoYXMgeG1sKSBhcnJheSBvZiBhbGwgIiArIHByb3BkZXNjICsgInMiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgIiArIHh0eXBlICsgIltdIHhnZXQiICsgYXJyYXlOYW1lICsgIigpIik7Ci0gICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW1pdCgiamF2YS51dGlsLkxpc3QgdGFyZ2V0TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdCgiZ2V0X3N0b3JlKCkuZmluZF9hbGxfZWxlbWVudF91c2VycygiICsgc2V0SWRlbnRpZmllciArICIsIHRhcmdldExpc3QpOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoeHR5cGUgKyAiW10gcmVzdWx0ID0gbmV3ICIgKyB4dHlwZSArICJbdGFyZ2V0TGlzdC5zaXplKCldOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoInRhcmdldExpc3QudG9BcnJheShyZXN1bHQpOyIpOwotICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiByZXN1bHQ7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKLQotICAgICAgICAgICAgICAgIC8vIFZhbHVlIHhnZXRQcm9wKGludCBpKQotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiR2V0cyAoYXMgeG1sKSBpdGggIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgIiArIHh0eXBlICsgIiB4Z2V0IiArIGFycmF5TmFtZSArICIoaW50IGkpIik7Ci0gICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEdldFRhcmdldChzZXRJZGVudGlmaWVyLCBpZGVudGlmaWVyLCBpc0F0dHIsICJpIiwgVEhST1dfRVhDRVBUSU9OLCB4dHlwZSk7Ci0gICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuICgiICsgeHR5cGUgKyAiKXRhcmdldDsiKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbmRCbG9jaygpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuaWxsYWJsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBib29sZWFuIGlzTmlsKGludCBpKTsKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIlRlc3RzIGZvciBuaWwgaXRoICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgicHVibGljIGJvb2xlYW4gaXNOaWwiICsgYXJyYXlOYW1lICsgIihpbnQgaSkiKTsKLSAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbWl0R2V0VGFyZ2V0KHNldElkZW50aWZpZXIsIGlkZW50aWZpZXIsIGlzQXR0ciwgImkiLCBUSFJPV19FWENFUFRJT04sIHh0eXBlKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmlzTmlsKCk7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaW50IGNvdW50UHJvcCgpOwotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJSZXR1cm5zIG51bWJlciBvZiAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgZW1pdCgicHVibGljIGludCBzaXplT2YiICsgYXJyYXlOYW1lICsgIigpIik7Ci0gICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgZW1pdCgicmV0dXJuIGdldF9zdG9yZSgpLmNvdW50X2VsZW1lbnRzKCIgKyBzZXRJZGVudGlmaWVyICsiKTsiKTsKLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgZW5kQmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcHJpbnRTZXR0ZXJJbXBscyhRTmFtZSBxTmFtZSwgYm9vbGVhbiBpc0F0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBqYXZhVHlwZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB4dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuaWxsYWJsZSwgYm9vbGVhbiBvcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXZlcmFsLCBib29sZWFuIHNpbmdsZXRvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc3VuaW9uLAotICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWRlbnRpZmllciwgU3RyaW5nIHNldElkZW50aWZpZXIpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHNhZmVWYXJOYW1lID0gTmFtZVV0aWwubm9uSmF2YUtleXdvcmQoTmFtZVV0aWwubG93ZXJDYW1lbENhc2UocHJvcGVydHlOYW1lKSk7Ci0gICAgICAgIGlmIChzYWZlVmFyTmFtZS5lcXVhbHMoImkiKSkKLSAgICAgICAgICAgIHNhZmVWYXJOYW1lID0gImlWYWx1ZSI7Ci0gICAgICAgIGVsc2UgaWYgKHNhZmVWYXJOYW1lLmVxdWFscygidGFyZ2V0IikpCi0gICAgICAgICAgICBzYWZlVmFyTmFtZSA9ICJ0YXJnZXRWYWx1ZSI7Ci0KLSAgICAgICAgYm9vbGVhbiB4bWx0eXBlID0gKGphdmFUeXBlID09IFNjaGVtYVByb3BlcnR5LlhNTF9PQkpFQ1QpOwotICAgICAgICBib29sZWFuIGlzb2JqID0gKGphdmFUeXBlID09IFNjaGVtYVByb3BlcnR5LkpBVkFfT0JKRUNUKTsKLSAgICAgICAgYm9vbGVhbiBpc1N1YnN0R3JvdXAgPSBpZGVudGlmaWVyICE9IHNldElkZW50aWZpZXI7Ci0gICAgICAgIFN0cmluZyBqU2V0ID0ganNldE1ldGhvZChqYXZhVHlwZSk7Ci0gICAgICAgIFN0cmluZyBqdGFyZ2V0VHlwZSA9IChpc3VuaW9uIHx8ICF4bWx0eXBlKSA/ICJvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlIiA6IHh0eXBlOwotCi0gICAgICAgIFN0cmluZyBwcm9wZGVzYyA9ICJcIiIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKSArICJcIiIgKyAoaXNBdHRyID8gIiBhdHRyaWJ1dGUiIDogIiBlbGVtZW50Iik7Ci0KLSAgICAgICAgaWYgKHNpbmdsZXRvbikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gdm9pZCBzZXRQcm9wKFZhbHVlIHYpOwotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIlNldHMgZmlyc3QgIiA6ICJTZXRzIHRoZSAiKSArIHByb3BkZXNjKTsKLSAgICAgICAgICAgIGVtaXQoInB1YmxpYyB2b2lkIHNldCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCIgKyB0eXBlICsgIiAiICsgc2FmZVZhck5hbWUgKyAiKSIpOwotICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgIGVtaXRHZXRUYXJnZXQoc2V0SWRlbnRpZmllciwgaWRlbnRpZmllciwgaXNBdHRyLCAiMCIsIEFERF9ORVdfVkFMVUUsIGp0YXJnZXRUeXBlKTsKLSAgICAgICAgICAgIGVtaXQoalNldCArICIoIiArIHNhZmVWYXJOYW1lICsgIik7Iik7Ci0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0KLSAgICAgICAgICAgIGlmICgheG1sdHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyB2b2lkIHhzZXRQcm9wKFZhbHVlIHYpCi0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIlNldHMgKGFzIHhtbCkgZmlyc3QgIiA6ICJTZXRzIChhcyB4bWwpIHRoZSAiKSArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgdm9pZCB4c2V0IiArIHByb3BlcnR5TmFtZSArICIoIiArIHh0eXBlICsgIiAiICsgc2FmZVZhck5hbWUgKyAiKSIpOwotICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVtaXRHZXRUYXJnZXQoc2V0SWRlbnRpZmllciwgaWRlbnRpZmllciwgaXNBdHRyLCAiMCIsIEFERF9ORVdfVkFMVUUsIHh0eXBlKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJ0YXJnZXQuc2V0KCIgKyBzYWZlVmFyTmFtZSArICIpOyIpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHhtbHR5cGUgJiYgIXNldmVyYWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVmFsdWUgYWRkTmV3UHJvcCgpCi0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJBcHBlbmRzIGFuZCByZXR1cm5zIGEgbmV3IGVtcHR5ICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgicHVibGljICIgKyB4dHlwZSArICIgYWRkTmV3IiArIHByb3BlcnR5TmFtZSArICIoKSIpOwotICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVtaXRBZGRUYXJnZXQoaWRlbnRpZmllciwgaXNBdHRyLCB0cnVlLCB4dHlwZSk7Ci0gICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldDsiKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbmRCbG9jaygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobmlsbGFibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIk5pbHMgdGhlIGZpcnN0ICIgOiAiTmlscyB0aGUgIikgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgicHVibGljIHZvaWQgc2V0TmlsIiArIHByb3BlcnR5TmFtZSArICIoKSIpOwotICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVtaXRHZXRUYXJnZXQoc2V0SWRlbnRpZmllciwgaWRlbnRpZmllciwgaXNBdHRyLCAiMCIsIEFERF9ORVdfVkFMVUUsIHh0eXBlKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJ0YXJnZXQuc2V0TmlsKCk7Iik7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvcHRpb25hbCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIlJlbW92ZXMgZmlyc3QgIiA6ICJVbnNldHMgdGhlICIpICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgZW1pdCgicHVibGljIHZvaWQgdW5zZXQiICsgcHJvcGVydHlOYW1lICsgIigpIik7Ci0gICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgaWYgKGlzQXR0cikKLSAgICAgICAgICAgICAgICBlbWl0KCJnZXRfc3RvcmUoKS5yZW1vdmVfYXR0cmlidXRlKCIgKyBpZGVudGlmaWVyICsgIik7Iik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZW1pdCgiZ2V0X3N0b3JlKCkucmVtb3ZlX2VsZW1lbnQoIiArIHNldElkZW50aWZpZXIgKyAiLCAwKTsiKTsKLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgZW5kQmxvY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZXZlcmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgYXJyYXlOYW1lID0gcHJvcGVydHlOYW1lICsgIkFycmF5IjsKLQotICAgICAgICAgICAgLy8gSlNFVF9JTkRFWAotICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJTZXRzIGFycmF5IG9mIGFsbCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgZW1pdCgicHVibGljIHZvaWQgc2V0IiArIGFycmF5TmFtZSArICIoIiArIHR5cGUgKyAiW10gIiArIHNhZmVWYXJOYW1lICsgIkFycmF5KSIpOwotICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLQotICAgICAgICAgICAgaWYgKGlzb2JqKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghaXNTdWJzdEdyb3VwKQotICAgICAgICAgICAgICAgICAgICBlbWl0KCJ1bmlvbkFycmF5U2V0dGVySGVscGVyKCIgKyBzYWZlVmFyTmFtZSArICJBcnJheSIgKyAiLCAiICsgaWRlbnRpZmllciArICIpOyIgKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGVtaXQoInVuaW9uQXJyYXlTZXR0ZXJIZWxwZXIoIiArIHNhZmVWYXJOYW1lICsgIkFycmF5IiArICIsICIgKyBpZGVudGlmaWVyICsgIiwgIiArIHNldElkZW50aWZpZXIgKyAiKTsiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc1N1YnN0R3JvdXApCi0gICAgICAgICAgICAgICAgICAgIGVtaXQoImFycmF5U2V0dGVySGVscGVyKCIgKyBzYWZlVmFyTmFtZSArICJBcnJheSIgKyAiLCAiICsgaWRlbnRpZmllciArICIpOyIgKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGVtaXQoImFycmF5U2V0dGVySGVscGVyKCIgKyBzYWZlVmFyTmFtZSArICJBcnJheSIgKyAiLCAiICsgaWRlbnRpZmllciArICIsICIgKyBzZXRJZGVudGlmaWVyICsgIik7IiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICBlbmRCbG9jaygpOwotCi0gICAgICAgICAgICBwcmludEphdmFEb2MoIlNldHMgaXRoICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICBlbWl0KCJwdWJsaWMgdm9pZCBzZXQiICsgYXJyYXlOYW1lICsgIihpbnQgaSwgIiArIHR5cGUgKyAiICIgKyBzYWZlVmFyTmFtZSArICIpIik7Ci0gICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgZW1pdEdldFRhcmdldChzZXRJZGVudGlmaWVyLCBpZGVudGlmaWVyLCBpc0F0dHIsICJpIiwgVEhST1dfRVhDRVBUSU9OLCBqdGFyZ2V0VHlwZSk7Ci0gICAgICAgICAgICBlbWl0KGpTZXQgKyAiKCIgKyBzYWZlVmFyTmFtZSArICIpOyIpOwotICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICBlbmRCbG9jaygpOwotCi0gICAgICAgICAgICBpZiAoIXhtbHR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJTZXRzIChhcyB4bWwpIGFycmF5IG9mIGFsbCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyB2b2lkIHhzZXQiICsgYXJyYXlOYW1lICsgIigiICsgeHR5cGUgKyAiW10iICsgc2FmZVZhck5hbWUgKyAiQXJyYXkpIik7Ci0gICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW1pdCgiYXJyYXlTZXR0ZXJIZWxwZXIoIiArIHNhZmVWYXJOYW1lICsgIkFycmF5IiArICIsICIgKyBpZGVudGlmaWVyICsgIik7IiApOwotCi0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKLQotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiU2V0cyAoYXMgeG1sKSBpdGggIiArIHByb3BkZXNjKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgdm9pZCB4c2V0IiArIGFycmF5TmFtZSArICIoaW50IGksICIgKyB4dHlwZSArICIgIiArIHNhZmVWYXJOYW1lICsgIikiKTsKLSAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbWl0R2V0VGFyZ2V0KHNldElkZW50aWZpZXIsIGlkZW50aWZpZXIsIGlzQXR0ciwgImkiLCBUSFJPV19FWENFUFRJT04sIHh0eXBlKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJ0YXJnZXQuc2V0KCIgKyBzYWZlVmFyTmFtZSArICIpOyIpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuaWxsYWJsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIk5pbHMgdGhlIGl0aCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyB2b2lkIHNldE5pbCIgKyBhcnJheU5hbWUgKyAiKGludCBpKSIpOwotICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVtaXRHZXRUYXJnZXQoc2V0SWRlbnRpZmllciwgaWRlbnRpZmllciwgaXNBdHRyLCAiaSIsIFRIUk9XX0VYQ0VQVElPTiwgeHR5cGUpOwotICAgICAgICAgICAgICAgIGVtaXQoInRhcmdldC5zZXROaWwoKTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbmRCbG9jaygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXhtbHR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJJbnNlcnRzIHRoZSB2YWx1ZSBhcyB0aGUgaXRoICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgicHVibGljIHZvaWQgaW5zZXJ0IiArIHByb3BlcnR5TmFtZSArICIoaW50IGksICIgKyB0eXBlICsgIiAiICsgc2FmZVZhck5hbWUgKyAiKSIpOwotICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVtaXQoanRhcmdldFR5cGUgKyAiIHRhcmdldCA9ICIpOwotICAgICAgICAgICAgICAgIGluZGVudCgpOwotICAgICAgICAgICAgICAgIGlmICghaXNTdWJzdEdyb3VwKQotICAgICAgICAgICAgICAgICAgICBlbWl0KCIoIiArIGp0YXJnZXRUeXBlICsgIilnZXRfc3RvcmUoKS5pbnNlcnRfZWxlbWVudF91c2VyKCIgKyBpZGVudGlmaWVyICsgIiwgaSk7Iik7Ci0gICAgICAgICAgICAgICAgZWxzZSAvLyBUaGlzIGlzIGEgc3Vic3QgZ3JvdXAgY2FzZQotICAgICAgICAgICAgICAgICAgICBlbWl0ICgiKCIgKyBqdGFyZ2V0VHlwZSArIilnZXRfc3RvcmUoKS5pbnNlcnRfZWxlbWVudF91c2VyKCIgKyBzZXRJZGVudGlmaWVyICsgIiwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciArICIsIGkpOyIpOwotICAgICAgICAgICAgICAgIG91dGRlbnQoKTsKLSAgICAgICAgICAgICAgICBlbWl0KGpTZXQgKyAiKCIgKyBzYWZlVmFyTmFtZSArICIpOyIpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0KLSAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIkFwcGVuZHMgdGhlIHZhbHVlIGFzIHRoZSBsYXN0ICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgicHVibGljIHZvaWQgYWRkIiArIHByb3BlcnR5TmFtZSArICIoIiArIHR5cGUgKyAiICIgKyBzYWZlVmFyTmFtZSArICIpIik7Ci0gICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW1pdEFkZFRhcmdldChpZGVudGlmaWVyLCBpc0F0dHIsIHRydWUsIGp0YXJnZXRUeXBlKTsKLSAgICAgICAgICAgICAgICBlbWl0KGpTZXQgKyAiKCIgKyBzYWZlVmFyTmFtZSArICIpOyIpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh4bWx0eXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiSW5zZXJ0cyBhbmQgcmV0dXJucyBhIG5ldyBlbXB0eSB2YWx1ZSAoYXMgeG1sKSBhcyB0aGUgaXRoICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgicHVibGljICIgKyB4dHlwZSArICIgaW5zZXJ0TmV3IiArIHByb3BlcnR5TmFtZSArICIoaW50IGkpIik7Ci0gICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7Ci0gICAgICAgICAgICAgICAgZW1pdCh4dHlwZSArICIgdGFyZ2V0OyIpOwotICAgICAgICAgICAgICAgIGVtaXQoInRhcmdldCA9ICgiICsgeHR5cGUgKyAiKWdldF9zdG9yZSgpLmluc2VydF9lbGVtZW50X3VzZXIoIiArIGlkZW50aWZpZXIgKyAiLCBpKTsiKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0OyIpOwotICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJBcHBlbmRzIGFuZCByZXR1cm5zIGEgbmV3IGVtcHR5IHZhbHVlIChhcyB4bWwpIGFzIHRoZSBsYXN0ICIgKyBwcm9wZGVzYyk7Ci0gICAgICAgICAgICAgICAgZW1pdCgicHVibGljICIgKyB4dHlwZSArICIgYWRkTmV3IiArIHByb3BlcnR5TmFtZSArICIoKSIpOwotICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgICAgIGVtaXRBZGRUYXJnZXQoaWRlbnRpZmllciwgaXNBdHRyLCB0cnVlLCB4dHlwZSk7Ci0gICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldDsiKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKLSAgICAgICAgICAgICAgICBlbmRCbG9jaygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcmludEphdmFEb2MoIlJlbW92ZXMgdGhlIGl0aCAiICsgcHJvcGRlc2MpOwotICAgICAgICAgICAgZW1pdCgicHVibGljIHZvaWQgcmVtb3ZlIiArIHByb3BlcnR5TmFtZSArICIoaW50IGkpIik7Ci0gICAgICAgICAgICBzdGFydEJsb2NrKCk7Ci0gICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOwotICAgICAgICAgICAgZW1pdCgiZ2V0X3N0b3JlKCkucmVtb3ZlX2VsZW1lbnQoIiArIHNldElkZW50aWZpZXIgKyAiLCBpKTsiKTsKLSAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOwotICAgICAgICAgICAgZW5kQmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGdldFR5cGVOYW1lKENsYXNzIGMsIFN0cmluZ0J1ZmZlciBzYikgewotICAgICAgICBpbnQgYXJyYXlDb3VudCA9IDA7Ci0gICAgICAgIHdoaWxlIChjLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgYyA9IGMuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgICAgICAgICAgYXJyYXlDb3VudCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgc2IuYXBwZW5kKGMuZ2V0TmFtZSgpKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBhcnJheUNvdW50OyBpKyspCi0gICAgICAgICAgICBzYi5hcHBlbmQoIltdIik7Ci0KLSAgICB9Ci0KLSAgICB2b2lkIHByaW50SW5uZXJUeXBlSW1wbCgKLSAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSwgU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0sIGJvb2xlYW4gaXNJbm5lciApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHNob3J0TmFtZSA9IHNUeXBlLmdldFNob3J0SmF2YUltcGxOYW1lKCk7Ci0KLSAgICAgICAgcHJpbnRJbm5lclR5cGVKYXZhRG9jKHNUeXBlKTsKLQotICAgICAgICBzdGFydENsYXNzKHNUeXBlLCBpc0lubmVyKTsKLQotICAgICAgICBwcmludENvbnN0cnVjdG9yKHNUeXBlLCBzaG9ydE5hbWUpOwotCi0gICAgICAgIGlmICghc1R5cGUuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5W10gcHJvcGVydGllczsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHNUeXBlLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBzaW1wbGUgY29udGVudCB0eXBlcyBpbXBscyBkZXJpdmUgZGlyZWN0bHkgZnJvbSAiaG9sZGVyIiBpbXBscwotICAgICAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGhhbmRsZSB0aGUgY2FzZSAoZm9yIGludHMgb3Igc3RyaW5nIGVudW1zIGUuZy4pIHdoZXJlCi0gICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYSBzaW1wbGUgdHlwZSByZXN0cmljdGlvbi4gIFNvIHByb3BlcnR5IGdldHRlcnMgbmVlZCB0bwotICAgICAgICAgICAgICAgIC8vIGJlIGltcGxlbWVudGVkICJmcm9tIHNjcmF0Y2giIGZvciBlYWNoIGRlcml2ZWQgY29tcGxleCB0eXBlCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IHNUeXBlLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBjb21wbGV4IGNvbnRlbnQgdHlwZSBpbXBsZW1lbnRhdGlvbnMgZGVyaXZlIGZyb20gYmFzZSB0eXBlIGltcGxzCi0gICAgICAgICAgICAgICAgLy8gc28gZGVyaXZlZCBwcm9wZXJ0eSBpbXBscyBjYW4gYmUgcmV1c2VkCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IHNUeXBlLmdldERlcml2ZWRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE1hcCBxTmFtZU1hcCA9IHByaW50U3RhdGljRmllbGRzKHByb3BlcnRpZXMpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IHByb3BlcnRpZXNbaV07Ci0KLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gcHJvcC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHhtbFR5cGUgPSB4bWxUeXBlRm9yUHJvcGVydHkoIHByb3AgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwcmludEdldHRlckltcGxzKAotICAgICAgICAgICAgICAgICAgICBwcm9wLAotICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICBwcm9wLmlzQXR0cmlidXRlKCksCi0gICAgICAgICAgICAgICAgICAgIHByb3AuZ2V0SmF2YVByb3BlcnR5TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBwcm9wLmdldEphdmFUeXBlQ29kZSgpLAotICAgICAgICAgICAgICAgICAgICBqYXZhVHlwZUZvclByb3BlcnR5KHByb3ApLAotICAgICAgICAgICAgICAgICAgICB4bWxUeXBlLAotICAgICAgICAgICAgICAgICAgICBwcm9wLmhhc05pbGxhYmxlKCkgIT0gU2NoZW1hUHJvcGVydHkuTkVWRVIsCi0gICAgICAgICAgICAgICAgICAgIHByb3AuZXh0ZW5kc0phdmFPcHRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgcHJvcC5leHRlbmRzSmF2YUFycmF5KCksCi0gICAgICAgICAgICAgICAgICAgIHByb3AuZXh0ZW5kc0phdmFTaW5nbGV0b24oKSwKLSAgICAgICAgICAgICAgICAgICAgeG1sVHlwZUZvclByb3BlcnR5SXNVbmlvbihwcm9wKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0SWRlbnRpZmllcihxTmFtZU1hcCwgbmFtZSksCi0gICAgICAgICAgICAgICAgICAgIGdldFNldElkZW50aWZpZXIocU5hbWVNYXAsIG5hbWUpCi0gICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgIGlmICghcHJvcC5pc1JlYWRPbmx5KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcmludFNldHRlckltcGxzKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3AuaXNBdHRyaWJ1dGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3AuZ2V0SmF2YVByb3BlcnR5TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5nZXRKYXZhVHlwZUNvZGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmFUeXBlRm9yUHJvcGVydHkocHJvcCksCi0gICAgICAgICAgICAgICAgICAgICAgICB4bWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5oYXNOaWxsYWJsZSgpICE9IFNjaGVtYVByb3BlcnR5Lk5FVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5leHRlbmRzSmF2YU9wdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5leHRlbmRzSmF2YUFycmF5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmV4dGVuZHNKYXZhU2luZ2xldG9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICB4bWxUeXBlRm9yUHJvcGVydHlJc1VuaW9uKHByb3ApLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SWRlbnRpZmllcihxTmFtZU1hcCwgbmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXRJZGVudGlmaWVyKHFOYW1lTWFwLCBuYW1lKQotICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaW50TmVzdGVkVHlwZUltcGxzKHNUeXBlLCBzeXN0ZW0pOwotCi0gICAgICAgIGVuZEJsb2NrKCk7Ci0gICAgfQotICAgIHZvaWQgcHJpbnROZXN0ZWRUeXBlSW1wbHMoU2NoZW1hVHlwZSBzVHlwZSwgU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZVtdIGFub25UeXBlcyA9IHNUeXBlLmdldEFub255bW91c1R5cGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5vblR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYW5vblR5cGVzW2ldLmlzU2tpcHBlZEFub255bW91c1R5cGUoKSkKLSAgICAgICAgICAgICAgICBwcmludE5lc3RlZFR5cGVJbXBscyhhbm9uVHlwZXNbaV0sIHN5c3RlbSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcHJpbnRJbm5lclR5cGVJbXBsKGFub25UeXBlc1tpXSwgc3lzdGVtLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWViMGMyLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZQotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQYXJ0aWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TdHJpbmdFbnVtQWJzdHJhY3RCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hU3RyaW5nRW51bUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGZpbmFsIGNsYXNzIFNjaGVtYVR5cGVJbXBsIGltcGxlbWVudHMgU2NoZW1hVHlwZSwgVHlwZVN0b3JlVXNlckZhY3RvcnkKLXsKLSAgICAvLyBnbG9iYWwgdHlwZXMgaGF2ZSBuYW1lcwotICAgIHByaXZhdGUgUU5hbWUgX25hbWU7Ci0KLSAgICAvLyBjb21waWxhdGlvbiBzdXBwb3J0Ci0gICAgcHJpdmF0ZSBpbnQgX3Jlc29sdmVQaGFzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5SRVNPTFZFRCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU09MVklOR19TR1MgPSAxOyAvLyBGb3IgZG9jdW1lbnQgdHlwZXMgb25seQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNPTFZFRF9TR1MgPSAyOyAgLy8gRm9yIGRvY3VtZW50IHR5cGVzIG9ubHkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTT0xWSU5HID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTT0xWRUQgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKQVZBSVpJTkcgPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKQVZBSVpFRCA9IDY7Ci0KLSAgICAvLyBhbm9ueW1vdXMgdHlwZSBzdXBwb3J0Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlLlJlZiBfb3V0ZXJTY2hlbWFUeXBlUmVmOwotICAgIHByaXZhdGUgdm9sYXRpbGUgU2NoZW1hQ29tcG9uZW50LlJlZiBfY29udGFpbmVyRmllbGRSZWY7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBTY2hlbWFGaWVsZCBfY29udGFpbmVyRmllbGQ7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgX2NvbnRhaW5lckZpZWxkQ29kZTsKLSAgICBwcml2YXRlIHZvbGF0aWxlIGludCBfY29udGFpbmVyRmllbGRJbmRleDsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUuUmVmW10gX2Fub255bW91c1R5cGVyZWZzOwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNEb2N1bWVudFR5cGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9pc0F0dHJpYnV0ZVR5cGU7Ci0gICAgLy8gcHJpdmF0ZSBib29sZWFuIF9za2lwcGVkQW5vbnltb3VzVHlwZTsKLQotICAgIC8vIGNvbXBpbGV0aW1lIGphdmEgdHlwZSBzdXBwb3J0Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9pc0NvbXBpbGVkOwotICAgIHByaXZhdGUgU3RyaW5nIF9zaG9ydEphdmFOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF9mdWxsSmF2YU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3Nob3J0SmF2YUltcGxOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF9mdWxsSmF2YUltcGxOYW1lOwotCi0gICAgLy8gcnVudGltZSBqYXZhIHR5cGUgc3VwcG9ydDogdm9sYXRpbGUgYmVjYXVzZSB0aGV5J3JlIGNhY2hlZAotICAgIHByaXZhdGUgdm9sYXRpbGUgQ2xhc3MgX2phdmFDbGFzczsKLSAgICBwcml2YXRlIHZvbGF0aWxlIENsYXNzIF9qYXZhRW51bUNsYXNzOwotICAgIHByaXZhdGUgdm9sYXRpbGUgQ2xhc3MgX2phdmFJbXBsQ2xhc3M7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBDb25zdHJ1Y3RvciBfamF2YUltcGxDb25zdHJ1Y3RvcjsKLSAgICBwcml2YXRlIHZvbGF0aWxlIENvbnN0cnVjdG9yIF9qYXZhSW1wbENvbnN0cnVjdG9yMjsKLSAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gX2ltcGxOb3RBdmFpbGFibGU7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdFtdIF9jdHJBcmdzID0gbmV3IE9iamVjdFtdIHsgdGhpcyB9OwotCi0gICAgLy8gcmVmbGVjdGl2ZSBzdXBwb3J0Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlU3lzdGVtIF90eXBlU3lzdGVtOwotICAgIHByaXZhdGUgU3RyaW5nIF9maWxlbmFtZTsKLQotICAgIC8vIGNvbXBsZXggY29udGVudCBzdXBwb3J0Ci0gICAgcHJpdmF0ZSBTY2hlbWFQYXJ0aWNsZSBfY29udGVudE1vZGVsOwotICAgIHByaXZhdGUgdm9sYXRpbGUgU2NoZW1hTG9jYWxFbGVtZW50W10gX2xvY2FsRWx0czsgLy8gbGF6aWx5IGNvbXB1dGVkCi0gICAgcHJpdmF0ZSB2b2xhdGlsZSBNYXAgX2VsdFRvSW5kZXhNYXA7IC8vIGxhemlseSBjb21wdXRlZAotICAgIHByaXZhdGUgdm9sYXRpbGUgTWFwIF9hdHRyVG9JbmRleE1hcDsgLy8gbGF6aWx5IGNvbXB1dGVkCi0gICAgcHJpdmF0ZSBNYXAgX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lOwotICAgIHByaXZhdGUgTWFwIF9wcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lOwotICAgIHByaXZhdGUgYm9vbGVhbiBfaGFzQWxsQ29udGVudDsKLSAgICBwcml2YXRlIGJvb2xlYW4gX29yZGVyU2Vuc2l0aXZlOwotICAgIHByaXZhdGUgUU5hbWVTZXQgX3R5cGVkV2lsZGNhcmRFbGVtZW50czsKLSAgICBwcml2YXRlIFFOYW1lU2V0IF90eXBlZFdpbGRjYXJkQXR0cmlidXRlczsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2hhc1dpbGRjYXJkRWxlbWVudHM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9oYXNXaWxkY2FyZEF0dHJpYnV0ZXM7Ci0gICAgLy8gc2V0IG9mIHZhbGlkIFFOYW1lcyB0aGF0IGNhbiBiZSBzdWJzdGl0dXRlZCBmb3IgYSBwcm9wZXJ0eQotICAgIHByaXZhdGUgU2V0IF92YWxpZFN1YnN0aXR1dGlvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0KLSAgICAvLyBzaW1wbGUgY29udGVudCBzdXBwb3J0Ci0gICAgcHJpdmF0ZSBpbnQgX2NvbXBsZXhUeXBlVmFyaWV0eTsKLSAgICBwcml2YXRlIFNjaGVtYUF0dHJpYnV0ZU1vZGVsIF9hdHRyaWJ1dGVNb2RlbDsKLQotICAgIC8vIHNpbXBsZSB0eXBlIHN1cHBvcnQKLSAgICBwcml2YXRlIGludCBfYnVpbHRpblR5cGVDb2RlOwotCi0gICAgcHJpdmF0ZSBpbnQgX3NpbXBsZVR5cGVWYXJpZXR5OwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNTaW1wbGVUeXBlOwotCi0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlLlJlZiBfYmFzZVR5cGVyZWY7IC8vIHZpYSByZXN0cmljdGlvbiBvciBleHRlbnNpb24KLSAgICBwcml2YXRlIGludCBfYmFzZURlcHRoOyAvLyBob3cgbWFueSBpbmhlcml0YW5jZSBzdGVwcyB0byBBbnlUeXBlCi0gICAgcHJpdmF0ZSBpbnQgX2Rlcml2YXRpb25UeXBlOwotCi0gICAgLy8gZmFjZXRzCi0gICAgcHJpdmF0ZSBYbWxWYWx1ZVJlZltdIF9mYWNldEFycmF5OwotICAgIHByaXZhdGUgYm9vbGVhbltdIF9maXhlZEZhY2V0QXJyYXk7Ci0KLSAgICAvLyBmdW5kYW1lbnRhbCBmYWNldHMKLSAgICBwcml2YXRlIGludCBfb3JkZXJlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzRmluaXRlOwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNCb3VuZGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNOdW1lcmljOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIF9hYnM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9maW5hbEV4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2ZpbmFsUmVzdDsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2ZpbmFsTGlzdDsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2ZpbmFsVW5pb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9ibG9ja0V4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2Jsb2NrUmVzdDsKLQotICAgIC8vIHdoaXRlc3BhY2UgZmFjZXQKLSAgICBwcml2YXRlIGludCBfd2hpdGVTcGFjZVJ1bGU7Ci0KLSAgICAvLyByZWdleCBwYXR0ZXJucwotICAgIHByaXZhdGUgYm9vbGVhbiBfaGFzUGF0dGVybnM7IC8vIGFsc28gdGFrZXMgaW50byBhY2NvdW50IGJhc2UgY2xhc3NlcwotICAgIHByaXZhdGUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uW10gX3BhdHRlcm5zOwotCi0gICAgLy8gZW51bWVyYXRlZCB2YWx1ZXMKLSAgICBwcml2YXRlIFhtbFZhbHVlUmVmW10gX2VudW1lcmF0aW9uVmFsdWVzOwotICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWYgX2Jhc2VFbnVtVHlwZXJlZjsKLSAgICBwcml2YXRlIGJvb2xlYW4gX3N0cmluZ0VudW1FbnN1cmVkOwotICAgIHByaXZhdGUgdm9sYXRpbGUgTWFwIF9sb29rdXBTdHJpbmdFbnVtOwotICAgIHByaXZhdGUgdm9sYXRpbGUgTGlzdCBfbGlzdE9mU3RyaW5nRW51bTsKLSAgICBwcml2YXRlIHZvbGF0aWxlIE1hcCBfbG9va3VwU3RyaW5nRW51bUVudHJ5OwotICAgIHByaXZhdGUgU2NoZW1hU3RyaW5nRW51bUVudHJ5W10gX3N0cmluZ0VudW1FbnRyaWVzOwotCi0gICAgLy8gZm9yIGxpc3RzIG9ubHkKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUuUmVmIF9saXN0SXRlbVR5cGVyZWY7Ci0KLSAgICAvLyBmb3IgdW5pb25zIG9ubHkKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzVW5pb25PZkxpc3RzOwotICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWZbXSBfdW5pb25NZW1iZXJUeXBlcmVmczsKLSAgICBwcml2YXRlIGludCBfYW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsOwotICAgIHByaXZhdGUgdm9sYXRpbGUgU2NoZW1hVHlwZVtdIF91bmlvbkNvbnN0aXR1ZW50VHlwZXM7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBTY2hlbWFUeXBlW10gX3VuaW9uU3ViVHlwZXM7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBTY2hlbWFUeXBlIF91bmlvbkNvbW1vbkJhc2VUeXBlOwotCi0gICAgLy8gZm9yIGF0b21pYyB0eXBlcyBvbmx5Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlLlJlZiBfcHJpbWl0aXZlVHlwZVJlZjsKLQotICAgIC8vIGZvciBkZWNpbWFsIHJlc3RyaWN0aW9ucyBvbmx5Ci0gICAgcHJpdmF0ZSBpbnQgX2RlY2ltYWxTaXplOwotCi0gICAgLy8gbGF6eSBsb2FkaW5nIHN1cHBvcnQKLSAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gX3VubG9hZGVkOwotCi0gICAgLy8gZm9yIGRvY3VtZW50IHR5cGVzIG9ubHkgLSBvbmx5IHZhbGlkIGR1cmluZyBjb21waWxhdGlvbgotICAgIHByaXZhdGUgUU5hbWUgX3NnOwotICAgIHByaXZhdGUgTGlzdCBfc2dNZW1iZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNVbmxvYWRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gX3VubG9hZGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbmlzaExvYWRpbmcoKQotICAgIHsKLSAgICAgICAgX3VubG9hZGVkID0gZmFsc2U7Ci0gICAgfQotCi0KLQotICAgIFNjaGVtYVR5cGVJbXBsKFNjaGVtYVR5cGVTeXN0ZW0gdHlwZVN5c3RlbSkKLSAgICB7Ci0gICAgICAgIF90eXBlU3lzdGVtID0gdHlwZVN5c3RlbTsKLSAgICB9Ci0KLSAgICBTY2hlbWFUeXBlSW1wbChTY2hlbWFUeXBlU3lzdGVtIHR5cGVTeXN0ZW0sIGJvb2xlYW4gdW5sb2FkZWQpCi0gICAgewotICAgICAgICBfdHlwZVN5c3RlbSA9IHR5cGVTeXN0ZW07Ci0gICAgICAgIF91bmxvYWRlZCA9IHVubG9hZGVkOwotICAgICAgICBpZiAodW5sb2FkZWQpCi0gICAgICAgICAgICBmaW5pc2hRdWljaygpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU0dSZXNvbHZlZCgpCi0gICAgICAgIHsgcmV0dXJuIF9yZXNvbHZlUGhhc2UgPj0gUkVTT0xWRURfU0dTOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NHUmVzb2x2aW5nKCkKLSAgICAgICAgeyByZXR1cm4gX3Jlc29sdmVQaGFzZSA+PSBSRVNPTFZJTkdfU0dTOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKCkKLSAgICAgICAgeyByZXR1cm4gX3Jlc29sdmVQaGFzZSA+PSBSRVNPTFZFRDsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXNvbHZpbmcoKQotICAgICAgICB7IHJldHVybiBfcmVzb2x2ZVBoYXNlID09IFJFU09MVklORzsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNVbmphdmFpemVkKCkKLSAgICAgICAgeyByZXR1cm4gX3Jlc29sdmVQaGFzZSA8IEpBVkFJWkVEOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0phdmFpemVkKCkKLSAgICAgICAgeyByZXR1cm4gX3Jlc29sdmVQaGFzZSA9PSBKQVZBSVpFRDsgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRSZXNvbHZpbmdTR3MoKQotICAgIHsKLSAgICAgICAgaWYgKF9yZXNvbHZlUGhhc2UgIT0gVU5SRVNPTFZFRCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgX3Jlc29sdmVQaGFzZSA9IFJFU09MVklOR19TR1M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmluaXNoUmVzb2x2aW5nU0dzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcmVzb2x2ZVBoYXNlICE9IFJFU09MVklOR19TR1MpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIF9yZXNvbHZlUGhhc2UgPSBSRVNPTFZFRF9TR1M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRSZXNvbHZpbmcoKQotICAgIHsKLSAgICAgICAgaWYgKCAoX2lzRG9jdW1lbnRUeXBlICYmIF9yZXNvbHZlUGhhc2UgIT0gUkVTT0xWRURfU0dTKSB8fAotICAgICAgICAgICAgICghX2lzRG9jdW1lbnRUeXBlICYmIF9yZXNvbHZlUGhhc2UgIT0gVU5SRVNPTFZFRCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIF9yZXNvbHZlUGhhc2UgPSBSRVNPTFZJTkc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmluaXNoUmVzb2x2aW5nKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcmVzb2x2ZVBoYXNlICE9IFJFU09MVklORykKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgX3Jlc29sdmVQaGFzZSA9IFJFU09MVkVEOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0SmF2YWl6aW5nKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcmVzb2x2ZVBoYXNlICE9IFJFU09MVkVEKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICBfcmVzb2x2ZVBoYXNlID0gSkFWQUlaSU5HOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbmlzaEphdmFpemluZygpCi0gICAgewotICAgICAgICBpZiAoX3Jlc29sdmVQaGFzZSAhPSBKQVZBSVpJTkcpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIF9yZXNvbHZlUGhhc2UgPSBKQVZBSVpFRDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmluaXNoUXVpY2soKQotICAgIHsKLSAgICAgICAgX3Jlc29sdmVQaGFzZSA9IEpBVkFJWkVEOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRVbnJlc29sdmVkKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcmVzb2x2ZVBoYXNlICE9IFVOUkVTT0xWRUQgJiYgIV91bmxvYWRlZCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0U0dSZXNvbHZpbmcoKQotICAgIHsKLSAgICAgICAgaWYgKF9yZXNvbHZlUGhhc2UgIT0gUkVTT0xWSU5HX1NHUyAmJiAhX3VubG9hZGVkKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRTR1Jlc29sdmVkKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcmVzb2x2ZVBoYXNlICE9IFJFU09MVkVEX1NHUyAmJiAhX3VubG9hZGVkKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRSZXNvbHZpbmcoKQotICAgIHsKLSAgICAgICAgaWYgKF9yZXNvbHZlUGhhc2UgIT0gUkVTT0xWSU5HICYmICFfdW5sb2FkZWQpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlc29sdmVkKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcmVzb2x2ZVBoYXNlICE9IFJFU09MVkVEICYmICFfdW5sb2FkZWQpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydEphdmFpemluZygpCi0gICAgewotICAgICAgICBpZiAoX3Jlc29sdmVQaGFzZSAhPSBKQVZBSVpJTkcgJiYgIV91bmxvYWRlZCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpCi0gICAgICAgIHsgcmV0dXJuIF9uYW1lOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFFOYW1lIG5hbWUpCi0gICAgICAgIHsgYXNzZXJ0VW5yZXNvbHZlZCgpOyBfbmFtZSA9IG5hbWU7IH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSgpCi0gICAgewotICAgICAgICBpZiAoX2ZpbGVuYW1lICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gX2ZpbGVuYW1lOwotICAgICAgICBpZiAoZ2V0T3V0ZXJUeXBlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBnZXRPdXRlclR5cGUoKS5nZXRTb3VyY2VOYW1lKCk7Ci0KLSAgICAgICAgU2NoZW1hRmllbGQgZmllbGQgPSBnZXRDb250YWluZXJGaWVsZCgpOwotICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgU2NoZW1hR2xvYmFsRWxlbWVudCkKLSAgICAgICAgICAgICAgICByZXR1cm4gKChTY2hlbWFHbG9iYWxFbGVtZW50KWZpZWxkKS5nZXRTb3VyY2VOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuICgoU2NoZW1hR2xvYmFsQXR0cmlidXRlKWZpZWxkKS5nZXRTb3VyY2VOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZW5hbWUoU3RyaW5nIGZpbGVuYW1lKQotICAgICAgICB7IGFzc2VydFVucmVzb2x2ZWQoKTsgX2ZpbGVuYW1lID0gZmlsZW5hbWU7IH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIFNjaGVtYUNvbXBvbmVudC5UWVBFOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Fub255bW91c1R5cGUoKQotICAgICAgICB7IHJldHVybiBfbmFtZSA9PSBudWxsOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RvY3VtZW50VHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9pc0RvY3VtZW50VHlwZTsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX2lzQXR0cmlidXRlVHlwZTsgfQotCi0gICAgcHVibGljIFFOYW1lIGdldERvY3VtZW50RWxlbWVudE5hbWUoKQotICAgIHsKLSAgICAgICAgaWYgKF9pc0RvY3VtZW50VHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgc3AgPSBnZXRDb250ZW50TW9kZWwoKTsKLSAgICAgICAgICAgIGlmIChzcCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBzcC5nZXROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0QXR0cmlidXRlVHlwZUF0dHJpYnV0ZU5hbWUoKQotICAgIHsKLSAgICAgICAgaWYgKF9pc0F0dHJpYnV0ZVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYUF0dHJpYnV0ZU1vZGVsIHNhbSA9IGdldEF0dHJpYnV0ZU1vZGVsKCk7Ci0gICAgICAgICAgICBpZiAoc2FtICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGVbXSBzbGFBcnJheSA9IHNhbS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNsYUFycmF5ICE9IG51bGwgJiYgc2xhQXJyYXkubGVuZ3RoID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlIHNsYSA9IHNsYUFycmF5WzBdOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2xhLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudFR5cGUoYm9vbGVhbiBpc0RvY3VtZW50KQotICAgICAgICB7IGFzc2VydFVucmVzb2x2ZWQoKTsgX2lzRG9jdW1lbnRUeXBlID0gaXNEb2N1bWVudDsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVHlwZShib29sZWFuIGlzQXR0cmlidXRlKQotICAgICAgICB7IGFzc2VydFVucmVzb2x2ZWQoKTsgX2lzQXR0cmlidXRlVHlwZSA9IGlzQXR0cmlidXRlOyB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX2NvbXBsZXhUeXBlVmFyaWV0eTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcGxleFR5cGVWYXJpZXR5KGludCBjb21wbGV4VHlwZVZhcmlldHkpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9jb21wbGV4VHlwZVZhcmlldHkgPSBjb21wbGV4VHlwZVZhcmlldHk7IH0KLQotICAgIC8qKiBTZXQgdGhlIGFic3RyYWN0IGFuZCBmaW5hbCBmbGFncyBmb3IgYSBjb21wbGV4IHR5cGUgKi8KLSAgICB2b2lkIHNldEFic3RyYWN0RmluYWwoCi0gICAgICAgIGJvb2xlYW4gYWJzLCBib29sZWFuIGZpbmFsRXh0LCBib29sZWFuIGZpbmFsUmVzdCwgYm9vbGVhbiBmaW5hbExpc3QsIGJvb2xlYW4gZmluYWxVbmlvbikKLSAgICB7Ci0gICAgICAgIGFzc2VydFJlc29sdmluZygpOwotICAgICAgICBfYWJzID0gYWJzOwotICAgICAgICBfZmluYWxFeHQgPSBmaW5hbEV4dDsgX2ZpbmFsUmVzdCA9IGZpbmFsUmVzdDsKLSAgICAgICAgX2ZpbmFsTGlzdCA9IGZpbmFsTGlzdDsgX2ZpbmFsVW5pb24gPSBmaW5hbFVuaW9uOwotICAgIH0KLQotICAgIC8qKiBTZXQgdGhlIGZpbmFsIGZsYWdzIGZvciBhIHNpbXBsZSB0eXBlICovCi0gICAgdm9pZCBzZXRTaW1wbGVGaW5hbChib29sZWFuIGZpbmFsUmVzdCwgYm9vbGVhbiBmaW5hbExpc3QsIGJvb2xlYW4gZmluYWxVbmlvbikKLSAgICB7Ci0gICAgICAgIGFzc2VydFJlc29sdmluZygpOyBfZmluYWxSZXN0ID0gZmluYWxSZXN0OyBfZmluYWxMaXN0ID0gZmluYWxMaXN0IDsgX2ZpbmFsVW5pb24gPSBmaW5hbFVuaW9uOwotICAgIH0KLQotICAgIHZvaWQgc2V0QmxvY2soYm9vbGVhbiBibG9ja0V4dCwgYm9vbGVhbiBibG9ja1Jlc3QpCi0gICAgewotICAgICAgICBhc3NlcnRSZXNvbHZpbmcoKTsgX2Jsb2NrRXh0ID0gYmxvY2tFeHQgOyBfYmxvY2tSZXN0ID0gYmxvY2tSZXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGJsb2NrUmVzdHJpY3Rpb24oKQotICAgIHsgcmV0dXJuIF9ibG9ja1Jlc3Q7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGJsb2NrRXh0ZW5zaW9uKCkKLSAgICB7IHJldHVybiBfYmxvY2tFeHQ7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKQotICAgIHsgcmV0dXJuIF9hYnM7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGZpbmFsRXh0ZW5zaW9uKCkKLSAgICB7IHJldHVybiBfZmluYWxFeHQ7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGZpbmFsUmVzdHJpY3Rpb24oKQotICAgIHsgcmV0dXJuIF9maW5hbFJlc3Q7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGZpbmFsTGlzdCgpCi0gICAgeyByZXR1cm4gX2ZpbmFsTGlzdDsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZmluYWxVbmlvbigpCi0gICAgeyByZXR1cm4gX2ZpbmFsVW5pb247IH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2NoZW1hRmllbGQgZ2V0Q29udGFpbmVyRmllbGQoKQotICAgIHsKLSAgICAgICAgaWYgKF9jb250YWluZXJGaWVsZENvZGUgIT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgb3V0ZXIgPSBnZXRPdXRlclR5cGUoKTsKLSAgICAgICAgICAgIGlmIChfY29udGFpbmVyRmllbGRDb2RlID09IDApCi0gICAgICAgICAgICAgICAgX2NvbnRhaW5lckZpZWxkID0gX2NvbnRhaW5lckZpZWxkUmVmID09IG51bGwgPyBudWxsIDogKFNjaGVtYUZpZWxkKV9jb250YWluZXJGaWVsZFJlZi5nZXRDb21wb25lbnQoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKF9jb250YWluZXJGaWVsZENvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICBfY29udGFpbmVyRmllbGQgPSBvdXRlci5nZXRBdHRyaWJ1dGVNb2RlbCgpLmdldEF0dHJpYnV0ZXMoKVtfY29udGFpbmVyRmllbGRJbmRleF07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgX2NvbnRhaW5lckZpZWxkID0gKChTY2hlbWFUeXBlSW1wbClvdXRlcikuZ2V0TG9jYWxFbGVtZW50QnlJbmRleChfY29udGFpbmVyRmllbGRJbmRleCk7Ci0gICAgICAgICAgICBfY29udGFpbmVyRmllbGRDb2RlID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIF9jb250YWluZXJGaWVsZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXJGaWVsZChTY2hlbWFGaWVsZCBmaWVsZCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFVucmVzb2x2ZWQoKTsKLSAgICAgICAgX2NvbnRhaW5lckZpZWxkID0gZmllbGQ7Ci0gICAgICAgIF9jb250YWluZXJGaWVsZENvZGUgPSAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXJGaWVsZFJlZihTY2hlbWFDb21wb25lbnQuUmVmIHJlZikKLSAgICB7Ci0gICAgICAgIGFzc2VydFVucmVzb2x2ZWQoKTsKLSAgICAgICAgX2NvbnRhaW5lckZpZWxkUmVmID0gcmVmOwotICAgICAgICBfY29udGFpbmVyRmllbGRDb2RlID0gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXJGaWVsZEluZGV4KHNob3J0IGNvZGUsIGludCBpbmRleCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFVucmVzb2x2ZWQoKTsKLSAgICAgICAgX2NvbnRhaW5lckZpZWxkQ29kZSA9IGNvZGU7Ci0gICAgICAgIF9jb250YWluZXJGaWVsZEluZGV4ID0gaW5kZXg7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0T3V0ZXJUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX291dGVyU2NoZW1hVHlwZVJlZiA9PSBudWxsID8gbnVsbCA6IF9vdXRlclNjaGVtYVR5cGVSZWYuZ2V0KCk7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dGVyU2NoZW1hVHlwZVJlZihTY2hlbWFUeXBlLlJlZiB0eXBlcmVmKQotICAgICAgICB7IGFzc2VydFVucmVzb2x2ZWQoKTsgX291dGVyU2NoZW1hVHlwZVJlZiA9IHR5cGVyZWY7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGlsZWQoKQotICAgICAgICB7IHJldHVybiBfaXNDb21waWxlZDsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcGlsZWQoYm9vbGVhbiBmKQotICAgICAgICB7IGFzc2VydEphdmFpemluZygpOyBfaXNDb21waWxlZCA9IGY7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2tpcHBlZEFub255bW91c1R5cGUoKQotICAgICAgICB7IHJldHVybiBfb3V0ZXJTY2hlbWFUeXBlUmVmLmdldCgpLmdldEJhc2VUeXBlKCkgPT0gdGhpczsgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTaG9ydEphdmFOYW1lKCkKLSAgICAgICAgeyByZXR1cm4gX3Nob3J0SmF2YU5hbWU7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNob3J0SmF2YU5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBhc3NlcnRSZXNvbHZlZCgpOwotICAgICAgICBfc2hvcnRKYXZhTmFtZSA9IG5hbWU7Ci0gICAgICAgIFNjaGVtYVR5cGUgb3V0ZXIgPSBfb3V0ZXJTY2hlbWFUeXBlUmVmLmdldCgpOwotICAgICAgICB3aGlsZSAob3V0ZXIuZ2V0RnVsbEphdmFOYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIG91dGVyID0gb3V0ZXIuZ2V0T3V0ZXJUeXBlKCk7Ci0KLSAgICAgICAgX2Z1bGxKYXZhTmFtZSA9IG91dGVyLmdldEZ1bGxKYXZhTmFtZSgpICsgIiQiICsgX3Nob3J0SmF2YU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGdWxsSmF2YU5hbWUoKQotICAgICAgICB7IHJldHVybiBfZnVsbEphdmFOYW1lOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGdWxsSmF2YU5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBhc3NlcnRSZXNvbHZlZCgpOwotICAgICAgICBfZnVsbEphdmFOYW1lID0gbmFtZTsKLSAgICAgICAgaW50IGluZGV4ID0gTWF0aC5tYXgoX2Z1bGxKYXZhTmFtZS5sYXN0SW5kZXhPZignJCcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZnVsbEphdmFOYW1lLmxhc3RJbmRleE9mKCcuJykpICsgMTsKLSAgICAgICAgX3Nob3J0SmF2YU5hbWUgPSBfZnVsbEphdmFOYW1lLnN1YnN0cmluZyhpbmRleCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2hvcnRKYXZhSW1wbE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBhc3NlcnRSZXNvbHZlZCgpOwotICAgICAgICBfc2hvcnRKYXZhSW1wbE5hbWUgPSBuYW1lOwotICAgICAgICBTY2hlbWFUeXBlIG91dGVyID0gX291dGVyU2NoZW1hVHlwZVJlZi5nZXQoKTsKLSAgICAgICAgd2hpbGUgKG91dGVyLmdldEZ1bGxKYXZhSW1wbE5hbWUoKSA9PSBudWxsKQotICAgICAgICAgICAgb3V0ZXIgPSBvdXRlci5nZXRPdXRlclR5cGUoKTsKLQotICAgICAgICBfZnVsbEphdmFJbXBsTmFtZSA9IG91dGVyLmdldEZ1bGxKYXZhSW1wbE5hbWUoKSArICIkIiArIF9zaG9ydEphdmFJbXBsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGdWxsSmF2YUltcGxOYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgYXNzZXJ0UmVzb2x2ZWQoKTsKLSAgICAgICAgX2Z1bGxKYXZhSW1wbE5hbWUgPSBuYW1lOwotICAgICAgICBpbnQgaW5kZXggPSBNYXRoLm1heChfZnVsbEphdmFJbXBsTmFtZS5sYXN0SW5kZXhPZignJCcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZnVsbEphdmFJbXBsTmFtZS5sYXN0SW5kZXhPZignLicpKSArIDE7Ci0gICAgICAgIF9zaG9ydEphdmFJbXBsTmFtZSA9IF9mdWxsSmF2YUltcGxOYW1lLnN1YnN0cmluZyhpbmRleCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGdWxsSmF2YUltcGxOYW1lKCkgeyByZXR1cm4gX2Z1bGxKYXZhSW1wbE5hbWU7fQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnRKYXZhSW1wbE5hbWUoKSB7IHJldHVybiBfc2hvcnRKYXZhSW1wbE5hbWU7fQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0VHlwZVN5c3RlbSgpCi0gICAgICAgIHsgcmV0dXJuIF90eXBlU3lzdGVtOyB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hUGFydGljbGUgZ2V0Q29udGVudE1vZGVsKCkKLSAgICAgICAgeyByZXR1cm4gX2NvbnRlbnRNb2RlbDsgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBidWlsZEVsdExpc3QoTGlzdCBlbHRMaXN0LCBTY2hlbWFQYXJ0aWNsZSBjb250ZW50TW9kZWwpCi0gICAgewotICAgICAgICBpZiAoY29udGVudE1vZGVsID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgc3dpdGNoIChjb250ZW50TW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICBlbHRMaXN0LmFkZChjb250ZW50TW9kZWwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudE1vZGVsLmNvdW50T2ZQYXJ0aWNsZUNoaWxkKCk7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRFbHRMaXN0KGVsdExpc3QsIGNvbnRlbnRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkKGkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBidWlsZExvY2FsRWx0cygpCi0gICAgewotICAgICAgICBMaXN0IGVsdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGJ1aWxkRWx0TGlzdChlbHRMaXN0LCBfY29udGVudE1vZGVsKTsKLSAgICAgICAgX2xvY2FsRWx0cyA9IChTY2hlbWFMb2NhbEVsZW1lbnRbXSllbHRMaXN0LnRvQXJyYXkobmV3IFNjaGVtYUxvY2FsRWxlbWVudFtlbHRMaXN0LnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFMb2NhbEVsZW1lbnQgZ2V0TG9jYWxFbGVtZW50QnlJbmRleChpbnQgaSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYUxvY2FsRWxlbWVudFtdIGVsdHMgPSBfbG9jYWxFbHRzOwotICAgICAgICBpZiAoZWx0cyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWlsZExvY2FsRWx0cygpOwotICAgICAgICAgICAgZWx0cyA9IF9sb2NhbEVsdHM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsdHNbaV07Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRJbmRleEZvckxvY2FsRWxlbWVudChTY2hlbWFMb2NhbEVsZW1lbnQgZWx0KQotICAgIHsKLSAgICAgICAgTWFwIGxvY2FsRWx0TWFwID0gX2VsdFRvSW5kZXhNYXA7Ci0gICAgICAgIGlmIChsb2NhbEVsdE1hcCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2xvY2FsRWx0cyA9PSBudWxsKQotICAgICAgICAgICAgICAgIGJ1aWxkTG9jYWxFbHRzKCk7Ci0gICAgICAgICAgICBsb2NhbEVsdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9sb2NhbEVsdHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9jYWxFbHRNYXAucHV0KF9sb2NhbEVsdHNbaV0sIG5ldyBJbnRlZ2VyKGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9lbHRUb0luZGV4TWFwID0gbG9jYWxFbHRNYXA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICgoSW50ZWdlcilsb2NhbEVsdE1hcC5nZXQoZWx0KSkuaW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEluZGV4Rm9yTG9jYWxBdHRyaWJ1dGUoU2NoZW1hTG9jYWxBdHRyaWJ1dGUgYXR0cikKLSAgICB7Ci0gICAgICAgIE1hcCBsb2NhbEF0dHJNYXAgPSBfYXR0clRvSW5kZXhNYXA7Ci0gICAgICAgIGlmIChsb2NhbEF0dHJNYXAgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgbG9jYWxBdHRyTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlW10gYXR0cnMgPSB0aGlzLl9hdHRyaWJ1dGVNb2RlbC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvY2FsQXR0ck1hcC5wdXQoYXR0cnNbaV0sIG5ldyBJbnRlZ2VyKGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9hdHRyVG9JbmRleE1hcCA9IGxvY2FsQXR0ck1hcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKChJbnRlZ2VyKWxvY2FsQXR0ck1hcC5nZXQoYXR0cikpLmludFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZU1vZGVsIGdldEF0dHJpYnV0ZU1vZGVsKCkKLSAgICAgICAgeyByZXR1cm4gX2F0dHJpYnV0ZU1vZGVsOyB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hUHJvcGVydHlbXSBnZXRQcm9wZXJ0aWVzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVQcm9wZXJ0aWVzKCk7Ci0KLSAgICAgICAgaWYgKF9wcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFByb3BlcnRpZXMoKTsKLQotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGxpc3QuYWRkQWxsKF9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZS52YWx1ZXMoKSk7Ci0gICAgICAgIGxpc3QuYWRkQWxsKF9wcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lLnZhbHVlcygpKTsKLSAgICAgICAgcmV0dXJuIChTY2hlbWFQcm9wZXJ0eVtdKWxpc3QudG9BcnJheShuZXcgU2NoZW1hUHJvcGVydHlbbGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTY2hlbWFQcm9wZXJ0eVtdIE5PX1BST1BFUlRJRVMgPSBuZXcgU2NoZW1hUHJvcGVydHlbMF07Ci0KLSAgICBwdWJsaWMgU2NoZW1hUHJvcGVydHlbXSBnZXREZXJpdmVkUHJvcGVydGllcygpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlIGJhc2VUeXBlID0gZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgaWYgKGJhc2VUeXBlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCi0gICAgICAgIExpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBpZiAoX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lICE9IG51bGwpCi0gICAgICAgICAgICByZXN1bHRzLmFkZEFsbChfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUudmFsdWVzKCkpOwotCi0gICAgICAgIGlmIChfcHJvcGVydHlNb2RlbEJ5QXR0cmlidXRlTmFtZSAhPSBudWxsKQotICAgICAgICAgICAgcmVzdWx0cy5hZGRBbGwoX3Byb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWUudmFsdWVzKCkpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSByZXN1bHRzLml0ZXJhdG9yKCkgOyBpdC5oYXNOZXh0KCkgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSAoU2NoZW1hUHJvcGVydHkpaXQubmV4dCgpOwotICAgICAgICAgICAgU2NoZW1hUHJvcGVydHkgYmFzZVByb3AgPSBwcm9wLmlzQXR0cmlidXRlKCkgPwotICAgICAgICAgICAgICAgIGJhc2VUeXBlLmdldEF0dHJpYnV0ZVByb3BlcnR5KHByb3AuZ2V0TmFtZSgpKSA6Ci0gICAgICAgICAgICAgICAgYmFzZVR5cGUuZ2V0RWxlbWVudFByb3BlcnR5KHByb3AuZ2V0TmFtZSgpKTsKLQotCi0gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGRlcml2ZWQgcHJvcGVydHkgZnJvbSB0aGUgcmVzdWx0cyBpZiBpdCBpcwotICAgICAgICAgICAgLy8gQSkgcHJlc2VudCBpbiB0aGUgYmFzZSB0eXBlIGFuZAotICAgICAgICAgICAgLy8gQikgYWxsIHRoZSBkZXRhaWxzIGFyZSB0aGUgc2FtZSAoY2FyZGluYWxpdHksIG5pbGxhYmlsaXR5KQotCi0gICAgICAgICAgICBpZiAoYmFzZVByb3AgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIGVxKHByb3AuZ2V0TWluT2NjdXJzKCksIGJhc2VQcm9wLmdldE1pbk9jY3VycygpKSAmJgotICAgICAgICAgICAgICAgICAgICAgZXEocHJvcC5nZXRNYXhPY2N1cnMoKSwgYmFzZVByb3AuZ2V0TWF4T2NjdXJzKCkpICYmCi0gICAgICAgICAgICAgICAgICAgICBwcm9wLmhhc05pbGxhYmxlKCkgPT0gYmFzZVByb3AuaGFzTmlsbGFibGUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFNjaGVtYVByb3BlcnR5W10pcmVzdWx0cy50b0FycmF5KG5ldyBTY2hlbWFQcm9wZXJ0eVtyZXN1bHRzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXEoQmlnSW50ZWdlciBhLCBCaWdJbnRlZ2VyIGIpCi0gICAgewotICAgICAgICBpZiAoYSA9PSBudWxsICYmIGIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYT09IG51bGwgfHwgYiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gYS5lcXVhbHMoYik7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVByb3BlcnR5W10gZ2V0RWxlbWVudFByb3BlcnRpZXMoKQotICAgIHsKLSAgICAgICAgaWYgKF9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIE5PX1BST1BFUlRJRVM7Ci0KLSAgICAgICAgcmV0dXJuIChTY2hlbWFQcm9wZXJ0eVtdKQotICAgICAgICAgICAgICAgIF9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZS52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFQcm9wZXJ0eVtfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVByb3BlcnR5W10gZ2V0QXR0cmlidXRlUHJvcGVydGllcygpCi0gICAgewotICAgICAgICBpZiAoX3Byb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBOT19QUk9QRVJUSUVTOwotCi0gICAgICAgIHJldHVybiAoU2NoZW1hUHJvcGVydHlbXSkKLSAgICAgICAgICAgICAgICBfcHJvcGVydHlNb2RlbEJ5QXR0cmlidXRlTmFtZS52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFQcm9wZXJ0eVtfcHJvcGVydHlNb2RlbEJ5QXR0cmlidXRlTmFtZS5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hUHJvcGVydHkgZ2V0RWxlbWVudFByb3BlcnR5KFFOYW1lIGVsdE5hbWUpCi0gICAgICAgIHsgcmV0dXJuIF9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZSA9PSBudWxsID8gbnVsbCA6IChTY2hlbWFQcm9wZXJ0eSlfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUuZ2V0KGVsdE5hbWUpOyB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hUHJvcGVydHkgZ2V0QXR0cmlidXRlUHJvcGVydHkoUU5hbWUgYXR0ck5hbWUpCi0gICAgICAgIHsgcmV0dXJuIF9wcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lID09IG51bGwgPyBudWxsIDogKFNjaGVtYVByb3BlcnR5KV9wcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lLmdldChhdHRyTmFtZSk7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0FsbENvbnRlbnQoKQotICAgICAgICB7IHJldHVybiBfaGFzQWxsQ29udGVudDsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNPcmRlclNlbnNpdGl2ZSgpCi0gICAgICAgIHsgcmV0dXJuIF9vcmRlclNlbnNpdGl2ZTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3JkZXJTZW5zaXRpdmUoYm9vbGVhbiBzZW5zaXRpdmUpCi0gICAgICAgIHsgYXNzZXJ0SmF2YWl6aW5nKCk7IF9vcmRlclNlbnNpdGl2ZSA9IHNlbnNpdGl2ZTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudE1vZGVsKAotICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgY29udGVudE1vZGVsLAotICAgICAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWwgYXR0ck1vZGVsLAotICAgICAgICAgICAgTWFwIHByb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lLAotICAgICAgICAgICAgTWFwIHByb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWUsCi0gICAgICAgICAgICBib29sZWFuIGlzQWxsKQotICAgIHsKLSAgICAgICAgYXNzZXJ0UmVzb2x2aW5nKCk7Ci0gICAgICAgIF9jb250ZW50TW9kZWwgPSBjb250ZW50TW9kZWw7Ci0gICAgICAgIF9hdHRyaWJ1dGVNb2RlbCA9IGF0dHJNb2RlbDsKLSAgICAgICAgX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lID0gcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWU7Ci0gICAgICAgIF9wcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlNb2RlbEJ5QXR0cmlidXRlTmFtZTsKLSAgICAgICAgX2hhc0FsbENvbnRlbnQgPSBpc0FsbDsKLQotCi0gICAgICAgIC8vIEFkZCBlbnRyaWVzIGZvciBlYWNoIGVsZW1lbnQgcHJvcGVydHkgZm9yIHN1YnN0aXR1dGlvbiBncm91cCBtZW1iZXJzCi0gICAgICAgIGlmIChfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3ZhbGlkU3Vic3RpdHV0aW9ucyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uIGVsdFByb3BzID0gX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lLnZhbHVlcygpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGVsdFByb3BzLml0ZXJhdG9yKCkgOyBpdC5oYXNOZXh0KCkgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IChTY2hlbWFQcm9wZXJ0eSlpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgUU5hbWVbXSBuYW1lcyA9IHByb3AuYWNjZXB0ZWROYW1lcygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG5hbWVzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghIF9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZS5jb250YWluc0tleShuYW1lc1tpXSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBfdmFsaWRTdWJzdGl0dXRpb25zLmFkZChuYW1lc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zRWxlbWVudHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldENvbnRlbnRUeXBlKCkgPT0gRUxFTUVOVF9DT05URU5UIHx8Ci0gICAgICAgICAgICAgICBnZXRDb250ZW50VHlwZSgpID09IE1JWEVEX0NPTlRFTlQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlV2lsZGNhcmRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaGFzV2lsZGNhcmRBdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0VsZW1lbnRXaWxkY2FyZHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9oYXNXaWxkY2FyZEVsZW1lbnRzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRTdWJzdGl0dXRpb24oUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsaWRTdWJzdGl0dXRpb25zLmNvbnRhaW5zKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGdldEVsZW1lbnRUeXBlKFFOYW1lIGVsdE5hbWUsIFFOYW1lIHhzaVR5cGUsIFNjaGVtYVR5cGVMb2FkZXIgd2lsZGNhcmRUeXBlTG9hZGVyKQotICAgIHsKLSAgICAgICAgaWYgKGlzU2ltcGxlVHlwZSgpIHx8ICFjb250YWluc0VsZW1lbnRzKCkgfHwgaXNOb1R5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9OT19UWVBFOwotCi0gICAgICAgIFNjaGVtYVR5cGUgdHlwZTsKLSAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IChTY2hlbWFQcm9wZXJ0eSlfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUuZ2V0KGVsdE5hbWUpOwotICAgICAgICBpZiAocHJvcCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlID0gcHJvcC5nZXRUeXBlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIV90eXBlZFdpbGRjYXJkRWxlbWVudHMuY29udGFpbnMoZWx0TmFtZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PX1RZUEU7Ci0KLSAgICAgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQgZWx0ID0gd2lsZGNhcmRUeXBlTG9hZGVyLmZpbmRFbGVtZW50KGVsdE5hbWUpOwotICAgICAgICAgICAgaWYgKGVsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9OT19UWVBFOwotICAgICAgICAgICAgdHlwZSA9IGVsdC5nZXRUeXBlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoeHNpVHlwZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlIGl0eXBlID0gd2lsZGNhcmRUeXBlTG9hZGVyLmZpbmRUeXBlKHhzaVR5cGUpOwotICAgICAgICAgICAgaWYgKGl0eXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PX1RZUEU7Ci0gICAgICAgICAgICBpZiAodHlwZS5pc0Fzc2lnbmFibGVGcm9tKGl0eXBlKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaXR5cGU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PX1RZUEU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRBdHRyaWJ1dGVUeXBlKFFOYW1lIGF0dHJOYW1lLCBTY2hlbWFUeXBlTG9hZGVyIHdpbGRjYXJkVHlwZUxvYWRlcikKLSAgICB7Ci0gICAgICAgIGlmIChpc1NpbXBsZVR5cGUoKSB8fCBpc05vVHlwZSgpKQotICAgICAgICAgICAgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PX1RZUEU7Ci0KLSAgICAgICAgaWYgKGlzVVJUeXBlKCkpCi0gICAgICAgICAgICByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKLQotICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gKFNjaGVtYVByb3BlcnR5KV9wcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lLmdldChhdHRyTmFtZSk7Ci0gICAgICAgIGlmIChwcm9wICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcHJvcC5nZXRUeXBlKCk7Ci0KLSAgICAgICAgaWYgKCFfdHlwZWRXaWxkY2FyZEF0dHJpYnV0ZXMuY29udGFpbnMoYXR0ck5hbWUpKQotICAgICAgICAgICAgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PX1RZUEU7Ci0KLSAgICAgICAgU2NoZW1hR2xvYmFsQXR0cmlidXRlIGF0dHIgPSB3aWxkY2FyZFR5cGVMb2FkZXIuZmluZEF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0gICAgICAgIGlmIChhdHRyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKLSAgICAgICAgcmV0dXJuIGF0dHIuZ2V0VHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgY3JlYXRlRWxlbWVudFR5cGUoUU5hbWUgZWx0TmFtZSwgUU5hbWUgeHNpVHlwZSwgU2NoZW1hVHlwZUxvYWRlciB3aWxkY2FyZFR5cGVMb2FkZXIpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlIHR5cGUgPSBudWxsOwotICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gbnVsbDsKLSAgICAgICAgaWYgKGlzU2ltcGxlVHlwZSgpIHx8ICFjb250YWluc0VsZW1lbnRzKCkgfHwgaXNOb1R5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PX1RZUEU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wID0gKFNjaGVtYVByb3BlcnR5KV9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZS5nZXQoZWx0TmFtZSk7Ci0gICAgICAgICAgICBpZiAocHJvcCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHR5cGUgPSBwcm9wLmdldFR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFfdHlwZWRXaWxkY2FyZEVsZW1lbnRzLmNvbnRhaW5zKGVsdE5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAhX3ZhbGlkU3Vic3RpdHV0aW9ucy5jb250YWlucyhlbHROYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50IGVsdCA9IHdpbGRjYXJkVHlwZUxvYWRlci5maW5kRWxlbWVudChlbHROYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoZWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBlbHQuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PX1RZUEU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh4c2lUeXBlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZSBpdHlwZSA9IHdpbGRjYXJkVHlwZUxvYWRlci5maW5kVHlwZSh4c2lUeXBlKTsKLSAgICAgICAgICAgICAgICBpZiAoaXR5cGUgPT0gbnVsbCB8fCAhdHlwZS5pc0Fzc2lnbmFibGVGcm9tKGl0eXBlKSkKLSAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PX1RZUEU7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB0eXBlID0gaXR5cGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICgoU2NoZW1hVHlwZUltcGwpdHlwZSkuY3JlYXRlVW5hdHRhY2hlZE5vZGUocHJvcCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgY3JlYXRlQXR0cmlidXRlVHlwZShRTmFtZSBhdHRyTmFtZSwgU2NoZW1hVHlwZUxvYWRlciB3aWxkY2FyZFR5cGVMb2FkZXIpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlSW1wbCB0eXBlID0gbnVsbDsKLSAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IG51bGw7Ci0gICAgICAgIGlmIChpc1NpbXBsZVR5cGUoKSB8fCBpc05vVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpc1VSVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3AgPSAoU2NoZW1hUHJvcGVydHkpX3Byb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWUuZ2V0KGF0dHJOYW1lKTsKLSAgICAgICAgICAgIGlmIChwcm9wICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IChTY2hlbWFUeXBlSW1wbClwcm9wLmdldFR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFfdHlwZWRXaWxkY2FyZEF0dHJpYnV0ZXMuY29udGFpbnMoYXR0ck5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHR5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9OT19UWVBFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBhdHRyID0gd2lsZGNhcmRUeXBlTG9hZGVyLmZpbmRBdHRyaWJ1dGUoYXR0ck5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAoU2NoZW1hVHlwZUltcGwpYXR0ci5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB0eXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gdHlwZS5jcmVhdGVVbmF0dGFjaGVkTm9kZShwcm9wKTsKLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaWxkY2FyZFN1bW1hcnkoUU5hbWVTZXQgZWxlbWVudFNldCwgYm9vbGVhbiBoYXN3Y0VsdCwgUU5hbWVTZXQgYXR0cmlidXRlU2V0LCBib29sZWFuIGhhc3djQXR0KQotICAgIHsKLSAgICAgICAgYXNzZXJ0UmVzb2x2aW5nKCk7IF90eXBlZFdpbGRjYXJkRWxlbWVudHMgPSBlbGVtZW50U2V0OyBfaGFzV2lsZGNhcmRFbGVtZW50cyA9IGhhc3djRWx0OyBfdHlwZWRXaWxkY2FyZEF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVTZXQ7IF9oYXNXaWxkY2FyZEF0dHJpYnV0ZXMgPSBoYXN3Y0F0dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVtdIGdldEFub255bW91c1R5cGVzKCkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGVbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZVtfYW5vbnltb3VzVHlwZXJlZnMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICByZXN1bHRbaV0gPSBfYW5vbnltb3VzVHlwZXJlZnNbaV0uZ2V0KCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QW5vbnltb3VzVHlwZVJlZnMoU2NoZW1hVHlwZS5SZWZbXSBhbm9ueW1vdXNUeXBlcmVmcykKLSAgICB7Ci0gICAgICAgIF9hbm9ueW1vdXNUeXBlcmVmcyA9IGFub255bW91c1R5cGVyZWZzOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hVHlwZVtdIHN0YUNvcHkoU2NoZW1hVHlwZVtdIGEpCi0gICAgewotICAgICAgICBpZiAoYSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgU2NoZW1hVHlwZVtdIHJlc3VsdCA9IG5ldyBTY2hlbWFUeXBlW2EubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShhLCAwLCByZXN1bHQsIDAsIGEubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuW10gYm9hQ29weShib29sZWFuW10gYSkKLSAgICB7Ci0gICAgICAgIGlmIChhID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bYS5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGEsIDAsIHJlc3VsdCwgMCwgYS5sZW5ndGgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaW1wbGVUeXBlVmFyaWV0eShpbnQgdmFyaWV0eSkKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX3NpbXBsZVR5cGVWYXJpZXR5ID0gdmFyaWV0eTsgfQotCi0gICAgcHVibGljIGludCBnZXRTaW1wbGVWYXJpZXR5KCkKLSAgICAgICAgeyByZXR1cm4gX3NpbXBsZVR5cGVWYXJpZXR5OyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VSVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9idWlsdGluVHlwZUNvZGUgPT0gQlRDX0FOWV9UWVBFIHx8IF9idWlsdGluVHlwZUNvZGUgPT0gQlRDX0FOWV9TSU1QTEU7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTm9UeXBlKCkKLSAgICAgICAgeyByZXR1cm4gdGhpcyA9PSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9OT19UWVBFOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbXBsZVR5cGUoKQotICAgICAgICB7IHJldHVybiBfaXNTaW1wbGVUeXBlOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaW1wbGVUeXBlKGJvb2xlYW4gZikKLSAgICAgICAgeyBhc3NlcnRVbnJlc29sdmVkKCk7IF9pc1NpbXBsZVR5cGUgPSBmOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VuaW9uT2ZMaXN0cygpCi0gICAgICAgIHsgcmV0dXJuIF9pc1VuaW9uT2ZMaXN0czsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VW5pb25PZkxpc3RzKGJvb2xlYW4gZikKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX2lzVW5pb25PZkxpc3RzID0gZjsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0UHJpbWl0aXZlVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9wcmltaXRpdmVUeXBlUmVmID09IG51bGwgPyBudWxsIDogX3ByaW1pdGl2ZVR5cGVSZWYuZ2V0KCk7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByaW1pdGl2ZVR5cGVSZWYoU2NoZW1hVHlwZS5SZWYgdHlwZXJlZikKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX3ByaW1pdGl2ZVR5cGVSZWYgPSB0eXBlcmVmOyB9Ci0KLSAgICBwdWJsaWMgaW50IGdldERlY2ltYWxTaXplKCkKLSAgICAgICAgeyByZXR1cm4gX2RlY2ltYWxTaXplOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWNpbWFsU2l6ZShpbnQgYml0cykKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX2RlY2ltYWxTaXplID0gYml0czsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0QmFzZVR5cGUoKQotICAgICAgICB7IHJldHVybiBfYmFzZVR5cGVyZWYgPT0gbnVsbCA/IG51bGwgOiBfYmFzZVR5cGVyZWYuZ2V0KCk7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VUeXBlUmVmKFNjaGVtYVR5cGUuUmVmIHR5cGVyZWYpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9iYXNlVHlwZXJlZiA9IHR5cGVyZWY7IH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QmFzZURlcHRoKCkKLSAgICAgICAgeyByZXR1cm4gX2Jhc2VEZXB0aDsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZURlcHRoKGludCBkZXB0aCkKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX2Jhc2VEZXB0aCA9IGRlcHRoOyB9Ci0KLSAgICBwdWJsaWMgaW50IGdldERlcml2YXRpb25UeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX2Rlcml2YXRpb25UeXBlOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXJpdmF0aW9uVHlwZShpbnQgdHlwZSkKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX2Rlcml2YXRpb25UeXBlID0gdHlwZTsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0TGlzdEl0ZW1UeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX2xpc3RJdGVtVHlwZXJlZiA9PSBudWxsID8gbnVsbCA6IF9saXN0SXRlbVR5cGVyZWYuZ2V0KCk7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExpc3RJdGVtVHlwZVJlZihTY2hlbWFUeXBlLlJlZiB0eXBlcmVmKQotICAgICAgICB7IGFzc2VydFJlc29sdmluZygpOyBfbGlzdEl0ZW1UeXBlcmVmID0gdHlwZXJlZjsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVbXSBnZXRVbmlvbk1lbWJlclR5cGVzKCkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGVbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZVtfdW5pb25NZW1iZXJUeXBlcmVmcy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHJlc3VsdFtpXSA9IF91bmlvbk1lbWJlclR5cGVyZWZzW2ldLmdldCgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVuaW9uTWVtYmVyVHlwZVJlZnMoU2NoZW1hVHlwZS5SZWZbXSB0eXBlcmVmcykKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX3VuaW9uTWVtYmVyVHlwZXJlZnMgPSB0eXBlcmVmczsgfQotCi0gICAgcHVibGljIGludCBnZXRBbm9ueW1vdXNVbmlvbk1lbWJlck9yZGluYWwoKQotICAgICAgICB7IHJldHVybiBfYW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBbm9ueW1vdXNVbmlvbk1lbWJlck9yZGluYWwoaW50IGkpCi0gICAgICAgIHsgYXNzZXJ0VW5yZXNvbHZlZCgpOyBfYW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsID0gaTsgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTY2hlbWFUeXBlW10gZ2V0VW5pb25Db25zdGl0dWVudFR5cGVzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfdW5pb25Db21tb25CYXNlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgY29tcHV0ZUZsYXRVbmlvbk1vZGVsKCk7Ci0gICAgICAgIHJldHVybiBzdGFDb3B5KF91bmlvbkNvbnN0aXR1ZW50VHlwZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRVbmlvbkNvbnN0aXR1ZW50VHlwZXMoU2NoZW1hVHlwZVtdIHR5cGVzKQotICAgICAgICB7IF91bmlvbkNvbnN0aXR1ZW50VHlwZXMgPSB0eXBlczsgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTY2hlbWFUeXBlW10gZ2V0VW5pb25TdWJUeXBlcygpCi0gICAgewotICAgICAgICBpZiAoX3VuaW9uQ29tbW9uQmFzZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIGNvbXB1dGVGbGF0VW5pb25Nb2RlbCgpOwotICAgICAgICByZXR1cm4gc3RhQ29weShfdW5pb25TdWJUeXBlcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFVuaW9uU3ViVHlwZXMoU2NoZW1hVHlwZVtdIHR5cGVzKQotICAgICAgICB7IF91bmlvblN1YlR5cGVzID0gdHlwZXM7IH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2NoZW1hVHlwZSBnZXRVbmlvbkNvbW1vbkJhc2VUeXBlKCkKLSAgICB7Ci0gICAgICAgIGlmIChfdW5pb25Db21tb25CYXNlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgY29tcHV0ZUZsYXRVbmlvbk1vZGVsKCk7Ci0gICAgICAgIHJldHVybiBfdW5pb25Db21tb25CYXNlVHlwZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0VW5pb25Db21tb25CYXNlVHlwZShTY2hlbWFUeXBlIHR5cGUpCi0gICAgICAgIHsgX3VuaW9uQ29tbW9uQmFzZVR5cGUgPSB0eXBlOyB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29tcHV0ZUZsYXRVbmlvbk1vZGVsKCkKLSAgICB7Ci0gICAgICAgIFNldCBjb25zdGl0dWVudE1lbWJlclR5cGVzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLSAgICAgICAgU2V0IGFsbFN1YlR5cGVzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLSAgICAgICAgU2NoZW1hVHlwZSBjb21tb25CYXNlVHlwZSA9IG51bGw7Ci0KLSAgICAgICAgYWxsU3ViVHlwZXMuYWRkKHRoaXMpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3VuaW9uTWVtYmVyVHlwZXJlZnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGVJbXBsIG1JbXBsID0gKFNjaGVtYVR5cGVJbXBsKV91bmlvbk1lbWJlclR5cGVyZWZzW2ldLmdldCgpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1JbXBsLmdldFNpbXBsZVZhcmlldHkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTElTVDoKLSAgICAgICAgICAgICAgICAgICAgY29uc3RpdHVlbnRNZW1iZXJUeXBlcy5hZGQobUltcGwpOwotICAgICAgICAgICAgICAgICAgICBhbGxTdWJUeXBlcy5hZGQobUltcGwpOwotICAgICAgICAgICAgICAgICAgICBjb21tb25CYXNlVHlwZSA9IG1JbXBsLmdldENvbW1vbkJhc2VUeXBlKGNvbW1vbkJhc2VUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OOgotICAgICAgICAgICAgICAgICAgICBjb25zdGl0dWVudE1lbWJlclR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KG1JbXBsLmdldFVuaW9uQ29uc3RpdHVlbnRUeXBlcygpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFsbFN1YlR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KG1JbXBsLmdldFVuaW9uU3ViVHlwZXMoKSkpOwotICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlIG90aGVyQ29tbW9uQmFzZVR5cGUgPSBtSW1wbC5nZXRVbmlvbkNvbW1vbkJhc2VUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdGhlckNvbW1vbkJhc2VUeXBlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21tb25CYXNlVHlwZSA9IG90aGVyQ29tbW9uQmFzZVR5cGUuZ2V0Q29tbW9uQmFzZVR5cGUoY29tbW9uQmFzZVR5cGUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQVRPTUlDOgotICAgICAgICAgICAgICAgICAgICBjb25zdGl0dWVudE1lbWJlclR5cGVzLmFkZChtSW1wbCk7Ci0gICAgICAgICAgICAgICAgICAgIGFsbFN1YlR5cGVzLmFkZChtSW1wbCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1vbkJhc2VUeXBlID0gbUltcGwuZ2V0Q29tbW9uQmFzZVR5cGUoY29tbW9uQmFzZVR5cGUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2V0VW5pb25Db25zdGl0dWVudFR5cGVzKChTY2hlbWFUeXBlW10pCi0gICAgICAgICAgICAgICAgY29uc3RpdHVlbnRNZW1iZXJUeXBlcy50b0FycmF5KFN0c2NTdGF0ZS5FTVBUWV9TVF9BUlJBWSkpOwotICAgICAgICBzZXRVbmlvblN1YlR5cGVzKChTY2hlbWFUeXBlW10pCi0gICAgICAgICAgICAgICAgYWxsU3ViVHlwZXMudG9BcnJheShTdHNjU3RhdGUuRU1QVFlfU1RfQVJSQVkpKTsKLSAgICAgICAgc2V0VW5pb25Db21tb25CYXNlVHlwZShjb21tb25CYXNlVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldFN1YnN0aXR1dGlvbkdyb3VwKCkKLSAgICAgICAgeyByZXR1cm4gX3NnOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdWJzdGl0dXRpb25Hcm91cChRTmFtZSBzZykKLSAgICAgICAgeyBhc3NlcnRTR1Jlc29sdmluZygpOyBfc2cgPSBzZzsgfQotCi0gICAgcHVibGljIHZvaWQgYWRkU3Vic3RpdHV0aW9uR3JvdXBNZW1iZXIoUU5hbWUgbWVtYmVyKQotICAgICAgICB7IGFzc2VydFNHUmVzb2x2ZWQoKTsgX3NnTWVtYmVycy5hZGQobWVtYmVyKTsgfQotCi0gICAgcHVibGljIFFOYW1lW10gZ2V0U3Vic3RpdHV0aW9uR3JvdXBNZW1iZXJzKCkKLSAgICB7Ci0gICAgICAgIFFOYW1lW10gcmVzdWx0ID0gbmV3IFFOYW1lW19zZ01lbWJlcnMuc2l6ZSgpXTsKLSAgICAgICAgcmV0dXJuIChRTmFtZVtdKV9zZ01lbWJlcnMudG9BcnJheShyZXN1bHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0V2hpdGVTcGFjZVJ1bGUoKQotICAgICAgICB7IHJldHVybiBfd2hpdGVTcGFjZVJ1bGU7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdoaXRlU3BhY2VSdWxlKGludCB3cykKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX3doaXRlU3BhY2VSdWxlID0gd3M7IH0KLQotICAgIHB1YmxpYyBYbWxBbnlTaW1wbGVUeXBlIGdldEZhY2V0KGludCBmYWNldENvZGUpCi0gICAgewotICAgICAgICBpZiAoX2ZhY2V0QXJyYXkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBYbWxWYWx1ZVJlZiByZWYgPSBfZmFjZXRBcnJheVtmYWNldENvZGVdOwotICAgICAgICBpZiAocmVmID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIHJlZi5nZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhY2V0Rml4ZWQoaW50IGZhY2V0Q29kZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZml4ZWRGYWNldEFycmF5W2ZhY2V0Q29kZV07Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEFueVNpbXBsZVR5cGVbXSBnZXRCYXNpY0ZhY2V0cygpCi0gICAgewotICAgICAgICBYbWxBbnlTaW1wbGVUeXBlW10gcmVzdWx0ID0gbmV3IFhtbEFueVNpbXBsZVR5cGVbU2NoZW1hVHlwZS5MQVNUX0ZBQ0VUICsgMV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IFNjaGVtYVR5cGUuTEFTVF9GQUNFVDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHRbaV0gPSBnZXRGYWNldChpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuW10gZ2V0Rml4ZWRGYWNldHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJvYUNvcHkoX2ZpeGVkRmFjZXRBcnJheSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmFzaWNGYWNldHMoWG1sVmFsdWVSZWZbXSB2YWx1ZXMsIGJvb2xlYW5bXSBmaXhlZCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFJlc29sdmluZygpOwotICAgICAgICBfZmFjZXRBcnJheSA9IHZhbHVlczsKLSAgICAgICAgX2ZpeGVkRmFjZXRBcnJheSA9IGZpeGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgb3JkZXJlZCgpCi0gICAgICAgIHsgcmV0dXJuIF9vcmRlcmVkOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPcmRlcmVkKGludCBvcmRlcmluZykKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX29yZGVyZWQgPSBvcmRlcmluZzsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNCb3VuZGVkKCkKLSAgICAgICAgeyByZXR1cm4gX2lzQm91bmRlZDsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Qm91bmRlZChib29sZWFuIGYpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9pc0JvdW5kZWQgPSBmOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Zpbml0ZSgpCi0gICAgICAgIHsgcmV0dXJuIF9pc0Zpbml0ZTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmluaXRlKGJvb2xlYW4gZikKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX2lzRmluaXRlID0gZjsgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNOdW1lcmljKCkKLSAgICAgICAgeyByZXR1cm4gX2lzTnVtZXJpYzsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TnVtZXJpYyhib29sZWFuIGYpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9pc051bWVyaWMgPSBmOyB9Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1BhdHRlcm5GYWNldCgpCi0gICAgICAgIHsgcmV0dXJuIF9oYXNQYXR0ZXJuczsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGF0dGVybkZhY2V0KGJvb2xlYW4gaGFzUGF0dGVybnMpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9oYXNQYXR0ZXJucyA9IGhhc1BhdHRlcm5zOyB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuRmFjZXQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBpZiAoIV9oYXNQYXR0ZXJucykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGlmIChfcGF0dGVybnMgIT0gbnVsbCAmJiBfcGF0dGVybnMubGVuZ3RoID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgX3BhdHRlcm5zLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfcGF0dGVybnNbaV0ubWF0Y2hlcyhzKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaSA+PSBfcGF0dGVybnMubGVuZ3RoKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBnZXRCYXNlVHlwZSgpLm1hdGNoUGF0dGVybkZhY2V0KHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXR0ZXJucygpCi0gICAgewotICAgICAgICBpZiAoX3BhdHRlcm5zID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgICAgICAgU3RyaW5nW10gcGF0dGVybnMgPSBuZXcgU3RyaW5nW19wYXR0ZXJucy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8IF9wYXR0ZXJucy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHBhdHRlcm5zW2ldID0gX3BhdHRlcm5zW2ldLmdldFBhdHRlcm4oKTsKLSAgICAgICAgcmV0dXJuIHBhdHRlcm5zOwotICAgIH0KLQotICAgIHB1YmxpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bXSBnZXRQYXR0ZXJuRXhwcmVzc2lvbnMoKQotICAgIHsKLSAgICAgICAgaWYgKF9wYXR0ZXJucyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bMF07Ci0gICAgICAgIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbltdIHJlc3VsdCA9IG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bX3BhdHRlcm5zLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX3BhdHRlcm5zLCAwLCByZXN1bHQsIDAsIF9wYXR0ZXJucy5sZW5ndGgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm5zKG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbltdIGxpc3QpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9wYXR0ZXJucyA9IGxpc3Q7IH0KLQotICAgIHB1YmxpYyBYbWxBbnlTaW1wbGVUeXBlW10gZ2V0RW51bWVyYXRpb25WYWx1ZXMoKQotICAgIHsKLSAgICAgICAgaWYgKF9lbnVtZXJhdGlvblZhbHVlcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFhtbEFueVNpbXBsZVR5cGVbXSByZXN1bHQgPSBuZXcgWG1sQW55U2ltcGxlVHlwZVtfZW51bWVyYXRpb25WYWx1ZXMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbFZhbHVlUmVmIHJlZiA9IF9lbnVtZXJhdGlvblZhbHVlc1tpXTsKLSAgICAgICAgICAgIHJlc3VsdFtpXSA9IChyZWYgPT0gbnVsbCA/IG51bGwgOiByZWYuZ2V0KCkpOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnVtZXJhdGlvblZhbHVlcyhYbWxWYWx1ZVJlZltdIGEpCi0gICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9lbnVtZXJhdGlvblZhbHVlcyA9IGE7IH0KLQotICAgIHB1YmxpYyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1Gb3JTdHJpbmcoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBlbnN1cmVTdHJpbmdFbnVtSW5mbygpOwotICAgICAgICBpZiAoX2xvb2t1cFN0cmluZ0VudW0gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gKFN0cmluZ0VudW1BYnN0cmFjdEJhc2UpX2xvb2t1cFN0cmluZ0VudW0uZ2V0KHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1Gb3JJbnQoaW50IGkpCi0gICAgewotICAgICAgICBlbnN1cmVTdHJpbmdFbnVtSW5mbygpOwotICAgICAgICBpZiAoX2xpc3RPZlN0cmluZ0VudW0gPT0gbnVsbCB8fCBpIDwgMCB8fCBpID49IF9saXN0T2ZTdHJpbmdFbnVtLnNpemUoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gKFN0cmluZ0VudW1BYnN0cmFjdEJhc2UpX2xpc3RPZlN0cmluZ0VudW0uZ2V0KGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFTdHJpbmdFbnVtRW50cnkgZW51bUVudHJ5Rm9yU3RyaW5nKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgZW5zdXJlU3RyaW5nRW51bUluZm8oKTsKLSAgICAgICAgaWYgKF9sb29rdXBTdHJpbmdFbnVtRW50cnkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gKFNjaGVtYVN0cmluZ0VudW1FbnRyeSlfbG9va3VwU3RyaW5nRW51bUVudHJ5LmdldChzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRCYXNlRW51bVR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9iYXNlRW51bVR5cGVyZWYgPT0gbnVsbCA/IG51bGwgOiBfYmFzZUVudW1UeXBlcmVmLmdldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VFbnVtVHlwZVJlZihTY2hlbWFUeXBlLlJlZiBiYXNlRW51bVR5cGVyZWYpCi0gICAgewotICAgICAgICBfYmFzZUVudW1UeXBlcmVmID0gYmFzZUVudW1UeXBlcmVmOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFTdHJpbmdFbnVtRW50cnlbXSBnZXRTdHJpbmdFbnVtRW50cmllcygpCi0gICAgewotICAgICAgICBpZiAoX3N0cmluZ0VudW1FbnRyaWVzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU2NoZW1hU3RyaW5nRW51bUVudHJ5W10gcmVzdWx0ID0gbmV3IFNjaGVtYVN0cmluZ0VudW1FbnRyeVtfc3RyaW5nRW51bUVudHJpZXMubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShfc3RyaW5nRW51bUVudHJpZXMsIDAsIHJlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3RyaW5nRW51bUVudHJpZXMoU2NoZW1hU3RyaW5nRW51bUVudHJ5IHNFbnVtc1tdKQotICAgIHsKLSAgICAgICAgYXNzZXJ0SmF2YWl6aW5nKCk7Ci0gICAgICAgIF9zdHJpbmdFbnVtRW50cmllcyA9IHNFbnVtczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlU3RyaW5nRW51bUluZm8oKQotICAgIHsKLSAgICAgICAgaWYgKF9zdHJpbmdFbnVtRW5zdXJlZCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBTY2hlbWFTdHJpbmdFbnVtRW50cnlbXSBzRW51bXMgPSBfc3RyaW5nRW51bUVudHJpZXM7Ci0gICAgICAgIGlmIChzRW51bXMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3N0cmluZ0VudW1FbnN1cmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcCBsb29rdXBTdHJpbmdFbnVtID0gbmV3IEhhc2hNYXAoc0VudW1zLmxlbmd0aCk7Ci0gICAgICAgIExpc3QgbGlzdE9mU3RyaW5nRW51bSA9IG5ldyBBcnJheUxpc3Qoc0VudW1zLmxlbmd0aCArIDEpOwotICAgICAgICBNYXAgbG9va3VwU3RyaW5nRW51bUVudHJ5ID0gbmV3IEhhc2hNYXAoc0VudW1zLmxlbmd0aCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzRW51bXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvb2t1cFN0cmluZ0VudW1FbnRyeS5wdXQoc0VudW1zW2ldLmdldFN0cmluZygpLCBzRW51bXNbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3MgamMgPSBfYmFzZUVudW1UeXBlcmVmLmdldCgpLmdldEVudW1KYXZhQ2xhc3MoKTsKLSAgICAgICAgaWYgKGpjICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UuVGFibGUgdGFibGUgPSAoU3RyaW5nRW51bUFic3RyYWN0QmFzZS5UYWJsZSlqYy5nZXRGaWVsZCgidGFibGUiKS5nZXQobnVsbCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzRW51bXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IHNFbnVtc1tpXS5nZXRJbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1WYWwgPSB0YWJsZS5mb3JJbnQoaik7Ci0gICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZ0VudW0ucHV0KHNFbnVtc1tpXS5nZXRTdHJpbmcoKSwgZW51bVZhbCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChsaXN0T2ZTdHJpbmdFbnVtLnNpemUoKSA8PSBqKQotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdE9mU3RyaW5nRW51bS5hZGQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RPZlN0cmluZ0VudW0uc2V0KGosIGVudW1WYWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNvbWV0aGluZyB3cm9uZzogY291bGQgbm90IGxvY2F0ZSBlbnVtIHRhYmxlIGZvciAiICsgamMpOwotICAgICAgICAgICAgICAgIGpjID0gbnVsbDsKLSAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmdFbnVtLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbGlzdE9mU3RyaW5nRW51bS5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGpjID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc0VudW1zLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBqID0gc0VudW1zW2ldLmdldEludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBzRW51bXNbaV0uZ2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBlbnVtVmFsID0gbmV3IFN0cmluZ0VudW1WYWx1ZShzLCBqKTsKLSAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmdFbnVtLnB1dChzLCBlbnVtVmFsKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAobGlzdE9mU3RyaW5nRW51bS5zaXplKCkgPD0gaikKLSAgICAgICAgICAgICAgICAgICAgbGlzdE9mU3RyaW5nRW51bS5hZGQobnVsbCk7Ci0gICAgICAgICAgICAgICAgbGlzdE9mU3RyaW5nRW51bS5zZXQoaiwgZW51bVZhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghX3N0cmluZ0VudW1FbnN1cmVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9sb29rdXBTdHJpbmdFbnVtID0gbG9va3VwU3RyaW5nRW51bTsKLSAgICAgICAgICAgICAgICBfbGlzdE9mU3RyaW5nRW51bSA9IGxpc3RPZlN0cmluZ0VudW07Ci0gICAgICAgICAgICAgICAgX2xvb2t1cFN0cmluZ0VudW1FbnRyeSA9IGxvb2t1cFN0cmluZ0VudW1FbnRyeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBIQUNLSEFDSzogdHdvIHN5bmNyaG9uaXplZCBibG9ja3MgZm9yY2UgYSBtZW1vcnkgYmFycmllcjoKLSAgICAgICAgLy8gQlVHQlVHOiB0aGlzIGJlaGF2aW9yIGlzIGxpa2VseSB0byBjaGFuZ2UgaW4gZnV0dXJlIFZNcwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9zdHJpbmdFbnVtRW5zdXJlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdHJpbmdFbnVtVmFsdWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc3RyaW5nRW51bUVudHJpZXMgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb3B5RW51bWVyYXRpb25WYWx1ZXMoU2NoZW1hVHlwZUltcGwgYmFzZUltcGwpCi0gICAgewotICAgICAgICBhc3NlcnRSZXNvbHZpbmcoKTsKLSAgICAgICAgX2VudW1lcmF0aW9uVmFsdWVzID0gYmFzZUltcGwuX2VudW1lcmF0aW9uVmFsdWVzOwotICAgICAgICBfYmFzZUVudW1UeXBlcmVmID0gYmFzZUltcGwuX2Jhc2VFbnVtVHlwZXJlZjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEJ1aWx0aW5UeXBlQ29kZSgpCi0gICAgICAgIHsgcmV0dXJuIF9idWlsdGluVHlwZUNvZGU7IH0gLy8gc3BlY2lhbDogc2V0IHVwIHByZS1pbml0Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCdWlsdGluVHlwZUNvZGUoaW50IGJ1aWx0aW5UeXBlQ29kZSkKLSAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX2J1aWx0aW5UeXBlQ29kZSA9IGJ1aWx0aW5UeXBlQ29kZTsgfQotCi0gICAgcHVibGljIENsYXNzIGdldEphdmFDbGFzcygpCi0gICAgewotICAgICAgICAvLyBUaGlzIGZpZWxkIGlzIGRlY2xhcmVkIHZvbGF0aWxlIGFuZCBDbGFzcyBpcyBpbW11dGFibGUgc28gdGhpcyBpcyBhbGxvd2VkLgotICAgICAgICBpZiAoX2phdmFDbGFzcyA9PSBudWxsICYmIGdldEZ1bGxKYXZhTmFtZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsgX2phdmFDbGFzcyA9IENsYXNzLmZvck5hbWUoZ2V0RnVsbEphdmFOYW1lKCksIGZhbHNlLCBfdHlwZVN5c3RlbS5nZXRDbGFzc0xvYWRlcigpKTsgfQotICAgICAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNvdWxkIG5vdCBmaW5kIGNsYXNzIG5hbWUgIiArIGdldEZ1bGxKYXZhTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNlYXJjaGVkIGluIGNsYXNzbG9hZGVyICIgKyBfdHlwZVN5c3RlbS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLSAgICAgICAgICAgICAgICBfamF2YUNsYXNzID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfamF2YUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzcyBnZXRKYXZhSW1wbENsYXNzKCkgewotICAgICAgICBpZiAoX2ltcGxOb3RBdmFpbGFibGUpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpZiAoX2phdmFJbXBsQ2xhc3MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0RnVsbEphdmFJbXBsTmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIF9qYXZhSW1wbENsYXNzID0gQ2xhc3MuZm9yTmFtZShnZXRGdWxsSmF2YUltcGxOYW1lKCksIGZhbHNlLCBfdHlwZVN5c3RlbS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIF9pbXBsTm90QXZhaWxhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBfaW1wbE5vdEF2YWlsYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gX2phdmFJbXBsQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnN0cnVjdG9yIGdldEphdmFJbXBsQ29uc3RydWN0b3IoKQotICAgIHsKLSAgICAgICAgaWYgKF9qYXZhSW1wbENvbnN0cnVjdG9yID09IG51bGwgJiYgIV9pbXBsTm90QXZhaWxhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBDbGFzcyBpbXBsID0gZ2V0SmF2YUltcGxDbGFzcygpOwotICAgICAgICAgICAgaWYgKGltcGwgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfamF2YUltcGxDb25zdHJ1Y3RvciA9IGltcGwuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10geyBTY2hlbWFUeXBlLmNsYXNzIH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gX2phdmFJbXBsQ29uc3RydWN0b3I7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29uc3RydWN0b3IgZ2V0SmF2YUltcGxDb25zdHJ1Y3RvcjIoKQotICAgIHsKLSAgICAgICAgaWYgKF9qYXZhSW1wbENvbnN0cnVjdG9yMiA9PSBudWxsICYmICFfaW1wbE5vdEF2YWlsYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgQ2xhc3MgaW1wbCA9IGdldEphdmFJbXBsQ2xhc3MoKTsKLSAgICAgICAgICAgIGlmIChpbXBsID09IG51bGwpIHJldHVybiBudWxsOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2phdmFJbXBsQ29uc3RydWN0b3IyID0gaW1wbC5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7IFNjaGVtYVR5cGUuY2xhc3MsIGJvb2xlYW4uY2xhc3MgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfamF2YUltcGxDb25zdHJ1Y3RvcjI7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0RW51bUphdmFDbGFzcygpCi0gICAgewotICAgICAgICAvLyBUaGlzIGZpZWxkIGlzIGRlY2xhcmVkIHZvbGF0aWxlIGFuZCBDbGFzcyBpcyBpbW11dGFibGUgc28gdGhpcyBpcyBhbGxvd2VkLgotICAgICAgICBpZiAoX2phdmFFbnVtQ2xhc3MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgeyBfamF2YUVudW1DbGFzcyA9IENsYXNzLmZvck5hbWUoZ2V0QmFzZUVudW1UeXBlKCkuZ2V0RnVsbEphdmFOYW1lKCkgKyAiJEVudW0iLCBmYWxzZSwgX3R5cGVTeXN0ZW0uZ2V0Q2xhc3NMb2FkZXIoKSk7IH0KLSAgICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgeyBfamF2YUVudW1DbGFzcyA9IG51bGw7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfamF2YUVudW1DbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhQ2xhc3MoQ2xhc3MgamF2YUNsYXNzKQotICAgIHsKLSAgICAgICAgYXNzZXJ0UmVzb2x2ZWQoKTsKLSAgICAgICAgX2phdmFDbGFzcyA9IGphdmFDbGFzczsKLSAgICAgICAgc2V0RnVsbEphdmFOYW1lKGphdmFDbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlVHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKGdldEJ1aWx0aW5UeXBlQ29kZSgpID49IEJUQ19GSVJTVF9QUklNSVRJVkUgJiYKLSAgICAgICAgICAgICAgICBnZXRCdWlsdGluVHlwZUNvZGUoKSA8PSBCVENfTEFTVF9QUklNSVRJVkUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQnVpbHRpblR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEJ1aWx0aW5UeXBlQ29kZSgpICE9IDA7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBjcmVhdGVVbndyYXBwZWROb2RlKCkKLSAgICB7Ci0gICAgICAgIC8vIFRvZG86IGF0dGFjaCBhIG5ldyB4bWwgc3RvcmUhCi0gICAgICAgIFhtbE9iamVjdCByZXN1bHQgPSBjcmVhdGVVbmF0dGFjaGVkTm9kZShudWxsKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUeXBlU3RvcmVVc2VyRmFjdG9yeSBpbXBsZW1lbnRhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGNyZWF0ZVR5cGVTdG9yZVVzZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUeXBlU3RvcmVVc2VyKWNyZWF0ZVVuYXR0YWNoZWROb2RlKG51bGwpOwotICAgIH0KLQotCi0gICAgcHVibGljIFhtbEFueVNpbXBsZVR5cGUgbmV3VmFsaWRhdGluZ1ZhbHVlKE9iamVjdCBvYmopCi0gICAgewotICAgICAgICByZXR1cm4gbmV3VmFsdWUob2JqLCB0cnVlKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbW11dGFibGUgc2ltcGxlIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBYbWxBbnlTaW1wbGVUeXBlIG5ld1ZhbHVlKE9iamVjdCBvYmopCi0gICAgewotICAgICAgICByZXR1cm4gbmV3VmFsdWUob2JqLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEFueVNpbXBsZVR5cGUgbmV3VmFsdWUoT2JqZWN0IG9iaiwgYm9vbGVhbiB2YWxpZGF0ZU9uU2V0KQotICAgIHsKLSAgICAgICAgaWYgKCFpc1NpbXBsZVR5cGUoKSAmJiBnZXRDb250ZW50VHlwZSgpICE9IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IC8vIHZhbHVlcyBtdXN0IGJlIHNpbXBsZQotCi0gICAgICAgIFhtbE9iamVjdEJhc2UgcmVzdWx0ID0gKFhtbE9iamVjdEJhc2UpY3JlYXRlVW5hdHRhY2hlZE5vZGUobnVsbCk7Ci0gICAgICAgIGlmICh2YWxpZGF0ZU9uU2V0KQotICAgICAgICAgICAgcmVzdWx0LnNldFZhbGlkYXRlT25TZXQoKTsKLQotICAgICAgICAvLyBJbiB0aGUgY2FzZSBvZiB0cmVlIGNvcHksIG5lZWQgdG8gY2FsbCBhIHNwZWNsYSBzZXR0ZXIgdG8gYXZvaWQKLSAgICAgICAgLy8gc2V0KFhtbE9iamVjdCkKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhtbE9iamVjdCkKLSAgICAgICAgICAgIHJlc3VsdC5zZXRfbmV3VmFsdWUoKFhtbE9iamVjdClvYmopOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXN1bHQub2JqZWN0U2V0KG9iaik7Ci0KLSAgICAgICAgcmVzdWx0LmNoZWNrX2RhdGVkKCk7Ci0gICAgICAgIHJlc3VsdC5zZXRJbW11dGFibGUoKTsKLQotICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgdHlwZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFhtbE9iamVjdCBjcmVhdGVVbmF0dGFjaGVkTm9kZShTY2hlbWFQcm9wZXJ0eSBwcm9wKQotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKCFpc0J1aWx0aW5UeXBlKCkgJiYgIWlzTm9UeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXR0ZW1wdGluZyB0byBsb2FkIGltcGwgY2xhc3M6ICIgKyBnZXRGdWxsSmF2YUltcGxOYW1lKCkpOwotICAgICAgICAgICAgQ29uc3RydWN0b3IgY3RyID0gZ2V0SmF2YUltcGxDb25zdHJ1Y3RvcigpOwotICAgICAgICAgICAgaWYgKGN0ciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdWNjZWVkZWQhIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoWG1sT2JqZWN0KWN0ci5uZXdJbnN0YW5jZShfY3RyQXJncyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHRyeWluZyB0byBpbnN0YW50aWF0ZSBpbXBsIGNsYXNzLiIpOwotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZUJ1aWx0aW5JbnN0YW5jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgbm8gcmVzdWx0LCB3ZSBtdXN0IGJlIGEgcmVzdHJpY3Rpb24gb2Ygc29tZSBjb21waWxlZCB0eXBlCi0gICAgICAgIGZvciAoU2NoZW1hVHlwZSBzVHlwZSA9IHRoaXM7IHJlc3VsdCA9PSBudWxsOyBzVHlwZSA9IHNUeXBlLmdldEJhc2VUeXBlKCkpCi0gICAgICAgICAgICByZXN1bHQgPSAoKFNjaGVtYVR5cGVJbXBsKXNUeXBlKS5jcmVhdGVVbmF0dGFjaGVkU3ViY2xhc3ModGhpcyk7Ci0KLSAgICAgICAgKChYbWxPYmplY3RCYXNlKXJlc3VsdCkuaW5pdF9mbGFncyhwcm9wKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFhtbE9iamVjdCBjcmVhdGVVbmF0dGFjaGVkU3ViY2xhc3MoU2NoZW1hVHlwZSBzVHlwZSkKLSAgICB7Ci0gICAgICAgIGlmICghaXNCdWlsdGluVHlwZSgpICYmICFpc05vVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkF0dGVtcHRpbmcgdG8gbG9hZCBpbXBsIGNsYXNzOiAiICsgZ2V0RnVsbEphdmFJbXBsTmFtZSgpKTsKLSAgICAgICAgICAgIENvbnN0cnVjdG9yIGN0ciA9IGdldEphdmFJbXBsQ29uc3RydWN0b3IyKCk7Ci0gICAgICAgICAgICBpZiAoY3RyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN1Y2NlZWRlZCEiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChYbWxPYmplY3QpY3RyLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7IHNUeXBlLCBzVHlwZS5pc1NpbXBsZVR5cGUoKSA/IEJvb2xlYW4uRkFMU0UgOiBCb29sZWFuLlRSVUUgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHRyeWluZyB0byBpbnN0YW50aWF0ZSBpbXBsIGNsYXNzLiIpOwotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1aWx0aW5TdWJjbGFzcyhzVHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFhtbE9iamVjdCBjcmVhdGVCdWlsdGluSW5zdGFuY2UoKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChnZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBCVENfTk9UX0JVSUxUSU46Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxBbnlUeXBlSW1wbChCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9OT19UWVBFKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0FOWV9UWVBFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQW55VHlwZUltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0FOWV9TSU1QTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxBbnlTaW1wbGVUeXBlSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEJvb2xlYW5JbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19CQVNFXzY0X0JJTkFSWToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEJhc2U2NEJpbmFyeUltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0hFWF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxIZXhCaW5hcnlJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19BTllfVVJJOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQW55VXJpSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfUU5BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxRTmFtZUltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX05PVEFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm90YXRpb25JbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19GTE9BVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEZsb2F0SW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfRE9VQkxFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRG91YmxlSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfREVDSU1BTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbERlY2ltYWxJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxTdHJpbmdJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19EVVJBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbER1cmF0aW9uSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfREFURV9USU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRGF0ZVRpbWVJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19USU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVGltZUltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0RBVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxEYXRlSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR1llYXJNb250aEltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0dfWUVBUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEdZZWFySW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfR19NT05USF9EQVk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxHTW9udGhEYXlJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19HX0RBWToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEdEYXlJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19HX01PTlRIOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR01vbnRoSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfSU5URUdFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEludGVnZXJJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19MT05HOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTG9uZ0ltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0lOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEludEltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1NIT1JUOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sU2hvcnRJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19CWVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQnl0ZUltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX05PTl9QT1NJVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm9uUG9zaXRpdmVJbnRlZ2VySW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfTkVHQVRJVkVfSU5URUdFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5lZ2F0aXZlSW50ZWdlckltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX05PTl9ORUdBVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfUE9TSVRJVkVfSU5URUdFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFBvc2l0aXZlSW50ZWdlckltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1VOU0lHTkVEX0xPTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZExvbmdJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19VTlNJR05FRF9JTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZEludEltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1VOU0lHTkVEX1NIT1JUOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVW5zaWduZWRTaG9ydEltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1VOU0lHTkVEX0JZVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZEJ5dGVJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19OT1JNQUxJWkVEX1NUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5vcm1hbGl6ZWRTdHJpbmdJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19UT0tFTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFRva2VuSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5hbWVJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19OQ05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOQ05hbWVJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19MQU5HVUFHRToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbExhbmd1YWdlSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfSUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxJZEltcGwoKTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0lEUkVGOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sSWRSZWZJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19JRFJFRlM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxJZFJlZnNJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19FTlRJVFk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxFbnRpdHlJbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19FTlRJVElFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEVudGl0aWVzSW1wbCgpOwotICAgICAgICAgICAgY2FzZSBCVENfTk1UT0tFTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5tVG9rZW5JbXBsKCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19OTVRPS0VOUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5tVG9rZW5zSW1wbCgpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgYnVpbHRpbiB0eXBlOiAiICsgZ2V0QnVpbHRpblR5cGVDb2RlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBYbWxPYmplY3QgY3JlYXRlQnVpbHRpblN1YmNsYXNzKFNjaGVtYVR5cGUgc1R5cGUpCi0gICAgewotICAgICAgICBib29sZWFuIGNvbXBsZXggPSAhc1R5cGUuaXNTaW1wbGVUeXBlKCk7Ci0gICAgICAgIHN3aXRjaCAoZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgQlRDX05PVF9CVUlMVElOOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQW55VHlwZUltcGwoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRSk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19BTllfVFlQRToKLSAgICAgICAgICAgIGNhc2UgQlRDX0FOWV9TSU1QTEU6Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE5PVF9TSU1QTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbENvbXBsZXhDb250ZW50SW1wbChzVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVRPTUlDOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxBbnlTaW1wbGVUeXBlUmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgICAgICAgICBjYXNlIExJU1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbExpc3RJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBVTklPTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVW5pb25JbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEJUQ19CT09MRUFOOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQm9vbGVhblJlc3RyaWN0aW9uKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0JBU0VfNjRfQklOQVJZOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQmFzZTY0QmluYXJ5UmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfSEVYX0JJTkFSWToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEhleEJpbmFyeVJlc3RyaWN0aW9uKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0FOWV9VUkk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxBbnlVcmlSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19RTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFFOYW1lUmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOb3RhdGlvblJlc3RyaWN0aW9uKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0ZMT0FUOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRmxvYXRSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19ET1VCTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxEb3VibGVSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19ERUNJTUFMOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRGVjaW1hbFJlc3RyaWN0aW9uKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1NUUklORzoKLSAgICAgICAgICAgICAgICBpZiAoc1R5cGUuaGFzU3RyaW5nRW51bVZhbHVlcygpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFN0cmluZ0VudW1lcmF0aW9uKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sU3RyaW5nUmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfRFVSQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxEdXJhdGlvbkltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfREFURV9USU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRGF0ZVRpbWVJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1RJTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxUaW1lSW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19EQVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRGF0ZUltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR1llYXJNb250aEltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfR19ZRUFSOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR1llYXJJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0dfTU9OVEhfREFZOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR01vbnRoRGF5SW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19HX0RBWToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEdEYXlJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxHTW9udGhJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxJbnRlZ2VyUmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfTE9ORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbExvbmdSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19JTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxJbnRSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19TSE9SVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFNob3J0SW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19CWVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQnl0ZUltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfTk9OX1BPU0lUSVZFX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOb25Qb3NpdGl2ZUludGVnZXJJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX05FR0FUSVZFX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOZWdhdGl2ZUludGVnZXJJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX05PTl9ORUdBVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19QT1NJVElWRV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sUG9zaXRpdmVJbnRlZ2VySW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19VTlNJR05FRF9MT05HOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVW5zaWduZWRMb25nSW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19VTlNJR05FRF9JTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZEludEltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfVU5TSUdORURfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZFNob3J0SW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19VTlNJR05FRF9CWVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVW5zaWduZWRCeXRlSW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19OT1JNQUxJWkVEX1NUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5vcm1hbGl6ZWRTdHJpbmdJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX1RPS0VOOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVG9rZW5JbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOYW1lSW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19OQ05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOQ05hbWVJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0xBTkdVQUdFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTGFuZ3VhZ2VJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0lEOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sSWRJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0lEUkVGOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sSWRSZWZJbXBsKHNUeXBlLCBjb21wbGV4KTsKLSAgICAgICAgICAgIGNhc2UgQlRDX0lEUkVGUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbElkUmVmc0ltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfRU5USVRZOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRW50aXR5SW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19FTlRJVElFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEVudGl0aWVzSW1wbChzVHlwZSwgY29tcGxleCk7Ci0gICAgICAgICAgICBjYXNlIEJUQ19OTVRPS0VOOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm1Ub2tlbkltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgY2FzZSBCVENfTk1UT0tFTlM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxObVRva2Vuc0ltcGwoc1R5cGUsIGNvbXBsZXgpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgYnVpbHRpbiB0eXBlOiAiICsgZ2V0QnVpbHRpblR5cGVDb2RlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0Q29tbW9uQmFzZVR5cGUoU2NoZW1hVHlwZSB0eXBlKQotICAgIHsKLSAgICAgICAgLy8gbnVsbCB0eXBlIGlzIHRyZWF0ZWQgYXMgdGhlIG5vLXR5cGUKLSAgICAgICAgaWYgKHRoaXMgPT0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEUgfHwgdHlwZSA9PSBudWxsIHx8IHR5cGUuaXNOb1R5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotCi0gICAgICAgIC8vIGFueSB0eXBlIGlzIHRoZSB1bml2ZXJzYWwgYmFzZSB0eXBlOyBub1R5cGUgaXMgdGhlIHVuaXZlcnNhbCBkZXJpdmVkIHR5cGUKLSAgICAgICAgaWYgKHR5cGUgPT0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEUgfHwgaXNOb1R5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiB0eXBlOwotCi0gICAgICAgIC8vIHRoZSByZWd1bGFyIGNhc2U6Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHNJbXBsMSA9IChTY2hlbWFUeXBlSW1wbCl0eXBlOwotICAgICAgICB3aGlsZSAoc0ltcGwxLmdldEJhc2VEZXB0aCgpID4gZ2V0QmFzZURlcHRoKCkpCi0gICAgICAgICAgICBzSW1wbDEgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwxLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHNJbXBsMiA9IHRoaXM7Ci0gICAgICAgIHdoaWxlIChzSW1wbDIuZ2V0QmFzZURlcHRoKCkgPiBzSW1wbDEuZ2V0QmFzZURlcHRoKCkpCi0gICAgICAgICAgICBzSW1wbDIgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwyLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzSW1wbDEuZXF1YWxzKHNJbXBsMikpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBzSW1wbDEgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwxLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgICAgICBzSW1wbDIgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwyLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgICAgICBhc3NlcnQoc0ltcGwxICE9IG51bGwgJiYgc0ltcGwyICE9IG51bGwpOyAvLyBtdXN0IG1lZXQgYXQgYW55VHlwZQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzSW1wbDE7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbShTY2hlbWFUeXBlIHR5cGUpCi0gICAgewotICAgICAgICBpZiAodHlwZSA9PSBudWxsIHx8IHR5cGUuaXNOb1R5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGlmIChpc05vVHlwZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGludCBkZXB0aCA9ICgoU2NoZW1hVHlwZUltcGwpdHlwZSkuZ2V0QmFzZURlcHRoKCkgLSBnZXRCYXNlRGVwdGgoKTsKLSAgICAgICAgaWYgKGRlcHRoIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgd2hpbGUgKGRlcHRoID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgdHlwZSA9IHR5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgICAgIGRlcHRoIC09IDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICh0eXBlLmVxdWFscyh0aGlzKSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmIChnZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAiVD0iICsgUU5hbWVIZWxwZXIucHJldHR5KGdldE5hbWUoKSk7Ci0KLSAgICAgICAgaWYgKGlzRG9jdW1lbnRUeXBlKCkpCi0gICAgICAgICAgICByZXR1cm4gIkQ9IiArIFFOYW1lSGVscGVyLnByZXR0eShnZXREb2N1bWVudEVsZW1lbnROYW1lKCkpOwotCi0gICAgICAgIGlmIChpc0F0dHJpYnV0ZVR5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiAiUj0iICsgUU5hbWVIZWxwZXIucHJldHR5KGdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCkpOwotCi0gICAgICAgIFN0cmluZyBwcmVmaXg7Ci0KLSAgICAgICAgaWYgKGdldENvbnRhaW5lckZpZWxkKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZml4ID0gKGdldENvbnRhaW5lckZpZWxkKCkuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID4gMCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldENvbnRhaW5lckZpZWxkKCkuaXNBdHRyaWJ1dGUoKSA/ICJRPSIgOiAiRT0iKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldENvbnRhaW5lckZpZWxkKCkuaXNBdHRyaWJ1dGUoKSA/ICJBPSIgOiAiVT0iKSkKLSAgICAgICAgICAgICAgICAgICAgKyBnZXRDb250YWluZXJGaWVsZCgpLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIGlmIChnZXRPdXRlclR5cGUoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyAiQCIgKyBnZXRDb250YWluZXJGaWVsZCgpLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpc05vVHlwZSgpKQotICAgICAgICAgICAgcmV0dXJuICJOPSI7Ci0gICAgICAgIGVsc2UgaWYgKGdldE91dGVyVHlwZSgpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIm5vb3V0ZXIiOwotICAgICAgICBlbHNlIGlmIChnZXRPdXRlclR5cGUoKS5nZXRCYXNlVHlwZSgpID09IHRoaXMpCi0gICAgICAgICAgICBwcmVmaXggPSAiQj0iOwotICAgICAgICBlbHNlIGlmIChnZXRPdXRlclR5cGUoKS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKQotICAgICAgICAgICAgcHJlZml4ID0gIkk9IjsKLSAgICAgICAgZWxzZSBpZiAoZ2V0T3V0ZXJUeXBlKCkuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuVU5JT04pCi0gICAgICAgICAgICBwcmVmaXggPSAiTT0iICsgZ2V0QW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHByZWZpeCA9ICJzdHJhbmdlPSI7Ci0KLSAgICAgICAgcmV0dXJuIHByZWZpeCArICJ8IiArIGdldE91dGVyVHlwZSgpLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBYbWxPYmplY3QgX3BhcnNlT2JqZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIF9wYXJzZVROUzsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2NoYW1lbGVvbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gX3JlZGVmaW5pdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcnNlQ29udGV4dChYbWxPYmplY3QgcGFyc2VPYmplY3QsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLCBib29sZWFuIHJlZGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICAgIF9wYXJzZU9iamVjdCA9IHBhcnNlT2JqZWN0OwotICAgICAgICBfcGFyc2VUTlMgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIF9jaGFtZWxlb24gPSBjaGFtZWxlb247Ci0gICAgICAgIF9yZWRlZmluaXRpb24gPSByZWRlZmluaXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBnZXRQYXJzZU9iamVjdCgpCi0gICAgICAgIHsgcmV0dXJuIF9wYXJzZU9iamVjdDsgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKQotICAgICAgICB7IHJldHVybiBfcGFyc2VUTlM7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhbWVsZW9uICggKQotICAgICAgICB7IHJldHVybiBfY2hhbWVsZW9uOyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYW1lbGVvbk5hbWVzcGFjZSgpCi0gICAgICAgIHsgcmV0dXJuIF9jaGFtZWxlb24gPyBfcGFyc2VUTlMgOiBudWxsOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZGVmaW5pdGlvbigpCi0gICAgICAgIHsgcmV0dXJuIF9yZWRlZmluaXRpb247IH0KLQotICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWYgX3NlbGZyZWYgPSBuZXcgU2NoZW1hVHlwZS5SZWYodGhpcyk7Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZ2V0UmVmKCkKLSAgICAgICAgeyByZXR1cm4gX3NlbGZyZWY7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFDb21wb25lbnQuUmVmIGdldENvbXBvbmVudFJlZigpCi0gICAgICAgIHsgcmV0dXJuIGdldFJlZigpOyB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVMb2FkZXJCYXNlLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlTG9hZGVyQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDcyOTIyLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVMb2FkZXJCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWxpZGF0b3IuVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYU1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFNheEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRmFjdG9yeUhvb2s7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5EaWdlc3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTY2hlbWFUeXBlTG9hZGVyQmFzZSBpbXBsZW1lbnRzIFNjaGVtYVR5cGVMb2FkZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgX3Jvb3RCdWlsZGVyID0gZ2V0TWV0aG9kKCAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlJvb3QiLCAibmV3U3RvcmUiLCBuZXcgQ2xhc3NbXSB7IFNjaGVtYVR5cGVMb2FkZXIuY2xhc3MsIFNjaGVtYVR5cGUuY2xhc3MsIFhtbE9wdGlvbnMuY2xhc3MgfSApOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBfcGF0aENvbXBpbGVyID0gZ2V0TWV0aG9kKCAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlBhdGgiLCAiZ2V0Q29tcGlsZWRQYXRoIiwgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MsIFhtbE9wdGlvbnMuY2xhc3MgfSApOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBfcXVlcnlDb21waWxlciA9IGdldE1ldGhvZCggIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5QYXRoIiwgImdldENvbXBpbGVkUXVlcnkiLCBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcywgWG1sT3B0aW9ucy5jbGFzcyB9ICk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kICggU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzW10gYXJncyApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSggY2xhc3NOYW1lICkuCi0gICAgICAgICAgICAgICAgICAgIGdldERlY2xhcmVkTWV0aG9kKCBtZXRob2ROYW1lLCBhcmdzICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJDYW5ub3QgZmluZCAiICsgY2xhc3NOYW1lICsgIi4iICsgbWV0aG9kTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICIuICB2ZXJpZnkgdGhhdCB4bWxzdG9yZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIoZnJvbSB4YmVhbi5qYXIpIGlzIG9uIGNsYXNzcGF0aCIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2QgKCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZSggbWV0aG9kLCBhcmdzICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlID0gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggZS5nZXRDYXVzZSgpLmdldE1lc3NhZ2UoKSApOwotICAgICAgICAgICAgaXNlLmluaXRDYXVzZSggZSApOwotICAgICAgICAgICAgdGhyb3cgaXNlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlID0gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCkgKTsKLSAgICAgICAgICAgIGlzZS5pbml0Q2F1c2UoIGUgKTsKLSAgICAgICAgICAgIHRocm93IGlzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgWG1sU3RvcmUgY3JlYXRlTmV3U3RvcmUgKCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIChYbWxTdG9yZSkKLSAgICAgICAgICAgICAgICBpbnZva2VNZXRob2QoIF9yb290QnVpbGRlciwgbmV3IE9iamVjdFtdIHsgdGhpcywgdHlwZSwgb3B0aW9ucyB9ICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRvQ29tcGlsZVBhdGggKCBTdHJpbmcgcGF0aEV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHsgcmV0dXJuIChTdHJpbmcpIGludm9rZU1ldGhvZCggX3BhdGhDb21waWxlciwgbmV3IE9iamVjdFtdIHsgcGF0aEV4cHIsIG9wdGlvbnMgfSApOyB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRvQ29tcGlsZVF1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkgeyByZXR1cm4gKFN0cmluZykgaW52b2tlTWV0aG9kKCBfcXVlcnlDb21waWxlciwgbmV3IE9iamVjdFtdIHsgcXVlcnlFeHByLCBvcHRpb25zIH0gKTsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZmluZFR5cGUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUuUmVmIHJlZiA9IGZpbmRUeXBlUmVmKG5hbWUpOwotICAgICAgICBpZiAocmVmID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU2NoZW1hVHlwZSByZXN1bHQgPSByZWYuZ2V0KCk7Ci0gICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgZmluZERvY3VtZW50VHlwZShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZS5SZWYgcmVmID0gZmluZERvY3VtZW50VHlwZVJlZihuYW1lKTsKLSAgICAgICAgaWYgKHJlZiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFNjaGVtYVR5cGUgcmVzdWx0ID0gcmVmLmdldCgpOwotICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGZpbmRBdHRyaWJ1dGVUeXBlKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlLlJlZiByZWYgPSBmaW5kQXR0cmlidXRlVHlwZVJlZihuYW1lKTsKLSAgICAgICAgaWYgKHJlZiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFNjaGVtYVR5cGUgcmVzdWx0ID0gcmVmLmdldCgpOwotICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFNb2RlbEdyb3VwIGZpbmRNb2RlbEdyb3VwKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFNb2RlbEdyb3VwLlJlZiByZWYgPSBmaW5kTW9kZWxHcm91cFJlZihuYW1lKTsKLSAgICAgICAgaWYgKHJlZiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFNjaGVtYU1vZGVsR3JvdXAgcmVzdWx0ID0gcmVmLmdldCgpOwotICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cCBmaW5kQXR0cmlidXRlR3JvdXAoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwLlJlZiByZWYgPSBmaW5kQXR0cmlidXRlR3JvdXBSZWYobmFtZSk7Ci0gICAgICAgIGlmIChyZWYgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cCByZXN1bHQgPSByZWYuZ2V0KCk7Ci0gICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEVsZW1lbnQgZmluZEVsZW1lbnQoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmIHJlZiA9IGZpbmRFbGVtZW50UmVmKG5hbWUpOwotICAgICAgICBpZiAocmVmID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudCByZXN1bHQgPSByZWYuZ2V0KCk7Ci0gICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBmaW5kQXR0cmlidXRlKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUuUmVmIHJlZiA9IGZpbmRBdHRyaWJ1dGVSZWYobmFtZSk7Ci0gICAgICAgIGlmIChyZWYgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgcmVzdWx0ID0gcmVmLmdldCgpOwotICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgcHVibGljIFhtbE9iamVjdCBuZXdJbnN0YW5jZSAoIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIFhtbEZhY3RvcnlIb29rIGhvb2sgPSBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LmdldEhvb2soKTsKLSAgICAgICAgaWYgKGhvb2sgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBob29rLm5ld0luc3RhbmNlKCB0aGlzLCB0eXBlLCBvcHRpb25zICk7Ci0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZU5ld1N0b3JlKCB0eXBlLCBvcHRpb25zICkuZ2V0T2JqZWN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBwYXJzZSAoIFN0cmluZyB4bWxUZXh0LCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEZhY3RvcnlIb29rIGhvb2sgPSBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LmdldEhvb2soKTsKLSAgICAgICAgaWYgKGhvb2sgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBob29rLnBhcnNlKCB0aGlzLCB4bWxUZXh0LCB0eXBlLCBvcHRpb25zICk7Ci0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZU5ld1N0b3JlKCBudWxsLCBvcHRpb25zICkubG9hZFhtbCggeG1sVGV4dCwgdHlwZSwgb3B0aW9ucyApOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBYTUxJbnB1dFN0cmVhbSB4aXMsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxGYWN0b3J5SG9vayBob29rID0gWG1sRmFjdG9yeUhvb2suVGhyZWFkQ29udGV4dC5nZXRIb29rKCk7Ci0gICAgICAgIGlmIChob29rICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gaG9vay5wYXJzZSggdGhpcywgeGlzLCB0eXBlLCBvcHRpb25zICk7Ci0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZU5ld1N0b3JlKCBudWxsLCBvcHRpb25zICkubG9hZFhtbCggeGlzLCB0eXBlLCBvcHRpb25zICk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBwYXJzZSAoIEZpbGUgZmlsZSwgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5ET0NVTUVOVF9TT1VSQ0VfTkFNRSwgZmlsZS50b1VSSSgpLm5vcm1hbGl6ZSgpLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVsc2UgaWYgKCEgb3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5ET0NVTUVOVF9TT1VSQ0VfTkFNRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucyggb3B0aW9ucyApOwotICAgICAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuRE9DVU1FTlRfU09VUkNFX05BTUUsIGZpbGUudG9VUkkoKS5ub3JtYWxpemUoKS50b1N0cmluZygpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBmaWxlICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJzZSggZmlzLCB0eXBlLCBvcHRpb25zICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBmaXMuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBVUkwgdXJsLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLkRPQ1VNRU5UX1NPVVJDRV9OQU1FLCB1cmwudG9TdHJpbmcoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZSBpZiAoISBvcHRpb25zLmhhc09wdGlvbihYbWxPcHRpb25zLkRPQ1VNRU5UX1NPVVJDRV9OQU1FKSkKLSAgICAgICAgewotICAgICAgICAgICAgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCBvcHRpb25zICk7Ci0gICAgICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5ET0NVTUVOVF9TT1VSQ0VfTkFNRSwgdXJsLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IG51bGw7Ci0gICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgICAgIGRvd25sb2FkOiB0cnkKLSAgICAgICAgewotCi0gICAgICAgICAgICBib29sZWFuIHJlZGlyZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBjb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY29ubi5hZGRSZXF1ZXN0UHJvcGVydHkoIlVzZXItQWdlbnQiLCAiQkVBIFhNTCBCZWFucy8xLjAiKTsKLSAgICAgICAgICAgICAgICBjb25uLmFkZFJlcXVlc3RQcm9wZXJ0eSgiQWNjZXB0IiwgImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwsICovKiIpOwotICAgICAgICAgICAgICAgIGlmIChjb25uIGluc3RhbmNlb2YgSHR0cFVSTENvbm5lY3Rpb24pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBIdHRwVVJMQ29ubmVjdGlvbiBodHRwY29uID0gKEh0dHBVUkxDb25uZWN0aW9uKWNvbm47Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb2RlID0gaHR0cGNvbi5nZXRSZXNwb25zZUNvZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RlZCA9IChjb2RlID09IEh0dHBVUkxDb25uZWN0aW9uLkhUVFBfTU9WRURfUEVSTSB8fCBjb2RlID09IEh0dHBVUkxDb25uZWN0aW9uLkhUVFBfTU9WRURfVEVNUCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWRpcmVjdGVkICYmIGNvdW50ID4gNSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0ZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocmVkaXJlY3RlZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld0xvY2F0aW9uID0gaHR0cGNvbi5nZXRIZWFkZXJGaWVsZCgiTG9jYXRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdMb2NhdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKG5ld0xvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUgKHJlZGlyZWN0ZWQpOwotCi0gICAgICAgICAgICBzdHJlYW0gPSBjb25uLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2UoIHN0cmVhbSwgdHlwZSwgb3B0aW9ucyApOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBwYXJzZSAoIElucHV0U3RyZWFtIGppb2lzLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxGYWN0b3J5SG9vayBob29rID0gWG1sRmFjdG9yeUhvb2suVGhyZWFkQ29udGV4dC5nZXRIb29rKCk7Ci0gICAgICAgIERpZ2VzdElucHV0U3RyZWFtIGRpZ2VzdFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIHNldHVwRGlnZXN0OiBpZiAob3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMuaGFzT3B0aW9uKFhtbE9wdGlvbnMuTE9BRF9NRVNTQUdFX0RJR0VTVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1lc3NhZ2VEaWdlc3Qgc2hhOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2hhID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiU0hBIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0dXBEaWdlc3Q7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRpZ2VzdFN0cmVhbSA9IG5ldyBEaWdlc3RJbnB1dFN0cmVhbShqaW9pcywgc2hhKTsKLSAgICAgICAgICAgIGppb2lzID0gZGlnZXN0U3RyZWFtOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhvb2sgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBob29rLnBhcnNlKCB0aGlzLCBqaW9pcywgdHlwZSwgb3B0aW9ucyApOwotCi0gICAgICAgIFhtbE9iamVjdCByZXN1bHQgPSBjcmVhdGVOZXdTdG9yZSggbnVsbCwgb3B0aW9ucyApLmxvYWRYbWwoIGppb2lzLCB0eXBlLCBvcHRpb25zICk7Ci0KLSAgICAgICAgaWYgKGRpZ2VzdFN0cmVhbSAhPSBudWxsKQotICAgICAgICAgICAgcmVzdWx0LmRvY3VtZW50UHJvcGVydGllcygpLnNldE1lc3NhZ2VEaWdlc3QoZGlnZXN0U3RyZWFtLmdldE1lc3NhZ2VEaWdlc3QoKS5kaWdlc3QoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggUmVhZGVyIGppb3IsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEZhY3RvcnlIb29rIGhvb2sgPSBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LmdldEhvb2soKTsKLSAgICAgICAgaWYgKGhvb2sgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBob29rLnBhcnNlKCB0aGlzLCBqaW9yLCB0eXBlLCBvcHRpb25zICk7Ci0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZU5ld1N0b3JlKCBudWxsLCBvcHRpb25zICkubG9hZFhtbCggamlvciwgdHlwZSwgb3B0aW9ucyApOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBOb2RlIG5vZGUsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sRmFjdG9yeUhvb2sgaG9vayA9IFhtbEZhY3RvcnlIb29rLlRocmVhZENvbnRleHQuZ2V0SG9vaygpOwotICAgICAgICBpZiAoaG9vayAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGhvb2sucGFyc2UoIHRoaXMsIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsKLQotICAgICAgICByZXR1cm4gY3JlYXRlTmV3U3RvcmUoIG51bGwsIG9wdGlvbnMgKS5sb2FkWG1sKCBub2RlLCB0eXBlLCBvcHRpb25zICk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbFNheEhhbmRsZXIgbmV3WG1sU2F4SGFuZGxlciAoIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIFhtbEZhY3RvcnlIb29rIGhvb2sgPSBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LmdldEhvb2soKTsKLSAgICAgICAgaWYgKGhvb2sgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBob29rLm5ld1htbFNheEhhbmRsZXIoIHRoaXMsIHR5cGUsIG9wdGlvbnMgKTsKLQotICAgICAgICByZXR1cm4gY3JlYXRlTmV3U3RvcmUoIG51bGwsIG9wdGlvbnMgKS5uZXdTYXhIYW5kbGVyKCB0eXBlLCBvcHRpb25zICk7Ci0gICAgfQotCi0gICAgcHVibGljIFhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSAoIFhNTElucHV0U3RyZWFtIHhpcywgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHRoaXMsIHR5cGUsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIHB1YmxpYyBTdHJpbmcgY29tcGlsZVBhdGggKCBTdHJpbmcgcGF0aEV4cHIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBpbGVQYXRoKCBwYXRoRXhwciwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY29tcGlsZVBhdGggKCBTdHJpbmcgcGF0aEV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICByZXR1cm4gZG9Db21waWxlUGF0aCggcGF0aEV4cHIsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbXBpbGVRdWVyeSAoIFN0cmluZyBxdWVyeUV4cHIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBpbGVRdWVyeSggcXVlcnlFeHByLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjb21waWxlUXVlcnkgKCBTdHJpbmcgcXVlcnlFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRvQ29tcGlsZVF1ZXJ5KCBxdWVyeUV4cHIsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGxvYWQgYSB0eXBlIGZyb20gYSBzaWduYXR1cmUuCi0gICAgICoKLSAgICAgKiBBIHNpZ25hdHVyZSBpcyB0aGUgc3RyaW5nIHlvdSBnZXQgZnJvbSB0eXBlLnRvU3RyaW5nKCkuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYVR5cGUgdHlwZUZvclNpZ25hdHVyZShTdHJpbmcgc2lnbmF0dXJlKQotICAgIHsKLSAgICAgICAgaW50IGVuZCA9IHNpZ25hdHVyZS5pbmRleE9mKCdAJyk7Ci0gICAgICAgIFN0cmluZyB1cmk7Ci0KLSAgICAgICAgaWYgKGVuZCA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVyaSA9ICIiOwotICAgICAgICAgICAgZW5kID0gc2lnbmF0dXJlLmxlbmd0aCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdXJpID0gc2lnbmF0dXJlLnN1YnN0cmluZyhlbmQgKyAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgcGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGVuZDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbmV4dGMgPSBzaWduYXR1cmUuaW5kZXhPZignOicsIGluZGV4KTsKLSAgICAgICAgICAgIGludCBuZXh0ZCA9IHNpZ25hdHVyZS5pbmRleE9mKCd8JywgaW5kZXgpOwotICAgICAgICAgICAgaW50IG5leHQgPSAobmV4dGMgPCAwID8gbmV4dGQgOiBuZXh0ZCA8IDAgPyBuZXh0YyA6IG5leHRjIDwgbmV4dGQgPyBuZXh0YyA6IG5leHRkKTsKLSAgICAgICAgICAgIGlmIChuZXh0IDwgMCB8fCBuZXh0ID4gZW5kKQotICAgICAgICAgICAgICAgIG5leHQgPSBlbmQ7Ci0gICAgICAgICAgICBTdHJpbmcgcGFydCA9IHNpZ25hdHVyZS5zdWJzdHJpbmcoaW5kZXgsIG5leHQpOwotICAgICAgICAgICAgcGFydHMuYWRkKHBhcnQpOwotICAgICAgICAgICAgaW5kZXggPSBuZXh0ICsgMTsKLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYVR5cGUgY3VyVHlwZSA9IG51bGw7Ci0KLSAgICAgICAgb3V0ZXI6IGZvciAoaW50IGkgPSBwYXJ0cy5zaXplKCkgLSAxOyBpID49IDA7IGkgLT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHBhcnQgPSAoU3RyaW5nKXBhcnRzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChwYXJ0Lmxlbmd0aCgpIDwgMSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gKHBhcnQubGVuZ3RoKCkgPj0gMiAmJiBwYXJ0LmNoYXJBdCgxKSA9PSAnPScpID8gMiA6IDE7Ci0gICAgICAgICAgICBjYXNlczogc3dpdGNoIChwYXJ0LmNoYXJBdCgwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlICdUJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1clR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgY3VyVHlwZSA9IGZpbmRUeXBlKFFOYW1lSGVscGVyLmZvckxOUyhwYXJ0LnN1YnN0cmluZyhvZmZzZXQpLCB1cmkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1clR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgotICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVHlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBjdXJUeXBlID0gZmluZERvY3VtZW50VHlwZShRTmFtZUhlbHBlci5mb3JMTlMocGFydC5zdWJzdHJpbmcob2Zmc2V0KSwgdXJpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdDJzogLy8gZGVwcmVjYXRlZAotICAgICAgICAgICAgICAgIGNhc2UgJ1InOiAvLyBjdXJyZW50Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGN1clR5cGUgPSBmaW5kQXR0cmlidXRlVHlwZShRTmFtZUhlbHBlci5mb3JMTlMocGFydC5zdWJzdHJpbmcob2Zmc2V0KSwgdXJpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdFJzoKLSAgICAgICAgICAgICAgICBjYXNlICdVJzogLy8gZGlzdGluZ3Vpc2ggcXVhbGlmaWVkL3VucXVhbGlmaWVkIFRCRAotICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVHlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVHlwZS5nZXRDb250ZW50VHlwZSgpIDwgU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlW10gc3ViVHlwZXMgPSBjdXJUeXBlLmdldEFub255bW91c1R5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gcGFydC5zdWJzdHJpbmcob2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3ViVHlwZXMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hRmllbGQgZmllbGQgPSBzdWJUeXBlc1tqXS5nZXRDb250YWluZXJGaWVsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZCAhPSBudWxsICYmICFmaWVsZC5pc0F0dHJpYnV0ZSgpICYmIGZpZWxkLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clR5cGUgPSBzdWJUeXBlc1tqXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgY2FzZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50IGVsdCA9IGZpbmRFbGVtZW50KFFOYW1lSGVscGVyLmZvckxOUyhwYXJ0LnN1YnN0cmluZyhvZmZzZXQpLCB1cmkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1clR5cGUgPSBlbHQuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnQSc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnUSc6IC8vIGRpc3Rpbmd1aXNoIHF1YWxpZmllZC91bnF1YWxpZmllZCBUQkQKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1clR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1clR5cGUuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlW10gc3ViVHlwZXMgPSBjdXJUeXBlLmdldEFub255bW91c1R5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gcGFydC5zdWJzdHJpbmcob2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3ViVHlwZXMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hRmllbGQgZmllbGQgPSBzdWJUeXBlc1tqXS5nZXRDb250YWluZXJGaWVsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZCAhPSBudWxsICYmIGZpZWxkLmlzQXR0cmlidXRlKCkgJiYgZmllbGQuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyVHlwZSA9IHN1YlR5cGVzW2pdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBjYXNlczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBhdHRyID0gZmluZEF0dHJpYnV0ZShRTmFtZUhlbHBlci5mb3JMTlMocGFydC5zdWJzdHJpbmcob2Zmc2V0KSwgdXJpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VyVHlwZSA9IGF0dHIuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnQic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLkFUT01JQykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVbXSBzdWJUeXBlcyA9IGN1clR5cGUuZ2V0QW5vbnltb3VzVHlwZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJUeXBlcy5sZW5ndGggIT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1clR5cGUgPSBzdWJUeXBlc1swXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ0knOgotICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5MSVNUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZVtdIHN1YlR5cGVzID0gY3VyVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YlR5cGVzLmxlbmd0aCAhPSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VyVHlwZSA9IHN1YlR5cGVzWzBdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnTSc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gSW50ZWdlci5wYXJzZUludChwYXJ0LnN1YnN0cmluZyhvZmZzZXQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLlVOSU9OKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZVtdIHN1YlR5cGVzID0gY3VyVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YlR5cGVzLmxlbmd0aCA8PSBpbmRleCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1clR5cGUgPSBzdWJUeXBlc1tpbmRleF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1clR5cGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUxvYWRlckltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVMb2FkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNjY1YmIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUxvYWRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYU1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhCZWFuRGVidWc7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hVHlwZUxvYWRlckltcGwgZXh0ZW5kcyBTY2hlbWFUeXBlTG9hZGVyQmFzZQotewotICAgIHByaXZhdGUgUmVzb3VyY2VMb2FkZXIgX3Jlc291cmNlTG9hZGVyOwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgX2NsYXNzTG9hZGVyOwotICAgIHByaXZhdGUgU2NoZW1hVHlwZUxvYWRlcltdIF9zZWFyY2hQYXRoOwotCi0gICAgcHJpdmF0ZSBNYXAgX2NsYXNzcGF0aFR5cGVTeXN0ZW1zOwotICAgIHByaXZhdGUgTWFwIF9jbGFzc0xvYWRlclR5cGVTeXN0ZW1zOwotICAgIHByaXZhdGUgTWFwIF9lbGVtZW50Q2FjaGU7Ci0gICAgcHJpdmF0ZSBNYXAgX2F0dHJpYnV0ZUNhY2hlOwotICAgIHByaXZhdGUgTWFwIF9tb2RlbEdyb3VwQ2FjaGU7Ci0gICAgcHJpdmF0ZSBNYXAgX2F0dHJpYnV0ZUdyb3VwQ2FjaGU7Ci0gICAgcHJpdmF0ZSBNYXAgX2lkQ29uc3RyYWludENhY2hlOwotICAgIHByaXZhdGUgTWFwIF90eXBlQ2FjaGU7Ci0gICAgcHJpdmF0ZSBNYXAgX2RvY3VtZW50Q2FjaGU7Ci0gICAgcHJpdmF0ZSBNYXAgX2NsYXNzbmFtZUNhY2hlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hVHlwZUxvYWRlckltcGwgYnVpbGRDb250ZXh0VHlwZUxvYWRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFNjaGVtYVR5cGVMb2FkZXJJbXBsKG5ldyBTY2hlbWFUeXBlTG9hZGVyW10geyBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5nZXQoKSB9ICwgbnVsbCwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWwgX3RocmVhZFR5cGVTeXN0ZW0gPQotICAgICAgICBuZXcgVGhyZWFkTG9jYWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGluaXRpYWxWYWx1ZSgpIHsgcmV0dXJuIGJ1aWxkQ29udGV4dFR5cGVMb2FkZXIoKTsgfQotICAgICAgICB9OwotCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlTG9hZGVySW1wbCBnZXRDb250ZXh0VHlwZUxvYWRlcigpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlTG9hZGVySW1wbCBjYW5kaWRhdGUgPSAoU2NoZW1hVHlwZUxvYWRlckltcGwpX3RocmVhZFR5cGVTeXN0ZW0uZ2V0KCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGUuX2NsYXNzTG9hZGVyICE9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhbmRpZGF0ZSA9IGJ1aWxkQ29udGV4dFR5cGVMb2FkZXIoKTsKLSAgICAgICAgICAgIF90aHJlYWRUeXBlU3lzdGVtLnNldChjYW5kaWRhdGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYW5kaWRhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlTG9hZGVyIGJ1aWxkKFNjaGVtYVR5cGVMb2FkZXJbXSBzZWFyY2hQYXRoLCBSZXNvdXJjZUxvYWRlciByZXNvdXJjZUxvYWRlciwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpCi0gICAgewotICAgICAgICBpZiAoc2VhcmNoUGF0aCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZWFyY2hQYXRoID0gRU1QVFlfU0NIRU1BVFlQRUxPQURFUl9BUlJBWTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGFzc2VtYmxlIGEgZmxhdHRlbmVkIHNlYXJjaCBwYXRoIHdpdGggbm8gZHVwbGljYXRlcwotICAgICAgICAgICAgU3ViTG9hZGVyTGlzdCBsaXN0ID0gbmV3IFN1YkxvYWRlckxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VhcmNoUGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VhcmNoUGF0aFtpXSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWFyY2hQYXRoWyIgKyBpICsgIl0gaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIGlmICghKHNlYXJjaFBhdGhbaV0gaW5zdGFuY2VvZiBTY2hlbWFUeXBlTG9hZGVySW1wbCkpCi0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKHNlYXJjaFBhdGhbaV0pOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVMb2FkZXJJbXBsIHN1YiA9IChTY2hlbWFUeXBlTG9hZGVySW1wbClzZWFyY2hQYXRoW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3ViLl9jbGFzc0xvYWRlciAhPSBudWxsIHx8IHN1Yi5fcmVzb3VyY2VMb2FkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKHN1Yik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgZm9yIChpbnQgaiA9IDA7IGogPCBzdWIuX3NlYXJjaFBhdGgubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChzdWIuX3NlYXJjaFBhdGhbal0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlYXJjaFBhdGggPSBsaXN0LnRvQXJyYXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZWFyY2hQYXRoLmxlbmd0aCA9PSAxICYmIHJlc291cmNlTG9hZGVyID09IG51bGwgJiYgY2xhc3NMb2FkZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBzZWFyY2hQYXRoWzBdOwotCi0gICAgICAgIHJldHVybiBuZXcgU2NoZW1hVHlwZUxvYWRlckltcGwoc2VhcmNoUGF0aCwgcmVzb3VyY2VMb2FkZXIsIGNsYXNzTG9hZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKdXN0IHVzZWQgdG8gYXZvaWQgZHVwbGljYXRlIHBhdGggZW50cmllcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN1YkxvYWRlckxpc3QKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgTGlzdCB0aGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwcml2YXRlIE1hcCBzZWVuID0gbmV3IElkZW50aXR5SGFzaE1hcCgpOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBhZGQoU2NoZW1hVHlwZUxvYWRlciBsb2FkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzZWVuLmNvbnRhaW5zS2V5KGxvYWRlcikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgdGhlTGlzdC5hZGQobG9hZGVyKTsKLSAgICAgICAgICAgIHNlZW4ucHV0KGxvYWRlciwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU2NoZW1hVHlwZUxvYWRlcltdIHRvQXJyYXkoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGVMb2FkZXJbXSl0aGVMaXN0LnRvQXJyYXkoRU1QVFlfU0NIRU1BVFlQRUxPQURFUl9BUlJBWSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgU2NoZW1hVHlwZUxvYWRlckltcGwgdGhhdCBzZWFyY2hlcyBmb3Igb2JqZWN0cwotICAgICAqIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0gICAgICoKLSAgICAgKiAoMSkgRmlyc3Qgb24gdGhlIHNlYXJjaFBhdGggb2Ygb3RoZXIgU2NoZW1hVHlwZVN5c3RlbXMgc3VwcGxpZWQsCi0gICAgICogICAgIGluIG9yZGVyIHRoYXQgdGhleSBhcmUgbGlzdGVkLgotICAgICAqICgyKSBOZXh0IG9uIHRoZSBjbGFzc3BhdGggb2YgLmphciBmaWxlcyBvciBkaXJlY3RvcmllcyBzdXBwbGllZCwKLSAgICAgKiAgICAgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSBhcmUgbGlzdGVkLiBXaGVuIHR5cGVzIGFyZSByZXR1cm5lZCBpbgotICAgICAqICAgICB0aGlzIHdheSwgdGhleSBhcmUgaW5zdGFudGlhdGVkIGZyb20gYSBwcml2YXRlIHR5cGVzeXN0ZW0uCi0gICAgICogICAgIEluIG90aGVyIHdvcmRzLCBpZiBhIHR5cGUgaXMgbG9hZGVkIGZyb20gYW5vdGhlciBTY2hlbWFUeXBlTG9hZGVySW1wbAotICAgICAqICAgICB0aGF0IHdhcyBpbml0aWFsaXplZCBvbiB0aGUgc2FtZSBmaWxlLCB0aGUgaW5zdGFuY2Ugb2YgdGhlIHR5cGUgd2lsbAotICAgICAqICAgICBiZSBkaWZmZXJlbnQuCi0gICAgICogKDMpIEZpbmFsbHkgb24gdGhlIGNsYXNzbG9hZGVyIHN1cHBsaWVkLgotICAgICAqLwotICAgIHByaXZhdGUgU2NoZW1hVHlwZUxvYWRlckltcGwoU2NoZW1hVHlwZUxvYWRlcltdIHNlYXJjaFBhdGgsIFJlc291cmNlTG9hZGVyIHJlc291cmNlTG9hZGVyLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgICB7Ci0gICAgICAgIGlmIChzZWFyY2hQYXRoID09IG51bGwpCi0gICAgICAgICAgICBfc2VhcmNoUGF0aCA9IEVNUFRZX1NDSEVNQVRZUEVMT0FERVJfQVJSQVk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIF9zZWFyY2hQYXRoID0gc2VhcmNoUGF0aDsKLSAgICAgICAgX3Jlc291cmNlTG9hZGVyID0gcmVzb3VyY2VMb2FkZXI7Ci0gICAgICAgIF9jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotCi0gICAgICAgIGluaXRDYWNoZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgY2FjaGVzLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgdm9pZCBpbml0Q2FjaGVzKCkKLSAgICB7Ci0gICAgICAgIF9jbGFzc3BhdGhUeXBlU3lzdGVtcyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCgpKTsKLSAgICAgICAgX2NsYXNzTG9hZGVyVHlwZVN5c3RlbXMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0gICAgICAgIF9lbGVtZW50Q2FjaGUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0gICAgICAgIF9hdHRyaWJ1dGVDYWNoZSA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCgpKTsKLSAgICAgICAgX21vZGVsR3JvdXBDYWNoZSA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCgpKTsKLSAgICAgICAgX2F0dHJpYnV0ZUdyb3VwQ2FjaGUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0gICAgICAgIF9pZENvbnN0cmFpbnRDYWNoZSA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCgpKTsKLSAgICAgICAgX3R5cGVDYWNoZSA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCgpKTsKLSAgICAgICAgX2RvY3VtZW50Q2FjaGUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0gICAgICAgIF9jbGFzc25hbWVDYWNoZSA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCgpKTsKLSAgICB9Ci0KLSAgICBTY2hlbWFUeXBlU3lzdGVtSW1wbCB0eXBlU3lzdGVtRm9yQ29tcG9uZW50KFN0cmluZyBzZWFyY2hkaXIsIFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBTdHJpbmcgc2VhcmNoZm9yID0gc2VhcmNoZGlyICsgUU5hbWVIZWxwZXIuaGV4c2FmZWRpcihuYW1lKSArICIueHNiIjsKLSAgICAgICAgU3RyaW5nIHRzbmFtZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKF9yZXNvdXJjZUxvYWRlciAhPSBudWxsKQotICAgICAgICAgICAgdHNuYW1lID0gY3JhY2tFbnRyeShfcmVzb3VyY2VMb2FkZXIsIHNlYXJjaGZvcik7Ci0KLSAgICAgICAgaWYgKF9jbGFzc0xvYWRlciAhPSBudWxsKQotICAgICAgICAgICAgdHNuYW1lID0gY3JhY2tFbnRyeShfY2xhc3NMb2FkZXIsIHNlYXJjaGZvcik7Ci0KLSAgICAgICAgaWYgKHRzbmFtZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFUeXBlU3lzdGVtSW1wbCl0eXBlU3lzdGVtRm9yTmFtZSh0c25hbWUpOwotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlU3lzdGVtIHR5cGVTeXN0ZW1Gb3JOYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKF9yZXNvdXJjZUxvYWRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHJlc3VsdCA9IGdldFR5cGVTeXN0ZW1PbkNsYXNzcGF0aChuYW1lKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF9jbGFzc0xvYWRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHJlc3VsdCA9IGdldFR5cGVTeXN0ZW1PbkNsYXNzbG9hZGVyKG5hbWUpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgU2NoZW1hVHlwZVN5c3RlbUltcGwgdHlwZVN5c3RlbUZvckNsYXNzbmFtZShTdHJpbmcgc2VhcmNoZGlyLCBTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBzZWFyY2hmb3IgPSBzZWFyY2hkaXIgKyBuYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi54c2IiOwotCi0gICAgICAgIGlmIChfcmVzb3VyY2VMb2FkZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHRzbmFtZSA9IGNyYWNrRW50cnkoX3Jlc291cmNlTG9hZGVyLCBzZWFyY2hmb3IpOwotICAgICAgICAgICAgaWYgKHRzbmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRUeXBlU3lzdGVtT25DbGFzc3BhdGgodHNuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfY2xhc3NMb2FkZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHRzbmFtZSA9IGNyYWNrRW50cnkoX2NsYXNzTG9hZGVyLCBzZWFyY2hmb3IpOwotICAgICAgICAgICAgaWYgKHRzbmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRUeXBlU3lzdGVtT25DbGFzc2xvYWRlcih0c25hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgU2NoZW1hVHlwZVN5c3RlbUltcGwgZ2V0VHlwZVN5c3RlbU9uQ2xhc3NwYXRoKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZVN5c3RlbUltcGwgcmVzdWx0ID0gKFNjaGVtYVR5cGVTeXN0ZW1JbXBsKV9jbGFzc3BhdGhUeXBlU3lzdGVtcy5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFNjaGVtYVR5cGVTeXN0ZW1JbXBsKF9yZXNvdXJjZUxvYWRlciwgbmFtZSwgdGhpcyk7Ci0gICAgICAgICAgICBfY2xhc3NwYXRoVHlwZVN5c3RlbXMucHV0KG5hbWUsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBTY2hlbWFUeXBlU3lzdGVtSW1wbCBnZXRUeXBlU3lzdGVtT25DbGFzc2xvYWRlcihTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIkZpbmRpbmcgdHlwZSBzeXN0ZW0gIiArIG5hbWUgKyAiIG9uIGNsYXNzbG9hZGVyIiwgMCk7Ci0gICAgICAgIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIHJlc3VsdCA9IChTY2hlbWFUeXBlU3lzdGVtSW1wbClfY2xhc3NMb2FkZXJUeXBlU3lzdGVtcy5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgWEJlYW5EZWJ1Zy50cmFjZShYQmVhbkRlYnVnLlRSQUNFX1NDSEVNQV9MT0FESU5HLCAiVHlwZSBzeXN0ZW0gIiArIG5hbWUgKyAiIG5vdCBjYWNoZWQgLSBjb25zdWx0aW5nIGZpZWxkIiwgMCk7Ci0gICAgICAgICAgICByZXN1bHQgPSBTY2hlbWFUeXBlU3lzdGVtSW1wbC5mb3JOYW1lKG5hbWUsIF9jbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICBfY2xhc3NMb2FkZXJUeXBlU3lzdGVtcy5wdXQobmFtZSwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgY3JhY2tFbnRyeShSZXNvdXJjZUxvYWRlciBsb2FkZXIsIFN0cmluZyBzZWFyY2hmb3IpCi0gICAgewotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHNlYXJjaGZvcik7Ci0gICAgICAgIGlmIChpcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBjcmFja1BvaW50ZXIoaXMpOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgY3JhY2tFbnRyeShDbGFzc0xvYWRlciBsb2FkZXIsIFN0cmluZyBzZWFyY2hmb3IpCi0gICAgewotICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBsb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShzZWFyY2hmb3IpOwotICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIGNyYWNrUG9pbnRlcihzdHJlYW0pOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgY3JhY2tQb2ludGVyKElucHV0U3RyZWFtIHN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBTY2hlbWFUeXBlU3lzdGVtSW1wbC5jcmFja1BvaW50ZXIoc3RyZWFtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZURlZmluZWQoU3RyaW5nIG5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NlYXJjaFBhdGgubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBpZiAoX3NlYXJjaFBhdGhbaV0uaXNOYW1lc3BhY2VEZWZpbmVkKG5hbWVzcGFjZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIAotICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHN0cyA9IHR5cGVTeXN0ZW1Gb3JDb21wb25lbnQoInNjaGVtYS9uYW1lc3BhY2UvIiwgbmV3IFFOYW1lKG5hbWVzcGFjZSwgInhtbG5zIikpOwotICAgICAgICByZXR1cm4gKHN0cyAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZmluZFR5cGVSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUuUmVmIHJlc3VsdCA9IChTY2hlbWFUeXBlLlJlZilfdHlwZUNhY2hlLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmICFfdHlwZUNhY2hlLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zZWFyY2hQYXRoLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGlmIChudWxsICE9IChyZXN1bHQgPSBfc2VhcmNoUGF0aFtpXS5maW5kVHlwZVJlZihuYW1lKSkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gdHMgPSB0eXBlU3lzdGVtRm9yQ29tcG9uZW50KCJzY2hlbWEvdHlwZS8iLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodHMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRzLmZpbmRUeXBlUmVmKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpIDogIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgdHlwZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBidXQgZG9lcyBub3QgcmV0dXJuIGl0IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfdHlwZUNhY2hlLnB1dChuYW1lLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgdHlwZUZvckNsYXNzbmFtZShTdHJpbmcgY2xhc3NuYW1lKQotICAgIHsKLSAgICAgICAgY2xhc3NuYW1lID0gY2xhc3NuYW1lLnJlcGxhY2UoJyQnLCAnLicpOwotCi0gICAgICAgIFNjaGVtYVR5cGUgcmVzdWx0ID0gKFNjaGVtYVR5cGUpX2NsYXNzbmFtZUNhY2hlLmdldChjbGFzc25hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgIV9jbGFzc25hbWVDYWNoZS5jb250YWluc0tleShjbGFzc25hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zZWFyY2hQYXRoLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGlmIChudWxsICE9IChyZXN1bHQgPSBfc2VhcmNoUGF0aFtpXS50eXBlRm9yQ2xhc3NuYW1lKGNsYXNzbmFtZSkpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHRzID0gdHlwZVN5c3RlbUZvckNsYXNzbmFtZSgic2NoZW1hL2phdmFuYW1lLyIsIGNsYXNzbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cy50eXBlRm9yQ2xhc3NuYW1lKGNsYXNzbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCkgOiAiVHlwZSBzeXN0ZW0gcmVnaXN0ZXJlZCB0eXBlICIgKyBjbGFzc25hbWUgKyAiIGJ1dCBkb2VzIG5vdCByZXR1cm4gaXQiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9jbGFzc25hbWVDYWNoZS5wdXQoY2xhc3NuYW1lLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUuUmVmIGZpbmREb2N1bWVudFR5cGVSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUuUmVmIHJlc3VsdCA9IChTY2hlbWFUeXBlLlJlZilfZG9jdW1lbnRDYWNoZS5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiAhX2RvY3VtZW50Q2FjaGUuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NlYXJjaFBhdGgubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gKHJlc3VsdCA9IF9zZWFyY2hQYXRoW2ldLmZpbmREb2N1bWVudFR5cGVSZWYobmFtZSkpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHRzID0gdHlwZVN5c3RlbUZvckNvbXBvbmVudCgic2NoZW1hL2VsZW1lbnQvIiwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cy5maW5kRG9jdW1lbnRUeXBlUmVmKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpIDogIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgZWxlbWVudCAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBidXQgZG9lcyBub3QgY29udGFpbiBkb2N1bWVudCB0eXBlIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfZG9jdW1lbnRDYWNoZS5wdXQobmFtZSwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlLlJlZiBmaW5kQXR0cmlidXRlVHlwZVJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZS5SZWYgcmVzdWx0ID0gKFNjaGVtYVR5cGUuUmVmKV9hdHRyaWJ1dGVDYWNoZS5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiAhX2F0dHJpYnV0ZUNhY2hlLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zZWFyY2hQYXRoLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGlmIChudWxsICE9IChyZXN1bHQgPSBfc2VhcmNoUGF0aFtpXS5maW5kQXR0cmlidXRlVHlwZVJlZihuYW1lKSkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gdHMgPSB0eXBlU3lzdGVtRm9yQ29tcG9uZW50KCJzY2hlbWEvYXR0cmlidXRlLyIsIG5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh0cyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHMuZmluZEF0dHJpYnV0ZVR5cGVSZWYobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCkgOiAiVHlwZSBzeXN0ZW0gcmVnaXN0ZXJlZCBhdHRyaWJ1dGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArICIgYnV0IGRvZXMgbm90IGNvbnRhaW4gYXR0cmlidXRlIHR5cGUiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9hdHRyaWJ1dGVDYWNoZS5wdXQobmFtZSwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxFbGVtZW50LlJlZiBmaW5kRWxlbWVudFJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYgcmVzdWx0ID0gKFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmKV9lbGVtZW50Q2FjaGUuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgIV9lbGVtZW50Q2FjaGUuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NlYXJjaFBhdGgubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gKHJlc3VsdCA9IF9zZWFyY2hQYXRoW2ldLmZpbmRFbGVtZW50UmVmKG5hbWUpKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSB0cyA9IHR5cGVTeXN0ZW1Gb3JDb21wb25lbnQoInNjaGVtYS9lbGVtZW50LyIsIG5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh0cyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHMuZmluZEVsZW1lbnRSZWYobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCkgOiAiVHlwZSBzeXN0ZW0gcmVnaXN0ZXJlZCBlbGVtZW50ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIGJ1dCBkb2VzIG5vdCByZXR1cm4gaXQiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9lbGVtZW50Q2FjaGUucHV0KG5hbWUsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsQXR0cmlidXRlLlJlZiBmaW5kQXR0cmlidXRlUmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUuUmVmIHJlc3VsdCA9IChTY2hlbWFHbG9iYWxBdHRyaWJ1dGUuUmVmKV9hdHRyaWJ1dGVDYWNoZS5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiAhX2F0dHJpYnV0ZUNhY2hlLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zZWFyY2hQYXRoLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGlmIChudWxsICE9IChyZXN1bHQgPSBfc2VhcmNoUGF0aFtpXS5maW5kQXR0cmlidXRlUmVmKG5hbWUpKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSB0cyA9IHR5cGVTeXN0ZW1Gb3JDb21wb25lbnQoInNjaGVtYS9hdHRyaWJ1dGUvIiwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cy5maW5kQXR0cmlidXRlUmVmKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpIDogIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgYXR0cmlidXRlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIGJ1dCBkb2VzIG5vdCByZXR1cm4gaXQiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9hdHRyaWJ1dGVDYWNoZS5wdXQobmFtZSwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFNb2RlbEdyb3VwLlJlZiBmaW5kTW9kZWxHcm91cFJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgU2NoZW1hTW9kZWxHcm91cC5SZWYgcmVzdWx0ID0gKFNjaGVtYU1vZGVsR3JvdXAuUmVmKV9tb2RlbEdyb3VwQ2FjaGUuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgIV9tb2RlbEdyb3VwQ2FjaGUuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NlYXJjaFBhdGgubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gKHJlc3VsdCA9IF9zZWFyY2hQYXRoW2ldLmZpbmRNb2RlbEdyb3VwUmVmKG5hbWUpKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSB0cyA9IHR5cGVTeXN0ZW1Gb3JDb21wb25lbnQoInNjaGVtYS9tb2RlbGdyb3VwLyIsIG5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh0cyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHMuZmluZE1vZGVsR3JvdXBSZWYobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCkgOiAiVHlwZSBzeXN0ZW0gcmVnaXN0ZXJlZCBtb2RlbCBncm91cCAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBidXQgZG9lcyBub3QgcmV0dXJuIGl0IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfbW9kZWxHcm91cENhY2hlLnB1dChuYW1lLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZUdyb3VwLlJlZiBmaW5kQXR0cmlidXRlR3JvdXBSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwLlJlZiByZXN1bHQgPSAoU2NoZW1hQXR0cmlidXRlR3JvdXAuUmVmKV9hdHRyaWJ1dGVHcm91cENhY2hlLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmICFfYXR0cmlidXRlR3JvdXBDYWNoZS5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfc2VhcmNoUGF0aC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSAocmVzdWx0ID0gX3NlYXJjaFBhdGhbaV0uZmluZEF0dHJpYnV0ZUdyb3VwUmVmKG5hbWUpKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSB0cyA9IHR5cGVTeXN0ZW1Gb3JDb21wb25lbnQoInNjaGVtYS9hdHRyaWJ1dGVncm91cC8iLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodHMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRzLmZpbmRBdHRyaWJ1dGVHcm91cFJlZihuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKSA6ICJUeXBlIHN5c3RlbSByZWdpc3RlcmVkIGF0dHJpYnV0ZSBncm91cCAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBidXQgZG9lcyBub3QgcmV0dXJuIGl0IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfYXR0cmlidXRlR3JvdXBDYWNoZS5wdXQobmFtZSwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmIGZpbmRJZGVudGl0eUNvbnN0cmFpbnRSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWYgcmVzdWx0ID0gKFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWYpX2lkQ29uc3RyYWludENhY2hlLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmICFfaWRDb25zdHJhaW50Q2FjaGUuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NlYXJjaFBhdGgubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gKHJlc3VsdCA9IF9zZWFyY2hQYXRoW2ldLmZpbmRJZGVudGl0eUNvbnN0cmFpbnRSZWYobmFtZSkpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHRzID0gdHlwZVN5c3RlbUZvckNvbXBvbmVudCgic2NoZW1hL2lkZW50aXR5Y29uc3RyYWludC8iLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodHMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRzLmZpbmRJZGVudGl0eUNvbnN0cmFpbnRSZWYobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCkgOiAiVHlwZSBzeXN0ZW0gcmVnaXN0ZXJlZCBpZGVudGl0eSBjb25zdHJhaW50ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIGJ1dCBkb2VzIG5vdCByZXR1cm4gaXQiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9pZENvbnN0cmFpbnRDYWNoZS5wdXQobmFtZSwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRTb3VyY2VBc1N0cmVhbShTdHJpbmcgc291cmNlTmFtZSkKLSAgICB7Ci0gICAgICAgIElucHV0U3RyZWFtIHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKCFzb3VyY2VOYW1lLnN0YXJ0c1dpdGgoIi8iKSkKLSAgICAgICAgICAgIHNvdXJjZU5hbWUgPSAiLyIgKyBzb3VyY2VOYW1lOwotCi0gICAgICAgIGlmIChfcmVzb3VyY2VMb2FkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdCA9IF9yZXNvdXJjZUxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCJzY2hlbWEvc3JjIiArIHNvdXJjZU5hbWUpOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiBfY2xhc3NMb2FkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBfY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbSgic2NoZW1hL3NyYyIgKyBzb3VyY2VOYW1lKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVMb2FkZXJbXSBFTVBUWV9TQ0hFTUFUWVBFTE9BREVSX0FSUkFZID0gbmV3IFNjaGVtYVR5cGVMb2FkZXJbMF07Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlU3lzdGVtQ29tcGlsZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVTeXN0ZW1Db21waWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTBhODQzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVTeXN0ZW1Db21waWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudC5TY2hlbWE7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudDsKLWltcG9ydCBjb20uYmVhLngyMDAyLngwOS54YmVhbi5jb25maWcuQ29uZmlnRG9jdW1lbnQuQ29uZmlnOwotaW1wb3J0IGNvbS5iZWEueDIwMDIueDA5LnhiZWFuLmNvbmZpZy5Db25maWdEb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yV2F0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29uZmlnLlNjaGVtYUNvbmZpZzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hVHlwZVN5c3RlbUNvbXBpbGVyCi17Ci0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbWV0ZXJzCi0gICAgewotICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgICAgICBwcml2YXRlIFNjaGVtYVtdIHNjaGVtYXM7Ci0gICAgICAgIHByaXZhdGUgQ29uZmlnW10gY29uZmlnczsKLSAgICAgICAgcHJpdmF0ZSBTY2hlbWFUeXBlTG9hZGVyIGxpbmtUbzsKLSAgICAgICAgcHJpdmF0ZSBYbWxPcHRpb25zIG9wdGlvbnM7Ci0gICAgICAgIHByaXZhdGUgQ29sbGVjdGlvbiBlcnJvckxpc3RlbmVyOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gamF2YWl6ZTsKLSAgICAgICAgcHJpdmF0ZSBVUkkgYmFzZVVSSTsKLSAgICAgICAgcHJpdmF0ZSBNYXAgc291cmNlc1RvQ29weU1hcDsKLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2NoZW1hRG9jdW1lbnQuU2NoZW1hW10gZ2V0U2NoZW1hcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzY2hlbWFzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2NoZW1hcyhTY2hlbWFEb2N1bWVudC5TY2hlbWFbXSBzY2hlbWFzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnNjaGVtYXMgPSBzY2hlbWFzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbmZpZ0RvY3VtZW50LkNvbmZpZ1tdIGdldENvbmZpZ3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29uZmlnczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3MoQ29uZmlnRG9jdW1lbnQuQ29uZmlnW10gY29uZmlncykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jb25maWdzID0gY29uZmlnczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTY2hlbWFUeXBlTG9hZGVyIGdldExpbmtUbygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBsaW5rVG87Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRMaW5rVG8oU2NoZW1hVHlwZUxvYWRlciBsaW5rVG8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubGlua1RvID0gbGlua1RvOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFhtbE9wdGlvbnMgZ2V0T3B0aW9ucygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0T3B0aW9ucyhYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRFcnJvckxpc3RlbmVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGVycm9yTGlzdGVuZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRFcnJvckxpc3RlbmVyKENvbGxlY3Rpb24gZXJyb3JMaXN0ZW5lcikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5lcnJvckxpc3RlbmVyID0gZXJyb3JMaXN0ZW5lcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzSmF2YWl6ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SmF2YWl6ZShib29sZWFuIGphdmFpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuamF2YWl6ZSA9IGphdmFpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVVJJIGdldEJhc2VVUkkoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYmFzZVVSSTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEJhc2VVUkkoVVJJIGJhc2VVUkkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuYmFzZVVSSSA9IGJhc2VVUkk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTWFwIGdldFNvdXJjZXNUb0NvcHlNYXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc291cmNlc1RvQ29weU1hcDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZXNUb0NvcHlNYXAoTWFwIHNvdXJjZXNUb0NvcHlNYXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuc291cmNlc1RvQ29weU1hcCA9IHNvdXJjZXNUb0NvcHlNYXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVTeXN0ZW0gY29tcGlsZShQYXJhbWV0ZXJzIHBhcmFtcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21waWxlSW1wbChwYXJhbXMuZ2V0TmFtZSgpLCBwYXJhbXMuZ2V0U2NoZW1hcygpLCBwYXJhbXMuZ2V0Q29uZmlncygpLCBwYXJhbXMuZ2V0TGlua1RvKCksIHBhcmFtcy5nZXRPcHRpb25zKCksIHBhcmFtcy5nZXRFcnJvckxpc3RlbmVyKCksIHBhcmFtcy5pc0phdmFpemUoKSwgcGFyYW1zLmdldEJhc2VVUkkoKSwgcGFyYW1zLmdldFNvdXJjZXNUb0NvcHlNYXAoKSk7Ci0gICAgfQotICAgIAotICAgIC8qIHBhY2thZ2UhISEgKi8gc3RhdGljIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIGNvbXBpbGVJbXBsKAotICAgICAgICBTdHJpbmcgbmFtZSwgU2NoZW1hW10gc2NoZW1hcywgQ29uZmlnW10gY29uZmlncywKLSAgICAgICAgU2NoZW1hVHlwZUxvYWRlciBsaW5rVG8sIFhtbE9wdGlvbnMgb3B0aW9ucywgQ29sbGVjdGlvbiBvdXRzaWRlRXJyb3JzLCBib29sZWFuIGphdmFpemUsIFVSSSBiYXNlVVJJLCBNYXAgc291cmNlc1RvQ29weU1hcCkKLSAgICB7Ci0gICAgICAgIGlmIChsaW5rVG8gPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk11c3Qgc3VwcGx5IGxpbmtUbyIpOwotCi0gICAgICAgIFhtbEVycm9yV2F0Y2hlciBlcnJvcldhdGNoZXIgPSBuZXcgWG1sRXJyb3JXYXRjaGVyKG91dHNpZGVFcnJvcnMpOwotCi0gICAgICAgIC8vIGNvbnN0cnVjdCB0aGUgc3RhdGUKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLnN0YXJ0KCk7Ci0gICAgICAgIGJvb2xlYW4gdmFsaWRhdGUgPSAob3B0aW9ucyA9PSBudWxsIHx8ICFvcHRpb25zLmhhc09wdGlvbihYbWxPcHRpb25zLkNPTVBJTEVfTk9fVkFMSURBVElPTikpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuc2V0RXJyb3JMaXN0ZW5lcihlcnJvcldhdGNoZXIpOwotICAgICAgICAgICAgc3RhdGUuc2V0U2NoZW1hQ29uZmlnKFNjaGVtYUNvbmZpZy5mb3JDb25maWdEb2N1bWVudHMoY29uZmlncykpOwotICAgICAgICAgICAgc3RhdGUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgICAgIHN0YXRlLnNldEdpdmVuVHlwZVN5c3RlbU5hbWUobmFtZSk7Ci0gICAgICAgICAgICBpZiAoYmFzZVVSSSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHN0YXRlLnNldEJhc2VVcmkoYmFzZVVSSSk7Ci0KLSAgICAgICAgICAgIC8vIGNvbnN0cnVjdCB0aGUgY2xhc3NwYXRoICh5b3UgYWx3YXlzIGdldCB0aGUgYnVpbHRpbiB0eXBlcykKLSAgICAgICAgICAgIGxpbmtUbyA9IFNjaGVtYVR5cGVMb2FkZXJJbXBsLmJ1aWxkKG5ldyBTY2hlbWFUeXBlTG9hZGVyW10geyBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5nZXQoKSwgbGlua1RvIH0sIG51bGwsIG51bGwpOwotICAgICAgICAgICAgc3RhdGUuc2V0SW1wb3J0aW5nVHlwZUxvYWRlcihsaW5rVG8pOwotCi0gICAgICAgICAgICBMaXN0IHZhbGlkU2NoZW1hcyA9IG5ldyBBcnJheUxpc3Qoc2NoZW1hcy5sZW5ndGgpOwotCi0gICAgICAgICAgICAvLyBsb2FkIGFsbCB0aGUgeHNkIGZpbGVzIGludG8gaXQKLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hc1tpXS52YWxpZGF0ZShuZXcgWG1sT3B0aW9ucygpLnNldEVycm9yTGlzdGVuZXIoZXJyb3JXYXRjaGVyKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFNjaGVtYXMuYWRkKHNjaGVtYXNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWxpZFNjaGVtYXMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc2NoZW1hcykpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTY2hlbWFbXSBzdGFydFdpdGggPSAoU2NoZW1hW10pdmFsaWRTY2hlbWFzLnRvQXJyYXkobmV3IFNjaGVtYVt2YWxpZFNjaGVtYXMuc2l6ZSgpXSk7Ci0KLSAgICAgICAgICAgIC8vIGRlYWwgd2l0aCBpbXBvcnRzIGFuZCBpbmNsdWRlcwotICAgICAgICAgICAgU3RzY0ltcG9ydGVyLlNjaGVtYVRvUHJvY2Vzc1tdIHNjaGVtYXNBbmRDaGFtZWxlb25zID0gU3RzY0ltcG9ydGVyLnJlc29sdmVJbXBvcnRzQW5kSW5jbHVkZXMoc3RhcnRXaXRoKTsKLQotICAgICAgICAgICAgLy8gY2FsbCB0aGUgdHJhbnNsYXRvciBzbyB0aGF0IGl0IG1heSBhbHNvIHBlcmZvcm0gbWFnaWMKLSAgICAgICAgICAgIFN0c2NUcmFuc2xhdG9yLmFkZEFsbERlZmluaXRpb25zKHNjaGVtYXNBbmRDaGFtZWxlb25zKTsKLQotICAgICAgICAgICAgLy8gY2FsbCB0aGUgcmVzb2x2ZXIgdG8gZG8gaXRzIG1hZ2ljCi0gICAgICAgICAgICBTdHNjUmVzb2x2ZXIucmVzb2x2ZUFsbCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBjYWxsIHRoZSBjaGVja2VyIHRvIGNoZWNrIGJvdGggcmVzdHJpY3Rpb25zIGFuZCBkZWZhdWx0cwotICAgICAgICAgICAgU3RzY0NoZWNrZXIuY2hlY2tBbGwoKTsKLQotICAgICAgICAgICAgLy8gY2FsbCB0aGUgamF2YWl6ZXIgdG8gZG8gaXRzIG1hZ2ljCi0gICAgICAgICAgICBTdHNjSmF2YWl6ZXIuamF2YWl6ZUFsbFR5cGVzKGphdmFpemUpOwotCi0gICAgICAgICAgICAvLyBjb25zdHJ1Y3QgdGhlIGxvYWRlciBvdXQgb2YgdGhlIHN0YXRlCi0gICAgICAgICAgICBzdGF0ZS5nZXQoKS5zdHMoKS5sb2FkRnJvbVN0c2NTdGF0ZShzdGF0ZSk7Ci0KLSAgICAgICAgICAgIC8vIGZpbGwgaW4gdGhlIHNvdXJjZS1jb3B5IG1hcAotICAgICAgICAgICAgaWYgKHNvdXJjZXNUb0NvcHlNYXAgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzb3VyY2VzVG9Db3B5TWFwLnB1dEFsbChzdGF0ZS5zb3VyY2VDb3B5TWFwKCkpOwotCi0gICAgICAgICAgICAvLyBpZiBhbnkgZXJyb3JzLCByZXR1cm4gbnVsbAotICAgICAgICAgICAgaWYgKGVycm9yV2F0Y2hlci5oYXNFcnJvcigpKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICByZXR1cm4gc3RhdGUuZ2V0KCkuc3RzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHNjU3RhdGUuZW5kKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZVN5c3RlbUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVTeXN0ZW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNDU3MjMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZVN5c3RlbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNjAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvcgotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YQmVhbkRlYnVnOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JXYXRjaGVyOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnV0aWwuSGV4QmluOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sT2JqZWN0QmFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVBhcnRpY2xlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTW9kZWxHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQXR0cmlidXRlTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVN0cmluZ0VudW1FbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnNvYXAuU09BUEFycmF5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnNvYXAuU2NoZW1hV1NETEFycmF5VHlwZTsKLWltcG9ydCBjb20uYmVhLngyMDAyLngwOS54YmVhbi5jb25maWcuQ29uZmlnRG9jdW1lbnQuQ29uZmlnOwotaW1wb3J0IGNvbS5iZWEueDIwMDIueDA5LnhiZWFuLmNvbmZpZy5Db25maWdEb2N1bWVudDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuR3JvdXBEb2N1bWVudDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkF0dHJpYnV0ZUdyb3VwRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudC5TY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFUeXBlU3lzdGVtSW1wbCBleHRlbmRzIFNjaGVtYVR5cGVMb2FkZXJCYXNlIGltcGxlbWVudHMgU2NoZW1hVHlwZVN5c3RlbQotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEFfQkFCRSA9IDB4REE3QUJBQkU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFKT1JfVkVSU0lPTiA9IDI7ICAvLyBtdXN0IG1hdGNoID09IHRvIGJlIGNvbXBhdGlibGUKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5PUl9WRVJTSU9OID0gMTg7IC8vIG11c3QgYmUgPD0gdG8gYmUgY29tcGF0aWJsZQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTEVBU0VfTlVNQkVSID0gMDsgLy8gc2hvdWxkIGJlIGNvbXBhdGlibGUgZXZlbiBpZiA8IG9yID4KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVUWVBFX1NDSEVNQUlOREVYID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFVFlQRV9TQ0hFTUFUWVBFID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFVFlQRV9TQ0hFTUFFTEVNRU5UID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEUgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVUWVBFX1NDSEVNQVBPSU5URVIgPSA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVUWVBFX1NDSEVNQU1PREVMR1JPVVAgPSA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURUdST1VQID0gNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFVFlQRV9TQ0hFTUFJREVOVElUWUNPTlNUUkFJTlQgPSA4OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX1NLSVBQQUJMRSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0ZJWEVEID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfTklMTEFCTEUgPSA4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9CTE9DS0VYVCA9IDE2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9CTE9DS1JFU1QgPSAzMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfQkxPQ0tTVUJTVCA9IDY0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9BQlNUUkFDVCA9IDEyODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfRklOQUxFWFQgPSAyNTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0ZJTkFMUkVTVCA9IDUxMjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUFJPUF9JU0FUVFIgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUFJPUF9KQVZBU0lOR0xFVE9OID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BST1BfSkFWQU9QVElPTkFMID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BST1BfSkFWQUFSUkFZID0gODsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX05PTkUgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX0dMT0JBTCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfTE9DQUxBVFRSID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9MT0NBTEVMVCA9IDM7Ci0KLSAgICAvLyB0eXBlIGZsYWdzCi0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX1NJTVBMRV9UWVBFICAgICA9IDB4MTsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfRE9DVU1FTlRfVFlQRSAgID0gMHgyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19PUkRFUkVEICAgICAgICAgPSAweDQ7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0JPVU5ERUQgICAgICAgICA9IDB4ODsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfRklOSVRFICAgICAgICAgID0gMHgxMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfTlVNRVJJQyAgICAgICAgID0gMHgyMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfU1RSSU5HRU5VTSAgICAgID0gMHg0MDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfVU5JT05fT0ZfTElTVFMgID0gMHg4MDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfSEFTX1BBVFRFUk4gICAgID0gMHgxMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX09SREVSX1NFTlNJVElWRSA9IDB4MjAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19UT1RBTF9PUkRFUiAgICAgPSAweDQwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ09NUElMRUQgICAgICAgID0gMHg4MDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0JMT0NLX0VYVCAgICAgICA9IDB4MTAwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfQkxPQ0tfUkVTVCAgICAgID0gMHgyMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSU5BTF9FWFQgICAgICAgPSAweDQwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZJTkFMX1JFU1QgICAgICA9IDB4ODAwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfRklOQUxfVU5JT04gICAgID0gMHgxMDAwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfRklOQUxfTElTVCAgICAgID0gMHgyMDAwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfQUJTVFJBQ1QgICAgICAgID0gMHg0MDAwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfQVRUUklCVVRFX1RZUEUgID0gMHg4MDAwMDsKLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5hbWVUb1BhdGhTdHJpbmcoU3RyaW5nIG5hbWVGb3JTeXN0ZW0pCi0gICAgewotICAgICAgICBuYW1lRm9yU3lzdGVtID0gbmFtZUZvclN5c3RlbS5yZXBsYWNlKCcuJywgJy8nKTsKLQotICAgICAgICBpZiAoIW5hbWVGb3JTeXN0ZW0uZW5kc1dpdGgoIi8iKSAmJiBuYW1lRm9yU3lzdGVtLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgIG5hbWVGb3JTeXN0ZW0gPSBuYW1lRm9yU3lzdGVtICsgIi8iOwotCi0gICAgICAgIHJldHVybiBuYW1lRm9yU3lzdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlU3lzdGVtSW1wbChDbGFzcyBpbmRleGNsYXNzKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGZ1bGxuYW1lID0gaW5kZXhjbGFzcy5nZXROYW1lKCk7Ci0gICAgICAgIF9uYW1lID0gZnVsbG5hbWUuc3Vic3RyaW5nKDAsIGZ1bGxuYW1lLmxhc3RJbmRleE9mKCcuJykpOwotICAgICAgICBYQmVhbkRlYnVnLnRyYWNlKFhCZWFuRGVidWcuVFJBQ0VfU0NIRU1BX0xPQURJTkcsICJMb2FkaW5nIHR5cGUgc3lzdGVtICIgKyBfbmFtZSwgMSk7Ci0gICAgICAgIF9iYXNlUGFja2FnZSA9IG5hbWVUb1BhdGhTdHJpbmcoX25hbWUpOwotICAgICAgICBfY2xhc3Nsb2FkZXIgPSBpbmRleGNsYXNzLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIF9saW5rZXIgPSBTY2hlbWFUeXBlTG9hZGVySW1wbC5idWlsZChudWxsLCBudWxsLCBfY2xhc3Nsb2FkZXIpOwotICAgICAgICBfcmVzb3VyY2VMb2FkZXIgPSBuZXcgQ2xhc3NMb2FkZXJSZXNvdXJjZUxvYWRlcihfY2xhc3Nsb2FkZXIpOwotICAgICAgICBpbml0RnJvbUhlYWRlcigpOwotICAgICAgICBYQmVhbkRlYnVnLnRyYWNlKFhCZWFuRGVidWcuVFJBQ0VfU0NIRU1BX0xPQURJTkcsICJGaW5pc2hlZCBsb2FkaW5nIHR5cGUgc3lzdGVtICIgKyBfbmFtZSwgLTEpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNjaGVtYVtdIEVNUFRZX1NDSEVNQV9BUlJBWSA9IG5ldyBTY2hlbWFbMF07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uZmlnW10gRU1QVFlfQ09ORklHX0FSUkFZID0gbmV3IENvbmZpZ1swXTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hVHlwZVN5c3RlbUltcGwgZm9yU2NoZW1hWG1sKAotICAgICAgICBYbWxPYmplY3RbXSBpbnB1dCwgU2NoZW1hVHlwZUxvYWRlciBsaW5rVG8sIFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICAgICAgICAgIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG9wdGlvbnMgPSBYbWxPcHRpb25zLm1hc2tOdWxsKG9wdGlvbnMpOwotICAgICAgICBBcnJheUxpc3Qgc2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQXJyYXlMaXN0IGNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlucHV0W2ldIGluc3RhbmNlb2YgU2NoZW1hKQotICAgICAgICAgICAgICAgIHNjaGVtYXMuYWRkKGlucHV0W2ldKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGlucHV0W2ldIGluc3RhbmNlb2YgU2NoZW1hRG9jdW1lbnQgJiYgKChTY2hlbWFEb2N1bWVudClpbnB1dFtpXSkuZ2V0U2NoZW1hKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzY2hlbWFzLmFkZCgoKFNjaGVtYURvY3VtZW50KWlucHV0W2ldKS5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChpbnB1dFtpXSBpbnN0YW5jZW9mIENvbmZpZykKLSAgICAgICAgICAgICAgICBjb25maWdzLmFkZChpbnB1dFtpXSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChpbnB1dFtpXSBpbnN0YW5jZW9mIENvbmZpZ0RvY3VtZW50ICYmICgoQ29uZmlnRG9jdW1lbnQpaW5wdXRbaV0pLmdldENvbmZpZygpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgY29uZmlncy5hZGQoKChDb25maWdEb2N1bWVudClpbnB1dFtpXSkuZ2V0Q29uZmlnKCkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxFeGNlcHRpb24oIlRocmVhZCAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKyAgIjogVGhlICIgKyBpICsgInRoIHN1cHBsaWVkIGlucHV0IGlzIG5vdCBhIHNjaGVtYSBvciBhIGNvbmZpZyBkb2N1bWVudDogaXRzIHR5cGUgaXMgIiArIGlucHV0W2ldLnNjaGVtYVR5cGUoKSk7Ci0gICAgICAgIH0KLQotCi0KLSAgICAgICAgQ29sbGVjdGlvbiB1c2VyRXJyb3JzID0gKENvbGxlY3Rpb24pb3B0aW9ucy5nZXQoWG1sT3B0aW9ucy5FUlJPUl9MSVNURU5FUik7Ci0gICAgICAgIFhtbEVycm9yV2F0Y2hlciBlcnJvcldhdGNoZXIgPSBuZXcgWG1sRXJyb3JXYXRjaGVyKHVzZXJFcnJvcnMpOwotCi0gICAgICAgIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIHN0c2kgPQotICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbUNvbXBpbGVyLmNvbXBpbGVJbXBsKAotICAgICAgICAgICAgICAgIG51bGwsIChTY2hlbWFbXSlzY2hlbWFzLnRvQXJyYXkoRU1QVFlfU0NIRU1BX0FSUkFZKSwKLSAgICAgICAgICAgICAgICAoQ29uZmlnW10pY29uZmlncy50b0FycmF5KEVNUFRZX0NPTkZJR19BUlJBWSksIGxpbmtUbywgb3B0aW9ucywgZXJyb3JXYXRjaGVyLCBmYWxzZSwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgaWYgKGVycm9yV2F0Y2hlci5oYXNFcnJvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sRXhjZXB0aW9uKGVycm9yV2F0Y2hlci5maXJzdEVycm9yKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0c2k7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGZpbGVDb250YWluc1R5cGVTeXN0ZW0oRmlsZSBmaWxlLCBTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBpbmRleG5hbWUgPSBuYW1lVG9QYXRoU3RyaW5nKG5hbWUpICsgImluZGV4LnhzYiI7Ci0KLSAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChuZXcgRmlsZShmaWxlLCBpbmRleG5hbWUpKS5pc0ZpbGUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFppcEZpbGUgemlwZmlsZSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB6aXBmaWxlID0gbmV3IFppcEZpbGUoZmlsZSk7Ci0gICAgICAgICAgICAgICAgWmlwRW50cnkgZW50cnkgPSB6aXBmaWxlLmdldEVudHJ5KGluZGV4bmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChlbnRyeSAhPSBudWxsICYmICFlbnRyeS5pc0RpcmVjdG9yeSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhCZWFuRGVidWcubG9nKCJQcm9ibGVtIGxvYWRpbmcgU2NoZW1hVHlwZVN5c3RlbSwgemlwZmlsZW5hbWUgIiArIGZpbGUpOwotICAgICAgICAgICAgICAgIFhCZWFuRGVidWcubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBuYW1lLCAiaW5kZXgiLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLklPX0VYQ0VQVElPTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHppcGZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsgemlwZmlsZS5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlU3lzdGVtSW1wbCBmb3JOYW1lKFN0cmluZyBuYW1lLCBDbGFzc0xvYWRlciBsb2FkZXIpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MgYyA9IENsYXNzLmZvck5hbWUobmFtZSArICIuIiArIFNjaGVtYVR5cGVDb2RlUHJpbnRlci5JTkRFWF9DTEFTU05BTUUsIHRydWUsIGxvYWRlcik7Ci0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGVTeXN0ZW1JbXBsKWMuZ2V0RmllbGQoInR5cGVTeXN0ZW0iKS5nZXQobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlU3lzdGVtSW1wbChSZXNvdXJjZUxvYWRlciByZXNvdXJjZUxvYWRlciwgU3RyaW5nIG5hbWUsIFNjaGVtYVR5cGVMb2FkZXIgbGlua2VyKQotICAgIHsKLSAgICAgICAgX25hbWUgPSBuYW1lOwotICAgICAgICBfYmFzZVBhY2thZ2UgPSBuYW1lVG9QYXRoU3RyaW5nKF9uYW1lKTsKLSAgICAgICAgX2xpbmtlciA9IGxpbmtlcjsKLSAgICAgICAgX3Jlc291cmNlTG9hZGVyID0gcmVzb3VyY2VMb2FkZXI7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0RnJvbUhlYWRlcigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhCZWFuRGVidWcubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXJyb3IgZSkKLSAgICAgICAgewotICAgICAgICAgICAgWEJlYW5EZWJ1Zy5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRGcm9tSGVhZGVyKCkKLSAgICB7Ci0gICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIlJlYWRpbmcgdW5yZXNvbHZlZCBoYW5kbGVzIGZvciB0eXBlIHN5c3RlbSAiICsgX25hbWUsIDApOwotICAgICAgICBYc2JSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFJlYWQgdGhlIGluZGV4IGZpbGUsIHdoaWNoIHN0YXJ0cyB3aXRoIGEgaGVhZGVyLgotICAgICAgICAgICAgcmVhZGVyID0gbmV3IFhzYlJlYWRlcigiaW5kZXgiLCBGSUxFVFlQRV9TQ0hFTUFJTkRFWCk7Ci0KLSAgICAgICAgICAgIC8vIGhhcyBhIGhhbmRsZSBwb29sIChjb3VudCwgaGFuZGxlL3R5cGUsIGhhbmRsZS90eXBlLi4uKQotICAgICAgICAgICAgX2xvY2FsSGFuZGxlcyA9IG5ldyBIYW5kbGVQb29sKCk7Ci0gICAgICAgICAgICByZWFkZXIucmVhZEhhbmRsZVBvb2woX2xvY2FsSGFuZGxlcyk7Ci0KLSAgICAgICAgICAgIC8vIHRoZW4gYSBxbmFtZSBtYXAgb2YgZ2xvYmFsIGVsZW1lbnRzIChjb3VudCwgcW5hbWUvaGFuZGxlLCBxbmFtZS9oYW5kbGUuLi4pCi0gICAgICAgICAgICBfZ2xvYmFsRWxlbWVudHMgPSByZWFkZXIucmVhZFFOYW1lUmVmTWFwKCk7Ci0KLSAgICAgICAgICAgIC8vIHFuYW1lIG1hcCBvZiBnbG9iYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgX2dsb2JhbEF0dHJpYnV0ZXMgPSByZWFkZXIucmVhZFFOYW1lUmVmTWFwKCk7Ci0KLSAgICAgICAgICAgIC8vIHFuYW1lIG1hcCBvZiBtb2RlbCBncm91cHMKLSAgICAgICAgICAgIF9tb2RlbEdyb3VwcyA9IHJlYWRlci5yZWFkUU5hbWVSZWZNYXAoKTsKLQotICAgICAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGF0dHJpYnV0ZSBncm91cHMKLSAgICAgICAgICAgIF9hdHRyaWJ1dGVHcm91cHMgPSByZWFkZXIucmVhZFFOYW1lUmVmTWFwKCk7Ci0KLSAgICAgICAgICAgIF9pZGVudGl0eUNvbnN0cmFpbnRzID0gcmVhZGVyLnJlYWRRTmFtZVJlZk1hcCgpOwotCi0gICAgICAgICAgICAvLyBxbmFtZSBtYXAgb2YgZ2xvYmFsIHR5cGVzCi0gICAgICAgICAgICBfZ2xvYmFsVHlwZXMgPSByZWFkZXIucmVhZFFOYW1lUmVmTWFwKCk7Ci0KLSAgICAgICAgICAgIC8vIHFuYW1lIG1hcCBvZiBkb2N1bWVudCB0eXBlcywgYnkgdGhlIHFuYW1lIG9mIHRoZSBjb250YWluZWQgZWxlbWVudAotICAgICAgICAgICAgX2RvY3VtZW50VHlwZXMgPSByZWFkZXIucmVhZFFOYW1lUmVmTWFwKCk7Ci0KLSAgICAgICAgICAgIC8vIHFuYW1lIG1hcGUgb2YgYXR0cmlidXRlIHR5cGVzLCBieSB0aGUgcW5hbWUgb2YgdGhlIGNvbnRhaW5lZCBhdHRyaWJ1dGUKLSAgICAgICAgICAgIF9hdHRyaWJ1dGVUeXBlcyA9IHJlYWRlci5yZWFkUU5hbWVSZWZNYXAoKTsKLQotICAgICAgICAgICAgLy8gc3RyaW5nIG1hcCBvZiBhbGwgdHlwZXMsIGJ5IGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUKLSAgICAgICAgICAgIF90eXBlUmVmc0J5Q2xhc3NuYW1lID0gcmVhZGVyLnJlYWRDbGFzc25hbWVSZWZNYXAoKTsKLQotICAgICAgICAgICAgX25hbWVzcGFjZXMgPSByZWFkZXIucmVhZE5hbWVzcGFjZXMoKTsKLQotICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgcmVkZWZpbmUsIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUKLSAgICAgICAgICAgIGlmIChyZWFkZXIuYXRMZWFzdCgyLCAxNSwgMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3JlZGVmaW5lZEdsb2JhbFR5cGVzID0gcmVhZGVyLnJlYWRRTmFtZVJlZk1hcCgpOwotICAgICAgICAgICAgICAgIF9yZWRlZmluZWRNb2RlbEdyb3VwcyA9IHJlYWRlci5yZWFkUU5hbWVSZWZNYXAoKTsKLSAgICAgICAgICAgICAgICBfcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzID0gcmVhZGVyLnJlYWRRTmFtZVJlZk1hcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkRW5kKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHNhdmVJbmRleCgpCi0gICAgewotICAgICAgICBTdHJpbmcgaGFuZGxlID0gImluZGV4IjsKLSAgICAgICAgWHNiUmVhZGVyIHNhdmVyID0gbmV3IFhzYlJlYWRlcihoYW5kbGUpOwotICAgICAgICBzYXZlci53cml0ZUluZGV4RGF0YSgpOwotICAgICAgICBzYXZlci53cml0ZVJlYWxIZWFkZXIoaGFuZGxlLCBGSUxFVFlQRV9TQ0hFTUFJTkRFWCk7Ci0gICAgICAgIHNhdmVyLndyaXRlSW5kZXhEYXRhKCk7Ci0gICAgICAgIHNhdmVyLndyaXRlRW5kKCk7Ci0gICAgfQotCi0gICAgdm9pZCBzYXZlUG9pbnRlcnMoKQotICAgIHsKLSAgICAgICAgc2F2ZVBvaW50ZXJzRm9yQ29tcG9uZW50cyhnbG9iYWxFbGVtZW50cygpLCAic2NoZW1hL2VsZW1lbnQvIik7Ci0gICAgICAgIHNhdmVQb2ludGVyc0ZvckNvbXBvbmVudHMoZ2xvYmFsQXR0cmlidXRlcygpLCAic2NoZW1hL2F0dHJpYnV0ZS8iKTsKLSAgICAgICAgc2F2ZVBvaW50ZXJzRm9yQ29tcG9uZW50cyhtb2RlbEdyb3VwcygpLCAic2NoZW1hL21vZGVsZ3JvdXAvIik7Ci0gICAgICAgIHNhdmVQb2ludGVyc0ZvckNvbXBvbmVudHMoYXR0cmlidXRlR3JvdXBzKCksICJzY2hlbWEvYXR0cmlidXRlZ3JvdXAvIik7Ci0gICAgICAgIHNhdmVQb2ludGVyc0ZvckNvbXBvbmVudHMoZ2xvYmFsVHlwZXMoKSwgInNjaGVtYS90eXBlLyIpOwotICAgICAgICBzYXZlUG9pbnRlcnNGb3JDb21wb25lbnRzKGlkZW50aXR5Q29uc3RyYWludHMoKSwgInNjaGVtYS9pZGVudGl0eWNvbnN0cmFpbnQvIik7Ci0gICAgICAgIHNhdmVQb2ludGVyc0Zvck5hbWVzcGFjZXMoX25hbWVzcGFjZXMsICJzY2hlbWEvbmFtZXNwYWNlLyIpOwotICAgICAgICBzYXZlUG9pbnRlcnNGb3JDbGFzc25hbWVzKF90eXBlUmVmc0J5Q2xhc3NuYW1lLmtleVNldCgpLCAic2NoZW1hL2phdmFuYW1lLyIpOwotICAgICAgICBzYXZlUG9pbnRlcnNGb3JDb21wb25lbnRzKHJlZGVmaW5lZE1vZGVsR3JvdXBzKCksICJzY2hlbWEvcmVkZWZpbmVkbW9kZWxncm91cC8iKTsKLSAgICAgICAgc2F2ZVBvaW50ZXJzRm9yQ29tcG9uZW50cyhyZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMoKSwgInNjaGVtYS9yZWRlZmluZWRhdHRyaWJ1dGVncm91cC8iKTsKLSAgICAgICAgc2F2ZVBvaW50ZXJzRm9yQ29tcG9uZW50cyhyZWRlZmluZWRHbG9iYWxUeXBlcygpLCAic2NoZW1hL3JlZGVmaW5lZHR5cGUvIik7Ci0gICAgfQotCi0gICAgdm9pZCBzYXZlUG9pbnRlcnNGb3JDb21wb25lbnRzKFNjaGVtYUNvbXBvbmVudFtdIGNvbXBvbmVudHMsIFN0cmluZyBkaXIpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNhdmVQb2ludGVyRmlsZShkaXIgKyBRTmFtZUhlbHBlci5oZXhzYWZlZGlyKGNvbXBvbmVudHNbaV0uZ2V0TmFtZSgpKSwgX25hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBzYXZlUG9pbnRlcnNGb3JDbGFzc25hbWVzKFNldCBjbGFzc25hbWVzLCBTdHJpbmcgZGlyKQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY2xhc3NuYW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgIHNhdmVQb2ludGVyRmlsZShkaXIgKyBjbGFzc25hbWUucmVwbGFjZSgnLicsICcvJyksIF9uYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2F2ZVBvaW50ZXJzRm9yTmFtZXNwYWNlcyhTZXQgbmFtZXNwYWNlcywgU3RyaW5nIGRpcikKLSAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5hbWVzcGFjZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5zID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgIHNhdmVQb2ludGVyRmlsZShkaXIgKyBRTmFtZUhlbHBlci5oZXhzYWZlZGlyKG5ldyBRTmFtZShucywgInhtbG5zIikpLCBfbmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHNhdmVQb2ludGVyRmlsZShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgWHNiUmVhZGVyIHNhdmVyID0gbmV3IFhzYlJlYWRlcihmaWxlbmFtZSk7Ci0gICAgICAgIHNhdmVyLndyaXRlU3RyaW5nKG5hbWUpOwotICAgICAgICBzYXZlci53cml0ZVJlYWxIZWFkZXIoZmlsZW5hbWUsIEZJTEVUWVBFX1NDSEVNQVBPSU5URVIpOwotICAgICAgICBzYXZlci53cml0ZVN0cmluZyhuYW1lKTsKLSAgICAgICAgc2F2ZXIud3JpdGVFbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IHVzZWQgaW4gdGhlIG5vbmJvb3RzdHJhcHBlZCBjYXNlLgotICAgICAqLwotICAgIHByaXZhdGUgTWFwIGJ1aWxkVHlwZVJlZnNCeUNsYXNzbmFtZSgpCi0gICAgewotICAgICAgICBMaXN0IGFsbFNlZW5UeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChkb2N1bWVudFR5cGVzKCkpKTsKLSAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGF0dHJpYnV0ZVR5cGVzKCkpKTsKLSAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGdsb2JhbFR5cGVzKCkpKTsKLQotICAgICAgICAvLyBub3cgZnVsbHkgamF2YWl6ZSBldmVyeXRoaW5nIGRlZXBseS4KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxTZWVuVHlwZXMuc2l6ZSgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgZ1R5cGUgPSAoU2NoZW1hVHlwZSlhbGxTZWVuVHlwZXMuZ2V0KGkpOwotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdUeXBlLmdldEZ1bGxKYXZhTmFtZSgpOwotICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoY2xhc3NOYW1lLnJlcGxhY2UoJyQnLCAnLicpLCBnVHlwZS5nZXRSZWYoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ1R5cGUuZ2V0QW5vbnltb3VzVHlwZXMoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXAgYnVpbGRUeXBlUmVmc0J5Q2xhc3NuYW1lKE1hcCB0eXBlc0J5Q2xhc3NuYW1lKQotICAgIHsKLSAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHR5cGVzQnlDbGFzc25hbWUua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICByZXN1bHQucHV0KGNsYXNzTmFtZSwgKChTY2hlbWFUeXBlKXR5cGVzQnlDbGFzc25hbWUuZ2V0KGNsYXNzTmFtZSkpLmdldFJlZigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBidWlsZENvbXBvbmVudFJlZk1hcChTY2hlbWFDb21wb25lbnRbXSBjb21wb25lbnRzKQotICAgIHsKLSAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoY29tcG9uZW50c1tpXS5nZXROYW1lKCksIGNvbXBvbmVudHNbaV0uZ2V0Q29tcG9uZW50UmVmKCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBidWlsZERvY3VtZW50TWFwKFNjaGVtYVR5cGVbXSB0eXBlcykKLSAgICB7Ci0gICAgICAgIE1hcCByZXN1bHQgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgcmVzdWx0LnB1dCh0eXBlc1tpXS5nZXREb2N1bWVudEVsZW1lbnROYW1lKCksIHR5cGVzW2ldLmdldFJlZigpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgYnVpbGRBdHRyaWJ1dGVUeXBlTWFwKFNjaGVtYVR5cGVbXSB0eXBlcykKLSAgICB7Ci0gICAgICAgIE1hcCByZXN1bHQgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgcmVzdWx0LnB1dCh0eXBlc1tpXS5nZXRBdHRyaWJ1dGVUeXBlQXR0cmlidXRlTmFtZSgpLCB0eXBlc1tpXS5nZXRSZWYoKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUmFuZG9tIF9yYW5kb207Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIF9tYXNrID0gbmV3IGJ5dGVbMTI4IC8gOF07Ci0KLSAgICAvKioKLSAgICAgKiBGdW4sIGZ1bi4gIFByb2R1Y2UgMTI4IGJpdHMgb2YgdW5pcXVlbmVzcyByYW5kb21seS4KLSAgICAgKiBXZSB1c2VkIHRvIHVzZSBTZWN1cmVSYW5kb20sIGJ1dCBub3cgd2UgZG9uJ3QgYmVjYXVzZSBTZWN1cmVSYW5kb20KLSAgICAgKiBoaXRzIHRoZSBmaWxlc3lzdGVtIGFuZCBoYW5ncyB1cyBvbiBhIGZpbGVzeXN0ZW0gbG9jay4gIEl0IGFsc28gZWF0cwotICAgICAqIGEgdGhyZWFkIGFuZCBvdGhlciBleHBlbnNpdmUgcmVzb3VyY2VzLi4gOi0pLgotICAgICAqCi0gICAgICogV2UgZG9uJ3QgcmVhbGx5IGNhcmUgdGhhdCBub24tc2VjdXJlIFJhbmRvbSgpIGNhbiBvbmx5IGRvIDQ4IGJpdHMgb2YKLSAgICAgKiByYW5kb21uZXNzLCBzaW5jZSB3ZSdyZSBjZXJ0YWlubHkgbm90IGdvaW5nIHRvIGJlIGNhbGxlZCBtb3JlIHRoYW4gMl40OAotICAgICAqIHRpbWVzIHdpdGhpbiBvdXIgcHJvY2VzcyBsaWZldGltZS4KLSAgICAgKgotICAgICAqIE91ciByZWFsIGNvbmNlcm4gaXMgdGhhdCBieSBzZWVkaW5nIFJhbmRvbSgpIHdpdGggdGhlIGN1cnJlbnQKLSAgICAgKiB0aW1lLCB0d28gdXNlcnMgd2lsbCBlbmQgdXAgd2l0aCB0aGUgc2FtZSBiaXRzIGlmIHRoZXkgc3RhcnQgYQotICAgICAqIHNjaGVtYSBjb21waWxhdGlvbiB3aXRoaW4gdGhlIHNhbWUgbWlsbGlzZWNvbmQuICBUaGF0IG1ha2VzIHRoZQotICAgICAqIHByb2JhYmlsaXR5IG9mIGNvbGxpc2lvbiBpbiB0aGUgcmVhbCB3b3JsZCBzbGlnaHRseSB0b28gaGlnaC4KLSAgICAgKiBXZSdyZSBnb2luZyB0byBoYXZlIG1pbGxpb25zIG9mIHVzZXJzLCByZW1lbWJlcj8gIFdpdGggYSBtaWxsaW9uCi0gICAgICogdXNlcnMsIGFuZCBvbmUtY29tcGlsYXRpb24tcGVyLWRheSBlYWNoLCB3ZSdkIHNlZSBhIGNvbGxpc2lvbiBldmVyeQotICAgICAqIGZldyBtb250aHMuCi0gICAgICoKLSAgICAgKiBTbyB3ZSdsbCBqdXN0IHhvciB0aGUgcmVzdWx0cyBvZiByYW5kb20gd2l0aCBvdXIgZmV3IGV4dHJhCi0gICAgICogYml0cyBvZiBpbmZvcm1hdGlvbiBjb21wdXRlZCBiZWxvdyB0byBoZWxwIHJlZHVjZSB0aGUgcHJvYmFiaWxpdHkKLSAgICAgKiBvZiBjb2xsaXNpb24gYnkgYSBmZXcgZGVjaW1hbCBwbGFjZXMuICBUbyBjb2xsaWRlLCB5b3Ugd2lsbCBoYXZlIGhhZAotICAgICAqIHRvIGhhdmUgdGhlIHNhbWUgYW1vdW50IG9mIGZyZWUgbWVtb3J5LCB0aGUgc2FtZSB1c2VyIG5hbWUsIHRpbWV6b25lLAotICAgICAqIGFuZCBjb3VudHJ5LCB0aGUgc2FtZSBjdXJyZW50IGRpcmVjdG9yeSwgdGhlIHNhbWUgamF2YSBjbGFzc3BhdGgsCi0gICAgICogdGhlIHNhbWUgb3BlcmF0aW5nIHN5c3RlbSBhbmQganZtIHZlcnNpb24sIGFuZCB0aGUgc2FtZSBjaG9pY2VzIG9mCi0gICAgICogaWRlbnRpdHkgaGFzaGNvZGVzIGZvciBhIGZldyBvYmplY3RzLiBBbmQgYmUgc3RhcnRlZCB3aXRoaW4gdGhlIHNhbWUKLSAgICAgKiBtaWxsaXNlY29uZC4gT3IgeW91IGNhbiBjb2xsaWRlIGlmIHlvdSBoYXZlIGEgY29zbWljIDEyOC1iaXQgbWF0aGVtYXRpY2FsCi0gICAgICogY29pbmNpZGVuY2UuIE5vIHdvcnJpZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbmV4dEJ5dGVzKGJ5dGVbXSByZXN1bHQpCi0gICAgewotICAgICAgICBpZiAoX3JhbmRvbSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBEYXRhT3V0cHV0U3RyZWFtIGRhb3MgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShiYW9zKTsKLQotICAgICAgICAgICAgICAgIC8vIGF0IGxlYXN0IDEwIGJpdHMgb2YgdW5xaWV1ZW5lc3MsIHJpZ2h0PyAgTWF5YmUgZXZlbiA1MCBvciA2MC4KLSAgICAgICAgICAgICAgICBkYW9zLndyaXRlSW50KFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKFNjaGVtYVR5cGVTeXN0ZW1JbXBsLmNsYXNzKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcHJvcHMgPSBuZXcgU3RyaW5nW10geyAidXNlci5uYW1lIiwgInVzZXIuZGlyIiwgInVzZXIudGltZXpvbmUiLCAidXNlci5jb3VudHJ5IiwgImphdmEuY2xhc3MucGF0aCIsICJqYXZhLmhvbWUiLCAiamF2YS52ZW5kb3IiLCAiamF2YS52ZXJzaW9uIiwgIm9zLnZlcnNpb24iIH07Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wID0gU3lzdGVtLmdldFByb3BlcnR5KHByb3BzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZGFvcy53cml0ZVVURihwcm9wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhb3Mud3JpdGVJbnQoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUocHJvcCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRhb3Mud3JpdGVMb25nKFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKSk7Ci0gICAgICAgICAgICAgICAgZGFvcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IGJhb3MudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGogPSBpICUgX21hc2subGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICBfbWFza1tqXSAqPSAyMTsKLSAgICAgICAgICAgICAgICAgICAgX21hc2tbal0gKz0gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYQmVhbkRlYnVnLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgX3JhbmRvbSA9IG5ldyBSYW5kb20oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotICAgICAgICB9Ci0gICAgICAgIF9yYW5kb20ubmV4dEJ5dGVzKHJlc3VsdCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaiA9IGkgJiBfbWFzay5sZW5ndGg7Ci0gICAgICAgICAgICByZXN1bHRbaV0gXj0gX21hc2tbal07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbUltcGwoU3RyaW5nIG5hbWVGb3JTeXN0ZW0pCi0gICAgewotICAgICAgICAvLyBpZiB3ZSBoYXZlIG5vIG5hbWUsIHNlbGVjdCBhIHJhbmRvbSBvbmUKLSAgICAgICAgaWYgKG5hbWVGb3JTeXN0ZW0gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZ2V0IDEyOCByYW5kb20gYml0cyAodGhhdCdsbCBiZSAzMiBoZXggZGlnaXRzKQotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMTI4LzhdOwotICAgICAgICAgICAgbmV4dEJ5dGVzKGJ5dGVzKTsKLSAgICAgICAgICAgIG5hbWVGb3JTeXN0ZW0gPSAicyIgKyBuZXcgU3RyaW5nKEhleEJpbi5lbmNvZGUoYnl0ZXMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9uYW1lID0gInNjaGVtYS5zeXN0ZW0uIiArIG5hbWVGb3JTeXN0ZW07Ci0gICAgICAgIF9iYXNlUGFja2FnZSA9IG5hbWVUb1BhdGhTdHJpbmcoX25hbWUpOwotICAgICAgICBfY2xhc3Nsb2FkZXIgPSBudWxsOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbG9hZEZyb21CdWlsZGVyKFNjaGVtYUdsb2JhbEVsZW1lbnRbXSBnbG9iYWxFbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hR2xvYmFsQXR0cmlidXRlW10gZ2xvYmFsQXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZVtdIGdsb2JhbFR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlW10gZG9jdW1lbnRUeXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZVtdIGF0dHJpYnV0ZVR5cGVzKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KF9jbGFzc2xvYWRlciA9PSBudWxsKTsKLSAgICAgICAgX2xvY2FsSGFuZGxlcyA9IG5ldyBIYW5kbGVQb29sKCk7Ci0gICAgICAgIF9nbG9iYWxFbGVtZW50cyA9IGJ1aWxkQ29tcG9uZW50UmVmTWFwKGdsb2JhbEVsZW1lbnRzKTsKLSAgICAgICAgX2dsb2JhbEF0dHJpYnV0ZXMgPSBidWlsZENvbXBvbmVudFJlZk1hcChnbG9iYWxBdHRyaWJ1dGVzKTsKLSAgICAgICAgX2dsb2JhbFR5cGVzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoZ2xvYmFsVHlwZXMpOwotICAgICAgICBfZG9jdW1lbnRUeXBlcyA9IGJ1aWxkRG9jdW1lbnRNYXAoZG9jdW1lbnRUeXBlcyk7Ci0gICAgICAgIF9hdHRyaWJ1dGVUeXBlcyA9IGJ1aWxkRG9jdW1lbnRNYXAoYXR0cmlidXRlVHlwZXMpOwotICAgICAgICBfdHlwZVJlZnNCeUNsYXNzbmFtZSA9IGJ1aWxkVHlwZVJlZnNCeUNsYXNzbmFtZSgpOwotICAgICAgICBfbmFtZXNwYWNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbG9hZEZyb21TdHNjU3RhdGUoU3RzY1N0YXRlIHN0YXRlKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KF9jbGFzc2xvYWRlciA9PSBudWxsKTsKLSAgICAgICAgX2xvY2FsSGFuZGxlcyA9IG5ldyBIYW5kbGVQb29sKCk7Ci0gICAgICAgIF9nbG9iYWxFbGVtZW50cyA9IGJ1aWxkQ29tcG9uZW50UmVmTWFwKHN0YXRlLmdsb2JhbEVsZW1lbnRzKCkpOwotICAgICAgICBfZ2xvYmFsQXR0cmlidXRlcyA9IGJ1aWxkQ29tcG9uZW50UmVmTWFwKHN0YXRlLmdsb2JhbEF0dHJpYnV0ZXMoKSk7Ci0gICAgICAgIF9tb2RlbEdyb3VwcyA9IGJ1aWxkQ29tcG9uZW50UmVmTWFwKHN0YXRlLm1vZGVsR3JvdXBzKCkpOwotICAgICAgICBfcmVkZWZpbmVkTW9kZWxHcm91cHMgPSBidWlsZENvbXBvbmVudFJlZk1hcChzdGF0ZS5yZWRlZmluZWRNb2RlbEdyb3VwcygpKTsKLSAgICAgICAgX2F0dHJpYnV0ZUdyb3VwcyA9IGJ1aWxkQ29tcG9uZW50UmVmTWFwKHN0YXRlLmF0dHJpYnV0ZUdyb3VwcygpKTsKLSAgICAgICAgX3JlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwcyA9IGJ1aWxkQ29tcG9uZW50UmVmTWFwKHN0YXRlLnJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwcygpKTsKLSAgICAgICAgX2dsb2JhbFR5cGVzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoc3RhdGUuZ2xvYmFsVHlwZXMoKSk7Ci0gICAgICAgIF9yZWRlZmluZWRHbG9iYWxUeXBlcyA9IGJ1aWxkQ29tcG9uZW50UmVmTWFwKHN0YXRlLnJlZGVmaW5lZEdsb2JhbFR5cGVzKCkpOwotICAgICAgICBfZG9jdW1lbnRUeXBlcyA9IGJ1aWxkRG9jdW1lbnRNYXAoc3RhdGUuZG9jdW1lbnRUeXBlcygpKTsKLSAgICAgICAgX2F0dHJpYnV0ZVR5cGVzID0gYnVpbGRBdHRyaWJ1dGVUeXBlTWFwKHN0YXRlLmF0dHJpYnV0ZVR5cGVzKCkpOwotICAgICAgICBfdHlwZVJlZnNCeUNsYXNzbmFtZSA9IGJ1aWxkVHlwZVJlZnNCeUNsYXNzbmFtZShzdGF0ZS50eXBlc0J5Q2xhc3NuYW1lKCkpOwotICAgICAgICBfaWRlbnRpdHlDb25zdHJhaW50cyA9IGJ1aWxkQ29tcG9uZW50UmVmTWFwKHN0YXRlLmlkQ29uc3RyYWludHMoKSk7Ci0gICAgICAgIF9uYW1lc3BhY2VzID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChzdGF0ZS5nZXROYW1lc3BhY2VzKCkpKTsKLSAgICB9Ci0KLSAgICBmaW5hbCBTY2hlbWFUeXBlU3lzdGVtSW1wbCBnZXRUeXBlU3lzdGVtKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBTdHJpbmdQb29sCi0gICAgewotICAgICAgICBwcml2YXRlIExpc3QgaW50c1RvU3RyaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcHJpdmF0ZSBNYXAgc3RyaW5nc1RvSW50cyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIF9oYW5kbGU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIF9uYW1lOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IFN0cmluZ1Bvb2wgdG8gYmUgZmlsbGVkIHdpdGggc3RyaW5ncy4KLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZ1Bvb2woU3RyaW5nIGhhbmRsZSwgU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9oYW5kbGUgPSBoYW5kbGU7Ci0gICAgICAgICAgICBfbmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICBpbnRzVG9TdHJpbmdzLmFkZChudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBjb2RlRm9yU3RyaW5nKFN0cmluZyBzdHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIEludGVnZXIgcmVzdWx0ID0gKEludGVnZXIpc3RyaW5nc1RvSW50cy5nZXQoc3RyKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgSW50ZWdlcihpbnRzVG9TdHJpbmdzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgaW50c1RvU3RyaW5ncy5hZGQoc3RyKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdzVG9JbnRzLnB1dChzdHIsIHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmludFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgc3RyaW5nRm9yQ29kZShpbnQgY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKWludHNUb1N0cmluZ3MuZ2V0KGNvZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZVRvKERhdGFPdXRwdXRTdHJlYW0gb3V0cHV0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaW50c1RvU3RyaW5ncy5zaXplKCkgPiBTaG9ydC5NQVhfVkFMVUUpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIlRvbyBtYW55IHN0cmluZ3MgKCIgKyBpbnRzVG9TdHJpbmdzLnNpemUoKSArICIpIiwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU5UX1RPT19MQVJHRSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZVNob3J0KGludHNUb1N0cmluZ3Muc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpID0gaW50c1RvU3RyaW5ncy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIGZvciAoaS5uZXh0KCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RyID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlVVRGKHN0cik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLklPX0VYQ0VQVElPTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHJlYWRGcm9tKERhdGFJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGludHNUb1N0cmluZ3Muc2l6ZSgpICE9IDEgfHwgc3RyaW5nc1RvSW50cy5zaXplKCkgIT0gMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBzaXplID0gaW5wdXQucmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzaXplOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RyID0gaW5wdXQucmVhZFVURigpLmludGVybigpOwotICAgICAgICAgICAgICAgICAgICBpbnQgY29kZSA9IGNvZGVGb3JTdHJpbmcoc3RyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgIT0gaSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gZS5nZXRNZXNzYWdlKCkgOiAiSU8gRXhjZXB0aW9uIiwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU9fRVhDRVBUSU9OLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsYXNzIEhhbmRsZVBvb2wKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgTWFwIF9oYW5kbGVzVG9SZWZzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgcHJpdmF0ZSBNYXAgX2NvbXBvbmVudHNUb0hhbmRsZXMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOyAvLyBwb3B1bGF0ZWQgb24gd3JpdGUKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIF9zdGFydGVkOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IEhhbmRsZVBvb2wgdG8gYmUgcG9wdWxhdGVkLgotICAgICAgICAgKi8KLSAgICAgICAgSGFuZGxlUG9vbCgpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGFkZFVuaXF1ZUhhbmRsZShTY2hlbWFDb21wb25lbnQgb2JqLCBTdHJpbmcgYmFzZSkKLSAgICAgICAgewotICAgICAgICAgICAgYmFzZSA9IGJhc2UudG9Mb3dlckNhc2UoKTsgIC8vIHdlIGxvd2VyY2FzZSBoYW5kbGVzIGJlY2F1c2Ugb2YgY2FzZS1pbnNlbnNpdGl2ZSBXaW5kb3dzIGZpbGVuYW1lcyEhIQotICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IGJhc2U7Ci0gICAgICAgICAgICBmb3IgKGludCBpbmRleCA9IDI7IF9oYW5kbGVzVG9SZWZzLmNvbnRhaW5zS2V5KGhhbmRsZSk7IGluZGV4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlID0gYmFzZSArIGluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2hhbmRsZXNUb1JlZnMucHV0KGhhbmRsZSwgb2JqLmdldENvbXBvbmVudFJlZigpKTsKLSAgICAgICAgICAgIF9jb21wb25lbnRzVG9IYW5kbGVzLnB1dChvYmosIGhhbmRsZSk7Ci0gICAgICAgICAgICByZXR1cm4gaGFuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGhhbmRsZUZvckNvbXBvbmVudChTY2hlbWFDb21wb25lbnQgY29tcCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbXAgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIGlmIChjb21wLmdldFR5cGVTeXN0ZW0oKSAhPSBnZXRUeXBlU3lzdGVtKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IHN1cHBseSBoYW5kbGVzIGZvciB0eXBlcyBmcm9tIGFub3RoZXIgdHlwZSBzeXN0ZW0iKTsKLSAgICAgICAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgU2NoZW1hVHlwZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlRm9yVHlwZSgoU2NoZW1hVHlwZSljb21wKTsKLSAgICAgICAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgU2NoZW1hR2xvYmFsRWxlbWVudCkKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlRm9yRWxlbWVudCgoU2NoZW1hR2xvYmFsRWxlbWVudCljb21wKTsKLSAgICAgICAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgU2NoZW1hR2xvYmFsQXR0cmlidXRlKQotICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVGb3JBdHRyaWJ1dGUoKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSljb21wKTsKLSAgICAgICAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgU2NoZW1hTW9kZWxHcm91cCkKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlRm9yTW9kZWxHcm91cCgoU2NoZW1hTW9kZWxHcm91cCljb21wKTsKLSAgICAgICAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgU2NoZW1hQXR0cmlidXRlR3JvdXApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUZvckF0dHJpYnV0ZUdyb3VwKChTY2hlbWFBdHRyaWJ1dGVHcm91cCljb21wKTsKLSAgICAgICAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50KQotICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVGb3JJZGVudGl0eUNvbnN0cmFpbnQoKFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCljb21wKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbXBvbmVudCB0eXBlIGNhbm5vdCBoYXZlIGEgaGFuZGxlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgaGFuZGxlRm9yRWxlbWVudChTY2hlbWFHbG9iYWxFbGVtZW50IGVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRUeXBlU3lzdGVtKCkgIT0gZ2V0VHlwZVN5c3RlbSgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBzdXBwbHkgaGFuZGxlcyBmb3IgdHlwZXMgZnJvbSBhbm90aGVyIHR5cGUgc3lzdGVtIik7Ci0gICAgICAgICAgICBTdHJpbmcgaGFuZGxlID0gKFN0cmluZylfY29tcG9uZW50c1RvSGFuZGxlcy5nZXQoZWxlbWVudCk7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlID09IG51bGwpCi0gICAgICAgICAgICAgICAgaGFuZGxlID0gYWRkVW5pcXVlSGFuZGxlKGVsZW1lbnQsIE5hbWVVdGlsLnVwcGVyQ2FtZWxDYXNlKGVsZW1lbnQuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKSArICJFbGVtZW50Iik7Ci0gICAgICAgICAgICByZXR1cm4gaGFuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGhhbmRsZUZvckF0dHJpYnV0ZShTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgYXR0cmlidXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRlID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRlLmdldFR5cGVTeXN0ZW0oKSAhPSBnZXRUeXBlU3lzdGVtKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IHN1cHBseSBoYW5kbGVzIGZvciB0eXBlcyBmcm9tIGFub3RoZXIgdHlwZSBzeXN0ZW0iKTsKLSAgICAgICAgICAgIFN0cmluZyBoYW5kbGUgPSAoU3RyaW5nKV9jb21wb25lbnRzVG9IYW5kbGVzLmdldChhdHRyaWJ1dGUpOwotICAgICAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGhhbmRsZSA9IGFkZFVuaXF1ZUhhbmRsZShhdHRyaWJ1dGUsIE5hbWVVdGlsLnVwcGVyQ2FtZWxDYXNlKGF0dHJpYnV0ZS5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpICsgIkF0dHJpYnV0ZSIpOwotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBoYW5kbGVGb3JNb2RlbEdyb3VwKFNjaGVtYU1vZGVsR3JvdXAgZ3JvdXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChncm91cCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgaWYgKGdyb3VwLmdldFR5cGVTeXN0ZW0oKSAhPSBnZXRUeXBlU3lzdGVtKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IHN1cHBseSBoYW5kbGVzIGZvciB0eXBlcyBmcm9tIGFub3RoZXIgdHlwZSBzeXN0ZW0iKTsKLSAgICAgICAgICAgIFN0cmluZyBoYW5kbGUgPSAoU3RyaW5nKV9jb21wb25lbnRzVG9IYW5kbGVzLmdldChncm91cCk7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlID09IG51bGwpCi0gICAgICAgICAgICAgICAgaGFuZGxlID0gYWRkVW5pcXVlSGFuZGxlKGdyb3VwLCBOYW1lVXRpbC51cHBlckNhbWVsQ2FzZShncm91cC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpICsgIk1vZGVsR3JvdXAiKTsKLSAgICAgICAgICAgIHJldHVybiBoYW5kbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgaGFuZGxlRm9yQXR0cmlidXRlR3JvdXAoU2NoZW1hQXR0cmlidXRlR3JvdXAgZ3JvdXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChncm91cCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgaWYgKGdyb3VwLmdldFR5cGVTeXN0ZW0oKSAhPSBnZXRUeXBlU3lzdGVtKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IHN1cHBseSBoYW5kbGVzIGZvciB0eXBlcyBmcm9tIGFub3RoZXIgdHlwZSBzeXN0ZW0iKTsKLSAgICAgICAgICAgIFN0cmluZyBoYW5kbGUgPSAoU3RyaW5nKV9jb21wb25lbnRzVG9IYW5kbGVzLmdldChncm91cCk7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlID09IG51bGwpCi0gICAgICAgICAgICAgICAgaGFuZGxlID0gYWRkVW5pcXVlSGFuZGxlKGdyb3VwLCBOYW1lVXRpbC51cHBlckNhbWVsQ2FzZShncm91cC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpICsgIkF0dHJpYnV0ZUdyb3VwIik7Ci0gICAgICAgICAgICByZXR1cm4gaGFuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGhhbmRsZUZvcklkZW50aXR5Q29uc3RyYWludChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgaWRjKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaWRjID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBpZiAoaWRjLmdldFR5cGVTeXN0ZW0oKSAhPSBnZXRUeXBlU3lzdGVtKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IHN1cHBseSBoYW5kbGVzIGZvciB0eXBlcyBmcm9tIGFub3RoZXIgdHlwZSBzeXN0ZW0iKTsKLSAgICAgICAgICAgIFN0cmluZyBoYW5kbGUgPSAoU3RyaW5nKV9jb21wb25lbnRzVG9IYW5kbGVzLmdldChpZGMpOwotICAgICAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGhhbmRsZSA9IGFkZFVuaXF1ZUhhbmRsZShpZGMsIE5hbWVVdGlsLnVwcGVyQ2FtZWxDYXNlKGlkYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpICsgIklkZW50aXR5Q29uc3RyYWludCIpOwotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBoYW5kbGVGb3JUeXBlKFNjaGVtYVR5cGUgdHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIGlmICh0eXBlLmdldFR5cGVTeXN0ZW0oKSAhPSBnZXRUeXBlU3lzdGVtKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IHN1cHBseSBoYW5kbGVzIGZvciB0eXBlcyBmcm9tIGFub3RoZXIgdHlwZSBzeXN0ZW0iKTsKLSAgICAgICAgICAgIFN0cmluZyBoYW5kbGUgPSAoU3RyaW5nKV9jb21wb25lbnRzVG9IYW5kbGVzLmdldCh0eXBlKTsKLSAgICAgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN1ZmZpeCA9ICIiOwotICAgICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0RvY3VtZW50VHlwZSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gdHlwZS5nZXREb2N1bWVudEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAiRG9jIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlLmlzQXR0cmlidXRlVHlwZSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gdHlwZS5nZXRBdHRyaWJ1dGVUeXBlQXR0cmlidXRlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gIkF0dHJUeXBlIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlLmdldENvbnRhaW5lckZpZWxkKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHR5cGUuZ2V0Q29udGFpbmVyRmllbGQoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSB0eXBlLmdldENvbnRhaW5lckZpZWxkKCkuaXNBdHRyaWJ1dGUoKSA/ICJBdHRyIiA6ICJFbGVtIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlTmFtZTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdW5pcSA9IEludGVnZXIudG9IZXhTdHJpbmcodHlwZS50b1N0cmluZygpLmhhc2hDb2RlKCkgfCAweDgwMDAwMDAwKS5zdWJzdHJpbmcoNCkudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBiYXNlTmFtZSA9ICJBbm9uIiArIHVuaXEgKyAiVHlwZSI7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBiYXNlTmFtZSA9IE5hbWVVdGlsLnVwcGVyQ2FtZWxDYXNlKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpICsgdW5pcSArIHN1ZmZpeCArICJUeXBlIjsKLQotICAgICAgICAgICAgICAgIGhhbmRsZSA9IGFkZFVuaXF1ZUhhbmRsZSh0eXBlLCBiYXNlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBoYW5kbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFDb21wb25lbnQuUmVmIHJlZkZvckhhbmRsZShTdHJpbmcgaGFuZGxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hQ29tcG9uZW50LlJlZilfaGFuZGxlc1RvUmVmcy5nZXQoaGFuZGxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNldCBnZXRBbGxIYW5kbGVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9oYW5kbGVzVG9SZWZzLmtleVNldCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzdGFydFdyaXRlTW9kZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9zdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIF9jb21wb25lbnRzVG9IYW5kbGVzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9oYW5kbGVzVG9SZWZzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IChTdHJpbmcpaS5uZXh0KCk7Ci0vLyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIldyaXRpbmcgcHJlZXhpc3RpbmcgaGFuZGxlICIgKyBoYW5kbGUpOwotICAgICAgICAgICAgICAgIFNjaGVtYUNvbXBvbmVudCBjb21wID0gKChTY2hlbWFDb21wb25lbnQuUmVmKV9oYW5kbGVzVG9SZWZzLmdldChoYW5kbGUpKS5nZXRDb21wb25lbnQoKTsKLSAgICAgICAgICAgICAgICBfY29tcG9uZW50c1RvSGFuZGxlcy5wdXQoY29tcCwgaGFuZGxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX25hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2Jhc2VQYWNrYWdlOwotCi0gICAgLy8gY2xhc3Nsb2FkZXIgaXMgYXZhaWxhYmxlIGZvciBzdHMncyB0aGF0IHdlcmUgY29tcGlsZWQgYW5kIGxvYWRlZCwgbm90IGR5bmFtaWMgb25lcwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgX2NsYXNzbG9hZGVyOwotCi0gICAgLy8gdGhlIGxvYWRlciBmb3IgbG9hZGluZyAueHNiIHJlc291cmNlcwotICAgIHByaXZhdGUgUmVzb3VyY2VMb2FkZXIgX3Jlc291cmNlTG9hZGVyOwotCi0gICAgLy8gdGhlIGZvbGxvd2luZyBpcyB1c2VkIHRvIGxpbmsgcmVmZXJlbmNlcyBkdXJpbmcgbG9hZAotICAgIFNjaGVtYVR5cGVMb2FkZXIgX2xpbmtlcjsKLQotICAgIHByaXZhdGUgSGFuZGxlUG9vbCBfbG9jYWxIYW5kbGVzOwotICAgIHByaXZhdGUgRmlsZSBfYmFzZVNhdmVEaXI7Ci0KLSAgICAvLyBhY3R1YWwgdHlwZSBzeXN0ZW0gZGF0YSwgbWFwIFFOYW1lcyAtPiBTY2hlbWFDb21wb25lbnQuUmVmCi0gICAgcHJpdmF0ZSBNYXAgX3JlZGVmaW5lZE1vZGVsR3JvdXBzOwotICAgIHByaXZhdGUgTWFwIF9yZWRlZmluZWRBdHRyaWJ1dGVHcm91cHM7Ci0gICAgcHJpdmF0ZSBNYXAgX3JlZGVmaW5lZEdsb2JhbFR5cGVzOwotCi0gICAgcHJpdmF0ZSBNYXAgX2dsb2JhbEVsZW1lbnRzOwotICAgIHByaXZhdGUgTWFwIF9nbG9iYWxBdHRyaWJ1dGVzOwotICAgIHByaXZhdGUgTWFwIF9tb2RlbEdyb3VwczsKLSAgICBwcml2YXRlIE1hcCBfYXR0cmlidXRlR3JvdXBzOwotICAgIHByaXZhdGUgTWFwIF9nbG9iYWxUeXBlczsKLSAgICBwcml2YXRlIE1hcCBfZG9jdW1lbnRUeXBlczsKLSAgICBwcml2YXRlIE1hcCBfYXR0cmlidXRlVHlwZXM7Ci0gICAgcHJpdmF0ZSBNYXAgX2lkZW50aXR5Q29uc3RyYWludHMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgcHJpdmF0ZSBNYXAgX3R5cGVSZWZzQnlDbGFzc25hbWUgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgU2V0IF9uYW1lc3BhY2VzOwotCi0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgU2NoZW1hVHlwZVtdIEVNUFRZX1NUX0FSUkFZID0gbmV3IFNjaGVtYVR5cGVbMF07Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgU2NoZW1hR2xvYmFsRWxlbWVudFtdIEVNUFRZX0dFX0FSUkFZID0gbmV3IFNjaGVtYUdsb2JhbEVsZW1lbnRbMF07Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgU2NoZW1hR2xvYmFsQXR0cmlidXRlW10gRU1QVFlfR0FfQVJSQVkgPSBuZXcgU2NoZW1hR2xvYmFsQXR0cmlidXRlWzBdOwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIFNjaGVtYU1vZGVsR3JvdXBbXSBFTVBUWV9NR19BUlJBWSA9IG5ldyBTY2hlbWFNb2RlbEdyb3VwWzBdOwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIFNjaGVtYUF0dHJpYnV0ZUdyb3VwW10gRU1QVFlfQUdfQVJSQVkgPSBuZXcgU2NoZW1hQXR0cmlidXRlR3JvdXBbMF07Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50W10gRU1QVFlfSUNfQVJSQVkgPSBuZXcgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50WzBdOwotCi0gICAgcHVibGljIHZvaWQgc2F2ZVRvRGlyZWN0b3J5KEZpbGUgY2xhc3NEaXIpCi0gICAgewotICAgICAgICBfYmFzZVNhdmVEaXIgPSBjbGFzc0RpcjsKLQotICAgICAgICBfbG9jYWxIYW5kbGVzLnN0YXJ0V3JpdGVNb2RlKCk7Ci0gICAgICAgIHNhdmVUeXBlc1JlY3Vyc2l2ZWx5KGdsb2JhbFR5cGVzKCkpOwotICAgICAgICBzYXZlVHlwZXNSZWN1cnNpdmVseShkb2N1bWVudFR5cGVzKCkpOwotICAgICAgICBzYXZlVHlwZXNSZWN1cnNpdmVseShhdHRyaWJ1dGVUeXBlcygpKTsKLSAgICAgICAgc2F2ZUdsb2JhbEVsZW1lbnRzKGdsb2JhbEVsZW1lbnRzKCkpOwotICAgICAgICBzYXZlR2xvYmFsQXR0cmlidXRlcyhnbG9iYWxBdHRyaWJ1dGVzKCkpOwotICAgICAgICBzYXZlTW9kZWxHcm91cHMobW9kZWxHcm91cHMoKSk7Ci0gICAgICAgIHNhdmVBdHRyaWJ1dGVHcm91cHMoYXR0cmlidXRlR3JvdXBzKCkpOwotICAgICAgICBzYXZlSWRlbnRpdHlDb25zdHJhaW50cyhpZGVudGl0eUNvbnN0cmFpbnRzKCkpOwotCi0gICAgICAgIHNhdmVUeXBlc1JlY3Vyc2l2ZWx5KHJlZGVmaW5lZEdsb2JhbFR5cGVzKCkpOwotICAgICAgICBzYXZlTW9kZWxHcm91cHMocmVkZWZpbmVkTW9kZWxHcm91cHMoKSk7Ci0gICAgICAgIHNhdmVBdHRyaWJ1dGVHcm91cHMocmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzKCkpOwotCi0gICAgICAgIHNhdmVJbmRleCgpOwotICAgICAgICBzYXZlUG9pbnRlcnMoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNhdmVUeXBlc1JlY3Vyc2l2ZWx5KFNjaGVtYVR5cGVbXSB0eXBlcykKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0eXBlc1tpXS5nZXRUeXBlU3lzdGVtKCkgIT0gZ2V0VHlwZVN5c3RlbSgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgc2F2ZVR5cGUodHlwZXNbaV0pOwotICAgICAgICAgICAgc2F2ZVR5cGVzUmVjdXJzaXZlbHkodHlwZXNbaV0uZ2V0QW5vbnltb3VzVHlwZXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlR2xvYmFsRWxlbWVudHMoU2NoZW1hR2xvYmFsRWxlbWVudFtdIGVsdHMpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsdHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNhdmVHbG9iYWxFbGVtZW50KGVsdHNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZUdsb2JhbEF0dHJpYnV0ZXMoU2NoZW1hR2xvYmFsQXR0cmlidXRlW10gYXR0cnMpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYXZlR2xvYmFsQXR0cmlidXRlKGF0dHJzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmVNb2RlbEdyb3VwcyhTY2hlbWFNb2RlbEdyb3VwW10gZ3JvdXBzKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNhdmVNb2RlbEdyb3VwKGdyb3Vwc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlQXR0cmlidXRlR3JvdXBzKFNjaGVtYUF0dHJpYnV0ZUdyb3VwW10gZ3JvdXBzKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNhdmVBdHRyaWJ1dGVHcm91cChncm91cHNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZUlkZW50aXR5Q29uc3RyYWludHMoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50W10gaWRjcykKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRjcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgc2F2ZUlkZW50aXR5Q29uc3RyYWludChpZGNzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmVHbG9iYWxFbGVtZW50KFNjaGVtYUdsb2JhbEVsZW1lbnQgZWx0KQotICAgIHsKLSAgICAgICAgU3RyaW5nIGhhbmRsZSA9IF9sb2NhbEhhbmRsZXMuaGFuZGxlRm9yRWxlbWVudChlbHQpOwotICAgICAgICBYc2JSZWFkZXIgc2F2ZXIgPSBuZXcgWHNiUmVhZGVyKGhhbmRsZSk7Ci0gICAgICAgIHNhdmVyLndyaXRlUGFydGljbGVEYXRhKChTY2hlbWFQYXJ0aWNsZSllbHQpOwotICAgICAgICBzYXZlci53cml0ZVN0cmluZyhlbHQuZ2V0U291cmNlTmFtZSgpKTsKLSAgICAgICAgc2F2ZXIud3JpdGVSZWFsSGVhZGVyKGhhbmRsZSwgRklMRVRZUEVfU0NIRU1BRUxFTUVOVCk7Ci0gICAgICAgIHNhdmVyLndyaXRlUGFydGljbGVEYXRhKChTY2hlbWFQYXJ0aWNsZSllbHQpOwotICAgICAgICBzYXZlci53cml0ZVN0cmluZyhlbHQuZ2V0U291cmNlTmFtZSgpKTsKLSAgICAgICAgc2F2ZXIud3JpdGVFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlR2xvYmFsQXR0cmlidXRlKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBhdHRyKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGhhbmRsZSA9IF9sb2NhbEhhbmRsZXMuaGFuZGxlRm9yQXR0cmlidXRlKGF0dHIpOwotICAgICAgICBYc2JSZWFkZXIgc2F2ZXIgPSBuZXcgWHNiUmVhZGVyKGhhbmRsZSk7Ci0gICAgICAgIHNhdmVyLndyaXRlQXR0cmlidXRlRGF0YShhdHRyKTsKLSAgICAgICAgc2F2ZXIud3JpdGVTdHJpbmcoYXR0ci5nZXRTb3VyY2VOYW1lKCkpOwotICAgICAgICBzYXZlci53cml0ZVJlYWxIZWFkZXIoaGFuZGxlLCBGSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEUpOwotICAgICAgICBzYXZlci53cml0ZUF0dHJpYnV0ZURhdGEoYXR0cik7Ci0gICAgICAgIHNhdmVyLndyaXRlU3RyaW5nKGF0dHIuZ2V0U291cmNlTmFtZSgpKTsKLSAgICAgICAgc2F2ZXIud3JpdGVFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlTW9kZWxHcm91cChTY2hlbWFNb2RlbEdyb3VwIGdycCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBoYW5kbGUgPSBfbG9jYWxIYW5kbGVzLmhhbmRsZUZvck1vZGVsR3JvdXAoZ3JwKTsKLSAgICAgICAgWHNiUmVhZGVyIHNhdmVyID0gbmV3IFhzYlJlYWRlcihoYW5kbGUpOwotICAgICAgICBzYXZlci53cml0ZU1vZGVsR3JvdXBEYXRhKGdycCk7Ci0gICAgICAgIHNhdmVyLndyaXRlUmVhbEhlYWRlcihoYW5kbGUsIEZJTEVUWVBFX1NDSEVNQU1PREVMR1JPVVApOwotICAgICAgICBzYXZlci53cml0ZU1vZGVsR3JvdXBEYXRhKGdycCk7Ci0gICAgICAgIHNhdmVyLndyaXRlRW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZUF0dHJpYnV0ZUdyb3VwKFNjaGVtYUF0dHJpYnV0ZUdyb3VwIGdycCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBoYW5kbGUgPSBfbG9jYWxIYW5kbGVzLmhhbmRsZUZvckF0dHJpYnV0ZUdyb3VwKGdycCk7Ci0gICAgICAgIFhzYlJlYWRlciBzYXZlciA9IG5ldyBYc2JSZWFkZXIoaGFuZGxlKTsKLSAgICAgICAgc2F2ZXIud3JpdGVBdHRyaWJ1dGVHcm91cERhdGEoZ3JwKTsKLSAgICAgICAgc2F2ZXIud3JpdGVSZWFsSGVhZGVyKGhhbmRsZSwgRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFR1JPVVApOwotICAgICAgICBzYXZlci53cml0ZUF0dHJpYnV0ZUdyb3VwRGF0YShncnApOwotICAgICAgICBzYXZlci53cml0ZUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmVJZGVudGl0eUNvbnN0cmFpbnQoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGlkYykKLSAgICB7Ci0gICAgICAgIFN0cmluZyBoYW5kbGUgPSBfbG9jYWxIYW5kbGVzLmhhbmRsZUZvcklkZW50aXR5Q29uc3RyYWludChpZGMpOwotICAgICAgICBYc2JSZWFkZXIgc2F2ZXIgPSBuZXcgWHNiUmVhZGVyKGhhbmRsZSk7Ci0gICAgICAgIHNhdmVyLndyaXRlSWRDb25zdHJhaW50RGF0YShpZGMpOwotICAgICAgICBzYXZlci53cml0ZVJlYWxIZWFkZXIoaGFuZGxlLCBGSUxFVFlQRV9TQ0hFTUFJREVOVElUWUNPTlNUUkFJTlQpOwotICAgICAgICBzYXZlci53cml0ZUlkQ29uc3RyYWludERhdGEoaWRjKTsKLSAgICAgICAgc2F2ZXIud3JpdGVFbmQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNhdmVUeXBlKFNjaGVtYVR5cGUgdHlwZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBoYW5kbGUgPSBfbG9jYWxIYW5kbGVzLmhhbmRsZUZvclR5cGUodHlwZSk7Ci0gICAgICAgIFhzYlJlYWRlciBzYXZlciA9IG5ldyBYc2JSZWFkZXIoaGFuZGxlKTsKLSAgICAgICAgc2F2ZXIud3JpdGVUeXBlRGF0YSh0eXBlKTsKLSAgICAgICAgc2F2ZXIud3JpdGVSZWFsSGVhZGVyKGhhbmRsZSwgRklMRVRZUEVfU0NIRU1BVFlQRSk7Ci0gICAgICAgIHNhdmVyLndyaXRlVHlwZURhdGEodHlwZSk7Ci0gICAgICAgIHNhdmVyLndyaXRlRW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JhY2tQb2ludGVyKElucHV0U3RyZWFtIHN0cmVhbSkKLSAgICB7Ci0gICAgICAgIERhdGFJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnB1dCA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oc3RyZWFtKTsKLQotICAgICAgICAgICAgaW50IG1hZ2ljID0gaW5wdXQucmVhZEludCgpOwotICAgICAgICAgICAgaWYgKG1hZ2ljICE9IERBVEFfQkFCRSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgaW50IG1ham9ydmVyID0gaW5wdXQucmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBpbnQgbWlub3J2ZXIgPSBpbnB1dC5yZWFkU2hvcnQoKTsKLQotICAgICAgICAgICAgaWYgKG1ham9ydmVyICE9IE1BSk9SX1ZFUlNJT04pCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChtaW5vcnZlciA+IE1JTk9SX1ZFUlNJT04pCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChtYWpvcnZlciA+IDIgfHwgbWFqb3J2ZXIgPT0gMiAmJiBtaW5vcnZlciA+PSAxOCkKLSAgICAgICAgICAgICAgICBpbnB1dC5yZWFkU2hvcnQoKTsgLy8gcmVsZWFzZSBudW1iZXIgcHJlc2VudCBpbiBhdExlYXN0KDIsIDE4LCAwKQotCi0gICAgICAgICAgICBpbnQgYWN0dWFsZmlsZXR5cGUgPSBpbnB1dC5yZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGlmIChhY3R1YWxmaWxldHlwZSAhPSBGSUxFVFlQRV9TQ0hFTUFQT0lOVEVSKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBTdHJpbmdQb29sIHN0cmluZ1Bvb2wgPSBuZXcgU3RyaW5nUG9vbCgicG9pbnRlciIsICJ1bmsiKTsKLSAgICAgICAgICAgIHN0cmluZ1Bvb2wucmVhZEZyb20oaW5wdXQpOwotCi0gICAgICAgICAgICByZXR1cm4gc3RyaW5nUG9vbC5zdHJpbmdGb3JDb2RlKGlucHV0LnJlYWRTaG9ydCgpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0cnkgeyBpbnB1dC5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBYc2JSZWFkZXIKLSAgICB7Ci0gICAgICAgIERhdGFJbnB1dFN0cmVhbSBfaW5wdXQ7Ci0gICAgICAgIERhdGFPdXRwdXRTdHJlYW0gX291dHB1dDsKLSAgICAgICAgU3RyaW5nUG9vbCBfc3RyaW5nUG9vbDsKLSAgICAgICAgU3RyaW5nIF9oYW5kbGU7Ci0gICAgICAgIHByaXZhdGUgaW50IF9tYWpvcnZlcjsKLSAgICAgICAgcHJpdmF0ZSBpbnQgX21pbm9ydmVyOwotICAgICAgICBwcml2YXRlIGludCBfcmVsZWFzZW5vOwotICAgICAgICBpbnQgX2FjdHVhbGZpbGV0eXBlOwotCi0gICAgICAgIHB1YmxpYyBYc2JSZWFkZXIoU3RyaW5nIGhhbmRsZSwgaW50IGZpbGV0eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VuYW1lID0gX2Jhc2VQYWNrYWdlICsgaGFuZGxlICsgIi54c2IiOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gcmF3aW5wdXQgPSBnZXRMb2FkZXJTdHJlYW0ocmVzb3VyY2VuYW1lKTsKLSAgICAgICAgICAgIGlmIChyYXdpbnB1dCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJYTUwtQkVBTlMgY29tcGlsZWQgc2NoZW1hOiBDb3VsZCBub3QgbG9jYXRlIGNvbXBpbGVkIHNjaGVtYSByZXNvdXJjZSAiICsgcmVzb3VyY2VuYW1lLCBfbmFtZSwgaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLk5PX1JFU09VUkNFKTsKLQotICAgICAgICAgICAgX2lucHV0ID0gbmV3IERhdGFJbnB1dFN0cmVhbShyYXdpbnB1dCk7Ci0gICAgICAgICAgICBfaGFuZGxlID0gaGFuZGxlOwotCi0gICAgICAgICAgICBpbnQgbWFnaWMgPSByZWFkSW50KCk7Ci0gICAgICAgICAgICBpZiAobWFnaWMgIT0gREFUQV9CQUJFKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJYTUwtQkVBTlMgY29tcGlsZWQgc2NoZW1hOiBXcm9uZyBtYWdpYyBjb29raWUiLCBfbmFtZSwgaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLldST05HX01BR0lDX0NPT0tJRSk7Ci0KLSAgICAgICAgICAgIF9tYWpvcnZlciA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgX21pbm9ydmVyID0gcmVhZFNob3J0KCk7Ci0KLSAgICAgICAgICAgIGlmIChfbWFqb3J2ZXIgIT0gTUFKT1JfVkVSU0lPTikKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiWE1MLUJFQU5TIGNvbXBpbGVkIHNjaGVtYTogV3JvbmcgbWFqb3IgdmVyc2lvbiAtIGV4cGVjdGluZyAiICsgTUFKT1JfVkVSU0lPTiArICIsIGdvdCAiICsgX21ham9ydmVyLCBfbmFtZSwgaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLldST05HX01BSk9SX1ZFUlNJT04pOwotCi0gICAgICAgICAgICBpZiAoX21pbm9ydmVyID4gTUlOT1JfVkVSU0lPTikKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiWE1MLUJFQU5TIGNvbXBpbGVkIHNjaGVtYTogSW5jb21wYXRpYmxlIG1pbm9yIHZlcnNpb24gLSBleHBlY3RpbmcgdXAgdG8gIiArIE1JTk9SX1ZFUlNJT04gKyAiLCBnb3QgIiArIF9taW5vcnZlciwgX25hbWUsIGhhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5XUk9OR19NSU5PUl9WRVJTSU9OKTsKLQotICAgICAgICAgICAgLy8gQ2xpcCB0byAxNCBiZWNhdXNlIHdlJ3JlIG5vdCBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggZWFybGllcgotICAgICAgICAgICAgLy8gbWlub3IgdmVyc2lvbnMuICBSZW1vdmUgdGhpcyB3aGVuIHVwZ3JhZGluZyB0byBhIG5ldyBtYWpvcgotICAgICAgICAgICAgLy8gdmVyc2lvbgotCi0gICAgICAgICAgICBpZiAoX21pbm9ydmVyIDwgMTQpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIlhNTC1CRUFOUyBjb21waWxlZCBzY2hlbWE6IEluY29tcGF0aWJsZSBtaW5vciB2ZXJzaW9uIC0gZXhwZWN0aW5nIGF0IGxlYXN0IDE0LCBnb3QgIiArIF9taW5vcnZlciwgX25hbWUsIGhhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5XUk9OR19NSU5PUl9WRVJTSU9OKTsKLQotICAgICAgICAgICAgaWYgKGF0TGVhc3QoMiwgMTgsIDApKQotICAgICAgICAgICAgICAgIF9yZWxlYXNlbm8gPSByZWFkU2hvcnQoKTsKLQotICAgICAgICAgICAgaW50IGFjdHVhbGZpbGV0eXBlID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBpZiAoYWN0dWFsZmlsZXR5cGUgIT0gZmlsZXR5cGUgJiYgZmlsZXR5cGUgIT0gLTEpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIlhNTC1CRUFOUyBjb21waWxlZCBzY2hlbWE6IEZpbGUgaGFzIHRoZSB3cm9uZyB0eXBlIC0gZXhwZWN0aW5nIHR5cGUgIiArIGZpbGV0eXBlICsgIiwgZ290IHR5cGUgIiArIGFjdHVhbGZpbGV0eXBlLCBfbmFtZSwgaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLldST05HX0ZJTEVfVFlQRSk7Ci0KLSAgICAgICAgICAgIF9zdHJpbmdQb29sID0gbmV3IFN0cmluZ1Bvb2woX2hhbmRsZSwgX25hbWUpOwotICAgICAgICAgICAgX3N0cmluZ1Bvb2wucmVhZEZyb20oX2lucHV0KTsKLQotICAgICAgICAgICAgX2FjdHVhbGZpbGV0eXBlID0gYWN0dWFsZmlsZXR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhdExlYXN0KGludCBtYWpvcnZlciwgaW50IG1pbm9ydmVyLCBpbnQgcmVsZWFzZW5vKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX21ham9ydmVyID4gbWFqb3J2ZXIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBpZiAoX21ham9ydmVyIDwgbWFqb3J2ZXIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKF9taW5vcnZlciA+IG1pbm9ydmVyKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgaWYgKF9taW5vcnZlciA8IG1pbm9ydmVyKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiAoX3JlbGVhc2VubyA+PSByZWxlYXNlbm8pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXRNb3N0KGludCBtYWpvcnZlciwgaW50IG1pbm9ydmVyLCBpbnQgcmVsZWFzZW5vKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX21ham9ydmVyID4gbWFqb3J2ZXIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKF9tYWpvcnZlciA8IG1ham9ydmVyKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgaWYgKF9taW5vcnZlciA+IG1pbm9ydmVyKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChfbWlub3J2ZXIgPCBtaW5vcnZlcikKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiAoX3JlbGVhc2VubyA8PSByZWxlYXNlbm8pOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldEFjdHVhbEZpbGV0eXBlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9hY3R1YWxmaWxldHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIFhzYlJlYWRlcihTdHJpbmcgaGFuZGxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBfaGFuZGxlID0gaGFuZGxlOwotICAgICAgICAgICAgX3N0cmluZ1Bvb2wgPSBuZXcgU3RyaW5nUG9vbChfaGFuZGxlLCBfbmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlUmVhbEhlYWRlcihTdHJpbmcgaGFuZGxlLCBpbnQgZmlsZXR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGhhY2tlcm9vOiBpZiBoYW5kbGUgY29udGFpbnMgYSAiLyIgaXQncyBub3QgcmVsYXRpdmUuCi0gICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VuYW1lOwotCi0gICAgICAgICAgICBpZiAoaGFuZGxlLmluZGV4T2YoJy8nKSA+PSAwKQotICAgICAgICAgICAgICAgIHJlc291cmNlbmFtZSA9IGhhbmRsZSArICIueHNiIjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXNvdXJjZW5hbWUgPSBfYmFzZVBhY2thZ2UgKyBoYW5kbGUgKyAiLnhzYiI7Ci0KLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSByYXdvdXRwdXQgPSBnZXRTYXZlclN0cmVhbShyZXNvdXJjZW5hbWUpOwotICAgICAgICAgICAgaWYgKHJhd291dHB1dCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJDb3VsZCBub3Qgd3JpdGUgY29tcGlsZWQgc2NoZW1hIHJlc291cmNlICIgKyByZXNvdXJjZW5hbWUsIF9uYW1lLCBoYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uTk9UX1dSSVRFQUJMRSk7Ci0KLSAgICAgICAgICAgIF9vdXRwdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShyYXdvdXRwdXQpOwotICAgICAgICAgICAgX2hhbmRsZSA9IGhhbmRsZTsKLQotICAgICAgICAgICAgd3JpdGVJbnQoREFUQV9CQUJFKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoTUFKT1JfVkVSU0lPTik7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KE1JTk9SX1ZFUlNJT04pOwotICAgICAgICAgICAgd3JpdGVTaG9ydChSRUxFQVNFX05VTUJFUik7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KGZpbGV0eXBlKTsKLQotICAgICAgICAgICAgX3N0cmluZ1Bvb2wud3JpdGVUbyhfb3V0cHV0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcmVhZEVuZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfaW5wdXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgX2lucHV0LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBvaCwgd2VsbC4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9pbnB1dCA9IG51bGw7Ci0gICAgICAgICAgICBfc3RyaW5nUG9vbCA9IG51bGw7Ci0gICAgICAgICAgICBfaGFuZGxlID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVFbmQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX291dHB1dCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX291dHB1dC5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICBfb3V0cHV0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLklPX0VYQ0VQVElPTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfb3V0cHV0ID0gbnVsbDsKLSAgICAgICAgICAgIF9zdHJpbmdQb29sID0gbnVsbDsKLSAgICAgICAgICAgIF9oYW5kbGUgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpbGVUeXBlRnJvbUNvbXBvbmVudFR5cGUoaW50IGNvbXBvbmVudFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoY29tcG9uZW50VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5UWVBFOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZVN5c3RlbUltcGwuRklMRVRZUEVfU0NIRU1BVFlQRTsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZVN5c3RlbUltcGwuRklMRVRZUEVfU0NIRU1BRUxFTUVOVDsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5BVFRSSUJVVEU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlU3lzdGVtSW1wbC5GSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEU7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuTU9ERUxfR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlU3lzdGVtSW1wbC5GSUxFVFlQRV9TQ0hFTUFNT0RFTEdST1VQOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkFUVFJJQlVURV9HUk9VUDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGVTeXN0ZW1JbXBsLkZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURUdST1VQOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LklERU5USVRZX0NPTlNUUkFJTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlU3lzdGVtSW1wbC5GSUxFVFlQRV9TQ0hFTUFJREVOVElUWUNPTlNUUkFJTlQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBjb21wb25lbnQgdHlwZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZUluZGV4RGF0YSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGhhcyBhIGhhbmRsZSBwb29sIChjb3VudCwgaGFuZGxlL3R5cGUsIGhhbmRsZS90eXBlLi4uKQotICAgICAgICAgICAgd3JpdGVIYW5kbGVQb29sKF9sb2NhbEhhbmRsZXMpOwotCi0gICAgICAgICAgICAvLyB0aGVuIGEgcW5hbWUgbWFwIG9mIGdsb2JhbCBlbGVtZW50cyAoY291bnQsIHFuYW1lL2hhbmRsZSwgcW5hbWUvaGFuZGxlLi4uKQotICAgICAgICAgICAgd3JpdGVRTmFtZU1hcChnbG9iYWxFbGVtZW50cygpKTsKLQotICAgICAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGdsb2JhbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICB3cml0ZVFOYW1lTWFwKGdsb2JhbEF0dHJpYnV0ZXMoKSk7Ci0KLSAgICAgICAgICAgIC8vIHFuYW1lIG1hcCBvZiBtb2RlbCBncm91cHMKLSAgICAgICAgICAgIHdyaXRlUU5hbWVNYXAobW9kZWxHcm91cHMoKSk7Ci0KLSAgICAgICAgICAgIC8vIHFuYW1lIG1hcCBvZiBhdHRyaWJ1dGUgZ3JvdXBzCi0gICAgICAgICAgICB3cml0ZVFOYW1lTWFwKGF0dHJpYnV0ZUdyb3VwcygpKTsKLQotICAgICAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGlkZW50aXR5IGNvbnN0cmFpbnRzCi0gICAgICAgICAgICB3cml0ZVFOYW1lTWFwKGlkZW50aXR5Q29uc3RyYWludHMoKSk7Ci0KLSAgICAgICAgICAgIC8vIHFuYW1lIG1hcCBvZiBnbG9iYWwgdHlwZXMKLSAgICAgICAgICAgIHdyaXRlUU5hbWVNYXAoZ2xvYmFsVHlwZXMoKSk7Ci0KLSAgICAgICAgICAgIC8vIHFuYW1lIG1hcCBvZiBkb2N1bWVudCB0eXBlcywgYnkgdGhlIHFuYW1lIG9mIHRoZSBjb250YWluZWQgZWxlbWVudAotICAgICAgICAgICAgd3JpdGVEb2N1bWVudFR5cGVNYXAoZG9jdW1lbnRUeXBlcygpKTsKLQotICAgICAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGF0dHJpYnV0ZSB0eXBlcywgYnkgdGhlIHFuYW1lIG9mIHRoZSBjb250YWluZWQgYXR0cmlidXRlCi0gICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZVR5cGVNYXAoYXR0cmlidXRlVHlwZXMoKSk7Ci0KLSAgICAgICAgICAgIC8vIGFsbCB0aGUgdHlwZXMgYnkgY2xhc3NuYW1lCi0gICAgICAgICAgICB3cml0ZUNsYXNzbmFtZU1hcChfdHlwZVJlZnNCeUNsYXNzbmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIGFsbCB0aGUgbmFtZXNwYWNlcwotICAgICAgICAgICAgd3JpdGVOYW1lc3BhY2VzKF9uYW1lc3BhY2VzKTsKLQotICAgICAgICAgICAgLy8gVkVSU0lPTiAyLjE1IGFuZCBuZXdlciBiZWxvdwotICAgICAgICAgICAgd3JpdGVRTmFtZU1hcChyZWRlZmluZWRHbG9iYWxUeXBlcygpKTsKLSAgICAgICAgICAgIHdyaXRlUU5hbWVNYXAocmVkZWZpbmVkTW9kZWxHcm91cHMoKSk7Ci0gICAgICAgICAgICB3cml0ZVFOYW1lTWFwKHJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwcygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVIYW5kbGVQb29sKEhhbmRsZVBvb2wgcG9vbCkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVTaG9ydChwb29sLl9jb21wb25lbnRzVG9IYW5kbGVzLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwb29sLl9jb21wb25lbnRzVG9IYW5kbGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hQ29tcG9uZW50IGNvbXAgPSAoU2NoZW1hQ29tcG9uZW50KWkubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBoYW5kbGUgPSAoU3RyaW5nKXBvb2wuX2NvbXBvbmVudHNUb0hhbmRsZXMuZ2V0KGNvbXApOwotICAgICAgICAgICAgICAgIGludCBjb2RlID0gZmlsZVR5cGVGcm9tQ29tcG9uZW50VHlwZShjb21wLmdldENvbXBvbmVudFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoaGFuZGxlKTsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KGNvZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCByZWFkSGFuZGxlUG9vbChIYW5kbGVQb29sIHBvb2wpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwb29sLl9oYW5kbGVzVG9SZWZzLnNpemUoKSAhPSAwIHx8IHBvb2wuX3N0YXJ0ZWQpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm9uZW1wdHkgaGFuZGxlIHNldCBiZWZvcmUgcmVhZCIpOwotCi0gICAgICAgICAgICBpbnQgc2l6ZSA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IHJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBzaG9ydCBjb2RlID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHJlc3VsdDsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQVRZUEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZS5SZWYoZ2V0VHlwZVN5c3RlbSgpLCBoYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTY2hlbWFHbG9iYWxFbGVtZW50LlJlZihnZXRUeXBlU3lzdGVtKCksIGhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgU2NoZW1hR2xvYmFsQXR0cmlidXRlLlJlZihnZXRUeXBlU3lzdGVtKCksIGhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFNT0RFTEdST1VQOgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFNjaGVtYU1vZGVsR3JvdXAuUmVmKGdldFR5cGVTeXN0ZW0oKSwgaGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURUdST1VQOgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFNjaGVtYUF0dHJpYnV0ZUdyb3VwLlJlZihnZXRUeXBlU3lzdGVtKCksIGhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFJREVOVElUWUNPTlNUUkFJTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZihnZXRUeXBlU3lzdGVtKCksIGhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJTY2hlbWEgaW5kZXggaGFzIGFuIHVucmVjb2duaXplZCBlbnRyeSBvZiB0eXBlICIgKyBjb2RlLCBfbmFtZSwgaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLlVOUkVDT0dOSVpFRF9JTkRFWF9FTlRSWSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBvb2wuX2hhbmRsZXNUb1JlZnMucHV0KGhhbmRsZSwgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNob3J0IHJlYWRTaG9ydCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfaW5wdXQucmVhZFNob3J0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU9fRVhDRVBUSU9OKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVTaG9ydChpbnQgcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHMgPiBTaG9ydC5NQVhfVkFMVUUgfHwgcyA8IFNob3J0Lk1JTl9WQUxVRSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiVmFsdWUgIiArIHMgKyAiIG91dCBvZiByYW5nZTogbXVzdCBmaXQgaW4gYSAxNi1iaXQgc2hvcnQuIiwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU5UX1RPT19MQVJHRSk7Ci0gICAgICAgICAgICBpZiAoX291dHB1dCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX291dHB1dC53cml0ZVNob3J0KHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JT19FWENFUFRJT04pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludCByZWFkSW50KCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9pbnB1dC5yZWFkSW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU9fRVhDRVBUSU9OKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVJbnQoaW50IGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfb3V0cHV0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfb3V0cHV0LndyaXRlSW50KGkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JT19FWENFUFRJT04pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyByZWFkU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9zdHJpbmdQb29sLnN0cmluZ0ZvckNvZGUocmVhZFNob3J0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY29kZSA9IF9zdHJpbmdQb29sLmNvZGVGb3JTdHJpbmcoc3RyKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoY29kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBRTmFtZSByZWFkUU5hbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gcmVhZFN0cmluZygpOwotICAgICAgICAgICAgU3RyaW5nIGxvY2FsbmFtZSA9IHJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChsb2NhbG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUobmFtZXNwYWNlLCBsb2NhbG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZVFOYW1lKFFOYW1lIHFuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocW5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyhudWxsKTsKLSAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyhudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cml0ZVN0cmluZyhxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICB3cml0ZVN0cmluZyhxbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTT0FQQXJyYXlUeXBlIHJlYWRTT0FQQXJyYXlUeXBlKCkKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSByZWFkUU5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBkaW1lbnNpb25zID0gcmVhZFN0cmluZygpOwotICAgICAgICAgICAgaWYgKHFOYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNPQVBBcnJheVR5cGUocU5hbWUsIGRpbWVuc2lvbnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZVNPQVBBcnJheVR5cGUoU09BUEFycmF5VHlwZSBhcnJheVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhcnJheVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKG51bGwpOwotICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlUU5hbWUoYXJyYXlUeXBlLmdldFFOYW1lKCkpOwotICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKGFycmF5VHlwZS5zb2FwMTFEaW1lbnNpb25TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFDb21wb25lbnQuUmVmIHJlYWRIYW5kbGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgaGFuZGxlID0gcmVhZFN0cmluZygpOwotICAgICAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBpZiAoaGFuZGxlLmNoYXJBdCgwKSAhPSAnXycpCi0gICAgICAgICAgICAgICAgcmV0dXJuIF9sb2NhbEhhbmRsZXMucmVmRm9ySGFuZGxlKGhhbmRsZSk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoaGFuZGxlLmNoYXJBdCgyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlICdJJzogLy8gX0JJXyAtIGJ1aWx0LWluIHNjaGVtYSB0eXBlIHN5c3RlbQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChTY2hlbWFUeXBlKUJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLmdldCgpLnJlc29sdmVIYW5kbGUoaGFuZGxlKSkuZ2V0UmVmKCk7Ci0gICAgICAgICAgICAgICAgY2FzZSAnVCc6IC8vIF9YVF8gLSBleHRlcm5hbCB0eXBlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfbGlua2VyLmZpbmRUeXBlUmVmKFFOYW1lSGVscGVyLmZvclByZXR0eShoYW5kbGUsIDQpKTsKLSAgICAgICAgICAgICAgICBjYXNlICdFJzogLy8gX1hFXyAtIGV4dGVybmFsIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9saW5rZXIuZmluZEVsZW1lbnRSZWYoUU5hbWVIZWxwZXIuZm9yUHJldHR5KGhhbmRsZSwgNCkpOwotICAgICAgICAgICAgICAgIGNhc2UgJ0EnOiAvLyBfWEFfIC0gZXh0ZXJuYWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfbGlua2VyLmZpbmRBdHRyaWJ1dGVSZWYoUU5hbWVIZWxwZXIuZm9yUHJldHR5KGhhbmRsZSwgNCkpOwotICAgICAgICAgICAgICAgIGNhc2UgJ00nOiAvLyBfWE1fIC0gZXh0ZXJuYWwgbW9kZWwgZ3JvdXAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9saW5rZXIuZmluZE1vZGVsR3JvdXBSZWYoUU5hbWVIZWxwZXIuZm9yUHJldHR5KGhhbmRsZSwgNCkpOwotICAgICAgICAgICAgICAgIGNhc2UgJ04nOiAvLyBfWE5fIC0gZXh0ZXJuYWwgYXR0cmlidXRlIGdyb3VwCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfbGlua2VyLmZpbmRBdHRyaWJ1dGVHcm91cFJlZihRTmFtZUhlbHBlci5mb3JQcmV0dHkoaGFuZGxlLCA0KSk7Ci0gICAgICAgICAgICAgICAgY2FzZSAnRCc6IC8vIF9YRF8gLSBleHRlcm5hbCBpZGVudGl0eSBjb25zdHJhaW50Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfbGlua2VyLmZpbmRJZGVudGl0eUNvbnN0cmFpbnRSZWYoUU5hbWVIZWxwZXIuZm9yUHJldHR5KGhhbmRsZSwgNCkpOwotICAgICAgICAgICAgICAgIGNhc2UgJ1InOiAvLyBfWFJfIC0gZXh0ZXJuYWwgcmVmIHRvIGF0dHJpYnV0ZSdzIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9saW5rZXIuZmluZEF0dHJpYnV0ZShRTmFtZUhlbHBlci5mb3JQcmV0dHkoaGFuZGxlLCA0KSkuZ2V0VHlwZSgpLmdldFJlZigpOwotICAgICAgICAgICAgICAgIGNhc2UgJ1MnOiAvLyBfWFNfIC0gZXh0ZXJuYWwgcmVmIHRvIGVsZW1lbnQncyB0eXBlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfbGlua2VyLmZpbmRFbGVtZW50KFFOYW1lSGVscGVyLmZvclByZXR0eShoYW5kbGUsIDQpKS5nZXRUeXBlKCkuZ2V0UmVmKCk7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIkNhbm5vdCByZXNvbHZlIGhhbmRsZSAiICsgaGFuZGxlLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5CQURfSEFORExFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVIYW5kbGUoU2NoZW1hQ29tcG9uZW50IGNvbXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb21wID09IG51bGwgfHwgY29tcC5nZXRUeXBlU3lzdGVtKCkgPT0gZ2V0VHlwZVN5c3RlbSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKF9sb2NhbEhhbmRsZXMuaGFuZGxlRm9yQ29tcG9uZW50KGNvbXApKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoY29tcC5nZXRDb21wb25lbnRUeXBlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFOgotICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZygiX1hBXyIgKyBRTmFtZUhlbHBlci5wcmV0dHkoY29tcC5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50Lk1PREVMX0dST1VQOgotICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZygiX1hNXyIgKyBRTmFtZUhlbHBlci5wcmV0dHkoY29tcC5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkFUVFJJQlVURV9HUk9VUDoKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoIl9YTl8iICsgUU5hbWVIZWxwZXIucHJldHR5KGNvbXAuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZygiX1hFXyIgKyBRTmFtZUhlbHBlci5wcmV0dHkoY29tcC5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LklERU5USVRZX0NPTlNUUkFJTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKCJfWERfIiArIFFOYW1lSGVscGVyLnByZXR0eShjb21wLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuVFlQRToKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZSB0eXBlID0gKFNjaGVtYVR5cGUpY29tcDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuaXNCdWlsdGluVHlwZSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZygiX0JJXyIgKyB0eXBlLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBmaXggZm9yIENSMTIwNzU5IC0gYWRkZWQgb3V0cHV0IG9mIHR5cGVzIF9YUl8gJiBfWFNfCi0gICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gYW4gYXR0cmlidXRlIChfWFJfKSBvciBlbGVtZW50IChfWFNfKSBkZWNsYXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAvLyB1c2VzIHJlZiB0byByZWZlciB0byBhbiBhdHRyaWJ1dGUgb3IgZWxlbWVudCBpbiBhbm90aGVyCi0gICAgICAgICAgICAgICAgICAgIC8vIHNjaGVtYSBhbmQgdGhlIHR5cGUgb2YgdGhhdCBhdHRyaWJ1dGUgb3IgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAvLyBpcyBhbiBhbm9ueW1vdXMgKGxvY2FsKSB0eXBlCi0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZygiX1hUXyIgKyBRTmFtZUhlbHBlci5wcmV0dHkodHlwZS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUZpZWxkIHNmID0gdHlwZS5nZXRDb250YWluZXJGaWVsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IChzZiAhPSBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZi5pc0F0dHJpYnV0ZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKCJfWFJfIiArIFFOYW1lSGVscGVyLnByZXR0eShzZi5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZygiX1hTXyIgKyBRTmFtZUhlbHBlci5wcmV0dHkoc2YuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiQ2Fubm90IHdyaXRlIGhhbmRsZSBmb3IgY29tcG9uZW50ICIgKyBjb21wLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5CQURfSEFORExFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYVR5cGUuUmVmIHJlYWRUeXBlUmVmKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFUeXBlLlJlZilyZWFkSGFuZGxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlVHlwZShTY2hlbWFUeXBlIHR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlSGFuZGxlKHR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFwIHJlYWRRTmFtZVJlZk1hcCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgaW50IHNpemUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSByZWFkUU5hbWUoKTsKLSAgICAgICAgICAgICAgICBTY2hlbWFDb21wb25lbnQuUmVmIG9iaiA9IHJlYWRIYW5kbGUoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQucHV0KG5hbWUsIG9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZVFOYW1lTWFwKFNjaGVtYUNvbXBvbmVudFtdIGNvbXBvbmVudHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoY29tcG9uZW50cy5sZW5ndGgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlUU5hbWUoY29tcG9uZW50c1tpXS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIHdyaXRlSGFuZGxlKGNvbXBvbmVudHNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZURvY3VtZW50VHlwZU1hcChTY2hlbWFUeXBlW10gZG9jdHlwZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoZG9jdHlwZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZG9jdHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVRTmFtZShkb2N0eXBlc1tpXS5nZXREb2N1bWVudEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgICAgIHdyaXRlSGFuZGxlKGRvY3R5cGVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVBdHRyaWJ1dGVUeXBlTWFwKFNjaGVtYVR5cGVbXSBhdHRydHlwZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoYXR0cnR5cGVzLmxlbmd0aCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJ0eXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKGF0dHJ0eXBlc1tpXS5nZXRBdHRyaWJ1dGVUeXBlQXR0cmlidXRlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB3cml0ZUhhbmRsZShhdHRydHlwZXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hVHlwZS5SZWZbXSByZWFkVHlwZVJlZkFycmF5KCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHNpemUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUuUmVmW10gcmVzdWx0ID0gbmV3IFNjaGVtYVR5cGUuUmVmW3NpemVdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gcmVhZFR5cGVSZWYoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlVHlwZUFycmF5KFNjaGVtYVR5cGVbXSBhcnJheSkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVTaG9ydChhcnJheS5sZW5ndGgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZUhhbmRsZShhcnJheVtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBNYXAgcmVhZENsYXNzbmFtZVJlZk1hcCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgaW50IHNpemUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgIFNjaGVtYUNvbXBvbmVudC5SZWYgb2JqID0gcmVhZEhhbmRsZSgpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQobmFtZSwgb2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlQ2xhc3NuYW1lTWFwKE1hcCB0eXBlc0J5Q2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQodHlwZXNCeUNsYXNzLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0eXBlc0J5Q2xhc3Mua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyhjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIHdyaXRlSGFuZGxlKCgoU2NoZW1hVHlwZS5SZWYpdHlwZXNCeUNsYXNzLmdldChjbGFzc05hbWUpKS5nZXQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTZXQgcmVhZE5hbWVzcGFjZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXQgcmVzdWx0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgIGludCBzaXplID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbnMgPSByZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChucyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZU5hbWVzcGFjZXMoU2V0IG5hbWVzcGFjZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQobmFtZXNwYWNlcy5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbmFtZXNwYWNlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBucyA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcobnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgT3V0cHV0U3RyZWFtIGdldFNhdmVyU3RyZWFtKFN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShfYmFzZVNhdmVEaXIsIG5hbWUpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLklPX0VYQ0VQVElPTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBJbnB1dFN0cmVhbSBnZXRMb2FkZXJTdHJlYW0oU3RyaW5nIHJlc291cmNlbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9yZXNvdXJjZUxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc291cmNlbmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRmluaXNoZXMgbG9hZGluZyBhbiBlbGVtZW50IGFmdGVyIHRoZSBoZWFkZXIgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudCBmaW5pc2hMb2FkaW5nRWxlbWVudCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBoYW5kbGUgPSBudWxsOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudEltcGwgaW1wbCA9IG5ldyBTY2hlbWFHbG9iYWxFbGVtZW50SW1wbChnZXRUeXBlU3lzdGVtKCkpOwotICAgICAgICAgICAgICAgIHNob3J0IHBhcnRpY2xlVHlwZSA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgIGlmIChwYXJ0aWNsZVR5cGUgIT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIldyb25nIHBhcnRpY2xlIHR5cGUgIiwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uQkFEX1BBUlRJQ0xFX1RZUEUpOwotICAgICAgICAgICAgICAgIGxvYWRQYXJ0aWNsZShpbXBsLCBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5ULCB0cnVlKTsKLSAgICAgICAgICAgICAgICBpbXBsLnNldEZpbGVuYW1lKHJlYWRTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGltcGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIkNhbm5vdCBsb2FkIHR5cGUgZnJvbSB0eXBlc3lzdGVtIiwgX25hbWUsIGhhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5ORVNURURfRVhDRVBUSU9OLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkRW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2NoZW1hR2xvYmFsQXR0cmlidXRlIGZpbmlzaExvYWRpbmdBdHRyaWJ1dGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsIGltcGwgPSBuZXcgU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbChnZXRUeXBlU3lzdGVtKCkpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9hZEF0dHJpYnV0ZShpbXBsKTsKLSAgICAgICAgICAgICAgICBpbXBsLnNldEZpbGVuYW1lKHJlYWRTdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gaW1wbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgdHlwZSBmcm9tIHR5cGVzeXN0ZW0iLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5ORVNURURfRVhDRVBUSU9OLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkRW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFNb2RlbEdyb3VwIGZpbmlzaExvYWRpbmdNb2RlbEdyb3VwKCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hTW9kZWxHcm91cEltcGwgaW1wbCA9IG5ldyBTY2hlbWFNb2RlbEdyb3VwSW1wbChnZXRUeXBlU3lzdGVtKCkpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2FkTW9kZWxHcm91cChpbXBsKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW1wbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgdHlwZSBmcm9tIHR5cGVzeXN0ZW0iLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5ORVNURURfRVhDRVBUSU9OLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkRW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgZmluaXNoTG9hZGluZ0lkZW50aXR5Q29uc3RyYWludCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbCBpbXBsID0gbmV3IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGwoZ2V0VHlwZVN5c3RlbSgpKTsKLSAgICAgICAgICAgICAgICBpbXBsLnNldE5hbWUocmVhZFFOYW1lKCkpOwotICAgICAgICAgICAgICAgIGltcGwuc2V0Q29uc3RyYWludENhdGVnb3J5KHJlYWRTaG9ydCgpKTsKLSAgICAgICAgICAgICAgICBpbXBsLnNldFNlbGVjdG9yKHJlYWRTdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBmaWVsZHMgPSBuZXcgU3RyaW5nW3JlYWRTaG9ydCgpXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBmaWVsZHMubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBmaWVsZHNbaV0gPSByZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgaW1wbC5zZXRGaWVsZHMoZmllbGRzKTsKLQotICAgICAgICAgICAgICAgIGlmIChpbXBsLmdldENvbnN0cmFpbnRDYXRlZ29yeSgpID09IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5DQ19LRVlSRUYpCi0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0UmVmZXJlbmNlZEtleSgoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZilyZWFkSGFuZGxlKCkpOwotCi0gICAgICAgICAgICAgICAgaW50IG1hcENvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgTWFwIG5zTWFwcGluZ3MgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG1hcENvdW50IDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgbnNNYXBwaW5ncy5wdXQocHJlZml4LCB1cmkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbXBsLnNldE5TTWFwKG5zTWFwcGluZ3MpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGltcGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIkNhbm5vdCBsb2FkIHR5cGUgZnJvbSB0eXBlc3lzdGVtIiwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uTkVTVEVEX0VYQ0VQVElPTiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZEVuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hQXR0cmlidXRlR3JvdXAgZmluaXNoTG9hZGluZ0F0dHJpYnV0ZUdyb3VwKCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsIGltcGwgPSBuZXcgU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsKGdldFR5cGVTeXN0ZW0oKSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvYWRBdHRyaWJ1dGVHcm91cChpbXBsKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW1wbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgdHlwZSBmcm9tIHR5cGVzeXN0ZW0iLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5ORVNURURfRVhDRVBUSU9OLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkRW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2NoZW1hVHlwZSBmaW5pc2hMb2FkaW5nVHlwZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVJbXBsIGltcGwgPSBuZXcgU2NoZW1hVHlwZUltcGwoZ2V0VHlwZVN5c3RlbSgpLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBpbXBsLnNldE5hbWUocmVhZFFOYW1lKCkpOwotICAgICAgICAgICAgICAgIGltcGwuc2V0T3V0ZXJTY2hlbWFUeXBlUmVmKHJlYWRUeXBlUmVmKCkpOwotICAgICAgICAgICAgICAgIGltcGwuc2V0QmFzZURlcHRoKHJlYWRTaG9ydCgpKTsKLSAgICAgICAgICAgICAgICBpbXBsLnNldEJhc2VUeXBlUmVmKHJlYWRUeXBlUmVmKCkpOwotICAgICAgICAgICAgICAgIGltcGwuc2V0RGVyaXZhdGlvblR5cGUocmVhZFNob3J0KCkpOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChyZWFkU2hvcnQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRklFTERfR0xPQkFMOgotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRDb250YWluZXJGaWVsZFJlZihyZWFkSGFuZGxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRklFTERfTE9DQUxBVFRSOgotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRDb250YWluZXJGaWVsZEluZGV4KChzaG9ydCkxLCByZWFkU2hvcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9MT0NBTEVMVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0Q29udGFpbmVyRmllbGRJbmRleCgoc2hvcnQpMiwgcmVhZFNob3J0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGltcGwuc2V0RnVsbEphdmFOYW1lKHJlYWRTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaW1wbC5zZXRGdWxsSmF2YUltcGxOYW1lKHJlYWRTdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgICAgICBpbXBsLnNldEFub255bW91c1R5cGVSZWZzKHJlYWRUeXBlUmVmQXJyYXkoKSk7Ci0KLSAgICAgICAgICAgICAgICBpbXBsLnNldEFub255bW91c1VuaW9uTWVtYmVyT3JkaW5hbChyZWFkU2hvcnQoKSk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgZmxhZ3M7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgPSByZWFkSW50KCk7Ci0KLQotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNDb21wbGV4VHlwZSA9ICgoZmxhZ3MgJiBGTEFHX1NJTVBMRV9UWVBFKSA9PSAwKTsKLSAgICAgICAgICAgICAgICBpbXBsLnNldENvbXBpbGVkKChmbGFncyAmIEZMQUdfQ09NUElMRUQpICE9IDApOwotICAgICAgICAgICAgICAgIGltcGwuc2V0RG9jdW1lbnRUeXBlKChmbGFncyAmIEZMQUdfRE9DVU1FTlRfVFlQRSkgIT0gMCk7Ci0gICAgICAgICAgICAgICAgaW1wbC5zZXRBdHRyaWJ1dGVUeXBlKChmbGFncyAmIEZMQUdfQVRUUklCVVRFX1RZUEUpICE9IDApOwotICAgICAgICAgICAgICAgIGltcGwuc2V0U2ltcGxlVHlwZSghaXNDb21wbGV4VHlwZSk7Ci0KLSAgICAgICAgICAgICAgICBzaG9ydCBjb21wbGV4VmFyaWV0eSA9IFNjaGVtYVR5cGUuTk9UX0NPTVBMRVhfVFlQRTsKLSAgICAgICAgICAgICAgICBpZiAoaXNDb21wbGV4VHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0QWJzdHJhY3RGaW5hbCgoZmxhZ3MgJiBGTEFHX0FCU1RSQUNUKSAhPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgRkxBR19GSU5BTF9FWFQpICE9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBGTEFHX0ZJTkFMX1JFU1QpICE9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBGTEFHX0ZJTkFMX0xJU1QpICE9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBGTEFHX0ZJTkFMX1VOSU9OKSAhPSAwKTsKLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRCbG9jaygoZmxhZ3MgJiBGTEFHX0JMT0NLX0VYVCkgIT0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEZMQUdfQkxPQ0tfUkVTVCkgIT0gMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRPcmRlclNlbnNpdGl2ZSgoZmxhZ3MgJiBGTEFHX09SREVSX1NFTlNJVElWRSkgIT0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBsZXhWYXJpZXR5ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0Q29tcGxleFR5cGVWYXJpZXR5KGNvbXBsZXhWYXJpZXR5KTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBBdHRyaWJ1dGUgTW9kZWwgVGFibGUKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsIGF0dHJNb2RlbCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwoKTsKLQotICAgICAgICAgICAgICAgICAgICBzaG9ydCBhdHRyQ291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJNb2RlbC5hZGRBdHRyaWJ1dGUocmVhZEF0dHJpYnV0ZURhdGEoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYXR0ck1vZGVsLnNldFdpbGRjYXJkU2V0KHJlYWRRTmFtZVNldCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXR0ck1vZGVsLnNldFdpbGRjYXJkUHJvY2VzcyhyZWFkU2hvcnQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQXR0cmlidXRlIFByb3BlcnR5IFRhYmxlCi0gICAgICAgICAgICAgICAgICAgIE1hcCBhdHRyUHJvcGVydGllcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNob3J0IGF0dHJQcm9wQ291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyUHJvcENvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSByZWFkUHJvcGVydHlEYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb3AuaXNBdHRyaWJ1dGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiQXR0cmlidXRlIHByb3BlcnR5ICIgKyBpICsgIiBpcyBub3QgYW4gYXR0cmlidXRlIiwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uV1JPTkdfUFJPUEVSVFlfVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyUHJvcGVydGllcy5wdXQocHJvcC5nZXROYW1lKCksIHByb3ApOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgY29udGVudE1vZGVsID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgTWFwIGVsZW1Qcm9wZXJ0aWVzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgc2hvcnQgaXNBbGwgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV4VmFyaWV0eSA9PSBTY2hlbWFUeXBlLkVMRU1FTlRfQ09OVEVOVCB8fCBjb21wbGV4VmFyaWV0eSA9PSBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnRlbnQgTW9kZWwgVHJlZQotICAgICAgICAgICAgICAgICAgICAgICAgaXNBbGwgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlW10gcGFydHMgPSByZWFkUGFydGljbGVBcnJheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRNb2RlbCA9IHBhcnRzWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFydHMubGVuZ3RoID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudE1vZGVsID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiQ29udGVudCBtb2RlbCBub3Qgd2VsbC1mb3JtZWQiLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5NQUxGT1JNRURfQ09OVEVOVF9NT0RFTCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgUHJvcGVydHkgVGFibGUKLQotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbVByb3BlcnRpZXMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgZWxlbVByb3BDb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtUHJvcENvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IHJlYWRQcm9wZXJ0eURhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcC5pc0F0dHJpYnV0ZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiRWxlbWVudCBwcm9wZXJ0eSAiICsgaSArICIgaXMgbm90IGFuIGVsZW1lbnQiLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5XUk9OR19QUk9QRVJUWV9UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtUHJvcGVydGllcy5wdXQocHJvcC5nZXROYW1lKCksIHByb3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRDb250ZW50TW9kZWwoY29udGVudE1vZGVsLCBhdHRyTW9kZWwsIGVsZW1Qcm9wZXJ0aWVzLCBhdHRyUHJvcGVydGllcywgaXNBbGwgPT0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0c2NDb21wbGV4VHlwZVJlc29sdmVyLldpbGRjYXJkUmVzdWx0IHdjRWx0ID0gU3RzY0NvbXBsZXhUeXBlUmVzb2x2ZXIuc3VtbWFyaXplRWx0V2lsZGNhcmRzKGNvbnRlbnRNb2RlbCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0c2NDb21wbGV4VHlwZVJlc29sdmVyLldpbGRjYXJkUmVzdWx0IHdjQXR0ciA9IFN0c2NDb21wbGV4VHlwZVJlc29sdmVyLnN1bW1hcml6ZUF0dHJXaWxkY2FyZHMoYXR0ck1vZGVsKTsKLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRXaWxkY2FyZFN1bW1hcnkod2NFbHQudHlwZWRXaWxkY2FyZHMsIHdjRWx0Lmhhc1dpbGRjYXJkcywgd2NBdHRyLnR5cGVkV2lsZGNhcmRzLCB3Y0F0dHIuaGFzV2lsZGNhcmRzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWlzQ29tcGxleFR5cGUgfHwgY29tcGxleFZhcmlldHkgPT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNob3J0IHNpbXBsZVZhcmlldHkgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRTaW1wbGVUeXBlVmFyaWV0eShzaW1wbGVWYXJpZXR5KTsKLQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzU3RyaW5nRW51bSA9ICgoZmxhZ3MgJiBGTEFHX1NUUklOR0VOVU0pICE9IDApOwotCi0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0T3JkZXJlZCgoZmxhZ3MgJiBGTEFHX09SREVSRUQpICE9IDAgPyBTY2hlbWFUeXBlLlVOT1JERVJFRCA6ICgoZmxhZ3MgJiBGTEFHX1RPVEFMX09SREVSKSAhPSAwID8gU2NoZW1hVHlwZS5UT1RBTF9PUkRFUiA6IFNjaGVtYVR5cGUuUEFSVElBTF9PUkRFUikpOwotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldEJvdW5kZWQoKGZsYWdzICYgRkxBR19CT1VOREVEKSAhPSAwKTsKLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRGaW5pdGUoKGZsYWdzICYgRkxBR19GSU5JVEUpICE9IDApOwotICAgICAgICAgICAgICAgICAgICBpbXBsLnNldE51bWVyaWMoKGZsYWdzICYgRkxBR19OVU1FUklDKSAhPSAwKTsKLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRVbmlvbk9mTGlzdHMoKGZsYWdzICYgRkxBR19VTklPTl9PRl9MSVNUUykgIT0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0U2ltcGxlRmluYWwoKGZsYWdzICYgRkxBR19GSU5BTF9SRVNUKSAhPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgRkxBR19GSU5BTF9MSVNUKSAhPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgRkxBR19GSU5BTF9VTklPTikgIT0gMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgWG1sVmFsdWVSZWZbXSBmYWNldHMgPSBuZXcgWG1sVmFsdWVSZWZbU2NoZW1hVHlwZS5MQVNUX0ZBQ0VUICsgMV07Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW5bXSBmaXhlZEZhY2V0cyA9IG5ldyBib29sZWFuW1NjaGVtYVR5cGUuTEFTVF9GQUNFVCArIDFdOwotICAgICAgICAgICAgICAgICAgICBzaG9ydCBmYWNldENvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmFjZXRDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBmYWNldENvZGUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhY2V0c1tmYWNldENvZGVdID0gcmVhZFhtbFZhbHVlT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXhlZEZhY2V0c1tmYWNldENvZGVdID0gKHJlYWRTaG9ydCgpID09IDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0QmFzaWNGYWNldHMoZmFjZXRzLCBmaXhlZEZhY2V0cyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRXaGl0ZVNwYWNlUnVsZShyZWFkU2hvcnQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRQYXR0ZXJuRmFjZXQoKGZsYWdzICYgRkxBR19IQVNfUEFUVEVSTikgIT0gMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2hvcnQgcGF0dGVybkNvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbltdIHBhdHRlcm5zID0gbmV3IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbltwYXR0ZXJuQ291bnRdOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm5Db3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuc1tpXSA9IG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb24ocmVhZFN0cmluZygpLCAiWCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0UGF0dGVybnMocGF0dGVybnMpOwotCi0gICAgICAgICAgICAgICAgICAgIHNob3J0IGVudW1Db3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgICAgICBYbWxWYWx1ZVJlZltdIGVudW1WYWx1ZXMgPSBuZXcgWG1sVmFsdWVSZWZbZW51bUNvdW50XTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZW51bVZhbHVlc1tpXSA9IHJlYWRYbWxWYWx1ZU9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGltcGwuc2V0RW51bWVyYXRpb25WYWx1ZXMoZW51bUNvdW50ID09IDAgPyBudWxsIDogZW51bVZhbHVlcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRCYXNlRW51bVR5cGVSZWYocmVhZFR5cGVSZWYoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1N0cmluZ0VudW0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHNlQ291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVN0cmluZ0VudW1FbnRyeVtdIGVudHJpZXMgPSBuZXcgU2NoZW1hU3RyaW5nRW51bUVudHJ5W3NlQ291bnRdOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZUNvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllc1tpXSA9IG5ldyBTY2hlbWFTdHJpbmdFbnVtRW50cnlJbXBsKHJlYWRTdHJpbmcoKSwgcmVhZFNob3J0KCksIHJlYWRTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsLnNldFN0cmluZ0VudW1FbnRyaWVzKGVudHJpZXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzaW1wbGVWYXJpZXR5KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQVRPTUlDOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0UHJpbWl0aXZlVHlwZVJlZihyZWFkVHlwZVJlZigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsLnNldERlY2ltYWxTaXplKHJlYWRJbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0UHJpbWl0aXZlVHlwZVJlZihCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFLmdldFJlZigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsLnNldExpc3RJdGVtVHlwZVJlZihyZWFkVHlwZVJlZigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0UHJpbWl0aXZlVHlwZVJlZihCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFLmdldFJlZigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsLnNldFVuaW9uTWVtYmVyVHlwZVJlZnMocmVhZFR5cGVSZWZBcnJheSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiU2ltcGxlIHR5cGUgZG9lcyBub3QgaGF2ZSBhIHJlY29nbml6ZWQgdmFyaWV0eSIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLldST05HX1NJTVBMRV9WQVJJRVRZKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGltcGwuc2V0RmlsZW5hbWUocmVhZFN0cmluZygpKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBpbXBsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCB0eXBlIGZyb20gdHlwZXN5c3RlbSIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLk5FU1RFRF9FWENFUFRJT04sIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRFbmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVUeXBlRGF0YShTY2hlbWFUeXBlIHR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlUU5hbWUodHlwZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgd3JpdGVUeXBlKHR5cGUuZ2V0T3V0ZXJUeXBlKCkpOwotICAgICAgICAgICAgd3JpdGVTaG9ydCgoKFNjaGVtYVR5cGVJbXBsKXR5cGUpLmdldEJhc2VEZXB0aCgpKTsKLSAgICAgICAgICAgIHdyaXRlVHlwZSh0eXBlLmdldEJhc2VUeXBlKCkpOwotICAgICAgICAgICAgd3JpdGVTaG9ydCh0eXBlLmdldERlcml2YXRpb25UeXBlKCkpOwotICAgICAgICAgICAgaWYgKHR5cGUuZ2V0Q29udGFpbmVyRmllbGQoKSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoRklFTERfTk9ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0eXBlLmdldE91dGVyVHlwZSgpLmlzQXR0cmlidXRlVHlwZSgpIHx8IHR5cGUuZ2V0T3V0ZXJUeXBlKCkuaXNEb2N1bWVudFR5cGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KEZJRUxEX0dMT0JBTCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVIYW5kbGUoKFNjaGVtYUNvbXBvbmVudCl0eXBlLmdldENvbnRhaW5lckZpZWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodHlwZS5nZXRDb250YWluZXJGaWVsZCgpLmlzQXR0cmlidXRlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydChGSUVMRF9MT0NBTEFUVFIpOwotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoKChTY2hlbWFUeXBlSW1wbCl0eXBlLmdldE91dGVyVHlwZSgpKS5nZXRJbmRleEZvckxvY2FsQXR0cmlidXRlKChTY2hlbWFMb2NhbEF0dHJpYnV0ZSl0eXBlLmdldENvbnRhaW5lckZpZWxkKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KEZJRUxEX0xPQ0FMRUxUKTsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KCgoU2NoZW1hVHlwZUltcGwpdHlwZS5nZXRPdXRlclR5cGUoKSkuZ2V0SW5kZXhGb3JMb2NhbEVsZW1lbnQoKFNjaGVtYUxvY2FsRWxlbWVudCl0eXBlLmdldENvbnRhaW5lckZpZWxkKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlU3RyaW5nKHR5cGUuZ2V0RnVsbEphdmFOYW1lKCkpOwotICAgICAgICAgICAgd3JpdGVTdHJpbmcodHlwZS5nZXRGdWxsSmF2YUltcGxOYW1lKCkpOwotICAgICAgICAgICAgd3JpdGVUeXBlQXJyYXkodHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQodHlwZS5nZXRBbm9ueW1vdXNVbmlvbk1lbWJlck9yZGluYWwoKSk7Ci0KLSAgICAgICAgICAgIGludCBmbGFncyA9IDA7Ci0gICAgICAgICAgICBpZiAodHlwZS5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1NJTVBMRV9UWVBFOwotICAgICAgICAgICAgaWYgKHR5cGUuaXNEb2N1bWVudFR5cGUoKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0RPQ1VNRU5UX1RZUEU7Ci0gICAgICAgICAgICBpZiAodHlwZS5pc0F0dHJpYnV0ZVR5cGUoKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0FUVFJJQlVURV9UWVBFOwotICAgICAgICAgICAgaWYgKHR5cGUub3JkZXJlZCgpICE9IFNjaGVtYVR5cGUuVU5PUkRFUkVEKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfT1JERVJFRDsKLSAgICAgICAgICAgIGlmICh0eXBlLm9yZGVyZWQoKSA9PSBTY2hlbWFUeXBlLlRPVEFMX09SREVSKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfVE9UQUxfT1JERVI7Ci0gICAgICAgICAgICBpZiAodHlwZS5pc0JvdW5kZWQoKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0JPVU5ERUQ7Ci0gICAgICAgICAgICBpZiAodHlwZS5pc0Zpbml0ZSgpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfRklOSVRFOwotICAgICAgICAgICAgaWYgKHR5cGUuaXNOdW1lcmljKCkpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19OVU1FUklDOwotICAgICAgICAgICAgaWYgKHR5cGUuaGFzU3RyaW5nRW51bVZhbHVlcygpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfU1RSSU5HRU5VTTsKLSAgICAgICAgICAgIGlmICgoKFNjaGVtYVR5cGVJbXBsKXR5cGUpLmlzVW5pb25PZkxpc3RzKCkpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19VTklPTl9PRl9MSVNUUzsKLSAgICAgICAgICAgIGlmICh0eXBlLmhhc1BhdHRlcm5GYWNldCgpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfSEFTX1BBVFRFUk47Ci0gICAgICAgICAgICBpZiAodHlwZS5pc09yZGVyU2Vuc2l0aXZlKCkpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19PUkRFUl9TRU5TSVRJVkU7Ci0KLSAgICAgICAgICAgIGlmICh0eXBlLmJsb2NrRXh0ZW5zaW9uKCkpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19CTE9DS19FWFQ7Ci0gICAgICAgICAgICBpZiAodHlwZS5ibG9ja1Jlc3RyaWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19CTE9DS19SRVNUOwotICAgICAgICAgICAgaWYgKHR5cGUuZmluYWxFeHRlbnNpb24oKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0ZJTkFMX0VYVDsKLSAgICAgICAgICAgIGlmICh0eXBlLmZpbmFsUmVzdHJpY3Rpb24oKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0ZJTkFMX0VYVDsKLSAgICAgICAgICAgIGlmICh0eXBlLmZpbmFsTGlzdCgpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfRklOQUxfTElTVDsKLSAgICAgICAgICAgIGlmICh0eXBlLmZpbmFsVW5pb24oKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0ZJTkFMX1VOSU9OOwotICAgICAgICAgICAgaWYgKHR5cGUuaXNBYnN0cmFjdCgpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfQUJTVFJBQ1Q7Ci0KLSAgICAgICAgICAgIHdyaXRlSW50KGZsYWdzKTsKLQotICAgICAgICAgICAgaWYgKCF0eXBlLmlzU2ltcGxlVHlwZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQodHlwZS5nZXRDb250ZW50VHlwZSgpKTsKLQotICAgICAgICAgICAgICAgIC8vIEF0dHJpYnV0ZSBNb2RlbCBUYWJsZQotICAgICAgICAgICAgICAgIFNjaGVtYUF0dHJpYnV0ZU1vZGVsIGF0dHJNb2RlbCA9IHR5cGUuZ2V0QXR0cmlidXRlTW9kZWwoKTsKLSAgICAgICAgICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZVtdIGF0dHJzID0gYXR0ck1vZGVsLmdldEF0dHJpYnV0ZXMoKTsKLQotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoYXR0cnMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZURhdGEoYXR0cnNbaV0pOwotCi0gICAgICAgICAgICAgICAgd3JpdGVRTmFtZVNldChhdHRyTW9kZWwuZ2V0V2lsZGNhcmRTZXQoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydChhdHRyTW9kZWwuZ2V0V2lsZGNhcmRQcm9jZXNzKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gQXR0cmlidXRlIFByb3BlcnR5IFRhYmxlCi0gICAgICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlbXSBhdHRyUHJvcGVydGllcyA9IHR5cGUuZ2V0QXR0cmlidXRlUHJvcGVydGllcygpOwotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoYXR0clByb3BlcnRpZXMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB3cml0ZVByb3BlcnR5RGF0YShhdHRyUHJvcGVydGllc1tpXSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodHlwZS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuRUxFTUVOVF9DT05URU5UIHx8Ci0gICAgICAgICAgICAgICAgICAgIHR5cGUuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBDb250ZW50IE1vZGVsIFRyZWUKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVTaG9ydCh0eXBlLmhhc0FsbENvbnRlbnQoKSA/IDEgOiAwKTsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGVbXSBwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuZ2V0Q29udGVudE1vZGVsKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzID0gbmV3IFNjaGVtYVBhcnRpY2xlW10geyB0eXBlLmdldENvbnRlbnRNb2RlbCgpIH07Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzID0gbmV3IFNjaGVtYVBhcnRpY2xlWzBdOwotCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlUGFydGljbGVBcnJheShwYXJ0cyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRWxlbWVudCBQcm9wZXJ0eSBUYWJsZQotICAgICAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eVtdIGVsdFByb3BlcnRpZXMgPSB0eXBlLmdldEVsZW1lbnRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoZWx0UHJvcGVydGllcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsdFByb3BlcnRpZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVByb3BlcnR5RGF0YShlbHRQcm9wZXJ0aWVzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0eXBlLmlzU2ltcGxlVHlwZSgpIHx8IHR5cGUuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQodHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkpOwotCi0gICAgICAgICAgICAgICAgaW50IGZhY2V0Q291bnQgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IFNjaGVtYVR5cGUuTEFTVF9GQUNFVDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5nZXRGYWNldChpKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXRDb3VudCsrOwotICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoZmFjZXRDb3VudCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gU2NoZW1hVHlwZS5MQVNUX0ZBQ0VUOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYbWxBbnlTaW1wbGVUeXBlIGZhY2V0ID0gdHlwZS5nZXRGYWNldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZhY2V0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVhtbFZhbHVlT2JqZWN0KGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQodHlwZS5pc0ZhY2V0Rml4ZWQoaSkgPyAxIDogMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KHR5cGUuZ2V0V2hpdGVTcGFjZVJ1bGUoKSk7Ci0KLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bXSBwYXR0ZXJucyA9ICgoU2NoZW1hVHlwZUltcGwpdHlwZSkuZ2V0UGF0dGVybkV4cHJlc3Npb25zKCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydChwYXR0ZXJucy5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0dGVybnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKHBhdHRlcm5zW2ldLmdldFBhdHRlcm4oKSk7Ci0KLSAgICAgICAgICAgICAgICBYbWxBbnlTaW1wbGVUeXBlW10gZW51bVZhbHVlcyA9IHR5cGUuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKTsKLSAgICAgICAgICAgICAgICBpZiAoZW51bVZhbHVlcyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB3cml0ZVNob3J0KDApOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoZW51bVZhbHVlcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1WYWx1ZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVhtbFZhbHVlT2JqZWN0KGVudW1WYWx1ZXNbaV0pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIG5ldyBmb3IgdmVyc2lvbiAyLjMKLSAgICAgICAgICAgICAgICB3cml0ZVR5cGUodHlwZS5nZXRCYXNlRW51bVR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUuaGFzU3RyaW5nRW51bVZhbHVlcygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hU3RyaW5nRW51bUVudHJ5W10gZW50cmllcyA9IHR5cGUuZ2V0U3RyaW5nRW51bUVudHJpZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVTaG9ydChlbnRyaWVzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoZW50cmllc1tpXS5nZXRTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNob3J0KGVudHJpZXNbaV0uZ2V0SW50VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyhlbnRyaWVzW2ldLmdldEVudW1OYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlLmdldFNpbXBsZVZhcmlldHkoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5BVE9NSUM6Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVR5cGUodHlwZS5nZXRQcmltaXRpdmVUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJbnQodHlwZS5nZXREZWNpbWFsU2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUOgotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVUeXBlKHR5cGUuZ2V0TGlzdEl0ZW1UeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OOgotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVUeXBlQXJyYXkodHlwZS5nZXRVbmlvbk1lbWJlclR5cGVzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3cml0ZVN0cmluZyh0eXBlLmdldFNvdXJjZU5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHJlYWRFeHRlbnNpb25zTGlzdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgYXNzZXJ0IGNvdW50ID09IDA7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgcmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgIHJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlIHJlYWRBdHRyaWJ1dGVEYXRhKCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGVJbXBsIHJlc3VsdCA9IG5ldyBTY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwoKTsKLSAgICAgICAgICAgIGxvYWRBdHRyaWJ1dGUocmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGxvYWRNb2RlbEdyb3VwKFNjaGVtYU1vZGVsR3JvdXBJbXBsIHJlc3VsdCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmluaXQocmVhZFFOYW1lKCksIHJlYWRTdHJpbmcoKSwgcmVhZFNob3J0KCkgPT0gMSwgYXRMZWFzdCgyLCAxNSwgMCkgPyByZWFkU2hvcnQoKSA9PSAxIDogZmFsc2UsIEdyb3VwRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSggcmVhZFN0cmluZygpICkuZ2V0R3JvdXAoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFhtbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCksIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgbG9hZEF0dHJpYnV0ZUdyb3VwKFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbCByZXN1bHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdC5pbml0KCByZWFkUU5hbWUoKSwgcmVhZFN0cmluZygpLCByZWFkU2hvcnQoKSA9PSAxLCBhdExlYXN0KDIsIDE1LCAwKSA/IHJlYWRTaG9ydCgpID09IDEgOiBmYWxzZSwgQXR0cmlidXRlR3JvdXBEb2N1bWVudC5GYWN0b3J5LnBhcnNlKCByZWFkU3RyaW5nKCkgKS5nZXRBdHRyaWJ1dGVHcm91cCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBsb2FkQXR0cmlidXRlKFNjaGVtYUxvY2FsQXR0cmlidXRlSW1wbCByZXN1bHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIG5hbWUsIHR5cGUsIHVzZSwgZGVmdGV4dCwgZGVmdmFsLCBmaXhlZCwgc29hcGFycmF5dHlwZQotICAgICAgICAgICAgcmVzdWx0LmluaXQocmVhZFFOYW1lKCksIHJlYWRUeXBlUmVmKCksIHJlYWRTaG9ydCgpLCByZWFkU3RyaW5nKCksIG51bGwsIGF0TGVhc3QoMiwgMTYsIDApID8gcmVhZFhtbFZhbHVlT2JqZWN0KCkgOiBudWxsLCByZWFkU2hvcnQoKSA9PSAxLCByZWFkU09BUEFycmF5VHlwZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVBdHRyaWJ1dGVEYXRhKFNjaGVtYUxvY2FsQXR0cmlidXRlIGF0dHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlUU5hbWUoYXR0ci5nZXROYW1lKCkpOwotICAgICAgICAgICAgd3JpdGVUeXBlKGF0dHIuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoYXR0ci5nZXRVc2UoKSk7Ci0gICAgICAgICAgICB3cml0ZVN0cmluZyhhdHRyLmdldERlZmF1bHRUZXh0KCkpOwotICAgICAgICAgICAgd3JpdGVYbWxWYWx1ZU9iamVjdChhdHRyLmdldERlZmF1bHRWYWx1ZSgpKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoYXR0ci5pc0ZpeGVkKCkgPyAxIDogMCk7Ci0gICAgICAgICAgICB3cml0ZVNPQVBBcnJheVR5cGUoKChTY2hlbWFXU0RMQXJyYXlUeXBlKWF0dHIpLmdldFdTRExBcnJheVR5cGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlSWRDb25zdHJhaW50RGF0YShTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgaWRjKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZVFOYW1lKGlkYy5nZXROYW1lKCkpOwotICAgICAgICAgICAgd3JpdGVTaG9ydChpZGMuZ2V0Q29uc3RyYWludENhdGVnb3J5KCkpOwotICAgICAgICAgICAgd3JpdGVTdHJpbmcoaWRjLmdldFNlbGVjdG9yKCkpOwotCi0gICAgICAgICAgICBTdHJpbmdbXSBmaWVsZHMgPSBpZGMuZ2V0RmllbGRzKCk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KGZpZWxkcy5sZW5ndGgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZmllbGRzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyhmaWVsZHNbaV0pOwotCi0KLSAgICAgICAgICAgIGlmIChpZGMuZ2V0Q29uc3RyYWludENhdGVnb3J5KCkgPT0gU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LkNDX0tFWVJFRikKLSAgICAgICAgICAgICAgICB3cml0ZUhhbmRsZShpZGMuZ2V0UmVmZXJlbmNlZEtleSgpKTsKLQotICAgICAgICAgICAgU2V0IG1hcHBpbmdzID0gaWRjLmdldE5TTWFwKCkuZW50cnlTZXQoKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQobWFwcGluZ3Muc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtYXBwaW5ncy5pdGVyYXRvcigpIDsgaXQuaGFzTmV4dCgpIDsgKSB7Ci0gICAgICAgICAgICAgICAgTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KWl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZyllLmdldEtleSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSAoU3RyaW5nKWUuZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcodXJpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSByZWFkUGFydGljbGVBcnJheSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlW10gcmVzdWx0ID0gbmV3IFNjaGVtYVBhcnRpY2xlW3JlYWRTaG9ydCgpXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IHJlYWRQYXJ0aWNsZURhdGEoKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlUGFydGljbGVBcnJheShTY2hlbWFQYXJ0aWNsZVtdIHNwYSkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVTaG9ydChzcGEubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHdyaXRlUGFydGljbGVEYXRhKHNwYVtpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFQYXJ0aWNsZSByZWFkUGFydGljbGVEYXRhKCkKLSAgICAgICAgewotICAgICAgICAgICAgc2hvcnQgcGFydGljbGVUeXBlID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZUltcGwgcmVzdWx0OwotICAgICAgICAgICAgaWYgKHBhcnRpY2xlVHlwZSAhPSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTY2hlbWFQYXJ0aWNsZUltcGwoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgU2NoZW1hTG9jYWxFbGVtZW50SW1wbCgpOwotICAgICAgICAgICAgbG9hZFBhcnRpY2xlKHJlc3VsdCwgcGFydGljbGVUeXBlLCBmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBsb2FkUGFydGljbGUoU2NoZW1hUGFydGljbGVJbXBsIHJlc3VsdCwgaW50IHBhcnRpY2xlVHlwZSwgYm9vbGVhbiBnbG9iYWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNob3J0IHBhcnRpY2xlRmxhZ3MgPSByZWFkU2hvcnQoKTsKLQotICAgICAgICAgICAgcmVzdWx0LnNldFBhcnRpY2xlVHlwZShwYXJ0aWNsZVR5cGUpOwotICAgICAgICAgICAgcmVzdWx0LnNldE1pbk9jY3VycyhyZWFkQmlnSW50ZWdlcigpKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRNYXhPY2N1cnMocmVhZEJpZ0ludGVnZXIoKSk7Ci0KLSAgICAgICAgICAgIHJlc3VsdC5zZXRUcmFuc2l0aW9uUnVsZXMocmVhZFFOYW1lU2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJ0aWNsZUZsYWdzICYgRkxBR19QQVJUX1NLSVBQQUJMRSkgIT0gMCk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAocGFydGljbGVUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRXaWxkY2FyZFNldChyZWFkUU5hbWVTZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRXaWxkY2FyZFByb2Nlc3MocmVhZFNob3J0KCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9jYWxFbGVtZW50SW1wbCBscmVzdWx0ID0gKFNjaGVtYUxvY2FsRWxlbWVudEltcGwpcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICBscmVzdWx0LnNldE5hbWVBbmRUeXBlUmVmKHJlYWRRTmFtZSgpLCByZWFkVHlwZVJlZigpKTsKLSAgICAgICAgICAgICAgICAgICAgbHJlc3VsdC5zZXREZWZhdWx0KHJlYWRTdHJpbmcoKSwgKHBhcnRpY2xlRmxhZ3MgJiBGTEFHX1BBUlRfRklYRUQpICE9IDAsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXRMZWFzdCgyLCAxNiwgMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBscmVzdWx0LnNldERlZmF1bHRWYWx1ZShyZWFkWG1sVmFsdWVPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGxyZXN1bHQuc2V0TmlsbGFibGUoKHBhcnRpY2xlRmxhZ3MgJiBGTEFHX1BBUlRfTklMTEFCTEUpICE9IDApOwotICAgICAgICAgICAgICAgICAgICBscmVzdWx0LnNldEJsb2NrKChwYXJ0aWNsZUZsYWdzICYgRkxBR19QQVJUX0JMT0NLRVhUKSAhPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJ0aWNsZUZsYWdzICYgRkxBR19QQVJUX0JMT0NLUkVTVCkgIT0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFydGljbGVGbGFncyAmIEZMQUdfUEFSVF9CTE9DS1NVQlNUKSAhPSAwKTsKLSAgICAgICAgICAgICAgICAgICAgbHJlc3VsdC5zZXRXc2RsQXJyYXlUeXBlKHJlYWRTT0FQQXJyYXlUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICBscmVzdWx0LnNldEFic3RyYWN0KChwYXJ0aWNsZUZsYWdzICYgRkxBR19QQVJUX0FCU1RSQUNUKSAhPSAwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudEltcGwgZ3Jlc3VsdCA9IChTY2hlbWFHbG9iYWxFbGVtZW50SW1wbClscmVzdWx0OwotICAgICAgICAgICAgICAgICAgICAgICAgZ3Jlc3VsdC5zZXRGaW5hbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFydGljbGVGbGFncyAmIEZMQUdfUEFSVF9GSU5BTEVYVCkgIT0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFydGljbGVGbGFncyAmIEZMQUdfUEFSVF9GSU5BTFJFU1QpICE9IDApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXRMZWFzdCgyLCAxNywgMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jlc3VsdC5zZXRTdWJzdGl0dXRpb25Hcm91cCgoU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYpcmVhZEhhbmRsZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgc3Vic3RHcm91cENvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YnN0R3JvdXBDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXN1bHQuYWRkU3Vic3RpdHV0aW9uR3JvdXBNZW1iZXIocmVhZFFOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZltdIGlkY3MgPSBuZXcgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZltyZWFkU2hvcnQoKV07Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgaWRjcy5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBpZGNzW2ldID0gKFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWYpcmVhZEhhbmRsZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGxyZXN1bHQuc2V0SWRlbnRpdHlDb25zdHJhaW50cyhpZGNzKTsKLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRQYXJ0aWNsZUNoaWxkcmVuKHJlYWRQYXJ0aWNsZUFycmF5KCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgcGFydGljbGUgdHlwZSAiLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5CQURfUEFSVElDTEVfVFlQRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlUGFydGljbGVEYXRhKFNjaGVtYVBhcnRpY2xlIHBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQocGFydC5nZXRQYXJ0aWNsZVR5cGUoKSk7Ci0gICAgICAgICAgICBzaG9ydCBmbGFncyA9IDA7Ci0gICAgICAgICAgICBpZiAocGFydC5pc1NraXBwYWJsZSgpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUEFSVF9TS0lQUEFCTEU7Ci0gICAgICAgICAgICBpZiAocGFydC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYUxvY2FsRWxlbWVudCBscGFydCA9IChTY2hlbWFMb2NhbEVsZW1lbnQpcGFydDsKLSAgICAgICAgICAgICAgICBpZiAobHBhcnQuaXNGaXhlZCgpKQotICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1BBUlRfRklYRUQ7Ci0gICAgICAgICAgICAgICAgaWYgKGxwYXJ0LmlzTmlsbGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19QQVJUX05JTExBQkxFOwotICAgICAgICAgICAgICAgIGlmIChscGFydC5ibG9ja0V4dGVuc2lvbigpKQotICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1BBUlRfQkxPQ0tFWFQ7Ci0gICAgICAgICAgICAgICAgaWYgKGxwYXJ0LmJsb2NrUmVzdHJpY3Rpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19QQVJUX0JMT0NLUkVTVDsKLSAgICAgICAgICAgICAgICBpZiAobHBhcnQuYmxvY2tTdWJzdGl0dXRpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19QQVJUX0JMT0NLU1VCU1Q7Ci0gICAgICAgICAgICAgICAgaWYgKGxwYXJ0LmlzQWJzdHJhY3QoKSkKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19QQVJUX0FCU1RSQUNUOwotCi0gICAgICAgICAgICAgICAgaWYgKGxwYXJ0IGluc3RhbmNlb2YgU2NoZW1hR2xvYmFsRWxlbWVudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQgZ3BhcnQgPSAoU2NoZW1hR2xvYmFsRWxlbWVudClscGFydDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdwYXJ0LmZpbmFsRXh0ZW5zaW9uKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1BBUlRfRklOQUxFWFQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChncGFydC5maW5hbFJlc3RyaWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1BBUlRfRklOQUxSRVNUOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlU2hvcnQoZmxhZ3MpOwotICAgICAgICAgICAgd3JpdGVCaWdJbnRlZ2VyKHBhcnQuZ2V0TWluT2NjdXJzKCkpOwotICAgICAgICAgICAgd3JpdGVCaWdJbnRlZ2VyKHBhcnQuZ2V0TWF4T2NjdXJzKCkpOwotICAgICAgICAgICAgd3JpdGVRTmFtZVNldChwYXJ0LmFjY2VwdGVkU3RhcnROYW1lcygpKTsKLQotICAgICAgICAgICAgc3dpdGNoIChwYXJ0LmdldFBhcnRpY2xlVHlwZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlUU5hbWVTZXQocGFydC5nZXRXaWxkY2FyZFNldCgpKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVTaG9ydChwYXJ0LmdldFdpbGRjYXJkUHJvY2VzcygpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvY2FsRWxlbWVudCBscGFydCA9IChTY2hlbWFMb2NhbEVsZW1lbnQpcGFydDsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVRTmFtZShscGFydC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZVR5cGUobHBhcnQuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcobHBhcnQuZ2V0RGVmYXVsdFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlWG1sVmFsdWVPYmplY3QobHBhcnQuZ2V0RGVmYXVsdFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZVNPQVBBcnJheVR5cGUoKChTY2hlbWFXU0RMQXJyYXlUeXBlKWxwYXJ0KS5nZXRXU0RMQXJyYXlUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAobHBhcnQgaW5zdGFuY2VvZiBTY2hlbWFHbG9iYWxFbGVtZW50KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50IGdwYXJ0ID0gKFNjaGVtYUdsb2JhbEVsZW1lbnQpbHBhcnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSGFuZGxlKGdwYXJ0LnN1YnN0aXR1dGlvbkdyb3VwKCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBRTmFtZVtdIHN1YnN0R3JvdXBNZW1iZXJzID0gZ3BhcnQuc3Vic3RpdHV0aW9uR3JvdXBNZW1iZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNob3J0KHN1YnN0R3JvdXBNZW1iZXJzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YnN0R3JvdXBNZW1iZXJzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlUU5hbWUoc3Vic3RHcm91cE1lbWJlcnNbaV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50W10gaWRjcyA9IGxwYXJ0LmdldElkZW50aXR5Q29uc3RyYWludHMoKTsKLQotICAgICAgICAgICAgICAgICAgICB3cml0ZVNob3J0KGlkY3MubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgaWRjcy5sZW5ndGggOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUhhbmRsZShpZGNzW2ldKTsKLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlUGFydGljbGVBcnJheShwYXJ0LmdldFBhcnRpY2xlQ2hpbGRyZW4oKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIlVucmVjb2duaXplZCBwYXJ0aWNsZSB0eXBlICIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLkJBRF9QQVJUSUNMRV9UWVBFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYVByb3BlcnR5IHJlYWRQcm9wZXJ0eURhdGEoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eUltcGwgcHJvcCA9IG5ldyBTY2hlbWFQcm9wZXJ0eUltcGwoKTsKLSAgICAgICAgICAgIHByb3Auc2V0TmFtZShyZWFkUU5hbWUoKSk7Ci0gICAgICAgICAgICBwcm9wLnNldFR5cGVSZWYocmVhZFR5cGVSZWYoKSk7Ci0gICAgICAgICAgICBzaG9ydCBwcm9wZmxhZ3MgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIHByb3Auc2V0QXR0cmlidXRlKChwcm9wZmxhZ3MgJiBGTEFHX1BST1BfSVNBVFRSKSAhPSAwKTsKLSAgICAgICAgICAgIHByb3Auc2V0Q29udGFpbmVyVHlwZVJlZihyZWFkVHlwZVJlZigpKTsKLSAgICAgICAgICAgIHByb3Auc2V0TWluT2NjdXJzKHJlYWRCaWdJbnRlZ2VyKCkpOwotICAgICAgICAgICAgcHJvcC5zZXRNYXhPY2N1cnMocmVhZEJpZ0ludGVnZXIoKSk7Ci0gICAgICAgICAgICBwcm9wLnNldE5pbGxhYmxlKHJlYWRTaG9ydCgpKTsKLSAgICAgICAgICAgIHByb3Auc2V0RGVmYXVsdChyZWFkU2hvcnQoKSk7Ci0gICAgICAgICAgICBwcm9wLnNldEZpeGVkKHJlYWRTaG9ydCgpKTsKLSAgICAgICAgICAgIHByb3Auc2V0RGVmYXVsdFRleHQocmVhZFN0cmluZygpKTsKLQotICAgICAgICAgICAgcHJvcC5zZXRKYXZhUHJvcGVydHlOYW1lKHJlYWRTdHJpbmcoKSk7Ci0gICAgICAgICAgICBwcm9wLnNldEphdmFUeXBlQ29kZShyZWFkU2hvcnQoKSk7Ci0gICAgICAgICAgICBwcm9wLnNldEV4dGVuZHNKYXZhKHJlYWRUeXBlUmVmKCksCi0gICAgICAgICAgICAgICAgICAgIChwcm9wZmxhZ3MgJiBGTEFHX1BST1BfSkFWQVNJTkdMRVRPTikgIT0gMCwKLSAgICAgICAgICAgICAgICAgICAgKHByb3BmbGFncyAmIEZMQUdfUFJPUF9KQVZBT1BUSU9OQUwpICE9IDAsCi0gICAgICAgICAgICAgICAgICAgIChwcm9wZmxhZ3MgJiBGTEFHX1BST1BfSkFWQUFSUkFZKSAhPSAwKTsKLSAgICAgICAgICAgIHByb3Auc2V0SmF2YVNldHRlckRlbGltaXRlcihyZWFkUU5hbWVTZXQoKSk7Ci0gICAgICAgICAgICBpZiAoYXRMZWFzdCgyLCAxNiwgMCkpCi0gICAgICAgICAgICAgICAgcHJvcC5zZXREZWZhdWx0VmFsdWUocmVhZFhtbFZhbHVlT2JqZWN0KCkpOwotCi0gICAgICAgICAgICBpZiAoIXByb3AuaXNBdHRyaWJ1dGUoKSAmJiBhdExlYXN0KDIsIDE3LCAwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzaG9ydCBzaXplID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgTGlua2VkSGFzaFNldCBxbmFtZXMgPSBuZXcgTGlua2VkSGFzaFNldChzaXplKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBzaXplIDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBxbmFtZXMuYWRkKHJlYWRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBwcm9wLnNldEFjY2VwdGVkTmFtZXMocW5hbWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3Auc2V0SW1tdXRhYmxlKCk7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVQcm9wZXJ0eURhdGEoU2NoZW1hUHJvcGVydHkgcHJvcCkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVRTmFtZShwcm9wLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB3cml0ZVR5cGUocHJvcC5nZXRUeXBlKCkpOwotICAgICAgICAgICAgd3JpdGVTaG9ydCgocHJvcC5pc0F0dHJpYnV0ZSgpID8gRkxBR19QUk9QX0lTQVRUUiA6IDApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgKHByb3AuZXh0ZW5kc0phdmFTaW5nbGV0b24oKSA/IEZMQUdfUFJPUF9KQVZBU0lOR0xFVE9OIDogMCkgfAotICAgICAgICAgICAgICAgICAgICAgICAocHJvcC5leHRlbmRzSmF2YU9wdGlvbigpID8gRkxBR19QUk9QX0pBVkFPUFRJT05BTCA6IDApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgKHByb3AuZXh0ZW5kc0phdmFBcnJheSgpID8gRkxBR19QUk9QX0pBVkFBUlJBWSA6IDApKTsKLSAgICAgICAgICAgIHdyaXRlVHlwZShwcm9wLmdldENvbnRhaW5lclR5cGUoKSk7Ci0gICAgICAgICAgICB3cml0ZUJpZ0ludGVnZXIocHJvcC5nZXRNaW5PY2N1cnMoKSk7Ci0gICAgICAgICAgICB3cml0ZUJpZ0ludGVnZXIocHJvcC5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KHByb3AuaGFzTmlsbGFibGUoKSk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KHByb3AuaGFzRGVmYXVsdCgpKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQocHJvcC5oYXNGaXhlZCgpKTsKLSAgICAgICAgICAgIHdyaXRlU3RyaW5nKHByb3AuZ2V0RGVmYXVsdFRleHQoKSk7Ci0KLSAgICAgICAgICAgIHdyaXRlU3RyaW5nKHByb3AuZ2V0SmF2YVByb3BlcnR5TmFtZSgpKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQocHJvcC5nZXRKYXZhVHlwZUNvZGUoKSk7Ci0gICAgICAgICAgICB3cml0ZVR5cGUocHJvcC5qYXZhQmFzZWRPblR5cGUoKSk7Ci0gICAgICAgICAgICB3cml0ZVFOYW1lU2V0KHByb3AuZ2V0SmF2YVNldHRlckRlbGltaXRlcigpKTsKLSAgICAgICAgICAgIHdyaXRlWG1sVmFsdWVPYmplY3QocHJvcC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIGlmICghIHByb3AuaXNBdHRyaWJ1dGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBRTmFtZVtdIG5hbWVzID0gcHJvcC5hY2NlcHRlZE5hbWVzKCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydChuYW1lcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG5hbWVzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVRTmFtZShuYW1lc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlTW9kZWxHcm91cERhdGEoU2NoZW1hTW9kZWxHcm91cCBncnApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYU1vZGVsR3JvdXBJbXBsIGltcGwgPSAoU2NoZW1hTW9kZWxHcm91cEltcGwpZ3JwOwotICAgICAgICAgICAgd3JpdGVRTmFtZShpbXBsLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB3cml0ZVN0cmluZyhpbXBsLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoaW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSAhPSBudWxsID8gMSA6IDApOwotICAgICAgICAgICAgd3JpdGVTaG9ydChpbXBsLmlzUmVkZWZpbml0aW9uKCkgPyAxIDogMCk7IC8vIG5ldyBmb3IgdmVyc2lvbiAyLjE1Ci0gICAgICAgICAgICB3cml0ZVN0cmluZyhpbXBsLmdldFBhcnNlT2JqZWN0KCkueG1sVGV4dChuZXcgWG1sT3B0aW9ucygpLnNldFNhdmVPdXRlcigpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlQXR0cmlidXRlR3JvdXBEYXRhKFNjaGVtYUF0dHJpYnV0ZUdyb3VwIGdycCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsIGltcGwgPSAoU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsKWdycDsKLSAgICAgICAgICAgIHdyaXRlUU5hbWUoaW1wbC5nZXROYW1lKCkpOwotICAgICAgICAgICAgd3JpdGVTdHJpbmcoaW1wbC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KGltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkgIT0gbnVsbCA/IDEgOiAwKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoaW1wbC5pc1JlZGVmaW5pdGlvbigpID8gMSA6IDApOyAvLyBuZXcgZm9yIHZlcnNpb24gMi4xNQotICAgICAgICAgICAgd3JpdGVTdHJpbmcoaW1wbC5nZXRQYXJzZU9iamVjdCgpLnhtbFRleHQobmV3IFhtbE9wdGlvbnMoKS5zZXRTYXZlT3V0ZXIoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgWG1sVmFsdWVSZWYgcmVhZFhtbFZhbHVlT2JqZWN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZS5SZWYgdHlwZXJlZiA9IHJlYWRUeXBlUmVmKCk7Ci0gICAgICAgICAgICBpZiAodHlwZXJlZiA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgaW50IGJ0YyA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgc3dpdGNoIChidGMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVmFsdWVSZWYodHlwZXJlZiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgY2FzZSAtMToKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTaG9ydCh2YWx1ZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQocmVhZFhtbFZhbHVlT2JqZWN0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxWYWx1ZVJlZih0eXBlcmVmLCB2YWx1ZXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRToKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9VUkk6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRToKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxWYWx1ZVJlZih0eXBlcmVmLCByZWFkU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWToKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVmFsdWVSZWYodHlwZXJlZiwgcmVhZEJ5dGVBcnJheSgpKTsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxWYWx1ZVJlZih0eXBlcmVmLCByZWFkUU5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFZhbHVlUmVmKHR5cGVyZWYsIG5ldyBEb3VibGUocmVhZERvdWJsZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlWG1sVmFsdWVPYmplY3QoWG1sQW55U2ltcGxlVHlwZSB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZSB0eXBlID0gdmFsdWUgPT0gbnVsbCA/IG51bGwgOiB2YWx1ZS5zY2hlbWFUeXBlKCk7Ci0gICAgICAgICAgICB3cml0ZVR5cGUodHlwZSk7Ci0gICAgICAgICAgICBpZiAodHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgU2NoZW1hVHlwZSBpVHlwZSA9ICgoU2ltcGxlVmFsdWUpdmFsdWUpLmluc3RhbmNlVHlwZSgpOwotICAgICAgICAgICAgaWYgKGlUeXBlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydCgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGlUeXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkxJU1QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydCgtMSk7Ci0gICAgICAgICAgICAgICAgTGlzdCB2YWx1ZXMgPSAoKFhtbE9iamVjdEJhc2UpdmFsdWUpLnhnZXRMaXN0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KHZhbHVlcy5zaXplKCkpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHZhbHVlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVYbWxWYWx1ZU9iamVjdCgoWG1sQW55U2ltcGxlVHlwZSlpLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBidGMgPSBpVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVTaG9ydChidGMpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoYnRjKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9VUkk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19USU1FOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKHZhbHVlLmdldFN0cmluZ1ZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOgotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVCeXRlQXJyYXkoKChTaW1wbGVWYWx1ZSl2YWx1ZSkuZ2V0Qnl0ZUFycmF5VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOgotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVRTmFtZSgoKFNpbXBsZVZhbHVlKXZhbHVlKS5nZXRRTmFtZVZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRG91YmxlKCgoU2ltcGxlVmFsdWUpdmFsdWUpLmdldEZsb2F0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRG91YmxlKCgoU2ltcGxlVmFsdWUpdmFsdWUpLmdldERvdWJsZVZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZG91YmxlIHJlYWREb3VibGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2lucHV0LnJlYWREb3VibGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JT19FWENFUFRJT04pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9vdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9vdXRwdXQud3JpdGVEb3VibGUoZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLklPX0VYQ0VQVElPTik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgUU5hbWVTZXQgcmVhZFFOYW1lU2V0KCkKLSAgICAgICAgewotICAgICAgICAgICAgc2hvcnQgZmxhZyA9IHJlYWRTaG9ydCgpOwotCi0gICAgICAgICAgICBTZXQgdXJpU2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgIHNob3J0IHVyaUNvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVyaUNvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgdXJpU2V0LmFkZChyZWFkU3RyaW5nKCkpOwotCi0gICAgICAgICAgICBTZXQgcW5hbWVTZXQxID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgIHNob3J0IHFuY291bnQxID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuY291bnQxOyBpKyspCi0gICAgICAgICAgICAgICAgcW5hbWVTZXQxLmFkZChyZWFkUU5hbWUoKSk7Ci0KLSAgICAgICAgICAgIFNldCBxbmFtZVNldDIgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAgICAgc2hvcnQgcW5jb3VudDIgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5jb3VudDI7IGkrKykKLSAgICAgICAgICAgICAgICBxbmFtZVNldDIuYWRkKHJlYWRRTmFtZSgpKTsKLQotICAgICAgICAgICAgaWYgKGZsYWcgPT0gMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gUU5hbWVTZXQuZm9yU2V0cyh1cmlTZXQsIG51bGwsIHFuYW1lU2V0MSwgcW5hbWVTZXQyKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gUU5hbWVTZXQuZm9yU2V0cyhudWxsLCB1cmlTZXQsIHFuYW1lU2V0MiwgcW5hbWVTZXQxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVRTmFtZVNldChRTmFtZVNldCBzZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gaW52ZXJ0ID0gKHNldC5leGNsdWRlZFVSSXMoKSAhPSBudWxsKTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoaW52ZXJ0ID8gMSA6IDApOwotCi0gICAgICAgICAgICBTZXQgdXJpU2V0ID0gaW52ZXJ0ID8gc2V0LmV4Y2x1ZGVkVVJJcygpIDogc2V0LmluY2x1ZGVkVVJJcygpOwotICAgICAgICAgICAgd3JpdGVTaG9ydCh1cmlTZXQuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHVyaVNldC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKChTdHJpbmcpaS5uZXh0KCkpOwotCi0gICAgICAgICAgICBTZXQgcW5hbWVTZXQxID0gaW52ZXJ0ID8gc2V0LmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKSA6IHNldC5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KHFuYW1lU2V0MS5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcW5hbWVTZXQxLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgd3JpdGVRTmFtZSgoUU5hbWUpaS5uZXh0KCkpOwotCi0gICAgICAgICAgICBTZXQgcW5hbWVTZXQyID0gaW52ZXJ0ID8gc2V0LmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKSA6IHNldC5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KHFuYW1lU2V0Mi5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcW5hbWVTZXQyLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgd3JpdGVRTmFtZSgoUU5hbWUpaS5uZXh0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYnl0ZVtdIHJlYWRCeXRlQXJyYXkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzaG9ydCBsZW4gPSBfaW5wdXQucmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2xlbl07Ci0gICAgICAgICAgICAgICAgX2lucHV0LnJlYWRGdWxseShyZXN1bHQpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU9fRVhDRVBUSU9OKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVCeXRlQXJyYXkoYnl0ZVtdIGJhKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KGJhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKF9vdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgX291dHB1dC53cml0ZShiYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU9fRVhDRVBUSU9OKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEJpZ0ludGVnZXIgcmVhZEJpZ0ludGVnZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBieXRlW10gcmVzdWx0ID0gcmVhZEJ5dGVBcnJheSgpOwotICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09IDEgJiYgcmVzdWx0WzBdID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIEJpZ0ludGVnZXIuWkVSTzsKLSAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09IDEgJiYgcmVzdWx0WzBdID09IDEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEJpZ0ludGVnZXIuT05FOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlQmlnSW50ZWdlcihCaWdJbnRlZ2VyIGJpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYmkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZVNob3J0KDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYmkuc2lnbnVtKCkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZUJ5dGVBcnJheShTSU5HTEVfWkVST19CWVRFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZUJ5dGVBcnJheShiaS50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGJ5dGVbXSBTSU5HTEVfWkVST19CWVRFID0gbmV3IGJ5dGVbXSB7IChieXRlKTAgfTsKLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHR5cGVGb3JIYW5kbGUoU3RyaW5nIGhhbmRsZSkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoX3Jlc29sdmVkSGFuZGxlcykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFUeXBlKV9yZXNvbHZlZEhhbmRsZXMuZ2V0KGhhbmRsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSB0eXBlRm9yQ2xhc3NuYW1lKFN0cmluZyBjbGFzc25hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlLlJlZiByZWYgPSAoU2NoZW1hVHlwZS5SZWYpX3R5cGVSZWZzQnlDbGFzc25hbWUuZ2V0KGNsYXNzbmFtZSk7Ci0gICAgICAgIHJldHVybiAocmVmICE9IG51bGwpID8gcmVmLmdldCgpIDogbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQ29tcG9uZW50IHJlc29sdmVIYW5kbGUoU3RyaW5nIGhhbmRsZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYUNvbXBvbmVudCByZXN1bHQ7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChfcmVzb2x2ZWRIYW5kbGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hQ29tcG9uZW50KV9yZXNvbHZlZEhhbmRsZXMuZ2V0KGhhbmRsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBYc2JSZWFkZXIgcmVhZGVyID0gbmV3IFhzYlJlYWRlcihoYW5kbGUsIC0xKTsKLSAgICAgICAgICAgIGludCBmaWxldHlwZSA9IHJlYWRlci5nZXRBY3R1YWxGaWxldHlwZSgpOwotICAgICAgICAgICAgc3dpdGNoIChmaWxldHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQVRZUEU6Ci0gICAgICAgICAgICAgICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIlJlc29sdmluZyB0eXBlIGZvciBoYW5kbGUgIiArIGhhbmRsZSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlYWRlci5maW5pc2hMb2FkaW5nVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIlJlc29sdmluZyBlbGVtZW50IGZvciBoYW5kbGUgIiArIGhhbmRsZSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlYWRlci5maW5pc2hMb2FkaW5nRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURToKLSAgICAgICAgICAgICAgICAgICAgWEJlYW5EZWJ1Zy50cmFjZShYQmVhbkRlYnVnLlRSQUNFX1NDSEVNQV9MT0FESU5HLCAiUmVzb2x2aW5nIGF0dHJpYnV0ZSBmb3IgaGFuZGxlICIgKyBoYW5kbGUsIDApOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZWFkZXIuZmluaXNoTG9hZGluZ0F0dHJpYnV0ZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQU1PREVMR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIlJlc29sdmluZyBtb2RlbCBncm91cCBmb3IgaGFuZGxlICIgKyBoYW5kbGUsIDApOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZWFkZXIuZmluaXNoTG9hZGluZ01vZGVsR3JvdXAoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEVHUk9VUDoKLSAgICAgICAgICAgICAgICAgICAgWEJlYW5EZWJ1Zy50cmFjZShYQmVhbkRlYnVnLlRSQUNFX1NDSEVNQV9MT0FESU5HLCAiUmVzb2x2aW5nIGF0dHJpYnV0ZSBncm91cCBmb3IgaGFuZGxlICIgKyBoYW5kbGUsIDApOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZWFkZXIuZmluaXNoTG9hZGluZ0F0dHJpYnV0ZUdyb3VwKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BSURFTlRJVFlDT05TVFJBSU5UOgotICAgICAgICAgICAgICAgICAgICBYQmVhbkRlYnVnLnRyYWNlKFhCZWFuRGVidWcuVFJBQ0VfU0NIRU1BX0xPQURJTkcsICJSZXNvbHZpbmcgaWQgY29uc3RyYWludCBmb3IgaGFuZGxlICIgKyBoYW5kbGUsIDApOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZWFkZXIuZmluaXNoTG9hZGluZ0lkZW50aXR5Q29uc3RyYWludCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbGxlZ2FsIGhhbmRsZSB0eXBlIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoX3Jlc29sdmVkSGFuZGxlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIV9yZXNvbHZlZEhhbmRsZXMuY29udGFpbnNLZXkoaGFuZGxlKSkKLSAgICAgICAgICAgICAgICAgICAgX3Jlc29sdmVkSGFuZGxlcy5wdXQoaGFuZGxlLCByZXN1bHQpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYUNvbXBvbmVudClfcmVzb2x2ZWRIYW5kbGVzLmdldChoYW5kbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXAgX3Jlc29sdmVkSGFuZGxlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9hbGxOb25Hcm91cEhhbmRsZXNSZXNvbHZlZCA9IGZhbHNlOwotCi0gICAgcHVibGljIHZvaWQgcmVzb2x2ZSgpCi0gICAgewotICAgICAgICBYQmVhbkRlYnVnLnRyYWNlKFhCZWFuRGVidWcuVFJBQ0VfU0NIRU1BX0xPQURJTkcsICJSZXNvbHZlIGNhbGxlZCB0eXBlIHN5c3RlbSAiICsgX25hbWUsIDApOwotICAgICAgICBpZiAoX2FsbE5vbkdyb3VwSGFuZGxlc1Jlc29sdmVkKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIlJlc29sdmluZyBhbGwgaGFuZGxlcyBmb3IgdHlwZSBzeXN0ZW0gIiArIF9uYW1lLCAxKTsKLQotICAgICAgICBMaXN0IHJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHJlZnMuYWRkQWxsKF9nbG9iYWxFbGVtZW50cy52YWx1ZXMoKSk7Ci0gICAgICAgIHJlZnMuYWRkQWxsKF9nbG9iYWxBdHRyaWJ1dGVzLnZhbHVlcygpKTsKLSAgICAgICAgcmVmcy5hZGRBbGwoX2dsb2JhbFR5cGVzLnZhbHVlcygpKTsKLSAgICAgICAgcmVmcy5hZGRBbGwoX2RvY3VtZW50VHlwZXMudmFsdWVzKCkpOwotICAgICAgICByZWZzLmFkZEFsbChfYXR0cmlidXRlVHlwZXMudmFsdWVzKCkpOwotICAgICAgICByZWZzLmFkZEFsbChfaWRlbnRpdHlDb25zdHJhaW50cy52YWx1ZXMoKSk7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcmVmcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFDb21wb25lbnQuUmVmIHJlZiA9IChTY2hlbWFDb21wb25lbnQuUmVmKWkubmV4dCgpOwotICAgICAgICAgICAgcmVmLmdldENvbXBvbmVudCgpOyAvLyBGb3JjZXMgcmVmIHRvIGJlIHJlc29sdmVkCi0gICAgICAgIH0KLQotICAgICAgICBYQmVhbkRlYnVnLnRyYWNlKFhCZWFuRGVidWcuVFJBQ0VfU0NIRU1BX0xPQURJTkcsICJGaW5pc2hlZCByZXNvbHZpbmcgdHlwZSBzeXN0ZW0gIiArIF9uYW1lLCAtMSk7Ci0gICAgICAgIF9hbGxOb25Hcm91cEhhbmRsZXNSZXNvbHZlZCA9IHRydWU7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZURlZmluZWQoU3RyaW5nIG5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbmFtZXNwYWNlcy5jb250YWlucyhuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlLlJlZiBmaW5kVHlwZVJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTY2hlbWFUeXBlLlJlZilfZ2xvYmFsVHlwZXMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlLlJlZiBmaW5kRG9jdW1lbnRUeXBlUmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGUuUmVmKV9kb2N1bWVudFR5cGVzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZmluZEF0dHJpYnV0ZVR5cGVSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU2NoZW1hVHlwZS5SZWYpX2F0dHJpYnV0ZVR5cGVzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYgZmluZEVsZW1lbnRSZWYoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYpX2dsb2JhbEVsZW1lbnRzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsQXR0cmlidXRlLlJlZiBmaW5kQXR0cmlidXRlUmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZS5SZWYpX2dsb2JhbEF0dHJpYnV0ZXMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFNb2RlbEdyb3VwLlJlZiBmaW5kTW9kZWxHcm91cFJlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTY2hlbWFNb2RlbEdyb3VwLlJlZilfbW9kZWxHcm91cHMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYgZmluZEF0dHJpYnV0ZUdyb3VwUmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKFNjaGVtYUF0dHJpYnV0ZUdyb3VwLlJlZilfYXR0cmlidXRlR3JvdXBzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZiBmaW5kSWRlbnRpdHlDb25zdHJhaW50UmVmKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWYpX2lkZW50aXR5Q29uc3RyYWludHMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlW10gZ2xvYmFsVHlwZXMoKQotICAgIHsKLSAgICAgICAgaWYgKF9nbG9iYWxUeXBlcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gRU1QVFlfU1RfQVJSQVk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZVtdIHJlc3VsdCA9IG5ldyBTY2hlbWFUeXBlW19nbG9iYWxUeXBlcy5zaXplKCldOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9nbG9iYWxUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQotICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFUeXBlLlJlZilpLm5leHQoKSkuZ2V0KCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVbXSByZWRlZmluZWRHbG9iYWxUeXBlcygpCi0gICAgewotICAgICAgICBpZiAoX3JlZGVmaW5lZEdsb2JhbFR5cGVzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWV9TVF9BUlJBWTsKLQotICAgICAgICBTY2hlbWFUeXBlW10gcmVzdWx0ID0gbmV3IFNjaGVtYVR5cGVbX3JlZGVmaW5lZEdsb2JhbFR5cGVzLnNpemUoKV07Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX3JlZGVmaW5lZEdsb2JhbFR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBqKyspCi0gICAgICAgICAgICByZXN1bHRbal0gPSAoKFNjaGVtYVR5cGUuUmVmKWkubmV4dCgpKS5nZXQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0U291cmNlQXNTdHJlYW0oU3RyaW5nIHNvdXJjZU5hbWUpCi0gICAgewotICAgICAgICBpZiAoIXNvdXJjZU5hbWUuc3RhcnRzV2l0aCgiLyIpKQotICAgICAgICAgICAgc291cmNlTmFtZSA9ICIvIiArIHNvdXJjZU5hbWU7Ci0KLSAgICAgICAgcmV0dXJuIF9yZXNvdXJjZUxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCJzY2hlbWEvc3JjIiArIHNvdXJjZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlW10gZG9jdW1lbnRUeXBlcygpCi0gICAgewotICAgICAgICBpZiAoX2RvY3VtZW50VHlwZXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NUX0FSUkFZOwotCi0gICAgICAgIFNjaGVtYVR5cGVbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZVtfZG9jdW1lbnRUeXBlcy5zaXplKCldOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9kb2N1bWVudFR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBqKyspCi0gICAgICAgICAgICByZXN1bHRbal0gPSAoKFNjaGVtYVR5cGUuUmVmKWkubmV4dCgpKS5nZXQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVtdIGF0dHJpYnV0ZVR5cGVzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfYXR0cmlidXRlVHlwZXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NUX0FSUkFZOwotCi0gICAgICAgIFNjaGVtYVR5cGVbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZVtfYXR0cmlidXRlVHlwZXMuc2l6ZSgpXTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfYXR0cmlidXRlVHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKLSAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hVHlwZS5SZWYpaS5uZXh0KCkpLmdldCgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxFbGVtZW50W10gZ2xvYmFsRWxlbWVudHMoKQotICAgIHsKLSAgICAgICAgaWYgKF9nbG9iYWxFbGVtZW50cy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gRU1QVFlfR0VfQVJSQVk7Ci0KLSAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudFtdIHJlc3VsdCA9IG5ldyBTY2hlbWFHbG9iYWxFbGVtZW50W19nbG9iYWxFbGVtZW50cy5zaXplKCldOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9nbG9iYWxFbGVtZW50cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQotICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFHbG9iYWxFbGVtZW50LlJlZilpLm5leHQoKSkuZ2V0KCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZVtdIGdsb2JhbEF0dHJpYnV0ZXMoKQotICAgIHsKLSAgICAgICAgaWYgKF9nbG9iYWxBdHRyaWJ1dGVzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWV9HQV9BUlJBWTsKLQotICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbXSByZXN1bHQgPSBuZXcgU2NoZW1hR2xvYmFsQXR0cmlidXRlW19nbG9iYWxBdHRyaWJ1dGVzLnNpemUoKV07Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2dsb2JhbEF0dHJpYnV0ZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKLSAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hR2xvYmFsQXR0cmlidXRlLlJlZilpLm5leHQoKSkuZ2V0KCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYU1vZGVsR3JvdXBbXSBtb2RlbEdyb3VwcygpCi0gICAgewotICAgICAgICBpZiAoX21vZGVsR3JvdXBzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWV9NR19BUlJBWTsKLQotICAgICAgICBTY2hlbWFNb2RlbEdyb3VwW10gcmVzdWx0ID0gbmV3IFNjaGVtYU1vZGVsR3JvdXBbX21vZGVsR3JvdXBzLnNpemUoKV07Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX21vZGVsR3JvdXBzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBqKyspCi0gICAgICAgICAgICByZXN1bHRbal0gPSAoKFNjaGVtYU1vZGVsR3JvdXAuUmVmKWkubmV4dCgpKS5nZXQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cFtdIHJlZGVmaW5lZE1vZGVsR3JvdXBzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcmVkZWZpbmVkTW9kZWxHcm91cHMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX01HX0FSUkFZOwotCi0gICAgICAgIFNjaGVtYU1vZGVsR3JvdXBbXSByZXN1bHQgPSBuZXcgU2NoZW1hTW9kZWxHcm91cFtfcmVkZWZpbmVkTW9kZWxHcm91cHMuc2l6ZSgpXTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfcmVkZWZpbmVkTW9kZWxHcm91cHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKLSAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hTW9kZWxHcm91cC5SZWYpaS5uZXh0KCkpLmdldCgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cFtdIGF0dHJpYnV0ZUdyb3VwcygpCi0gICAgewotICAgICAgICBpZiAoX2F0dHJpYnV0ZUdyb3Vwcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gRU1QVFlfQUdfQVJSQVk7Ci0KLSAgICAgICAgU2NoZW1hQXR0cmlidXRlR3JvdXBbXSByZXN1bHQgPSBuZXcgU2NoZW1hQXR0cmlidXRlR3JvdXBbX2F0dHJpYnV0ZUdyb3Vwcy5zaXplKCldOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9hdHRyaWJ1dGVHcm91cHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKLSAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hQXR0cmlidXRlR3JvdXAuUmVmKWkubmV4dCgpKS5nZXQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlR3JvdXBbXSByZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMoKQotICAgIHsKLSAgICAgICAgaWYgKF9yZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0FHX0FSUkFZOwotCi0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwW10gcmVzdWx0ID0gbmV3IFNjaGVtYUF0dHJpYnV0ZUdyb3VwW19yZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMuc2l6ZSgpXTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBqKyspCi0gICAgICAgICAgICByZXN1bHRbal0gPSAoKFNjaGVtYUF0dHJpYnV0ZUdyb3VwLlJlZilpLm5leHQoKSkuZ2V0KCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtdIGlkZW50aXR5Q29uc3RyYWludHMoKQotICAgIHsKLSAgICAgICAgaWYgKF9pZGVudGl0eUNvbnN0cmFpbnRzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWV9JQ19BUlJBWTsKLQotICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRbXSByZXN1bHQgPSBuZXcgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50W19pZGVudGl0eUNvbnN0cmFpbnRzLnNpemUoKV07Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2lkZW50aXR5Q29uc3RyYWludHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKLSAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZilpLm5leHQoKSkuZ2V0KCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY2xhc3Nsb2FkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlZCBJTlRFUk5BTExZIE9OTFkgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yIEFGVEVSIHRoZSB0eXBlIHN5c3RlbSBoYXMKLSAgICAgKiBiZWVuIHNhdmVkIGFuZCBhIGhhbmRsZSBoYXMgYmVlbiBlc3RhYmxpc2hlZCBmb3IgZWFjaCB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgaGFuZGxlRm9yVHlwZShTY2hlbWFUeXBlIHR5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gX2xvY2FsSGFuZGxlcy5oYW5kbGVGb3JUeXBlKHR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX25hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVTeXN0ZW0gdHlwZVN5c3RlbUZvck5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoX25hbWUgIT0gbnVsbCAmJiBuYW1lLmVxdWFscyhfbmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlVmlzaXRvckltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVWaXNpdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzIyODE1Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVWaXNpdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuVHlwZVN0b3JlVmlzaXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlR5cGVTdG9yZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogVGhpcyBzdGF0ZSBtYWNoaW5lIHZhbGlkYXRlcyBlbGVtZW50IG9yZGVyIGJhc2VkIG9uIGEgZGV0ZXJtaW5pc3RpYwotICogY29udGVudCBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFNjaGVtYVR5cGVWaXNpdG9ySW1wbCBpbXBsZW1lbnRzIFR5cGVTdG9yZVZpc2l0b3IKLXsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgaXQgYnkgcGFzc2luZyB0aGUgcm9vdCBvZiB0aGUgY29udGVudCBtb2RlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVZpc2l0b3JJbXBsKFNjaGVtYVBhcnRpY2xlIHBhcnQpCi0gICAgewotICAgICAgICBpbml0KHBhcnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlVmlzaXRvckltcGwoKQotICAgIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoU2NoZW1hUGFydGljbGUgcGFydCkKLSAgICB7Ci0gICAgICAgIGlmIChfc3RhY2sgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3N0YWNrID0gZXhwYW5kKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChfcm9sbGJhY2sgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3JvbGxiYWNrID0gZXhwYW5kKG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgX3N0YWNrU2l6ZSA9IDA7Ci0gICAgICAgIF9yb2xsYmFja1NpemUgPSAwOwotCi0gICAgICAgIGlmIChwYXJ0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1c2gocGFydCk7Ci0gICAgICAgICAgICBfcm9sbGJhY2tJbmRleCA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlzaXRvclN0YXRlW10gZXhwYW5kKFZpc2l0b3JTdGF0ZVtdIG9yaWcpCi0gICAgewotICAgICAgICBpbnQgbmV3c2l6ZSA9IChvcmlnID09IG51bGwgPyA0IDogb3JpZy5sZW5ndGggKiAyKTsKLSAgICAgICAgVmlzaXRvclN0YXRlW10gcmVzdWx0ID0gbmV3IFZpc2l0b3JTdGF0ZVtuZXdzaXplXTsKLSAgICAgICAgaWYgKG9yaWcgIT0gbnVsbCkKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZywgMCwgcmVzdWx0LCAwLCBvcmlnLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAob3JpZyA9PSBudWxsID8gMCA6IG9yaWcubGVuZ3RoKTsgaSA8IG5ld3NpemU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0W2ldID0gbmV3IFZpc2l0b3JTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0KLQotICAgIHByaXZhdGUgVmlzaXRvclN0YXRlW10gX3N0YWNrOwotICAgIHByaXZhdGUgVmlzaXRvclN0YXRlW10gX3JvbGxiYWNrOwotICAgIGludCBfc3RhY2tTaXplOwotICAgIGludCBfcm9sbGJhY2tTaXplOwotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNWYWxpZDsKLSAgICBwcml2YXRlIFNjaGVtYVBhcnRpY2xlIF9tYXRjaGVkUGFydGljbGU7Ci0gICAgcHJpdmF0ZSBWaXNpdG9yU3RhdGUgX3RvcDsKLSAgICBwcml2YXRlIGludCBfcm9sbGJhY2tJbmRleDsKLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFZpc2l0b3JTdGF0ZQotICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgY29weShWaXNpdG9yU3RhdGUgb3JpZykKLSAgICAgICAgewotICAgICAgICAgICAgX2N1clBhcnQgPSBvcmlnLl9jdXJQYXJ0OwotICAgICAgICAgICAgX2N1ckNvdW50ID0gb3JpZy5fY3VyQ291bnQ7Ci0gICAgICAgICAgICBfY3VyTWluID0gb3JpZy5fY3VyTWluOwotICAgICAgICAgICAgX2N1ck1heCA9IG9yaWcuX2N1ck1heDsKLSAgICAgICAgICAgIF9wcm9jZXNzZWRDaGlsZENvdW50ID0gb3JpZy5fcHJvY2Vzc2VkQ2hpbGRDb3VudDsKLSAgICAgICAgICAgIF9jaGlsZENvdW50ID0gb3JpZy5fY2hpbGRDb3VudDsKLSAgICAgICAgICAgIF9zZWVuID0gb3JpZy5fc2VlbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGluaXQoU2NoZW1hUGFydGljbGUgcGFydCkKLSAgICAgICAgewotICAgICAgICAgICAgX2N1clBhcnQgPSBwYXJ0OwotICAgICAgICAgICAgX2N1ck1pbiA9IHBhcnQuZ2V0SW50TWluT2NjdXJzKCk7Ci0gICAgICAgICAgICBfY3VyTWF4ID0gcGFydC5nZXRJbnRNYXhPY2N1cnMoKTsKLSAgICAgICAgICAgIF9jdXJDb3VudCA9IDA7Ci0gICAgICAgICAgICBfcHJvY2Vzc2VkQ2hpbGRDb3VudCA9IDA7Ci0gICAgICAgICAgICBfY2hpbGRDb3VudCA9IHBhcnQuY291bnRPZlBhcnRpY2xlQ2hpbGQoKTsKLSAgICAgICAgICAgIF9zZWVuID0gcGFydC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5BTEwgPwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGJvb2xlYW5bX2NoaWxkQ291bnRdIDogbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlIF9jdXJQYXJ0OwotICAgICAgICBpbnQgX2N1ckNvdW50OwotICAgICAgICBpbnQgX2N1ck1heDsKLSAgICAgICAgaW50IF9jdXJNaW47Ci0gICAgICAgIGludCBfcHJvY2Vzc2VkQ2hpbGRDb3VudDsKLSAgICAgICAgaW50IF9jaGlsZENvdW50OwotICAgICAgICBib29sZWFuW10gX3NlZW47Ci0gICAgfQotCi0gICAgVmlzaXRvclN0YXRlIHRvcFJlZigpCi0gICAgewotICAgICAgICByZXR1cm4gX3N0YWNrW19zdGFja1NpemUgLSAxXTsKLSAgICB9Ci0KLSAgICB2b2lkIHNhdmVDb3B5KFZpc2l0b3JTdGF0ZSByZWYpCi0gICAgewotICAgICAgICBpZiAoX3JvbGxiYWNrLmxlbmd0aCA9PSBfcm9sbGJhY2tTaXplKQotICAgICAgICAgICAgX3JvbGxiYWNrID0gZXhwYW5kKF9yb2xsYmFjayk7Ci0KLSAgICAgICAgX3JvbGxiYWNrW19yb2xsYmFja1NpemVdLmNvcHkocmVmKTsKLSAgICAgICAgX3JvbGxiYWNrU2l6ZSArPSAxOwotICAgIH0KLQotICAgIHZvaWQgYWRkUGFydGljbGUoU2NoZW1hUGFydGljbGUgcGFydCkKLSAgICB7Ci0gICAgICAgIGlmIChfc3RhY2subGVuZ3RoID09IF9zdGFja1NpemUpCi0gICAgICAgICAgICBfc3RhY2sgPSBleHBhbmQoX3N0YWNrKTsKLSAgICAgICAgX3N0YWNrW19zdGFja1NpemVdLmluaXQocGFydCk7Ci0gICAgICAgIF9zdGFja1NpemUgKz0gMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmVjb25kaXRpb246Ci0gICAgICogc3RhY2s6ICAgIChSMSBSMiBSMyBSNCkKLSAgICAgKiB0b3A6ICAgICAgbnVsbCBvciBkaXNjYXJkYWJsZSBkdWUgdG8gcG9wIGluIHByb2dyZXNzCi0gICAgICogcm9sbGJhY2s6IChSOCBSNyBSNiBSNSkgKGVtcHR5IGF0IHRoZSBzdGFydCBvZiAidmlzaXQiKQotICAgICAqCi0gICAgICogUG9zdGNvbmRpdGlvbjoKLSAgICAgKiBzdGFjazogICAgKFIxIFIyIFIzKQotICAgICAqIHRvcDogICAgICBENCA9IG11dGFibGUgY29weSBvZiBSNAotICAgICAqIHJvbGxiYWNrICAoUjggUjcgUjYgUjUgUjQpCi0gICAgICovCi0gICAgYm9vbGVhbiBwcmVwYXJlKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcm9sbGJhY2tJbmRleCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBfdG9wID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIF90b3AgPSB0b3BSZWYoKTsKLSAgICAgICAgc2F2ZUNvcHkoX3RvcCk7Ci0gICAgICAgIF9yb2xsYmFja0luZGV4ID0gX3N0YWNrU2l6ZSAtIDE7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByZWNvbmRpdGlvbjoKLSAgICAgKiBzdGFjazogICAgKFIxIFIyIFIzIFI0IEQ1IEQ2KQotICAgICAqIHRvcDogICAgICBENwotICAgICAqIHJvbGxiYWNrOiAoUjggUjcgUjYgUjUpCi0gICAgICoKLSAgICAgKiBQb3N0Y29uZGl0aW9uOgotICAgICAqIHN0YWNrOiAgICAoUjEgUjIgUjMgUjQgRDUgRDYgRDcpCi0gICAgICogdG9wOiAgICAgIEQ4ID0gbmV3IHN0YXRlIGJhc2VkIG9uIHBhcnQKLSAgICAgKiByb2xsYmFjayAgKFI4IFI3IFI2IFI1KQotICAgICAqLwotICAgIHZvaWQgcHVzaChTY2hlbWFQYXJ0aWNsZSBwYXJ0KQotICAgIHsKLSAgICAgICAgYWRkUGFydGljbGUocGFydCk7Ci0gICAgICAgIF90b3AgPSB0b3BSZWYoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmVjb25kaXRpb246Ci0gICAgICogc3RhY2s6ICAgIChSMSBSMiBSMyBSNCBENSBENikKLSAgICAgKiB0b3A6ICAgICAgRDcgaXMgZGlzY2FyZGFibGUKLSAgICAgKiByb2xsYmFjazogKFI4IFI3IFI2IFI1KQotICAgICAqCi0gICAgICogUG9zdGNvbmRpdGlvbjoKLSAgICAgKiBzdGFjazogICAgKFIxIFIyIFIzIFI0IEQ1KQotICAgICAqIHRvcDogICAgICBENiAoc2VlIHByZXBhcmUgaW4gY2FzZSBpdCdzIGFuIFIgc3RhdGUpCi0gICAgICogcm9sbGJhY2sgIChSOCBSNyBSNiBSNSkKLSAgICAgKi8KLSAgICBib29sZWFuIHBvcCgpCi0gICAgewotICAgICAgICBfc3RhY2tTaXplIC09IDE7Ci0gICAgICAgIGlmIChfc3RhY2tTaXplIDw9IF9yb2xsYmFja0luZGV4KQotICAgICAgICAgICAgcmV0dXJuIHByZXBhcmUoKTsKLSAgICAgICAgX3RvcCA9IHRvcFJlZigpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmVjb25kaXRpb246Ci0gICAgICogc3RhY2s6ICAgIChSMSBSMiBSMyBSNCBENSBENikKLSAgICAgKiB0b3A6ICAgICAgRDcKLSAgICAgKiByb2xsYmFjazogKFI4IFI3IFI2IFI1KQotICAgICAqCi0gICAgICogUG9zdGNvbmRpdGlvbjoKLSAgICAgKiBzdGFjazogICAgKFIxIFIyIFIzIFI0IEQ1IEQ2IEQ3KSAtPiBhbmQgcmVuYW1lIHRvIEQncyB0byBSJ3MKLSAgICAgKiB0b3A6ICAgICAgbnVsbAotICAgICAqIHJvbGxiYWNrICAoKQotICAgICAqLwotICAgIHZvaWQgY29tbWl0KCkKLSAgICB7Ci0gICAgICAgIF90b3AgPSBudWxsOwotICAgICAgICBfcm9sbGJhY2tJbmRleCA9IF9zdGFja1NpemU7Ci0gICAgICAgIF9yb2xsYmFja1NpemUgPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByZWNvbmRpdGlvbjoKLSAgICAgKiBzdGFjazogICAgKFIxIFIyIFIzIFI0IEQ1IEQ2KQotICAgICAqIHRvcDogICAgICBENyBpcyBkaXNjYXJkYWJsZQotICAgICAqIHJvbGxiYWNrOiAoUjggUjcgUjYgUjUpCi0gICAgICoKLSAgICAgKiBQb3N0Y29uZGl0aW9uOgotICAgICAqIHN0YWNrOiAgICAoUjEgUjIgUjMgUjQgUjUgUjYgUjcgUjgpCi0gICAgICogdG9wOiAgICAgIG51bGwKLSAgICAgKiByb2xsYmFjayAgKCkKLSAgICAgKi8KLSAgICB2b2lkIHJvbGxiYWNrKCkKLSAgICB7Ci0gICAgICAgIHdoaWxlIChfcm9sbGJhY2tTaXplID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgX3JvbGxiYWNrU2l6ZSAtPSAxOwotICAgICAgICAgICAgVmlzaXRvclN0YXRlIHRlbXAgPSBfc3RhY2tbX3JvbGxiYWNrSW5kZXhdOwotICAgICAgICAgICAgX3N0YWNrW19yb2xsYmFja0luZGV4XSA9IF9yb2xsYmFja1tfcm9sbGJhY2tTaXplXTsKLSAgICAgICAgICAgIF9yb2xsYmFja1tfcm9sbGJhY2tTaXplXSA9IHRlbXA7Ci0gICAgICAgICAgICBfcm9sbGJhY2tJbmRleCArPSAxOwotICAgICAgICB9Ci0gICAgICAgIF9zdGFja1NpemUgPSBfcm9sbGJhY2tJbmRleDsKLSAgICAgICAgX3RvcCA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiBubyB2YWxpZCBuZXh0IHN0YXRlIGNhbiBiZSBmb3VuZCwgdGhlbiAibm90VmFsaWQiCi0gICAgICogaXMgcmV0dXJuZWQuIEl0IHJvbGxzIGJhY2sgYW55IGNoYW5nZXMgdG8gdGhlIHN0YXRlCi0gICAgICogbWFjaGluZSBzdGFjaywgc2V0cyB0byBmYWxzZSB0aGUgdmFsaWQgYml0LCBhbmQgY2xlYXJzCi0gICAgICogdGhlIG1hdGNoZWQgZWxlbWVudCBzdGF0ZSBiZWZvcmUgcmV0dXJuaW5nIGZhbHNlLgotICAgICAqLwotICAgIGJvb2xlYW4gbm90VmFsaWQoKQotICAgIHsKLSAgICAgICAgX2lzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgX21hdGNoZWRQYXJ0aWNsZSA9IG51bGw7Ci0gICAgICAgIHJvbGxiYWNrKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGEgdmFsaWQgc3RhdGUgdHJhbnNpdGlvbiBoYXMgYmVlbiBkb25lLCB0aGVuICJvayIKLSAgICAgKiBpcyByZXR1cm5lZC4gSXQgY29tbWl0cyB0aGUgY2hhbmdlZCBzdGF0ZSBtYWNoaW5lIHN0YXRlLAotICAgICAqIHN0b3JlcyB0aGUgbWF0Y2hlZCBlbGVtZW50IHN0YXRlLCBhbmQgcmV0dXJucyB0cnVlLgotICAgICAqLwotICAgIGJvb2xlYW4gb2soU2NoZW1hUGFydGljbGUgcGFydCkKLSAgICB7Ci0gICAgICAgIF9tYXRjaGVkUGFydGljbGUgPSBwYXJ0OwotICAgICAgICBjb21taXQoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyo9PSBWSVNJVE9SIElNUExFTUVOVEFUSU9OID09Ki8KLQotICAgIC8qKgotICAgICAqIFRyYXZlcnNlcyBhIGRldGVybWluaXN0aWMgY29udGVudCBtb2RlbCwgY2hlY2tpbmcgZm9yCi0gICAgICogdmFsaWRpdHkgYXQgYW55IGdpdmVuIHBvaW50LgotICAgICAqCi0gICAgICogQ2FsbCB2aXNpdChudWxsKSBvbmNlIGF0IHRoZSBlbmQgaWYgeW91J3JlIGNoZWNraW5nIGZvcgotICAgICAqIGNvbXBsZXRlIHZhbGlkaXR5IG9mIHRoZSBzZXF1ZW5jZSBvZiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChRTmFtZSBlbHROYW1lKQotICAgIHsKLSAgICAgICAgaWYgKCFwcmVwYXJlKCkpCi0gICAgICAgICAgICByZXR1cm4gbm90VmFsaWQoKTsKLQotICAgICAgICB0cmF2ZXJzaW5nOiBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoX3RvcC5fY3VyQ291bnQgPj0gX3RvcC5fY3VyTWF4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghcG9wKCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrIHRyYXZlcnNpbmc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1pbm1heDogc3dpdGNoIChfdG9wLl9jdXJQYXJ0LmdldFBhcnRpY2xlVHlwZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgICAgICBpZiAoIV90b3AuX2N1clBhcnQuY2FuU3RhcnRXaXRoRWxlbWVudChlbHROYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90b3AuX2N1ckNvdW50IDwgX3RvcC5fY3VyTWluKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub3RWYWxpZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbWlubWF4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIF90b3AuX2N1ckNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvayhfdG9wLl9jdXJQYXJ0KTsKLQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFfdG9wLl9jdXJQYXJ0LmNhblN0YXJ0V2l0aEVsZW1lbnQoZWx0TmFtZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdG9wLl9jdXJDb3VudCA8IF90b3AuX2N1ck1pbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm90VmFsaWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIG1pbm1heDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBfdG9wLl9jdXJDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2soX3RvcC5fY3VyUGFydCk7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gX3RvcC5fcHJvY2Vzc2VkQ2hpbGRDb3VudDsgaSA8IF90b3AuX2NoaWxkQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgY2FuZGlkYXRlID0gX3RvcC5fY3VyUGFydC5nZXRQYXJ0aWNsZUNoaWxkKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZS5jYW5TdGFydFdpdGhFbGVtZW50KGVsdE5hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90b3AuX3Byb2Nlc3NlZENoaWxkQ291bnQgPSBpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKGNhbmRpZGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgdHJhdmVyc2luZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FuZGlkYXRlLmlzU2tpcHBhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90b3AuX3Byb2Nlc3NlZENoaWxkQ291bnQgIT0gMCB8fCBfdG9wLl9jdXJDb3VudCA8IF90b3AuX2N1ck1pbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vdFZhbGlkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbWlubWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIF90b3AuX2N1ckNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIF90b3AuX3Byb2Nlc3NlZENoaWxkQ291bnQgPSAwOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZSB0cmF2ZXJzaW5nOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3RvcC5fY2hpbGRDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjYW5kaWRhdGUgPSBfdG9wLl9jdXJQYXJ0LmdldFBhcnRpY2xlQ2hpbGQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlLmNhblN0YXJ0V2l0aEVsZW1lbnQoZWx0TmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RvcC5fY3VyQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKGNhbmRpZGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgdHJhdmVyc2luZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoX3RvcC5fY3VyQ291bnQgPCBfdG9wLl9jdXJNaW4gJiYgIV90b3AuX2N1clBhcnQuaXNTa2lwcGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub3RWYWxpZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhayBtaW5tYXg7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLQotICAgICAgICAgICAgICAgICAgICBpbnQgc2tpcHBlZCA9IF90b3AuX3Byb2Nlc3NlZENoaWxkQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIGFsbHNjYW46IGZvciAoaW50IGkgPSAwOyBpIDwgX3RvcC5fY2hpbGRDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RvcC5fc2VlbltpXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBhbGxzY2FuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjYW5kaWRhdGUgPSBfdG9wLl9jdXJQYXJ0LmdldFBhcnRpY2xlQ2hpbGQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlLmNhblN0YXJ0V2l0aEVsZW1lbnQoZWx0TmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RvcC5fcHJvY2Vzc2VkQ2hpbGRDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90b3AuX3NlZW5baV0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goY2FuZGlkYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSB0cmF2ZXJzaW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2FuZGlkYXRlLmlzU2tpcHBhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZCArPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChza2lwcGVkIDwgX3RvcC5fY2hpbGRDb3VudCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90b3AuX2N1ckNvdW50IDwgX3RvcC5fY3VyTWluKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub3RWYWxpZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbWlubWF4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIF90b3AuX2N1ckNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIF90b3AuX3Byb2Nlc3NlZENoaWxkQ291bnQgPSAwOwotICAgICAgICAgICAgICAgICAgICBBcnJheXMuZmlsbChfdG9wLl9zZWVuLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRyYXZlcnNpbmc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNvbWVib2R5IGNhbGxlZCAiYnJlYWsgbWlubWF4Iiwgc28gcG9wIG91dCBvZiBsb29wCi0gICAgICAgICAgICBpZiAoIXBvcCgpKQotICAgICAgICAgICAgICAgIGJyZWFrIHRyYXZlcnNpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB3ZSd2ZSBjb21wbGV0ZWQgdGhlIG91dGVybW9zdCBsb29wCi0gICAgICAgIGlmIChlbHROYW1lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gb2sobnVsbCk7Ci0KLSAgICAgICAgLy8gdGhpcyBtZWFucyB3ZSBoYXZlIGV4dHJhIGVsZW1lbnRzIGF0IHRoZSBlbmQKLSAgICAgICAgcmV0dXJuIG5vdFZhbGlkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBlbGVtZW50ZmxhZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldF9lbGVtZW50ZmxhZ3MoKQotICAgIHsKLSAgICAgICAgaWYgKGN1cnJlbnRQYXJ0aWNsZSgpID09IG51bGwgfHwgY3VycmVudFBhcnRpY2xlKCkuZ2V0UGFydGljbGVUeXBlKCkgIT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIFNjaGVtYUxvY2FsRWxlbWVudCBlbHQgPSAoU2NoZW1hTG9jYWxFbGVtZW50KWN1cnJlbnRQYXJ0aWNsZSgpOwotCi0gICAgICAgIHJldHVybiAoZWx0LmlzTmlsbGFibGUoKSA/IFR5cGVTdG9yZS5OSUxMQUJMRSA6IDApIHwKLSAgICAgICAgICAgICAgIChlbHQuaXNEZWZhdWx0KCkgPyBUeXBlU3RvcmUuSEFTREVGQVVMVCA6IDApIHwKLSAgICAgICAgICAgICAgIChlbHQuaXNGaXhlZCgpID8gVHlwZVN0b3JlLkZJWEVEIDogMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBkZWZhdWx0IHRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldF9kZWZhdWx0X3RleHQoKQotICAgIHsKLSAgICAgICAgaWYgKGN1cnJlbnRQYXJ0aWNsZSgpID09IG51bGwgfHwgY3VycmVudFBhcnRpY2xlKCkuZ2V0UGFydGljbGVUeXBlKCkgIT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiAoKFNjaGVtYUxvY2FsRWxlbWVudCljdXJyZW50UGFydGljbGUoKSkuZ2V0RGVmYXVsdFRleHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzY2hlbWEgZmllbGQgZm9yIHRoaXMgZmllbGQuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYUZpZWxkIGdldF9zY2hlbWFfZmllbGQoKSB7Ci0gICAgICAgIGlmIChjdXJyZW50UGFydGljbGUoKSBpbnN0YW5jZW9mIFNjaGVtYUZpZWxkKQotICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFGaWVsZCljdXJyZW50UGFydGljbGUoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2NoZW1hIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hUGFydGljbGUgY3VycmVudFBhcnRpY2xlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbWF0Y2hlZFBhcnRpY2xlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW50aXJlIGNvbnRlbnQgdXAgdG8gbm93IGlzIHZhbGlkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQWxsVmFsaWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9pc1ZhbGlkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NDaGVja2VyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjQ2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzg1ZGE4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjE0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVBhcnRpY2xlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbElEOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhCZWFuRGVidWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1wdWJsaWMgY2xhc3MgU3RzY0NoZWNrZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tBbGwoKQotICAgIHsKLSAgICAgICAgLy8gd2FsayB0aGUgdHJlZSBvZiB0eXBlcwotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0KLSAgICAgICAgTGlzdCBhbGxTZWVuVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5kb2N1bWVudFR5cGVzKCkpKTsKLSAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0YXRlLmF0dHJpYnV0ZVR5cGVzKCkpKTsKLSAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0YXRlLnJlZGVmaW5lZEdsb2JhbFR5cGVzKCkpKTsKLSAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0YXRlLmdsb2JhbFR5cGVzKCkpKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbFNlZW5UeXBlcy5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZSBnVHlwZSA9IChTY2hlbWFUeXBlKWFsbFNlZW5UeXBlcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoIXN0YXRlLm5vUHZyKCkgJiYgIC8vIG9wdGlvbiB0byB0dXJuIG9mZiBwYXJ0aWNsZSByZXN0cmljdGlvbiBjaGVja2luZwotICAgICAgICAgICAgICAgICFnVHlwZS5pc0RvY3VtZW50VHlwZSgpKSAvLyBEb24ndCBjaGVjayBkb2MgdHlwZXMgZm9yIHJlc3RyaWN0aW9uLiAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGVja1Jlc3RyaWN0aW9uKChTY2hlbWFUeXBlSW1wbClnVHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0ZpZWxkcygoU2NoZW1hVHlwZUltcGwpZ1R5cGUpOwotICAgICAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGdUeXBlLmdldEFub255bW91c1R5cGVzKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNoZWNrU3Vic3RpdHV0aW9uR3JvdXBzKHN0YXRlLmdsb2JhbEVsZW1lbnRzKCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgZm9sbG93aW5nIGNvZGUgY2hlY2tzIHJ1bGUgIzUgb2YgaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2Nvc3MtY3QKLSAgICAgKiBhcyB3ZWxsIGFzIGF0dHJpYnV0ZSArIGVsZW1lbnQgZGVmYXVsdC9maXhlZCB2YWxpZGl0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tGaWVsZHMoU2NoZW1hVHlwZUltcGwgc1R5cGUpCi0gICAgewotICAgICAgICBpZiAoc1R5cGUuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBYbWxPYmplY3QgbG9jYXRpb24gPSBzVHlwZS5nZXRQYXJzZU9iamVjdCgpOwotICAgICAgICAKLSAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWwgc0F0dHJNb2RlbCA9IHNUeXBlLmdldEF0dHJpYnV0ZU1vZGVsKCk7Ci0gICAgICAgIGlmIChzQXR0ck1vZGVsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlW10gc0F0dHJzICA9IHNBdHRyTW9kZWwuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgUU5hbWUgaWRBdHRyID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc0F0dHJzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChYbWxJRC50eXBlLmlzQXNzaWduYWJsZUZyb20oc0F0dHJzW2ldLmdldFR5cGUoKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoaWRBdHRyID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBpZEF0dHIgPSBzQXR0cnNbaV0uZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkJvdGggIiArIFFOYW1lSGVscGVyLnByZXR0eShpZEF0dHIpICsgIiBhbmQgIiArIHNBdHRyc1tpXS5nZXROYW1lKCkgKyAiIGFyZSB4czpJRCBhdHRyaWJ1dGVzOyBvbmx5IG9uZSBJRCBhdHRyaWJ1dGUgaXMgYWxsb3dlZCBvbiBhIHR5cGUuIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNBdHRyc1tpXS5nZXREZWZhdWx0VGV4dCgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkFuIGF0dHJpYnV0ZSBvZiB0eXBlIHhzOklEIGlzIG5vdCBhbGxvd2VkIHRvIGhhdmUgYSBkZWZhdWx0IG9yIGZpeGVkIGNvbnN0cmFpbnQuIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlQ29uc3RyYWludCA9IHNBdHRyc1tpXS5nZXREZWZhdWx0VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVDb25zdHJhaW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEFueVNpbXBsZVR5cGUgdmFsID0gc0F0dHJzW2ldLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFsLnZhbGlkYXRlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eUltcGwgc1Byb3AgPSAoU2NoZW1hUHJvcGVydHlJbXBsKXNUeXBlLmdldEF0dHJpYnV0ZVByb3BlcnR5KHNBdHRyc1tpXS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzUHJvcCAhPSBudWxsICYmIHNQcm9wLmdldERlZmF1bHRUZXh0KCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQcm9wLnNldERlZmF1bHRWYWx1ZShuZXcgWG1sVmFsdWVSZWYodmFsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzQXR0cnNbaV0uaXNGaXhlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIlRoZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KHNBdHRyc1tpXS5nZXROYW1lKCkpICsgIiBlbGVtZW50IGZpeGVkIHZhbHVlICciICsgdmFsdWVDb25zdHJhaW50ICsgIicgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzQXR0cnNbaV0uZ2V0VHlwZSgpKSwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiVGhlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoc0F0dHJzW2ldLmdldE5hbWUoKSkgKyAiIGVsZW1lbnQgZGVmYXVsdCB2YWx1ZSAnIiArIHZhbHVlQ29uc3RyYWludCArICInIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc0F0dHJzW2ldLmdldFR5cGUoKSksIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNoZWNrRWxlbWVudERlZmF1bHRzKHNUeXBlLmdldENvbnRlbnRNb2RlbCgpLCBsb2NhdGlvbiwgc1R5cGUpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRWxlbWVudERlZmF1bHRzKFNjaGVtYVBhcnRpY2xlIG1vZGVsLCBYbWxPYmplY3QgbG9jYXRpb24sIFNjaGVtYVR5cGUgcGFyZW50VHlwZSkKLSAgICB7Ci0gICAgICAgIGlmIChtb2RlbCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBzd2l0Y2ggKG1vZGVsLmdldFBhcnRpY2xlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGNoaWxkcmVuID0gbW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja0VsZW1lbnREZWZhdWx0cyhjaGlsZHJlbltpXSwgbG9jYXRpb24sIHBhcmVudFR5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZUNvbnN0cmFpbnQgPSBtb2RlbC5nZXREZWZhdWx0VGV4dCgpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZUNvbnN0cmFpbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5nZXRUeXBlKCkuaXNTaW1wbGVUeXBlKCkgfHwgbW9kZWwuZ2V0VHlwZSgpLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sQW55U2ltcGxlVHlwZSB2YWwgPSBtb2RlbC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbC52YWxpZGF0ZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlJbXBsIHNQcm9wID0gKFNjaGVtYVByb3BlcnR5SW1wbClwYXJlbnRUeXBlLmdldEVsZW1lbnRQcm9wZXJ0eShtb2RlbC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzUHJvcCAhPSBudWxsICYmIHNQcm9wLmdldERlZmF1bHRUZXh0KCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQcm9wLnNldERlZmF1bHRWYWx1ZShuZXcgWG1sVmFsdWVSZWYodmFsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5pc0ZpeGVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiVGhlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobW9kZWwuZ2V0TmFtZSgpKSArICIgZWxlbWVudCBmaXhlZCB2YWx1ZSAnIiArIHZhbHVlQ29uc3RyYWludCArICInIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUobW9kZWwuZ2V0VHlwZSgpKSwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiVGhlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobW9kZWwuZ2V0TmFtZSgpKSArICIgZWxlbWVudCBkZWZhdWx0IHZhbHVlICciICsgdmFsdWVDb25zdHJhaW50ICsgIicgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShtb2RlbC5nZXRUeXBlKCkpLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1vZGVsLmdldFR5cGUoKS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuRUxFTUVOVF9DT05URU5UKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIlRoZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG1vZGVsLmdldE5hbWUoKSkgKyAiIGVsZW1lbnQgY2Fubm90IGhhdmUgYSBkZWZhdWx0IHZhbHVlICciICsgdmFsdWVDb25zdHJhaW50ICsgIicgYmVjYXVzZSBpdHMgdHlwZSBoYXMgZWxlbWVudCBjb250ZW50IG9ubHkuIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtb2RlbC5nZXRUeXBlKCkuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLkVNUFRZX0NPTlRFTlQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiVGhlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobW9kZWwuZ2V0TmFtZSgpKSArICIgZWxlbWVudCBjYW5ub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgJyIgKyB2YWx1ZUNvbnN0cmFpbnQgKyAiJyBiZWNhdXNlIGl0cyB0eXBlIGhhcyBlbXB0eSBjb250ZW50IG9ubHkuIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvLgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBmb2xsb3dpbmcgY29kZSBvbmx5IGNoZWNrcyBydWxlICM1IG9mIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNkZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uCi0gICAgICogIChFdmVyeXRoaW5nIGVsc2UgY2FuIGFuZCBzaG91bGQgYmUgZG9uZSBpbiBTdHNjUmVzb2x2ZXIsIGJlY2F1c2Ugd2UgY2FuIGdpdmUgbW9yZSBkZXRhaWxlZCBsaW5lICMgaW5mbyB0aGVyZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja1Jlc3RyaWN0aW9uKFNjaGVtYVR5cGVJbXBsIHNUeXBlKQotICAgIHsKLSAgICAgICAgaWYgKHNUeXBlLmdldERlcml2YXRpb25UeXBlKCkgPT0gU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTiAmJiAhc1R5cGUuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gd2UgZG9uJ3QgcmVtZW1iZXIgdmVyeSBwcmVjaXNlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLCBidXQgaXQncyBiZXR0ZXIgdGhhbiBub3RoaW4uCi0gICAgICAgICAgICBYbWxPYmplY3QgbG9jYXRpb24gPSBzVHlwZS5nZXRQYXJzZU9iamVjdCgpOwotICAgICAgICAKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgYmFzZVR5cGUgPSBzVHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgICAgICAgaWYgKGJhc2VUeXBlLmlzU2ltcGxlVHlwZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJUaGUgYmFzZSB0eXBlIG9mIGEgY29tcGxleCB0eXBlIHJlc3RyaWN0aW9uIG11c3QgYmUgYSBjb21wbGV4IHR5cGUuIiwgWG1sRXJyb3JDb250ZXh0LklMTEVHQUxfUkVTVFJJQ1RJT04sIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIDUgVGhlIGFwcHJvcHJpYXRlIGNhc2UgYW1vbmcgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0gICAgICAgICAgICBzd2l0Y2ggKHNUeXBlLmdldENvbnRlbnRUeXBlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UOgotICAgICAgICAgICAgICAgICAgICAvLyA1LjEgSWYgdGhlIHtjb250ZW50IHR5cGV9IG9mIHRoZSBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBpcyBhIHNpbXBsZSB0eXBlIGRlZmluaXRpb24sIHRoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGJhc2VUeXBlLmdldENvbnRlbnRUeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjEuMSBUaGUge2NvbnRlbnQgdHlwZX0gb2YgdGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0gbXVzdCBiZSBhIHNpbXBsZSB0eXBlIGRlZmluaXRpb24gb2Ygd2hpY2ggdGhlIHtjb250ZW50IHR5cGV9IGlzIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBhcyBkZWZpbmVkIGluIERlcml2YXRpb24gVmFsaWQgKFJlc3RyaWN0aW9uLCBTaW1wbGUpICinMy4xNC42KS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvOiB3ZSBkb24ndCBhbGxvdyB0aGUgY29udGVudCB0eXBlIHRvIGJlIGFuICJvbiB0aGUgc2lkZSIgc2ltcGxlIHR5cGUsIHNvIG5vdGhpbmcgZmFuY3kgdG8gY2hlY2sgaGVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS4xLjIgVGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0gbXVzdCBiZSBtaXhlZCBhbmQgaGF2ZSBhIHBhcnRpY2xlIHdoaWNoIGlzILdlbXB0aWFibGW3IGFzIGRlZmluZWQgaW4gUGFydGljbGUgRW1wdGlhYmxlICinMy45LjYpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYXNlVHlwZS5nZXRDb250ZW50TW9kZWwoKSAhPSBudWxsICYmICFiYXNlVHlwZS5nZXRDb250ZW50TW9kZWwoKS5pc1NraXBwYWJsZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgdHlwZSB3aXRoIGEgc2ltcGxlIGNvbnRlbnQgbW9kZWwgY2FuIG9ubHkgcmVzdHJpY3QgYSBtaXhlZCBjb250ZW50IG1vZGVsIHRoYXQgaGFzIHNraXBwYWJsZSBlbGVtZW50cy4iLCBYbWxFcnJvckNvbnRleHQuSUxMRUdBTF9SRVNUUklDVElPTiwgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSB0eXBlIHdpdGggYSBzaW1wbGUgY29udGVudCBtb2RlbCBjYW4gb25seSByZXN0cmljdCBhIHNpbXBsZSBvciBtaXhlZCBjb250ZW50IG1vZGVsLiIsIFhtbEVycm9yQ29udGV4dC5JTExFR0FMX1JFU1RSSUNUSU9OLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRU1QVFlfQ09OVEVOVDoKLSAgICAgICAgICAgICAgICAgICAgLy8gNS4yIElmIHRoZSB7Y29udGVudCB0eXBlfSBvZiB0aGUgY29tcGxleCB0eXBlIGl0c2VsZiBpcyBlbXB0eSAsIHRoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGJhc2VUeXBlLmdldENvbnRlbnRUeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5FTVBUWV9DT05URU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuMi4xIFRoZSB7Y29udGVudCB0eXBlfSBvZiB0aGUge2Jhc2UgdHlwZSBkZWZpbml0aW9ufSBtdXN0IGFsc28gYmUgZW1wdHkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS4yLjIgVGhlIHtjb250ZW50IHR5cGV9IG9mIHRoZSB7YmFzZSB0eXBlIGRlZmluaXRpb259IG11c3QgYmUgZWxlbWVudE9ubHkgb3IgbWl4ZWQgYW5kIGhhdmUgYSBwYXJ0aWNsZSB3aGljaCBpcyC3ZW1wdGlhYmxltyBhcyBkZWZpbmVkIGluIFBhcnRpY2xlIEVtcHRpYWJsZSAopzMuOS42KS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZVR5cGUuZ2V0Q29udGVudE1vZGVsKCkgIT0gbnVsbCAmJiAhYmFzZVR5cGUuZ2V0Q29udGVudE1vZGVsKCkuaXNTa2lwcGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHR5cGUgd2l0aCBhbiBlbXB0eSBjb250ZW50IG1vZGVsIGNhbiBvbmx5IHJlc3RyaWN0IGEgY29udGVudCBtb2RlbCB0aGF0IGhhcyBza2lwcGFibGUgZWxlbWVudHMuIiwgWG1sRXJyb3JDb250ZXh0LklMTEVHQUxfUkVTVFJJQ1RJT04sIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHR5cGUgd2l0aCBhbiBlbXB0eSBjb250ZW50IG1vZGVsIGNhbm5vdCByZXN0cmljdCBhIHR5cGUgd2l0aCBhIHNpbXBsZSBjb250ZW50IG1vZGVsLiIsIFhtbEVycm9yQ29udGV4dC5JTExFR0FMX1JFU1RSSUNUSU9OLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVDoKLSAgICAgICAgICAgICAgICAgICAgLy8gNS4zIElmIHRoZSB7Y29udGVudCB0eXBlfSBvZiB0aGUge2Jhc2UgdHlwZSBkZWZpbml0aW9ufSBpcyBtaXhlZC4uLgotICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZVR5cGUuZ2V0Q29udGVudFR5cGUoKSAhPSBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHR5cGUgd2l0aCBhIG1peGVkIGNvbnRlbnQgbW9kZWwgY2FuIG9ubHkgcmVzdHJpY3QgYW5vdGhlciB0eXBlIHdpdGggYSBtaXhlZCBjb250ZW50IG1vZGVsLiIsIFhtbEVycm9yQ29udGV4dC5JTExFR0FMX1JFU1RSSUNUSU9OLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIEZBTExUSFJPVUdICi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkVMRU1FTlRfQ09OVEVOVDoKLSAgICAgICAgICAgICAgICAgICAgLy8gNS4zIC4uLiBvciB0aGUge2NvbnRlbnQgdHlwZX0gb2YgdGhlIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uIGl0c2VsZiBpcyBlbGVtZW50LW9ubHksLi4uCi0gICAgICAgICAgICAgICAgICAgIGlmIChiYXNlVHlwZS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuRU1QVFlfQ09OVEVOVCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgdHlwZSB3aXRoIGVsZW1lbnQgb3IgbWl4ZWQgY29udGVudCBjYW5ub3QgcmVzdHJpY3QgYW4gZW1wdHkgdHlwZS4iLCBYbWxFcnJvckNvbnRleHQuSUxMRUdBTF9SRVNUUklDVElPTiwgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiYXNlVHlwZS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHR5cGUgd2l0aCBlbGVtZW50IG9yIG1peGVkIGNvbnRlbnQgY2Fubm90IHJlc3RyaWN0IGEgc2ltcGxlIHR5cGUuIiwgWG1sRXJyb3JDb250ZXh0LklMTEVHQUxfUkVTVFJJQ1RJT04sIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gNS4zIC4uLiB0aGVuIHRoZSBwYXJ0aWNsZSBvZiB0aGUgY29tcGxleCB0eXBlIGRlZmluaXRpb24gaXRzZWxmIG11c3QgYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIHRoZSBwYXJ0aWNsZSBvZiB0aGUge2NvbnRlbnQgdHlwZX0gb2YgdGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0KLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsID0gYmFzZVR5cGUuZ2V0Q29udGVudE1vZGVsKCk7Ci0gICAgICAgICAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCA9IHNUeXBlLmdldENvbnRlbnRNb2RlbCgpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQoYmFzZU1vZGVsICE9IG51bGwgJiYgZGVyaXZlZE1vZGVsICE9IG51bGwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZU1vZGVsID09IG51bGwgfHwgZGVyaXZlZE1vZGVsID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhCZWFuRGVidWcubG9nU3RhY2tUcmFjZSgiTnVsbCBtb2RlbHMgdGhhdCB3ZXJlbid0IGNhdWdodCBieSBFTVBUWV9DT05URU5UOiAiICsgYmFzZVR5cGUgKyAiICgiICsgYmFzZU1vZGVsICsgIiksICIgKyBzVHlwZSArICIgKCIgKyBkZXJpdmVkTW9kZWwgKyAiKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIklsbGVnYWwgcmVzdHJpY3Rpb24uIiwgWG1sRXJyb3JDb250ZXh0LklMTEVHQUxfUkVTVFJJQ1RJT04sIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gNS4zIC4uLiAgYXMgZGVmaW5lZCBpbiBQYXJ0aWNsZSBWYWxpZCAoUmVzdHJpY3Rpb24pICinMy45LjYpLgotICAgICAgICAgICAgICAgICAgICBMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1ZhbGlkID0gaXNQYXJ0aWNsZVZhbGlkUmVzdHJpY3Rpb24oYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWRkIHRoZSBsYXN0IGVycm9yLCBiZWNhdXNlIGlzUGFydGljbGVWYWxpZFJlc3RyaWN0aW9uIG1heSBhZGQgZXJyb3JzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgY29sbGVjdGlvbiB0aGF0IGl0IGxhdGVyIGNoYW5nZXMgaXRzIG1pbmQgYWJvdXQsIG9yIGl0IG1heSAoaW5hZHZlcnRlbnRseSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmdldCB0byBkZXNjcmliZSBhbiBlcnJvciBpbnRvIHRoZSBjb2xsZWN0aW9uLi4uLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9ycy5zaXplKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiSW52YWxpZCByZXN0cmljdGlvbi4iLCBYbWxFcnJvckNvbnRleHQuSUxMRUdBTF9SRVNUUklDVElPTiwgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmdldEVycm9yTGlzdGVuZXIoKS5hZGQoZXJyb3JzLmdldChlcnJvcnMuc2l6ZSgpIC0gMSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgaW4gdHdvIHNjaGVtYSBwYXJ0aWNsZSB0eXBlcywgYSBiYXNlTW9kZWwsIGFuZCBhIGRlcml2ZWQgbW9kZWwgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUKLSAgICAgKiBkZXJpdmVkTW9kZWwgY2FuIGJlIGVnaXRpbWF0ZWx5IGJlIHVzZWQgZm9yIHJlc3RyaWN0aW9uLiAgRXJyb3JzIGFyZSBwdXQgaW50byB0aGUgZXJyb3JzIGNvbGxlY3Rpb25zLgotICAgICAqIEBwYXJhbSBiYXNlTW9kZWwgLSBUaGUgYmFzZSBzY2hlbWEgcGFydGljbGUKLSAgICAgKiBAcGFyYW0gZGVyaXZlZE1vZGVsIC0gVGhlIGRlcml2ZWQgKHJlc3RyaWN0ZWQpIHNjaGVtYSBwYXJ0aWNsZQotICAgICAqIEBwYXJhbSBlcnJvcnMgLSBJbnZhbGlkIHJlc3RyaWN0aW9uIGVycm9ycyBhcmUgcHV0IGludG8gdGhpcyBjb2xsZWN0aW9uCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4sIHRydWUgaWYgdmFsaWQgcmVzdHJ1Y3Rpb24sIGZhbHNlIGlmIGludmFsaWQgcmVzdHJpY3Rpb24KLSAgICAgKiBACi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGFydGljbGVWYWxpZFJlc3RyaWN0aW9uKFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpICB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdHJpY3Rpb25WYWxpZCA9IGZhbHNlOwotICAgICAgICAvLyAxIFRoZXkgYXJlIHRoZSBzYW1lIHBhcnRpY2xlLgotICAgICAgICBpZiAoYmFzZU1vZGVsLmVxdWFscyhkZXJpdmVkTW9kZWwpKSB7Ci0gICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEltcGxlbWVudCB0YWJsZSBkZWZpbmVkIGluIHNjaGVtYSBzcGVjIG9uIHJlc3RyaWN0aW9ucyBhdDoKLSAgICAgICAgICAgIC8vICAgaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2Nvcy1wYXJ0aWNsZS1yZXN0cmljdAotICAgICAgICAgICAgc3dpdGNoIChiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IG5hbWVBbmRUeXBlT0soKFNjaGVtYUxvY2FsRWxlbWVudCkgYmFzZU1vZGVsLCAoU2NoZW1hTG9jYWxFbGVtZW50KSBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEludmFsaWRDb21iaW5hdGlvbkVycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEludmFsaWRDb21iaW5hdGlvbkVycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEludmFsaWRDb21iaW5hdGlvbkVycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0SW52YWxpZENvbWJpbmF0aW9uRXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiBYQmVhbkRlYnVnLmxvZ1N0YWNrVHJhY2UoIlVua25vd24gc2NoZW1hIHR5cGUgZm9yIERlcml2ZWQgVHlwZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IG5zQ29tcGF0KGJhc2VNb2RlbCwgKFNjaGVtYUxvY2FsRWxlbWVudCkgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gbnNTdWJzZXQoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gbnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eShiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBuc1JlY3Vyc2VDaGVja0NhcmRpbmFsaXR5KGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gbnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eShiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogWEJlYW5EZWJ1Zy5sb2dTdGFja1RyYWNlKCJVbmtub3duIHNjaGVtYSB0eXBlIGZvciBEZXJpdmVkIFR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gcmVjdXJzZUFzSWZHcm91cChiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0SW52YWxpZENvbWJpbmF0aW9uRXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IHJlY3Vyc2UoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkQ29tYmluYXRpb25FcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSByZWN1cnNlVW5vcmRlcmVkKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiBYQmVhbkRlYnVnLmxvZ1N0YWNrVHJhY2UoIlVua25vd24gc2NoZW1hIHR5cGUgZm9yIERlcml2ZWQgVHlwZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSByZWN1cnNlQXNJZkdyb3VwKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkQ29tYmluYXRpb25FcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkQ29tYmluYXRpb25FcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gcmVjdXJzZUxheChiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IG1hcEFuZFN1bShiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogWEJlYW5EZWJ1Zy5sb2dTdGFja1RyYWNlKCJVbmtub3duIHNjaGVtYSB0eXBlIGZvciBEZXJpdmVkIFR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSByZWN1cnNlQXNJZkdyb3VwKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkQ29tYmluYXRpb25FcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkQ29tYmluYXRpb25FcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkQ29tYmluYXRpb25FcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSByZWN1cnNlKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiBYQmVhbkRlYnVnLmxvZ1N0YWNrVHJhY2UoIlVua25vd24gc2NoZW1hIHR5cGUgZm9yIERlcml2ZWQgVHlwZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6IFhCZWFuRGVidWcubG9nU3RhY2tUcmFjZSgiVW5rbm93biBzY2hlbWEgdHlwZSBmb3IgQmFzZSBUeXBlIik7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN0cmljdGlvblZhbGlkOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWFwQW5kU3VtKFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpICB7Ci0gICAgICAgIC8vIG1hcEFuZFN1bSBpcyBjYWxsIGlmIGJhc2U6IENIT0lDRSwgZGVyaXZlZDogU0VRVUVOQ0UKLSAgICAgICAgYXNzZXJ0IGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U7Ci0gICAgICAgIGFzc2VydCBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U7Ci0gICAgICAgIGJvb2xlYW4gbWFwQW5kU3VtVmFsaWQgPSB0cnVlOwotICAgICAgICAvLyBTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IFBhcnRpY2xlIERlcml2YXRpb24gT0sgKFNlcXVlbmNlOkNob2ljZSAtLSBNYXBBbmRTdW0pCi0gICAgICAgIC8vIEZvciBhIHNlcXVlbmNlIGdyb3VwIHBhcnRpY2xlIHRvIGJlIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiBhIGNob2ljZSBncm91cCBwYXJ0aWNsZSBhbGwgb2YgdGhlIGZvbGxvd2luZwotICAgICAgICAvLyBtdXN0IGJlIHRydWU6Ci0gICAgICAgIC8vIDEgVGhlcmUgaXMgYSBjb21wbGV0ZSBmdW5jdGlvbmFsIG1hcHBpbmcgZnJvbSB0aGUgcGFydGljbGVzIGluIHRoZSB7cGFydGljbGVzfSBvZiBSIHRvIHRoZSBwYXJ0aWNsZXMgaW4gdGhlCi0gICAgICAgIC8vIHtwYXJ0aWNsZXN9IG9mIEIgc3VjaCB0aGF0IGVhY2ggcGFydGljbGUgaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIFIgaXMgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIHRoZSBwYXJ0aWNsZSBpbgotICAgICAgICAvLyB0aGUge3BhcnRpY2xlc30gb2YgQiBpdCBtYXBzIHRvIGFzIGRlZmluZWQgYnkgUGFydGljbGUgVmFsaWQgKFJlc3RyaWN0aW9uKSAopzMuOS42KS4KLSAgICAgICAgLy8gaW50ZXJwcmV0YXRpb246ICBlYWNoIHBhcnRpY2xlIGNoaWxkIGluIGRlcml2ZWQgc2hvdWxkIGhhdmUgYSBtYXRjaCBpbiBiYXNlLgotICAgICAgICAvLyAyIFRoZSBwYWlyIGNvbnNpc3Rpbmcgb2YgdGhlIHByb2R1Y3Qgb2YgdGhlIHttaW4gb2NjdXJzfSBvZiBSIGFuZCB0aGUgbGVuZ3RoIG9mIGl0cyB7cGFydGljbGVzfSBhbmQgdW5ib3VuZGVkCi0gICAgICAgIC8vIGlmIHttYXggb2NjdXJzfSBpcyB1bmJvdW5kZWQgb3RoZXJ3aXNlIHRoZSBwcm9kdWN0IG9mIHRoZSB7bWF4IG9jY3Vyc30gb2YgUiBhbmQgdGhlIGxlbmd0aCBvZiBpdHMge3BhcnRpY2xlc30KLSAgICAgICAgLy8gaXMgYSB2YWxpZCByZXN0cmljdGlvbiBvZiBCJ3Mgb2NjdXJyZW5jZSByYW5nZSBhcyBkZWZpbmVkIGJ5IE9jY3VycmVuY2UgUmFuZ2UgT0sgKKczLjkuNikuCi0gICAgICAgIC8vIE5PVEU6IFRoaXMgY2xhdXNlIGlzIGluIHByaW5jaXBsZSBtb3JlIHJlc3RyaWN0aXZlIHRoYW4gYWJzb2x1dGVseSBuZWNlc3NhcnksIGJ1dCBpbiBwcmFjdGljZSB3aWxsIGNvdmVyCi0gICAgICAgIC8vIGFsbCB0aGUgbGlrZWx5IGNhc2VzLCBhbmQgaXMgbXVjaCBlYXNpZXIgdG8gc3BlY2lmeSB0aGFuIHRoZSBmdWxseSBnZW5lcmFsIHZlcnNpb24uCi0gICAgICAgIC8vIE5PVEU6IFRoaXMgY2FzZSBhbGxvd3MgdGhlICJ1bmZvbGRpbmciIG9mIGl0ZXJhdGVkIGRpc2p1bmN0aW9ucyBpbnRvIHNlcXVlbmNlcy4gSXQgbWF5IGJlIHBhcnRpY3VsYXJseSB1c2VmdWwKLSAgICAgICAgLy8gd2hlbiB0aGUgZGlzanVuY3Rpb24gaXMgYW4gaW1wbGljaXQgb25lIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHN1YnN0aXR1dGlvbiBncm91cHMuCi0KLSAgICAgICAgLy8gTWFwIHN0ZXAgLSBmb3IgZWFjaCBtZW1iZXIgb2YgdGhlIGRlcml2ZWQgbW9kZWwncyBwYXJ0aWNsZSBjaGlsZHJlbiBzZWFyY2ggYmFzZSBtb2RlbCdzIHBhcnRpY2xlIGNoaWxkcmVuCi0gICAgICAgIC8vICBmb3IgbWF0Y2gKLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSBkZXJpdmVkUGFydGljbGVBcnJheSA9IGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0gICAgICAgIFNjaGVtYVBhcnRpY2xlW10gYmFzZVBhcnRpY2xlQXJyYXkgPSBiYXNlTW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlcml2ZWRQYXJ0aWNsZUFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkUGFydGljbGUgPSBkZXJpdmVkUGFydGljbGVBcnJheVtpXTsKLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmRNYXRjaCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBiYXNlUGFydGljbGVBcnJheS5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGJhc2VQYXJ0aWNsZSA9IGJhc2VQYXJ0aWNsZUFycmF5W2pdOwotICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2UgdG8gY2hlY2sgaWYgdGhlcmUgaXMgYSBtYXRjaAotICAgICAgICAgICAgICAgIGlmIChpc1BhcnRpY2xlVmFsaWRSZXN0cmljdGlvbihiYXNlUGFydGljbGUsIGRlcml2ZWRQYXJ0aWNsZSwgZXJyb3JzLCBjb250ZXh0KSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIG1hdGNoIHRoZW4gbm8gbmVlZCB0byBjaGVjayBiYXNlIHBhcnRpY2xlcyBhbnltb3JlCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kTWF0Y2ggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZvdW5kTWF0Y2gpIHsKLSAgICAgICAgICAgICAgICBtYXBBbmRTdW1WYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdE1hcHBpbmdFcnJvcigpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdW0gc3RlcAotICAgICAgICBCaWdJbnRlZ2VyIGRlcml2ZWRSYW5nZU1pbiA9IGRlcml2ZWRNb2RlbC5nZXRNaW5PY2N1cnMoKS5tdWx0aXBseShCaWdJbnRlZ2VyLnZhbHVlT2YoZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKS5sZW5ndGgpKTsKLSAgICAgICAgQmlnSW50ZWdlciBkZXJpdmVkUmFuZ2VNYXggPSBudWxsOwotICAgICAgICBCaWdJbnRlZ2VyIFVOQk9VTkRFRCA9IG51bGw7Ci0gICAgICAgIGlmIChkZXJpdmVkTW9kZWwuZ2V0TWF4T2NjdXJzKCkgPT0gVU5CT1VOREVEKSB7Ci0gICAgICAgICAgICBkZXJpdmVkUmFuZ2VNYXggPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVyaXZlZFJhbmdlTWF4ID0gZGVyaXZlZE1vZGVsLmdldE1heE9jY3VycygpLm11bHRpcGx5KEJpZ0ludGVnZXIudmFsdWVPZihkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpLmxlbmd0aCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IGNoZWNrIGRlcml2ZWRSYW5nZSAoZGVyaXZlZFJhbmdlTWluIGFuZCBkZXJpdmVkUmFuZ2VNYXgpIGFnYWluc3QgYmFzZSBtb2RlbCBvY2N1cnJlbmNlIHJhbmdlCi0gICAgICAgIC8vIFNjaGVtYSBDb21wb25lbnQgQ29uc3RyYWludDogT2NjdXJyZW5jZSBSYW5nZSBPSwotICAgICAgICAvLyBGb3IgYSBwYXJ0aWNsZSdzIG9jY3VycmVuY2UgcmFuZ2UgdG8gYmUgYSB2YWxpZCByZXN0cmljdGlvbiBvZiBhbm90aGVyJ3Mgb2NjdXJyZW5jZSByYW5nZSBhbGwgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0gICAgICAgIC8vIDEgSXRzIHttaW4gb2NjdXJzfSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG90aGVyJ3Mge21pbiBvY2N1cnN9LgotICAgICAgICAvLyAyIG9uZSBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKLSAgICAgICAgLy8gICAyLjEgVGhlIG90aGVyJ3Mge21heCBvY2N1cnN9IGlzIHVuYm91bmRlZC4KLSAgICAgICAgLy8gICAyLjIgQm90aCB7bWF4IG9jY3Vyc30gYXJlIG51bWJlcnMsIGFuZCB0aGUgcGFydGljbGUncyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG90aGVyJ3MuCi0KLSAgICAgICAgaWYgKGRlcml2ZWRSYW5nZU1pbi5jb21wYXJlVG8oYmFzZU1vZGVsLmdldE1pbk9jY3VycygpKSA8IDApIHsKLSAgICAgICAgICAgIG1hcEFuZFN1bVZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRPY2N1cmVuY2VSYW5nZU1pbkVycm9yQ2hvaWNlU2VxdWVuY2UoZGVyaXZlZFJhbmdlTWluLCBiYXNlTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmFzZU1vZGVsLmdldE1heE9jY3VycygpID09IFVOQk9VTkRFRCB8fCBkZXJpdmVkUmFuZ2VNYXggIT0gVU5CT1VOREVEICYmIGRlcml2ZWRSYW5nZU1heC5jb21wYXJlVG8oYmFzZU1vZGVsLmdldE1heE9jY3VycygpKSA+IDApIHsKLSAgICAgICAgICAgIG1hcEFuZFN1bVZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRPY2N1cmVuY2VSYW5nZU1heEVycm9yQ2hvaWNlU2VxdWVuY2UoZGVyaXZlZFJhbmdlTWF4LCBiYXNlTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWFwQW5kU3VtVmFsaWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdE9jY3VyZW5jZVJhbmdlTWluRXJyb3JDaG9pY2VTZXF1ZW5jZShCaWdJbnRlZ2VyIGRlcml2ZWRSYW5nZU1pbiwgU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsKSB7Ci0gICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIFRoZSB0b3RhbCBtaW5PY2N1cnMgZm9yIHRoZSBkZXJpdmVkIDxzZXF1ZW5jZT4ncyBlbGVtZW50czogIgotICAgICAgICAgICAgICAgICsgZGVyaXZlZFJhbmdlTWluLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICArICJtdXN0IG5vdCBiZSBsZXNzIHRoYW4gdGhlIGJhc2UgPGNob2ljZT4ncyBtaW5PY2N1cnMgKCIKLSAgICAgICAgICAgICAgICArIGJhc2VNb2RlbC5nZXRNaW5PY2N1cnMoKS50b1N0cmluZygpICsgIikiOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRPY2N1cmVuY2VSYW5nZU1heEVycm9yQ2hvaWNlU2VxdWVuY2UoQmlnSW50ZWdlciBkZXJpdmVkUmFuZ2VNYXgsIFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCkgewotICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBUaGUgdG90YWwgbWF4T2NjdXJzIGZvciB0aGUgZGVyaXZlZCA8c2VxdWVuY2U+J3MgZWxlbWVudHMgKCIKLSAgICAgICAgICAgICAgICArIGRlcml2ZWRSYW5nZU1heC50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgKyAiKSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIGJhc2UgPGNob2ljZT4ncyBtYXhPY2N1cnMgKCIKLSAgICAgICAgICAgICAgICArIHByaW50TWF4T2NjdXJzKGJhc2VNb2RlbC5nZXRNYXhPY2N1cnMoKSkgKyAiKSI7Ci0gICAgICAgCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdE1hcHBpbmdFcnJvcigpIHsKLSAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgQXQgbGVhc3Qgb25lIHJlc3RyaWN0ZWQgdHlwZSBkb2VzIG5vdCBtYXRjaC4iOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmVjdXJzZUFzSWZHcm91cChTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIHJlY3Vyc2VBc0lmR3JvdXAgaXMgY2FsbGVkIGlmOgotICAgICAgICAvLyBiYXNlOiBBTEwsIGRlcml2ZWQ6IEVMRU1FTlQKLSAgICAgICAgLy8gYmFzZTogQ0hPSUNFLCBkZXJpdmVkOiBFTEVNRU5UCi0gICAgICAgIC8vIGJhc2U6IFNFUVVFTkNFLCBkZXJpdmVkOiBFTEVNRU5UCi0gICAgICAgIGFzc2VydCAoYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkFMTCAmJiBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCkKLSAgICAgICAgICAgICAgICB8fCAoYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkNIT0lDRSAmJiBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCkKLSAgICAgICAgICAgICAgICB8fCAoYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFICYmIGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKTsKLSAgICAgICAgLy8gU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBQYXJ0aWNsZSBEZXJpdmF0aW9uIE9LIChFbHQ6QWxsL0Nob2ljZS9TZXF1ZW5jZSAtLSBSZWN1cnNlQXNJZkdyb3VwKQotCi0gICAgICAgIC8vIEZvciBhbiBlbGVtZW50IGRlY2xhcmF0aW9uIHBhcnRpY2xlIHRvIGJlIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiBhIGdyb3VwIHBhcnRpY2xlCi0gICAgICAgIC8vIChhbGwsIGNob2ljZSBvciBzZXF1ZW5jZSkgYSBncm91cCBwYXJ0aWNsZSBvZiB0aGUgdmFyaWV0eSBjb3JyZXNwb25kaW5nIHRvIEIncywgd2l0aCB7bWluIG9jY3Vyc30gYW5kCi0gICAgICAgIC8vIHttYXggb2NjdXJzfSBvZiAxIGFuZCB3aXRoIHtwYXJ0aWNsZXN9IGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUgcGFydGljbGUgdGhlIHNhbWUgYXMgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24KLSAgICAgICAgLy8gbXVzdCBiZSBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgdGhlIGdyb3VwIGFzIGRlZmluZWQgYnkgUGFydGljbGUgRGVyaXZhdGlvbiBPSwotICAgICAgICAvLyAoQWxsOkFsbCxTZXF1ZW5jZTpTZXF1ZW5jZSAtLSBSZWN1cnNlKSAopzMuOS42KSwgUGFydGljbGUgRGVyaXZhdGlvbiBPSyAoQ2hvaWNlOkNob2ljZSAtLSBSZWN1cnNlTGF4KQotICAgICAgICAvLyAopzMuOS42KSBvciBQYXJ0aWNsZSBEZXJpdmF0aW9uIE9LIChBbGw6QWxsLFNlcXVlbmNlOlNlcXVlbmNlIC0tIFJlY3Vyc2UpICinMy45LjYpLCBkZXBlbmRpbmcgb24gd2hldGhlcgotICAgICAgICAvLyB0aGUgZ3JvdXAgaXMgYWxsLCBjaG9pY2Ugb3Igc2VxdWVuY2UKLQotICAgICAgICAvLyBpbnRlcnByZXRhdGlvbjogIG1ha2UgYSBmYWtlIGdyb3VwIG9mIHRoZSByaWdodCB0eXBlLCB3aXRoIG1pbiBvY2N1cnMgYW5kIG1heCBvY2N1cnMgb2YgMQotICAgICAgICBTY2hlbWFQYXJ0aWNsZUltcGwgYXNJZlBhcnQgPSBuZXcgU2NoZW1hUGFydGljbGVJbXBsKCk7Ci0gICAgICAgIGFzSWZQYXJ0LnNldFBhcnRpY2xlVHlwZShiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpOwotICAgICAgICBhc0lmUGFydC5zZXRNaW5PY2N1cnMoQmlnSW50ZWdlci5PTkUpOwotICAgICAgICBhc0lmUGFydC5zZXRNYXhPY2N1cnMoQmlnSW50ZWdlci5PTkUpOwotICAgICAgICBhc0lmUGFydC5zZXRQYXJ0aWNsZUNoaWxkcmVuKG5ldyBTY2hlbWFQYXJ0aWNsZVtdIHsgZGVyaXZlZE1vZGVsIH0pOwotICAgICAgICAKLSAgICAgICAgLy8gdGhlIHJlY3Vyc2UKLSAgICAgICAgcmV0dXJuIGlzUGFydGljbGVWYWxpZFJlc3RyaWN0aW9uKGJhc2VNb2RlbCwgYXNJZlBhcnQsIGVycm9ycywgY29udGV4dCk7IAotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmVjdXJzZUxheChTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSAgewotICAgICAgICAvLyByZWN1cnNlTGF4IGlzIGNhbGxlZCBpZiBiYXNlOiBDSE9JQ0UsIGRlcml2ZWQ6IENIT0lDRQotICAgICAgICBhc3NlcnQgYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkNIT0lDRSAmJiBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQ0hPSUNFOwotICAgICAgICBib29sZWFuIHJlY3Vyc2VMYXhWYWxpZCA9IHRydWU7Ci0gICAgICAgIC8vU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBQYXJ0aWNsZSBEZXJpdmF0aW9uIE9LIChDaG9pY2U6Q2hvaWNlIC0tIFJlY3Vyc2VMYXgpCi0gICAgICAgIC8vIEZvciBhIGNob2ljZSBncm91cCBwYXJ0aWNsZSB0byBiZSBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgYW5vdGhlciBjaG9pY2UgZ3JvdXAgcGFydGljbGUgYWxsIG9mIHRoZQotICAgICAgICAvLyBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAvLyAxIFIncyBvY2N1cnJlbmNlIHJhbmdlIGlzIGEgdmFsaWQgcmVzdHJpY3Rpb24gb2YgQidzIG9jY3VycmVuY2UgcmFuZ2UgYXMgZGVmaW5lZCBieSBPY2N1cnJlbmNlCi0gICAgICAgIC8vIFJhbmdlIE9LICinMy45LjYpOwotICAgICAgICAvLyAyIFRoZXJlIGlzIGEgY29tcGxldGUgt29yZGVyLXByZXNlcnZpbme3IGZ1bmN0aW9uYWwgbWFwcGluZyBmcm9tIHRoZSBwYXJ0aWNsZXMgaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIFIKLSAgICAgICAgLy8gdG8gdGhlIHBhcnRpY2xlcyBpbiB0aGUge3BhcnRpY2xlc30gb2YgQiBzdWNoIHRoYXQgZWFjaCBwYXJ0aWNsZSBpbiB0aGUge3BhcnRpY2xlc30gb2YgUiBpcyBhCi0gICAgICAgIC8vILd2YWxpZCByZXN0cmljdGlvbrcgb2YgdGhlIHBhcnRpY2xlIGluIHRoZSB7cGFydGljbGVzfSBvZiBCIGl0IG1hcHMgdG8gYXMgZGVmaW5lZCBieQotICAgICAgICAvLyBQYXJ0aWNsZSBWYWxpZCAoUmVzdHJpY3Rpb24pICinMy45LjYpLgotICAgICAgICAvLyBOT1RFOiBBbHRob3VnaCB0aGUgt3ZhbGlkYXRpb263IHNlbWFudGljcyBvZiBhIGNob2ljZSBncm91cCBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIG9yZGVyIG9mIGl0cyBwYXJ0aWNsZXMsCi0gICAgICAgIC8vIGRlcml2ZWQgY2hvaWNlIGdyb3VwcyBhcmUgcmVxdWlyZWQgdG8gbWF0Y2ggdGhlIG9yZGVyIG9mIHRoZWlyIGJhc2UgaW4gb3JkZXIgdG8gc2ltcGxpZnkKLSAgICAgICAgLy8gY2hlY2tpbmcgdGhhdCB0aGUgZGVyaXZhdGlvbiBpcyBPSy4KLSAgICAgICAgLy8gaW50ZXJwcmV0YXRpb246ICBjaGVjayBkZXJpdmVkIGNob2ljZXMgZm9yIG1hdGNoIGluIG9yZGVyLCBtdXN0IGdldCBhbiBpbiBvcmRlciBtYXRjaCBvbiBhIGJhc2UgcGFydGljbGUsCi0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgZG9uJ3QgbmVlZCB0byBjaGVjayBpZiBiYXNlIHBhcnRpY2xlcyBhcmUgc2tpcHBhYmxlLiAgYSBsb3QgbGlrZSByZWN1cnNlCi0KLSAgICAgICAgaWYgKCFvY2N1cnJlbmNlUmFuZ2VPSyhiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGN5Y2xlIHRocnUgYm90aCBkZXJpdmVkIHBhcnRpY2xlIGNoaWxkcmVuIGFuZCBiYXNlIHBhcnRpY2xlIGNoaWxkcmVuIGxvb2tpbmcgZm9yIG1hdGNoZXMKLSAgICAgICAgLy8gIGlmIHRoZSBkZXJpdmVkIHBhcnRpY2xlIGRvZXMgbm90IG1hdGNoIHRoZSBiYXNlIHBhcnRpY2xlIHRoZW4gYmFzZSBwYXJ0aWNsZSBjYW4gYmUgc2tpcHBlZAotCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlW10gZGVyaXZlZFBhcnRpY2xlQXJyYXkgPSBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpOwotICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGJhc2VQYXJ0aWNsZUFycmF5ID0gYmFzZU1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgaW50IGkgPSAwLCBqID0gMDsKLSAgICAgICAgZm9yICg7IGkgPCBkZXJpdmVkUGFydGljbGVBcnJheS5sZW5ndGggJiYgaiA8IGJhc2VQYXJ0aWNsZUFycmF5Lmxlbmd0aDspIHsKLSAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRQYXJ0aWNsZSA9IGRlcml2ZWRQYXJ0aWNsZUFycmF5W2ldOwotICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgYmFzZVBhcnRpY2xlID0gYmFzZVBhcnRpY2xlQXJyYXlbal07Ci0gICAgICAgICAgICAvLyB0cnkgdG8gbWF0Y2ggdGhlIHR3byBwYXJ0aWNsZXMgYnkgcmVjdXJzaW5nCi0gICAgICAgICAgICBpZiAoaXNQYXJ0aWNsZVZhbGlkUmVzdHJpY3Rpb24oYmFzZVBhcnRpY2xlLCBkZXJpdmVkUGFydGljbGUsIGVycm9ycywgY29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICAvLyBjb29sIGZvdW5kIGEgbWF0Y2gsIGluY3JlbWVudCBib3RoIGluZGV4ZXMKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBkaWQgbm90IG1hdGNoLCBpbmNyZW1lbnQgdGhlIGJhc2UgcGFydGljbGUgYXJyYXkgaW5kZXggb25seQotICAgICAgICAgICAgICAgIC8vIE9rLCBsZXQncyBza2lwIHRoaXMgYmFzZSBwYXJ0aWNsZSwgaW5jcmVtZW50IGJhc2UgcGFydGljbGUgYXJyYXkgaW5kZXggb25seQotICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG9rLCBnb3QgdG8gdGhlIGVuZCBvZiBvbmUgb2YgdGhlIGFycmF5cwotICAgICAgICAvLyBpZiBhdCBlbmQgb2YgYmFzZSBwYXJ0aWNsZSBhcnJheSBhbmQgbm90IGF0IHRoZSBlbmQgb2YgZGVyaXZlZCBwYXJ0aWNsZSBhcnJheSB0aGVuIHJlbWFpbmluZyBkZXJpdmVkCi0gICAgICAgIC8vICBwYXJ0aWNsZXMgbXVzdCBub3QgbWF0Y2gKLSAgICAgICAgaWYgKGkgPCBkZXJpdmVkUGFydGljbGVBcnJheS5sZW5ndGgpIHsKLSAgICAgICAgICAgIHJlY3Vyc2VMYXhWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRm91bmQgZGVyaXZlZCBwYXJ0aWNsZXMgdGhhdCBhcmUgbm90IG1hdGNoZWQgaW4gdGhlIGJhc2UgY29udGVudCBtb2RlbC4iOwotICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0RGVyaXZlZE1hcHBpbmdFcnJvcihtZXNzYWdlLCBiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcmV0dXJuIHJlY3Vyc2VMYXhWYWxpZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHJlY3Vyc2VVbm9yZGVyZWQoU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgewotICAgICAgICAvLyByZWN1cnNlVW5vcmRlciBpcyBjYWxsZWQgd2hlbiBiYXNlOiBBTEwgYW5kIGRlcml2ZWQ6IFNFUQotICAgICAgICBhc3NlcnQgYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkFMTCAmJiBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U7Ci0gICAgICAgIGJvb2xlYW4gcmVjdXJzZVVub3JkZXJlZFZhbGlkID0gdHJ1ZTsKLSAgICAgICAgLy8gU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBQYXJ0aWNsZSBEZXJpdmF0aW9uIE9LIChTZXF1ZW5jZTpBbGwgLS0gUmVjdXJzZVVub3JkZXJlZCkKLSAgICAgICAgLy8gRm9yIGEgc2VxdWVuY2UgZ3JvdXAgcGFydGljbGUgdG8gYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIGFuIGFsbCBncm91cCBwYXJ0aWNsZSBhbGwgb2YgdGhlCi0gICAgICAgIC8vIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0gICAgICAgIC8vIDEgUidzIG9jY3VycmVuY2UgcmFuZ2UgaXMgYSB2YWxpZCByZXN0cmljdGlvbiBvZiBCJ3Mgb2NjdXJyZW5jZSByYW5nZSBhcyBkZWZpbmVkIGJ5Ci0gICAgICAgIC8vIE9jY3VycmVuY2UgUmFuZ2UgT0sgKKczLjkuNikuCi0gICAgICAgIC8vIDIgVGhlcmUgaXMgYSBjb21wbGV0ZSBmdW5jdGlvbmFsIG1hcHBpbmcgZnJvbSB0aGUgcGFydGljbGVzIGluIHRoZSB7cGFydGljbGVzfSBvZiBSIHRvIHRoZSBwYXJ0aWNsZXMKLSAgICAgICAgLy8gaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIEIgc3VjaCB0aGF0IGFsbCBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKLSAgICAgICAgLy8gMi4xIE5vIHBhcnRpY2xlIGluIHRoZSB7cGFydGljbGVzfSBvZiBCIGlzIG1hcHBlZCB0byBieSBtb3JlIHRoYW4gb25lIG9mIHRoZSBwYXJ0aWNsZXMgaW4KLSAgICAgICAgLy8gdGhlIHtwYXJ0aWNsZXN9IG9mIFI7Ci0gICAgICAgIC8vIDIuMiBFYWNoIHBhcnRpY2xlIGluIHRoZSB7cGFydGljbGVzfSBvZiBSIGlzIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiB0aGUgcGFydGljbGUgaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIEIKLSAgICAgICAgLy8gaXQgbWFwcyB0byBhcyBkZWZpbmVkIGJ5IFBhcnRpY2xlIFZhbGlkIChSZXN0cmljdGlvbikgKKczLjkuNik7Ci0gICAgICAgIC8vIDIuMyBBbGwgcGFydGljbGVzIGluIHRoZSB7cGFydGljbGVzfSBvZiBCIHdoaWNoIGFyZSBub3QgbWFwcGVkIHRvIGJ5IGFueSBwYXJ0aWNsZSBpbiB0aGUge3BhcnRpY2xlc30KLSAgICAgICAgLy8gb2YgUiBhcmUgt2VtcHRpYWJsZbcgYXMgZGVmaW5lZCBieSBQYXJ0aWNsZSBFbXB0aWFibGUgKKczLjkuNikuCi0gICAgICAgIC8vIE5PVEU6IEFsdGhvdWdoIHRoaXMgY2xhdXNlIGFsbG93cyByZW9yZGVyaW5nLCBiZWNhdXNlIG9mIHRoZSBsaW1pdHMgb24gdGhlIGNvbnRlbnRzIG9mIGFsbCBncm91cHMgdGhlCi0gICAgICAgIC8vIGNoZWNraW5nIHByb2Nlc3MgY2FuIHN0aWxsIGJlIGRldGVybWluaXN0aWMuCi0gICAgICAgIC8vIDEsIDIuMiwgYW5kIDIuMyBhcmUgdGhlIHNhbWUgYXMgcmVjdXJzZSwgc28gZG8gMi4xIGFuZCB0aGVuIGNhbGwgcmVjdXJzZQotCi0gICAgICAgIGlmICghb2NjdXJyZW5jZVJhbmdlT0soYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlYWQgYmFzZVBhcnRpY2xlIGFycmF5IFFOYW1lcyBpbnRvIGhhc2htYXAKLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSBiYXNlUGFydGljbGVzID0gYmFzZU1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgSGFzaE1hcCBiYXNlUGFydGljbGVNYXAgPSBuZXcgSGFzaE1hcCgxMCk7Ci0gICAgICAgIE9iamVjdCBNQVBQRUQgPSBuZXcgT2JqZWN0KCk7Ci0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGhhc2htYXAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiYXNlUGFydGljbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgYmFzZVBhcnRpY2xlTWFwLnB1dChiYXNlUGFydGljbGVzW2ldLmdldE5hbWUoKSwgYmFzZVBhcnRpY2xlc1tpXSk7Ci0gICAgICAgIAotICAgICAgICAvLyBnbyB0aHJ1IHRoZSBzZXF1ZW5jZSAoZGVyaXZlZCBtb2RlbCdzIGNoaWxkcmVuKSBhbmQgY2hlY2sgb2ZmIGZyb20gYmFzZSBwYXJ0aWNsZSBtYXAKLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSBkZXJpdmVkUGFydGljbGVzID0gZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXJpdmVkUGFydGljbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBtYXRjaGVkQmFzZVBhcnRpY2xlID0gKFNjaGVtYVBhcnRpY2xlKSBiYXNlUGFydGljbGVNYXAuZ2V0KGRlcml2ZWRQYXJ0aWNsZXNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVkQmFzZVBhcnRpY2xlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZWN1cnNlVW5vcmRlcmVkVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkQWxsU2VxTWFwcGluZ0Vycm9yKCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZ290IGEgbWF0Y2gKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEJhc2VQYXJ0aWNsZSA9PSBNQVBQRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2hvYSwgdGhpcyBiYXNlIHBhcnRpY2xlIGhhcyBhbHJlYWR5IGJlZW4gbWF0Y2hlZCAoc2VlIDIuMSBhYm92ZSkKLSAgICAgICAgICAgICAgICAgICAgcmVjdXJzZVVub3JkZXJlZFZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdE1hcHBlZE1vcmVUaGFuT25jZUVycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGVyaXZlZFBhcnRpY2xlc1tpXS5nZXRNYXhPY2N1cnMoKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyaXZlZFBhcnRpY2xlc1tpXS5nZXRNYXhPY2N1cnMoKS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZGVyaXZlZCBwYXJ0aWNsZXMgY2FuIGhhdmUgYSBtYXggb2NjdXJzIGdyZWF0ZXIgdGhhbiAxCi0gICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlVW5vcmRlcmVkVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEFsbFNlcU1heE9jY3Vyc0dyZWF0ZXJUaGFuMUVycm9yKGRlcml2ZWRQYXJ0aWNsZXNbaV0pLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUGFydGljbGVWYWxpZFJlc3RyaWN0aW9uKG1hdGNoZWRCYXNlUGFydGljbGUsIGRlcml2ZWRQYXJ0aWNsZXNbaV0sIGVycm9ycywgY29udGV4dCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGF2ZSBhbiBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZVVub3JkZXJlZFZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBldmVyeXRoaW5nIGlzIGNvb2wsIGdvdCBhIG1hdGNoLCB1cGRhdGUgdG8gTUFQUEVECi0gICAgICAgICAgICAgICAgICAgIGJhc2VQYXJ0aWNsZU1hcC5wdXQoZGVyaXZlZFBhcnRpY2xlc1tpXS5nZXROYW1lKCksIE1BUFBFRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgZXZlcnl0aGluZyBpcyBjb29sIHNvIGZhciB0aGVuIGNoZWNrIHRvIHNlZSBpZiBhbnkgYmFzZSBwYXJ0aWNsZXMgYXJlIG5vdCBtYXRjaGVkCi0gICAgICAgIGlmIChyZWN1cnNlVW5vcmRlcmVkVmFsaWQpIHsKLSAgICAgICAgICAgIC8vIGdldCBhbGwgdGhlIGhhc2htYXAga2V5cyBhbmQgbG9vcCB0aHJ1IGxvb2tpbmcgZm9yIE5PVF9NQVBQRUQKLSAgICAgICAgICAgIFNldCBiYXNlUGFydGljbGVDb2xsZWN0aW9uID0gYmFzZVBhcnRpY2xlTWFwLmtleVNldCgpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGJhc2VQYXJ0aWNsZUNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFFOYW1lIGJhc2VQYXJ0aWNsZVFOYW1lID0gKFFOYW1lKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJhc2VQYXJ0aWNsZU1hcC5nZXQoYmFzZVBhcnRpY2xlUU5hbWUpICE9IE1BUFBFRCAmJiAhKChTY2hlbWFQYXJ0aWNsZSliYXNlUGFydGljbGVNYXAuZ2V0KGJhc2VQYXJ0aWNsZVFOYW1lKSkuaXNTa2lwcGFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGJhc2UgcGFydGljbGUgd2FzIG5vdCBtYXBwZWQgYW5kIGlzIG5vdCAicGFydGljbGUgZW1wdGlhYmxlIiAoc2tpcHBhYmxlKQotICAgICAgICAgICAgICAgICAgICByZWN1cnNlVW5vcmRlcmVkVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0R3JvdXBNYXBwaW5nRXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlY3Vyc2VVbm9yZGVyZWRWYWxpZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0QWxsU2VxTWF4T2NjdXJzR3JlYXRlclRoYW4xRXJyb3IoU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsKSB7Ci0gICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIFRoZSAiCi0gICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGRlcml2ZWRNb2RlbCkKLSAgICAgICAgICAgICAgICArICIgaGFzIGEgbWF4T2NjdXJzIGdyZWF0IHRoYW4gMSAoIgotICAgICAgICAgICAgICAgICsgcHJpbnRNYXhPY2N1cnMoZGVyaXZlZE1vZGVsLmdldE1heE9jY3VycygpKQotICAgICAgICAgICAgICAgICsgIikuICBXaGVuIHJlc3RyaWN0aW5nIGFuIDxhbGw+IHdpdGggYSA8c2VxdWVuY2U+LCBubyA8ZWxlbWVudD4gY2FuIGhhdmUgYSBtYXhPY2N1cnMgPiAxIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0SW52YWxpZEFsbFNlcU1hcHBpbmdFcnJvcigpIHsKLSAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgRWFjaCBlbGVtZW50IGluIHRoZSBkZXJpdmVkIGNvbnRlbnQgbW9kZWwgbXVzdCBtYXRjaCBhbiBlbGVtZW50IGluIHRoZSBiYXNlICIKLSAgICAgICAgICAgICAgICArICJjb250ZW50IG1vZGVsLiI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdEdyb3VwTWFwcGluZ0Vycm9yKFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsKSB7Ci0gICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIFRoZSBtZW1iZXJzIG9mIHRoZSBkZXJpdmVkIGNvbnRlbnQgbW9kZWwgbXVzdCBtYXRjaCB0aGUgbWVtYmVycyBvZiB0aGUgYmFzZSAiCi0gICAgICAgICAgICAgICAgKyAiIGNvbnRlbnQgbW9kZWwgdW5sZXNzIHRoZSBtZW1iZXIgb2YgdGhlIGJhc2UgY29udGVudCBtb2RlbCBpcyBvcHRpb25hbCAocGFydGljbGUgZW1wdGlhYmxlKS4iOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRNYXBwZWRNb3JlVGhhbk9uY2VFcnJvcihTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCkgewotICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBXaGVuIHVzaW5nIGEgPHNlcXVlbmNlPiB0byByZXN0cmljdCBhbiA8YWxsPiB0aGUgZWxlbWVudHMgaW4gdGhlIDxhbGw+IGNhbiBiZSBtYXBwZWQgb25seSBvbmNlLiAiCi0gICAgICAgICAgICAgICAgKyAiIEZvdW5kIGVsZW1lbnQgaW4gdGhlIDxzZXF1ZW5jZT4gdGhhdCBtYXBzIGFuIGVsZW1lbnQgaW4gdGhlIDxhbGw+IG1vcmUgdGhhbiBvbmNlLiI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiByZWN1cnNlKFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gcmVjdXJzZSBpcyBjYWxsZWQgd2hlbiBiYXNlOiBBTEwgZGVyaXZlZDogQUxMIG9yIGJhc2U6IFNFUVVFTkNFIGRlcml2ZWQ6IFNFUVVFTkNFCi0gICAgICAgIGJvb2xlYW4gcmVjdXJzZVZhbGlkID0gdHJ1ZTsKLSAgICAgICAgLy8gRm9yIGFuIGFsbCBvciBzZXF1ZW5jZSBncm91cCBwYXJ0aWNsZSB0byBiZSBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgYW5vdGhlciBncm91cCBwYXJ0aWNsZSB3aXRoIHRoZSBzYW1lCi0gICAgICAgIC8vIHtjb21wb3NpdG9yfSBhbGwgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0gICAgICAgIC8vIDEgUidzIG9jY3VycmVuY2UgcmFuZ2UgaXMgYSB2YWxpZCByZXN0cmljdGlvbiBvZiBCJ3Mgb2NjdXJyZW5jZSByYW5nZSBhcyBkZWZpbmVkIGJ5Ci0gICAgICAgIC8vIE9jY3VycmVuY2UgUmFuZ2UgT0sgKKczLjkuNikuCi0gICAgICAgIC8vIDIgVGhlcmUgaXMgYSBjb21wbGV0ZSC3b3JkZXItcHJlc2VydmluZ7cgZnVuY3Rpb25hbCBtYXBwaW5nIGZyb20gdGhlIHBhcnRpY2xlcyBpbiB0aGUge3BhcnRpY2xlc30gb2YgUiB0bwotICAgICAgICAvLyB0aGUgcGFydGljbGVzIGluIHRoZSB7cGFydGljbGVzfSBvZiBCIHN1Y2ggdGhhdCBhbGwgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0gICAgICAgIC8vICAgMi4xIEVhY2ggcGFydGljbGUgaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIFIgaXMgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIHRoZSBwYXJ0aWNsZSBpbiB0aGUge3BhcnRpY2xlc30KLSAgICAgICAgLy8gICBvZiBCIGl0IG1hcHMgdG8gYXMgZGVmaW5lZCBieSBQYXJ0aWNsZSBWYWxpZCAoUmVzdHJpY3Rpb24pICinMy45LjYpLgotICAgICAgICAvLyAgIDIuMiBBbGwgcGFydGljbGVzIGluIHRoZSB7cGFydGljbGVzfSBvZiBCIHdoaWNoIGFyZSBub3QgbWFwcGVkIHRvIGJ5IGFueSBwYXJ0aWNsZSBpbiB0aGUge3BhcnRpY2xlc30KLSAgICAgICAgLy8gICBvZiBSIGFyZSC3ZW1wdGlhYmxltyBhcyBkZWZpbmVkIGJ5IFBhcnRpY2xlIEVtcHRpYWJsZSAopzMuOS42KS4KLSAgICAgICAgLy8gTk9URTogQWx0aG91Z2ggdGhlILd2YWxpZGF0aW9utyBzZW1hbnRpY3Mgb2YgYW4gYWxsIGdyb3VwIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgaXRzIHBhcnRpY2xlcywKLSAgICAgICAgLy8gZGVyaXZlZCBhbGwgZ3JvdXBzIGFyZSByZXF1aXJlZCB0byBtYXRjaCB0aGUgb3JkZXIgb2YgdGhlaXIgYmFzZSBpbiBvcmRlciB0byBzaW1wbGlmeSBjaGVja2luZyB0aGF0Ci0gICAgICAgIC8vIHRoZSBkZXJpdmF0aW9uIGlzIE9LLgotICAgICAgICAvLyBbRGVmaW5pdGlvbjpdICBBIGNvbXBsZXRlIGZ1bmN0aW9uYWwgbWFwcGluZyBpcyBvcmRlci1wcmVzZXJ2aW5nIGlmIGVhY2ggcGFydGljbGUgciBpbiB0aGUgZG9tYWluIFIgbWFwcwotICAgICAgICAvLyB0byBhIHBhcnRpY2xlIGIgaW4gdGhlIHJhbmdlIEIgd2hpY2ggZm9sbG93cyAobm90IG5lY2Vzc2FyaWx5IGltbWVkaWF0ZWx5KSB0aGUgcGFydGljbGUgaW4gdGhlIHJhbmdlIEIKLSAgICAgICAgLy8gbWFwcGVkIHRvIGJ5IHRoZSBwcmVkZWNlc3NvciBvZiByLCBpZiBhbnksIHdoZXJlICJwcmVkZWNlc3NvciIgYW5kICJmb2xsb3dzIiBhcmUgZGVmaW5lZCB3aXRoIHJlc3BlY3QgdG8KLSAgICAgICAgLy8gdGhlIG9yZGVyIG9mIHRoZSBsaXN0cyB3aGljaCBjb25zdGl0dXRlIFIgYW5kIEIuCi0KLSAgICAgICAgaWYgKCFvY2N1cnJlbmNlUmFuZ2VPSyhiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KSkgewotICAgICAgICAgICAgLy8gZXJyb3IgbWVzc2FnZSBpcyBmb3JtYXR0ZWQgaW4gb2NjdXJyZW5jUmFuZ2VPSyAuLi4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvLyBjeWNsZSB0aHJ1IGJvdGggZGVyaXZlZCBwYXJ0aWNsZSBjaGlsZHJlbiBhbmQgYmFzZSBwYXJ0aWNsZSBjaGlsZHJlbiBsb29raW5nIGZvciBtYXRjaGVzCi0gICAgICAgIC8vICBpZiB0aGUgZGVyaXZlZCBwYXJ0aWNsZSBkb2VzIG5vdCBtYXRjaCB0aGUgYmFzZSBwYXJ0aWNsZSB0aGVuIGJhc2UgcGFydGljbGUgY2FuIGJlIHNraXBwZWQgaWYgaXQgaXMKLSAgICAgICAgLy8gIHNraXBwYWJsZSAoc2FtZSBhcyAicGFydGljbGUgZW1wdGlhYmxlIikgb3RoZXJ3aXNlIGlzIGFuIGludmFsaWQgcmVzdHJpY3Rpb24uCi0gICAgICAgIC8vIGFmdGVyIHRoZSBkZXJpdmVkIHBhcnRpY2xlcyBoYXZlIGJlZW4gY3ljbGVkIGlmIHRoZXJlIGFyZSBhbnkgYmFzZSBwYXJ0aWNsZXMgbGVmdCBvdmVyIHRoZW4gdGhleQotICAgICAgICAvLyAgbXVzdCBiZSBza2lwcGFibGUgb3IgaW52YWxpZCByZXN0cmljdGlvbgotCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlW10gZGVyaXZlZFBhcnRpY2xlQXJyYXkgPSBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpOwotICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGJhc2VQYXJ0aWNsZUFycmF5ID0gYmFzZU1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgaW50IGkgPSAwLCBqID0gMDsKLSAgICAgICAgZm9yICg7IGkgPCBkZXJpdmVkUGFydGljbGVBcnJheS5sZW5ndGggJiYgaiA8IGJhc2VQYXJ0aWNsZUFycmF5Lmxlbmd0aDspIHsKLSAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRQYXJ0aWNsZSA9IGRlcml2ZWRQYXJ0aWNsZUFycmF5W2ldOwotICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgYmFzZVBhcnRpY2xlID0gYmFzZVBhcnRpY2xlQXJyYXlbal07Ci0gICAgICAgICAgICAvLyB0cnkgdG8gbWF0Y2ggdGhlIHR3byBwYXJ0aWNsZXMgYnkgcmVjdXJzaW5nCi0gICAgICAgICAgICBpZiAoaXNQYXJ0aWNsZVZhbGlkUmVzdHJpY3Rpb24oYmFzZVBhcnRpY2xlLCBkZXJpdmVkUGFydGljbGUsIGVycm9ycywgY29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICAvLyBjb29sIGZvdW5kIGEgbWF0Y2gsIGluY3JlbWVudCBib3RoIGluZGV4ZXMKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBkaWQgbm90IG1hdGNoLCBpbmNyZW1lbnQgdGhlIGJhc2UgcGFydGljbGUgYXJyYXkgaW5kZXggb25seQotICAgICAgICAgICAgICAgIC8vICB0aGF0J3Mgb2sgaWYgdGhlIGJhc2UgcGFydGljbGUgaXMgc2tpcHBhYmxlCi0gICAgICAgICAgICAgICAgaWYgKGJhc2VQYXJ0aWNsZS5pc1NraXBwYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE9rLCBsZXQncyBza2lwIHRoaXMgYmFzZSBwYXJ0aWNsZSwgaW5jcmVtZW50IGJhc2UgcGFydGljbGUgYXJyYXkgaW5kZXggb25seQotICAgICAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2hvYSwgcGFydGljbGVzIGFyZSBub3QgdmFsaWQgcmVzdHJpY3Rpb25zIGFuZCBiYXNlIGlzIG5vdCBza2lwcGFibGUgLSBFUlJPUgotICAgICAgICAgICAgICAgICAgICByZWN1cnNlVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRm91bmQgbm9uLW9wdGlvbmFsIHBhcnRpY2xlIHRoYXQgaXMgbm90IG1hcHBlZCBpbiBiYXNlIGNvbnRlbnQgbW9kZWwuIjsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0RGVyaXZlZE1hcHBpbmdFcnJvcihtZXNzYWdlLCBiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gb2ssIGdvdCB0byB0aGUgZW5kIG9mIG9uZSBvZiB0aGUgYXJyYXlzCi0gICAgICAgIC8vIGlmIGF0IGVuZCBvZiBiYXNlIHBhcnRpY2xlIGFycmF5IGFuZCBub3QgYXQgdGhlIGVuZCBvZiBkZXJpdmVkIHBhcnRpY2xlIGFycmF5IHRoZW4gcmVtYWluaW5nIGRlcml2ZWQKLSAgICAgICAgLy8gIHBhcnRpY2xlcyBtdXN0IG5vdCBtYXRjaAotICAgICAgICBpZiAoaSA8IGRlcml2ZWRQYXJ0aWNsZUFycmF5Lmxlbmd0aCkgewotICAgICAgICAgICAgcmVjdXJzZVZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJGb3VuZCBkZXJpdmVkIHBhcnRpY2xlcyB0aGF0IGFyZSBub3QgbWF0Y2hlZCBpbiB0aGUgYmFzZSBjb250ZW50IG1vZGVsLiI7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXREZXJpdmVkTWFwcGluZ0Vycm9yKG1lc3NhZ2UsIGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaWYgYXQgZW5kIG9mIGRlcml2ZWQgcGFydGljbGUgYXJyYXkgYW5kIG5vdCBhdCBlbmQgb2YgYmFzZSBwYXJ0aWNsZSBhcnJheSB0aGVuIGNoY2sgcmVtYWluaW5nCi0gICAgICAgICAgICAvLyAgYmFzZSBwYXJ0aWNsZXMgdG8gYXNzdXJlIHRoZXkgYXJlIHNraXBwYWJsZQotICAgICAgICAgICAgaWYgKGogPCBiYXNlUGFydGljbGVBcnJheS5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gajsgayA8IGJhc2VQYXJ0aWNsZUFycmF5Lmxlbmd0aDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYmFzZVBhcnRpY2xlQXJyYXlba10uaXNTa2lwcGFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZVZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJGb3VuZCB0cmFpbGluZyBiYXNlIHBhcnRpY2xlcyB0aGF0IGFyZSBub3Qgb3B0aW9uYWwgYW5kIGFyZSBub3QgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXByZXNlbnRlZCBpbiB0aGUgZGVyaXZlZCBjb250ZW50IG1vZGVsLiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXREZXJpdmVkTWFwcGluZ0Vycm9yKG1lc3NhZ2UsIGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVjdXJzZVZhbGlkOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXREZXJpdmVkTWFwcGluZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCkgewotICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBUaGUgZGVyaXZlZCAocmVzdHJpY3RlZCkgY29udGVudCBtb2RlbCBtdXN0IG1hdGNoIHRoZSBiYXNlIGNvbnRlbnQgbW9kZWwgdW5sZXNzICIKLSAgICAgICAgICAgICAgICArICJ0aGUgcGFydCBvZiB0aGUgYmFzZSBjb250ZW50IG1vZGVsIHRoYXQgZG9lcyBub3QgbWF0Y2ggaXMgb3B0aW9uYWwuICBBIG1pc21hdGNoIGZvdW5kIGJldHdlZW4gYSBiYXNlICIgKwotICAgICAgICAgICAgICAgIHByaW50UGFydGljbGUoYmFzZU1vZGVsKSArICIgYW5kIGEgZGVyaXZlZCAiICsgcHJpbnRQYXJ0aWNsZShkZXJpdmVkTW9kZWwpICsgIi4gICIgKyBtZXNzYWdlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eShTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIG5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHkgaXMgY2FsbGVkIHdoZW46Ci0gICAgICAgIC8vIGJhc2U6IEFOWSwgZGVyaXZlZDogQUxMCi0gICAgICAgIC8vIGJhc2U6IEFOWSwgZGVyaXZlZDogQ0hPSUNFCi0gICAgICAgIC8vIGJhc2U6IEFOWSwgZGVyaXZlZDogU0VRVUVOQ0UKLSAgICAgICAgYXNzZXJ0IGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDsKLSAgICAgICAgYXNzZXJ0IChkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQUxMKQotICAgICAgICAgICAgICAgIHx8IChkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQ0hPSUNFKQotICAgICAgICAgICAgICAgIHx8IChkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuU0VRVUVOQ0UpOwotICAgICAgICBib29sZWFuIG5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHkgPSB0cnVlOwotICAgICAgICAvLyBGb3IgYSBncm91cCBwYXJ0aWNsZSB0byBiZSBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgYSB3aWxkY2FyZCBwYXJ0aWNsZSBhbGwgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0gICAgICAgIC8vIDEgRXZlcnkgbWVtYmVyIG9mIHRoZSB7cGFydGljbGVzfSBvZiB0aGUgZ3JvdXAgaXMgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIHRoZSB3aWxkY2FyZCBhcyBkZWZpbmVkIGJ5IFBhcnRpY2xlIFZhbGlkIChSZXN0cmljdGlvbikgKKczLjkuNikuCi0gICAgICAgIC8vICBOb3RlOiAgbm90IHBvc2l0aXZlIHdoYXQgdGhpcyBtZWFucy4gIEludGVycHJldGluZyB0byBtZWFuIHRoYXQgZXZlcnkgcGFydGljbGUgb2YgdGhlIGdyb3VwIG11c3QgYWRoZXJlIHRvIHdpbGRjYXJkIGRlcml2YXRpb24gcnVsZXMKLSAgICAgICAgLy8gICAgICAgICBpbiBhIHJlY3Vyc2l2ZSBtYW5uZXIKLSAgICAgICAgLy8gIExvb3AgdGhydSB0aGUgY2hpbGRyZW4gcGFydGljbGVzIG9mIHRoZSBncm91cCBhbmQgaW52b2tlIHRoZSBhcHByb3ByaWF0ZSBmdW5jdGlvbiB0byBjaGVjayBmb3Igd2lsZGNhcmQgcmVzdHJpY3Rpb24gdmFsaWRpdHkKLSAgICAgICAgCi0gICAgICAgIC8vIEJBVSAtIGFuIGVycmF0YSBzaG91bGQgYmUgc3VibWl0dGVkIG9uIHRoaXMgY2xhdXNlIG9mIHRoZSBzcGVjLCBiZWNhdXNlIHRoZQotICAgICAgICAvLyBzcGVjIG1ha2VzIG5vIHNlbnNlLCBhcyB0aGUgeHN0YyBwYXJ0aWNsZXNSMDEzLnhzZCB0ZXN0IGV4ZW1wbGlmaWVzLgotICAgICAgICAvLyB3aGF0IHdlIF9zaG91bGRfIHNvIGlzIGFuICJhcyBpZiIgb24gdGhlIHdpbGRjYXJkLCBhbGxvd2luZyBpdCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotICAgICAgICAvLyBiZWZvcmUgcmVjdXJzaW5nCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlSW1wbCBhc0lmUGFydCA9IG5ldyBTY2hlbWFQYXJ0aWNsZUltcGwoKTsKLSAgICAgICAgYXNJZlBhcnQuc2V0UGFydGljbGVUeXBlKGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSk7Ci0gICAgICAgIGFzSWZQYXJ0LnNldFdpbGRjYXJkUHJvY2VzcyhiYXNlTW9kZWwuZ2V0V2lsZGNhcmRQcm9jZXNzKCkpOwotICAgICAgICBhc0lmUGFydC5zZXRXaWxkY2FyZFNldChiYXNlTW9kZWwuZ2V0V2lsZGNhcmRTZXQoKSk7Ci0gICAgICAgIGFzSWZQYXJ0LnNldE1pbk9jY3VycyhCaWdJbnRlZ2VyLlpFUk8pOwotICAgICAgICBhc0lmUGFydC5zZXRNYXhPY2N1cnMobnVsbCk7Ci0gICAgICAgIGFzSWZQYXJ0LnNldFRyYW5zaXRpb25SdWxlcyhiYXNlTW9kZWwuZ2V0V2lsZGNhcmRTZXQoKSwgdHJ1ZSk7Ci0gICAgICAgIGFzSWZQYXJ0LnNldFRyYW5zaXRpb25Ob3RlcyhiYXNlTW9kZWwuZ2V0V2lsZGNhcmRTZXQoKSwgdHJ1ZSk7Ci0KLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSBwYXJ0aWNsZUNoaWxkcmVuID0gZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aWNsZUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBwYXJ0aWNsZSA9IHBhcnRpY2xlQ2hpbGRyZW5baV07Ci0gICAgICAgICAgICBzd2l0Y2ggKHBhcnRpY2xlLmdldFBhcnRpY2xlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgdmFsaWQgV2lsZGNhcmQvRWxlbWVudCBkZXJpdmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIG5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHkgPSBuc0NvbXBhdChhc0lmUGFydCwgKFNjaGVtYUxvY2FsRWxlbWVudCkgcGFydGljbGUsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciB2YWxpZCBXaWxkY2FyZC9XaWxkY2FyZCBkZXJpdmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIG5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHkgPSBuc1N1YnNldChhc0lmUGFydCwgcGFydGljbGUsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciB2YWxpZCBXaWxkY2FyZC9Hcm91cCBkZXJpdmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIG5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHkgPSBuc1JlY3Vyc2VDaGVja0NhcmRpbmFsaXR5KGFzSWZQYXJ0LCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSWYgYW55IHBhcnRpY2xlIGlzIGludmFsaWQgdGhlbiBicmVhayB0aGUgbG9vcAotICAgICAgICAgICAgaWYgKCFuc1JlY3Vyc2VDaGVja0NhcmRpbmFsaXR5KSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAyIFRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgdGhlIGdyb3VwLCBhcyBkZWZpbmVkIGJ5IEVmZmVjdGl2ZSBUb3RhbCBSYW5nZSAoYWxsIGFuZCBzZXF1ZW5jZSkgKKczLjguNikKLSAgICAgICAgLy8gKGlmIHRoZSBncm91cCBpcyBhbGwgb3Igc2VxdWVuY2UpIG9yIEVmZmVjdGl2ZSBUb3RhbCBSYW5nZSAoY2hvaWNlKSAopzMuOC42KSAoaWYgaXQgaXMgY2hvaWNlKSBpcyBhIHZhbGlkCi0gICAgICAgIC8vIHJlc3RyaWN0aW9uIG9mIEIncyBvY2N1cnJlbmNlIHJhbmdlIGFzIGRlZmluZWQgYnkgT2NjdXJyZW5jZSBSYW5nZSBPSyAopzMuOS42KS4KLQotICAgICAgICBpZiAobnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eSkgewotICAgICAgICAgICAgbnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eSA9IGNoZWNrR3JvdXBPY2N1cnJlbmNlT0soYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrR3JvdXBPY2N1cnJlbmNlT0soU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgewotICAgICAgICBib29sZWFuIGdyb3VwT2NjdXJyZW5jZU9LID0gdHJ1ZTsKLSAgICAgICAgQmlnSW50ZWdlciBtaW5SYW5nZSA9IEJpZ0ludGVnZXIuWkVSTzsKLSAgICAgICAgQmlnSW50ZWdlciBtYXhSYW5nZSA9IEJpZ0ludGVnZXIuWkVSTzsKLSAgICAgICAgc3dpdGNoIChkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICBtaW5SYW5nZSA9IGdldEVmZmVjdGl2ZU1pblJhbmdlQWxsU2VxKGRlcml2ZWRNb2RlbCk7Ci0gICAgICAgICAgICAgICAgbWF4UmFuZ2UgPSBnZXRFZmZlY3RpdmVNYXhSYW5nZUFsbFNlcShkZXJpdmVkTW9kZWwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgbWluUmFuZ2UgPSBnZXRFZmZlY3RpdmVNaW5SYW5nZUNob2ljZShkZXJpdmVkTW9kZWwpOwotICAgICAgICAgICAgICAgIG1heFJhbmdlID0gZ2V0RWZmZWN0aXZlTWF4UmFuZ2VDaG9pY2UoZGVyaXZlZE1vZGVsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIG1pbiBvY2N1cnMgZm9yIHZhbGlkaXR5Ci0gICAgICAgIC8vIGRlcml2ZWQgbWluIG9jY3VycyBpcyB2YWxpZCBpZiBpdHMge21pbiBvY2N1cnN9IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgb3RoZXIncyB7bWluIG9jY3Vyc30uCi0gICAgICAgIGlmIChtaW5SYW5nZS5jb21wYXJlVG8oYmFzZU1vZGVsLmdldE1pbk9jY3VycygpKSA8IDApIHsKLSAgICAgICAgICAgIGdyb3VwT2NjdXJyZW5jZU9LID0gZmFsc2U7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRHcm91cE1pbk9jY3Vyc0Vycm9yKGRlcml2ZWRNb2RlbCwgYmFzZU1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIENoZWNrIG1heCBvY2N1cnMgZm9yIHZhbGlkaXR5Ci0gICAgICAgIC8vIG9uZSBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKLSAgICAgICAgLy8gVGhlIGJhc2UgbW9kZWwncyB7bWF4IG9jY3Vyc30gaXMgdW5ib3VuZGVkLgotICAgICAgICAvLyBvciBib3RoIHttYXggb2NjdXJzfSBhcmUgbnVtYmVycywgYW5kIHRoZSBwYXJ0aWNsZSdzIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgb3RoZXIncwotICAgICAgICBCaWdJbnRlZ2VyIFVOQk9VTkRFRCA9IG51bGw7Ci0gICAgICAgIGlmIChiYXNlTW9kZWwuZ2V0TWF4T2NjdXJzKCkgIT0gVU5CT1VOREVEKSB7Ci0gICAgICAgICAgICBpZiAobWF4UmFuZ2UgPT0gVU5CT1VOREVEKSB7Ci0gICAgICAgICAgICAgICAgZ3JvdXBPY2N1cnJlbmNlT0sgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRHcm91cE1heE9jY3Vyc0Vycm9yKGRlcml2ZWRNb2RlbCwgYmFzZU1vZGVsKSwgY29udGV4dCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobWF4UmFuZ2UuY29tcGFyZVRvKGJhc2VNb2RlbC5nZXRNYXhPY2N1cnMoKSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdyb3VwT2NjdXJyZW5jZU9LID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEdyb3VwTWF4T2NjdXJzRXJyb3IoZGVyaXZlZE1vZGVsLCBiYXNlTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBncm91cE9jY3VycmVuY2VPSzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0R3JvdXBNYXhPY2N1cnNFcnJvcihTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCkgewotICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBUaGUgbWF4T2NjdXJzIGZvciB0aGUgZGVyaXZlZCBncm91cCAiCi0gICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGRlcml2ZWRNb2RlbCkKLSAgICAgICAgICAgICAgICArICIgaXMgZ3JlYXQgdGhhbiB0aGUgYmFzZSBtYXhPY2N1cnMgb2YgIgotICAgICAgICAgICAgICAgICsgcHJpbnRNYXhPY2N1cnMoYmFzZU1vZGVsLmdldE1heE9jY3VycygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0R3JvdXBNaW5PY2N1cnNFcnJvcihTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCkgewotICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBUaGUgbWluT2NjdXJzIGZvciB0aGUgZGVyaXZlZCBncm91cCAiCi0gICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGRlcml2ZWRNb2RlbCkKLSAgICAgICAgICAgICAgICArICIgaXMgbGVzcyB0aGFuIHRoZSBiYXNlIG1pbk9jY3VycyBvZiAiCi0gICAgICAgICAgICAgICAgKyBiYXNlTW9kZWwuZ2V0TWluT2NjdXJzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQmlnSW50ZWdlciBnZXRFZmZlY3RpdmVNYXhSYW5nZUNob2ljZShTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwpIHsKLSAgICAgICAgQmlnSW50ZWdlciBtYXhSYW5nZSA9IEJpZ0ludGVnZXIuWkVSTzsKLSAgICAgICAgQmlnSW50ZWdlciBVTkJPVU5ERUQgPSBudWxsOwotICAgICAgICAvLyBTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IEVmZmVjdGl2ZSBUb3RhbCBSYW5nZSAoY2hvaWNlKQotICAgICAgICAvLyBUaGUgZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIGEgcGFydGljbGUgd2hvc2Uge3Rlcm19IGlzIGEgZ3JvdXAgd2hvc2Uge2NvbXBvc2l0b3J9IGlzIGNob2ljZQotICAgICAgICAvLyBpcyBhIHBhaXIgb2YgbWluaW11bSBhbmQgbWF4aW11bSwgYXMgZm9sbG93czoKLSAgICAgICAgLy8gTUFYSU1VTQotICAgICAgICAvLyAxKSB1bmJvdW5kZWQgaWYgdGhlIHttYXggb2NjdXJzfSBvZiBhbnkgd2lsZGNhcmQgb3IgZWxlbWVudCBkZWNsYXJhdGlvbiBwYXJ0aWNsZSBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSBvcgotICAgICAgICAvLyB0aGUgbWF4aW11bSBwYXJ0IG9mIHRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgYW55IG9mIHRoZSBncm91cCBwYXJ0aWNsZXMgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gaXMKLSAgICAgICAgLy8gdW5ib3VuZGVkIChub3RlOiBzZWVtcyB0byBiZSB0aGUgc2FtZSBhcyBNYXggUmFuZ2UgQWxsIG9yIFNlcXVlbmNlKSwKLSAgICAgICAgLy8gb3IgMikgaWYgYW55IG9mIHRob3NlIGlzIG5vbi16ZXJvIGFuZCB0aGUge21heCBvY2N1cnN9IG9mIHRoZSBwYXJ0aWNsZSBpdHNlbGYgaXMgdW5ib3VuZGVkLAotICAgICAgICAvLyBvdGhlcndpc2UgMykgdGhlIHByb2R1Y3Qgb2YgdGhlIHBhcnRpY2xlJ3Mge21heCBvY2N1cnN9IGFuZCB0aGUgbWF4aW11bSBvZiB0aGUge21heCBvY2N1cnN9IG9mIGV2ZXJ5Ci0gICAgICAgIC8vIHdpbGRjYXJkIG9yIGVsZW1lbnQgZGVjbGFyYXRpb24gcGFydGljbGUgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gYW5kIHRoZSAqbWF4aW11bSogKG5vdGU6IHRoaXMgaXMgdGhlIGRpZmZlcmVuY2UKLSAgICAgICAgLy8gYmV0d2VlbiBNYXhSYW5nZSBDaG9pY2UgYW5zIE1heFJhbmdlIEFsbCBvciBTZXF1ZW5jZSkgcGFydCBvZiB0aGUKLSAgICAgICAgLy8gZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIGVhY2ggb2YgdGhlIGdyb3VwIHBhcnRpY2xlcyBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfQotICAgICAgICAvLyAob3IgMCBpZiB0aGVyZSBhcmUgbm8ge3BhcnRpY2xlc30pLgotCi0gICAgICAgIGJvb2xlYW4gbm9uWmVyb1BhcnRpY2xlQ2hpbGRGb3VuZCA9IGZhbHNlOwotICAgICAgICBCaWdJbnRlZ2VyIG1heE9jY3Vyc0luV2lsZENhcmRPckVsZW1lbnQgPSBCaWdJbnRlZ2VyLlpFUk87Ci0gICAgICAgIEJpZ0ludGVnZXIgbWF4T2NjdXJzSW5Hcm91cCA9IEJpZ0ludGVnZXIuWkVSTzsKLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSBwYXJ0aWNsZUNoaWxkcmVuID0gZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aWNsZUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBwYXJ0aWNsZSA9IHBhcnRpY2xlQ2hpbGRyZW5baV07Ci0gICAgICAgICAgICBzd2l0Y2ggKHBhcnRpY2xlLmdldFBhcnRpY2xlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHVuYm91bmRlZCB0aGVuIG1heG9jY3VycyB3aWxsIGJlIG51bGwKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpY2xlLmdldE1heE9jY3VycygpID09IFVOQk9VTkRFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmFuZ2UgPSBVTkJPVU5ERUQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydGljbGUuZ2V0SW50TWF4T2NjdXJzKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyB0aHQgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIHBhcnRpY2xlIGlzIGZvdW5kIGZvciBsYXRlciB0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uWmVyb1BhcnRpY2xlQ2hpbGRGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpY2xlLmdldE1heE9jY3VycygpLmNvbXBhcmVUbyhtYXhPY2N1cnNJbldpbGRDYXJkT3JFbGVtZW50KSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzSW5XaWxkQ2FyZE9yRWxlbWVudCA9IHBhcnRpY2xlLmdldE1heE9jY3VycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgICAgICBtYXhSYW5nZSA9IGdldEVmZmVjdGl2ZU1heFJhbmdlQWxsU2VxKGRlcml2ZWRNb2RlbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXhSYW5nZSAhPSBVTkJPVU5ERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgaGlnaGVzdCBtYXhvY2N1cnMgZm91bmQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhSYW5nZS5jb21wYXJlVG8obWF4T2NjdXJzSW5Hcm91cCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzSW5Hcm91cCA9IG1heFJhbmdlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgICAgICBtYXhSYW5nZSA9IGdldEVmZmVjdGl2ZU1heFJhbmdlQ2hvaWNlKGRlcml2ZWRNb2RlbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXhSYW5nZSAhPSBVTkJPVU5ERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgaGlnaGVzdCBtYXhvY2N1cnMgZm91bmQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhSYW5nZS5jb21wYXJlVG8obWF4T2NjdXJzSW5Hcm91cCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzSW5Hcm91cCA9IG1heFJhbmdlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaWYgYW4gdW5ib3VuZGVkIGhhcyBiZWVuIGZvdW5kIHRoZW4gd2UgYXJlIGRvbmUKLSAgICAgICAgICAgIGlmIChtYXhSYW5nZSA9PSBVTkJPVU5ERUQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIDEpIHVuYm91bmRlZCBpZiB0aGUge21heCBvY2N1cnN9IG9mIGFueSB3aWxkY2FyZCBvciBlbGVtZW50IGRlY2xhcmF0aW9uIHBhcnRpY2xlIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9IG9yCi0gICAgICAgIC8vIHRoZSBtYXhpbXVtIHBhcnQgb2YgdGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiBhbnkgb2YgdGhlIGdyb3VwIHBhcnRpY2xlcyBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSBpcwotICAgICAgICAvLyB1bmJvdW5kZWQKLSAgICAgICAgaWYgKG1heFJhbmdlICE9IFVOQk9VTkRFRCkgewotICAgICAgICAgICAgLy8gMikgaWYgYW55IG9mIHRob3NlIGlzIG5vbi16ZXJvIGFuZCB0aGUge21heCBvY2N1cnN9IG9mIHRoZSBwYXJ0aWNsZSBpdHNlbGYgaXMgdW5ib3VuZGVkCi0gICAgICAgICAgICBpZiAobm9uWmVyb1BhcnRpY2xlQ2hpbGRGb3VuZCAmJiBkZXJpdmVkTW9kZWwuZ2V0TWF4T2NjdXJzKCkgPT0gVU5CT1VOREVEKSB7Ci0gICAgICAgICAgICAgICAgbWF4UmFuZ2UgPSBVTkJPVU5ERUQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIDMpIHRoZSBwcm9kdWN0IG9mIHRoZSBwYXJ0aWNsZSdzIHttYXggb2NjdXJzfSBhbmQgdGhlIG1heGltdW0gb2YgdGhlIHttYXggb2NjdXJzfSBvZiBldmVyeQotICAgICAgICAgICAgICAgIC8vIHdpbGRjYXJkIG9yIGVsZW1lbnQgZGVjbGFyYXRpb24gcGFydGljbGUgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gYW5kIHRoZSAqbWF4aW11bSoKLSAgICAgICAgICAgICAgICAvLyBwYXJ0IG9mIHRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgZWFjaCBvZiB0aGUgZ3JvdXAgcGFydGljbGVzIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9Ci0gICAgICAgICAgICAgICAgbWF4UmFuZ2UgPSBkZXJpdmVkTW9kZWwuZ2V0TWF4T2NjdXJzKCkubXVsdGlwbHkobWF4T2NjdXJzSW5XaWxkQ2FyZE9yRWxlbWVudC5hZGQobWF4T2NjdXJzSW5Hcm91cCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1heFJhbmdlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEJpZ0ludGVnZXIgZ2V0RWZmZWN0aXZlTWF4UmFuZ2VBbGxTZXEoU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsKSB7Ci0gICAgICAgIEJpZ0ludGVnZXIgbWF4UmFuZ2UgPSBCaWdJbnRlZ2VyLlpFUk87Ci0gICAgICAgIEJpZ0ludGVnZXIgVU5CT1VOREVEID0gbnVsbDsKLSAgICAgICAgLy8gU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBFZmZlY3RpdmUgVG90YWwgUmFuZ2UgKGFsbCBhbmQgc2VxdWVuY2UpCi0gICAgICAgIC8vIFRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgYSBwYXJ0aWNsZSB3aG9zZSB7dGVybX0gaXMgYSBncm91cCB3aG9zZSB7Y29tcG9zaXRvcn0gaXMgYWxsIG9yIHNlcXVlbmNlIGlzIGEKLSAgICAgICAgLy8gcGFpciBvZiBtaW5pbXVtIGFuZCBtYXhpbXVtLCBhcyBmb2xsb3dzOgotICAgICAgICAvLyBNQVhJTVVNCi0gICAgICAgIC8vIDEpIHVuYm91bmRlZCBpZiB0aGUge21heCBvY2N1cnN9IG9mIGFueSB3aWxkY2FyZCBvciBlbGVtZW50IGRlY2xhcmF0aW9uIHBhcnRpY2xlIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9IG9yCi0gICAgICAgIC8vIHRoZSBtYXhpbXVtIHBhcnQgb2YgdGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiBhbnkgb2YgdGhlIGdyb3VwIHBhcnRpY2xlcyBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSBpcwotICAgICAgICAvLyB1bmJvdW5kZWQsIG9yIDIpIGlmIGFueSBvZiB0aG9zZSBpcyBub24temVybyBhbmQgdGhlIHttYXggb2NjdXJzfSBvZiB0aGUgcGFydGljbGUgaXRzZWxmIGlzIHVuYm91bmRlZCwgb3RoZXJ3aXNlCi0gICAgICAgIC8vIDMpIHRoZSBwcm9kdWN0IG9mIHRoZSBwYXJ0aWNsZSdzIHttYXggb2NjdXJzfSBhbmQgdGhlICpzdW0qIG9mIHRoZSB7bWF4IG9jY3Vyc30gb2YgZXZlcnkgd2lsZGNhcmQgb3IgZWxlbWVudAotICAgICAgICAvLyBkZWNsYXJhdGlvbiBwYXJ0aWNsZSBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSBhbmQgdGhlIG1heGltdW0gcGFydCBvZiB0aGUgZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIGVhY2ggb2YKLSAgICAgICAgLy8gdGhlIGdyb3VwIHBhcnRpY2xlcyBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSAob3IgMCBpZiB0aGVyZSBhcmUgbm8ge3BhcnRpY2xlc30pLgotCi0gICAgICAgIGJvb2xlYW4gbm9uWmVyb1BhcnRpY2xlQ2hpbGRGb3VuZCA9IGZhbHNlOwotICAgICAgICBCaWdJbnRlZ2VyIG1heE9jY3Vyc1RvdGFsID0gQmlnSW50ZWdlci5aRVJPOwotICAgICAgICBCaWdJbnRlZ2VyIG1heE9jY3Vyc0luR3JvdXAgPSBCaWdJbnRlZ2VyLlpFUk87Ci0gICAgICAgIFNjaGVtYVBhcnRpY2xlW10gcGFydGljbGVDaGlsZHJlbiA9IGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGljbGVDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgcGFydGljbGUgPSBwYXJ0aWNsZUNoaWxkcmVuW2ldOwotICAgICAgICAgICAgc3dpdGNoIChwYXJ0aWNsZS5nZXRQYXJ0aWNsZVR5cGUoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICAvLyBpZiB1bmJvdW5kZWQgdGhlbiBtYXhvY2N1cnMgd2lsbCBiZSBudWxsCi0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKSA9PSBVTkJPVU5ERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heFJhbmdlID0gVU5CT1VOREVEOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpY2xlLmdldEludE1heE9jY3VycygpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3cgdGh0IGF0IGxlYXN0IG9uZSBub24temVybyBwYXJ0aWNsZSBpcyBmb3VuZCBmb3IgbGF0ZXIgdGVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vblplcm9QYXJ0aWNsZUNoaWxkRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vyc1RvdGFsID0gbWF4T2NjdXJzVG90YWwuYWRkKHBhcnRpY2xlLmdldE1heE9jY3VycygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgICAgICBtYXhSYW5nZSA9IGdldEVmZmVjdGl2ZU1heFJhbmdlQWxsU2VxKGRlcml2ZWRNb2RlbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXhSYW5nZSAhPSBVTkJPVU5ERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgaGlnaGVzdCBtYXhvY2N1cnMgZm91bmQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhSYW5nZS5jb21wYXJlVG8obWF4T2NjdXJzSW5Hcm91cCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzSW5Hcm91cCA9IG1heFJhbmdlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgICAgICBtYXhSYW5nZSA9IGdldEVmZmVjdGl2ZU1heFJhbmdlQ2hvaWNlKGRlcml2ZWRNb2RlbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXhSYW5nZSAhPSBVTkJPVU5ERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgaGlnaGVzdCBtYXhvY2N1cnMgZm91bmQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhSYW5nZS5jb21wYXJlVG8obWF4T2NjdXJzSW5Hcm91cCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzSW5Hcm91cCA9IG1heFJhbmdlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaWYgYW4gdW5ib3VuZGVkIGhhcyBiZWVuIGZvdW5kIHRoZW4gd2UgYXJlIGRvbmUKLSAgICAgICAgICAgIGlmIChtYXhSYW5nZSA9PSBVTkJPVU5ERUQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIDEpIHVuYm91bmRlZCBpZiB0aGUge21heCBvY2N1cnN9IG9mIGFueSB3aWxkY2FyZCBvciBlbGVtZW50IGRlY2xhcmF0aW9uIHBhcnRpY2xlIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9IG9yCi0gICAgICAgIC8vIHRoZSBtYXhpbXVtIHBhcnQgb2YgdGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiBhbnkgb2YgdGhlIGdyb3VwIHBhcnRpY2xlcyBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSBpcwotICAgICAgICAvLyB1bmJvdW5kZWQKLSAgICAgICAgaWYgKG1heFJhbmdlICE9IFVOQk9VTkRFRCkgewotICAgICAgICAgICAgLy8gMikgaWYgYW55IG9mIHRob3NlIGlzIG5vbi16ZXJvIGFuZCB0aGUge21heCBvY2N1cnN9IG9mIHRoZSBwYXJ0aWNsZSBpdHNlbGYgaXMgdW5ib3VuZGVkCi0gICAgICAgICAgICBpZiAobm9uWmVyb1BhcnRpY2xlQ2hpbGRGb3VuZCAmJiBkZXJpdmVkTW9kZWwuZ2V0TWF4T2NjdXJzKCkgPT0gVU5CT1VOREVEKSB7Ci0gICAgICAgICAgICAgICAgbWF4UmFuZ2UgPSBVTkJPVU5ERUQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIDMpIHRoZSBwcm9kdWN0IG9mIHRoZSBwYXJ0aWNsZSdzIHttYXggb2NjdXJzfSBhbmQgdGhlIHN1bSBvZiB0aGUge21heCBvY2N1cnN9IG9mIGV2ZXJ5IHdpbGRjYXJkIG9yIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAvLyBkZWNsYXJhdGlvbiBwYXJ0aWNsZSBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSBhbmQgdGhlIG1heGltdW0gcGFydCBvZiB0aGUgZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIGVhY2ggb2YKLSAgICAgICAgICAgICAgICAvLyB0aGUgZ3JvdXAgcGFydGljbGVzIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9Ci0gICAgICAgICAgICAgICAgbWF4UmFuZ2UgPSBkZXJpdmVkTW9kZWwuZ2V0TWF4T2NjdXJzKCkubXVsdGlwbHkobWF4T2NjdXJzVG90YWwuYWRkKG1heE9jY3Vyc0luR3JvdXApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYXhSYW5nZTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEJpZ0ludGVnZXIgZ2V0RWZmZWN0aXZlTWluUmFuZ2VDaG9pY2UoU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsKSB7Ci0gICAgICAgIC8vIFNjaGVtYSBDb21wb25lbnQgQ29uc3RyYWludDogRWZmZWN0aXZlIFRvdGFsIFJhbmdlIChjaG9pY2UpCi0gICAgICAgIC8vIFRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgYSBwYXJ0aWNsZSB3aG9zZSB7dGVybX0gaXMgYSBncm91cCB3aG9zZSB7Y29tcG9zaXRvcn0gaXMgY2hvaWNlIGlzIGEgcGFpciBvZgotICAgICAgICAvLyBtaW5pbXVtIGFuZCBtYXhpbXVtLCBhcyBmb2xsb3dzOgotICAgICAgICAvLyBNSU5JTVVNCi0gICAgICAgIC8vIFRoZSBwcm9kdWN0IG9mIHRoZSBwYXJ0aWNsZSdzIHttaW4gb2NjdXJzfQotICAgICAgICAvLyBhbmQgdGhlICptaW5pbXVtKiBvZiB0aGUge21pbiBvY2N1cnN9IG9mIGV2ZXJ5IHdpbGRjYXJkIG9yIGVsZW1lbnQKLSAgICAgICAgLy8gZGVjbGFyYXRpb24gcGFydGljbGUgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gYW5kIHRoZSBtaW5pbXVtIHBhcnQgb2YgdGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiBlYWNoIG9mCi0gICAgICAgIC8vIHRoZSBncm91cCBwYXJ0aWNsZXMgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gKG9yIDAgaWYgdGhlcmUgYXJlIG5vIHtwYXJ0aWNsZXN9KS4KLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSBwYXJ0aWNsZUNoaWxkcmVuID0gZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgaWYgKHBhcnRpY2xlQ2hpbGRyZW4ubGVuZ3RoID09IDApCi0gICAgICAgICAgICByZXR1cm4gQmlnSW50ZWdlci5aRVJPOwotICAgICAgICBCaWdJbnRlZ2VyIG1pblJhbmdlID0gbnVsbDsKLSAgICAgICAgLy8gZ2V0IHRoZSBtaW5pbXVtIG9mIGV2ZXJ5IHdpbGRjYXJkIG9yIGVsZW1lbnQKLSAgICAgICAgLy8gdG90YWwgdXAgdGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBmb3IgZWFjaCBncm91cAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpY2xlQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIHBhcnRpY2xlID0gcGFydGljbGVDaGlsZHJlbltpXTsKLSAgICAgICAgICAgIHN3aXRjaCAocGFydGljbGUuZ2V0UGFydGljbGVUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1pblJhbmdlID09IG51bGwgfHwgbWluUmFuZ2UuY29tcGFyZVRvKHBhcnRpY2xlLmdldE1pbk9jY3VycygpKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pblJhbmdlID0gcGFydGljbGUuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBtcnMgPSBnZXRFZmZlY3RpdmVNaW5SYW5nZUFsbFNlcShkZXJpdmVkTW9kZWwpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWluUmFuZ2UgPT0gbnVsbCB8fCBtaW5SYW5nZS5jb21wYXJlVG8obXJzKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pblJhbmdlID0gbXJzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIG1yYyA9IGdldEVmZmVjdGl2ZU1pblJhbmdlQ2hvaWNlKGRlcml2ZWRNb2RlbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaW5SYW5nZSA9PSBudWxsIHx8IG1pblJhbmdlLmNvbXBhcmVUbyhtcmMpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWluUmFuZ2UgPSBtcmM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1pblJhbmdlID09IG51bGwpCi0gICAgICAgICAgICBtaW5SYW5nZSA9IEJpZ0ludGVnZXIuWkVSTzsKLQotICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHRvdGFsCi0gICAgICAgIG1pblJhbmdlID0gZGVyaXZlZE1vZGVsLmdldE1pbk9jY3VycygpLm11bHRpcGx5KG1pblJhbmdlKTsKLSAgICAgICAgcmV0dXJuIG1pblJhbmdlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEJpZ0ludGVnZXIgZ2V0RWZmZWN0aXZlTWluUmFuZ2VBbGxTZXEoU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsKSB7Ci0gICAgICAgIEJpZ0ludGVnZXIgbWluUmFuZ2UgPSBCaWdJbnRlZ2VyLlpFUk87Ci0gICAgICAgIC8vIFNjaGVtYSBDb21wb25lbnQgQ29uc3RyYWludDogRWZmZWN0aXZlIFRvdGFsIFJhbmdlIChhbGwgYW5kIHNlcXVlbmNlKQotICAgICAgICAvLyBUaGUgZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIGEgcGFydGljbGUgd2hvc2Uge3Rlcm19IGlzIGEgZ3JvdXAgd2hvc2Uge2NvbXBvc2l0b3J9IGlzIGFsbCBvciBzZXF1ZW5jZSBpcyBhCi0gICAgICAgIC8vIHBhaXIgb2YgbWluaW11bSBhbmQgbWF4aW11bSwgYXMgZm9sbG93czoKLSAgICAgICAgLy8gTUlOSU1VTQotICAgICAgICAvLyBUaGUgcHJvZHVjdCBvZiB0aGUgcGFydGljbGUncyB7bWluIG9jY3Vyc30KLSAgICAgICAgLy8gYW5kIHRoZSAqc3VtKiBvZiB0aGUge21pbiBvY2N1cnN9IG9mIGV2ZXJ5IHdpbGRjYXJkIG9yIGVsZW1lbnQKLSAgICAgICAgLy8gZGVjbGFyYXRpb24gcGFydGljbGUgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30KLSAgICAgICAgLy8gYW5kIHRoZSBtaW5pbXVtIHBhcnQgb2YgdGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiBlYWNoCi0gICAgICAgIC8vIG9mIHRoZSBncm91cCBwYXJ0aWNsZXMgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gKG9yIDAgaWYgdGhlcmUgYXJlIG5vIHtwYXJ0aWNsZXN9KS4KLSAgICAgICAgU2NoZW1hUGFydGljbGVbXSBwYXJ0aWNsZUNoaWxkcmVuID0gZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgQmlnSW50ZWdlciBwYXJ0aWNsZVRvdGFsTWluT2NjdXJzID0gQmlnSW50ZWdlci5aRVJPOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpY2xlQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIHBhcnRpY2xlID0gcGFydGljbGVDaGlsZHJlbltpXTsKLSAgICAgICAgICAgIHN3aXRjaCAocGFydGljbGUuZ2V0UGFydGljbGVUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgcGFydGljbGVUb3RhbE1pbk9jY3VycyA9IHBhcnRpY2xlVG90YWxNaW5PY2N1cnMuYWRkKHBhcnRpY2xlLmdldE1pbk9jY3VycygpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICAgICAgcGFydGljbGVUb3RhbE1pbk9jY3VycyA9IHBhcnRpY2xlVG90YWxNaW5PY2N1cnMuYWRkKGdldEVmZmVjdGl2ZU1pblJhbmdlQWxsU2VxKGRlcml2ZWRNb2RlbCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICAgICAgcGFydGljbGVUb3RhbE1pbk9jY3VycyA9IHBhcnRpY2xlVG90YWxNaW5PY2N1cnMuYWRkKGdldEVmZmVjdGl2ZU1pblJhbmdlQ2hvaWNlKGRlcml2ZWRNb2RlbCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1pblJhbmdlID0gZGVyaXZlZE1vZGVsLmdldE1pbk9jY3VycygpLm11bHRpcGx5KHBhcnRpY2xlVG90YWxNaW5PY2N1cnMpOwotCi0gICAgICAgIHJldHVybiBtaW5SYW5nZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG5zU3Vic2V0KFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gbnNTdWJzZXQgaXMgY2FsbGVkIHdoZW4gYmFzZTogQU5ZLCBkZXJpdmVkOiBBTlkKLSAgICAgICAgYXNzZXJ0IGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDsKLSAgICAgICAgYXNzZXJ0IGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDsKLSAgICAgICAgYm9vbGVhbiBuc1N1YnNldCA9IGZhbHNlOwotICAgICAgICAvLyBGb3IgYSB3aWxkY2FyZCBwYXJ0aWNsZSB0byBiZSBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgYW5vdGhlciB3aWxkY2FyZCBwYXJ0aWNsZSBhbGwgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0gICAgICAgIC8vIDEgUidzIG9jY3VycmVuY2UgcmFuZ2UgbXVzdCBiZSBhIHZhbGlkIHJlc3RyaWN0aW9uIG9mIEIncyBvY2N1cnJlbmNlIHJhbmdlIGFzIGRlZmluZWQgYnkgT2NjdXJyZW5jZSBSYW5nZSBPSyAopzMuOS42KS4KLSAgICAgICAgaWYgKG9jY3VycmVuY2VSYW5nZU9LKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpKSB7Ci0gICAgICAgICAgICAvLyAyIFIncyB7bmFtZXNwYWNlIGNvbnN0cmFpbnR9IG11c3QgYmUgYW4gaW50ZW5zaW9uYWwgc3Vic2V0IG9mIEIncyB7bmFtZXNwYWNlIGNvbnN0cmFpbnR9IGFzIGRlZmluZWQKLSAgICAgICAgICAgIC8vIGJ5IFdpbGRjYXJkIFN1YnNldCAopzMuMTAuNikuCi0gICAgICAgICAgICBpZiAoYmFzZU1vZGVsLmdldFdpbGRjYXJkU2V0KCkuaW52ZXJzZSgpLmlzRGlzam9pbnQoZGVyaXZlZE1vZGVsLmdldFdpbGRjYXJkU2V0KCkpKSB7Ci0gICAgICAgICAgICAgICAgbnNTdWJzZXQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuc1N1YnNldCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdE5TSXNOb3RTdWJzZXRFcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5zU3Vic2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXROU0lzTm90U3Vic2V0RXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHJldHVybiBuc1N1YnNldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG5zQ29tcGF0KFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hTG9jYWxFbGVtZW50IGRlcml2ZWRFbGVtZW50LCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gbnNDb21wYXQgaXMgY2FsbGVkIHdoZW4gYmFzZTogQU5ZLCBkZXJpdmVkOiBFTEVNRU5UCi0gICAgICAgIGFzc2VydCBiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuV0lMRENBUkQ7Ci0gICAgICAgIGJvb2xlYW4gbnNDb21wYXQgPSBmYWxzZTsKLSAgICAgICAgLy8gRm9yIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gcGFydGljbGUgdG8gYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIGEgd2lsZGNhcmQgcGFydGljbGUgYWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAvLyAxIFRoZSBlbGVtZW50IGRlY2xhcmF0aW9uJ3Mge3RhcmdldCBuYW1lc3BhY2V9IGlzILd2YWxpZLcgd2l0aCByZXNwZWN0IHRvIHRoZSB3aWxkY2FyZCdzIHtuYW1lc3BhY2UgY29uc3RyYWludH0KLSAgICAgICAgLy8gYXMgZGVmaW5lZCBieSBXaWxkY2FyZCBhbGxvd3MgTmFtZXNwYWNlIE5hbWUgKKczLjEwLjQpLgotICAgICAgICBpZiAoYmFzZU1vZGVsLmdldFdpbGRjYXJkU2V0KCkuY29udGFpbnMoZGVyaXZlZEVsZW1lbnQuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgLy8gMiBSJ3Mgb2NjdXJyZW5jZSByYW5nZSBpcyBhIHZhbGlkIHJlc3RyaWN0aW9uIG9mIEIncyBvY2N1cnJlbmNlIHJhbmdlIGFzIGRlZmluZWQgYnkgT2NjdXJyZW5jZSBSYW5nZSBPSyAopzMuOS42KS4KLSAgICAgICAgICAgIGlmIChvY2N1cnJlbmNlUmFuZ2VPSyhiYXNlTW9kZWwsIChTY2hlbWFQYXJ0aWNsZSkgZGVyaXZlZEVsZW1lbnQsIGVycm9ycywgY29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICBuc0NvbXBhdCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdE9jY3VyZW5jZVJhbmdlTWluRXJyb3IoYmFzZU1vZGVsLCAoU2NoZW1hUGFydGljbGUpIGRlcml2ZWRFbGVtZW50KSwgY29udGV4dCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnNDb21wYXQgPSBmYWxzZTsKLSAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdE5TSXNOb3RTdWJzZXRFcnJvcihiYXNlTW9kZWwsIChTY2hlbWFQYXJ0aWNsZSkgZGVyaXZlZEVsZW1lbnQpLCBjb250ZXh0KSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHJldHVybiBuc0NvbXBhdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0TlNJc05vdFN1YnNldEVycm9yKFNjaGVtYVBhcnRpY2xlIGJhc2VQYXJ0aWNsZSwgU2NoZW1hUGFydGljbGUgZGVyaXZlZFBhcnRpY2xlKSB7Ci0gICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gVGhlIG5hbWVzcGFjZShzKSBvZiB0aGUgZGVyaXZlZCBmaWVsZDogIiArIHByaW50UGFydGljbGUoZGVyaXZlZFBhcnRpY2xlKQotICAgICAgICAgICAgICAgICsgIiBhcmUgbm90IGEgc3Vic2V0IG9mIHRoZSBuYW1lc3BhY2Uocykgb2YgdGhlIGJhc2UgZmllbGQ6ICIgKyBwcmludFBhcnRpY2xlKGJhc2VQYXJ0aWNsZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdEludmFsaWRDb21iaW5hdGlvbkVycm9yKFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsKSB7Ci0gICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIFRoZSBkZXJpdmVkIGNvbnRlbnQgbW9kZWwgIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZShkZXJpdmVkTW9kZWwpCi0gICAgICAgICAgICAgICAgKyAiIGNhbm5vdCByZXN0cmljdCBiYXNlIGNvbnRlbnQgbW9kZWwgIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZShiYXNlTW9kZWwpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbmFtZUFuZFR5cGVPSyhTY2hlbWFMb2NhbEVsZW1lbnQgYmFzZUVsZW1lbnQsIFNjaGVtYUxvY2FsRWxlbWVudCBkZXJpdmVkRWxlbWVudCwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIG5hbWVBbmRUeXBlT0sgY2FsbGVkIHdoZW4gYmFzZTogRUxFTUVOVCBhbmQgZGVyaXZlZDogRUxFTUVOVAotICAgICAgICBib29sZWFuIG5hbWVBbmRUeXBlT0sgPSBmYWxzZTsKLSAgICAgICAgLy8gU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBQYXJ0aWNsZSBSZXN0cmljdGlvbiBPSyAoRWx0OkVsdCAtLSBOYW1lQW5kVHlwZU9LKQotICAgICAgICAvLyAxIFRoZSBkZWNsYXJhdGlvbnMnIHtuYW1lfXMgYW5kIHt0YXJnZXQgbmFtZXNwYWNlfXMgYXJlIHRoZSBzYW1lLgotICAgICAgICBpZiAoKChTY2hlbWFQYXJ0aWNsZSliYXNlRWxlbWVudCkuY2FuU3RhcnRXaXRoRWxlbWVudChkZXJpdmVkRWxlbWVudC5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAvLyAyIEVpdGhlciBCJ3Mge25pbGxhYmxlfSBpcyB0cnVlIG9yIFIncyB7bmlsbGFibGV9IGlzIGZhbHNlLgotICAgICAgICAgICAgaWYgKGJhc2VFbGVtZW50LmlzTmlsbGFibGUoKSB8fCAhZGVyaXZlZEVsZW1lbnQuaXNOaWxsYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gMyBSJ3Mgb2NjdXJyZW5jZSByYW5nZSBpcyBhIHZhbGlkIHJlc3RyaWN0aW9uIG9mIEIncyBvY2N1cnJlbmNlIHJhbmdlIGFzIGRlZmluZWQgYnkgT2NjdXJyZW5jZSBSYW5nZSBPSyAopzMuOS42KS4KLSAgICAgICAgICAgICAgICBpZiAob2NjdXJyZW5jZVJhbmdlT0soKFNjaGVtYVBhcnRpY2xlKSBiYXNlRWxlbWVudCwgKFNjaGVtYVBhcnRpY2xlKSBkZXJpdmVkRWxlbWVudCwgZXJyb3JzLCBjb250ZXh0KSkgewotICAgICAgICAgICAgICAgICAgICAvLyA0IGVpdGhlciBCJ3MgZGVjbGFyYXRpb24ncyB7dmFsdWUgY29uc3RyYWludH0gaXMgYWJzZW50LCBvciBpcyBub3QgZml4ZWQsCi0gICAgICAgICAgICAgICAgICAgIC8vIG9yIFIncyBkZWNsYXJhdGlvbidzIHt2YWx1ZSBjb25zdHJhaW50fSBpcyBmaXhlZCB3aXRoIHRoZSBzYW1lIHZhbHVlLgotICAgICAgICAgICAgICAgICAgICBuYW1lQW5kVHlwZU9LID0gY2hlY2tGaXhlZChiYXNlRWxlbWVudCwgZGVyaXZlZEVsZW1lbnQsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lQW5kVHlwZU9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyA1IFIncyBkZWNsYXJhdGlvbidzIHtpZGVudGl0eS1jb25zdHJhaW50IGRlZmluaXRpb25zfSBpcyBhIHN1YnNldCBvZiBCJ3MgZGVjbGFyYXRpb24ncyB7aWRlbnRpdHktY29uc3RyYWludCBkZWZpbml0aW9uc30sIGlmIGFueS4KLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVBbmRUeXBlT0sgPSBjaGVja0lkZW50aXR5Q29uc3RyYWludHMoYmFzZUVsZW1lbnQsIGRlcml2ZWRFbGVtZW50LCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVBbmRUeXBlT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA3IFIncyB7dHlwZSBkZWZpbml0aW9ufSBpcyB2YWxpZGx5IGRlcml2ZWQgZ2l2ZW4ge2V4dGVuc2lvbiwgbGlzdCwgdW5pb259IGZyb20gQidzIHt0eXBlIGRlZmluaXRpb259IGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lZCBieSBUeXBlIERlcml2YXRpb24gT0sgKENvbXBsZXgpICinMy40LjYpIG9yIFR5cGUgRGVyaXZhdGlvbiBPSyAoU2ltcGxlKSAopzMuMTQuNiksIGFzIGFwcHJvcHJpYXRlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVBbmRUeXBlT0sgPSB0eXBlRGVyaXZhdGlvbk9LKGJhc2VFbGVtZW50LmdldFR5cGUoKSwgZGVyaXZlZEVsZW1lbnQuZ2V0VHlwZSgpLCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lQW5kVHlwZU9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDYgUidzIGRlY2xhcmF0aW9uJ3Mge2Rpc2FsbG93ZWQgc3Vic3RpdHV0aW9uc30gaXMgYSBzdXBlcnNldCBvZiBCJ3MgZGVjbGFyYXRpb24ncyB7ZGlzYWxsb3dlZCBzdWJzdGl0dXRpb25zfS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUFuZFR5cGVPSyA9IGJsb2NrU2V0T0soYmFzZUVsZW1lbnQsIGRlcml2ZWRFbGVtZW50LCBlcnJvcnMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmFtZUFuZFR5cGVPSzsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBibG9ja1NldE9LKFNjaGVtYUxvY2FsRWxlbWVudCBiYXNlRWxlbWVudCwgU2NoZW1hTG9jYWxFbGVtZW50IGRlcml2ZWRFbGVtZW50LCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpCi0gICAgewotICAgICAgICBpZiAoYmFzZUVsZW1lbnQuYmxvY2tSZXN0cmljdGlvbigpICYmICFkZXJpdmVkRWxlbWVudC5ibG9ja1Jlc3RyaWN0aW9uKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KCJSZXN0cmljdGlvbiBJbnZhbGlkLiAgRGVyaXZlZCAiICsgcHJpbnRQYXJ0aWNsZSgoU2NoZW1hUGFydGljbGUpZGVyaXZlZEVsZW1lbnQpICsgIiBkb2VzIG5vdCBibG9jayByZXN0cmljdGlvbiBhcyBkb2VzIHRoZSBiYXNlICIgKyBwcmludFBhcnRpY2xlKChTY2hlbWFQYXJ0aWNsZSliYXNlRWxlbWVudCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmFzZUVsZW1lbnQuYmxvY2tFeHRlbnNpb24oKSAmJiAhZGVyaXZlZEVsZW1lbnQuYmxvY2tFeHRlbnNpb24oKSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoIlJlc3RyaWN0aW9uIEludmFsaWQuICBEZXJpdmVkICIgKyBwcmludFBhcnRpY2xlKChTY2hlbWFQYXJ0aWNsZSlkZXJpdmVkRWxlbWVudCkgKyAiIGRvZXMgbm90IGJsb2NrIGV4dGVuc2lvbiBhcyBkb2VzIHRoZSBiYXNlICIgKyBwcmludFBhcnRpY2xlKChTY2hlbWFQYXJ0aWNsZSliYXNlRWxlbWVudCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmFzZUVsZW1lbnQuYmxvY2tTdWJzdGl0dXRpb24oKSAmJiAhZGVyaXZlZEVsZW1lbnQuYmxvY2tTdWJzdGl0dXRpb24oKSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoIlJlc3RyaWN0aW9uIEludmFsaWQuICBEZXJpdmVkICIgKyBwcmludFBhcnRpY2xlKChTY2hlbWFQYXJ0aWNsZSlkZXJpdmVkRWxlbWVudCkgKyAiIGRvZXMgbm90IGJsb2NrIHN1YnN0aXR1dGlvbiBhcyBkb2VzIHRoZSBiYXNlICIgKyBwcmludFBhcnRpY2xlKChTY2hlbWFQYXJ0aWNsZSliYXNlRWxlbWVudCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsgICAgCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0eXBlRGVyaXZhdGlvbk9LKFNjaGVtYVR5cGUgYmFzZVR5cGUsIFNjaGVtYVR5cGUgZGVyaXZlZFR5cGUsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgewotICAgICAgICBib29sZWFuIHR5cGVEZXJpdmF0aW9uT0sgPSBmYWxzZTsKLSAgICAgICAgLy8gMSBJZiBCIGFuZCBEIGFyZSBub3QgdGhlIHNhbWUgdHlwZSBkZWZpbml0aW9uLCB0aGVuIHRoZSB7ZGVyaXZhdGlvbiBtZXRob2R9IG9mIEQgbXVzdCBub3QgYmUgaW4gdGhlIHN1YnNldC4KLSAgICAgICAgLy8gMiBPbmUgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0gICAgICAgIC8vIDIuMSBCIGFuZCBEIG11c3QgYmUgdGhlIHNhbWUgdHlwZSBkZWZpbml0aW9uLgotICAgICAgICAvLyAyLjIgQiBtdXN0IGJlIEQncyB7YmFzZSB0eXBlIGRlZmluaXRpb259LgotICAgICAgICAvLyAyLjMgQWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAvLyAyLjMuMSBEJ3Mge2Jhc2UgdHlwZSBkZWZpbml0aW9ufSBtdXN0IG5vdCBiZSB0aGUgt3VyLXR5cGUgZGVmaW5pdGlvbrcuCi0gICAgICAgIC8vIDIuMy4yIFRoZSBhcHByb3ByaWF0ZSBjYXNlIGFtb25nIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAvLyAyLjMuMi4xIElmIEQncyB7YmFzZSB0eXBlIGRlZmluaXRpb259IGlzIGNvbXBsZXgsIHRoZW4gaXQgbXVzdCBiZSB2YWxpZGx5IGRlcml2ZWQgZnJvbSBCIGdpdmVuIHRoZSBzdWJzZXQgYXMgZGVmaW5lZCBieSB0aGlzIGNvbnN0cmFpbnQuCi0gICAgICAgIC8vIDIuMy4yLjIgSWYgRCdzIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0gaXMgc2ltcGxlLCB0aGVuIGl0IG11c3QgYmUgdmFsaWRseSBkZXJpdmVkIGZyb20gQiBnaXZlbiB0aGUgc3Vic2V0IGFzIGRlZmluZWQgaW4gVHlwZSBEZXJpdmF0aW9uIE9LIChTaW1wbGUpICinMy4xNC42KS4KLSAgICAgICAgLy8gICBUaGlzIGxpbmUgd2lsbCBjaGVjayBpZiBkZXJpdmVkVHlwZSBpcyBhIHN1YlR5cGUgb2YgYmFzZVR5cGUgKHNob3VsZCBoYW5kbGUgYWxsIG9mIHRoZSAyLnh4IGNoZWNrcyBhYm92ZSkKLSAgICAgICAgaWYgKGJhc2VUeXBlLmlzQXNzaWduYWJsZUZyb20oZGVyaXZlZFR5cGUpKSB7Ci0gICAgICAgICAgICAvLyBPayBkZXJpdmVkIHR5cGUgaXMgc3VidHlwZSBidXQgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBhbGwgb2YgdGhlIGRlcml2YXRpb25zIGJldHdlZW4gdGhlIHR3byB0eXBlcyBhcmUgYnkKLSAgICAgICAgICAgIC8vIFJlc3RyaWN0aW9uLgotICAgICAgICAgICAgdHlwZURlcml2YXRpb25PSyA9IGNoZWNrQWxsRGVyaXZhdGlvbnNGb3JSZXN0cmljdGlvbihiYXNlVHlwZSwgZGVyaXZlZFR5cGUsIGVycm9ycywgY29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBkZXJpdmVkIHR5cGUgaXMgbm90IGEgc3ViLXR5cGUgb2YgYmFzZSB0eXBlCi0gICAgICAgICAgICB0eXBlRGVyaXZhdGlvbk9LID0gZmFsc2U7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXREZXJpdmVkVHlwZU5vdFN1YlR5cGVFcnJvcihiYXNlVHlwZSwgZGVyaXZlZFR5cGUpLCBjb250ZXh0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHlwZURlcml2YXRpb25PSzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0RGVyaXZlZFR5cGVOb3RTdWJUeXBlRXJyb3IoU2NoZW1hVHlwZSBiYXNlVHlwZSwgU2NoZW1hVHlwZSBkZXJpdmVkVHlwZSkgewotICAgICAgICByZXR1cm4gIlJlc3RyaWN0aW9uIEludmFsaWQuICBEZXJpdmVkIFR5cGU6ICIgKyBwcmludFR5cGUoZGVyaXZlZFR5cGUpICsgIiBpcyBub3QgYSBzdWItdHlwZSBvZiBCYXNlIFR5cGU6ICIgKyBwcmludFR5cGUoYmFzZVR5cGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tBbGxEZXJpdmF0aW9uc0ZvclJlc3RyaWN0aW9uKFNjaGVtYVR5cGUgYmFzZVR5cGUsIFNjaGVtYVR5cGUgZGVyaXZlZFR5cGUsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgewotCi0gICAgICAgIGJvb2xlYW4gYWxsRGVyaXZhdGlvbnNBcmVSZXN0cmljdGlvbnMgPSB0cnVlOwotICAgICAgICBTY2hlbWFUeXBlIGN1cnJlbnRUeXBlID0gZGVyaXZlZFR5cGU7Ci0gICAgICAgIC8vIHJ1biB1cCB0aGUgdHlwZXMgaGllcmFyY2h5IGZyb20gZGVyaXZlZCBUeXBlIHRvIGJhc2UgVHlwZSBhbmQgbWFrZSBzdXJlIHRoYXQgYWxsIGFyZSBkZXJpdmVkIGJ5Ci0gICAgICAgIC8vICAgcmVzdHJpY3Rpb24uICBJZiBhbnkgYXJlIG5vdCB0aGVuIHRoaXMgaXMgbm90IGEgdmFsaWQgcmVzdHJpY3Rpb24uCi0gICAgICAgIHdoaWxlICghYmFzZVR5cGUuZXF1YWxzKGN1cnJlbnRUeXBlKSkgewotICAgICAgICAgICAgaWYgKGN1cnJlbnRUeXBlLmdldERlcml2YXRpb25UeXBlKCkgPT0gU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTikgewotICAgICAgICAgICAgICAgIGN1cnJlbnRUeXBlID0gY3VycmVudFR5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWxsRGVyaXZhdGlvbnNBcmVSZXN0cmljdGlvbnMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRBbGxEZXJpdmF0aW9uc0FyZU5vdFJlc3RyaWN0aW9uc0Vycm9yKGJhc2VUeXBlLCBkZXJpdmVkVHlwZSwgY3VycmVudFR5cGUpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFsbERlcml2YXRpb25zQXJlUmVzdHJpY3Rpb25zOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRBbGxEZXJpdmF0aW9uc0FyZU5vdFJlc3RyaWN0aW9uc0Vycm9yKFNjaGVtYVR5cGUgYmFzZVR5cGUsIFNjaGVtYVR5cGUgZGVyaXZlZFR5cGUsIFNjaGVtYVR5cGUgY3VycmVudFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgVGhlIHR5cGUgIiArIHByaW50VHlwZShkZXJpdmVkVHlwZSkgKyAiIGRlcml2ZWQgZnJvbSBiYXNlIHR5cGUgIgotICAgICAgICAgICAgICAgICsgcHJpbnRUeXBlKGJhc2VUeXBlKSArICIgaGFzIGFuIGludGVybWVkaWFyeSB0eXBlICIgKyBwcmludFR5cGUoY3VycmVudFR5cGUpCi0gICAgICAgICAgICAgICAgKyAidGhhdCBpcyBub3QgZGVyaXZlZCBieSByZXN0cmljdGlvbi4iOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tJZGVudGl0eUNvbnN0cmFpbnRzKFNjaGVtYUxvY2FsRWxlbWVudCBiYXNlRWxlbWVudCwgU2NoZW1hTG9jYWxFbGVtZW50IGRlcml2ZWRFbGVtZW50LCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gNSBSJ3MgZGVjbGFyYXRpb24ncyB7aWRlbnRpdHktY29uc3RyYWludCBkZWZpbml0aW9uc30gaXMgYSBzdWJzZXQgb2YgQidzIGRlY2xhcmF0aW9uJ3Mge2lkZW50aXR5LWNvbnN0cmFpbnQgZGVmaW5pdGlvbnN9LCBpZiBhbnkuCi0gICAgICAgIGJvb2xlYW4gaWRlbnRpdHlDb25zdHJhaW50c09LID0gdHJ1ZTsKLQotICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRbXSBiYXNlQ29uc3RyYWludHMgPSBiYXNlRWxlbWVudC5nZXRJZGVudGl0eUNvbnN0cmFpbnRzKCk7Ci0gICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtdIGRlcml2ZWRDb25zdHJhaW50cyA9IGRlcml2ZWRFbGVtZW50LmdldElkZW50aXR5Q29uc3RyYWludHMoKTsKLSAgICAgICAgLy8gY3ljbGUgdGhydSBkZXJpdmVkJ3MgaWRlbnRpdHkgY29uc3RyYWludHMgYW5kIGNoZWNrIGVhY2ggdG8gYXNzdXJlIHRoZXkgaW4gdGhlIGFycmF5IG9mIGJhc2UgY29uc3RyYWludHMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXJpdmVkQ29uc3RyYWludHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBkZXJpdmVkQ29uc3RyYWludCA9IGRlcml2ZWRDb25zdHJhaW50c1tpXTsKLSAgICAgICAgICAgIGlmIChjaGVja0ZvcklkZW50aXR5Q29uc3RyYWludEV4aXN0ZW5jZShiYXNlQ29uc3RyYWludHMsIGRlcml2ZWRDb25zdHJhaW50KSkgewotICAgICAgICAgICAgICAgIGlkZW50aXR5Q29uc3RyYWludHNPSyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdElkZW50aXR5Q29uc3RyYWludHNOb3RTdWJzZXRFcnJvcihiYXNlRWxlbWVudCwgZGVyaXZlZEVsZW1lbnQpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlkZW50aXR5Q29uc3RyYWludHNPSzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0SWRlbnRpdHlDb25zdHJhaW50c05vdFN1YnNldEVycm9yKFNjaGVtYUxvY2FsRWxlbWVudCBiYXNlRWxlbWVudCwgU2NoZW1hTG9jYWxFbGVtZW50IGRlcml2ZWRFbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiAiUmVzdHJpY3Rpb24gSW52YWxpZC4gIFRoZSBpZGVudGl0eSBjb25zdHJhaW50cyBmb3IgIiArIHByaW50UGFydGljbGUoKFNjaGVtYVBhcnRpY2xlKWRlcml2ZWRFbGVtZW50KQotICAgICAgICAgICAgICAgICsgIiBhcmUgbm90IGEgc3Vic2V0IG9mIHRoZSBpZGVudGl0eSBjb25zdHJhaW50cyBmb3IgIiArIHByaW50UGFydGljbGUoKFNjaGVtYVBhcnRpY2xlKWJhc2VFbGVtZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrRm9ySWRlbnRpdHlDb25zdHJhaW50RXhpc3RlbmNlKFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtdIGJhc2VDb25zdHJhaW50cywgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGRlcml2ZWRDb25zdHJhaW50KSB7Ci0gICAgICAgIC8vIHNwaW4gdGhydSB0aGUgYmFzZSBpZGVudGl0eSBjb25zdHJhaW50cyBjaGVjayB0byBzZWUgaWYgZGVyaXZlZCBjb25zdHJhaW50IGV4aXN0cwotICAgICAgICBib29sZWFuIGlkZW50aXR5Q29uc3RyYWludEV4aXN0cyA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJhc2VDb25zdHJhaW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGJhc2VDb25zdHJhaW50ID0gYmFzZUNvbnN0cmFpbnRzW2ldOwotICAgICAgICAgICAgaWYgKGJhc2VDb25zdHJhaW50LmdldE5hbWUoKS5lcXVhbHMoZGVyaXZlZENvbnN0cmFpbnQuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIGlkZW50aXR5Q29uc3RyYWludEV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlkZW50aXR5Q29uc3RyYWludEV4aXN0czsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tGaXhlZChTY2hlbWFMb2NhbEVsZW1lbnQgYmFzZU1vZGVsLCBTY2hlbWFMb2NhbEVsZW1lbnQgZGVyaXZlZE1vZGVsLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gNCBlaXRoZXIgQidzIGRlY2xhcmF0aW9uJ3Mge3ZhbHVlIGNvbnN0cmFpbnR9IGlzIGFic2VudCwgb3IgaXMgbm90IGZpeGVkLAotICAgICAgICAvLyBvciBSJ3MgZGVjbGFyYXRpb24ncyB7dmFsdWUgY29uc3RyYWludH0gaXMgZml4ZWQgd2l0aCB0aGUgc2FtZSB2YWx1ZS4KLSAgICAgICAgYm9vbGVhbiBjaGVja0ZpeGVkID0gZmFsc2U7Ci0gICAgICAgIGlmIChiYXNlTW9kZWwuaXNGaXhlZCgpKSB7Ci0gICAgICAgICAgICBpZiAoYmFzZU1vZGVsLmdldERlZmF1bHRUZXh0KCkuZXF1YWxzKGRlcml2ZWRNb2RlbC5nZXREZWZhdWx0VGV4dCgpKSkgewotICAgICAgICAgICAgICAgIC8vICBSJ3MgZGVjbGFyYXRpb24ncyB7dmFsdWUgY29uc3RyYWludH0gaXMgZml4ZWQgd2l0aCB0aGUgc2FtZSB2YWx1ZS4KLSAgICAgICAgICAgICAgICBjaGVja0ZpeGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGRlcml2ZWQgZWxlbWVudCBoYXMgYSBmaXhlZCB2YWx1ZSB0aGF0IGlzIGRpZmZlcmVudCB0aGFuIHRoZSBiYXNlIGVsZW1lbnQKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkRml4ZWRFcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICBjaGVja0ZpeGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyAgQidzIGRlY2xhcmF0aW9uJ3Mge3ZhbHVlIGNvbnN0cmFpbnR9IGlzIGFic2VudCwgb3IgaXMgbm90IGZpeGVkLAotICAgICAgICAgICAgY2hlY2tGaXhlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoZWNrRml4ZWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdEludmFsaWRGaXhlZEVycm9yKFNjaGVtYUxvY2FsRWxlbWVudCBiYXNlTW9kZWwsIFNjaGVtYUxvY2FsRWxlbWVudCBkZXJpdmVkTW9kZWwpIHsKLSAgICAgICAgcmV0dXJuICJUaGUgRGVyaXZlZCBDb250ZW50IE1vZGVsIG9uIEVsZW1lbnQ6ICciCi0gICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKChTY2hlbWFQYXJ0aWNsZSlkZXJpdmVkTW9kZWwpCi0gICAgICAgICAgICAgICAgKyAiJyBoYXMgYSBmaXhlZCB2YWx1ZSBvZjogJyIKLSAgICAgICAgICAgICAgICArIGRlcml2ZWRNb2RlbC5nZXREZWZhdWx0VGV4dCgpCi0gICAgICAgICAgICAgICAgKyAiJyB3aGljaCBkb2VzIG5vdCBtYXRjaCB0aGUgQmFzZSBDb250ZW50IE1vZGVsOiAnIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZSgoU2NoZW1hUGFydGljbGUpYmFzZU1vZGVsKQotICAgICAgICAgICAgICAgICsgIicgd2hhdCBoYXMgYSBmaXhlZCB2YWx1ZSBvZjogJyIKLSAgICAgICAgICAgICAgICArIGJhc2VNb2RlbC5nZXREZWZhdWx0VGV4dCgpICsgIiciOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gb2NjdXJyZW5jZVJhbmdlT0soU2NoZW1hUGFydGljbGUgYmFzZVBhcnRpY2xlLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkUGFydGljbGUsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgewotICAgICAgICBib29sZWFuIG9jY3VycmVuY2VSYW5nZU9LID0gZmFsc2U7Ci0gICAgICAgIC8vIE5vdGU6IGluIHRoZSBmb2xsb3dpbmcgY29tbWVudHMgKGZyb20gdGhlIHNjaGVtYSBzcGVjKSBvdGhlciBpcyB0aGUgYmFzZU1vZGVsCi0gICAgICAgIC8vIDEgSXRzIHttaW4gb2NjdXJzfSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG90aGVyJ3Mge21pbiBvY2N1cnN9LgotICAgICAgICBpZiAoZGVyaXZlZFBhcnRpY2xlLmdldE1pbk9jY3VycygpLmNvbXBhcmVUbyhiYXNlUGFydGljbGUuZ2V0TWluT2NjdXJzKCkpID49IDApIHsKLSAgICAgICAgICAgIC8vIDIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgotICAgICAgICAgICAgLy8gMi4xIFRoZSBvdGhlcidzIHttYXggb2NjdXJzfSBpcyB1bmJvdW5kZWQuCi0gICAgICAgICAgICBpZiAoYmFzZVBhcnRpY2xlLmdldE1heE9jY3VycygpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvY2N1cnJlbmNlUmFuZ2VPSyA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIDIuMiBCb3RoIHttYXggb2NjdXJzfSBhcmUgbnVtYmVycywgYW5kIHRoZSBwYXJ0aWNsZSdzIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgb3RoZXIncy4KLSAgICAgICAgICAgICAgICBpZiAoZGVyaXZlZFBhcnRpY2xlLmdldE1heE9jY3VycygpICE9IG51bGwgJiYgYmFzZVBhcnRpY2xlLmdldE1heE9jY3VycygpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlcml2ZWRQYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKS5jb21wYXJlVG8oYmFzZVBhcnRpY2xlLmdldE1heE9jY3VycygpKSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9jY3VycmVuY2VSYW5nZU9LID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvY2N1cnJlbmNlUmFuZ2VPSyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZVBhcnRpY2xlLmdldE5hbWUoKSA9PSBudWxsIHx8IGRlcml2ZWRQYXJ0aWNsZS5nZXROYW1lKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0T2NjdXJlbmNlUmFuZ2VNYXhFcnJvckdyb3VwKGJhc2VQYXJ0aWNsZSwgZGVyaXZlZFBhcnRpY2xlKSwgY29udGV4dCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0T2NjdXJlbmNlUmFuZ2VNYXhFcnJvcihiYXNlUGFydGljbGUsIGRlcml2ZWRQYXJ0aWNsZSksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9jY3VycmVuY2VSYW5nZU9LID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoYmFzZVBhcnRpY2xlLmdldE5hbWUoKSA9PSBudWxsIHx8IGRlcml2ZWRQYXJ0aWNsZS5nZXROYW1lKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdE9jY3VyZW5jZVJhbmdlTWluRXJyb3JHcm91cChiYXNlUGFydGljbGUsIGRlcml2ZWRQYXJ0aWNsZSksIGNvbnRleHQpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0T2NjdXJlbmNlUmFuZ2VNaW5FcnJvcihiYXNlUGFydGljbGUsIGRlcml2ZWRQYXJ0aWNsZSksIGNvbnRleHQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb2NjdXJyZW5jZVJhbmdlT0s7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdE9jY3VyZW5jZVJhbmdlTWF4RXJyb3JHcm91cChTY2hlbWFQYXJ0aWNsZSBiYXNlUGFydGljbGUsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRQYXJ0aWNsZSkgewotICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBUaGUgbWF4T2NjdXJzIGZvciB0aGUgIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZShkZXJpdmVkUGFydGljbGUpCi0gICAgICAgICAgICAgICAgKyAiICgiICsgcHJpbnRNYXhPY2N1cnMoZGVyaXZlZFBhcnRpY2xlLmdldE1heE9jY3VycygpKQotICAgICAgICAgICAgICAgICsgIikgaXMgZ3JlYXRlciB0aGFuIHRoYW4gdGhlIG1heE9jY3VycyBmb3IgdGhlIGJhc2UgIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZShiYXNlUGFydGljbGUpCi0gICAgICAgICAgICAgICAgKyAiICgiICsgcHJpbnRNYXhPY2N1cnMoYmFzZVBhcnRpY2xlLmdldE1heE9jY3VycygpKSArICIpIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0T2NjdXJlbmNlUmFuZ2VNaW5FcnJvckdyb3VwKFNjaGVtYVBhcnRpY2xlIGJhc2VQYXJ0aWNsZSwgU2NoZW1hUGFydGljbGUgZGVyaXZlZFBhcnRpY2xlKSB7Ci0gICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIFRoZSBtaW5PY2N1cnMgZm9yIHRoZSAiCi0gICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGRlcml2ZWRQYXJ0aWNsZSkKLSAgICAgICAgICAgICAgICArICIgKCIgKyBkZXJpdmVkUGFydGljbGUuZ2V0TWluT2NjdXJzKCkudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICsgIikgaXMgbGVzcyB0aGFuIHRoYW4gdGhlIG1pbk9jY3VycyBmb3IgdGhlIGJhc2UgIgotICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZShiYXNlUGFydGljbGUpCi0gICAgICAgICAgICAgICAgKyAiICgiICsgYmFzZVBhcnRpY2xlLmdldE1pbk9jY3VycygpLnRvU3RyaW5nKCkgKyAiKSI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdE9jY3VyZW5jZVJhbmdlTWluRXJyb3IoU2NoZW1hUGFydGljbGUgYmFzZUZpZWxkLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkRmllbGQpIHsKLSAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgVGhlIG1pbk9jY3VycyBmb3IgdGhlIGVsZW1lbnQ6ICciCi0gICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGRlcml2ZWRGaWVsZCkKLSAgICAgICAgICAgICAgICArICInICgiICsgZGVyaXZlZEZpZWxkLmdldE1pbk9jY3VycygpLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICArICIpIGlzIGxlc3MgdGhhbiB0aGFuIHRoZSBtaW5PY2N1cnMgZm9yIHRoZSBiYXNlIGVsZW1lbnQ6ICciCi0gICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGJhc2VGaWVsZCkKLSAgICAgICAgICAgICAgICArICInICgiICsgYmFzZUZpZWxkLmdldE1pbk9jY3VycygpLnRvU3RyaW5nKCkgKyAiKSI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdE9jY3VyZW5jZVJhbmdlTWF4RXJyb3IoU2NoZW1hUGFydGljbGUgYmFzZUZpZWxkLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkRmllbGQpIHsKLSAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgVGhlIG1heE9jY3VycyBmb3IgdGhlIGVsZW1lbnQ6ICciCi0gICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGRlcml2ZWRGaWVsZCkKLSAgICAgICAgICAgICAgICArICInICgiICsgcHJpbnRNYXhPY2N1cnMoZGVyaXZlZEZpZWxkLmdldE1heE9jY3VycygpKQotICAgICAgICAgICAgICAgICsgIikgaXMgZ3JlYXRlciB0aGFuIHRoYW4gdGhlIG1heE9jY3VycyBmb3IgdGhlIGJhc2UgZWxlbWVudDogJyIKLSAgICAgICAgICAgICAgICArIHByaW50UGFydGljbGUoYmFzZUZpZWxkKSArICInICgiICsgcHJpbnRNYXhPY2N1cnMoYmFzZUZpZWxkLmdldE1heE9jY3VycygpKSArICIpIjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByaW50UGFydGljbGUoU2NoZW1hUGFydGljbGUgcGFydCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAocGFydC5nZXRQYXJ0aWNsZVR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICI8YWxsPiI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICByZXR1cm4gIjxjaG9pY2U+IjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIjxlbGVtZW50IG5hbWU9XCIiICsgUU5hbWVIZWxwZXIucHJldHR5KHBhcnQuZ2V0TmFtZSgpKSArICJcIj4iOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICByZXR1cm4gIjxzZXF1ZW5jZT4iOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIjxhbnk+IjsKLSAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgIHJldHVybiAiPz8iOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwcmludE1heE9jY3VycyhCaWdJbnRlZ2VyIGJpKQotICAgIHsKLSAgICAgICAgaWYgKGJpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gInVuYm91bmRlZCI7Ci0gICAgICAgIHJldHVybiBiaS50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHJpbnRUeXBlKFNjaGVtYVR5cGUgdHlwZSkKLSAgICB7Ci0gICAgICAgIGlmICh0eXBlLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIFFOYW1lSGVscGVyLnByZXR0eSh0eXBlLmdldE5hbWUoKSk7Ci0gICAgICAgIHJldHVybiB0eXBlLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1N1YnN0aXR1dGlvbkdyb3VwcyhTY2hlbWFHbG9iYWxFbGVtZW50W10gZWx0cykKLSAgICB7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBlbHRzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudCBlbHQgPSBlbHRzW2ldOwotICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudCBoZWFkID0gZWx0LnN1YnN0aXR1dGlvbkdyb3VwKCk7Ci0KLSAgICAgICAgICAgIGlmIChoZWFkICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZSBoZWFkVHlwZSA9IGhlYWQuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGUgdGFpbFR5cGUgPSBlbHQuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgIFhtbE9iamVjdCBwYXJzZVRyZWUgPSAoKFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsKWVsdCkuX3BhcnNlT2JqZWN0OwotCi0gICAgICAgICAgICAgICAgaWYgKCEgaGVhZFR5cGUuaXNBc3NpZ25hYmxlRnJvbSh0YWlsVHlwZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiRWxlbWVudCAiICsgUU5hbWVIZWxwZXIucHJldHR5KGVsdC5nZXROYW1lKCkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgbXVzdCBoYXZlIGEgdHlwZSB0aGF0IGlzIGRlcml2ZWQgZnJvbSB0aGUgdHlwZSBvZiBpdHMgc3Vic3RpdHV0aW9uIGdyb3VwLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuSU5DT05TSVNURU5UX1RZUEUsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChoZWFkLmZpbmFsRXh0ZW5zaW9uKCkgJiYgaGVhZC5maW5hbFJlc3RyaWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiRWxlbWVudCAiICsgUU5hbWVIZWxwZXIucHJldHR5KGVsdC5nZXROYW1lKCkpICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGNhbm5vdCBiZSBzdWJzdGl0dXRlZCBmb3IgZWxlbWVudCB3aXRoIGZpbmFsPScjYWxsJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0RFUklWRV9GSU5BTCwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoISBoZWFkVHlwZS5lcXVhbHModGFpbFR5cGUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWQuZmluYWxFeHRlbnNpb24oKSAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFpbFR5cGUuZ2V0RGVyaXZhdGlvblR5cGUoKSA9PSBTY2hlbWFUeXBlLkRUX0VYVEVOU0lPTikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkVsZW1lbnQgIiArIFFOYW1lSGVscGVyLnByZXR0eShlbHQuZ2V0TmFtZSgpKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY2Fubm90IGJlIHN1YnN0aXR1dGVkIGZvciBlbGVtZW50IHdpdGggZmluYWw9J2V4dGVuc2lvbiciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfREVSSVZFX0ZJTkFMLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhlYWQuZmluYWxSZXN0cmljdGlvbigpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhaWxUeXBlLmdldERlcml2YXRpb25UeXBlKCkgPT0gU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkVsZW1lbnQgIiArIFFOYW1lSGVscGVyLnByZXR0eShlbHQuZ2V0TmFtZSgpKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY2Fubm90IGJlIHN1YnN0aXR1dGVkIGZvciBlbGVtZW50IHdpdGggZmluYWw9J3Jlc3RyaWN0aW9uJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9ERVJJVkVfRklOQUwsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NDb21wbGV4VHlwZVJlc29sdmVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjQ29tcGxleFR5cGVSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzMzOTM5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NDb21wbGV4VHlwZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAzICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS4qOwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQuU2NoZW1hOwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuQW55RG9jdW1lbnQuQW55OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0QnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQYXJ0aWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5vbk5lZ2F0aXZlSW50ZWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXRTcGVjaWZpY2F0aW9uOwotCi1wdWJsaWMgY2xhc3MgU3RzY0NvbXBsZXhUeXBlUmVzb2x2ZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIEdyb3VwIGdldENvbnRlbnRNb2RlbChDb21wbGV4VHlwZSBwYXJzZUN0KQotICAgIHsKLSAgICAgICAgaWYgKHBhcnNlQ3QuZ2V0QWxsKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwYXJzZUN0LmdldEFsbCgpOwotCi0gICAgICAgIGlmIChwYXJzZUN0LmdldFNlcXVlbmNlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwYXJzZUN0LmdldFNlcXVlbmNlKCk7Ci0KLSAgICAgICAgaWYgKHBhcnNlQ3QuZ2V0Q2hvaWNlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwYXJzZUN0LmdldENob2ljZSgpOwotCi0gICAgICAgIGlmIChwYXJzZUN0LmdldEdyb3VwKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwYXJzZUN0LmdldEdyb3VwKCk7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBHcm91cCBnZXRDb250ZW50TW9kZWwoQ29tcGxleFJlc3RyaWN0aW9uVHlwZSBwYXJzZVJlc3QpCi0gICAgewotICAgICAgICBpZiAocGFyc2VSZXN0LmdldEFsbCgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGFyc2VSZXN0LmdldEFsbCgpOwotCi0gICAgICAgIGlmIChwYXJzZVJlc3QuZ2V0U2VxdWVuY2UoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHBhcnNlUmVzdC5nZXRTZXF1ZW5jZSgpOwotCi0gICAgICAgIGlmIChwYXJzZVJlc3QuZ2V0Q2hvaWNlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwYXJzZVJlc3QuZ2V0Q2hvaWNlKCk7Ci0KLSAgICAgICAgaWYgKHBhcnNlUmVzdC5nZXRHcm91cCgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGFyc2VSZXN0LmdldEdyb3VwKCk7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEdyb3VwIGdldENvbnRlbnRNb2RlbChFeHRlbnNpb25UeXBlIHBhcnNlRXh0KQotICAgIHsKLSAgICAgICAgaWYgKHBhcnNlRXh0LmdldEFsbCgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGFyc2VFeHQuZ2V0QWxsKCk7Ci0KLSAgICAgICAgaWYgKHBhcnNlRXh0LmdldFNlcXVlbmNlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwYXJzZUV4dC5nZXRTZXF1ZW5jZSgpOwotCi0gICAgICAgIGlmIChwYXJzZUV4dC5nZXRDaG9pY2UoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHBhcnNlRXh0LmdldENob2ljZSgpOwotCi0gICAgICAgIGlmIChwYXJzZUV4dC5nZXRHcm91cCgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGFyc2VFeHQuZ2V0R3JvdXAoKTsKLQotICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFNjaGVtYSBnZXRTY2hlbWEoWG1sT2JqZWN0IG8pCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgYyA9IG8ubmV3Q3Vyc29yKCk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKCBjLnRvUGFyZW50KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG8gPSBjLmdldE9iamVjdCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChvLnNjaGVtYVR5cGUoKS5lcXVhbHMoU2NoZW1hLnR5cGUpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFNjaGVtYSkgbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGMuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZUNvbXBsZXhUeXBlKFNjaGVtYVR5cGVJbXBsIHNJbXBsKQotICAgIHsKLSAgICAgICAgQ29tcGxleFR5cGUgcGFyc2VDdCA9IChDb21wbGV4VHlwZSlzSW1wbC5nZXRQYXJzZU9iamVjdCgpOwotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0gICAgICAgIFNjaGVtYSBzY2hlbWEgPSBnZXRTY2hlbWEocGFyc2VDdCk7Ci0KLSAgICAgICAgLy8gU2V0IGFic3RyYWN0ICYgZmluYWwgZmxhZ3MKLSAgICAgICAgYm9vbGVhbiBhYnMgPSBwYXJzZUN0LmlzU2V0QWJzdHJhY3QoKSA/IHBhcnNlQ3QuZ2V0QWJzdHJhY3QoKSA6IGZhbHNlOwotICAgICAgICBib29sZWFuIGZpbmFsRXh0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZmluYWxSZXN0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZmluYWxMaXN0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZmluYWxVbmlvbiA9IGZhbHNlOwotCi0gICAgICAgIE9iamVjdCBkcyA9IG51bGw7Ci0gICAgICAgIGlmIChwYXJzZUN0LmlzU2V0RmluYWwoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZHMgPSBwYXJzZUN0LmdldEZpbmFsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSW5zcGVjdCB0aGUgZmluYWwgZGVmYXVsdCBhdHRyaWJ1dGUgb24gdGhlIHNjaGVtYQotICAgICAgICBlbHNlIGlmIChzY2hlbWEgIT0gbnVsbCAmJiBzY2hlbWEuaXNTZXRGaW5hbERlZmF1bHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZHMgPSBzY2hlbWEuZ2V0RmluYWxEZWZhdWx0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZHMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRzIGluc3RhbmNlb2YgU3RyaW5nICYmIGRzLmVxdWFscygiI2FsbCIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vICNBTEwgdmFsdWUKLSAgICAgICAgICAgICAgICBmaW5hbEV4dCA9IGZpbmFsUmVzdCA9IGZpbmFsTGlzdCA9IGZpbmFsVW5pb24gPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZHMgaW5zdGFuY2VvZiBMaXN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgoKExpc3QpZHMpLmNvbnRhaW5zKCJleHRlbnNpb24iKSkKLSAgICAgICAgICAgICAgICAgICAgZmluYWxFeHQgPSB0cnVlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICgoKExpc3QpZHMpLmNvbnRhaW5zKCJyZXN0cmljdGlvbiIpKQotICAgICAgICAgICAgICAgICAgICBmaW5hbFJlc3QgPSB0cnVlOwotCi0vLyBTaW5jZSBjb21wbGV4IHR5cGVzIGRvbid0IHBhcnRpY2lwYXRlIGluIGxpc3QgYW5kIHVuaW9ucywgdGhlc2UgY2FuIHJlbWFpbgotLy8gZmFsc2UuICBQZXJoYXBzIHdlIHNob3VsZCB0aHJvdyBhbiBlcnJvci4KLQotLy8gICAgICAgICAgICAgICAgaWYgKCgoTGlzdClkcykuY29udGFpbnMoImxpc3QiKSkKLS8vICAgICAgICAgICAgICAgICAgICBmaW5hbExpc3QgPSB0cnVlOwotLy8gICAgICAgICAgICAgICAgCi0vLyAgICAgICAgICAgICAgICBpZiAoKChMaXN0KWRzKS5jb250YWlucygidW5pb24iKSkKLS8vICAgICAgICAgICAgICAgICAgICBmaW5hbFVuaW9uID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNJbXBsLnNldEFic3RyYWN0RmluYWwoYWJzLCBmaW5hbEV4dCwgZmluYWxSZXN0LCBmaW5hbExpc3QsIGZpbmFsVW5pb24pOwotCi0gICAgICAgIC8vIFNldCBibG9jayBmbGFncwotICAgICAgICBib29sZWFuIGJsb2NrRXh0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gYmxvY2tSZXN0ID0gZmFsc2U7Ci0gICAgICAgIE9iamVjdCBibG9jayA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHBhcnNlQ3QuaXNTZXRCbG9jaygpKQotICAgICAgICAgICAgYmxvY2sgPSBwYXJzZUN0LmdldEJsb2NrKCk7Ci0gICAgICAgIGVsc2UgaWYgKHNjaGVtYSAhPSBudWxsICYmIHNjaGVtYS5pc1NldEJsb2NrRGVmYXVsdCgpKQotICAgICAgICAgICAgYmxvY2sgPSBzY2hlbWEuZ2V0QmxvY2tEZWZhdWx0KCk7Ci0KLSAgICAgICAgaWYgKGJsb2NrICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChibG9jayBpbnN0YW5jZW9mIFN0cmluZyAmJiBibG9jay5lcXVhbHMoIiNhbGwiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyAjQUxMIHZhbHVlCi0gICAgICAgICAgICAgICAgYmxvY2tFeHQgPSBibG9ja1Jlc3QgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYmxvY2sgaW5zdGFuY2VvZiBMaXN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgoKExpc3QpYmxvY2spLmNvbnRhaW5zKCJleHRlbnNpb24iKSkKLSAgICAgICAgICAgICAgICAgICAgYmxvY2tFeHQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmICgoKExpc3QpYmxvY2spLmNvbnRhaW5zKCJyZXN0cmljdGlvbiIpKQotICAgICAgICAgICAgICAgICAgICBibG9ja1Jlc3QgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc0ltcGwuc2V0QmxvY2soYmxvY2tFeHQsIGJsb2NrUmVzdCk7Ci0KLSAgICAgICAgLy8gVmVyaWZ5OiBoYXZlIHNpbXBsZUNvbnRlbnQsIGNvbXBsZXhDb250ZW50LCBvciBkaXJlY3Qgc3R1ZmYKLSAgICAgICAgQ29tcGxleENvbnRlbnREb2N1bWVudC5Db21wbGV4Q29udGVudCBwYXJzZUNjID0gcGFyc2VDdC5nZXRDb21wbGV4Q29udGVudCgpOwotICAgICAgICBTaW1wbGVDb250ZW50RG9jdW1lbnQuU2ltcGxlQ29udGVudCBwYXJzZVNjID0gcGFyc2VDdC5nZXRTaW1wbGVDb250ZW50KCk7Ci0gICAgICAgIEdyb3VwIHBhcnNlR3JvdXAgPSBnZXRDb250ZW50TW9kZWwocGFyc2VDdCk7Ci0gICAgICAgIGludCBjb3VudCA9Ci0gICAgICAgICAgICAgICAgKHBhcnNlQ2MgIT0gbnVsbCA/IDEgOiAwKSArCi0gICAgICAgICAgICAgICAgKHBhcnNlU2MgIT0gbnVsbCA/IDEgOiAwKSArCi0gICAgICAgICAgICAgICAgKHBhcnNlR3JvdXAgIT0gbnVsbCA/IDEgOiAwKTsKLSAgICAgICAgaWYgKGNvdW50ID4gMSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgY29tcGxleCB0eXBlIG11c3QgZGVmaW5lIGVpdGhlciBhIGNvbnRlbnQgbW9kZWwsICIgKwotICAgICAgICAgICAgICAgICAgICAgICJvciBhIHNpbXBsZUNvbnRlbnQgb3IgY29tcGxleENvbnRlbnQgZGVyaXZhdGlvbjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgIm1vcmUgdGhhbiBvbmUgZm91bmQuIiwKLSAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0LlJFRFVOREFOVF9DT05URU5UX01PREVMLCBwYXJzZUN0KTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiB0cmVhdCBpdCBhcyB0aGUgZmlyc3Qgb2YgY29tcGxleENvbnRlbnQsIHNpbXBsZUNvbnRlbnQsIG1vZGVsCi0gICAgICAgICAgICBwYXJzZUdyb3VwID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChwYXJzZUNjICE9IG51bGwgJiYgcGFyc2VTYyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHBhcnNlU2MgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAocGFyc2VDYyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocGFyc2VDYy5nZXRFeHRlbnNpb24oKSAhPSBudWxsICYmIHBhcnNlQ2MuZ2V0UmVzdHJpY3Rpb24oKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJSZXN0cmljdGlvbiBjb25mbGljdHMgd2l0aCBleHRlbnNpb24iLCBYbWxFcnJvckNvbnRleHQuUkVEVU5EQU5UX0NPTlRFTlRfTU9ERUwsIHBhcnNlQ2MuZ2V0UmVzdHJpY3Rpb24oKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIE1peGVkIGNhbiBiZSBzcGVjaWZpZWQgaW4gdHdvIHBsYWNlczogdGhlIHJ1bGVzIGFyZSB0aGF0IENjIHdpbnMgb3ZlciBDdCBpZiBwcmVzZW50Ci0gICAgICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jYy1tdmUKLSAgICAgICAgICAgIGJvb2xlYW4gbWl4ZWQgPSBwYXJzZUNjLmlzU2V0TWl4ZWQoKSA/IHBhcnNlQ2MuZ2V0TWl4ZWQoKSA6IHBhcnNlQ3QuZ2V0TWl4ZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHBhcnNlQ2MuZ2V0RXh0ZW5zaW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXNvbHZlQ2NFeHRlbnNpb24oc0ltcGwsIHBhcnNlQ2MuZ2V0RXh0ZW5zaW9uKCksIG1peGVkKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcnNlQ2MuZ2V0UmVzdHJpY3Rpb24oKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJlc29sdmVDY1Jlc3RyaWN0aW9uKHNJbXBsLCBwYXJzZUNjLmdldFJlc3RyaWN0aW9uKCksIG1peGVkKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTWlzc2luZyByZXN0cmljdGlvbiBvciBleHRlbnNpb24iLCBYbWxFcnJvckNvbnRleHQuTUlTU0lOR19SRVNUUklDVElPTl9PUl9FWFRFTlNJT04sIHBhcnNlQ2MpOwotICAgICAgICAgICAgICAgIHJlc29sdmVFcnJvclR5cGUoc0ltcGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcnNlU2MgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBhcnNlU2MuZ2V0RXh0ZW5zaW9uKCkgIT0gbnVsbCAmJiBwYXJzZVNjLmdldFJlc3RyaWN0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiUmVzdHJpY3Rpb24gY29uZmxpY3RzIHdpdGggZXh0ZW5zaW9uIiwgWG1sRXJyb3JDb250ZXh0LlJFRFVOREFOVF9DT05URU5UX01PREVMLCBwYXJzZVNjLmdldFJlc3RyaWN0aW9uKCkpOwotCi0gICAgICAgICAgICBpZiAocGFyc2VTYy5nZXRFeHRlbnNpb24oKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJlc29sdmVTY0V4dGVuc2lvbihzSW1wbCwgcGFyc2VTYy5nZXRFeHRlbnNpb24oKSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJzZVNjLmdldFJlc3RyaWN0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXNvbHZlU2NSZXN0cmljdGlvbihzSW1wbCwgcGFyc2VTYy5nZXRSZXN0cmljdGlvbigpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTWlzc2luZyByZXN0cmljdGlvbiBvciBleHRlbnNpb24iLCBYbWxFcnJvckNvbnRleHQuTUlTU0lOR19SRVNUUklDVElPTl9PUl9FWFRFTlNJT04sIHBhcnNlU2MpOwotICAgICAgICAgICAgICAgIHJlc29sdmVFcnJvclR5cGUoc0ltcGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlc29sdmVCYXNpY0NvbXBsZXhUeXBlKHNJbXBsKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCByZXNvbHZlRXJyb3JUeXBlKFNjaGVtYVR5cGVJbXBsIHNJbXBsKQotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgdHlwZSBvZiBlcnJvciByZWNvdmVyeSBub3QgeWV0IGltcGxlbWVudGVkLiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFNjaGVtYVR5cGUuUmVmW10gbWFrZVJlZkFycmF5KENvbGxlY3Rpb24gdHlwZUxpc3QpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlLlJlZltdIHJlc3VsdCA9IG5ldyBTY2hlbWFUeXBlLlJlZlt0eXBlTGlzdC5zaXplKCldOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHR5cGVMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBqKyspCi0gICAgICAgICAgICByZXN1bHRbal0gPSAoKFNjaGVtYVR5cGUpaS5uZXh0KCkpLmdldFJlZigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotCi0gICAgc3RhdGljIHZvaWQgcmVzb2x2ZUJhc2ljQ29tcGxleFR5cGUoU2NoZW1hVHlwZUltcGwgc0ltcGwpCi0gICAgewotICAgICAgICBMaXN0IGFub255bW91c1R5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBDb21wbGV4VHlwZSBwYXJzZVRyZWUgPSAoQ29tcGxleFR5cGUpc0ltcGwuZ2V0UGFyc2VPYmplY3QoKTsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHNJbXBsLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBib29sZWFuIGNoYW1lbGVvbiA9IChzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSAhPSBudWxsKTsKLSAgICAgICAgR3JvdXAgcGFyc2VHcm91cCA9IGdldENvbnRlbnRNb2RlbChwYXJzZVRyZWUpOwotCi0gICAgICAgIGlmIChzSW1wbC5pc1JlZGVmaW5pdGlvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkEgdHlwZSByZWRlZmluaXRpb24gbXVzdCBleHRlbmQgb3IgcmVzdHJpY3QgdGhlIG9yaWdpbmFsIGRlZmluaXRpb24gb2YgdGhlIHR5cGUuIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogb2ggd2VsbC4KLSAgICAgICAgfQotCi0gICAgICAgIGludCBwYXJ0aWNsZUNvZGUgPSB0cmFuc2xhdGVQYXJ0aWNsZUNvZGUocGFyc2VHcm91cCk7Ci0KLSAgICAgICAgLy8gdXNlZCB0byBlbnN1cmUgY29uc2lzdGVuY3kgKGRvZXNuJ3QgYmVjb21lIHBhcnQgb2YgdGhlIHJlc3VsdCkKLSAgICAgICAgTWFwIGVsZW1lbnRNb2RlbCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0KLSAgICAgICAgLy8gYnVpbGQgY29udGVudCBtb2RlbCBhbmQgYW5vbnltb3VzIHR5cGVzCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlIGNvbnRlbnRNb2RlbCA9IHRyYW5zbGF0ZUNvbnRlbnRNb2RlbChzSW1wbCwgcGFyc2VHcm91cCwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIHBhcnRpY2xlQ29kZSwgYW5vbnltb3VzVHlwZXMsIGVsZW1lbnRNb2RlbCwgZmFsc2UsIG51bGwpOwotCi0gICAgICAgIC8vIGRldGVjdCB0aGUgbm9uZW1wdHkgImFsbCIgY2FzZSAoZW1wdHkgPGFsbD4gZG9lc24ndCBjb3VudCAtIGl0IG5lZWRzIHRvIGJlIGVsaW1pbmF0ZWQgdG8gbWF0Y2ggWFNEIHRlc3QgY2FzZXMpCi0gICAgICAgIGJvb2xlYW4gaXNBbGwgPSBjb250ZW50TW9kZWwgIT0gbnVsbCAmJiBjb250ZW50TW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQUxMOwotICAgICAgICAKLSAgICAgICAgLy8gYnVpbGQgYXR0ciBtb2RlbCBhbmQgYW5vbnltb3VzIHR5cGVzCi0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCBhdHRyTW9kZWwgPSBuZXcgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKCk7Ci0gICAgICAgIHRyYW5zbGF0ZUF0dHJpYnV0ZU1vZGVsKHBhcnNlVHJlZSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGFub255bW91c1R5cGVzLCBzSW1wbCwgbnVsbCwgYXR0ck1vZGVsLCBudWxsLCB0cnVlLCBudWxsKTsKLQotICAgICAgICAvLyBzdW1tYXJpemUgd2lsZGNhcmQgaW5mb3JtYXRpb24KLSAgICAgICAgV2lsZGNhcmRSZXN1bHQgd2NFbHQgPSBzdW1tYXJpemVFbHRXaWxkY2FyZHMoY29udGVudE1vZGVsKTsKLSAgICAgICAgV2lsZGNhcmRSZXN1bHQgd2NBdHRyID0gc3VtbWFyaXplQXR0cldpbGRjYXJkcyhhdHRyTW9kZWwpOwotCi0gICAgICAgIC8vIGJ1aWxkIHN0YXRlIG1hY2hpbmUgYW5kIHZlcmlmeSB0aGF0IGNvbnRlbnQgbW9kZWwgaXMgZGV0ZXJtaW5pc3RpYwotICAgICAgICBpZiAoY29udGVudE1vZGVsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1aWxkU3RhdGVNYWNoaW5lKGNvbnRlbnRNb2RlbCk7Ci0gICAgICAgICAgICBpZiAoIVN0c2NTdGF0ZS5nZXQoKS5ub1VwYSgpICYmICEoKFNjaGVtYVBhcnRpY2xlSW1wbCljb250ZW50TW9kZWwpLmlzRGV0ZXJtaW5pc3RpYygpKQotICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQ29udGVudCBtb2RlbCB2aW9sYXRlcyB0aGUgdW5pcXVlIHBhcnRpY2xlIGF0dHJpYnV0aW9uIHJ1bGUiLCBYbWxFcnJvckNvbnRleHQuTk9OREVURVJNSU5JU1RJQ19NT0RFTCwgcGFyc2VHcm91cCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBidWlsZCBwcm9wZXJ0eSBtb2RlbAotICAgICAgICAvLyBlbWl0REJHKCJCdWlsZGluZyBjb250ZW50IE1vZGVsIGZvciAiICsgc0ltcGwpOwotICAgICAgICBNYXAgZWxlbWVudFByb3BlcnR5TW9kZWwgPSBidWlsZENvbnRlbnRQcm9wZXJ0eU1vZGVsQnlRTmFtZShjb250ZW50TW9kZWwsIHNJbXBsKTsKLQotICAgICAgICAvLyBhZGQgYXR0cmlidXRlIHByb3BlcnR5IG1vZGVsCi0gICAgICAgIE1hcCBhdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsID0gYnVpbGRBdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsQnlRTmFtZShhdHRyTW9kZWwsIHNJbXBsKTsKLQotICAgICAgICAvLyBmaWd1cmUgb3V0IGNvbnRlbnQgdHlwZQotICAgICAgICBpbnQgY29tcGxleFZhcmlldHkgPQotICAgICAgICAgICAgcGFyc2VUcmVlLmdldE1peGVkKCkKLSAgICAgICAgICAgICAgICA/IFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVAotICAgICAgICAgICAgICAgIDogY29udGVudE1vZGVsID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgPyBTY2hlbWFUeXBlLkVNUFRZX0NPTlRFTlQKLSAgICAgICAgICAgICAgICAgICAgOiBTY2hlbWFUeXBlLkVMRU1FTlRfQ09OVEVOVDsKLQotICAgICAgICAvLyBub3cgZmlsbCBpbiB0aGUgYWN0dWFsIHNjaGVtYSB0eXBlIGltcGxlbWVudGF0aW9uCi0gICAgICAgIHNJbXBsLnNldEJhc2VUeXBlUmVmKEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9UWVBFLmdldFJlZigpKTsKLSAgICAgICAgc0ltcGwuc2V0QmFzZURlcHRoKEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9UWVBFLmdldEJhc2VEZXB0aCgpICsgMSk7Ci0gICAgICAgIHNJbXBsLnNldERlcml2YXRpb25UeXBlKFNjaGVtYVR5cGUuRFRfRVhURU5TSU9OKTsKLSAgICAgICAgc0ltcGwuc2V0Q29tcGxleFR5cGVWYXJpZXR5KGNvbXBsZXhWYXJpZXR5KTsKLSAgICAgICAgc0ltcGwuc2V0Q29udGVudE1vZGVsKGNvbnRlbnRNb2RlbCwgYXR0ck1vZGVsLCBlbGVtZW50UHJvcGVydHlNb2RlbCwgYXR0cmlidXRlUHJvcGVydHlNb2RlbCwgaXNBbGwpOwotICAgICAgICBzSW1wbC5zZXRBbm9ueW1vdXNUeXBlUmVmcyhtYWtlUmVmQXJyYXkoYW5vbnltb3VzVHlwZXMpKTsKLSAgICAgICAgc0ltcGwuc2V0V2lsZGNhcmRTdW1tYXJ5KHdjRWx0LnR5cGVkV2lsZGNhcmRzLCB3Y0VsdC5oYXNXaWxkY2FyZHMsIHdjQXR0ci50eXBlZFdpbGRjYXJkcywgd2NBdHRyLmhhc1dpbGRjYXJkcyk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgcmVzb2x2ZUNjUmVzdHJpY3Rpb24oU2NoZW1hVHlwZUltcGwgc0ltcGwsIENvbXBsZXhSZXN0cmljdGlvblR5cGUgcGFyc2VUcmVlLCBib29sZWFuIG1peGVkKQotICAgIHsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gc0ltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGJvb2xlYW4gY2hhbWVsZW9uID0gKHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpICE9IG51bGwpOwotCi0gICAgICAgIC8vIEJVR0JVRzogTk9UIFlFVCBSRUFMTFkgSU1QTEVNRU5URUQKLSAgICAgICAgLy8gdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCB5ZXQgaW1wbGVtZW50ZWQuIik7Ci0KLSAgICAgICAgU2NoZW1hVHlwZSBiYXNlVHlwZTsKLSAgICAgICAgaWYgKHBhcnNlVHJlZS5nZXRCYXNlKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgY29tcGxleENvbnRlbnQgbXVzdCBkZWZpbmUgYSBiYXNlIHR5cGUiLCBYbWxFcnJvckNvbnRleHQuTUlTU0lOR19CQVNFLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgYmFzZVR5cGUgPSBudWxsOyAvLyByZWNvdmVyeTogbm8gaW5oZXJpdGFuY2UuCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc0ltcGwuaXNSZWRlZmluaXRpb24oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiYXNlVHlwZSA9IHN0YXRlLmZpbmRSZWRlZmluZWRHbG9iYWxUeXBlKHBhcnNlVHJlZS5nZXRCYXNlKCksIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpLCBzSW1wbC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsICYmICFiYXNlVHlwZS5nZXROYW1lKCkuZXF1YWxzKHNJbXBsLmdldE5hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHR5cGUgcmVkZWZpbml0aW9uIG11c3QgZXh0ZW5kIHRoZSBvcmlnaW5hbCB0eXBlIGRlZmluaXRpb24iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiYXNlVHlwZSA9IHN0YXRlLmZpbmRHbG9iYWxUeXBlKHBhcnNlVHJlZS5nZXRCYXNlKCksIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGJhc2VUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihwYXJzZVRyZWUuZ2V0QmFzZSgpLCBYbWxFcnJvckNvbnRleHQuVFlQRV9OT1RfRk9VTkQsIHBhcnNlVHJlZS54Z2V0QmFzZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgYmFzZVR5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfVFlQRTsKLQotICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiBiYXNlVHlwZS5maW5hbFJlc3RyaWN0aW9uKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDYW5ub3QgcmVzdHJpY3QgYSBmaW5hbCB0eXBlIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9ERVJJVkVfRklOQUwsIHBhcnNlVHJlZS54Z2V0QmFzZSgpKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBqdXN0IGtlZXAgZ29pbmcKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlY3Vyc2lvbgotICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFTdHNjUmVzb2x2ZXIucmVzb2x2ZVR5cGUoKFNjaGVtYVR5cGVJbXBsKWJhc2VUeXBlKSkKLSAgICAgICAgICAgICAgICBiYXNlVHlwZSA9IG51bGw7IC8vIGNpcmN1bGFyIGRlcGVuZGVuY3k6IG5vIGluaGVyaXRhbmNlCi0gICAgICAgIH0KLQotICAgICAgICBMaXN0IGFub255bW91c1R5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBHcm91cCBwYXJzZUVnID0gZ2V0Q29udGVudE1vZGVsKHBhcnNlVHJlZSk7Ci0KLSAgICAgICAgLy8gZGV0ZWN0IHRoZSAiYWxsIiBjYXNlCi0gICAgICAgIGludCBwYXJ0aWNsZUNvZGUgPSB0cmFuc2xhdGVQYXJ0aWNsZUNvZGUocGFyc2VFZyk7Ci0KLSAgICAgICAgLy8gdXNlZCB0byBlbnN1cmUgY29uc2lzdGVuY3kgKGRvZXNuJ3QgYmVjb21lIHBhcnQgb2YgdGhlIHJlc3VsdCkKLSAgICAgICAgTWFwIGVsZW1lbnRNb2RlbCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0KLSAgICAgICAgLy8gYnVpbGQgY29udGVudCBtb2RlbCBhbmQgYW5vbnltb3VzIHR5cGVzCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlIGNvbnRlbnRNb2RlbCA9IHRyYW5zbGF0ZUNvbnRlbnRNb2RlbCgKLSAgICAgICAgICAgIHNJbXBsLCBwYXJzZUVnLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgcGFydGljbGVDb2RlLCBhbm9ueW1vdXNUeXBlcywgZWxlbWVudE1vZGVsLCBmYWxzZSwgbnVsbCk7Ci0KLSAgICAgICAgLy8gZGV0ZWN0IHRoZSBub25lbXB0eSAiYWxsIiBjYXNlIChlbXB0eSA8YWxsPiBkb2Vzbid0IGNvdW50IC0gaXQgbmVlZHMgdG8gYmUgZWxpbWluYXRlZCB0byBtYXRjaCBYU0QgdGVzdCBjYXNlcykKLSAgICAgICAgYm9vbGVhbiBpc0FsbCA9IGNvbnRlbnRNb2RlbCAhPSBudWxsICYmIGNvbnRlbnRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5BTEw7Ci0gICAgICAgIAotICAgICAgICAvLyBidWlsZCBhdHRyIG1vZGVsIGFuZCBhbm9ueW1vdXMgdHlwZXMKLSAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsIGF0dHJNb2RlbDsKLSAgICAgICAgaWYgKGJhc2VUeXBlID09IG51bGwpCi0gICAgICAgICAgICBhdHRyTW9kZWwgPSBuZXcgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGF0dHJNb2RlbCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwoYmFzZVR5cGUuZ2V0QXR0cmlidXRlTW9kZWwoKSk7Ci0gICAgICAgIHRyYW5zbGF0ZUF0dHJpYnV0ZU1vZGVsKHBhcnNlVHJlZSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGFub255bW91c1R5cGVzLCBzSW1wbCwgbnVsbCwgYXR0ck1vZGVsLCBiYXNlVHlwZSwgZmFsc2UsIG51bGwpOwotCi0gICAgICAgIC8vIHN1bW1hcml6ZSB3aWxkY2FyZCBpbmZvcm1hdGlvbgotICAgICAgICBXaWxkY2FyZFJlc3VsdCB3Y0VsdCA9IHN1bW1hcml6ZUVsdFdpbGRjYXJkcyhjb250ZW50TW9kZWwpOwotICAgICAgICBXaWxkY2FyZFJlc3VsdCB3Y0F0dHIgPSBzdW1tYXJpemVBdHRyV2lsZGNhcmRzKGF0dHJNb2RlbCk7Ci0KLSAgICAgICAgLy8gYnVpbGQgc3RhdGUgbWFjaGluZSBhbmQgdmVyaWZ5IHRoYXQgY29udGVudCBtb2RlbCBpcyBkZXRlcm1pbmlzdGljCi0gICAgICAgIGlmIChjb250ZW50TW9kZWwgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYnVpbGRTdGF0ZU1hY2hpbmUoY29udGVudE1vZGVsKTsKLSAgICAgICAgICAgIGlmICghU3RzY1N0YXRlLmdldCgpLm5vVXBhKCkgJiYgISgoU2NoZW1hUGFydGljbGVJbXBsKWNvbnRlbnRNb2RlbCkuaXNEZXRlcm1pbmlzdGljKCkpCi0gICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJDb250ZW50IG1vZGVsIHZpb2xhdGVzIHRoZSB1bmlxdWUgcGFydGljbGUgYXR0cmlidXRpb24gcnVsZSIsIFhtbEVycm9yQ29udGV4dC5OT05ERVRFUk1JTklTVElDX01PREVMLCBwYXJzZUVnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJ1aWxkIHByb3BlcnR5IG1vZGVsCi0gICAgICAgIC8vIGVtaXREQkcoIkJ1aWxkaW5nIGNvbnRlbnQgTW9kZWwgZm9yICIgKyBzSW1wbCk7Ci0gICAgICAgIE1hcCBlbGVtZW50UHJvcGVydHlNb2RlbCA9IGJ1aWxkQ29udGVudFByb3BlcnR5TW9kZWxCeVFOYW1lKGNvbnRlbnRNb2RlbCwgc0ltcGwpOwotCi0gICAgICAgIC8vIGFkZCBhdHRyaWJ1dGUgcHJvcGVydHkgbW9kZWwKLSAgICAgICAgTWFwIGF0dHJpYnV0ZVByb3BlcnR5TW9kZWwgPSBidWlsZEF0dHJpYnV0ZVByb3BlcnR5TW9kZWxCeVFOYW1lKGF0dHJNb2RlbCwgc0ltcGwpOwotCi0gICAgICAgIC8vIGNvbXB1dGUgZW1wdHkvZWxlbWVudC9taXhlZAotICAgICAgICBpbnQgY29tcGxleFZhcmlldHkgPSAoY29udGVudE1vZGVsID09IG51bGwgPyBTY2hlbWFUeXBlLkVNUFRZX0NPTlRFTlQgOgotICAgICAgICAgICAgKG1peGVkID8gU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UIDogU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQpKTsKLQotICAgICAgICAvLyBub3cgZmlsbCBpbiB0aGUgYWN0dWFsIHNjaGVtYSB0eXBlIGltcGxlbWVudGF0aW9uCi0gICAgICAgIHNJbXBsLnNldEJhc2VUeXBlUmVmKGJhc2VUeXBlLmdldFJlZigpKTsKLSAgICAgICAgc0ltcGwuc2V0QmFzZURlcHRoKCgoU2NoZW1hVHlwZUltcGwpYmFzZVR5cGUpLmdldEJhc2VEZXB0aCgpICsgMSk7Ci0gICAgICAgIHNJbXBsLnNldERlcml2YXRpb25UeXBlKFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT04pOwotICAgICAgICBzSW1wbC5zZXRDb21wbGV4VHlwZVZhcmlldHkoY29tcGxleFZhcmlldHkpOwotICAgICAgICBzSW1wbC5zZXRDb250ZW50TW9kZWwoY29udGVudE1vZGVsLCBhdHRyTW9kZWwsIGVsZW1lbnRQcm9wZXJ0eU1vZGVsLCBhdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsLCBpc0FsbCk7Ci0gICAgICAgIHNJbXBsLnNldEFub255bW91c1R5cGVSZWZzKG1ha2VSZWZBcnJheShhbm9ueW1vdXNUeXBlcykpOwotICAgICAgICBzSW1wbC5zZXRXaWxkY2FyZFN1bW1hcnkod2NFbHQudHlwZWRXaWxkY2FyZHMsIHdjRWx0Lmhhc1dpbGRjYXJkcywgd2NBdHRyLnR5cGVkV2lsZGNhcmRzLCB3Y0F0dHIuaGFzV2lsZGNhcmRzKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgTWFwIGV4dHJhY3RFbGVtZW50TW9kZWwoU2NoZW1hVHlwZSBzVHlwZSkKLSAgICB7Ci0gICAgICAgIE1hcCBlbGVtZW50TW9kZWwgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBpZiAoc1R5cGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlbXSBzUHJvcHMgPSBzVHlwZS5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNQcm9wcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc1Byb3BzW2ldLmlzQXR0cmlidXRlKCkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGVsZW1lbnRNb2RlbC5wdXQoc1Byb3BzW2ldLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQcm9wc1tpXS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbGVtZW50TW9kZWw7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgcmVzb2x2ZUNjRXh0ZW5zaW9uKFNjaGVtYVR5cGVJbXBsIHNJbXBsLCBFeHRlbnNpb25UeXBlIHBhcnNlVHJlZSwgYm9vbGVhbiBtaXhlZCkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUgYmFzZVR5cGU7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHNJbXBsLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBib29sZWFuIGNoYW1lbGVvbiA9IChzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSAhPSBudWxsKTsKLQotICAgICAgICBpZiAocGFyc2VUcmVlLmdldEJhc2UoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSBjb21wbGV4Q29udGVudCBtdXN0IGRlZmluZSBhIGJhc2UgdHlwZSIsIFhtbEVycm9yQ29udGV4dC5NSVNTSU5HX0JBU0UsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICBiYXNlVHlwZSA9IG51bGw7IC8vIHJlY292ZXJ5OiBubyBpbmhlcml0YW5jZS4KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzSW1wbC5pc1JlZGVmaW5pdGlvbigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJhc2VUeXBlID0gc3RhdGUuZmluZFJlZGVmaW5lZEdsb2JhbFR5cGUocGFyc2VUcmVlLmdldEJhc2UoKSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCksIHNJbXBsLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgIWJhc2VUeXBlLmdldE5hbWUoKS5lcXVhbHMoc0ltcGwuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgdHlwZSByZWRlZmluaXRpb24gbXVzdCBleHRlbmQgdGhlIG9yaWdpbmFsIHR5cGUgZGVmaW5pdGlvbiIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJhc2VUeXBlID0gc3RhdGUuZmluZEdsb2JhbFR5cGUocGFyc2VUcmVlLmdldEJhc2UoKSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJhc2VUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihwYXJzZVRyZWUuZ2V0QmFzZSgpLCBYbWxFcnJvckNvbnRleHQuVFlQRV9OT1RfRk9VTkQsIHBhcnNlVHJlZS54Z2V0QmFzZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlY3Vyc2lvbgotICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFTdHNjUmVzb2x2ZXIucmVzb2x2ZVR5cGUoKFNjaGVtYVR5cGVJbXBsKWJhc2VUeXBlKSkKLSAgICAgICAgICAgICAgICBiYXNlVHlwZSA9IG51bGw7IC8vIGNpcmN1bGFyIGRlcGVuZGVuY3k6IG5vIGluaGVyaXRhbmNlCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiAoYmFzZVR5cGUuaXNTaW1wbGVUeXBlKCkgfHwgYmFzZVR5cGUuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlRoZSBzcGVjaWZpZWQgYmFzZSB0eXBlIGlzIG5vdCBhIGNvbXBsZXggdHlwZSB3aXRoIGNvbXBsZXggY29udGVudC4iLCBYbWxFcnJvckNvbnRleHQuQ09NUExFWF9CQVNFX05PVF9DT01QTEVYLCBwYXJzZVRyZWUueGdldEJhc2UoKSk7Ci0gICAgICAgICAgICBiYXNlVHlwZSA9IG51bGw7IC8vIHJlY292ZXJ5OiBubyBpbmhlcml0YW5jZS4KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsICYmIGJhc2VUeXBlLmZpbmFsRXh0ZW5zaW9uKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDYW5ub3QgZXh0ZW5kIGEgZmluYWwgdHlwZSIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfREVSSVZFX0ZJTkFMLCBwYXJzZVRyZWUueGdldEJhc2UoKSk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeToganVzdCBrZWVwIGdvaW5nCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGdldCBiYXNlIGNvbnRlbnQgbW9kZWwKLSAgICAgICAgU2NoZW1hUGFydGljbGUgYmFzZUNvbnRlbnRNb2RlbCA9IChiYXNlVHlwZSA9PSBudWxsID8gbnVsbCA6IGJhc2VUeXBlLmdldENvbnRlbnRNb2RlbCgpKTsKLSAgICAgICAgLy8gVE9ETzogYXR0cmlidXRlIG1vZGVsIGFsc28KLQotICAgICAgICBMaXN0IGFub255bW91c1R5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBNYXAgYmFzZUVsZW1lbnRNb2RlbCA9IGV4dHJhY3RFbGVtZW50TW9kZWwoYmFzZVR5cGUpOwotICAgICAgICBHcm91cCBwYXJzZUVnID0gZ2V0Q29udGVudE1vZGVsKHBhcnNlVHJlZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBidWlsZCBleHRlbnNpb24gbW9kZWwKLSAgICAgICAgU2NoZW1hUGFydGljbGUgZXh0ZW5zaW9uTW9kZWwgPSB0cmFuc2xhdGVDb250ZW50TW9kZWwoCi0gICAgICAgICAgICAgICAgc0ltcGwsIHBhcnNlRWcsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCB0cmFuc2xhdGVQYXJ0aWNsZUNvZGUocGFyc2VFZyksCi0gICAgICAgICAgICAgICAgYW5vbnltb3VzVHlwZXMsIGJhc2VFbGVtZW50TW9kZWwsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGFwcGx5IHJ1bGUgIzIgbmVhciBodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jYy1tdmU6IGVtcHR5IGV4dCBtb2RlbCAtPiBtaXhlZCB0YWtlbiBmcm9tIGJhc2UKLSAgICAgICAgaWYgKGV4dGVuc2lvbk1vZGVsID09IG51bGwgJiYgIW1peGVkKQotICAgICAgICAgICAgbWl4ZWQgPSAoYmFzZVR5cGUuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQpOwotICAgICAgICAKLSAgICAgICAgLy8gYXBwbHkgRGVyaXZhdGlvbiBWYWxpZCAoRXh0ZW5zaW9uKSBydWxlIDEuNC4yLjIKLSAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgKGJhc2VUeXBlLmdldENvbnRlbnRUeXBlKCkgIT0gU2NoZW1hVHlwZS5FTVBUWV9DT05URU5UKSAmJgotICAgICAgICAgICAgICAgICgoYmFzZVR5cGUuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQpICE9IG1peGVkKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkNhbm5vdCBleHRlbmQgYW4gZWxlbWVudC1vbmx5IHR5cGUgd2l0aCBhIG1peGVkIHR5cGUgb3IgdmljZS12ZXJzYSIsIFhtbEVycm9yQ29udGV4dC5JTkNPTlNJU1RFTlRfVFlQRSwgcGFyc2VUcmVlLnhnZXRCYXNlKCkpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGp1c3Qga2VlcCBnb2luZwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGV0ZWN0IHRoZSAiYWxsIiBiYXNlIGNhc2UKLSAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgYmFzZVR5cGUuaGFzQWxsQ29udGVudCgpICYmIGV4dGVuc2lvbk1vZGVsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDYW5ub3QgZXh0ZW5kIGEgdHlwZSB3aXRoICdhbGwnIGNvbnRlbnQgbW9kZWwiLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0VYVEVORF9BTEwsIHBhcnNlVHJlZS54Z2V0QmFzZSgpKTsKLSAgICAgICAgICAgIGV4dGVuc2lvbk1vZGVsID0gbnVsbDsgLy8gcmVjb3Zlcnk6IGRyb3AgZXh0ZW5zaW9uCi0gICAgICAgIH0KLQotICAgICAgICAvLyBidWlsZCBjb250ZW50IG1vZGVsIGFuZCBhbm9ueW1vdXMgdHlwZXMKLSAgICAgICAgU2NoZW1hUGFydGljbGUgY29udGVudE1vZGVsID0gZXh0ZW5kQ29udGVudE1vZGVsKGJhc2VDb250ZW50TW9kZWwsIGV4dGVuc2lvbk1vZGVsLCBwYXJzZVRyZWUpOwotCi0gICAgICAgIC8vIGRldGVjdCB0aGUgbm9uZW1wdHkgImFsbCIgY2FzZSAoZW1wdHkgPGFsbD4gZG9lc24ndCBjb3VudCAtIGl0IG5lZWRzIHRvIGJlIGVsaW1pbmF0ZWQgdG8gbWF0Y2ggWFNEIHRlc3QgY2FzZXMpCi0gICAgICAgIGJvb2xlYW4gaXNBbGwgPSBjb250ZW50TW9kZWwgIT0gbnVsbCAmJiBjb250ZW50TW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQUxMOwotICAgICAgICAKLSAgICAgICAgLy8gYnVpbGQgYXR0ciBtb2RlbCBhbmQgYW5vbnltb3VzIHR5cGVzCi0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCBhdHRyTW9kZWw7Ci0gICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgYXR0ck1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdHRyTW9kZWwgPSBuZXcgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKGJhc2VUeXBlLmdldEF0dHJpYnV0ZU1vZGVsKCkpOwotICAgICAgICB0cmFuc2xhdGVBdHRyaWJ1dGVNb2RlbChwYXJzZVRyZWUsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBhbm9ueW1vdXNUeXBlcywgc0ltcGwsIG51bGwsIGF0dHJNb2RlbCwgYmFzZVR5cGUsIHRydWUsIG51bGwpOwotCi0gICAgICAgIC8vIHN1bW1hcml6ZSB3aWxkY2FyZCBpbmZvcm1hdGlvbgotICAgICAgICBXaWxkY2FyZFJlc3VsdCB3Y0VsdCA9IHN1bW1hcml6ZUVsdFdpbGRjYXJkcyhjb250ZW50TW9kZWwpOwotICAgICAgICBXaWxkY2FyZFJlc3VsdCB3Y0F0dHIgPSBzdW1tYXJpemVBdHRyV2lsZGNhcmRzKGF0dHJNb2RlbCk7Ci0KLSAgICAgICAgLy8gYnVpbGQgc3RhdGUgbWFjaGluZSBhbmQgdmVyaWZ5IHRoYXQgY29udGVudCBtb2RlbCBpcyBkZXRlcm1pbmlzdGljCi0gICAgICAgIGlmIChjb250ZW50TW9kZWwgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYnVpbGRTdGF0ZU1hY2hpbmUoY29udGVudE1vZGVsKTsKLSAgICAgICAgICAgIGlmICghU3RzY1N0YXRlLmdldCgpLm5vVXBhKCkgJiYgISgoU2NoZW1hUGFydGljbGVJbXBsKWNvbnRlbnRNb2RlbCkuaXNEZXRlcm1pbmlzdGljKCkpCi0gICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJDb250ZW50IG1vZGVsIHZpb2xhdGVzIHRoZSB1bmlxdWUgcGFydGljbGUgYXR0cmlidXRpb24gcnVsZSIsIFhtbEVycm9yQ29udGV4dC5OT05ERVRFUk1JTklTVElDX01PREVMLCBwYXJzZUVnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJ1aWxkIHByb3BlcnR5IG1vZGVsCi0gICAgICAgIC8vIGVtaXREQkcoIkJ1aWxkaW5nIGNvbnRlbnQgTW9kZWwgZm9yICIgKyBzSW1wbCk7Ci0gICAgICAgIE1hcCBlbGVtZW50UHJvcGVydHlNb2RlbCA9IGJ1aWxkQ29udGVudFByb3BlcnR5TW9kZWxCeVFOYW1lKGNvbnRlbnRNb2RlbCwgc0ltcGwpOwotCi0gICAgICAgIC8vIGFkZCBhdHRyaWJ1dGUgcHJvcGVydHkgbW9kZWwKLSAgICAgICAgTWFwIGF0dHJpYnV0ZVByb3BlcnR5TW9kZWwgPSBidWlsZEF0dHJpYnV0ZVByb3BlcnR5TW9kZWxCeVFOYW1lKGF0dHJNb2RlbCwgc0ltcGwpOwotCi0gICAgICAgIC8vIGNvbXB1dGUgZW1wdHkvZWxlbWVudC9taXhlZAotICAgICAgICBpbnQgY29tcGxleFZhcmlldHkgPSAgKCBtaXhlZCA/IFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVCA6Ci0gICAgICAgICAgICAoY29udGVudE1vZGVsID09IG51bGwgPyBTY2hlbWFUeXBlLkVNUFRZX0NPTlRFTlQgOiBTY2hlbWFUeXBlLkVMRU1FTlRfQ09OVEVOVCkpOwotCi0gICAgICAgIC8vIG5vdyBmaWxsIGluIHRoZSBhY3R1YWwgc2NoZW1hIHR5cGUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgaWYgKGJhc2VUeXBlID09IG51bGwpCi0gICAgICAgICAgICBiYXNlVHlwZSA9IFhtbE9iamVjdC50eXBlOwotICAgICAgICBzSW1wbC5zZXRCYXNlVHlwZVJlZihiYXNlVHlwZS5nZXRSZWYoKSk7Ci0gICAgICAgIHNJbXBsLnNldEJhc2VEZXB0aCgoKFNjaGVtYVR5cGVJbXBsKWJhc2VUeXBlKS5nZXRCYXNlRGVwdGgoKSArIDEpOwotICAgICAgICBzSW1wbC5zZXREZXJpdmF0aW9uVHlwZShTY2hlbWFUeXBlLkRUX0VYVEVOU0lPTik7Ci0gICAgICAgIHNJbXBsLnNldENvbXBsZXhUeXBlVmFyaWV0eShjb21wbGV4VmFyaWV0eSk7Ci0gICAgICAgIHNJbXBsLnNldENvbnRlbnRNb2RlbChjb250ZW50TW9kZWwsIGF0dHJNb2RlbCwgZWxlbWVudFByb3BlcnR5TW9kZWwsIGF0dHJpYnV0ZVByb3BlcnR5TW9kZWwsIGlzQWxsKTsKLSAgICAgICAgc0ltcGwuc2V0QW5vbnltb3VzVHlwZVJlZnMobWFrZVJlZkFycmF5KGFub255bW91c1R5cGVzKSk7Ci0gICAgICAgIHNJbXBsLnNldFdpbGRjYXJkU3VtbWFyeSh3Y0VsdC50eXBlZFdpbGRjYXJkcywgd2NFbHQuaGFzV2lsZGNhcmRzLCB3Y0F0dHIudHlwZWRXaWxkY2FyZHMsIHdjQXR0ci5oYXNXaWxkY2FyZHMpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHJlc29sdmVTY1Jlc3RyaWN0aW9uKFNjaGVtYVR5cGVJbXBsIHNJbXBsLCBTaW1wbGVSZXN0cmljdGlvblR5cGUgcGFyc2VUcmVlKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZSBiYXNlVHlwZTsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gc0ltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGJvb2xlYW4gY2hhbWVsZW9uID0gKHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpICE9IG51bGwpOwotICAgICAgICBpZiAocGFyc2VUcmVlLmdldFNpbXBsZVR5cGUoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS53YXJuaW5nKCJOZXN0ZWQgc2ltcGxlIHR5cGVzIGluc2lkZSBzaW1wbGUgY29udGVudCByZXN0cmljdGlvbnMgYXJlIHVuc3VwcG9ydGVkIC0gaWdub3JpbmciLCBYbWxFcnJvckNvbnRleHQuSUxMRUdBTF9SRVNUUklDVElPTiwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgdGhlIG5lc3RlZCBzaW1wbGUgdHlwZSBlbGVtZW50LgotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJzZVRyZWUuZ2V0QmFzZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHNpbXBsZUNvbnRlbnQgcmVzdHJpY3Rpb24gbXVzdCBkZWZpbmUgYSBiYXNlIHR5cGUiLCBYbWxFcnJvckNvbnRleHQuTUlTU0lOR19CQVNFLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGV4dGVuZHMgQU5ZX1NJTVBMRSB0eXBlCi0gICAgICAgICAgICBiYXNlVHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc0ltcGwuaXNSZWRlZmluaXRpb24oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiYXNlVHlwZSA9IHN0YXRlLmZpbmRSZWRlZmluZWRHbG9iYWxUeXBlKHBhcnNlVHJlZS5nZXRCYXNlKCksIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpLCBzSW1wbC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsICYmICFiYXNlVHlwZS5nZXROYW1lKCkuZXF1YWxzKHNJbXBsLmdldE5hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHR5cGUgcmVkZWZpbml0aW9uIG11c3QgcmVzdHJpY3QgdGhlIG9yaWdpbmFsIHR5cGUgZGVmaW5pdGlvbiIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJhc2VUeXBlID0gc3RhdGUuZmluZEdsb2JhbFR5cGUocGFyc2VUcmVlLmdldEJhc2UoKSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJhc2VUeXBlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihwYXJzZVRyZWUuZ2V0QmFzZSgpLCBYbWxFcnJvckNvbnRleHQuVFlQRV9OT1RfRk9VTkQsIHBhcnNlVHJlZS54Z2V0QmFzZSgpKTsKLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogZXh0ZW5kcyBBTllfU0lNUExFIHR5cGUKLSAgICAgICAgICAgICAgICBiYXNlVHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWN1cnNpb24KLSAgICAgICAgU3RzY1Jlc29sdmVyLnJlc29sdmVUeXBlKChTY2hlbWFUeXBlSW1wbCliYXNlVHlwZSk7Ci0KLSAgICAgICAgaWYgKGJhc2VUeXBlLmlzU2ltcGxlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiU2ltcGxlIHR5cGUgJyIgKyBiYXNlVHlwZS5nZXROYW1lKCkgKyAiJyBjYW5ub3QgYmUgdXNlZCBhcyB0aGUgYmFzZSB0eXBlIG9mIGEgc2ltcGxlIGNvbnRlbnQgcmVzdHJpY3Rpb24uIChVc2UgZXh0ZW5zaW9uIGluc3RlYWQuKSIsIFhtbEVycm9yQ29udGV4dC5TSU1QTEVfQkFTRV9OT1RfU0lNUExFLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGV4dGVuZHMgQU5ZX1NJTVBMRSB0eXBlCi0gICAgICAgICAgICBiYXNlVHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQlVHQlVHOiBjYW4gcmVzdHJpY3QgbWl4ZWQgY29udGVudCBhcyBsb25nIGFzIGFsbCBjaGlsZCBlbGVtZW50cyBhcmUgb3B0aW9uYWwKLSAgICAgICAgZWxzZSBpZiAoYmFzZVR5cGUuZ2V0Q29udGVudFR5cGUoKSAhPSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiVGhlIHNwZWNpZmllZCBiYXNlIHR5cGUgIiArIGJhc2VUeXBlLnRvU3RyaW5nKCkgKyAiIGRvZXMgbm90IGhhdmUgc2ltcGxlIGNvbnRlbnQuIiwgWG1sRXJyb3JDb250ZXh0LlNJTVBMRV9CQVNFX05PVF9TSU1QTEUsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogZXh0ZW5kcyBBTllfU0lNUExFIHR5cGUKLSAgICAgICAgICAgIGJhc2VUeXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsICYmIGJhc2VUeXBlLmZpbmFsUmVzdHJpY3Rpb24oKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkNhbm5vdCByZXN0cmljdCBhIGZpbmFsIHR5cGUiLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0RFUklWRV9GSU5BTCwgcGFyc2VUcmVlLnhnZXRCYXNlKCkpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGp1c3Qga2VlcCBnb2luZwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYnVpbGQgYXR0ciBtb2RlbCBhbmQgYW5vbnltb3VzIHR5cGVzCi0gICAgICAgIExpc3QgYW5vbnltb3VzVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCBhdHRyTW9kZWw7Ci0gICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgYXR0ck1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdHRyTW9kZWwgPSBuZXcgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKGJhc2VUeXBlLmdldEF0dHJpYnV0ZU1vZGVsKCkpOwotICAgICAgICB0cmFuc2xhdGVBdHRyaWJ1dGVNb2RlbChwYXJzZVRyZWUsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBhbm9ueW1vdXNUeXBlcywgc0ltcGwsIG51bGwsIGF0dHJNb2RlbCwgYmFzZVR5cGUsIGZhbHNlLCBudWxsKTsKLQotICAgICAgICAvLyBzdW1tYXJpemUgd2lsZGNhcmQgaW5mb3JtYXRpb24KLSAgICAgICAgV2lsZGNhcmRSZXN1bHQgd2NBdHRyID0gc3VtbWFyaXplQXR0cldpbGRjYXJkcyhhdHRyTW9kZWwpOwotCi0gICAgICAgIC8vIGFkZCBhdHRyaWJ1dGUgcHJvcGVydHkgbW9kZWwKLSAgICAgICAgTWFwIGF0dHJpYnV0ZVByb3BlcnR5TW9kZWwgPSBidWlsZEF0dHJpYnV0ZVByb3BlcnR5TW9kZWxCeVFOYW1lKGF0dHJNb2RlbCwgc0ltcGwpOwotCi0gICAgICAgIC8vIG5vdyBmaWxsIGluIHRoZSBhY3R1YWwgc2NoZW1hIHR5cGUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgc0ltcGwuc2V0QmFzZVR5cGVSZWYoYmFzZVR5cGUuZ2V0UmVmKCkpOwotICAgICAgICBzSW1wbC5zZXRCYXNlRGVwdGgoKChTY2hlbWFUeXBlSW1wbCliYXNlVHlwZSkuZ2V0QmFzZURlcHRoKCkgKyAxKTsKLSAgICAgICAgc0ltcGwuc2V0RGVyaXZhdGlvblR5cGUoU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTik7Ci0gICAgICAgIHNJbXBsLnNldEFub255bW91c1R5cGVSZWZzKG1ha2VSZWZBcnJheShhbm9ueW1vdXNUeXBlcykpOwotICAgICAgICBzSW1wbC5zZXRXaWxkY2FyZFN1bW1hcnkoUU5hbWVTZXQuRU1QVFksIGZhbHNlLCB3Y0F0dHIudHlwZWRXaWxkY2FyZHMsIHdjQXR0ci5oYXNXaWxkY2FyZHMpOwotICAgICAgICBzSW1wbC5zZXRDb21wbGV4VHlwZVZhcmlldHkoU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCk7Ci0gICAgICAgIHNJbXBsLnNldENvbnRlbnRNb2RlbChudWxsLCBhdHRyTW9kZWwsIG51bGwsIGF0dHJpYnV0ZVByb3BlcnR5TW9kZWwsIGZhbHNlKTsKLSAgICAgICAgc0ltcGwuc2V0U2ltcGxlVHlwZVZhcmlldHkoYmFzZVR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpKTsKLSAgICAgICAgc0ltcGwuc2V0UHJpbWl0aXZlVHlwZVJlZihiYXNlVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gbnVsbCA/IG51bGwgOiBiYXNlVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0UmVmKCkpOwotICAgICAgICBzd2l0Y2ggKHNJbXBsLmdldFNpbXBsZVZhcmlldHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0TGlzdEl0ZW1UeXBlUmVmKGJhc2VUeXBlLmdldExpc3RJdGVtVHlwZSgpLmdldFJlZigpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OOgotICAgICAgICAgICAgICAgIHNJbXBsLnNldFVuaW9uTWVtYmVyVHlwZVJlZnMobWFrZVJlZkFycmF5KEFycmF5cy5hc0xpc3QoYmFzZVR5cGUuZ2V0VW5pb25NZW1iZXJUeXBlcygpKSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGVhbCB3aXRoIGZhY2V0cwotICAgICAgICBTdHNjU2ltcGxlVHlwZVJlc29sdmVyLnJlc29sdmVGYWNldHMoc0ltcGwsIHBhcnNlVHJlZSwgKFNjaGVtYVR5cGVJbXBsKWJhc2VUeXBlKTsKLQotICAgICAgICAvLyBub3cgY29tcHV0ZSBvdXIgaW50cmluc2ljIHByb3BlcnRpZXMKLSAgICAgICAgU3RzY1NpbXBsZVR5cGVSZXNvbHZlci5yZXNvbHZlRnVuZGFtZW50YWxGYWNldHMoc0ltcGwpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHJlc29sdmVTY0V4dGVuc2lvbihTY2hlbWFUeXBlSW1wbCBzSW1wbCwgU2ltcGxlRXh0ZW5zaW9uVHlwZSBwYXJzZVRyZWUpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlIGJhc2VUeXBlOwotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBzSW1wbC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgYm9vbGVhbiBjaGFtZWxlb24gPSAoc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkgIT0gbnVsbCk7Ci0gICAgICAgIGlmIChwYXJzZVRyZWUuZ2V0QmFzZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHNpbXBsZUNvbnRlbnQgZXh0ZW5zaW9uIG11c3QgZGVmaW5lIGEgYmFzZSB0eXBlIiwgWG1sRXJyb3JDb250ZXh0Lk1JU1NJTkdfQkFTRSwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBleHRlbmRzIEFOWV9TSU1QTEUgdHlwZQotICAgICAgICAgICAgYmFzZVR5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNJbXBsLmlzUmVkZWZpbml0aW9uKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBzdGF0ZS5maW5kUmVkZWZpbmVkR2xvYmFsVHlwZShwYXJzZVRyZWUuZ2V0QmFzZSgpLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSwgc0ltcGwuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiAhYmFzZVR5cGUuZ2V0TmFtZSgpLmVxdWFscyhzSW1wbC5nZXROYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSB0eXBlIHJlZGVmaW5pdGlvbiBtdXN0IGV4dGVuZCB0aGUgb3JpZ2luYWwgdHlwZSBkZWZpbml0aW9uIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBzdGF0ZS5maW5kR2xvYmFsVHlwZShwYXJzZVRyZWUuZ2V0QmFzZSgpLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYmFzZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5ub3RGb3VuZEVycm9yKHBhcnNlVHJlZS5nZXRCYXNlKCksIFhtbEVycm9yQ29udGV4dC5UWVBFX05PVF9GT1VORCwgcGFyc2VUcmVlLnhnZXRCYXNlKCkpOwotICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBleHRlbmRzIEFOWV9TSU1QTEUgdHlwZQotICAgICAgICAgICAgICAgIGJhc2VUeXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlY3Vyc2lvbgotICAgICAgICBTdHNjUmVzb2x2ZXIucmVzb2x2ZVR5cGUoKFNjaGVtYVR5cGVJbXBsKWJhc2VUeXBlKTsKLQotICAgICAgICBpZiAoIWJhc2VUeXBlLmlzU2ltcGxlVHlwZSgpICYmIGJhc2VUeXBlLmdldENvbnRlbnRUeXBlKCkgIT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlRoZSBzcGVjaWZpZWQgYmFzZSB0eXBlICIgKyBiYXNlVHlwZS50b1N0cmluZygpICsgIiBkb2VzIG5vdCBoYXZlIHNpbXBsZSBjb250ZW50LiIsIFhtbEVycm9yQ29udGV4dC5TSU1QTEVfQkFTRV9OT1RfU0lNUExFLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGV4dGVuZHMgQU5ZX1NJTVBMRSB0eXBlCi0gICAgICAgICAgICBiYXNlVHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiBiYXNlVHlwZS5maW5hbEV4dGVuc2lvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ2Fubm90IGV4dGVuZCBhIGZpbmFsIHR5cGUiLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0RFUklWRV9GSU5BTCwgcGFyc2VUcmVlLnhnZXRCYXNlKCkpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGp1c3Qga2VlcCBnb2luZwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYnVpbGQgYXR0ciBtb2RlbCBhbmQgYW5vbnltb3VzIHR5cGVzCi0gICAgICAgIExpc3QgYW5vbnltb3VzVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCBhdHRyTW9kZWw7Ci0gICAgICAgIGF0dHJNb2RlbCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwoYmFzZVR5cGUuZ2V0QXR0cmlidXRlTW9kZWwoKSk7Ci0gICAgICAgIHRyYW5zbGF0ZUF0dHJpYnV0ZU1vZGVsKHBhcnNlVHJlZSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGFub255bW91c1R5cGVzLCBzSW1wbCwgbnVsbCwgYXR0ck1vZGVsLCBiYXNlVHlwZSwgdHJ1ZSwgbnVsbCk7Ci0KLSAgICAgICAgLy8gc3VtbWFyaXplIHdpbGRjYXJkIGluZm9ybWF0aW9uCi0gICAgICAgIFdpbGRjYXJkUmVzdWx0IHdjQXR0ciA9IHN1bW1hcml6ZUF0dHJXaWxkY2FyZHMoYXR0ck1vZGVsKTsKLQotICAgICAgICAvLyBhZGQgYXR0cmlidXRlIHByb3BlcnR5IG1vZGVsCi0gICAgICAgIE1hcCBhdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsID0gYnVpbGRBdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsQnlRTmFtZShhdHRyTW9kZWwsIHNJbXBsKTsKLQotICAgICAgICAvLyBub3cgZmlsbCBpbiB0aGUgYWN0dWFsIHNjaGVtYSB0eXBlIGltcGxlbWVudGF0aW9uCi0gICAgICAgIHNJbXBsLnNldEJhc2VUeXBlUmVmKGJhc2VUeXBlLmdldFJlZigpKTsKLSAgICAgICAgc0ltcGwuc2V0QmFzZURlcHRoKCgoU2NoZW1hVHlwZUltcGwpYmFzZVR5cGUpLmdldEJhc2VEZXB0aCgpICsgMSk7Ci0gICAgICAgIHNJbXBsLnNldERlcml2YXRpb25UeXBlKFNjaGVtYVR5cGUuRFRfRVhURU5TSU9OKTsKLSAgICAgICAgc0ltcGwuc2V0QW5vbnltb3VzVHlwZVJlZnMobWFrZVJlZkFycmF5KGFub255bW91c1R5cGVzKSk7Ci0gICAgICAgIHNJbXBsLnNldFdpbGRjYXJkU3VtbWFyeShRTmFtZVNldC5FTVBUWSwgZmFsc2UsIHdjQXR0ci50eXBlZFdpbGRjYXJkcywgd2NBdHRyLmhhc1dpbGRjYXJkcyk7Ci0gICAgICAgIHNJbXBsLnNldENvbXBsZXhUeXBlVmFyaWV0eShTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UKTsKLSAgICAgICAgc0ltcGwuc2V0Q29udGVudE1vZGVsKG51bGwsIGF0dHJNb2RlbCwgbnVsbCwgYXR0cmlidXRlUHJvcGVydHlNb2RlbCwgZmFsc2UpOwotICAgICAgICBzSW1wbC5zZXRTaW1wbGVUeXBlVmFyaWV0eShiYXNlVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkpOwotICAgICAgICBzSW1wbC5zZXRQcmltaXRpdmVUeXBlUmVmKGJhc2VUeXBlLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBudWxsID8gbnVsbCA6IGJhc2VUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRSZWYoKSk7Ci0gICAgICAgIHN3aXRjaCAoc0ltcGwuZ2V0U2ltcGxlVmFyaWV0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTElTVDoKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRMaXN0SXRlbVR5cGVSZWYoYmFzZVR5cGUuZ2V0TGlzdEl0ZW1UeXBlKCkuZ2V0UmVmKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0VW5pb25NZW1iZXJUeXBlUmVmcyhtYWtlUmVmQXJyYXkoQXJyYXlzLmFzTGlzdChiYXNlVHlwZS5nZXRVbmlvbk1lbWJlclR5cGVzKCkpKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkZWFsIHdpdGggZmFjZXRzCi0gICAgICAgIFN0c2NTaW1wbGVUeXBlUmVzb2x2ZXIucmVzb2x2ZUZhY2V0cyhzSW1wbCwgbnVsbCwgKFNjaGVtYVR5cGVJbXBsKWJhc2VUeXBlKTsKLQotICAgICAgICAvLyBub3cgY29tcHV0ZSBvdXIgaW50cmluc2ljIHByb3BlcnRpZXMKLSAgICAgICAgU3RzY1NpbXBsZVR5cGVSZXNvbHZlci5yZXNvbHZlRnVuZGFtZW50YWxGYWNldHMoc0ltcGwpOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBXaWxkY2FyZFJlc3VsdAotICAgIHsKLSAgICAgICAgV2lsZGNhcmRSZXN1bHQoUU5hbWVTZXQgdHlwZWRXaWxkY2FyZHMsIGJvb2xlYW4gaGFzV2lsZGNhcmRzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnR5cGVkV2lsZGNhcmRzID0gdHlwZWRXaWxkY2FyZHM7Ci0gICAgICAgICAgICB0aGlzLmhhc1dpbGRjYXJkcyA9IGhhc1dpbGRjYXJkczsKLSAgICAgICAgfQotICAgICAgICBRTmFtZVNldCB0eXBlZFdpbGRjYXJkczsKLSAgICAgICAgYm9vbGVhbiBoYXNXaWxkY2FyZHM7Ci0gICAgfQotCi0gICAgc3RhdGljIFdpbGRjYXJkUmVzdWx0IHN1bW1hcml6ZUF0dHJXaWxkY2FyZHMoU2NoZW1hQXR0cmlidXRlTW9kZWwgYXR0ck1vZGVsKQotICAgIHsKLSAgICAgICAgaWYgKGF0dHJNb2RlbC5nZXRXaWxkY2FyZFByb2Nlc3MoKSA9PSBTY2hlbWFBdHRyaWJ1dGVNb2RlbC5OT05FKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBXaWxkY2FyZFJlc3VsdChRTmFtZVNldC5FTVBUWSwgZmFsc2UpOwotICAgICAgICBpZiAoYXR0ck1vZGVsLmdldFdpbGRjYXJkUHJvY2VzcygpID09IFNjaGVtYUF0dHJpYnV0ZU1vZGVsLlNLSVApCi0gICAgICAgICAgICByZXR1cm4gbmV3IFdpbGRjYXJkUmVzdWx0KFFOYW1lU2V0LkVNUFRZLCB0cnVlKTsKLSAgICAgICAgcmV0dXJuIG5ldyBXaWxkY2FyZFJlc3VsdChhdHRyTW9kZWwuZ2V0V2lsZGNhcmRTZXQoKSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgc3RhdGljIFdpbGRjYXJkUmVzdWx0IHN1bW1hcml6ZUVsdFdpbGRjYXJkcyhTY2hlbWFQYXJ0aWNsZSBjb250ZW50TW9kZWwpCi0gICAgewotICAgICAgICBpZiAoY29udGVudE1vZGVsID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgV2lsZGNhcmRSZXN1bHQoUU5hbWVTZXQuRU1QVFksIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoY29udGVudE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICBRTmFtZVNldEJ1aWxkZXIgc2V0ID0gbmV3IFFOYW1lU2V0QnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzV2lsZGNhcmRzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50TW9kZWwuY291bnRPZlBhcnRpY2xlQ2hpbGQoKTsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgV2lsZGNhcmRSZXN1bHQgaW5uZXIgPSBzdW1tYXJpemVFbHRXaWxkY2FyZHMoY29udGVudE1vZGVsLmdldFBhcnRpY2xlQ2hpbGQoaSkpOwotICAgICAgICAgICAgICAgICAgICBzZXQuYWRkQWxsKGlubmVyLnR5cGVkV2lsZGNhcmRzKTsKLSAgICAgICAgICAgICAgICAgICAgaGFzV2lsZGNhcmRzIHw9IGlubmVyLmhhc1dpbGRjYXJkczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXaWxkY2FyZFJlc3VsdChzZXQudG9RTmFtZVNldCgpLCBoYXNXaWxkY2FyZHMpOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdpbGRjYXJkUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICAoY29udGVudE1vZGVsLmdldFdpbGRjYXJkUHJvY2VzcygpID09IFNjaGVtYVBhcnRpY2xlLlNLSVApID8KLSAgICAgICAgICAgICAgICAgICAgUU5hbWVTZXQuRU1QVFkgOiBjb250ZW50TW9kZWwuZ2V0V2lsZGNhcmRTZXQoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGZhbGx0aHJvdWdoCi0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXaWxkY2FyZFJlc3VsdChRTmFtZVNldC5FTVBUWSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgdHJhbnNsYXRlQXR0cmlidXRlTW9kZWwoCi0gICAgICAgICAgICBYbWxPYmplY3QgcGFyc2VUcmVlLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbiwKLSAgICAgICAgICAgIExpc3QgYW5vbnltb3VzVHlwZXMsIFNjaGVtYVR5cGUgb3V0ZXJUeXBlLAotICAgICAgICAgICAgU2V0IHNlZW5BdHRyaWJ1dGVzLCBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwgcmVzdWx0LCBTY2hlbWFUeXBlIGJhc2VUeXBlLCBib29sZWFuIGV4dGVuc2lvbiwgUU5hbWUgcmVkZWZpbml0aW9uRm9yKQotICAgIHsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotICAgICAgICBpZiAoc2VlbkF0dHJpYnV0ZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHNlZW5BdHRyaWJ1dGVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgYm9vbGVhbiBzZWVuV2lsZGNhcmQgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBzZWVuUmVkZWZpbml0aW9uID0gZmFsc2U7Ci0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZU1vZGVsIGJhc2VNb2RlbCA9IG51bGw7Ci0gICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsKQotICAgICAgICAgICAgYmFzZU1vZGVsID0gYmFzZVR5cGUuZ2V0QXR0cmlidXRlTW9kZWwoKTsKLQotICAgICAgICBYbWxDdXJzb3IgY3VyID0gcGFyc2VUcmVlLm5ld0N1cnNvcigpOwotCi0gICAgICAgIGZvciAoYm9vbGVhbiBtb3JlID0gY3VyLnRvRmlyc3RDaGlsZCgpOyBtb3JlOyBtb3JlID0gY3VyLnRvTmV4dFNpYmxpbmcoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICh0cmFuc2xhdGVBdHRyaWJ1dGVDb2RlKGN1ci5nZXROYW1lKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgQVRUUklCVVRFX0NPREU6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgeHNkYXR0ciA9IChBdHRyaWJ1dGUpY3VyLmdldE9iamVjdCgpOwotCi0gICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlIHNBdHRyID0gU3RzY1RyYW5zbGF0b3IudHJhbnNsYXRlQXR0cmlidXRlKHhzZGF0dHIsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBhbm9ueW1vdXNUeXBlcywgb3V0ZXJUeXBlLCBiYXNlTW9kZWwsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc0F0dHIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZWVuQXR0cmlidXRlcy5jb250YWlucyhzQXR0ci5nZXROYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQXR0cmlidXRlIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGRlZmluZWQgIiwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9BVFRSSUJVVEVfTkFNRSwgeHNkYXR0ci54Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBpZ25vcmUgdGhlIGR1cGxpY2F0ZSBhdHRyCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzZWVuQXR0cmlidXRlcy5hZGQoc0F0dHIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChiYXNlTW9kZWwgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGUgYmFzZUF0dHIgPSBiYXNlTW9kZWwuZ2V0QXR0cmlidXRlKHNBdHRyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZUF0dHIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4dGVuc2lvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmFzZU1vZGVsLmdldFdpbGRjYXJkU2V0KCkuY29udGFpbnMoc0F0dHIuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHJlc3RyaWN0aW9uIGNhbm5vdCBpbnRyb2R1Y2UgYSBuZXcgYXR0cmlidXRlIHRoYXQgd291bGQgbm90IGJlIGFsbG93ZWQgaW4gdGhlIGJhc2UgdHlwZS4iLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0FUVFJJQlVURV9OQU1FLCB4c2RhdHRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzQXR0ci5nZXRVc2UoKSA9PSBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5QUk9ISUJJVEVEKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkFuIGV4dGVuc2lvbiBjYW5ub3QgcHJvaGliaXQgYW4gYXR0cmlidXRlIGZyb20gdGhlIGJhc2UgdHlwZTsgdXNlIHJlc3RyaWN0aW9uIGluc3RlYWQuIiwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9BVFRSSUJVVEVfTkFNRSwgeHNkYXR0ci54Z2V0VXNlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc0F0dHIuZ2V0VXNlKCkgIT0gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuUkVRVUlSRUQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYXNlQXR0ci5nZXRVc2UoKSA9PSBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5SRVFVSVJFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSByZXN0cmljdGlvbiBjYW5ub3QgbW9kaWZ5IGFuIGF0dHJpYnV0ZSB0aGF0IGlzIHJlcXVpcmVkIGluIHRoZSBiYXNlIHR5cGUgdG8gYmUgcHJvaGliaXRlZCBvciBvcHRpb25hbC4iLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0FUVFJJQlVURV9OQU1FLCB4c2RhdHRyLnhnZXRVc2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzQXR0ci5nZXRVc2UoKSA9PSBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5QUk9ISUJJVEVEKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZW1vdmVQcm9oaWJpdGVkQXR0cmlidXRlKHNBdHRyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoc0F0dHIuZ2V0VXNlKCkgIT0gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuUFJPSElCSVRFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBdHRyaWJ1dGUoc0F0dHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChzQXR0ci5nZXREZWZhdWx0VGV4dCgpICE9IG51bGwgJiYgIXNBdHRyLmlzRml4ZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNBdHRyLmdldFVzZSgpICE9IFNjaGVtYUxvY2FsQXR0cmlidXRlLk9QVElPTkFMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24gbXVzdCBiZSBvcHRpb25hbCBpbiBvcmRlciB0byBzcGVjaWZ5IGEgZGVmYXVsdCIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCB4c2RhdHRyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgQU5ZX0FUVFJJQlVURV9DT0RFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgV2lsZGNhcmQgeHNkd2MgPSAoV2lsZGNhcmQpY3VyLmdldE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VlbldpbGRjYXJkKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiT25seSBvbmUgYXR0cmlidXRlIHdpbGRjYXJkIGFsbG93ZWQiLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0FOWV9BVFRSSUJVVEUsIHhzZHdjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBpZ25vcmUgdGhlIGV4dHJhIHdpbGRjYXJkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VlbldpbGRjYXJkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlTGlzdCBuc0xpc3QgPSB4c2R3Yy54Z2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuc1RleHQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuc0xpc3QgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zVGV4dCA9ICIjI2FueSI7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zVGV4dCA9IG5zTGlzdC5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBRTmFtZVNldCB3Y3NldCA9IFFOYW1lU2V0LmZvcldpbGRjYXJkTmFtZXNwYWNlU3RyaW5nKG5zVGV4dCwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChiYXNlTW9kZWwgIT0gbnVsbCAmJiAhZXh0ZW5zaW9uKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZU1vZGVsLmdldFdpbGRjYXJkU2V0KCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSByZXN0cmljdGlvbiBjYW5ub3QgYWRkIGFueUF0dHJpYnV0ZSB3aGVuIHRoZSBiYXNlIHR5cGUgZG9lcyBub3QgaGF2ZSBhbnlBdHRyaWJ1dGUiLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0FOWV9BVFRSSUJVVEUsIHhzZHdjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gaWdub3JlIHRoZSBleHRyYSB3aWxkY2FyZAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWJhc2VNb2RlbC5nZXRXaWxkY2FyZFNldCgpLmNvbnRhaW5zQWxsKHdjc2V0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiVGhlIGFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9JyIgKyBuc1RleHQgKyAiJyBpcyBub3QgYSBzdWJzZXQgb2YgdGhlIGJhc2UgdHlwZSBhbnlBdHRyaWJ1dGUiLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0FOWV9BVFRSSUJVVEUsIHhzZHdjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gaWdub3JlIHRoZSByZXN0cmljdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpbnQgd2Nwcm9jZXNzID0gdHJhbnNsYXRlV2lsZGNhcmRQcm9jZXNzKHhzZHdjLnhnZXRQcm9jZXNzQ29udGVudHMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0V2lsZGNhcmRQcm9jZXNzKCkgPT0gU2NoZW1hQXR0cmlidXRlTW9kZWwuTk9ORSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldFdpbGRjYXJkU2V0KHdjc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRXaWxkY2FyZFByb2Nlc3Mod2Nwcm9jZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldFdpbGRjYXJkU2V0KHdjc2V0LnVuaW9uKHJlc3VsdC5nZXRXaWxkY2FyZFNldCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldFdpbGRjYXJkUHJvY2Vzcyh3Y3Byb2Nlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRXaWxkY2FyZFNldCh3Y3NldC5pbnRlcnNlY3QocmVzdWx0LmdldFdpbGRjYXJkU2V0KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIG9sZCBwcm9jZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgQVRUUklCVVRFX0dST1VQX0NPREU6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVHcm91cFJlZiB4c2RhZyA9IChBdHRyaWJ1dGVHcm91cFJlZiljdXIuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHJlZiA9IHhzZGFnLmdldFJlZigpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVmID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlIG11c3QgaGF2ZSBhIHJlZiBhdHRyaWJ1dGUiLCBYbWxFcnJvckNvbnRleHQuQVRUUklCVVRFX0dST1VQX01JU1NJTkdfUkVGLCB4c2RhZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgZ3JvdXA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWRlZmluaXRpb25Gb3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzdGF0ZS5maW5kUmVkZWZpbmVkQXR0cmlidXRlR3JvdXAocmVmLCBjaGFtZWxlb24gPyB0YXJnZXROYW1lc3BhY2UgOiBudWxsLCByZWRlZmluaXRpb25Gb3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwICE9IG51bGwgJiYgcmVkZWZpbml0aW9uRm9yLmVxdWFscyhncm91cC5nZXROYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWVuUmVkZWZpbml0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQW4gYXR0cmlidXRlIGdyb3VwIHJlZGVmaW5pdGlvbiBtdXN0IGluY2x1ZGUgYXQgbW9zdCBvbmUgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLiIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCB4c2RhZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlblJlZGVmaW5pdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IHN0YXRlLmZpbmRBdHRyaWJ1dGVHcm91cChyZWYsIGNoYW1lbGVvbiA/IHRhcmdldE5hbWVzcGFjZSA6IG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChncm91cCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5ub3RGb3VuZEVycm9yKHJlZiwgWG1sRXJyb3JDb250ZXh0LkFUVFJJQlVURV9HUk9VUF9OT1RfRk9VTkQsIHhzZGFnLnhnZXRSZWYoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuaXNQcm9jZXNzaW5nKGdyb3VwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkF0dHJpYnV0ZSBncm91cCAiICsgUU5hbWVIZWxwZXIucHJldHR5KGdyb3VwLmdldE5hbWUoKSkgKyAiIHJlZmVyZW5jZXMgaXRzZWxmIiwgWG1sRXJyb3JDb250ZXh0LkNZQ0xJQ19ERVBFTkRFTkNZLCBncm91cC5nZXRQYXJzZU9iamVjdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdWJUYXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChncm91cC5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdWJUYXJnZXROYW1lc3BhY2UgPSBncm91cC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW1lbGVvbiA9IGdyb3VwLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdGFydFByb2Nlc3NpbmcoZ3JvdXApOwotICAgICAgICAgICAgICAgICAgICBRTmFtZSBuZXN0ZWRSZWRlZmluaXRpb25Gb3IgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAuaXNSZWRlZmluaXRpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZGVmaW5pdGlvbkZvciA9IGdyb3VwLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlQXR0cmlidXRlTW9kZWwoZ3JvdXAuZ2V0UGFyc2VPYmplY3QoKSwgc3ViVGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGFub255bW91c1R5cGVzLCBvdXRlclR5cGUsIHNlZW5BdHRyaWJ1dGVzLCByZXN1bHQsIGJhc2VUeXBlLCBleHRlbnNpb24sIG5lc3RlZFJlZGVmaW5pdGlvbkZvcik7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLmZpbmlzaFByb2Nlc3NpbmcoZ3JvdXApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIHRoaW5ncyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgYXR0cmlidXRlIG1vZGVsLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBTY2hlbWFQYXJ0aWNsZSBleHRlbmRDb250ZW50TW9kZWwoU2NoZW1hUGFydGljbGUgYmFzZUNvbnRlbnRNb2RlbCwgU2NoZW1hUGFydGljbGUgZXh0ZW5kZWRDb250ZW50TW9kZWwsIFhtbE9iamVjdCBwYXJzZVRyZWUpCi0gICAgewotICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1jb21wbGV4Q29udGVudDo6ZXh0ZW5zaW9uCi0gICAgICAgIAotICAgICAgICAvLyAyLjEgSWYgdGhlILdleHBsaWNpdCBjb250ZW50tyBpcyBlbXB0eSwgdGhlbiB0aGUge2NvbnRlbnQgdHlwZX0gb2YgdGhlIHR5cGUgZGVmaW5pdGlvbiC3cmVzb2x2ZWS3IHRvIGJ5IHRoZSC3YWN0dWFsIHZhbHVltyBvZiB0aGUgYmFzZSBbYXR0cmlidXRlXSAKLSAgICAgICAgaWYgKGV4dGVuZGVkQ29udGVudE1vZGVsID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gYmFzZUNvbnRlbnRNb2RlbDsKLSAgICAgICAgCi0gICAgICAgIC8vIDIuMiBJZiB0aGUgdHlwZSBkZWZpbml0aW9uILdyZXNvbHZlZLcgdG8gYnkgdGhlILdhY3R1YWwgdmFsdWW3IG9mIHRoZSBiYXNlIFthdHRyaWJ1dGVdIGhhcyBhIHtjb250ZW50IHR5cGV9IG9mIGVtcHR5LCB0aGVuIGEgcGFpciBvZiBtaXhlZCBvciBlbGVtZW50T25seSAoZGV0ZXJtaW5lZCBhcyBwZXIgY2xhdXNlIDEuMi4xIGFib3ZlKSBhbmQgdGhlILdleHBsaWNpdCBjb250ZW50tyBpdHNlbGY7Ci0gICAgICAgIGlmIChiYXNlQ29udGVudE1vZGVsID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZXh0ZW5kZWRDb250ZW50TW9kZWw7Ci0gICAgICAgIAotICAgICAgICAvLyAyLjMgb3RoZXJ3aXNlIGEgcGFpciBvZiBtaXhlZCBvciBlbGVtZW50T25seSAoZGV0ZXJtaW5lZCBhcyBwZXIgY2xhdXNlIDEuMi4xIGFib3ZlKSBhbmQgYSBwYXJ0aWNsZSB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBhcyBmb2xsb3dzOiAgCi0gICAgICAgIFNjaGVtYVBhcnRpY2xlSW1wbCBzUGFydCA9IG5ldyBTY2hlbWFQYXJ0aWNsZUltcGwoKTsKLSAgICAgICAgc1BhcnQuc2V0UGFydGljbGVUeXBlKFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFKTsKLQotICAgICAgICBMaXN0IGFjY3VtdWxhdGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFkZE1pbnVzUG9pbnRsZXNzUGFydGljbGVzKGFjY3VtdWxhdGUsIGJhc2VDb250ZW50TW9kZWwsIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFKTsKLSAgICAgICAgYWRkTWludXNQb2ludGxlc3NQYXJ0aWNsZXMoYWNjdW11bGF0ZSwgZXh0ZW5kZWRDb250ZW50TW9kZWwsIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFKTsKLSAgICAgICAgc1BhcnQuc2V0TWluT2NjdXJzKEJpZ0ludGVnZXIuT05FKTsKLSAgICAgICAgc1BhcnQuc2V0TWF4T2NjdXJzKEJpZ0ludGVnZXIuT05FKTsKLSAgICAgICAgc1BhcnQuc2V0UGFydGljbGVDaGlsZHJlbigoU2NoZW1hUGFydGljbGVbXSkKLSAgICAgICAgICAgICAgICBhY2N1bXVsYXRlLnRvQXJyYXkobmV3IFNjaGVtYVBhcnRpY2xlW2FjY3VtdWxhdGUuc2l6ZSgpXSkpOwotCi0gICAgICAgIHJldHVybiBmaWx0ZXJQb2ludGxlc3NQYXJ0aWNsZXNBbmRWZXJpZnlBbGxQYXJ0aWNsZXMoc1BhcnQsIHBhcnNlVHJlZSk7Ci0gICAgfQotCi0gICAgc3RhdGljIEJpZ0ludGVnZXIgZXh0cmFjdE1pbk9jY3VycyhYbWxOb25OZWdhdGl2ZUludGVnZXIgbm5pKQotICAgIHsKLSAgICAgICAgaWYgKG5uaSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIEJpZ0ludGVnZXIuT05FOwotICAgICAgICBCaWdJbnRlZ2VyIHJlc3VsdCA9IG5uaS5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIEJpZ0ludGVnZXIuT05FOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHN0YXRpYyBCaWdJbnRlZ2VyIGV4dHJhY3RNYXhPY2N1cnMoQWxsTk5JIGFsbE5OSSkKLSAgICB7Ci0gICAgICAgIGlmIChhbGxOTkkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLk9ORTsKLQotICAgICAgICBpZiAoYWxsTk5JLmluc3RhbmNlVHlwZSgpLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSA9PSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMKQotICAgICAgICAgICAgcmV0dXJuICgoWG1sSW50ZWdlcilhbGxOTkkpLmdldEJpZ0ludGVnZXJWYWx1ZSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVkZWZpbml0aW9uRm9yR3JvdXAKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgUU5hbWUgZ3JvdXBOYW1lOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2VlblJlZGVmaW5pdGlvbiA9IGZhbHNlOwotCi0gICAgICAgIHB1YmxpYyBSZWRlZmluaXRpb25Gb3JHcm91cChRTmFtZSBncm91cE5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZ3JvdXBOYW1lID0gZ3JvdXBOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFFOYW1lIGdldEdyb3VwTmFtZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBncm91cE5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlZW5SZWRlZmluaXRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc2VlblJlZGVmaW5pdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNlZW5SZWRlZmluaXRpb24oYm9vbGVhbiBzZWVuUmVkZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnNlZW5SZWRlZmluaXRpb24gPSBzZWVuUmVkZWZpbml0aW9uOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFNjaGVtYVBhcnRpY2xlIHRyYW5zbGF0ZUNvbnRlbnRNb2RlbCgKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgb3V0ZXJUeXBlLAotICAgICAgICAgICAgWG1sT2JqZWN0IHBhcnNlVHJlZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgYm9vbGVhbiBjaGFtZWxlb24sCi0gICAgICAgICAgICBpbnQgcGFydGljbGVDb2RlLAotICAgICAgICAgICAgTGlzdCBhbm9ueW1vdXNUeXBlcywgTWFwIGVsZW1lbnRNb2RlbCwKLSAgICAgICAgICAgIGJvb2xlYW4gYWxsb3dFbHQsIFJlZGVmaW5pdGlvbkZvckdyb3VwIHJlZGVmaW5pdGlvbkZvcikKLSAgICB7Ci0gICAgICAgIGlmIChwYXJzZVRyZWUgPT0gbnVsbCB8fCBwYXJ0aWNsZUNvZGUgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLQotICAgICAgICAvLyBlbWl0REJHKCJUcmFuc2xhdGluZyBjb250ZW50IG1vZGVsIGZvciAiICsgb3V0ZXJUeXBlKTsKLSAgICAgICAgLy8gaW5kZW50REJHKCk7Ci0gICAgICAgIGFzc2VydChwYXJ0aWNsZUNvZGUgIT0gMCk7Ci0KLSAgICAgICAgYm9vbGVhbiBoYXNDaGlsZHJlbiA9IGZhbHNlOwotICAgICAgICBCaWdJbnRlZ2VyIG1pbk9jY3VyczsKLSAgICAgICAgQmlnSW50ZWdlciBtYXhPY2N1cnM7Ci0gICAgICAgIFNjaGVtYU1vZGVsR3JvdXBJbXBsIGdyb3VwID0gbnVsbDsKLQotICAgICAgICBTY2hlbWFQYXJ0aWNsZUltcGwgc1BhcnQ7Ci0KLSAgICAgICAgaWYgKHBhcnRpY2xlQ29kZSA9PSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWFsbG93RWx0KQotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJNdXN0IGJlIGEgc2VxdWVuY2UsIGNob2ljZSBvciBhbGwgaGVyZSIsIFhtbEVycm9yQ29udGV4dC5FWFBMSUNJVF9HUk9VUF9ORUVERUQsIHBhcnNlVHJlZSk7Ci0KLSAgICAgICAgICAgIC8vIFRPRE86IGRldGVjdCBzdWJzdGl0dXRpb24gZ3JvdXAgZm9yIHRoaXMgZWxlbWVudCBhbmQgY29uc3RydWN0IGEgY2hvaWNlCi0KLSAgICAgICAgICAgIExvY2FsRWxlbWVudCBwYXJzZUVsdCA9IChMb2NhbEVsZW1lbnQpcGFyc2VUcmVlOwotICAgICAgICAgICAgc1BhcnQgPSBTdHNjVHJhbnNsYXRvci50cmFuc2xhdGVFbGVtZW50KHBhcnNlRWx0LCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgYW5vbnltb3VzVHlwZXMsIG91dGVyVHlwZSk7Ci0gICAgICAgICAgICBpZiAoc1BhcnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIG1pbk9jY3VycyA9IGV4dHJhY3RNaW5PY2N1cnMocGFyc2VFbHQueGdldE1pbk9jY3VycygpKTsKLSAgICAgICAgICAgIG1heE9jY3VycyA9IGV4dHJhY3RNYXhPY2N1cnMocGFyc2VFbHQueGdldE1heE9jY3VycygpKTsKLQotICAgICAgICAgICAgU2NoZW1hVHlwZSBvbGRUeXBlID0gKFNjaGVtYVR5cGUpZWxlbWVudE1vZGVsLmdldChzUGFydC5nZXROYW1lKCkpOwotICAgICAgICAgICAgaWYgKG9sZFR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbGVtZW50TW9kZWwucHV0KHNQYXJ0LmdldE5hbWUoKSwgc1BhcnQuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFzUGFydC5nZXRUeXBlKCkuZXF1YWxzKG9sZFR5cGUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJUeXBlIG9mICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoc1BhcnQuZ2V0TmFtZSgpKSArICIgaXMgaW5jb25zaXN0ZW50IHdpdGggYW5vdGhlciBlbGVtZW50IHdpdGggdGhlIHNhbWUgbmFtZSBpbiB0aGlzIGNvbnRlbnQgbW9kZWwiLCBYbWxFcnJvckNvbnRleHQuSU5DT05TSVNURU5UX1RZUEUsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFydGljbGVDb2RlID09IFNjaGVtYVBhcnRpY2xlLldJTERDQVJEKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWFsbG93RWx0KQotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJNdXN0IGJlIGEgc2VxdWVuY2UsIGNob2ljZSBvciBhbGwgaGVyZSIsIFhtbEVycm9yQ29udGV4dC5FWFBMSUNJVF9HUk9VUF9ORUVERUQsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICBBbnkgcGFyc2VBbnkgPSAoQW55KXBhcnNlVHJlZTsKLSAgICAgICAgICAgIHNQYXJ0ID0gbmV3IFNjaGVtYVBhcnRpY2xlSW1wbCgpOwotICAgICAgICAgICAgc1BhcnQuc2V0UGFydGljbGVUeXBlKFNjaGVtYVBhcnRpY2xlLldJTERDQVJEKTsKLSAgICAgICAgICAgIFFOYW1lU2V0IHdjc2V0OwotICAgICAgICAgICAgTmFtZXNwYWNlTGlzdCBuc2xpc3QgPSBwYXJzZUFueS54Z2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBpZiAobnNsaXN0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgd2NzZXQgPSBRTmFtZVNldC5BTEw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgd2NzZXQgPSBRTmFtZVNldC5mb3JXaWxkY2FyZE5hbWVzcGFjZVN0cmluZyhuc2xpc3QuZ2V0U3RyaW5nVmFsdWUoKSwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgIHNQYXJ0LnNldFdpbGRjYXJkU2V0KHdjc2V0KTsKLSAgICAgICAgICAgIHNQYXJ0LnNldFdpbGRjYXJkUHJvY2Vzcyh0cmFuc2xhdGVXaWxkY2FyZFByb2Nlc3MocGFyc2VBbnkueGdldFByb2Nlc3NDb250ZW50cygpKSk7Ci0gICAgICAgICAgICBtaW5PY2N1cnMgPSBleHRyYWN0TWluT2NjdXJzKHBhcnNlQW55LnhnZXRNaW5PY2N1cnMoKSk7Ci0gICAgICAgICAgICBtYXhPY2N1cnMgPSBleHRyYWN0TWF4T2NjdXJzKHBhcnNlQW55LnhnZXRNYXhPY2N1cnMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBHcm91cCBwYXJzZUdyb3VwID0gKEdyb3VwKXBhcnNlVHJlZTsKLSAgICAgICAgICAgIHNQYXJ0ID0gbmV3IFNjaGVtYVBhcnRpY2xlSW1wbCgpOwotCi0gICAgICAgICAgICAvLyBncmFiIG1pbi9tYXhPY2N1cnMgYmVmb3JlIGRlcmVmZXJlbmNpZ24gZ3JvdXAgcmVmCi0gICAgICAgICAgICBtaW5PY2N1cnMgPSBleHRyYWN0TWluT2NjdXJzKHBhcnNlR3JvdXAueGdldE1pbk9jY3VycygpKTsKLSAgICAgICAgICAgIG1heE9jY3VycyA9IGV4dHJhY3RNYXhPY2N1cnMocGFyc2VHcm91cC54Z2V0TWF4T2NjdXJzKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocGFydGljbGVDb2RlID09IE1PREVMX0dST1VQX0NPREUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcmVmID0gcGFyc2VHcm91cC5nZXRSZWYoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVmID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiR3JvdXAgcmVmZXJlbmNlIG11c3QgaGF2ZSBhIHJlZiBhdHRyaWJ1dGUiLCBYbWxFcnJvckNvbnRleHQuR1JPVVBfTUlTU0lOR19SRUYsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVkZWZpbml0aW9uRm9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBncm91cCA9IHN0YXRlLmZpbmRSZWRlZmluZWRNb2RlbEdyb3VwKHJlZiwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCwgcmVkZWZpbml0aW9uRm9yLmdldEdyb3VwTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwICE9IG51bGwgJiYgZ3JvdXAuZ2V0TmFtZSgpLmVxdWFscyhyZWRlZmluaXRpb25Gb3IuZ2V0R3JvdXBOYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVkZWZpbml0aW9uRm9yLmlzU2VlblJlZGVmaW5pdGlvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJHcm91cCByZWRlZmluaXRpb24gbXVzdCByZWZlciB0byB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiBhdCBtb3N0IG9uY2UiLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQmlnSW50ZWdlci5PTkUuZXF1YWxzKG1heE9jY3VycykgfHwgIUJpZ0ludGVnZXIuT05FLmVxdWFscyhtaW5PY2N1cnMpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJXaGVuIHJlZmVyZW5jaW5nIHRoZSBvcmlnaW5hbCBncm91cCBkZWZpbml0aW9uIGluIGEgcmVkZWZpbml0aW9uLCBtYXhPY2N1cnMgYW5kIG1pbk9jY3VycyBtdXN0IGJlIDEiLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgcGFyc2VUcmVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZGVmaW5pdGlvbkZvci5zZXRTZWVuUmVkZWZpbml0aW9uKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGdyb3VwID0gc3RhdGUuZmluZE1vZGVsR3JvdXAocmVmLCBjaGFtZWxlb24gPyB0YXJnZXROYW1lc3BhY2UgOiBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGdyb3VwID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5ub3RGb3VuZEVycm9yKHJlZiwgWG1sRXJyb3JDb250ZXh0Lk1PREVMX0dST1VQX05PVF9GT1VORCwgKChHcm91cClwYXJzZVRyZWUpLnhnZXRSZWYoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUuaXNQcm9jZXNzaW5nKGdyb3VwKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJNb2RlbCBncm91cCAiICsgUU5hbWVIZWxwZXIucHJldHR5KGdyb3VwLmdldE5hbWUoKSkgKyAiIHJlZmVyZW5jZXMgaXRzZWxmIiwgWG1sRXJyb3JDb250ZXh0LkNZQ0xJQ19ERVBFTkRFTkNZLCBncm91cC5nZXRQYXJzZU9iamVjdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIG5vIGdvIHRvIHRoZSBjaGlsZC4KLSAgICAgICAgICAgICAgICBYbWxDdXJzb3IgY3VyID0gZ3JvdXAuZ2V0UGFyc2VPYmplY3QoKS5uZXdDdXJzb3IoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGJvb2xlYW4gbW9yZSA9IGN1ci50b0ZpcnN0Q2hpbGQoKTsgbW9yZTsgbW9yZSA9IGN1ci50b05leHRTaWJsaW5nKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwYXJ0aWNsZUNvZGUgPSB0cmFuc2xhdGVQYXJ0aWNsZUNvZGUoY3VyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0aWNsZUNvZGUgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VUcmVlID0gcGFyc2VHcm91cCA9IChHcm91cCljdXIuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocGFydGljbGVDb2RlID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTW9kZWwgZ3JvdXAgIiArIFFOYW1lSGVscGVyLnByZXR0eShncm91cC5nZXROYW1lKCkpICsgIiBpcyBlbXB0eSIsIFhtbEVycm9yQ29udGV4dC5FWFBMSUNJVF9HUk9VUF9ORUVERUQsIGdyb3VwLmdldFBhcnNlT2JqZWN0KCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnRpY2xlQ29kZSAhPSBTY2hlbWFQYXJ0aWNsZS5BTEwgJiYgcGFydGljbGVDb2RlICE9IFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFICYmIHBhcnRpY2xlQ29kZSAhPSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTW9kZWwgZ3JvdXAgIiArIFFOYW1lSGVscGVyLnByZXR0eShncm91cC5nZXROYW1lKCkpICsgIiBpcyBub3QgYSBzZXF1ZW5jZSwgYWxsLCBvciBjaG9pY2UiLCBYbWxFcnJvckNvbnRleHQuRVhQTElDSVRfR1JPVVBfTkVFREVELCBncm91cC5nZXRQYXJzZU9iamVjdCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld1RhcmdldE5hbWVzcGFjZSA9IGdyb3VwLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgIGlmIChuZXdUYXJnZXROYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gbmV3VGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzd2l0Y2ggKHBhcnRpY2xlQ29kZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgICAgICAgICBzUGFydC5zZXRQYXJ0aWNsZVR5cGUocGFydGljbGVDb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgaGFzQ2hpbGRyZW4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYXhPY2N1cnMgIT0gbnVsbCAmJiBtaW5PY2N1cnMuY29tcGFyZVRvKG1heE9jY3VycykgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigibWF4T2NjdXJzIG11c3Qgbm90IGJlIGxlc3MgdGhhbiBtaW5PY2N1cnMiLCBYbWxFcnJvckNvbnRleHQuTUlOX01BWF9PQ0NVUlMsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICBtYXhPY2N1cnMgPSBtaW5PY2N1cnM7IC8vIHJlbWVkeTogcGluIG1heCB1cCB0byBtaW4KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYXhPY2N1cnMgIT0gbnVsbCAmJiBtYXhPY2N1cnMuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBtYXhPY2N1cnMgPT0gbWluT2NjdXJzID09IDAsIHNhbWUgYXMgbm8gcGFydGljbGUgYXQgYWxsLgotICAgICAgICB9Ci0KLSAgICAgICAgc1BhcnQuc2V0TWluT2NjdXJzKG1pbk9jY3Vycyk7Ci0gICAgICAgIHNQYXJ0LnNldE1heE9jY3VycyhtYXhPY2N1cnMpOwotICAgICAgICAKLSAgICAgICAgaWYgKGdyb3VwICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLnN0YXJ0UHJvY2Vzc2luZyhncm91cCk7Ci0gICAgICAgICAgICByZWRlZmluaXRpb25Gb3IgPSBudWxsOwotICAgICAgICAgICAgaWYgKGdyb3VwLmlzUmVkZWZpbml0aW9uKCkpCi0gICAgICAgICAgICAgICAgcmVkZWZpbml0aW9uRm9yID0gbmV3IFJlZGVmaW5pdGlvbkZvckdyb3VwKGdyb3VwLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFzQ2hpbGRyZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEN1cnNvciBjdXIgPSBwYXJzZVRyZWUubmV3Q3Vyc29yKCk7Ci0gICAgICAgICAgICBMaXN0IGFjY3VtdWxhdGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGJvb2xlYW4gbW9yZSA9IGN1ci50b0ZpcnN0Q2hpbGQoKTsgbW9yZTsgbW9yZSA9IGN1ci50b05leHRTaWJsaW5nKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGNvZGUgPSB0cmFuc2xhdGVQYXJ0aWNsZUNvZGUoY3VyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgYWRkTWludXNQb2ludGxlc3NQYXJ0aWNsZXMoYWNjdW11bGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUNvbnRlbnRNb2RlbChvdXRlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ci5nZXRPYmplY3QoKSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub255bW91c1R5cGVzLCBlbGVtZW50TW9kZWwsIHRydWUsIHJlZGVmaW5pdGlvbkZvciksCi0gICAgICAgICAgICAgICAgICAgICAgICBzUGFydC5nZXRQYXJ0aWNsZVR5cGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzUGFydC5zZXRQYXJ0aWNsZUNoaWxkcmVuKChTY2hlbWFQYXJ0aWNsZVtdKQotICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlLnRvQXJyYXkobmV3IFNjaGVtYVBhcnRpY2xlW2FjY3VtdWxhdGUuc2l6ZSgpXSkpOwotICAgICAgICAgICAgY3VyLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLQotICAgICAgICBTY2hlbWFQYXJ0aWNsZSByZXN1bHQgPSBmaWx0ZXJQb2ludGxlc3NQYXJ0aWNsZXNBbmRWZXJpZnlBbGxQYXJ0aWNsZXMoc1BhcnQsIHBhcnNlVHJlZSk7Ci0KLSAgICAgICAgaWYgKGdyb3VwICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmZpbmlzaFByb2Nlc3NpbmcoZ3JvdXApOwotICAgICAgICB9Ci0gICAgICAgIC8vIG91dGRlbnREQkcoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIGludCB0cmFuc2xhdGVXaWxkY2FyZFByb2Nlc3MoQW55LlByb2Nlc3NDb250ZW50cyBwcm9jZXNzKQotICAgIHsKLSAgICAgICAgaWYgKHByb2Nlc3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBTY2hlbWFQYXJ0aWNsZS5TVFJJQ1Q7Ci0KLSAgICAgICAgU3RyaW5nIHByb2Nlc3NWYWx1ZSA9IHByb2Nlc3MuZ2V0U3RyaW5nVmFsdWUoKTsKLQotICAgICAgICBpZiAoImxheCIuZXF1YWxzKHByb2Nlc3NWYWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gU2NoZW1hUGFydGljbGUuTEFYOwotCi0gICAgICAgIGlmICgic2tpcCIuZXF1YWxzKHByb2Nlc3NWYWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gU2NoZW1hUGFydGljbGUuU0tJUDsKLQotICAgICAgICByZXR1cm4gU2NoZW1hUGFydGljbGUuU1RSSUNUOwotICAgIH0KLQotICAgIHN0YXRpYyBTY2hlbWFQYXJ0aWNsZSBmaWx0ZXJQb2ludGxlc3NQYXJ0aWNsZXNBbmRWZXJpZnlBbGxQYXJ0aWNsZXMoU2NoZW1hUGFydGljbGUgcGFydCwgWG1sT2JqZWN0IHBhcnNlVHJlZSkKLSAgICB7Ci0gICAgICAgIGlmIChwYXJ0LmdldE1heE9jY3VycygpICE9IG51bGwgJiYgcGFydC5nZXRNYXhPY2N1cnMoKS5zaWdudW0oKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgc3dpdGNoIChwYXJ0LmdldFBhcnRpY2xlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnQuZ2V0UGFydGljbGVDaGlsZHJlbigpLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAocGFydC5pc1NpbmdsZXRvbigpICYmIHBhcnQuY291bnRPZlBhcnRpY2xlQ2hpbGQoKSA9PSAxKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFydC5nZXRQYXJ0aWNsZUNoaWxkKDApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICBpZiAocGFydC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCkubGVuZ3RoID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgcGFydC5nZXRNaW5PY2N1cnMoKS5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAocGFydC5pc1NpbmdsZXRvbigpICYmIHBhcnQuY291bnRPZlBhcnRpY2xlQ2hpbGQoKSA9PSAxKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFydC5nZXRQYXJ0aWNsZUNoaWxkKDApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0OwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIGlzQWxsID0gcGFydC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5BTEw7Ci0gICAgICAgIAotICAgICAgICBpZiAoaXNBbGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNjb3MtYWxsLWxpbWl0ZWQKLSAgICAgICAgICAgIGlmIChwYXJ0LmdldE1heE9jY3VycygpID09IG51bGwgfHwgcGFydC5nZXRNYXhPY2N1cnMoKS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkFuIGFsbCBncm91cCBtdXN0IGhhdmUgbWF4T2NjdXJzIDw9IDEiLCBYbWxFcnJvckNvbnRleHQuQUxMX0NPTlRFTlRTLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnQuY291bnRPZlBhcnRpY2xlQ2hpbGQoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjaGlsZCA9IHBhcnQuZ2V0UGFydGljbGVDaGlsZChpKTsKLSAgICAgICAgICAgIGlmIChjaGlsZC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5BTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJBbiBhbGwgZ3JvdXAgaXMgb25seSBhbGxvd2VkIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGNvbnRlbnQgbW9kZWwiLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0VYVEVORF9BTEwsIHBhcnNlVHJlZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChpc0FsbCAmJiAoY2hpbGQuZ2V0UGFydGljbGVUeXBlKCkgIT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCB8fCBjaGlsZC5nZXRNYXhPY2N1cnMoKSA9PSBudWxsIHx8IGNoaWxkLmdldE1heE9jY3VycygpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPiAwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkFuIGFsbCBncm91cCBjYW4gY29udGFpbiBvbmx5IGVsZW1lbnQgcGFydGljbGVzIHdpdGggbWF4T2NjdXJzIDw9IDEiLCBYbWxFcnJvckNvbnRleHQuQUxMX0NPTlRFTlRTLCBwYXJzZVRyZWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcGFydDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBhZGRNaW51c1BvaW50bGVzc1BhcnRpY2xlcygKLSAgICAgICAgICAgIExpc3QgbGlzdCwgU2NoZW1hUGFydGljbGUgcGFydCwgaW50IHBhcmVudFBhcnRpY2xlVHlwZSkKLSAgICB7Ci0gICAgICAgIGlmIChwYXJ0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgc3dpdGNoIChwYXJ0LmdldFBhcnRpY2xlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgIGlmIChwYXJlbnRQYXJ0aWNsZVR5cGUgPT0gU2NoZW1hUGFydGljbGUuU0VRVUVOQ0UgJiYgcGFydC5pc1NpbmdsZXRvbigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZW1pdERCRygiZHJvcHBpbmcgcmVkdW5kYW50IHNlcXVlbmNlIik7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QocGFydC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVudFBhcnRpY2xlVHlwZSA9PSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0UgJiYgcGFydC5pc1NpbmdsZXRvbigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZW1pdERCRygiZHJvcHBpbmcgcmVkdW5kYW50IGNob2ljZSIpOwotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KHBhcnQuZ2V0UGFydGljbGVDaGlsZHJlbigpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGxpc3QuYWRkKHBhcnQpOwotICAgIH0KLQotICAgIHN0YXRpYyBNYXAgYnVpbGRBdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsQnlRTmFtZShTY2hlbWFBdHRyaWJ1dGVNb2RlbCBhdHRyTW9kZWwsIFNjaGVtYVR5cGUgb3duZXIpCi0gICAgewotICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGVbXSBhdHRydXNlcyA9IGF0dHJNb2RlbC5nZXRBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRydXNlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoYXR0cnVzZXNbaV0uZ2V0TmFtZSgpLCBidWlsZFVzZVByb3BlcnR5KGF0dHJ1c2VzW2ldLCBvd25lcikpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgc3RhdGljIE1hcCBidWlsZENvbnRlbnRQcm9wZXJ0eU1vZGVsQnlRTmFtZShTY2hlbWFQYXJ0aWNsZSBwYXJ0LCBTY2hlbWFUeXBlIG93bmVyKQotICAgIHsKLSAgICAgICAgaWYgKHBhcnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0KLSAgICAgICAgYm9vbGVhbiBhc1NlcXVlbmNlID0gZmFsc2U7Ci0gICAgICAgIE1hcCBtb2RlbCA9IG51bGw7Ci0KLSAgICAgICAgc3dpdGNoIChwYXJ0LmdldFBhcnRpY2xlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgYXNTZXF1ZW5jZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICBhc1NlcXVlbmNlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgbW9kZWwgPSBidWlsZEVsZW1lbnRQcm9wZXJ0eU1vZGVsKChTY2hlbWFMb2NhbEVsZW1lbnQpcGFydCwgb3duZXIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICBtb2RlbCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobW9kZWwgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gYnVpbGQgbW9kZWwgZm9yIGNoaWxkcmVuCi0gICAgICAgICAgICBtb2RlbCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGNoaWxkcmVuID0gcGFydC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gaW5kZW50REJHKCk7Ci0gICAgICAgICAgICAgICAgTWFwIGNoaWxkTW9kZWwgPSBidWlsZENvbnRlbnRQcm9wZXJ0eU1vZGVsQnlRTmFtZShjaGlsZHJlbltpXSwgb3duZXIpOwotICAgICAgICAgICAgICAgIC8vIG91dGRlbnREQkcoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSBjaGlsZE1vZGVsLnZhbHVlcygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBpUHJvcCA9IChTY2hlbWFQcm9wZXJ0eSlqLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlJbXBsIG9Qcm9wID0gKFNjaGVtYVByb3BlcnR5SW1wbCltb2RlbC5nZXQoaVByb3AuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9Qcm9wID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXNTZXF1ZW5jZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNjaGVtYVByb3BlcnR5SW1wbClpUHJvcCkuc2V0TWluT2NjdXJzKEJpZ0ludGVnZXIuWkVSTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5wdXQoaVByb3AuZ2V0TmFtZSgpLCBpUHJvcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBjb25zaXN0ZW5jeSB2ZXJpZmllZCBpbiBhbiBlYXJsaWVyIHN0ZXAKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KG9Qcm9wLmdldFR5cGUoKS5lcXVhbHMoaVByb3AuZ2V0VHlwZSgpKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVyZ2VQcm9wZXJ0aWVzKG9Qcm9wLCBpUHJvcCwgYXNTZXF1ZW5jZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmaW5hbGx5IGRlYWwgd2l0aCBtaW5PY2N1cnMsIG1heE9jY3VycyBvdmVyIHdob2xlIGdyb3VwCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1pbiA9IHBhcnQuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heCA9IHBhcnQuZ2V0TWF4T2NjdXJzKCk7Ci0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IG1vZGVsLnZhbHVlcygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hUHJvcGVydHkgb1Byb3AgPSAoU2NoZW1hUHJvcGVydHkpai5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgQmlnSW50ZWdlciBtaW5PY2N1cnMgPSBvUHJvcC5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIG1heE9jY3VycyA9IG9Qcm9wLmdldE1heE9jY3VycygpOwotCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzID0gbWluT2NjdXJzLm11bHRpcGx5KG1pbik7Ci0gICAgICAgICAgICAgICAgaWYgKG1heCAhPSBudWxsICYmIG1heC5lcXVhbHMoQmlnSW50ZWdlci5aRVJPKSkKLSAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzID0gQmlnSW50ZWdlci5aRVJPOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1heE9jY3VycyAhPSBudWxsICYmICFtYXhPY2N1cnMuZXF1YWxzKEJpZ0ludGVnZXIuWkVSTykpCi0gICAgICAgICAgICAgICAgICAgIG1heE9jY3VycyA9IG1heCA9PSBudWxsID8gbnVsbCA6IG1heE9jY3Vycy5tdWx0aXBseShtYXgpOwotCi0gICAgICAgICAgICAgICAgKChTY2hlbWFQcm9wZXJ0eUltcGwpb1Byb3ApLnNldE1pbk9jY3VycyhtaW5PY2N1cnMpOwotICAgICAgICAgICAgICAgICgoU2NoZW1hUHJvcGVydHlJbXBsKW9Qcm9wKS5zZXRNYXhPY2N1cnMobWF4T2NjdXJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgTWFwIGJ1aWxkRWxlbWVudFByb3BlcnR5TW9kZWwoU2NoZW1hTG9jYWxFbGVtZW50IGVwYXJ0LCBTY2hlbWFUeXBlIG93bmVyKQotICAgIHsKLSAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKDEpOwotCi0gICAgICAgIFNjaGVtYVByb3BlcnR5IHNQcm9wID0gYnVpbGRVc2VQcm9wZXJ0eShlcGFydCwgb3duZXIpOwotICAgICAgICByZXN1bHQucHV0KHNQcm9wLmdldE5hbWUoKSwgc1Byb3ApOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHN0YXRpYyBTY2hlbWFQcm9wZXJ0eSBidWlsZFVzZVByb3BlcnR5KFNjaGVtYUZpZWxkIHVzZSwgU2NoZW1hVHlwZSBvd25lcikKLSAgICB7Ci0gICAgICAgIFNjaGVtYVByb3BlcnR5SW1wbCBzUHJvcEltcGwgPSBuZXcgU2NoZW1hUHJvcGVydHlJbXBsKCk7Ci0gICAgICAgIHNQcm9wSW1wbC5zZXROYW1lKHVzZS5nZXROYW1lKCkpOwotICAgICAgICBzUHJvcEltcGwuc2V0Q29udGFpbmVyVHlwZVJlZihvd25lci5nZXRSZWYoKSk7Ci0gICAgICAgIHNQcm9wSW1wbC5zZXRUeXBlUmVmKHVzZS5nZXRUeXBlKCkuZ2V0UmVmKCkpOwotICAgICAgICBzUHJvcEltcGwuc2V0QXR0cmlidXRlKHVzZS5pc0F0dHJpYnV0ZSgpKTsKLSAgICAgICAgc1Byb3BJbXBsLnNldERlZmF1bHQodXNlLmlzRGVmYXVsdCgpID8gU2NoZW1hUHJvcGVydHkuQ09OU0lTVEVOVExZIDogU2NoZW1hUHJvcGVydHkuTkVWRVIpOwotICAgICAgICBzUHJvcEltcGwuc2V0Rml4ZWQodXNlLmlzRml4ZWQoKSA/IFNjaGVtYVByb3BlcnR5LkNPTlNJU1RFTlRMWSA6IFNjaGVtYVByb3BlcnR5Lk5FVkVSKTsKLSAgICAgICAgc1Byb3BJbXBsLnNldE5pbGxhYmxlKHVzZS5pc05pbGxhYmxlKCkgPyBTY2hlbWFQcm9wZXJ0eS5DT05TSVNURU5UTFkgOiBTY2hlbWFQcm9wZXJ0eS5ORVZFUik7Ci0gICAgICAgIHNQcm9wSW1wbC5zZXREZWZhdWx0VGV4dCh1c2UuZ2V0RGVmYXVsdFRleHQoKSk7Ci0gICAgICAgIHNQcm9wSW1wbC5zZXRNaW5PY2N1cnModXNlLmdldE1pbk9jY3VycygpKTsKLSAgICAgICAgc1Byb3BJbXBsLnNldE1heE9jY3Vycyh1c2UuZ2V0TWF4T2NjdXJzKCkpOwotCi0gICAgICAgIGlmICh1c2UgaW5zdGFuY2VvZiBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsIGVsdCA9IChTY2hlbWFMb2NhbEVsZW1lbnRJbXBsKXVzZTsKLSAgICAgICAgICAgIHNQcm9wSW1wbC5zZXRBY2NlcHRlZE5hbWVzKGVsdC5hY2NlcHRlZFN0YXJ0TmFtZXMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc1Byb3BJbXBsOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIG1lcmdlUHJvcGVydGllcyhTY2hlbWFQcm9wZXJ0eUltcGwgaW50bywgU2NoZW1hUHJvcGVydHkgZnJvbSwgYm9vbGVhbiBhc1NlcXVlbmNlKQotICAgIHsKLSAgICAgICAgLy8gbWlub2NjdXIsIG1heG9jY3VyCi0gICAgICAgIEJpZ0ludGVnZXIgbWluT2NjdXJzID0gaW50by5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgQmlnSW50ZWdlciBtYXhPY2N1cnMgPSBpbnRvLmdldE1heE9jY3VycygpOwotICAgICAgICBpZiAoYXNTZXF1ZW5jZSkKLSAgICAgICAgewotICAgICAgICAgICAgbWluT2NjdXJzID0gbWluT2NjdXJzLmFkZChmcm9tLmdldE1pbk9jY3VycygpKTsKLSAgICAgICAgICAgIGlmIChtYXhPY2N1cnMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBtYXhPY2N1cnMgPSAoZnJvbS5nZXRNYXhPY2N1cnMoKSA9PSBudWxsID8gbnVsbCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzLmFkZChmcm9tLmdldE1heE9jY3VycygpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW5PY2N1cnMgPSBtaW5PY2N1cnMubWluKGZyb20uZ2V0TWluT2NjdXJzKCkpOwotICAgICAgICAgICAgaWYgKG1heE9jY3VycyAhPSBudWxsKQotICAgICAgICAgICAgICAgIG1heE9jY3VycyA9IChmcm9tLmdldE1heE9jY3VycygpID09IG51bGwgPyBudWxsIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzLm1heChmcm9tLmdldE1heE9jY3VycygpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50by5zZXRNaW5PY2N1cnMobWluT2NjdXJzKTsKLSAgICAgICAgaW50by5zZXRNYXhPY2N1cnMobWF4T2NjdXJzKTsKLQotICAgICAgICAvLyBuaWxsYWJsZSwgZGVmYXVsdCwgZml4ZWQKLSAgICAgICAgaWYgKGZyb20uaGFzTmlsbGFibGUoKSAhPSBpbnRvLmhhc05pbGxhYmxlKCkpCi0gICAgICAgICAgICBpbnRvLnNldE5pbGxhYmxlKFNjaGVtYVByb3BlcnR5LlZBUklBQkxFKTsKLSAgICAgICAgaWYgKGZyb20uaGFzRGVmYXVsdCgpICE9IGludG8uaGFzRGVmYXVsdCgpKQotICAgICAgICAgICAgaW50by5zZXREZWZhdWx0KFNjaGVtYVByb3BlcnR5LlZBUklBQkxFKTsKLSAgICAgICAgaWYgKGZyb20uaGFzRml4ZWQoKSAhPSBpbnRvLmhhc0ZpeGVkKCkpCi0gICAgICAgICAgICBpbnRvLnNldEZpeGVkKFNjaGVtYVByb3BlcnR5LlZBUklBQkxFKTsKLQotICAgICAgICAvLyBkZWZhdWx0IHZhbHVlCi0gICAgICAgIGlmIChpbnRvLmdldERlZmF1bHRUZXh0KCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGZyb20uZ2V0RGVmYXVsdFRleHQoKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgIWludG8uZ2V0RGVmYXVsdFRleHQoKS5lcXVhbHMoZnJvbS5nZXREZWZhdWx0VGV4dCgpKSkKLSAgICAgICAgICAgICAgICBpbnRvLnNldERlZmF1bHRUZXh0KG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFNjaGVtYVBhcnRpY2xlW10gZW5zdXJlU3RhdGVNYWNoaW5lKFNjaGVtYVBhcnRpY2xlW10gY2hpbGRyZW4pCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWlsZFN0YXRlTWFjaGluZShjaGlsZHJlbltpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoaWxkcmVuOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGJ1aWxkU3RhdGVNYWNoaW5lKFNjaGVtYVBhcnRpY2xlIGNvbnRlbnRNb2RlbCkKLSAgICB7Ci0gICAgICAgIGlmIChjb250ZW50TW9kZWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBTY2hlbWFQYXJ0aWNsZUltcGwgcGFydEltcGwgPSAoU2NoZW1hUGFydGljbGVJbXBsKWNvbnRlbnRNb2RlbDsKLSAgICAgICAgaWYgKHBhcnRJbXBsLmhhc1RyYW5zaXRpb25Ob3RlcygpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFFOYW1lU2V0QnVpbGRlciBzdGFydCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKLSAgICAgICAgUU5hbWVTZXRCdWlsZGVyIGV4Y2x1ZGVuZXh0ID0gbmV3IFFOYW1lU2V0QnVpbGRlcigpOwotICAgICAgICBib29sZWFuIGRldGVybWluaXN0aWMgPSB0cnVlOwotICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGNoaWxkcmVuID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBjYW5za2lwID0gKHBhcnRJbXBsLmdldE1pbk9jY3VycygpLnNpZ251bSgpID09IDApOwotCi0gICAgICAgIHN3aXRjaCAocGFydEltcGwuZ2V0UGFydGljbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHN0YXJ0IGFuZCBleGNsdWRlTmV4dDsgY2Fuc2tpcCBpcyBhbHJlYWR5IGNvcnJlY3QKLSAgICAgICAgICAgICAgICBpZiAocGFydEltcGwuaGFzVHJhbnNpdGlvblJ1bGVzKCkpCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0LmFkZEFsbChwYXJ0SW1wbC5hY2NlcHRlZFN0YXJ0TmFtZXMoKSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzdGFydC5hZGQocGFydEltcGwuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgotICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgc3RhcnQgYW5kIGV4Y2x1ZGVOZXh0OyBjYW5za2lwIGlzIGFscmVhZHkgY29ycmVjdAotICAgICAgICAgICAgICAgIHN0YXJ0LmFkZEFsbChwYXJ0SW1wbC5nZXRXaWxkY2FyZFNldCgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKLSAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGVuc3VyZVN0YXRlTWFjaGluZShwYXJ0SW1wbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gYWRqdXN0IGNhbnNraXAgaWYgYWxsIGNoaWxkcmVuIGFyZSBza2lwcGFibGUKLSAgICAgICAgICAgICAgICBjYW5za2lwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgY2Fuc2tpcCAmJiBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIShjaGlsZHJlbltpXSkuaXNTa2lwcGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbnNraXAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gYnViYmxlIHVwIG5vbmRldGVybWluaXN0aWMgYml0Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGRldGVybWluaXN0aWMgJiYgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoKFNjaGVtYVBhcnRpY2xlSW1wbCljaGlsZHJlbltpXSkuaXNEZXRlcm1pbmlzdGljKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmlzdGljID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHZlcmlmeSBkZXRlcm1pbmlzdGljIGFuZCBjb21wdXRlIGV4Y2x1ZGVOZXh0IHNldAotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBleGNsdWRlbmV4dC5hZGRBbGwoKChTY2hlbWFQYXJ0aWNsZUltcGwpY2hpbGRyZW5baSAtIDFdKS5nZXRFeGNsdWRlTmV4dFNldCgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRldGVybWluaXN0aWMgJiYgIWV4Y2x1ZGVuZXh0LmlzRGlzam9pbnQoKGNoaWxkcmVuW2ldKS5hY2NlcHRlZFN0YXJ0TmFtZXMoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmlzdGljID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoY2hpbGRyZW5baV0pLmlzU2tpcHBhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlbmV4dC5hZGRBbGwoKGNoaWxkcmVuW2ldKS5hY2NlcHRlZFN0YXJ0TmFtZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVuZXh0LmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbmV4dCwgY29tcHV0ZSBzdGFydCBzZXQKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnQuYWRkQWxsKChjaGlsZHJlbltpXSkuYWNjZXB0ZWRTdGFydE5hbWVzKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIShjaGlsZHJlbltpXSkuaXNTa2lwcGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBlbnN1cmVTdGF0ZU1hY2hpbmUocGFydEltcGwuZ2V0UGFydGljbGVDaGlsZHJlbigpKTsKLQotICAgICAgICAgICAgICAgIC8vIGFkanVzdCBjYW5za2lwIGlmIGFueSBjaGlsZHJlbiBhcmUgc2tpcHBhYmxlCi0gICAgICAgICAgICAgICAgY2Fuc2tpcCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAhY2Fuc2tpcCAmJiBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGNoaWxkcmVuW2ldKS5pc1NraXBwYWJsZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgY2Fuc2tpcCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gYnViYmxlIHVwIG5vbmRldGVybWluaXN0aWMgYml0Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGRldGVybWluaXN0aWMgJiYgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoKFNjaGVtYVBhcnRpY2xlSW1wbCljaGlsZHJlbltpXSkuaXNEZXRlcm1pbmlzdGljKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmlzdGljID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgc3RhcnQgYW5kIGV4Y2x1ZGVOZXh0IHNldHMsIHZlcmlmeSBkZXRlcm1pbmlzdGljCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXRlcm1pbmlzdGljICYmICFzdGFydC5pc0Rpc2pvaW50KChjaGlsZHJlbltpXSkuYWNjZXB0ZWRTdGFydE5hbWVzKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5pc3RpYyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBzdGFydC5hZGRBbGwoKGNoaWxkcmVuW2ldKS5hY2NlcHRlZFN0YXJ0TmFtZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVuZXh0LmFkZEFsbCgoKFNjaGVtYVBhcnRpY2xlSW1wbCljaGlsZHJlbltpXSkuZ2V0RXhjbHVkZU5leHRTZXQoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gZW5zdXJlU3RhdGVNYWNoaW5lKHBhcnRJbXBsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGp1c3QgY2Fuc2tpcCBpZiBhbGwgY2hpbGRyZW4gYXJlIHNraXBwYWJsZQotICAgICAgICAgICAgICAgIGNhbnNraXAgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAhY2Fuc2tpcCAmJiBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIShjaGlsZHJlbltpXSkuaXNTa2lwcGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbnNraXAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBidWJibGUgdXAgbm9uZGV0ZXJtaW5pc3RpYyBiaXQKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgZGV0ZXJtaW5pc3RpYyAmJiBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoISgoU2NoZW1hUGFydGljbGVJbXBsKWNoaWxkcmVuW2ldKS5pc0RldGVybWluaXN0aWMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluaXN0aWMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBzdGFydCBhbmQgZXhjbHVkZU5leHQgc2V0cywgdmVyaWZ5IGRldGVybWluaXN0aWMKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRldGVybWluaXN0aWMgJiYgIXN0YXJ0LmlzRGlzam9pbnQoKGNoaWxkcmVuW2ldKS5hY2NlcHRlZFN0YXJ0TmFtZXMoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmlzdGljID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0LmFkZEFsbCgoY2hpbGRyZW5baV0pLmFjY2VwdGVkU3RhcnROYW1lcygpKTsKLSAgICAgICAgICAgICAgICAgICAgZXhjbHVkZW5leHQuYWRkQWxsKCgoU2NoZW1hUGFydGljbGVJbXBsKWNoaWxkcmVuW2ldKS5nZXRFeGNsdWRlTmV4dFNldCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNhbnNraXApCi0gICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVuZXh0LmFkZEFsbChzdGFydCk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvLyB3aWxkY2FyZCwgYWxsIGNhc2VzIG55aQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVucmVjb2duaXplZCBzY2hlbWEgcGFydGljbGUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFwcGx5IGxvb3BpbmcgbG9naWMKLQotICAgICAgICBCaWdJbnRlZ2VyIG1pbk9jY3VycyA9IHBhcnRJbXBsLmdldE1pbk9jY3VycygpOwotICAgICAgICBCaWdJbnRlZ2VyIG1heE9jY3VycyA9IHBhcnRJbXBsLmdldE1heE9jY3VycygpOwotICAgICAgICBib29sZWFuIGNhbmxvb3AgPSAobWF4T2NjdXJzID09IG51bGwgfHwgbWF4T2NjdXJzLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPiAwKTsKLSAgICAgICAgYm9vbGVhbiB2YXJsb29wID0gKG1heE9jY3VycyA9PSBudWxsIHx8IG1pbk9jY3Vycy5jb21wYXJlVG8obWF4T2NjdXJzKSA8IDApOwotCi0gICAgICAgIGlmIChjYW5sb29wICYmIGRldGVybWluaXN0aWMgJiYgIWV4Y2x1ZGVuZXh0LmlzRGlzam9pbnQoc3RhcnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB3ZSBoYXZlIGEgcG9zc2libGUgbG9vcGluZyBub25kZXRlcm1pbmlzbS4KLSAgICAgICAgICAgIC8vIGxldCdzIHRha2Ugc29tZSB0aW1lIG5vdyB0byBzZWUgaWYgaXQncyBhY3R1YWxseSBjYXVzZWQKLSAgICAgICAgICAgIC8vIGJ5IG5vbi11bmlxdWUtcGFydGljbGUtYXR0cmlidXRlIG9yIG5vdC4KLSAgICAgICAgICAgIFFOYW1lU2V0IHN1c3BlY3RTZXQgPSBleGNsdWRlbmV4dC5pbnRlcnNlY3Qoc3RhcnQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBzZXQgb2YgYWxsIHBhcnRpY2xlcyB0aGF0IGNvdWxkIHN0YXJ0IHRoaXMgZ3JvdXAKLSAgICAgICAgICAgIE1hcCBzdGFydE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBwYXJ0aWNsZXNNYXRjaGluZ1N0YXJ0KHBhcnRJbXBsLCBzdXNwZWN0U2V0LCBzdGFydE1hcCwgbmV3IFFOYW1lU2V0QnVpbGRlcigpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gY29tcHV0ZSB0aGUgc2V0IG9mIGFsbCBwYXJ0aWNsZXMgdGhhdCBjb3VsZCBoYXZlIGJlZW4gcmVwZWF0ZWQgcmF0aGVyIHRoYW4gZW5kaW5nIHRoaXMgZ3JvdXAKLSAgICAgICAgICAgIE1hcCBhZnRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBwYXJ0aWNsZXNNYXRjaGluZ0FmdGVyKHBhcnRJbXBsLCBzdXNwZWN0U2V0LCBhZnRlck1hcCwgbmV3IFFOYW1lU2V0QnVpbGRlcigpLCB0cnVlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiBmaW5kIGEgbWVtYmVyIG9mIGFmdGVyIHRoYXQgaXMgbm90IGEgbWVtYmVyIG9mIHN0YXJ0Ci0gICAgICAgICAgICAvLyBpZiB3ZSBjYW4sIHRoZW4gcGFydGljbGUgYXR0cmlidXRpb24gaXMgbm90IHVuaXF1ZQotICAgICAgICAgICAgZGV0ZXJtaW5pc3RpYyA9IGFmdGVyTWFwU3Vic3VtZWRCeVN0YXJ0TWFwKHN0YXJ0TWFwLCBhZnRlck1hcCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmFybG9vcCkKLSAgICAgICAgICAgIGV4Y2x1ZGVuZXh0LmFkZEFsbChzdGFydCk7Ci0KLSAgICAgICAgY2Fuc2tpcCA9IGNhbnNraXAgfHwgbWluT2NjdXJzLnNpZ251bSgpID09IDA7Ci0KLSAgICAgICAgcGFydEltcGwuc2V0VHJhbnNpdGlvblJ1bGVzKHN0YXJ0LnRvUU5hbWVTZXQoKSwgY2Fuc2tpcCk7Ci0gICAgICAgIHBhcnRJbXBsLnNldFRyYW5zaXRpb25Ob3RlcyhleGNsdWRlbmV4dC50b1FOYW1lU2V0KCksIGRldGVybWluaXN0aWMpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFmdGVyTWFwU3Vic3VtZWRCeVN0YXJ0TWFwKE1hcCBzdGFydE1hcCwgTWFwIGFmdGVyTWFwKQotICAgIHsKLSAgICAgICAgaWYgKGFmdGVyTWFwLnNpemUoKSA+IHN0YXJ0TWFwLnNpemUoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIGlmIChhZnRlck1hcC5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHN0YXJ0TWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIHBhcnQgPSAoU2NoZW1hUGFydGljbGUpaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAocGFydC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJNYXAuY29udGFpbnNLZXkocGFydCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBRTmFtZVNldCBzdGFydFNldCA9IChRTmFtZVNldClzdGFydE1hcC5nZXQocGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lU2V0IGFmdGVyU2V0ID0gKFFOYW1lU2V0KWFmdGVyTWFwLmdldChwYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFydFNldC5jb250YWluc0FsbChhZnRlclNldCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWZ0ZXJNYXAucmVtb3ZlKHBhcnQpOwotICAgICAgICAgICAgaWYgKGFmdGVyTWFwLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKGFmdGVyTWFwLmlzRW1wdHkoKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcGFydGljbGVzTWF0Y2hpbmdTdGFydChTY2hlbWFQYXJ0aWNsZSBwYXJ0LCBRTmFtZVNldFNwZWNpZmljYXRpb24gc3VzcGVjdFNldCwgTWFwIHJlc3VsdCwgUU5hbWVTZXRCdWlsZGVyIGVsaW1pbmF0ZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAocGFydC5nZXRQYXJ0aWNsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgIGlmICghc3VzcGVjdFNldC5jb250YWlucyhwYXJ0LmdldE5hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICByZXN1bHQucHV0KHBhcnQsIG51bGwpOwotICAgICAgICAgICAgICAgIGVsaW1pbmF0ZS5hZGQocGFydC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgaWYgKHN1c3BlY3RTZXQuaXNEaXNqb2ludChwYXJ0LmdldFdpbGRjYXJkU2V0KCkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnB1dChwYXJ0LCBwYXJ0LmdldFdpbGRjYXJkU2V0KCkuaW50ZXJzZWN0KHN1c3BlY3RTZXQpKTsKLSAgICAgICAgICAgICAgICBlbGltaW5hdGUuYWRkQWxsKHBhcnQuZ2V0V2lsZGNhcmRTZXQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlW10gY2hpbGRyZW4gPSBwYXJ0LmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY2xlc01hdGNoaW5nU3RhcnQoY2hpbGRyZW5baV0sIHN1c3BlY3RTZXQsIHJlc3VsdCwgZWxpbWluYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGNoaWxkcmVuID0gcGFydC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlblswXS5pc1NraXBwYWJsZSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWNsZXNNYXRjaGluZ1N0YXJ0KGNoaWxkcmVuWzBdLCBzdXNwZWN0U2V0LCByZXN1bHQsIGVsaW1pbmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgUU5hbWVTZXRCdWlsZGVyIHJlbWFpbmluZ1N1c3BlY3RzID0gbmV3IFFOYW1lU2V0QnVpbGRlcihzdXNwZWN0U2V0KTsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWVTZXRCdWlsZGVyIHN1c3BlY3RzVG9FbGltaW5hdGUgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY2xlc01hdGNoaW5nU3RhcnQoY2hpbGRyZW5baV0sIHJlbWFpbmluZ1N1c3BlY3RzLCByZXN1bHQsIHN1c3BlY3RzVG9FbGltaW5hdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxpbWluYXRlLmFkZEFsbChzdXNwZWN0c1RvRWxpbWluYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW5baV0uaXNTa2lwcGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdTdXNwZWN0cy5yZW1vdmVBbGwoc3VzcGVjdHNUb0VsaW1pbmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nU3VzcGVjdHMuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlY3RzVG9FbGltaW5hdGUuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcGFydGljbGVzTWF0Y2hpbmdBZnRlcihTY2hlbWFQYXJ0aWNsZSBwYXJ0LCBRTmFtZVNldFNwZWNpZmljYXRpb24gc3VzcGVjdFNldCwgTWFwIHJlc3VsdCwgUU5hbWVTZXRCdWlsZGVyIGVsaW1pbmF0ZSwgYm9vbGVhbiB0b3ApCi0gICAgewotICAgICAgICByZWN1cnNlOiBzd2l0Y2ggKHBhcnQuZ2V0UGFydGljbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGNoaWxkcmVuID0gcGFydC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWNsZXNNYXRjaGluZ0FmdGVyKGNoaWxkcmVuW2ldLCBzdXNwZWN0U2V0LCByZXN1bHQsIGVsaW1pbmF0ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBicmVhayByZWN1cnNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGNoaWxkcmVuID0gcGFydC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJlY3Vyc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0uaXNTa2lwcGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFydGljbGVzTWF0Y2hpbmdBZnRlcihjaGlsZHJlblswXSwgc3VzcGVjdFNldCwgcmVzdWx0LCBlbGltaW5hdGUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJlY3Vyc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgUU5hbWVTZXRCdWlsZGVyIHJlbWFpbmluZ1N1c3BlY3RzID0gbmV3IFFOYW1lU2V0QnVpbGRlcihzdXNwZWN0U2V0KTsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWVTZXRCdWlsZGVyIHN1c3BlY3RzVG9FbGltaW5hdGUgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBjaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFydGljbGVzTWF0Y2hpbmdBZnRlcihjaGlsZHJlbltpXSwgcmVtYWluaW5nU3VzcGVjdHMsIHJlc3VsdCwgc3VzcGVjdHNUb0VsaW1pbmF0ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxpbWluYXRlLmFkZEFsbChzdXNwZWN0c1RvRWxpbWluYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW5baV0uaXNTa2lwcGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayByZWN1cnNlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nU3VzcGVjdHMucmVtb3ZlQWxsKHN1c3BlY3RzVG9FbGltaW5hdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZ1N1c3BlY3RzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayByZWN1cnNlOwotICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVjdHNUb0VsaW1pbmF0ZS5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIHJlY3Vyc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCF0b3ApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWluT2NjdXJzID0gcGFydC5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4T2NjdXJzID0gcGFydC5nZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gdmFybG9vcCA9IChtYXhPY2N1cnMgPT0gbnVsbCB8fCBtaW5PY2N1cnMuY29tcGFyZVRvKG1heE9jY3VycykgPCAwKTsKLSAgICAgICAgICAgIGlmICh2YXJsb29wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBhcnRpY2xlc01hdGNoaW5nU3RhcnQocGFydCwgc3VzcGVjdFNldCwgcmVzdWx0LCBlbGltaW5hdGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29kZUZvck5hbWVFbnRyeQotICAgIHsKLSAgICAgICAgQ29kZUZvck5hbWVFbnRyeShRTmFtZSBuYW1lLCBpbnQgY29kZSkKLSAgICAgICAgICAgIHsgdGhpcy5uYW1lID0gbmFtZTsgdGhpcy5jb2RlID0gY29kZTsgfQotICAgICAgICBwdWJsaWMgUU5hbWUgbmFtZTsKLSAgICAgICAgcHVibGljIGludCBjb2RlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFTF9HUk9VUF9DT0RFID0gMTAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ29kZUZvck5hbWVFbnRyeVtdIHBhcnRpY2xlQ29kZXMgPSBuZXcgQ29kZUZvck5hbWVFbnRyeVtdCi0gICAgewotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoImFsbCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFQYXJ0aWNsZS5BTEwpLAotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoInNlcXVlbmNlIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFKSwKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJjaG9pY2UiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hUGFydGljbGUuQ0hPSUNFKSwKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJlbGVtZW50IiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQpLAotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoImFueSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRCksCi0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygiZ3JvdXAiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgTU9ERUxfR1JPVVBfQ09ERSksCi0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBwYXJ0aWNsZUNvZGVNYXAgPSBidWlsZFBhcnRpY2xlQ29kZU1hcCgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGJ1aWxkUGFydGljbGVDb2RlTWFwKCkKLSAgICB7Ci0gICAgICAgIE1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpY2xlQ29kZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICByZXN1bHQucHV0KHBhcnRpY2xlQ29kZXNbaV0ubmFtZSwgIG5ldyBJbnRlZ2VyKHBhcnRpY2xlQ29kZXNbaV0uY29kZSkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCB0cmFuc2xhdGVQYXJ0aWNsZUNvZGUoR3JvdXAgcGFyc2VFZykKLSAgICB7Ci0gICAgICAgIGlmIChwYXJzZUVnID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZVBhcnRpY2xlQ29kZShwYXJzZUVnLm5ld0N1cnNvcigpLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHRyYW5zbGF0ZVBhcnRpY2xlQ29kZShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgSW50ZWdlciByZXN1bHQgPSAoSW50ZWdlcilwYXJ0aWNsZUNvZGVNYXAuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC5pbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVfQ09ERSA9IDEwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX0dST1VQX0NPREUgPSAxMDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFOWV9BVFRSSUJVVEVfQ09ERSA9IDEwMjsKLQotICAgIHByaXZhdGUgc3RhdGljIENvZGVGb3JOYW1lRW50cnlbXSBhdHRyaWJ1dGVDb2RlcyA9IG5ldyBDb2RlRm9yTmFtZUVudHJ5W10KLSAgICB7Ci0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygiYXR0cmlidXRlIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIEFUVFJJQlVURV9DT0RFKSwKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJhdHRyaWJ1dGVHcm91cCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBBVFRSSUJVVEVfR1JPVVBfQ09ERSksCi0gICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygiYW55QXR0cmlidXRlIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIEFOWV9BVFRSSUJVVEVfQ09ERSksCi0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBhdHRyaWJ1dGVDb2RlTWFwID0gYnVpbGRBdHRyaWJ1dGVDb2RlTWFwKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgYnVpbGRBdHRyaWJ1dGVDb2RlTWFwKCkKLSAgICB7Ci0gICAgICAgIE1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZUNvZGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgcmVzdWx0LnB1dChhdHRyaWJ1dGVDb2Rlc1tpXS5uYW1lLCAgbmV3IEludGVnZXIoYXR0cmlidXRlQ29kZXNbaV0uY29kZSkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgdHJhbnNsYXRlQXR0cmlidXRlQ29kZShRTmFtZSBjdXJyZW50TmFtZSkKLSAgICB7Ci0gICAgICAgIEludGVnZXIgcmVzdWx0ID0gKEludGVnZXIpYXR0cmlidXRlQ29kZU1hcC5nZXQoY3VycmVudE5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC5pbnRWYWx1ZSgpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjSW1wb3J0ZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NJbXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzhhM2U2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NJbXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKLQotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuUmVkZWZpbmVEb2N1bWVudC5SZWRlZmluZTsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50LlNjaGVtYTsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuSW1wb3J0RG9jdW1lbnQuSW1wb3J0OwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuSW5jbHVkZURvY3VtZW50LkluY2x1ZGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yQ29udGV4dDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLQotcHVibGljIGNsYXNzIFN0c2NJbXBvcnRlcgotewotICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hVG9Qcm9jZXNzW10gcmVzb2x2ZUltcG9ydHNBbmRJbmNsdWRlcyhTY2hlbWFbXSBzdGFydFdpdGgpCi0gICAgewotICAgICAgICBEb3dubG9hZFRhYmxlIGVuZ2luZSA9IG5ldyBEb3dubG9hZFRhYmxlKHN0YXJ0V2l0aCk7Ci0gICAgICAgIHJldHVybiBlbmdpbmUucmVzb2x2ZUltcG9ydHNBbmRJbmNsdWRlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2NoZW1hVG9Qcm9jZXNzCi0gICAgewotICAgICAgICBwcml2YXRlIFNjaGVtYSBzY2hlbWE7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZTsKLSAgICAgICAgcHJpdmF0ZSBSZWRlZmluZSByZWRlZmluZTsKLQotICAgICAgICBwdWJsaWMgU2NoZW1hVG9Qcm9jZXNzKFNjaGVtYSBzY2hlbWEsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UsIFJlZGVmaW5lIHJlZGVmaW5lKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgICAgICAgICAgIHRoaXMuY2hhbWVsZW9uTmFtZXNwYWNlID0gY2hhbWVsZW9uTmFtZXNwYWNlOwotICAgICAgICAgICAgdGhpcy5yZWRlZmluZSA9IHJlZGVmaW5lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBzY2hlbWEgdG8gcGFyc2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU2NoZW1hIGdldFNjaGVtYSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzY2hlbWE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGJhc2UgVVJJIGZvciB0aGlzIHN0cAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHNjaGVtYS5kb2N1bWVudFByb3BlcnRpZXMoKS5nZXRTb3VyY2VOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgcmVkZWZpbmUgZWxlbWVudCwgaWYgcHJvY2Vzc2VkIHZpYSByZWRlZmluZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFJlZGVmaW5lIGdldFJlZGVmaW5lKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlZGVmaW5lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBjaGFtZWxlb24gbmFtZXNwYWNlLiBOdWxsIGlmIHRoaXMgc2NoZW1hIGlzIG5vdCBiZWluZyB0cmVhdGVkCi0gICAgICAgICAqIGFzIGEgY2hhbWVsZW9uLiAoVGhlIG9yZGluYXJ5IHRhcmdldE5hbWVzcGFjZSB3aWxsIGp1c3QgYmUgZXh0cmFjdGVkCi0gICAgICAgICAqIGZyb20gdGhlIHN5bnRheCBvZiB0aGUgc2NoZW1hLikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNoYW1lbGVvbk5hbWVzcGFjZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgU2NoZW1hVG9Qcm9jZXNzKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBmaW5hbCBTY2hlbWFUb1Byb2Nlc3Mgc2NoZW1hVG9Qcm9jZXNzID0gKFNjaGVtYVRvUHJvY2VzcykgbzsKLQotICAgICAgICAgICAgaWYgKGNoYW1lbGVvbk5hbWVzcGFjZSAhPSBudWxsID8gIWNoYW1lbGVvbk5hbWVzcGFjZS5lcXVhbHMoc2NoZW1hVG9Qcm9jZXNzLmNoYW1lbGVvbk5hbWVzcGFjZSkgOiBzY2hlbWFUb1Byb2Nlc3MuY2hhbWVsZW9uTmFtZXNwYWNlICE9IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChyZWRlZmluZSAhPSBudWxsID8gIXJlZGVmaW5lLmVxdWFscyhzY2hlbWFUb1Byb2Nlc3MucmVkZWZpbmUpIDogc2NoZW1hVG9Qcm9jZXNzLnJlZGVmaW5lICE9IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmICghc2NoZW1hLmVxdWFscyhzY2hlbWFUb1Byb2Nlc3Muc2NoZW1hKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0OwotICAgICAgICAgICAgcmVzdWx0ID0gc2NoZW1hLmhhc2hDb2RlKCk7Ci0gICAgICAgICAgICByZXN1bHQgPSAyOSAqIHJlc3VsdCArIChjaGFtZWxlb25OYW1lc3BhY2UgIT0gbnVsbCA/IGNoYW1lbGVvbk5hbWVzcGFjZS5oYXNoQ29kZSgpIDogMCk7Ci0gICAgICAgICAgICByZXN1bHQgPSAyOSAqIHJlc3VsdCArIChyZWRlZmluZSAhPSBudWxsID8gcmVkZWZpbmUuaGFzaENvZGUoKSA6IDApOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUk9KRUNUX1VSTF9QUkVGSVggPSAicHJvamVjdDovL2xvY2FsIjsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBiYXNlVVJMRm9yRG9jKFhtbE9iamVjdCBvYmopCi0gICAgewotICAgICAgICBTdHJpbmcgcGF0aCA9IG9iai5kb2N1bWVudFByb3BlcnRpZXMoKS5nZXRTb3VyY2VOYW1lKCk7Ci0KLSAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSkKLSAgICAgICAgICAgIHJldHVybiBQUk9KRUNUX1VSTF9QUkVGSVggKyBwYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQotICAgICAgICAvLyBsb29rcyBsaWtlIGEgVVJMPwotICAgICAgICBpbnQgY29sb24gPSBwYXRoLmluZGV4T2YoJzonKTsKLSAgICAgICAgaWYgKGNvbG9uID4gMSAmJiBwYXRoLnN1YnN0cmluZygwLCBjb2xvbikubWF0Y2hlcygiXlxcdyskIikpCi0gICAgICAgICAgICByZXR1cm4gcGF0aDsKLQotICAgICAgICByZXR1cm4gUFJPSkVDVF9VUkxfUFJFRklYICsgIi8iICsgcGF0aC5yZXBsYWNlKCdcXCcsICcvJyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVVJJIHBhcnNlVVJJKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgaWYgKHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFVSSShzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIHN5bnRheCkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vd29ya2Fyb3VuZCBmb3IgU3VuIGJ1ZyAjIDQ3MjM3MjYKLSAgICBwcml2YXRlIHN0YXRpYyBVUkkgcmVzb2x2ZShVUkkgYmFzZSwgU3RyaW5nIGNoaWxkKQotICAgIHsKLSAgICAgICAgVVJJIHJ1cmkgPSBiYXNlLnJlc29sdmUoY2hpbGQpOwotICAgICAgICAKLSAgICAgICAgLy9maXggdXAgbm9ybWFsaXphdGlvbiBidWcKLSAgICAgICAgaWYgKCJmaWxlIi5lcXVhbHMocnVyaS5nZXRTY2hlbWUoKSkgJiYgISBjaGlsZC5lcXVhbHMocnVyaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChiYXNlLmdldFBhdGgoKS5zdGFydHNXaXRoKCIvLyIpICYmICFydXJpLmdldFBhdGgoKS5zdGFydHNXaXRoKCIvLyIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gIi8vLyIuY29uY2F0KHJ1cmkuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJ1cmkgPSBuZXcgVVJJKCJmaWxlIiwgbnVsbCwgcGF0aCwgcnVyaS5nZXRRdWVyeSgpLCBydXJpLmdldEZyYWdtZW50KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaChVUklTeW50YXhFeGNlcHRpb24gdXJpcykKLSAgICAgICAgICAgICAgICB7fQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBydXJpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRG93bmxvYWRUYWJsZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIE5hbWVzcGFjZS9zY2hlbWFMb2NhdGlvbiBwYWlyLgotICAgICAgICAgKgotICAgICAgICAgKiBEb3dubG9hZGVkIHNjaGVtYXMgYXJlIGluZGV4ZWQgYnkgbmFtZXNwYWNlLCBzY2hlbWFMb2NhdGlvbiwgYW5kIGJvdGguCi0gICAgICAgICAqCi0gICAgICAgICAqIEEgcGVyZmVjdCBtYXRjaCBpcyBwcmVmZXJyZWQsIGJ1dCBhIG1hdGNoLWJ5LW5hbWVzcGFjZSBpcyBhY2NlcHRlZC4KLSAgICAgICAgICogQSBtYXRjaC1ieS1zY2hlbWFMb2NhdGlvbiBpcyBvbmx5IGFjY2VwdGVkIGZvciBpbmNsdWRlcyAobm90IGltcG9ydHMpLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTnNMb2NQYWlyCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSTsKLSAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uVVJMOwotCi0gICAgICAgICAgICBwdWJsaWMgTnNMb2NQYWlyKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhdGlvblVSTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLSAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uVVJMID0gbG9jYXRpb25VUkw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogRW1wdHkgc3RyaW5nIGZvciBuby1uYW1lc3BhY2UsIG51bGwgZm9yIG5hbWVzcGFjZS1ub3QtcGFydC1vZi1rZXkKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuYW1lc3BhY2VVUkk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkwoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvblVSTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBOc0xvY1BhaXIpKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBOc0xvY1BhaXIgbnNMb2NQYWlyID0gKE5zTG9jUGFpcikgbzsKLQotICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvblVSTCAhPSBudWxsID8gIWxvY2F0aW9uVVJMLmVxdWFscyhuc0xvY1BhaXIubG9jYXRpb25VUkwpIDogbnNMb2NQYWlyLmxvY2F0aW9uVVJMICE9IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwgPyAhbmFtZXNwYWNlVVJJLmVxdWFscyhuc0xvY1BhaXIubmFtZXNwYWNlVVJJKSA6IG5zTG9jUGFpci5uYW1lc3BhY2VVUkkgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKG5hbWVzcGFjZVVSSSAhPSBudWxsID8gbmFtZXNwYWNlVVJJLmhhc2hDb2RlKCkgOiAwKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAyOSAqIHJlc3VsdCArIChsb2NhdGlvblVSTCAhPSBudWxsID8gbG9jYXRpb25VUkwuaGFzaENvZGUoKSA6IDApOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEaWdlc3RLZXkKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZVtdIF9kaWdlc3Q7Ci0gICAgICAgICAgICBpbnQgX2hhc2hDb2RlOwotICAgICAgICAgICAgRGlnZXN0S2V5KGJ5dGVbXSBkaWdlc3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2RpZ2VzdCA9IGRpZ2VzdDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQgJiYgaSA8IGRpZ2VzdC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9oYXNoQ29kZSA9IF9oYXNoQ29kZSA8PCA4OwotICAgICAgICAgICAgICAgICAgICBfaGFzaENvZGUgPSBfaGFzaENvZGUgKyBkaWdlc3RbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIERpZ2VzdEtleSkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyhfZGlnZXN0LCAoKERpZ2VzdEtleSlvKS5fZGlnZXN0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9oYXNoQ29kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgTWFwIHNjaGVtYUJ5TnNMb2NQYWlyID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgcHJpdmF0ZSBNYXAgc2NoZW1hQnlEaWdlc3RLZXkgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBwcml2YXRlIExpbmtlZExpc3Qgc2Nhbk5lZWRlZCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gICAgICAgIHByaXZhdGUgU2V0IGVtcHR5TmFtZXNwYWNlU2NoZW1hcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIHByaXZhdGUgU2V0IHNjYW5uZWRBbHJlYWR5ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgcHJpdmF0ZSBTZXQgZmFpbGVkRG93bmxvYWRzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgICAgICBwcml2YXRlIFNjaGVtYSBkb3dubG9hZFNjaGVtYShYbWxPYmplY3QgcmVmZXJlbmNlZEJ5LCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb25VUkwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIG5vIGxvY2F0aW9uIFVSTCBwcm92aWRlZD8gIFRoZW4gbm90aGluZyB0byBkby4KLSAgICAgICAgICAgIGlmIChsb2NhdGlvblVSTCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBGaXJzdCByZXNvbHZlIHJlbGF0aXZlIFVSTHMgd2l0aCByZXNwZWN0IHRvIGJhc2UgVVJMIGZvciBkb2MKLSAgICAgICAgICAgIFVSSSBiYXNlVVJJID0gcGFyc2VVUkkoYmFzZVVSTEZvckRvYyhyZWZlcmVuY2VkQnkpKTsKLSAgICAgICAgICAgIFN0cmluZyBhYnNvbHV0ZVVSTCA9IGJhc2VVUkkgPT0gbnVsbCA/IGxvY2F0aW9uVVJMIDogcmVzb2x2ZShiYXNlVVJJLCBsb2NhdGlvblVSTCkudG9TdHJpbmcoKTsKLQotICAgICAgICAgICAgLy8gcHJvYmUgMTogbnMrdXJsIC0gcGVyZmVjdCBtYXRjaAotICAgICAgICAgICAgaWYgKGFic29sdXRlVVJMICE9IG51bGwgJiYgdGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hIHJlc3VsdCA9IChTY2hlbWEpc2NoZW1hQnlOc0xvY1BhaXIuZ2V0KG5ldyBOc0xvY1BhaXIodGFyZ2V0TmFtZXNwYWNlLCBhYnNvbHV0ZVVSTCkpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotCi0gICAgICAgICAgICAvLyBwcm9iZSAyOiB3ZSBoYXZlIHByZWV4aXN0aW5nIGtub3dsZWRnZSBvZiB0aGlzIG5hbWVzcGFjZSwKLSAgICAgICAgICAgIC8vIGVpdGhlciBmcm9tIGFub3RoZXIgc2NoZW1hIGZpbGUgb3IgZnJvbSB0aGUgbGlua2VyLgotICAgICAgICAgICAgLy8gSWYgd2UncmUgbm90IGRvd25sb2FkaW5nIHRoZSBnaXZlbiBVUkwsIHNraXAgaXQgc2lsZW50bHkgaWYgdGhlCi0gICAgICAgICAgICAvLyBuYW1lc3BhY2UgaXMgYWxyZWFkeSByZXByZXNlbnRlZCBieSBhIGZpbGUgd2UgaGF2ZS4KLSAgICAgICAgICAgIC8vIEFsc28sIHN1cHByZXNzIGRvd25sb2FkcyBvZiBVUkxzIHRvIG5hbWVzcGFjZXMgdGhhdCBhcmUgYWxyZWFkeQotICAgICAgICAgICAgLy8ga25vd24gYnkgdGhlIGxpbmtlci4KLSAgICAgICAgICAgIC8vIChXZSBuZXZlciBhc3N1bWUgcHJlZXhpc3Rpbmcga25vd2xlZGdlIG9mIHRoZSBuby1uYW1lc3BhY2UsCi0gICAgICAgICAgICAvLyBldmVuIGlmIHdlIGhhdmUgc29tZSBkZWZpbml0aW9ucywgc2luY2UgaXQncyBsaWtlbHkgdGhhdAotICAgICAgICAgICAgLy8gbW9yZSB0aGFuIG9uZSBwZXJzb24gaXMgcGxheWluZyBpbiB0aGUgbm8tbmFtZXNwYWNlIGF0IG9uY2UuKQotICAgICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsICYmICF0YXJnZXROYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyB0aGUgVVJMIGlzIG5vdCBvbmUgdG8gZG93bmxvYWQ7IHNob3VsZCB3ZSBhc3N1bWUgd2Uga25vdyBhYm91dCB0aGUgbmFtZXNwYWNlPwotICAgICAgICAgICAgICAgIGlmICghc3RhdGUuc2hvdWxkRG93bmxvYWRVUkkoYWJzb2x1dGVVUkwpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIGEgc2NoZW1hIHJlcHJlc2VudGluZyB0aGlzIG5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBza2lwIHRoaXMgVVJMIHNpbGVudGx5IHdpdGhvdXQgcHJvZHVjaW5nIGFuIGVycm9yLgotICAgICAgICAgICAgICAgICAgICBTY2hlbWEgcmVzdWx0ID0gKFNjaGVtYSlzY2hlbWFCeU5zTG9jUGFpci5nZXQobmV3IE5zTG9jUGFpcih0YXJnZXROYW1lc3BhY2UsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGlua2VyIGFscmVhZHkga25vd3MgYWJvdXQgdGhpcyBuYW1lc3BhY2UsIHNraXAKLSAgICAgICAgICAgICAgICAvLyB0aGlzIFVSTC4KLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUubGlua2VyRGVmaW5lc05hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcHJvYmUgMzogdXJsIG9ubHkKLSAgICAgICAgICAgIGlmIChhYnNvbHV0ZVVSTCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYSByZXN1bHQgPSAoU2NoZW1hKXNjaGVtYUJ5TnNMb2NQYWlyLmdldChuZXcgTnNMb2NQYWlyKG51bGwsIGFic29sdXRlVVJMKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBubyBtYXRjaDogZXJyb3IgaWYgd2UgY2FuJ3Qgb3Igd29uJ3QgZG93bmxvYWQuCi0gICAgICAgICAgICBpZiAoYWJzb2x1dGVVUkwgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ291bGQgbm90IGZpbmQgcmVzb3VyY2UgLSBubyB2YWxpZCBsb2NhdGlvbiBVUkwuIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9GSU5EX1JFU09VUkNFLCByZWZlcmVuY2VkQnkpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJldmlvdXNseUZhaWxlZFRvRG93bmxvYWQoYWJzb2x1dGVVUkwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGFuIGVycm9yIG1lc3NhZ2UgaGFzIGFscmVhZHkgYmVlbiBwcm9kdWNlZC4KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFzdGF0ZS5zaG91bGREb3dubG9hZFVSSShhYnNvbHV0ZVVSTCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkNvdWxkIG5vdCBsb2FkIHJlc291cmNlIFwiIiArIGFic29sdXRlVVJMICsgIlwiIChuZXR3b3JrIGRvd25sb2FkcyBkaXNhYmxlZCkuIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9GSU5EX1JFU09VUkNFLCByZWZlcmVuY2VkQnkpOwotICAgICAgICAgICAgICAgIGFkZEZhaWxlZERvd25sb2FkKGFic29sdXRlVVJMKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdHJ5IHRvIGRvd25sb2FkCi0gICAgICAgICAgICBkb3dubG9hZDogdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0IHhkb2MgPSBkb3dubG9hZERvY3VtZW50KHN0YXRlLmdldFM0U0xvYWRlcigpLCB0YXJnZXROYW1lc3BhY2UsIGFic29sdXRlVVJMKTsKLQotICAgICAgICAgICAgICAgIFNjaGVtYSByZXN1bHQgPSBmaW5kTWF0Y2hCeURpZ2VzdCh4ZG9jKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2hvcnRuYW1lID0gc3RhdGUucmVsYXRpdml6ZShhYnNvbHV0ZVVSTCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgYW4gZXhhY3RseS10aGUtc2FtZSBkb2N1bWVudCBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCwgdXNlIHRoZSBvcmlnaW5hbCBhbmQgc3BldwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZHVwbmFtZSA9IHN0YXRlLnJlbGF0aXZpemUocmVzdWx0LmRvY3VtZW50UHJvcGVydGllcygpLmdldFNvdXJjZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkdXBuYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5pbmZvKHNob3J0bmFtZSArICIgaXMgdGhlIHNhbWUgYXMgIiArIGR1cG5hbWUgKyAiIChpZ25vcmluZyB0aGUgZHVwbGljYXRlIGZpbGUpIik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmluZm8oc2hvcnRuYW1lICsgIiBpcyB0aGUgc2FtZSBhcyBhbm90aGVyIHNjaGVtYSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGl0J3MgYSBuZXcgZG9jdW1lbnQ6IHZhbGlkYXRlIGl0IGFuZCBncmFiIHRoZSBjb250ZW50cwotICAgICAgICAgICAgICAgICAgICBYbWxPcHRpb25zIHZvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgdm9wdGlvbnMuc2V0RXJyb3JMaXN0ZW5lcihzdGF0ZS5nZXRFcnJvckxpc3RlbmVyKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoISh4ZG9jIGluc3RhbmNlb2YgU2NoZW1hRG9jdW1lbnQpIHx8ICF4ZG9jLnZhbGlkYXRlKHZvcHRpb25zKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlJlZmVyZW5jZWQgZG9jdW1lbnQgaXMgbm90IGEgdmFsaWQgc2NoZW1hIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9GSU5EX1JFU09VUkNFLCByZWZlcmVuY2VkQnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgZG93bmxvYWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBTY2hlbWFEb2N1bWVudCBzRG9jID0gKFNjaGVtYURvY3VtZW50KXhkb2M7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc0RvYy5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuaW5mbygiTG9hZGluZyByZWZlcmVuY2VkIGZpbGUgIiArIHNob3J0bmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE5zTG9jUGFpciBrZXkgPSBuZXcgTnNMb2NQYWlyKGVtcHR5U3RyaW5nSWZOdWxsKHJlc3VsdC5nZXRUYXJnZXROYW1lc3BhY2UoKSksIGFic29sdXRlVVJMKTsKLSAgICAgICAgICAgICAgICBhZGRTdWNjZXNzZnVsRG93bmxvYWQoa2V5LCByZXN1bHQpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1hbGZvcm1lZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiVVJMIFwiIiArIGFic29sdXRlVVJMICsgIlwiIGlzIG5vdCB3ZWxsLWZvcm1lZCIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfRklORF9SRVNPVVJDRSwgcmVmZXJlbmNlZEJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBjb25uZWN0aW9uUHJvYmxlbSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcihjb25uZWN0aW9uUHJvYmxlbS50b1N0cmluZygpLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0ZJTkRfUkVTT1VSQ0UsIHJlZmVyZW5jZWRCeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlByb2JsZW0gcGFyc2luZyByZWZlcmVuY2VkIFhNTCByZXNvdXJjZSAtICIgKyBlLmdldE1lc3NhZ2UoKSwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9GSU5EX1JFU09VUkNFLCByZWZlcmVuY2VkQnkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByZWNvcmQgZmFpbHVyZSBzbyB0aGF0IHdlIGRvbid0IHRyeSB0byBkb3dubG9hZCB0aGlzIFVSTCBhZ2FpbgotICAgICAgICAgICAgYWRkRmFpbGVkRG93bmxvYWQoYWJzb2x1dGVVUkwpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgWG1sT2JqZWN0IGRvd25sb2FkRG9jdW1lbnQoU2NoZW1hVHlwZUxvYWRlciBsb2FkZXIsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBhYnNvbHV0ZVVSTCkKLSAgICAgICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgWG1sRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIgPSBzdGF0ZS5nZXRFbnRpdHlSZXNvbHZlcigpOwotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc291cmNlID0gcmVzb2x2ZXIucmVzb2x2ZUVudGl0eShuYW1lc3BhY2UsIGFic29sdXRlVVJMKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGZpcnN0IHByZWZlcmVuY2UgZm9yIElucHV0U291cmNlIGNvbnRyYWN0OiBjaGFyYWN0ZXIgc3RyZWFtCi0gICAgICAgICAgICAgICAgUmVhZGVyIHJlYWRlciA9IHNvdXJjZS5nZXRDaGFyYWN0ZXJTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNldExvYWRMaW5lTnVtYmVycygpOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNldERvY3VtZW50U291cmNlTmFtZShhYnNvbHV0ZVVSTCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2FkZXIucGFyc2UocmVhZGVyLCBudWxsLCBvcHRpb25zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gc2Vjb25kIHByZWZlcmVuY2UgZm9yIElucHV0U291cmNlIGNvbnRyYWN0OiAKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBieXRlcyA9IHNvdXJjZS5nZXRCeXRlU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJ5dGVzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBzb3VyY2UuZ2V0RW5jb2RpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRMb2FkTGluZU51bWJlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRMb2FkTWVzc2FnZURpZ2VzdCgpOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNldERvY3VtZW50U291cmNlTmFtZShhYnNvbHV0ZVVSTCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRDaGFyYWN0ZXJFbmNvZGluZyhlbmNvZGluZyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2FkZXIucGFyc2UoYnl0ZXMsIG51bGwsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyB0aGlyZCBwcmVmZXJlbmNlOiB1c2UgdGhlIChwb3NzaWJseSByZWRpcmVjdGVkKSB1cmwKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJsVG9Mb2FkID0gc291cmNlLmdldFN5c3RlbUlkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHVybFRvTG9hZCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVudGl0eVJlc29sdmVyIHVuYWJsZSB0byByZXNvbHZlICIgKyBhYnNvbHV0ZVVSTCArICIgKGZvciBuYW1lc3BhY2UgIiArIG5hbWVzcGFjZSArICIpIik7Ci0gICAgICAgICAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgICAgICAgICBvcHRpb25zLnNldExvYWRMaW5lTnVtYmVycygpOwotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZE1lc3NhZ2VEaWdlc3QoKTsKLSAgICAgICAgICAgICAgICBvcHRpb25zLnNldERvY3VtZW50U291cmNlTmFtZShhYnNvbHV0ZVVSTCk7Ci0gICAgICAgICAgICAgICAgVVJMIHVybERvd25sb2FkID0gbmV3IFVSTCh1cmxUb0xvYWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBsb2FkZXIucGFyc2UodXJsRG93bmxvYWQsIG51bGwsIG9wdGlvbnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBubyByZXNvbHZlciAtIGp1c3QgdXNlIHRoZSBVUkwgZGlyZWN0bHksIG5vIHN1YnN0aXR1dGlvbgotICAgICAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZExpbmVOdW1iZXJzKCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldExvYWRNZXNzYWdlRGlnZXN0KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBVUkwgdXJsRG93bmxvYWQgPSBuZXcgVVJMKGFic29sdXRlVVJMKTsKLSAgICAgICAgICAgIHJldHVybiBsb2FkZXIucGFyc2UodXJsRG93bmxvYWQsIG51bGwsIG9wdGlvbnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZFN1Y2Nlc3NmdWxEb3dubG9hZChOc0xvY1BhaXIga2V5LCBTY2hlbWEgc2NoZW1hKQotICAgICAgICB7Ci0gICAgICAgICAgICBieXRlW10gZGlnZXN0ID0gc2NoZW1hLmRvY3VtZW50UHJvcGVydGllcygpLmdldE1lc3NhZ2VEaWdlc3QoKTsKLSAgICAgICAgICAgIGlmIChkaWdlc3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuYWRkU2NoZW1hRGlnZXN0KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERpZ2VzdEtleSBkayA9IG5ldyBEaWdlc3RLZXkoZGlnZXN0KTsKLSAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYUJ5RGlnZXN0S2V5LmNvbnRhaW5zS2V5KGRrKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNjaGVtYUJ5RGlnZXN0S2V5LnB1dChuZXcgRGlnZXN0S2V5KGRpZ2VzdCksIHNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5hZGRTY2hlbWFEaWdlc3QoZGlnZXN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNjaGVtYUJ5TnNMb2NQYWlyLnB1dChrZXksIHNjaGVtYSk7Ci0gICAgICAgICAgICBOc0xvY1BhaXIga2V5MSA9IG5ldyBOc0xvY1BhaXIoa2V5LmdldE5hbWVzcGFjZVVSSSgpLCBudWxsKTsKLSAgICAgICAgICAgIGlmICghc2NoZW1hQnlOc0xvY1BhaXIuY29udGFpbnNLZXkoa2V5MSkpCi0gICAgICAgICAgICAgICAgc2NoZW1hQnlOc0xvY1BhaXIucHV0KGtleTEsIHNjaGVtYSk7Ci0gICAgICAgICAgICBOc0xvY1BhaXIga2V5MiA9IG5ldyBOc0xvY1BhaXIobnVsbCwga2V5LmdldExvY2F0aW9uVVJMKCkpOwotICAgICAgICAgICAgaWYgKCFzY2hlbWFCeU5zTG9jUGFpci5jb250YWluc0tleShrZXkyKSkKLSAgICAgICAgICAgICAgICBzY2hlbWFCeU5zTG9jUGFpci5wdXQoa2V5Miwgc2NoZW1hKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU2NoZW1hIGZpbmRNYXRjaEJ5RGlnZXN0KFhtbE9iamVjdCBvcmlnaW5hbCkKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZVtdIGRpZ2VzdCA9IG9yaWdpbmFsLmRvY3VtZW50UHJvcGVydGllcygpLmdldE1lc3NhZ2VEaWdlc3QoKTsKLSAgICAgICAgICAgIGlmIChkaWdlc3QgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hKXNjaGVtYUJ5RGlnZXN0S2V5LmdldChuZXcgRGlnZXN0S2V5KGRpZ2VzdCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZEZhaWxlZERvd25sb2FkKFN0cmluZyBsb2NhdGlvblVSTCkKLSAgICAgICAgewotICAgICAgICAgICAgZmFpbGVkRG93bmxvYWRzLmFkZChsb2NhdGlvblVSTCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcHJldmlvdXNseUZhaWxlZFRvRG93bmxvYWQoU3RyaW5nIGxvY2F0aW9uVVJMKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFpbGVkRG93bmxvYWRzLmNvbnRhaW5zKGxvY2F0aW9uVVJMKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbnVsbGFibGVTdHJpbmdzTWF0Y2goU3RyaW5nIHMxLCBTdHJpbmcgczIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzMSA9PSBudWxsICYmIHMyID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBpZiAoczEgPT0gbnVsbCB8fCBzMiA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiAoczEuZXF1YWxzKHMyKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZW1wdHlTdHJpbmdJZk51bGwoU3RyaW5nIHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgcmV0dXJuIHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWRkU2Nhbk5lZWRlZChTY2hlbWFUb1Byb2Nlc3Mgc3RwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXNjYW5uZWRBbHJlYWR5LmNvbnRhaW5zKHN0cCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2Nhbm5lZEFscmVhZHkuYWRkKHN0cCk7Ci0gICAgICAgICAgICAgICAgc2Nhbk5lZWRlZC5hZGQoc3RwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBhZGRFbXB0eU5hbWVzcGFjZVNjaGVtYShTY2hlbWEgcykKLSAgICAgICAgewotICAgICAgICAgICAgZW1wdHlOYW1lc3BhY2VTY2hlbWFzLmFkZChzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1c2VkRW1wdHlOYW1lc3BhY2VTY2hlbWEoU2NoZW1hIHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtcHR5TmFtZXNwYWNlU2NoZW1hcy5yZW1vdmUocyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZmV0Y2hSZW1haW5pbmdFbXB0eU5hbWVzcGFjZVNjaGVtYXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZW1wdHlOYW1lc3BhY2VTY2hlbWFzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGVtcHR5TmFtZXNwYWNlU2NoZW1hcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hIHNjaGVtYSA9IChTY2hlbWEpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgYWRkU2Nhbk5lZWRlZChuZXcgU2NoZW1hVG9Qcm9jZXNzKHNjaGVtYSwgbnVsbCwgbnVsbCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbXB0eU5hbWVzcGFjZVNjaGVtYXMuY2xlYXIoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGhhc05leHRUb1NjYW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIXNjYW5OZWVkZWQuaXNFbXB0eSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTY2hlbWFUb1Byb2Nlc3MgbmV4dFRvU2NhbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVRvUHJvY2VzcyBuZXh0ID0gKFNjaGVtYVRvUHJvY2VzcylzY2FuTmVlZGVkLnJlbW92ZUZpcnN0KCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEb3dubG9hZFRhYmxlKFNjaGVtYVtdIHN0YXJ0V2l0aCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGFydFdpdGgubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHN0YXJ0V2l0aFtpXS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICBOc0xvY1BhaXIga2V5ID0gbmV3IE5zTG9jUGFpcih0YXJnZXROYW1lc3BhY2UsIGJhc2VVUkxGb3JEb2Moc3RhcnRXaXRoW2ldKSk7Ci0gICAgICAgICAgICAgICAgYWRkU3VjY2Vzc2Z1bERvd25sb2FkKGtleSwgc3RhcnRXaXRoW2ldKTsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGFkZFNjYW5OZWVkZWQobmV3IFNjaGVtYVRvUHJvY2VzcyhzdGFydFdpdGhbaV0sIG51bGwsIG51bGwpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGFkZEVtcHR5TmFtZXNwYWNlU2NoZW1hKHN0YXJ0V2l0aFtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2NoZW1hVG9Qcm9jZXNzW10gcmVzb2x2ZUltcG9ydHNBbmRJbmNsdWRlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLSAgICAgICAgICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAvLyBhbGdvcml0aG0gaXMgdG8gc2NhbiB0aHJvdWdoIGVhY2ggc2NoZW1hIGRvY3VtZW50IGFuZAotICAgICAgICAgICAgLy8gMS4gZG93bmxvYWQgZWFjaCBpbXBvcnQgYW5kIGluY2x1ZGUgKGlmIG5vdCBhbHJlYWR5IGRvd25sb2FkZWQpCi0gICAgICAgICAgICAvLyAyLiBxdWV1ZSBlYWNoIGltcG9ydGVkIG9yIGluY2x1ZGVkIHNjaGVtYSB0byBiZSBwcm9jZXNzIChpZiBub3QgYWxyZWFkeSBxdWV1ZWQpCi0KLSAgICAgICAgICAgIC8vIFRoZSBhbGdvcml0aG0gaXMgcnVuIHR3aWNlIHR3aWNlOiBmaXJzdCB3ZSBiZWdpbiB3aXRoIG5vbi1lbXB0eQotICAgICAgICAgICAgLy8gbmFtZXNwYWNlIHNjaGVtYXMgb25seS4gIFRoZW4gd2UgcmVwZWF0IHN0YXJ0aW5nIHdpdGggYW55Ci0gICAgICAgICAgICAvLyBlbXB0eSBlbXB0eS1uYW1lc3BhY2Ugc2NoZW1hcyB0aGF0IGhhdmUgTk9UIGJlZW4gY2hhbWVsZW9uLQotICAgICAgICAgICAgLy8gaW5jbHVkZWQgYnkgb3RoZXIgc2NoZW1hcyBhbmQgcHJvY2VzcyB0aGVtLgotCi0gICAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlIChoYXNOZXh0VG9TY2FuKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTY2hlbWFUb1Byb2Nlc3Mgc3RwID0gbmV4dFRvU2NhbigpOwotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5hZGRTb3VyY2VVcmkoc3RwLmdldFNvdXJjZU5hbWUoKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoc3RwKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBpbXBvcnRzCi0gICAgICAgICAgICAgICAgICAgICAgICBJbXBvcnRbXSBpbXBvcnRzID0gc3RwLmdldFNjaGVtYSgpLmdldEltcG9ydEFycmF5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hIGltcG9ydGVkID0gZG93bmxvYWRTY2hlbWEoaW1wb3J0c1tpXSwgZW1wdHlTdHJpbmdJZk51bGwoaW1wb3J0c1tpXS5nZXROYW1lc3BhY2UoKSksIGltcG9ydHNbaV0uZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgZG93bmxvYWQgZmFpbHMsIGFuIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4gcmVwb3J0ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltcG9ydGVkID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbnVsbGFibGVTdHJpbmdzTWF0Y2goaW1wb3J0ZWQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGltcG9ydHNbaV0uZ2V0TmFtZXNwYWNlKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJJbXBvcnRlZCBzY2hlbWEgaGFzIGEgdGFyZ2V0IG5hbWVzcGFjZSBcIiIgKyBpbXBvcnRlZC5nZXRUYXJnZXROYW1lc3BhY2UoKSArICJcIiB0aGF0IGRvZXMgbm90IG1hdGNoIHRoZSBzcGVjaWZpZWQgXCIiICsgaW1wb3J0c1tpXS5nZXROYW1lc3BhY2UoKSArICJcIiIsIFhtbEVycm9yQ29udGV4dC5NSVNNQVRDSEVEX1RBUkdFVF9OQU1FU1BBQ0UsIGltcG9ydHNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRTY2FuTmVlZGVkKG5ldyBTY2hlbWFUb1Byb2Nlc3MoaW1wb3J0ZWQsIG51bGwsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBpbmNsdWRlcwotICAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZVtdIGluY2x1ZGVzID0gc3RwLmdldFNjaGVtYSgpLmdldEluY2x1ZGVBcnJheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNvdXJjZU5hbWVzcGFjZSA9IHN0cC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VOYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOYW1lc3BhY2UgPSBlbXB0eVN0cmluZ0lmTnVsbChzdHAuZ2V0U2NoZW1hKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWEgaW5jbHVkZWQgPSBkb3dubG9hZFNjaGVtYShpbmNsdWRlc1tpXSwgbnVsbCwgaW5jbHVkZXNbaV0uZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgZG93bmxvYWQgZmFpbHMsIGFuIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4gcmVwb3J0ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVkID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbXB0eVN0cmluZ0lmTnVsbChpbmNsdWRlZC5nZXRUYXJnZXROYW1lc3BhY2UoKSkuZXF1YWxzKHNvdXJjZU5hbWVzcGFjZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tY2hhbWVsZW9uIGNhc2UgLSBqdXN0IGxpa2UgYW4gaW1wb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFNjYW5OZWVkZWQobmV3IFNjaGVtYVRvUHJvY2VzcyhpbmNsdWRlZCwgbnVsbCwgbnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbmNsdWRlZC5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWxsZWdhbCBpbmNsdWRlOiBpbmNsdWRlZCBzY2hlbWEgaW4gd3JvbmcgbmFtZXNwYWNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkluY2x1ZGVkIHNjaGVtYSBoYXMgYSB0YXJnZXQgbmFtZXNwYWNlIFwiIiArIGluY2x1ZGVkLmdldFRhcmdldE5hbWVzcGFjZSgpICsgIlwiIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIHNvdXJjZSBuYW1lc3BhY2UgXCIiICsgc291cmNlTmFtZXNwYWNlICsgIlwiIiwgWG1sRXJyb3JDb250ZXh0Lk1JU01BVENIRURfVEFSR0VUX05BTUVTUEFDRSwgaW5jbHVkZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFtZWxlb24gaW5jbHVkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRTY2FuTmVlZGVkKG5ldyBTY2hlbWFUb1Byb2Nlc3MoaW5jbHVkZWQsIHNvdXJjZU5hbWVzcGFjZSwgbnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkRW1wdHlOYW1lc3BhY2VTY2hlbWEoaW5jbHVkZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHJlZGVmaW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgUmVkZWZpbmVbXSByZWRlZmluZXMgPSBzdHAuZ2V0U2NoZW1hKCkuZ2V0UmVkZWZpbmVBcnJheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNvdXJjZU5hbWVzcGFjZSA9IHN0cC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VOYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOYW1lc3BhY2UgPSBlbXB0eVN0cmluZ0lmTnVsbChzdHAuZ2V0U2NoZW1hKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWRlZmluZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hIHJlZGVmaW5lZCA9IGRvd25sb2FkU2NoZW1hKHJlZGVmaW5lc1tpXSwgbnVsbCwgcmVkZWZpbmVzW2ldLmdldFNjaGVtYUxvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGRvd25sb2FkIGZhaWxzLCBhbiBlcnJvciBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWRlZmluZWQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5U3RyaW5nSWZOdWxsKHJlZGVmaW5lZC5nZXRUYXJnZXROYW1lc3BhY2UoKSkuZXF1YWxzKHNvdXJjZU5hbWVzcGFjZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tY2hhbWVsZW9uIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU2Nhbk5lZWRlZChuZXcgU2NoZW1hVG9Qcm9jZXNzKHJlZGVmaW5lZCwgbnVsbCwgcmVkZWZpbmVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlZGVmaW5lZC5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWxsZWdhbCBpbmNsdWRlOiBpbmNsdWRlZCBzY2hlbWEgaW4gd3JvbmcgbmFtZXNwYWNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIlJlZGVmaW5lZCBzY2hlbWEgaGFzIGEgdGFyZ2V0IG5hbWVzcGFjZSBcIiIgKyByZWRlZmluZWQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgKyAiXCIgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGUgc291cmNlIG5hbWVzcGFjZSBcIiIgKyBzb3VyY2VOYW1lc3BhY2UgKyAiXCIiLCBYbWxFcnJvckNvbnRleHQuTUlTTUFUQ0hFRF9UQVJHRVRfTkFNRVNQQUNFLCByZWRlZmluZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFtZWxlb24gcmVkZWZpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU2Nhbk5lZWRlZChuZXcgU2NoZW1hVG9Qcm9jZXNzKHJlZGVmaW5lZCwgc291cmNlTmFtZXNwYWNlLCByZWRlZmluZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEVtcHR5TmFtZXNwYWNlU2NoZW1hKHJlZGVmaW5lZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFmZXRjaFJlbWFpbmluZ0VtcHR5TmFtZXNwYWNlU2NoZW1hcygpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFUb1Byb2Nlc3NbXSlyZXN1bHQudG9BcnJheShuZXcgU2NoZW1hVG9Qcm9jZXNzW3Jlc3VsdC5zaXplKCldKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY0phdmFpemVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjSmF2YWl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYxMzdlMy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjSmF2YWl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxMiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXRCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVN0cmluZ0VudW1FbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJ5dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTaG9ydDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFN0c2NKYXZhaXplcgotewotICAgIC8qKgotICAgICAqIERvZXMgYSB0b3BvIHdhbGsgb2YgYWxsIHRoZSB0eXBlcyB0byByZXNvbHZlIHRoZW0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGphdmFpemVBbGxUeXBlcyhib29sZWFuIGphdmFpemUpCi0gICAgewotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0KLSAgICAgICAgTGlzdCBhbGxTZWVuVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5kb2N1bWVudFR5cGVzKCkpKTsKLSAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0YXRlLmF0dHJpYnV0ZVR5cGVzKCkpKTsKLSAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0YXRlLmdsb2JhbFR5cGVzKCkpKTsKLQotICAgICAgICAvLyBGaXJzdCBkaXN0cmlidXRlIHRoZSBnbG9iYWwgbmFtZXMgYW1vbmcgdGhlIHRvcCBlbnRpdGllcy4KLSAgICAgICAgaWYgKGphdmFpemUpCi0gICAgICAgICAgICBhc3NpZ25HbG9iYWxKYXZhTmFtZXMoYWxsU2VlblR5cGVzKTsKLQotICAgICAgICAvLyBub3cgZnVsbHkgamF2YWl6ZSBldmVyeXRoaW5nIGRlZXBseS4KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxTZWVuVHlwZXMuc2l6ZSgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgZ1R5cGUgPSAoU2NoZW1hVHlwZSlhbGxTZWVuVHlwZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGphdmFpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgamF2YWl6ZVR5cGUoKFNjaGVtYVR5cGVJbXBsKWdUeXBlKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ1R5cGUuZ2V0RnVsbEphdmFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5hZGRDbGFzc25hbWUoY2xhc3NOYW1lLnJlcGxhY2UoJyQnLCAnLicpLCBnVHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc2tpcEphdmFpemluZ1R5cGUoKFNjaGVtYVR5cGVJbXBsKWdUeXBlKTsKLSAgICAgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChnVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBhc3NpZ25HbG9iYWxKYXZhTmFtZXMoQ29sbGVjdGlvbiBzY2hlbWFUeXBlcykKLSAgICB7Ci0gICAgICAgIEhhc2hTZXQgdXNlZE5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYVR5cGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGVJbXBsIHNJbXBsID0gKFNjaGVtYVR5cGVJbXBsKWkubmV4dCgpOwotICAgICAgICAgICAgUU5hbWUgdG9wTmFtZSA9IGZpbmRUb3BOYW1lKHNJbXBsKTsKLSAgICAgICAgICAgIFN0cmluZyBwaWNrZWROYW1lID0gc3RhdGUuZ2V0SmF2YW5hbWUodG9wTmFtZSk7Ci0gICAgICAgICAgICBpZiAoc0ltcGwuaXNVbmphdmFpemVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0RnVsbEphdmFOYW1lKHBpY2tGdWxsSmF2YUNsYXNzTmFtZSh1c2VkTmFtZXMsIGZpbmRUb3BOYW1lKHNJbXBsKSwgcGlja2VkTmFtZSwgc0ltcGwuaXNEb2N1bWVudFR5cGUoKSwgc0ltcGwuaXNBdHRyaWJ1dGVUeXBlKCkpKTsKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRGdWxsSmF2YUltcGxOYW1lKHBpY2tGdWxsSmF2YUltcGxOYW1lKHVzZWROYW1lcywgc0ltcGwuZ2V0RnVsbEphdmFOYW1lKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTdHJpbmdUeXBlKFNjaGVtYVR5cGUgdHlwZSkKLSAgICB7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwgfHwgdHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5BVE9NSUMpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiAodHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkgPT0gU2NoZW1hVHlwZS5CVENfU1RSSU5HKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHBpY2tDb25zdGFudE5hbWUoU2V0IHVzZWROYW1lcywgU3RyaW5nIHdvcmRzKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGJhc2UgPSBOYW1lVXRpbC51cHBlckNhc2VVbmRlcmJhcih3b3Jkcyk7Ci0KLSAgICAgICAgaWYgKGJhc2UubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgYmFzZSA9ICJYIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiYXNlLnN0YXJ0c1dpdGgoIklOVF8iKSkgLy8gcmVzZXJ2ZWQgZm9yIGludCBjb2RlcwotICAgICAgICB7Ci0gICAgICAgICAgICBiYXNlID0gIlhfIiArIGJhc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdW5pcU5hbWU7Ci0gICAgICAgIGludCBpbmRleCA9IDE7Ci0gICAgICAgIGZvciAodW5pcU5hbWUgPSBiYXNlOyB1c2VkTmFtZXMuY29udGFpbnModW5pcU5hbWUpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB1bmlxTmFtZSA9IGJhc2UgKyAiXyIgKyBpbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHVzZWROYW1lcy5hZGQodW5pcU5hbWUpOwotCi0gICAgICAgIHJldHVybiB1bmlxTmFtZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBza2lwSmF2YWl6aW5nVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKLSAgICB7Ci0gICAgICAgIGlmIChzSW1wbC5pc0phdmFpemVkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHNJbXBsLnN0YXJ0SmF2YWl6aW5nKCk7Ci0gICAgICAgIHNlY29uZFBhc3NQcm9jZXNzVHlwZShzSW1wbCk7Ci0gICAgICAgIHNJbXBsLmZpbmlzaEphdmFpemluZygpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNlY29uZFBhc3NQcm9jZXNzVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKLSAgICB7Ci0gICAgICAgIGlmIChpc1N0cmluZ1R5cGUoc0ltcGwpKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxBbnlTaW1wbGVUeXBlW10gZW51bVZhbHMgPSBzSW1wbC5nZXRFbnVtZXJhdGlvblZhbHVlcygpOwotCi0gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGVudW1lcmF0ZWQgc3RyaW5nIHR5cGUsIHZhbHVlcyBhcmUgdG8gYmUKLSAgICAgICAgICAgIC8vIGphdmFpemVkIGFzIGNvbnN0YW50cy4KLSAgICAgICAgICAgIGlmIChlbnVtVmFscyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYVN0cmluZ0VudW1FbnRyeVtdIGVudHJ5QXJyYXkgPSBuZXcgU2NoZW1hU3RyaW5nRW51bUVudHJ5W2VudW1WYWxzLmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZSBiYXNlZE9uID0gc0ltcGwuZ2V0QmFzZUVudW1UeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJhc2VkT24gPT0gc0ltcGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTZXQgdXNlZE5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtVmFscy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbCA9IGVudW1WYWxzW2ldLmdldFN0cmluZ1ZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5QXJyYXlbaV0gPSBuZXcgU2NoZW1hU3RyaW5nRW51bUVudHJ5SW1wbCh2YWwsIGkgKyAxLCBwaWNrQ29uc3RhbnROYW1lKHVzZWROYW1lcywgdmFsKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtVmFscy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbCA9IGVudW1WYWxzW2ldLmdldFN0cmluZ1ZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeUFycmF5W2ldID0gYmFzZWRPbi5lbnVtRW50cnlGb3JTdHJpbmcodmFsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRTdHJpbmdFbnVtRW50cmllcyhlbnRyeUFycmF5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGphdmFpemVUeXBlKFNjaGVtYVR5cGVJbXBsIHNJbXBsKQotICAgIHsKLSAgICAgICAgaWYgKHNJbXBsLmlzSmF2YWl6ZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBTY2hlbWFUeXBlSW1wbCBiYXNlVHlwZSA9IChTY2hlbWFUeXBlSW1wbClzSW1wbC5nZXRCYXNlVHlwZSgpOwotICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgIGphdmFpemVUeXBlKGJhc2VUeXBlKTsKLQotICAgICAgICBzSW1wbC5zdGFydEphdmFpemluZygpOwotCi0gICAgICAgIHNJbXBsLnNldENvbXBpbGVkKHRydWUpOwotCi0gICAgICAgIHNlY29uZFBhc3NQcm9jZXNzVHlwZShzSW1wbCk7Ci0KLSAgICAgICAgaWYgKCFzSW1wbC5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlbXSBlbHRQcm9wcyA9IHNJbXBsLmdldEVsZW1lbnRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eVtdIGF0dHJQcm9wcyA9IHNJbXBsLmdldEF0dHJpYnV0ZVByb3BlcnRpZXMoKTsKLQotICAgICAgICAgICAgLy8gZWxlbWVudCBzZXR0ZXJzIHJlc3VsdCBmcm9tIGEgY29tcHV0YXRpb24KLSAgICAgICAgICAgIGlmIChlbHRQcm9wcy5sZW5ndGggPiAwKQotICAgICAgICAgICAgICAgIGFzc2lnbkphdmFFbGVtZW50U2V0dGVyTW9kZWwoZWx0UHJvcHMsIHNJbXBsLmdldENvbnRlbnRNb2RlbCgpKTsKLQotICAgICAgICAgICAgLy8gSGFuZGluZyBvdXQgamF2YSBuYW1lcyAtIHRoaXMgcGVybWl0cyB1cyB0byBhdm9pZCBjb2xsaXNpb25zLgotICAgICAgICAgICAgU2V0IHVzZWRQcm9wTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgICAgICAvLyBBc3NpZ24gbmFtZXMgaW4gdHdvIHBhc3NlczogZmlyc3QgaW5oZXJpdGVkIG5hbWVzLCB0aGVuIG90aGVycy4KLSAgICAgICAgICAgIGZvciAoYm9vbGVhbiBkb0luaGVyaXRlZCA9IHRydWU7IDsgZG9Jbmhlcml0ZWQgPSBmYWxzZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZWx0UHJvcHMubGVuZ3RoID4gMCkKLSAgICAgICAgICAgICAgICAgICAgYXNzaWduSmF2YVByb3BlcnR5TmFtZXModXNlZFByb3BOYW1lcywgZWx0UHJvcHMsIGJhc2VUeXBlLCBkb0luaGVyaXRlZCk7Ci0KLSAgICAgICAgICAgICAgICBhc3NpZ25KYXZhUHJvcGVydHlOYW1lcyh1c2VkUHJvcE5hbWVzLCBhdHRyUHJvcHMsIGJhc2VUeXBlLCBkb0luaGVyaXRlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZG9Jbmhlcml0ZWQgPT0gZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eVtdIGFsbHByb3BzID0gc0ltcGwuZ2V0UHJvcGVydGllcygpOwotCi0gICAgICAgICAgICAvLyBkZXRlcm1pbmUgd2hldGhlciBvcmRlciBpbnNlbnNpdGl2ZQotICAgICAgICAgICAgYm9vbGVhbiBpbnNlbnNpdGl2ZSA9IGlzUHJvcGVydHlNb2RlbE9yZGVySW5zZW5zaXRpdmUoYWxscHJvcHMpOwotCi0gICAgICAgICAgICAvLyBGaWxsIGluIHRoZSBqYXZhIHR5cGUgY29kZXMgbm93LgotICAgICAgICAgICAgLy8gVGhpcyBkZXBlbmRzIG9uIHJlY3Vyc2l2ZSB0eXBlIGluZm9ybWF0aW9uLCBzbyBpdCdzIGRvbmUgaW4gdHlwZWNoZWNraW5nCi0gICAgICAgICAgICBhc3NpZ25KYXZhVHlwZUNvZGVzKGFsbHByb3BzKTsKLQotICAgICAgICAgICAgc0ltcGwuc2V0T3JkZXJTZW5zaXRpdmUoIWluc2Vuc2l0aXZlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFzc2lnbiBqYXZhIHR5cGUgbmFtZXMgdG8gYW5vbnltb3VzIHR5cGVzCi0gICAgICAgIGFzc2lnbkphdmFBbm9ueW1vdXNUeXBlTmFtZXMoc0ltcGwpOwotCi0gICAgICAgIHNJbXBsLmZpbmlzaEphdmFpemluZygpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGFzc2lnbkphdmFBbm9ueW1vdXNUeXBlTmFtZXMoU2NoZW1hVHlwZUltcGwgb3V0ZXJUeXBlKQotICAgIHsKLSAgICAgICAgU2V0IHVzZWRUeXBlTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBTY2hlbWFUeXBlW10gYW5vbnltb3VzVHlwZXMgPSBvdXRlclR5cGUuZ2V0QW5vbnltb3VzVHlwZXMoKTsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotCi0gICAgICAgIC8vIEJlY2F1c2Ugd2UgZ2VuZXJhdGUgbmVzdGVkIGphdmEgaW50ZXJmYWNlcywgYW5kIG5lc3RlZAotICAgICAgICAvLyBpbnRlcmZhY2UgbmFtZXMgbXVzdCBub3QgYmUgdGhlIHNhbWUgYXMgYW4gYW5jZXN0b3IsIHVzZSB1cAotICAgICAgICAvLyB0aGUgYW5jZXN0b3JzCi0KLSAgICAgICAgZm9yICggU2NoZW1hVHlwZSBzY2FuT3V0ZXJUeXBlID0gb3V0ZXJUeXBlIDsKLSAgICAgICAgICAgICAgc2Nhbk91dGVyVHlwZSAhPSBudWxsIDsKLSAgICAgICAgICAgICAgc2Nhbk91dGVyVHlwZSA9IHNjYW5PdXRlclR5cGUuZ2V0T3V0ZXJUeXBlKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2VkVHlwZU5hbWVzLmFkZCggc2Nhbk91dGVyVHlwZS5nZXRTaG9ydEphdmFOYW1lKCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIFNjaGVtYVR5cGUgc2Nhbk91dGVyVHlwZSA9IG91dGVyVHlwZSA7Ci0gICAgICAgICAgICAgIHNjYW5PdXRlclR5cGUgIT0gbnVsbCA7Ci0gICAgICAgICAgICAgIHNjYW5PdXRlclR5cGUgPSBzY2FuT3V0ZXJUeXBlLmdldE91dGVyVHlwZSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgdXNlZFR5cGVOYW1lcy5hZGQoIHNjYW5PdXRlclR5cGUuZ2V0U2hvcnRKYXZhSW1wbE5hbWUoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYW5kIGJlY2F1c2UgdGhpbmdzIGFyZSBwcm9ibGVtYXRpYyBpZiBhbiBpbm5lciB0eXBlIG5hbWUKLSAgICAgICAgLy8gaXMgdGhlIHNhbWUgYXMgYSB0b3AtbGV2ZWwgcGFja2FnZSBuYW1lLCBhbHNvIGdldCByaWQgb2YgdGhhdAotICAgICAgICAvLyBjb2xsaXNpb24KLSAgICAgICAgdXNlZFR5cGVOYW1lcy5hZGQoZ2V0T3V0ZXJtb3N0UGFja2FnZShvdXRlclR5cGUuZ2V0RnVsbEphdmFOYW1lKCkpKTsKLQotICAgICAgICAvLyBhc3NpZ24gbmFtZXMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm9ueW1vdXNUeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZUltcGwgc0ltcGwgPSAoU2NoZW1hVHlwZUltcGwpYW5vbnltb3VzVHlwZXNbaV07Ci0gICAgICAgICAgICBpZiAoc0ltcGwgPT0gbnVsbCkgLy8gYWxyZWFkeSBoYW5kbGVkIGluIGZpcnN0IHBhc3MKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChzSW1wbC5pc1NraXBwZWRBbm9ueW1vdXNUeXBlKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYWxuYW1lID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBqYXZhbmFtZSA9IG51bGw7Ci0KLSAgICAgICAgICAgIFNjaGVtYUZpZWxkIGNvbnRhaW5lckZpZWxkID0gc0ltcGwuZ2V0Q29udGFpbmVyRmllbGQoKTsKLSAgICAgICAgICAgIGlmIChjb250YWluZXJGaWVsZCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gc0ltcGwuZ2V0Q29udGFpbmVyRmllbGQoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgbG9jYWxuYW1lID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgamF2YW5hbWUgPSBzdGF0ZS5nZXRKYXZhbmFtZShzSW1wbC5nZXRDb250YWluZXJGaWVsZCgpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gbm90IGRlZmluZWQgaW5zaWRlIGFuIEVsdCBvciBBdHRyOiBtdXN0IGJlIGEgbmVzdGVkIHNpbXBsZSB0eXBlCi0gICAgICAgICAgICAgICAgc3dpdGNoIChzSW1wbC5nZXRPdXRlclR5cGUoKS5nZXRTaW1wbGVWYXJpZXR5KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhbmFtZSA9ICJNZW1iZXIiOyBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhbmFtZSA9ICJJdGVtIjsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5BVE9NSUM6Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpIDogIldlaXJkIHR5cGUgIiArIHNJbXBsLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhbmFtZSA9ICJCYXNlIjsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc0ltcGwuc2V0U2hvcnRKYXZhTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgcGlja0lubmVySmF2YUNsYXNzTmFtZSh1c2VkVHlwZU5hbWVzLCBsb2NhbG5hbWUsIGphdmFuYW1lKSk7Ci0gICAgICAgICAgICBzSW1wbC5zZXRTaG9ydEphdmFJbXBsTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgcGlja0lubmVySmF2YUltcGxOYW1lKHVzZWRUeXBlTmFtZXMsIGxvY2FsbmFtZSwgamF2YW5hbWUgPT0gbnVsbCA/IG51bGwgOiBqYXZhbmFtZSArICJJbXBsIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBjb21wdXRlIHRoZSBzZXR0ZXIgbW9kZWwuCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgYWxsIFFOYW1lcyBvZiBlbGVtZW50cyB0aGF0IGNvdWxkIHBvc3NpYmx5IGJlCi0gICAgICogY29udGFpbmVkIGluIHRoZSBnaXZlbiBjb250ZW50TW9kZWwuIFRoZSBzdGF0ZSB2YXJpYWJsZSBpcyB1c2VkCi0gICAgICogdG8gcmVjb3JkIHRoZSByZXN1bHRzLCBzbyB0aGF0IGlmIHRoZXkgYXJlIG5lZWRlZCBhZ2FpbiBsYXRlciwKLSAgICAgKiB0aGV5IGRvIG5vdCBuZWVkIHRvIGJlIHJlY29tcHV0ZWQuCi0gICAgICovCi0gICAgc3RhdGljIFFOYW1lU2V0IGNvbXB1dGVBbGxDb250YWluZWRFbGVtZW50cyhTY2hlbWFQYXJ0aWNsZSBjb250ZW50TW9kZWwsIE1hcCBzdGF0ZSkKLSAgICB7Ci0gICAgICAgIC8vIFJlbWVtYmVyIHByZXZpb3VzbHkgY29tcHV0ZWQgcmVzdWx0cyB0byBhdm9pZCBjb21wbGV4aXR5IGV4cGxvc2lvbgotICAgICAgICBRTmFtZVNldCByZXN1bHQgPSAoUU5hbWVTZXQpc3RhdGUuZ2V0KGNvbnRlbnRNb2RlbCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAgICAgUU5hbWVTZXRCdWlsZGVyIGJ1aWxkZXI7Ci0KLSAgICAgICAgc3dpdGNoIChjb250ZW50TW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFFOYW1lU2V0QnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudE1vZGVsLmNvdW50T2ZQYXJ0aWNsZUNoaWxkKCk7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQWxsKGNvbXB1dGVBbGxDb250YWluZWRFbGVtZW50cyhjb250ZW50TW9kZWwuZ2V0UGFydGljbGVDaGlsZChpKSwgc3RhdGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gYnVpbGRlci50b1FOYW1lU2V0KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29udGVudE1vZGVsLmdldFdpbGRjYXJkU2V0KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBRTmFtZVNldC5zaW5nbGV0b24oY29udGVudE1vZGVsLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdGUucHV0KGNvbnRlbnRNb2RlbCwgcmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIGNvbXB1dGUgc2V0dGVyIG1vZGVsLgotICAgICAqCi0gICAgICogUmV0dXJucyB0aGUgUU5hbWVTZXQgb2YgYWxsIGVsZW1lbnRzIHRoYXQgY2FuIHBvc3NpYmx5IGNvbWUgYmVmb3JlIGFuCi0gICAgICogZWxlbWVudCB3aG9zZSBuYW1lIGlzIGdpdmVuIGJ5IHRoZSB0YXJnZXQgaW4gYSB2YWxpZCBpbnN0YW5jZSBvZiB0aGUKLSAgICAgKiBjb250ZW50TW9kZWwuICBXaGVuIGFwcGVuZGluZyBhbiBlbGVtZW50LCBpdCBjb21lcyBiZWZvcmUgdGhlIGZpcnN0Ci0gICAgICogb25lIHRoYXQgaXMgbm90IGluIHRoaXMgc2V0LgotICAgICAqLwotICAgIHN0YXRpYyBRTmFtZVNldCBjb21wdXRlTm9uZGVsaW1pdGluZ0VsZW1lbnRzKFFOYW1lIHRhcmdldCwgU2NoZW1hUGFydGljbGUgY29udGVudE1vZGVsLCBNYXAgc3RhdGUpCi0gICAgewotICAgICAgICBRTmFtZVNldCBhbGxDb250ZW50cyA9IGNvbXB1dGVBbGxDb250YWluZWRFbGVtZW50cyhjb250ZW50TW9kZWwsIHN0YXRlKTsKLSAgICAgICAgaWYgKCFhbGxDb250ZW50cy5jb250YWlucyh0YXJnZXQpKQotICAgICAgICAgICAgcmV0dXJuIFFOYW1lU2V0LkVNUFRZOwotCi0gICAgICAgIC8vIElmIGl0ZXJhdGVkLCB0aGVuIGFsbCBjb250ZW50cyBhcmUgZGVsaW1pdGluZy4KLSAgICAgICAgaWYgKGNvbnRlbnRNb2RlbC5nZXRNYXhPY2N1cnMoKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICBjb250ZW50TW9kZWwuZ2V0TWF4T2NjdXJzKCkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA+IDApCi0gICAgICAgICAgICByZXR1cm4gYWxsQ29udGVudHM7Ci0KLSAgICAgICAgUU5hbWVTZXRCdWlsZGVyIGJ1aWxkZXI7Ci0KLSAgICAgICAgc3dpdGNoIChjb250ZW50TW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gYWxsQ29udGVudHM7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFFOYW1lU2V0LnNpbmdsZXRvbih0YXJnZXQpOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFFOYW1lU2V0QnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudE1vZGVsLmNvdW50T2ZQYXJ0aWNsZUNoaWxkKCk7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lU2V0IGNoaWxkQ29udGVudHMgPSBjb21wdXRlQWxsQ29udGFpbmVkRWxlbWVudHMoY29udGVudE1vZGVsLmdldFBhcnRpY2xlQ2hpbGQoaSksIHN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkQ29udGVudHMuY29udGFpbnModGFyZ2V0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQWxsKGNvbXB1dGVOb25kZWxpbWl0aW5nRWxlbWVudHModGFyZ2V0LCBjb250ZW50TW9kZWwuZ2V0UGFydGljbGVDaGlsZChpKSwgc3RhdGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9RTmFtZVNldCgpOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzZWVuVGFyZ2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNvbnRlbnRNb2RlbC5jb3VudE9mUGFydGljbGVDaGlsZCgpOyBpID4gMDsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgICAgICAgICBRTmFtZVNldCBjaGlsZENvbnRlbnRzID0gY29tcHV0ZUFsbENvbnRhaW5lZEVsZW1lbnRzKGNvbnRlbnRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkKGkpLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWVuVGFyZ2V0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEFsbChjaGlsZENvbnRlbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGlsZENvbnRlbnRzLmNvbnRhaW5zKHRhcmdldCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQWxsKGNvbXB1dGVBbGxDb250YWluZWRFbGVtZW50cyhjb250ZW50TW9kZWwuZ2V0UGFydGljbGVDaGlsZChpKSwgc3RhdGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5UYXJnZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvUU5hbWVTZXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGFzc2lnbkphdmFFbGVtZW50U2V0dGVyTW9kZWwoU2NoZW1hUHJvcGVydHlbXSBlbHRQcm9wcywgU2NoZW1hUGFydGljbGUgY29udGVudE1vZGVsKQotICAgIHsKLSAgICAgICAgLy8gVG8gY29tcHV0ZSB0aGUgZWxlbWVudCBzZXR0ZXIgbW9kZWwsIHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUKLSAgICAgICAgLy8gZGVsaW1pdGluZyBlbGVtZW50cyBmb3IgZWFjaCBlbGVtZW50LgotCi0gICAgICAgIE1hcCBzdGF0ZSA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIFFOYW1lU2V0IGFsbENvbnRlbnRzID0gY29tcHV0ZUFsbENvbnRhaW5lZEVsZW1lbnRzKGNvbnRlbnRNb2RlbCwgc3RhdGUpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWx0UHJvcHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5SW1wbCBzSW1wbCA9IChTY2hlbWFQcm9wZXJ0eUltcGwpZWx0UHJvcHNbaV07Ci0gICAgICAgICAgICBRTmFtZVNldCBuZGUgPSBjb21wdXRlTm9uZGVsaW1pdGluZ0VsZW1lbnRzKHNJbXBsLmdldE5hbWUoKSwgY29udGVudE1vZGVsLCBzdGF0ZSk7Ci0gICAgICAgICAgICBRTmFtZVNldEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoYWxsQ29udGVudHMpOwotICAgICAgICAgICAgYnVpbGRlci5yZW1vdmVBbGwobmRlKTsKLSAgICAgICAgICAgIHNJbXBsLnNldEphdmFTZXR0ZXJEZWxpbWl0ZXIoYnVpbGRlci50b1FOYW1lU2V0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgYXNzaWduSmF2YVByb3BlcnR5TmFtZXMoU2V0IHVzZWROYW1lcywgU2NoZW1hUHJvcGVydHlbXSBwcm9wcywgU2NoZW1hVHlwZSBiYXNlVHlwZSwgYm9vbGVhbiBkb0luaGVyaXRlZCkKLSAgICB7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLQotICAgICAgICAvLyB0d28gcGFzc2VzOiBmaXJzdCBkZWFsIHdpdGggaW5oZXJpdGVkIHByb3BlcnRpZXMsIHRoZW4gd2l0aCBuZXcgb25lcy4KLSAgICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgd2UgbWF0Y2ggdXAgd2l0aCBiYXNlIGNsYXNzIGRlZmluaXRpb25zIGNsZWFubHkKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eUltcGwgc0ltcGwgPSAoU2NoZW1hUHJvcGVydHlJbXBsKXByb3BzW2ldOwotCi0gICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBiYXNlUHJvcCA9Ci0gICAgICAgICAgICAgICAoc0ltcGwuaXNBdHRyaWJ1dGUoKSA/Ci0gICAgICAgICAgICAgICAgICAgIGJhc2VUeXBlLmdldEF0dHJpYnV0ZVByb3BlcnR5KHNJbXBsLmdldE5hbWUoKSkgOgotICAgICAgICAgICAgICAgICAgICBiYXNlVHlwZS5nZXRFbGVtZW50UHJvcGVydHkoc0ltcGwuZ2V0TmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIGlmICgoYmFzZVByb3AgIT0gbnVsbCkgIT0gZG9Jbmhlcml0ZWQpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIFFOYW1lIHByb3BRTmFtZSA9IHNJbXBsLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgU3RyaW5nIHRoZU5hbWU7Ci0KLSAgICAgICAgICAgIGlmIChiYXNlUHJvcCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRoZU5hbWUgPSBwaWNrSmF2YVByb3BlcnR5TmFtZSh1c2VkTmFtZXMsIHByb3BRTmFtZS5nZXRMb2NhbFBhcnQoKSwgc3RhdGUuZ2V0SmF2YW5hbWUocHJvcFFOYW1lKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhlTmFtZSA9IGJhc2VQcm9wLmdldEphdmFQcm9wZXJ0eU5hbWUoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQoIXVzZWROYW1lcy5jb250YWlucyh0aGVOYW1lKSk7Ci0gICAgICAgICAgICAgICAgdXNlZE5hbWVzLmFkZCh0aGVOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc0ltcGwuc2V0SmF2YVByb3BlcnR5TmFtZSh0aGVOYW1lKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBpc0FycmF5ID0gKHNJbXBsLmdldE1heE9jY3VycygpID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICBzSW1wbC5nZXRNYXhPY2N1cnMoKS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID4gMCk7Ci0gICAgICAgICAgICBib29sZWFuIGlzU2luZ2xldG9uID0gIWlzQXJyYXkgJiYgKHNJbXBsLmdldE1heE9jY3VycygpLnNpZ251bSgpID4gMCk7Ci0gICAgICAgICAgICBib29sZWFuIGlzT3B0aW9uID0gaXNTaW5nbGV0b24gJiYgKHNJbXBsLmdldE1pbk9jY3VycygpLnNpZ251bSgpID09IDApOwotICAgICAgICAgICAgU2NoZW1hVHlwZSBqYXZhQmFzZWRPblR5cGUgPSBzSW1wbC5nZXRUeXBlKCk7Ci0KLSAgICAgICAgICAgIGlmIChiYXNlUHJvcCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChiYXNlUHJvcC5leHRlbmRzSmF2YUFycmF5KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpc1NpbmdsZXRvbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpc09wdGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpc0FycmF5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGJhc2VQcm9wLmV4dGVuZHNKYXZhU2luZ2xldG9uKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpc1NpbmdsZXRvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChiYXNlUHJvcC5leHRlbmRzSmF2YU9wdGlvbigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaXNPcHRpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhQmFzZWRPblR5cGUgPSBiYXNlUHJvcC5qYXZhQmFzZWRPblR5cGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc0ltcGwuc2V0RXh0ZW5kc0phdmEoamF2YUJhc2VkT25UeXBlLmdldFJlZigpLCBpc1NpbmdsZXRvbiwgaXNPcHRpb24sIGlzQXJyYXkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBhc3NpZ25KYXZhVHlwZUNvZGVzKFNjaGVtYVByb3BlcnR5W10gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlJbXBsIHNJbXBsID0gKFNjaGVtYVByb3BlcnR5SW1wbClwcm9wZXJ0aWVzW2ldOwotICAgICAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSA9IHNJbXBsLmphdmFCYXNlZE9uVHlwZSgpOwotICAgICAgICAgICAgc0ltcGwuc2V0SmF2YVR5cGVDb2RlKGphdmFUeXBlQ29kZUZvclR5cGUoc1R5cGUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgamF2YVR5cGVDb2RlSW5Db21tb24oU2NoZW1hVHlwZVtdIHR5cGVzKQotICAgIHsKLSAgICAgICAgaWYgKHR5cGVzID09IG51bGwgfHwgdHlwZXMubGVuZ3RoID09IDApCi0gICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVDsKLQotICAgICAgICBpbnQgY29kZSA9IGphdmFUeXBlQ29kZUZvclR5cGUodHlwZXNbMF0pOwotICAgICAgICBpZiAoY29kZSA9PSBTY2hlbWFQcm9wZXJ0eS5KQVZBX09CSkVDVCkKLSAgICAgICAgICAgIHJldHVybiBjb2RlOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZiBhbnkgdHdvIGFyZSBkaWZmZXJlbnQsIHRoZSBhbnN3ZXIgaXMgamF2YS5sYW5nLk9iamVjdAotICAgICAgICAgICAgaWYgKGNvZGUgIT0gamF2YVR5cGVDb2RlRm9yVHlwZSh0eXBlc1tpXSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfT0JKRUNUOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb2RlOwotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgamF2YVR5cGVDb2RlRm9yVHlwZShTY2hlbWFUeXBlIHNUeXBlKQotICAgIHsKLSAgICAgICAgaWYgKCFzVHlwZS5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUOwotCi0gICAgICAgIGlmIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5VTklPTikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiBmaW5kIGFuIGludGVyZXN0aW5nIGNvbW1vbiBiYXNlIHR5cGUsIGUuZy4sIGZvciBzdHJpbmcgZW51bXMKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgYmFzZVR5cGUgPSBzVHlwZS5nZXRVbmlvbkNvbW1vbkJhc2VUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiAhYmFzZVR5cGUuaXNVUlR5cGUoKSkKLSAgICAgICAgICAgICAgICBzVHlwZSA9IGJhc2VUeXBlOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBqYXZhVHlwZUNvZGVJbkNvbW1vbihzVHlwZS5nZXRVbmlvbkNvbnN0aXR1ZW50VHlwZXMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCkKLSAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xJU1Q7Ci0KLSAgICAgICAgaWYgKHNUeXBlLmlzVVJUeXBlKCkpCi0gICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVDsKLQotICAgICAgICBzd2l0Y2ggKHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgotICAgICAgICAgICAgICAgIC8vIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUOwotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NUUklORzsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JPT0xFQU47Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURV9BUlJBWTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEVfQVJSQVk7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSToKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9TVFJJTkc7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfUU5BTUU7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LlhNTF9PQkpFQ1Q7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfRkxPQVQ7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RPVUJMRTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgotICAgICAgICAgICAgICAgIHN3aXRjaCAoc1R5cGUuZ2V0RGVjaW1hbFNpemUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0JZVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9TSE9SVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NIT1JUOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9JTlQ7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0xPTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9MT05HOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19JTlRFR0VSOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfREVDSU1BTDoKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19ERUNJTUFMOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgaWYgKGlzU3RyaW5nVHlwZShzVHlwZS5nZXRCYXNlRW51bVR5cGUoKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0VOVU07Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfU1RSSU5HOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEVVJBVElPTjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICAgICAgLy8gcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfREFURTsgLy8gY29udmVydGVkIHRvIGNhbGVuZGFyCi0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKLSAgICAgICAgICAgICAgICAvLyByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9HREFURTsgLy8gY29udmVydGVkIHRvIGNhbGVuZGFyIChKQVgtQikKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9DQUxFTkRBUjsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpIDogInVucmVjb2duaXplZCBjb2RlICIgKyBzVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5yZWNvZ25pemVkIGNvZGUgIiArIHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSArICIgb2YgIiArIHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gaXNQcm9wZXJ0eU1vZGVsT3JkZXJJbnNlbnNpdGl2ZShTY2hlbWFQcm9wZXJ0eVtdIHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSBwcm9wZXJ0aWVzW2ldOwotICAgICAgICAgICAgaWYgKHByb3AuaGFzTmlsbGFibGUoKSA9PSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBpZiAocHJvcC5oYXNEZWZhdWx0KCkgPT0gU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKHByb3AuaGFzRml4ZWQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBpZiAocHJvcC5oYXNEZWZhdWx0KCkgIT0gU2NoZW1hUHJvcGVydHkuTkVWRVIgJiYKLSAgICAgICAgICAgICAgICBwcm9wLmdldERlZmF1bHRUZXh0KCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gcHJvdGVjdFJlc2VydmVkR2xvYmFsQ2xhc3NOYW1lcyhTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIGludCBpID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICBTdHJpbmcgbGFzdFNlZ21lbnQgPSBuYW1lLnN1YnN0cmluZyhpICsgMSk7Ci0gICAgICAgIGlmIChsYXN0U2VnbWVudC5lbmRzV2l0aCgiRG9jdW1lbnQiKSAmJiAhbGFzdFNlZ21lbnQuZXF1YWxzKCJEb2N1bWVudCIpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBwcm90ZWN0UmVzZXJ2ZWRJbm5lckNsYXNzTmFtZXMoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKG5hbWUuZXF1YWxzKCJFbnVtIikgfHwgbmFtZS5lcXVhbHMoIkZhY3RvcnkiKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZ1tdIFBST1RFQ1RFRF9QUk9QRVJUSUVTID0gewotICAgICAgICAiU3RyaW5nVmFsdWUiLAotICAgICAgICAiQm9vbGVhblZhbHVlIiwKLSAgICAgICAgIkJ5dGVWYWx1ZSIsCi0gICAgICAgICJTaG9ydFZhbHVlIiwKLSAgICAgICAgIkludFZhbHVlIiwKLSAgICAgICAgIkxvbmdWYWx1ZSIsCi0gICAgICAgICJCaWdJbnRlZ2VyVmFsdWUiLAotICAgICAgICAiQmlnRGVjaW1hbFZhbHVlIiwKLSAgICAgICAgIkZsb2F0VmFsdWUiLAotICAgICAgICAiRG91YmxlVmFsdWUiLAotICAgICAgICAiQnl0ZUFycmF5VmFsdWUiLAotICAgICAgICAiRW51bVZhbHVlIiwKLSAgICAgICAgIkNhbGVuZGFyVmFsdWUiLAotICAgICAgICAiRGF0ZVZhbHVlIiwKLSAgICAgICAgIkdEYXRlVmFsdWUiLAotICAgICAgICAiR0R1cmF0aW9uVmFsdWUiLAotICAgICAgICAiUU5hbWVWYWx1ZSIsCi0gICAgICAgICJMaXN0VmFsdWUiLAotICAgICAgICAiT2JqZWN0VmFsdWUiLAotICAgICAgICAiQ2xhc3MiLAotICAgIH07Ci0gICAgc3RhdGljIFNldCBQUk9URUNURURfUFJPUEVSVElFU19TRVQgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KFBST1RFQ1RFRF9QUk9QRVJUSUVTKSk7Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBwcm90ZWN0UmVzZXJ2ZWRQcm9wZXJ0eU5hbWVzKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFBST1RFQ1RFRF9QUk9QRVJUSUVTX1NFVC5jb250YWlucyhuYW1lKSB8fAotICAgICAgICAgICAgKG5hbWUuZW5kc1dpdGgoIkFycmF5IikgJiYgIW5hbWUuZXF1YWxzKCJBcnJheSIpKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHBpY2tGdWxsSmF2YUNsYXNzTmFtZShTZXQgdXNlZE5hbWVzLCBRTmFtZSBxTmFtZSwgU3RyaW5nIGNvbmZpZ25hbWUsIGJvb2xlYW4gaXNEb2N1bWVudCwgYm9vbGVhbiBpc0F0dHJUeXBlKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGJhc2U7Ci0gICAgICAgIGJvb2xlYW4gcHJvdGVjdDsKLQotICAgICAgICBpZiAoY29uZmlnbmFtZSAhPSBudWxsICYmIGNvbmZpZ25hbWUuaW5kZXhPZignLicpID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGEgY29uZmlnbmFtZSB3aXRoIGRvdHMgZGVmaW5lcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGphdmEgY2xhc3MgbmFtZQotICAgICAgICAgICAgYmFzZSA9IGNvbmZpZ25hbWU7Ci0gICAgICAgICAgICBwcm90ZWN0ID0gcHJvdGVjdFJlc2VydmVkR2xvYmFsQ2xhc3NOYW1lcyhiYXNlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBxTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgYmFzZSA9IE5hbWVVdGlsLmdldENsYXNzTmFtZUZyb21RTmFtZShxTmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgbWFwcGluZyBmcm9tIG5hbWVzcGFjZSBVUkkgdG8gSmF2YSBwYWNrYWdlCi0gICAgICAgICAgICAvLyBuYW1lLiBJZiBzbywgYXBwbHkgdGhlIG1hcHBlZCBwYWNrYWdlIHByZWZpeCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICAgICAgICAgICAvLyB0aGUgYmFzZSBuYW1lCi0KLSAgICAgICAgICAgIFN0cmluZyBwa2dQcmVmaXggPSBzdGF0ZS5nZXRQYWNrYWdlT3ZlcnJpZGUodXJpKTsKLQotICAgICAgICAgICAgaWYgKHBrZ1ByZWZpeCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEZvcm0gdGhlIG5ldyBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmcm9tIHRoZSBuZXcgcGFja2FnZSBuYW1lCi0gICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBvbGQgY2xhc3MgbmFtZQotICAgICAgICAgICAgICAgIGJhc2UgPSBwa2dQcmVmaXggKyAiLiIgKyBiYXNlLnN1YnN0cmluZyhiYXNlLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEgcHJlZml4Li4uCi0gICAgICAgICAgICBTdHJpbmcgamF2YVByZWZpeCA9IHN0YXRlLmdldEphdmFQcmVmaXgodXJpKTsKLSAgICAgICAgICAgIGlmIChqYXZhUHJlZml4ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgYmFzZSA9IGJhc2Uuc3Vic3RyaW5nKDAsIGJhc2UubGFzdEluZGV4T2YoJy4nKSArIDEpICsgamF2YVByZWZpeCArIGJhc2Uuc3Vic3RyaW5nKGJhc2UubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCi0gICAgICAgICAgICAvLyBhIGNvbmZpZ25hbWUgd2l0aG91dCBkb3RzIG1heSBvdmVycmlkZSB0aGUgc2hvcnRuYW1lIHBhcnQuCi0gICAgICAgICAgICBpZiAoY29uZmlnbmFtZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJhc2UgPSBiYXNlLnN1YnN0cmluZygwLCBiYXNlLmxhc3RJbmRleE9mKCcuJykgKyAxKSArIGNvbmZpZ25hbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByb3RlY3QgPSBwcm90ZWN0UmVzZXJ2ZWRHbG9iYWxDbGFzc05hbWVzKGJhc2UpOwotICAgICAgICAgICAgaWYgKGNvbmZpZ25hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQgc3BlY2lhbCBzdWZmaXgKLSAgICAgICAgICAgICAgICBpZiAoaXNEb2N1bWVudCkKLSAgICAgICAgICAgICAgICAgICAgYmFzZSA9IGJhc2UgKyAiRG9jdW1lbnQiOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzQXR0clR5cGUpCi0gICAgICAgICAgICAgICAgICAgIGJhc2UgPSBiYXNlICsgIkF0dHJpYnV0ZSI7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgY29uZmlndXJlZCBzdWZmaXgKLSAgICAgICAgICAgICAgICBTdHJpbmcgamF2YVN1ZmZpeCA9IHN0YXRlLmdldEphdmFTdWZmaXgodXJpKTsKLSAgICAgICAgICAgICAgICBpZiAoamF2YVN1ZmZpeCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBiYXNlID0gYmFzZSArIGphdmFTdWZmaXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgb3V0ZXJtb3N0UGtnID0gZ2V0T3V0ZXJtb3N0UGFja2FnZShiYXNlKTsKLQotICAgICAgICBpbnQgaW5kZXggPSAxOwotICAgICAgICBTdHJpbmcgdW5pcU5hbWU7Ci0gICAgICAgIGlmIChwcm90ZWN0KQotICAgICAgICAgICAgdW5pcU5hbWUgPSBiYXNlICsgaW5kZXg7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHVuaXFOYW1lID0gYmFzZTsKLSAgICAgICAgd2hpbGUgKHVzZWROYW1lcy5jb250YWlucyh1bmlxTmFtZS50b0xvd2VyQ2FzZSgpKSB8fCB1bmlxTmFtZS5lcXVhbHMob3V0ZXJtb3N0UGtnKSkKLSAgICAgICAgewotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIHVuaXFOYW1lID0gYmFzZSArIGluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgdXNlZE5hbWVzLmFkZCh1bmlxTmFtZS50b0xvd2VyQ2FzZSgpKTsKLQotICAgICAgICByZXR1cm4gdW5pcU5hbWU7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBnZXRPdXRlcm1vc3RQYWNrYWdlKFN0cmluZyBmcWNuKQotICAgIHsKLSAgICAgICAgaWYgKGZxY24gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAiIjsKLQotICAgICAgICAvLyByZW1vdmUgY2xhc3MgbmFtZQotICAgICAgICBpbnQgbGFzdGRvdCA9IGZxY24uaW5kZXhPZignLicpOwotICAgICAgICBpZiAobGFzdGRvdCA8IDApCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgICAgLy8gcmVtb3ZlIG91dGVyIHBhY2thZ2UgbmFtZXMKLSAgICAgICAgcmV0dXJuIGZxY24uc3Vic3RyaW5nKDAsIGxhc3Rkb3QpOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgcGlja0Z1bGxKYXZhSW1wbE5hbWUoU2V0IHVzZWROYW1lcywgU3RyaW5nIGludGZOYW1lKQotICAgIHsKLSAgICAgICAgLy8gU3RyaXAgb2ZmIHRoZSBwYWNrYWdlIGZyb20gdGhlIGNsYXNzIG5hbWUgc28gd2UgY2FuIHJlcGxhY2UgaXQKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGludGZOYW1lOwotICAgICAgICBTdHJpbmcgcGtnTmFtZSA9IG51bGw7Ci0gICAgICAgIGludCBpbmRleCA9IGludGZOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBjbGFzc05hbWUgPSBpbnRmTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgICAgIHBrZ05hbWUgPSBpbnRmTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRm9ybSB0aGUgbmV3IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZyb20gdGhlIG5ldyBwYWNrYWdlIG5hbWUKLSAgICAgICAgLy8gYW5kIHRoZSBvbGQgY2xhc3MgbmFtZQotICAgICAgICBTdHJpbmcgYmFzZSA9IHBrZ05hbWUgKyAiLmltcGwuIiArIGNsYXNzTmFtZSArICJJbXBsIjsKLQotICAgICAgICBpbmRleCA9IDE7Ci0gICAgICAgIFN0cmluZyB1bmlxTmFtZSA9IGJhc2U7Ci0gICAgICAgIHdoaWxlICh1c2VkTmFtZXMuY29udGFpbnModW5pcU5hbWUudG9Mb3dlckNhc2UoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB1bmlxTmFtZSA9IGJhc2UgKyBpbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHVzZWROYW1lcy5hZGQodW5pcU5hbWUudG9Mb3dlckNhc2UoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHVuaXFOYW1lOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgcGlja0phdmFQcm9wZXJ0eU5hbWUoU2V0IHVzZWROYW1lcywgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIGphdmFOYW1lKQotICAgIHsKLSAgICAgICAgaWYgKGphdmFOYW1lID09IG51bGwpCi0gICAgICAgICAgICBqYXZhTmFtZSA9IE5hbWVVdGlsLnVwcGVyQ2FtZWxDYXNlKGxvY2FsTmFtZSk7Ci0gICAgICAgIGJvb2xlYW4gcHJvdGVjdCA9IHByb3RlY3RSZXNlcnZlZFByb3BlcnR5TmFtZXMoamF2YU5hbWUpOwotICAgICAgICBTdHJpbmcgdW5pcU5hbWU7Ci0gICAgICAgIGludCBpbmRleCA9IDE7Ci0gICAgICAgIGlmIChwcm90ZWN0KQotICAgICAgICAgICAgdW5pcU5hbWUgPSBqYXZhTmFtZSArIGluZGV4OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB1bmlxTmFtZSA9IGphdmFOYW1lOwotICAgICAgICB3aGlsZSAodXNlZE5hbWVzLmNvbnRhaW5zKHVuaXFOYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIHVuaXFOYW1lID0gamF2YU5hbWUgKyBpbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHVzZWROYW1lcy5hZGQodW5pcU5hbWUpOwotCi0gICAgICAgIHJldHVybiB1bmlxTmFtZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHBpY2tJbm5lckphdmFDbGFzc05hbWUoU2V0IHVzZWROYW1lcywgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIGphdmFOYW1lKQotICAgIHsKLSAgICAgICAgaWYgKGphdmFOYW1lID09IG51bGwpCi0gICAgICAgICAgICBqYXZhTmFtZSA9IE5hbWVVdGlsLnVwcGVyQ2FtZWxDYXNlKGxvY2FsTmFtZSk7Ci0gICAgICAgIGJvb2xlYW4gcHJvdGVjdCA9IHByb3RlY3RSZXNlcnZlZElubmVyQ2xhc3NOYW1lcyhqYXZhTmFtZSk7Ci0gICAgICAgIFN0cmluZyB1bmlxTmFtZTsKLSAgICAgICAgaW50IGluZGV4ID0gMTsKLSAgICAgICAgaWYgKHByb3RlY3QpCi0gICAgICAgICAgICB1bmlxTmFtZSA9IGphdmFOYW1lICsgaW5kZXg7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHVuaXFOYW1lID0gamF2YU5hbWU7Ci0gICAgICAgIHdoaWxlICh1c2VkTmFtZXMuY29udGFpbnModW5pcU5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgdW5pcU5hbWUgPSBqYXZhTmFtZSArIGluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgdXNlZE5hbWVzLmFkZCh1bmlxTmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIHVuaXFOYW1lOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgcGlja0lubmVySmF2YUltcGxOYW1lKFNldCB1c2VkTmFtZXMsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBqYXZhTmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChqYXZhTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgamF2YU5hbWUgPSBOYW1lVXRpbC51cHBlckNhbWVsQ2FzZShsb2NhbE5hbWUpICsgIkltcGwiOwotICAgICAgICBTdHJpbmcgdW5pcU5hbWUgPSBqYXZhTmFtZTsKLSAgICAgICAgaW50IGluZGV4ID0gMTsKLSAgICAgICAgd2hpbGUgKHVzZWROYW1lcy5jb250YWlucyh1bmlxTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB1bmlxTmFtZSA9IGphdmFOYW1lICsgaW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICB1c2VkTmFtZXMuYWRkKHVuaXFOYW1lKTsKLQotICAgICAgICByZXR1cm4gdW5pcU5hbWU7Ci0gICAgfQotCi0gICAgc3RhdGljIFFOYW1lIGZpbmRUb3BOYW1lKFNjaGVtYVR5cGUgc1R5cGUpCi0gICAgewotICAgICAgICBpZiAoc1R5cGUuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gc1R5cGUuZ2V0TmFtZSgpOwotCi0gICAgICAgIGlmIChzVHlwZS5pc0RvY3VtZW50VHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBIGRvY3VtZW50IHR5cGUgbXVzdCBoYXZlIGEgY29udGVudCBtb2RlbCBjb25zaXN0aW5nIG9mIGEgc2luZ2xlIGVsdAotICAgICAgICAgICAgaWYgKHNUeXBlLmdldENvbnRlbnRNb2RlbCgpID09IG51bGwgfHwgc1R5cGUuZ2V0Q29udGVudE1vZGVsKCkuZ2V0UGFydGljbGVUeXBlKCkgIT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICByZXR1cm4gKHNUeXBlLmdldERvY3VtZW50RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc1R5cGUuaXNBdHRyaWJ1dGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzVHlwZS5nZXRBdHRyaWJ1dGVNb2RlbCgpID09IG51bGwgfHwgc1R5cGUuZ2V0QXR0cmlidXRlTW9kZWwoKS5nZXRBdHRyaWJ1dGVzKCkubGVuZ3RoICE9IDEpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgcmV0dXJuIHNUeXBlLmdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFGaWVsZCBzRWx0ID0gc1R5cGUuZ2V0Q29udGFpbmVyRmllbGQoKTsKLSAgICAgICAgYXNzZXJ0KHNFbHQgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydChzVHlwZS5nZXRPdXRlclR5cGUoKSA9PSBudWxsKTsKLSAgICAgICAgcmV0dXJuIHNFbHQuZ2V0TmFtZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1Jlc29sdmVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNiMzFiMC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQYXJ0aWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuVG9wTGV2ZWxFbGVtZW50OwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuVG9wTGV2ZWxBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TaW1wbGVUeXBlOwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuQXR0cmlidXRlOwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuRWxlbWVudDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLktleXJlZkRvY3VtZW50LktleXJlZjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgU3RzY1Jlc29sdmVyCi17Ci0gICAgLyoqCi0gICAgICogRG9lcyBhIHRvcG8gd2FsayBvZiBhbGwgdGhlIHR5cGVzIHRvIHJlc29sdmUgdGhlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZUFsbCgpCi0gICAgewotICAgICAgICAvLyByZXNvbHZlIHRyZWUgb2YgdHlwZXMKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotCi0gICAgICAgIFNjaGVtYVR5cGVbXSBkb2N1bWVudFR5cGVzID0gc3RhdGUuZG9jdW1lbnRUeXBlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBkb2N1bWVudFR5cGVzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgIHJlc29sdmVTdWJzdGl0dXRpb25Hcm91cCgoU2NoZW1hVHlwZUltcGwpZG9jdW1lbnRUeXBlc1tpXSk7Ci0KLSAgICAgICAgTGlzdCBhbGxTZWVuVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5kb2N1bWVudFR5cGVzKCkpKTsKLSAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0YXRlLmF0dHJpYnV0ZVR5cGVzKCkpKTsKLSAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0YXRlLnJlZGVmaW5lZEdsb2JhbFR5cGVzKCkpKTsKLSAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0YXRlLmdsb2JhbFR5cGVzKCkpKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbFNlZW5UeXBlcy5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZSBnVHlwZSA9IChTY2hlbWFUeXBlKWFsbFNlZW5UeXBlcy5nZXQoaSk7Ci0gICAgICAgICAgICByZXNvbHZlVHlwZSgoU2NoZW1hVHlwZUltcGwpZ1R5cGUpOwotICAgICAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGdUeXBlLmdldEFub255bW91c1R5cGVzKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlc29sdmUgYWxsIGtleXJlZiByZWZzCi0gICAgICAgIHJlc29sdmVJZGVudGl0eUNvbnN0cmFpbnRzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlc29sdmVUeXBlKFNjaGVtYVR5cGVJbXBsIHNJbXBsKQotICAgIHsKLSAgICAgICAgaWYgKHNJbXBsLmlzUmVzb2x2ZWQoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoc0ltcGwuaXNSZXNvbHZpbmcoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJDeWNsaWMgZGVwZW5kZW5jeSBlcnJvciIsIFhtbEVycm9yQ29udGV4dC5DWUNMSUNfREVQRU5ERU5DWSwgc0ltcGwuZ2V0UGFyc2VPYmplY3QoKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGN5Y2xpYyBkZXBlbmRlbmN5IGVycm9yCi0gICAgICAgIH0KLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZXNvbHZpbmcgIiArIHNJbXBsKTsKLQotICAgICAgICBzSW1wbC5zdGFydFJlc29sdmluZygpOwotCi0gICAgICAgIGlmIChzSW1wbC5pc0RvY3VtZW50VHlwZSgpKQotICAgICAgICAgICAgcmVzb2x2ZURvY3VtZW50VHlwZShzSW1wbCk7Ci0gICAgICAgIGVsc2UgaWYgKHNJbXBsLmlzQXR0cmlidXRlVHlwZSgpKQotICAgICAgICAgICAgcmVzb2x2ZUF0dHJpYnV0ZVR5cGUoc0ltcGwpOwotICAgICAgICBlbHNlIGlmIChzSW1wbC5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgICAgIFN0c2NTaW1wbGVUeXBlUmVzb2x2ZXIucmVzb2x2ZVNpbXBsZVR5cGUoc0ltcGwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBTdHNjQ29tcGxleFR5cGVSZXNvbHZlci5yZXNvbHZlQ29tcGxleFR5cGUoc0ltcGwpOwotCi0gICAgICAgIHNJbXBsLmZpbmlzaFJlc29sdmluZygpOwotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbmlzaGVkIHJlc29sdmluZyAiICsgc0ltcGwpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVzb2x2ZVN1YnN0aXR1dGlvbkdyb3VwKFNjaGVtYVR5cGVJbXBsIHNJbXBsKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHNJbXBsLmlzRG9jdW1lbnRUeXBlKCk7Ci0KLSAgICAgICAgaWYgKHNJbXBsLmlzU0dSZXNvbHZlZCgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChzSW1wbC5pc1NHUmVzb2x2aW5nKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQ3ljbGljIGRlcGVuZGVuY3kgZXJyb3IiLCBYbWxFcnJvckNvbnRleHQuQ1lDTElDX0RFUEVOREVOQ1ksIHNJbXBsLmdldFBhcnNlT2JqZWN0KCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBjeWNsaWMgZGVwZW5kZW5jeSBlcnJvcgotICAgICAgICB9Ci0KLSAgICAgICAgc0ltcGwuc3RhcnRSZXNvbHZpbmdTR3MoKTsKLQotICAgICAgICAvLyBSZXNvbHZlIHN1YnN0aXR1dGlvbiBncm91cAotCi0gICAgICAgIFRvcExldmVsRWxlbWVudCBlbHQgPSAoVG9wTGV2ZWxFbGVtZW50KXNJbXBsLmdldFBhcnNlT2JqZWN0KCk7Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHN1YnN0aXR1dGlvbkdyb3VwID0gbnVsbDsKLSAgICAgICAgUU5hbWUgZWx0TmFtZSA9IG5ldyBRTmFtZShzSW1wbC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgZWx0LmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gQlVHOiBIb3cgZG8gSSB0ZWxsIGlmIHRoZSB0eXBlIGlzIGluIHRoaXMgY29tcGlsYXRpb24gdW5pdD8KLSAgICAgICAgaWYgKGVsdC5pc1NldFN1YnN0aXR1dGlvbkdyb3VwKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1YnN0aXR1dGlvbkdyb3VwID0gU3RzY1N0YXRlLmdldCgpLmZpbmREb2N1bWVudFR5cGUoZWx0LmdldFN1YnN0aXR1dGlvbkdyb3VwKCksIAotICAgICAgICAgICAgICAgIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpKTsKLQotICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGlvbkdyb3VwID09IG51bGwpCi0gICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLm5vdEZvdW5kRXJyb3IoZWx0LmdldFN1YnN0aXR1dGlvbkdyb3VwKCksIFhtbEVycm9yQ29udGV4dC5FTEVNRU5UX1JFRl9OT1RfRk9VTkQsIGVsdC54Z2V0U3Vic3RpdHV0aW9uR3JvdXAoKSk7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3ZlcnkgLSBpZ25vcmUgc3Vic3RpdHV0aW9uIGdyb3VwCi0gICAgICAgICAgICBlbHNlIGlmICghIHJlc29sdmVTdWJzdGl0dXRpb25Hcm91cChzdWJzdGl0dXRpb25Hcm91cCkgKQotICAgICAgICAgICAgICAgIHN1YnN0aXR1dGlvbkdyb3VwID0gbnVsbDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRTdWJzdGl0dXRpb25Hcm91cChlbHQuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXYWxrIHVwIHRoZSBjaGFpbiBvZiBzdWJ0aXR1dGlvbiBncm91cHMgYWRkaW5nIHRoaXMgc2NoZW1hdHlwZSB0byBlYWNoIGhlYWQncwotICAgICAgICAvLyBtZW1iZXIgbGlzdAotICAgICAgICB3aGlsZSAoc3Vic3RpdHV0aW9uR3JvdXAgIT0gbnVsbCkKLSAgICAgICAgewotCi0gICAgICAgICAgICBzdWJzdGl0dXRpb25Hcm91cC5hZGRTdWJzdGl0dXRpb25Hcm91cE1lbWJlcihlbHROYW1lKTsKLQotICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGlvbkdyb3VwLmdldFN1YnN0aXR1dGlvbkdyb3VwKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgc3Vic3RpdHV0aW9uR3JvdXAgPSBTdHNjU3RhdGUuZ2V0KCkuZmluZERvY3VtZW50VHlwZSgKLSAgICAgICAgICAgICAgICBzdWJzdGl0dXRpb25Hcm91cC5nZXRTdWJzdGl0dXRpb25Hcm91cCgpLCBzdWJzdGl0dXRpb25Hcm91cC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydCBzdWJzdGl0dXRpb25Hcm91cCAhPSBudWxsIDogIkNvdWxkIG5vdCBmaW5kIGRvY3VtZW50IHR5cGUgZm9yOiAiICsgc3Vic3RpdHV0aW9uR3JvdXAuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKTsKLQotICAgICAgICAgICAgaWYgKCEgcmVzb2x2ZVN1YnN0aXR1dGlvbkdyb3VwKHN1YnN0aXR1dGlvbkdyb3VwKSApCi0gICAgICAgICAgICAgICAgc3Vic3RpdHV0aW9uR3JvdXAgPSBudWxsOyAvLyBjeWNsaWMgZGVwZW5kZW5jeSAtIG5vIHN1YnN0IGdyb3VwCi0KLSAgICAgICAgfQotCi0gICAgICAgIHNJbXBsLmZpbmlzaFJlc29sdmluZ1NHcygpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNvbHZlRG9jdW1lbnRUeXBlICggU2NoZW1hVHlwZUltcGwgc0ltcGwgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHNJbXBsLmlzUmVzb2x2aW5nKCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgc0ltcGwuaXNEb2N1bWVudFR5cGUoKTsKLSAgICAgICAgCi0KLSAgICAgICAgLy8gdHJhbnNsYXRlIHRoZSBnbG9iYWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudCB0eXBlCi0gICAgICAgIC8vIGFuZCBjb25zdHJ1Y3QgYSBjb250ZW50IG1vZGVsIHdoaWNoIGFsbG93cyBqdXN0IHRoYXQgZWxlbWVudAotICAgICAgICAKLSAgICAgICAgTGlzdCBhbm9uVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudEltcGwgZWxlbWVudCA9Ci0gICAgICAgICAgICAoU2NoZW1hR2xvYmFsRWxlbWVudEltcGwpCi0gICAgICAgICAgICAgICAgU3RzY1RyYW5zbGF0b3IudHJhbnNsYXRlRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgKEVsZW1lbnQpIHNJbXBsLmdldFBhcnNlT2JqZWN0KCksCi0gICAgICAgICAgICAgICAgICAgIHNJbXBsLmdldFRhcmdldE5hbWVzcGFjZSgpLCBzSW1wbC5pc0NoYW1lbGVvbigpLAotICAgICAgICAgICAgICAgICAgICBhbm9uVHlwZXMsIHNJbXBsICk7Ci0KLSAgICAgICAgU2NoZW1hTG9jYWxFbGVtZW50SW1wbCBjb250ZW50TW9kZWwgPSBudWxsOwotCi0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5hZGRHbG9iYWxFbGVtZW50KCBlbGVtZW50ICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY29udGVudE1vZGVsID0gbmV3IFNjaGVtYUxvY2FsRWxlbWVudEltcGwoKTsKLSAgICAgICAgCi0gICAgICAgICAgICBjb250ZW50TW9kZWwuc2V0UGFydGljbGVUeXBlKCBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UICk7Ci0gICAgICAgICAgICBTdHNjVHJhbnNsYXRvci5jb3B5R2xvYmFsRWxlbWVudFRvTG9jYWxFbGVtZW50KCBlbGVtZW50LCBjb250ZW50TW9kZWwgKTsKLSAgICAgICAgICAgIGNvbnRlbnRNb2RlbC5zZXRNaW5PY2N1cnMoIEJpZ0ludGVnZXIuT05FICk7Ci0gICAgICAgICAgICBjb250ZW50TW9kZWwuc2V0TWF4T2NjdXJzKCBCaWdJbnRlZ2VyLk9ORSApOwotCi0gICAgICAgICAgICBjb250ZW50TW9kZWwuc2V0VHJhbnNpdGlvbk5vdGVzKFFOYW1lU2V0LkVNUFRZLCB0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcCBlbGVtZW50UHJvcGVydHlNb2RlbCA9Ci0gICAgICAgICAgICBTdHNjQ29tcGxleFR5cGVSZXNvbHZlci5idWlsZENvbnRlbnRQcm9wZXJ0eU1vZGVsQnlRTmFtZSgKLSAgICAgICAgICAgICAgICBjb250ZW50TW9kZWwsIHNJbXBsICk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZUltcGwgYmFzZVR5cGUgPSBzSW1wbC5nZXRTdWJzdGl0dXRpb25Hcm91cCgpID09IG51bGwgPwotICAgICAgICAgICAgQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEUgOgotICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmZpbmREb2N1bWVudFR5cGUoc0ltcGwuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKSwgCi0gICAgICAgICAgICAgICAgIHNJbXBsLmlzQ2hhbWVsZW9uKCkgPyBzSW1wbC5nZXRUYXJnZXROYW1lc3BhY2UoKSA6IG51bGwpCi0gICAgICAgICAgICA7Ci0KLSAgICAgICAgc0ltcGwuc2V0QmFzZVR5cGVSZWYoIGJhc2VUeXBlLmdldFJlZigpICk7Ci0gICAgICAgIHNJbXBsLnNldEJhc2VEZXB0aCggYmFzZVR5cGUuZ2V0QmFzZURlcHRoKCkgKyAxICk7Ci0gICAgICAgIHNJbXBsLnNldERlcml2YXRpb25UeXBlKCBTY2hlbWFUeXBlLkRUX1JFU1RSSUNUSU9OICk7Ci0gICAgICAgIHNJbXBsLnNldENvbXBsZXhUeXBlVmFyaWV0eSggU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQgKTsKLQotICAgICAgICBzSW1wbC5zZXRDb250ZW50TW9kZWwoCi0gICAgICAgICAgICBjb250ZW50TW9kZWwsIG5ldyBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwoKSwKLSAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0eU1vZGVsLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVAsIGZhbHNlICk7Ci0gICAgICAgIAotICAgICAgICBzSW1wbC5zZXRXaWxkY2FyZFN1bW1hcnkoCi0gICAgICAgICAgICBRTmFtZVNldC5FTVBUWSwgZmFsc2UsIFFOYW1lU2V0LkVNUFRZLCBmYWxzZSApOwotCi0gICAgICAgIHNJbXBsLnNldEFub255bW91c1R5cGVSZWZzKCBtYWtlUmVmQXJyYXkoIGFub25UeXBlcyApICk7Ci0KLQotCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNvbHZlQXR0cmlidXRlVHlwZSAoIFNjaGVtYVR5cGVJbXBsIHNJbXBsICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBzSW1wbC5pc1Jlc29sdmluZygpOwotCi0gICAgICAgIGFzc2VydCBzSW1wbC5pc0F0dHJpYnV0ZVR5cGUoKTsKLSAgICAgICAgCi0gICAgICAgIExpc3QgYW5vblR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwgYXR0cmlidXRlID0KLSAgICAgICAgICAgIChTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsKSBTdHNjVHJhbnNsYXRvci50cmFuc2xhdGVBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgKEF0dHJpYnV0ZSkgc0ltcGwuZ2V0UGFyc2VPYmplY3QoKSwgc0ltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgc0ltcGwuaXNDaGFtZWxlb24oKSwgYW5vblR5cGVzLCBzSW1wbCwgbnVsbCwgZmFsc2UgKTsKLQotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwgYXR0cmlidXRlTW9kZWwgPSBuZXcgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKCk7Ci0KLSAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuYWRkR2xvYmFsQXR0cmlidXRlKCBhdHRyaWJ1dGUgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGVJbXBsIGF0dHJpYnV0ZUNvcHkgPSBuZXcgU2NoZW1hTG9jYWxBdHRyaWJ1dGVJbXBsKCk7Ci0gICAgICAgICAgICBTdHNjVHJhbnNsYXRvci5jb3B5R2xvYmFsQXR0cmlidXRlVG9Mb2NhbEF0dHJpYnV0ZSggYXR0cmlidXRlLCBhdHRyaWJ1dGVDb3B5ICk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVNb2RlbC5hZGRBdHRyaWJ1dGUoIGF0dHJpYnV0ZUNvcHkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNJbXBsLnNldEJhc2VUeXBlUmVmKCBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfVFlQRS5nZXRSZWYoKSApOwotICAgICAgICBzSW1wbC5zZXRCYXNlRGVwdGgoIHNJbXBsLmdldEJhc2VEZXB0aCgpICsgMSApOwotICAgICAgICBzSW1wbC5zZXREZXJpdmF0aW9uVHlwZSggU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTiApOwotICAgICAgICBzSW1wbC5zZXRDb21wbGV4VHlwZVZhcmlldHkoIFNjaGVtYVR5cGUuRU1QVFlfQ09OVEVOVCApOwotICAgICAgICAKLSAgICAgICAgTWFwIGF0dHJpYnV0ZVByb3BlcnR5TW9kZWwgPQotICAgICAgICAgICAgU3RzY0NvbXBsZXhUeXBlUmVzb2x2ZXIuYnVpbGRBdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsQnlRTmFtZSgKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVNb2RlbCwgc0ltcGwgKTsKLQotICAgICAgICBzSW1wbC5zZXRDb250ZW50TW9kZWwoCi0gICAgICAgICAgICBudWxsLCBhdHRyaWJ1dGVNb2RlbCwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQLCBhdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsLCBmYWxzZSApOwotCi0gICAgICAgIHNJbXBsLnNldFdpbGRjYXJkU3VtbWFyeSgKLSAgICAgICAgICAgIFFOYW1lU2V0LkVNUFRZLCBmYWxzZSwgUU5hbWVTZXQuRU1QVFksIGZhbHNlICk7Ci0gICAgICAgIAotICAgICAgICBzSW1wbC5zZXRBbm9ueW1vdXNUeXBlUmVmcyggbWFrZVJlZkFycmF5KCBhbm9uVHlwZXMgKSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWFUeXBlLlJlZltdIG1ha2VSZWZBcnJheShDb2xsZWN0aW9uIHR5cGVMaXN0KQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZS5SZWZbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZS5SZWZbdHlwZUxpc3Quc2l6ZSgpXTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0eXBlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQotICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFUeXBlKWkubmV4dCgpKS5nZXRSZWYoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNvbHZlSWRlbnRpdHlDb25zdHJhaW50cygpCi0gICAgewotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0gICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGxbXSBpZGNzID0gc3RhdGUuaWRDb25zdHJhaW50cygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGlkY3MubGVuZ3RoIDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWlkY3NbaV0uaXNSZXNvbHZlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEtleXJlZiB4c2RrciA9IChLZXlyZWYpaWRjc1tpXS5nZXRQYXJzZU9iamVjdCgpOwotICAgICAgICAgICAgICAgIFFOYW1lIGtleU5hbWUgPSB4c2Rrci5nZXRSZWZlcigpOwotICAgICAgICAgICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGwga2V5ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGtleSA9IHN0YXRlLmZpbmRJZENvbnN0cmFpbnQoa2V5TmFtZSwgaWRjc1tpXS5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihrZXlOYW1lLCBYbWxFcnJvckNvbnRleHQuSURDX05PVF9GT1VORCwgeHNka3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5nZXRDb25zdHJhaW50Q2F0ZWdvcnkoKSA9PSBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsLkNDX0tFWVJFRikKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJLZXlyZWYgY2Fubm90IHJlZmVyIHRvIGFub3RoZXIga2V5cmVmLiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5JRENfTk9UX0ZPVU5ELCBpZGNzW2ldLmdldFBhcnNlT2JqZWN0KCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChrZXkuZ2V0RmllbGRzKCkubGVuZ3RoICE9IGlkY3NbaV0uZ2V0RmllbGRzKCkubGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIktleXJlZiBkb2VzIG5vdCBoYXZlIHNhbWUgbnVtYmVyIG9mIGZpZWxkcyBhcyBrZXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5JRENfTk9UX0ZPVU5ELCBpZGNzW2ldLmdldFBhcnNlT2JqZWN0KCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlkY3NbaV0uc2V0UmVmZXJlbmNlZEtleShrZXkuZ2V0UmVmKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1NpbXBsZVR5cGVSZXNvbHZlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1NpbXBsZVR5cGVSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjAxYzE5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NTaW1wbGVUeXBlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNDEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSW50ZWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCeXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sU2hvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxVbnNpZ25lZEJ5dGU7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS4qOwotCi1wdWJsaWMgY2xhc3MgU3RzY1NpbXBsZVR5cGVSZXNvbHZlcgotewotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICogU0lNUExFIFRZUEUgUkVTT0xVVElPTiBIRVJFCi0gICAgICoKLSAgICAgKiBTaW1wbGUgdHlwZXMgY2FuIGJlIGRlY2xhcmVkIGFzIGxpc3RzLCB1bmlvbnMsIG9yIHJlc3RyaWN0aW9ucy4KLSAgICAgKiBUaGVzZSB0aHJlZSBjYXNlcyBhcmUgdHJlYXRlZCBzZXBhcmF0ZWx5IGluIHJlc29sdmVMaXN0VHlwZSwKLSAgICAgKiByZXNvbHZlVW5pb25UeXBlLCBhbmQgcmVzb2x2ZVNpbXBsZVJlc3RyaWN0aW9uVHlwZS4KLSAgICAgKgotICAgICAqIFRoZSBpbnRyaWNhdGUgd29yayB3aXRoIGZhY2V0cyBpcyBkb25lIGluIHRoZSByZXN0cmljdGlvbiBjYXNlLAotICAgICAqIHVzaW5nIG1ldGhvZCBjYWxsZWQgcmVzb2x2ZUZhY2V0cyAodGhlIHVuaW9uIGFuZCBsaXN0IGNhc2VzIGhhdmUKLSAgICAgKiB0cml2aWFsIGZhY2V0IHJ1bGVzKS4gVGhlbiBhbGwgc2ltcGxlIHR5cGVzIGNhbGwgcmVzb2x2ZVByb3BlcnRpZXMKLSAgICAgKiBpbiB0aGUgZW5kIHRvIGhhdmUgdGhlaXIgImZ1bmRhbWVudGFsIGZhY2V0cyIgcmVzb2x2ZWQuCi0gICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZVNpbXBsZVR5cGUoU2NoZW1hVHlwZUltcGwgc0ltcGwpCi0gICAgewotICAgICAgICBTaW1wbGVUeXBlIHBhcnNlU3QgPSAoU2ltcGxlVHlwZSlzSW1wbC5nZXRQYXJzZU9iamVjdCgpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHNJbXBsLmlzU2ltcGxlVHlwZSgpOwotCi0gICAgICAgIC8vIFZlcmlmeTogaGF2ZSBsaXN0LCB1bmlvbiwgb3IgcmVzdHJpY3Rpb24sIGJ1dCBub3QgbW9yZSB0aGFuIG9uZQotICAgICAgICBpbnQgY291bnQgPQotICAgICAgICAgICAgICAgIChwYXJzZVN0LmlzU2V0TGlzdCgpID8gMSA6IDApICsKLSAgICAgICAgICAgICAgICAocGFyc2VTdC5pc1NldFVuaW9uKCkgPyAxIDogMCkgKwotICAgICAgICAgICAgICAgIChwYXJzZVN0LmlzU2V0UmVzdHJpY3Rpb24oKSA/IDEgOiAwKTsKLSAgICAgICAgaWYgKGNvdW50ID4gMSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKAotICAgICAgICAgICAgICAgICAgICAiQSBzaW1wbGUgdHlwZSBtdXN0IGRlZmluZSBlaXRoZXIgYSBsaXN0LCBhIHVuaW9uLCBvciBhIHJlc3RyaWN0aW9uOiBtb3JlIHRoYW4gb25lIGZvdW5kLiIsCi0gICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5NQUxGT1JNRURfU0lNUExFX1RZUEVfREVGTiwKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VTdCk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogdHJlYXQgaXQgYXMgdGhlIGZpcnN0IG9mIGxpc3QsIHVuaW9uLCByZXN0cgotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvdW50IDwgMSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJBIHNpbXBsZSB0eXBlIG11c3QgZGVmaW5lIGVpdGhlciBhIGxpc3QsIGEgdW5pb24sIG9yIGEgcmVzdHJpY3Rpb246IG5vbmUgd2FzIGZvdW5kLiIsCi0gICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5NQUxGT1JNRURfU0lNUExFX1RZUEVfREVGTiwKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VTdCk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogdHJlYXQgaXQgYXMgcmVzdHJpY3Rpb24gb2YgYW55U2ltcGxlVHlwZQotICAgICAgICAgICAgcmVzb2x2ZUVycm9yU2ltcGxlVHlwZShzSW1wbCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgZmluYWwgZmxhZ3MKLSAgICAgICAgYm9vbGVhbiBmaW5hbFJlc3QgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBmaW5hbExpc3QgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBmaW5hbFVuaW9uID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKHBhcnNlU3QuaXNTZXRGaW5hbCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJzZVN0LmdldEZpbmFsKCk7Ci0gICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKCIjYWxsIikpCi0gICAgICAgICAgICAgICAgZmluYWxSZXN0ID0gZmluYWxMaXN0ID0gZmluYWxVbmlvbiA9IHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5lcXVhbHMoInJlc3RyaWN0aW9uIikpCi0gICAgICAgICAgICAgICAgZmluYWxSZXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLmVxdWFscygibGlzdCIpKQotICAgICAgICAgICAgICAgIGZpbmFsTGlzdCA9IHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5lcXVhbHMoInVuaW9uIikpCi0gICAgICAgICAgICAgICAgZmluYWxVbmlvbiA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgc0ltcGwuc2V0U2ltcGxlRmluYWwoZmluYWxSZXN0LCBmaW5hbExpc3QsIGZpbmFsVW5pb24pOwotCi0gICAgICAgIExpc3QgYW5vblR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGlmIChwYXJzZVN0LmdldExpc3QoKSAhPSBudWxsKQotICAgICAgICAgICAgcmVzb2x2ZUxpc3RUeXBlKHNJbXBsLCBwYXJzZVN0LmdldExpc3QoKSwgYW5vblR5cGVzKTsKLSAgICAgICAgZWxzZSBpZiAocGFyc2VTdC5nZXRVbmlvbigpICE9IG51bGwpCi0gICAgICAgICAgICByZXNvbHZlVW5pb25UeXBlKHNJbXBsLCBwYXJzZVN0LmdldFVuaW9uKCksIGFub25UeXBlcyk7Ci0gICAgICAgIGVsc2UgaWYgKHBhcnNlU3QuZ2V0UmVzdHJpY3Rpb24oKSAhPSBudWxsKQotICAgICAgICAgICAgcmVzb2x2ZVNpbXBsZVJlc3RyaWN0aW9uVHlwZShzSW1wbCwgcGFyc2VTdC5nZXRSZXN0cmljdGlvbigpLCBhbm9uVHlwZXMpOwotCi0gICAgICAgIHNJbXBsLnNldEFub255bW91c1R5cGVSZWZzKG1ha2VSZWZBcnJheShhbm9uVHlwZXMpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWFUeXBlLlJlZltdIG1ha2VSZWZBcnJheShDb2xsZWN0aW9uIHR5cGVMaXN0KQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZS5SZWZbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZS5SZWZbdHlwZUxpc3Quc2l6ZSgpXTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0eXBlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQotICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFUeXBlKWkubmV4dCgpKS5nZXRSZWYoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCByZXNvbHZlRXJyb3JTaW1wbGVUeXBlKFNjaGVtYVR5cGVJbXBsIHNJbXBsKQotICAgIHsKLSAgICAgICAgc0ltcGwuc2V0U2ltcGxlVHlwZVZhcmlldHkoU2NoZW1hVHlwZS5BVE9NSUMpOwotICAgICAgICBzSW1wbC5zZXRCYXNlVHlwZVJlZihCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFLmdldFJlZigpKTsKLSAgICAgICAgc0ltcGwuc2V0QmFzZURlcHRoKEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEUuZ2V0QmFzZURlcHRoKCkgKyAxKTsKLSAgICAgICAgc0ltcGwuc2V0UHJpbWl0aXZlVHlwZVJlZihCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFLmdldFJlZigpKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCByZXNvbHZlTGlzdFR5cGUoU2NoZW1hVHlwZUltcGwgc0ltcGwsIG9yZy53My54MjAwMS54bWxTY2hlbWEuTGlzdERvY3VtZW50Lkxpc3QgcGFyc2VMaXN0LCBMaXN0IGFub25UeXBlcykKLSAgICB7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLQotICAgICAgICBzSW1wbC5zZXRTaW1wbGVUeXBlVmFyaWV0eShTY2hlbWFUeXBlLkxJU1QpOwotICAgICAgICBzSW1wbC5zZXRCYXNlVHlwZVJlZihCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFLmdldFJlZigpKTsKLSAgICAgICAgc0ltcGwuc2V0QmFzZURlcHRoKEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEUuZ2V0QmFzZURlcHRoKCkgKyAxKTsKLSAgICAgICAgc0ltcGwuc2V0RGVyaXZhdGlvblR5cGUoU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTik7Ci0KLSAgICAgICAgaWYgKHNJbXBsLmlzUmVkZWZpbml0aW9uKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQSB0eXBlIHJlZGVmaW5pdGlvbiBtdXN0IHJlc3RyaWN0IHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uIG9mIHRoZSB0eXBlLiIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBwYXJzZUxpc3QpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IG9oIHdlbGwuCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFFOYW1lIGl0ZW1OYW1lID0gcGFyc2VMaXN0LmdldEl0ZW1UeXBlKCk7Ci0gICAgICAgIExvY2FsU2ltcGxlVHlwZSBwYXJzZUlubmVyID0gcGFyc2VMaXN0LmdldFNpbXBsZVR5cGUoKTsKLQotICAgICAgICBpZiAoaXRlbU5hbWUgIT0gbnVsbCAmJiBwYXJzZUlubmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJMaXN0IHR5cGUgZGVmaW5pdGlvbnMgcHJvdmlkZSBlaXRoZXIgYW4gaXRlbVR5cGUgYXR0cmlidXRlICIgKwotICAgICAgICAgICAgICAgICAgICAib3IgY29udGFpbiBhIG5lc3RlZCBzaW1wbGVUeXBlOiBib3RoIHdlcmUgZm91bmQuIiwKLSAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0LlJFRFVOREFOVF9ORVNURURfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VMaXN0KTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgdGhlIGlubmVyIHNpbXBsZSB0eXBlLgotICAgICAgICAgICAgcGFyc2VJbm5lciA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFUeXBlSW1wbCBpdGVtSW1wbDsKLSAgICAgICAgWG1sT2JqZWN0IGVycm9yTG9jOwotCi0gICAgICAgIGlmIChpdGVtTmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpdGVtSW1wbCA9IHN0YXRlLmZpbmRHbG9iYWxUeXBlKGl0ZW1OYW1lLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBlcnJvckxvYyA9IHBhcnNlTGlzdC54Z2V0SXRlbVR5cGUoKTsKLSAgICAgICAgICAgIGlmIChpdGVtSW1wbCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3IoaXRlbU5hbWUsIFhtbEVycm9yQ29udGV4dC5UWVBFX05PVF9GT1VORCwgcGFyc2VMaXN0LnhnZXRJdGVtVHlwZSgpKTsKLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogdHJlYXQgaXQgYXMgYSBsaXN0IG9mIGFueVNpbXBsZVR5cGUKLSAgICAgICAgICAgICAgICBpdGVtSW1wbCA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyc2VJbm5lciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpdGVtSW1wbCA9IG5ldyBTY2hlbWFUeXBlSW1wbChzdGF0ZS5zdHMoKSk7Ci0gICAgICAgICAgICBlcnJvckxvYyA9IHBhcnNlSW5uZXI7Ci0gICAgICAgICAgICBpdGVtSW1wbC5zZXRTaW1wbGVUeXBlKHRydWUpOwotICAgICAgICAgICAgaXRlbUltcGwuc2V0UGFyc2VDb250ZXh0KHBhcnNlSW5uZXIsIHNJbXBsLmdldFRhcmdldE5hbWVzcGFjZSgpLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSAhPSBudWxsLCBmYWxzZSk7Ci0gICAgICAgICAgICBpdGVtSW1wbC5zZXRPdXRlclNjaGVtYVR5cGVSZWYoc0ltcGwuZ2V0UmVmKCkpOwotICAgICAgICAgICAgYW5vblR5cGVzLmFkZChpdGVtSW1wbCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiTGlzdCB0eXBlIGRlZmluaXRpb25zIHByb3ZpZGUgZWl0aGVyIGFuIGl0ZW1UeXBlIGF0dHJpYnV0ZSAiICsKLSAgICAgICAgICAgICAgICAgICAgIm9yIGNvbnRhaW4gYSBuZXN0ZWQgc2ltcGxlVHlwZTogbmVpdGhlciB3YXMgZm91bmQuIiwKLSAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0LkxJU1RfTUlTU0lOR19JVEVNLAotICAgICAgICAgICAgICAgICAgICBwYXJzZUxpc3QpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IHRyZWF0IGl0IGFzIGFuIGV4dGVuc2lvbiBvZiBhbnlTaW1wbGVUeXBlCi0gICAgICAgICAgICByZXNvbHZlRXJyb3JTaW1wbGVUeXBlKHNJbXBsKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFZlcmlmeSBmaW5hbCByZXN0cmljdGlvbnMKLSAgICAgICAgaWYgKGl0ZW1JbXBsLmZpbmFsTGlzdCgpKQotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkNhbm5vdCBkZXJpdmUgYnkgbGlzdCBhIGZpbmFsIHR5cGUuIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9ERVJJVkVfRklOQUwsIHBhcnNlTGlzdCk7Ci0KLSAgICAgICAgLy8gUmVjdXJzaW9uLi4uCi0gICAgICAgIFN0c2NSZXNvbHZlci5yZXNvbHZlVHlwZShpdGVtSW1wbCk7Ci0KLSAgICAgICAgaWYgKCFpdGVtSW1wbC5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkl0ZW0gdHlwZSBmb3IgdGhpcyBsaXN0IHR5cGUgaXMgbm90IHNpbXBsZSIsCi0gICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5MSVNUX0lURU1fTk9UX1NJTVBMRSwgZXJyb3JMb2MpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IHRyZWF0IHRoZSBpdGVtIHR5cGUgYXMgYW55U2ltcGxlVHlwZQotICAgICAgICAgICAgc0ltcGwgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChpdGVtSW1wbC5nZXRTaW1wbGVWYXJpZXR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUOgotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJUaGlzIGl0ZW0gdHlwZSBpcyBhbm90aGVyIGxpc3QgdHlwZTsgbGlzdHMgb2YgbGlzdHMgYXJlIG5vdCBhbGxvd2VkLiIsIFhtbEVycm9yQ29udGV4dC5MSVNUX09GX0xJU1QsIGVycm9yTG9jKTsKLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogdHJlYXQgdGhlIGxpc3QgYXMgYW4gYW55U2ltcGxlVHlwZQotICAgICAgICAgICAgICAgIHJlc29sdmVFcnJvclNpbXBsZVR5cGUoc0ltcGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5VTklPTjoKLSAgICAgICAgICAgICAgICBpZiAoaXRlbUltcGwuaXNVbmlvbk9mTGlzdHMoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJUaGlzIGl0ZW0gdHlwZSBpcyBhIHVuaW9uIGNvbnRhaW5pbmcgYSBsaXN0OyBsaXN0cyBvZiBsaXN0cyBhcmUgbm90IGFsbG93ZWQuIiwgWG1sRXJyb3JDb250ZXh0LkxJU1RfT0ZfTElTVCwgZXJyb3JMb2MpOwotICAgICAgICAgICAgICAgICAgICByZXNvbHZlRXJyb3JTaW1wbGVUeXBlKHNJbXBsKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBmYWxsdGhyb3VnaDogbm9ubGlzdCB1bmlvbnMgYXJlIGp1c3QgbGlrZSBhdG9taWMgaXRlbXMKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5BVE9NSUM6Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0TGlzdEl0ZW1UeXBlUmVmKGl0ZW1JbXBsLmdldFJlZigpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRMaXN0SXRlbVR5cGVSZWYoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRS5nZXRSZWYoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3cgZGVhbCB3aXRoIGZhY2V0cwotICAgICAgICBzSW1wbC5zZXRCYXNpY0ZhY2V0cyhTdHNjU3RhdGUuRkFDRVRTX0xJU1QsIFN0c2NTdGF0ZS5GSVhFRF9GQUNFVFNfTElTVCk7Ci0gICAgICAgIHNJbXBsLnNldFdoaXRlU3BhY2VSdWxlKCBTY2hlbWFUeXBlLldTX0NPTExBUFNFICk7Ci0KLSAgICAgICAgLy8gbm93IGNvbXB1dGUgb3VyIGludHJpbnNpYyBwcm9wZXJ0aWVzCi0gICAgICAgIHJlc29sdmVGdW5kYW1lbnRhbEZhY2V0cyhzSW1wbCk7Ci0gICAgfQotCi0KLQotCi0gICAgc3RhdGljIHZvaWQgcmVzb2x2ZVVuaW9uVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCwgVW5pb25Eb2N1bWVudC5VbmlvbiBwYXJzZVVuaW9uLCBMaXN0IGFub25UeXBlcykKLSAgICB7Ci0gICAgICAgIHNJbXBsLnNldFNpbXBsZVR5cGVWYXJpZXR5KFNjaGVtYVR5cGUuVU5JT04pOwotICAgICAgICBzSW1wbC5zZXRCYXNlVHlwZVJlZihCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFLmdldFJlZigpKTsKLSAgICAgICAgc0ltcGwuc2V0QmFzZURlcHRoKEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEUuZ2V0QmFzZURlcHRoKCkgKyAxKTsKLSAgICAgICAgc0ltcGwuc2V0RGVyaXZhdGlvblR5cGUoU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTik7Ci0KLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHNJbXBsLmlzUmVkZWZpbml0aW9uKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQSB0eXBlIHJlZGVmaW5pdGlvbiBtdXN0IHJlc3RyaWN0IHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uIG9mIHRoZSB0eXBlLiIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBwYXJzZVVuaW9uKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBvaCB3ZWxsLgotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBMaXN0IG1lbWJlclR5cGVzID0gcGFyc2VVbmlvbi5nZXRNZW1iZXJUeXBlcygpOwotICAgICAgICBTaW1wbGVUeXBlW10gc2ltcGxlVHlwZXMgPSBwYXJzZVVuaW9uLmdldFNpbXBsZVR5cGVBcnJheSgpOwotCi0gICAgICAgIExpc3QgbWVtYmVySW1wbExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoc2ltcGxlVHlwZXMubGVuZ3RoID09IDAgJiYgKG1lbWJlclR5cGVzID09IG51bGwgfHwgbWVtYmVyVHlwZXMuc2l6ZSgpID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSB1bmlvbiB0eXBlIG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgbWVtYmVyIHR5cGUiLCBYbWxFcnJvckNvbnRleHQuVU5JT05fTUVNQkVSX05PVF9TSU1QTEUsIHBhcnNlVW5pb24pOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IG9oIHdlbGwsIHplcm8gbWVtYmVyIHR5cGVzIGlzIGZpbmUuCi0gICAgICAgIH0KLQotICAgICAgICBpZiAobWVtYmVyVHlwZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBtTmFtZXMgPSBtZW1iZXJUeXBlcy5pdGVyYXRvcigpOyBtTmFtZXMuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgbU5hbWUgPSAoUU5hbWUpbU5hbWVzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBtZW1iZXJJbXBsID0gc3RhdGUuZmluZEdsb2JhbFR5cGUobU5hbWUsIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAobWVtYmVySW1wbCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogc2tpcCBtZW1iZXIKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihtTmFtZSwgWG1sRXJyb3JDb250ZXh0LlRZUEVfTk9UX0ZPVU5ELCBwYXJzZVVuaW9uLnhnZXRNZW1iZXJUeXBlcygpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIG1lbWJlckltcGxMaXN0LmFkZChtZW1iZXJJbXBsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2ltcGxlVHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEJVR0JVRzogc2VlIGlmIG5vbjxzaW1wbGVUeXBlPiBjaGlsZHJlbiBjYW4gbGVhayB0aHJvdWdoCi0gICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBtSW1wbCA9IG5ldyBTY2hlbWFUeXBlSW1wbChzdGF0ZS5zdHMoKSk7Ci0gICAgICAgICAgICBtSW1wbC5zZXRTaW1wbGVUeXBlKHRydWUpOwotICAgICAgICAgICAgbUltcGwuc2V0UGFyc2VDb250ZXh0KHNpbXBsZVR5cGVzW2ldLCBzSW1wbC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkgIT0gbnVsbCwgZmFsc2UpOwotICAgICAgICAgICAgbWVtYmVySW1wbExpc3QuYWRkKG1JbXBsKTsKLSAgICAgICAgICAgIG1JbXBsLnNldE91dGVyU2NoZW1hVHlwZVJlZihzSW1wbC5nZXRSZWYoKSk7Ci0gICAgICAgICAgICBtSW1wbC5zZXRBbm9ueW1vdXNVbmlvbk1lbWJlck9yZGluYWwoaSArIDEpOwotICAgICAgICAgICAgYW5vblR5cGVzLmFkZChtSW1wbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWN1cnNlIGFuZCByZXNvbHZlIGFsbCBtZW1iZXIgdHlwZXMKLSAgICAgICAgZm9yIChJdGVyYXRvciBtSW1wbHMgPSBtZW1iZXJJbXBsTGlzdC5pdGVyYXRvcigpOyBtSW1wbHMuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGVJbXBsIG1JbXBsID0gKFNjaGVtYVR5cGVJbXBsKW1JbXBscy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIVN0c2NSZXNvbHZlci5yZXNvbHZlVHlwZShtSW1wbCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG1JbXBsLmdldE91dGVyVHlwZSgpLmVxdWFscyhzSW1wbCkpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJNZW1iZXIgaGFzIGEgY3ljbGljIGRlcGVuZGVuY3kgb24gdGhlIGNvbnRhaW5pbmcgdW5pb24iLCAgWG1sRXJyb3JDb250ZXh0LkNZQ0xJQ19ERVBFTkRFTkNZLCBtSW1wbC5nZXRQYXJzZU9iamVjdCgpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJNZW1iZXIgIiArIFFOYW1lSGVscGVyLnByZXR0eShtSW1wbC5nZXROYW1lKCkpICsgIiBoYXMgYSBjeWNsaWMgZGVwZW5kZW5jeSBvbiB0aGUgdW5pb24iLCBYbWxFcnJvckNvbnRleHQuQ1lDTElDX0RFUEVOREVOQ1ksIHBhcnNlVW5pb24ueGdldE1lbWJlclR5cGVzKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZSB0aGUgZXJyYW50IHVuaW9uIG1lbWJlcgotICAgICAgICAgICAgICAgIG1JbXBscy5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyB2ZXJpZnkgbWVtYmVycwotICAgICAgICBib29sZWFuIGlzVW5pb25PZkxpc3RzID0gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBtSW1wbHMgPSBtZW1iZXJJbXBsTGlzdC5pdGVyYXRvcigpOyBtSW1wbHMuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGVJbXBsIG1JbXBsID0gKFNjaGVtYVR5cGVJbXBsKW1JbXBscy5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmICghbUltcGwuaXNTaW1wbGVUeXBlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG1JbXBsLmdldE91dGVyVHlwZSgpICE9IG51bGwgJiYgbUltcGwuZ2V0T3V0ZXJUeXBlKCkuZXF1YWxzKHNJbXBsKSkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk1lbWJlciBpcyBub3Qgc2ltcGxlIiwgWG1sRXJyb3JDb250ZXh0LlVOSU9OX01FTUJFUl9OT1RfU0lNUExFLCBtSW1wbC5nZXRQYXJzZU9iamVjdCgpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJNZW1iZXIgIiArIFFOYW1lSGVscGVyLnByZXR0eShtSW1wbC5nZXROYW1lKCkpICsgIiBpcyBub3Qgc2ltcGxlIiwgWG1sRXJyb3JDb250ZXh0LlVOSU9OX01FTUJFUl9OT1RfU0lNUExFLCBwYXJzZVVuaW9uLnhnZXRNZW1iZXJUeXBlcygpKTsKLQotICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgdGhlIGVycmFudCB1bmlvbiBtZW1iZXIKLSAgICAgICAgICAgICAgICBtSW1wbHMucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtSW1wbC5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUIHx8Ci0gICAgICAgICAgICAgICAgbUltcGwuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuVU5JT04gJiYgbUltcGwuaXNVbmlvbk9mTGlzdHMoKSkKLSAgICAgICAgICAgICAgICBpc1VuaW9uT2ZMaXN0cyA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBWZXJpZnkgYW55IGZpbmFsIHJlc3RyaWN0aW9ucwotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBtZW1iZXJJbXBsTGlzdC5zaXplKCkgOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGVJbXBsIG1JbXBsID0gKFNjaGVtYVR5cGVJbXBsKW1lbWJlckltcGxMaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChtSW1wbC5maW5hbFVuaW9uKCkpCi0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkNhbm5vdCBkZXJpdmUgYnkgdW5pb24gYSBmaW5hbCB0eXBlLiIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfREVSSVZFX0ZJTkFMLCBwYXJzZVVuaW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNJbXBsLnNldFVuaW9uT2ZMaXN0cyhpc1VuaW9uT2ZMaXN0cyk7Ci0KLSAgICAgICAgc0ltcGwuc2V0VW5pb25NZW1iZXJUeXBlUmVmcyhtYWtlUmVmQXJyYXkobWVtYmVySW1wbExpc3QpKTsKLQotICAgICAgICAvLyBub3cgZGVhbCB3aXRoIGZhY2V0cwotICAgICAgICBzSW1wbC5zZXRCYXNpY0ZhY2V0cyhTdHNjU3RhdGUuRkFDRVRTX1VOSU9OLCBTdHNjU3RhdGUuRklYRURfRkFDRVRTX1VOSU9OKTsKLQotICAgICAgICAvLyBub3cgY29tcHV0ZSBvdXIgaW50cmluc2ljIHByb3BlcnRpZXMKLSAgICAgICAgcmVzb2x2ZUZ1bmRhbWVudGFsRmFjZXRzKHNJbXBsKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCByZXNvbHZlU2ltcGxlUmVzdHJpY3Rpb25UeXBlKFNjaGVtYVR5cGVJbXBsIHNJbXBsLCBSZXN0cmljdGlvbkRvY3VtZW50LlJlc3RyaWN0aW9uIHBhcnNlUmVzdHIsIExpc3QgYW5vblR5cGVzKQotICAgIHsKLSAgICAgICAgUU5hbWUgYmFzZU5hbWUgPSBwYXJzZVJlc3RyLmdldEJhc2UoKTsKLSAgICAgICAgU2ltcGxlVHlwZSBwYXJzZUlubmVyID0gcGFyc2VSZXN0ci5nZXRTaW1wbGVUeXBlKCk7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLQotICAgICAgICBpZiAoYmFzZU5hbWUgIT0gbnVsbCAmJiBwYXJzZUlubmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJTaW1wbGUgdHlwZSByZXN0cmljdGlvbnMgbXVzdCBuYW1lIGEgYmFzZSB0eXBlICIgKwotICAgICAgICAgICAgICAgICAgICAib3IgY29udGFpbiBhIG5lc3RlZCBzaW1wbGUgdHlwZTogYm90aCB3ZXJlIGZvdW5kLiIsCi0gICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5SRVNUUklDVElPTl9SRURVTkRBTlRfQkFTRSwKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VSZXN0cik7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIHRoZSBpbm5lciBzaW1wbGUgdHlwZS4KLSAgICAgICAgICAgIHBhcnNlSW5uZXIgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hVHlwZUltcGwgYmFzZUltcGw7Ci0KLSAgICAgICAgaWYgKGJhc2VOYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzSW1wbC5pc1JlZGVmaW5pdGlvbigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJhc2VJbXBsID0gc3RhdGUuZmluZFJlZGVmaW5lZEdsb2JhbFR5cGUocGFyc2VSZXN0ci5nZXRCYXNlKCksIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpLCBzSW1wbC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChiYXNlSW1wbCAhPSBudWxsICYmICFiYXNlSW1wbC5nZXROYW1lKCkuZXF1YWxzKHNJbXBsLmdldE5hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHR5cGUgcmVkZWZpbml0aW9uIG11c3QgcmVzdHJpY3QgdGhlIG9yaWdpbmFsIHR5cGUgZGVmaW5pdGlvbiIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBwYXJzZVJlc3RyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiYXNlSW1wbCA9IHN0YXRlLmZpbmRHbG9iYWxUeXBlKGJhc2VOYW1lLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYmFzZUltcGwgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5ub3RGb3VuZEVycm9yKGJhc2VOYW1lLCBYbWxFcnJvckNvbnRleHQuVFlQRV9OT1RfRk9VTkQsIHBhcnNlUmVzdHIueGdldEJhc2UoKSk7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IHRyZWF0IGl0IGFzIGFuIGV4dGVuc2lvbiBvZiBhbnlTaW1wbGVUeXBlCi0gICAgICAgICAgICAgICAgYmFzZUltcGwgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcnNlSW5uZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNJbXBsLmlzUmVkZWZpbml0aW9uKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJBIHR5cGUgcmVkZWZpbml0aW9uIG11c3QgcmVzdHJpY3QgdGhlIG9yaWdpbmFsIGRlZmluaXRpb24gb2YgdGhlIHR5cGUuIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIHBhcnNlSW5uZXIpOwotICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBvaCB3ZWxsLgotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBiYXNlSW1wbCA9IG5ldyBTY2hlbWFUeXBlSW1wbChzdGF0ZS5zdHMoKSk7Ci0gICAgICAgICAgICBiYXNlSW1wbC5zZXRTaW1wbGVUeXBlKHRydWUpOwotICAgICAgICAgICAgYmFzZUltcGwuc2V0UGFyc2VDb250ZXh0KHBhcnNlSW5uZXIsIHNJbXBsLmdldFRhcmdldE5hbWVzcGFjZSgpLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSAhPSBudWxsLCBmYWxzZSk7Ci0gICAgICAgICAgICAvLyBiYXNlSW1wbC5zZXRTa2lwcGVkQW5vbnltb3VzVHlwZSh0cnVlKTsKLSAgICAgICAgICAgIGJhc2VJbXBsLnNldE91dGVyU2NoZW1hVHlwZVJlZihzSW1wbC5nZXRSZWYoKSk7Ci0gICAgICAgICAgICBhbm9uVHlwZXMuYWRkKGJhc2VJbXBsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJTaW1wbGUgdHlwZSByZXN0cmljdGlvbnMgbXVzdCBuYW1lIGEgYmFzZSB0eXBlICIgKwotICAgICAgICAgICAgICAgICAgICAib3IgY29udGFpbiBhIG5lc3RlZCBzaW1wbGUgdHlwZTogbmVpdGhlciB3ZXJlIGZvdW5kLiIsCi0gICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5SRVNUUklDVElPTl9NSVNTSU5HX0JBU0UsCi0gICAgICAgICAgICAgICAgICAgIHBhcnNlUmVzdHIpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IHRyZWF0IGl0IGFzIGFuIGV4dGVuc2lvbiBvZiBhbnlTaW1wbGVUeXBlCi0gICAgICAgICAgICBiYXNlSW1wbCA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWN1cnNpb24hCi0gICAgICAgIGlmICghU3RzY1Jlc29sdmVyLnJlc29sdmVUeXBlKGJhc2VJbXBsKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gY3ljbGljIGRlcGVuZGVuY3kgcmVjb3Zlcnk6IHRyZWF0IGl0IGFzIGFuIGV4dGVuc2lvbiBvZiBhbnlTaW1wbGVUeXBlCi0gICAgICAgICAgICBiYXNlSW1wbCA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmFzZUltcGwuZmluYWxSZXN0cmljdGlvbigpKQotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkNhbm5vdCByZXN0cmljdCBhIGZpbmFsIHR5cGUiLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0RFUklWRV9GSU5BTCwgcGFyc2VSZXN0cik7Ci0KLSAgICAgICAgc0ltcGwuc2V0QmFzZVR5cGVSZWYoYmFzZUltcGwuZ2V0UmVmKCkpOwotICAgICAgICBzSW1wbC5zZXRCYXNlRGVwdGgoYmFzZUltcGwuZ2V0QmFzZURlcHRoKCkgKyAxKTsKLSAgICAgICAgc0ltcGwuc2V0RGVyaXZhdGlvblR5cGUoU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTik7Ci0KLSAgICAgICAgaWYgKCFiYXNlSW1wbC5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkJhc2UgdHlwZSBmb3IgdGhpcyBzaW1wbGUgdHlwZSByZXN0cmljdGlvbiBpcyBub3Qgc2ltcGxlIiwKLSAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0LlNJTVBMRV9SRVNUUklDVElPTl9OT1RfU0lNUExFLAotICAgICAgICAgICAgICAgICAgICBwYXJzZVJlc3RyLnhnZXRCYXNlKCkpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IHRyZWF0IGl0IGFzIGEgcmVzdHJpY3Rpb24gb2YgYW55U2ltcGxlVHlwZQotICAgICAgICAgICAgcmVzb2x2ZUVycm9yU2ltcGxlVHlwZShzSW1wbCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzSW1wbC5zZXRTaW1wbGVUeXBlVmFyaWV0eShiYXNlSW1wbC5nZXRTaW1wbGVWYXJpZXR5KCkpOwotCi0gICAgICAgIC8vIGNvcHkgdmFyaWV0eS1zcGVjaWZpYyBwcm9wZXJ0aWVzCi0gICAgICAgIHN3aXRjaCAoYmFzZUltcGwuZ2V0U2ltcGxlVmFyaWV0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQVRPTUlDOgotICAgICAgICAgICAgICAgIHNJbXBsLnNldFByaW1pdGl2ZVR5cGVSZWYoYmFzZUltcGwuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldFJlZigpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5VTklPTjoKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRVbmlvbk9mTGlzdHMoYmFzZUltcGwuaXNVbmlvbk9mTGlzdHMoKSk7Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0VW5pb25NZW1iZXJUeXBlUmVmcyhtYWtlUmVmQXJyYXkoQXJyYXlzLmFzTGlzdChiYXNlSW1wbC5nZXRVbmlvbk1lbWJlclR5cGVzKCkpKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTElTVDoKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRMaXN0SXRlbVR5cGVSZWYoYmFzZUltcGwuZ2V0TGlzdEl0ZW1UeXBlKCkuZ2V0UmVmKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGVhbCB3aXRoIGZhY2V0cwotICAgICAgICByZXNvbHZlRmFjZXRzKHNJbXBsLCBwYXJzZVJlc3RyLCBiYXNlSW1wbCk7Ci0KLSAgICAgICAgLy8gbm93IGNvbXB1dGUgb3VyIGludHJpbnNpYyBwcm9wZXJ0aWVzCi0gICAgICAgIHJlc29sdmVGdW5kYW1lbnRhbEZhY2V0cyhzSW1wbCk7Ci0gICAgfQotCi0gICAgc3RhdGljIGludCB0cmFuc2xhdGVXaGl0ZXNwYWNlQ29kZShYbWxBbnlTaW1wbGVUeXBlIHZhbHVlKQotICAgIHsKLSAgICAgICAgLy8gQlVHQlVHOiBhZGQgd2hpdGVzcGFjZSBydWxlIHRvIHRleHR2YWx1ZS4KLSAgICAgICAgU3RyaW5nIHRleHR2YWwgPSB2YWx1ZS5nZXRTdHJpbmdWYWx1ZSgpOwotCi0gICAgICAgIGlmICh0ZXh0dmFsLmVxdWFscygiY29sbGFwc2UiKSkKLSAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLldTX0NPTExBUFNFOwotCi0gICAgICAgIGlmICh0ZXh0dmFsLmVxdWFscygicHJlc2VydmUiKSkKLSAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLldTX1BSRVNFUlZFOwotCi0gICAgICAgIGlmICh0ZXh0dmFsLmVxdWFscygicmVwbGFjZSIpKQotICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuV1NfUkVQTEFDRTsKLQotICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIlVucmVjb2duaXplZCB3aGl0ZXNwYWNlIHZhbHVlIFwiIiArIHRleHR2YWwgKyAiXCIiLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfVkFMVUVfTUFMRk9STUVELCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBTY2hlbWFUeXBlLldTX1VOU1BFQ0lGSUVEOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGlzTXVsdGlwbGVGYWNldChpbnQgZmFjZXRjb2RlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChmYWNldGNvZGUgPT0gU2NoZW1hVHlwZS5GQUNFVF9FTlVNRVJBVElPTiB8fAotICAgICAgICAgICAgICAgIGZhY2V0Y29kZSA9PSBTY2hlbWFUeXBlLkZBQ0VUX1BBVFRFUk4pOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGZhY2V0QXBwbGllc1RvVHlwZShpbnQgZmFjZXRDb2RlLCBTY2hlbWFUeXBlSW1wbCBiYXNlSW1wbCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoYmFzZUltcGwuZ2V0U2ltcGxlVmFyaWV0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTElTVDoKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGZhY2V0Q29kZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9MRU5HVEg6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fTEVOR1RIOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX0VOVU1FUkFUSU9OOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfUEFUVEVSTjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1dISVRFX1NQQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OOgotICAgICAgICAgICAgICAgIHN3aXRjaCAoZmFjZXRDb2RlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX0VOVU1FUkFUSU9OOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfUEFUVEVSTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0aGUgYXRvbWljIGNhc2UKLQotICAgICAgICBzd2l0Y2ggKGJhc2VJbXBsLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgotICAgICAgICAgICAgICAgIHN3aXRjaCAoZmFjZXRDb2RlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1BBVFRFUk46Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9XSElURV9TUEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRFVSQVRJT046Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGZhY2V0Q29kZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfRU5VTUVSQVRJT046Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9QQVRURVJOOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfV0hJVEVfU1BBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChmYWNldENvZGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1RPVEFMX0RJR0lUUzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX0ZSQUNUSU9OX0RJR0lUUzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX0VOVU1FUkFUSU9OOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfUEFUVEVSTjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1dISVRFX1NQQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChmYWNldENvZGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTEVOR1RIOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEg6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9FTlVNRVJBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1BBVFRFUk46Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9XSElURV9TUEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG90aGVyX3NpbWlsYXJfbGltaXQoaW50IGZhY2V0Y29kZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoZmFjZXRjb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRToKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRTsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkU7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRToKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHJlc29sdmVGYWNldHMoU2NoZW1hVHlwZUltcGwgc0ltcGwsIFhtbE9iamVjdCByZXN0cmljdGlvbiwgU2NoZW1hVHlwZUltcGwgYmFzZUltcGwpCi0gICAgewotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0KLSAgICAgICAgYm9vbGVhbltdIHNlZW5GYWNldCA9IG5ldyBib29sZWFuW1NjaGVtYVR5cGUuTEFTVF9GQUNFVCArIDFdOwotICAgICAgICBYbWxBbnlTaW1wbGVUeXBlW10gbXlGYWNldHMgPSBiYXNlSW1wbC5nZXRCYXNpY0ZhY2V0cygpOyAvLyBtYWtlcyBhIGNvcHkKLSAgICAgICAgYm9vbGVhbltdIGZpeGVkRmFjZXRzID0gYmFzZUltcGwuZ2V0Rml4ZWRGYWNldHMoKTsKLSAgICAgICAgaW50IHdzciA9IFNjaGVtYVR5cGUuV1NfVU5TUEVDSUZJRUQ7Ci0gICAgICAgIExpc3QgZW51bWVyYXRlZFZhbHVlcyA9IG51bGw7Ci0gICAgICAgIExpc3QgcGF0dGVybnMgPSBudWxsOwotCi0gICAgICAgIGlmIChyZXN0cmljdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxDdXJzb3IgY3VyID0gcmVzdHJpY3Rpb24ubmV3Q3Vyc29yKCk7Ci0gICAgICAgICAgICBmb3IgKGJvb2xlYW4gbW9yZSA9IGN1ci50b0ZpcnN0Q2hpbGQoKTsgbW9yZTsgbW9yZSA9IGN1ci50b05leHRTaWJsaW5nKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGNvZGUgPSB0cmFuc2xhdGVGYWNldENvZGUoY3VyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgRmFjZXQgZmFjZXQgPSAoRmFjZXQpY3VyLmdldE9iamVjdCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFmYWNldEFwcGxpZXNUb1R5cGUoY29kZSwgYmFzZUltcGwpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlRoZSBmYWNldCAiICsgZmFjZXQubmV3Q3Vyc29yKCkuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpICsgIiBkb2VzIG5vdCBhcHBseSB0byB0aGUgYmFzZSB0eXBlICIgKyBiYXNlSW1wbCwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX0RPRVNfTk9UX0FQUExZLCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2VlbkZhY2V0W2NvZGVdICYmICFpc011bHRpcGxlRmFjZXQoY29kZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiRmFjZXQgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX0RVUExJQ0FURUQsIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlZW5GYWNldFtjb2RlXSA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTEVOR1RIOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG15RmFjZXRzW1NjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSF0gIT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15RmFjZXRzW1NjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSF0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ2Fubm90IHNwZWNpZnkgbGVuZ3RoIGluIGFkZGl0aW9uIHRvIG1pbkxlbmd0aCBvciBtYXhMZW5ndGgiLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfRFVQTElDQVRFRCwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgWG1sSW50ZWdlciBsZW4gPSBTdHNjVHJhbnNsYXRvci5idWlsZE5uSW50ZWdlcihmYWNldC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIiLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfVkFMVUVfTUFMRk9STUVELCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZml4ZWRGYWNldHNbY29kZV0gJiYgIW15RmFjZXRzW2NvZGVdLnZhbHVlRXF1YWxzKGxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlRoaXMgZmFjZXQgaXMgZml4ZWQgYW5kIGNhbm5vdCBiZSBvdmVycmlkZGVuIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX0ZJWEVELCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBteUZhY2V0c1tjb2RlXSA9IGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fTEVOR1RIOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChteUZhY2V0c1tTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSF0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ2Fubm90IHNwZWNpZnkgbWluTGVuZ3RoIG9yIG1heExlbmd0aCBpbiBhZGRpdGlvbiB0byBsZW5ndGgiLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfRFVQTElDQVRFRCwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgWG1sSW50ZWdlciBtbGVuID0gU3RzY1RyYW5zbGF0b3IuYnVpbGRObkludGVnZXIoZmFjZXQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWxlbiA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJNdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9WQUxVRV9NQUxGT1JNRUQsIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXhlZEZhY2V0c1tjb2RlXSAmJiAhbXlGYWNldHNbY29kZV0udmFsdWVFcXVhbHMobWxlbikpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlRoaXMgZmFjZXQgaXMgZml4ZWQgYW5kIGNhbm5vdCBiZSBvdmVycmlkZGVuIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX0ZJWEVELCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXlGYWNldHNbU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIXSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtbGVuLmNvbXBhcmVWYWx1ZShteUZhY2V0c1tTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEhdKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTGFyZ2VyIHRoYW4gcHJpb3IgbWF4TGVuZ3RoIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX1ZBTFVFX01BTEZPUk1FRCwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXlGYWNldHNbU2NoZW1hVHlwZS5GQUNFVF9NSU5fTEVOR1RIXSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtbGVuLmNvbXBhcmVWYWx1ZShteUZhY2V0c1tTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEhdKSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiU21hbGxlciB0aGFuIHByaW9yIG1pbkxlbmd0aCIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9WQUxVRV9NQUxGT1JNRUQsIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbXlGYWNldHNbY29kZV0gPSBtbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1RPVEFMX0RJR0lUUzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX0ZSQUNUSU9OX0RJR0lUUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXN0b3RhbGRpZyA9IChjb2RlID09IFNjaGVtYVR5cGUuRkFDRVRfVE9UQUxfRElHSVRTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbEludGVnZXIgZGlnID0gU3RzY1RyYW5zbGF0b3IuYnVpbGRObkludGVnZXIoZmFjZXQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlnID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX1ZBTFVFX01BTEZPUk1FRCwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpeGVkRmFjZXRzW2NvZGVdICYmICFteUZhY2V0c1tjb2RlXS52YWx1ZUVxdWFscyhkaWcpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJUaGlzIGZhY2V0IGlzIGZpeGVkIGFuZCBjYW5ub3QgYmUgb3ZlcnJpZGRlbiIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9GSVhFRCwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG15RmFjZXRzW1NjaGVtYVR5cGUuRkFDRVRfVE9UQUxfRElHSVRTXSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWcuY29tcGFyZVZhbHVlKG15RmFjZXRzW1NjaGVtYVR5cGUuRkFDRVRfVE9UQUxfRElHSVRTXSkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTGFyZ2VyIHRoYW4gcHJpb3IgdG90YWxEaWdpdHMiLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfVkFMVUVfTUFMRk9STUVELCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzdG90YWxkaWcgJiYgbXlGYWNldHNbU2NoZW1hVHlwZS5GQUNFVF9GUkFDVElPTl9ESUdJVFNdICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZy5jb21wYXJlVmFsdWUobXlGYWNldHNbU2NoZW1hVHlwZS5GQUNFVF9GUkFDVElPTl9ESUdJVFNdKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJMYXJnZXIgdGhhbiBwcmlvciBmcmFjdGlvbkRpZ2l0cyIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9WQUxVRV9NQUxGT1JNRUQsIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG15RmFjZXRzW2NvZGVdID0gZGlnOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkU6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWVuRmFjZXRbb3RoZXJfc2ltaWxhcl9saW1pdChjb2RlKV0pCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkNhbm5vdCBkZWZpbmUgYm90aCBpbmNsdXNpdmUgYW5kIGV4Y2x1c2l2ZSBsaW1pdCBpbiB0aGUgc2FtZSByZXN0cmljaXRvbiIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9EVVBMSUNBVEVELCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzbWluID0gKGNvZGUgPT0gU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFIHx8IGNvZGUgPT0gU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNleGNsdXNpdmUgPSAoY29kZSA9PSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUgfHwgY29kZSA9PSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBYbWxBbnlTaW1wbGVUeXBlIGxpbWl0OwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBiYXNlSW1wbC5uZXdWYWx1ZShmYWNldC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RlOiB0aGlzIGd1YXJhbnRlZXMgdGhhdCB0aGUgbGltaXQgaXMgYSB2YWxpZCBudW1iZXIgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFzZSBkYXRhIHR5cGUhIQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJNdXN0IGJlIHZhbGlkIHZhbHVlIGluIGJhc2UgdHlwZSIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9WQUxVRV9NQUxGT1JNRUQsIGZhY2V0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJVR0JVRzogaWYgdGhlcmUgYXJlIGFjdHVhbCBzY2hlbWFzIHRoYXQgcmVkZWZpbmUgbWluL21heEV4Y2x1c2l2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGV5IHdpbGwgbmVlZCB0aGlzIHJ1bGUgcmVsYXhlZCBmb3IgdGhlbSEhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZml4ZWRGYWNldHNbY29kZV0gJiYgIW15RmFjZXRzW2NvZGVdLnZhbHVlRXF1YWxzKGxpbWl0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiVGhpcyBmYWNldCBpcyBmaXhlZCBhbmQgY2Fubm90IGJlIG92ZXJyaWRkZW4iLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfRklYRUQsIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChteUZhY2V0c1tjb2RlXSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wYXJpc29uID0gbGltaXQuY29tcGFyZVZhbHVlKG15RmFjZXRzW2NvZGVdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyaXNvbiA9PSAyIHx8IGNvbXBhcmlzb24gPT0gKGlzbWluID8gLTEgOiAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKGlzbWluID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNleGNsdXNpdmUgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcHJldmlvdXMgbWluRXhjbHVzaXZlIiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBwcmV2aW91cyBtaW5JbmNsdXNpdmUiKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzZXhjbHVzaXZlID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHByZXZpb3VzIG1heEV4Y2x1c2l2ZSIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcHJldmlvdXMgbWF4SW5jbHVzaXZlIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX1ZBTFVFX01BTEZPUk1FRCwgZmFjZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBteUZhY2V0c1tjb2RlXSA9IGxpbWl0OwotICAgICAgICAgICAgICAgICAgICAgICAgbXlGYWNldHNbb3RoZXJfc2ltaWxhcl9saW1pdChjb2RlKV0gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1dISVRFX1NQQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgd3NyID0gdHJhbnNsYXRlV2hpdGVzcGFjZUNvZGUoZmFjZXQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZUltcGwuZ2V0V2hpdGVTcGFjZVJ1bGUoKSA+IHdzcikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c3IgPSBTY2hlbWFUeXBlLldTX1VOU1BFQ0lGSUVEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDYW5ub3QgYXBwbHkgdGhpcyB3aGl0ZXNwYWNlIGZhY2V0IG92ZXIgdGhlIHByZXZpb3VzIG9uZSIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9WQUxVRV9NQUxGT1JNRUQsIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG15RmFjZXRzW2NvZGVdID0gU3RzY1N0YXRlLmJ1aWxkX3dzc3RyaW5nKHdzcikuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfRU5VTUVSQVRJT046Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3QgZW51bXZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW12YWwgPSBiYXNlSW1wbC5uZXdWYWx1ZShmYWNldC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnVtdmFsLnNldChmYWNldC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoKFhtbE9iamVjdEJhc2UpZW51bXZhbCkuc2V0SW1tdXRhYmxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkVudW1lcmF0ZWQgdmFsdWUgaW52YWxpZCBpbiBiYXNlIHR5cGUiLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfVkFMVUVfTUFMRk9STUVELCBmYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW51bWVyYXRlZFZhbHVlcyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZWRWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGVkVmFsdWVzLmFkZChlbnVtdmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9QQVRURVJOOgotICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uIHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgeyBwID0gbmV3IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbihmYWNldC5nZXRWYWx1ZSgpLmdldFN0cmluZ1ZhbHVlKCksICJYIik7IH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUGFyc2VFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTWFsZm9ybWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9WQUxVRV9NQUxGT1JNRUQsIGZhY2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJucyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybnMuYWRkKHApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGZhY2V0LmdldEZpeGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIGZpeGVkRmFjZXRzW2NvZGVdID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN0b3JlIHRoZSBhcnJheSBvZiBiYXNpYyBmYWNldHMKLQotICAgICAgICBzSW1wbC5zZXRCYXNpY0ZhY2V0cyhtYWtlVmFsdWVSZWZBcnJheShteUZhY2V0cyksIGZpeGVkRmFjZXRzKTsKLQotICAgICAgICAvLyBVcGRhdGUgdGhlIG51bWVyaWMgd2hpdGVzcGFjZSBydWxlCi0gICAgICAgIGlmICh3c3IgPT0gU2NoZW1hVHlwZS5XU19VTlNQRUNJRklFRCkKLSAgICAgICAgICAgIHdzciA9IGJhc2VJbXBsLmdldFdoaXRlU3BhY2VSdWxlKCk7Ci0gICAgICAgIHNJbXBsLnNldFdoaXRlU3BhY2VSdWxlKHdzcik7Ci0KLSAgICAgICAgLy8gc3RvcmUgYXdheSB0aGUgZW51bWVyYXRlZCB2YWx1ZXMKLSAgICAgICAgaWYgKGVudW1lcmF0ZWRWYWx1ZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc0ltcGwuc2V0RW51bWVyYXRpb25WYWx1ZXMobWFrZVZhbHVlUmVmQXJyYXkoKFhtbEFueVNpbXBsZVR5cGVbXSkKLSAgICAgICAgICAgICAgICBlbnVtZXJhdGVkVmFsdWVzLnRvQXJyYXkobmV3IFhtbEFueVNpbXBsZVR5cGVbZW51bWVyYXRlZFZhbHVlcy5zaXplKCldKSkpOwotCi0gICAgICAgICAgICBTY2hlbWFUeXBlIGJlVHlwZSA9IHNJbXBsOwotICAgICAgICAgICAgaWYgKHNJbXBsLmdldEJhc2VUeXBlKCkuZ2V0QmFzZUVudW1UeXBlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBiZVR5cGUgPSBzSW1wbC5nZXRCYXNlVHlwZSgpLmdldEJhc2VFbnVtVHlwZSgpOwotICAgICAgICAgICAgc0ltcGwuc2V0QmFzZUVudW1UeXBlUmVmKGJlVHlwZS5nZXRSZWYoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzSW1wbC5jb3B5RW51bWVyYXRpb25WYWx1ZXMoYmFzZUltcGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc3RvcmUgdGhlIHBhdHRlcm4gbGlzdAotICAgICAgICBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bXSBwYXR0ZXJuQXJyYXk7Ci0gICAgICAgIGlmIChwYXR0ZXJucyAhPSBudWxsKQotICAgICAgICAgICAgcGF0dGVybkFycmF5ID0gKG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbltdKXBhdHRlcm5zLnRvQXJyYXkoRU1QVFlfUkVHRVhfQVJSQVkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwYXR0ZXJuQXJyYXkgPSBFTVBUWV9SRUdFWF9BUlJBWTsKLSAgICAgICAgc0ltcGwuc2V0UGF0dGVybkZhY2V0KChwYXR0ZXJuQXJyYXkubGVuZ3RoID4gMCB8fCBiYXNlSW1wbC5oYXNQYXR0ZXJuRmFjZXQoKSkpOwotICAgICAgICBzSW1wbC5zZXRQYXR0ZXJucyhwYXR0ZXJuQXJyYXkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFhtbFZhbHVlUmVmW10gbWFrZVZhbHVlUmVmQXJyYXkoWG1sQW55U2ltcGxlVHlwZVtdIHNvdXJjZSkKLSAgICB7Ci0gICAgICAgIFhtbFZhbHVlUmVmW10gcmVzdWx0ID0gbmV3IFhtbFZhbHVlUmVmW3NvdXJjZS5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHJlc3VsdFtpXSA9IChzb3VyY2VbaV0gPT0gbnVsbCA/IG51bGwgOiBuZXcgWG1sVmFsdWVSZWYoc291cmNlW2ldKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uW10gRU1QVFlfUkVHRVhfQVJSQVkgPSBuZXcgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uWzBdOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0Rpc2NyZXRlVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKLSAgICB7Ci0gICAgICAgIGlmIChzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0ZSQUNUSU9OX0RJR0lUUykgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAvLyBCVUdCVUc6IHNwZWMgaXMgc2lsZW50IG9uIGVudW1lcmF0aW9uczsgdGhleSdyZSBmaW5pdGUgdG9vLgotICAgICAgICBzd2l0Y2ggKHNJbXBsLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTnVtZXJpY1ByaW1pdGl2ZShTY2hlbWFUeXBlIHNJbXBsKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChzSW1wbC5nZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZGVjaW1hbFNpemVPZlR5cGUoU2NoZW1hVHlwZUltcGwgc0ltcGwpCi0gICAgewotICAgICAgICBpbnQgc2l6ZSA9IG1hdGhlbWF0aWNhbFNpemVPZlR5cGUoc0ltcGwpOwotICAgICAgICAKLSAgICAgICAgLy8gYnl0ZSBhbmQgc2hvcnQgYXJlIGluY29udmVuaWVudCwgYmVjYXVzZSBzZXRCeXRlKChieXRlKTQpIHJlcXVpcmVzIGEgY2FzdC4KLSAgICAgICAgLy8gU28gdXNlICJpbnQiIHVubGVzcyB5b3UncmUgcmVhbGx5IGEgeHM6Ynl0ZSwgeHM6c2hvcnQsIG9yIGFuIHhzOnVuc2lnbmVkQnl0ZQotICAgICAgICAvLyAodGhlIGxhc3QgY2FzZSBpcyBpbmNsdWRlZCBmb3IgYWxpZ25tZW50IHdpdGggSkFYQikKLSAgICAgICAgCi0gICAgICAgIGlmIChzaXplID09IFNjaGVtYVR5cGUuU0laRV9CWVRFICYmICFYbWxCeXRlLnR5cGUuaXNBc3NpZ25hYmxlRnJvbShzSW1wbCkpCi0gICAgICAgICAgICBzaXplID0gU2NoZW1hVHlwZS5TSVpFX1NIT1JUOwotICAgICAgICBpZiAoc2l6ZSA9PSBTY2hlbWFUeXBlLlNJWkVfU0hPUlQgJiYgIVhtbFNob3J0LnR5cGUuaXNBc3NpZ25hYmxlRnJvbShzSW1wbCkgJiYgIVhtbFVuc2lnbmVkQnl0ZS50eXBlLmlzQXNzaWduYWJsZUZyb20oc0ltcGwpKQotICAgICAgICAgICAgc2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9JTlQ7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1hdGhlbWF0aWNhbFNpemVPZlR5cGUoU2NoZW1hVHlwZUltcGwgc0ltcGwpCi0gICAgewotICAgICAgICBpZiAoc0ltcGwuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpICE9IFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUwpCi0gICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5OT1RfREVDSU1BTDsKLQotICAgICAgICBpZiAoc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9GUkFDVElPTl9ESUdJVFMpID09IG51bGwgfHwKLSAgICAgICAgICAgICgoU2ltcGxlVmFsdWUpc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9GUkFDVElPTl9ESUdJVFMpKS5nZXRCaWdJbnRlZ2VyVmFsdWUoKS5zaWdudW0oKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuU0laRV9CSUdfREVDSU1BTDsKLQotICAgICAgICBCaWdJbnRlZ2VyIG1pbiA9IG51bGw7Ci0gICAgICAgIEJpZ0ludGVnZXIgbWF4ID0gbnVsbDsKLQotICAgICAgICBpZiAoc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFKSAhPSBudWxsKQotICAgICAgICAgICAgbWluID0gKChTaW1wbGVWYWx1ZSlzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUpKS5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsgLy8gLmFkZChCaWdJbnRlZ2VyLk9ORSk7Ci0gICAgICAgIGlmIChzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpICE9IG51bGwpCi0gICAgICAgICAgICBtaW4gPSAoKFNpbXBsZVZhbHVlKXNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRSkpLmdldEJpZ0ludGVnZXJWYWx1ZSgpOwotICAgICAgICBpZiAoc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFKSAhPSBudWxsKQotICAgICAgICAgICAgbWF4ID0gKChTaW1wbGVWYWx1ZSlzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkUpKS5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsKLSAgICAgICAgaWYgKHNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRSkgIT0gbnVsbCkKLSAgICAgICAgICAgIG1heCA9ICgoU2ltcGxlVmFsdWUpc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFKSkuZ2V0QmlnSW50ZWdlclZhbHVlKCk7IC8vIC5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7Ci0KLSAgICAgICAgaWYgKHNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfVE9UQUxfRElHSVRTKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIHBlZyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHRvdGFsRGlnaXRzID0gKChTaW1wbGVWYWx1ZSlzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX1RPVEFMX0RJR0lUUykpLmdldEJpZ0ludGVnZXJWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoICh0b3RhbERpZ2l0cy5pbnRWYWx1ZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgICBwZWcgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoOTlMKTsgLy8gQllURSBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogY2FzZSA0OgotICAgICAgICAgICAgICAgICAgICAgICAgIHBlZyA9IEJpZ0ludGVnZXIudmFsdWVPZig5OTk5TCk7IC8vIFNIT1JUIHNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiBjYXNlIDY6IGNhc2UgNzogY2FzZSA4OiBjYXNlIDk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcGVnID0gQmlnSW50ZWdlci52YWx1ZU9mKDk5OTk5OTk5OUwpOyAvLyBJTlQgc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOiBjYXNlIDExOiBjYXNlIDEyOiBjYXNlIDEzOiBjYXNlIDE0OgotICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OiBjYXNlIDE2OiBjYXNlIDE3OiBjYXNlIDE4OgotICAgICAgICAgICAgICAgICAgICAgICAgIHBlZyA9IEJpZ0ludGVnZXIudmFsdWVPZig5OTk5OTk5OTk5OTk5OTk5OTlMKTsgLy8gTE9ORyBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgaWYgKHBlZyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1pbiA9IChtaW4gPT0gbnVsbCA/IHBlZy5uZWdhdGUoKSA6IG1pbi5tYXgocGVnLm5lZ2F0ZSgpKSk7Ci0gICAgICAgICAgICAgICAgbWF4ID0gKG1heCA9PSBudWxsID8gcGVnIDogbWF4Lm1pbihwZWcpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtaW4gIT0gbnVsbCAmJiBtYXggIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZmluZCB0aGUgbGFyZ2VzdCAiYWJzb2x1dGUgdmFsdWUiIG51bWJlciB0aGF0IG11c3QgYmUgZGVhbHQgd2l0aAotICAgICAgICAgICAgaWYgKG1pbi5zaWdudW0oKSA8IDApCi0gICAgICAgICAgICAgICAgbWluID0gbWluLm5lZ2F0ZSgpLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTsKLSAgICAgICAgICAgIGlmIChtYXguc2lnbnVtKCkgPCAwKQotICAgICAgICAgICAgICAgIG1heCA9IG1heC5uZWdhdGUoKS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7Ci0KLSAgICAgICAgICAgIG1heCA9IG1heC5tYXgobWluKTsKLSAgICAgICAgICAgIGlmIChtYXguY29tcGFyZVRvKEJpZ0ludGVnZXIudmFsdWVPZihCeXRlLk1BWF9WQUxVRSkpIDw9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuU0laRV9CWVRFOwotICAgICAgICAgICAgaWYgKG1heC5jb21wYXJlVG8oQmlnSW50ZWdlci52YWx1ZU9mKFNob3J0Lk1BWF9WQUxVRSkpIDw9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuU0laRV9TSE9SVDsKLSAgICAgICAgICAgIGlmIChtYXguY29tcGFyZVRvKEJpZ0ludGVnZXIudmFsdWVPZihJbnRlZ2VyLk1BWF9WQUxVRSkpIDw9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuU0laRV9JTlQ7Ci0gICAgICAgICAgICBpZiAobWF4LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NQVhfVkFMVUUpKSA8PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLlNJWkVfTE9ORzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVI7Ci0gICAgfQotCi0KLSAgICBzdGF0aWMgdm9pZCByZXNvbHZlRnVuZGFtZW50YWxGYWNldHMoU2NoZW1hVHlwZUltcGwgc0ltcGwpCi0gICAgewotICAgICAgICAvLyBkZWFsIHdpdGgsIGlzT3JkZXJlZCwgaXNCb3VuZGVkLCBpc0Zpbml0ZSwgaXNOdW1lcmljCi0gICAgICAgIC8vIGFsc28gZGVhbCB3aXRoCi0gICAgICAgIHN3aXRjaCAoc0ltcGwuZ2V0U2ltcGxlVmFyaWV0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQVRPTUlDOgotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVJbXBsIGJhc2VJbXBsID0gKFNjaGVtYVR5cGVJbXBsKXNJbXBsLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0T3JkZXJlZChiYXNlSW1wbC5vcmRlcmVkKCkpOwotICAgICAgICAgICAgICAgIHNJbXBsLnNldEJvdW5kZWQoCi0gICAgICAgICAgICAgICAgICAgIChzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUpICE9IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgIHNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRSkgIT0gbnVsbCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRSkgIT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFKSAhPSBudWxsKSk7Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0RmluaXRlKGJhc2VJbXBsLmlzRmluaXRlKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0ltcGwuaXNCb3VuZGVkKCkgJiYgaXNEaXNjcmV0ZVR5cGUoc0ltcGwpKTsKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXROdW1lcmljKGJhc2VJbXBsLmlzTnVtZXJpYygpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVtZXJpY1ByaW1pdGl2ZShzSW1wbC5nZXRQcmltaXRpdmVUeXBlKCkpKTsKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXREZWNpbWFsU2l6ZShkZWNpbWFsU2l6ZU9mVHlwZShzSW1wbCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OOgotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVbXSBtVHlwZXMgPSBzSW1wbC5nZXRVbmlvbk1lbWJlclR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgaW50IG9yZGVyZWQgPSBTY2hlbWFUeXBlLlVOT1JERVJFRDsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzQm91bmRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Zpbml0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc051bWVyaWMgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vIG9yZGVyZWQgaWYgYW55IGlzIG9yZGVyZWQsIGJvdW5kZWQgaWYgYWxsIGFyZSBib3VuZGVkLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1UeXBlc1tpXS5vcmRlcmVkKCkgIT0gU2NoZW1hVHlwZS5VTk9SREVSRUQpCi0gICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkID0gU2NoZW1hVHlwZS5QQVJUSUFMX09SREVSOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1UeXBlc1tpXS5pc0JvdW5kZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzQm91bmRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1UeXBlc1tpXS5pc0Zpbml0ZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgaXNGaW5pdGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtVHlwZXNbaV0uaXNOdW1lcmljKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBpc051bWVyaWMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0T3JkZXJlZChvcmRlcmVkKTsKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRCb3VuZGVkKGlzQm91bmRlZCk7Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0RmluaXRlKGlzRmluaXRlKTsKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXROdW1lcmljKGlzTnVtZXJpYyk7Ci0gICAgICAgICAgICAgICAgc0ltcGwuc2V0RGVjaW1hbFNpemUoU2NoZW1hVHlwZS5OT1RfREVDSU1BTCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTElTVDoKLSAgICAgICAgICAgICAgICBzSW1wbC5zZXRPcmRlcmVkKFNjaGVtYVR5cGUuVU5PUkRFUkVEKTsKLSAgICAgICAgICAgICAgICAvLyBCVUdCVUc6IHRoZSBzY2hlbWEgc3BlYyBpcyB3cm9uZyBoZXJlOiBNSU5fTEVOR1RIIGlzIG5vdCBuZWVkZWQsIGJlYXVzZSBsZW4gPj0wCi0gICAgICAgICAgICAgICAgc0ltcGwuc2V0Qm91bmRlZChzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSCkgIT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICBzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEgpICE9IG51bGwpOwotICAgICAgICAgICAgICAgIC8vIEJVR0JVRzogdGhlIHNjaGVtYSBzcGVjIGlzIHdyb25nIGhlcmU6IGZpbml0ZSBjYXJkaW5hbGl0eSByZXF1aXJlcyBpdGVtIHR5cGUgaXMgZmluaXRlCi0gICAgICAgICAgICAgICAgc0ltcGwuc2V0RmluaXRlKHNJbXBsLmdldExpc3RJdGVtVHlwZSgpLmlzRmluaXRlKCkgJiYgc0ltcGwuaXNCb3VuZGVkKCkpOwotICAgICAgICAgICAgICAgIHNJbXBsLnNldE51bWVyaWMoZmFsc2UpOwotICAgICAgICAgICAgICAgIHNJbXBsLnNldERlY2ltYWxTaXplKFNjaGVtYVR5cGUuTk9UX0RFQ0lNQUwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29kZUZvck5hbWVFbnRyeQotICAgIHsKLSAgICAgICAgQ29kZUZvck5hbWVFbnRyeShRTmFtZSBuYW1lLCBpbnQgY29kZSkKLSAgICAgICAgICAgIHsgdGhpcy5uYW1lID0gbmFtZTsgdGhpcy5jb2RlID0gY29kZTsgfQotICAgICAgICBwdWJsaWMgUU5hbWUgbmFtZTsKLSAgICAgICAgcHVibGljIGludCBjb2RlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIENvZGVGb3JOYW1lRW50cnlbXSBmYWNldENvZGVzID0gbmV3IENvZGVGb3JOYW1lRW50cnlbXQotICAgIHsKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJsZW5ndGgiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hVHlwZS5GQUNFVF9MRU5HVEgpLAotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoIm1pbkxlbmd0aCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEgpLAotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoIm1heExlbmd0aCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEgpLAotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoInBhdHRlcm4iLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hVHlwZS5GQUNFVF9QQVRURVJOKSwKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJlbnVtZXJhdGlvbiIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX0VOVU1FUkFUSU9OKSwKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJ3aGl0ZVNwYWNlIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVR5cGUuRkFDRVRfV0hJVEVfU1BBQ0UpLAotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoIm1heEluY2x1c2l2ZSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkUpLAotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoIm1heEV4Y2x1c2l2ZSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpLAotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoIm1pbkluY2x1c2l2ZSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpLAotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoIm1pbkV4Y2x1c2l2ZSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUpLAotICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoInRvdGFsRGlnaXRzIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVR5cGUuRkFDRVRfVE9UQUxfRElHSVRTKSwKLSAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJmcmFjdGlvbkRpZ2l0cyIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX0ZSQUNUSU9OX0RJR0lUUyksCi0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBmYWNldENvZGVNYXAgPSBidWlsZEZhY2V0Q29kZU1hcCgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGJ1aWxkRmFjZXRDb2RlTWFwKCkKLSAgICB7Ci0gICAgICAgIE1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZhY2V0Q29kZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICByZXN1bHQucHV0KGZhY2V0Q29kZXNbaV0ubmFtZSwgIG5ldyBJbnRlZ2VyKGZhY2V0Q29kZXNbaV0uY29kZSkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCB0cmFuc2xhdGVGYWNldENvZGUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIEludGVnZXIgcmVzdWx0ID0gKChJbnRlZ2VyKWZhY2V0Q29kZU1hcC5nZXQobmFtZSkpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHJldHVybiByZXN1bHQuaW50VmFsdWUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjU3RhdGUuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTQ4MzA2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwNCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb25maWcuU2NoZW1hQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYU1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxTdHJpbmdJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC51dGlsLkhleEJpbjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIHRoZSBTY2hlbWFUeXBlU3lzdGVtQ29tcGlsZXIgYXMgaXQncwotICogZ29pbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHNjU3RhdGUKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfZ2l2ZW5TdHNOYW1lOwotICAgIHByaXZhdGUgQ29sbGVjdGlvbiBfZXJyb3JMaXN0ZW5lcjsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIF90YXJnZXQ7Ci0gICAgcHJpdmF0ZSBTY2hlbWFDb25maWcgX2NvbmZpZzsKLSAgICBwcml2YXRlIE1hcCBfY29tcGF0TWFwOwotICAgIHByaXZhdGUgYm9vbGVhbiBfZG9pbmdEb3dubG9hZHM7Ci0gICAgcHJpdmF0ZSBieXRlW10gX2RpZ2VzdCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9ub0RpZ2VzdCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlTG9hZGVyIF9pbXBvcnRpbmdMb2FkZXI7Ci0KLSAgICBwcml2YXRlIE1hcCBfcmVkZWZpbmVkR2xvYmFsVHlwZXMgICAgICAgID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIE1hcCBfcmVkZWZpbmVkTW9kZWxHcm91cHMgICAgICAgID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIE1hcCBfcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzICAgID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgCi0gICAgcHJpdmF0ZSBNYXAgX2dsb2JhbFR5cGVzICAgICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX2dsb2JhbEVsZW1lbnRzICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX2dsb2JhbEF0dHJpYnV0ZXMgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX21vZGVsR3JvdXBzICAgICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX2F0dHJpYnV0ZUdyb3VwcyAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX2RvY3VtZW50VHlwZXMgICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX2F0dHJpYnV0ZVR5cGVzICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX3R5cGVzQnlDbGFzc25hbWUgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX21pc3NwZWxsZWROYW1lcyAgICA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBTZXQgX3Byb2Nlc3NpbmdHcm91cHMgICA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgcHJpdmF0ZSBNYXAgX2lkQ29uc3RyYWludHMgICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBTZXQgX25hbWVzcGFjZXMgICAgICAgICA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9ub1VwYTsKLSAgICBwcml2YXRlIGJvb2xlYW4gX25vUHZyOwotICAgIHByaXZhdGUgU2V0IF9tZGVmTmFtZXNwYWNlcyAgICAgPSBidWlsZERlZmF1bHRNZGVmTmFtZXNwYWNlcygpOwotICAgIHByaXZhdGUgRW50aXR5UmVzb2x2ZXIgX2VudGl0eVJlc29sdmVyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0IGJ1aWxkRGVmYXVsdE1kZWZOYW1lc3BhY2VzKCkKLSAgICB7Ci0gICAgICAgIC8vIG5hbWVzcGFjZXMgd2hpY2ggYXJlIGtub3duIHRvIGFwcGVhciBpbiBXU0RMcyByZWR1bmRhbnRseQotICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQoCi0gICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCggbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cub3BlbnVyaS5vcmcvMjAwMi8wNC9zb2FwL2NvbnZlcnNhdGlvbi8iLAotICAgICAgICAgICAgICAgIH0pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIHN0b3JlIHRoZSBuZXcgdGFyZ2V0IG5hbWVzcGFjZSBmb3IgYSBjaGFtZWxlb24KLSAgICAgKiBpbmNsdWRlZCBzY2hlbWEuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgQ0hBTUVMRU9OX0lOQ0xVREVfVVJJID0gbmV3IE9iamVjdCgpOwotCi0gICAgLyoqCi0gICAgICogT25seSBjb25zdHJ1Y3RlZCB2aWEgU3RzY1N0YXRlLnN0YXJ0KCkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHNjU3RhdGUoKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplciBmb3Igc2NoZW1hdHlwZXBhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbXBvcnRpbmdUeXBlTG9hZGVyKFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyKQotICAgIHsKLSAgICAgICAgX2ltcG9ydGluZ0xvYWRlciA9IGxvYWRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplciBmb3IgZXJyb3IgaGFuZGxpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXJyb3JMaXN0ZW5lcihDb2xsZWN0aW9uIGVycm9yTGlzdGVuZXIpCi0gICAgICAgIHsgX2Vycm9yTGlzdGVuZXIgPSBlcnJvckxpc3RlbmVyOyB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXNzZXMgYW4gZXJyb3Igb24gdG8gdGhlIGN1cnJlbnQgWG1sRXJyb3JDb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgY29kZSwgWG1sT2JqZWN0IGxvYykKLSAgICAgICAgeyBhZGRFcnJvcihfZXJyb3JMaXN0ZW5lciwgbWVzc2FnZSwgY29kZSwgbG9jKTsgfQotCi0gICAgLyoqCi0gICAgICogUGFzc2VzIGEgd2FybmluZyBvbiB0byB0aGUgY3VycmVudCBYbWxFcnJvckNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2FybmluZyhTdHJpbmcgbWVzc2FnZSwgaW50IGNvZGUsIFhtbE9iamVjdCBsb2MpCi0gICAgewotICAgICAgICAvLyBpdCdzIE9LIGZvciBYTUxTY2hlbWEueHNkIGl0c2VsZiB0byBoYXZlIHJlc2VydmVkIHR5cGUgbmFtZXMKLSAgICAgICAgaWYgKGNvZGUgPT0gWG1sRXJyb3JDb250ZXh0LlJFU0VSVkVEX1RZUEVfTkFNRSAmJgotICAgICAgICAgICAgICAgIGxvYy5kb2N1bWVudFByb3BlcnRpZXMoKS5nZXRTb3VyY2VOYW1lKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIGxvYy5kb2N1bWVudFByb3BlcnRpZXMoKS5nZXRTb3VyY2VOYW1lKCkuaW5kZXhPZigiWE1MU2NoZW1hLnhzZCIpID4gMCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBhZGRXYXJuaW5nKF9lcnJvckxpc3RlbmVyLCBtZXNzYWdlLCBjb2RlLCBsb2MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhc3NlcyBhIHdhcm5pbmcgb24gdG8gdGhlIGN1cnJlbnQgWG1sRXJyb3JDb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluZm8oU3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgIHsgYWRkSW5mbyhfZXJyb3JMaXN0ZW5lciwgbWVzc2FnZSk7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFcnJvcihDb2xsZWN0aW9uIGVycm9yTGlzdGVuZXIsIFN0cmluZyBtZXNzYWdlLCBpbnQgY29kZSwgWG1sT2JqZWN0IGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgWG1sRXJyb3IgZXJyID0KLSAgICAgICAgICAgIFhtbEVycm9yLmZvck9iamVjdCgKLSAgICAgICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICAgICAgWG1sRXJyb3IuU0VWRVJJVFlfRVJST1IsCi0gICAgICAgICAgICAgIGxvY2F0aW9uKTsKLSAgICAgICAgZXJyb3JMaXN0ZW5lci5hZGQoZXJyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRXJyb3IoQ29sbGVjdGlvbiBlcnJvckxpc3RlbmVyLCBTdHJpbmcgbWVzc2FnZSwgaW50IGNvZGUsIEZpbGUgbG9jYXRpb24pCi0gICAgewotICAgICAgICBYbWxFcnJvciBlcnIgPQotICAgICAgICAgICAgWG1sRXJyb3IuZm9yTG9jYXRpb24oCi0gICAgICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgICAgIFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SLAotICAgICAgICAgICAgICBsb2NhdGlvbi50b1VSSSgpLnRvU3RyaW5nKCksIDAsIDAsIDApOwotICAgICAgICBlcnJvckxpc3RlbmVyLmFkZChlcnIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRXYXJuaW5nKENvbGxlY3Rpb24gZXJyb3JMaXN0ZW5lciwgU3RyaW5nIG1lc3NhZ2UsIGludCBjb2RlLCBYbWxPYmplY3QgbG9jYXRpb24pCi0gICAgewotICAgICAgICBYbWxFcnJvciBlcnIgPQotICAgICAgICAgICAgWG1sRXJyb3IuZm9yT2JqZWN0KAotICAgICAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgICAgICBYbWxFcnJvci5TRVZFUklUWV9XQVJOSU5HLAotICAgICAgICAgICAgICBsb2NhdGlvbik7Ci0gICAgICAgIGVycm9yTGlzdGVuZXIuYWRkKGVycik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEluZm8oQ29sbGVjdGlvbiBlcnJvckxpc3RlbmVyLCBTdHJpbmcgbWVzc2FnZSkKLSAgICB7Ci0gICAgICAgIFhtbEVycm9yIGVyciA9IFhtbEVycm9yLmZvck1lc3NhZ2UobWVzc2FnZSwgWG1sRXJyb3IuU0VWRVJJVFlfSU5GTyk7Ci0gICAgICAgIGVycm9yTGlzdGVuZXIuYWRkKGVycik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEdpdmVuVHlwZVN5c3RlbU5hbWUoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsgX2dpdmVuU3RzTmFtZSA9IG5hbWU7IH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVyIGZvciByZWZlcmVuY2VzIHRvIHRoZSBTY2hlbWFUeXBlTG9hZGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0U2NoZW1hVHlwZVN5c3RlbShTY2hlbWFUeXBlU3lzdGVtSW1wbCB0YXJnZXQpCi0gICAgICAgIHsgX3RhcmdldCA9IHRhcmdldDsgfQotICAgIAotICAgIC8qKgotICAgICAqIEFjY3VtdWxhdGVzIGEgc2NoZW1hIGRpZ2VzdC4uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFNjaGVtYURpZ2VzdChieXRlW10gZGlnZXN0KQotICAgIHsKLSAgICAgICAgaWYgKF9ub0RpZ2VzdCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIGlmIChkaWdlc3QgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX25vRGlnZXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIF9kaWdlc3QgPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoX2RpZ2VzdCA9PSBudWxsKQotICAgICAgICAgICAgX2RpZ2VzdCA9IG5ldyBieXRlWzEyOC84XTsgLy8gMTI4IGJpdHMuCi0gICAgICAgIGludCBsZW4gPSBfZGlnZXN0Lmxlbmd0aDsKLSAgICAgICAgaWYgKGRpZ2VzdC5sZW5ndGggPCBsZW4pCi0gICAgICAgICAgICBsZW4gPSBkaWdlc3QubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKQotICAgICAgICAgICAgX2RpZ2VzdFtpXSBePSBkaWdlc3RbaV07Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBTY2hlbWFUeXBlU3lzdGVtIHdoaWNoIHdlJ3JlIGJ1aWxkaW5nIHR5cGVzIG9uIGJlaGFsZiBvZi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbUltcGwgc3RzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfdGFyZ2V0ICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gX3RhcmdldDsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBuYW1lID0gX2dpdmVuU3RzTmFtZTsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCAmJiBfZGlnZXN0ICE9IG51bGwpCi0gICAgICAgICAgICBuYW1lID0gInMiICsgbmV3IFN0cmluZyhIZXhCaW4uZW5jb2RlKF9kaWdlc3QpKTsKLSAgICAgICAgCi0gICAgICAgIF90YXJnZXQgPSBuZXcgU2NoZW1hVHlwZVN5c3RlbUltcGwobmFtZSk7Ci0gICAgICAgIHJldHVybiBfdGFyZ2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIGdpdmVuIFVSSSBpcyBhIGxvY2FsIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGREb3dubG9hZFVSSShTdHJpbmcgdXJpU3RyaW5nKQotICAgIHsKLSAgICAgICAgaWYgKF9kb2luZ0Rvd25sb2FkcykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGlmICh1cmlTdHJpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgVVJJIHVyaSA9IG5ldyBVUkkodXJpU3RyaW5nKTsKLSAgICAgICAgICAgIHJldHVybiB1cmkuZ2V0U2NoZW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiZmlsZSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXIgZm9yIGNvbXBhdE1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPcHRpb25zKFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICB7Ci0gICAgICAgIGlmIChvcHRpb25zID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsgLy8gZGVmYXVsdHMgYXJlIGFsbCBmYWxzZS4gCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIF9jb21wYXRNYXAgPSAoTWFwKW9wdGlvbnMuZ2V0KFhtbE9wdGlvbnMuQ09NUElMRV9TVUJTVElUVVRFX05BTUVTKTsKLSAgICAgICAgX25vVXBhID0gb3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5DT01QSUxFX05PX1VQQV9SVUxFKSA/IHRydWUgOgotICAgICAgICAgICAgICAgICEidHJ1ZSIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgieG1sYmVhbi51bmlxdWVwYXJ0aWNsZWF0dHJpYnV0aW9uIiwgInRydWUiKSk7Ci0gICAgICAgIF9ub1B2ciA9IG9wdGlvbnMuaGFzT3B0aW9uKFhtbE9wdGlvbnMuQ09NUElMRV9OT19QVlJfUlVMRSkgPyB0cnVlIDoKLSAgICAgICAgICAgICAgICAhInRydWUiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoInhtbGJlYW4ucGFydGljbGVyZXN0cmljdGlvbiIsICJ0cnVlIikpOwotICAgICAgICBfZG9pbmdEb3dubG9hZHMgPSBvcHRpb25zLmhhc09wdGlvbihYbWxPcHRpb25zLkNPTVBJTEVfRE9XTkxPQURfVVJMUykgPyB0cnVlIDoKLSAgICAgICAgICAgICAgICAidHJ1ZSIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgieG1sYmVhbi5kb3dubG9hZHVybHMiLCAiZmFsc2UiKSk7Ci0gICAgICAgIF9lbnRpdHlSZXNvbHZlciA9IChFbnRpdHlSZXNvbHZlcilvcHRpb25zLmdldChYbWxPcHRpb25zLkVOVElUWV9SRVNPTFZFUik7Ci0gICAgICAgIGlmIChfZW50aXR5UmVzb2x2ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIF9kb2luZ0Rvd25sb2FkcyA9IHRydWU7Ci0gICAgICAgIAotICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5DT01QSUxFX01ERUZfTkFNRVNQQUNFUykpCi0gICAgICAgICAgICBfbWRlZk5hbWVzcGFjZXMuYWRkQWxsKChDb2xsZWN0aW9uKW9wdGlvbnMuZ2V0KFhtbE9wdGlvbnMuQ09NUElMRV9NREVGX05BTUVTUEFDRVMpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWF5IHJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIGN1c3RvbSBlbnRpdHkgcmVzb2x2ZXIuCi0gICAgICovIAotICAgIHB1YmxpYyBFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpCi0gICAgewotICAgICAgICByZXR1cm4gX2VudGl0eVJlc29sdmVyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIG5vIHVuaXF1ZSBwYXJ0aWNsZSBhdHRyaWJ1dGlvbiBvcHRpb24gaXMgc2V0Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbm9VcGEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9ub1VwYTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiBubyBwYXJ0aWNsZSB2YWxpZCAocmVzdHJpY2l0b24pIG9wdGlvbiBpcyBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBub1B2cigpCi0gICAgewotICAgICAgICByZXR1cm4gX25vUHZyOwotICAgIH0KLSAgICAKLQotICAgIC8qKgotICAgICAqIEludGVyY2VwdHMgWE1MIG5hbWVzIGFuZCB0cmFuc2xhdGVzIHRoZW0KLSAgICAgKiB0aHJvdWdoIHRoZSBjb21wYXQgbWFwLCBpZiBhbnkuCi0gICAgICoKLSAgICAgKiBBbHNvIGxvb2tzIGZvciBhIGRlZmF1bHQgbmFtZXNwYWNlIGZvciBnbG9iYWwgZGVmaW5pdGlvbnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBRTmFtZSBjb21wYXROYW1lKFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UpCi0gICAgewotICAgICAgICAvLyBmaXJzdCBjaGVjayBmb3IgYSBjaGFtZWxlb25OYW1lc3BhY2UgbmFtZXNwYWNlCi0gICAgICAgIGlmIChuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDAgJiYgY2hhbWVsZW9uTmFtZXNwYWNlICE9IG51bGwgJiYgY2hhbWVsZW9uTmFtZXNwYWNlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgIG5hbWUgPSBuZXcgUU5hbWUoY2hhbWVsZW9uTmFtZXNwYWNlLCBuYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICBpZiAoX2NvbXBhdE1hcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0KLSAgICAgICAgUU5hbWUgc3Vic3QgPSAoUU5hbWUpX2NvbXBhdE1hcC5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChzdWJzdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIHJldHVybiBzdWJzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplciBmb3IgdGhlIHNjaGVtYSBjb25maWcgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYUNvbmZpZyhTY2hlbWFDb25maWcgY29uZmlnKQotICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgewotICAgICAgICBfY29uZmlnID0gY29uZmlnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvb2tzIHVwIHBhY2thZ2Ugb3ZlcnJpZGUgZm9yIGEgbmFtZXNwYWNlIFVSSQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU92ZXJyaWRlKFN0cmluZyBuYW1lc3BhY2UpCi0gICAgewotICAgICAgICByZXR1cm4gX2NvbmZpZy5sb29rdXBQYWNrYWdlRm9yTmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9va3MgdXAgcGFja2FnZSBvdmVycmlkZSBmb3IgYSBuYW1lc3BhY2UgVVJJCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXZhUHJlZml4KFN0cmluZyBuYW1lc3BhY2UpCi0gICAgewotICAgICAgICByZXR1cm4gX2NvbmZpZy5sb29rdXBQcmVmaXhGb3JOYW1lc3BhY2UobmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb29rcyB1cCBwYWNrYWdlIG92ZXJyaWRlIGZvciBhIG5hbWVzcGFjZSBVUkkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEphdmFTdWZmaXgoU3RyaW5nIG5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY29uZmlnLmxvb2t1cFN1ZmZpeEZvck5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvb2tzIHVwIGNvbmZpZ3VyZWQgamF2YSBuYW1lIGZvciB0aGUgZ2l2ZW4gcW5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXZhbmFtZShRTmFtZSBxbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY29uZmlnLmxvb2t1cEphdmFuYW1lRm9yUU5hbWUocW5hbWUpOwotICAgIH0KLQotICAgIC8qIFNQRUxMSU5HUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNydW5jaE5hbWUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIC8vIGxvd2VyY2FzZSwgYW5kIGRyb3AgbmFtZXNwYWNlLgotICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKS50b0xvd2VyQ2FzZSgpOwotICAgIH0KLQotICAgIHZvaWQgYWRkU3BlbGxpbmcoUU5hbWUgbmFtZSwgU2NoZW1hQ29tcG9uZW50IGNvbXApCi0gICAgewotICAgICAgICBfbWlzc3BlbGxlZE5hbWVzLnB1dChjcnVuY2hOYW1lKG5hbWUpLCBjb21wKTsKLSAgICB9Ci0KLSAgICBTY2hlbWFDb21wb25lbnQgZmluZFNwZWxsaW5nKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKFNjaGVtYUNvbXBvbmVudClfbWlzc3BlbGxlZE5hbWVzLmdldChjcnVuY2hOYW1lKG5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKiBOQU1FU1BBQ0VTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSAgICB2b2lkIGFkZE5hbWVzcGFjZShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKQotICAgIHsKLSAgICAgICAgX25hbWVzcGFjZXMuYWRkKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgU3RyaW5nW10gZ2V0TmFtZXNwYWNlcygpCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKV9uYW1lc3BhY2VzLnRvQXJyYXkobmV3IFN0cmluZ1tfbmFtZXNwYWNlcy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGxpbmtlckRlZmluZXNOYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaW1wb3J0aW5nTG9hZGVyLmlzTmFtZXNwYWNlRGVmaW5lZChuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIC8qIFRZUEVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0gICAgU2NoZW1hVHlwZUltcGwgZmluZEdsb2JhbFR5cGUoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHJlc3VsdCA9IChTY2hlbWFUeXBlSW1wbClfZ2xvYmFsVHlwZXMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hVHlwZUltcGwpX2ltcG9ydGluZ0xvYWRlci5maW5kVHlwZShuYW1lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgU2NoZW1hVHlwZUltcGwgZmluZFJlZGVmaW5lZEdsb2JhbFR5cGUoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSwgUU5hbWUgcmVkZWZpbmVkTmFtZSkKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7Ci0gICAgICAgIGlmIChuYW1lLmVxdWFscyhyZWRlZmluZWROYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFUeXBlSW1wbClfcmVkZWZpbmVkR2xvYmFsVHlwZXMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgLy8gQlVHQlVHOiBzaG91bGQgYWxzbyBsaW5rIGFnYWluc3QgX2ltcG9ydGluZ0xvYWRlci5maW5kUmVkZWZpbmVkVHlwZQotICAgICAgICB9Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHJlc3VsdCA9IChTY2hlbWFUeXBlSW1wbClfZ2xvYmFsVHlwZXMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hVHlwZUltcGwpX2ltcG9ydGluZ0xvYWRlci5maW5kVHlwZShuYW1lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZEdsb2JhbFR5cGUoU2NoZW1hVHlwZUltcGwgdHlwZSwgYm9vbGVhbiByZWRlZmluZWQpCi0gICAgewotICAgICAgICBpZiAodHlwZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChyZWRlZmluZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9yZWRlZmluZWRHbG9iYWxUeXBlcy5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaWdub3JlTWRlZihuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJEdXBsaWNhdGUgZ2xvYmFsIHR5cGU6ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSksIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfR0xPQkFMX1RZUEUsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIF9yZWRlZmluZWRHbG9iYWxUeXBlcy5wdXQobmFtZSwgdHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9nbG9iYWxUeXBlcy5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaWdub3JlTWRlZihuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJEdXBsaWNhdGUgZ2xvYmFsIHR5cGU6ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSksIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfR0xPQkFMX1RZUEUsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfZ2xvYmFsVHlwZXMucHV0KG5hbWUsIHR5cGUpOwotICAgICAgICAgICAgICAgICAgICBhZGRTcGVsbGluZyhuYW1lLCB0eXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JlTWRlZihRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9tZGVmTmFtZXNwYWNlcy5jb250YWlucyhuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICB9Ci0KLSAgICBTY2hlbWFUeXBlW10gZ2xvYmFsVHlwZXMoKQotICAgICAgICB7IHJldHVybiAoU2NoZW1hVHlwZVtdKV9nbG9iYWxUeXBlcy52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFUeXBlW19nbG9iYWxUeXBlcy5zaXplKCldKTsgfQotCi0gICAgU2NoZW1hVHlwZVtdIHJlZGVmaW5lZEdsb2JhbFR5cGVzKCkKLSAgICAgICAgeyByZXR1cm4gKFNjaGVtYVR5cGVbXSlfcmVkZWZpbmVkR2xvYmFsVHlwZXMudmFsdWVzKCkudG9BcnJheShuZXcgU2NoZW1hVHlwZVtfcmVkZWZpbmVkR2xvYmFsVHlwZXMuc2l6ZSgpXSk7IH0KLSAgICAKLSAgICAvKiBET0NVTUVOVCBUWVBFUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotICAgIFNjaGVtYVR5cGVJbXBsIGZpbmREb2N1bWVudFR5cGUoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHJlc3VsdCA9IChTY2hlbWFUeXBlSW1wbClfZG9jdW1lbnRUeXBlcy5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdCA9IChTY2hlbWFUeXBlSW1wbClfaW1wb3J0aW5nTG9hZGVyLmZpbmREb2N1bWVudFR5cGUobmFtZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdm9pZCBhZGREb2N1bWVudFR5cGUoU2NoZW1hVHlwZUltcGwgdHlwZSwgUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChfZG9jdW1lbnRUeXBlcy5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFpZ25vcmVNZGVmKG5hbWUpKQotICAgICAgICAgICAgICAgIGVycm9yKCJEdXBsaWNhdGUgZ2xvYmFsIGVsZW1lbnQ6ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSksIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfR0xPQkFMX0VMRU1FTlQsIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIF9kb2N1bWVudFR5cGVzLnB1dChuYW1lLCB0eXBlKTsKLSAgICB9Ci0KLSAgICBTY2hlbWFUeXBlW10gZG9jdW1lbnRUeXBlcygpCi0gICAgICAgIHsgcmV0dXJuIChTY2hlbWFUeXBlW10pX2RvY3VtZW50VHlwZXMudmFsdWVzKCkudG9BcnJheShuZXcgU2NoZW1hVHlwZVtfZG9jdW1lbnRUeXBlcy5zaXplKCldKTsgfQotCi0gICAgLyogQVRUUklCVVRFIFRZUEVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0gICAgU2NoZW1hVHlwZUltcGwgZmluZEF0dHJpYnV0ZVR5cGUoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHJlc3VsdCA9IChTY2hlbWFUeXBlSW1wbClfYXR0cmlidXRlVHlwZXMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hVHlwZUltcGwpX2ltcG9ydGluZ0xvYWRlci5maW5kQXR0cmlidXRlVHlwZShuYW1lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZEF0dHJpYnV0ZVR5cGUoU2NoZW1hVHlwZUltcGwgdHlwZSwgUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChfYXR0cmlidXRlVHlwZXMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghaWdub3JlTWRlZihuYW1lKSkKLSAgICAgICAgICAgICAgICBlcnJvcigiRHVwbGljYXRlIGdsb2JhbCBhdHRyaWJ1dGU6ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSksIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfR0xPQkFMX0FUVFJJQlVURSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgX2F0dHJpYnV0ZVR5cGVzLnB1dChuYW1lLCB0eXBlKTsKLSAgICB9Ci0KLSAgICBTY2hlbWFUeXBlW10gYXR0cmlidXRlVHlwZXMoKQotICAgICAgICB7IHJldHVybiAoU2NoZW1hVHlwZVtdKV9hdHRyaWJ1dGVUeXBlcy52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFUeXBlW19hdHRyaWJ1dGVUeXBlcy5zaXplKCldKTsgfQotCi0gICAgLyogQVRUUklCVVRFUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsIGZpbmRHbG9iYWxBdHRyaWJ1dGUoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7Ci0gICAgICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwgcmVzdWx0ID0gKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwpX2dsb2JhbEF0dHJpYnV0ZXMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbClfaW1wb3J0aW5nTG9hZGVyLmZpbmRBdHRyaWJ1dGUobmFtZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRHbG9iYWxBdHRyaWJ1dGUoU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbCBhdHRyaWJ1dGUpCi0gICAgewotICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgX2dsb2JhbEF0dHJpYnV0ZXMucHV0KG5hbWUsIGF0dHJpYnV0ZSk7Ci0gICAgICAgICAgICBhZGRTcGVsbGluZyhuYW1lLCBhdHRyaWJ1dGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU2NoZW1hR2xvYmFsQXR0cmlidXRlW10gZ2xvYmFsQXR0cmlidXRlcygpCi0gICAgICAgIHsgcmV0dXJuIChTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbXSlfZ2xvYmFsQXR0cmlidXRlcy52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbX2dsb2JhbEF0dHJpYnV0ZXMuc2l6ZSgpXSk7IH0KLQotICAgIC8qIEVMRU1FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0gICAgU2NoZW1hR2xvYmFsRWxlbWVudEltcGwgZmluZEdsb2JhbEVsZW1lbnQoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7Ci0gICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsIHJlc3VsdCA9IChTY2hlbWFHbG9iYWxFbGVtZW50SW1wbClfZ2xvYmFsRWxlbWVudHMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hR2xvYmFsRWxlbWVudEltcGwpX2ltcG9ydGluZ0xvYWRlci5maW5kRWxlbWVudChuYW1lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZEdsb2JhbEVsZW1lbnQoU2NoZW1hR2xvYmFsRWxlbWVudEltcGwgZWxlbWVudCkKLSAgICB7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLSAgICAgICAgICAgIF9nbG9iYWxFbGVtZW50cy5wdXQobmFtZSwgZWxlbWVudCk7Ci0gICAgICAgICAgICBhZGRTcGVsbGluZyhuYW1lLCBlbGVtZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFNjaGVtYUdsb2JhbEVsZW1lbnRbXSBnbG9iYWxFbGVtZW50cygpCi0gICAgICAgIHsgcmV0dXJuIChTY2hlbWFHbG9iYWxFbGVtZW50W10pX2dsb2JhbEVsZW1lbnRzLnZhbHVlcygpLnRvQXJyYXkobmV3IFNjaGVtYUdsb2JhbEVsZW1lbnRbX2dsb2JhbEVsZW1lbnRzLnNpemUoKV0pOyB9Ci0KLSAgICAvKiBBVFRSSUJVVEUgR1JPVVBTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbCBmaW5kQXR0cmlidXRlR3JvdXAoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7Ci0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbCByZXN1bHQgPSAoU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsKV9hdHRyaWJ1dGVHcm91cHMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsKV9pbXBvcnRpbmdMb2FkZXIuZmluZEF0dHJpYnV0ZUdyb3VwKG5hbWUpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbCBmaW5kUmVkZWZpbmVkQXR0cmlidXRlR3JvdXAoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSwgUU5hbWUgcmVkZWZpbml0aW9uRm9yKQotICAgIHsKLSAgICAgICAgbmFtZSA9IGNvbXBhdE5hbWUobmFtZSwgY2hhbWVsZW9uTmFtZXNwYWNlKTsKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKHJlZGVmaW5pdGlvbkZvcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsKV9yZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgLy8gQlVHQlVHOiBzaG91bGQgYWxzbyBsaW5rIGFnYWluc3QgX2ltcG9ydGluZ0xvYWRlci5maW5kUmVkZWZpbmVkQXR0cmlidXRlR3JvdXAKLSAgICAgICAgfQotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgcmVzdWx0ID0gKFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbClfYXR0cmlidXRlR3JvdXBzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbClfaW1wb3J0aW5nTG9hZGVyLmZpbmRBdHRyaWJ1dGVHcm91cChuYW1lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZEF0dHJpYnV0ZUdyb3VwKFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbCBhdHRyaWJ1dGVHcm91cCwgYm9vbGVhbiByZWRlZmluZWQpCi0gICAgewotICAgICAgICBpZiAoYXR0cmlidXRlR3JvdXAgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IGF0dHJpYnV0ZUdyb3VwLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChyZWRlZmluZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9yZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZU1kZWYobmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiRHVwbGljYXRlIGF0dHJpYnV0ZSBncm91cDogIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9HTE9CQUxfVFlQRSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgX3JlZGVmaW5lZEF0dHJpYnV0ZUdyb3Vwcy5wdXQobmFtZSwgYXR0cmlidXRlR3JvdXApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfYXR0cmlidXRlR3JvdXBzLmNvbnRhaW5zS2V5KCBuYW1lICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZU1kZWYobmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiRHVwbGljYXRlIGF0dHJpYnV0ZSBncm91cDogIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9HTE9CQUxfVFlQRSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVHcm91cHMucHV0KGF0dHJpYnV0ZUdyb3VwLmdldE5hbWUoKSwgYXR0cmlidXRlR3JvdXApOwotICAgICAgICAgICAgICAgICAgICBhZGRTcGVsbGluZyhhdHRyaWJ1dGVHcm91cC5nZXROYW1lKCksIGF0dHJpYnV0ZUdyb3VwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cFtdIGF0dHJpYnV0ZUdyb3VwcygpCi0gICAgICAgIHsgcmV0dXJuIChTY2hlbWFBdHRyaWJ1dGVHcm91cFtdKV9hdHRyaWJ1dGVHcm91cHMudmFsdWVzKCkudG9BcnJheShuZXcgU2NoZW1hQXR0cmlidXRlR3JvdXBbX2F0dHJpYnV0ZUdyb3Vwcy5zaXplKCldKTsgfQotCi0gICAgU2NoZW1hQXR0cmlidXRlR3JvdXBbXSByZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMoKQotICAgICAgICB7IHJldHVybiAoU2NoZW1hQXR0cmlidXRlR3JvdXBbXSlfcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzLnZhbHVlcygpLnRvQXJyYXkobmV3IFNjaGVtYUF0dHJpYnV0ZUdyb3VwW19yZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMuc2l6ZSgpXSk7IH0KLQotICAgIC8qIE1PREVMIEdST1VQUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0gICAgU2NoZW1hTW9kZWxHcm91cEltcGwgZmluZE1vZGVsR3JvdXAoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7Ci0gICAgICAgIFNjaGVtYU1vZGVsR3JvdXBJbXBsIHJlc3VsdCA9IChTY2hlbWFNb2RlbEdyb3VwSW1wbClfbW9kZWxHcm91cHMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hTW9kZWxHcm91cEltcGwpX2ltcG9ydGluZ0xvYWRlci5maW5kTW9kZWxHcm91cChuYW1lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBTY2hlbWFNb2RlbEdyb3VwSW1wbCBmaW5kUmVkZWZpbmVkTW9kZWxHcm91cChRTmFtZSBuYW1lLCBTdHJpbmcgY2hhbWVsZW9uTmFtZXNwYWNlLCBRTmFtZSByZWRlZmluaXRpb25Gb3IpCi0gICAgewotICAgICAgICBuYW1lID0gY29tcGF0TmFtZShuYW1lLCBjaGFtZWxlb25OYW1lc3BhY2UpOwotICAgICAgICBpZiAobmFtZS5lcXVhbHMocmVkZWZpbml0aW9uRm9yKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFNb2RlbEdyb3VwSW1wbClfcmVkZWZpbmVkTW9kZWxHcm91cHMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgLy8gQlVHQlVHOiBzaG91bGQgYWxzbyBsaW5rIGFnYWluc3QgX2ltcG9ydGluZ0xvYWRlci5maW5kUmVkZWZpbmVkTW9kZWxHcm91cAotICAgICAgICB9Ci0gICAgICAgIFNjaGVtYU1vZGVsR3JvdXBJbXBsIHJlc3VsdCA9IChTY2hlbWFNb2RlbEdyb3VwSW1wbClfbW9kZWxHcm91cHMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hTW9kZWxHcm91cEltcGwpX2ltcG9ydGluZ0xvYWRlci5maW5kTW9kZWxHcm91cChuYW1lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZE1vZGVsR3JvdXAoU2NoZW1hTW9kZWxHcm91cEltcGwgbW9kZWxHcm91cCwgYm9vbGVhbiByZWRlZmluZWQpCi0gICAgewotICAgICAgICBpZiAobW9kZWxHcm91cCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gbW9kZWxHcm91cC5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAocmVkZWZpbmVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfcmVkZWZpbmVkTW9kZWxHcm91cHMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZU1kZWYobmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiRHVwbGljYXRlIG1vZGVsIGdyb3VwOiAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0dMT0JBTF9UWVBFLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBfcmVkZWZpbmVkTW9kZWxHcm91cHMucHV0KG5hbWUsIG1vZGVsR3JvdXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfbW9kZWxHcm91cHMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZU1kZWYobmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiRHVwbGljYXRlIG1vZGVsIGdyb3VwOiAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0dMT0JBTF9UWVBFLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX21vZGVsR3JvdXBzLnB1dChtb2RlbEdyb3VwLmdldE5hbWUoKSwgbW9kZWxHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFNwZWxsaW5nKG1vZGVsR3JvdXAuZ2V0TmFtZSgpLCBtb2RlbEdyb3VwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTY2hlbWFNb2RlbEdyb3VwW10gbW9kZWxHcm91cHMoKQotICAgICAgICB7IHJldHVybiAoU2NoZW1hTW9kZWxHcm91cFtdKV9tb2RlbEdyb3Vwcy52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFNb2RlbEdyb3VwW19tb2RlbEdyb3Vwcy5zaXplKCldKTsgfQotICAgIAotICAgIFNjaGVtYU1vZGVsR3JvdXBbXSByZWRlZmluZWRNb2RlbEdyb3VwcygpCi0gICAgICAgIHsgcmV0dXJuIChTY2hlbWFNb2RlbEdyb3VwW10pX3JlZGVmaW5lZE1vZGVsR3JvdXBzLnZhbHVlcygpLnRvQXJyYXkobmV3IFNjaGVtYU1vZGVsR3JvdXBbX3JlZGVmaW5lZE1vZGVsR3JvdXBzLnNpemUoKV0pOyB9Ci0KLSAgICAvKiBJREVOVElUWSBDT05TVFJBSU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGwgZmluZElkQ29uc3RyYWludChRTmFtZSBuYW1lLCBTdHJpbmcgY2hhbWVsZW9uTmFtZXNwYWNlKQotICAgIHsKLSAgICAgICAgbmFtZSA9IGNvbXBhdE5hbWUobmFtZSwgY2hhbWVsZW9uTmFtZXNwYWNlKTsKLSAgICAgICAgcmV0dXJuIChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsKV9pZENvbnN0cmFpbnRzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZElkQ29uc3RyYWludChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsIGlkYykKLSAgICB7Ci0gICAgICAgIGlmIChpZGMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX2lkQ29uc3RyYWludHMucHV0KGlkYy5nZXROYW1lKCksIGlkYyk7Ci0gICAgICAgICAgICBhZGRTcGVsbGluZyhpZGMuZ2V0TmFtZSgpLCBpZGMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbFtdIGlkQ29uc3RyYWludHMoKQotICAgICAgICB7IHJldHVybiAoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbFtdKV9pZENvbnN0cmFpbnRzLnZhbHVlcygpLnRvQXJyYXkobmV3IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGxbX2lkQ29uc3RyYWludHMuc2l6ZSgpXSk7IH0KLQotICAgIC8qIFJFQ1VSU0lPTiBBVk9JREFOQ0UgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotICAgIGJvb2xlYW4gaXNQcm9jZXNzaW5nKE9iamVjdCBvYmopCi0gICAgewotICAgICAgICByZXR1cm4gX3Byb2Nlc3NpbmdHcm91cHMuY29udGFpbnMob2JqKTsKLSAgICB9Ci0KLSAgICB2b2lkIHN0YXJ0UHJvY2Vzc2luZyhPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KCFfcHJvY2Vzc2luZ0dyb3Vwcy5jb250YWlucyhvYmopKTsKLSAgICAgICAgX3Byb2Nlc3NpbmdHcm91cHMuYWRkKG9iaik7Ci0gICAgfQotCi0gICAgdm9pZCBmaW5pc2hQcm9jZXNzaW5nKE9iamVjdCBvYmopCi0gICAgewotICAgICAgICBhc3NlcnQoX3Byb2Nlc3NpbmdHcm91cHMuY29udGFpbnMob2JqKSk7Ci0gICAgICAgIF9wcm9jZXNzaW5nR3JvdXBzLnJlbW92ZShvYmopOwotICAgIH0KLQotICAgIC8qIEpBVkFJWkFUSU9OID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0gICAgTWFwIHR5cGVzQnlDbGFzc25hbWUoKQotICAgICAgICB7IHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoX3R5cGVzQnlDbGFzc25hbWUpOyB9Ci0KLSAgICB2b2lkIGFkZENsYXNzbmFtZShTdHJpbmcgY2xhc3NuYW1lLCBTY2hlbWFUeXBlIHR5cGUpCi0gICAgICAgIHsgX3R5cGVzQnlDbGFzc25hbWUucHV0KGNsYXNzbmFtZSwgdHlwZSk7IH0KLQotCi0KLSAgICAvKioKLSAgICAgKiBTdGFjayBtYW5hZ2VtZW50IGlmIChoZWF2ZW4gaGVscCB1cykgd2UgZXZlciBuZWVkIHRvIGRvCi0gICAgICogbmVzdGVkIGNvbXBpbGF0aW9uIG9mIHNjaGVtYSB0eXBlIHN5c3RlbS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTdHNjU3RhY2sKLSAgICB7Ci0gICAgICAgIFN0c2NTdGF0ZSBjdXJyZW50OwotICAgICAgICBBcnJheUxpc3Qgc3RhY2sgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZpbmFsIFN0c2NTdGF0ZSBwdXNoKCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhY2suYWRkKGN1cnJlbnQpOwotICAgICAgICAgICAgY3VycmVudCA9IG5ldyBTdHNjU3RhdGUoKTsKLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50OwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIHZvaWQgcG9wKCkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudCA9IChTdHNjU3RhdGUpc3RhY2suZ2V0KHN0YWNrLnNpemUoKSAtIDEpOwotICAgICAgICAgICAgc3RhY2sucmVtb3ZlKHN0YWNrLnNpemUoKSAtIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWwgc3RzY1N0YWNrID0gbmV3IFRocmVhZExvY2FsKCkKLSAgICB7Ci0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgaW5pdGlhbFZhbHVlKCkgeyByZXR1cm4gbmV3IFN0c2NTdGFjaygpOyB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RzY1N0YXRlIHN0YXJ0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFN0c2NTdGFjaylzdHNjU3RhY2suZ2V0KCkpLnB1c2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0c2NTdGF0ZSBnZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU3RzY1N0YWNrKXN0c2NTdGFjay5nZXQoKSkuY3VycmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZW5kKCkKLSAgICB7Ci0gICAgICAgICgoU3RzY1N0YWNrKXN0c2NTdGFjay5nZXQoKSkucG9wKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWYgWE1MU1RSX1BSRVNFUlZFID0gYnVpbGRTdHJpbmcoInByZXNlcnZlIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWYgWE1MU1RSX1JFUExBQ0UgPSBidWlsZFN0cmluZygicHJlc2VydmUiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZiBYTUxTVFJfQ09MTEFQU0UgPSBidWlsZFN0cmluZygicHJlc2VydmUiKTsKLQotICAgIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlW10gRU1QVFlfU1RfQVJSQVkgPSBuZXcgU2NoZW1hVHlwZVswXTsKLSAgICBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZS5SZWZbXSBFTVBUWV9TVFJFRl9BUlJBWSA9IG5ldyBTY2hlbWFUeXBlLlJlZlswXTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX05PTkUgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbltdIEZJWEVEX0ZBQ0VUU19OT05FID0gbmV3IGJvb2xlYW5bXQotICAgICAgICB7IGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCi0gICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfV1NfQ09MTEFQU0UgPSBuZXcgWG1sVmFsdWVSZWZbXQotICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW5bXSBGSVhFRF9GQUNFVFNfV1MgPSBuZXcgYm9vbGVhbltdCi0gICAgICAgIHsgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwKLSAgICAgICAgICB0cnVlLCBmYWxzZSwgZmFsc2UgfTsKLQotICAgIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19VTklPTiA9IEZBQ0VUU19OT05FOwotICAgIGZpbmFsIHN0YXRpYyBib29sZWFuW10gRklYRURfRkFDRVRTX1VOSU9OID0gRklYRURfRkFDRVRTX05PTkU7Ci0gICAgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX0xJU1QgPSBGQUNFVFNfV1NfQ09MTEFQU0U7Ci0gICAgZmluYWwgc3RhdGljIGJvb2xlYW5bXSBGSVhFRF9GQUNFVFNfTElTVCA9IEZJWEVEX0ZBQ0VUU19XUzsKLQotICAgIHN0YXRpYyBYbWxWYWx1ZVJlZiBidWlsZF93c3N0cmluZyhpbnQgd3NyKQotICAgIHsKLSAgICAgICAgc3dpdGNoICh3c3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5XU19QUkVTRVJWRToKLSAgICAgICAgICAgICAgICByZXR1cm4gWE1MU1RSX1BSRVNFUlZFOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLldTX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFhNTFNUUl9SRVBMQUNFOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLldTX0NPTExBUFNFOgotICAgICAgICAgICAgICAgIHJldHVybiBYTUxTVFJfQ09MTEFQU0U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgc3RhdGljIFhtbFZhbHVlUmVmIGJ1aWxkU3RyaW5nKFN0cmluZyBzdHIpCi0gICAgewotICAgICAgICBpZiAoc3RyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sU3RyaW5nSW1wbCBpID0gbmV3IFhtbFN0cmluZ0ltcGwoKTsKLSAgICAgICAgICAgIGkuc2V0KHN0cik7Ci0gICAgICAgICAgICBpLnNldEltbXV0YWJsZSgpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxWYWx1ZVJlZihpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90Rm91bmRFcnJvcihRTmFtZSBpdGVtTmFtZSwgaW50IGNvZGUsIFhtbE9iamVjdCBsb2MpCi0gICAgewotICAgICAgICBTdHJpbmcgYmFzaWNNZXNzYWdlOwotCi0gICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBYbWxFcnJvckNvbnRleHQuVFlQRV9OT1RfRk9VTkQ6Ci0gICAgICAgICAgICAgICAgYmFzaWNNZXNzYWdlID0gIlR5cGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShpdGVtTmFtZSkgKyAiIG5vdCBmb3VuZC4iOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBYbWxFcnJvckNvbnRleHQuRUxFTUVOVF9SRUZfTk9UX0ZPVU5EOgotICAgICAgICAgICAgICAgIGJhc2ljTWVzc2FnZSA9ICJFbGVtZW50ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoaXRlbU5hbWUpICsgIiBub3QgZm91bmQuIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgWG1sRXJyb3JDb250ZXh0LkFUVFJJQlVURV9SRUZfTk9UX0ZPVU5EOgotICAgICAgICAgICAgICAgIGJhc2ljTWVzc2FnZSA9ICJBdHRyaWJ1dGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShpdGVtTmFtZSkgKyAiIG5vdCBmb3VuZC4iOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBYbWxFcnJvckNvbnRleHQuTU9ERUxfR1JPVVBfTk9UX0ZPVU5EOgotICAgICAgICAgICAgICAgIGJhc2ljTWVzc2FnZSA9ICJNb2RlbCBncm91cCAiICsgUU5hbWVIZWxwZXIucHJldHR5KGl0ZW1OYW1lKSArICIgbm90IGZvdW5kLiI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFhtbEVycm9yQ29udGV4dC5BVFRSSUJVVEVfR1JPVVBfTk9UX0ZPVU5EOgotICAgICAgICAgICAgICAgIGJhc2ljTWVzc2FnZSA9ICJBdHRyaWJ1dGUgZ3JvdXAgIiArIFFOYW1lSGVscGVyLnByZXR0eShpdGVtTmFtZSkgKyAiIG5vdCBmb3VuZC4iOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBYbWxFcnJvckNvbnRleHQuSURDX05PVF9GT1VORDoKLSAgICAgICAgICAgICAgICBiYXNpY01lc3NhZ2UgPSAiSWRlbnRpdHkgY29uc3RyYWludCAnIiArIFFOYW1lSGVscGVyLnByZXR0eShpdGVtTmFtZSkgKyAiJyBub3QgZm91bmQuIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICBiYXNpY01lc3NhZ2UgPSAiRGVmaW5pdGlvbiAiICsgUU5hbWVIZWxwZXIucHJldHR5KGl0ZW1OYW1lKSArICIgbm90IGZvdW5kLiI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgaGVscGZ1bE1lc3NhZ2UgPSAiIjsKLSAgICAgICAgU2NoZW1hQ29tcG9uZW50IGZvdW5kQ29tcG9uZW50ID0gZmluZFNwZWxsaW5nKGl0ZW1OYW1lKTsKLSAgICAgICAgUU5hbWUgbmFtZTsKLSAgICAgICAgaWYgKGZvdW5kQ29tcG9uZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5hbWUgPSBmb3VuZENvbXBvbmVudC5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBzb3VyY2VOYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvdW5kQ29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LlRZUEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOYW1lID0gKChTY2hlbWFUeXBlKWZvdW5kQ29tcG9uZW50KS5nZXRTb3VyY2VOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5hbWUgPSAoKFNjaGVtYUdsb2JhbEVsZW1lbnQpZm91bmRDb21wb25lbnQpLmdldFNvdXJjZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5BVFRSSUJVVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOYW1lID0gKChTY2hlbWFHbG9iYWxBdHRyaWJ1dGUpZm91bmRDb21wb25lbnQpLmdldFNvdXJjZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlID0gIiI7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9ICIgKGluICIgKyAgc291cmNlTmFtZS5zdWJzdHJpbmcoc291cmNlTmFtZS5sYXN0SW5kZXhPZignLycpICsgMSkgKyAiKSI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhpdGVtTmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvdW5kQ29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuVFlQRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZnVsTWVzc2FnZSA9ICIgIERvIHlvdSBtZWFuIHRvIHJlZmVyIHRvIHRoZSB0eXBlIHdpdGggdGhhdCBuYW1lIiArIHNvdXJjZSArICI/IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGZ1bE1lc3NhZ2UgPSAiICBEbyB5b3UgbWVhbiB0byByZWZlciB0byB0aGUgZWxlbWVudCB3aXRoIHRoYXQgbmFtZSIgKyBzb3VyY2UgKyAiPyI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5BVFRSSUJVVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGZ1bE1lc3NhZ2UgPSAiICBEbyB5b3UgbWVhbiB0byByZWZlciB0byB0aGUgYXR0cmlidXRlIHdpdGggdGhhdCBuYW1lIiArIHNvdXJjZSArICI/IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkFUVFJJQlVURV9HUk9VUDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZnVsTWVzc2FnZSA9ICIgIERvIHlvdSBtZWFuIHRvIHJlZmVyIHRvIHRoZSBhdHRyaWJ1dGUgZ3JvdXAgd2l0aCB0aGF0IG5hbWUiICsgc291cmNlICsgIj8iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuTU9ERUxfR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGZ1bE1lc3NhZ2UgPSAiICBEbyB5b3UgbWVhbiB0byByZWZlciB0byB0aGUgbW9kZWwgZ3JvdXAgd2l0aCB0aGF0IG5hbWUiICsgc291cmNlICsgIj8iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZm91bmRDb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5UWVBFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBmdWxNZXNzYWdlID0gIiAgRG8geW91IG1lYW4gdG8gcmVmZXIgdG8gdGhlIHR5cGUgbmFtZWQgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArIHNvdXJjZSArICI/IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkVMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGZ1bE1lc3NhZ2UgPSAiICBEbyB5b3UgbWVhbiB0byByZWZlciB0byB0aGUgZWxlbWVudCBuYW1lZCAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgc291cmNlICsgIj8iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBmdWxNZXNzYWdlID0gIiAgRG8geW91IG1lYW4gdG8gcmVmZXIgdG8gdGhlIGF0dHJpYnV0ZSBuYW1lZCAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgc291cmNlICsgIj8iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFX0dST1VQOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBmdWxNZXNzYWdlID0gIiAgRG8geW91IG1lYW4gdG8gcmVmZXIgdG8gdGhlIGF0dHJpYnV0ZSBncm91cCBuYW1lZCAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgc291cmNlICsgIj8iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuTU9ERUxfR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGZ1bE1lc3NhZ2UgPSAiICBEbyB5b3UgbWVhbiB0byByZWZlciB0byB0aGUgbW9kZWwgZ3JvdXAgbmFtZWQgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArIHNvdXJjZSArICI/IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGVycm9yKGJhc2ljTWVzc2FnZSArIGhlbHBmdWxNZXNzYWdlLCBjb2RlLCBsb2MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2R1Y2VzIHRoZSAic291cmNlTmFtZSIgKHRvIGJlIHVzZWQgd2l0aGluIHRoZSBzY2hlbWEgcHJvamVjdAotICAgICAqIHNvdXJjZSBmaWxlIGNvcGllcykgZnJvbSB0aGUgVVJJIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHNvdXJjZU5hbWVGb3JVcmkoU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKV9zb3VyY2VGb3JVcmkuZ2V0KHVyaSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgd2hvbGUgc291cmNlQ29weU1hcCwgbWFwcGluZyBVUkkncyB0aGF0IGhhdmUKLSAgICAgKiBiZWVuIHJlYWQgdG8gInNvdXJjZU5hbWUiIGxvY2FsIG5hbWVzIHRoYXQgaGF2ZSBiZWVuIHVzZWQKLSAgICAgKiB0byB0YWcgdGhlIHR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBNYXAgc291cmNlQ29weU1hcCgpCi0gICAgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKF9zb3VyY2VGb3JVcmkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBiYXNlIFVSSSB0byB1c2UgZm9yIG5pY2UgZmlsZW5hbWVzIHdoZW4gc2F2aW5nIHNvdXJjZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZVVyaShVUkkgdXJpKQotICAgIHsKLSAgICAgICAgX2Jhc2VVUkkgPSB1cmk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfVVJMX1BSRUZJWCA9ICJwcm9qZWN0Oi8vbG9jYWwiOwotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgcmVsYXRpdml6ZShTdHJpbmcgdXJpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlbGF0aXZpemUodXJpLCBmYWxzZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgY29tcHV0ZVNhdmVkRmlsZW5hbWUoU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZWxhdGl2aXplKHVyaSwgdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHJlbGF0aXZpemUoU3RyaW5nIHVyaSwgYm9vbGVhbiBmb3JTYXZlZEZpbGVuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgLy8gZGVhbCB3aXRoIHRoaW5ncyB0aGF0IGRvIG5vdCBsb29rIGxpa2UgYWJzb2x1dGUgdXJpcwotICAgICAgICBpZiAodXJpLnN0YXJ0c1dpdGgoIi8iKSkKLSAgICAgICAgewotICAgICAgICAgICAgdXJpID0gUFJPSkVDVF9VUkxfUFJFRklYICsgdXJpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGxvb2tzIGxpa2UgYSBVUkw/Ci0gICAgICAgICAgICBpbnQgY29sb24gPSB1cmkuaW5kZXhPZignOicpOwotICAgICAgICAgICAgaWYgKGNvbG9uIDw9IDEgfHwgIXVyaS5zdWJzdHJpbmcoMCwgY29sb24pLm1hdGNoZXMoIl5cXHcrJCIpKQotICAgICAgICAgICAgICAgIHVyaSA9IFBST0pFQ1RfVVJMX1BSRUZJWCArICIvIiArIHVyaS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3cgcmVsYXRpdml6ZSBhZ2FpbnN0IHRoYXQuLi4KLSAgICAgICAgaWYgKF9iYXNlVVJJICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFVSSSByZWxhdGl2ZSA9IF9iYXNlVVJJLnJlbGF0aXZpemUobmV3IFVSSSh1cmkpKTsKLSAgICAgICAgICAgICAgICBpZiAoIXJlbGF0aXZlLmlzQWJzb2x1dGUoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlbGF0aXZlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB1cmkgPSByZWxhdGl2ZS50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoIWZvclNhdmVkRmlsZW5hbWUpCi0gICAgICAgICAgICByZXR1cm4gdXJpOwotCi0gICAgICAgIGludCBsYXN0c2xhc2ggPSB1cmkubGFzdEluZGV4T2YoJy8nKTsKLSAgICAgICAgU3RyaW5nIGRpciA9IFFOYW1lSGVscGVyLmhleHNhZmUobGFzdHNsYXNoID09IC0xID8gIiIgOiB1cmkuc3Vic3RyaW5nKDAsIGxhc3RzbGFzaCkpOwotICAgICAgICByZXR1cm4gZGlyICsgIi8iICsgdXJpLnN1YnN0cmluZyhsYXN0c2xhc2ggKyAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RlcyBhbm90aGVyIFVSSSB0aGF0IGhhcyBiZWVuIGNvbnN1bWVkIGR1cmluZyBjb21waWxhdGlvbgotICAgICAqICh0aGlzIGlzIHRoZSBVUkkgdGhhdCBpcyBpbiB0aGUgZG9jdW1lbnQgLk5BTUUgcHJvcGVydHkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkU291cmNlVXJpKFN0cmluZyB1cmksIFN0cmluZyBuYW1lVG9Vc2UpCi0gICAgewotICAgICAgICBpZiAodXJpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKG5hbWVUb1VzZSA9PSBudWxsKQotICAgICAgICAgICAgbmFtZVRvVXNlID0gY29tcHV0ZVNhdmVkRmlsZW5hbWUodXJpKTsKLQotICAgICAgICBfc291cmNlRm9yVXJpLnB1dCh1cmksIG5hbWVUb1VzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXJyb3IgbGlzdGVuZXIgYmVpbmcgZmlsbGVkIGluIGR1cmluZyB0aGlzIGNvbXBpbGF0aW9uCi0gICAgICovCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0RXJyb3JMaXN0ZW5lcigpCi0gICAgewotICAgICAgICByZXR1cm4gX2Vycm9yTGlzdGVuZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2NoZW1hIHR5cGUgbG9hZGVyIHRvIHVzZSBmb3IgcHJvY2Vzc2luZyBzNHMKLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hVHlwZUxvYWRlciBnZXRTNFNMb2FkZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zNHNsb2FkZXI7Ci0gICAgfQotCi0gICAgTWFwIF9zb3VyY2VGb3JVcmkgPSBuZXcgSGFzaE1hcCgpOwotICAgIFVSSSBfYmFzZVVSSSA9IFVSSS5jcmVhdGUoUFJPSkVDVF9VUkxfUFJFRklYICsgIi8iKTsKLSAgICBTY2hlbWFUeXBlTG9hZGVyIF9zNHNsb2FkZXIgPSBYbWxCZWFucy50eXBlTG9hZGVyRm9yQ2xhc3NMb2FkZXIoU2NoZW1hRG9jdW1lbnQuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjVHJhbnNsYXRvci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcxNjZkNS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyNiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuKjsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50LlNjaGVtYTsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlJlZGVmaW5lRG9jdW1lbnQuUmVkZWZpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWE1MQ2hhcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhQYXRoOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sSW50ZWdlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5OYW1lc3BhY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnNvYXAuU09BUEFycmF5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0QnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUlkZW50aXR5Q29uc3RyYWludDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSW50ZWdlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBTdHNjVHJhbnNsYXRvcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFdTRExfQVJSQVlUWVBFX05BTUUgPQotICAgICAgICBRTmFtZUhlbHBlci5mb3JMTlMoImFycmF5VHlwZSIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIpOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEFsbERlZmluaXRpb25zKFN0c2NJbXBvcnRlci5TY2hlbWFUb1Byb2Nlc3NbXSBzY2hlbWFzQW5kQ2hhbWVsZW9ucykKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hc0FuZENoYW1lbGVvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZEFsbERlZmluaXRpb25zKAotICAgICAgICAgICAgICAgIHNjaGVtYXNBbmRDaGFtZWxlb25zW2ldLmdldFNjaGVtYSgpLAotICAgICAgICAgICAgICAgIHNjaGVtYXNBbmRDaGFtZWxlb25zW2ldLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgIHNjaGVtYXNBbmRDaGFtZWxlb25zW2ldLmdldFJlZGVmaW5lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEFsbERlZmluaXRpb25zKFNjaGVtYSBzY2hlbWEsIFN0cmluZyBnaXZlblRhcmdldE5hbWVzcGFjZSwgUmVkZWZpbmUgcmVkZWZpbmUpCi0gICAgewotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0KLSAgICAgICAgLy8gcXVpY2sgY2hlY2sgZm9yIGEgZmV3IHVuc3VwcG9ydGVkIGZlYXR1cmVzCi0KLSAgICAgICAgaWYgKHNjaGVtYS5zaXplT2ZOb3RhdGlvbkFycmF5KCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS53YXJuaW5nKCJTY2hlbWEgPG5vdGF0aW9uPiBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgdGhpcyByZWxlYXNlLiIsIFhtbEVycm9yQ29udGV4dC5VTlNVUFBPUlRFRF9GRUFUVVJFLCBzY2hlbWEuZ2V0Tm90YXRpb25BcnJheSgwKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGZpZ3VyZSBuYW1lc3BhY2UgKHRha2luZyBpbnRvIGFjY291bnQgY2hhbWVsZW9ucykKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgYm9vbGVhbiBjaGFtZWxlb24gPSBmYWxzZTsKLSAgICAgICAgaWYgKGdpdmVuVGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgJiYgdGFyZ2V0TmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9IGdpdmVuVGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICAgICAgY2hhbWVsZW9uID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiIjsKLSAgICAgICAgCi0gICAgICAgIHN0YXRlLmFkZE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotCi0gICAgICAgIC8vIG1ha2UgYSBub3RlIG9mIGFsbCByZWRlZmluaXRpb25zCi0gICAgICAgIFJlZGVmaW5pdGlvbkhvbGRlciByZWRlZmluaXRpb25zID0gbmV3IFJlZGVmaW5pdGlvbkhvbGRlcihyZWRlZmluZSk7Ci0KLSAgICAgICAgVG9wTGV2ZWxDb21wbGV4VHlwZVtdIGNvbXBsZXhUeXBlcyA9IHNjaGVtYS5nZXRDb21wbGV4VHlwZUFycmF5KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcGxleFR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBUb3BMZXZlbENvbXBsZXhUeXBlIHJlZGVmID0gcmVkZWZpbml0aW9ucy5yZWRlZmluZUNvbXBsZXhUeXBlKGNvbXBsZXhUeXBlc1tpXS5nZXROYW1lKCkpOwotICAgICAgICAgICAgc3RhdGUuYWRkR2xvYmFsVHlwZSh0cmFuc2xhdGVHbG9iYWxDb21wbGV4VHlwZShjb21wbGV4VHlwZXNbaV0sIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBmYWxzZSksIHJlZGVmICE9IG51bGwpOwotICAgICAgICAgICAgaWYgKHJlZGVmICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3RhdGUuYWRkR2xvYmFsVHlwZSh0cmFuc2xhdGVHbG9iYWxDb21wbGV4VHlwZShyZWRlZiwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIHRydWUpLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBUb3BMZXZlbFNpbXBsZVR5cGVbXSBzaW1wbGVUeXBlcyA9IHNjaGVtYS5nZXRTaW1wbGVUeXBlQXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaW1wbGVUeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVG9wTGV2ZWxTaW1wbGVUeXBlIHJlZGVmID0gcmVkZWZpbml0aW9ucy5yZWRlZmluZVNpbXBsZVR5cGUoc2ltcGxlVHlwZXNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHN0YXRlLmFkZEdsb2JhbFR5cGUodHJhbnNsYXRlR2xvYmFsU2ltcGxlVHlwZShzaW1wbGVUeXBlc1tpXSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGZhbHNlKSwgcmVkZWYgIT0gbnVsbCk7Ci0gICAgICAgICAgICBpZiAocmVkZWYgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzdGF0ZS5hZGRHbG9iYWxUeXBlKHRyYW5zbGF0ZUdsb2JhbFNpbXBsZVR5cGUocmVkZWYsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCB0cnVlKSwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgVG9wTGV2ZWxFbGVtZW50W10gZWxlbWVudHMgPSBzY2hlbWEuZ2V0RWxlbWVudEFycmF5KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRvcExldmVsRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICAgICAgICBzdGF0ZS5hZGREb2N1bWVudFR5cGUodHJhbnNsYXRlRG9jdW1lbnRUeXBlKGVsZW1lbnQsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uKSwgUU5hbWVIZWxwZXIuZm9yTE5TKGVsZW1lbnQuZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRvcExldmVsQXR0cmlidXRlW10gYXR0cmlidXRlcyA9IHNjaGVtYS5nZXRBdHRyaWJ1dGVBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoIDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBUb3BMZXZlbEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2ldOwotICAgICAgICAgICAgc3RhdGUuYWRkQXR0cmlidXRlVHlwZSh0cmFuc2xhdGVBdHRyaWJ1dGVUeXBlKGF0dHJpYnV0ZSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24pLCBRTmFtZUhlbHBlci5mb3JMTlMoYXR0cmlidXRlLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBOYW1lZEdyb3VwW10gbW9kZWxncm91cHMgPSBzY2hlbWEuZ2V0R3JvdXBBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZGVsZ3JvdXBzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBOYW1lZEdyb3VwIHJlZGVmID0gcmVkZWZpbml0aW9ucy5yZWRlZmluZU1vZGVsR3JvdXAobW9kZWxncm91cHNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHN0YXRlLmFkZE1vZGVsR3JvdXAodHJhbnNsYXRlTW9kZWxHcm91cChtb2RlbGdyb3Vwc1tpXSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGZhbHNlKSwgcmVkZWYgIT0gbnVsbCk7Ci0gICAgICAgICAgICBpZiAocmVkZWYgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzdGF0ZS5hZGRNb2RlbEdyb3VwKHRyYW5zbGF0ZU1vZGVsR3JvdXAocmVkZWYsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCB0cnVlKSwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgTmFtZWRBdHRyaWJ1dGVHcm91cFtdIGF0dHJncm91cHMgPSBzY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJncm91cHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5hbWVkQXR0cmlidXRlR3JvdXAgcmVkZWYgPSByZWRlZmluaXRpb25zLnJlZGVmaW5lQXR0cmlidXRlR3JvdXAoYXR0cmdyb3Vwc1tpXS5nZXROYW1lKCkpOwotICAgICAgICAgICAgc3RhdGUuYWRkQXR0cmlidXRlR3JvdXAodHJhbnNsYXRlQXR0cmlidXRlR3JvdXAoYXR0cmdyb3Vwc1tpXSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGZhbHNlKSwgcmVkZWYgIT0gbnVsbCk7Ci0gICAgICAgICAgICBpZiAocmVkZWYgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzdGF0ZS5hZGRBdHRyaWJ1dGVHcm91cCh0cmFuc2xhdGVBdHRyaWJ1dGVHcm91cChyZWRlZiwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIHRydWUpLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJlZGVmaW5pdGlvbnMuY29tcGxhaW5BYm91dE1pc3NpbmdEZWZpbml0aW9ucygpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZWRlZmluaXRpb25Ib2xkZXIKLSAgICB7Ci0gICAgICAgIC8vIHJlY29yZCByZWRlZmluaXRpb25zCi0gICAgICAgIHByaXZhdGUgTWFwIHN0UmVkZWZpbml0aW9ucyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICAgICAgcHJpdmF0ZSBNYXAgY3RSZWRlZmluaXRpb25zID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotICAgICAgICBwcml2YXRlIE1hcCBhZ1JlZGVmaW5pdGlvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgICAgIHByaXZhdGUgTWFwIG1nUmVkZWZpbml0aW9ucyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSAiIjsKLSAgICAgICAgCi0gICAgICAgIC8vIGZpcnN0IGJ1aWxkIHNldCBvZiByZWRlZmluZWQgY29tcG9uZW50cwotICAgICAgICBSZWRlZmluaXRpb25Ib2xkZXIoUmVkZWZpbmUgcmVkZWZpbmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyZWRlZmluZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHN0UmVkZWZpbml0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgY3RSZWRlZmluaXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICBhZ1JlZGVmaW5pdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIG1nUmVkZWZpbml0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlZGVmaW5lLmdldFNjaGVtYUxvY2F0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb24gPSByZWRlZmluZS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRvcExldmVsQ29tcGxleFR5cGVbXSBjb21wbGV4VHlwZXMgPSByZWRlZmluZS5nZXRDb21wbGV4VHlwZUFycmF5KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wbGV4VHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGVzW2ldLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3RSZWRlZmluaXRpb25zLmNvbnRhaW5zS2V5KGNvbXBsZXhUeXBlc1tpXS5nZXROYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJEdXBsaWNhdGUgdHlwZSByZWRlZmluaXRpb246ICIgKyBjb21wbGV4VHlwZXNbaV0uZ2V0TmFtZSgpLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0dMT0JBTF9UWVBFLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdFJlZGVmaW5pdGlvbnMucHV0KGNvbXBsZXhUeXBlc1tpXS5nZXROYW1lKCksIGNvbXBsZXhUeXBlc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgVG9wTGV2ZWxTaW1wbGVUeXBlW10gc2ltcGxlVHlwZXMgPSByZWRlZmluZS5nZXRTaW1wbGVUeXBlQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpbXBsZVR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNpbXBsZVR5cGVzW2ldLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RSZWRlZmluaXRpb25zLmNvbnRhaW5zS2V5KHNpbXBsZVR5cGVzW2ldLmdldE5hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkR1cGxpY2F0ZSB0eXBlIHJlZGVmaW5pdGlvbjogIiArIHNpbXBsZVR5cGVzW2ldLmdldE5hbWUoKSwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9HTE9CQUxfVFlQRSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RSZWRlZmluaXRpb25zLnB1dChzaW1wbGVUeXBlc1tpXS5nZXROYW1lKCksIHNpbXBsZVR5cGVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBOYW1lZEdyb3VwW10gbW9kZWxncm91cHMgPSByZWRlZmluZS5nZXRHcm91cEFycmF5KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RlbGdyb3Vwcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbGdyb3Vwc1tpXS5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1nUmVkZWZpbml0aW9ucy5jb250YWluc0tleShtb2RlbGdyb3Vwc1tpXS5nZXROYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJEdXBsaWNhdGUgdHlwZSByZWRlZmluaXRpb246ICIgKyBtb2RlbGdyb3Vwc1tpXS5nZXROYW1lKCksIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfR0xPQkFMX1RZUEUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1nUmVkZWZpbml0aW9ucy5wdXQobW9kZWxncm91cHNbaV0uZ2V0TmFtZSgpLCBtb2RlbGdyb3Vwc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgTmFtZWRBdHRyaWJ1dGVHcm91cFtdIGF0dHJncm91cHMgPSByZWRlZmluZS5nZXRBdHRyaWJ1dGVHcm91cEFycmF5KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyZ3JvdXBzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJncm91cHNbaV0uZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZ1JlZGVmaW5pdGlvbnMuY29udGFpbnNLZXkoYXR0cmdyb3Vwc1tpXS5nZXROYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJEdXBsaWNhdGUgdHlwZSByZWRlZmluaXRpb246ICIgKyBhdHRyZ3JvdXBzW2ldLmdldE5hbWUoKSwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9HTE9CQUxfVFlQRSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdSZWRlZmluaXRpb25zLnB1dChhdHRyZ3JvdXBzW2ldLmdldE5hbWUoKSwgYXR0cmdyb3Vwc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBUb3BMZXZlbFNpbXBsZVR5cGUgcmVkZWZpbmVTaW1wbGVUeXBlKFN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8ICFzdFJlZGVmaW5pdGlvbnMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gKFRvcExldmVsU2ltcGxlVHlwZSlzdFJlZGVmaW5pdGlvbnMucmVtb3ZlKG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgVG9wTGV2ZWxDb21wbGV4VHlwZSByZWRlZmluZUNvbXBsZXhUeXBlKFN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8ICFjdFJlZGVmaW5pdGlvbnMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gKFRvcExldmVsQ29tcGxleFR5cGUpY3RSZWRlZmluaXRpb25zLnJlbW92ZShuYW1lKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE5hbWVkR3JvdXAgcmVkZWZpbmVNb2RlbEdyb3VwKFN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8ICFtZ1JlZGVmaW5pdGlvbnMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gKE5hbWVkR3JvdXApbWdSZWRlZmluaXRpb25zLnJlbW92ZShuYW1lKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE5hbWVkQXR0cmlidXRlR3JvdXAgcmVkZWZpbmVBdHRyaWJ1dGVHcm91cChTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCAhYWdSZWRlZmluaXRpb25zLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgcmV0dXJuIChOYW1lZEF0dHJpYnV0ZUdyb3VwKWFnUmVkZWZpbml0aW9ucy5yZW1vdmUobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsYWluQWJvdXRNaXNzaW5nRGVmaW5pdGlvbnMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3RSZWRlZmluaXRpb25zLmlzRW1wdHkoKSAmJiBjdFJlZGVmaW5pdGlvbnMuaXNFbXB0eSgpICYmCi0gICAgICAgICAgICAgICAgICAgIGFnUmVkZWZpbml0aW9ucy5pc0VtcHR5KCkgJiYgbWdSZWRlZmluaXRpb25zLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc3RSZWRlZmluaXRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IChRTmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiUmVkZWZpbmVkIHNpbXBsZSB0eXBlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIG5vdCBmb3VuZCBpbiAiICsgc2NoZW1hTG9jYXRpb24sIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCAoWG1sT2JqZWN0KXN0UmVkZWZpbml0aW9ucy5nZXQobmFtZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjdFJlZGVmaW5pdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gKFFOYW1lKWkubmV4dCgpOwotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJSZWRlZmluZWQgY29tcGxleCB0eXBlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIG5vdCBmb3VuZCBpbiAiICsgc2NoZW1hTG9jYXRpb24sIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCAoWG1sT2JqZWN0KWN0UmVkZWZpbml0aW9ucy5nZXQobmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhZ1JlZGVmaW5pdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gKFFOYW1lKWkubmV4dCgpOwotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJSZWRlZmluZWQgYXR0cmlidXRlIGdyb3VwICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIG5vdCBmb3VuZCBpbiAiICsgc2NoZW1hTG9jYXRpb24sIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCAoWG1sT2JqZWN0KWFnUmVkZWZpbml0aW9ucy5nZXQobmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtZ1JlZGVmaW5pdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gKFFOYW1lKWkubmV4dCgpOwotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJSZWRlZmluZWQgbW9kZWwgZ3JvdXAgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArICIgbm90IGZvdW5kIGluICIgKyBzY2hlbWFMb2NhdGlvbiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIChYbWxPYmplY3QpbWdSZWRlZmluaXRpb25zLmdldChuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZmluZEZpbGVuYW1lKFhtbE9iamVjdCB4b2JqKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0c2NTdGF0ZS5nZXQoKS5zb3VyY2VOYW1lRm9yVXJpKHhvYmouZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0U291cmNlTmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWFUeXBlSW1wbCB0cmFuc2xhdGVEb2N1bWVudFR5cGUgKCBUb3BMZXZlbEVsZW1lbnQgeHNkVHlwZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgYm9vbGVhbiBjaGFtZWxlb24gKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZUltcGwgc1R5cGUgPSBuZXcgU2NoZW1hVHlwZUltcGwoIFN0c2NTdGF0ZS5nZXQoKS5zdHMoKSApOwotICAgICAgICAKLSAgICAgICAgc1R5cGUuc2V0RG9jdW1lbnRUeXBlKHRydWUpOwotICAgICAgICBzVHlwZS5zZXRQYXJzZUNvbnRleHQoIHhzZFR5cGUsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBmYWxzZSk7Ci0gICAgICAgIHNUeXBlLnNldEZpbGVuYW1lKCBmaW5kRmlsZW5hbWUoIHhzZFR5cGUgKSApOwotCi0gICAgICAgIHJldHVybiBzVHlwZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hVHlwZUltcGwgdHJhbnNsYXRlQXR0cmlidXRlVHlwZSAoIFRvcExldmVsQXR0cmlidXRlIHhzZFR5cGUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uICkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHNUeXBlID0gbmV3IFNjaGVtYVR5cGVJbXBsKCBTdHNjU3RhdGUuZ2V0KCkuc3RzKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHNUeXBlLnNldEF0dHJpYnV0ZVR5cGUodHJ1ZSk7Ci0gICAgICAgIHNUeXBlLnNldFBhcnNlQ29udGV4dCggeHNkVHlwZSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGZhbHNlKTsKLSAgICAgICAgc1R5cGUuc2V0RmlsZW5hbWUoIGZpbmRGaWxlbmFtZSggeHNkVHlwZSApICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc1R5cGU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFNjaGVtYVR5cGVJbXBsIHRyYW5zbGF0ZUdsb2JhbENvbXBsZXhUeXBlKFRvcExldmVsQ29tcGxleFR5cGUgeHNkVHlwZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgYm9vbGVhbiBjaGFtZWxlb24sIGJvb2xlYW4gcmVkZWZpbml0aW9uKQotICAgIHsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotCi0gICAgICAgIFN0cmluZyBsb2NhbG5hbWUgPSB4c2RUeXBlLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKGxvY2FsbmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiR2xvYmFsIHR5cGUgbWlzc2luZyBhIG5hbWUiLCBYbWxFcnJvckNvbnRleHQuR0xPQkFMX1RZUEVfTUlTU0lOR19OQU1FLCB4c2RUeXBlKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgdW5uYW1lZCB0eXBlcy4KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmICghWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKGxvY2FsbmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJJbnZhbGlkIHR5cGUgbmFtZSBcIiIgKyBsb2NhbG5hbWUgKyAiXCIiLCBYbWxFcnJvckNvbnRleHQuSU5WQUxJRF9OQU1FLCB4c2RUeXBlLnhnZXROYW1lKCkpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGxldCB0aGUgbmFtZSBnbyB0aHJvdWdoIGFueXdheS4KLSAgICAgICAgfQotCi0gICAgICAgIFFOYW1lIG5hbWUgPSBRTmFtZUhlbHBlci5mb3JMTlMobG9jYWxuYW1lLCB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAKLSAgICAgICAgaWYgKGlzUmVzZXJ2ZWRUeXBlTmFtZShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUud2FybmluZygiU2tpcHBpbmcgZGVmaW5pdGlvbiBvZiBidWlsdC1pbiB0eXBlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSksIFhtbEVycm9yQ29udGV4dC5SRVNFUlZFRF9UWVBFX05BTUUsIHhzZFR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU3lzdGVtLmVyci5wcmludGxuKCJSZWNvcmRpbmcgdHlwZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpKTsKLQotICAgICAgICBTY2hlbWFUeXBlSW1wbCBzVHlwZSA9IG5ldyBTY2hlbWFUeXBlSW1wbChzdGF0ZS5zdHMoKSk7Ci0gICAgICAgIHNUeXBlLnNldFBhcnNlQ29udGV4dCh4c2RUeXBlLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgcmVkZWZpbml0aW9uKTsKLSAgICAgICAgc1R5cGUuc2V0RmlsZW5hbWUoZmluZEZpbGVuYW1lKHhzZFR5cGUpKTsKLSAgICAgICAgc1R5cGUuc2V0TmFtZShRTmFtZUhlbHBlci5mb3JMTlMobG9jYWxuYW1lLCB0YXJnZXROYW1lc3BhY2UpKTsKLSAgICAgICAgcmV0dXJuIHNUeXBlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFNjaGVtYVR5cGVJbXBsIHRyYW5zbGF0ZUdsb2JhbFNpbXBsZVR5cGUoVG9wTGV2ZWxTaW1wbGVUeXBlIHhzZFR5cGUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLCBib29sZWFuIHJlZGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKLQotICAgICAgICBTdHJpbmcgbG9jYWxuYW1lID0geHNkVHlwZS5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChsb2NhbG5hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkdsb2JhbCB0eXBlIG1pc3NpbmcgYSBuYW1lIiwgWG1sRXJyb3JDb250ZXh0LkdMT0JBTF9UWVBFX01JU1NJTkdfTkFNRSwgeHNkVHlwZSk7Ci0gICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIHVubmFtZWQgdHlwZXMuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIVhNTENoYXIuaXNWYWxpZE5DTmFtZShsb2NhbG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiSW52YWxpZCB0eXBlIG5hbWUgXCIiICsgbG9jYWxuYW1lICsgIlwiIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkVHlwZS54Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBsZXQgdGhlIG5hbWUgZ28gdGhyb3VnaCBhbnl3YXkuCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFFOYW1lIG5hbWUgPSBRTmFtZUhlbHBlci5mb3JMTlMobG9jYWxuYW1lLCB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAKLSAgICAgICAgaWYgKGlzUmVzZXJ2ZWRUeXBlTmFtZShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUud2FybmluZygiU2tpcHBpbmcgZGVmaW5pdGlvbiBvZiBidWlsdC1pbiB0eXBlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSksIFhtbEVycm9yQ29udGV4dC5SRVNFUlZFRF9UWVBFX05BTUUsIHhzZFR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU3lzdGVtLmVyci5wcmludGxuKCJSZWNvcmRpbmcgdHlwZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpKTsKLQotICAgICAgICBTY2hlbWFUeXBlSW1wbCBzVHlwZSA9IG5ldyBTY2hlbWFUeXBlSW1wbChzdGF0ZS5zdHMoKSk7Ci0gICAgICAgIHNUeXBlLnNldFNpbXBsZVR5cGUodHJ1ZSk7Ci0gICAgICAgIHNUeXBlLnNldFBhcnNlQ29udGV4dCh4c2RUeXBlLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgcmVkZWZpbml0aW9uKTsKLSAgICAgICAgc1R5cGUuc2V0RmlsZW5hbWUoZmluZEZpbGVuYW1lKHhzZFR5cGUpKTsKLSAgICAgICAgc1R5cGUuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgcmV0dXJuIHNUeXBlOwotICAgIH0KLQotICAgIHN0YXRpYyBGb3JtQ2hvaWNlIGZpbmRFbGVtZW50Rm9ybURlZmF1bHQoWG1sT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjdXIgPSBvYmoubmV3Q3Vyc29yKCk7Ci0gICAgICAgIHdoaWxlIChjdXIuZ2V0T2JqZWN0KCkuc2NoZW1hVHlwZSgpICE9IFNjaGVtYS50eXBlKQotICAgICAgICAgICAgaWYgKCFjdXIudG9QYXJlbnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuICgoU2NoZW1hKWN1ci5nZXRPYmplY3QoKSkueGdldEVsZW1lbnRGb3JtRGVmYXVsdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1cmlNYXRjaChTdHJpbmcgczEsIFN0cmluZyBzMikKLSAgICB7Ci0gICAgICAgIGlmIChzMSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHMyID09IG51bGwgfHwgczIuZXF1YWxzKCIiKTsKLSAgICAgICAgaWYgKHMyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gczEuZXF1YWxzKCIiKTsKLSAgICAgICAgcmV0dXJuIHMxLmVxdWFscyhzMik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlHbG9iYWxFbGVtZW50VG9Mb2NhbEVsZW1lbnQoU2NoZW1hR2xvYmFsRWxlbWVudCByZWZlcmVuY2VkLCBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsIHRhcmdldCApCi0gICAgewotCi0gICAgICAgIHRhcmdldC5zZXROYW1lQW5kVHlwZVJlZihyZWZlcmVuY2VkLmdldE5hbWUoKSwgcmVmZXJlbmNlZC5nZXRUeXBlKCkuZ2V0UmVmKCkpOwotICAgICAgICB0YXJnZXQuc2V0TmlsbGFibGUocmVmZXJlbmNlZC5pc05pbGxhYmxlKCkpOwotICAgICAgICB0YXJnZXQuc2V0RGVmYXVsdChyZWZlcmVuY2VkLmdldERlZmF1bHRUZXh0KCksIHJlZmVyZW5jZWQuaXNGaXhlZCgpLCAoKFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsKXJlZmVyZW5jZWQpLmdldFBhcnNlT2JqZWN0KCkpOwotICAgICAgICB0YXJnZXQuc2V0SWRlbnRpdHlDb25zdHJhaW50cygoKFNjaGVtYUxvY2FsRWxlbWVudEltcGwpcmVmZXJlbmNlZCkuZ2V0SWRlbnRpdHlDb25zdHJhaW50UmVmcygpKTsKLSAgICAgICAgdGFyZ2V0LnNldEJsb2NrKHJlZmVyZW5jZWQuYmxvY2tFeHRlbnNpb24oKSwgIHJlZmVyZW5jZWQuYmxvY2tSZXN0cmljdGlvbigpLCAgcmVmZXJlbmNlZC5ibG9ja1N1YnN0aXR1dGlvbigpKTsKLSAgICAgICAgdGFyZ2V0LnNldEFic3RyYWN0KHJlZmVyZW5jZWQuaXNBYnN0cmFjdCgpKTsKLSAgICAgICAgdGFyZ2V0LnNldFRyYW5zaXRpb25SdWxlcygoKFNjaGVtYVBhcnRpY2xlKXJlZmVyZW5jZWQpLmFjY2VwdGVkU3RhcnROYW1lcygpLAotICAgICAgICAgICAgKChTY2hlbWFQYXJ0aWNsZSlyZWZlcmVuY2VkKS5pc1NraXBwYWJsZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUdsb2JhbEF0dHJpYnV0ZVRvTG9jYWxBdHRyaWJ1dGUoU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbCByZWZlcmVuY2VkLCBTY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwgdGFyZ2V0ICkKLSAgICB7Ci0gICAgICAgIHRhcmdldC5pbml0KAotICAgICAgICAgICAgcmVmZXJlbmNlZC5nZXROYW1lKCksIHJlZmVyZW5jZWQuZ2V0VHlwZVJlZigpLCByZWZlcmVuY2VkLmdldFVzZSgpLAotICAgICAgICAgICAgcmVmZXJlbmNlZC5nZXREZWZhdWx0VGV4dCgpLAotICAgICAgICAgICAgICAgIHJlZmVyZW5jZWQuZ2V0UGFyc2VPYmplY3QoKSwgcmVmZXJlbmNlZC5fZGVmYXVsdFZhbHVlLAotICAgICAgICAgICAgcmVmZXJlbmNlZC5pc0ZpeGVkKCksCi0gICAgICAgICAgICByZWZlcmVuY2VkLmdldFdTRExBcnJheVR5cGUoKSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyYW5zbGF0ZXMgYSBsb2NhbCBvciBnbG9iYWwgc2NoZW1hIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsIHRyYW5zbGF0ZUVsZW1lbnQoCi0gICAgICAgIEVsZW1lbnQgeHNkRWx0LCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbiwKLSAgICAgICAgTGlzdCBhbm9ueW1vdXNUeXBlcywgU2NoZW1hVHlwZSBvdXRlclR5cGUpCi0gICAgewotICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZUltcGwgc2dIZWFkID0gbnVsbDsKLQotICAgICAgICAvLyB0cmFuc2xhdGUgc2cgaGVhZAotICAgICAgICBpZiAoeHNkRWx0LmlzU2V0U3Vic3RpdHV0aW9uR3JvdXAoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc2dIZWFkID0gc3RhdGUuZmluZERvY3VtZW50VHlwZSh4c2RFbHQuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKSwKLSAgICAgICAgICAgICAgICAoKFNjaGVtYVR5cGVJbXBsKW91dGVyVHlwZSkuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkpOwotCi0gICAgICAgICAgICBpZiAoc2dIZWFkICE9IG51bGwpCi0gICAgICAgICAgICAgICAgU3RzY1Jlc29sdmVyLnJlc29sdmVUeXBlKHNnSGVhZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbmFtZSA9IHhzZEVsdC5nZXROYW1lKCk7Ci0gICAgICAgIFFOYW1lIHJlZiA9IHhzZEVsdC5nZXRSZWYoKTsKLQotCi0KLSAgICAgICAgaWYgKHJlZiAhPSBudWxsICYmIG5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gaWYgKG5hbWUuZXF1YWxzKHJlZi5nZXRMb2NhbFBhcnQoKSkgJiYgdXJpTWF0Y2godGFyZ2V0TmFtZXNwYWNlLCByZWYuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgICAgICAgLy8gICAgIHN0YXRlLndhcm5pbmcoIkVsZW1lbnQgIiArIG5hbWUgKyAiIHNwZWNpZmllcyBib3RoIGEgcmVmIGFuZCBhIG5hbWUiLCBYbWxFcnJvckNvbnRleHQuRUxFTUVOVF9FWFRSQV9SRUYsIHhzZEVsdC54Z2V0UmVmKCkpOwotICAgICAgICAgICAgLy8gZWxzZQotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJFbGVtZW50ICIgKyBuYW1lICsgIiBzcGVjaWZpZXMgYm90aCBhIHJlZiBhbmQgYSBuYW1lIiwgWG1sRXJyb3JDb250ZXh0LkVMRU1FTlRfRVhUUkFfUkVGLCB4c2RFbHQueGdldFJlZigpKTsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBuYW1lCi0gICAgICAgICAgICBuYW1lID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVmID09IG51bGwgJiYgbmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiRWxlbWVudCBoYXMgbm8gbmFtZSIsIFhtbEVycm9yQ29udGV4dC5FTEVNRU5UX01JU1NJTkdfTkFNRSwgeHNkRWx0KTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgdGhpcyBlbGVtZW50Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmICFYTUxDaGFyLmlzVmFsaWROQ05hbWUobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJJbnZhbGlkIGVsZW1lbnQgbmFtZSBcIiIgKyBuYW1lICsgIlwiIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkRWx0LnhnZXROYW1lKCkpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGxldCB0aGUgbmFtZSBnbyB0aHJvdWdoIGFueXdheS4KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZWYgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHhzZEVsdC5nZXRUeXBlKCkgIT0gbnVsbCB8fCB4c2RFbHQuZ2V0U2ltcGxlVHlwZSgpICE9IG51bGwgfHwgeHNkRWx0LmdldENvbXBsZXhUeXBlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiRWxlbWVudCByZWZlcmVuY2UgY2Fubm90IGFsc28gc3BlY2lmeSBhIHR5cGUiLCBYbWxFcnJvckNvbnRleHQuSU5WQUxJRF9OQU1FLCB4c2RFbHQueGdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGxldCB0aGUgbmFtZSBnbyB0aHJvdWdoIGFueXdheS4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHhzZEVsdC5nZXRGb3JtKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiRWxlbWVudCByZWZlcmVuY2UgY2Fubm90IGFsc28gc3BlY2lmeSBmb3JtIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkRWx0LnhnZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBsZXQgdGhlIG5hbWUgZ28gdGhyb3VnaCBhbnl3YXkuCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydCh4c2RFbHQgaW5zdGFuY2VvZiBMb2NhbEVsZW1lbnQpOwotICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudCByZWZlcmVuY2VkID0gc3RhdGUuZmluZEdsb2JhbEVsZW1lbnQocmVmLCBjaGFtZWxlb24gPyB0YXJnZXROYW1lc3BhY2UgOiBudWxsKTsKLSAgICAgICAgICAgIGlmIChyZWZlcmVuY2VkID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihyZWYsIFhtbEVycm9yQ29udGV4dC5FTEVNRU5UX1JFRl9OT1RfRk9VTkQsIHhzZEVsdC54Z2V0UmVmKCkpOwotICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgdGhpcyBlbGVtZW50Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsIHRhcmdldCA9IG5ldyBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsKCk7Ci0gICAgICAgICAgICB0YXJnZXQuc2V0UGFydGljbGVUeXBlKFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQpOwotICAgICAgICAgICAgY29weUdsb2JhbEVsZW1lbnRUb0xvY2FsRWxlbWVudCggcmVmZXJlbmNlZCwgdGFyZ2V0ICk7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgUU5hbWUgcW5hbWU7Ci0gICAgICAgIFNjaGVtYUxvY2FsRWxlbWVudEltcGwgaW1wbDsKLSAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHhzZEVsdCBpbnN0YW5jZW9mIExvY2FsRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgICAgaW1wbCA9IG5ldyBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsKCk7Ci0gICAgICAgICAgICBGb3JtQ2hvaWNlIGZvcm0gPSB4c2RFbHQueGdldEZvcm0oKTsKLSAgICAgICAgICAgIGlmIChmb3JtID09IG51bGwpCi0gICAgICAgICAgICAgICAgZm9ybSA9IGZpbmRFbGVtZW50Rm9ybURlZmF1bHQoeHNkRWx0KTsKLSAgICAgICAgICAgIGlmIChmb3JtID09IG51bGwgfHwgZm9ybS5nZXRTdHJpbmdWYWx1ZSgpLmVxdWFscygidW5xdWFsaWZpZWQiKSkKLSAgICAgICAgICAgICAgICBxbmFtZSA9IFFOYW1lSGVscGVyLmZvckxOKG5hbWUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHFuYW1lID0gUU5hbWVIZWxwZXIuZm9yTE5TKG5hbWUsIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50SW1wbCBnZWx0ID0gbmV3IFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsKHN0YXRlLnN0cygpKTsKLSAgICAgICAgICAgIGltcGwgPSBnZWx0OwotCi0gICAgICAgICAgICAvLyBTZXQgc3Vic3QgZ3JvdXAgaGVhZAotICAgICAgICAgICAgaWYgKHNnSGVhZCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsIGhlYWQgPSBzdGF0ZS5maW5kR2xvYmFsRWxlbWVudCh4c2RFbHQuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKSwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKGhlYWQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZ2VsdC5zZXRTdWJzdGl0dXRpb25Hcm91cChoZWFkLmdldFJlZigpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU2V0IHN1YnN0IGdyb3VwIG1lbWJlcnMKLSAgICAgICAgICAgIHFuYW1lID0gUU5hbWVIZWxwZXIuZm9yTE5TKG5hbWUsIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBkb2NUeXBlID0gKFNjaGVtYVR5cGVJbXBsKW91dGVyVHlwZTsKLQotICAgICAgICAgICAgUU5hbWVbXSBzZ01lbWJlcnMgPSBkb2NUeXBlLmdldFN1YnN0aXR1dGlvbkdyb3VwTWVtYmVycygpOwotICAgICAgICAgICAgUU5hbWVTZXRCdWlsZGVyIHRyYW5zaXRpb25SdWxlcyA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIHRyYW5zaXRpb25SdWxlcy5hZGQocW5hbWUpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBzZ01lbWJlcnMubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdlbHQuYWRkU3Vic3RpdHV0aW9uR3JvdXBNZW1iZXIoc2dNZW1iZXJzW2ldKTsKLSAgICAgICAgICAgICAgICB0cmFuc2l0aW9uUnVsZXMuYWRkKHNnTWVtYmVyc1tpXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGltcGwuc2V0VHJhbnNpdGlvblJ1bGVzKFFOYW1lU2V0LmZvclNwZWNpZmljYXRpb24odHJhbnNpdGlvblJ1bGVzKSwgZmFsc2UpOwotICAgICAgICAgICAgaW1wbC5zZXRUcmFuc2l0aW9uTm90ZXMoUU5hbWVTZXQuRU1QVFksIHRydWUpOwotCi0gICAgICAgICAgICBib29sZWFuIGZpbmFsRXh0ID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIGZpbmFsUmVzdCA9IGZhbHNlOwotICAgICAgICAgICAgT2JqZWN0IGRzID0geHNkRWx0LmdldEZpbmFsKCk7Ci0gICAgICAgICAgICBpZiAoZHMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZHMgaW5zdGFuY2VvZiBTdHJpbmcgJiYgZHMuZXF1YWxzKCIjYWxsIikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyAjQUxMIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsRXh0ID0gZmluYWxSZXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoZHMgaW5zdGFuY2VvZiBMaXN0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCgoTGlzdClkcykuY29udGFpbnMoImV4dGVuc2lvbiIpKQotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxFeHQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoKChMaXN0KWRzKS5jb250YWlucygicmVzdHJpY3Rpb24iKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsUmVzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBnZWx0LnNldEZpbmFsKGZpbmFsRXh0LCBmaW5hbFJlc3QpOwotICAgICAgICAgICAgZ2VsdC5zZXRBYnN0cmFjdCh4c2RFbHQuZ2V0QWJzdHJhY3QoKSk7Ci0gICAgICAgICAgICBnZWx0LnNldEZpbGVuYW1lKGZpbmRGaWxlbmFtZSh4c2RFbHQpKTsKLSAgICAgICAgICAgIGdlbHQuc2V0UGFyc2VDb250ZXh0KHhzZEVsdCwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHhzZEVsdC5nZXRUeXBlKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc1R5cGUgPSBzdGF0ZS5maW5kR2xvYmFsVHlwZSh4c2RFbHQuZ2V0VHlwZSgpLCBjaGFtZWxlb24gPyB0YXJnZXROYW1lc3BhY2UgOiBudWxsICk7Ci0gICAgICAgICAgICBpZiAoc1R5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzdGF0ZS5ub3RGb3VuZEVycm9yKHhzZEVsdC5nZXRUeXBlKCksIFhtbEVycm9yQ29udGV4dC5UWVBFX05PVF9GT1VORCwgeHNkRWx0LnhnZXRUeXBlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBzaW1wbGVUeXBlZGVmID0gZmFsc2U7Ci0gICAgICAgIFhtbE9iamVjdCB0eXBlZGVmID0geHNkRWx0LmdldENvbXBsZXhUeXBlKCk7Ci0gICAgICAgIGlmICh0eXBlZGVmID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHR5cGVkZWYgPSB4c2RFbHQuZ2V0U2ltcGxlVHlwZSgpOwotICAgICAgICAgICAgc2ltcGxlVHlwZWRlZiA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHNUeXBlICE9IG51bGwpICYmIHR5cGVkZWYgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIklsbGVnYWwgdG8gZGVmaW5lIGEgbmVzdGVkIHR5cGUgd2hlbiBhIHR5cGUgYXR0cmlidXRlIGlzIHNwZWNpZmllZCIsIFhtbEVycm9yQ29udGV4dC5SRURVTkRBTlRfTkVTVEVEX1RZUEUsIHR5cGVkZWYpOwotICAgICAgICAgICAgdHlwZWRlZiA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZWRlZiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBzVHlwZUltcGwgPSBuZXcgU2NoZW1hVHlwZUltcGwoc3RhdGUuc3RzKCkpOwotICAgICAgICAgICAgc1R5cGUgPSBzVHlwZUltcGw7Ci0gICAgICAgICAgICBzVHlwZUltcGwuc2V0Q29udGFpbmVyRmllbGQoaW1wbCk7Ci0gICAgICAgICAgICBzVHlwZUltcGwuc2V0T3V0ZXJTY2hlbWFUeXBlUmVmKG91dGVyVHlwZSA9PSBudWxsID8gbnVsbCA6IG91dGVyVHlwZS5nZXRSZWYoKSk7Ci0gICAgICAgICAgICAvLyBsZWF2ZSB0aGUgYW5vbnltb3VzIHR5cGUgdW5yZXNvbHZlZDogaXQgd2lsbCBiZSByZXNvbHZlZCBsYXRlci4KLSAgICAgICAgICAgIGFub255bW91c1R5cGVzLmFkZChzVHlwZSk7Ci0gICAgICAgICAgICBzVHlwZUltcGwuc2V0U2ltcGxlVHlwZShzaW1wbGVUeXBlZGVmKTsKLSAgICAgICAgICAgIHNUeXBlSW1wbC5zZXRQYXJzZUNvbnRleHQodHlwZWRlZiwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzVHlwZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB0eXBlIG1heSBpbmhlcml0IGZyb20gc3Vic3RpdHV0aW9uIGdyb3VwIGhlYWQKLSAgICAgICAgICAgIGlmIChzZ0hlYWQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50IGhlYWQgPSBzdGF0ZS5maW5kR2xvYmFsRWxlbWVudCh4c2RFbHQuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKSwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBCdWcgLSBEbyBJIG5lZWQgdG8gY29weSB0aGUgdHlwZSBpZiBpdCdzIGFub255bW91cz8KLSAgICAgICAgICAgICAgICAvLyBJZiBlbGVtZW50IGRvZXMgbm90IGV4aXN0LCBlcnJvciBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkCi0gICAgICAgICAgICAgICAgaWYgKGhlYWQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc1R5cGUgPSBoZWFkLmdldFR5cGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotCi0gICAgICAgIGlmIChzVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgc1R5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfVFlQRTsKLQotICAgICAgICBTT0FQQXJyYXlUeXBlIHdhdCA9IG51bGw7Ci0gICAgICAgIFhtbEN1cnNvciBjID0geHNkRWx0Lm5ld0N1cnNvcigpOwotICAgICAgICBTdHJpbmcgYXJyYXlUeXBlID0gYy5nZXRBdHRyaWJ1dGVUZXh0KFdTRExfQVJSQVlUWVBFX05BTUUpOwotICAgICAgICBjLmRpc3Bvc2UoKTsKLSAgICAgICAgaWYgKGFycmF5VHlwZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB3YXQgPSBuZXcgU09BUEFycmF5VHlwZShhcnJheVR5cGUsIG5ldyBOYW1lc3BhY2VDb250ZXh0KHhzZEVsdCkpOwotICAgICAgICB9Ci0gICAgICAgIGltcGwuc2V0V3NkbEFycmF5VHlwZSh3YXQpOwotCi0gICAgICAgIGJvb2xlYW4gaXNGaXhlZCA9IHhzZEVsdC5pc1NldEZpeGVkKCk7Ci0gICAgICAgIGlmICh4c2RFbHQuaXNTZXREZWZhdWx0KCkgJiYgaXNGaXhlZCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlNob3VsZCBub3Qgc2V0IGJvdGggZGVmYXVsdCBhbmQgZml4ZWQgb24gdGhlIHNhbWUgZWxlbWVudCIsIFhtbEVycm9yQ29udGV4dC5SRURVTkRBTlRfREVGQVVMVF9GSVhFRCwgeHNkRWx0LnhnZXRGaXhlZCgpKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgZml4ZWQKLSAgICAgICAgICAgIGlzRml4ZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpbXBsLnNldFBhcnRpY2xlVHlwZShTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKTsKLSAgICAgICAgaW1wbC5zZXROYW1lQW5kVHlwZVJlZihxbmFtZSwgc1R5cGUuZ2V0UmVmKCkpOwotICAgICAgICBpbXBsLnNldE5pbGxhYmxlKHhzZEVsdC5nZXROaWxsYWJsZSgpKTsKLSAgICAgICAgaW1wbC5zZXREZWZhdWx0KGlzRml4ZWQgPyB4c2RFbHQuZ2V0Rml4ZWQoKSA6IHhzZEVsdC5nZXREZWZhdWx0KCksIGlzRml4ZWQsIHhzZEVsdCk7Ci0KLSAgICAgICAgT2JqZWN0IGJsb2NrID0geHNkRWx0LmdldEJsb2NrKCk7Ci0gICAgICAgIGJvb2xlYW4gYmxvY2tFeHQgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBibG9ja1Jlc3QgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBibG9ja1N1YnN0ID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGJsb2NrICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChibG9jayBpbnN0YW5jZW9mIFN0cmluZyAmJiBibG9jay5lcXVhbHMoIiNhbGwiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyAjQUxMIHZhbHVlCi0gICAgICAgICAgICAgICAgYmxvY2tFeHQgPSBibG9ja1Jlc3QgPSBibG9ja1N1YnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGJsb2NrIGluc3RhbmNlb2YgTGlzdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKChMaXN0KWJsb2NrKS5jb250YWlucygiZXh0ZW5zaW9uIikpCi0gICAgICAgICAgICAgICAgICAgIGJsb2NrRXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoKChMaXN0KWJsb2NrKS5jb250YWlucygicmVzdHJpY3Rpb24iKSkKLSAgICAgICAgICAgICAgICAgICAgYmxvY2tSZXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoKChMaXN0KWJsb2NrKS5jb250YWlucygic3Vic3RpdHV0aW9uIikpCi0gICAgICAgICAgICAgICAgICAgIGJsb2NrU3Vic3QgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbXBsLnNldEJsb2NrKGJsb2NrRXh0LCBibG9ja1Jlc3QsIGJsb2NrU3Vic3QpOwotCi0gICAgICAgIGJvb2xlYW4gY29uc3RyYWludEZhaWxlZCA9IGZhbHNlOwotCi0gICAgICAgIC8vIFRyYW5zbGF0ZSBJZGVudGl0eSBjb25zdHJhaW50cwotCi0gICAgICAgIGludCBsZW5ndGggPSB4c2RFbHQuc2l6ZU9mS2V5QXJyYXkoKSArIHhzZEVsdC5zaXplT2ZLZXlyZWZBcnJheSgpICsgeHNkRWx0LnNpemVPZlVuaXF1ZUFycmF5KCk7Ci0gICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGxbXSBjb25zdHJhaW50cyA9IG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsW2xlbmd0aF07Ci0gICAgICAgIGludCBjdXIgPSAwOwotCi0gICAgICAgIC8vIEhhbmRsZSBrZXkgY29uc3RyYWludHMKLSAgICAgICAgS2V5YmFzZVtdIGtleXMgPSB4c2RFbHQuZ2V0S2V5QXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwga2V5cy5sZW5ndGggOyBpKyssIGN1cisrKSB7Ci0gICAgICAgICAgICBjb25zdHJhaW50c1tjdXJdID0gdHJhbnNsYXRlSWRlbnRpdHlDb25zdHJhaW50KGtleXNbaV0sIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uKTsKLSAgICAgICAgICAgIGlmIChjb25zdHJhaW50c1tjdXJdICE9IG51bGwpCi0gICAgICAgICAgICAgICAgY29uc3RyYWludHNbY3VyXS5zZXRDb25zdHJhaW50Q2F0ZWdvcnkoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LkNDX0tFWSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY29uc3RyYWludEZhaWxlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBIYW5kbGUgdW5pcXVlIGNvbnN0cmFpbnRzCi0gICAgICAgIEtleWJhc2VbXSB1YyA9IHhzZEVsdC5nZXRVbmlxdWVBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCB1Yy5sZW5ndGggOyBpKyssIGN1cisrKSB7Ci0gICAgICAgICAgICBjb25zdHJhaW50c1tjdXJdID0gdHJhbnNsYXRlSWRlbnRpdHlDb25zdHJhaW50KHVjW2ldLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbik7Ci0gICAgICAgICAgICBpZiAoY29uc3RyYWludHNbY3VyXSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzW2N1cl0uc2V0Q29uc3RyYWludENhdGVnb3J5KFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5DQ19VTklRVUUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRGYWlsZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGFuZGxlIGtleXJlZiBjb25zdHJhaW50cwotICAgICAgICBLZXlyZWZEb2N1bWVudC5LZXlyZWZbXSBrcnMgPSB4c2RFbHQuZ2V0S2V5cmVmQXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwga3JzLmxlbmd0aCA7IGkrKywgY3VyKyspIHsKLSAgICAgICAgICAgIGNvbnN0cmFpbnRzW2N1cl0gPSB0cmFuc2xhdGVJZGVudGl0eUNvbnN0cmFpbnQoa3JzW2ldLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbik7Ci0gICAgICAgICAgICBpZiAoY29uc3RyYWludHNbY3VyXSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzW2N1cl0uc2V0Q29uc3RyYWludENhdGVnb3J5KFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5DQ19LRVlSRUYpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRGYWlsZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFjb25zdHJhaW50RmFpbGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmW10gcmVmcyA9IG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmW2xlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCByZWZzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgICAgICByZWZzW2ldID0gY29uc3RyYWludHNbaV0uZ2V0UmVmKCk7Ci0KLSAgICAgICAgICAgIGltcGwuc2V0SWRlbnRpdHlDb25zdHJhaW50cyhyZWZzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpbXBsOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVtb3ZlV2hpdGVzcGFjZShTdHJpbmcgeHBhdGgpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgeHBhdGgubGVuZ3RoKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgY2hhciBjaCA9IHhwYXRoLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChYTUxDaGFyLmlzU3BhY2UoY2gpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgc2IuYXBwZW5kKGNoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb24gWFBBVEhfUkVHRVhQID0gbmV3IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbigiKFxcLi8vKT8oKCgoY2hpbGQ6Oik/KChcXGlcXGMqOik/KFxcaVxcYyp8XFwqKSkpfFxcLikvKSooKCgoY2hpbGQ6Oik/KChcXGlcXGMqOik/KFxcaVxcYyp8XFwqKSkpfFxcLil8KChhdHRyaWJ1dGU6OnxAKSgoXFxpXFxjKjopPyhcXGlcXGMqfFxcKikpKSkoXFx8KFxcLi8vKT8oKCgoY2hpbGQ6Oik/KChcXGlcXGMqOik/KFxcaVxcYyp8XFwqKSkpfFxcLikvKSooKCgoY2hpbGQ6Oik/KChcXGlcXGMqOik/KFxcaVxcYyp8XFwqKSkpfFxcLil8KChhdHRyaWJ1dGU6OnxAKSgoXFxpXFxjKjopPyhcXGlcXGMqfFxcKikpKSkpKiIsICJYIik7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVja1hQYXRoU3ludGF4KFN0cmluZyB4cGF0aCkKLSAgICB7Ci0gICAgICAgIGlmICh4cGF0aCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICAgICAgLy8gc3RyaXAgd2hpdGVzcGFjZSBmcm9tIHhwYXRoCi0gICAgICAgIHhwYXRoID0gcmVtb3ZlV2hpdGVzcGFjZSh4cGF0aCk7Ci0gICAgICAgIAotICAgICAgICAvLyBhcHBseSByZWdleHAKLSAgICAgICAgc3luY2hyb25pemVkIChYUEFUSF9SRUdFWFApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoWFBBVEhfUkVHRVhQLm1hdGNoZXMoeHBhdGgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGwgdHJhbnNsYXRlSWRlbnRpdHlDb25zdHJhaW50KEtleWJhc2UgcGFyc2VJQywgCi0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uKQotICAgIHsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotICAgICAgICAKLSAgICAgICAgLy8gZmlyc3QgZG8gc29tZSBjaGVja2luZwotICAgICAgICBTdHJpbmcgc2VsZWN0b3IgPSBwYXJzZUlDLmdldFNlbGVjdG9yKCkgPT0gbnVsbCA/IG51bGwgOiBwYXJzZUlDLmdldFNlbGVjdG9yKCkuZ2V0WHBhdGgoKTsKLSAgICAgICAgaWYgKCFjaGVja1hQYXRoU3ludGF4KHNlbGVjdG9yKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJJbnZhbGlkIHhwYXRoIGluIHNlbGVjdG9yLiIsCi0gICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0LlhQQVRIX0NPTVBJTEFUSU9OX0ZBSUxVUkUsIHBhcnNlSUMuZ2V0U2VsZWN0b3IoKS54Z2V0WHBhdGgoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRmllbGREb2N1bWVudC5GaWVsZFtdIGZpZWxkRWx0cyA9IHBhcnNlSUMuZ2V0RmllbGRBcnJheSgpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZpZWxkRWx0cy5sZW5ndGg7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFjaGVja1hQYXRoU3ludGF4KGZpZWxkRWx0c1tqXS5nZXRYcGF0aCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkludmFsaWQgeHBhdGggaW4gZmllbGQuIiwKLSAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0LlhQQVRIX0NPTVBJTEFUSU9OX0ZBSUxVUkUsIGZpZWxkRWx0c1tqXS54Z2V0WHBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIHRoZW4gdHJhbnNsYXRlLgotICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsIGljID0gbmV3IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGwoc3RhdGUuc3RzKCkpOwotICAgICAgICBpYy5zZXROYW1lKFFOYW1lSGVscGVyLmZvckxOUyhwYXJzZUlDLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlKSk7Ci0gICAgICAgIGljLnNldFNlbGVjdG9yKHBhcnNlSUMuZ2V0U2VsZWN0b3IoKS5nZXRYcGF0aCgpKTsKLSAgICAgICAgaWMuc2V0UGFyc2VDb250ZXh0KHBhcnNlSUMsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uKTsKLQotICAgICAgICAvLyBTZXQgdGhlIG5zIG1hcAotICAgICAgICBYbWxDdXJzb3IgYyA9IHBhcnNlSUMubmV3Q3Vyc29yKCk7Ci0gICAgICAgIE1hcCBuc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgYy5nZXRBbGxOYW1lc3BhY2VzKG5zTWFwKTsKLSAgICAgICAgbnNNYXAucmVtb3ZlKCIiKTsgLy8gUmVtb3ZlIHRoZSBkZWZhdWx0IG1hcHBpbmcuIFRoaXMgY2Fubm90IGJlIHVzZWQgYnkgdGhlIHhwYXRoIGV4cHJlc3Npb25zLgotICAgICAgICBpYy5zZXROU01hcChuc01hcCk7Ci0gICAgICAgIGMuZGlzcG9zZSgpOwotCi0gICAgICAgIFN0cmluZ1tdIGZpZWxkcyA9IG5ldyBTdHJpbmdbZmllbGRFbHRzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGogPSAwIDsgaiA8IGZpZWxkcy5sZW5ndGggOyBqKyspCi0gICAgICAgICAgICBmaWVsZHNbal0gPSBmaWVsZEVsdHNbal0uZ2V0WHBhdGgoKTsKLSAgICAgICAgaWMuc2V0RmllbGRzKGZpZWxkcyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGljLmJ1aWxkUGF0aHMoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWFBhdGguWFBhdGhDb21waWxlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiSW52YWxpZCB4cGF0aCBpbiBpZGVudGl0eSBjb25zdHJhaW50OiAiICsgZS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0LlhQQVRIX0NPTVBJTEFUSU9OX0ZBSUxVUkUsIHBhcnNlSUMpOwotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRlLmFkZElkQ29uc3RyYWludChpYyk7Ci0KLSAgICAgICAgcmV0dXJuIGljOwotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFNb2RlbEdyb3VwSW1wbCB0cmFuc2xhdGVNb2RlbEdyb3VwKE5hbWVkR3JvdXAgbmFtZWRHcm91cCwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgYm9vbGVhbiBjaGFtZWxlb24sIGJvb2xlYW4gcmVkZWZpbml0aW9uKQotICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lZEdyb3VwLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJNb2RlbCBncm91cHMgbXVzdCBiZSBuYW1lZCIsIFhtbEVycm9yQ29udGV4dC5NT0RFTF9HUk9VUF9NSVNTSU5HX05BTUUsIG5hbWVkR3JvdXApOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgU2NoZW1hTW9kZWxHcm91cEltcGwgcmVzdWx0ID0gbmV3IFNjaGVtYU1vZGVsR3JvdXBJbXBsKFN0c2NTdGF0ZS5nZXQoKS5zdHMoKSk7Ci0gICAgICAgIHJlc3VsdC5pbml0KFFOYW1lSGVscGVyLmZvckxOUyhuYW1lLCB0YXJnZXROYW1lc3BhY2UpLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgcmVkZWZpbml0aW9uLCBuYW1lZEdyb3VwKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbCB0cmFuc2xhdGVBdHRyaWJ1dGVHcm91cChBdHRyaWJ1dGVHcm91cCBhdHRyR3JvdXAsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLCBib29sZWFuIHJlZGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gYXR0ckdyb3VwLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJBdHRyaWJ1dGUgZ3JvdXBzIG11c3QgYmUgbmFtZWQiLCBYbWxFcnJvckNvbnRleHQuQVRUUklCVVRFX0dST1VQX01JU1NJTkdfTkFNRSwgYXR0ckdyb3VwKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbCByZXN1bHQgPSBuZXcgU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsKFN0c2NTdGF0ZS5nZXQoKS5zdHMoKSk7Ci0gICAgICAgIHJlc3VsdC5pbml0KFFOYW1lSGVscGVyLmZvckxOUyhuYW1lLCB0YXJnZXROYW1lc3BhY2UpLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgcmVkZWZpbml0aW9uLCBhdHRyR3JvdXApOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHN0YXRpYyBGb3JtQ2hvaWNlIGZpbmRBdHRyaWJ1dGVGb3JtRGVmYXVsdChYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IG9iai5uZXdDdXJzb3IoKTsKLSAgICAgICAgd2hpbGUgKGN1ci5nZXRPYmplY3QoKS5zY2hlbWFUeXBlKCkgIT0gU2NoZW1hLnR5cGUpCi0gICAgICAgICAgICBpZiAoIWN1ci50b1BhcmVudCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gKChTY2hlbWEpY3VyLmdldE9iamVjdCgpKS54Z2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU2NoZW1hTG9jYWxBdHRyaWJ1dGVJbXBsIHRyYW5zbGF0ZUF0dHJpYnV0ZSgKLSAgICAgICAgQXR0cmlidXRlIHhzZEF0dHIsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLCBMaXN0IGFub255bW91c1R5cGVzLAotICAgICAgICBTY2hlbWFUeXBlIG91dGVyVHlwZSwgU2NoZW1hQXR0cmlidXRlTW9kZWwgYmFzZU1vZGVsLCBib29sZWFuIGxvY2FsKQotICAgIHsKLSAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOwotCi0gICAgICAgIFN0cmluZyBuYW1lID0geHNkQXR0ci5nZXROYW1lKCk7Ci0gICAgICAgIFFOYW1lIHJlZiA9IHhzZEF0dHIuZ2V0UmVmKCk7Ci0KLSAgICAgICAgaWYgKHJlZiAhPSBudWxsICYmIG5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKHJlZi5nZXRMb2NhbFBhcnQoKSkgJiYgdXJpTWF0Y2godGFyZ2V0TmFtZXNwYWNlLCByZWYuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgICAgICAgICAgIHN0YXRlLndhcm5pbmcoIkF0dHJpYnV0ZSAiICsgbmFtZSArICIgc3BlY2lmaWVzIGJvdGggYSByZWYgYW5kIGEgbmFtZSIsIFhtbEVycm9yQ29udGV4dC5FTEVNRU5UX0VYVFJBX1JFRiwgeHNkQXR0ci54Z2V0UmVmKCkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBdHRyaWJ1dGUgIiArIG5hbWUgKyAiIHNwZWNpZmllcyBib3RoIGEgcmVmIGFuZCBhIG5hbWUiLCBYbWxFcnJvckNvbnRleHQuRUxFTUVOVF9FWFRSQV9SRUYsIHhzZEF0dHIueGdldFJlZigpKTsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBuYW1lCi0gICAgICAgICAgICBuYW1lID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVmID09IG51bGwgJiYgbmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZS5lcnJvcigiQXR0cmlidXRlIGhhcyBubyBuYW1lIiwgWG1sRXJyb3JDb250ZXh0LkVMRU1FTlRfTUlTU0lOR19OQU1FLCB4c2RBdHRyKTsKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgdGhpcyBlbGVtZW50Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmICFYTUxDaGFyLmlzVmFsaWROQ05hbWUobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlLmVycm9yKCJJbnZhbGlkIGF0dHJpYnV0ZSBuYW1lIFwiIiArIG5hbWUgKyAiXCIiLCBYbWxFcnJvckNvbnRleHQuSU5WQUxJRF9OQU1FLCB4c2RBdHRyLnhnZXROYW1lKCkpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGxldCB0aGUgbmFtZSBnbyB0aHJvdWdoIGFueXdheS4KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNGaXhlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgZGVmdGV4dCA9IG51bGw7Ci0gICAgICAgIFFOYW1lIHFuYW1lOwotICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwgc0F0dHI7Ci0gICAgICAgIFNjaGVtYVR5cGUgc1R5cGUgPSBudWxsOwotICAgICAgICBpbnQgdXNlID0gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuT1BUSU9OQUw7Ci0KLSAgICAgICAgaWYgKGxvY2FsKQotICAgICAgICAgICAgc0F0dHIgPSBuZXcgU2NoZW1hTG9jYWxBdHRyaWJ1dGVJbXBsKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc0F0dHIgPSBuZXcgU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbChzdGF0ZS5zdHMoKSk7Ci0gICAgICAgICAgICAoKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwpc0F0dHIpLnNldFBhcnNlQ29udGV4dCh4c2RBdHRyLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVmICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh4c2RBdHRyLmdldFR5cGUoKSAhPSBudWxsIHx8IHhzZEF0dHIuZ2V0U2ltcGxlVHlwZSgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkF0dHJpYnV0ZSByZWZlcmVuY2UgY2Fubm90IGFsc28gc3BlY2lmeSB0eXBlIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkQXR0cik7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZSB0eXBlLCBzaW1wbGVUeXBlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh4c2RBdHRyLmdldEZvcm0oKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBdHRyaWJ1dGUgcmVmZXJlbmNlIGNhbm5vdCBhbHNvIHNwZWNpZnkgZm9ybSIsIFhtbEVycm9yQ29udGV4dC5JTlZBTElEX05BTUUsIHhzZEF0dHIpOwotICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgZm9ybQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgcmVmZXJlbmNlZCA9IHN0YXRlLmZpbmRHbG9iYWxBdHRyaWJ1dGUocmVmLCBjaGFtZWxlb24gPyB0YXJnZXROYW1lc3BhY2UgOiBudWxsKTsKLSAgICAgICAgICAgIGlmIChyZWZlcmVuY2VkID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihyZWYsIFhtbEVycm9yQ29udGV4dC5BVFRSSUJVVEVfUkVGX05PVF9GT1VORCwgeHNkQXR0ci54Z2V0UmVmKCkpOwotICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgdGhpcyBlbGVtZW50Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHFuYW1lID0gcmVmOwotICAgICAgICAgICAgdXNlID0gcmVmZXJlbmNlZC5nZXRVc2UoKTsKLSAgICAgICAgICAgIHNUeXBlID0gcmVmZXJlbmNlZC5nZXRUeXBlKCk7Ci0gICAgICAgICAgICBkZWZ0ZXh0ID0gcmVmZXJlbmNlZC5nZXREZWZhdWx0VGV4dCgpOwotICAgICAgICAgICAgaWYgKGRlZnRleHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpc0ZpeGVkID0gcmVmZXJlbmNlZC5pc0ZpeGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobG9jYWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRm9ybUNob2ljZSBmb3JtID0geHNkQXR0ci54Z2V0Rm9ybSgpOwotICAgICAgICAgICAgICAgIGlmIChmb3JtID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGZvcm0gPSBmaW5kQXR0cmlidXRlRm9ybURlZmF1bHQoeHNkQXR0cik7Ci0gICAgICAgICAgICAgICAgaWYgKGZvcm0gPT0gbnVsbCB8fCBmb3JtLmdldFN0cmluZ1ZhbHVlKCkuZXF1YWxzKCJ1bnF1YWxpZmllZCIpKQotICAgICAgICAgICAgICAgICAgICBxbmFtZSA9IFFOYW1lSGVscGVyLmZvckxOKG5hbWUpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcW5hbWUgPSBRTmFtZUhlbHBlci5mb3JMTlMobmFtZSwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBxbmFtZSA9IFFOYW1lSGVscGVyLmZvckxOUyhuYW1lLCB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoeHNkQXR0ci5nZXRUeXBlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzVHlwZSA9IHN0YXRlLmZpbmRHbG9iYWxUeXBlKHhzZEF0dHIuZ2V0VHlwZSgpLCBjaGFtZWxlb24gPyB0YXJnZXROYW1lc3BhY2UgOiBudWxsICk7Ci0gICAgICAgICAgICAgICAgaWYgKHNUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3IoeHNkQXR0ci5nZXRUeXBlKCksIFhtbEVycm9yQ29udGV4dC5UWVBFX05PVF9GT1VORCwgeHNkQXR0ci54Z2V0VHlwZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiSWxsZWdhbCBuYW1lc3BhY2UgZm9yIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4iLCBYbWxFcnJvckNvbnRleHQuSU5WQUxJRF9OQU1FLCB4c2RBdHRyLnhnZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPT0gMCAmJiBxbmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoInhtbG5zIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIklsbGVnYWwgbmFtZSBmb3IgYXR0cmlidXRlIGRlY2xhcmF0aW9uLiIsIFhtbEVycm9yQ29udGV4dC5JTlZBTElEX05BTUUsIHhzZEF0dHIueGdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFhtbE9iamVjdCB0eXBlZGVmID0geHNkQXR0ci5nZXRTaW1wbGVUeXBlKCk7Ci0KLSAgICAgICAgICAgIGlmICgoc1R5cGUgIT0gbnVsbCkgJiYgdHlwZWRlZiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJJbGxlZ2FsIHRvIGRlZmluZSBhIG5lc3RlZCB0eXBlIHdoZW4gYSB0eXBlIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQiLCBYbWxFcnJvckNvbnRleHQuUkVEVU5EQU5UX05FU1RFRF9UWVBFLCB0eXBlZGVmKTsKLSAgICAgICAgICAgICAgICB0eXBlZGVmID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHR5cGVkZWYgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBzVHlwZUltcGwgPSBuZXcgU2NoZW1hVHlwZUltcGwoc3RhdGUuc3RzKCkpOwotICAgICAgICAgICAgICAgIHNUeXBlID0gc1R5cGVJbXBsOwotICAgICAgICAgICAgICAgIHNUeXBlSW1wbC5zZXRDb250YWluZXJGaWVsZChzQXR0cik7Ci0gICAgICAgICAgICAgICAgc1R5cGVJbXBsLnNldE91dGVyU2NoZW1hVHlwZVJlZihvdXRlclR5cGUgPT0gbnVsbCA/IG51bGwgOiBvdXRlclR5cGUuZ2V0UmVmKCkpOwotICAgICAgICAgICAgICAgIC8vIGxlYXZlIHRoZSBhbm9ueW1vdXMgdHlwZSB1bnJlc29sdmVkOiBpdCB3aWxsIGJlIHJlc29sdmVkIGxhdGVyLgotICAgICAgICAgICAgICAgIGFub255bW91c1R5cGVzLmFkZChzVHlwZSk7Ci0gICAgICAgICAgICAgICAgc1R5cGVJbXBsLnNldFNpbXBsZVR5cGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgc1R5cGVJbXBsLnNldFBhcnNlQ29udGV4dCh0eXBlZGVmLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoc1R5cGUgPT0gbnVsbCAmJiBiYXNlTW9kZWwgIT0gbnVsbCAmJiBiYXNlTW9kZWwuZ2V0QXR0cmlidXRlKHFuYW1lKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNUeXBlID0gYmFzZU1vZGVsLmdldEF0dHJpYnV0ZShxbmFtZSkuZ2V0VHlwZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNUeXBlID09IG51bGwpCi0gICAgICAgICAgICBzVHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7Ci0KLSAgICAgICAgaWYgKCFzVHlwZS5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkF0dHJpYnV0ZXMgbXVzdCBoYXZlIGEgc2ltcGxlIHR5cGUgKG5vdCBjb21wbGV4KS4iLCBYbWxFcnJvckNvbnRleHQuSU5WQUxJRF9TQ0hFTUEsIHhzZEF0dHIpOwotICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IHN3aXRjaCB0byB0aGUgYW55LXR5cGUKLSAgICAgICAgICAgIHNUeXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHhzZEF0dHIuaXNTZXRVc2UoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdXNlID0gdHJhbnNsYXRlVXNlQ29kZSh4c2RBdHRyLnhnZXRVc2UoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGlnbm9yZSByZWZlcmVuY2VkIGRlZmF1bHQgaWYgbm8gbG9uZ2VyIG9wdGlvbmFsCi0gICAgICAgICAgICBpZiAodXNlICE9IFNjaGVtYUxvY2FsQXR0cmlidXRlLk9QVElPTkFMICYmICFpc0ZpeGVkKQotICAgICAgICAgICAgICAgIGRlZnRleHQgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoeHNkQXR0ci5pc1NldERlZmF1bHQoKSB8fCB4c2RBdHRyLmlzU2V0Rml4ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzRml4ZWQgJiYgIXhzZEF0dHIuaXNTZXRGaXhlZCgpKQotICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHVzZSBvZiBhIGZpeGVkIGF0dHJpYnV0ZSBkZWZpbml0aW9uIG11c3QgYWxzbyBiZSBmaXhlZCIsIFhtbEVycm9yQ29udGV4dC5SRURVTkRBTlRfREVGQVVMVF9GSVhFRCwgeHNkQXR0ci54Z2V0Rml4ZWQoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlzRml4ZWQgPSB4c2RBdHRyLmlzU2V0Rml4ZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHhzZEF0dHIuaXNTZXREZWZhdWx0KCkgJiYgaXNGaXhlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiU2hvdWxkIG5vdCBzZXQgYm90aCBkZWZhdWx0IGFuZCBmaXhlZCBvbiB0aGUgc2FtZSBhdHRyaWJ1dGUiLCBYbWxFcnJvckNvbnRleHQuUkVEVU5EQU5UX0RFRkFVTFRfRklYRUQsIHhzZEF0dHIueGdldEZpeGVkKCkpOwotICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgZml4ZWQKLSAgICAgICAgICAgICAgICBpc0ZpeGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZ0ZXh0ID0gaXNGaXhlZCA/IHhzZEF0dHIuZ2V0Rml4ZWQoKSA6IHhzZEF0dHIuZ2V0RGVmYXVsdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFsb2NhbCkKLSAgICAgICAgewotICAgICAgICAgICAgKChTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsKXNBdHRyKS5zZXRGaWxlbmFtZShmaW5kRmlsZW5hbWUoeHNkQXR0cikpOwotICAgICAgICB9Ci0KLSAgICAgICAgU09BUEFycmF5VHlwZSB3YXQgPSBudWxsOwotICAgICAgICBYbWxDdXJzb3IgYyA9IHhzZEF0dHIubmV3Q3Vyc29yKCk7Ci0gICAgICAgIFN0cmluZyBhcnJheVR5cGUgPSBjLmdldEF0dHJpYnV0ZVRleHQoV1NETF9BUlJBWVRZUEVfTkFNRSk7Ci0gICAgICAgIGMuZGlzcG9zZSgpOwotICAgICAgICBpZiAoYXJyYXlUeXBlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdhdCA9IG5ldyBTT0FQQXJyYXlUeXBlKGFycmF5VHlwZSwgbmV3IE5hbWVzcGFjZUNvbnRleHQoeHNkQXR0cikpOwotICAgICAgICB9Ci0KLSAgICAgICAgc0F0dHIuaW5pdCgKLSAgICAgICAgICAgIHFuYW1lLAotICAgICAgICAgICAgc1R5cGUuZ2V0UmVmKCksCi0gICAgICAgICAgICB1c2UsCi0gICAgICAgICAgICBkZWZ0ZXh0LCB4c2RBdHRyLCBudWxsLCBpc0ZpeGVkLAotICAgICAgICAgICAgd2F0KTsKLQotICAgICAgICByZXR1cm4gc0F0dHI7Ci0gICAgfQotCi0gICAgc3RhdGljIGludCB0cmFuc2xhdGVVc2VDb2RlKEF0dHJpYnV0ZS5Vc2UgYXR0cnVzZSkKLSAgICB7Ci0gICAgICAgIGlmIChhdHRydXNlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuT1BUSU9OQUw7Ci0KLSAgICAgICAgU3RyaW5nIHZhbCA9IGF0dHJ1c2UuZ2V0U3RyaW5nVmFsdWUoKTsKLSAgICAgICAgaWYgKHZhbC5lcXVhbHMoIm9wdGlvbmFsIikpCi0gICAgICAgICAgICByZXR1cm4gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuT1BUSU9OQUw7Ci0gICAgICAgIGlmICh2YWwuZXF1YWxzKCJyZXF1aXJlZCIpKQotICAgICAgICAgICAgcmV0dXJuIFNjaGVtYUxvY2FsQXR0cmlidXRlLlJFUVVJUkVEOwotICAgICAgICBpZiAodmFsLmVxdWFscygicHJvaGliaXRlZCIpKQotICAgICAgICAgICAgcmV0dXJuIFNjaGVtYUxvY2FsQXR0cmlidXRlLlBST0hJQklURUQ7Ci0gICAgICAgIHJldHVybiBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5PUFRJT05BTDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgWG1sSW50ZWdlciBidWlsZE5uSW50ZWdlcihYbWxBbnlTaW1wbGVUeXBlIHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU3RyaW5nIHRleHQgPSB2YWx1ZS5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICBCaWdJbnRlZ2VyIGJpZ0ludDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJpZ0ludCA9IG5ldyBCaWdJbnRlZ2VyKHRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJNdXN0IGJlIG5vbm5lZ2F0aXZlIGludGVnZXIiLCBYbWxFcnJvckNvbnRleHQuTUFMRk9STUVEX05VTUJFUiwgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmlnSW50LnNpZ251bSgpIDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJNdXN0IGJlIG5vbm5lZ2F0aXZlIGludGVnZXIiLCBYbWxFcnJvckNvbnRleHQuTUFMRk9STUVEX05VTUJFUiwgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEludGVnZXJJbXBsIGkgPSBuZXcgWG1sSW50ZWdlckltcGwoKTsKLSAgICAgICAgICAgIGkuc2V0KGJpZ0ludCk7Ci0gICAgICAgICAgICBpLnNldEltbXV0YWJsZSgpOwotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgbnVtYmVyIiwgWG1sRXJyb3JDb250ZXh0Lk1BTEZPUk1FRF9OVU1CRVIsIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Jlc2VydmVkVHlwZU5hbWUoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uZ2V0KCkuZmluZFR5cGUobmFtZSkgIT0gbnVsbCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvWG1sVmFsdWVSZWYuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1htbFZhbHVlUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOWZkZTYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvWG1sVmFsdWVSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBYbWxWYWx1ZVJlZgotewotICAgIFhtbEFueVNpbXBsZVR5cGUgX29iajsKLSAgICBTY2hlbWFUeXBlLlJlZiBfdHlwZXJlZjsKLSAgICBPYmplY3QgX2luaXRWYWw7Ci0KLSAgICBYbWxWYWx1ZVJlZihYbWxBbnlTaW1wbGVUeXBlIHhvYmopCi0gICAgewotICAgICAgICBpZiAoeG9iaiA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICBfb2JqID0geG9iajsKLSAgICB9Ci0KLSAgICBYbWxWYWx1ZVJlZihTY2hlbWFUeXBlLlJlZiB0eXBlcmVmLCBPYmplY3QgaW5pdFZhbCkKLSAgICB7Ci0gICAgICAgIGlmICh0eXBlcmVmID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIF90eXBlcmVmID0gdHlwZXJlZjsKLSAgICAgICAgX2luaXRWYWwgPSBpbml0VmFsOwotICAgIH0KLQotICAgIHN5bmNocm9uaXplZCBYbWxBbnlTaW1wbGVUeXBlIGdldCgpCi0gICAgewotICAgICAgICBpZiAoX29iaiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlIHR5cGUgPSBfdHlwZXJlZi5nZXQoKTsKLSAgICAgICAgICAgIGlmICh0eXBlLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLkxJU1QpCi0gICAgICAgICAgICAgICAgX29iaiA9IHR5cGUubmV3VmFsdWUoX2luaXRWYWwpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExpc3QgYWN0dWFsVmFscyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSAoKExpc3QpX2luaXRWYWwpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYbWxWYWx1ZVJlZiByZWYgPSAoWG1sVmFsdWVSZWYpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjdHVhbFZhbHMuYWRkKHJlZi5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF9vYmogPSB0eXBlLm5ld1ZhbHVlKGFjdHVhbFZhbHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBfb2JqOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdXRpbC9CYXNlNjQuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdXRpbC9CYXNlNjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwNDVhZi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3V0aWwvQmFzZTY0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDIgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBlbmNvZGUvZGVjb2RlIGZvciBSRkMgMjA0NSBCYXNlNjQgYXMKLSAqIGRlZmluZWQgYnkgUkZDIDIwNDUsIE4uIEZyZWVkIGFuZCBOLiBCb3JlbnN0ZWluLgotICogUkZDIDIwNDU6IE11bHRpcHVycG9zZSBJbnRlcm5ldCBNYWlsIEV4dGVuc2lvbnMgKE1JTUUpCi0gKiBQYXJ0IE9uZTogRm9ybWF0IG9mIEludGVybmV0IE1lc3NhZ2UgQm9kaWVzLiBSZWZlcmVuY2UKLSAqIDE5OTYgQXZhaWxhYmxlIGF0OiBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMDQ1LnR4dAotICogVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IFhNTCBTY2hlbWEgYmluYXJ5IGZvcm1hdCB2YWxpZGF0aW9uCi0gKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBlbmNvZGUvZGVjb2RlIHN0cmVhbWluZwotICogZGF0YS4gWW91IG5lZWQgdGhlIGRhdGEgdGhhdCB5b3Ugd2lsbCBlbmNvZGUvZGVjb2RlCi0gKiBhbHJlYWR5IG9uIGEgYnl0ZSBhcnJyYXkuCi0gKgotICogQGF1dGhvciBKZWZmcmV5IFJvZHJpZ3VlegotICogQGF1dGhvciBTYW5keSBHYW8KLSAqIEB2ZXJzaW9uICRJZDogQmFzZTY0LmphdmEsdiAxLjIgMjAwMy8wOS8yNCAyMzozMTowOCBlcmljdmFzIEV4cCAkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyAgQmFzZTY0IHsKLQotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgQkFTRUxFTkdUSCAgICAgICAgID0gMjU1OwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgTE9PS1VQTEVOR1RIICAgICAgID0gNjQ7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICBUV0VOVFlGT1VSQklUR1JPVVAgPSAyNDsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgIEVJR0hUQklUICAgICAgICAgICA9IDg7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICBTSVhURUVOQklUICAgICAgICAgPSAxNjsKLSAgICAvL3N0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgU0lYQklUICAgICAgICAgICAgID0gNjsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgIEZPVVJCWVRFICAgICAgICAgICA9IDQ7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICBTSUdOICAgICAgICAgICAgICAgPSAtMTI4OwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgUEFEICAgICAgICAgICAgICAgID0gKCBieXRlICkgJz0nOwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZkRlYnVnICAgICAgICAgID0gZmFsc2U7Ci0gICAgc3RhdGljIHByaXZhdGUgYnl0ZSBbXSBiYXNlNjRBbHBoYWJldCAgICAgICAgPSBuZXcgYnl0ZVtCQVNFTEVOR1RIXTsKLSAgICBzdGF0aWMgcHJpdmF0ZSBieXRlIFtdIGxvb2tVcEJhc2U2NEFscGhhYmV0ICA9IG5ldyBieXRlW0xPT0tVUExFTkdUSF07Ci0KLSAgICBzdGF0aWMgewotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpPEJBU0VMRU5HVEg7IGkrKykgewotICAgICAgICAgICAgYmFzZTY0QWxwaGFiZXRbaV0gPSAtMTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gJ1onOyBpID49ICdBJzsgaS0tKSB7Ci0gICAgICAgICAgICBiYXNlNjRBbHBoYWJldFtpXSA9IChieXRlKSAoaS0nQScpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAneic7IGk+PSAnYSc7IGktLSkgewotICAgICAgICAgICAgYmFzZTY0QWxwaGFiZXRbaV0gPSAoYnl0ZSkgKCBpLSdhJyArIDI2KTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAnOSc7IGkgPj0gJzAnOyBpLS0pIHsKLSAgICAgICAgICAgIGJhc2U2NEFscGhhYmV0W2ldID0gKGJ5dGUpIChpLScwJyArIDUyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJhc2U2NEFscGhhYmV0WycrJ10gID0gNjI7Ci0gICAgICAgIGJhc2U2NEFscGhhYmV0WycvJ10gID0gNjM7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8PTI1OyBpKyspCi0gICAgICAgICAgICBsb29rVXBCYXNlNjRBbHBoYWJldFtpXSA9IChieXRlKSAoJ0EnK2kgKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMjYsICBqID0gMDsgaTw9NTE7IGkrKywgaisrKQotICAgICAgICAgICAgbG9va1VwQmFzZTY0QWxwaGFiZXRbaV0gPSAoYnl0ZSkgKCdhJysgaiApOwotCi0gICAgICAgIGZvciAoaW50IGkgPSA1MiwgIGogPSAwOyBpPD02MTsgaSsrLCBqKyspCi0gICAgICAgICAgICBsb29rVXBCYXNlNjRBbHBoYWJldFtpXSA9IChieXRlKSAoJzAnICsgaiApOwotICAgICAgICBsb29rVXBCYXNlNjRBbHBoYWJldFs2Ml0gPSAoYnl0ZSkgJysnOwotICAgICAgICBsb29rVXBCYXNlNjRBbHBoYWJldFs2M10gPSAoYnl0ZSkgJy8nOwotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzV2hpdGVTcGFjZShieXRlIG9jdGVjdCkgewotICAgICAgICByZXR1cm4gKG9jdGVjdCA9PSAweDIwIHx8IG9jdGVjdCA9PSAweGQgfHwgb2N0ZWN0ID09IDB4YSB8fCBvY3RlY3QgPT0gMHg5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNQYWQoYnl0ZSBvY3RlY3QpIHsKLSAgICAgICAgcmV0dXJuIChvY3RlY3QgPT0gUEFEKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNEYXRhKGJ5dGUgb2N0ZWN0KSB7Ci0gICAgICAgIHJldHVybiAoYmFzZTY0QWxwaGFiZXRbb2N0ZWN0XSAhPSAtMSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzQmFzZTY0KGJ5dGUgb2N0ZWN0KSB7Ci0gICAgICAgIHJldHVybiAoaXNXaGl0ZVNwYWNlKG9jdGVjdCkgfHwgaXNQYWQob2N0ZWN0KSB8fCBpc0RhdGEob2N0ZWN0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5jb2RlcyBoZXggb2N0ZWN0cyBpbnRvIEJhc2U2NAotICAgICAqCi0gICAgICogQHBhcmFtIGJpbmFyeURhdGEgQXJyYXkgY29udGFpbmluZyBiaW5hcnlEYXRhCi0gICAgICogQHJldHVybiBFbmNvZGVkIEJhc2U2NCBhcnJheQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZShieXRlW10gYmluYXJ5RGF0YSkgewotCi0gICAgICAgIGlmIChiaW5hcnlEYXRhID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpbnQgICAgICBsZW5ndGhEYXRhQml0cyAgICA9IGJpbmFyeURhdGEubGVuZ3RoKkVJR0hUQklUOwotICAgICAgICBpbnQgICAgICBmZXdlclRoYW4yNGJpdHMgICA9IGxlbmd0aERhdGFCaXRzJVRXRU5UWUZPVVJCSVRHUk9VUDsKLSAgICAgICAgaW50ICAgICAgbnVtYmVyVHJpcGxldHMgICAgPSBsZW5ndGhEYXRhQml0cy9UV0VOVFlGT1VSQklUR1JPVVA7Ci0gICAgICAgIGJ5dGUgICAgIGVuY29kZWREYXRhW10gICAgID0gbnVsbDsKLQotICAgICAgICBpZiAoZmV3ZXJUaGFuMjRiaXRzICE9IDApIC8vZGF0YSBub3QgZGl2aXNpYmxlIGJ5IDI0IGJpdAotICAgICAgICAgICAgZW5jb2RlZERhdGEgPSBuZXcgYnl0ZVsgKG51bWJlclRyaXBsZXRzICsgMSApKjQgIF07Ci0gICAgICAgIGVsc2UgLy8gMTYgb3IgOCBiaXQKLSAgICAgICAgICAgIGVuY29kZWREYXRhID0gbmV3IGJ5dGVbIG51bWJlclRyaXBsZXRzKjQgXTsKLQotICAgICAgICBieXRlIGs9MCwgbD0wLCBiMT0wLGIyPTAsYjM9MDsKLQotICAgICAgICBpbnQgZW5jb2RlZEluZGV4ID0gMDsKLSAgICAgICAgaW50IGRhdGFJbmRleCAgID0gMDsKLSAgICAgICAgaW50IGkgICAgICAgICAgID0gMDsKLSAgICAgICAgaWYgKGZEZWJ1ZykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJudW1iZXIgb2YgdHJpcGxldHMgPSAiICsgbnVtYmVyVHJpcGxldHMgKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGkgPSAwOyBpPG51bWJlclRyaXBsZXRzOyBpKyspIHsKLQotICAgICAgICAgICAgZGF0YUluZGV4ID0gaSozOwotICAgICAgICAgICAgYjEgPSBiaW5hcnlEYXRhW2RhdGFJbmRleF07Ci0gICAgICAgICAgICBiMiA9IGJpbmFyeURhdGFbZGF0YUluZGV4ICsgMV07Ci0gICAgICAgICAgICBiMyA9IGJpbmFyeURhdGFbZGF0YUluZGV4ICsgMl07Ci0KLSAgICAgICAgICAgIGlmIChmRGVidWcpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJiMT0gIiArIGIxICsiLCBiMj0gIiArIGIyICsgIiwgYjM9ICIgKyBiMyApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsICA9IChieXRlKShiMiAmIDB4MGYpOwotICAgICAgICAgICAgayAgPSAoYnl0ZSkoYjEgJiAweDAzKTsKLQotICAgICAgICAgICAgZW5jb2RlZEluZGV4ID0gaSo0OwotICAgICAgICAgICAgYnl0ZSB2YWwxID0gKChiMSAmIFNJR04pPT0wKT8oYnl0ZSkoYjE+PjIpOihieXRlKSgoYjEpPj4yXjB4YzApOwotCi0gICAgICAgICAgICBieXRlIHZhbDIgPSAoKGIyICYgU0lHTik9PTApPyhieXRlKShiMj4+NCk6KGJ5dGUpKChiMik+PjReMHhmMCk7Ci0gICAgICAgICAgICBieXRlIHZhbDMgPSAoKGIzICYgU0lHTik9PTApPyhieXRlKShiMz4+Nik6KGJ5dGUpKChiMyk+PjZeMHhmYyk7Ci0KLSAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleF0gICA9IGxvb2tVcEJhc2U2NEFscGhhYmV0WyB2YWwxIF07Ci0gICAgICAgICAgICBpZiAoZkRlYnVnKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAidmFsMiA9ICIgKyB2YWwyICk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiazQgICA9ICIgKyAoazw8NCkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggInZhayAgPSAiICsgKHZhbDIgfCAoazw8NCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4KzFdID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbIHZhbDIgfCAoIGs8PDQgKV07Ci0gICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrMl0gPSBsb29rVXBCYXNlNjRBbHBoYWJldFsgKGwgPDwyICkgfCB2YWwzIF07Ci0gICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrM10gPSBsb29rVXBCYXNlNjRBbHBoYWJldFsgYjMgJiAweDNmIF07Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmb3JtIGludGVncmFsIG51bWJlciBvZiA2LWJpdCBncm91cHMKLSAgICAgICAgZGF0YUluZGV4ICAgID0gaSozOwotICAgICAgICBlbmNvZGVkSW5kZXggPSBpKjQ7Ci0gICAgICAgIGlmIChmZXdlclRoYW4yNGJpdHMgPT0gRUlHSFRCSVQpIHsKLSAgICAgICAgICAgIGIxID0gYmluYXJ5RGF0YVtkYXRhSW5kZXhdOwotICAgICAgICAgICAgayA9IChieXRlKSAoIGIxICYweDAzICk7Ci0gICAgICAgICAgICBpZiAoZkRlYnVnKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJiMT0iICsgYjEpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYjE8PDIgPSAiICsgKGIxPj4yKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnl0ZSB2YWwxID0gKChiMSAmIFNJR04pPT0wKT8oYnl0ZSkoYjE+PjIpOihieXRlKSgoYjEpPj4yXjB4YzApOwotICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4XSAgICAgPSBsb29rVXBCYXNlNjRBbHBoYWJldFsgdmFsMSBdOwotICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4ICsgMV0gPSBsb29rVXBCYXNlNjRBbHBoYWJldFsgazw8NCBdOwotICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4ICsgMl0gPSBQQUQ7Ci0gICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXggKyAzXSA9IFBBRDsKLSAgICAgICAgfSBlbHNlIGlmIChmZXdlclRoYW4yNGJpdHMgPT0gU0lYVEVFTkJJVCkgewotCi0gICAgICAgICAgICBiMSA9IGJpbmFyeURhdGFbZGF0YUluZGV4XTsKLSAgICAgICAgICAgIGIyID0gYmluYXJ5RGF0YVtkYXRhSW5kZXggKzEgXTsKLSAgICAgICAgICAgIGwgPSAoIGJ5dGUgKSAoIGIyICYweDBmICk7Ci0gICAgICAgICAgICBrID0gKCBieXRlICkgKCBiMSAmMHgwMyApOwotCi0gICAgICAgICAgICBieXRlIHZhbDEgPSAoKGIxICYgU0lHTik9PTApPyhieXRlKShiMT4+Mik6KGJ5dGUpKChiMSk+PjJeMHhjMCk7Ci0gICAgICAgICAgICBieXRlIHZhbDIgPSAoKGIyICYgU0lHTik9PTApPyhieXRlKShiMj4+NCk6KGJ5dGUpKChiMik+PjReMHhmMCk7Ci0KLSAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleF0gICAgID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbIHZhbDEgXTsKLSAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCArIDFdID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbIHZhbDIgfCAoIGs8PDQgKV07Ci0gICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXggKyAyXSA9IGxvb2tVcEJhc2U2NEFscGhhYmV0WyBsPDwyIF07Ci0gICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXggKyAzXSA9IFBBRDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlbmNvZGVkRGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWNvZGVzIEJhc2U2NCBkYXRhIGludG8gb2N0ZWN0cwotICAgICAqCi0gICAgICogQHBhcmFtIGJhc2U2NERhdGEgQnl0ZSBhcnJheSBjb250YWluaW5nIEJhc2U2NCBkYXRhCi0gICAgICogQHJldHVybiBBcnJheSBjb250YWluaW5kIGRlY29kZWQgZGF0YS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBkZWNvZGUoYnl0ZVtdIGJhc2U2NERhdGEpIHsKLQotICAgICAgICBpZiAoYmFzZTY0RGF0YSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgLy8gcmVtb3ZlIHdoaXRlIHNwYWNlcwotICAgICAgICBiYXNlNjREYXRhID0gcmVtb3ZlV2hpdGVTcGFjZShiYXNlNjREYXRhKTsKLQotICAgICAgICBpZiAoYmFzZTY0RGF0YS5sZW5ndGglRk9VUkJZVEUgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ly9zaG91bGQgYmUgZGl2aXNpYmxlIGJ5IGZvdXIKLSAgICAgICAgfQotCi0gICAgICAgIGludCAgICAgIG51bWJlclF1YWRydXBsZSAgICA9IChiYXNlNjREYXRhLmxlbmd0aC9GT1VSQllURSApOwotCi0gICAgICAgIGlmIChudW1iZXJRdWFkcnVwbGUgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVswXTsKLQotICAgICAgICBieXRlICAgICBkZWNvZGVkRGF0YVtdICAgICAgPSBudWxsOwotICAgICAgICBieXRlICAgICBiMT0wLGIyPTAsYjM9MCwgYjQ9MDsvLywgbWFya2VyMD0wLCBtYXJrZXIxPTA7Ci0gICAgICAgIGJ5dGUgICAgIGQxPTAsZDI9MCxkMz0wLGQ0PTA7Ci0KLSAgICAgICAgLy8gVGhyb3cgYXdheSBhbnl0aGluZyBub3QgaW4gbm9ybWFsaXplZEJhc2U2NERhdGEKLSAgICAgICAgLy8gQWRqdXN0IHNpemUKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBpbnQgZW5jb2RlZEluZGV4ID0gMDsKLSAgICAgICAgaW50IGRhdGFJbmRleCAgICA9IDA7Ci0gICAgICAgIGRlY29kZWREYXRhICAgICAgPSBuZXcgYnl0ZVsgKG51bWJlclF1YWRydXBsZSkqM107Ci0KLSAgICAgICAgZm9yICg7IGk8bnVtYmVyUXVhZHJ1cGxlLTE7IGkrKykgewotCi0gICAgICAgICAgICBpZiAoIWlzRGF0YSggKGQxID0gYmFzZTY0RGF0YVtkYXRhSW5kZXgrK10pICl8fAotICAgICAgICAgICAgICAgICFpc0RhdGEoIChkMiA9IGJhc2U2NERhdGFbZGF0YUluZGV4KytdKSApfHwKLSAgICAgICAgICAgICAgICAhaXNEYXRhKCAoZDMgPSBiYXNlNjREYXRhW2RhdGFJbmRleCsrXSkgKXx8Ci0gICAgICAgICAgICAgICAgIWlzRGF0YSggKGQ0ID0gYmFzZTY0RGF0YVtkYXRhSW5kZXgrK10pICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ly9pZiBmb3VuZCAibm8gZGF0YSIganVzdCByZXR1cm4gbnVsbAotCi0gICAgICAgICAgICBiMSA9IGJhc2U2NEFscGhhYmV0W2QxXTsKLSAgICAgICAgICAgIGIyID0gYmFzZTY0QWxwaGFiZXRbZDJdOwotICAgICAgICAgICAgYjMgPSBiYXNlNjRBbHBoYWJldFtkM107Ci0gICAgICAgICAgICBiNCA9IGJhc2U2NEFscGhhYmV0W2Q0XTsKLQotICAgICAgICAgICAgZGVjb2RlZERhdGFbZW5jb2RlZEluZGV4KytdID0gKGJ5dGUpKCAgYjEgPDwyIHwgYjI+PjQgKSA7Ci0gICAgICAgICAgICBkZWNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrK10gPSAoYnl0ZSkoKChiMiAmIDB4Zik8PDQgKSB8KCAoYjM+PjIpICYgMHhmKSApOwotICAgICAgICAgICAgZGVjb2RlZERhdGFbZW5jb2RlZEluZGV4KytdID0gKGJ5dGUpKCBiMzw8NiB8IGI0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlzRGF0YSggKGQxID0gYmFzZTY0RGF0YVtkYXRhSW5kZXgrK10pICkgfHwKLSAgICAgICAgICAgICFpc0RhdGEoIChkMiA9IGJhc2U2NERhdGFbZGF0YUluZGV4KytdKSApKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsvL2lmIGZvdW5kICJubyBkYXRhIiBqdXN0IHJldHVybiBudWxsCi0gICAgICAgIH0KLQotICAgICAgICBiMSA9IGJhc2U2NEFscGhhYmV0W2QxXTsKLSAgICAgICAgYjIgPSBiYXNlNjRBbHBoYWJldFtkMl07Ci0KLSAgICAgICAgZDMgPSBiYXNlNjREYXRhW2RhdGFJbmRleCsrXTsKLSAgICAgICAgZDQgPSBiYXNlNjREYXRhW2RhdGFJbmRleCsrXTsKLSAgICAgICAgaWYgKCFpc0RhdGEoIChkMyApICkgfHwKLSAgICAgICAgICAgICFpc0RhdGEoIChkNCApICkpIHsvL0NoZWNrIGlmIHRoZXkgYXJlIFBBRCBjaGFyYWN0ZXJzCi0gICAgICAgICAgICBpZiAoaXNQYWQoIGQzICkgJiYgaXNQYWQoIGQ0KSkgeyAgICAgICAgICAgICAgIC8vVHdvIFBBRCBlLmcuIDNjW1BhZF1bUGFkXQotICAgICAgICAgICAgICAgIGlmICgoYjIgJiAweGYpICE9IDApLy9sYXN0IDQgYml0cyBzaG91bGQgYmUgemVybwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICBieXRlW10gdG1wID0gbmV3IGJ5dGVbIGkqMyArIDEgXTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBkZWNvZGVkRGF0YSwgMCwgdG1wLCAwLCBpKjMgKTsKLSAgICAgICAgICAgICAgICB0bXBbZW5jb2RlZEluZGV4XSAgID0gKGJ5dGUpKCAgYjEgPDwyIHwgYjI+PjQgKSA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzUGFkKCBkMykgJiYgaXNQYWQoZDQpKSB7ICAgICAgICAgICAgICAgLy9PbmUgUEFEICBlLmcuIDNjUVtQYWRdCi0gICAgICAgICAgICAgICAgYjMgPSBiYXNlNjRBbHBoYWJldFsgZDMgXTsKLSAgICAgICAgICAgICAgICBpZiAoKGIzICYgMHgzICkgIT0gMCkvL2xhc3QgMiBiaXRzIHNob3VsZCBiZSB6ZXJvCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIGJ5dGVbXSB0bXAgPSBuZXcgYnl0ZVsgaSozICsgMiBdOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIGRlY29kZWREYXRhLCAwLCB0bXAsIDAsIGkqMyApOwotICAgICAgICAgICAgICAgIHRtcFtlbmNvZGVkSW5kZXgrK10gPSAoYnl0ZSkoICBiMSA8PDIgfCBiMj4+NCApOwotICAgICAgICAgICAgICAgIHRtcFtlbmNvZGVkSW5kZXhdICAgPSAoYnl0ZSkoKChiMiAmIDB4Zik8PDQgKSB8KCAoYjM+PjIpICYgMHhmKSApOwotICAgICAgICAgICAgICAgIHJldHVybiB0bXA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOy8vYW4gZXJyb3IgIGxpa2UgIjNjW1BhZF1yIiwgIjNjZFgiLCAiM2NYZCIsICIzY1hYIiB3aGVyZSBYIGlzIG5vbiBkYXRhCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7IC8vTm8gUEFEIGUuZyAzY1FsCi0gICAgICAgICAgICBiMyA9IGJhc2U2NEFscGhhYmV0WyBkMyBdOwotICAgICAgICAgICAgYjQgPSBiYXNlNjRBbHBoYWJldFsgZDQgXTsKLSAgICAgICAgICAgIGRlY29kZWREYXRhW2VuY29kZWRJbmRleCsrXSA9IChieXRlKSggIGIxIDw8MiB8IGIyPj40ICkgOwotICAgICAgICAgICAgZGVjb2RlZERhdGFbZW5jb2RlZEluZGV4KytdID0gKGJ5dGUpKCgoYjIgJiAweGYpPDw0ICkgfCggKGIzPj4yKSAmIDB4ZikgKTsKLSAgICAgICAgICAgIGRlY29kZWREYXRhW2VuY29kZWRJbmRleCsrXSA9IChieXRlKSggYjM8PDYgfCBiNCApOwotCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZGVjb2RlZERhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVjb2RlcyBCYXNlNjQgZGF0YSBpbnRvIG9jdGVjdHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBiYXNlNjREYXRhIFN0cmluZyBjb250YWluaW5nIEJhc2U2NCBkYXRhCi0gICAgICogQHJldHVybiBzdHJpbmcgY29udGFpbmluZyBkZWNvZGVkIGRhdGEuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyBiYXNlNjREYXRhKSB7Ci0gICAgICAgIGlmIChiYXNlNjREYXRhID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBieXRlW10gZGVjb2RlZCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkZWNvZGVkID0gZGVjb2RlKGJhc2U2NERhdGEuZ2V0Qnl0ZXMoInV0Zi04IikpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgcmV0dXJuIGRlY29kZWQgPT0gbnVsbCA/IG51bGwgOiBuZXcgU3RyaW5nKGRlY29kZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5jb2RlcyBvY3RlY3RzICh1c2luZyB1dGYtOCkgaW50byBCYXNlNjQgZGF0YQotICAgICAqCi0gICAgICogQHBhcmFtIGJpbmFyeURhdGEgU3RyaW5nIGNvbnRhaW5pbmcgSGV4IGRhdGEKLSAgICAgKiBAcmV0dXJuIHN0cmluZyBjb250YWluaW5nIGRlY29kZWQgZGF0YS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIGJpbmFyeURhdGEpIHsKLSAgICAgICAgaWYgKGJpbmFyeURhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGJ5dGVbXSBlbmNvZGVkID0gbnVsbDsKLSAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgZW5jb2RlZCA9IGVuY29kZShiaW5hcnlEYXRhLmdldEJ5dGVzKCJ1dGYtOCIpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgcmV0dXJuIGVuY29kZWQgPT0gbnVsbCA/IG51bGwgOiBuZXcgU3RyaW5nKGVuY29kZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmVtb3ZlIFdoaXRlU3BhY2UgZnJvbSBNSU1FIGNvbnRhaW5pbmcgZW5jb2RlZCBCYXNlNjQgZGF0YS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhICB0aGUgYnl0ZSBhcnJheSBvZiBiYXNlNjQgZGF0YSAod2l0aCBXUykKLSAgICAgKiBAcmV0dXJuICAgICAgdGhlIGJ5dGUgYXJyYXkgb2YgYmFzZTY0IGRhdGEgKHdpdGhvdXQgV1MpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBieXRlW10gcmVtb3ZlV2hpdGVTcGFjZShieXRlW10gZGF0YSkgewotICAgICAgICBpZiAoZGF0YSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgLy8gY291bnQgY2hhcmFjdGVycyB0aGF0J3Mgbm90IHdoaXRlc3BhY2UKLSAgICAgICAgaW50IG5ld1NpemUgPSAwOwotICAgICAgICBpbnQgbGVuID0gZGF0YS5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghaXNXaGl0ZVNwYWNlKGRhdGFbaV0pKQotICAgICAgICAgICAgICAgIG5ld1NpemUrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIG5vIHdoaXRlc3BhY2UsIGp1c3QgcmV0dXJuIHRoZSBpbnB1dCBhcnJheQotICAgICAgICBpZiAobmV3U2l6ZSA9PSBsZW4pCi0gICAgICAgICAgICByZXR1cm4gZGF0YTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIGFycmF5IHRvIHJldHVybgotICAgICAgICBieXRlW10gbmV3QXJyYXkgPSBuZXcgYnl0ZVtuZXdTaXplXTsKLQotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghaXNXaGl0ZVNwYWNlKGRhdGFbaV0pKQotICAgICAgICAgICAgICAgIG5ld0FycmF5W2orK10gPSBkYXRhW2ldOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXdBcnJheTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3V0aWwvSGV4QmluLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3V0aWwvSGV4QmluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYzc2MzIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC91dGlsL0hleEJpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0vKioKLSAqIGZvcm1hdCB2YWxpZGF0aW9uCi0gKgotICogVGhpcyBjbGFzcyBlbmNvZGVzL2RlY29kZXMgaGV4YWRlY2ltYWwgZGF0YQotICogQGF1dGhvciBKZWZmcmV5IFJvZHJpZ3VlegotICogQHZlcnNpb24gJElkOiBIZXhCaW4uamF2YSx2IDEuMiAyMDAzLzA5LzI0IDIzOjMxOjA4IGVyaWN2YXMgRXhwICQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzICBIZXhCaW4gewotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgQkFTRUxFTkdUSCAgID0gMjU1OwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgTE9PS1VQTEVOR1RIID0gMTY7Ci0gICAgc3RhdGljIHByaXZhdGUgYnl0ZSBbXSBoZXhOdW1iZXJUYWJsZSAgICA9IG5ldyBieXRlW0JBU0VMRU5HVEhdOwotICAgIHN0YXRpYyBwcml2YXRlIGJ5dGUgW10gbG9va1VwSGV4QWxwaGFiZXQgPSBuZXcgYnl0ZVtMT09LVVBMRU5HVEhdOwotCi0KLSAgICBzdGF0aWMgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaTxCQVNFTEVOR1RIOyBpKysgKSB7Ci0gICAgICAgICAgICBoZXhOdW1iZXJUYWJsZVtpXSA9IC0xOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoIGludCBpID0gJzknOyBpID49ICcwJzsgaS0tKSB7Ci0gICAgICAgICAgICBoZXhOdW1iZXJUYWJsZVtpXSA9IChieXRlKSAoaS0nMCcpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoIGludCBpID0gJ0YnOyBpPj0gJ0EnOyBpLS0pIHsKLSAgICAgICAgICAgIGhleE51bWJlclRhYmxlW2ldID0gKGJ5dGUpICggaS0nQScgKyAxMCApOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoIGludCBpID0gJ2YnOyBpPj0gJ2EnOyBpLS0pIHsKLSAgICAgICAgICAgaGV4TnVtYmVyVGFibGVbaV0gPSAoYnl0ZSkgKCBpLSdhJyArIDEwICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpPDEwOyBpKysgKQotICAgICAgICAgICAgbG9va1VwSGV4QWxwaGFiZXRbaV0gPSAoYnl0ZSkgKCcwJytpICk7Ci0gICAgICAgIGZvcihpbnQgaSA9IDEwOyBpPD0xNTsgaSsrICkKLSAgICAgICAgICAgIGxvb2tVcEhleEFscGhhYmV0W2ldID0gKGJ5dGUpICgnQScraSAtMTApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGJ5dGUgdG8gYmUgdGVzdGVkIGlmIGl0IGlzIEJhc2U2NCBhbHBoYWJldAotICAgICAqCi0gICAgICogQHBhcmFtIG9jdGVjdAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBpc0hleChieXRlIG9jdGVjdCkgewotICAgICAgICByZXR1cm4gKGhleE51bWJlclRhYmxlW29jdGVjdF0gIT0gLTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGJ5dGVzIHRvIGEgaGV4IHN0cmluZwotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGJ5dGVzVG9TdHJpbmcoYnl0ZVtdIGJpbmFyeURhdGEpCi0gICAgewotICAgICAgICBpZiAoYmluYXJ5RGF0YSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGVuY29kZShiaW5hcnlEYXRhKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBoZXggc3RyaW5nIHRvIGEgYnl0ZSBhcnJheS4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIGJ5dGVbXSBzdHJpbmdUb0J5dGVzKFN0cmluZyBoZXhFbmNvZGVkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlY29kZShoZXhFbmNvZGVkLmdldEJ5dGVzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGFycmF5IG9mIGJ5dGUgdG8gZW5jb2RlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmluYXJ5RGF0YQotICAgICAqIEByZXR1cm4gcmV0dXJuIGVuY29kZSBiaW5hcnkgYXJyYXkKLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIGJ5dGVbXSBlbmNvZGUoYnl0ZVtdIGJpbmFyeURhdGEpIHsKLSAgICAgICAgaWYgKGJpbmFyeURhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBpbnQgbGVuZ3RoRGF0YSAgID0gYmluYXJ5RGF0YS5sZW5ndGg7Ci0gICAgICAgIGludCBsZW5ndGhFbmNvZGUgPSBsZW5ndGhEYXRhICogMjsKLSAgICAgICAgYnl0ZVtdIGVuY29kZWREYXRhID0gbmV3IGJ5dGVbbGVuZ3RoRW5jb2RlXTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8bGVuZ3RoRGF0YTsgaSsrICl7Ci0gICAgICAgICAgICBlbmNvZGVkRGF0YVtpKjJdID0gbG9va1VwSGV4QWxwaGFiZXRbKGJpbmFyeURhdGFbaV0gPj4gNCkgJiAweGZdOwotICAgICAgICAgICAgZW5jb2RlZERhdGFbaSoyKzFdID0gbG9va1VwSGV4QWxwaGFiZXRbIGJpbmFyeURhdGFbaV0gJiAweGZdOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmNvZGVkRGF0YTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIGJ5dGVbXSBkZWNvZGUoYnl0ZVtdIGJpbmFyeURhdGEpIHsKLSAgICAgICAgaWYgKGJpbmFyeURhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBpbnQgbGVuZ3RoRGF0YSAgID0gYmluYXJ5RGF0YS5sZW5ndGg7Ci0gICAgICAgIGlmIChsZW5ndGhEYXRhICUgMiAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgaW50IGxlbmd0aERlY29kZSA9IGxlbmd0aERhdGEgLyAyOwotICAgICAgICBieXRlW10gZGVjb2RlZERhdGEgPSBuZXcgYnl0ZVtsZW5ndGhEZWNvZGVdOwotICAgICAgICBmb3IoIGludCBpID0gMDsgaTxsZW5ndGhEZWNvZGU7IGkrKyApewotICAgICAgICAgICAgaWYgKCFpc0hleChiaW5hcnlEYXRhW2kqMl0pIHx8ICFpc0hleChiaW5hcnlEYXRhW2kqMisxXSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlY29kZWREYXRhW2ldID0gKGJ5dGUpKChoZXhOdW1iZXJUYWJsZVtiaW5hcnlEYXRhW2kqMl1dIDw8IDQpIHwgaGV4TnVtYmVyVGFibGVbYmluYXJ5RGF0YVtpKjIrMV1dKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVjb2RlZERhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVjb2RlcyBIZXggZGF0YSBpbnRvIG9jdGVjdHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBiaW5hcnlEYXRhIFN0cmluZyBjb250YWluaW5nIEhleCBkYXRhCi0gICAgICogQHJldHVybiBzdHJpbmcgY29udGFpbmluZyBkZWNvZGVkIGRhdGEuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyBiaW5hcnlEYXRhKSB7Ci0gICAgICAgIGlmIChiaW5hcnlEYXRhID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBieXRlW10gZGVjb2RlZCA9IG51bGw7Ci0gICAgICAgICB0cnkgewotICAgICAgICAgIGRlY29kZWQgPSBkZWNvZGUoYmluYXJ5RGF0YS5nZXRCeXRlcygidXRmLTgiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICByZXR1cm4gZGVjb2RlZCA9PSBudWxsID8gbnVsbCA6IG5ldyBTdHJpbmcoZGVjb2RlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmNvZGVzIG9jdGVjdHMgKHVzaW5nIHV0Zi04KSBpbnRvIEhleCBkYXRhCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmluYXJ5RGF0YSBTdHJpbmcgY29udGFpbmluZyBIZXggZGF0YQotICAgICAqIEByZXR1cm4gc3RyaW5nIGNvbnRhaW5pbmcgZGVjb2RlZCBkYXRhLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShTdHJpbmcgYmluYXJ5RGF0YSkgewotICAgICAgICBpZiAoYmluYXJ5RGF0YSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgYnl0ZVtdIGVuY29kZWQgPSBudWxsOwotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICBlbmNvZGVkID0gZW5jb2RlKGJpbmFyeURhdGEuZ2V0Qnl0ZXMoInV0Zi04IikpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkge30KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICByZXR1cm4gZW5jb2RlZCA9PSBudWxsID8gbnVsbCA6IG5ldyBTdHJpbmcoZW5jb2RlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsaWRhdG9yL1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbS5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWxpZGF0b3IvVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOTFkMTMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWxpZGF0b3IvVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5DaGFyczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhNTE5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5HZW5lcmljWG1sSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0b3JMaXN0ZW5lci5FdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRvckxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sV2hpdGVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YTUxTdHJlYW1WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5BdHRyaWJ1dGU7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5BdHRyaWJ1dGVJdGVyYXRvcjsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5TdGFydEVsZW1lbnQ7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxFdmVudDsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MTmFtZTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtCi0gICAgZXh0ZW5kcyBHZW5lcmljWG1sSW5wdXRTdHJlYW0gaW1wbGVtZW50cyBFdmVudAotewotICAgIHB1YmxpYyBWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0gKAotICAgICAgICBYTUxJbnB1dFN0cmVhbSB4aXMsCi0gICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgdHlwZUxvYWRlciwgU2NoZW1hVHlwZSBzVHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIF9zb3VyY2UgPSB4aXM7Ci0KLSAgICAgICAgLy8gRmlndXJlIG91dCB0aGUgcm9vdCB0eXBlCi0KLSAgICAgICAgb3B0aW9ucyA9IFhtbE9wdGlvbnMubWFza051bGwoIG9wdGlvbnMgKTsKLSAgICAgICAgCi0gICAgICAgIFNjaGVtYVR5cGUgdHlwZSA9IChTY2hlbWFUeXBlKSBvcHRpb25zLmdldCggWG1sT3B0aW9ucy5ET0NVTUVOVF9UWVBFICk7Ci0KLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHR5cGUgPSBzVHlwZTsKLQotICAgICAgICBpZiAodHlwZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEU7Ci0KLSAgICAgICAgICAgIHhpcyA9IHhpcy5nZXRTdWJTdHJlYW0oKTsKLQotICAgICAgICAgICAgaWYgKHhpcy5za2lwKCBYTUxFdmVudC5TVEFSVF9FTEVNRU5UICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZSBkb2NUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgdHlwZUxvYWRlci5maW5kRG9jdW1lbnRUeXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgWE1MTmFtZUhlbHBlci5nZXRRTmFtZSggeGlzLm5leHQoKS5nZXROYW1lKCkgKSApOwotCi0gICAgICAgICAgICAgICAgaWYgKGRvY1R5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGRvY1R5cGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHhpcy5jbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSB2YWxpZGF0b3IKLQotICAgICAgICBfdmFsaWRhdG9yID0KLSAgICAgICAgICAgIG5ldyBWYWxpZGF0b3IoCi0gICAgICAgICAgICAgICAgdHlwZSwgbnVsbCwgdHlwZUxvYWRlciwgb3B0aW9ucywgbmV3IEV4Y2VwdGlvblhtbEVycm9yTGlzdGVuZXIoKSApOwotCi0gICAgICAgIG5leHRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuQkVHSU4gKTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPIC0gdGhpcyBpcyB0aGUgcXVpY2sgYW5kIGRpcnR5IGltcGwgb2Ygc3RyZWFtaW5nIHZhbGlkYXRpb24sCi0gICAgLy8gbWF5IG9iamVjdHMgYXJlIGNyZWF0ZWQgKGxpa2Ugc3RyaW5ncykgd2hpY2ggY2FuIGJlIG9wdGltaXplZAotICAgIAotICAgIHByb3RlY3RlZCBYTUxFdmVudCBuZXh0RXZlbnQgKCApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhNTEV2ZW50IGUgPSBfc291cmNlLm5leHQoKTsKLQotICAgICAgICBpZiAoZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIV9maW5pc2hlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmbHVzaFRleHQoKTsKLSAgICAgICAgICAgICAgICBuZXh0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLkVORCApOwotICAgICAgICAgICAgICAgIF9maW5pc2hlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCBlLmdldFR5cGUoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFhNTEV2ZW50LkNIQVJBQ1RFUl9EQVRBIDoKLSAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuU1BBQ0UgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENoYXJhY3RlckRhdGEgY2QgPSAoQ2hhcmFjdGVyRGF0YSkgZTsKLQotICAgICAgICAgICAgICAgIGlmIChjZC5oYXNDb250ZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIF90ZXh0LmFwcGVuZCggY2QuZ2V0Q29udGVudCgpICk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuU1RBUlRfRUxFTUVOVCA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhcnRFbGVtZW50IHNlID0gKFN0YXJ0RWxlbWVudCkgZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmbHVzaFRleHQoKTsKLQotICAgICAgICAgICAgICAgIC8vIFVzZWQgZm9yIHByZWZpeCB0byBuYW1lc3BhY2UgbWFwcGluZwotICAgICAgICAgICAgICAgIF9zdGFydEVsZW1lbnQgPSBzZTsKLQotICAgICAgICAgICAgICAgIC8vIFByZXBhcmUgdGhlIHhzaToqIHZhbHVlcwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUl0ZXJhdG9yIGF0dHJzID0gc2UuZ2V0QXR0cmlidXRlcygpOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKCBhdHRycy5oYXNOZXh0KCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIGF0dHIgPSBhdHRycy5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgWE1MTmFtZSBhdHRyTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZS5nZXROYW1lc3BhY2VVcmkoKSApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWwgPSBhdHRyTmFtZS5nZXRMb2NhbE5hbWUoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsLmVxdWFscyggInR5cGUiICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3hzaVR5cGUgPSBhdHRyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsb2NhbC5lcXVhbHMoICJuaWwiICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3hzaU5pbCA9IGF0dHIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvY2FsLmVxdWFscyggInNjaGVtYUxvY2F0aW9uIiApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF94c2lMb2MgPSBhdHRyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsb2NhbC5lcXVhbHMoICJub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIiApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF94c2lOb0xvYyA9IGF0dHIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEVtaXQgdGhlIFNUQVJUCi0KLSAgICAgICAgICAgICAgICAvLyBUT0RPIC0gc2hvdWxkIGRlbGF5IHRoZSBhcXVpc2l0aW9uIG9mIHRoZSBuYW1lCi0gICAgICAgICAgICAgICAgX25hbWUgPSBlLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgIG5leHRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuQkVHSU4gKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBFbWl0IHRoZSBhdHRycwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGF0dHJzID0gc2UuZ2V0QXR0cmlidXRlcygpOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKCBhdHRycy5oYXNOZXh0KCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIGF0dHIgPSBhdHRycy5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgWE1MTmFtZSBhdHRyTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZS5nZXROYW1lc3BhY2VVcmkoKSApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWwgPSBhdHRyTmFtZS5nZXRMb2NhbE5hbWUoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsLmVxdWFscyggInR5cGUiICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsb2NhbC5lcXVhbHMoICJuaWwiICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsb2NhbC5lcXVhbHMoICJzY2hlbWFMb2NhdGlvbiIgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvY2FsLmVxdWFscyggIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIC0gR29kLCB0aGlzIGlzIGxhbWUgOi0pCi0KLSAgICAgICAgICAgICAgICAgICAgX3RleHQuYXBwZW5kKCBhdHRyLmdldFZhbHVlKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgX25hbWUgPSBhdHRyLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG5leHRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuQVRUUiApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNsZWFyVGV4dCgpOwotCi0gICAgICAgICAgICAgICAgX3N0YXJ0RWxlbWVudCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5FTkRfRUxFTUVOVCA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmx1c2hUZXh0KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgbmV4dEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5FTkQgKTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFyVGV4dCAoICkKLSAgICB7Ci0gICAgICAgIF90ZXh0LmRlbGV0ZSggMCwgX3RleHQubGVuZ3RoKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGZsdXNoVGV4dCAoICkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKF90ZXh0Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgbmV4dEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5URVhUICk7Ci0gICAgICAgICAgICBjbGVhclRleHQoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZUZvclByZWZpeCAoIFN0cmluZyBwcmVmaXggKQotICAgIHsKLSAgICAgICAgaWYgKF9zdGFydEVsZW1lbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIE1hcCBtYXAgPSBfc3RhcnRFbGVtZW50LmdldE5hbWVzcGFjZU1hcCgpOwotCi0gICAgICAgIGlmIChtYXAgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiAoU3RyaW5nKSBtYXAuZ2V0KCBwcmVmaXggKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sQ3Vyc29yIGdldExvY2F0aW9uQXNDdXJzb3IgKCApCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0WHNpVHlwZSAoIENoYXJzIGNoYXJzICkKLSAgICB7Ci0gICAgICAgIGlmIChfeHNpVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGNoYXJzLnN0cmluZyA9IF94c2lUeXBlOwotICAgICAgICBjaGFycy5idWZmZXIgPSBudWxsOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRYc2lOaWwgKCBDaGFycyBjaGFycyApCi0gICAgewotICAgICAgICBpZiAoX3hzaU5pbCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGNoYXJzLnN0cmluZyA9IF94c2lOaWw7Ci0gICAgICAgIGNoYXJzLmJ1ZmZlciA9IG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0WHNpTG9jICggQ2hhcnMgY2hhcnMgKQotICAgIHsKLSAgICAgICAgaWYgKF94c2lMb2MgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBjaGFycy5zdHJpbmcgPSBfeHNpTG9jOwotICAgICAgICBjaGFycy5idWZmZXIgPSBudWxsOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldFhzaU5vTG9jICggQ2hhcnMgY2hhcnMgKQotICAgIHsKLSAgICAgICAgaWYgKF94c2lOb0xvYyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGNoYXJzLnN0cmluZyA9IF94c2lOb0xvYzsKLSAgICAgICAgY2hhcnMuYnVmZmVyID0gbnVsbDsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBYTUxOYW1lSGVscGVyLmdldFFOYW1lKCBfbmFtZSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdldFRleHQgKCBDaGFycyBjaGFycyApCi0gICAgewotICAgICAgICBjaGFycy5zdHJpbmcgPSBfdGV4dC50b1N0cmluZygpOwotICAgICAgICBjaGFycy5idWZmZXIgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdldFRleHQgKCBDaGFycyBjaGFycywgaW50IHdzciApCi0gICAgewotICAgICAgICBjaGFycy5zdHJpbmcgPSBYbWxXaGl0ZXNwYWNlLmNvbGxhcHNlKCBfdGV4dC50b1N0cmluZygpLCB3c3IgKTsKLSAgICAgICAgY2hhcnMuYnVmZmVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBUT0RPIC0gdmVyeSBleHBlbnNpdmUgdG8gZ2V0IGEgc3RyaW5nIGhlcmUKLSAgICBwdWJsaWMgYm9vbGVhbiB0ZXh0SXNXaGl0ZXNwYWNlICggKQotICAgIHsKLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IF90ZXh0Lmxlbmd0aCgpIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICggX3RleHQuY2hhckF0KCBpICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgJyAnOgotICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEV4Y2VwdGlvblhtbEVycm9yTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IFZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbS50aGlzLl9leGNlcHRpb24gPT0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtLnRoaXMuX2V4Y2VwdGlvbiA9IAotICAgICAgICAgICAgICAgIG5ldyBYTUxTdHJlYW1WYWxpZGF0aW9uRXhjZXB0aW9uKCAoWG1sRXJyb3IpbyApOwotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBzaXplKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbmV4dEV2ZW50ICggaW50IGtpbmQgKQotICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgewotICAgICAgICBhc3NlcnQgX2V4Y2VwdGlvbiA9PSBudWxsOwotICAgICAgICAKLSAgICAgICAgX3ZhbGlkYXRvci5uZXh0RXZlbnQoIGtpbmQsIHRoaXMgKTsKLQotICAgICAgICBpZiAoX2V4Y2VwdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBYTUxTdHJlYW1WYWxpZGF0aW9uRXhjZXB0aW9uIF9leGNlcHRpb247Ci0KLSAgICBwcml2YXRlIFhNTElucHV0U3RyZWFtIF9zb3VyY2U7Ci0gICAgcHJpdmF0ZSBWYWxpZGF0b3IgICAgICBfdmFsaWRhdG9yOwotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyICAgX3RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuICAgICAgICBfZmluaXNoZWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICBfeHNpVHlwZTsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICAgIF94c2lOaWw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICBfeHNpTG9jOwotICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgX3hzaU5vTG9jOwotICAgIHByaXZhdGUgWE1MTmFtZSAgICAgICAgX25hbWU7Ci0gICAgcHJpdmF0ZSBTdGFydEVsZW1lbnQgICBfc3RhcnRFbGVtZW50OwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsaWRhdG9yL1ZhbGlkYXRvci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWxpZGF0b3IvVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NWIyNjAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWxpZGF0b3IvVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uQ2hhcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5JZGVudGl0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdG9yTGlzdGVuZXIuRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0b3JMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbFdoaXRlc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlVmlzaXRvckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhVXJpSG9sZGVyRXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhQmFzZTY0SG9sZGVyRXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhQm9vbGVhbkhvbGRlckV4OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sRGF0ZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhRGVjaW1hbEhvbGRlckV4OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YURvdWJsZUhvbGRlckV4OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sRHVyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUZsb2F0SG9sZGVyRXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhSGV4QmluYXJ5SG9sZGVyRXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhQm9vbGVhbkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFFOYW1lSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFRTmFtZUhvbGRlckV4OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YVN0cmluZ0VudW1lcmF0aW9uSG9sZGVyRXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxMaXN0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0R1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxRTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQYXJ0aWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdG9yCi0gICAgaW1wbGVtZW50cyBWYWxpZGF0b3JMaXN0ZW5lcgotewotICAgIHB1YmxpYyBWYWxpZGF0b3IgKAotICAgICAgICBTY2hlbWFUeXBlIHR5cGUsIFNjaGVtYUZpZWxkIGZpZWxkLCBTY2hlbWFUeXBlTG9hZGVyIGdsb2JhbExvYWRlciwKLSAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zLCBDb2xsZWN0aW9uIGRlZmF1bHRFcnJvckxpc3RlbmVyICkKLSAgICB7Ci0gICAgICAgIG9wdGlvbnMgPSBYbWxPcHRpb25zLm1hc2tOdWxsKG9wdGlvbnMpOwotICAgICAgICBfZXJyb3JMaXN0ZW5lciA9IChDb2xsZWN0aW9uKSBvcHRpb25zLmdldChYbWxPcHRpb25zLkVSUk9SX0xJU1RFTkVSKTsKLQotICAgICAgICBpZiAoX2Vycm9yTGlzdGVuZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIF9lcnJvckxpc3RlbmVyID0gZGVmYXVsdEVycm9yTGlzdGVuZXI7Ci0KLSAgICAgICAgX2NvbnN0cmFpbnRFbmdpbmUgPSBuZXcgSWRlbnRpdHlDb25zdHJhaW50KF9lcnJvckxpc3RlbmVyLCB0eXBlLmlzRG9jdW1lbnRUeXBlKCkpOwotCi0gICAgICAgIF9nbG9iYWxUeXBlcyA9IGdsb2JhbExvYWRlcjsKLSAgICAgICAgX2NoYXJzID0gbmV3IENoYXJzKCk7Ci0gICAgICAgIF9yb290VHlwZSA9IHR5cGU7Ci0gICAgICAgIF9yb290RmllbGQgPSBmaWVsZDsKLQotICAgICAgICBfdmMgPSBuZXcgVmFsaWRhdG9yVkMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFZhbGlkYXRvclZDIGltcGxlbWVudHMgVmFsaWRhdGlvbkNvbnRleHQKLSAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGludmFsaWQgKCBTdHJpbmcgbWVzc2FnZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRvci50aGlzLmVtaXRFcnJvciggX2V2ZW50LCBtZXNzYWdlICk7Ci0gICAgICAgIH0KLQotICAgICAgICBFdmVudCBfZXZlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAhX2ludmFsaWQgJiYgX2NvbnN0cmFpbnRFbmdpbmUuaXNWYWxpZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbWl0RXJyb3IgKCBFdmVudCBldmVudCwgU3RyaW5nIG1zZyApCi0gICAgewotICAgICAgICBlbWl0RXJyb3IoZXZlbnQsIG1zZywgWG1sRXJyb3IuU0VWRVJJVFlfRVJST1IpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbWl0RXJyb3IgKCBFdmVudCBldmVudCwgU3RyaW5nIG1zZywgaW50IHNldmVyaXR5ICkKLSAgICB7Ci0gICAgICAgIF9lcnJvclN0YXRlKys7Ci0KLSAgICAgICAgaWYgKF9zdXNwZW5kRXJyb3JzID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzZXZlcml0eSA9PSBYbWxFcnJvci5TRVZFUklUWV9FUlJPUikKLSAgICAgICAgICAgICAgICBfaW52YWxpZCA9IHRydWU7Ci0KLSAgICAgICAgICAgIGlmIChfZXJyb3JMaXN0ZW5lciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBldmVudCAhPSBudWxsOwotCi0gICAgICAgICAgICAgICAgX2Vycm9yTGlzdGVuZXIuYWRkKAotICAgICAgICAgICAgICAgICAgICBYbWxFcnJvci5mb3JDdXJzb3IoIG1zZywgc2V2ZXJpdHksIGV2ZW50LmdldExvY2F0aW9uQXNDdXJzb3IoKSApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW1pdEZpZWxkRXJyb3IgKCBFdmVudCBldmVudCwgU3RyaW5nIG1zZywgUU5hbWUgbmFtZSApCi0gICAgewotICAgICAgICBlbWl0RmllbGRFcnJvciggZXZlbnQsIG1zZyArICIgIiArIFFOYW1lSGVscGVyLnByZXR0eSggbmFtZSApICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVtaXRGaWVsZEVycm9yICggRXZlbnQgZXZlbnQsIFN0cmluZyBtc2cgKQotICAgIHsKLSAgICAgICAgZW1pdEZpZWxkRXJyb3IoZXZlbnQsIG1zZywgWG1sRXJyb3IuU0VWRVJJVFlfRVJST1IpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbWl0RmllbGRFcnJvciAoIEV2ZW50IGV2ZW50LCBTdHJpbmcgbXNnLCBpbnQgc2V2ZXJpdHkgKQotICAgIHsKLSAgICAgICAgaWYgKF9zdGF0ZVN0YWNrICE9IG51bGwgJiYgX3N0YXRlU3RhY2suX2ZpZWxkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1zZyArPQotICAgICAgICAgICAgICAgICIgaW4gZWxlbWVudCAiICsgUU5hbWVIZWxwZXIucHJldHR5KCBfc3RhdGVTdGFjay5fZmllbGQuZ2V0TmFtZSgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBWYWxpZGF0b3IudGhpcy5lbWl0RXJyb3IoIGV2ZW50LCBtc2csIHNldmVyaXR5ICk7Ci0gICAgfQotCi0gICAgLy8gRm9yIFhtbEV2ZW50TGlzdGVuZXIuZXJyb3IKLQotICAgIHB1YmxpYyB2b2lkIGVycm9yICggWG1sRXJyb3IgZXJyb3IgKQotICAgIHsKLSAgICAgICAgX2Vycm9yU3RhdGUrKzsKLQotICAgICAgICBpZiAoX3N1c3BlbmRFcnJvcnMgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgX2ludmFsaWQgPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAoX2Vycm9yTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBfZXJyb3JMaXN0ZW5lci5hZGQoIGVycm9yICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBuZXh0RXZlbnQgKCBpbnQga2luZCwgRXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgaWYgKF9lYXRDb250ZW50ID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICgga2luZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIEVORCAgIDogX2VhdENvbnRlbnQtLTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJFR0lOIDogX2VhdENvbnRlbnQrKzsgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQKLSAgICAgICAgICAgICAgICBraW5kID09IEJFR0lOIHx8IGtpbmQgPT0gQVRUUiB8fAotICAgICAgICAgICAgICAgICAgICBraW5kID09IEVORCB8fCBraW5kID09IFRFWFQgfHwga2luZCA9PSBFTkRBVFRSUzsKLQotICAgICAgICAgICAgc3dpdGNoICgga2luZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIEJFR0lOICAgIDogYmVnaW5FdmVudCggICAgZXZlbnQgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFUVFIgICAgIDogYXR0ckV2ZW50KCAgICAgZXZlbnQgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVOREFUVFJTIDogZW5kQXR0cnNFdmVudCggZXZlbnQgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRFWFQgICAgIDogdGV4dEV2ZW50KCAgICAgZXZlbnQgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVORCAgICAgIDogZW5kRXZlbnQoICAgICAgZXZlbnQgKTsgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYmVnaW5FdmVudCAoIEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIFN0YXRlIHN0YXRlID0gdG9wU3RhdGUoKTsKLQotICAgICAgICBTY2hlbWFUeXBlICBlbGVtZW50VHlwZSAgPSBudWxsOwotICAgICAgICBTY2hlbWFGaWVsZCBlbGVtZW50RmllbGQgPSBudWxsOwotCi0gICAgICAgIGlmIChzdGF0ZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbGVtZW50VHlwZSA9IF9yb290VHlwZTsKLSAgICAgICAgICAgIGVsZW1lbnRGaWVsZCA9IF9yb290RmllbGQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBldmVudC5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydCBuYW1lICE9IG51bGw7Ci0KLSAgICAgICAgICAgIHN0YXRlLl9pc0VtcHR5ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0ZS5faXNOaWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoZXZlbnQsICAiTmlsIGVsZW1lbnQgY2Fubm90IGhhdmUgZWxlbWVudCBjb250ZW50Iik7Ci0gICAgICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFzdGF0ZS52aXNpdCggbmFtZSApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKCBldmVudCwgIkVsZW1lbnQgbm90IGFsbG93ZWQ6IiwgbmFtZSApOwotICAgICAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGN1cnJlbnRQYXJ0aWNsZSA9IHN0YXRlLmN1cnJlbnRQYXJ0aWNsZSgpOwotCi0gICAgICAgICAgICBpZiAoY3VycmVudFBhcnRpY2xlLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLldJTERDQVJEKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFFOYW1lU2V0IGVsZW1XaWxkY2FyZFNldCA9IGN1cnJlbnRQYXJ0aWNsZS5nZXRXaWxkY2FyZFNldCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFlbGVtV2lsZGNhcmRTZXQuY29udGFpbnMoIG5hbWUgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKCBldmVudCwgIkVsZW1lbnQgbm90IGFsbG93ZWQ6IiwgbmFtZSApOwotICAgICAgICAgICAgICAgICAgICBfZWF0Q29udGVudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQgd2lsZGNhcmRQcm9jZXNzID0gY3VycmVudFBhcnRpY2xlLmdldFdpbGRjYXJkUHJvY2VzcygpOwotCi0gICAgICAgICAgICAgICAgaWYgKHdpbGRjYXJkUHJvY2VzcyA9PSBTY2hlbWFQYXJ0aWNsZS5TS0lQKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkID0gX2dsb2JhbFR5cGVzLmZpbmRFbGVtZW50KCBuYW1lICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEZpZWxkID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAod2lsZGNhcmRQcm9jZXNzID09IFNjaGVtYVBhcnRpY2xlLlNUUklDVCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsICJFbGVtZW50IG5vdCBhbGxvd2VkIChzdHJpY3Qgd2lsZGNhcmQsIGFuZCBubyBkZWZpbml0aW9uIGZvdW5kKToiLCBuYW1lICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBfZWF0Q29udGVudCA9IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhcnRpY2xlLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBlbGVtZW50IHBhcnRpY2xlIG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIG5hbWUKLSAgICAgICAgICAgICAgICAvLyBvZiB0aGUgZXZlbnQsIHRoZW4gdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBhIHN1YnN0aXR1dGUgZm9yCi0gICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgcGFydGljbGUuIFJlcGxhY2UgdGhlIGZpZWxkIHdpdGggdGhlIGdsb2JhbAotICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgZm9yIHRoZSByZXBsYWNlbWVudAotCi0gICAgICAgICAgICAgICAgaWYgKCEgY3VycmVudFBhcnRpY2xlLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoKChTY2hlbWFMb2NhbEVsZW1lbnQpY3VycmVudFBhcnRpY2xlKS5ibG9ja1N1YnN0aXR1dGlvbigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvcihldmVudCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVsZW1lbnQgc3Vic3RpdHV0aW9uIG5vdCBhbGxvd2VkIHdoZW4gZ3JvdXAgaGVhZCBoYXMgYmxvY2s9J3N1YnN0aXR1dGlvbiciLCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQgbmV3RmllbGQgPSBfZ2xvYmFsVHlwZXMuZmluZEVsZW1lbnQobmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG5ld0ZpZWxkICE9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0ZpZWxkICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RmllbGQgPSBuZXdGaWVsZDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbGVtZW50RmllbGQgPSAoU2NoZW1hRmllbGQpIGN1cnJlbnRQYXJ0aWNsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsZW1lbnRUeXBlID0gZWxlbWVudEZpZWxkLmdldFR5cGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCBlbGVtZW50VHlwZSAhPSBudWxsOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIHRoZSBuby10eXBlIGlzIGFsd2F5cyBpbnZhbGlkIChldmVuIGlmIHRoZXJlIGlzIGFuIHhzaTp0eXBlKQotICAgICAgICAvLwotCi0gICAgICAgIGlmIChlbGVtZW50VHlwZS5pc05vVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0RmllbGRFcnJvcihldmVudCwgIkludmFsaWQgdHlwZS4iKTsKLSAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFNlZSBpZiB0aGUgZWxlbWVudCBoYXMgYW4geHNpOnR5cGUgb24gaXQKLSAgICAgICAgLy8KLQotICAgICAgICBTY2hlbWFUeXBlIHhzaVR5cGUgPSBudWxsOwotCi0gICAgICAgIGlmIChldmVudC5nZXRYc2lUeXBlKCBfY2hhcnMgKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gX2NoYXJzLmFzU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIC8vIFR1cm4gb2ZmIHRoZSBsaXN0ZW5lciBzbyBhIHB1YmxpYyBlcnJvciBtZXNzYWdlCi0gICAgICAgICAgICAvLyBkb2VzIG5vdCBnZXQgZ2VuZXJhdGVkLCBidXQgSSBjYW4gc2VlIGlmIHRoZXJlIHdhcwotICAgICAgICAgICAgLy8gYW4gZXJyb3IgdGhyb3VnaCB0aGUgZXJyb3Igc3RhdGUKLQotICAgICAgICAgICAgaW50IG9yaWdpbmFsRXJyb3JTdGF0ZSA9IF9lcnJvclN0YXRlOwotCi0gICAgICAgICAgICBfc3VzcGVuZEVycm9ycysrOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfdmMuX2V2ZW50ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIHhzaVR5cGUgPQotICAgICAgICAgICAgICAgICAgICBfZ2xvYmFsVHlwZXMuZmluZFR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBYbWxRTmFtZUltcGwudmFsaWRhdGVMZXhpY2FsKCB2YWx1ZSwgX3ZjLCBldmVudCApICk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggVGhyb3dhYmxlIHQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9lcnJvclN0YXRlKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3N1c3BlbmRFcnJvcnMtLTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG9yaWdpbmFsRXJyb3JTdGF0ZSAhPSBfZXJyb3JTdGF0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQsICJJbnZhbGlkIHhzaTp0eXBlIHFuYW1lOiAnIiArIHZhbHVlICsgIiciICk7Ci0KLSAgICAgICAgICAgICAgICBfZWF0Q29udGVudCA9IDE7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh4c2lUeXBlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdEVycm9yKGV2ZW50LCAgIkNvdWxkIG5vdCBmaW5kIHhzaTp0eXBlOiAnIiArIHZhbHVlICsgIiciKTsKLQotICAgICAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh4c2lUeXBlICE9IG51bGwgJiYgIXhzaVR5cGUuZXF1YWxzKGVsZW1lbnRUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFlbGVtZW50VHlwZS5pc0Fzc2lnbmFibGVGcm9tKHhzaVR5cGUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAotICAgICAgICAgICAgICAgICAgICBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgIlR5cGUgJyIgKyB4c2lUeXBlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICInIGlzIG5vdCBkZXJpdmVkIGZyb20gJyIgKyBlbGVtZW50VHlwZSArICInIiApOwotCi0gICAgICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZWxlbWVudFR5cGUuYmxvY2tFeHRlbnNpb24oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKCBTY2hlbWFUeXBlIHQgPSB4c2lUeXBlIDsgISB0LmVxdWFscyggZWxlbWVudFR5cGUgKSA7Ci0gICAgICAgICAgICAgICAgICAgICAgdCA9IHQuZ2V0QmFzZVR5cGUoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAodC5nZXREZXJpdmF0aW9uVHlwZSgpID09IFNjaGVtYVR5cGUuRFRfRVhURU5TSU9OKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXh0ZW5zaW9uIHR5cGU6ICciICsgeHNpVHlwZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIG1heSBub3QgYmUgc3Vic3RpdHV0ZWQgZm9yOiAnIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VHlwZSArICInIiApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBfZWF0Q29udGVudCA9IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVsZW1lbnRUeXBlLmJsb2NrUmVzdHJpY3Rpb24oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKCBTY2hlbWFUeXBlIHQgPSB4c2lUeXBlIDsgISB0LmVxdWFscyggZWxlbWVudFR5cGUgKSA7Ci0gICAgICAgICAgICAgICAgICAgICAgdCA9IHQuZ2V0QmFzZVR5cGUoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAodC5nZXREZXJpdmF0aW9uVHlwZSgpID09IFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT04pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXN0cmljdGlvbiB0eXBlOiAnIiArIHhzaVR5cGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBtYXkgbm90IGJlIHN1YnN0aXR1dGVkIGZvcjogJyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFR5cGUgKyAiJyIgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlbGVtZW50RmllbGQgaW5zdGFuY2VvZiBTY2hlbWFMb2NhbEVsZW1lbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hTG9jYWxFbGVtZW50IHNsZSAgPSAoU2NoZW1hTG9jYWxFbGVtZW50KWVsZW1lbnRGaWVsZDsKLQotICAgICAgICAgICAgICAgIGlmIChzbGUuYmxvY2tFeHRlbnNpb24oKSB8fCBzbGUuYmxvY2tSZXN0cmljdGlvbigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yICggU2NoZW1hVHlwZSB0ID0geHNpVHlwZSA7ICEgdC5lcXVhbHMoIGVsZW1lbnRUeXBlICkgOwotICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdC5nZXRCYXNlVHlwZSgpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0LmdldERlcml2YXRpb25UeXBlKCkgPT0gU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTiAmJiBzbGUuYmxvY2tSZXN0cmljdGlvbigpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0LmdldERlcml2YXRpb25UeXBlKCkgPT0gU2NoZW1hVHlwZS5EVF9FWFRFTlNJT04gJiYgc2xlLmJsb2NrRXh0ZW5zaW9uKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZXJpdmVkIHR5cGU6ICciICsgeHNpVHlwZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBtYXkgbm90IGJlIHN1YnN0aXR1dGVkIGZvciBlbGVtZW50ICciICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lSGVscGVyLnByZXR0eShzbGUuZ2V0TmFtZSgpKSArICInIiApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsZW1lbnRUeXBlID0geHNpVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbGVtZW50RmllbGQgaW5zdGFuY2VvZiBTY2hlbWFMb2NhbEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYUxvY2FsRWxlbWVudCBzbGUgPSAoU2NoZW1hTG9jYWxFbGVtZW50KWVsZW1lbnRGaWVsZDsKLQotICAgICAgICAgICAgaWYgKHNsZS5pc0Fic3RyYWN0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdEVycm9yKGV2ZW50LCAgIkVsZW1lbnQgJyIgKyBRTmFtZUhlbHBlci5wcmV0dHkoc2xlLmdldE5hbWUoKSkgKwotICAgICAgICAgICAgICAgICAgICAiJyBpcyBhYnN0cmFjdCBhbmQgY2Fubm90IGJlIHVzZWQgaW4gYW4gaW5zdGFuY2UuIik7Ci0gICAgICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbGVtZW50VHlwZSAhPSBudWxsICYmIGVsZW1lbnRUeXBlLmlzQWJzdHJhY3QoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoCi0gICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgIkFic3RyYWN0IHR5cGU6ICIgKyBlbGVtZW50VHlwZSArCi0gICAgICAgICAgICAgICAgICAgICIgY2Fubm90IGJlIHVzZWQgaW4gYW4gaW5zdGFuY2UiICk7Ci0KLSAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc05pbCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGhhc05pbCA9IGZhbHNlOwotCi0gICAgICAgIGlmIChldmVudC5nZXRYc2lOaWwoX2NoYXJzKSkKLSAgICAgICAgewotICAgICAgICAgICAgX3ZjLl9ldmVudCA9IGV2ZW50OwotICAgICAgICAgICAgaXNOaWwgPSBKYXZhQm9vbGVhbkhvbGRlci52YWxpZGF0ZUxleGljYWwoX2NoYXJzLmFzU3RyaW5nKCksIF92Yyk7Ci0gICAgICAgICAgICBoYXNOaWwgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBub3RlIGluIHNjaGVtYSBzcGVjIDMuMy40LCB5b3UncmUgbm90IGV2ZW4gYWxsb3dlZCB0byBzYXkgeHNpOm5pbD0iZmFsc2UiIGlmIHlvdSdyZSBub3QgbmlsbGFibGUhCi0gICAgICAgIGlmIChoYXNOaWwgJiYgIWVsZW1lbnRGaWVsZC5pc05pbGxhYmxlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKGV2ZW50LCAgIkVsZW1lbnQgaGFzIHhzaTpuaWwgYXR0cmlidXRlIGJ1dCBpcyBub3QgbmlsbGFibGUiKTsKLQotICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbmV3U3RhdGUoIGVsZW1lbnRUeXBlLCBlbGVtZW50RmllbGQsIGlzTmlsICk7Ci0KLSAgICAgICAgLy8gRGlzcGF0Y2ggdGhpcyBlbGVtZW50IGV2ZW50IHRvIGFueSBpZGVudGl0eSBjb25zdHJhaW50cwotICAgICAgICAvLyBBcyB3ZWxsIGFzIGFkZGluZyBhbnkgbmV3IGlkZW50aXR5IGNvbnN0cmFpbnRzIHRoYXQgZXhpc3QKLQotICAgICAgICBfY29uc3RyYWludEVuZ2luZS5lbGVtZW50KAotICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICBlbGVtZW50VHlwZSwKLSAgICAgICAgICAgIGVsZW1lbnRGaWVsZCBpbnN0YW5jZW9mIFNjaGVtYUxvY2FsRWxlbWVudAotICAgICAgICAgICAgICAgID8gKChTY2hlbWFMb2NhbEVsZW1lbnQpIGVsZW1lbnRGaWVsZCkuZ2V0SWRlbnRpdHlDb25zdHJhaW50cygpCi0gICAgICAgICAgICAgICAgOiBudWxsICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGF0dHJFdmVudCAoIEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIFFOYW1lIGF0dHJOYW1lID0gZXZlbnQuZ2V0TmFtZSgpOwotCi0gICAgICAgIFN0YXRlIHN0YXRlID0gdG9wU3RhdGUoKTsKLQotICAgICAgICBpZiAoc3RhdGUuX2F0dHJzID09IG51bGwpCi0gICAgICAgICAgICBzdGF0ZS5fYXR0cnMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgIGlmIChzdGF0ZS5fYXR0cnMuY29udGFpbnMoIGF0dHJOYW1lICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAotICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICJEdXBsaWNhdGUgYXR0cmlidXRlOiAiICsgUU5hbWVIZWxwZXIucHJldHR5KCBhdHRyTmFtZSApICk7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRlLl9hdHRycy5hZGQoIGF0dHJOYW1lICk7Ci0KLSAgICAgICAgaWYgKCFzdGF0ZS5fY2FuSGF2ZUF0dHJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0RmllbGRFcnJvciggZXZlbnQsICJDYW4ndCBoYXZlIGF0dHJpYnV0ZXMiICk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZSBhdHRyU2NoZW1hID0KLSAgICAgICAgICAgIHN0YXRlLl9hdHRyTW9kZWwgPT0gbnVsbAotICAgICAgICAgICAgICAgID8gbnVsbAotICAgICAgICAgICAgICAgIDogc3RhdGUuX2F0dHJNb2RlbC5nZXRBdHRyaWJ1dGUoIGF0dHJOYW1lICk7Ci0KLSAgICAgICAgaWYgKGF0dHJTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGF0dHJTY2hlbWEuZ2V0VXNlKCkgPT0gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuUFJPSElCSVRFRCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgaXMgcHJvaGliaXRlZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBRTmFtZUhlbHBlci5wcmV0dHkoIGF0dHJOYW1lICkgKTsKLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0KLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVNpbXBsZVR5cGUoCi0gICAgICAgICAgICAgICAgICAgIGF0dHJTY2hlbWEuZ2V0VHlwZSgpLCBhdHRyU2NoZW1hLCBldmVudCwgZmFsc2UsIGZhbHNlICk7Ci0KLSAgICAgICAgICAgIF9jb25zdHJhaW50RW5naW5lLmF0dHIoIGV2ZW50LCBhdHRyTmFtZSwgYXR0clNjaGVtYS5nZXRUeXBlKCksIHZhbHVlICk7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB3aWxkY2FyZFByb2Nlc3MgPSBzdGF0ZS5fYXR0ck1vZGVsLmdldFdpbGRjYXJkUHJvY2VzcygpOwotCi0gICAgICAgIGlmICh3aWxkY2FyZFByb2Nlc3MgPT0gU2NoZW1hQXR0cmlidXRlTW9kZWwuTk9ORSkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoCi0gICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBub3QgYWxsb3dlZCAobm8gd2lsZGNhcmRzIGFsbG93ZWQpOiAiCi0gICAgICAgICAgICAgICAgICAgICsgUU5hbWVIZWxwZXIucHJldHR5KCBhdHRyTmFtZSApICk7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFFOYW1lU2V0IGF0dHJXaWxkY2FyZFNldCA9IHN0YXRlLl9hdHRyTW9kZWwuZ2V0V2lsZGNhcmRTZXQoKTsKLQotICAgICAgICBpZiAoIWF0dHJXaWxkY2FyZFNldC5jb250YWlucyggYXR0ck5hbWUgKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoCi0gICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBub3QgYWxsb3dlZDogIiArIFFOYW1lSGVscGVyLnByZXR0eSggYXR0ck5hbWUgKSApOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod2lsZGNhcmRQcm9jZXNzID09IFNjaGVtYUF0dHJpYnV0ZU1vZGVsLlNLSVApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgYXR0clNjaGVtYSA9IF9nbG9iYWxUeXBlcy5maW5kQXR0cmlidXRlKCBhdHRyTmFtZSApOwotCi0gICAgICAgIGlmIChhdHRyU2NoZW1hID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh3aWxkY2FyZFByb2Nlc3MgPT0gU2NoZW1hQXR0cmlidXRlTW9kZWwuTEFYKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgYXNzZXJ0IHdpbGRjYXJkUHJvY2VzcyA9PSBTY2hlbWFBdHRyaWJ1dGVNb2RlbC5TVFJJQ1Q7Ci0KLSAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAotICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgbm90IGFsbG93ZWQgKHN0cmljdCB3aWxkY2FyZCwgYW5kIG5vIGRlZmluaXRpb24gZm91bmQpOiAiICsgUU5hbWVIZWxwZXIucHJldHR5KCBhdHRyTmFtZSApICk7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9Ci0gICAgICAgICAgICB2YWxpZGF0ZVNpbXBsZVR5cGUoCi0gICAgICAgICAgICAgICAgYXR0clNjaGVtYS5nZXRUeXBlKCksIGF0dHJTY2hlbWEsIGV2ZW50LCBmYWxzZSwgZmFsc2UgKTsKLQotICAgICAgICBfY29uc3RyYWludEVuZ2luZS5hdHRyKCBldmVudCwgYXR0ck5hbWUsIGF0dHJTY2hlbWEuZ2V0VHlwZSgpLCB2YWx1ZSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbmRBdHRyc0V2ZW50ICggRXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgU3RhdGUgc3RhdGUgPSB0b3BTdGF0ZSgpOwotCi0gICAgICAgIGlmIChzdGF0ZS5fYXR0ck1vZGVsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlW10gYXR0cnMgPSBzdGF0ZS5fYXR0ck1vZGVsLmdldEF0dHJpYnV0ZXMoKTsKLQotICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IGF0dHJzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGUgc2xhID0gYXR0cnNbIGkgXTsKLQotICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5fYXR0cnMgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIXN0YXRlLl9hdHRycy5jb250YWlucyggc2xhLmdldE5hbWUoKSApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNsYS5nZXRVc2UoKSA9PSBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5SRVFVSVJFRCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsICJFeHBlY3RlZCBhdHRyaWJ1dGU6ICIsIHNsYS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzbGEuaXNEZWZhdWx0KCkgfHwgc2xhLmlzRml4ZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnN0cmFpbnRFbmdpbmUuYXR0cihldmVudCwgc2xhLmdldE5hbWUoKSwgc2xhLmdldFR5cGUoKSwgc2xhLmdldERlZmF1bHRUZXh0KCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHZhbGlkYXRlIGF0dHJpYnV0ZSBkZWZhdWx0cyBiZWNhdXNlIHRoaXMgaXMgZG9uZSBhdCBjb21waWxldGltZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBzbGEuZ2V0RGVmYXVsdFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVR5cGUgdHlwZSA9IHNsYS5nZXRUeXBlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChYbWxRTmFtZS50eXBlLmlzQXNzaWduYWJsZUZyb20odHlwZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlZmF1bHQgUU5hbWUgdmFsdWVzIGFyZSB1bnN1cHBvcnRlZCBmb3IgYXR0cmlidXRlOiAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZUhlbHBlci5wcmV0dHkoc2xhLmdldE5hbWUoKSksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvci5TRVZFUklUWV9JTkZPKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVNpbXBsZVR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHNsYS5nZXREZWZhdWx0VGV4dCgpLCBldmVudCApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnN0cmFpbnRFbmdpbmUuYXR0ciggZXZlbnQsIHR5cGUsIHZhbHVlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuZEV2ZW50ICggRXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgU3RhdGUgc3RhdGUgPSB0b3BTdGF0ZSgpOwotCi0gICAgICAgIGlmICghc3RhdGUuX2lzTmlsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0YXRlLmVuZCgpKQotICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKCBldmVudCwgIkV4cGVjdGVkIGVsZW1lbnQocykiICk7Ci0KLSAgICAgICAgICAgIC8vIFRoaXMgZW5kIGV2ZW50IGhhcyBubyB0ZXh0LCB1c2UgdGhpcyBmYWN0IHRvIHBhc3Mgbm8gdGV4dCB0bwotICAgICAgICAgICAgLy8gaGFuZGxlVGV4dAotCi0gICAgICAgICAgICBpZiAoc3RhdGUuX2lzRW1wdHkpCi0gICAgICAgICAgICAgICAgaGFuZGxlVGV4dCggZXZlbnQsIHRydWUsIHN0YXRlLl9maWVsZCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcG9wU3RhdGUoIGV2ZW50ICk7Ci0KLSAgICAgICAgX2NvbnN0cmFpbnRFbmdpbmUuZW5kRWxlbWVudCggZXZlbnQgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGV4dEV2ZW50ICggRXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgU3RhdGUgc3RhdGUgPSB0b3BTdGF0ZSgpOwotCi0gICAgICAgIGlmIChzdGF0ZS5faXNOaWwpCi0gICAgICAgICAgICBlbWl0RmllbGRFcnJvcihldmVudCwgIk5pbCBlbGVtZW50IGNhbm5vdCBoYXZlIHNpbXBsZSBjb250ZW50Iik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGhhbmRsZVRleHQoIGV2ZW50LCBmYWxzZSwgc3RhdGUuX2ZpZWxkICk7Ci0KLSAgICAgICAgc3RhdGUuX2lzRW1wdHkgPSBmYWxzZTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVUZXh0ICgKLSAgICAgICAgRXZlbnQgZXZlbnQsIGJvb2xlYW4gZW1wdHlDb250ZW50LCBTY2hlbWFGaWVsZCBmaWVsZCApCi0gICAgewotICAgICAgICBTdGF0ZSBzdGF0ZSA9IHRvcFN0YXRlKCk7Ci0KLSAgICAgICAgaWYgKCFzdGF0ZS5fc2F3VGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0YXRlLl9oYXNTaW1wbGVDb250ZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlU2ltcGxlVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl90eXBlLCBmaWVsZCwgZXZlbnQsIGVtcHR5Q29udGVudCwgdHJ1ZSApOwotCi0gICAgICAgICAgICAgICAgX2NvbnN0cmFpbnRFbmdpbmUudGV4dCggZXZlbnQsIHN0YXRlLl90eXBlLCB2YWx1ZSwgZmFsc2UgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGVtcHR5Q29udGVudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY29uc3RyYWludEVuZ2luZS50ZXh0KCBldmVudCwgc3RhdGUuX3R5cGUsIG51bGwsIHRydWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBfY29uc3RyYWludEVuZ2luZS50ZXh0KCBldmVudCwgc3RhdGUuX3R5cGUsICIiLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWVtcHR5Q29udGVudCAmJiAhc3RhdGUuX2NhbkhhdmVNaXhlZENvbnRlbnQgJiYgCi0gICAgICAgICAgICAhZXZlbnQudGV4dElzV2hpdGVzcGFjZSgpICYgIXN0YXRlLl9oYXNTaW1wbGVDb250ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBTY2hlbWFMb2NhbEVsZW1lbnQpIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYUxvY2FsRWxlbWVudCBlID0gKFNjaGVtYUxvY2FsRWxlbWVudClmaWVsZDsKLSAgICAgICAgICAgICAgICBlbWl0RXJyb3IoZXZlbnQsICJFbGVtZW50OiAnIiArIFFOYW1lSGVscGVyLnByZXR0eShlLmdldE5hbWUoKSkgKyAiJyBjYW5ub3QgaGF2ZSBtaXhlZCBjb250ZW50LiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVtaXRFcnJvciggZXZlbnQsICJDYW4ndCBoYXZlIG1peGVkIGNvbnRlbnQiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWVtcHR5Q29udGVudCkKLSAgICAgICAgICAgIHN0YXRlLl9zYXdUZXh0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFN0YXRlCi0gICAgewotICAgICAgICBib29sZWFuIHZpc2l0ICggUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfY2FuSGF2ZUVsZW1lbnRzICYmIF92aXNpdG9yLnZpc2l0KCBuYW1lICk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGVuZCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICFfY2FuSGF2ZUVsZW1lbnRzIHx8IF92aXNpdG9yLnZpc2l0KCBudWxsICk7Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjdXJyZW50UGFydGljbGUgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBfdmlzaXRvciAhPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIF92aXNpdG9yLmN1cnJlbnRQYXJ0aWNsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hVHlwZSAgX3R5cGU7Ci0gICAgICAgIFNjaGVtYUZpZWxkIF9maWVsZDsKLQotICAgICAgICBib29sZWFuIF9jYW5IYXZlQXR0cnM7Ci0gICAgICAgIGJvb2xlYW4gX2NhbkhhdmVNaXhlZENvbnRlbnQ7Ci0gICAgICAgIGJvb2xlYW4gX2hhc1NpbXBsZUNvbnRlbnQ7Ci0KLSAgICAgICAgYm9vbGVhbiBfc2F3VGV4dDsKLSAgICAgICAgYm9vbGVhbiBfaXNFbXB0eTsKLSAgICAgICAgYm9vbGVhbiBfaXNOaWw7Ci0KLSAgICAgICAgU2NoZW1hVHlwZVZpc2l0b3JJbXBsIF92aXNpdG9yOwotICAgICAgICBib29sZWFuIF9jYW5IYXZlRWxlbWVudHM7Ci0KLSAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWwgX2F0dHJNb2RlbDsKLQotICAgICAgICBIYXNoU2V0IF9hdHRyczsKLQotICAgICAgICBTdGF0ZSBfbmV4dDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbmV3U3RhdGUgKCBTY2hlbWFUeXBlIHR5cGUsIFNjaGVtYUZpZWxkIGZpZWxkLCBib29sZWFuIGlzTmlsICkKLSAgICB7Ci0gICAgICAgIFN0YXRlIHN0YXRlID0gbmV3IFN0YXRlKCk7Ci0KLSAgICAgICAgc3RhdGUuX3R5cGUgPSB0eXBlOwotICAgICAgICBzdGF0ZS5fZmllbGQgPSBmaWVsZDsKLSAgICAgICAgc3RhdGUuX2lzRW1wdHkgPSB0cnVlOwotICAgICAgICBzdGF0ZS5faXNOaWwgPSBpc05pbDsKLQotICAgICAgICBpZiAodHlwZS5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuX2hhc1NpbXBsZUNvbnRlbnQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGUuX2NhbkhhdmVBdHRycyA9IHRydWU7Ci0gICAgICAgICAgICBzdGF0ZS5fYXR0ck1vZGVsID0gdHlwZS5nZXRBdHRyaWJ1dGVNb2RlbCgpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKCB0eXBlLmdldENvbnRlbnRUeXBlKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkVNUFRZX0NPTlRFTlQgOgotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQgOgotICAgICAgICAgICAgICAgIHN0YXRlLl9oYXNTaW1wbGVDb250ZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQgOgotICAgICAgICAgICAgICAgIHN0YXRlLl9jYW5IYXZlTWl4ZWRDb250ZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBGYWxsIHRocm91Z2gKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkVMRU1FTlRfQ09OVEVOVCA6Ci0KLSAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBwYXJ0aWNsZSA9IHR5cGUuZ2V0Q29udGVudE1vZGVsKCk7Ci0KLSAgICAgICAgICAgICAgICBzdGF0ZS5fY2FuSGF2ZUVsZW1lbnRzID0gcGFydGljbGUgIT0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5fY2FuSGF2ZUVsZW1lbnRzKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fdmlzaXRvciA9IGluaXRWaXNpdG9yKCBwYXJ0aWNsZSApOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiVW5leHBlY3RlZCBjb250ZW50IHR5cGUiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdXNoU3RhdGUoIHN0YXRlICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBvcFN0YXRlICggRXZlbnQgZSApCi0gICAgewotICAgICAgICBpZiAoX3N0YXRlU3RhY2suX3Zpc2l0b3IgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcG9vbFZpc2l0b3IoIF9zdGF0ZVN0YWNrLl92aXNpdG9yICk7Ci0gICAgICAgICAgICBfc3RhdGVTdGFjay5fdmlzaXRvciA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBfc3RhdGVTdGFjayA9IF9zdGF0ZVN0YWNrLl9uZXh0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwdXNoU3RhdGUgKCBTdGF0ZSBzdGF0ZSApCi0gICAgewotICAgICAgICBzdGF0ZS5fbmV4dCA9IF9zdGF0ZVN0YWNrOwotICAgICAgICBfc3RhdGVTdGFjayA9IHN0YXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlua2VkTGlzdCBfdmlzaXRvclBvb2wgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0gICAgcHJpdmF0ZSB2b2lkIHBvb2xWaXNpdG9yKCBTY2hlbWFUeXBlVmlzaXRvckltcGwgdmlzaXRvciApCi0gICAgewotICAgICAgICBfdmlzaXRvclBvb2wuYWRkKCB2aXNpdG9yICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlVmlzaXRvckltcGwgaW5pdFZpc2l0b3IoIFNjaGVtYVBhcnRpY2xlIHBhcnRpY2xlICkKLSAgICB7Ci0gICAgICAgIGlmIChfdmlzaXRvclBvb2wuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTY2hlbWFUeXBlVmlzaXRvckltcGwoIHBhcnRpY2xlICk7Ci0KLSAgICAgICAgU2NoZW1hVHlwZVZpc2l0b3JJbXBsIHJlc3VsdCA9Ci0gICAgICAgICAgICAoU2NoZW1hVHlwZVZpc2l0b3JJbXBsKSBfdmlzaXRvclBvb2wucmVtb3ZlTGFzdCgpOwotCi0gICAgICAgIHJlc3VsdC5pbml0KCBwYXJ0aWNsZSApOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdGF0ZSB0b3BTdGF0ZSAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc3RhdGVTdGFjazsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIFNpbXBsZSBUeXBlIFZhbGlkYXRpb24KLSAgICAvLwotICAgIC8vIGVtcHR5Q29udGVudCBtZWFucyB0aGF0IHlvdSBjYW4ndCB1c2UgdGhlIGV2ZW50IHRvIGdldCB0ZXh0OiB0aGVyZSBpcwotICAgIC8vIG5vdCB0ZXh0LCBidXQgeW91IGNhbiB1c2UgdGhlIGV2ZW50IHRvIGRvIHByZWZpeCByZXNvbHV0aW9uIChpbiB0aGUgY2FzZQotICAgIC8vIHdoZXJlIHRoZSBkZWZhdWx0IGlzIGEgcW5hbWUpCi0gICAgLy8KLQotICAgIHByaXZhdGUgU3RyaW5nIHZhbGlkYXRlU2ltcGxlVHlwZSAoCi0gICAgICAgIFNjaGVtYVR5cGUgdHlwZSwgU2NoZW1hRmllbGQgZmllbGQsIEV2ZW50IGV2ZW50LAotICAgICAgICBib29sZWFuIGVtcHR5Q29udGVudCwgYm9vbGVhbiBjYW5BcHBseURlZmF1bHQgKQotICAgIHsKLSAgICAgICAgaWYgKCF0eXBlLmlzU2ltcGxlVHlwZSgpICYmCi0gICAgICAgICAgICAgICAgdHlwZS5nZXRDb250ZW50VHlwZSgpICE9IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgICAgIC8vIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiTm90IGEgc2ltcGxlIHR5cGUiICk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gdGhlIG5vLXR5cGUgaXMgYWx3YXlzIGludmFsaWQKLSAgICAgICAgLy8KLQotICAgICAgICBpZiAodHlwZS5pc05vVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoZXZlbnQsICJJbnZhbGlkIHR5cGUuIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0KLQotICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIGFzIGEgc3RyaW5nIChhcyBub3JtYWxpemVkIGJ5IHRoZSB3aGl0ZSBzcGFjZSBydWxlCi0gICAgICAgIC8vIFRPRE8gLSB3aWxsIHdhbnQgdG8gb3B0aW1pemUgdGhpcyBsYXRlcgotCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9ICIiOwotCi0gICAgICAgIGlmICghZW1wdHlDb250ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBldmVudC5nZXRUZXh0KCBfY2hhcnMsIHR5cGUuZ2V0V2hpdGVTcGFjZVJ1bGUoKSApOwotICAgICAgICAgICAgdmFsdWUgPSBfY2hhcnMuYXNTdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNlZSBpZiBJIGNhbiBhcHBseSBhIGRlZmF1bHQvZml4ZWQgdmFsdWUKLQotICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCAmJiBjYW5BcHBseURlZmF1bHQgJiYgZmllbGQgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChmaWVsZC5pc0RlZmF1bHQoKSB8fCBmaWVsZC5pc0ZpeGVkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoWG1sUU5hbWUudHlwZS5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICJEZWZhdWx0IFFOYW1lIHZhbHVlcyBhcmUgdW5zdXBwb3J0ZWQgZm9yICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWVIZWxwZXIucmVhZGFibGUodHlwZSkgKyAiIC0gaWdub3JpbmcuIiwKLSAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3IuU0VWRVJJVFlfSU5GTyk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRWYWx1ZSA9Ci0gICAgICAgICAgICAgICAgWG1sV2hpdGVzcGFjZS5jb2xsYXBzZSgKLSAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RGVmYXVsdFRleHQoKSwgdHlwZS5nZXRXaGl0ZVNwYWNlUnVsZSgpICk7Ci0KLS8vIEJVR0JVRyAtIHNob3VsZCB2YWxpZGF0ZSBkZWZhdWx0VmFsdWUgYXQgY29tcGlsZSB0aW1lCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVNpbXBsZVR5cGUoIHR5cGUsIGRlZmF1bHRWYWx1ZSwgZXZlbnQgKQotICAgICAgICAgICAgICAgICAgICA/IGRlZmF1bHRWYWx1ZQotICAgICAgICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXZhbGlkYXRlU2ltcGxlVHlwZSggdHlwZSwgdmFsdWUsIGV2ZW50ICkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCAmJiBmaWVsZC5pc0ZpeGVkKCkpCi0gICAgICAgIHsKLS8vIFRPRE8gLSBmaXhlZCB2YWx1ZSBzaG91bGQgaGF2ZSBiZWVuIGNvb2tlZCBhdCBjb21waWxlIHRpbWUKLSAgICAgICAgICAgIFN0cmluZyBmaXhlZFZhbHVlID0KLSAgICAgICAgICAgICAgICBYbWxXaGl0ZXNwYWNlLmNvbGxhcHNlKAotICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXREZWZhdWx0VGV4dCgpLCB0eXBlLmdldFdoaXRlU3BhY2VSdWxlKCkgKTsKLQotICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZVNpbXBsZVR5cGUoIHR5cGUsIGZpeGVkVmFsdWUsIGV2ZW50ICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIFhtbE9iamVjdCB2YWwgPSB0eXBlLm5ld1ZhbHVlKCB2YWx1ZSApOwotICAgICAgICAgICAgWG1sT2JqZWN0IGRlZiA9IHR5cGUubmV3VmFsdWUoIGZpeGVkVmFsdWUgKTsKLQotICAgICAgICAgICAgaWYgKCF2YWwudmFsdWVFcXVhbHMoIGRlZiApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEJVR0JVRyAtIG1ha2UgdGhpcyBtb3JlIHZlcmJvc2UKLQotICAgICAgICAgICAgICAgIGVtaXRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICJWYWx1ZSBub3QgZXF1YWwgdG8gZml4ZWQgdmFsdWUuICIgKyB2YWx1ZSApOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlU2ltcGxlVHlwZSAoCi0gICAgICAgIFNjaGVtYVR5cGUgdHlwZSwgU3RyaW5nIHZhbHVlLCBFdmVudCBldmVudCApCi0gICAgewotICAgICAgICBpZiAoIXR5cGUuaXNTaW1wbGVUeXBlKCkgJiYKLSAgICAgICAgICAgICAgICB0eXBlLmdldENvbnRlbnRUeXBlKCkgIT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJOb3QgYSBzaW1wbGUgdHlwZSIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCByZXRTdGF0ZSA9IF9lcnJvclN0YXRlOwotCi0gICAgICAgIHN3aXRjaCAoIHR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpICkKLSAgICAgICAgewotICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQVRPTUlDIDogdmFsaWRhdGVBdG9taWNUeXBlKCB0eXBlLCB2YWx1ZSwgZXZlbnQgKTticmVhazsKLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OICA6IHZhbGlkYXRlVW5pb25UeXBlKCAgdHlwZSwgdmFsdWUsIGV2ZW50ICk7YnJlYWs7Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUICAgOiB2YWxpZGF0ZUxpc3RUeXBlKCAgIHR5cGUsIHZhbHVlLCBldmVudCApO2JyZWFrOwotCi0gICAgICAgIGRlZmF1bHQgOiB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIlVuZXhwZWN0ZWQgc2ltcGxlIHZhcmlldHkiICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0U3RhdGUgPT0gX2Vycm9yU3RhdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQXRvbWljVHlwZSAoCi0gICAgICAgIFNjaGVtYVR5cGUgdHlwZSwgU3RyaW5nIHZhbHVlLCBFdmVudCBldmVudCApCi0gICAgewotICAgICAgICAvLyBOb3cgd2Ugc2hvdWxkIGhhdmUgb25seSBhbiBhdG9taWMgdHlwZSB0byB2YWxpZGF0ZQotCi0gICAgICAgIGFzc2VydCB0eXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkFUT01JQzsKLQotICAgICAgICAvLyBSZWNvcmQgdGhlIGN1cnJlbnQgZXJyb3Igc3RhdGUgdG8gc2VlIGlmIGFueSBuZXcgZXJyb3JzIGFyZSBtYWRlCi0gICAgICAgIGludCBlcnJvclN0YXRlID0gX2Vycm9yU3RhdGU7Ci0gICAgICAgIF92Yy5fZXZlbnQgPSBldmVudDsKLQotICAgICAgICBzd2l0Y2ggKCB0eXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFIDoKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQWx3YXlzIHZhbGlkIQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkcgOgotICAgICAgICB7Ci0gICAgICAgICAgICBKYXZhU3RyaW5nRW51bWVyYXRpb25Ib2xkZXJFeC52YWxpZGF0ZUxleGljYWwoIHZhbHVlLCB0eXBlLCBfdmMgKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTCA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEphdmFEZWNpbWFsSG9sZGVyRXgudmFsaWRhdGVMZXhpY2FsKCB2YWx1ZSwgdHlwZSwgX3ZjICk7Ci0KLSAgICAgICAgICAgIGlmIChlcnJvclN0YXRlID09IF9lcnJvclN0YXRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEphdmFEZWNpbWFsSG9sZGVyRXgudmFsaWRhdGVWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJpZ0RlY2ltYWwoIHZhbHVlICksIHR5cGUsIF92YyApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU4gOgotICAgICAgICB7Ci0gICAgICAgICAgICBKYXZhQm9vbGVhbkhvbGRlckV4LnZhbGlkYXRlTGV4aWNhbCggdmFsdWUsIHR5cGUsIF92YyApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZsb2F0IGYgPQotICAgICAgICAgICAgICAgIEphdmFGbG9hdEhvbGRlckV4LnZhbGlkYXRlTGV4aWNhbCggdmFsdWUsIHR5cGUsIF92YyApOwotCi0gICAgICAgICAgICBpZiAoZXJyb3JTdGF0ZSA9PSBfZXJyb3JTdGF0ZSkKLSAgICAgICAgICAgICAgICBKYXZhRmxvYXRIb2xkZXJFeC52YWxpZGF0ZVZhbHVlKCBmLCB0eXBlLCBfdmMgKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEUgOgotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGUgZCA9Ci0gICAgICAgICAgICAgICAgSmF2YURvdWJsZUhvbGRlckV4LnZhbGlkYXRlTGV4aWNhbCggdmFsdWUsIHR5cGUsIF92YyApOwotCi0gICAgICAgICAgICBpZiAoZXJyb3JTdGF0ZSA9PSBfZXJyb3JTdGF0ZSkKLSAgICAgICAgICAgICAgICBKYXZhRG91YmxlSG9sZGVyRXgudmFsaWRhdGVWYWx1ZSggZCwgdHlwZSwgX3ZjICk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUUgOgotICAgICAgICB7Ci0gICAgICAgICAgICBRTmFtZSBuID0KLSAgICAgICAgICAgICAgICBKYXZhUU5hbWVIb2xkZXJFeC52YWxpZGF0ZUxleGljYWwoCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlLCB0eXBlLCBfdmMsIGV2ZW50ICk7Ci0KLSAgICAgICAgICAgIGlmIChlcnJvclN0YXRlID09IF9lcnJvclN0YXRlKQotICAgICAgICAgICAgICAgIEphdmFRTmFtZUhvbGRlckV4LnZhbGlkYXRlVmFsdWUoIG4sIHR5cGUsIF92YyApOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9VUkkgOgotICAgICAgICB7Ci0gICAgICAgICAgICBKYXZhVXJpSG9sZGVyRXgudmFsaWRhdGVMZXhpY2FsKCB2YWx1ZSwgdHlwZSwgX3ZjICk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FIDoKLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19USU1FIDoKLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFIDoKLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEggOgotICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUiA6Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVkgOgotICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZIDoKLSAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIIDoKLSAgICAgICAgewotICAgICAgICAgICAgR0RhdGUgZCA9IFhtbERhdGVJbXBsLnZhbGlkYXRlTGV4aWNhbCggdmFsdWUsIHR5cGUsIF92YyApOwotCi0gICAgICAgICAgICBpZiAoZCAhPSBudWxsKQotICAgICAgICAgICAgICAgIFhtbERhdGVJbXBsLnZhbGlkYXRlVmFsdWUoIGQsIHR5cGUsIF92YyApOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OIDoKLSAgICAgICAgewotICAgICAgICAgICAgR0R1cmF0aW9uIGQgPSBYbWxEdXJhdGlvbkltcGwudmFsaWRhdGVMZXhpY2FsKCB2YWx1ZSwgdHlwZSwgX3ZjICk7Ci0KLSAgICAgICAgICAgIGlmIChkICE9IG51bGwpCi0gICAgICAgICAgICAgICAgWG1sRHVyYXRpb25JbXBsLnZhbGlkYXRlVmFsdWUoIGQsIHR5cGUsIF92YyApOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZIDoKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZVtdIHYgPQotICAgICAgICAgICAgICAgIEphdmFCYXNlNjRIb2xkZXJFeC52YWxpZGF0ZUxleGljYWwoIHZhbHVlLCB0eXBlLCBfdmMgKTsKLQotICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBKYXZhQmFzZTY0SG9sZGVyRXgudmFsaWRhdGVWYWx1ZSggdiwgdHlwZSwgX3ZjICk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWSA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSB2ID0KLSAgICAgICAgICAgICAgICBKYXZhSGV4QmluYXJ5SG9sZGVyRXgudmFsaWRhdGVMZXhpY2FsKCB2YWx1ZSwgdHlwZSwgX3ZjICk7Ci0KLSAgICAgICAgICAgIGlmICh2ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgSmF2YUhleEJpbmFyeUhvbGRlckV4LnZhbGlkYXRlVmFsdWUoIHYsIHR5cGUsIF92YyApOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OIDoKLSAgICAgICAgICAgIC8vIFVuaW1wbGVtZW50ZWQuIAotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIlVuZXhwZWN0ZWQgcHJpbWl0aXZlIHR5cGUgY29kZSIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUxpc3RUeXBlICgKLSAgICAgICAgU2NoZW1hVHlwZSB0eXBlLCBTdHJpbmcgdmFsdWUsIEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIGludCBlcnJvclN0YXRlID0gX2Vycm9yU3RhdGU7Ci0KLSAgICAgICAgaWYgKCF0eXBlLm1hdGNoUGF0dGVybkZhY2V0KCB2YWx1ZSApKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoCi0gICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgIkxpc3QgJyIgKyB2YWx1ZSArICInIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZSh0eXBlKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gaXRlbXMgPSBYbWxMaXN0SW1wbC5zcGxpdF9saXN0KHZhbHVlKTsKLQotICAgICAgICAKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIFhtbE9iamVjdCBvOwotCi0gICAgICAgIGlmICgobyA9IHR5cGUuZ2V0RmFjZXQoIFNjaGVtYVR5cGUuRkFDRVRfTEVOR1RIICkpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoaSA9ICgoU2ltcGxlVmFsdWUpbykuZ2V0SW50VmFsdWUoKSkgIT0gaXRlbXMubGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICJMaXN0ICgiICsgdmFsdWUgKyAiKSBkb2VzIG5vdCBoYXZlICIgKyBpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgaXRlbXMgcGVyIGxlbmd0aCBmYWNldCBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHR5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobyA9IHR5cGUuZ2V0RmFjZXQoIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSCApKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGkgPSAoKFNpbXBsZVZhbHVlKW8pLmdldEludFZhbHVlKCkpID4gaXRlbXMubGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICJMaXN0ICgiICsgdmFsdWUgKyAiKSBoYXMgb25seSAiICsgaXRlbXMubGVuZ3RoICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgaXRlbXMsIGZld2VyIHRoYW4gbWluIGxlbmd0aCBmYWNldCAoIiArIGkgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHR5cGUpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICgobyA9IHR5cGUuZ2V0RmFjZXQoIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSCApKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGkgPSAoKFNpbXBsZVZhbHVlKW8pLmdldEludFZhbHVlKCkpIDwgaXRlbXMubGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICJMaXN0ICgiICsgdmFsdWUgKyAiKSBoYXMgIiArIGl0ZW1zLmxlbmd0aCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGl0ZW1zLCBtb3JlIHRoYW4gbWF4IGxlbmd0aCBmYWNldCAoIiArIGkgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHR5cGUpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTY2hlbWFUeXBlIGl0ZW1UeXBlID0gdHlwZS5nZXRMaXN0SXRlbVR5cGUoKTsKLQotICAgICAgICBmb3IgKCBpID0gMCA7IGkgPCBpdGVtcy5sZW5ndGggOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0ZVNpbXBsZVR5cGUoCi0gICAgICAgICAgICAgICAgaXRlbVR5cGUsIGl0ZW1zW2ldLCBldmVudCApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgbm8gZXJyb3JzIHVwIHRvIHRoaXMgcG9pbnQsIHRoZW4gSSBjYW4gY3JlYXRlIGFuCi0gICAgICAgIC8vIFhtbExpc3QgZnJvbSB0aGlzIHZhbHVlIGFuZCBjYW1wYXJlIGl0IGFnYWluIGVudW1zLgotCi0gICAgICAgIGlmIChlcnJvclN0YXRlID09IF9lcnJvclN0YXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gTGlzdHMgd2hpY2ggY29udGFpbiBRTmFtZXMgd2lsbCBuZWVkIGEgcmVzb2x2ZXIKLQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucHVzaCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IE5hbWVzcGFjZUNvbnRleHQoIGV2ZW50ICkgKTsKLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0IGxpc3RWYWx1ZSA9ICggKFNjaGVtYVR5cGVJbXBsKSB0eXBlKS5uZXdWYWxpZGF0aW5nVmFsdWUoIHZhbHVlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIkxpc3QgdmFsdWUgKCIgKyB2YWx1ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRpb24gdmFsdWUgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZSh0eXBlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucG9wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVW5pb25UeXBlICgKLSAgICAgICAgU2NoZW1hVHlwZSB0eXBlLCBTdHJpbmcgdmFsdWUsIEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIC8vIFRPRE8gLSBpZiB4c2k6dHlwZSBpcyBzcGVjaWZpZWQgb24gYSB1bmlvbiwgaXQgc2VsZWN0cwotICAgICAgICAvLyB0aGF0IHVuaW9uIG1lbWJlciB0eXBlCi0KLSAgICAgICAgaWYgKCF0eXBlLm1hdGNoUGF0dGVybkZhY2V0KCB2YWx1ZSApKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoCi0gICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgIlVuaW9uICciICsgdmFsdWUgKyAiJyBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUodHlwZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGN1cnJlbnRXc3IgPSBTY2hlbWFUeXBlLldTX1BSRVNFUlZFOwotICAgICAgICBTdHJpbmcgY3VycmVudFZhbHVlID0gdmFsdWU7Ci0KLSAgICAgICAgU2NoZW1hVHlwZVtdIHR5cGVzID0gdHlwZS5nZXRVbmlvbk1lbWJlclR5cGVzKCk7Ci0KLSAgICAgICAgaW50IG9yaWdpbmFsU3RhdGUgPSBfZXJyb3JTdGF0ZTsKLQotICAgICAgICBpbnQgaTsKLSAgICAgICAgZm9yICggaSA9IDAgOyBpIDwgdHlwZXMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG1lbWJlcldzciA9IHR5cGVzWyBpIF0uZ2V0V2hpdGVTcGFjZVJ1bGUoKTsKLQotICAgICAgICAgICAgaWYgKG1lbWJlcldzciA9PSBTY2hlbWFUeXBlLldTX1VOU1BFQ0lGSUVEKQotICAgICAgICAgICAgICAgIG1lbWJlcldzciA9IFNjaGVtYVR5cGUuV1NfUFJFU0VSVkU7Ci0KLSAgICAgICAgICAgIGlmIChtZW1iZXJXc3IgIT0gY3VycmVudFdzcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50V3NyID0gbWVtYmVyV3NyOwotICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IFhtbFdoaXRlc3BhY2UuY29sbGFwc2UoIHZhbHVlLCBjdXJyZW50V3NyICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBvcmlnaW5hbEVycm9yU3RhdGUgPSBfZXJyb3JTdGF0ZTsKLQotICAgICAgICAgICAgX3N1c3BlbmRFcnJvcnMrKzsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVTaW1wbGVUeXBlKCB0eXBlc1sgaSBdLCBjdXJyZW50VmFsdWUsIGV2ZW50ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3N1c3BlbmRFcnJvcnMtLTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG9yaWdpbmFsRXJyb3JTdGF0ZSA9PSBfZXJyb3JTdGF0ZSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIF9lcnJvclN0YXRlID0gb3JpZ2luYWxTdGF0ZTsKLQotICAgICAgICBpZiAoaSA+PSB0eXBlcy5sZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcigKLSAgICAgICAgICAgICAgICBldmVudCwKLSAgICAgICAgICAgICAgICAiVW5pb24gJyIgKyB2YWx1ZSArICInIGRvZXMgbm90IG1hdGNoIGFueSBtZW1iZXJzIG9mICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZSh0eXBlKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgWG1sT2JqZWN0W10gdW5pb25FbnVtdmFscyA9IHR5cGUuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKTsKLQotICAgICAgICAgICAgaWYgKHVuaW9uRW51bXZhbHMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBVbmlvbnMgd2hpY2ggY29udGFpbiBRTmFtZXMgd2lsbCBuZWVkIGEgcmVzb2x2ZXIKLQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucHVzaCggbmV3IE5hbWVzcGFjZUNvbnRleHQoIGV2ZW50ICkgKTsKLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0IHVuaW9uVmFsdWUgPSB0eXBlLm5ld1ZhbHVlKCB2YWx1ZSApOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwIDsgaSA8IHVuaW9uRW51bXZhbHMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuaW9uVmFsdWUudmFsdWVFcXVhbHMoIHVuaW9uRW51bXZhbHNbIGkgXSApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gdW5pb25FbnVtdmFscy5sZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5pb24gJyIgKyB2YWx1ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0aW9uIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUodHlwZSkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSwgdGhlIGN1cnJlbnQgdW5pb24gY29kZSBhbHdheXMgZW5kcyB1cCBoZXJlIHdoZW4gaW52YWxpZAotICAgICAgICAgICAgICAgICAgICBlbWl0RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJVbmlvbiAnIiArIHZhbHVlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdGlvbiB2YWx1ZSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHR5cGUpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucG9wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvLwotICAgIC8vIE1lbWJlcnMgb2YgdGhlIHZhbGlkYXRvciBjbGFzcwotICAgIC8vCi0KLSAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICBfaW52YWxpZDsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgICAgICAgICBfcm9vdFR5cGU7Ci0gICAgcHJpdmF0ZSBTY2hlbWFGaWVsZCAgICAgICAgX3Jvb3RGaWVsZDsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGVMb2FkZXIgICBfZ2xvYmFsVHlwZXM7Ci0gICAgcHJpdmF0ZSBDaGFycyAgICAgICAgICAgICAgX2NoYXJzOwotICAgIHByaXZhdGUgU3RhdGUgICAgICAgICAgICAgIF9zdGF0ZVN0YWNrOwotICAgIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgIF9lcnJvclN0YXRlOwotICAgIHByaXZhdGUgQ29sbGVjdGlvbiAgICAgICAgIF9lcnJvckxpc3RlbmVyOwotICAgIHByaXZhdGUgVmFsaWRhdG9yVkMgICAgICAgIF92YzsKLSAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICBfc3VzcGVuZEVycm9yczsKLSAgICBwcml2YXRlIElkZW50aXR5Q29uc3RyYWludCBfY29uc3RyYWludEVuZ2luZTsKLSAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICBfZWF0Q29udGVudDsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFCYXNlNjRIb2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFCYXNlNjRIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxZTk2Mi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhQmFzZTY0SG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC51dGlsLkJhc2U2NDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJhc2U2NEJpbmFyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUJhc2U2NEhvbGRlciBleHRlbmRzIFhtbE9iamVjdEJhc2UKLXsKLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQkFTRV82NF9CSU5BUlk7IH0KLQotICAgIHByb3RlY3RlZCBieXRlW10gX3ZhbHVlOwotCi0gICAgLy8gU0lNUExFIFZBTFVFIEFDQ0VTU09SUyBCRUxPVyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBnZXRzIHJhdyB0ZXh0IHZhbHVlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhCYXNlNjQuZW5jb2RlKF92YWx1ZSkpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIF9oYXNoY2FjaGVkID0gZmFsc2U7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgX3ZhbHVlID0gdmFsaWRhdGVMZXhpY2FsKHMsIHNjaGVtYVR5cGUoKSwgX3Zvb3JWYyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIF92YWx1ZSA9IGxleChzLCBfdm9vclZjKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCi0gICAgewotICAgICAgICBfaGFzaGNhY2hlZCA9IGZhbHNlOwotICAgICAgICBfdmFsdWUgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGxleChTdHJpbmcgdiwgVmFsaWRhdGlvbkNvbnRleHQgYykKLSAgICB7Ci0gICAgICAgIGJ5dGVbXSB2Qnl0ZXMgPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdkJ5dGVzID0gdi5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiAtIFVURi04IGlzIGFsd2F5cyBzdXBwb3J0ZWQKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSBCYXNlNjQuZGVjb2RlKHZCeXRlcyk7Ci0KLSAgICAgICAgaWYgKGJ5dGVzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE8gLSBnZXQgYSBkZWNlbnQgZXJyb3Igd2l0aCBsaW5lIG51bWJlcnMgYW5kIHN1Y2ggaGVyZQotICAgICAgICAgICAgYy5pbnZhbGlkKCJCYXNlIDY0IGVuY29kZWQgZGF0YSBub3QgZW5jb2RlZCBwcm9wZXJseSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ5dGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IGxleCh2LCBjb250ZXh0KTsKLSAgICAgICAgaWYgKGJ5dGVzID09IG51bGwpIHJldHVybiBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKCFzVHlwZS5tYXRjaFBhdHRlcm5GYWNldCh2KSkKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCAiQmFzZSA2NCBlbmNvZGVkIGRhdGEgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBieXRlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGJ5dGVBcnJheVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGNoZWNrX2RhdGVkKCk7Ci0gICAgICAgIGlmIChfdmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtfdmFsdWUubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShfdmFsdWUsIDAsIHJlc3VsdCwgMCwgX3ZhbHVlLmxlbmd0aCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gc2V0dGVycwotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CeXRlQXJyYXkoYnl0ZVtdIGJhKQotICAgIHsKLSAgICAgICAgX2hhc2hjYWNoZWQgPSBmYWxzZTsKLSAgICAgICAgX3ZhbHVlID0gbmV3IGJ5dGVbYmEubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShiYSwgMCwgX3ZhbHVlLCAwLCBiYS5sZW5ndGgpOwotICAgIH0KLQotICAgIC8vIGNvbXBhcmF0b3JzCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IGkpCi0gICAgewotICAgICAgICBieXRlW10gaXZhbCA9ICgoWG1sQmFzZTY0QmluYXJ5KSBpKS5nZXRCeXRlQXJyYXlWYWx1ZSgpOwotICAgICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyhfdmFsdWUsIGl2YWwpOwotICAgIH0KLQotICAgIC8vYmVjYXVzZSBjb21wdXRpbmcgaGFzaGNvZGUgaXMgZXhwZW5zaXZlIHdlJ2xsIGNhY2hlIGl0Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX2hhc2hjYWNoZWQgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgaW50IGhhc2hjb2RlID0gMDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIE1lc3NhZ2VEaWdlc3QgbWQ1OwotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1kNSA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIk1ENSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBmaW5kIE1ENSBoYXNoIEFsZ29yaXRobSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQotICAgIHsKLSAgICAgICAgaWYoIF9oYXNoY2FjaGVkICkKLSAgICAgICAgICAgIHJldHVybiBoYXNoY29kZTsKLQotICAgICAgICBfaGFzaGNhY2hlZCA9IHRydWU7Ci0KLSAgICAgICAgaWYoIF92YWx1ZSA9PSBudWxsICkKLSAgICAgICAgICAgIHJldHVybiBoYXNoY29kZSA9IDA7Ci0KLSAgICAgICAgYnl0ZVtdIHJlcyA9IG1kNS5kaWdlc3QoX3ZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGhhc2hjb2RlID0gcmVzWzBdPDwyNCArIHJlc1sxXTw8MTYgKyByZXNbMl08PDggKyByZXNbM107Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUJhc2U2NEhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhQmFzZTY0SG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI3MDcxNC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhQmFzZTY0SG9sZGVyRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFCYXNlNjRIb2xkZXJFeCBleHRlbmRzIEphdmFCYXNlNjRIb2xkZXIKLXsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHB1YmxpYyBKYXZhQmFzZTY0SG9sZGVyRXgoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGdldF93c2Nhbm9uX3J1bGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGUoKS5nZXRXaGl0ZVNwYWNlUnVsZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgZmluYWwgYnl0ZVtdIHY7Ci0KLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2ID0gdmFsaWRhdGVMZXhpY2FsKHMsIHNjaGVtYVR5cGUoKSwgX3Zvb3JWYyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHYgPSBsZXgocywgX3Zvb3JWYyk7Ci0KLSAgICAgICAgaWYgKHYgIT0gbnVsbCAmJiBfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBzY2hlbWFUeXBlKCksIFhtbE9iamVjdEJhc2UuX3Zvb3JWYyk7Ci0gICAgICAgIAotICAgICAgICBzdXBlci5zZXRfQnl0ZUFycmF5KHYpOwotICAgIH0KLQotICAgIC8vIHNldHRlcnMKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQnl0ZUFycmF5KGJ5dGVbXSB2KQotICAgIHsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIHNjaGVtYVR5cGUoKSwgX3Zvb3JWYyk7Ci0gICAgICAgIAotICAgICAgICBzdXBlci5zZXRfQnl0ZUFycmF5KHYpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVZhbHVlKGJ5dGVbXSB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIFhtbE9iamVjdCBvOwotCi0gICAgICAgIGlmICgobyA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTEVOR1RIKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChpID0gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCkpICE9IHYubGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkJhc2UgNjQgZW5jb2RlZCBkYXRhIGRvZXMgbm90IGhhdmUgIiArIGkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBwZXIgbGVuZ3RoIGZhY2V0IiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChvID0gc1R5cGUuZ2V0RmFjZXQoIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSCApKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGkgPSAoKFhtbE9iamVjdEJhc2UpbykuYmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKSkgPiB2Lmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJCYXNlIDY0IGVuY29kZWQgZGF0YSBoYXMgb25seSAiICsgdi5sZW5ndGggKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcywgZmV3ZXIgdGhhbiBtaW4gbGVuZ3RoIGZhY2V0IiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChvID0gc1R5cGUuZ2V0RmFjZXQoIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSCApKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGkgPSAoKFhtbE9iamVjdEJhc2UpbykuYmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKSkgPCB2Lmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJCYXNlIDY0IGVuY29kZWQgZGF0YSBoYXMgIiArIHYubGVuZ3RoICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMsIG1vcmUgdGhhbiBtYXggbGVuZ3RoIGZhY2V0IiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBYbWxPYmplY3RbXSB2YWxzID0gc1R5cGUuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKTsKLQotICAgICAgICBpZiAodmFscyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnVtTG9vcDogZm9yICggaSA9IDAgOyBpIDwgdmFscy5sZW5ndGggOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ5dGVbXSBlbnVtQnl0ZXMgPSAoKFhtbE9iamVjdEJhc2UpdmFsc1tpXSkuYnl0ZUFycmF5VmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChlbnVtQnl0ZXMubGVuZ3RoICE9IHYubGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIGZvciAoIGludCBqID0gMCA7IGogPCBlbnVtQnl0ZXMubGVuZ3RoIDsgaisrICkKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1CeXRlc1tqXSAhPSB2W2pdKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgZW51bUxvb3A7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpID49IHZhbHMubGVuZ3RoKQotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiQmFzZSA2NCBlbmNvZGVkIGRhdGEgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSBlbnVtZXJhdGlvbiB2YWx1ZXMiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgICAgIHZhbGlkYXRlVmFsdWUoYnl0ZUFycmF5VmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUJvb2xlYW5Ib2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFCb29sZWFuSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYTcxYjkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUJvb2xlYW5Ib2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJvb2xlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFCb29sZWFuSG9sZGVyIGV4dGVuZHMgWG1sT2JqZWN0QmFzZQotewotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9CT09MRUFOOyB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gX3ZhbHVlOwotCi0gICAgLy8gU0lNUExFIFZBTFVFIEFDQ0VTU09SUyBCRUxPVyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBnZXRzIHJhdyB0ZXh0IHZhbHVlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pIHsgcmV0dXJuIF92YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSI7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIF92YWx1ZSA9IHZhbGlkYXRlTGV4aWNhbChzLCBfdm9vclZjKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGlmICh2LmVxdWFscygidHJ1ZSIpIHx8IHYuZXF1YWxzKCIxIikpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIGlmICh2LmVxdWFscygiZmFsc2UiKSB8fCB2LmVxdWFscygiMCIpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGNvbnRleHQuaW52YWxpZCgiSW52YWxpZCB2YWx1ZSBmb3IgYm9vbGVhbjogIiArIHYpOwotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCi0gICAgewotICAgICAgICBfdmFsdWUgPSBmYWxzZTsKLSAgICB9Ci0gICAgLy8gbnVtZXJpY3M6IGZyYWN0aW9uYWwKLSAgICBwdWJsaWMgYm9vbGVhbiBib29sZWFuVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWU7IH0KLQotICAgIC8vIHNldHRlcnMKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfYm9vbGVhbihib29sZWFuIGYpCi0gICAgewotICAgICAgICBfdmFsdWUgPSBmOwotICAgIH0KLQotICAgIC8vIGNvbXBhcmF0b3JzCi0gICAgcHJvdGVjdGVkIGludCBjb21wYXJlX3RvKFhtbE9iamVjdCBpKQotICAgIHsKLSAgICAgICAgLy8gbm8gb3JkZXJpbmcgZGVmaW5lZCBiZXR3ZWVuIHRydWUgYW5kIGZhbHNlCi0gICAgICAgIHJldHVybiBfdmFsdWUgPT0gKChYbWxCb29sZWFuKWkpLmdldEJvb2xlYW5WYWx1ZSgpID8gMCA6IDI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IGkpCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlID09ICgoWG1sQm9vbGVhbilpKS5nZXRCb29sZWFuVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IHZhbHVlX2hhc2hfY29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlID8gOTU3Mzc5NTU0IDogNjc2MzM1OTc1OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFCb29sZWFuSG9sZGVyRXguamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFCb29sZWFuSG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmNmNkYi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhQm9vbGVhbkhvbGRlckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFCb29sZWFuSG9sZGVyRXggZXh0ZW5kcyBKYXZhQm9vbGVhbkhvbGRlcgotewotICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIEphdmFCb29sZWFuSG9sZGVyLnZhbGlkYXRlTGV4aWNhbCh2LCBjb250ZXh0KTsKLSAgICAgICAgdmFsaWRhdGVQYXR0ZXJuKHYsIHNUeXBlLCBjb250ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlUGF0dGVybihTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vIHRoZSBvbmx5IG5ldyBmYWNldCB0aGF0IGNhbiBhcHBseSB0byBib29sZWFucyBpcyBwYXR0ZXJuIQotICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJCb29sZWFuICgiICsgdiArICIpIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSmF2YUJvb2xlYW5Ib2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZVBhdHRlcm4ocywgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgICAgICBzdXBlci5zZXRfdGV4dChzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURlY2ltYWxIb2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFEZWNpbWFsSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYzIxN2QuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURlY2ltYWxIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW07Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRGVjaW1hbEhvbGRlciBleHRlbmRzIFhtbE9iamVjdEJhc2UKLXsKLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfREVDSU1BTDsgfQotCi0gICAgcHJpdmF0ZSBCaWdEZWNpbWFsIF92YWx1ZTsKLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gc2V0cy9nZXRzIHJhdyB0ZXh0IHZhbHVlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pIHsgcmV0dXJuIF92YWx1ZS50b1N0cmluZygpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlTGV4aWNhbChzLCBfdm9vclZjKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0X0JpZ0RlY2ltYWwobmV3IEJpZ0RlY2ltYWwocykpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgX3Zvb3JWYy5pbnZhbGlkKCJJbnZhbGlkIERlY2ltYWwiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbmlsKCkKLSAgICB7Ci0gICAgICAgIF92YWx1ZSA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgbGV4aWNhbCB2YWxpZGF0aW9uIG9ubHkuCi0gICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgLy8gVE9ETyAtIHdpbGwgd2FudCB0byB2YWxpZGF0ZSBDaGFycyB3aXRoIGJ1aWx0IGluIHdoaXRlIHNwYWNlIGhhbmRsaW5nCi0gICAgICAgIC8vICAgICAgICBIb3dldmVyLCB0aGlzIGZjbiBzb21ldGltZXMgdGFrZXMgYSB2YWx1ZSB3aXRoIHdzciBhcHBsaWVkCi0gICAgICAgIC8vICAgICAgICBhbHJlYWR5Ci0gICAgICAgIGludCBsID0gdi5sZW5ndGgoKTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAKLSAgICAgICAgaWYgKGkgPCBsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY2ggPSB2LmNoYXJBdChpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNoID09ICcrJyB8fCBjaCA9PSAnLScpCi0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIHNhd0RvdCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIHNhd0RpZ2l0ID0gZmFsc2U7Ci0KLSAgICAgICAgZm9yICggOyBpIDwgbCA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjaCA9IHYuY2hhckF0KGkpOwotCi0gICAgICAgICAgICBpZiAoY2ggPT0gJy4nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzYXdEb3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIklsbGVnYWwgZGVjaW1hbCwgc2F3ICcuJyBtb3JlIHRoYW4gb25jZSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc2F3RG90ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2F3RGlnaXQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBtYXkgbmVlZCB0byBlc2NhcGUgZXJyb3IgY2hhcgotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSWxsZWdhbCBkZWNpbWFsLCB1bmV4cGVjdGVkIGNoYXI6ICIgKyBjaCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzYXdEaWdpdCkKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJJbGxlZ2FsIGRlY2ltYWwsIGV4cGVjdGVkIGF0IGxlYXN0IG9uZSBkaWdpdCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gbnVtZXJpY3M6IGZyYWN0aW9uYWwKLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWU7IH0KLQotICAgIC8vIHNldHRlcnMKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnRGVjaW1hbChCaWdEZWNpbWFsIHYpIHsgX3ZhbHVlID0gdjsgfQotCi0gICAgLy8gY29tcGFyYXRvcnMKLSAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVfdG8oWG1sT2JqZWN0IGRlY2ltYWwpCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlLmNvbXBhcmVUbygoKFhtbE9iamVjdEJhc2UpZGVjaW1hbCkuYmlnRGVjaW1hbFZhbHVlKCkpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgZGVjaW1hbCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoX3ZhbHVlLmNvbXBhcmVUbygoKFhtbE9iamVjdEJhc2UpZGVjaW1hbCkuYmlnRGVjaW1hbFZhbHVlKCkpKSA9PSAwOwotICAgIH0KLQotICAgIHN0YXRpYyBwcml2YXRlIEJpZ0ludGVnZXIgX21heGxvbmcgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NQVhfVkFMVUUpOwotICAgIHN0YXRpYyBwcml2YXRlIEJpZ0ludGVnZXIgX21pbmxvbmcgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NSU5fVkFMVUUpOwotCi0gICAgLyoqCi0gICAgICogTm90ZSwgdGhpcyBpcyBjYXJlZnVsbHkgYWxpZ25lZCB3aXRoIGhhc2ggY29kZXMgZm9yIGFsbCB4c2Q6ZGVjaW1hbAotICAgICAqIHByaW1pdGl2ZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQotICAgIHsKLSAgICAgICAgaWYgKF92YWx1ZS5zY2FsZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF92YWx1ZS5zZXRTY2FsZSgwLCBCaWdEZWNpbWFsLlJPVU5EX0RPV04pLmNvbXBhcmVUbyhfdmFsdWUpICE9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGRlY2ltYWxIYXNoQ29kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQmlnSW50ZWdlciBpbnR2YWwgPSBfdmFsdWUudG9CaWdJbnRlZ2VyKCk7Ci0KLSAgICAgICAgaWYgKGludHZhbC5jb21wYXJlVG8oX21heGxvbmcpID4gMCB8fAotICAgICAgICAgICAgaW50dmFsLmNvbXBhcmVUbyhfbWlubG9uZykgPCAwKQotICAgICAgICAgICAgcmV0dXJuIGludHZhbC5oYXNoQ29kZSgpOwotCi0gICAgICAgIGxvbmcgbG9uZ3ZhbCA9IGludHZhbC5sb25nVmFsdWUoKTsKLQotICAgICAgICByZXR1cm4gKGludCkoKGxvbmd2YWwgPj4gMzIpICogMTkgKyBsb25ndmFsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGhhcyBCaWdEZWNpbWFscyB3aXRoIHRoZSBzYW1lIGFyaXRobWV0aWMgdmFsdWUgdG8KLSAgICAgKiB0aGUgc2FtZSBoYXNoIGNvZGUgKGVnLCAyLjMgJiAyLjMwIHdpbGwgaGF2ZSB0aGUgc2FtZSBoYXNoLikKLSAgICAgKiBUaGlzIGRpZmZlcnMgZnJvbSBCaWdEZWNpbWFsLmhhc2hDb2RlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGRlY2ltYWxIYXNoQ29kZSgpIHsKLSAgICAgICAgYXNzZXJ0IF92YWx1ZS5zY2FsZSgpID4gMDsKLQotICAgICAgICAvLyBHZXQgZGVjaW1hbCB2YWx1ZSBhcyBzdHJpbmcsIGFuZCBzdHJpcCBvZmYgemVyb2VzIG9uIHRoZSByaWdodAotICAgICAgICBTdHJpbmcgc3RyVmFsdWUgPSBfdmFsdWUudG9TdHJpbmcoKTsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGZvciAoaSA9IHN0clZhbHVlLmxlbmd0aCgpIC0gMSA7IGkgPj0gMCA7IGkgLS0pCi0gICAgICAgICAgICBpZiAoc3RyVmFsdWUuY2hhckF0KGkpICE9ICcwJykgYnJlYWs7Ci0KLSAgICAgICAgYXNzZXJ0IHN0clZhbHVlLmluZGV4T2YoJy4nKSA8IGk7Ci0KLSAgICAgICAgLy8gUmV0dXJuIHRoZSBjYW5vbmljYWxpemVkIHN0cmluZyBoYXNoY29kZQotICAgICAgICByZXR1cm4gc3RyVmFsdWUuc3Vic3RyaW5nKDAsIGkgKyAxKS5oYXNoQ29kZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFEZWNpbWFsSG9sZGVyRXguamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFEZWNpbWFsSG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5NGU0Yy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRGVjaW1hbEhvbGRlckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhRGVjaW1hbEhvbGRlckV4IGV4dGVuZHMgSmF2YURlY2ltYWxIb2xkZXIKLXsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHB1YmxpYyBKYXZhRGVjaW1hbEhvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IF9zY2hlbWFUeXBlID0gdHlwZTsgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlTGV4aWNhbChzLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0KLSAgICAgICAgQmlnRGVjaW1hbCB2ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHYgPSBuZXcgQmlnRGVjaW1hbChzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF92b29yVmMuaW52YWxpZCgiSW52YWxpZCBEZWNpbWFsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotCi0gICAgICAgIHN1cGVyLnNldF9CaWdEZWNpbWFsKHYpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnRGVjaW1hbChCaWdEZWNpbWFsIHYpCi0gICAgewotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgICAgICBzdXBlci5zZXRfQmlnRGVjaW1hbCh2KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIEphdmFEZWNpbWFsSG9sZGVyLnZhbGlkYXRlTGV4aWNhbCh2LCBjb250ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIC8vIGNoZWNrIHBhdHRlcm4KLSAgICAgICAgaWYgKHNUeXBlLmhhc1BhdHRlcm5GYWNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBkZXNjcmliZSBzdHJpbmcgYW5kIHBhdHRlcm4gaGVyZSBpbiBlcnJvcgotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRGVjaW1hbCAoIiArIHYgKyAiKSBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBmYWNldCB2YWxpZGF0aW9uIG9ubHkuCi0gICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVWYWx1ZShCaWdEZWNpbWFsIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICAvLyBmcmFjdGlvbmFsIGRpZ2l0cwotICAgICAgICBYbWxPYmplY3QgZmQgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0ZSQUNUSU9OX0RJR0lUUyk7Ci0gICAgICAgIGlmIChmZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgc2NhbGUgPSAoKFhtbE9iamVjdEJhc2UpZmQpLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodi5zY2FsZSgpID4gc2NhbGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiRGVjaW1hbCBmcmFjdGlvbmFsIGRpZ2l0cyAoIiArIHYuc2NhbGUoKSArICIpIGRvZXMgbm90IG1hdGNoICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImZyYWN0aW9uYWwgZGlnaXRzIGZhY2V0ICgiICsgc2NhbGUgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdG90YWwgZGlnaXRzCi0gICAgICAgIFhtbE9iamVjdCB0ZCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfVE9UQUxfRElHSVRTKTsKLSAgICAgICAgaWYgKHRkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB0ZW1wID0gdi51bnNjYWxlZFZhbHVlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGludCB0ZGYgPSAoKFhtbE9iamVjdEJhc2UpdGQpLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBpbnQgbGVuID0gdGVtcC5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChsZW4gPiAwICYmIHRlbXAuY2hhckF0KDApID09ICctJykKLSAgICAgICAgICAgICAgICBsZW4gLT0gMTsKLSAgICAgICAgICAgIGlmIChsZW4gPiB0ZGYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiRGVjaW1hbCB0b3RhbCBkaWdpdHMgKCIgKyB0ZW1wICsgIikgaXMgZ3JlYXRlciB0aGFuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsIGRpZ2l0cyBmYWNldCAoIiArIHRkZiArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtaW4gZXgKLSAgICAgICAgWG1sT2JqZWN0IG1pbmUgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUpOwotICAgICAgICBpZiAobWluZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBCaWdEZWNpbWFsIG0gPSAoKFhtbE9iamVjdEJhc2UpbWluZSkuYmlnRGVjaW1hbFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodi5jb21wYXJlVG8obSkgPD0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJEZWNpbWFsICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gZXhjbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtaW4gaW4KLSAgICAgICAgWG1sT2JqZWN0IG1pbmkgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpOwotICAgICAgICBpZiAobWluaSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBCaWdEZWNpbWFsIG0gPSAoKFhtbE9iamVjdEJhc2UpbWluaSkuYmlnRGVjaW1hbFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodi5jb21wYXJlVG8obSkgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkRlY2ltYWwgKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBpbmNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1heCBpbgotICAgICAgICBYbWxPYmplY3QgbWF4aSA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRSk7Ci0gICAgICAgIGlmIChtYXhpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgbSA9ICgoWG1sT2JqZWN0QmFzZSltYXhpKS5iaWdEZWNpbWFsVmFsdWUoKTsKLSAgICAgICAgICAgIGlmICh2LmNvbXBhcmVUbyhtKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiRGVjaW1hbCAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWF4IGluY2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWF4IGV4Ci0gICAgICAgIFhtbE9iamVjdCBtYXhlID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFKTsKLSAgICAgICAgaWYgKG1heGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQmlnRGVjaW1hbCBtID0gKChYbWxPYmplY3RCYXNlKW1heGUpLmJpZ0RlY2ltYWxWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvKG0pID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiRGVjaW1hbCAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWF4IGV4Y2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZW51bWVyYXRpb24KLSAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0gICAgICAgIGlmICh2YWxzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAodi5lcXVhbHMoKChYbWxPYmplY3RCYXNlKXZhbHNbaV0pLmJpZ0RlY2ltYWxWYWx1ZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEZWNpbWFsICgiICsgdiArICIpIGRvZXMgbm90IG1hdGNoIGFueSBlbnVtZXJhdGlvbiB2YWx1ZXMgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQotICAgIHsKLSAgICAgICAgdmFsaWRhdGVMZXhpY2FsKGxleGljYWwsIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICAgICAgdmFsaWRhdGVWYWx1ZShiaWdEZWNpbWFsVmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURvdWJsZUhvbGRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURvdWJsZUhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmVlNzdlLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFEb3VibGVIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhRG91YmxlSG9sZGVyIGV4dGVuZHMgWG1sT2JqZWN0QmFzZQotewotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9ET1VCTEU7IH0KLQotICAgIGRvdWJsZSBfdmFsdWU7Ci0KLSAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIGdldHMvc2V0cyByYXcgdGV4dCB2YWx1ZQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKSB7IHJldHVybiBzZXJpYWxpemUoX3ZhbHVlKTsgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2VyaWFsaXplKGRvdWJsZSBkKQotICAgIHsKLSAgICAgICAgaWYgKGQgPT0gRG91YmxlLlBPU0lUSVZFX0lORklOSVRZKQotICAgICAgICAgICAgcmV0dXJuICJJTkYiOwotICAgICAgICBlbHNlIGlmIChkID09IERvdWJsZS5ORUdBVElWRV9JTkZJTklUWSkKLSAgICAgICAgICAgIHJldHVybiAiLUlORiI7Ci0gICAgICAgIGVsc2UgaWYgKGQgPT0gRG91YmxlLk5hTikKLSAgICAgICAgICAgIHJldHVybiAiTmFOIjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIERvdWJsZS50b1N0cmluZyhkKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBzZXRfZG91YmxlKHZhbGlkYXRlTGV4aWNhbChzLF92b29yVmMpKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBkb3VibGUgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBEb3VibGUucGFyc2VEb3VibGUodik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2LmVxdWFscygiSU5GIikpICByZXR1cm4gRG91YmxlLlBPU0lUSVZFX0lORklOSVRZOwotICAgICAgICAgICAgaWYgKHYuZXF1YWxzKCItSU5GIikpIHJldHVybiBEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFk7Ci0gICAgICAgICAgICBpZiAodi5lcXVhbHMoIk5hTiIpKSAgcmV0dXJuIERvdWJsZS5OYU47Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSW52YWxpZCBkb3VibGUgdmFsdWUiKTsKLQotICAgICAgICAgICAgcmV0dXJuIERvdWJsZS5OYU47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCi0gICAgewotICAgICAgICBfdmFsdWUgPSAwLjA7Ci0gICAgfQotCi0gICAgLy8gbnVtZXJpY3M6IGZyYWN0aW9uYWwKLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBuZXcgQmlnRGVjaW1hbChfdmFsdWUpOyB9Ci0gICAgcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZTsgfQotICAgIHB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gKGZsb2F0KV92YWx1ZTsgfQotCi0gICAgLy8gc2V0dGVycwotICAgIHByb3RlY3RlZCB2b2lkIHNldF9kb3VibGUoZG91YmxlIHYpIHsgX3ZhbHVlID0gdjsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9mbG9hdChmbG9hdCB2KSB7IHNldF9kb3VibGUoKGRvdWJsZSl2KTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9sb25nKGxvbmcgdikgeyBzZXRfZG91YmxlKChkb3VibGUpdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnRGVjaW1hbChCaWdEZWNpbWFsIHYpIHsgc2V0X2RvdWJsZSh2LmRvdWJsZVZhbHVlKCkpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0ludGVnZXIoQmlnSW50ZWdlciB2KSB7IHNldF9kb3VibGUodi5kb3VibGVWYWx1ZSgpKTsgfQotCi0gICAgLy8gY29tcGFyYXRvcnMKLSAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVfdG8oWG1sT2JqZWN0IGQpCi0gICAgewotICAgICAgICByZXR1cm4gY29tcGFyZShfdmFsdWUsKChYbWxPYmplY3RCYXNlKWQpLmRvdWJsZVZhbHVlKCkpOwotICAgIH0KLSAgICBzdGF0aWMgaW50IGNvbXBhcmUoZG91YmxlIHRoaXNWYWx1ZSwgZG91YmxlIHRoYXRWYWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzVmFsdWUgPCB0aGF0VmFsdWUpIHJldHVybiAtMTsKLSAgICAgICAgaWYgKHRoaXNWYWx1ZSA+IHRoYXRWYWx1ZSkgcmV0dXJuICAxOwotCi0gICAgICAgIGxvbmcgdGhpc0JpdHMgPSBEb3VibGUuZG91YmxlVG9Mb25nQml0cyh0aGlzVmFsdWUpOwotICAgICAgICBsb25nIHRoYXRCaXRzID0gRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHModGhhdFZhbHVlKTsKLQotICAgICAgICByZXR1cm4gdGhpc0JpdHMgPT0gdGhhdEJpdHMgPyAwIDogdGhpc0JpdHMgPCB0aGF0Qml0cyA/IC0xIDogMTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21wYXJlKF92YWx1ZSwgKChYbWxPYmplY3RCYXNlKWQpLmRvdWJsZVZhbHVlKCkpID09IDA7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQotICAgIHsKLSAgICAgICAgbG9uZyB2ID0gRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoX3ZhbHVlKTsKLSAgICAgICAgcmV0dXJuIChpbnQpKCh2ID4+IDMyKSAqIDE5ICsgdik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURvdWJsZUhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRG91YmxlSG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJiYjNlNC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRG91YmxlSG9sZGVyRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFEb3VibGVIb2xkZXJFeCBleHRlbmRzIEphdmFEb3VibGVIb2xkZXIKLXsKLSAgICBwdWJsaWMgSmF2YURvdWJsZUhvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IF9zY2hlbWFUeXBlID0gdHlwZTsgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsgfQotICAgIAotICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2RvdWJsZShkb3VibGUgdikKLSAgICB7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0gICAgICAgIHN1cGVyLnNldF9kb3VibGUodik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBkb3VibGUgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgZG91YmxlIGQgPSBKYXZhRG91YmxlSG9sZGVyLnZhbGlkYXRlTGV4aWNhbCh2LCBjb250ZXh0KTsKLQotICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEb3VibGUgKCIgKyB2ICsgIikgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlVmFsdWUoZG91YmxlIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeDsKLSAgICAgICAgZG91YmxlIGQ7Ci0KLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbXBhcmUodiwgZCA9ICgoWG1sT2JqZWN0QmFzZSl4KS5kb3VibGVWYWx1ZSgpKSA8PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkRvdWJsZSAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWluIGV4Y2x1c2l2ZSBmYWNldCAoIiArIGQgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcGFyZSh2LCBkID0gKChYbWxPYmplY3RCYXNlKXgpLmRvdWJsZVZhbHVlKCkpIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJEb3VibGUgKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBpbmNsdXNpdmUgZmFjZXQgKCIgKyBkICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkUpKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcGFyZSh2LCBkID0gKChYbWxPYmplY3RCYXNlKXgpLmRvdWJsZVZhbHVlKCkpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJEb3VibGUgKCIgKyB2ICsgIikgaXMgZ3JlYXRlciB0aGFuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBpbmNsdXNpdmUgZmFjZXQgKCIgKyBkICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcGFyZSh2LCBkID0gKChYbWxPYmplY3RCYXNlKXgpLmRvdWJsZVZhbHVlKCkpID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiRG91YmxlICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtYXggZXhjbHVzaXZlIGZhY2V0ICgiICsgZCArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0gICAgICAgIGlmICh2YWxzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFyZSh2LCAoKFhtbE9iamVjdEJhc2UpdmFsc1tpXSkuZG91YmxlVmFsdWUoKSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEb3VibGUgKCIgKyB2ICsgIikgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRlZCB2YWx1ZSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgICAgIHZhbGlkYXRlVmFsdWUoZG91YmxlVmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFGbG9hdEhvbGRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUZsb2F0SG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MmY2OGUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUZsb2F0SG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUZsb2F0SG9sZGVyIGV4dGVuZHMgWG1sT2JqZWN0QmFzZQotewotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9GTE9BVDsgfQotCi0gICAgcHJpdmF0ZSBmbG9hdCBfdmFsdWU7Ci0KLSAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIGdldHMrc2V0cyByYXcgdGV4dCB2YWx1ZQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKSB7Ci0gICAgICAgIHJldHVybiBzZXJpYWxpemUoX3ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJpYWxpemUoZmxvYXQgZikKLSAgICB7Ci0gICAgICAgIGlmIChmID09IEZsb2F0LlBPU0lUSVZFX0lORklOSVRZKQotICAgICAgICAgICAgcmV0dXJuICJJTkYiOwotICAgICAgICBlbHNlIGlmIChmID09IEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZKQotICAgICAgICAgICAgcmV0dXJuICItSU5GIjsKLSAgICAgICAgZWxzZSBpZiAoZiA9PSBGbG9hdC5OYU4pCi0gICAgICAgICAgICByZXR1cm4gIk5hTiI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBGbG9hdC50b1N0cmluZyhmKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBzZXRfZmxvYXQodmFsaWRhdGVMZXhpY2FsKHMsX3Zvb3JWYykpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGZsb2F0IHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRmxvYXQucGFyc2VGbG9hdCh2KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHYuZXF1YWxzKCJJTkYiKSkgIHJldHVybiBGbG9hdC5QT1NJVElWRV9JTkZJTklUWTsKLSAgICAgICAgICAgIGlmICh2LmVxdWFscygiLUlORiIpKSByZXR1cm4gRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFk7Ci0gICAgICAgICAgICBpZiAodi5lcXVhbHMoIk5hTiIpKSAgcmV0dXJuIEZsb2F0Lk5hTjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJJbnZhbGlkIGZsb2F0IHZhbHVlIik7Ci0KLSAgICAgICAgICAgIHJldHVybiBGbG9hdC5OYU47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCi0gICAgewotICAgICAgICBfdmFsdWUgPSAwLjBmOwotICAgIH0KLSAgICAvLyBudW1lcmljczogZnJhY3Rpb25hbAotICAgIHB1YmxpYyBCaWdEZWNpbWFsIGJpZ0RlY2ltYWxWYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIG5ldyBCaWdEZWNpbWFsKF92YWx1ZSk7IH0KLSAgICBwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlOyB9Ci0gICAgcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWU7IH0KLQotICAgIC8vIHNldHRlcnMKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZG91YmxlKGRvdWJsZSB2KSB7IHNldF9mbG9hdCgoZmxvYXQpdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZmxvYXQoZmxvYXQgdikgeyBfdmFsdWUgPSB2OyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2xvbmcobG9uZyB2KSB7IHNldF9mbG9hdCgoZmxvYXQpdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnRGVjaW1hbChCaWdEZWNpbWFsIHYpIHsgc2V0X2Zsb2F0KHYuZmxvYXRWYWx1ZSgpKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CaWdJbnRlZ2VyKEJpZ0ludGVnZXIgdikgeyBzZXRfZmxvYXQodi5mbG9hdFZhbHVlKCkpOyB9Ci0KLSAgICAvLyBjb21wYXJhdG9ycwotICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZV90byhYbWxPYmplY3QgZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21wYXJlKF92YWx1ZSwoKFhtbE9iamVjdEJhc2UpZikuZmxvYXRWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IGNvbXBhcmUoZmxvYXQgdGhpc1ZhbHVlLCBmbG9hdCB0aGF0VmFsdWUpCi0gICAgewotICAgICAgICBpZiAodGhpc1ZhbHVlIDwgdGhhdFZhbHVlKSByZXR1cm4gLTE7Ci0gICAgICAgIGlmICh0aGlzVmFsdWUgPiB0aGF0VmFsdWUpIHJldHVybiAgMTsKLQotICAgICAgICBpbnQgdGhpc0JpdHMgPSBGbG9hdC5mbG9hdFRvSW50Qml0cyh0aGlzVmFsdWUpOwotICAgICAgICBpbnQgdGhhdEJpdHMgPSBGbG9hdC5mbG9hdFRvSW50Qml0cyh0aGF0VmFsdWUpOwotCi0gICAgICAgIHJldHVybiB0aGlzQml0cyA9PSB0aGF0Qml0cyA/IDAgOiB0aGlzQml0cyA8IHRoYXRCaXRzID8gLTEgOiAxOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCBmKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBhcmUoX3ZhbHVlLCAoKFhtbE9iamVjdEJhc2UpZikuZmxvYXRWYWx1ZSgpKSA9PSAwOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGbG9hdC5mbG9hdFRvSW50Qml0cyhfdmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFGbG9hdEhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRmxvYXRIb2xkZXJFeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODRlMThjLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFGbG9hdEhvbGRlckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhRmxvYXRIb2xkZXJFeCBleHRlbmRzIEphdmFGbG9hdEhvbGRlcgotewotICAgIHB1YmxpYyBKYXZhRmxvYXRIb2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLSAgICAKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9mbG9hdChmbG9hdCB2KQotICAgIHsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLSAgICAgICAgc3VwZXIuc2V0X2Zsb2F0KHYpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZsb2F0IHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGZsb2F0IGYgPSBKYXZhRmxvYXRIb2xkZXIudmFsaWRhdGVMZXhpY2FsKHYsIGNvbnRleHQpOwotCi0gICAgICAgIGlmICghc1R5cGUubWF0Y2hQYXR0ZXJuRmFjZXQodikpCi0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkZsb2F0ICgiICsgdiArICIpIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGY7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVZhbHVlKGZsb2F0IHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeDsKLSAgICAgICAgZmxvYXQgZjsKLQotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUpKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcGFyZSh2LCBmID0gKChYbWxPYmplY3RCYXNlKXgpLmZsb2F0VmFsdWUoKSkgPD0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJGbG9hdCAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWluIGV4Y2x1c2l2ZSBmYWNldCAoIiArIGYgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcGFyZSh2LCBmID0gKChYbWxPYmplY3RCYXNlKXgpLmZsb2F0VmFsdWUoKSkgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkZsb2F0ICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gaW5jbHVzaXZlIGZhY2V0ICgiICsgZiArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbXBhcmUodiwgZiA9ICgoWG1sT2JqZWN0QmFzZSl4KS5mbG9hdFZhbHVlKCkpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJGbG9hdCAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWF4IGluY2x1c2l2ZSBmYWNldCAoIiArIGYgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRSkpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb21wYXJlKHYsIGYgPSAoKFhtbE9iamVjdEJhc2UpeCkuZmxvYXRWYWx1ZSgpKSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkZsb2F0ICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtYXggZXhjbHVzaXZlIGZhY2V0ICgiICsgZiArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0gICAgICAgIGlmICh2YWxzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFyZSh2LCAoKFhtbE9iamVjdEJhc2UpdmFsc1tpXSkuZmxvYXRWYWx1ZSgpKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkZsb2F0ICgiICsgdiArICIpIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0ZWQgdmFsdWUgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQotICAgIHsKLSAgICAgICAgdmFsaWRhdGVMZXhpY2FsKGxleGljYWwsIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICAgICAgdmFsaWRhdGVWYWx1ZShmbG9hdFZhbHVlKCksIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFHRGF0ZUhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhR0RhdGVIb2xkZXJFeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmZlOGQyLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFHRGF0ZUhvbGRlckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlU3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUdEYXRlSG9sZGVyRXggZXh0ZW5kcyBYbWxPYmplY3RCYXNlCi17Ci0gICAgcHVibGljIEphdmFHRGF0ZUhvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgIHsKLSAgICAgICAgX3NjaGVtYVR5cGUgPSB0eXBlOwotICAgICAgICBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQotCi0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotICAgIHByaXZhdGUgR0RhdGUgX3ZhbHVlOwotCi0gICAgLy8gU0lNUExFIFZBTFVFIEFDQ0VTU09SUyBCRUxPVyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBzZXRzL2dldHMgcmF3IHRleHQgdmFsdWUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkKLSAgICAgICAgeyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyAiIiA6IF92YWx1ZS50b1N0cmluZygpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIEdEYXRlIG5ld1ZhbDsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICBuZXdWYWwgPSB2YWxpZGF0ZUxleGljYWwocywgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBuZXdWYWwgPSBsZXgocywgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotCi0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpICYmIG5ld1ZhbCAhPSBudWxsKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZShuZXdWYWwsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLQotICAgICAgICBfdmFsdWUgPSBuZXdWYWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBHRGF0ZSBsZXgoU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBHRGF0ZSBkYXRlID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBkYXRlID0gbmV3IEdEYXRlKHYpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEYXRlIHZhbHVlIGlzIG1hbGZvcm1lZDogIit2KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkYXRlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkYXRlLmdldEJ1aWx0aW5UeXBlQ29kZSgpICE9IHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkRhdGUgdmFsdWUgaXMgb2Ygd3JvbmcgdHlwZTogIiArIHYpOwotICAgICAgICAgICAgICAgIGRhdGUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIWRhdGUuaXNWYWxpZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRGF0ZSB2YWx1ZSBpcyBpbnZhbGlkOiAiICsgdik7Ci0gICAgICAgICAgICAgICAgZGF0ZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZGF0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEdEYXRlIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0KLSAgICAgICAgR0RhdGUgZGF0ZSA9IGxleCh2LCBzVHlwZSwgY29udGV4dCk7Ci0KLSAgICAgICAgaWYgKGRhdGUgIT0gbnVsbCAmJiBzVHlwZS5oYXNQYXR0ZXJuRmFjZXQoKSkKLSAgICAgICAgICAgIGlmICghc1R5cGUubWF0Y2hQYXR0ZXJuRmFjZXQodikpCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEYXRlICgnICsgdiArICcpIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGRhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlVmFsdWUoR0RhdGVTcGVjaWZpY2F0aW9uIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeDsKLSAgICAgICAgR0RhdGUgZzsKLSAgICAgICAgCi0gICAgICAgIGlmICh2LmdldEJ1aWx0aW5UeXBlQ29kZSgpICE9IHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRGF0ZSAoIiArIHYgKyAiKSBkb2VzIG5vdCBoYXZlIHRoZSBzZXQgb2YgZmllbGRzIHJlcXVpcmVkIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLQotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUpKSAhPSBudWxsKQotICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvR0RhdGUoZyA9ICgoWG1sT2JqZWN0QmFzZSl4KS5nRGF0ZVZhbHVlKCkpIDw9IDApCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEYXRlICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBtaW4gZXhjbHVzaXZlIGZhY2V0ICgiICsgZyArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpICk7Ci0gICAgICAgIAotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpKSAhPSBudWxsKQotICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvR0RhdGUoZyA9ICgoWG1sT2JqZWN0QmFzZSl4KS5nRGF0ZVZhbHVlKCkpIDwgMCkKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkRhdGUgKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuIG1pbiBpbmNsdXNpdmUgZmFjZXQgKCIgKyBnICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkgKTsKLSAgICAgICAgCi0gICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRSkpICE9IG51bGwpCi0gICAgICAgICAgICBpZiAodi5jb21wYXJlVG9HRGF0ZShnID0gKChYbWxPYmplY3RCYXNlKXgpLmdEYXRlVmFsdWUoKSkgPj0gMCkKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkRhdGUgKCIgKyB2ICsgIikgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG1heCBleGNsdXNpdmUgZmFjZXQgKCIgKyBnICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkgKTsKLSAgICAgICAgCi0gICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRSkpICE9IG51bGwpCi0gICAgICAgICAgICBpZiAodi5jb21wYXJlVG9HRGF0ZShnID0gKChYbWxPYmplY3RCYXNlKXgpLmdEYXRlVmFsdWUoKSkgPiAwKQotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRGF0ZSAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gbWF4IGluY2x1c2l2ZSBmYWNldCAoIiArIGcgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSApOwotICAgICAgICAKLSAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0gICAgICAgIGlmICh2YWxzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAodi5jb21wYXJlVG9HRGF0ZSgoKFhtbE9iamVjdEJhc2UpdmFsc1tpXSkuZ0RhdGVWYWx1ZSgpKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkRhdGUgKCIgKyB2ICsgIikgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRpb24gdmFsdWUgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCi0gICAgewotICAgICAgICBfdmFsdWUgPSBudWxsOwotICAgIH0KLQotICAgIC8vIG51bWVyaWNzOiBnWWVhciwgZ01vbnRoLCBnRGF5IGFjY2VwdCBhbiBpbnRlZ2VyCi0gICAgcHVibGljIGludCBpbnRWYWx1ZSgpCi0gICAgewotICAgICAgICBpbnQgY29kZSA9IHNjaGVtYVR5cGUoKS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCk7Ci0KLSAgICAgICAgaWYgKGNvZGUgIT0gU2NoZW1hVHlwZS5CVENfR19EQVkgJiYKLSAgICAgICAgICAgICAgICBjb2RlICE9IFNjaGVtYVR5cGUuQlRDX0dfTU9OVEggJiYKLSAgICAgICAgICAgICAgICBjb2RlICE9IFNjaGVtYVR5cGUuQlRDX0dfWUVBUikKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLQotICAgICAgICBjaGVja19kYXRlZCgpOwotCi0gICAgICAgIGlmIChfdmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKLSAgICAgICAgICAgICAgICByZXR1cm4gX3ZhbHVlLmdldERheSgpOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgotICAgICAgICAgICAgICAgIHJldHVybiBfdmFsdWUuZ2V0TW9udGgoKTsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgICAgIHJldHVybiBfdmFsdWUuZ2V0WWVhcigpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBHRGF0ZSBnRGF0ZVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGNoZWNrX2RhdGVkKCk7Ci0KLSAgICAgICAgaWYgKF92YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIF92YWx1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKQotICAgIHsKLSAgICAgICAgY2hlY2tfZGF0ZWQoKTsKLQotICAgICAgICBpZiAoX3ZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gX3ZhbHVlLmdldENhbGVuZGFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIERhdGUgZGF0ZVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGNoZWNrX2RhdGVkKCk7Ci0KLSAgICAgICAgaWYgKF92YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIF92YWx1ZS5nZXREYXRlKCk7Ci0gICAgfQotCi0gICAgLy8gc2V0dGVycwotICAgIHByb3RlY3RlZCB2b2lkIHNldF9pbnQoaW50IHYpCi0gICAgewotICAgICAgICBpbnQgY29kZSA9IHNjaGVtYVR5cGUoKS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCk7Ci0KLSAgICAgICAgaWYgKGNvZGUgIT0gU2NoZW1hVHlwZS5CVENfR19EQVkgJiYKLSAgICAgICAgICAgICAgICBjb2RlICE9IFNjaGVtYVR5cGUuQlRDX0dfTU9OVEggJiYKLSAgICAgICAgICAgICAgICBjb2RlICE9IFNjaGVtYVR5cGUuQlRDX0dfWUVBUikKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLQotICAgICAgICBHRGF0ZUJ1aWxkZXIgdmFsdWUgPSBuZXcgR0RhdGVCdWlsZGVyKCk7Ci0KLSAgICAgICAgc3dpdGNoIChjb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgotICAgICAgICAgICAgICAgIHZhbHVlLnNldERheSh2KTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICAgICAgdmFsdWUuc2V0TW9udGgodik7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6Ci0gICAgICAgICAgICAgICAgdmFsdWUuc2V0WWVhcih2KTsgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodmFsdWUsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLQotICAgICAgICBfdmFsdWUgPSB2YWx1ZS50b0dEYXRlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0dEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiB2KQotICAgIHsKLSAgICAgICAgaW50IGNvZGUgPSBzY2hlbWFUeXBlKCkuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpOwotCi0gICAgICAgIEdEYXRlIGNhbmRpZGF0ZTsKLQotICAgICAgICBpZiAodi5pc0ltbXV0YWJsZSgpICYmICh2IGluc3RhbmNlb2YgR0RhdGUpICYmIHYuZ2V0QnVpbHRpblR5cGVDb2RlKCkgPT0gY29kZSkKLSAgICAgICAgICAgIGNhbmRpZGF0ZSA9IChHRGF0ZSl2OwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHRydW5jYXRlIGV4dHJhIGZpZWxkcyBmcm9tIHRoZSBkYXRlIGlmIG5lY2Vzc2FyeS4KLSAgICAgICAgICAgIGlmICh2LmdldEJ1aWx0aW5UeXBlQ29kZSgpICE9IGNvZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgR0RhdGVCdWlsZGVyIGdEYXRlQnVpbGRlciA9IG5ldyBHRGF0ZUJ1aWxkZXIodik7Ci0gICAgICAgICAgICAgICAgZ0RhdGVCdWlsZGVyLnNldEJ1aWx0aW5UeXBlQ29kZShjb2RlKTsKLSAgICAgICAgICAgICAgICB2ID0gZ0RhdGVCdWlsZGVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FuZGlkYXRlID0gbmV3IEdEYXRlKHYpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKGNhbmRpZGF0ZSwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotCi0gICAgICAgIF92YWx1ZSA9IGNhbmRpZGF0ZTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0NhbGVuZGFyKENhbGVuZGFyIGMpCi0gICAgewotICAgICAgICBpbnQgY29kZSA9IHNjaGVtYVR5cGUoKS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCk7Ci0KLSAgICAgICAgR0RhdGVCdWlsZGVyIGdEYXRlQnVpbGRlciA9IG5ldyBHRGF0ZUJ1aWxkZXIoYyk7Ci0gICAgICAgIGdEYXRlQnVpbGRlci5zZXRCdWlsdGluVHlwZUNvZGUoY29kZSk7Ci0gICAgICAgIEdEYXRlIHZhbHVlID0gZ0RhdGVCdWlsZGVyLnRvR0RhdGUoKTsKLSAKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHZhbHVlLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0KLSAgICAgICAgX3ZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0RhdGUoRGF0ZSB2KQotICAgIHsKLSAgICAgICAgaW50IGNvZGUgPSBzY2hlbWFUeXBlKCkuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpOwotCi0gICAgICAgIGlmIChjb2RlICE9IFNjaGVtYVR5cGUuQlRDX0RBVEUgJiYgY29kZSAhPSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUUgfHwKLSAgICAgICAgICAgIHYgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLQotICAgICAgICBHRGF0ZUJ1aWxkZXIgZ0RhdGVCdWlsZGVyID0gbmV3IEdEYXRlQnVpbGRlcih2KTsKLSAgICAgICAgZ0RhdGVCdWlsZGVyLnNldEJ1aWx0aW5UeXBlQ29kZShjb2RlKTsKLSAgICAgICAgR0RhdGUgdmFsdWUgPSBnRGF0ZUJ1aWxkZXIudG9HRGF0ZSgpOwotIAotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodmFsdWUsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLQotICAgICAgICBfdmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLQotICAgIC8vIGNvbXBhcmF0b3JzCi0gICAgcHJvdGVjdGVkIGludCBjb21wYXJlX3RvKFhtbE9iamVjdCBvYmopCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlLmNvbXBhcmVUb0dEYXRlKCgoWG1sT2JqZWN0QmFzZSlvYmopLmdEYXRlVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsdWUuZXF1YWxzKCgoWG1sT2JqZWN0QmFzZSlvYmopLmdEYXRlVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZS5oYXNoQ29kZSgpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgICAgIHZhbGlkYXRlVmFsdWUoZ0RhdGVWYWx1ZSgpLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUdEdXJhdGlvbkhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhR0R1cmF0aW9uSG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI2YTE1Mi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhR0R1cmF0aW9uSG9sZGVyRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEdXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEdXJhdGlvblNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFHRHVyYXRpb25Ib2xkZXJFeCBleHRlbmRzIFhtbE9iamVjdEJhc2UKLXsKLSAgICBwdWJsaWMgSmF2YUdEdXJhdGlvbkhvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IF9zY2hlbWFUeXBlID0gdHlwZTsgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsgfQotCi0gICAgR0R1cmF0aW9uIF92YWx1ZTsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgR0R1cmF0aW9uIG5ld1ZhbDsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgICAgICBuZXdWYWwgPSB2YWxpZGF0ZUxleGljYWwocywgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBuZXdWYWwgPSBsZXgocywgX3Zvb3JWYyk7Ci0KLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkgJiYgbmV3VmFsICE9IG51bGwpCi0gICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKG5ld1ZhbCwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotCi0gICAgICAgIF92YWx1ZSA9IG5ld1ZhbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfR0R1cmF0aW9uKEdEdXJhdGlvblNwZWNpZmljYXRpb24gdikKLSAgICB7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0gICAgICAgIAotICAgICAgICBpZiAodi5pc0ltbXV0YWJsZSgpICYmICh2IGluc3RhbmNlb2YgR0R1cmF0aW9uKSkKLSAgICAgICAgICAgIF92YWx1ZSA9IChHRHVyYXRpb24pdjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgX3ZhbHVlID0gbmV3IEdEdXJhdGlvbih2KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkKLSAgICAgICAgeyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyAiIiA6IF92YWx1ZS50b1N0cmluZygpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbmlsKCkKLSAgICB7Ci0gICAgICAgIF92YWx1ZSA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEdEdXJhdGlvbiBnRHVyYXRpb25WYWx1ZSgpCi0gICAgewotICAgICAgICBjaGVja19kYXRlZCgpOwotCi0gICAgICAgIHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IG51bGwgOiBfdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBHRHVyYXRpb24gbGV4KFN0cmluZyB2LCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgR0R1cmF0aW9uIGR1cmF0aW9uID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBkdXJhdGlvbiA9IG5ldyBHRHVyYXRpb24odik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkR1cmF0aW9uIHZhbHVlIGlzIG1hbGZvcm1lZDogIit2KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkdXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEdEdXJhdGlvbiB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBHRHVyYXRpb24gZHVyYXRpb24gPSBsZXgodiwgY29udGV4dCk7Ci0KLSAgICAgICAgaWYgKGR1cmF0aW9uICE9IG51bGwgJiYgc1R5cGUuaGFzUGF0dGVybkZhY2V0KCkpCi0gICAgICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRHVyYXRpb24gKCIgKyB2ICsgIikgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZHVyYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlVmFsdWUoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHg7Ci0gICAgICAgIEdEdXJhdGlvbiBnOwotICAgICAgICAKLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFKSkgIT0gbnVsbCkKLSAgICAgICAgICAgIGlmICh2LmNvbXBhcmVUb0dEdXJhdGlvbihnID0gKChYbWxPYmplY3RCYXNlKXgpLmdEdXJhdGlvblZhbHVlKCkpIDw9IDApCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEdXJhdGlvbiAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbWluIGV4Y2x1c2l2ZSBmYWNldCAoIiArIGcgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSApOwotICAgICAgICAKLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFKSkgIT0gbnVsbCkKLSAgICAgICAgICAgIGlmICh2LmNvbXBhcmVUb0dEdXJhdGlvbihnID0gKChYbWxPYmplY3RCYXNlKXgpLmdEdXJhdGlvblZhbHVlKCkpIDwgMCkKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkR1cmF0aW9uICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiBtaW4gaW5jbHVzaXZlIGZhY2V0ICgiICsgZyArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpICk7Ci0gICAgICAgIAotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpKSAhPSBudWxsKQotICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvR0R1cmF0aW9uKGcgPSAoKFhtbE9iamVjdEJhc2UpeCkuZ0R1cmF0aW9uVmFsdWUoKSkgPj0gMCkKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkR1cmF0aW9uICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBtYXggZXhjbHVzaXZlIGZhY2V0ICgiICsgZyArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpICk7Ci0gICAgICAgIAotICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkUpKSAhPSBudWxsKQotICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvR0R1cmF0aW9uKGcgPSAoKFhtbE9iamVjdEJhc2UpeCkuZ0R1cmF0aW9uVmFsdWUoKSkgPiAwKQotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRHVyYXRpb24gKCIgKyB2ICsgIikgaXMgZ3JlYXRlciB0aGFuIG1heCBpbmNsdXNpdmUgZmFjZXQgKCIgKyBnICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkgKTsKLSAgICAgICAgCi0gICAgICAgIFhtbE9iamVjdFtdIHZhbHMgPSBzVHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOwotICAgICAgICBpZiAodmFscyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvR0R1cmF0aW9uKCgoWG1sT2JqZWN0QmFzZSl2YWxzW2ldKS5nRHVyYXRpb25WYWx1ZSgpKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkR1cmF0aW9uICgiICsgdiArICIpIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0aW9uIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVfdG8oWG1sT2JqZWN0IGQpCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlLmNvbXBhcmVUb0dEdXJhdGlvbigoKFhtbE9iamVjdEJhc2UpIGQpLmdEdXJhdGlvblZhbHVlKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCBkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZS5lcXVhbHMoKChYbWxPYmplY3RCYXNlKSBkKS5nRHVyYXRpb25WYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IHZhbHVlX2hhc2hfY29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlLmhhc2hDb2RlKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQotICAgIHsKLSAgICAgICAgdmFsaWRhdGVMZXhpY2FsKGxleGljYWwsIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICAgICAgdmFsaWRhdGVWYWx1ZShnRHVyYXRpb25WYWx1ZSgpLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUhleEJpbmFyeUhvbGRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUhleEJpbmFyeUhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWRiZmY3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFIZXhCaW5hcnlIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnV0aWwuSGV4QmluOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSGV4QmluYXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhSGV4QmluYXJ5SG9sZGVyIGV4dGVuZHMgWG1sT2JqZWN0QmFzZQotewotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9IRVhfQklOQVJZOyB9Ci0KLSAgICBwcm90ZWN0ZWQgYnl0ZVtdIF92YWx1ZTsKLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gZ2V0cyByYXcgdGV4dCB2YWx1ZQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoSGV4QmluLmVuY29kZShfdmFsdWUpKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBfaGFzaGNhY2hlZCA9IGZhbHNlOwotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIF92YWx1ZSA9IHZhbGlkYXRlTGV4aWNhbChzLCBzY2hlbWFUeXBlKCksIF92b29yVmMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBfdmFsdWUgPSBsZXgocywgX3Zvb3JWYyk7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQotICAgIHsKLSAgICAgICAgX2hhc2hjYWNoZWQgPSBmYWxzZTsKLSAgICAgICAgX3ZhbHVlID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBsZXgoU3RyaW5nIHYsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBieXRlW10gdkJ5dGVzID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHZCeXRlcyA9IHYuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4gLSBVVEYtOCBpcyBhbHdheXMgc3VwcG9ydGVkCi0gICAgICAgIH0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gSGV4QmluLmRlY29kZSh2Qnl0ZXMpOwotCi0gICAgICAgIGlmIChieXRlcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPIC0gZ2V0IGEgZGVjZW50IGVycm9yIHdpdGggbGluZSBudW1iZXJzIGFuZCBzdWNoIGhlcmUKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSGV4IGVuY29kZWQgZGF0YSBub3QgZW5jb2RlZCBwcm9wZXJseSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ5dGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGJ5dGVbXSBieXRlcyA9IGxleCh2LCBjb250ZXh0KTsKLQotICAgICAgICBpZiAoYnl0ZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKCFzVHlwZS5tYXRjaFBhdHRlcm5GYWNldCh2KSkKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCAiSGV4IGVuY29kZWQgZGF0YSBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ5dGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gYnl0ZUFycmF5VmFsdWUoKQotICAgIHsKLSAgICAgICAgY2hlY2tfZGF0ZWQoKTsKLSAgICAgICAgaWYgKF92YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW192YWx1ZS5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF92YWx1ZSwgMCwgcmVzdWx0LCAwLCBfdmFsdWUubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0J5dGVBcnJheShieXRlW10gYmEpCi0gICAgewotICAgICAgICBfaGFzaGNhY2hlZCA9IGZhbHNlOwotICAgICAgICBfdmFsdWUgPSBuZXcgYnl0ZVtiYS5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJhLCAwLCBfdmFsdWUsIDAsIGJhLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgLy8gY29tcGFyYXRvcnMKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgaSkKLSAgICB7Ci0gICAgICAgIGJ5dGVbXSBpdmFsID0gKChYbWxIZXhCaW5hcnkpIGkpLmdldEJ5dGVBcnJheVZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBBcnJheXMuZXF1YWxzKF92YWx1ZSwgaXZhbCk7Ci0gICAgfQotCi0gICAgLy9iZWNhdXNlIGNvbXB1dGluZyBoYXNoY29kZSBpcyBleHBlbnNpdmUgd2UnbGwgY2FjaGUgaXQKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfaGFzaGNhY2hlZCA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBpbnQgaGFzaGNvZGUgPSAwOwotICAgIHByb3RlY3RlZCBzdGF0aWMgTWVzc2FnZURpZ2VzdCBtZDU7Ci0gICAgc3RhdGljCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbWQ1ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgTUQ1IGhhc2ggQWxnb3JpdGhtIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IHZhbHVlX2hhc2hfY29kZSgpCi0gICAgewotICAgICAgICBpZiggX2hhc2hjYWNoZWQgKQotICAgICAgICAgICAgcmV0dXJuIGhhc2hjb2RlOwotCi0gICAgICAgIF9oYXNoY2FjaGVkID0gdHJ1ZTsKLQotICAgICAgICBpZiggX3ZhbHVlID09IG51bGwgKQotICAgICAgICAgICAgcmV0dXJuIGhhc2hjb2RlID0gMDsKLQotICAgICAgICBieXRlW10gcmVzID0gbWQ1LmRpZ2VzdChfdmFsdWUpOwotICAgICAgICByZXR1cm4gaGFzaGNvZGUgPSByZXNbMF08PDI0ICsgcmVzWzFdPDwxNiArIHJlc1syXTw8OCArIHJlc1szXTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFIZXhCaW5hcnlIb2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUhleEJpbmFyeUhvbGRlckV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MGNhOWIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUhleEJpbmFyeUhvbGRlckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFIZXhCaW5hcnlIb2xkZXJFeCBleHRlbmRzIEphdmFIZXhCaW5hcnlIb2xkZXIKLXsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQotCi0gICAgcHVibGljIEphdmFIZXhCaW5hcnlIb2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLQotICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gc2NoZW1hVHlwZSgpLmdldFdoaXRlU3BhY2VSdWxlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBieXRlW10gdjsKLQotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHYgPSB2YWxpZGF0ZUxleGljYWwocywgc2NoZW1hVHlwZSgpLCBfdm9vclZjKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdiA9IGxleChzLCBfdm9vclZjKTsKLQotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSAmJiB2ICE9IG51bGwpCi0gICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIHNjaGVtYVR5cGUoKSwgWG1sT2JqZWN0QmFzZS5fdm9vclZjKTsKLSAgICAgICAgCi0gICAgICAgIHN1cGVyLnNldF9CeXRlQXJyYXkodik7Ci0KLSAgICAgICAgX3ZhbHVlID0gdjsKLSAgICB9Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0J5dGVBcnJheShieXRlW10gdikKLSAgICB7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBzY2hlbWFUeXBlKCksIF92b29yVmMpOwotICAgICAgICAKLSAgICAgICAgc3VwZXIuc2V0X0J5dGVBcnJheSh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVWYWx1ZShieXRlW10gdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBYbWxPYmplY3QgbzsKLQotICAgICAgICBpZiAoKG8gPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSCkpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoaSA9ICgoWG1sT2JqZWN0QmFzZSlvKS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpKSAhPSB2Lmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJIZXggZW5jb2RlZCBkYXRhIGRvZXMgbm90IGhhdmUgIiArIGkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBwZXIgbGVuZ3RoIGZhY2V0IiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChvID0gc1R5cGUuZ2V0RmFjZXQoIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSCApKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGkgPSAoKFhtbE9iamVjdEJhc2UpbykuYmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKSkgPiB2Lmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJIZXggZW5jb2RlZCBkYXRhIGhhcyBvbmx5ICIgKyB2Lmxlbmd0aCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzLCBmZXdlciB0aGFuIG1pbiBsZW5ndGggZmFjZXQiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKG8gPSBzVHlwZS5nZXRGYWNldCggU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIICkpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoaSA9ICgoWG1sT2JqZWN0QmFzZSlvKS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpKSA8IHYubGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkhleCBlbmNvZGVkIGRhdGEgaGFzICIgKyB2Lmxlbmd0aCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzLCBtb3JlIHRoYW4gbWF4IGxlbmd0aCBmYWNldCIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0KLSAgICAgICAgaWYgKHZhbHMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZW51bUxvb3A6IGZvciAoIGkgPSAwIDsgaSA8IHZhbHMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBieXRlW10gZW51bUJ5dGVzID0gKChYbWxPYmplY3RCYXNlKXZhbHNbaV0pLmJ5dGVBcnJheVZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZW51bUJ5dGVzLmxlbmd0aCAhPSB2Lmxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaiA9IDAgOyBqIDwgZW51bUJ5dGVzLmxlbmd0aCA7IGorKyApCi0gICAgICAgICAgICAgICAgICAgIGlmIChlbnVtQnl0ZXNbal0gIT0gdltqXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIGVudW1Mb29wOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaSA+PSB2YWxzLmxlbmd0aCkKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkhleCBlbmNvZGVkIGRhdGEgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSBlbnVtZXJhdGlvbiB2YWx1ZXMiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQotICAgIHsKLSAgICAgICAgdmFsaWRhdGVMZXhpY2FsKGxleGljYWwsIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICAgICAgdmFsaWRhdGVWYWx1ZShieXRlQXJyYXlWYWx1ZSgpLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUludEhvbGRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUludEhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTE3Y2JkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFJbnRIb2xkZXIgZXh0ZW5kcyBYbWxPYmplY3RCYXNlCi17Ci0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0lOVDsgfQotCi0gICAgcHJpdmF0ZSBpbnQgX3ZhbHVlOwotCi0gICAgLy8gU0lNUExFIFZBTFVFIEFDQ0VTU09SUyBCRUxPVyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBnZXRzIHJhdyB0ZXh0IHZhbHVlCi0gICAgcHVibGljIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pIHsgcmV0dXJuIExvbmcudG9TdHJpbmcoX3ZhbHVlKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgdHJ5IHsgc2V0X2ludChJbnRlZ2VyLnBhcnNlSW50KHMpKTsgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQotICAgIHsKLSAgICAgICAgX3ZhbHVlID0gMDsKLSAgICB9Ci0gICAgLy8gbnVtZXJpY3M6IGZyYWN0aW9uYWwKLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBuZXcgQmlnRGVjaW1hbChfdmFsdWUpOyB9Ci0gICAgcHVibGljIEJpZ0ludGVnZXIgYmlnSW50ZWdlclZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gQmlnSW50ZWdlci52YWx1ZU9mKF92YWx1ZSk7IH0KLSAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWU7IH0KLSAgICBwdWJsaWMgaW50IGludFZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlOyB9Ci0KLSAgICBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBfbWF4ID0gQmlnSW50ZWdlci52YWx1ZU9mKEludGVnZXIuTUFYX1ZBTFVFKTsKLSAgICBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBfbWluID0gQmlnSW50ZWdlci52YWx1ZU9mKEludGVnZXIuTUlOX1ZBTFVFKTsKLQotICAgIC8vIHNldHRlcnMKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnRGVjaW1hbChCaWdEZWNpbWFsIHYpIHsgc2V0X0JpZ0ludGVnZXIodi50b0JpZ0ludGVnZXIoKSk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnSW50ZWdlcihCaWdJbnRlZ2VyIHYpCi0gICAgewotICAgICAgICBpZiAodi5jb21wYXJlVG8oX21heCkgPiAwIHx8IHYuY29tcGFyZVRvKF9taW4pIDwgMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgc2V0X2ludCh2LmludFZhbHVlKCkpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbG9uZyhsb25nIGwpCi0gICAgewotICAgICAgICBpZiAobCA+IEludGVnZXIuTUFYX1ZBTFVFIHx8IGwgPCBJbnRlZ2VyLk1JTl9WQUxVRSkKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgc2V0X2ludCgoaW50KWwpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfaW50KGludCBpKQotICAgIHsKLSAgICAgICAgX3ZhbHVlID0gaTsKLSAgICB9Ci0KLSAgICAvLyBjb21wYXJhdG9ycwotICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZV90byhYbWxPYmplY3QgaSkKLSAgICB7Ci0gICAgICAgIGlmICgoKFNpbXBsZVZhbHVlKWkpLmluc3RhbmNlVHlwZSgpLmdldERlY2ltYWxTaXplKCkgPiBTY2hlbWFUeXBlLlNJWkVfSU5UKQotICAgICAgICAgICAgcmV0dXJuIC1pLmNvbXBhcmVUbyh0aGlzKTsKLQotICAgICAgICByZXR1cm4gX3ZhbHVlID09ICgoWG1sT2JqZWN0QmFzZSlpKS5pbnRWYWx1ZSgpID8gMCA6Ci0gICAgICAgICAgICAgICBfdmFsdWUgPCAoKFhtbE9iamVjdEJhc2UpaSkuaW50VmFsdWUoKSA/IC0xIDogMTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgaSkKLSAgICB7Ci0gICAgICAgIGlmICgoKFNpbXBsZVZhbHVlKWkpLmluc3RhbmNlVHlwZSgpLmdldERlY2ltYWxTaXplKCkgPiBTY2hlbWFUeXBlLlNJWkVfSU5UKQotICAgICAgICAgICAgcmV0dXJuIGkudmFsdWVFcXVhbHModGhpcyk7Ci0KLSAgICAgICAgcmV0dXJuIF92YWx1ZSA9PSAoKFhtbE9iamVjdEJhc2UpaSkuaW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RlLCB0aGlzIGlzIGNhcmVmdWxseSBhbGlnbmVkIHdpdGggaGFzaCBjb2RlcyBmb3IgYWxsIHhzZDpkZWNpbWFsCi0gICAgICogcHJpbWl0aXZlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IHZhbHVlX2hhc2hfY29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRIb2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUludEhvbGRlckV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzY2NiYWYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUludEhvbGRlckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFJbnRIb2xkZXJFeCBleHRlbmRzIEphdmFJbnRIb2xkZXIKLXsKLSAgICBwdWJsaWMgSmF2YUludEhvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IF9zY2hlbWFUeXBlID0gdHlwZTsgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsgfQotICAgICAgICAKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBpbnQgdjsKLQotICAgICAgICB0cnkgeyB2ID0gSW50ZWdlci5wYXJzZUludChzKTsgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0gICAgICAgIAotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0gICAgICAgICAgICB2YWxpZGF0ZUxleGljYWwocywgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIuc2V0X2ludCh2KTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2ludChpbnQgdikKLSAgICB7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0KLSAgICAgICAgc3VwZXIuc2V0X2ludCh2KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIEphdmFEZWNpbWFsSG9sZGVyLnZhbGlkYXRlTGV4aWNhbCh2LCBjb250ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIC8vIGNoZWNrIHBhdHRlcm4KLSAgICAgICAgaWYgKHNUeXBlLmhhc1BhdHRlcm5GYWNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSW50ZWdlciAoIiArIHYgKyAiKSBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlVmFsdWUoaW50IHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICAvLyB0b3RhbCBkaWdpdHMKLSAgICAgICAgWG1sT2JqZWN0IHRkID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9UT1RBTF9ESUdJVFMpOwotICAgICAgICBpZiAodGQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHRlbXAgPSBJbnRlZ2VyLnRvU3RyaW5nKHYpOwotICAgICAgICAgICAgaW50IGxlbiA9IHRlbXAubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuID4gMCAmJiB0ZW1wLmNoYXJBdCgwKSA9PSAnLScpCi0gICAgICAgICAgICAgICAgbGVuIC09IDE7Ci0gICAgICAgICAgICBpbnQgbSA9IGdldEludFZhbHVlKHRkKTsKLSAgICAgICAgICAgIGlmIChsZW4gPiBtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgdG90YWwgZGlnaXRzICgiICsgdGVtcCArICIpIGlzIGdyZWF0ZXIgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbCBkaWdpdHMgZmFjZXQgKCIgKyBnZXRJbnRWYWx1ZSh0ZCkgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWluIGV4Ci0gICAgICAgIFhtbE9iamVjdCBtaW5lID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFKTsKLSAgICAgICAgaWYgKG1pbmUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG0gPSBnZXRJbnRWYWx1ZShtaW5lKTsKLSAgICAgICAgICAgIGlmICghKHYgPiBtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gZXhjbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtaW4gaW4KLSAgICAgICAgWG1sT2JqZWN0IG1pbmkgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpOwotICAgICAgICBpZiAobWluaSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbSA9IGdldEludFZhbHVlKG1pbmkpOwotICAgICAgICAgICAgaWYgKCEodiA+PSBtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gaW5jbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYXggaW4KLSAgICAgICAgWG1sT2JqZWN0IG1heGkgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkUpOwotICAgICAgICBpZiAobWF4aSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbSA9IGdldEludFZhbHVlKG1heGkpOwotICAgICAgICAgICAgaWYgKCEodiA8PSBtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtYXggaW5jbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYXggZXgKLSAgICAgICAgWG1sT2JqZWN0IG1heGUgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpOwotICAgICAgICBpZiAobWF4ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbSA9IGdldEludFZhbHVlKG1heGUpOwotICAgICAgICAgICAgaWYgKCEodiA8IG0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgKCIgKyB2ICsgIikgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBleGNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGVudW1lcmF0aW9uCi0gICAgICAgIFhtbE9iamVjdFtdIHZhbHMgPSBzVHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOwotICAgICAgICBpZiAodmFscyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHYgPT0gZ2V0SW50VmFsdWUodmFsc1tpXSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSW50ZWdlciAoIiArIHYgKyAiKSBkb2VzIG5vdCBtYXRjaCBhbnkgZW51bWVyYXRpb24gdmFsdWVzIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRJbnRWYWx1ZShYbWxPYmplY3QgbykgewotICAgICAgICBTY2hlbWFUeXBlIHMgPSBvLnNjaGVtYVR5cGUoKTsKLSAgICAgICAgc3dpdGNoIChzLmdldERlY2ltYWxTaXplKCkpIAotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfREVDSU1BTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0RlY2ltYWxWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9MT05HOgotICAgICAgICAgICAgICAgIHJldHVybiAoaW50KSgoWG1sT2JqZWN0QmFzZSlvKS5sb25nVmFsdWUoKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoWG1sT2JqZWN0QmFzZSlvKS5pbnRWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgICAgIHZhbGlkYXRlVmFsdWUoaW50VmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgIH0KLSAgICAKLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUludGVnZXJIb2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRlZ2VySG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNGY4MDYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUludGVnZXJIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUludGVnZXJIb2xkZXIgZXh0ZW5kcyBYbWxPYmplY3RCYXNlCi17Ci0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0lOVEVHRVI7IH0KLQotICAgIHByaXZhdGUgQmlnSW50ZWdlciBfdmFsdWU7Ci0KLSAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIGdldHMvc2V0cyByYXcgdGV4dCB2YWx1ZQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKSB7IHJldHVybiBfdmFsdWUudG9TdHJpbmcoKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgc2V0X0JpZ0ludGVnZXIobGV4KHMsIF92b29yVmMpKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBCaWdJbnRlZ2VyIGxleChTdHJpbmcgcywgVmFsaWRhdGlvbkNvbnRleHQgdmMpIAotICAgIHsKLSAgICAgICAgaWYgKHMubGVuZ3RoKCkgPiAwICYmIHMuY2hhckF0KCAwICkgPT0gJysnICkKLSAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygxKTsKLQotICAgICAgICB0cnkgeyByZXR1cm4gbmV3IEJpZ0ludGVnZXIocyk7IH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IHZjLmludmFsaWQoIk5vdCBhIHZhbGlkIGludGVnZXI6ICIgKyBzKTsgcmV0dXJuIG51bGw7IH0KLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCi0gICAgewotICAgICAgICBfdmFsdWUgPSBudWxsOwotICAgIH0KLSAgICAvLyBudW1lcmljczogZnJhY3Rpb25hbAotICAgIHB1YmxpYyBCaWdEZWNpbWFsIGJpZ0RlY2ltYWxWYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gbnVsbCA6IG5ldyBCaWdEZWNpbWFsKF92YWx1ZSk7IH0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBiaWdJbnRlZ2VyVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWU7IH0KLQotICAgIC8vIHNldHRlcnMKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnRGVjaW1hbChCaWdEZWNpbWFsIHYpIHsgX3ZhbHVlID0gdi50b0JpZ0ludGVnZXIoKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CaWdJbnRlZ2VyKEJpZ0ludGVnZXIgdikgeyBfdmFsdWUgPSB2OyB9Ci0KLSAgICAvLyBjb21wYXJhdG9ycwotICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZV90byhYbWxPYmplY3QgaSkKLSAgICB7Ci0gICAgICAgIGlmICgoKFNpbXBsZVZhbHVlKWkpLmluc3RhbmNlVHlwZSgpLmdldERlY2ltYWxTaXplKCkgPiBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVIpCi0gICAgICAgICAgICByZXR1cm4gLWkuY29tcGFyZVRvKHRoaXMpOwotCi0gICAgICAgIHJldHVybiBfdmFsdWUuY29tcGFyZVRvKCgoWG1sT2JqZWN0QmFzZSlpKS5iaWdJbnRlZ2VyVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IGkpCi0gICAgewotICAgICAgICBpZiAoKChTaW1wbGVWYWx1ZSlpKS5pbnN0YW5jZVR5cGUoKS5nZXREZWNpbWFsU2l6ZSgpID4gU2NoZW1hVHlwZS5TSVpFX0JJR19JTlRFR0VSKQotICAgICAgICAgICAgcmV0dXJuIGkudmFsdWVFcXVhbHModGhpcyk7Ci0KLSAgICAgICAgcmV0dXJuIF92YWx1ZS5lcXVhbHMoKChYbWxPYmplY3RCYXNlKWkpLmJpZ0ludGVnZXJWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBCaWdJbnRlZ2VyIF9tYXhsb25nID0gQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUFYX1ZBTFVFKTsKLSAgICBzdGF0aWMgcHJpdmF0ZSBCaWdJbnRlZ2VyIF9taW5sb25nID0gQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUlOX1ZBTFVFKTsKLQotICAgIC8qKgotICAgICAqIE5vdGUsIHRoaXMgaXMgY2FyZWZ1bGx5IGFsaWduZWQgd2l0aCBoYXNoIGNvZGVzIGZvciBhbGwgeHNkOmRlY2ltYWwKLSAgICAgKiBwcmltaXRpdmVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIGlmIChfdmFsdWUuY29tcGFyZVRvKF9tYXhsb25nKSA+IDAgfHwKLSAgICAgICAgICAgIF92YWx1ZS5jb21wYXJlVG8oX21pbmxvbmcpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBfdmFsdWUuaGFzaENvZGUoKTsKLQotICAgICAgICBsb25nIGxvbmd2YWwgPSBfdmFsdWUubG9uZ1ZhbHVlKCk7Ci0KLSAgICAgICAgcmV0dXJuIChpbnQpKChsb25ndmFsID4+IDMyKSAqIDE5ICsgbG9uZ3ZhbCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUludGVnZXJIb2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUludGVnZXJIb2xkZXJFeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmUyZTI1Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRlZ2VySG9sZGVyRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhSW50ZWdlckhvbGRlckV4IGV4dGVuZHMgSmF2YUludGVnZXJIb2xkZXIKLXsKLSAgICBwdWJsaWMgSmF2YUludGVnZXJIb2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLSAgICAKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBCaWdJbnRlZ2VyIHYgPSBsZXgocywgX3Zvb3JWYyk7Ci0gICAgICAgIAotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgIAotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlTGV4aWNhbChzLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0KLSAgICAgICAgc3VwZXIuc2V0X0JpZ0ludGVnZXIodik7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CaWdJbnRlZ2VyKEJpZ0ludGVnZXIgdikKLSAgICB7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0KLSAgICAgICAgc3VwZXIuc2V0X0JpZ0ludGVnZXIodik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBKYXZhRGVjaW1hbEhvbGRlci52YWxpZGF0ZUxleGljYWwodiwgY29udGV4dCk7Ci0gICAgICAgIAotICAgICAgICAvLyBjaGVjayBwYXR0ZXJuCi0gICAgICAgIGlmIChzVHlwZS5oYXNQYXR0ZXJuRmFjZXQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzVHlwZS5tYXRjaFBhdHRlcm5GYWNldCh2KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkludGVnZXIgKCIgKyB2ICsgIikgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlVmFsdWUoQmlnSW50ZWdlciB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgLy8gdG90YWwgZGlnaXRzCi0gICAgICAgIFhtbEludCB0ZCA9IChYbWxJbnQpc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9UT1RBTF9ESUdJVFMpOwotICAgICAgICBpZiAodGQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHRlbXAgPSB2LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpbnQgbGVuID0gdGVtcC5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChsZW4gPiAwICYmIHRlbXAuY2hhckF0KDApID09ICctJykKLSAgICAgICAgICAgICAgICBsZW4gLT0gMTsKLSAgICAgICAgICAgIGlmIChsZW4gPiB0ZC5nZXRJbnRWYWx1ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgdG90YWwgZGlnaXRzICgiICsgdGVtcCArICIpIGlzIGdyZWF0ZXIgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbCBkaWdpdHMgZmFjZXQgKCIgKyB0ZC5nZXRJbnRWYWx1ZSgpICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1pbiBleAotICAgICAgICBYbWxPYmplY3QgbWluZSA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRSk7Ci0gICAgICAgIGlmIChtaW5lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbSA9IGdldEJpZ0ludGVnZXJWYWx1ZShtaW5lKTsKLSAgICAgICAgICAgIGlmICghKHYuY29tcGFyZVRvKG0pID4gMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiSW50ZWdlciAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWluIGV4Y2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWluIGluCi0gICAgICAgIFhtbE9iamVjdCBtaW5pID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFKTsKLSAgICAgICAgaWYgKG1pbmkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQmlnSW50ZWdlciBtID0gZ2V0QmlnSW50ZWdlclZhbHVlKG1pbmkpOwotICAgICAgICAgICAgaWYgKCEodi5jb21wYXJlVG8obSkgPj0gMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiSW50ZWdlciAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWluIGluY2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWF4IGluCi0gICAgICAgIFhtbE9iamVjdCBtYXhpID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFKTsKLSAgICAgICAgaWYgKG1heGkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQmlnSW50ZWdlciBtID0gZ2V0QmlnSW50ZWdlclZhbHVlKG1heGkpOwotICAgICAgICAgICAgaWYgKCEodi5jb21wYXJlVG8obSkgPD0gMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiSW50ZWdlciAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWF4IGluY2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWF4IGV4Ci0gICAgICAgIFhtbE9iamVjdCBtYXhlID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFKTsKLSAgICAgICAgaWYgKG1heGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQmlnSW50ZWdlciBtID0gZ2V0QmlnSW50ZWdlclZhbHVlKG1heGUpOwotICAgICAgICAgICAgaWYgKCEodi5jb21wYXJlVG8obSkgPCAwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtYXggZXhjbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBlbnVtZXJhdGlvbgotICAgICAgICBYbWxPYmplY3RbXSB2YWxzID0gc1R5cGUuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKTsKLSAgICAgICAgaWYgKHZhbHMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2LmVxdWFscyhnZXRCaWdJbnRlZ2VyVmFsdWUodmFsc1tpXSkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkludGVnZXIgKCIgKyB2ICsgIikgZG9lcyBub3QgbWF0Y2ggYW55IGVudW1lcmF0aW9uIHZhbHVlcyBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBCaWdJbnRlZ2VyIGdldEJpZ0ludGVnZXJWYWx1ZShYbWxPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGUgcyA9IG8uc2NoZW1hVHlwZSgpOwotICAgICAgICBzd2l0Y2ggKHMuZ2V0RGVjaW1hbFNpemUoKSkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0JJR19ERUNJTUFMOgotICAgICAgICAgICAgICAgIHJldHVybiAoKFhtbE9iamVjdEJhc2UpbykuYmlnRGVjaW1hbFZhbHVlKCkudG9CaWdJbnRlZ2VyKCk7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0ludGVnZXJWYWx1ZSgpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJCYWQgZmFjZXQgdHlwZSBmb3IgQmlnIEludDogIiArIHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCi0gICAgewotICAgICAgICB2YWxpZGF0ZUxleGljYWwobGV4aWNhbCwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgICAgICB2YWxpZGF0ZVZhbHVlKGJpZ0ludGVnZXJWYWx1ZSgpLCBzY2hlbWFUeXBlKCksIGN0eCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUxvbmdIb2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFMb25nSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzFlNDcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUxvbmdIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFMb25nSG9sZGVyIGV4dGVuZHMgWG1sT2JqZWN0QmFzZQotewotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9MT05HOyB9Ci0KLSAgICBwcml2YXRlIGxvbmcgX3ZhbHVlOwotCi0gICAgLy8gU0lNUExFIFZBTFVFIEFDQ0VTU09SUyBCRUxPVyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBnZXRzIHJhdyB0ZXh0IHZhbHVlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pIHsgcmV0dXJuIExvbmcudG9TdHJpbmcoX3ZhbHVlKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgdHJ5IHsgc2V0X2xvbmcoTG9uZy5wYXJzZUxvbmcocykpOyB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCi0gICAgewotICAgICAgICBfdmFsdWUgPSAwTDsKLSAgICB9Ci0KLSAgICAvLyBudW1lcmljczogZnJhY3Rpb25hbAotICAgIHB1YmxpYyBCaWdEZWNpbWFsIGJpZ0RlY2ltYWxWYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIEJpZ0RlY2ltYWwudmFsdWVPZihfdmFsdWUpOyB9Ci0gICAgcHVibGljIEJpZ0ludGVnZXIgYmlnSW50ZWdlclZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gQmlnSW50ZWdlci52YWx1ZU9mKF92YWx1ZSk7IH0KLSAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWU7IH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgX21heCA9IEJpZ0ludGVnZXIudmFsdWVPZihMb25nLk1BWF9WQUxVRSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBfbWluID0gQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUlOX1ZBTFVFKTsKLQotICAgIC8vIHNldHRlcnMKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnRGVjaW1hbChCaWdEZWNpbWFsIHYpIHsgc2V0X0JpZ0ludGVnZXIodi50b0JpZ0ludGVnZXIoKSk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnSW50ZWdlcihCaWdJbnRlZ2VyIHYpCi0gICAgewotICAgICAgICBpZiAodi5jb21wYXJlVG8oX21heCkgPiAwIHx8IHYuY29tcGFyZVRvKF9taW4pIDwgMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgX3ZhbHVlID0gdi5sb25nVmFsdWUoKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2xvbmcobG9uZyBsKSB7IF92YWx1ZSA9IGw7IH0KLQotICAgIC8vIGNvbXBhcmF0b3JzCi0gICAgcHJvdGVjdGVkIGludCBjb21wYXJlX3RvKFhtbE9iamVjdCBsKQotICAgIHsKLSAgICAgICAgaWYgKCgoU2ltcGxlVmFsdWUpbCkuaW5zdGFuY2VUeXBlKCkuZ2V0RGVjaW1hbFNpemUoKSA+IFNjaGVtYVR5cGUuU0laRV9MT05HKQotICAgICAgICAgICAgcmV0dXJuIC1sLmNvbXBhcmVUbyh0aGlzKTsKLQotICAgICAgICByZXR1cm4gX3ZhbHVlID09ICgoWG1sT2JqZWN0QmFzZSlsKS5sb25nVmFsdWUoKSA/IDAgOgotICAgICAgICAgICAgICAgX3ZhbHVlIDwgKChYbWxPYmplY3RCYXNlKWwpLmxvbmdWYWx1ZSgpID8gLTEgOiAxOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCBsKQotICAgIHsKLSAgICAgICAgaWYgKCgoU2ltcGxlVmFsdWUpbCkuaW5zdGFuY2VUeXBlKCkuZ2V0RGVjaW1hbFNpemUoKSA+IFNjaGVtYVR5cGUuU0laRV9MT05HKQotICAgICAgICAgICAgcmV0dXJuIGwudmFsdWVFcXVhbHModGhpcyk7Ci0KLSAgICAgICAgcmV0dXJuIF92YWx1ZSA9PSAoKFhtbE9iamVjdEJhc2UpbCkubG9uZ1ZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90ZSwgdGhpcyBpcyBjYXJlZnVsbHkgYWxpZ25lZCB3aXRoIGhhc2ggY29kZXMgZm9yIGFsbCB4c2Q6ZGVjaW1hbAotICAgICAqIHByaW1pdGl2ZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChpbnQpKChfdmFsdWUgPj4gMzIpICogMTkgKyBfdmFsdWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUxvbmdIb2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUxvbmdIb2xkZXJFeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzQ5ZGQxLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFMb25nSG9sZGVyRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUxvbmdIb2xkZXJFeCBleHRlbmRzIEphdmFMb25nSG9sZGVyCi17Ci0gICAgcHVibGljIEphdmFMb25nSG9sZGVyRXgoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0gICAgICAgIAotICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKLQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9zY2hlbWFUeXBlOyB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIGxvbmcgdjsKLQotICAgICAgICB0cnkgeyB2ID0gTG9uZy5wYXJzZUxvbmcocyk7IH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgICAgICAKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgICAgICAgICAgdmFsaWRhdGVMZXhpY2FsKHMsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLnNldF9sb25nKHYpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbG9uZyhsb25nIHYpCi0gICAgewotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotCi0gICAgICAgIHN1cGVyLnNldF9sb25nKHYpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBKYXZhRGVjaW1hbEhvbGRlci52YWxpZGF0ZUxleGljYWwodiwgY29udGV4dCk7Ci0gICAgICAgIAotICAgICAgICAvLyBjaGVjayBwYXR0ZXJuCi0gICAgICAgIGlmIChzVHlwZS5oYXNQYXR0ZXJuRmFjZXQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzVHlwZS5tYXRjaFBhdHRlcm5GYWNldCh2KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkludGVnZXIgKCIgKyB2ICsgIikgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVZhbHVlKGxvbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vIHRvdGFsIGRpZ2l0cwotICAgICAgICBYbWxPYmplY3QgdGQgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX1RPVEFMX0RJR0lUUyk7Ci0gICAgICAgIGlmICh0ZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIG0gPSBnZXRMb25nVmFsdWUodGQpOwotICAgICAgICAgICAgU3RyaW5nIHRlbXAgPSBMb25nLnRvU3RyaW5nKHYpOwotICAgICAgICAgICAgaW50IGxlbiA9IHRlbXAubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuID4gMCAmJiB0ZW1wLmNoYXJBdCgwKSA9PSAnLScpCi0gICAgICAgICAgICAgICAgbGVuIC09IDE7Ci0gICAgICAgICAgICBpZiAobGVuID4gbSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyIHRvdGFsIGRpZ2l0cyAoIiArIHRlbXAgKyAiKSBpcyBncmVhdGVyIHRoYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAidG90YWwgZGlnaXRzIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtaW4gZXgKLSAgICAgICAgWG1sT2JqZWN0IG1pbmUgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUpOwotICAgICAgICBpZiAobWluZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIG0gPSBnZXRMb25nVmFsdWUobWluZSk7Ci0gICAgICAgICAgICBpZiAoISh2ID4gbSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiSW50ZWdlciAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWluIGV4Y2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWluIGluCi0gICAgICAgIFhtbE9iamVjdCBtaW5pID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFKTsKLSAgICAgICAgaWYgKG1pbmkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgbG9uZyBtID0gZ2V0TG9uZ1ZhbHVlKG1pbmkpOwotICAgICAgICAgICAgaWYgKCEodiA+PSBtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gZXhjbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYXggaW4KLSAgICAgICAgWG1sT2JqZWN0IG1heGkgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkUpOwotICAgICAgICBpZiAobWF4aSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIG0gPSBnZXRMb25nVmFsdWUobWF4aSk7Ci0gICAgICAgICAgICBpZiAoISh2IDw9IG0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBpbmNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1heCBleAotICAgICAgICBYbWxPYmplY3QgbWF4ZSA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRSk7Ci0gICAgICAgIGlmIChtYXhlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgbSA9IGdldExvbmdWYWx1ZShtYXhlKTsKLSAgICAgICAgICAgIGlmICghKHYgPCBtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCi0gICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJtYXggZXhjbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBlbnVtZXJhdGlvbgotICAgICAgICBYbWxPYmplY3RbXSB2YWxzID0gc1R5cGUuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKTsKLSAgICAgICAgaWYgKHZhbHMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2ID09IGdldExvbmdWYWx1ZSh2YWxzW2ldKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJJbnRlZ2VyICgiICsgdiArICIpIGRvZXMgbm90IG1hdGNoIGFueSBlbnVtZXJhdGlvbiB2YWx1ZXMgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBnZXRMb25nVmFsdWUoWG1sT2JqZWN0IG8pIHsKLSAgICAgICAgU2NoZW1hVHlwZSBzID0gby5zY2hlbWFUeXBlKCk7Ci0gICAgICAgIHN3aXRjaCAocy5nZXREZWNpbWFsU2l6ZSgpKSAKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQklHX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoWG1sT2JqZWN0QmFzZSlvKS5iaWdEZWNpbWFsVmFsdWUoKS5sb25nVmFsdWUoKTsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0JJR19JTlRFR0VSOgotICAgICAgICAgICAgICAgIHJldHVybiAoKFhtbE9iamVjdEJhc2UpbykuYmlnSW50ZWdlclZhbHVlKCkubG9uZ1ZhbHVlKCk7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9MT05HOgotICAgICAgICAgICAgICAgIHJldHVybiAoKFhtbE9iamVjdEJhc2UpbykubG9uZ1ZhbHVlKCk7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkJhZCBmYWNldCB0eXBlOiAiICsgcyk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQotICAgIHsKLSAgICAgICAgdmFsaWRhdGVMZXhpY2FsKGxleGljYWwsIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICAgICAgdmFsaWRhdGVWYWx1ZShsb25nVmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFOb3RhdGlvbkhvbGRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YU5vdGF0aW9uSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMGYzNTUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YU5vdGF0aW9uSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YU5vdGF0aW9uSG9sZGVyIGV4dGVuZHMgWG1sUU5hbWVJbXBsCi17Ci0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PVEFUSU9OOyB9Ci0KLS8vICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpCi0vLyAgICAgICAgeyByZXR1cm4gU2NoZW1hVHlwZS5XU19QUkVTRVJWRTsgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhTm90YXRpb25Ib2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YU5vdGF0aW9uSG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0ZGY4My4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhTm90YXRpb25Ib2xkZXJFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFOb3RhdGlvbkhvbGRlckV4IGV4dGVuZHMgSmF2YU5vdGF0aW9uSG9sZGVyCi17Ci0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotCi0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHB1YmxpYyBKYXZhTm90YXRpb25Ib2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLQotICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gc2NoZW1hVHlwZSgpLmdldFdoaXRlU3BhY2VSdWxlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFjaGVjayhzLCBfc2NoZW1hVHlwZSkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotCi0gICAgICAgICAgICBpZiAoIV9zY2hlbWFUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHMpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLnNldF90ZXh0KHMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9ub3RhdGlvbihTdHJpbmcgdikKLSAgICB7IHNldF90ZXh0KHYpOyB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlKQotICAgIHsKLSAgICAgICAgLy8gY2hlY2sgYWdhaW5zdCBsZW5ndGgKLSAgICAgICAgWG1sT2JqZWN0IGxlbiA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTEVOR1RIKTsKLSAgICAgICAgaWYgKGxlbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbSA9ICgoWG1sT2JqZWN0QmFzZSlsZW4pLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoISh2Lmxlbmd0aCgpICE9IG0pKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGFnYWluc3QgbWluIGxlbmd0aAotICAgICAgICBYbWxPYmplY3QgbWluID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fTEVOR1RIKTsKLSAgICAgICAgaWYgKG1pbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbSA9ICgoWG1sT2JqZWN0QmFzZSltaW4pLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoISh2Lmxlbmd0aCgpID49IG0pKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGFnYWluc3QgbWluIGxlbmd0aAotICAgICAgICBYbWxPYmplY3QgbWF4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIKTsKLSAgICAgICAgaWYgKG1heCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbSA9ICgoWG1sT2JqZWN0QmFzZSltYXgpLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoISh2Lmxlbmd0aCgpIDw9IG0pKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVFOYW1lSG9sZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhUU5hbWVIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU3ZGFlZS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhUU5hbWVIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlByZWZpeFJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWE1MQ2hhcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLk5hbWVzcGFjZUNvbnRleHQ7Ci0gICAKLXB1YmxpYyBjbGFzcyBKYXZhUU5hbWVIb2xkZXIgZXh0ZW5kcyBYbWxPYmplY3RCYXNlCi17Ci0gICAgcHVibGljIEphdmFRTmFtZUhvbGRlcigpIHt9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfUU5BTUU7IH0KLQotICAgIHByaXZhdGUgUU5hbWUgX3ZhbHVlOwotCi0gICAgcHJvdGVjdGVkIGludCBnZXRfd3NjYW5vbl9ydWxlKCkKLSAgICAgICAgeyByZXR1cm4gU2NoZW1hVHlwZS5XU19QUkVTRVJWRTsgfQotICAgIAotICAgIC8vIGFuIGVyZ29ub21pYyBwcmVmaXhlciBzbyB0aGF0IHlvdSBjYW4gc2F5IHN0cmluZ1ZhbHVlKCkgb24gYSBmcmVlLWZsb2F0aW5nIFFOYW1lLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE5hbWVzcGFjZU1hbmFnZXIgUFJFVFRZX1BSRUZJWEVSID0gbmV3IFByZXR0eU5hbWVzcGFjZU1hbmFnZXIoKTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcmV0dHlOYW1lc3BhY2VNYW5hZ2VyIGltcGxlbWVudHMgTmFtZXNwYWNlTWFuYWdlcgotICAgIHsKLSAgICAgICAgcHVibGljIFN0cmluZyBmaW5kX3ByZWZpeF9mb3JfbnN1cmkoU3RyaW5nIG5zdXJpLCBTdHJpbmcgc3VnZ2VzdGVkX3ByZWZpeCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFFOYW1lSGVscGVyLnN1Z2dlc3RQcmVmaXgoc3VnZ2VzdGVkX3ByZWZpeCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VGb3JQcmVmaXgoU3RyaW5nIHByZWZpeCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKQotICAgIHsKLSAgICAgICAgaWYgKG5zbSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB3ZSB1c2VkIHRvOiB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIFFOYW1lIHByZWZpeCBvdXRzaWRlIG9mIGEgZG9jdW1lbnQiKTsKLSAgICAgICAgICAgIC8vIGJ1dCBpdCdzIG5vdCBuaWNlIHRvIHRocm93IG9uIHN0cmluZ1ZhbHVlKCkKLSAgICAgICAgICAgIG5zbSA9IFBSRVRUWV9QUkVGSVhFUjsKLSAgICAgICAgfQotCi0vLyBUT0RPIC0gd2hhdCBJIHJlYWxseSBuZWVkIHRvIGRvIGhlcmUgaXMgdGhhdCBpZiB0aGVyZSBpcyBubwotLy8gbmFtZXNwYWNlIGZvciB0aGlzIHFuYW1lLCB0aGVuIGluc3RlYWQgb2YgZmluZGluZyB0aGUgcHJlZml4IGZvciB0aGUKLS8vIHVyaSwgSSBzaG91bGQgbWFrZSBhIGNhbGwgdG8gc2V0IHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBmb3IgdGhlCi0vLyBpbW1lZGlhdGUgY29udGV4dCBmb3IgdGhpcyBxbmFtZSB0byBiZSAiIi4gIAotICAgCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBfdmFsdWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBfdmFsdWUuZ2V0TG9jYWxQYXJ0KCk7Ci0KLSAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsIHx8IG5hbWVzcGFjZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGxvY2FsUGFydDsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSBuc20uZmluZF9wcmVmaXhfZm9yX25zdXJpKCBuYW1lc3BhY2UsIG51bGwgKTsKLQotICAgICAgICBhc3NlcnQgcHJlZml4ICE9IG51bGw7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcHJlZml4ICsgIjoiICsgbG9jYWxQYXJ0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgdmFsaWRhdGVMZXhpY2FsKAotICAgICAgICBTdHJpbmcgdiwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCwgUHJlZml4UmVzb2x2ZXIgcmVzb2x2ZXIpCi0gICAgewotICAgICAgICBRTmFtZSBuYW1lOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG5hbWUgPSBwYXJzZSh2LCByZXNvbHZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBuYW1lID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBRTmFtZSBwYXJzZShTdHJpbmcgdiwgUHJlZml4UmVzb2x2ZXIgcmVzb2x2ZXIpCi0gICAgewotICAgICAgICBTdHJpbmcgcHJlZml4LCBsb2NhbG5hbWU7Ci0gICAgICAgIGludCBzdGFydDsKLSAgICAgICAgaW50IGVuZDsKLSAgICAgICAgZm9yIChlbmQgPSB2Lmxlbmd0aCgpOyBlbmQgPiAwOyBlbmQgLT0gMSkKLSAgICAgICAgICAgIGlmICghWE1MQ2hhci5pc1NwYWNlKHYuY2hhckF0KGVuZC0xKSkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGZvciAoc3RhcnQgPSAwOyBzdGFydCA8IGVuZDsgc3RhcnQgKz0gMSkKLSAgICAgICAgICAgIGlmICghWE1MQ2hhci5pc1NwYWNlKHYuY2hhckF0KHN0YXJ0KSkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaW50IGZpcnN0Y29sb24gPSB2LmluZGV4T2YoJzonLCBzdGFydCk7Ci0gICAgICAgIGlmIChmaXJzdGNvbG9uID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZWZpeCA9IHYuc3Vic3RyaW5nKHN0YXJ0LCBmaXJzdGNvbG9uKTsKLSAgICAgICAgICAgIGxvY2FsbmFtZSA9IHYuc3Vic3RyaW5nKGZpcnN0Y29sb24gKyAxLCBlbmQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICBsb2NhbG5hbWUgPSB2LnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHVyaSA9Ci0gICAgICAgICAgICByZXNvbHZlciA9PSBudWxsID8gbnVsbCA6IHJlc29sdmVyLmdldE5hbWVzcGFjZUZvclByZWZpeChwcmVmaXgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCJDYW4ndCByZXNvbHZlIHByZWZpeDogIiArIHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHVyaSA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSggdXJpLCBsb2NhbG5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBQcmVmaXhSZXNvbHZlciByZXNvbHZlciA9IE5hbWVzcGFjZUNvbnRleHQuZ2V0Q3VycmVudCgpOwotCi0gICAgICAgIGlmIChyZXNvbHZlciA9PSBudWxsICYmIGhhc19zdG9yZSgpKQotICAgICAgICAgICAgcmVzb2x2ZXIgPSBnZXRfc3RvcmUoKTsKLSAgICAgICAgCi0gICAgICAgIF92YWx1ZSA9IHBhcnNlKHMsIHJlc29sdmVyKTsKLSAgICB9Ci0KLSAgICAvLyBCVUdCVUcgLSBoYXZpbmcgcHJlZml4IGhlcmUgbWF5IG5vdCB3b3JrCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X1FOYW1lKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsOwotICAgICAgICAKLSAgICAgICAgLy8gU3luYyBmb3JjZSBvZiBjcmVhdGlvbiBvZiBuYW1lc2FwY2UgbWFwcGluZyAuLgotICAgICAgICAKLSAgICAgICAgaWYgKGhhc19zdG9yZSgpKQotICAgICAgICAgICAgZ2V0X3N0b3JlKCkuZmluZF9wcmVmaXhfZm9yX25zdXJpKCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBfdmFsdWUgPSBuYW1lOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWxhbnlzaW1wbGUoWG1sQW55U2ltcGxlVHlwZSB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIF92YWx1ZSA9IHBhcnNlKHZhbHVlLmdldFN0cmluZ1ZhbHVlKCksIE5hbWVzcGFjZUNvbnRleHQuZ2V0Q3VycmVudCgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbmlsKCkgeyBfdmFsdWUgPSBudWxsOyB9Ci0KLSAgICAvLyBzZXR0ZXJzLCBnZXR0ZXJzIChzZXR0ZXIgYWxyZWFkeSBoYW5kbGVkIHZpYSBzZXRfdGV4dCkKLQotICAgIHB1YmxpYyBRTmFtZSBxTmFtZVZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlOyB9Ci0KLSAgICAvLyBjb21wYXJhdG9ycwotICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCBvYmopCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlLmVxdWFscygoKFhtbE9iamVjdEJhc2Upb2JqKS5xTmFtZVZhbHVlKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsdWUuaGFzaENvZGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhUU5hbWVIb2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVFOYW1lSG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQwNzQ5My4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhUU5hbWVIb2xkZXJFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlByZWZpeFJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YVFOYW1lSG9sZGVyRXggZXh0ZW5kcyBKYXZhUU5hbWVIb2xkZXIKLXsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQotCi0gICAgcHVibGljIEphdmFRTmFtZUhvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IF9zY2hlbWFUeXBlID0gdHlwZTsgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsgfQotCi0gICAgcHJvdGVjdGVkIGludCBnZXRfd3NjYW5vbl9ydWxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzY2hlbWFUeXBlKCkuZ2V0V2hpdGVTcGFjZVJ1bGUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIFByZWZpeFJlc29sdmVyIHJlc29sdmVyID0gTmFtZXNwYWNlQ29udGV4dC5nZXRDdXJyZW50KCk7Ci0KLSAgICAgICAgaWYgKHJlc29sdmVyID09IG51bGwgJiYgaGFzX3N0b3JlKCkpCi0gICAgICAgICAgICByZXNvbHZlciA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIFFOYW1lIHY7Ci0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ID0gdmFsaWRhdGVMZXhpY2FsKHMsIF9zY2hlbWFUeXBlLCBfdm9vclZjLCByZXNvbHZlcik7Ci0gICAgICAgICAgICBpZiAodiAhPSBudWxsKQotICAgICAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHYgPSBKYXZhUU5hbWVIb2xkZXIudmFsaWRhdGVMZXhpY2FsKHMsIF92b29yVmMsIHJlc29sdmVyKTsKLQotICAgICAgICBzdXBlci5zZXRfUU5hbWUodik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X1FOYW1lKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUobmFtZSwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgICAgICBzdXBlci5zZXRfUU5hbWUoIG5hbWUgKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sYW55c2ltcGxlKFhtbEFueVNpbXBsZVR5cGUgdmFsdWUpCi0gICAgewotICAgICAgICBRTmFtZSB2OwotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdiA9IHZhbGlkYXRlTGV4aWNhbCh2YWx1ZS5nZXRTdHJpbmdWYWx1ZSgpLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYywgTmFtZXNwYWNlQ29udGV4dC5nZXRDdXJyZW50KCkpOwotCi0gICAgICAgICAgICBpZiAodiAhPSBudWxsKQotICAgICAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHYgPSBKYXZhUU5hbWVIb2xkZXIudmFsaWRhdGVMZXhpY2FsKHZhbHVlLmdldFN0cmluZ1ZhbHVlKCksIF92b29yVmMsIE5hbWVzcGFjZUNvbnRleHQuZ2V0Q3VycmVudCgpKTsKLQotICAgICAgICBzdXBlci5zZXRfUU5hbWUodik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZSB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQsIFByZWZpeFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgUU5hbWUgbmFtZSA9IEphdmFRTmFtZUhvbGRlci52YWxpZGF0ZUxleGljYWwodiwgY29udGV4dCwgcmVzb2x2ZXIpOwotICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgcGF0dGVybgotICAgICAgICBpZiAoc1R5cGUuaGFzUGF0dGVybkZhY2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc1R5cGUubWF0Y2hQYXR0ZXJuRmFjZXQodikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAtIGRlc2NyaWJlIHN0cmluZyBhbmQgcGF0dGVybiBoZXJlIGluIGVycm9yCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJRTmFtZSAnIiArIHYgKyAiJyBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFhtbE9iamVjdCB4OwotCi0gICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTEVOR1RIKSkgIT0gbnVsbCkKLSAgICAgICAgICAgIGlmICgoKChYbWxPYmplY3RCYXNlKXgpLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCkpICE9IHYubGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJRTmFtZSAnIiArIHYgKyAiJyBkb2VzIG5vdCBtYXRjaCBsZW5ndGggZmFjZXQgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAKLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fTEVOR1RIKSkgIT0gbnVsbCkKLSAgICAgICAgICAgIGlmICgoKChYbWxPYmplY3RCYXNlKXgpLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCkpID4gdi5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIlFOYW1lICciICsgdiArICInIGRvZXMgbm90IG1hdGNoIG1pbiBsZW5ndGggZmFjZXQgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAKLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIKSkgIT0gbnVsbCkKLSAgICAgICAgICAgIGlmICgoKChYbWxPYmplY3RCYXNlKXgpLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCkpIDwgdi5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIlFOYW1lICciICsgdiArICInIGRvZXMgbm90IG1hdGNoIG1heCBsZW5ndGggZmFjZXQgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotCi0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVZhbHVlKFFOYW1lIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBYbWxPYmplY3RbXSB2YWxzID0gc1R5cGUuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKTsKLSAgICAgICAgaWYgKHZhbHMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGlmICh2LmVxdWFscygoKFhtbE9iamVjdEJhc2UpdmFsc1tpXSkucU5hbWVWYWx1ZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJRTmFtZSAnIiArIHYgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVlbXJhdGVkIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQotICAgIHsKLSAgICAgICAgdmFsaWRhdGVWYWx1ZShxTmFtZVZhbHVlKCksIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFTdHJpbmdFbnVtZXJhdGlvbkhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhU3RyaW5nRW51bWVyYXRpb25Ib2xkZXJFeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDhlYWJiLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFTdHJpbmdFbnVtZXJhdGlvbkhvbGRlckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU3RyaW5nRW51bUFic3RyYWN0QmFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFTdHJpbmdFbnVtZXJhdGlvbkhvbGRlckV4IGV4dGVuZHMgSmF2YVN0cmluZ0hvbGRlckV4Ci17Ci0gICAgcHVibGljIEphdmFTdHJpbmdFbnVtZXJhdGlvbkhvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgIHsKLSAgICAgICAgc3VwZXIodHlwZSwgY29tcGxleCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIF92YWw7Ci0KLSAgICAvLyB1cGRhdGUgdGhlIGludHZhbCB3aGVuIHNldHRpbmcgdmlhIHRleHQsIG5pbC4KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZW51bSA9IHNjaGVtYVR5cGUoKS5lbnVtRm9yU3RyaW5nKHMpOwotICAgICAgICBpZiAoZW51bSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigiU3RyaW5nICciICsgcyArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0ZWQgdmFsdWUgZm9yICIgKyBzY2hlbWFUeXBlKCkpOwotCi0gICAgICAgIHN1cGVyLnNldF90ZXh0KHMpOwotICAgICAgICBfdmFsID0gZW51bTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgSmF2YVN0cmluZ0hvbGRlckV4LnZhbGlkYXRlTGV4aWNhbCh2LCBzVHlwZSwgY29udGV4dCk7Ci0KLSAgICAgICAgaWYgKHNUeXBlLmhhc1N0cmluZ0VudW1WYWx1ZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNUeXBlLmVudW1Gb3JTdHJpbmcodikgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJTdHJpbmcgJyIgKyB2ICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRlZCB2YWx1ZSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQotICAgIHsKLSAgICAgICAgX3ZhbCA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnNldF9uaWwoKTsKLSAgICB9Ci0KLSAgICAvLyBzZXQvZ2V0IHRoZSBlbnVtCi0gICAgcHVibGljIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZW51bVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGNoZWNrX2RhdGVkKCk7Ci0gICAgICAgIHJldHVybiBfdmFsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9lbnVtKFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZW51bSkKLSAgICB7Ci0gICAgICAgIENsYXNzIGVqYyA9IHNjaGVtYVR5cGUoKS5nZXRFbnVtSmF2YUNsYXNzKCk7Ci0gICAgICAgIGlmIChlamMgIT0gbnVsbCAmJiAhZW51bS5nZXRDbGFzcygpLmVxdWFscyhlamMpKQotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIHN1cGVyLnNldF90ZXh0KGVudW0udG9TdHJpbmcoKSk7Ci0gICAgICAgIF92YWwgPSBlbnVtOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhU3RyaW5nSG9sZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhU3RyaW5nSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiN2Q5ZTguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVN0cmluZ0hvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKLQotcHVibGljIGNsYXNzIEphdmFTdHJpbmdIb2xkZXIgZXh0ZW5kcyBYbWxPYmplY3RCYXNlCi17Ci0gICAgcHVibGljIEphdmFTdHJpbmdIb2xkZXIoKSB7fQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX1NUUklORzsgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3ZhbHVlOwotCi0gICAgcHJvdGVjdGVkIGludCBnZXRfd3NjYW5vbl9ydWxlKCkKLSAgICAgICAgeyByZXR1cm4gU2NoZW1hVHlwZS5XU19QUkVTRVJWRTsgfQotCi0gICAgLy8gU0lNUExFIFZBTFVFIEFDQ0VTU09SUyBCRUxPVyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pIHsgcmV0dXJuIF92YWx1ZTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKSB7IF92YWx1ZSA9IHM7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbmlsKCkgeyBfdmFsdWUgPSBudWxsOyB9Ci0KLSAgICAvLyBzdHJpbmcgc2V0dGVyIGFuZCBnZXR0ZXIgYWxyZWFkeSBoYW5kbGVkIGJ5IFhtbE9iamVjdEJhc2UKLQotICAgIC8vIGNvbXBhcmF0b3JzCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsdWUuZXF1YWxzKCgoWG1sT2JqZWN0QmFzZSlvYmopLnN0cmluZ1ZhbHVlKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsdWUuaGFzaENvZGUoKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNfZGVmYXVsdGFibGVfd3MoU3RyaW5nIHYpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVN0cmluZ0hvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhU3RyaW5nSG9sZGVyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIwMWZlYi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhU3RyaW5nSG9sZGVyRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YVN0cmluZ0hvbGRlckV4IGV4dGVuZHMgSmF2YVN0cmluZ0hvbGRlcgotewotICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQotCi0gICAgcHVibGljIEphdmFTdHJpbmdIb2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLQotICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gc2NoZW1hVHlwZSgpLmdldFdoaXRlU3BhY2VSdWxlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlTGV4aWNhbChzLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7Ci0gICAgICAgICAgICAgICAgIAotICAgICAgICBzdXBlci5zZXRfdGV4dChzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc19kZWZhdWx0YWJsZV93cyhTdHJpbmcgdikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsaWRhdGVMZXhpY2FsKHYsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vIGNoZWNrIGFnYWluc3QgcGF0dGVybgotICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoICJTdHJpbmc6ICciICsgdiArICInIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgYWdhaW5zdCBsZW5ndGgKLSAgICAgICAgWG1sT2JqZWN0IGxlbiA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTEVOR1RIKTsKLSAgICAgICAgaWYgKGxlbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbSA9ICgoWG1sT2JqZWN0QmFzZSlsZW4pLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodi5sZW5ndGgoKSAhPSBtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIlN0cmluZyBsZW5ndGggKCIgKyB2Lmxlbmd0aCgpICsgIikgZG9lcyBub3QgbWF0Y2ggIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibGVuZ3RoIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBhZ2FpbnN0IG1pbiBsZW5ndGgKLSAgICAgICAgWG1sT2JqZWN0IG1pbiA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSCk7Ci0gICAgICAgIGlmIChtaW4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG0gPSAoKFhtbE9iamVjdEJhc2UpbWluKS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHYubGVuZ3RoKCkgPCBtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIlN0cmluZyBsZW5ndGggKCIgKyB2Lmxlbmd0aCgpICsgIikgaXMgbGVzcyB0aGFuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBsZW5ndGggZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGFnYWluc3QgbWluIGxlbmd0aAotICAgICAgICBYbWxPYmplY3QgbWF4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIKTsKLSAgICAgICAgaWYgKG1heCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbSA9ICgoWG1sT2JqZWN0QmFzZSltYXgpLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodi5sZW5ndGgoKSA+IG0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiU3RyaW5nIGxlbmd0aCAoIiArIHYubGVuZ3RoKCkgKyAiKSBpcyBncmVhdGVyIHRoYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibWF4IGxlbmd0aCBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQotICAgIHsKLSAgICAgICAgdmFsaWRhdGVMZXhpY2FsKHN0cmluZ1ZhbHVlKCksIHNjaGVtYVR5cGUoKSwgY3R4KTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhVXJpSG9sZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhVXJpSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMDMxYzMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVVyaUhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVVSSTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFVcmlIb2xkZXIgZXh0ZW5kcyBYbWxPYmplY3RCYXNlCi17Ci0gICAgcHVibGljIEphdmFVcmlIb2xkZXIoKSB7fQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9VUkk7IH0KLQotICAgIHByaXZhdGUgU3RyaW5nIF92YWx1ZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKSB7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/ICIiIDogX3ZhbHVlOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgICAgIHZhbGlkYXRlTGV4aWNhbChzLCBfdm9vclZjKTsKLSAgICAgICAgX3ZhbHVlID0gczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgLy8gRW5vdWdoIHZhbGlkYXRpb24gdG8gZ2V0IHNjaGVtYSBmb3Igc2NoZW1hIHdvcmtpbmcKLQotICAgICAgICBpZiAodi5zdGFydHNXaXRoKCAiIyMiICkpCi0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIlhtbEFueVVSSSBpcyBtYWxmb3JtZWQ6ICIgKyB2ICk7Ci0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpIHsgX3ZhbHVlID0gbnVsbDsgfQotCi0gICAgLy8gc3RyaW5nIHNldHRlciBhbmQgZ2V0dGVyIGFscmVhZHkgaGFuZGxlZCBieSBYbWxPYmplY3RCYXNlCi0KLSAgICAvLyBjb21wYXJhdG9ycwotICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCBvYmopCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlLmVxdWFscygoKFhtbEFueVVSSSlvYmopLmdldFN0cmluZ1ZhbHVlKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsdWUuaGFzaENvZGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhVXJpSG9sZGVyRXguamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFVcmlIb2xkZXJFeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGZmZWQ0Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFVcmlIb2xkZXJFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLQotcHVibGljIGNsYXNzIEphdmFVcmlIb2xkZXJFeCBleHRlbmRzIEphdmFVcmlIb2xkZXIKLXsKLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKLSAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KLQotICAgIHB1YmxpYyBKYXZhVXJpSG9sZGVyRXgoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGdldF93c2Nhbm9uX3J1bGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGUoKS5nZXRXaGl0ZVNwYWNlUnVsZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghY2hlY2socywgX3NjaGVtYVR5cGUpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgaWYgKCFfc2NoZW1hVHlwZS5tYXRjaFBhdHRlcm5GYWNldChzKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5zZXRfdGV4dChzKTsKLSAgICB9Ci0KLS8vICAgIC8vIHNldHRlcnMKLS8vICAgIHByb3RlY3RlZCB2b2lkIHNldF91cmkoVVJJIHVyaSkKLS8vICAgIHsKLS8vICAgICAgICBpZiAoIWNoZWNrKHVyaS50b1N0cmluZygpLCBfc2NoZW1hVHlwZSkpCi0vLyAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLS8vCi0vLyAgICAgICAgc3VwZXIuc2V0X3VyaSh1cmkpOwotLy8gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIFhtbEFueVVyaUltcGwudmFsaWRhdGVMZXhpY2FsKHYsIGNvbnRleHQpOwotICAgICAgICAKLSAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0KLSAgICAgICAgaWYgKHZhbHMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoIGkgPSAwIDsgaSA8IHZhbHMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZSA9ICgoU2ltcGxlVmFsdWUpdmFsc1tpXSkuZ2V0U3RyaW5nVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChlLmVxdWFscyggdiApKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGkgPj0gdmFscy5sZW5ndGgpCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJhbnlVUkkgJyIgKyB2ICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRlZCB2YWx1ZSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGNoZWNrIHBhdHRlcm4KLSAgICAgICAgaWYgKHNUeXBlLmhhc1BhdHRlcm5GYWNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBkZXNjcmliZSBzdHJpbmcgYW5kIHBhdHRlcm4gaGVyZSBpbiBlcnJvcgotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiYW55VVJJIHZhbHVlICciICsgdiArICInIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgWG1sT2JqZWN0IHg7Ci0KLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9MRU5HVEgpKSAhPSBudWxsKQotICAgICAgICAgICAgaWYgKCgoKFNpbXBsZVZhbHVlKXgpLmdldEJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCkpICE9IHYubGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJhbnlVUkkgdmFsdWUgJyIgKyB2ICsgIicgZG9lcyBub3QgbWF0Y2ggbGVuZ3RoIGZhY2V0ICgiICsgKChTaW1wbGVWYWx1ZSl4KS5nZXRCaWdJbnRlZ2VyVmFsdWUoKSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgCi0gICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSCkpICE9IG51bGwpCi0gICAgICAgICAgICBpZiAoKCgoU2ltcGxlVmFsdWUpeCkuZ2V0QmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKSkgPiB2Lmxlbmd0aCgpKQotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiYW55VVJJIHZhbHVlICciICsgdiArICInIGRvZXMgbm90IG1hdGNoIG1pbiBsZW5ndGggZmFjZXQgKCIgKyAoKFNpbXBsZVZhbHVlKXgpLmdldEJpZ0ludGVnZXJWYWx1ZSgpICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAKLSAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIKSkgIT0gbnVsbCkKLSAgICAgICAgICAgIGlmICgoKChTaW1wbGVWYWx1ZSl4KS5nZXRCaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpKSA8IHYubGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJhbnlVUkkgdmFsdWUgJyIgKyB2ICsgIicgZG9lcyBub3QgbWF0Y2ggbWF4IGxlbmd0aCBmYWNldCAoIiArICgoU2ltcGxlVmFsdWUpeCkuZ2V0QmlnSW50ZWdlclZhbHVlKCkgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2soU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUpCi0gICAgewotICAgICAgICBpbnQgbGVuZ3RoID0gdj09bnVsbCA/IDAgOiB2Lmxlbmd0aCgpOwotICAgICAgICAvLyBjaGVjayBhZ2FpbnN0IGxlbmd0aAotICAgICAgICBYbWxPYmplY3QgbGVuID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9MRU5HVEgpOwotICAgICAgICBpZiAobGVuICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBtID0gKChTaW1wbGVWYWx1ZSlsZW4pLmdldEJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoIShsZW5ndGggIT0gbSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgYWdhaW5zdCBtaW4gbGVuZ3RoCi0gICAgICAgIFhtbE9iamVjdCBtaW4gPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEgpOwotICAgICAgICBpZiAobWluICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBtID0gKChTaW1wbGVWYWx1ZSltaW4pLmdldEJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoIShsZW5ndGggPj0gbSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgYWdhaW5zdCBtaW4gbGVuZ3RoCi0gICAgICAgIFhtbE9iamVjdCBtYXggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEgpOwotICAgICAgICBpZiAobWF4ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBtID0gKChTaW1wbGVWYWx1ZSltYXgpLmdldEJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoIShsZW5ndGggPD0gbSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCi0gICAgewotICAgICAgICB2YWxpZGF0ZUxleGljYWwoc3RyaW5nVmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL05hbWVzcGFjZUNvbnRleHQuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL05hbWVzcGFjZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0YzM1NS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9OYW1lc3BhY2VDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5QcmVmaXhSZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlByb3h5OwotCi1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5TdGFydEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VDb250ZXh0IGltcGxlbWVudHMgUHJlZml4UmVzb2x2ZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TVE9SRSAgICA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFhNTF9PQkpFQ1QgICAgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVAgICAgICAgICAgID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfRUxFTUVOVCA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU09MVkVSICAgICAgPSA1OwotCi0gICAgcHJpdmF0ZSBPYmplY3QgX29iajsKLSAgICBwcml2YXRlIGludCBfY29kZTsKLQotICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0KE1hcCBwcmVmaXhUb1VyaU1hcCkKLSAgICB7Ci0gICAgICAgIF9jb2RlID0gTUFQOwotICAgICAgICBfb2JqID0gcHJlZml4VG9VcmlNYXA7Ci0gICAgfQotCi0gICAgcHVibGljIE5hbWVzcGFjZUNvbnRleHQoVHlwZVN0b3JlIHR5cGVTdG9yZSkKLSAgICB7Ci0gICAgICAgIF9jb2RlID0gVFlQRV9TVE9SRTsKLSAgICAgICAgX29iaiA9IHR5cGVTdG9yZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dChYbWxPYmplY3QgeG1sT2JqZWN0KQotICAgIHsKLSAgICAgICAgX2NvZGUgPSBYTUxfT0JKRUNUOwotICAgICAgICBfb2JqID0geG1sT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0KFN0YXJ0RWxlbWVudCBzdGFydCkKLSAgICB7Ci0gICAgICAgIF9jb2RlID0gU1RBUlRfRUxFTUVOVDsKLSAgICAgICAgX29iaiA9IHN0YXJ0OwotICAgIH0KLQotICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0KFByZWZpeFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgX2NvZGUgPSBSRVNPTFZFUjsKLSAgICAgICAgX29iaiA9IHJlc29sdmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YWNrIG1hbmFnZW1lbnQgaWYgKGhlYXZlbiBoZWxwIHVzKSB3ZSBldmVyIG5lZWQgdG8gZG8KLSAgICAgKiBuZXN0ZWQgY29tcGlsYXRpb24gb2Ygc2NoZW1hIHR5cGUgc3lzdGVtLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE5hbWVzcGFjZUNvbnRleHRTdGFjawotICAgIHsKLSAgICAgICAgTmFtZXNwYWNlQ29udGV4dCBjdXJyZW50OwotICAgICAgICBBcnJheUxpc3Qgc3RhY2sgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZpbmFsIHZvaWQgcHVzaChOYW1lc3BhY2VDb250ZXh0IG5leHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YWNrLmFkZChjdXJyZW50KTsKLSAgICAgICAgICAgIGN1cnJlbnQgPSBuZXh0OwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIHZvaWQgcG9wKCkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudCA9IChOYW1lc3BhY2VDb250ZXh0KXN0YWNrLmdldChzdGFjay5zaXplKCkgLSAxKTsKLSAgICAgICAgICAgIHN0YWNrLnJlbW92ZShzdGFjay5zaXplKCkgLSAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFRocmVhZExvY2FsIE5hbWVzcGFjZUNvbnRleHRTdGFjayA9IG5ldyBUaHJlYWRMb2NhbCgpCi0gICAgewotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGluaXRpYWxWYWx1ZSgpIHsgcmV0dXJuIG5ldyBOYW1lc3BhY2VDb250ZXh0U3RhY2soKTsgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHVzaChOYW1lc3BhY2VDb250ZXh0IG5leHQpCi0gICAgewotICAgICAgICAoKE5hbWVzcGFjZUNvbnRleHRTdGFjaylOYW1lc3BhY2VDb250ZXh0U3RhY2suZ2V0KCkpLnB1c2gobmV4dCk7Ci0gICAgfQotICAgICAgICAgICAgCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VGb3JQcmVmaXgoU3RyaW5nIHByZWZpeCkKLSAgICB7Ci0gICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXguZXF1YWxzKCJ4bWwiKSkKLSAgICAgICAgICAgIHJldHVybiAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIjsKLSAgICAgICAgCi0gICAgICAgIHN3aXRjaCAoX2NvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgWE1MX09CSkVDVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUeXBlU3RvcmVVc2VyIGltcGw7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IF9vYmo7Ci0gICAgICAgICAgICAgICAgaWYgKFByb3h5LmlzUHJveHlDbGFzcyhvYmouZ2V0Q2xhc3MoKSkpCi0gICAgICAgICAgICAgICAgICAgIG9iaiA9IFByb3h5LmdldEludm9jYXRpb25IYW5kbGVyKG9iaik7Ci0KLSAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgVHlwZVN0b3JlVXNlcikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoVHlwZVN0b3JlVXNlcilvYmopLmdldF9zdG9yZSgpLmdldE5hbWVzcGFjZUZvclByZWZpeChwcmVmaXgpOwotCi0gICAgICAgICAgICAgICAgWG1sQ3Vyc29yIGN1ciA9ICgoWG1sT2JqZWN0KV9vYmopLm5ld0N1cnNvcigpOwotICAgICAgICAgICAgICAgIGlmIChjdXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXIuY3VycmVudFRva2VuVHlwZSgpID09IFhtbEN1cnNvci5Ub2tlblR5cGUuQVRUUikKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1ci50b1BhcmVudCgpOwotICAgICAgICAgICAgICAgICAgICB0cnkgeyByZXR1cm4gY3VyLm5hbWVzcGFjZUZvclByZWZpeChwcmVmaXgpOyB9Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBjdXIuZGlzcG9zZSgpOyB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIE1BUDoKLSAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZykoKE1hcClfb2JqKS5nZXQocHJlZml4KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgVFlQRV9TVE9SRToKLSAgICAgICAgICAgICAgICByZXR1cm4gKChUeXBlU3RvcmUpX29iaikuZ2V0TmFtZXNwYWNlRm9yUHJlZml4KHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIFNUQVJUX0VMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoU3RhcnRFbGVtZW50KV9vYmopLmdldE5hbWVzcGFjZVVyaShwcmVmaXgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSBSRVNPTFZFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gKChQcmVmaXhSZXNvbHZlcilfb2JqKS5nZXROYW1lc3BhY2VGb3JQcmVmaXgocHJlZml4KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogIkltcHJvcGVybHkgaW5pdGlhbGl6ZWQgTmFtZXNwYWNlQ29udGV4dC4iOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBQcmVmaXhSZXNvbHZlciBnZXRDdXJyZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKE5hbWVzcGFjZUNvbnRleHRTdGFjaylOYW1lc3BhY2VDb250ZXh0U3RhY2suZ2V0KCkpLmN1cnJlbnQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwb3AoKQotICAgIHsKLSAgICAgICAgKChOYW1lc3BhY2VDb250ZXh0U3RhY2spTmFtZXNwYWNlQ29udGV4dFN0YWNrLmdldCgpKS5wb3AoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1N0cmluZ0VudW1WYWx1ZS5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvU3RyaW5nRW51bVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViODRmYjkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvU3RyaW5nRW51bVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2U7Ci0KLXB1YmxpYyBjbGFzcyBTdHJpbmdFbnVtVmFsdWUgZXh0ZW5kcyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlCi17Ci0gICAgcHVibGljIFN0cmluZ0VudW1WYWx1ZShTdHJpbmcgcywgaW50IGkpCi0gICAgICAgIHsgc3VwZXIocywgaSk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEFueVNpbXBsZVR5cGVJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlTaW1wbGVUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2YzOWExLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEFueVNpbXBsZVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgYW55U2ltcGxlVHlwZSBmb3IgWE1MLgotICoKLSAqLwotcHVibGljIGNsYXNzIFhtbEFueVNpbXBsZVR5cGVJbXBsIGV4dGVuZHMgWG1sT2JqZWN0QmFzZSBpbXBsZW1lbnRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICBwdWJsaWMgWG1sQW55U2ltcGxlVHlwZUltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9Ci0KLSAgICBwdWJsaWMgWG1sQW55U2ltcGxlVHlwZUltcGwoKQotICAgICAgICB7IF9zY2hlbWFUeXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9zY2hlbWFUeXBlOyB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7Ci0KLSAgICBTdHJpbmcgX3RleHR2YWx1ZSA9ICIiOwotCi0gICAgcHJvdGVjdGVkIGludCBnZXRfd3NjYW5vbl9ydWxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBTY2hlbWFUeXBlLldTX1BSRVNFUlZFOwotICAgIH0KLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIGdldHMgcmF3IHRleHQgdmFsdWUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkgeyByZXR1cm4gX3RleHR2YWx1ZTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgX3RleHR2YWx1ZSA9IHM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCi0gICAgewotICAgICAgICBfdGV4dHZhbHVlID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBjb21wYXJhdG9ycwotICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCBvYmopCi0gICAgewotICAgICAgICAvLyBjb21wYXJlcyBhZ2FpbnN0IGFub3RoZXIgYW55U2ltcGxlVHlwZQotICAgICAgICAvLyBydWxlIGlzOiBsZXhpY2FsIHZhbHVlcyBtdXN0IG1hdGNoLgotICAgICAgICByZXR1cm4gX3RleHR2YWx1ZS5lcXVhbHMoKChYbWxBbnlTaW1wbGVUeXBlKW9iaikuZ2V0U3RyaW5nVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQotICAgIHsKLSAgICAgICAgLy8gbWF0Y2hlcyBKYXZhU3RyaW5nSG9sZGVyJ3MgdmFsdWVfaGFzaF9jb2RlLCBzbyB3ZSBjYW4gYmUgaGFzZWQgYWdhaW5zdCBzdHJpbmdzCi0gICAgICAgIHJldHVybiAoX3RleHR2YWx1ZSA9PSBudWxsID8gMCA6IF90ZXh0dmFsdWUuaGFzaENvZGUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55U2ltcGxlVHlwZVJlc3RyaWN0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlTaW1wbGVUeXBlUmVzdHJpY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0NzBlOS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlTaW1wbGVUeXBlUmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotcHVibGljIGNsYXNzIFhtbEFueVNpbXBsZVR5cGVSZXN0cmljdGlvbiBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGVJbXBsCi17Ci0gICAgcHVibGljIFhtbEFueVNpbXBsZVR5cGVSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLQotICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55VHlwZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEFueVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZjdlNjguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGFueVR5cGUgZm9yIFhNTC4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxBbnlUeXBlSW1wbCBleHRlbmRzIFhtbENvbXBsZXhDb250ZW50SW1wbCBpbXBsZW1lbnRzIFhtbE9iamVjdAotewotICAgIHB1YmxpYyBYbWxBbnlUeXBlSW1wbCgpCi0gICAgICAgIHsgc3VwZXIodHlwZSk7IH0KLQotICAgIHB1YmxpYyBYbWxBbnlUeXBlSW1wbChTY2hlbWFUeXBlIHR5cGUpCi0gICAgICAgIHsgc3VwZXIodHlwZSk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEFueVVyaUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEFueVVyaUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1MzNiMC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlVcmlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLXB1YmxpYyBjbGFzcyBYbWxBbnlVcmlJbXBsIGV4dGVuZHMgSmF2YVVyaUhvbGRlciBpbXBsZW1lbnRzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55VVJJCi17Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlVcmlSZXN0cmljdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55VXJpUmVzdHJpY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1NTMyZi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlVcmlSZXN0cmljdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi1wdWJsaWMgY2xhc3MgWG1sQW55VXJpUmVzdHJpY3Rpb24gZXh0ZW5kcyBKYXZhVXJpSG9sZGVyRXggaW1wbGVtZW50cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVVSSQotewotICAgIHB1YmxpYyBYbWxBbnlVcmlSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQmFzZTY0QmluYXJ5SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQmFzZTY0QmluYXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmFiOWYzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJhc2U2NEJpbmFyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJhc2U2NEJpbmFyeTsKLQotCi1wdWJsaWMgY2xhc3MgWG1sQmFzZTY0QmluYXJ5SW1wbCBleHRlbmRzIEphdmFCYXNlNjRIb2xkZXIgaW1wbGVtZW50cyBYbWxCYXNlNjRCaW5hcnkKLXsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJhc2U2NEJpbmFyeVJlc3RyaWN0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxCYXNlNjRCaW5hcnlSZXN0cmljdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTBmYjJmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJhc2U2NEJpbmFyeVJlc3RyaWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCYXNlNjRCaW5hcnk7Ci0KLXB1YmxpYyBjbGFzcyBYbWxCYXNlNjRCaW5hcnlSZXN0cmljdGlvbiBleHRlbmRzIEphdmFCYXNlNjRIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbEJhc2U2NEJpbmFyeQotewotICAgIHB1YmxpYyBYbWxCYXNlNjRCaW5hcnlSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQm9vbGVhbkltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJvb2xlYW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ODlhNDcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQm9vbGVhbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQm9vbGVhbjsKLQotcHVibGljIGNsYXNzIFhtbEJvb2xlYW5JbXBsIGV4dGVuZHMgSmF2YUJvb2xlYW5Ib2xkZXIgaW1wbGVtZW50cyBYbWxCb29sZWFuCi17Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxCb29sZWFuUmVzdHJpY3Rpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJvb2xlYW5SZXN0cmljdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzk2NDNjLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJvb2xlYW5SZXN0cmljdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCb29sZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotcHVibGljIGNsYXNzIFhtbEJvb2xlYW5SZXN0cmljdGlvbiBleHRlbmRzIEphdmFCb29sZWFuSG9sZGVyRXggaW1wbGVtZW50cyBYbWxCb29sZWFuCi17Ci0gICAgcHVibGljIFhtbEJvb2xlYW5SZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQnl0ZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJ5dGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YTEwNWYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQnl0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQnl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLQotcHVibGljIGNsYXNzIFhtbEJ5dGVJbXBsIGV4dGVuZHMgSmF2YUludEhvbGRlckV4IGltcGxlbWVudHMgWG1sQnl0ZQotewotICAgIHB1YmxpYyBYbWxCeXRlSW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sQnl0ZS50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sQnl0ZUltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbENvbXBsZXhDb250ZW50SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQ29tcGxleENvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZDYwNGUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQ29tcGxleENvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIzICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuKjsKLQotaW1wb3J0IGphdmEubGFuZy5TdHJpbmc7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU2NoZW1hVHlwZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlVmlzaXRvckltcGw7Ci0KLXB1YmxpYyBjbGFzcyBYbWxDb21wbGV4Q29udGVudEltcGwgZXh0ZW5kcyBYbWxPYmplY3RCYXNlCi17Ci0gICAgcHVibGljIFhtbENvbXBsZXhDb250ZW50SW1wbChTY2hlbWFUeXBlIHR5cGUpCi0gICAgewotICAgICAgICBfc2NoZW1hVHlwZSA9IChTY2hlbWFUeXBlSW1wbCl0eXBlOwotICAgICAgICBpbml0Q29tcGxleFR5cGUodHJ1ZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9zY2hlbWFUeXBlOyB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYVR5cGVJbXBsIF9zY2hlbWFUeXBlOwotCi0gICAgcHVibGljIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pCi0gICAgICAgIHsgcmV0dXJuIG51bGw7IH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNldF9TdHJpbmcoU3RyaW5nIHYpCi0gICAgewotICAgICAgICBhc3NlcnQgX3NjaGVtYVR5cGUuZ2V0Q29udGVudFR5cGUoKSAhPSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UOwotCi0gICAgICAgIGlmIChfc2NoZW1hVHlwZS5nZXRDb250ZW50VHlwZSgpICE9IFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVCAmJgotICAgICAgICAgICAgICAgICFfc2NoZW1hVHlwZS5pc05vVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJUeXBlIGRvZXMgbm90IGFsbG93IGZvciB0ZXh0dWFsIGNvbnRlbnQ6ICIgKyBfc2NoZW1hVHlwZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIuc2V0X1N0cmluZyh2KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0X3RleHQoU3RyaW5nIHN0cikKLSAgICB7Ci0gICAgICAgIGFzc2VydAotICAgICAgICAgICAgX3NjaGVtYVR5cGUuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQgfHwKLSAgICAgICAgICAgICAgICBfc2NoZW1hVHlwZS5pc05vVHlwZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZV9mcm9tX2NvbXBsZXhfY29udGVudCgpCi0gICAgewotICAgICAgICAvLyBObyBjb21wbGV4IGNhY2hpbmcgeWV0IC4uLgotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRfbmlsKCkKLSAgICAgICAgeyAvKiBCVUdCVUc6IHdoYXQgdG8gZG8/ICovIH0KLQotICAgIC8vIExFRlQKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgY29tcGxleE9iamVjdCkKLSAgICB7Ci0gICAgICAgIGlmICghX3NjaGVtYVR5cGUuZXF1YWxzKGNvbXBsZXhPYmplY3Quc2NoZW1hVHlwZSgpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAvLyBCVUdCVUc6IGJ5LXZhbHVlIHN0cnVjdHVyZSBjb21wYXJpc29uIHVuZG9uZQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBMRUZUCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29tcGxleCB0eXBlcyBjYW5ub3QgYmUgdXNlZCBhcyBoYXNoIGtleXMiKTsKLSAgICB9Ci0KLSAgICAvLyBET05FCi0gICAgcHVibGljIFR5cGVTdG9yZVZpc2l0b3IgbmV3X3Zpc2l0b3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTY2hlbWFUeXBlVmlzaXRvckltcGwoX3NjaGVtYVR5cGUuZ2V0Q29udGVudE1vZGVsKCkpOwotICAgIH0KLQotICAgIC8vIERPTkUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc19jaGlsZF9lbGVtZW50X29yZGVyX3NlbnNpdGl2ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gc2NoZW1hVHlwZSgpLmlzT3JkZXJTZW5zaXRpdmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldF9lbGVtZW50ZmxhZ3MoUU5hbWUgZWx0TmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSBzY2hlbWFUeXBlKCkuZ2V0RWxlbWVudFByb3BlcnR5KGVsdE5hbWUpOwotICAgICAgICBpZiAocHJvcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmIChwcm9wLmhhc0RlZmF1bHQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSB8fAotICAgICAgICAgICAgcHJvcC5oYXNGaXhlZCgpID09IFNjaGVtYVByb3BlcnR5LlZBUklBQkxFIHx8Ci0gICAgICAgICAgICBwcm9wLmhhc05pbGxhYmxlKCkgPT0gU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgKHByb3AuaGFzRGVmYXVsdCgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5IQVNERUZBVUxUKSB8Ci0gICAgICAgICAgICAocHJvcC5oYXNGaXhlZCgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5GSVhFRCkgfAotICAgICAgICAgICAgKHByb3AuaGFzTmlsbGFibGUoKSA9PSBTY2hlbWFQcm9wZXJ0eS5ORVZFUiA/IDAgOiBUeXBlU3RvcmUuTklMTEFCTEUpOwotICAgIH0KLQotICAgIC8vIERPTkUKLSAgICBwdWJsaWMgU3RyaW5nIGdldF9kZWZhdWx0X2F0dHJpYnV0ZV90ZXh0KFFOYW1lIGF0dHJOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldF9kZWZhdWx0X2F0dHJpYnV0ZV90ZXh0KGF0dHJOYW1lKTsKLSAgICB9Ci0KLSAgICAvLyBET05FCi0gICAgcHVibGljIFN0cmluZyBnZXRfZGVmYXVsdF9lbGVtZW50X3RleHQoUU5hbWUgZWx0TmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSBzY2hlbWFUeXBlKCkuZ2V0RWxlbWVudFByb3BlcnR5KGVsdE5hbWUpOwotICAgICAgICBpZiAocHJvcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICByZXR1cm4gcHJvcC5nZXREZWZhdWx0VGV4dCgpOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gQ29kZSBnZW4gaGVscGVycwotICAgIC8vCi0gICAgLy8gU28gbXVjaCByZWR1bmRhbnQgY29kZSAuLi4uLiB3aGF0IEknZCBnaXZlIGZvciBnZW5lcmljcyEKLSAgICAvLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgdW5pb25BcnJheVNldHRlckhlbHBlciAoIE9iamVjdFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIGVsZW1OYW1lICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggZWxlbU5hbWUsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0KLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLm9iamVjdFNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIGJvb2xlYW5bXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLQotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBmbG9hdFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotICAgICAgICAKLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggZWxlbU5hbWUgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBlbGVtTmFtZSwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lLCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIGRvdWJsZVtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotICAgICAgICAKLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggZWxlbU5hbWUgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBlbGVtTmFtZSwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lLCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIGJ5dGVbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLSAgICAgICAgCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIGVsZW1OYW1lICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggZWxlbU5hbWUsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIHNob3J0W10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0gICAgICAgIAotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBpbnRbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLSAgICAgICAgCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIGVsZW1OYW1lICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggZWxlbU5hbWUsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBsb25nW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0gICAgICAgIAotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggQmlnRGVjaW1hbFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotICAgICAgICAKLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggZWxlbU5hbWUgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBlbGVtTmFtZSwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lLCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIEJpZ0ludGVnZXJbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLSAgICAgICAgCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIGVsZW1OYW1lICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggZWxlbU5hbWUsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIFN0cmluZ1tdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotICAgICAgICAKLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggZWxlbU5hbWUgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBlbGVtTmFtZSwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lLCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIGJ5dGVbXVtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotICAgICAgICAKLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggZWxlbU5hbWUgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBlbGVtTmFtZSwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lLCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIEdEYXRlW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0gICAgICAgIAotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggR0R1cmF0aW9uW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0gICAgICAgIAotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggQ2FsZW5kYXJbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLSAgICAgICAgCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIGVsZW1OYW1lICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggZWxlbU5hbWUsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBEYXRlW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0gICAgICAgIAotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggUU5hbWVbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLQotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0KLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggZWxlbU5hbWUgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBlbGVtTmFtZSwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLQotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lLCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggTGlzdFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIGVsZW1OYW1lICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggZWxlbU5hbWUsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0KLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB1bmlvbkFycmF5U2V0dGVySGVscGVyICggT2JqZWN0W10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLQotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0KLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5vYmplY3RTZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBib29sZWFuW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLQotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0KLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBmbG9hdFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0KLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggc2V0ICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggc2V0LCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggc2V0LCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggZG91YmxlW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLQotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0KLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBieXRlW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLQotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0KLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBzaG9ydFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0KLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggc2V0ICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggc2V0LCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggc2V0LCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggaW50W10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLQotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0KLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBsb25nW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLQotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0KLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBCaWdEZWNpbWFsW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLQotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0KLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBCaWdJbnRlZ2VyW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLQotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0KLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBTdHJpbmdbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSwgUU5hbWVTZXQgc2V0ICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIHNldCApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIHNldCwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLQotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIHNldCwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIGJ5dGVbXVtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0KLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggc2V0ICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggc2V0LCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggc2V0LCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggR0RhdGVbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSwgUU5hbWVTZXQgc2V0ICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIHNldCApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIHNldCwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLQotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIHNldCwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIEdEdXJhdGlvbltdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0KLSAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggc2V0ICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCi0gICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggc2V0LCBtIC0gMSApOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOwotCi0gICAgICAgICAgICBpZiAoaSA+PSBtKQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggc2V0LCBpICk7Ci0KLSAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggQ2FsZW5kYXJbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSwgUU5hbWVTZXQgc2V0ICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIHNldCApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIHNldCwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLQotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIHNldCwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIERhdGVbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSwgUU5hbWVTZXQgc2V0ICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOwotCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIHNldCApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIHNldCwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLQotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIHNldCwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIFFOYW1lW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLSAgICAgICAgCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIHNldCApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIHNldCwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIHNldCwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLSAgICAgICAgCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIHNldCApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIHNldCwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIHNldCwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBMaXN0W10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCi0gICAgewotICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKLSAgICAgICAgCi0gICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOwotCi0gICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIHNldCApOwotCi0gICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQotICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIHNldCwgbSAtIDEgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGkgPj0gbSkKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIHNldCwgaSApOwotCi0gICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIFhtbE9iamVjdFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKLSAgICB7Ci0gICAgICAgIGdldF9zdG9yZSgpLmFycmF5X3NldHRlciggc291cmNlcywgZWxlbU5hbWUgKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIFhtbE9iamVjdFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQotICAgIHsKLSAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7Ci0gICAgICAgIAotICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKLQotICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKLSAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpID49IG0pCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKLQotICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEYXRlSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRGF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE3N2YyNS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEYXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgWG1sRGF0ZUltcGwgZXh0ZW5kcyBKYXZhR0RhdGVIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbERhdGUKLXsKLSAgICBwdWJsaWMgWG1sRGF0ZUltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbERhdGUudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbERhdGVJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEYXRlVGltZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERhdGVUaW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjcwMjdkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERhdGVUaW1lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGF0ZVRpbWU7Ci0KLQotcHVibGljIGNsYXNzIFhtbERhdGVUaW1lSW1wbCBleHRlbmRzIEphdmFHRGF0ZUhvbGRlckV4IGltcGxlbWVudHMgWG1sRGF0ZVRpbWUKLXsKLSAgICBwdWJsaWMgWG1sRGF0ZVRpbWVJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxEYXRlVGltZS50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sRGF0ZVRpbWVJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEZWNpbWFsSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRGVjaW1hbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYyMzM1MC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEZWNpbWFsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEZWNpbWFsOwotCi1wdWJsaWMgY2xhc3MgWG1sRGVjaW1hbEltcGwgZXh0ZW5kcyBKYXZhRGVjaW1hbEhvbGRlciBpbXBsZW1lbnRzIFhtbERlY2ltYWwKLXsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERlY2ltYWxSZXN0cmljdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRGVjaW1hbFJlc3RyaWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZTc5ZDAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRGVjaW1hbFJlc3RyaWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERlY2ltYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi1wdWJsaWMgY2xhc3MgWG1sRGVjaW1hbFJlc3RyaWN0aW9uIGV4dGVuZHMgSmF2YURlY2ltYWxIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbERlY2ltYWwKLXsKLSAgICBwdWJsaWMgWG1sRGVjaW1hbFJlc3RyaWN0aW9uKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEb3VibGVJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEb3VibGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZTFjYjMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRG91YmxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEb3VibGU7Ci0KLXB1YmxpYyBjbGFzcyBYbWxEb3VibGVJbXBsIGV4dGVuZHMgSmF2YURvdWJsZUhvbGRlciBpbXBsZW1lbnRzIFhtbERvdWJsZQotewotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRG91YmxlUmVzdHJpY3Rpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERvdWJsZVJlc3RyaWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNjliMDUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRG91YmxlUmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRG91YmxlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotcHVibGljIGNsYXNzIFhtbERvdWJsZVJlc3RyaWN0aW9uIGV4dGVuZHMgSmF2YURvdWJsZUhvbGRlckV4IGltcGxlbWVudHMgWG1sRG91YmxlCi17Ci0gICAgcHVibGljIFhtbERvdWJsZVJlc3RyaWN0aW9uKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEdXJhdGlvbkltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbER1cmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjY3ZWIzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbER1cmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEdXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLQotcHVibGljIGNsYXNzIFhtbER1cmF0aW9uSW1wbCBleHRlbmRzIEphdmFHRHVyYXRpb25Ib2xkZXJFeCBpbXBsZW1lbnRzIFhtbER1cmF0aW9uCi17Ci0gICAgcHVibGljIFhtbER1cmF0aW9uSW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sRHVyYXRpb24udHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbER1cmF0aW9uSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRW50aXRpZXNJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxFbnRpdGllc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwYmQxZi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxFbnRpdGllc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVOVElUSUVTOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxFbnRpdGllc0ltcGwgZXh0ZW5kcyBYbWxMaXN0SW1wbCBpbXBsZW1lbnRzIFhtbEVOVElUSUVTCi17Ci0gICAgcHVibGljIFhtbEVudGl0aWVzSW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sRU5USVRJRVMudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbEVudGl0aWVzSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRW50aXR5SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRW50aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWUxNWRkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEVudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRU5USVRZOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgWG1sRW50aXR5SW1wbCBleHRlbmRzIEphdmFTdHJpbmdIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbEVOVElUWQotewotICAgIHB1YmxpYyBYbWxFbnRpdHlJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxFTlRJVFkudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbEVudGl0eUltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEZsb2F0SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRmxvYXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MTk1OTYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRmxvYXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEZsb2F0OwotCi0KLXB1YmxpYyBjbGFzcyBYbWxGbG9hdEltcGwgZXh0ZW5kcyBKYXZhRmxvYXRIb2xkZXIgaW1wbGVtZW50cyBYbWxGbG9hdAotewotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRmxvYXRSZXN0cmljdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRmxvYXRSZXN0cmljdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDgwMDA3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEZsb2F0UmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRmxvYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi1wdWJsaWMgY2xhc3MgWG1sRmxvYXRSZXN0cmljdGlvbiBleHRlbmRzIEphdmFGbG9hdEhvbGRlckV4IGltcGxlbWVudHMgWG1sRmxvYXQKLXsKLSAgICBwdWJsaWMgWG1sRmxvYXRSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR0RheUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdEYXlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YWE3ZWMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR0RheUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sR0RheTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLQotcHVibGljIGNsYXNzIFhtbEdEYXlJbXBsIGV4dGVuZHMgSmF2YUdEYXRlSG9sZGVyRXggaW1wbGVtZW50cyBYbWxHRGF5Ci17Ci0gICAgcHVibGljIFhtbEdEYXlJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxHRGF5LnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxHRGF5SW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR01vbnRoRGF5SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR01vbnRoRGF5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWFjN2RiLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdNb250aERheUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEdNb250aERheTsKLQotcHVibGljIGNsYXNzIFhtbEdNb250aERheUltcGwgZXh0ZW5kcyBKYXZhR0RhdGVIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbEdNb250aERheQotewotICAgIHB1YmxpYyBYbWxHTW9udGhEYXlJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxHTW9udGhEYXkudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbEdNb250aERheUltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdNb250aEltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdNb250aEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3MWYzOS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxHTW9udGhJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxHTW9udGg7IAotCi1wdWJsaWMgY2xhc3MgWG1sR01vbnRoSW1wbCBleHRlbmRzIEphdmFHRGF0ZUhvbGRlckV4IGltcGxlbWVudHMgWG1sR01vbnRoCi17Ci0gICAgcHVibGljIFhtbEdNb250aEltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbEdNb250aC50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sR01vbnRoSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR1llYXJJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxHWWVhckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUzZWQ1NC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxHWWVhckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEdZZWFyOwotCi1wdWJsaWMgY2xhc3MgWG1sR1llYXJJbXBsIGV4dGVuZHMgSmF2YUdEYXRlSG9sZGVyRXggaW1wbGVtZW50cyBYbWxHWWVhcgotewotICAgIHB1YmxpYyBYbWxHWWVhckltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbEdZZWFyLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxHWWVhckltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdZZWFyTW9udGhJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxHWWVhck1vbnRoSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGJmOGFiLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdZZWFyTW9udGhJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxHWWVhck1vbnRoOyAKLQotcHVibGljIGNsYXNzIFhtbEdZZWFyTW9udGhJbXBsIGV4dGVuZHMgSmF2YUdEYXRlSG9sZGVyRXggaW1wbGVtZW50cyBYbWxHWWVhck1vbnRoCi17Ci0gICAgcHVibGljIFhtbEdZZWFyTW9udGhJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxHWWVhck1vbnRoLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxHWWVhck1vbnRoSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSGV4QmluYXJ5SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSGV4QmluYXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWM4OThkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEhleEJpbmFyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSGV4QmluYXJ5OwotCi0KLXB1YmxpYyBjbGFzcyBYbWxIZXhCaW5hcnlJbXBsIGV4dGVuZHMgSmF2YUhleEJpbmFyeUhvbGRlciBpbXBsZW1lbnRzIFhtbEhleEJpbmFyeQotewotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSGV4QmluYXJ5UmVzdHJpY3Rpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEhleEJpbmFyeVJlc3RyaWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNjMzMzguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSGV4QmluYXJ5UmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEhleEJpbmFyeTsKLQotcHVibGljIGNsYXNzIFhtbEhleEJpbmFyeVJlc3RyaWN0aW9uIGV4dGVuZHMgSmF2YUhleEJpbmFyeUhvbGRlckV4IGltcGxlbWVudHMgWG1sSGV4QmluYXJ5Ci17Ci0gICAgcHVibGljIFhtbEhleEJpbmFyeVJlc3RyaWN0aW9uKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJZEltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbElkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDI2Y2ExLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbElkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSUQ7Ci0KLQotcHVibGljIGNsYXNzIFhtbElkSW1wbCBleHRlbmRzIEphdmFTdHJpbmdIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbElECi17Ci0gICAgcHVibGljIFhtbElkSW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sSUQudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbElkSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSWRSZWZJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJZFJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk4ZTY2My4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJZFJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbElEUkVGOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxJZFJlZkltcGwgZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxJRFJFRgotewotICAgIHB1YmxpYyBYbWxJZFJlZkltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbElEUkVGLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxJZFJlZkltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbElkUmVmc0ltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbElkUmVmc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmMzU3Yy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJZFJlZnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJRFJFRlM7Ci0KLXB1YmxpYyBjbGFzcyBYbWxJZFJlZnNJbXBsIGV4dGVuZHMgWG1sTGlzdEltcGwgaW1wbGVtZW50cyBYbWxJRFJFRlMKLXsKLSAgICBwdWJsaWMgWG1sSWRSZWZzSW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sSURSRUZTLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxJZFJlZnNJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYjA0ZGYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnQ7Ci0KLQotcHVibGljIGNsYXNzIFhtbEludEltcGwgZXh0ZW5kcyBKYXZhSW50SG9sZGVyIGltcGxlbWVudHMgWG1sSW50Ci17Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRSZXN0cmljdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSW50UmVzdHJpY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM4NTI4YS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRSZXN0cmljdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSW50OwotCi1wdWJsaWMgY2xhc3MgWG1sSW50UmVzdHJpY3Rpb24gZXh0ZW5kcyBKYXZhSW50SG9sZGVyRXggaW1wbGVtZW50cyBYbWxJbnQKLXsKLSAgICBwdWJsaWMgWG1sSW50UmVzdHJpY3Rpb24oU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEludGVnZXJJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRlZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGJhOWRlLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEludGVnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludGVnZXI7Ci0KLQotcHVibGljIGNsYXNzIFhtbEludGVnZXJJbXBsIGV4dGVuZHMgSmF2YUludGVnZXJIb2xkZXIgaW1wbGVtZW50cyBYbWxJbnRlZ2VyCi17Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRlZ2VyUmVzdHJpY3Rpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEludGVnZXJSZXN0cmljdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjg4OTNjLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEludGVnZXJSZXN0cmljdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSW50ZWdlcjsKLQotcHVibGljIGNsYXNzIFhtbEludGVnZXJSZXN0cmljdGlvbiBleHRlbmRzIEphdmFJbnRlZ2VySG9sZGVyRXggaW1wbGVtZW50cyBYbWxJbnRlZ2VyCi17Ci0gICAgcHVibGljIFhtbEludGVnZXJSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTGFuZ3VhZ2VJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMYW5ndWFnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5M2U0Zi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMYW5ndWFnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTGFuZ3VhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi1wdWJsaWMgY2xhc3MgWG1sTGFuZ3VhZ2VJbXBsIGV4dGVuZHMgSmF2YVN0cmluZ0hvbGRlckV4IGltcGxlbWVudHMgWG1sTGFuZ3VhZ2UKLXsKLSAgICBwdWJsaWMgWG1sTGFuZ3VhZ2VJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxMYW5ndWFnZS50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sTGFuZ3VhZ2VJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMaXN0SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4ZjNiOC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFNpbXBsZUxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUHJlZml4UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YTUxDaGFyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgWG1sTGlzdEltcGwgZXh0ZW5kcyBYbWxPYmplY3RCYXNlIGltcGxlbWVudHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIHB1YmxpYyBYbWxMaXN0SW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQotCi0gICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOwotICAgIHByaXZhdGUgWG1sU2ltcGxlTGlzdCBfdmFsdWU7Ci0gICAgcHJpdmF0ZSBYbWxTaW1wbGVMaXN0IF9qdmFsdWU7Ci0KLQotCi0gICAgLy8gU0lNUExFIFZBTFVFIEFDQ0VTU09SUyBCRUxPVyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gZ2V0cyByYXcgdGV4dCB2YWx1ZQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG51bGxBc0VtcHR5KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgaWYgKHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbXB1dGVfbGlzdF90ZXh0KExpc3QgeExpc3QpCi0gICAgewotICAgICAgICBpZiAoeExpc3Quc2l6ZSgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQobnVsbEFzRW1wdHkoKChTaW1wbGVWYWx1ZSl4TGlzdC5nZXQoMCkpLmdldFN0cmluZ1ZhbHVlKCkpKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHhMaXN0LnNpemUoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChudWxsQXNFbXB0eSgoKFNpbXBsZVZhbHVlKXhMaXN0LmdldChpKSkuZ2V0U3RyaW5nVmFsdWUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pCi0gICAgewotICAgICAgICByZXR1cm4gY29tcHV0ZV9saXN0X3RleHQoX3ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc19kZWZhdWx0YWJsZV93cyhTdHJpbmcgdikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgWG1sU2ltcGxlTGlzdCBzYXZlZFZhbHVlID0gX3ZhbHVlOwotICAgICAgICAgICAgc2V0X3RleHQodik7Ci0KLSAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIHNhdmVkIHZhbHVlCi0gICAgICAgICAgICBfdmFsdWUgPSBzYXZlZFZhbHVlOwotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgLy8gZmlyc3QgY2hlY2sgYWdhaW5zdCBhbnkgcGF0dGVybnMuLi4KLSAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkgJiYgIV9zY2hlbWFUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHMpKQotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIFNjaGVtYVR5cGUgaXRlbVR5cGUgPSBfc2NoZW1hVHlwZS5nZXRMaXN0SXRlbVR5cGUoKTsKLQotICAgICAgICBYbWxTaW1wbGVMaXN0IG5ld3ZhbCA9IGxleChzLCBpdGVtVHlwZSwgX3Zvb3JWYywgaGFzX3N0b3JlKCkgPyBnZXRfc3RvcmUoKSA6IG51bGwpOwotCi0gICAgICAgIC8vIGNoZWNrIGVudW1lcmF0aW9uCi0gICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZShuZXd2YWwsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKLQotICAgICAgICAvLyB3ZSBtYWRlIGl0IGFsbCB0aGUgd2F5IHRocm91Z2g7IHNvIHdlJ3JlIE9LLgotICAgICAgICBfdmFsdWUgPSBuZXd2YWw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX1NUUklOR0FSUkFZID0gbmV3IFN0cmluZ1swXTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHNwbGl0X2xpc3QoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBpZiAocy5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NUUklOR0FSUkFZOwotICAgICAgICAgICAgICAgIAotICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoaSA8IHMubGVuZ3RoKCkgJiYgWE1MQ2hhci5pc1NwYWNlKHMuY2hhckF0KGkpKSkKLSAgICAgICAgICAgICAgICBpICs9IDE7Ci0gICAgICAgICAgICBpZiAoaSA+PSBzLmxlbmd0aCgpKQotICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nW10pcmVzdWx0LnRvQXJyYXkoRU1QVFlfU1RSSU5HQVJSQVkpOwotICAgICAgICAgICAgc3RhcnQgPSBpOwotICAgICAgICAgICAgd2hpbGUgKGkgPCBzLmxlbmd0aCgpICYmICFYTUxDaGFyLmlzU3BhY2Uocy5jaGFyQXQoaSkpKQotICAgICAgICAgICAgICAgIGkgKz0gMTsKLSAgICAgICAgICAgIHJlc3VsdC5hZGQocy5zdWJzdHJpbmcoc3RhcnQsIGkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFhtbFNpbXBsZUxpc3QgbGV4KFN0cmluZyBzLCBTY2hlbWFUeXBlIGl0ZW1UeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgsIFByZWZpeFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgU3RyaW5nW10gcGFydHMgPSBzcGxpdF9saXN0KHMpOwotCi0gICAgICAgIFhtbEFueVNpbXBsZVR5cGVbXSBuZXdBcnJheSA9IG5ldyBYbWxBbnlTaW1wbGVUeXBlW3BhcnRzLmxlbmd0aF07Ci0gICAgICAgIGJvb2xlYW4gcHVzaGVkID0gZmFsc2U7Ci0gICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnB1c2gobmV3IE5hbWVzcGFjZUNvbnRleHQocmVzb2x2ZXIpKTsKLSAgICAgICAgICAgIHB1c2hlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3QXJyYXlbaV0gPSBpdGVtVHlwZS5uZXdWYWx1ZShwYXJ0c1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGN0eC5pbnZhbGlkKCJMaXN0IGl0ZW0gJyIgKyBwYXJ0c1tpXSArICInIGlzIG5vdCBhIHZhbGlkIHZhbHVlIG9mICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShpdGVtVHlwZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwdXNoZWQpCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wb3AoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFhtbFNpbXBsZUxpc3QoQXJyYXlzLmFzTGlzdChuZXdBcnJheSkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQotICAgIHsKLSAgICAgICAgX3ZhbHVlID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCB4bGlzdFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGNoZWNrX2RhdGVkKCk7Ci0gICAgICAgIHJldHVybiBfdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgbGlzdFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIGNoZWNrX2RhdGVkKCk7Ci0gICAgICAgIGlmIChfdmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBpZiAoX2p2YWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIF9qdmFsdWU7Ci0gICAgICAgIExpc3QgamF2YVJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfdmFsdWUuc2l6ZSgpOyBpKyspCi0gICAgICAgICAgICBqYXZhUmVzdWx0LmFkZChqYXZhX3ZhbHVlKChYbWxPYmplY3QpX3ZhbHVlLmdldChpKSkpOwotICAgICAgICBfanZhbHVlID0gbmV3IFhtbFNpbXBsZUxpc3QoamF2YVJlc3VsdCk7Ci0gICAgICAgIHJldHVybiBfanZhbHVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcGVybWl0c19pbm5lcl9zcGFjZShYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgc3dpdGNoICgoKFNpbXBsZVZhbHVlKW9iaikuaW5zdGFuY2VUeXBlKCkuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NUUklORzoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1RZUEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnNfd2hpdGVfc3BhY2UoU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gcy5pbmRleE9mKCcgJykgPj0gMCB8fAotICAgICAgICAgICAgICAgIHMuaW5kZXhPZignXHQnKSA+PSAwIHx8Ci0gICAgICAgICAgICAgICAgcy5pbmRleE9mKCdcbicpID49IDAgfHwKLSAgICAgICAgICAgICAgICBzLmluZGV4T2YoJ1xyJykgPj0gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRfbGlzdChMaXN0IGxpc3QpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlIGl0ZW1UeXBlID0gX3NjaGVtYVR5cGUuZ2V0TGlzdEl0ZW1UeXBlKCk7Ci0gICAgICAgIFhtbFNpbXBsZUxpc3QgeExpc3Q7Ci0KLSAgICAgICAgYm9vbGVhbiBwdXNoZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKGhhc19zdG9yZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnB1c2gobmV3IE5hbWVzcGFjZUNvbnRleHQoZ2V0X3N0b3JlKCkpKTsKLSAgICAgICAgICAgIHB1c2hlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxBbnlTaW1wbGVUeXBlW10gbmV3dmFsID0gbmV3IFhtbEFueVNpbXBsZVR5cGVbbGlzdC5zaXplKCldOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9iamVjdCBlbnRyeSA9IGxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmICgoZW50cnkgaW5zdGFuY2VvZiBYbWxPYmplY3QpICYmIHBlcm1pdHNfaW5uZXJfc3BhY2UoKFhtbE9iamVjdClsaXN0LmdldChpKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RyaW5ncmVwID0gbGlzdC5nZXQoaSkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zX3doaXRlX3NwYWNlKHN0cmluZ3JlcCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5ld3ZhbFtpXSA9IGl0ZW1UeXBlLm5ld1ZhbHVlKGVudHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhMaXN0ID0gbmV3IFhtbFNpbXBsZUxpc3QoQXJyYXlzLmFzTGlzdChuZXd2YWwpKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwdXNoZWQpCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wb3AoKTsKLSAgICAgICAgfQotICAgICAgICAKLQotICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gY2hlY2sgZW51bWVyYXRpb24gKyBtaW4vbWF4L2V0YwotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh4TGlzdCwgX3NjaGVtYVR5cGUsIF92b29yVmMpOwotICAgICAgICB9Ci0KLSAgICAgICAgX3ZhbHVlID0geExpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlVmFsdWUoWG1sU2ltcGxlTGlzdCBpdGVtcywgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdFtdIGVudW12YWxzID0gc1R5cGUuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKTsKLSAgICAgICAgY2hlY2tFbnVtOiBpZiAoZW51bXZhbHMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtdmFscy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZXF1YWxfeG1sTGlzdHMoaXRlbXMsICgoWG1sT2JqZWN0QmFzZSllbnVtdmFsc1tpXSkueGxpc3RWYWx1ZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgY2hlY2tFbnVtOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJMaXN0ICgiICsgaXRlbXMgKyAiKSBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdGVkIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhtbE9iamVjdCBvOwotICAgICAgICBpbnQgaTsKLQotICAgICAgICBpZiAoKG8gPSBzVHlwZS5nZXRGYWNldCggU2NoZW1hVHlwZS5GQUNFVF9MRU5HVEggKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChpID0gKChTaW1wbGVWYWx1ZSlvKS5nZXRJbnRWYWx1ZSgpKSAhPSBpdGVtcy5zaXplKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiTGlzdCAoIiArIGl0ZW1zICsgIikgZG9lcyBub3QgaGF2ZSAiICsgaSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGl0ZW1zIHBlciBsZW5ndGggZmFjZXQgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChvID0gc1R5cGUuZ2V0RmFjZXQoIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSCApKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGkgPSAoKFNpbXBsZVZhbHVlKW8pLmdldEludFZhbHVlKCkpID4gaXRlbXMuc2l6ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKLSAgICAgICAgICAgICAgICAgICAgIkxpc3QgKCIgKyBpdGVtcyArICIpIGhhcyBvbmx5ICIgKyBpdGVtcy5zaXplKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBpdGVtcywgZmV3ZXIgdGhhbiBtaW4gbGVuZ3RoIGZhY2V0ICgiICsgaSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKG8gPSBzVHlwZS5nZXRGYWNldCggU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIICkpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoaSA9ICgoU2ltcGxlVmFsdWUpbykuZ2V0SW50VmFsdWUoKSkgPCBpdGVtcy5zaXplKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAotICAgICAgICAgICAgICAgICAgICAiTGlzdCAoIiArIGl0ZW1zICsgIikgaGFzICIgKyBpdGVtcy5zaXplKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBpdGVtcywgbW9yZSB0aGFuIG1heCBsZW5ndGggZmFjZXQgKCIgKyBpICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGNvbXBhcmF0b3JzCi0gICAgLy8gcHJvdGVjdGVkIGludCBjb21wYXJlX3RvKFhtbE9iamVjdCBpKSAtIG5vIHNvcnRpbmcgb3JkZXI7IGluaGVyaXQgZnJvbSBiYXNlCi0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVxdWFsX3htbExpc3RzKF92YWx1ZSwgKChYbWxPYmplY3RCYXNlKW9iaikueGxpc3RWYWx1ZSgpKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXF1YWxfeG1sTGlzdHMoTGlzdCBhLCBMaXN0IGIpCi0gICAgewotICAgICAgICBpZiAoYS5zaXplKCkgIT0gYi5zaXplKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFhLmdldChpKS5lcXVhbHMoYi5nZXQoaSkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IHZhbHVlX2hhc2hfY29kZSgpCi0gICAgewotICAgICAgICBpZiAoX3ZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAvLyBoYXNoIGNvZGUgcHJvYmVzIDkgZGlzdHJpYnV0ZWQgdmFsdWVzLCBwbHVzIHRoZSBsYXN0Ci0gICAgICAgIGludCBoYXNoID0gX3ZhbHVlLnNpemUoKTsKLSAgICAgICAgaW50IGluY3IgPSBfdmFsdWUuc2l6ZSgpIC8gOTsKLSAgICAgICAgaWYgKGluY3IgPCAxKQotICAgICAgICAgICAgaW5jciA9IDE7Ci0KLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBfdmFsdWUuc2l6ZSgpOyBpICs9IGluY3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGhhc2ggKj0gMTk7Ci0gICAgICAgICAgICBoYXNoICs9IF92YWx1ZS5nZXQoaSkuaGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpIDwgX3ZhbHVlLnNpemUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaGFzaCAqPSAxOTsKLSAgICAgICAgICAgIGhhc2ggKz0gX3ZhbHVlLmdldChpKS5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCi0gICAgewotICAgICAgICB2YWxpZGF0ZVZhbHVlKChYbWxTaW1wbGVMaXN0KXhsaXN0VmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbExvbmdJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMb25nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ4MzVmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbExvbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbExvbmc7Ci0KLQotcHVibGljIGNsYXNzIFhtbExvbmdJbXBsIGV4dGVuZHMgSmF2YUxvbmdIb2xkZXIgaW1wbGVtZW50cyBYbWxMb25nCi17Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMb25nUmVzdHJpY3Rpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbExvbmdSZXN0cmljdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTNiMmNhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbExvbmdSZXN0cmljdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTG9uZzsKLQotcHVibGljIGNsYXNzIFhtbExvbmdSZXN0cmljdGlvbiBleHRlbmRzIEphdmFMb25nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxMb25nCi17Ci0gICAgcHVibGljIFhtbExvbmdSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTkNOYW1lSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTkNOYW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzAzNWY0Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5DTmFtZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTkNOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWE1MQ2hhcjsKLQotcHVibGljIGNsYXNzIFhtbE5DTmFtZUltcGwgZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxOQ05hbWUKLXsKLSAgICBwdWJsaWMgWG1sTkNOYW1lSW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sTkNOYW1lLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxOQ05hbWVJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgaWYgKCAhWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKHYpICkKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJWYWx1ZSAnIiArIHYgKyAiJyBpdCdzIG5vdCBhIHZhbGlkIE5DTmFtZS4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOYW1lSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTmFtZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZhOTg4ZS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOYW1lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTmFtZTsKLQotCi1wdWJsaWMgY2xhc3MgWG1sTmFtZUltcGwgZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxOYW1lCi17Ci0gICAgcHVibGljIFhtbE5hbWVJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxOYW1lLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxOYW1lSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTmVnYXRpdmVJbnRlZ2VySW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTmVnYXRpdmVJbnRlZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzdjYTVhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5lZ2F0aXZlSW50ZWdlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5lZ2F0aXZlSW50ZWdlcjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sTmVnYXRpdmVJbnRlZ2VySW1wbCBleHRlbmRzIEphdmFJbnRlZ2VySG9sZGVyRXggaW1wbGVtZW50cyBYbWxOZWdhdGl2ZUludGVnZXIKLXsKLSAgICBwdWJsaWMgWG1sTmVnYXRpdmVJbnRlZ2VySW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sTmVnYXRpdmVJbnRlZ2VyLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxOZWdhdGl2ZUludGVnZXJJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxObVRva2VuSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm1Ub2tlbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkNTEzZS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxObVRva2VuSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxOTVRPS0VOOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWE1MQ2hhcjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sTm1Ub2tlbkltcGwgZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxOTVRPS0VOCi17Ci0gICAgcHVibGljIFhtbE5tVG9rZW5JbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxOTVRPS0VOLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxObVRva2VuSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGlmICggIVhNTENoYXIuaXNWYWxpZE5tdG9rZW4odikgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIlZhbHVlICciICsgdiArICInIGl0J3Mgbm90IGEgdmFsaWQgTk1UT0tFTi4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5tVG9rZW5zSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm1Ub2tlbnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYTMwMDguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm1Ub2tlbnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxOTVRPS0VOUzsKLQotCi1wdWJsaWMgY2xhc3MgWG1sTm1Ub2tlbnNJbXBsIGV4dGVuZHMgWG1sTGlzdEltcGwgaW1wbGVtZW50cyBYbWxOTVRPS0VOUwotewotICAgIHB1YmxpYyBYbWxObVRva2Vuc0ltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbE5NVE9LRU5TLnR5cGUsIGZhbHNlKTt9Ci0gICAgcHVibGljIFhtbE5tVG9rZW5zSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjllZmRmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5vbk5lZ2F0aXZlSW50ZWdlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTm9uTmVnYXRpdmVJbnRlZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbCBleHRlbmRzIEphdmFJbnRlZ2VySG9sZGVyRXggaW1wbGVtZW50cyBYbWxOb25OZWdhdGl2ZUludGVnZXIKLXsKLSAgICBwdWJsaWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxOb25OZWdhdGl2ZUludGVnZXJJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb25Qb3NpdGl2ZUludGVnZXJJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb25Qb3NpdGl2ZUludGVnZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYjFkYTYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm9uUG9zaXRpdmVJbnRlZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTm9uUG9zaXRpdmVJbnRlZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxOb25Qb3NpdGl2ZUludGVnZXJJbXBsIGV4dGVuZHMgSmF2YUludGVnZXJIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbE5vblBvc2l0aXZlSW50ZWdlcgotewotICAgIHB1YmxpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXJJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxOb25Qb3NpdGl2ZUludGVnZXIudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbE5vblBvc2l0aXZlSW50ZWdlckltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5vcm1hbGl6ZWRTdHJpbmdJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb3JtYWxpemVkU3RyaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGE2M2EzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5vcm1hbGl6ZWRTdHJpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxOb3JtYWxpemVkU3RyaW5nOwotCi1wdWJsaWMgY2xhc3MgWG1sTm9ybWFsaXplZFN0cmluZ0ltcGwgZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxOb3JtYWxpemVkU3RyaW5nCi17Ci0gICAgcHVibGljIFhtbE5vcm1hbGl6ZWRTdHJpbmdJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxOb3JtYWxpemVkU3RyaW5nLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxOb3JtYWxpemVkU3RyaW5nSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm90YXRpb25JbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb3RhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJkZTkwZi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb3RhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTk9UQVRJT047Ci0KLXB1YmxpYyBjbGFzcyBYbWxOb3RhdGlvbkltcGwgZXh0ZW5kcyBKYXZhTm90YXRpb25Ib2xkZXIgaW1wbGVtZW50cyBYbWxOT1RBVElPTgotewotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm90YXRpb25SZXN0cmljdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm90YXRpb25SZXN0cmljdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDRlZjQ0Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5vdGF0aW9uUmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTk9UQVRJT047Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi1wdWJsaWMgY2xhc3MgWG1sTm90YXRpb25SZXN0cmljdGlvbiBleHRlbmRzIEphdmFOb3RhdGlvbkhvbGRlckV4IGltcGxlbWVudHMgWG1sTk9UQVRJT04KLXsKLSAgICBwdWJsaWMgWG1sTm90YXRpb25SZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sT2JqZWN0QmFzZS5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sT2JqZWN0QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTUxZjQ4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE9iamVjdEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NzkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvcgotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sV2hpdGVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uR2xvYmFsTG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yV2F0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU2NoZW1hVHlwZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlVmlzaXRvckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbGlkYXRvci5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxWYWx1ZU5vdE5pbGxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQXR0cmlidXRlTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERvY3VtZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEdXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlU3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEdXJhdGlvblNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TdHJpbmdFbnVtQWJzdHJhY3RCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuRmlsdGVyWG1sT2JqZWN0OwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYbWxPYmplY3RCYXNlIGltcGxlbWVudHMgVHlwZVN0b3JlVXNlciwgU2VyaWFsaXphYmxlLCBYbWxPYmplY3QsIFNpbXBsZVZhbHVlCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBNQUpPUl9WRVJTSU9OX05VTUJFUiA9IChzaG9ydCkgMTsgLy8gZm9yIHNlcmlhbGl6YXRpb24KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IE1JTk9SX1ZFUlNJT05fTlVNQkVSID0gKHNob3J0KSAxOyAvLyBmb3Igc2VyaWFsaXphdGlvbgotCi0gICAgcHVibGljIGZpbmFsIE9iamVjdCBtb25pdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmIChoYXNfc3RvcmUoKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRfc3RvcmUoKS5nZXRfcm9vdF9vYmplY3QoKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFhtbE9iamVjdEJhc2UgdW5kZXJseWluZyhYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYbWxPYmplY3RCYXNlKQotICAgICAgICAgICAgcmV0dXJuIChYbWxPYmplY3RCYXNlKW9iajsKLSAgICAgICAgd2hpbGUgKG9iaiBpbnN0YW5jZW9mIEZpbHRlclhtbE9iamVjdCkKLSAgICAgICAgICAgIG9iaiA9ICgoRmlsdGVyWG1sT2JqZWN0KW9iaikudW5kZXJseWluZ1htbE9iamVjdCgpOwotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWG1sT2JqZWN0QmFzZSkKLSAgICAgICAgICAgIHJldHVybiAoWG1sT2JqZWN0QmFzZSlvYmo7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vbi1uYXRpdmUgaW1wbGVtZW50YXRpb25zIG9mIFhtbE9iamVjdCBzaG91bGQgZXh0ZW5kIEZpbHRlclhtbE9iamVjdCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBYbWxPYmplY3QgY29weSgpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gaW1tdXRhYmxlIG9iamVjdHMgZG9uJ3QgZ2V0IGNvcGllZC4gVGhleSdyZSBpbW11dGFibGUKLSAgICAgICAgICAgIGlmIChpc0ltbXV0YWJsZSgpKQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotCi0gICAgICAgICAgICBjaGVja19vcnBoYW5lZCgpOwotCi0gICAgICAgICAgICAvLyBjb3B5IHRoZSB0eXBlCi0gICAgICAgICAgICBYbWxPYmplY3QgcmVzdWx0ID0gZ2V0X3N0b3JlKCkuZ2V0X3NjaGVtYXR5cGVsb2FkZXIoKS5uZXdJbnN0YW5jZShzY2hlbWFUeXBlKCksIG51bGwpOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8vIGNvcHkgdGhlIGRhdGEKLSAgICAgICAgICAgIFhtbE9iamVjdEJhc2UgdGFyZ2V0ID0gdW5kZXJseWluZyhyZXN1bHQpOwotICAgICAgICAgICAgdGFyZ2V0LmdldF9zdG9yZSgpLmNvcHlfY29udGVudHNfZnJvbShnZXRfc3RvcmUoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sRG9jdW1lbnRQcm9wZXJ0aWVzIGRvY3VtZW50UHJvcGVydGllcygpCi0gICAgICAgIHsgWG1sQ3Vyc29yIGN1ciA9IG5ld0N1cnNvckZvcmNlKCk7IHRyeSB7IHJldHVybiBjdXIuZG9jdW1lbnRQcm9wZXJ0aWVzKCk7IH0gZmluYWxseSB7IGN1ci5kaXNwb3NlKCk7IH0gfQotCi0gICAgcHVibGljIFhNTElucHV0U3RyZWFtIG5ld1hNTElucHV0U3RyZWFtKCkKLSAgICAgICAgeyByZXR1cm4gbmV3WE1MSW5wdXRTdHJlYW0obnVsbCk7IH0KLQotICAgIHB1YmxpYyBYTUxJbnB1dFN0cmVhbSBuZXdYTUxJbnB1dFN0cmVhbShYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgICAgIHsgWG1sQ3Vyc29yIGN1ciA9IG5ld0N1cnNvckZvcmNlKCk7IHRyeSB7IHJldHVybiBjdXIubmV3WE1MSW5wdXRTdHJlYW0obWFrZUlubmVyT3B0aW9ucyhvcHRpb25zKSk7IH0gZmluYWxseSB7IGN1ci5kaXNwb3NlKCk7IH0gfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIG5ld0lucHV0U3RyZWFtKCkKLSAgICAgICAgeyByZXR1cm4gbmV3SW5wdXRTdHJlYW0obnVsbCk7IH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbShYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgICAgIHsgWG1sQ3Vyc29yIGN1ciA9IG5ld0N1cnNvckZvcmNlKCk7IHRyeSB7IHJldHVybiBjdXIubmV3SW5wdXRTdHJlYW0obWFrZUlubmVyT3B0aW9ucyhvcHRpb25zKSk7IH0gZmluYWxseSB7IGN1ci5kaXNwb3NlKCk7IH0gfQotCi0gICAgcHVibGljIFJlYWRlciBuZXdSZWFkZXIoKQotICAgICAgICB7IHJldHVybiBuZXdSZWFkZXIobnVsbCk7IH0KLQotICAgIHB1YmxpYyBSZWFkZXIgbmV3UmVhZGVyKFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICAgICAgeyBYbWxDdXJzb3IgY3VyID0gbmV3Q3Vyc29yRm9yY2UoKTsgdHJ5IHsgcmV0dXJuIGN1ci5uZXdSZWFkZXIobWFrZUlubmVyT3B0aW9ucyhvcHRpb25zKSk7IH0gZmluYWxseSB7IGN1ci5kaXNwb3NlKCk7IH0gfQotCi0gICAgcHVibGljIE5vZGUgbmV3RG9tTm9kZSgpCi0gICAgICAgIHsgcmV0dXJuIG5ld0RvbU5vZGUobnVsbCk7IH0KLQotICAgIHB1YmxpYyBOb2RlIG5ld0RvbU5vZGUoWG1sT3B0aW9ucyBvcHRpb25zKQotICAgICAgICB7IFhtbEN1cnNvciBjdXIgPSBuZXdDdXJzb3JGb3JjZSgpOyB0cnkgeyByZXR1cm4gY3VyLm5ld0RvbU5vZGUobWFrZUlubmVyT3B0aW9ucyhvcHRpb25zKSk7IH0gZmluYWxseSB7IGN1ci5kaXNwb3NlKCk7IH0gfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZShDb250ZW50SGFuZGxlciBjaCwgTGV4aWNhbEhhbmRsZXIgbGgsIFhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7IFhtbEN1cnNvciBjdXIgPSBuZXdDdXJzb3JGb3JjZSgpOyB0cnkgeyBjdXIuc2F2ZShjaCwgbGgsIG1ha2VJbm5lck9wdGlvbnMob3B0aW9ucykpOyB9IGZpbmFsbHkgeyBjdXIuZGlzcG9zZSgpOyB9IH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoRmlsZSBmaWxlLCBYbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7IFhtbEN1cnNvciBjdXIgPSBuZXdDdXJzb3JGb3JjZSgpOyB0cnkgeyBjdXIuc2F2ZShmaWxlLCBtYWtlSW5uZXJPcHRpb25zKG9wdGlvbnMpKTsgfSBmaW5hbGx5IHsgY3VyLmRpc3Bvc2UoKTsgfSB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKE91dHB1dFN0cmVhbSBvcywgWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgeyBYbWxDdXJzb3IgY3VyID0gbmV3Q3Vyc29yRm9yY2UoKTsgdHJ5IHsgY3VyLnNhdmUob3MsIG1ha2VJbm5lck9wdGlvbnMob3B0aW9ucykpOyB9IGZpbmFsbHkgeyBjdXIuZGlzcG9zZSgpOyB9IH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoV3JpdGVyIHcsIFhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsgWG1sQ3Vyc29yIGN1ciA9IG5ld0N1cnNvckZvcmNlKCk7IHRyeSB7IGN1ci5zYXZlKHcsIG1ha2VJbm5lck9wdGlvbnMob3B0aW9ucykpOyB9IGZpbmFsbHkgeyBjdXIuZGlzcG9zZSgpOyB9IH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoQ29udGVudEhhbmRsZXIgY2gsIExleGljYWxIYW5kbGVyIGxoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsgc2F2ZSggY2gsIGxoLCBudWxsICk7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgeyBzYXZlKCBmaWxlLCBudWxsICk7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgeyBzYXZlKCBvcywgbnVsbCApOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgeyBzYXZlKCB3LCBudWxsICk7IH0KLQotICAgIHB1YmxpYyBYbWxDdXJzb3IgbmV3Q3Vyc29yRm9yY2UoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBlbnN1cmVTdG9yZSgpLm5ld0N1cnNvcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBYbWxPYmplY3QgZW5zdXJlU3RvcmUoKQotICAgIHsKLSAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0KLSAgICAgICAgY2hlY2tfZGF0ZWQoKTsKLQotICAgICAgICBTdHJpbmcgdmFsdWUgPQotICAgICAgICAgICAgKF9mbGFncyAmIEZMQUdfTklMKSAhPSAwCi0gICAgICAgICAgICAgICAgPyAiIgotICAgICAgICAgICAgICAgIDogY29tcHV0ZV90ZXh0KCBoYXNfc3RvcmUoKSA/IGdldF9zdG9yZSgpIDogbnVsbCApOwotCi0gICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCkuc2V0RG9jdW1lbnRUeXBlKHNjaGVtYVR5cGUoKSk7Ci0KLSAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSggb3B0aW9ucyApOwotCi0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLmluc2VydENoYXJzKCB2YWx1ZSApOwotCi0gICAgICAgIHJldHVybiB4OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFhtbE9wdGlvbnMgbWFrZUlubmVyT3B0aW9ucyhYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgewotICAgICAgICBYbWxPcHRpb25zIGlubmVyT3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCBvcHRpb25zICk7Ci0gICAgICAgIGlubmVyT3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuU0FWRV9JTk5FUiApOwotICAgICAgICByZXR1cm4gaW5uZXJPcHRpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxDdXJzb3IgbmV3Q3Vyc29yKCkKLSAgICB7Ci0gICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19TVE9SRSkgPT0gMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlhNTCBWYWx1ZSBPYmplY3RzIGNhbm5vdCBjcmVhdGUgY3Vyc29ycyIpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja19vcnBoYW5lZCgpOwotICAgICAgICAgICAgcmV0dXJuIGdldF9zdG9yZSgpLm5ld19jdXJzb3IoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKTsKLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGluc3RhbmNlVHlwZSgpCi0gICAgICAgIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgcmV0dXJuIGlzTmlsKCkgPyBudWxsIDogc2NoZW1hVHlwZSgpOyB9IH0KLQotICAgIHByaXZhdGUgU2NoZW1hRmllbGQgc2NoZW1hRmllbGQoKSB7Ci0gICAgICAgIFNjaGVtYVR5cGUgc3QgPSBzY2hlbWFUeXBlKCk7Ci0gICAgICAgIFNjaGVtYUZpZWxkIGZpZWxkOwotCi0gICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoaXMgZmllbGQgaGFzIGFuIGFub255bW91cyB0eXBlCi0gICAgICAgIGZpZWxkID0gc3QuZ2V0Q29udGFpbmVyRmllbGQoKTsKLQotICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCkKLSAgICAgICAgICAgIGZpZWxkID0gZ2V0X3N0b3JlKCkuZ2V0X3NjaGVtYV9maWVsZCgpOwotCi0gICAgICAgIHJldHVybiBmaWVsZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2UgX3Zvb3JWYyB3aGVuIHlvdSB3YW50IHRvIHRocm93IGEgVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIHdoZW4KLSAgICAgKiB2YWxpZGF0aW5nIGEgc2ltcGxlIHR5cGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVmFsdWVPdXRPZlJhbmdlVmFsaWRhdGlvbkNvbnRleHQgaW1wbGVtZW50cyBWYWxpZGF0aW9uQ29udGV4dAotICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgaW52YWxpZChTdHJpbmcgbWVzc2FnZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiggbWVzc2FnZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBzdXBwbHkgdmFsaWRhdGlvbiBjb250ZXh0IGZvciB0aGUgdmFsaWRhdGVfdmFsdWUgbWV0aG9kcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEltbXV0YWJsZVZhbHVlVmFsaWRhdGlvbkNvbnRleHQgaW1wbGVtZW50cyBWYWxpZGF0aW9uQ29udGV4dAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBYbWxPYmplY3QgX2xvYzsKLSAgICAgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIF9jb2xsOwotICAgICAgICBJbW11dGFibGVWYWx1ZVZhbGlkYXRpb25Db250ZXh0KENvbGxlY3Rpb24gY29sbCwgWG1sT2JqZWN0IGxvYykKLSAgICAgICAgewotICAgICAgICAgICAgX2NvbGwgPSBjb2xsOwotICAgICAgICAgICAgX2xvYyA9IGxvYzsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBpbnZhbGlkKFN0cmluZyBtZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgIF9jb2xsLmFkZChYbWxFcnJvci5mb3JPYmplY3QobWVzc2FnZSwgX2xvYykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBWYWxpZGF0aW9uQ29udGV4dCBfdm9vclZjID0gbmV3IFZhbHVlT3V0T2ZSYW5nZVZhbGlkYXRpb25Db250ZXh0KCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSgpCi0gICAgICAgIHsgcmV0dXJuIHZhbGlkYXRlKG51bGwpOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgewotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfU1RPUkUpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19JTU1VVEFCTEUpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlX2ltbXV0YWJsZShvcHRpb25zKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlhNTCBvYmplY3RzIHdpdGggbm8gdW5kZXJseWluZyBzdG9yZSBjYW5ub3QgYmUgdmFsaWRhdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX09SUEhBTkVEKSAhPSAwKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZURpc2Nvbm5lY3RlZEV4Y2VwdGlvbigpOwotCi0gICAgICAgICAgICBTY2hlbWFGaWVsZCBmaWVsZCA9IHNjaGVtYUZpZWxkKCk7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlIHR5cGUgPSBzY2hlbWFUeXBlKCk7Ci0KLSAgICAgICAgICAgIFR5cGVTdG9yZSB0eXBlU3RvcmUgPSBnZXRfc3RvcmUoKTsKLQotICAgICAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9Ci0gICAgICAgICAgICAgICAgbmV3IFZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgZmllbGQsIHR5cGVTdG9yZS5nZXRfc2NoZW1hdHlwZWxvYWRlcigpLCBvcHRpb25zLCBudWxsKTsKLQotICAgICAgICAgICAgdHlwZVN0b3JlLnZhbGlkYXRlKCB2YWxpZGF0b3IgKTsKLQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRvci5pc1ZhbGlkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVfaW1tdXRhYmxlKFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICB7Ci0gICAgICAgIENvbGxlY3Rpb24gZXJyb3JMaXN0ZW5lciA9IG9wdGlvbnMgPT0gbnVsbCA/IG51bGwgOiAoQ29sbGVjdGlvbilvcHRpb25zLmdldChYbWxPcHRpb25zLkVSUk9SX0xJU1RFTkVSKTsKLSAgICAgICAgWG1sRXJyb3JXYXRjaGVyIHdhdGNoZXIgPSBuZXcgWG1sRXJyb3JXYXRjaGVyKGVycm9yTGlzdGVuZXIpOwotICAgICAgICBpZiAoIXNjaGVtYVR5cGUoKS5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gY2Fubm90IGhhdmUgYW55IHJlcXVpcmVkIGF0dHJpYnV0ZXMgb3IgZWxlbWVudHMKLSAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5W10gcHJvcGVydGllcyA9IHNjaGVtYVR5cGUoKS5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNbaV0uZ2V0TWluT2NjdXJzKCkuc2lnbnVtKCkgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNbaV0uaXNBdHRyaWJ1dGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoZXIuYWRkKFhtbEVycm9yLmZvck9iamVjdCgiTWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShwcm9wZXJ0aWVzW2ldLmdldE5hbWUoKSksIHRoaXMpKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hlci5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KCJNaXNzaW5nIHJlcXVpcmVkIGVsZW1lbnQgIiArIFFOYW1lSGVscGVyLnByZXR0eShwcm9wZXJ0aWVzW2ldLmdldE5hbWUoKSksIHRoaXMpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlKCkuZ2V0Q29udGVudFR5cGUoKSAhPSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UKQotICAgICAgICAgICAgICAgIHJldHVybiAhd2F0Y2hlci5oYXNFcnJvcigpOyAvLyBkb24ndCB2YWxpZGF0ZSBub24tc2ltcGxlLWNvbnRlbnQKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB0ZXh0ID0gKFN0cmluZylfdGV4dHNvdXJjZTsKLSAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHRleHQgPSAiIjsKLSAgICAgICAgdmFsaWRhdGVfc2ltcGxldmFsKHRleHQsIG5ldyBJbW11dGFibGVWYWx1ZVZhbGlkYXRpb25Db250ZXh0KHdhdGNoZXIsIHRoaXMpKTsKLSAgICAgICAgcmV0dXJuICF3YXRjaGVyLmhhc0Vycm9yKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCi0gICAgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgWG1sT2JqZWN0W10gX3R5cGVkQXJyYXkoWG1sT2JqZWN0W10gaW5wdXQpCi0gICAgewotICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID09IDApCi0gICAgICAgICAgICByZXR1cm4gaW5wdXQ7Ci0gICAgICAgIFNjaGVtYVR5cGUgY29tbW9uVHlwZSA9IGlucHV0WzBdLnNjaGVtYVR5cGUoKTsKLSAgICAgICAgaWYgKGNvbW1vblR5cGUuZXF1YWxzKFhtbE9iamVjdC50eXBlKSkKLSAgICAgICAgICAgIHJldHVybiBpbnB1dDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgY29tbW9uVHlwZSA9IGNvbW1vblR5cGUuZ2V0Q29tbW9uQmFzZVR5cGUoaW5wdXRbaV0uc2NoZW1hVHlwZSgpKTsKLSAgICAgICAgICAgIGlmIChjb21tb25UeXBlLmVxdWFscyhYbWxPYmplY3QudHlwZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0OwotICAgICAgICB9Ci0gICAgICAgIENsYXNzIGRlc2lyZWRDbGFzcyA9IGNvbW1vblR5cGUuZ2V0SmF2YUNsYXNzKCk7Ci0gICAgICAgIHdoaWxlIChkZXNpcmVkQ2xhc3MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgY29tbW9uVHlwZSA9IGNvbW1vblR5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgICAgIGlmIChYbWxPYmplY3QudHlwZS5lcXVhbHMoY29tbW9uVHlwZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0OwotICAgICAgICAgICAgZGVzaXJlZENsYXNzID0gY29tbW9uVHlwZS5nZXRKYXZhQ2xhc3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhtbE9iamVjdFtdIHJlc3VsdCA9IChYbWxPYmplY3RbXSlBcnJheS5uZXdJbnN0YW5jZShkZXNpcmVkQ2xhc3MsIGlucHV0Lmxlbmd0aCk7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoaW5wdXQsIDAsIHJlc3VsdCwgMCwgaW5wdXQubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0W10gc2VsZWN0UGF0aCAoIFN0cmluZyBwYXRoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzZWxlY3RQYXRoKCBwYXRoLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdFtdIHNlbGVjdFBhdGggKCBTdHJpbmcgcGF0aCwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCBbXSBzZWxlY3Rpb25zOwotCi0gICAgICAgIC8vIGFsbCB1c2VyLWxldmVsIGNvZGU7IGRvZXNuJ3QgbmVlZCB0byBiZSBzeW5jaHJvbml6ZWQKLQotICAgICAgICBYbWxDdXJzb3IgYyA9IG5ld0N1cnNvcigpOwotCi0gICAgICAgIGlmIChjID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24oKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgYy5zZWxlY3RQYXRoKCBwYXRoLCBvcHRpb25zICk7Ci0KLSAgICAgICAgICAgIGlmICghYy5oYXNOZXh0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgc2VsZWN0aW9ucyA9IG5ldyBYbWxPYmplY3RbIDAgXTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZWxlY3Rpb25zID0gbmV3IFhtbE9iamVjdCBbIGMuZ2V0U2VsZWN0aW9uQ291bnQoKSBdOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBjLnRvTmV4dFNlbGVjdGlvbigpIDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChzZWxlY3Rpb25zWyBpIF0gPSBjLmdldE9iamVjdCgpKSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGF0aCBtdXN0IHNlbGVjdCBvbmx5IGVsZW1lbnRzICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBhdHRyaWJ1dGVzIiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgYy5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gX3R5cGVkQXJyYXkoc2VsZWN0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdFtdIGV4ZWNRdWVyeSAoIFN0cmluZyBwYXRoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBleGVjUXVlcnkoIHBhdGgsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0W10gZXhlY1F1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmUgdHlwZVN0b3JlID0gZ2V0X3N0b3JlKCk7Ci0KLSAgICAgICAgICAgIGlmICh0eXBlU3RvcmUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgICAgICBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZG8gWFF1ZXJ5IG9uIFhNTCBWYWx1ZSBPYmplY3RzIiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3R5cGVkQXJyYXkodHlwZVN0b3JlLmV4ZWNfcXVlcnkoIHF1ZXJ5RXhwciwgb3B0aW9ucyApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbiggZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBjaGFuZ2VUeXBlKFNjaGVtYVR5cGUgdHlwZSkKLSAgICB7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiSW52YWxpZCB0eXBlIChudWxsKSIgKTsKLQotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfU1RPUkUpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAgICAgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlhNTCBWYWx1ZSBPYmplY3RzIGNhbm5vdCBoYXZlIHRoaWVyIHR5cGUgY2hhbmdlZCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja19vcnBoYW5lZCgpOwotICAgICAgICAgICAgcmV0dXJuIChYbWxPYmplY3QpIGdldF9zdG9yZSgpLmNoYW5nZV90eXBlKCB0eXBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBfZmxhZ3M7Ci0gICAgcHJpdmF0ZSBPYmplY3QgX3RleHRzb3VyY2U7Ci0KLSAgICBwcm90ZWN0ZWQgWG1sT2JqZWN0QmFzZSgpCi0gICAgewotICAgICAgICBfZmxhZ3MgPSBGTEFHX05JTExBQkxFIHwgRkxBR19OSUw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdF9mbGFncyhTY2hlbWFQcm9wZXJ0eSBwcm9wKQotICAgIHsKLSAgICAgICAgaWYgKHByb3AgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIGlmIChwcm9wLmhhc0RlZmF1bHQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSB8fAotICAgICAgICAgICAgcHJvcC5oYXNGaXhlZCgpID09IFNjaGVtYVByb3BlcnR5LlZBUklBQkxFIHx8Ci0gICAgICAgICAgICBwcm9wLmhhc05pbGxhYmxlKCkgPT0gU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgX2ZsYWdzIHw9Ci0gICAgICAgICAgICAocHJvcC5oYXNEZWZhdWx0KCkgPT0gU2NoZW1hUHJvcGVydHkuTkVWRVIgPyAwIDogVHlwZVN0b3JlLkhBU0RFRkFVTFQpIHwKLSAgICAgICAgICAgIChwcm9wLmhhc0ZpeGVkKCkgPT0gU2NoZW1hUHJvcGVydHkuTkVWRVIgPyAwIDogVHlwZVN0b3JlLkZJWEVEKSB8Ci0gICAgICAgICAgICAocHJvcC5oYXNOaWxsYWJsZSgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5OSUxMQUJMRSkgfAotICAgICAgICAgICAgKEZMQUdfTk9UX1ZBUklBQkxFKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIGFzc2VydCBUeXBlU3RvcmUuTklMTEFCTEUgICA9PSAxOwotICAgICAgICBhc3NlcnQgVHlwZVN0b3JlLkhBU0RFRkFVTFQgPT0gMjsKLSAgICAgICAgYXNzZXJ0IFR5cGVTdG9yZS5GSVhFRCAgICAgID09IDQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfTklMTEFCTEUgICAgICAgID0gVHlwZVN0b3JlLk5JTExBQkxFOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0hBU0RFRkFVTFQgICAgICA9IFR5cGVTdG9yZS5IQVNERUZBVUxUOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZJWEVEICAgICAgICAgICA9IFR5cGVTdG9yZS5GSVhFRDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BVFRSSUJVVEUgICAgICAgPSAgICAgODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TVE9SRSAgICAgICAgICAgPSAgICAxNjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19WQUxVRV9EQVRFRCAgICAgPSAgICAzMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19OSUwgICAgICAgICAgICAgPSAgICA2NDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19OSUxfREFURUQgICAgICAgPSAgIDEyODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19JU0RFRkFVTFQgICAgICAgPSAgIDI1NjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19FTEVNRU5UX0RBVEVEICAgPSAgIDUxMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TRVRUSU5HREVGQVVMVCAgPSAgMTAyNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19PUlBIQU5FRCAgICAgICAgPSAgMjA0ODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19JTU1VVEFCTEUgICAgICAgPSAgNDA5NjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DT01QTEVYVFlQRSAgICAgPSAgODE5MjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DT01QTEVYQ09OVEVOVCAgPSAxNjM4NDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19OT1RfVkFSSUFCTEUgICAgPSAzMjc2ODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19WQUxJREFURV9PTl9TRVQgPSA2NTUzNjsKLQotCi0gICAgLyoqCi0gICAgICogVGhlIHRocmVlIGRhdGVkIGZsYWdzIGFyZSBhbHdheXMgc3RhY2tlZDoKLSAgICAgKiAgICAgRkxBR19FTEVNRU5UX0RBVEVEIGltcGxpZXMgRkxBR19OSUxfREFURUQgaXMgc2V0Ci0gICAgICogICAgIEZMQUdfTklMX0RBVEVEIGltcGxpZXMgRkxBR19URVhUX0RBVEVEIGlzIHNldC4KLSAgICAgKiBjaGVja2VycyB3b3JrIG9uIHRoZSBmbGFncyBmcm9tIHRvcCB0byBib3R0b20uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdTX0RBVEVEID0KLSAgICAgICAgICAgIEZMQUdfVkFMVUVfREFURUQgfCBGTEFHX05JTF9EQVRFRCB8IEZMQUdfRUxFTUVOVF9EQVRFRDsKLQotICAgIC8qKgotICAgICAqIFRoZSB0aHJlZSBlbGVtZW50IHN0YXR1cyBmbGFncyBoYXZlIG9uZSBpbnRlcnJsYXRpb25zaGlvcDoKLSAgICAgKiAgICAgRkxBR19GSVhFRCBpbXBsaWVzIEZMQUdfSEFTREVGQVVMVCBpcyBzZXQuCi0gICAgICogVGhlc2UgZmxhZ3MgYXJlIHVzZWQgd2hlbiBzZXR0aW5nIG5pbHMsIGRlZmF1bHRzLCBzdHJpbmdzLgotICAgICAqIFNpbmNlIGFuIGluaXRpYWwgZ2V0IGltcGxpZXMgc2V0dGluZyBmcm9tIHRleHQsIHRoZXkncmUKLSAgICAgKiBhbHNvIHVzZWQgZHVyaW5nIGdldHRpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdTX0VMRU1FTlQgPQotICAgICAgICAgICAgRkxBR19OSUxMQUJMRSB8IEZMQUdfRklYRUQgfCBGTEFHX0hBU0RFRkFVTFQ7Ci0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSByZXN0cmljdGlvbiBzdWJjbGFzc2VzIHdpdGhpbiB0aGVpciBjb25zdHJ1Y3RvcnMgdG8gZW5hYmxlCi0gICAgICogY29tcGxleCB0eXBlIHN1cHBvcnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbXBsZXhUeXBlKGJvb2xlYW4gY29tcGxleFR5cGUsIGJvb2xlYW4gY29tcGxleENvbnRlbnQpCi0gICAgewotICAgICAgICBfZmxhZ3MgfD0gKGNvbXBsZXhUeXBlID8gRkxBR19DT01QTEVYVFlQRSA6IDApIHwKLSAgICAgICAgICAgICAgICAgIChjb21wbGV4Q29udGVudCA/IEZMQUdfQ09NUExFWENPTlRFTlQgOiAwKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfaXNDb21wbGV4VHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIChfZmxhZ3MgJiBGTEFHX0NPTVBMRVhUWVBFKSAhPSAwOyB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfaXNDb21wbGV4Q29udGVudCgpCi0gICAgICAgIHsgcmV0dXJuIChfZmxhZ3MgJiBGTEFHX0NPTVBMRVhDT05URU5UKSAhPSAwOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0ZU9uU2V0KCkgewotICAgICAgICBfZmxhZ3MgfD0gRkxBR19WQUxJREFURV9PTl9TRVQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX3ZhbGlkYXRlT25TZXQoKQotICAgICAgICB7IHJldHVybiAoX2ZsYWdzICYgRkxBR19WQUxJREFURV9PTl9TRVQpICE9IDA7IH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIHZhbHVlIGlzIG5pbGxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc05pbCgpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tfZGF0ZWQoKTsKLSAgICAgICAgICAgIHJldHVybiAoKF9mbGFncyAmIEZMQUdfTklMKSAhPSAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIHZhbHVlIGlzIGZpeGVkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRml4ZWQoKQotICAgIHsKLSAgICAgICAgY2hlY2tfZWxlbWVudF9kYXRlZCgpOwotICAgICAgICByZXR1cm4gKChfZmxhZ3MgJiBGTEFHX0ZJWEVEKSAhPSAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhbGxvd2VkIHRvIGJlIG5pbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc05pbGxhYmxlKCkKLSAgICB7Ci0gICAgICAgIGNoZWNrX2VsZW1lbnRfZGF0ZWQoKTsKLSAgICAgICAgcmV0dXJuICgoX2ZsYWdzICYgRkxBR19OSUxMQUJMRSkgIT0gMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgY3VycmVudGx5IGRlZmF1bHRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlZmF1bHRhYmxlKCkKLSAgICB7Ci0gICAgICAgIGNoZWNrX2VsZW1lbnRfZGF0ZWQoKTsKLSAgICAgICAgcmV0dXJuICgoX2ZsYWdzICYgRkxBR19IQVNERUZBVUxUKSAhPSAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBjdXJyZW50bHkgZGVmYXVsdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGVmYXVsdCgpCi0gICAgewotICAgICAgICBjaGVja19kYXRlZCgpOwotICAgICAgICByZXR1cm4gKChfZmxhZ3MgJiBGTEFHX0lTREVGQVVMVCkgIT0gMCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBOaWxzIHRoZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXROaWwoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0KLSAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBuaWxsYWJsZSwgdGhyb3cgZXhjZXB0aW9uIG9uIHNldE5pbCh0cnVlKQotICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX05JTExBQkxFKSA9PSAwKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU5vdE5pbGxhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgICAgIC8vIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgemVybyB0aGUgdmFsdWUgdG8gcmVmbGVjdCBuaWwKLSAgICAgICAgICAgIHNldF9uaWwoKTsKLQotICAgICAgICAgICAgLy8gc2V0IHRoZSBuaWwgZmxhZwotICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfTklMOwotCi0gICAgICAgICAgICAvLyBvcmRpbmFyeSBjb21taXQgZXhjZXB0IG5vIGNsZWFyaW5nIG9mIG5pbCBmbGFnCi0gICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfU1RPUkUpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2ZsYWdzICY9IH5GTEFHU19EQVRFRDsKLSAgICAgICAgICAgICAgICBnZXRfc3RvcmUoKS5pbnZhbGlkYXRlX25pbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF90ZXh0c291cmNlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgZm9yIHNpdHVhdGlvbnMgd2hlcmUgdGhlc2UgZmxhZ3MgbXVzdCBiZSBwYXNzZWQgb24gdG8KLSAgICAgKiBjaGFpbmVkIHZhbHVlcy4gKFNlZSBYbWxBbnlTaW1wbGVUeXBlIChhbGxTaW1wbGVWYWx1ZSksIHVuaW9uCi0gICAgICogaW1wbGVtZW50YXRpb25zKS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGVsZW1lbnRGbGFncygpCi0gICAgewotICAgICAgICBjaGVja19lbGVtZW50X2RhdGVkKCk7Ci0gICAgICAgIHJldHVybiAoX2ZsYWdzICYgRkxBR1NfRUxFTUVOVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBtYWtlIGEgZnJlZS1zdGFuZGluZyB4bWwgc2ltcGxlIHZhbHVlIGluc3RhbmNlIGltbXV0YWJsZS4KLSAgICAgKiBUaGlzIGlzIGEgb25lLXdheSBzdHJlZXQsIGFuZCBpdCBpcyBpbGxlZ2FsIHRvIGF0dGVtcHQgdG8gbWFrZSBhCi0gICAgICogdmFsdWUgdGhhdCBpcyBlbWJlZGRlZCBpbiBhbiB4bWwgZG9jdW1lbnQgaW1tdXRhYmxlLgotICAgICAqCi0gICAgICogT25jZSBhIHZhbHVlIGlzIG1hcmtlZCBhcyBpbW11dGFibGUsIGl0IGlzIGlsbGVnYWwgdG8gY2FsbCBzZXR0ZXJzCi0gICAgICogb2YgYW55IGtpbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW1tdXRhYmxlKCkKLSAgICB7Ci0gICAgICAgIGlmICgoX2ZsYWdzICYgKEZMQUdfSU1NVVRBQkxFIHwgRkxBR19TVE9SRSkpICE9IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgX2ZsYWdzIHw9IEZMQUdfSU1NVVRBQkxFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElzIHRoaXMgaW5zdGFuY2UgYW4gaW1tdXRhYmxlIHZhbHVlPwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSW1tdXRhYmxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoX2ZsYWdzICYgRkxBR19JTU1VVEFCTEUpICE9IDA7Ci0gICAgfQotCi0KLQotCi0gICAgLy8gVEVYVFVTRVIgaW1wbGVtZW50YXRpb24KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB0byBpbml0aWFsaXplIHRoZSBUeXBlU3RvcmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgWG1sT2JqZWN0Ci0gICAgICogaW1wbGVtZW50YXRpb24uIElmIG5vdCBjYWxsZWQsIHRoaXMgaXMgYSBmcmVlLWZsb2F0aW5nIHZhbHVlIGhvbGRlci4KLSAgICAgKgotICAgICAqIFdoZW4gYSB2YWx1ZSBpcyBmaXJzdCBhdHRhY2hlZCwgaXQgaXMgcHV0IGluIGEgY29tcGxldGVseSBpbnZhbGlkYXRlZAotICAgICAqIHN0YXRlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGF0dGFjaF9zdG9yZShUeXBlU3RvcmUgc3RvcmUpCi0gICAgewotICAgICAgICBfdGV4dHNvdXJjZSA9IHN0b3JlOwotICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfSU1NVVRBQkxFKSAhPSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICBfZmxhZ3MgfD0gRkxBR19TVE9SRSB8IEZMQUdfVkFMVUVfREFURUQgfCBGTEFHX05JTF9EQVRFRCB8IEZMQUdfRUxFTUVOVF9EQVRFRDsKLQotICAgICAgICBpZiAoc3RvcmUuaXNfYXR0cmlidXRlKCkpCi0gICAgICAgICAgICBfZmxhZ3MgfD0gRkxBR19BVFRSSUJVVEU7Ci0KLSAgICAgICAgaWYgKHN0b3JlLnZhbGlkYXRlX29uX3NldCgpKQotICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfVkFMSURBVEVfT05fU0VUOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSBhIFR5cGVTdG9yZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0ZXh0IGhhcyBiZWVuCi0gICAgICogaW52YWxpZGF0ZWQgYW5kIHNob3VsZCBiZSBmZXRjaGVkIG5leHQgdGltZSB0aGUgdmFsdWUgaXMKLSAgICAgKiBuZWVkZWQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgaW52YWxpZGF0ZV92YWx1ZSgpCi0gICAgewotICAgICAgICBhc3NlcnQoKF9mbGFncyAmIEZMQUdfU1RPUkUpICE9IDApOwotICAgICAgICBfZmxhZ3MgfD0gRkxBR19WQUxVRV9EQVRFRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiB1c2VzX2ludmFsaWRhdGVfdmFsdWUoKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZSB0eXBlID0gc2NoZW1hVHlwZSgpOwotICAgICAgICByZXR1cm4gdHlwZS5pc1NpbXBsZVR5cGUoKSB8fCB0eXBlLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgYSBUeXBlU3RvcmUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgeHNpOm5pbCBhdHRyaWJ1dGUKLSAgICAgKiBvbiB0aGUgY29udGFpbmluZyBlbGVtZW50IChhbmQgcG9zc2libHkgdGhlIHRleHQpIGhhcyBiZWVuCi0gICAgICogaW52YWxpZGF0ZWQgYW5kIGJvdGggc2hvdWxkIGJlIGNvbnN1bHRlZCBuZXh0IHRpbWUgdGhlIHZhbHVlCi0gICAgICogaXMgbmVlZGVkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGludmFsaWRhdGVfbmlsdmFsdWUoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKTsKLSAgICAgICAgX2ZsYWdzIHw9IEZMQUdfVkFMVUVfREFURUQgfCBGTEFHX05JTF9EQVRFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgYSBUeXBlU3RvcmUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZWxlbWVudCdzIGRlZmF1bHQKLSAgICAgKiB2YWx1ZSwgbmlsbGFiaWxpdHksIGZpeGVkbmVzcywgZXRjLCBtYXkgaGF2ZSBjaGFuZ2VkIGJ5Ci0gICAgICogdmlydHVlIG9mIHRoZSBlbGVtZW50IG9yZGVyIGNoYW5naW5nIChhbmQgeHNpOm5pbCBhbmQgdGhlCi0gICAgICogdGV4dCBtYXkgaGF2ZSBjaGFuZ2VkIHRvbyk7IHNvIHRoZSBzdG9yZSBzaG91bGQgYmUgY29uc3VsdGVkCi0gICAgICogbmV4dCB0aW1lIGFueSBzZXR0ZXIgb3IgZ2V0dGVyIGlzIGNhbGxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBpbnZhbGlkYXRlX2VsZW1lbnRfb3JkZXIoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKTsKLSAgICAgICAgX2ZsYWdzIHw9IEZMQUdfVkFMVUVfREFURUQgfCBGTEFHX05JTF9EQVRFRCB8IEZMQUdfRUxFTUVOVF9EQVRFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIGJ5IHRoZSBDb21wbGV4VHlwZUltcGwgc3ViY2xhc3MgdG8gZ2V0IGRpcmVjdCBhY2Nlc3MKLSAgICAgKiB0byB0aGUgc3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFR5cGVTdG9yZSBnZXRfc3RvcmUoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKTsKLSAgICAgICAgcmV0dXJuIChUeXBlU3RvcmUpX3RleHRzb3VyY2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaGFzX3N0b3JlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgYSBUeXBlU3RvcmUgdG8gcHVsbCBvdXQgdGhlIG1vc3QgcmVhc29uYWJsZQotICAgICAqIHRleHQgdmFsdWUgZnJvbSB1cy4gVGhpcyBpcyBkb25lIGFmdGVyIHdlIGhhdmUgaW52YWxpZGF0ZWQKLSAgICAgKiB0aGUgc3RvcmUgKHR5cGljYWxseSB3aGVuIG91ciB2YWx1ZSBoYXMgYmVlbiBzZXQpLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgYnVpbGRfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkKLSAgICB7Ci0gICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCk7Ci0gICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19WQUxVRV9EQVRFRCkgPT0gMCk7Ci0gICAgICAgIGlmICgoX2ZsYWdzICYgKEZMQUdfTklMIHwgRkxBR19JU0RFRkFVTFQpKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICByZXR1cm4gY29tcHV0ZV90ZXh0KAotICAgICAgICAgICAgICAgICAgICBuc20gPT0gbnVsbCA/IGhhc19zdG9yZSgpID8gZ2V0X3N0b3JlKCkgOiBudWxsIDogbnNtKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIHN0b3JlIHdpbGwgY2FsbCBiYWNrIG9uIGJ1aWxkX25pbCBhZnRlciB3ZSd2ZSBjYWxsZWQgaW52YWxpZGF0ZV9uaWwKLSAgICAgKiBhbmQgaXQgbmVlZHMgdG8ga25vdyB3aGF0IHRoZSBuaWwgdmFsdWUgaXMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYnVpbGRfbmlsKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCk7Ci0gICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19WQUxVRV9EQVRFRCkgPT0gMCk7Ci0gICAgICAgIHJldHVybiAoX2ZsYWdzICYgRkxBR19OSUwpICE9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBzdG9yZSB3aWxsIGNhbGwgYmFjayBvbiB2YWxpZGF0ZV9ub3cgdG8gZm9yY2UgdXMgdG8gbG9vayBhdAotICAgICAqIHRoZSB0ZXh0IGlmIHdlJ3JlIGluIGFuIGludmFsaWQgc3RhdGUuIFdlJ3JlIGFsbG93ZWQgdG8gdGhyb3cKLSAgICAgKiBhbiBleGNlcHRpb24gaWYgdGhlIHRleHQgaXNuJ3QgdmFsaWQgZm9yIG91ciB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlX25vdygpCi0gICAgewotICAgICAgICBjaGVja19kYXRlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgc3RvcmUgY2FsbHMgYmFjayBoZXJlIGluIG9yZGVyIHRvIGZvcmNlIGEgZGlzY29ubmVjdC4KLSAgICAgKiBBZnRlciB0aGlzIGlzIGRvbmUsIHRoZSBvYmplY3Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW52YWxpZC4KLSAgICAgKiBBbnkgYXR0ZW1wdCB0byBhY2Nlc3Mgb3Igc2V0IGEgdmFsdWUgc2hvdWxkIHJlc3VsdCBpbiBhbgotICAgICAqIGV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIGhvdyB3ZSBoYW5kbGUgZGVsZXRpb25zIGFuZCB4c2k6dHlwZSBjaGFuZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3Rfc3RvcmUoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKTsKLSAgICAgICAgX2ZsYWdzIHw9IEZMQUdTX0RBVEVEIHwgRkxBR19PUlBIQU5FRDsKLSAgICAgICAgLy8gZG8gTk9UIG51bGwgb3V0IF90ZXh0c291cmNlLCBiZWNhdXNlIHdlIG5lZWQgaXQgbm9uLW51bGwgZm9yIHN5bmNocm9uaXphdGlvbgotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgdHlwZXN0b3JlIHVzZXIgY2FuIGNyZWF0ZSBhIG5ldyBUeXBlU3RvcmVVc2VyIGluc3RhbmNlIGZvcgotICAgICAqIGEgZ2l2ZW4gZWxlbWVudCBjaGlsZCBuYW1lIGFzIGxvbmcgYXMgeW91IGFsc28gcGFzcyB0aGUKLSAgICAgKiBxbmFtZSBjb250YWluZWQgYnkgdGhlIHhzaTp0eXBlIGF0dHJpYnV0ZSwgaWYgYW55LgotICAgICAqCi0gICAgICogTm90ZSB0aGF0IHdlIHdpbGwgaWdub3JlIHRoZSB4c2lUeXBlIGlmIGl0IHR1cm5zIG91dCB0byBiZSBpbnZhbGlkLgotICAgICAqCi0gICAgICogUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIHN0cm9uZ2x5IHR5cGVkIGluZm9ybWF0aW9uIGZvciB0aGF0Ci0gICAgICogZ2l2ZW4gZWxlbWVudCAod2hpY2ggaW1wbGllcywgcmVjdXNpdmVseSwgbm8gc3Ryb25nbHkgdHlwZWQgaW5mb3JtYXRpb24KLSAgICAgKiBkb3dud2FyZHMpLgotICAgICAqLwotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGNyZWF0ZV9lbGVtZW50X3VzZXIoUU5hbWUgZWx0TmFtZSwgUU5hbWUgeHNpVHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgKFR5cGVTdG9yZVVzZXIpCi0gICAgICAgICAgICAgICAgKChTY2hlbWFUeXBlSW1wbCkgc2NoZW1hVHlwZSgpKS5jcmVhdGVFbGVtZW50VHlwZSgKLSAgICAgICAgICAgICAgICAgICAgZWx0TmFtZSwgeHNpVHlwZSwgZ2V0X3N0b3JlKCkuZ2V0X3NjaGVtYXR5cGVsb2FkZXIoKSApOwotCi0gICAgICAgIC8qCi0gICAgICAgIFNjaGVtYVR5cGVJbXBsIHN0eXBlID0gKFNjaGVtYVR5cGVJbXBsKXNjaGVtYVR5cGUoKS5nZXRFbGVtZW50VHlwZShlbHROYW1lLCB4c2lUeXBlLCBnZXRfc3RvcmUoKS5nZXRfc2NoZW1hdHlwZWxvYWRlcigpKTsKLSAgICAgICAgaWYgKHN0eXBlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIChUeXBlU3RvcmVVc2VyKXN0eXBlLmNyZWF0ZVVuYXR0YWNoZWROb2RlKCk7Ci0gICAgICAgICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSB0eXBlc3RvcmUgdXNlciBjYW4gY3JlYXRlIGEgbmV3IFR5cGVTdG9yZVVzZXIgaW5zdGFuY2UgZm9yCi0gICAgICogYSBnaXZlbiBhdHRyaWJ1dGUgY2hpbGQsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGUgbmFtZS4KLSAgICAgKgotICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubyBzdHJvbmdseSB0eXBlZCBpbmZvcm1hdGlvbiBmb3IgdGhhdAotICAgICAqIGdpdmVuIGF0dHJpYnV0ZXMuCi0gICAgICovCi0gICAgcHVibGljIFR5cGVTdG9yZVVzZXIgY3JlYXRlX2F0dHJpYnV0ZV91c2VyKFFOYW1lIGF0dHJOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUeXBlU3RvcmVVc2VyKSgoU2NoZW1hVHlwZUltcGwpc2NoZW1hVHlwZSgpKS5jcmVhdGVBdHRyaWJ1dGVUeXBlKGF0dHJOYW1lLCBnZXRfc3RvcmUoKS5nZXRfc2NoZW1hdHlwZWxvYWRlcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRfc2NoZW1hX3R5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRfZWxlbWVudF90eXBlKFFOYW1lIGVsdE5hbWUsIFFOYW1lIHhzaVR5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gc2NoZW1hVHlwZSgpLmdldEVsZW1lbnRUeXBlKAotICAgICAgICAgICAgZWx0TmFtZSwgeHNpVHlwZSwgZ2V0X3N0b3JlKCkuZ2V0X3NjaGVtYXR5cGVsb2FkZXIoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGdldF9hdHRyaWJ1dGVfdHlwZShRTmFtZSBhdHRyTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzY2hlbWFUeXBlKCkuZ2V0QXR0cmlidXRlVHlwZSgKLSAgICAgICAgICAgIGF0dHJOYW1lLCBnZXRfc3RvcmUoKS5nZXRfc2NoZW1hdHlwZWxvYWRlcigpICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBlbGVtZW50IHRleHQsIGlmIGl0J3MgY29uc2lzdGVudC4gSWYgaXQncwotICAgICAqIG5vdCBjb25zaXN0ZW50LCByZXR1cm5zIG51bGwsIGFuZCByZXF1aXJlcyBhIHZpc2l0b3Igd2Fsay4KLSAgICAgKgotICAgICAqIEFsc28gcmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIGRlZmF1bHQgYXQgYWxsIChhbHRob3VnaAotICAgICAqIHRoYXQgY2FuIGFsc28gYmUgZGlzY292ZXJlZCB2aWEgZ2V0X2VsZW1lbnRmbGFncyB3aXRob3V0Ci0gICAgICogZG9pbmcgYSB3YWxrKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldF9kZWZhdWx0X2VsZW1lbnRfdGV4dChRTmFtZSBlbHROYW1lKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KF9pc0NvbXBsZXhDb250ZW50KCkpOwotICAgICAgICBpZiAoIV9pc0NvbXBsZXhDb250ZW50KCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IHNjaGVtYVR5cGUoKS5nZXRFbGVtZW50UHJvcGVydHkoZWx0TmFtZSk7Ci0gICAgICAgIGlmIChwcm9wID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIHJldHVybiBwcm9wLmdldERlZmF1bHRUZXh0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBhdHRyaWJ1dGUgdGV4dCBmb3IgdGhlIGF0dHJpYnV0ZSB3aXRoCi0gICAgICogdGhlIGdpdmVuIG5hbWUsIG9yIG51bGwgaWYgbm8gZGVmYXVsdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldF9kZWZhdWx0X2F0dHJpYnV0ZV90ZXh0KFFOYW1lIGF0dHJOYW1lKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KF9pc0NvbXBsZXhUeXBlKCkpOwotICAgICAgICBpZiAoIV9pc0NvbXBsZXhUeXBlKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IHNjaGVtYVR5cGUoKS5nZXRBdHRyaWJ1dGVQcm9wZXJ0eShhdHRyTmFtZSk7Ci0gICAgICAgIGlmIChwcm9wID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIHJldHVybiBwcm9wLmdldERlZmF1bHRUZXh0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWxlbWVudGZsYWdzLCBpZiB0aGV5J3JlIGNvbnNpc3RlbnQuIElmIHRoZXkncmUKLSAgICAgKiBub3QsIHJldHVybnMgLTEsIGFuZCByZXF1aXJlcyBhIHZpc3RvciB3YWxrLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0X2VsZW1lbnRmbGFncyhRTmFtZSBlbHROYW1lKQotICAgIHsKLSAgICAgICAgaWYgKCFfaXNDb21wbGV4Q29udGVudCgpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IHNjaGVtYVR5cGUoKS5nZXRFbGVtZW50UHJvcGVydHkoZWx0TmFtZSk7Ci0gICAgICAgIGlmIChwcm9wID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKHByb3AuaGFzRGVmYXVsdCgpID09IFNjaGVtYVByb3BlcnR5LlZBUklBQkxFIHx8Ci0gICAgICAgICAgICBwcm9wLmhhc0ZpeGVkKCkgPT0gU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUgfHwKLSAgICAgICAgICAgIHByb3AuaGFzTmlsbGFibGUoKSA9PSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAocHJvcC5oYXNEZWZhdWx0KCkgPT0gU2NoZW1hUHJvcGVydHkuTkVWRVIgPyAwIDogVHlwZVN0b3JlLkhBU0RFRkFVTFQpIHwKLSAgICAgICAgICAgIChwcm9wLmhhc0ZpeGVkKCkgPT0gU2NoZW1hUHJvcGVydHkuTkVWRVIgPyAwIDogVHlwZVN0b3JlLkZJWEVEKSB8Ci0gICAgICAgICAgICAocHJvcC5oYXNOaWxsYWJsZSgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5OSUxMQUJMRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmxhZ3MgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRfYXR0cmlidXRlZmxhZ3MoUU5hbWUgYXR0ck5hbWUpCi0gICAgewotICAgICAgICBpZiAoIV9pc0NvbXBsZXhUeXBlKCkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IHNjaGVtYVR5cGUoKS5nZXRBdHRyaWJ1dGVQcm9wZXJ0eShhdHRyTmFtZSk7Ci0gICAgICAgIGlmIChwcm9wID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAocHJvcC5oYXNEZWZhdWx0KCkgPT0gU2NoZW1hUHJvcGVydHkuTkVWRVIgPyAwIDogVHlwZVN0b3JlLkhBU0RFRkFVTFQpIHwKLSAgICAgICAgICAgIChwcm9wLmhhc0ZpeGVkKCkgPT0gU2NoZW1hUHJvcGVydHkuTkVWRVIgPyAwIDogVHlwZVN0b3JlLkZJWEVEKTsKLSAgICAgICAgLy8gQlVHQlVHOiB0b2RvOiBob29rIHVwIHJlcXVpcmVkPwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgZmFsc2UgaWYgY2hpbGQgZWxlbWVudHMgYXJlIGluc2Vuc2l0aXZlIHRvIG9yZGVyOwotICAgICAqIGlmIGl0IHJldHVybnMgdHJ1ZSwgeW91J3JlIHJlcXVpcmVkIHRvIGNhbGwgaW52YWxpZGF0ZV9lbGVtZW50X29yZGVyCi0gICAgICogb24gY2hpbGRyZW4gdG8gdGhlIHJpZ2h0IG9mIGFueSBjaGlsZCBvcmRlciByZWFycmFuZ2VtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzX2NoaWxkX2VsZW1lbnRfb3JkZXJfc2Vuc2l0aXZlKCkKLSAgICB7Ci0gICAgICAgIGlmICghX2lzQ29tcGxleFR5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGUoKS5pc09yZGVyU2Vuc2l0aXZlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0aW5nIGEgbmV3IGVsZW1lbnQgaXMgYWx3YXlzIHVuYW1iaWd1b3VzIGV4Y2VwdCBpbiBvbmUKLSAgICAgKiBzaXR1YXRpb246IHdoZW4gYWRkaW5nIGFuIGVsZW1lbnQgYWZ0ZXIgdGhlIGxhc3Qgb25lIHdpdGgKLSAgICAgKiB0aGF0IG5hbWUgKG9yIHRoZSBmaXJzdCBvbmUgaWYgdGhlcmUgYXJlIG5vbmUpLgotICAgICAqCi0gICAgICogSW4gdGhhdCBjYXNlLCBhZGQgdGhlIGVsZW1lbnQgYXQgdGhlIGZpcnN0IHBvc3NpYmxlIHNsb3QKLSAgICAgKiBCRUZPUkUgYW55IGVsZW1lbnQgd2hvc2UgcW5hbWUgaXMgY29udGFpbmVkIGluIHRoZSBRTmFtZVNldAotICAgICAqIGdpdmVuLiAoSWYgdGhlIFFOYW1lU2V0IGlzIGVtcHR5LCB0aGF0IG1lYW5zIGFkZCB0aGUgbmV3Ci0gICAgICogZWxlbWVudCBhdCB0aGUgdmVyeSBlbmQuKQotICAgICAqCi0gICAgICogSWYgdGhlIHJldHVybmVkIFFOYW1lU2V0IGlzIG51bGwsIHRyZWF0IGl0IGFzIGlmIHRoZSBRTmFtZVNldAotICAgICAqIGNvbnRhaW5lZCBhbGwgUU5hbWVzLCBpLmUuLCBhZGQgdGhlIG5ldyBlbGVtZW50IGF0IHRoZSB2ZXJ5Ci0gICAgICogZmlyc3QgcG9zaXRpb24gcG9zc2libGUgKGFkamFjZW50IHRvIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlCi0gICAgICogc2FtZSBuYW1lLCBvciBhdCB0aGUgdmVyeSBmaXJzdCBzbG90IGlmIGl0IGlzIHRoZSBmaXJzdCBlbHQKLSAgICAgKiB3aXRoIHRoYXQgbmFtZSkuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFFOYW1lU2V0IGdldF9lbGVtZW50X2VuZGluZ19kZWxpbWl0ZXJzKFFOYW1lIGVsdG5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gc2NoZW1hVHlwZSgpLmdldEVsZW1lbnRQcm9wZXJ0eShlbHRuYW1lKTsKLSAgICAgICAgaWYgKHByb3AgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gcHJvcC5nZXRKYXZhU2V0dGVyRGVsaW1pdGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSB0eXBlc3RvcmUgdXNlciBjYW4gcmV0dXJuIGEgdmlzaXRvciB0aGF0IGlzIHVzZWQgdG8gY29tcHV0ZQotICAgICAqIGRlZmF1bHQgdGV4dCBhbmQgZWxlbWVudGZsYWdzIGZvciBhbiBhcmJpdHJhcnkgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZVN0b3JlVmlzaXRvciBuZXdfdmlzaXRvcigpCi0gICAgewotICAgICAgICBpZiAoIV9pc0NvbXBsZXhDb250ZW50KCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIG5ldyBTY2hlbWFUeXBlVmlzaXRvckltcGwoc2NoZW1hVHlwZSgpLmdldENvbnRlbnRNb2RlbCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hRmllbGQgZ2V0X2F0dHJpYnV0ZV9maWVsZChRTmFtZSBhdHRyTmFtZSkKLSAgICB7Ci0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZU1vZGVsIG1vZGVsID0gc2NoZW1hVHlwZSgpLmdldEF0dHJpYnV0ZU1vZGVsKCk7Ci0gICAgICAgIGlmIChtb2RlbCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBtb2RlbC5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0dGluZyBhIHN0cmluZyBwcmVzZXJ2ZXMgYW55IG5vbmNhbm9uaWNhbCBsaXRlcmFsCi0gICAgICogcmVwcmVzZW50YXRpb24uIFRoaXMgaXMgZG9uZSBieSBzdG9yaW5nIHRoZSBhY3R1YWwKLSAgICAgKiBzdHJpbmcgaW4gdGhlIHVuZGVybHlpbmcgc3RvcmUgYWZ0ZXIgY2hlY2tpbmcgaXQKLSAgICAgKiBhZ2FpbnN0IHRoZSBwcmltaXRpdmUgdHlwZSBmb3IgdmFsaWRpdHkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X1N0cmluZyhTdHJpbmcgdikKLSAgICB7Ci0gICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19JTU1VVEFCTEUpICE9IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgYm9vbGVhbiB3YXNOaWxsZWQgPSAoKF9mbGFncyAmIEZMQUdfTklMKSAhPSAwKTsKLQotICAgICAgICAvLyB1cGRhdGUgdGhlIHVuZGVybHlpbmcgdmFsdWUgZnJvbSB0aGUgc3RyaW5nCi0gICAgICAgIFN0cmluZyB3c2Nhbm9uID0gYXBwbHlfd3NjYW5vbih2KTsKLSAgICAgICAgdXBkYXRlX2Zyb21fd3NjYW5vbl90ZXh0KHdzY2Fub24pOwotCi0gICAgICAgIC8vIE5vdyBzdG9yZSB0aGUgbGl0ZXJhbCB0ZXh0IGltbWVkaWF0ZWx5IGluIHRoZSB1bmRlcmx5aW5nCi0gICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgX2ZsYWdzICY9IH5GTEFHX1ZBTFVFX0RBVEVEOwotICAgICAgICAgICAgZ2V0X3N0b3JlKCkuc3RvcmVfdGV4dCh2KTsKLSAgICAgICAgICAgIGlmICh3YXNOaWxsZWQpCi0gICAgICAgICAgICAgICAgZ2V0X3N0b3JlKCkuaW52YWxpZGF0ZV9uaWwoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBfdGV4dHNvdXJjZSA9IHY7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIHRoZSB2YWx1ZSBiYXNlZCBvbiBjb21wbGV4IGNvbnRlbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlX2Zyb21fY29tcGxleF9jb250ZW50KCkKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IHRvIHVwZGF0ZSB0aGUgdmFsdWUgYmFzZWQgb24gYSBzdHJpbmcgdGhhdAotICAgICAqIHdhcyBwYXNzZWQgZWl0aGVyIGZyb20gdGhlIHRleHQgc3RvcmUgb3IgZnJvbSB0aGUgdXNlci4KLSAgICAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGNhc2VzIHdoZXJlIHRoZXJlIGlzIGEgZGVmYXVsdAotICAgICAqIHRoYXQgbXVzdCBiZSBhcHBsaWVkLCBhbmQgd2hlcmUgdGhlIHZhbHVlIG11c3QgbWF0Y2gKLSAgICAgKiBhIGZpeGVkIHZhbHVlLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgdm9pZCB1cGRhdGVfZnJvbV93c2Nhbm9uX3RleHQoU3RyaW5nIHYpCi0gICAgewotICAgICAgICAvLyBXaGl0ZXNwYWNlIGlzIGRlZmF1bHQgaWYgdGhpcyB0eXBlIHRyZWF0cyB0aGlzIHNwYWNlIGFzIGRlZmF1bHRhYmxlCi0gICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19IQVNERUZBVUxUKSAhPSAwICYmICAoX2ZsYWdzICYgRkxBR19TRVRUSU5HREVGQVVMVCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhpcyBpc24ndCBxdWl0ZSBjb3JyZWN0IHNpbmNlIHRoZSAuZXF1YWxzKCIiKSB0ZXN0IHNob3VsZCBiZQotICAgICAgICAgICAgLy8gZG9uZSBvbiB0aGUgYWN0dWFsIHRleHQsIG5vdCB0aGUgd3NjYW5vbiB0ZXh0Ci0gICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfQVRUUklCVVRFKSA9PSAwICYmIHYuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVmID0gZ2V0X3N0b3JlKCkuY29tcHV0ZV9kZWZhdWx0X3RleHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVmID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgICAgIC8vIHByb3RlY3QgYWdhaW5zdCByZWN1cnNpb24gd2l0aCB0aGlzIGZsYWcKLSAgICAgICAgICAgICAgICBfZmxhZ3MgfD0gRkxBR19TRVRUSU5HREVGQVVMVDsKLSAgICAgICAgICAgICAgICB0cnkgeyB0aGlzLnNldChkZWYpOyB9Ci0gICAgICAgICAgICAgICAgZmluYWxseSB7IF9mbGFncyAmPSB+RkxBR19TRVRUSU5HREVGQVVMVDsgfQotICAgICAgICAgICAgICAgIF9mbGFncyAmPSB+RkxBR19OSUw7Ci0gICAgICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfSVNERUZBVUxUOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IHJldHVybmVkIHlldCwgdGhlIGRlZmF1bHQgZG9lc24ndCBhcHBseS4KLQotICAgICAgICAvLyBBc2sgdW5kZXJseWluZyBpbXBsIHRvIHBhcnNlIG9yZGluYXJ5IG5vbi1kZWZhdWx0IHRleHQKLSAgICAgICAgc2V0X3RleHQodik7Ci0gICAgICAgIF9mbGFncyAmPSB+KEZMQUdfTklMIHwgRkxBR19JU0RFRkFVTFQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFR5cGVzIHNob3VsZCByZXR1cm4gZmFsc2UgaWYgdGhleSBkb24ndCB0cmVhdCB0aGUgZ2l2ZW4KLSAgICAgKiB3aGl0ZXNwYWNlIGFzIGEgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc19kZWZhdWx0YWJsZV93cyhTdHJpbmcgdikKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdoaXRlc3BhY2UgcnVsZSB0aGF0IHdpbGwgYmUgYXBwbGllZCBiZWZvcmUKLSAgICAgKiBidWlsZGluZyBhIHN0cmluZyB0byBwYXNzIHRvIGdldF90ZXh0KCkuCi0gICAgICoKLSAgICAgKiBPdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdGhhdCBkb24ndCBuZWVkIHRoZWlyIHRleHQKLSAgICAgKiBmb3Igc2V0X3RleHQgY2Fub25pY2FsaXplZDsgcGVyaGFwcyB0aGV5IGFscmVhZHkgaW1wbGVtZW50Ci0gICAgICogc2Nhbm5lcnMgdGhhdCBjYW4gZGVhbCB3aXRoIHdoaXRlc3BhY2UsIGFuZCB0aGV5IGtub3cKLSAgICAgKiB0aGV5IGhhdmUgbm8gcmVnZXggcGF0dGVybiByZXN0cmljdGlvbnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBnZXRfd3NjYW5vbl9ydWxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBTY2hlbWFUeXBlLldTX0NPTExBUFNFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB0byBjYW5vbmljYWxpemUgd2hpdGVzcGFjZSBiZWZvcmUgY2FsbGluZyBzZXRfdGV4dC4KLSAgICAgKgotICAgICAqIFRyaWVzIHRvIGF2b2lkIGFsbG9jYXRpb24gd2hlbiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgY2Fub25pY2FsLCBidXQKLSAgICAgKiBvdGhlcndpc2UgdGhpcyBpcyBub3QgcGFydGljdWxhcmx5IGVmZmljaWVudC4gSG9wZWZ1bGx5IHRoZSBjb21tb24KLSAgICAgKiBjYXNlIGlzIHRoYXQgd2UgcGFzcyBvdXIgd3NjYW5vbiBydWxlIHRvIHRoZSBzdG9yZSB2aWEgZmV0Y2hfdGV4dAotICAgICAqIGFuZCBpdCdzIGNhbm9uaWNhbGl6ZWQgYmVmb3JlIHdlIGV2ZW4gc2VlIGl0IGFzIGEgc3RyaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGFwcGx5X3dzY2Fub24oU3RyaW5nIHYpCi0gICAgewotICAgICAgICByZXR1cm4gWG1sV2hpdGVzcGFjZS5jb2xsYXBzZSh2LCBnZXRfd3NjYW5vbl9ydWxlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBiZWZvcmUgZXZlcnkgc2V0IGFuZCBnZXQsIHRvIGVuc3VyZSB0aGF0IHdlIGhhdmUKLSAgICAgKiBhIGNvcnJlY3QgcGljdHVyZSBvZiB3aGV0aGVyIHdlJ3JlIG5pbGxhYmxlLCBmaXhlZCwgb3IKLSAgICAgKiBpZiB3ZSBoYXZlIGEgZGVmYXVsdCB0aGF0IGNhbiBiZSBhcHBsaWVkLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgdm9pZCBjaGVja19lbGVtZW50X2RhdGVkKCkKLSAgICB7Ci0gICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19FTEVNRU5UX0RBVEVEKSAhPSAwICYmCi0gICAgICAgICAgICAoX2ZsYWdzICYgRkxBR19OT1RfVkFSSUFCTEUpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19PUlBIQU5FRCkgIT0gMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgaW50IGVsdGZsYWdzID0gZ2V0X3N0b3JlKCkuY29tcHV0ZV9mbGFncygpOwotICAgICAgICAgICAgLy8gaW50IGVsdGZsYWdzID0gMDsKLSAgICAgICAgICAgIF9mbGFncyAmPSB+KEZMQUdTX0VMRU1FTlQgfCBGTEFHX0VMRU1FTlRfREFURUQpOwotICAgICAgICAgICAgX2ZsYWdzIHw9IGVsdGZsYWdzOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19OT1RfVkFSSUFCTEUpICE9IDApCi0gICAgICAgICAgICBfZmxhZ3MgJj0gfihGTEFHX0VMRU1FTlRfREFURUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlc2NyaWJlcyB0aGUgb3JwaGFuZWQgc3RhdHVzIG9mIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzX29ycGhhbmVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoX2ZsYWdzICYgRkxBR19PUlBIQU5FRCkgIT0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYmVmb3JlIGV2ZXJ5IGdldHRlciBhbmQgc2V0dGVyIG9uIHRoZSBzdHJvbmdseQotICAgICAqIHR5cGVkIGNsYXNzZXMgdG8gZW5zdXJlIHRoYXQgdGhlIG9iamVjdCBoYXMgbm90IGJlZW4KLSAgICAgKiBvcnBoYW5lZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBjaGVja19vcnBoYW5lZCgpCi0gICAgewotICAgICAgICBpZiAoaXNfb3JwaGFuZWQoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZURpc2Nvbm5lY3RlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBwcmlvciB0byBldmVyeSBnZXQgb3BlcmF0aW9uLCB0byBlbnN1cmUKLSAgICAgKiB0aGF0IHRoZSB2YWx1ZSBiZWluZyByZWFkIGlzIHZhbGlkLiBJZiB0aGUgdmFsdWUKLSAgICAgKiBoYXMgYmVlbiBpbnZhbGlkYXRlZCwgaXQgaXMgcmUtcmVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nCi0gICAgICogdGV4dCBzdG9yZSwgYW5kIHRoaXMgbWF5IGNhdXNlIGFuIG91dCBvZiByYW5nZSBleGNlcHRpb24uCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBkZWFscyB3aXRoIG5pbHMsIG5pbGxhYmlsaXR5LCBkZWZhdWx0cywgZXRjLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNoZWNrX2RhdGVkKCkKLSAgICB7Ci0gICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR1NfREFURUQpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19PUlBIQU5FRCkgIT0gMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgYXNzZXJ0KChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKTsKLQotICAgICAgICAgICAgY2hlY2tfZWxlbWVudF9kYXRlZCgpOwotCi0gICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfRUxFTUVOVF9EQVRFRCkgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgZWx0ZmxhZ3MgPSBnZXRfc3RvcmUoKS5jb21wdXRlX2ZsYWdzKCk7Ci0gICAgICAgICAgICAgICAgX2ZsYWdzICY9IH4oRkxBR1NfRUxFTUVOVCB8IEZMQUdfRUxFTUVOVF9EQVRFRCk7Ci0gICAgICAgICAgICAgICAgX2ZsYWdzIHw9IGVsdGZsYWdzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sZWFuIG5pbGxlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfTklMX0RBVEVEKSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChnZXRfc3RvcmUoKS5maW5kX25pbCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX05JTExBQkxFKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyAvLyBuaWwgbm90IGFsbG93ZWQKLQotICAgICAgICAgICAgICAgICAgICAvLyBsZXQgdGhlIGltcGxlbWVudGF0aW9uIGtub3cgdGhhdCB3ZSdyZSBuaWwgbm93Ci0gICAgICAgICAgICAgICAgICAgIHNldF9uaWwoKTsKLQotICAgICAgICAgICAgICAgICAgICBfZmxhZ3MgfD0gRkxBR19OSUw7Ci0gICAgICAgICAgICAgICAgICAgIG5pbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9mbGFncyAmPSB+RkxBR19OSUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF9mbGFncyAmPSB+RkxBR19OSUxfREFURUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbmlsbGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0OwotCi0gICAgICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX0NPTVBMRVhDT05URU5UKSAhPSAwIHx8ICh0ZXh0ID0gZ2V0X3dzY2Fub25fdGV4dCgpKSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB1cGRhdGVfZnJvbV9jb21wbGV4X2NvbnRlbnQoKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnB1c2gobmV3IE5hbWVzcGFjZUNvbnRleHQoZ2V0X3N0b3JlKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsgdXBkYXRlX2Zyb21fd3NjYW5vbl90ZXh0KHRleHQpOyB9Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBOYW1lc3BhY2VDb250ZXh0LnBvcCgpOyB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfVkFMVUVfREFURUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYmVmb3JlIGV2ZXJ5IHNldCBvcGVyYXRpb24gKGV4Y2VwdCBmb3IgdGhlCi0gICAgICogc3BlY2lhbCBjYXNlIG9mIHNldHRpbmcgYSBzdHJpbmcpIHRvOgotICAgICAqICgxKSBnZXQgdGhlIG5pbGxhYmxlLCBmaXhlZCwgZXRjIGZsYWdzCi0gICAgICogKDIpIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBpdCdzIGZpeGVkIChub3QgZm9yIHN0cmluZ3MpCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHNldF9wcmVwYXJlKCkKLSAgICB7Ci0gICAgICAgIGNoZWNrX2VsZW1lbnRfZGF0ZWQoKTsKLSAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX0lNTVVUQUJMRSkgIT0gMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYWZ0ZXIgZXZlcnkgc2V0IG9wZXJhdGlvbiB0byBpbnZhbGlkYXRlCi0gICAgICogdGhlIGF0dGFjaGVkIHJhdyB0ZXh0LiBBbHNvLCBpZiB3ZSB3ZXJlIGRhdGVkLAotICAgICAqIHdlIG1ha2UgYSBub3RlIHRoYXQgd2UncmUgbm93IGN1cnJlbnQsIHNpbmNlIHRoZQotICAgICAqIGxhdGVzdCBzZXQgYmVhdHMgdGhlIHByZXZpb3VzIGludmFsaWRhdGUuIEFsc28sCi0gICAgICogaWYgd2Ugd2VyZSBuaWwsIHdlJ3JlIG5vIGxvbmdlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgc2V0X2NvbW1pdCgpCi0gICAgewotICAgICAgICBib29sZWFuIHdhc05pbGxlZCA9ICgoX2ZsYWdzICYgRkxBR19OSUwpICE9IDApOwotICAgICAgICAgIF9mbGFncyAmPSB+KEZMQUdfTklMIHwgRkxBR19JU0RFRkFVTFQpOwotCi0gICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgX2ZsYWdzICY9IH4oRkxBR1NfREFURUQpOwotICAgICAgICAgICAgZ2V0X3N0b3JlKCkuaW52YWxpZGF0ZV90ZXh0KCk7Ci0gICAgICAgICAgICBpZiAod2FzTmlsbGVkKQotICAgICAgICAgICAgICAgIGdldF9zdG9yZSgpLmludmFsaWRhdGVfbmlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBfdGV4dHNvdXJjZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHcmFicyB0aGUgdW5kZWx5aW5nIGxpdHJhbCByZXByZXNlbnRhdGlvbiwgYXBwbHlpbmcgdGhlCi0gICAgICogaW1wbGVtZW50YXRpb24ncyB3c2Nhbm9uIHJ1bGUuCi0gICAgICogTnVsbCBpZiBub3Qgc2ltcGxlIGNvbnRlbnQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRfd3NjYW5vbl90ZXh0KCkKLSAgICB7Ci0gICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19TVE9SRSkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGFwcGx5X3dzY2Fub24oKFN0cmluZylfdGV4dHNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSByZXR1cm4gZ2V0X3N0b3JlKCkuZmV0Y2hfdGV4dChnZXRfd3NjYW5vbl9ydWxlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgc2hvdWxkIHNldCB0aGUgdmFsdWUgb2YgdGhlIHR5cGUgZnJvbSB0ZXh0LAotICAgICAqIG9yIHRocm93IGFuIFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBpZiBpdCBjYW4ndC4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgdGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHNob3VsZCBjbGVhciB0aGUgdmFsdWUsIGFuZCBzZXQgaXQgdG8gd2hhdGV2ZXIKLSAgICAgKiBpcyBzdXBwb3NlZCB0byBiZSByZXR1cm5lZCB3aGVuIHRoZSB2YWx1ZSBpcyBuaWxsZWQuCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBzaG91bGQgcmV0dXJuIHRoZSBjYW5vbmljYWwgc3RyaW5nIHZhbHVlIG9mIHRoZSBwcmltaXRpdmUuCi0gICAgICogT25seSBjYWxsZWQgd2hlbiBub24tbmlsLgotICAgICAqLwotICAgIGFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKTsKLQotICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gbnVtZXJpY3M6IGZyYWN0aW9uYWwKLSAgICBwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpCi0gICAgICAgIHsgQmlnRGVjaW1hbCBiZCA9IGJpZ0RlY2ltYWxWYWx1ZSgpOyByZXR1cm4gYmQgPT0gbnVsbCA/IDAuMGYgOiBiZC5mbG9hdFZhbHVlKCk7IH0KLSAgICBwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkKLSAgICAgICAgeyBCaWdEZWNpbWFsIGJkID0gYmlnRGVjaW1hbFZhbHVlKCk7IHJldHVybiBiZCA9PSBudWxsID8gMC4wIDogYmQuZG91YmxlVmFsdWUoKTsgfQotICAgIHB1YmxpYyBCaWdEZWNpbWFsIGJpZ0RlY2ltYWxWYWx1ZSgpCi0gICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0KLSAgICAvLyBudW1lcmljczogaW50ZWdyYWwKLSAgICBwdWJsaWMgQmlnSW50ZWdlciBiaWdJbnRlZ2VyVmFsdWUoKQotICAgICAgICB7IEJpZ0RlY2ltYWwgYmQgPSBiaWdEZWNpbWFsVmFsdWUoKTsgcmV0dXJuIGJkID09IG51bGwgPyBudWxsIDogYmQudG9CaWdJbnRlZ2VyKCk7IH0KLQotICAgIHB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpCi0gICAgewotICAgICAgICBsb25nIGwgPSBpbnRWYWx1ZSgpOwotICAgICAgICBpZiAobCA+IEJ5dGUuTUFYX1ZBTFVFKSB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgIGlmIChsIDwgQnl0ZS5NSU5fVkFMVUUpIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgcmV0dXJuIChieXRlKWw7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IHNob3J0VmFsdWUoKQotICAgIHsKLSAgICAgICAgbG9uZyBsID0gaW50VmFsdWUoKTsKLSAgICAgICAgaWYgKGwgPiBTaG9ydC5NQVhfVkFMVUUpIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgaWYgKGwgPCBTaG9ydC5NSU5fVkFMVUUpIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgcmV0dXJuIChzaG9ydClsOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKQotICAgIHsKLSAgICAgICAgbG9uZyBsID0gbG9uZ1ZhbHVlKCk7Ci0gICAgICAgIGlmIChsID4gSW50ZWdlci5NQVhfVkFMVUUpIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgaWYgKGwgPCBJbnRlZ2VyLk1JTl9WQUxVRSkgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotICAgICAgICByZXR1cm4gKGludClsOwotICAgIH0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIF9tYXggPSBCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NQVhfVkFMVUUpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgX21pbiA9IEJpZ0ludGVnZXIudmFsdWVPZihMb25nLk1JTl9WQUxVRSk7Ci0KLSAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWUoKQotICAgIHsKLSAgICAgICAgQmlnSW50ZWdlciBiID0gYmlnSW50ZWdlclZhbHVlKCk7Ci0gICAgICAgIGlmIChiID09IG51bGwpIHJldHVybiAwTDsKLSAgICAgICAgaWYgKGIuY29tcGFyZVRvKF9tYXgpID49IDApIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgaWYgKGIuY29tcGFyZVRvKF9taW4pIDw9IDApIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgcmV0dXJuIGIubG9uZ1ZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWG1sT3B0aW9ucyBfdG9TdHJpbmdPcHRpb25zID0KLSAgICAgICAgYnVpbGRJbm5lclByZXR0eU9wdGlvbnMoKTsKLQotICAgIHN0YXRpYyBmaW5hbCBYbWxPcHRpb25zIGJ1aWxkSW5uZXJQcmV0dHlPcHRpb25zKCkKLSAgICB7Ci0gICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLlNBVkVfSU5ORVIgKTsKLSAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuU0FWRV9QUkVUVFlfUFJJTlQgKTsKLSAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuU0FWRV9BR0dSRVNTSVZFX05BTUVTUEFDRVMgKTsKLSAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuU0FWRV9VU0VfREVGQVVMVF9OQU1FU1BBQ0UgKTsKLSAgICAgICAgcmV0dXJuIG9wdGlvbnM7Ci0gICAgfQotCi0gICAgLyoKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGR1bXBTdGFjayAoIFN0cmluZyBtc2cgKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKCAiQzpcXGVlLnR4dCIsIHRydWUgKTsKLSAgICAgICAgICAgIGphdmEuaW8uUHJpbnRTdHJlYW0gcHMgPSBuZXcgamF2YS5pby5QcmludFN0cmVhbSggZm9zICk7Ci0gICAgICAgICAgICBwcy5wcmludGxuKCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iICk7Ci0gICAgICAgICAgICBwcy5wcmludGxuKCBtc2cgKTsKLSAgICAgICAgICAgIG5ldyBFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UoIHBzICk7Ci0gICAgICAgICAgICBwcy5jbG9zZSgpOwotICAgICAgICAgICAgZm9zLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgfQotICAgICovCi0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGVuc3VyZVN0b3JlKCkueG1sVGV4dChfdG9TdHJpbmdPcHRpb25zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgeG1sVGV4dCgpCi0gICAgewotICAgICAgICByZXR1cm4geG1sVGV4dChudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHhtbFRleHQgKFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjdXIgPSBuZXdDdXJzb3JGb3JjZSgpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY3VyLnhtbFRleHQobWFrZUlubmVyT3B0aW9ucyhvcHRpb25zKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBjdXIuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gZW51bXMKLSAgICBwdWJsaWMgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBlbnVtVmFsdWUoKQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotCi0gICAgLy8gdmFyaW91cwotICAgIHB1YmxpYyBTdHJpbmcgc3RyaW5nVmFsdWUoKQotICAgIHsKLSAgICAgICAgLy8gU2luY2UgY29tcGxleC1jb250ZW50IHR5cGVzIGRvbid0IGhhdmUgYSAibmF0dXJhbCIgc3RyaW5nIHZhbHVlLCB3ZQotICAgICAgICAvLyBlbWl0IHRoZSBkZWVwbHkgY29uY2F0ZW5hdGVkLCB0YWctcmVtb3ZlZCBjb250ZW50IG9mIHRoZSB0YWcuCi0gICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2lzQ29tcGxleENvbnRlbnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X3N0b3JlKCkuZmV0Y2hfdGV4dChUeXBlU3RvcmUuV1NfUFJFU0VSVkUpOwotCi0gICAgICAgICAgICBjaGVja19kYXRlZCgpOwotICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX05JTCkgIT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBjb21wdXRlX3RleHQoaGFzX3N0b3JlKCkgPyBnZXRfc3RvcmUoKSA6IG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZSgpCi0gICAgICAgIHsgcmV0dXJuIHN0cmluZ1ZhbHVlKCk7IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoKQotICAgICAgICB7IHJldHVybiBib29sZWFuVmFsdWUoKTsgfQotICAgIHB1YmxpYyBieXRlIGdldEJ5dGVWYWx1ZSgpCi0gICAgICAgIHsgcmV0dXJuIGJ5dGVWYWx1ZSgpOyB9Ci0gICAgcHVibGljIHNob3J0IGdldFNob3J0VmFsdWUoKQotICAgICAgICB7IHJldHVybiBzaG9ydFZhbHVlKCk7IH0KLSAgICBwdWJsaWMgaW50IGdldEludFZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gaW50VmFsdWUoKTsgfQotICAgIHB1YmxpYyBsb25nIGdldExvbmdWYWx1ZSgpCi0gICAgICAgIHsgcmV0dXJuIGxvbmdWYWx1ZSgpOyB9Ci0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0QmlnSW50ZWdlclZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gYmlnSW50ZWdlclZhbHVlKCk7IH0KLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsVmFsdWUoKQotICAgICAgICB7IHJldHVybiBiaWdEZWNpbWFsVmFsdWUoKTsgfQotICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdFZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gZmxvYXRWYWx1ZSgpOyB9Ci0gICAgcHVibGljIGRvdWJsZSBnZXREb3VibGVWYWx1ZSgpCi0gICAgICAgIHsgcmV0dXJuIGRvdWJsZVZhbHVlKCk7IH0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVBcnJheVZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gYnl0ZUFycmF5VmFsdWUoKTsgfQotICAgIHB1YmxpYyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGdldEVudW1WYWx1ZSgpCi0gICAgICAgIHsgcmV0dXJuIGVudW1WYWx1ZSgpOyB9Ci0gICAgcHVibGljIENhbGVuZGFyIGdldENhbGVuZGFyVmFsdWUoKQotICAgICAgICB7IHJldHVybiBjYWxlbmRhclZhbHVlKCk7IH0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlVmFsdWUoKQotICAgICAgICB7IHJldHVybiBkYXRlVmFsdWUoKTsgfQotICAgIHB1YmxpYyBHRGF0ZSBnZXRHRGF0ZVZhbHVlKCkKLSAgICAgICAgeyByZXR1cm4gZ0RhdGVWYWx1ZSgpOyB9Ci0gICAgcHVibGljIEdEdXJhdGlvbiBnZXRHRHVyYXRpb25WYWx1ZSgpCi0gICAgICAgIHsgcmV0dXJuIGdEdXJhdGlvblZhbHVlKCk7IH0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0UU5hbWVWYWx1ZSgpCi0gICAgICAgIHsgcmV0dXJuIHFOYW1lVmFsdWUoKTsgfQotICAgIHB1YmxpYyBMaXN0IHhnZXRMaXN0VmFsdWUoKQotICAgICAgICB7IHJldHVybiB4bGlzdFZhbHVlKCk7IH0KLSAgICBwdWJsaWMgTGlzdCBnZXRMaXN0VmFsdWUoKQotICAgICAgICB7IHJldHVybiBsaXN0VmFsdWUoKTsgfQotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VmFsdWUoKQotICAgICAgICB7IHJldHVybiBvYmplY3RWYWx1ZSgpOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmdWYWx1ZShTdHJpbmcgb2JqKQotICAgICAgICB7IHNldChvYmopOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0Qm9vbGVhblZhbHVlKGJvb2xlYW4gdikKLSAgICAgICAgeyBzZXQodik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRCeXRlVmFsdWUoYnl0ZSB2KQotICAgICAgICB7IHNldCh2KTsgfQotICAgIHB1YmxpYyB2b2lkIHNldFNob3J0VmFsdWUoc2hvcnQgdikKLSAgICAgICAgeyBzZXQodik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnRWYWx1ZShpbnQgdikKLSAgICAgICAgeyBzZXQodik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb25nVmFsdWUobG9uZyB2KQotICAgICAgICB7IHNldCh2KTsgfQotICAgIHB1YmxpYyB2b2lkIHNldEJpZ0ludGVnZXJWYWx1ZShCaWdJbnRlZ2VyIG9iaikKLSAgICAgICAgeyBzZXQob2JqKTsgfQotICAgIHB1YmxpYyB2b2lkIHNldEJpZ0RlY2ltYWxWYWx1ZShCaWdEZWNpbWFsIG9iaikKLSAgICAgICAgeyBzZXQob2JqKTsgfQotICAgIHB1YmxpYyB2b2lkIHNldEZsb2F0VmFsdWUoZmxvYXQgdikKLSAgICAgICAgeyBzZXQodik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXREb3VibGVWYWx1ZShkb3VibGUgdikKLSAgICAgICAgeyBzZXQodik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRCeXRlQXJyYXlWYWx1ZShieXRlW10gb2JqKQotICAgICAgICB7IHNldChvYmopOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0RW51bVZhbHVlKFN0cmluZ0VudW1BYnN0cmFjdEJhc2Ugb2JqKQotICAgICAgICB7IHNldChvYmopOyB9Ci0gICAgcHVibGljIHZvaWQgc2V0Q2FsZW5kYXJWYWx1ZShDYWxlbmRhciBvYmopCi0gICAgICAgIHsgc2V0KG9iaik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlVmFsdWUoRGF0ZSBvYmopCi0gICAgICAgIHsgc2V0KG9iaik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRHRGF0ZVZhbHVlKEdEYXRlIG9iaikKLSAgICAgICAgeyBzZXQob2JqKTsgfQotICAgIHB1YmxpYyB2b2lkIHNldEdEdXJhdGlvblZhbHVlKEdEdXJhdGlvbiBvYmopCi0gICAgICAgIHsgc2V0KG9iaik7IH0KLSAgICBwdWJsaWMgdm9pZCBzZXRRTmFtZVZhbHVlKFFOYW1lIG9iaikKLSAgICAgICAgeyBzZXQob2JqKTsgfQotICAgIHB1YmxpYyB2b2lkIHNldExpc3RWYWx1ZShMaXN0IG9iaikKLSAgICAgICAgeyBzZXQob2JqKTsgfQotICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdFZhbHVlKE9iamVjdCBvYmopCi0gICAgICAgIHsgb2JqZWN0U2V0KG9iaik7IH0KLQotICAgIHB1YmxpYyBieXRlW10gYnl0ZUFycmF5VmFsdWUoKQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIHB1YmxpYyBib29sZWFuIGJvb2xlYW5WYWx1ZSgpCi0gICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0gICAgcHVibGljIEdEYXRlIGdEYXRlVmFsdWUoKQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIHB1YmxpYyBEYXRlIGRhdGVWYWx1ZSgpCi0gICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0gICAgcHVibGljIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIHB1YmxpYyBHRHVyYXRpb24gZ0R1cmF0aW9uVmFsdWUoKQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIHB1YmxpYyBRTmFtZSBxTmFtZVZhbHVlKCkKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwdWJsaWMgTGlzdCBsaXN0VmFsdWUoKQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIHB1YmxpYyBMaXN0IHhsaXN0VmFsdWUoKQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIHB1YmxpYyBPYmplY3Qgb2JqZWN0VmFsdWUoKQotICAgICAgICB7IHJldHVybiBqYXZhX3ZhbHVlKHRoaXMpOyB9Ci0KLSAgICAvLyBzZXQgdGhpcyB2YWx1ZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChib29sZWFuIHYpCi0gICAgICAgIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X2Jvb2xlYW4odik7IHNldF9jb21taXQoKTsgfSB9Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KGJ5dGUgdikKLSAgICAgICAgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfYnl0ZSh2KTsgc2V0X2NvbW1pdCgpOyB9IH0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoc2hvcnQgdikKLSAgICAgICAgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfc2hvcnQodik7IHNldF9jb21taXQoKTsgfSB9Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KGludCB2KQotICAgICAgICB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9pbnQodik7IHNldF9jb21taXQoKTsgfSB9Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KGxvbmcgdikKLSAgICAgICAgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfbG9uZyh2KTsgc2V0X2NvbW1pdCgpOyB9IH0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoZmxvYXQgdikKLSAgICAgICAgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfZmxvYXQodik7IHNldF9jb21taXQoKTsgfSB9Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KGRvdWJsZSB2KQotICAgICAgICB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9kb3VibGUodik7IHNldF9jb21taXQoKTsgfSB9Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KGJ5dGVbXSBvYmopCi0gICAgICAgIHsgaWYgKG9iaiA9PSBudWxsKSBzZXROaWwoKTsgZWxzZSB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9CeXRlQXJyYXkob2JqKTsgc2V0X2NvbW1pdCgpOyB9IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIG9iaikKLSAgICAgICAgeyBpZiAob2JqID09IG51bGwpIHNldE5pbCgpOyBlbHNlIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X2VudW0ob2JqKTsgc2V0X2NvbW1pdCgpOyB9IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChCaWdJbnRlZ2VyIG9iaikKLSAgICAgICAgeyBpZiAob2JqID09IG51bGwpIHNldE5pbCgpOyBlbHNlIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X0JpZ0ludGVnZXIob2JqKTsgc2V0X2NvbW1pdCgpOyB9IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChCaWdEZWNpbWFsIG9iaikKLSAgICAgICAgeyBpZiAob2JqID09IG51bGwpIHNldE5pbCgpOyBlbHNlIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X0JpZ0RlY2ltYWwob2JqKTsgc2V0X2NvbW1pdCgpOyB9IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChDYWxlbmRhciBvYmopCi0gICAgICAgIHsgaWYgKG9iaiA9PSBudWxsKSBzZXROaWwoKTsgZWxzZSB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9DYWxlbmRhcihvYmopOyBzZXRfY29tbWl0KCk7IH0gfSB9Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KERhdGUgb2JqKQotICAgICAgICB7IGlmIChvYmogPT0gbnVsbCkgc2V0TmlsKCk7IGVsc2UgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfRGF0ZShvYmopOyBzZXRfY29tbWl0KCk7IH0gfSB9Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KEdEYXRlU3BlY2lmaWNhdGlvbiBvYmopCi0gICAgICAgIHsgaWYgKG9iaiA9PSBudWxsKSBzZXROaWwoKTsgZWxzZSB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9HRGF0ZShvYmopOyBzZXRfY29tbWl0KCk7IH0gfSB9Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KEdEdXJhdGlvblNwZWNpZmljYXRpb24gb2JqKQotICAgICAgICB7IGlmIChvYmogPT0gbnVsbCkgc2V0TmlsKCk7IGVsc2UgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfR0R1cmF0aW9uKG9iaik7IHNldF9jb21taXQoKTsgfSB9IH0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoUU5hbWUgb2JqKQotICAgICAgICB7IGlmIChvYmogPT0gbnVsbCkgc2V0TmlsKCk7IGVsc2UgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfUU5hbWUob2JqKTsgc2V0X2NvbW1pdCgpOyB9IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChMaXN0IG9iaikKLSAgICAgICAgeyBpZiAob2JqID09IG51bGwpIHNldE5pbCgpOyBlbHNlIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X2xpc3Qob2JqKTsgc2V0X2NvbW1pdCgpOyB9IH0gfQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChTdHJpbmcgb2JqKQotICAgICAgICB7IGlmIChvYmogPT0gbnVsbCkgc2V0TmlsKCk7IGVsc2UgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfU3RyaW5nKG9iaik7IC8qIHN0cmluZ3MgYXJlIHNwZWNpYWwsIHNvIHNldF9TdHJpbmcgZG9lcyBpdHMgb3duIGNvbW1pdC4qLyB9IH0gfQotCi0gICAgcHVibGljIHZvaWQgb2JqZWN0U2V0KE9iamVjdCBvKQotICAgIHsKLSAgICAgICAgaWYgKG8gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc2V0TmlsKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFhtbE9iamVjdCkKLSAgICAgICAgICAgIHNldCggKFhtbE9iamVjdCkgbyApOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgc2V0KCAoU3RyaW5nKSBvICk7Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlKQotICAgICAgICAgICAgc2V0KCAoU3RyaW5nRW51bUFic3RyYWN0QmFzZSkgbyApOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgQmlnSW50ZWdlcikKLSAgICAgICAgICAgIHNldCggKEJpZ0ludGVnZXIpIG8gKTsKLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIEJpZ0RlY2ltYWwpCi0gICAgICAgICAgICBzZXQoIChCaWdEZWNpbWFsKSBvICk7Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBCeXRlKQotICAgICAgICAgICAgc2V0KCAoKEJ5dGUpbykuYnl0ZVZhbHVlKCkgKTsKLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIFNob3J0KQotICAgICAgICAgICAgc2V0KCAoKFNob3J0KW8pLnNob3J0VmFsdWUoKSApOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgSW50ZWdlcikKLSAgICAgICAgICAgIHNldCggKChJbnRlZ2VyKW8pLmludFZhbHVlKCkgKTsKLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIExvbmcpCi0gICAgICAgICAgICBzZXQoICgoTG9uZylvKS5sb25nVmFsdWUoKSApOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgQm9vbGVhbikKLSAgICAgICAgICAgIHNldCggKChCb29sZWFuKW8pLmJvb2xlYW5WYWx1ZSgpICk7Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGbG9hdCkKLSAgICAgICAgICAgIHNldCggKChGbG9hdClvKS5mbG9hdFZhbHVlKCkgKTsKLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIERvdWJsZSkKLSAgICAgICAgICAgIHNldCggKChEb3VibGUpbykuZG91YmxlVmFsdWUoKSApOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgQ2FsZW5kYXIpCi0gICAgICAgICAgICBzZXQoICgoQ2FsZW5kYXIpbykgKTsKLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIERhdGUpCi0gICAgICAgICAgICBzZXQoIChEYXRlKSBvICk7Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBHRGF0ZVNwZWNpZmljYXRpb24pCi0gICAgICAgICAgICBzZXQoIChHRGF0ZVNwZWNpZmljYXRpb24pIG8gKTsKLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIEdEdXJhdGlvblNwZWNpZmljYXRpb24pCi0gICAgICAgICAgICBzZXQoIChHRHVyYXRpb25TcGVjaWZpY2F0aW9uKSBvICk7Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBRTmFtZSkKLSAgICAgICAgICAgIHNldCggKFFOYW1lKSBvICk7Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBMaXN0KQotICAgICAgICAgICAgc2V0KCAoTGlzdCkgbyApOwotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgYnl0ZVtdKQotICAgICAgICAgICAgc2V0KCAoYnl0ZVtdKSBvICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICAgICBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgc2V0IHVuaW9uIG9iamVjdCBvZiBjbGFzcyA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgby5nZXRDbGFzcygpLmdldE5hbWUoKSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0X25ld1ZhbHVlKFhtbE9iamVjdCBvYmopCi0gICAgewotICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqLmlzTmlsKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNldE5pbCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpbWl0aXZlOgotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWG1sQW55U2ltcGxlVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sQW55U2ltcGxlVHlwZSB2ID0gKFhtbEFueVNpbXBsZVR5cGUpb2JqOwotICAgICAgICAgICAgU2NoZW1hVHlwZSBpbnN0YW5jZVR5cGUgPSAoKFNpbXBsZVZhbHVlKXYpLmluc3RhbmNlVHlwZSgpOwotICAgICAgICAgICAgYXNzZXJ0KGluc3RhbmNlVHlwZSAhPSBudWxsKSA6ICJOaWwgY2FzZSBzaG91bGQgaGF2ZSBiZWVuIGhhbmRsZWQgYWxyZWFkeSI7Ci0KLSAgICAgICAgICAgIC8vIGhhbmRsZSBsaXN0cwotICAgICAgICAgICAgaWYgKGluc3RhbmNlVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0X2xpc3QoKChTaW1wbGVWYWx1ZSl2KS54Z2V0TGlzdFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICBzZXRfY29tbWl0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGhhbmRsZSBhdG9taWMgdHlwZXMKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydChpbnN0YW5jZVR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuQVRPTUlDKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGluc3RhbmNlVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJlbmNvdW50ZXJlZCBub25wcmltaXRpdmUgdHlwZS4iOwotICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEU6ICBUaGlzIGlzIGhhbmRsZWQgYmVsb3cuLi4KLSAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHdlIGV2ZW50dWFsbHkgd2FudCB0byBoYW5kbGUgaXQgd2l0aCBhIHRyZWVjb3B5LCBzbwotICAgICAgICAgICAgICAgICAgICAvLyBldmVudHVhbGx5IHdlIHNob3VsZCBicmVhayBoZXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcHJpbWl0aXZlOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBib29sID0gKChTaW1wbGVWYWx1ZSl2KS5nZXRCb29sZWFuVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfYm9vbGVhbihib29sKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlQXJyID0gKChTaW1wbGVWYWx1ZSl2KS5nZXRCeXRlQXJyYXlWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9iNjQoYnl0ZUFycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlQXJyID0gKChTaW1wbGVWYWx1ZSl2KS5nZXRCeXRlQXJyYXlWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9oZXgoYnl0ZUFycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gKChTaW1wbGVWYWx1ZSl2KS5nZXRRTmFtZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X1FOYW1lKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZiA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0RmxvYXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9mbG9hdChmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZCA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfZG91YmxlKGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGluc3RhbmNlVHlwZS5nZXREZWNpbWFsU2l6ZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0JZVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIGIgPSAoKFNpbXBsZVZhbHVlKXYpLmdldEJ5dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfYnl0ZShiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX1NIT1JUOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgcyA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0U2hvcnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfc2hvcnQocyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0SW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2ludChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0xPTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGwgPSAoKFNpbXBsZVZhbHVlKXYpLmdldExvbmdWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfbG9uZyhsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0JJR19JTlRFR0VSOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBiaSA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0QmlnSW50ZWdlclZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9CaWdJbnRlZ2VyKGJpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpIDogImludmFsaWQgbnVtZXJpYyBiaXQgY291bnQiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsdGhyb3VnaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfREVDSU1BTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwgYmQgPSAoKFNpbXBsZVZhbHVlKXYpLmdldEJpZ0RlY2ltYWxWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfQmlnRGVjaW1hbChiZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSToKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHYuZ2V0U3RyaW5nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfdGV4dCh1cmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSB2LmdldFN0cmluZ1ZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X25vdGF0aW9uKHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgR0R1cmF0aW9uIGdkID0gKChTaW1wbGVWYWx1ZSl2KS5nZXRHRHVyYXRpb25WYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9HRHVyYXRpb24oZ2QpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgR0RhdGUgZ2QgPSAoKFNpbXBsZVZhbHVlKXYpLmdldEdEYXRlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfR0RhdGUoZ2QpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gdi5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9TdHJpbmcocyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwdXNoZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXYuaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucHVzaChuZXcgTmFtZXNwYWNlQ29udGV4dCh2KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3htbGFueXNpbXBsZSh2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB1c2hlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXRfY29tbWl0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBwcmltaXRpdmUgbm9kZSB0cmVlIGNvcHkgaGFuZGxlZC4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbXBsZXggdHlwZSB1bmV4cGVjdGVkIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUeXBlU3RvcmVVc2VyIHNldHRlckhlbHBlciAoIFhtbE9iamVjdEJhc2Ugc3JjICkKLSAgICB7Ci0gICAgICAgIGNoZWNrX29ycGhhbmVkKCk7Ci0KLSAgICAgICAgc3JjLmNoZWNrX29ycGhhbmVkKCk7Ci0KLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBnZXRfc3RvcmUoKS5jb3B5X2NvbnRlbnRzX2Zyb20oIHNyYy5nZXRfc3RvcmUoKSApLgotICAgICAgICAgICAgICAgIGdldF9zdG9yZSgpLmNoYW5nZV90eXBlKCBzcmMuc2NoZW1hVHlwZSgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFhtbE9iamVjdCBzZXQoWG1sT2JqZWN0IHNyYykKLSAgICB7Ci0gICAgICAgIGlmIChpc0ltbXV0YWJsZSgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IHNldCB0aGUgdmFsdWUgb2YgYW4gaW1tdXRhYmxlIFhtbE9iamVjdCIpOwotCi0gICAgICAgIFhtbE9iamVjdEJhc2Ugb2JqID0gdW5kZXJseWluZyhzcmMpOwotCi0gICAgICAgIFR5cGVTdG9yZVVzZXIgbmV3T2JqID0gdGhpczsKLQotICAgICAgICBpZiAob2JqID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNldE5pbCgpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob2JqLmlzSW1tdXRhYmxlKCkpCi0gICAgICAgICAgICBzZXQob2JqLnN0cmluZ1ZhbHVlKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtb25pdG9yKCkgPT0gb2JqLm1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdPYmogPSBzZXR0ZXJIZWxwZXIoIG9iaiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFib3V0IHRvIGdyYWIgdHdvIGxvY2tzOiBkb24ndCBkZWFkbG9jayBvdXJzZWx2ZXMKLSAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChvYmoubW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPYmogPSBzZXR0ZXJIZWxwZXIoIG9iaiApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGFjcXVpcmVkKQotICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoWG1sT2JqZWN0KSBuZXdPYmo7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2xpc3QoTGlzdCBsaXN0KQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9ib29sZWFuKGJvb2xlYW4gdikKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfYnl0ZShieXRlIHYpCi0gICAgICAgIHsgc2V0X2ludCgoaW50KSB2KTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9zaG9ydChzaG9ydCB2KQotICAgICAgICB7IHNldF9pbnQoKGludCkgdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfaW50KGludCB2KQotICAgICAgICB7IHNldF9sb25nKChsb25nKSB2KTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9sb25nKGxvbmcgdikKLSAgICAgICAgeyBzZXRfQmlnSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YodikpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2NoYXIoY2hhciB2KQotICAgICAgICB7IHNldF9TdHJpbmcoQ2hhcmFjdGVyLnRvU3RyaW5nKHYpKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9mbG9hdChmbG9hdCB2KQotICAgICAgICB7IHNldF9CaWdEZWNpbWFsKG5ldyBCaWdEZWNpbWFsKHYpKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9kb3VibGUoZG91YmxlIHYpCi0gICAgICAgIHsgc2V0X0JpZ0RlY2ltYWwobmV3IEJpZ0RlY2ltYWwodikpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZW51bShTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGUpCi0gICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQnl0ZUFycmF5KGJ5dGVbXSBiKQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9iNjQoYnl0ZVtdIGIpCi0gICAgICAgIHsgc2V0X0J5dGVBcnJheShiKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9oZXgoYnl0ZVtdIGIpCi0gICAgICAgIHsgc2V0X0J5dGVBcnJheShiKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9CaWdJbnRlZ2VyKEJpZ0ludGVnZXIgdikKLSAgICAgICAgeyBzZXQobmV3IEJpZ0RlY2ltYWwodikpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0RlY2ltYWwoQmlnRGVjaW1hbCB2KQotICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9EYXRlKERhdGUgdikKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQ2FsZW5kYXIoQ2FsZW5kYXIgdikKLSAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfR0RhdGUoR0RhdGVTcGVjaWZpY2F0aW9uIHYpCi0gICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0dEdXJhdGlvbihHRHVyYXRpb25TcGVjaWZpY2F0aW9uIHYpCi0gICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0NvbXBsZXhYbWwoWG1sT2JqZWN0IHYpCi0gICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X1FOYW1lKFFOYW1lIHYpCi0gICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbm90YXRpb24oU3RyaW5nIHYpCi0gICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sYW55c2ltcGxlKFhtbEFueVNpbXBsZVR5cGUgdikKLSAgICAgICAgeyBzZXRfU3RyaW5nKHYuZ2V0U3RyaW5nVmFsdWUoKSk7IH0KLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjb21wYXJhYmxlX3ZhbHVlX3NwYWNlcyhTY2hlbWFUeXBlIHQxLCBTY2hlbWFUeXBlIHQyKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KHQxLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLlVOSU9OICYmIHQyLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLlVOSU9OKTsKLQotICAgICAgICBpZiAoIXQxLmlzU2ltcGxlVHlwZSgpICYmICF0Mi5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiAodDEuZ2V0Q29udGVudFR5cGUoKSA9PSB0Mi5nZXRDb250ZW50VHlwZSgpKTsKLQotICAgICAgICBpZiAoIXQxLmlzU2ltcGxlVHlwZSgpIHx8ICF0Mi5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAodDEuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCAmJiB0Mi5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgaWYgKHQxLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkxJU1QgfHwgdDIuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gKHQxLmdldFByaW1pdGl2ZVR5cGUoKS5lcXVhbHModDIuZ2V0UHJpbWl0aXZlVHlwZSgpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHZhbHVlRXF1YWxzSW1wbChYbWxPYmplY3QgeG1sb2JqKQotICAgIHsKLSAgICAgICAgY2hlY2tfZGF0ZWQoKTsKLQotICAgICAgICBTY2hlbWFUeXBlIHR5cGV0aGlzID0gaW5zdGFuY2VUeXBlKCk7Ci0gICAgICAgIFNjaGVtYVR5cGUgdHlwZW90aGVyID0gKChTaW1wbGVWYWx1ZSl4bWxvYmopLmluc3RhbmNlVHlwZSgpOwotCi0gICAgICAgIGlmICh0eXBldGhpcyA9PSBudWxsICYmIHR5cGVvdGhlciA9PSBudWxsKSAvLyBkZXRlY3RzIG5pbAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgaWYgKHR5cGV0aGlzID09IG51bGwgfHwgdHlwZW90aGVyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKCFjb21wYXJhYmxlX3ZhbHVlX3NwYWNlcyh0eXBldGhpcywgdHlwZW90aGVyKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoeG1sb2JqLnNjaGVtYVR5cGUoKS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5VTklPTikKLSAgICAgICAgICAgIHJldHVybiAodW5kZXJseWluZyh4bWxvYmopKS5lcXVhbF90byh0aGlzKTsKLQotICAgICAgICByZXR1cm4gZXF1YWxfdG8oeG1sb2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiB2YWx1ZUVxdWFscyhYbWxPYmplY3QgeG1sb2JqKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBhY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzSW1tdXRhYmxlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHhtbG9iai5pc0ltbXV0YWJsZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlRXF1YWxzSW1wbCh4bWxvYmopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHhtbG9iai5tb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZUVxdWFsc0ltcGwoeG1sb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoeG1sb2JqLmlzSW1tdXRhYmxlKCkgfHwgbW9uaXRvcigpID09IHhtbG9iai5tb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlRXF1YWxzSW1wbCh4bWxvYmopOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHhtbG9iai5tb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVFcXVhbHNJbXBsKHhtbG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYWNxdWlyZWQpCi0gICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRzIENvbXBhcmFibGUuIFRoaXMgY29tcGFyZVRvIGlzIGluY29uc2lzdGVudCB3aXRoCi0gICAgICogZXF1YWxzIHVubGVzcyBpc0ltbXV0YWJsZSgpIGlzIHRydWUuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIGludCByZXN1bHQgPSBjb21wYXJlVmFsdWUoKFhtbE9iamVjdClvYmopOyAvLyBjYW4gdGhyb3cgQ2xhc3NDYXN0Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gMikKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvd2VkIHRvIHJldHVybiAyIGZvciBpbmNvbXBhcmFibGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgY29tcGFyZVZhbHVlSW1wbChYbWxPYmplY3QgeG1sb2JqKQotICAgIHsKLSAgICAgICAgU2NoZW1hVHlwZSB0eXBlMSwgdHlwZTI7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHR5cGUxID0gaW5zdGFuY2VUeXBlKCk7Ci0gICAgICAgICAgICB0eXBlMiA9ICgoU2ltcGxlVmFsdWUpeG1sb2JqKS5pbnN0YW5jZVR5cGUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHR5cGUxID09IG51bGwgJiYgdHlwZTIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAodHlwZTEgPT0gbnVsbCB8fCB0eXBlMiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDI7Ci0KLSAgICAgICAgaWYgKCF0eXBlMS5pc1NpbXBsZVR5cGUoKSB8fCB0eXBlMS5pc1VSVHlwZSgpKQotICAgICAgICAgICAgcmV0dXJuIDI7Ci0KLSAgICAgICAgaWYgKCF0eXBlMi5pc1NpbXBsZVR5cGUoKSB8fCB0eXBlMi5pc1VSVHlwZSgpKQotICAgICAgICAgICAgcmV0dXJuIDI7Ci0KLSAgICAgICAgdHlwZTEgPSB0eXBlMS5nZXRQcmltaXRpdmVUeXBlKCk7Ci0gICAgICAgIHR5cGUyID0gdHlwZTIuZ2V0UHJpbWl0aXZlVHlwZSgpOwotCi0gICAgICAgIC8vIERpZmZlcmVudCB2YWx1ZSBzcGFjZXM6IGRpZmZlcmVudAotICAgICAgICBpZiAodHlwZTEuZ2V0QnVpbHRpblR5cGVDb2RlKCkgIT0gdHlwZTIuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgICAgICByZXR1cm4gMjsKLQotICAgICAgICAvLyBub3cgd2UnbGwgZGVwZW5kIG9uIG91ciBpbXBsIGNsYXNzIHRvIGRvIHRoZSB3b3JrCi0gICAgICAgIHJldHVybiBjb21wYXJlX3RvKHhtbG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIGludCBjb21wYXJlVmFsdWUoWG1sT2JqZWN0IHhtbG9iaikKLSAgICB7Ci0gICAgICAgIGlmICh4bWxvYmogPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAyOwotCi0gICAgICAgIGJvb2xlYW4gYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc0ltbXV0YWJsZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh4bWxvYmouaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlVmFsdWVJbXBsKHhtbG9iaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoeG1sb2JqLm1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVWYWx1ZUltcGwoeG1sb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoeG1sb2JqLmlzSW1tdXRhYmxlKCkgfHwgbW9uaXRvcigpID09IHhtbG9iai5tb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVWYWx1ZUltcGwoeG1sb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh4bWxvYmoubW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVWYWx1ZUltcGwoeG1sb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhY3F1aXJlZCkKLSAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGNvbXBhcmVfdG8gaXMgYWxsb3dlZCB0byBkbyB0d28KLSAgICAgKiB1bnVzdWFsIHRoaW5nczoKLSAgICAgKiAoMSkgaXQgY2FuIGFzc3VtZSB0aGF0IHRoZSB4bWxvYmogcGFzc2VkIGhhcyBhIHByaW1pdGl2ZQotICAgICAqICAgICB0eXBlIHVuZGVybHlpbmcgdGhlIGluc3RhbmNlIHR5cGUgdGhhdCBtYXRjaGVzIHRoZQotICAgICAqICAgICBjdXJyZW50IGluc3RhbmNlLCBhbmQgdGhhdCBuZWl0aGVyIGlzIG5pbC4KLSAgICAgKiAoMikgaXQgaXMgYWxsb3dlZCB0byByZXR1cm4gMiBmb3IgImluY29tcGFyYWJsZSI7Ci0gICAgICogICAgIGl0IHNob3VsZCBub3QgdGhyb3cgYW4gZXhjZXB0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZV90byhYbWxPYmplY3QgeG1sb2JqKQotICAgIHsKLSAgICAgICAgaWYgKGVxdWFsX3RvKHhtbG9iaikpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IHhtbG9iaik7Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IHZhbHVlX2hhc2hfY29kZSgpOwotCi0gICAgcHVibGljIGludCB2YWx1ZUhhc2hDb2RlKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWVfaGFzaF9jb2RlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5zdGFuY2VPZihTY2hlbWFUeXBlIHR5cGUpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlIG15VHlwZTsKLQotICAgICAgICBpZiAodHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5VTklPTikKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChteVR5cGUgPSBpbnN0YW5jZVR5cGUoKTsgbXlUeXBlICE9IG51bGw7IG15VHlwZSA9IG15VHlwZS5nZXRCYXNlVHlwZSgpKQotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IG15VHlwZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXQgY3R5cGVzID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdCh0eXBlLmdldFVuaW9uQ29uc3RpdHVlbnRUeXBlcygpKSk7Ci0gICAgICAgICAgICBmb3IgKG15VHlwZSA9IGluc3RhbmNlVHlwZSgpOyBteVR5cGUgIT0gbnVsbDsgbXlUeXBlID0gbXlUeXBlLmdldEJhc2VUeXBlKCkpCi0gICAgICAgICAgICAgICAgaWYgKGN0eXBlcy5jb250YWlucyhteVR5cGUpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgaWYgKCFpc0ltbXV0YWJsZSgpKQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotCi0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFhtbE9iamVjdCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgWG1sT2JqZWN0IHhtbG9iaiA9IChYbWxPYmplY3Qpb2JqOwotICAgICAgICBpZiAoIXhtbG9iai5pc0ltbXV0YWJsZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiB2YWx1ZUVxdWFscyh4bWxvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKQotICAgIHsKLSAgICAgICAgaWYgKCFpc0ltbXV0YWJsZSgpKQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc05pbCgpKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgICByZXR1cm4gdmFsdWVfaGFzaF9jb2RlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gd3JpdGVSZXBsYWNlIGVpdGhlciBhbiB1bndyYXBwZWQgWG1sT2JqZWN0QmFzZQotICAgICAqIG9yIGFuIFhCZWFuIHByb3h5LiAgQSAidHJ1ZSIgYXJndW1lbnQgbWVhbnMgdW53cmFwcGVkLgotICAgICAqCi0gICAgICogVGhlIHNlcmlhbGl6YXRpb24gc3RyYXRlZ3kgZm9yIFhtbE9iamVjdHMgaXMgdGhpczoKLSAgICAgKgotICAgICAqICgxKSBPbmx5IHRoZSByb290IFhtbE9iamVjdCBmb3IgYSBkb2N1bWVudCBhY3R1YWxseSBnZXRzCi0gICAgICogICAgIGZ1bGx5IHNlcmlhbGl6ZWQ7IGl0IGlzIHNlcmlhbGl6ZWQgYXMgYSBTZXJpYWxpemVkUm9vdE9iamVjdCwKLSAgICAgKiAgICAgd2hpY2ggc2ltcGx5IHNhdmVzIGl0c2VsZiBhcyBYTUwgdGV4dC4KLSAgICAgKgotICAgICAqICgyKSBJbnRlcmlvciBYbWxPYmplY3RzIGdldCBzZXJpYWxpemVkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZQotICAgICAqICAgICByb290IFhtbE9iamVjdCBmb3IgdGhlaXIgZG9jdW1lbnQsIHBsdXMgYW4gaW50ZWdlciB3aGljaAotICAgICAqICAgICBpbmRpY2F0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBYbWxPYmplY3Qgd2l0aGluIHRoZSBvd25lcgotICAgICAqICAgICBkb2N1bWVudC4gVGhpcyBwYWlyIGlzIHN0b3JlZCBhcyBhIFNlcmlhbGl6ZWRJbnRlcmlvck9iamVjdC4KLSAgICAgKgotICAgICAqIEJvdGggb2JqZWN0cyBjYW4gYmUgbWFrZWQgYXMgd3JhcHBlZCBvciB1bndyYXBwZWQuIElmIHdyYXBwZWQsCi0gICAgICogdGhlbiB0aGUgcHJveHkgaXMgcmV0dXJuZWQgd2hlbiBkZXNlcmlhbGl6aW5nOyBpZiB1bndyYXBwZWQsIHRoZW4KLSAgICAgKiB0aGUgcHJveHkgaXMgc3RyaXBwZWQgd2hlbiBkZXNlcmlhbGl6aW5nLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3Qgd3JpdGVSZXBsYWNlKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaXNSb290WG1sT2JqZWN0KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVkUm9vdE9iamVjdCh0aGlzKTsKLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVkSW50ZXJpb3JPYmplY3QodGhpcywgZ2V0Um9vdFhtbE9iamVjdCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIG9iamVjdCBpcyBhdCB0aGUgcm9vdCBvZiB0aGUgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUm9vdFhtbE9iamVjdCgpCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgY3VyID0gbmV3Q3Vyc29yKCk7Ci0gICAgICAgIGlmIChjdXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBib29sZWFuIHJlc3VsdCA9ICFjdXIudG9QYXJlbnQoKTsKLSAgICAgICAgY3VyLmRpc3Bvc2UoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb290IFhtbE9iamVjdCBmb3IgdGhpcyBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFhtbE9iamVjdCBnZXRSb290WG1sT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjdXIgPSBuZXdDdXJzb3IoKTsKLSAgICAgICAgaWYgKGN1ciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIGN1ci50b1N0YXJ0RG9jKCk7Ci0gICAgICAgIFhtbE9iamVjdCByZXN1bHQgPSBjdXIuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIGN1ci5kaXNwb3NlKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VyaWFsaXphYmxlIHJld3JpdGUgb2JqZWN0IHRoYXQga25vd3MgaG93IHRvIHJlc29sdmUKLSAgICAgKiB0byBhbiBYbWxPYmplY3RCYXNlIG9yIGEgcHJveHkgZm9yIHRoZSByb290IG9iamVjdCBvZgotICAgICAqIGEgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VyaWFsaXplZFJvb3RPYmplY3QgaW1wbGVtZW50cyBTZXJpYWxpemFibGUKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE7Ci0KLSAgICAgICAgdHJhbnNpZW50IENsYXNzIF94YmVhbkNsYXNzOwotICAgICAgICB0cmFuc2llbnQgWG1sT2JqZWN0IF9pbXBsOwotCi0gICAgICAgIHByaXZhdGUgU2VyaWFsaXplZFJvb3RPYmplY3QoKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFNlcmlhbGl6ZWRSb290T2JqZWN0KFhtbE9iamVjdCBpbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgICBfeGJlYW5DbGFzcyA9IGltcGwuc2NoZW1hVHlwZSgpLmdldEphdmFDbGFzcygpOwotICAgICAgICAgICAgX2ltcGwgPSBpbXBsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBvdXQud3JpdGVPYmplY3QoX3hiZWFuQ2xhc3MpOwotICAgICAgICAgICAgLy8gdGhlIGZpcnN0IHNob3J0IGlzIHdyaXR0ZW4gb3V0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQotICAgICAgICAgICAgLy8gaXQgd2lsbCBhbHdheXMgYmUgemVybyBmb3Igb2JqZWN0cyB3cml0dGVuIHdpdGgKLSAgICAgICAgICAgIC8vIHRoaXMgY29kZSwgYnV0IGl0IHVzZWQgdG8gYmUgdGhlIGZpcnN0IDIgYnl0ZXMgb2YgdGhlCi0gICAgICAgICAgICAvLyB3cml0ZVVURigpIG1ldGhvZAotICAgICAgICAgICAgb3V0LndyaXRlU2hvcnQoKHNob3J0KTApOwotICAgICAgICAgICAgb3V0LndyaXRlU2hvcnQoTUFKT1JfVkVSU0lPTl9OVU1CRVIpOwotICAgICAgICAgICAgb3V0LndyaXRlU2hvcnQoTUlOT1JfVkVSU0lPTl9OVU1CRVIpOwotICAgICAgICAgICAgLy8gQ1IxMjI0MDEgLSBuZWVkIHRvIHVzZSB3cml0ZU9iamVjdCBpbnN0ZWFkIG9mIHdyaXRlVVRGCi0gICAgICAgICAgICAvLyBmb3IgeG1sVGV4dCBhcyB3cml0ZVVURiBoYXMgYSBsZW5ndGggbGltaXRhdGlvbiBvZgotICAgICAgICAgICAgLy8gNjU1MzUgYnl0ZXMKLSAgICAgICAgICAgIFN0cmluZyB4bWxUZXh0ID0gX2ltcGwueG1sVGV4dCgpOwotICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KHhtbFRleHQpOwotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHJlYWQgY2xhc3Mgb2JqZWN0IGZpcnN0IC0gdGhpcyBpcwotICAgICAgICAgICAgICAgIC8vIGZpcnN0IGp1c3QgZm9yIGhpc3RvcmljYWwgcmVhc29ucyAtIHJlYWxseQotICAgICAgICAgICAgICAgIC8vIGl0IHdvdWxkIGJlIGJldHRlciB0byBoYXZlIHRoZSB2ZXJzaW9uIG51bWJlcnMKLSAgICAgICAgICAgICAgICAvLyBmaXJzdAotICAgICAgICAgICAgICAgIF94YmVhbkNsYXNzID0gKENsYXNzKWluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAgICAgICAgIGludCB1dGZCeXRlcyA9IGluLnJlYWRVbnNpZ25lZFNob3J0KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmUgdmVyc2lvbiBudW1iZXJzCi0gICAgICAgICAgICAgICAgLy8gaWYgdXRmQnl0ZXMgaXMgbm9uLXplcm8gdGhlbiB3ZSBkZWZhdWx0IHRvIDAuMAotICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBleHBlY3QgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gbnVtYmVycwotICAgICAgICAgICAgICAgIC8vIHRvIGJlIG5leHQgZW50cmllcyBpbiBzdHJlYW0KLSAgICAgICAgICAgICAgICBpbnQgbWFqb3JWZXJzaW9uTnVtID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgbWlub3JWZXJzaW9uTnVtID0gMDsKLSAgICAgICAgICAgICAgICBpZiAodXRmQnl0ZXMgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1ham9yVmVyc2lvbk51bSA9IGluLnJlYWRVbnNpZ25lZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1pbm9yVmVyc2lvbk51bSA9IGluLnJlYWRVbnNpZ25lZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHhtbFRleHQgPSBudWxsOwotICAgICAgICAgICAgICAgIHN3aXRjaCAobWFqb3JWZXJzaW9uTnVtKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiAvLyBvcmlnaW5hbCwgdW5udW1iZXJlZCB2ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWlub3JWZXJzaW9uTnVtIGlzIGFsd2F5cyB6ZXJvCi0gICAgICAgICAgICAgICAgICAgICAgICB4bWxUZXh0ID0gcmVhZE9iamVjdFYwKGluLCB1dGZCeXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbi5yZWFkQm9vbGVhbigpOyAvLyBpZ25vcmVkCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1pbm9yVmVyc2lvbk51bSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFRleHQgPSAoU3RyaW5nKWluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4ucmVhZEJvb2xlYW4oKTsgLy8gaWdub3JlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRGVzZXJpYWxpemF0aW9uIGVycm9yOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiBudW1iZXIgIiArIG1ham9yVmVyc2lvbk51bSArICIuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlub3JWZXJzaW9uTnVtICsgIiBub3Qgc3VwcG9ydGVkLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRGVzZXJpYWxpemF0aW9uIGVycm9yOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnNpb24gbnVtYmVyICIgKyBtYWpvclZlcnNpb25OdW0gKyAiLiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5vclZlcnNpb25OdW0gKyAiIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgWG1sT3B0aW9ucyBvcHRzID0gbmV3IFhtbE9wdGlvbnMoKS5zZXREb2N1bWVudFR5cGUoWG1sQmVhbnMudHlwZUZvckNsYXNzKF94YmVhbkNsYXNzKSk7Ci0gICAgICAgICAgICAgICAgX2ltcGwgPSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKHhtbFRleHQsIG51bGwsIG9wdHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbikobmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKS5pbml0Q2F1c2UoZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhpcyBtZXRob2QgaXMgZm9yIHJlYWRpbmcgdGhlIFVURi04IFN0cmluZyB0aGF0IHVzZWQgdG8gYmUKLSAgICAgICAgLy8gd3JpdHRlbiBvdXQgZm9yIGEgc2VyaWFsaXplZCBYbWxPYmplY3QgYWNjb3JkaW5nIHRvIHRoZQotICAgICAgICAvLyBvcmlnaW5hbCBmb3JtYXQgYmVmb3JlIHRoaXMgZml4LCBpLmUuIGl0IGV4cGVjdHMgaXQKLSAgICAgICAgLy8gdG8gaGF2ZSBiZWVuIHdyaXR0ZW4gdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIHdyaXRlT2JqZWN0KENsYXNzIG9iamVjdCkKLSAgICAgICAgLy8gd3JpdGVVVEYoeG1sVGV4dCBvZiBvYmplY3QgYXMgU3RyaW5nKQotICAgICAgICAvLyB3cml0ZUJvb2xlYW4oKQotICAgICAgICAvLwotICAgICAgICAvLyB0aGlzIG1ldGhvZCBpcyBwYXNzZWQgdGhlIG9yaWdpbmFsIGlucHV0IHN0cmVhbSBwb3NpdGlvbmVkIGFzIHRob3VnaAotICAgICAgICAvLyBpdCBoYWQganVzdCByZWFkIHRoZSBjbGFzcyBvYmplY3QgcGx1cyB0aGUgbmV4dCAyIGJ5dGVzLiBUaG9zZSAyCi0gICAgICAgIC8vIGJ5dGVzIGFyZSBpbnRlcnByZXRlZCBhcyBhbiB1bnNpZ25lZCBzaG9ydCBzYXlpbmcgaG93IG1hbnkgbW9yZQotICAgICAgICAvLyBieXRlcyB0aGVyZSBhcmUgcmVwcmVzZW50aW5nIHRoZSBieXRlcyBvZiB0aGUgVVRGLTgtZm9ybWF0dGVkIFN0cmluZzsKLSAgICAgICAgLy8gdGhpcyB2YWx1ZSBpcyBwYXNzZWQgaW4gYXMgdGhlIGFyZ3VtZW50IHV0ZkJ5dGVzCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIHJlYWRPYmplY3RWMChPYmplY3RJbnB1dFN0cmVhbSBpbiwgaW50IHV0ZkJ5dGVzKQotICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBhbGxvdyBhbiBleHRyYSAyIGJ5dGVzIHVwIGZyb250IGZvciB0aGUgdW5zaWduZWQgc2hvcnQKLSAgICAgICAgICAgIGJ5dGVbXSBiQXJyYXkgPSBuZXcgYnl0ZVt1dGZCeXRlcysyXTsKLQotICAgICAgICAgICAgLy8gZm9yIGZvcm1hdCBvZiB0aGVzZSBmaXJzdCAyIGJ5dGVzIHNlZQotICAgICAgICAgICAgLy8gSmF2YSBBUEkgZG9jcyAtIERhdGFPdXRwdXRTdHJlYW0ud3JpdGVTaG9ydCgpCi0gICAgICAgICAgICBiQXJyYXlbMF0gPSAoYnl0ZSkoIDB4ZmYgJiAodXRmQnl0ZXMgPj4gOCkgKTsKLSAgICAgICAgICAgIGJBcnJheVsxXSA9IChieXRlKSggMHhmZiAmIHV0ZkJ5dGVzICk7Ci0KLSAgICAgICAgICAgIC8vIHJlYWQgdGhlIG5leHQgbnVtQnl0ZXMgYnl0ZXMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICAgICAgICAvLyBpbnRvIHRoZSBieXRlIGFycmF5IHN0YXJ0aW5nIGF0IG9mZnNldCAyOyB0aGlzIG1heQotICAgICAgICAgICAgLy8gdGFrZSBtdWx0aXBsZSBjYWxscyB0byByZWFkKCkKLSAgICAgICAgICAgIGludCB0b3RhbEJ5dGVzUmVhZCA9IDA7Ci0gICAgICAgICAgICBpbnQgbnVtUmVhZDsKLSAgICAgICAgICAgIHdoaWxlICh0b3RhbEJ5dGVzUmVhZCA8IHV0ZkJ5dGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG51bVJlYWQgPQotICAgICAgICAgICAgICAgICAgICBpbi5yZWFkKGJBcnJheSwgMit0b3RhbEJ5dGVzUmVhZCwgdXRmQnl0ZXMtdG90YWxCeXRlc1JlYWQpOwotICAgICAgICAgICAgICAgIGlmIChudW1SZWFkID09IC0xKSAvLyByZWFjaGVkIGVuZCBvZiBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCArPSBudW1SZWFkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodG90YWxCeXRlc1JlYWQgIT0gdXRmQnl0ZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFcnJvciByZWFkaW5nIGJhY2t3YXJkcyBjb21wYXRpYmxlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlhtbE9iamVjdDogbnVtYmVyIG9mIGJ5dGVzIHJlYWQgKCIgKyB0b3RhbEJ5dGVzUmVhZCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiKSAhPSBudW1iZXIgZXhwZWN0ZWQgKCIgKyB1dGZCeXRlcyArICIpIiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3cgc2V0IHVwIGEgRGF0YUlucHV0U3RyZWFtIHRvIHJlYWQgdGhvc2UKLSAgICAgICAgICAgIC8vIGJ5dGVzIGFzIGEgVVRGLTggU3RyaW5nIGkuZS4gYXMgdGhvdWdoIHdlJ2QgbmV2ZXIKLSAgICAgICAgICAgIC8vIHJlYWQgdGhlIGZpcnN0IDIgYnl0ZXMgZnJvbSB0aGUgb3JpZ2luYWwgc3RyZWFtCi0gICAgICAgICAgICBEYXRhSW5wdXRTdHJlYW0gZGlzID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBzdHIgPSBudWxsOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGlzID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYkFycmF5KSk7Ci0gICAgICAgICAgICAgICAgc3RyID0gZGlzLnJlYWRVVEYoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZGlzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGRpcy5jbG9zZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc3RyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfaW1wbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlcmlhbGl6YWJsZSByZXdyaXRlIG9iamVjdCB0aGF0IGtub3dzIGhvdyB0byByZXNvbHZlCi0gICAgICogdG8gYW4gWG1sT2JqZWN0QmFzZSBvciBhIHByb3h5IGZvciBhbiBpbnRlcmlvciBwb3NpdGlvbgotICAgICAqIHdpdGhpbiBhIGRvY3VtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNlcmlhbGl6ZWRJbnRlcmlvck9iamVjdCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTsKLQotICAgICAgICB0cmFuc2llbnQgWG1sT2JqZWN0IF9pbXBsOwotICAgICAgICB0cmFuc2llbnQgWG1sT2JqZWN0IF9yb290OwotCi0gICAgICAgIHByaXZhdGUgU2VyaWFsaXplZEludGVyaW9yT2JqZWN0KCkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTZXJpYWxpemVkSW50ZXJpb3JPYmplY3QoWG1sT2JqZWN0IGltcGwsIFhtbE9iamVjdCByb290KQotICAgICAgICB7Ci0gICAgICAgICAgICBfaW1wbCA9IGltcGw7Ci0gICAgICAgICAgICBfcm9vdCA9IHJvb3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChfcm9vdCk7Ci0gICAgICAgICAgICBvdXQud3JpdGVCb29sZWFuKGZhbHNlKTsKLSAgICAgICAgICAgIG91dC53cml0ZUludChkaXN0YW5jZVRvUm9vdCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgX3Jvb3QgPSAoWG1sT2JqZWN0KWluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgIGluLnJlYWRCb29sZWFuKCk7Ci0gICAgICAgICAgICBfaW1wbCA9IG9iamVjdEF0RGlzdGFuY2UoaW4ucmVhZEludCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2ltcGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBkaXN0YW5jZVRvUm9vdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEN1cnNvciBjdXIgPSBfaW1wbC5uZXdDdXJzb3IoKTsKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoIWN1ci50b1ByZXZUb2tlbigpLmlzTm9uZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghY3VyLmN1cnJlbnRUb2tlblR5cGUoKS5pc05hbWVzcGFjZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJDb3VudDogIiArIGNvdW50ICsgIiAiICsgY3VyLmN1cnJlbnRUb2tlblR5cGUoKS50b1N0cmluZygpICsgIiAiICsgUU5hbWUucHJldHR5KGN1ci5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjdXIuZGlzcG9zZSgpOwotICAgICAgICAgICAgcmV0dXJuIGNvdW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBYbWxPYmplY3Qgb2JqZWN0QXREaXN0YW5jZShpbnQgY291bnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEN1cnNvciBjdXIgPSBfcm9vdC5uZXdDdXJzb3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChjb3VudCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3VyLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFjdXIuY3VycmVudFRva2VuVHlwZSgpLmlzTmFtZXNwYWNlKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb3VudCAtPSAxOwotICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvdW50OiAiICsgY291bnQgKyAiICIgKyBjdXIuY3VycmVudFRva2VuVHlwZSgpLnRvU3RyaW5nKCkgKyAiICIgKyBRTmFtZS5wcmV0dHkoY3VyLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFhtbE9iamVjdCByZXN1bHQgPSBjdXIuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICBjdXIuZGlzcG9zZSgpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGphdmFfdmFsdWUoWG1sT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIGlmIChvYmouaXNOaWwoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFhtbEFueVNpbXBsZVR5cGUpKQotICAgICAgICAgICAgcmV0dXJuIG9iajsKLQotICAgICAgICBTY2hlbWFUeXBlIGluc3RhbmNlVHlwZSA9ICgoU2ltcGxlVmFsdWUpb2JqKS5pbnN0YW5jZVR5cGUoKTsKLSAgICAgICAgYXNzZXJ0KGluc3RhbmNlVHlwZSAhPSBudWxsKSA6ICJOaWwgY2FzZSBzaG91bGQgaGF2ZSBiZWVuIGhhbmRsZWQgYWJvdmUiOwotCi0gICAgICAgIC8vIGhhbmRsZSBsaXN0cwotICAgICAgICBpZiAoaW5zdGFuY2VUeXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkxJU1QpCi0gICAgICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSlvYmopLmdldExpc3RWYWx1ZSgpOwotCi0gICAgICAgIFNpbXBsZVZhbHVlIGJhc2UgPSAoU2ltcGxlVmFsdWUpb2JqOwotCi0gICAgICAgIHN3aXRjaCAoaW5zdGFuY2VUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgotICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLmdldEJvb2xlYW5WYWx1ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWToKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5nZXRCeXRlQXJyYXlWYWx1ZSgpOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLmdldFFOYW1lVmFsdWUoKTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0KGJhc2UuZ2V0RmxvYXRWYWx1ZSgpKTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUoYmFzZS5nZXREb3VibGVWYWx1ZSgpKTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoaW5zdGFuY2VUeXBlLmdldERlY2ltYWxTaXplKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CWVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlKGJhc2UuZ2V0Qnl0ZVZhbHVlKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX1NIT1JUOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaG9ydChiYXNlLmdldFNob3J0VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfSU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKGJhc2UuZ2V0SW50VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfTE9ORzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZyhiYXNlLmdldExvbmdWYWx1ZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLmdldEJpZ0ludGVnZXJWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpIDogImludmFsaWQgbnVtZXJpYyBiaXQgY291bnQiOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbHRocm91Z2gKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQklHX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5nZXRCaWdEZWNpbWFsVmFsdWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9VUkk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuZ2V0U3RyaW5nVmFsdWUoKTsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5nZXRHRHVyYXRpb25WYWx1ZSgpOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5nZXRDYWxlbmRhclZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJlbmNvdW50ZXJlZCBub25wcmltaXRpdmUgdHlwZS4iOwotICAgICAgICAgICAgICAgIC8vIGZhbGx0aHJvdWdoCi0KLSAgICAgICAgICAgIC8vIE5COiBmb3Igc3RyaW5nIGVudW1zIHdlIGp1c3QgZG8gamF2YS5sYW5nLlN0cmluZwotICAgICAgICAgICAgLy8gd2hlbiBpbiB0aGUgY29udGV4dCBvZiB1bmlvbnMuIEl0J3MgZWFzaWVyIG9uIHVzZXJzLgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgotICAgICAgICAgICAgICAgIC8vIHJldHVybiBiYXNlLmdldFN0cmluZ1ZhbHVlKCk7Ci0gICAgICAgICAgICByZXR1cm4gYmFzZS5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IGNvZGUgZ2VuZXJhdGVkIGNvZGUgdG8gZ2V0IHRoZSBkZWZhdWx0IGF0dHJpYnV0ZSB2YWx1ZQotICAgICAqIGZvciBhIGdpdmVuIGF0dHJpYnV0ZSBuYW1lLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhtbEFueVNpbXBsZVR5cGUgZ2V0X2RlZmF1bHRfYXR0cmlidXRlX3ZhbHVlKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlIHNUeXBlID0gc2NoZW1hVHlwZSgpOwotICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbCBhTW9kZWwgPSBzVHlwZS5nZXRBdHRyaWJ1dGVNb2RlbCgpOwotICAgICAgICBpZiAoYU1vZGVsID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGUgc0F0dHIgPSBhTW9kZWwuZ2V0QXR0cmlidXRlKG5hbWUpOwotICAgICAgICBpZiAoc0F0dHIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gc0F0dHIuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sUG9zaXRpdmVJbnRlZ2VySW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sUG9zaXRpdmVJbnRlZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWNlNmUzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFBvc2l0aXZlSW50ZWdlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUG9zaXRpdmVJbnRlZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLQotcHVibGljIGNsYXNzIFhtbFBvc2l0aXZlSW50ZWdlckltcGwgZXh0ZW5kcyBKYXZhSW50ZWdlckhvbGRlckV4IGltcGxlbWVudHMgWG1sUG9zaXRpdmVJbnRlZ2VyCi17Ci0gICAgcHVibGljIFhtbFBvc2l0aXZlSW50ZWdlckltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbFBvc2l0aXZlSW50ZWdlci50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sUG9zaXRpdmVJbnRlZ2VySW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sUU5hbWVJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxRTmFtZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY5NWExOC4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxRTmFtZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUU5hbWU7Ci0KLQotcHVibGljIGNsYXNzIFhtbFFOYW1lSW1wbCBleHRlbmRzIEphdmFRTmFtZUhvbGRlciBpbXBsZW1lbnRzIFhtbFFOYW1lCi17Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxRTmFtZVJlc3RyaWN0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxRTmFtZVJlc3RyaWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YWQyMGMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sUU5hbWVSZXN0cmljdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBYbWxRTmFtZVJlc3RyaWN0aW9uIGV4dGVuZHMgSmF2YVFOYW1lSG9sZGVyRXggaW1wbGVtZW50cyBYbWxRTmFtZQotewotICAgIHB1YmxpYyBYbWxRTmFtZVJlc3RyaWN0aW9uKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTaG9ydEltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFNob3J0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmU3YzA4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFNob3J0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTaG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLQotcHVibGljIGNsYXNzIFhtbFNob3J0SW1wbCBleHRlbmRzIEphdmFJbnRIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbFNob3J0Ci17Ci0gICAgcHVibGljIFhtbFNob3J0SW1wbCgpCi0gICAgICAgIHsgc3VwZXIoWG1sU2hvcnQudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbFNob3J0SW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sU3RyaW5nRW51bWVyYXRpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFN0cmluZ0VudW1lcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YmViMmIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sU3RyaW5nRW51bWVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFN0cmluZzsKLQotcHVibGljIGNsYXNzIFhtbFN0cmluZ0VudW1lcmF0aW9uIGV4dGVuZHMgSmF2YVN0cmluZ0VudW1lcmF0aW9uSG9sZGVyRXggaW1wbGVtZW50cyBYbWxTdHJpbmcKLXsKLSAgICBwdWJsaWMgWG1sU3RyaW5nRW51bWVyYXRpb24oU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFN0cmluZ0ltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFN0cmluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3MTZjMi4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTdHJpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFN0cmluZzsKLQotCi1wdWJsaWMgY2xhc3MgWG1sU3RyaW5nSW1wbCBleHRlbmRzIEphdmFTdHJpbmdIb2xkZXIgaW1wbGVtZW50cyBYbWxTdHJpbmcKLXsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFN0cmluZ1Jlc3RyaWN0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTdHJpbmdSZXN0cmljdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjEzYjQ2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFN0cmluZ1Jlc3RyaWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTdHJpbmc7Ci0KLXB1YmxpYyBjbGFzcyBYbWxTdHJpbmdSZXN0cmljdGlvbiBleHRlbmRzIEphdmFTdHJpbmdIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbFN0cmluZwotewotICAgIHB1YmxpYyBYbWxTdHJpbmdSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVGltZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFRpbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MWZlMzguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVGltZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sVGltZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci0KLQotcHVibGljIGNsYXNzIFhtbFRpbWVJbXBsIGV4dGVuZHMgSmF2YUdEYXRlSG9sZGVyRXggaW1wbGVtZW50cyBYbWxUaW1lCi17Ci0gICAgcHVibGljIFhtbFRpbWVJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxUaW1lLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxUaW1lSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVG9rZW5JbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxUb2tlbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEzMzAzMS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxUb2tlbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFRva2VuOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxUb2tlbkltcGwgZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxUb2tlbgotewotICAgIHB1YmxpYyBYbWxUb2tlbkltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbFRva2VuLnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxUb2tlbkltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuaW9uSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5pb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNmExZGMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5pb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEdXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU3RyaW5nRW51bUFic3RyYWN0QmFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlU3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEdXJhdGlvblNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU2NoZW1hVHlwZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBzaW1wbGUgdW5pb24gdHlwZXMuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgWG1sVW5pb25JbXBsIGV4dGVuZHMgWG1sT2JqZWN0QmFzZSBpbXBsZW1lbnRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICBwdWJsaWMgWG1sVW5pb25JbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IF9zY2hlbWFUeXBlID0gdHlwZTsgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCi0gICAgICAgIHsgcmV0dXJuIF9zY2hlbWFUeXBlOyB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBpbnN0YW5jZVR5cGUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IG51bGwgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuaW5zdGFuY2VUeXBlKCk7IH0KLQotICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKLSAgICBwcml2YXRlIFhtbEFueVNpbXBsZVR5cGUgX3ZhbHVlOyAvLyB1bmRlcmx5aW5nIHZhbHVlCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3RleHR2YWx1ZSA9ICIiOyAvLyB0ZXh0dWFsIHZhbHVlCi0KLQotCi0KLSAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBnZXRzIHJhdyB0ZXh0IHZhbHVlCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkKLSAgICAgICAgeyByZXR1cm4gX3RleHR2YWx1ZTsgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNfZGVmYXVsdGFibGVfd3MoU3RyaW5nIHYpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhtbEFueVNpbXBsZVR5cGUgc2F2ZWRWYWx1ZSA9IF92YWx1ZTsKLSAgICAgICAgICAgIHNldF90ZXh0KHYpOwotCi0gICAgICAgICAgICAvLyByZXN0b3JlIHRoZSBzYXZlZCB2YWx1ZQotICAgICAgICAgICAgX3ZhbHVlID0gc2F2ZWRWYWx1ZTsKLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIC8vIGZpcnN0IGNoZWNrIGFnYWluc3QgYW55IHBhdHRlcm5zLi4uCi0gICAgICAgIGlmICghX3NjaGVtYVR5cGUubWF0Y2hQYXR0ZXJuRmFjZXQocykpCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgLy8gc2F2ZSBzdGF0ZSBmb3Igcm9sbGJhY2sKLSAgICAgICAgU3RyaW5nIG9yaWdpbmFsID0gX3RleHR2YWx1ZTsKLSAgICAgICAgX3RleHR2YWx1ZSA9IHM7Ci0KLSAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHRoZSB0eXBlcywgdHJ5aW5nIHRvIGNyZWF0ZSBhIHR5cGUKLSAgICAgICAgU2NoZW1hVHlwZVtdIG1lbWJlcnMgPSBfc2NoZW1hVHlwZS5nZXRVbmlvbkNvbnN0aXR1ZW50VHlwZXMoKTsKLSAgICAgICAgYXNzZXJ0KG1lbWJlcnMgIT0gbnVsbCk7Ci0KLSAgICAgICAgYm9vbGVhbiBwdXNoZWQgPSBmYWxzZTsKLSAgICAgICAgLy8gYm9vbGVhbiB3YXNzdHJpY3QgPSBzZXRfc3RyaWN0KHRydWUpOyAvLyB0ZWxsIHR5cGVzIHRvIGNvbXBsYWluIGZlcnZlcmVudGx5IGFib3V0IGVycm9ycwotICAgICAgICBpZiAoaGFzX3N0b3JlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucHVzaChuZXcgTmFtZXNwYWNlQ29udGV4dChnZXRfc3RvcmUoKSkpOwotICAgICAgICAgICAgcHVzaGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhlIGZvbGxvd2luZyBjYWxsLCAidGhpcyIgaXMgYSBnZW5lcmljCi0gICAgICAgICAgICAgICAgLy8gWG1sQW55U2ltcGxlVHlwZSBpbXBsZW1lbnRhdGlvbiwgZm9yIHdoaWNoIG9ubHkgZ2V0VGV4dCBjYW4gYmUgY2FsbGVkLgotICAgICAgICAgICAgICAgIC8vIChOb3RlIHRoYXQgInRoaXMiIGlzIG5vdCB3cmFwcGVkIGluIHRoZSBwcm94eSBvYmplY3QuKQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sQW55U2ltcGxlVHlwZSBuZXd2YWwgPSAoKFNjaGVtYVR5cGVJbXBsKW1lbWJlcnNbaV0pLm5ld1ZhbGlkYXRpbmdWYWx1ZShzKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBub3cgd2UgbmVlZCB0byBjaGVjayBhZ2FpbnN0IChlbnVlbXJhdGlvbikgcmVzdHJpY3Rpb25zCi0gICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2sobmV3dmFsLCBfc2NoZW1hVHlwZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBvbmUgdGhhdCB3b3JrcyEKLSAgICAgICAgICAgICAgICAgICAgX3ZhbHVlID0gbmV3dmFsOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVHJvdWJsZXNvbWUgdW5pb24gZXhjZXB0aW9uIGNhdXNlZCBieSB1bmV4cGVjdGVkICIgKyBlLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gYXNzZXJ0KGZhbHNlKSA6ICJVbmV4cGVjdGVkICIgKyBlOwotICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHVzaGVkKQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucG9wKCk7Ci0gICAgICAgICAgICAvLyBzZXRfc3RyaWN0KHdhc3N0cmljdCk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8vIGRvZXNuJ3QgbWF0Y2ggYW55IG9mIHRoZSBtZW1iZXJzOyByb2xsYmFjayBhbmQgdGhyb3cKLSAgICAgICAgX3RleHR2YWx1ZSA9IG9yaWdpbmFsOwotICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCi0gICAgewotICAgICAgICBfdmFsdWUgPSBudWxsOwotICAgICAgICBfdGV4dHZhbHVlID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGdldF93c2Nhbm9uX3J1bGUoKSB7IHJldHVybiBTY2hlbWFUeXBlLldTX1BSRVNFUlZFOyB9Ci0KLQotICAgIC8vIG51bWVyaWNzCi0gICAgcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IDAuMGYgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuZmxvYXRWYWx1ZSgpOyB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyAwLjAgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuZG91YmxlVmFsdWUoKTsgfQotCi0gICAgcHVibGljIEJpZ0RlY2ltYWwgYmlnRGVjaW1hbFZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmJpZ0RlY2ltYWxWYWx1ZSgpOyB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBiaWdJbnRlZ2VyVmFsdWUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IG51bGwgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuYmlnSW50ZWdlclZhbHVlKCk7IH0KLQotICAgIHB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gMCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5ieXRlVmFsdWUoKTsgfQotCi0gICAgcHVibGljIHNob3J0IHNob3J0VmFsdWUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IDAgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuc2hvcnRWYWx1ZSgpOyB9Ci0KLSAgICBwdWJsaWMgaW50IGludFZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyAwIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmludFZhbHVlKCk7IH0KLQotICAgIHB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gMCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5sb25nVmFsdWUoKTsgfQotCi0KLSAgICAvLyB2YXJpb3VzCi0gICAgcHVibGljIGJ5dGVbXSBieXRlQXJyYXlWYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gbnVsbCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5ieXRlQXJyYXlWYWx1ZSgpOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBib29sZWFuVmFsdWUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmJvb2xlYW5WYWx1ZSgpOyB9Ci0KLSAgICBwdWJsaWMgQ2FsZW5kYXIgY2FsZW5kYXJWYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gbnVsbCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5jYWxlbmRhclZhbHVlKCk7IH0KLQotICAgIHB1YmxpYyBEYXRlIGRhdGVWYWx1ZSgpCi0gICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gbnVsbCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5kYXRlVmFsdWUoKTsgfQotCi0gICAgcHVibGljIEdEYXRlIGdEYXRlVmFsdWUoKQotICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IG51bGwgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuZ0RhdGVWYWx1ZSgpOyB9Ci0KLSAgICBwdWJsaWMgR0R1cmF0aW9uIGdEdXJhdGlvblZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmdEdXJhdGlvblZhbHVlKCk7IH0KLQotICAgIHB1YmxpYyBRTmFtZSBxTmFtZVZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLnFOYW1lVmFsdWUoKTsgfQotCi0gICAgcHVibGljIExpc3QgbGlzdFZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmxpc3RWYWx1ZSgpOyB9Ci0KLSAgICBwdWJsaWMgTGlzdCB4bGlzdFZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLnhsaXN0VmFsdWUoKTsgfQotCi0gICAgcHVibGljIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZW51bVZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmVudW1WYWx1ZSgpOyB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkKLSAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogX3ZhbHVlLnN0cmluZ1ZhbHVlKCk7IH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BhY2Ugb2YgY2Fub25pY2FsIGxleGljYWwgZm9ybXMKLSAgICAgKiBvZiB0aGUgZmlyc3QgKHNvdXJjZSkgdHlwZSBvdmVybGFwcyB3aXRoIHRoZSBmdWxsIGxleGljYWwgc3BhY2UKLSAgICAgKiBvZiB0aGUgc2Vjb25kICh0YXJnZXQpIHR5cGUuIEJvdGggdHlwZXMgbXVzdCBiZSBwcmltaXRpdmVzLgotICAgICAqLwotICAgIHN0YXRpYyBib29sZWFuIGxleGljYWxfb3ZlcmxhcChpbnQgc291cmNlLCBpbnQgdGFyZ2V0KQotICAgIHsKLSAgICAgICAgLy8gdHlwZXMgYXJlIHRoZSBzYW1lCi0gICAgICAgIGlmIChzb3VyY2UgPT0gdGFyZ2V0KQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgLy8gb25lIG9mIHRoZSB0eXBlcyBoYXMgdGhlIGZ1bGwgbGV4aWNhbCBzcGFjZQotICAgICAgICBpZiAoc291cmNlID09IFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEUgfHwKLSAgICAgICAgICAgIHRhcmdldCA9PSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFIHx8Ci0gICAgICAgICAgICBzb3VyY2UgPT0gU2NoZW1hVHlwZS5CVENfU1RSSU5HIHx8Ci0gICAgICAgICAgICB0YXJnZXQgPT0gU2NoZW1hVHlwZS5CVENfU1RSSU5HIHx8Ci0gICAgICAgICAgICBzb3VyY2UgPT0gU2NoZW1hVHlwZS5CVENfQU5ZX1VSSSB8fAotICAgICAgICAgICAgdGFyZ2V0ID09IFNjaGVtYVR5cGUuQlRDX0FOWV9VUkkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBzd2l0Y2ggKHNvdXJjZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOiBzd2l0Y2godGFyZ2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6ICAgICAgIC8vICJ0cnVlIiBpcyB2YWxpZCBOY05hbWUgYW5kIHRoZXJlZm9yZSBRTmFtZQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046ICAgIC8vICJ0cnVlIiBpcyB2YWxpZCBOQ05hbWUKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWTogc3dpdGNoKHRhcmdldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46ICAgICAvLyAiMCIgaXMgdmFsaWQgYm9vbGVhbgotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWTogIC8vICIwIiBpcyB2YWxpZCBoZXgKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOiAgICAgICAvLyAiYSIgaXMgdmFsaWQgTmNOYW1lIGFuZCB0aGVyZWZvcmUgUU5hbWUKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOiAgICAvLyAiYSIgaXMgdmFsaWQgTmNOYW1lCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDogICAgICAgLy8gIjAiIGlzIHZhbGlkIGZsb2F0Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6ICAgICAgLy8gIjAiIGlzIHZhbGlkIGRvdWJsZQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDogICAgIC8vICIwIiBpcyB2YWxpZCBkZWNpbWFsCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjogICAgLy8gIlAxWTJNM0RUMTBIMzBNIiBpcyBib3RoIGI2NCBhbmQgZHVyYXRpb24KLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjogICAgICAvLyAiMTk5OSIgaXMgdmFsaWQgeWVhcgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAvLyAiLSIgYW5kICI6IiBjYW5ub3QgY29tZSBmcm9tIGI2NAotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOiBzd2l0Y2godGFyZ2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjogICAgIC8vICIwIiBpcyB2YWxpZCBib29sZWFuCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWTogIC8vICIwIiBpcyB2YWxpZCBiNjQKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOiAgICAgICAvLyAiQSIgaXMgdmFsaWQgTmNOYW1lIGFuZCB0aGVyZWZvcmUgUU5hbWUKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOiAgICAvLyAiQSIgaXMgdmFsaWQgTmNOYW1lCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDogICAgICAgLy8gIjAiIGlzIHZhbGlkIGZsb2F0Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6ICAgICAgLy8gIjAiIGlzIHZhbGlkIGRvdWJsZQotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDogICAgIC8vICIwIiBpcyB2YWxpZCBkZWNpbWFsCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6ICAgICAgLy8gIjE5OTkiIGlzIHZhbGlkIHllYXIKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgLy8gIi0iIGFuZCAiOiIgY2Fubm90IGNvbWUgZnJvbSBiNjQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOiBzd2l0Y2godGFyZ2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjogICAgIC8vICJ0cnVlIiBpcyB2YWxpZCBib29sZWFuCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWTogIC8vICJhIiBpcyB2YWxpZCBiNjQKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6ICAvLyAiYSIgaXMgdmFsaWQgaGV4Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRTogICAgICAgLy8gIkEiIGlzIHZhbGlkIE5jTmFtZSBhbmQgdGhlcmVmb3JlIFFOYW1lCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjogICAgLy8gIkEiIGlzIHZhbGlkIE5jTmFtZSBhbmQgdGhlcmVmb3JlIFFOYW1lCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjogICAgLy8gIlAxWTJNM0RUMTBIMzBNIiBpcyBib3RoIE5jTmFtZSBhbmQgZHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6IHN3aXRjaCh0YXJnZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWTogLy8gIjAiIGlzIHZhbGlkIGI2NAotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWTogIC8vICIwIiBpcyB2YWxpZCBoZXgKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUOiAgICAgICAvLyAiMCIgaXMgdmFsaWQgZmxvYXQKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRTogICAgICAvLyAiMCIgaXMgdmFsaWQgZG91YmxlCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOiAgICAgLy8gIjAiIGlzIHZhbGlkIGRlY2ltYWwKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjogICAgICAvLyAiMTk5OSIgaXMgdmFsaWQgeWVhcgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOiBzd2l0Y2godGFyZ2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjoKLSAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIGdpdmVuIHNjaGVtYSB0eXBlJ3MgbG9naWNhbCB0eXBlIGlzIGEgbWF0Y2ggZm9yCi0gICAgICogdGhlIGdpdmVuIGNhdGVnb3J5IG9mIGphdmEgY29uY2VwdHMuCi0gICAgICovCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9OVU1CRVIgPSBTY2hlbWFUeXBlLkJUQ19MQVNUX0JVSUxUSU4gKyAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKQVZBX0RBVEUgPSBTY2hlbWFUeXBlLkJUQ19MQVNUX0JVSUxUSU4gKyAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKQVZBX0NBTEVOREFSID0gU2NoZW1hVHlwZS5CVENfTEFTVF9CVUlMVElOICsgMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9CWVRFQVJSQVkgPSBTY2hlbWFUeXBlLkJUQ19MQVNUX0JVSUxUSU4gKyA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKQVZBX0xJU1QgPSBTY2hlbWFUeXBlLkJUQ19MQVNUX0JVSUxUSU4gKyA1OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBsb2dpY2FsX292ZXJsYXAoU2NoZW1hVHlwZSB0eXBlLCBpbnQgamF2YWNvZGUpCi0gICAgewotICAgICAgICAvLyBub24tdW5pb24gdHlwZXMgYmVjYXVzZSBpdCdzIGJlaW5nIGFwcGxpZWQgb24gaXJyZWR1Y2libGUgdW5pb24gbWVtYmVycyEKLSAgICAgICAgYXNzZXJ0KHR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpICE9IFNjaGVtYVR5cGUuVU5JT04pOwotCi0gICAgICAgIGlmIChqYXZhY29kZSA8PSBTY2hlbWFUeXBlLkJUQ19MQVNUX0JVSUxUSU4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0eXBlLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLkFUT01JQykKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIHJldHVybiAodHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkgPT0gamF2YWNvZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChqYXZhY29kZSkKLSAgICAgICAgewotICAgICAgICBjYXNlIEpBVkFfTlVNQkVSOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLkFUT01JQykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEpBVkFfREFURToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5BVE9NSUMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBKQVZBX0NBTEVOREFSOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLkFUT01JQykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICBjYXNlIEpBVkFfQllURUFSUkFZOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLkFUT01JQykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgSkFWQV9MSVNUOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAodHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydChmYWxzZSkgOiAibWlzc2luZyBjYXNlIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdyYWJzIGEgY2hhaW5lZCB2YWx1ZSBvZiB0eXBlIHN0LCBjcmVhdGluZyBhbmQgYXR0YWNoaW5nCi0gICAgICogb25lIGlmIG5vdCBwcmVzZW50LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRfcHJpbWl0aXZlKGludCB0eXBlY29kZSwgT2JqZWN0IHZhbCkKLSAgICB7Ci0gICAgICAgIFNjaGVtYVR5cGVbXSBtZW1iZXJzID0gX3NjaGVtYVR5cGUuZ2V0VW5pb25Db25zdGl0dWVudFR5cGVzKCk7Ci0gICAgICAgIGFzc2VydChtZW1iZXJzICE9IG51bGwpOwotCi0gICAgICAgIGJvb2xlYW4gcHVzaGVkID0gZmFsc2U7Ci0gICAgICAgIGlmIChoYXNfc3RvcmUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wdXNoKG5ldyBOYW1lc3BhY2VDb250ZXh0KGdldF9zdG9yZSgpKSk7Ci0gICAgICAgICAgICBwdXNoZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRlcjogZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGNhbmRpZGF0ZXMgbXVzdCBiZSBhIGxvZ2ljYWwgbWF0Y2ggZm9yIHRoZSBkZXNpcmVkIHR5cGVjb2RlCi0gICAgICAgICAgICAgICAgaWYgKGxvZ2ljYWxfb3ZlcmxhcChtZW1iZXJzW2ldLCB0eXBlY29kZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYbWxBbnlTaW1wbGVUeXBlIG5ld3ZhbDsKLQotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3dmFsID0gbWVtYmVyc1tpXS5uZXdWYWx1ZSh2YWwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBtYXRjaCB0aGlzIHR5cGUgZXZlbiB0aG91Z2ggbG9naWNhbCBjYXRlZ29yaWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5lIHVwIChwcm9iYWJseSBiZWNhdXNlIG9mIHJlc3RyaWNpdG9uKTsgdHJ5IHRoZSBuZXh0IHR5cGUuCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSkgOiAiVW5leHBlY3RlZCAiICsgZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogcmV0aGluayB0aGlzIC0gZGlzYWJsaW5nIGZvciBub3cuCi0KLSAgICAgICAgICAgICAgICAgICAgLy8gT0ssIG5vdyB3ZSd2ZSBnb3QgYSBuZXd2YWwuLi4gV2UgaGF2ZSB0byB2ZXJpZnkKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBsZXhpY2FsbHkgaXQgZG9lc24ndCBvdmVybGFwIHdpdGggcHJldmlvdXMgdHlwZXMKLQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3dmFsdGV4dCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW5uZXI6IGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyc1tqXS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV4aWNhbF9vdmVybGFwKG1lbWJlcnNbal0uZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXd2YWwuc2NoZW1hVHlwZSgpLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYSBwcmVjZWRpbmcgdHlwZSB0aGF0IG1heSBsZXhpY2FsbHkgb3ZlcmxhcCB3aXRoIG91cnMuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBsZXhpY2FsbHkgY29udGFpbnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvdXIgbmV3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvcG9zZWQgdmFsdWUsIHRoZW4gaXQncyBpbXBvc3NpYmxlIGZvciB0aGUgdW5pb24gdG8gaGF2ZSBvdXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2dpY2FsIHZhbHVlIChiZWNhdXNlIGl0IHdvdWxkIGhhdmUgYmVlbiBtYXNrZWQpIGFuZCB0aHJvdyBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVycm9yLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXd2YWx0ZXh0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3ZhbHRleHQgPSBuZXd2YWwuc3RyaW5nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2NhcmQgcmV0dXJuIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcnNbaV0ubmV3VmFsdWUobmV3dmFsdGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2ggYmFkLCB3ZSBzdWNjZWVkZWQuIE91ciBpbnN0YW5jZSBsZXhpY2FsbHkgbG9va3MgbGlrZSBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHR5cGUsIGFuZCB0aGlzIGlzbid0IGEgdmFsaWQgdmFsdWUuIEtlZXAgb24gaHVudGluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgZ29vZDogdGhpcyBlcnJvciBtZWFucyB0aGF0IG91ciB2YWx1ZSBkb2Vzbid0IGxvb2sgbGlrZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb3RoZXIgdHlwZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgaW5uZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAvLyBObyBsZXhpY2FsIG1hc2tpbmc6IHdlJ3JlIE9LCi0gICAgICAgICAgICAgICAgICAgIF92YWx1ZSA9IG5ld3ZhbDsKLSAgICAgICAgICAgICAgICAgICAgX3RleHR2YWx1ZSA9IF92YWx1ZS5zdHJpbmdWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHB1c2hlZCkKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnBvcCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gaGVyZSBhcmUgdGhlIHNldHRlcnMKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9ib29sZWFuKGJvb2xlYW4gdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX0JPT0xFQU4sIG5ldyBCb29sZWFuKHYpKTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2J5dGUoYnl0ZSB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9OVU1CRVIsIG5ldyBCeXRlKHYpKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9zaG9ydChzaG9ydCB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9OVU1CRVIsIG5ldyBTaG9ydCh2KSk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfaW50KGludCB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9OVU1CRVIsIG5ldyBJbnRlZ2VyKHYpKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9sb25nKGxvbmcgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKEpBVkFfTlVNQkVSLCBuZXcgTG9uZyh2KSk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZmxvYXQoZmxvYXQgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKEpBVkFfTlVNQkVSLCBuZXcgRmxvYXQodikpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X2RvdWJsZShkb3VibGUgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKEpBVkFfTlVNQkVSLCBuZXcgRG91YmxlKHYpKTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0J5dGVBcnJheShieXRlW10gYikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKEpBVkFfQllURUFSUkFZLCBiKTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9oZXgoYnl0ZVtdIGIpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShKQVZBX0JZVEVBUlJBWSwgYik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfYjY0KGJ5dGVbXSBiKQotICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9CWVRFQVJSQVksIGIpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0ludGVnZXIoQmlnSW50ZWdlciB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9OVU1CRVIsIHYpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0RlY2ltYWwoQmlnRGVjaW1hbCB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9OVU1CRVIsIHYpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X1FOYW1lKFFOYW1lIHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19RTkFNRSwgdik7IH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9DYWxlbmRhcihDYWxlbmRhciBjKQotICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9DQUxFTkRBUiwgYyk7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfRGF0ZShEYXRlIGQpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShKQVZBX0RBVEUsIGQpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X0dEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiBkKQotICAgIHsKLSAgICAgICAgaW50IGJ0YyA9IGQuZ2V0QnVpbHRpblR5cGVDb2RlKCk7Ci0gICAgICAgIGlmIChidGMgPD0gMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgc2V0X3ByaW1pdGl2ZShidGMsIGQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF9HRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkKQotICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfRFVSQVRJT04sIGQpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZW51bShTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGUpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19TVFJJTkcsIGUpOyB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbGlzdChMaXN0IHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShKQVZBX0xJU1QsIHYpOyB9Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWxmbG9hdChYbWxPYmplY3QgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX0ZMT0FULCB2KTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWxkb3VibGUoWG1sT2JqZWN0IHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19ET1VCTEUsIHYpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3htbGRlY2ltYWwoWG1sT2JqZWN0IHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19ERUNJTUFMLCB2KTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWxkdXJhdGlvbihYbWxPYmplY3QgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OLCB2KTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWxkYXRldGltZShYbWxPYmplY3QgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRSwgdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sdGltZShYbWxPYmplY3QgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX1RJTUUsIHYpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3htbGRhdGUoWG1sT2JqZWN0IHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19EQVRFLCB2KTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWxneWVhcm1vbnRoKFhtbE9iamVjdCB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRILCB2KTsgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWxneWVhcihYbWxPYmplY3QgdikKLSAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX0dfWUVBUiwgdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sZ21vbnRoZGF5KFhtbE9iamVjdCB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVksIHYpOyB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3htbGdkYXkoWG1sT2JqZWN0IHYpCi0gICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19HX0RBWSwgdik7IH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sZ21vbnRoKFhtbE9iamVjdCB2KQotICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfR19NT05USCwgdik7IH0KLQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrKFhtbE9iamVjdCB2LCBTY2hlbWFUeXBlIHNUeXBlKQotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0gICAgICAgIGlmICh2YWxzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsc1tpXS52YWx1ZUVxdWFscyh2KSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgeG1sb2JqKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZS52YWx1ZUVxdWFscyh4bWxvYmopOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsdWUuaGFzaENvZGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tfZGF0ZWQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN0eC5pbnZhbGlkKCJVbmlvbiB2YWx1ZSAiICsgbGV4aWNhbCArICIgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSBtZW1iZXIgdHlwZXMgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzY2hlbWFUeXBlKCkpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoX3ZhbHVlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN0eC5pbnZhbGlkKCJVbmlvbiB2YWx1ZSAiICsgbGV4aWNhbCArICIgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSBtZW1iZXIgdHlwZXMgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzY2hlbWFUeXBlKCkpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgKChYbWxPYmplY3RCYXNlKV92YWx1ZSkudmFsaWRhdGVfc2ltcGxldmFsKGxleGljYWwsICBjdHgpOwotICAgIH0KLSAgICAKLQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbnNpZ25lZEJ5dGVJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbnNpZ25lZEJ5dGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMjQzNTcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5zaWduZWRCeXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxVbnNpZ25lZEJ5dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxVbnNpZ25lZEJ5dGVJbXBsIGV4dGVuZHMgSmF2YUludEhvbGRlckV4IGltcGxlbWVudHMgWG1sVW5zaWduZWRCeXRlCi17Ci0gICAgcHVibGljIFhtbFVuc2lnbmVkQnl0ZUltcGwoKQotICAgICAgICB7IHN1cGVyKFhtbFVuc2lnbmVkQnl0ZS50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sVW5zaWduZWRCeXRlSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5zaWduZWRJbnRJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbnNpZ25lZEludEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjljMjNmYS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbnNpZ25lZEludEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sVW5zaWduZWRJbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxVbnNpZ25lZEludEltcGwgZXh0ZW5kcyBKYXZhTG9uZ0hvbGRlckV4IGltcGxlbWVudHMgWG1sVW5zaWduZWRJbnQKLXsKLSAgICBwdWJsaWMgWG1sVW5zaWduZWRJbnRJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxVbnNpZ25lZEludC50eXBlLCBmYWxzZSk7IH0KLSAgICBwdWJsaWMgWG1sVW5zaWduZWRJbnRJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQotICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbnNpZ25lZExvbmdJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbnNpZ25lZExvbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYmIzZmUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5zaWduZWRMb25nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxVbnNpZ25lZExvbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxVbnNpZ25lZExvbmdJbXBsIGV4dGVuZHMgSmF2YUludGVnZXJIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbFVuc2lnbmVkTG9uZwotewotICAgIHB1YmxpYyBYbWxVbnNpZ25lZExvbmdJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxVbnNpZ25lZExvbmcudHlwZSwgZmFsc2UpOyB9Ci0gICAgcHVibGljIFhtbFVuc2lnbmVkTG9uZ0ltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCi0gICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuc2lnbmVkU2hvcnRJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbnNpZ25lZFNob3J0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGIzNGFkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuc2lnbmVkU2hvcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFVuc2lnbmVkU2hvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotCi1wdWJsaWMgY2xhc3MgWG1sVW5zaWduZWRTaG9ydEltcGwgZXh0ZW5kcyBKYXZhSW50SG9sZGVyRXggaW1wbGVtZW50cyBYbWxVbnNpZ25lZFNob3J0Ci17Ci0gICAgcHVibGljIFhtbFVuc2lnbmVkU2hvcnRJbXBsKCkKLSAgICAgICAgeyBzdXBlcihYbWxVbnNpZ25lZFNob3J0LnR5cGUsIGZhbHNlKTsgfQotICAgIHB1YmxpYyBYbWxVbnNpZ25lZFNob3J0SW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKLSAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMDVkYmEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotcHVibGljIGNsYXNzIFhtbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgotewotICAgIFhtbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uICggKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24gKCBTdHJpbmcgbWVzc2FnZSApCi0gICAgewotICAgICAgICBzdXBlciggbWVzc2FnZSApOwotICAgIH0KLSAgICAKLSAgICBYbWxWYWx1ZURpc2Nvbm5lY3RlZEV4Y2VwdGlvbiAoIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG1lc3NhZ2UsIGNhdXNlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVmFsdWVOb3ROaWxsYWJsZUV4Y2VwdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVmFsdWVOb3ROaWxsYWJsZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTJlMTM1Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFZhbHVlTm90TmlsbGFibGVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotcHVibGljIGNsYXNzIFhtbFZhbHVlTm90TmlsbGFibGVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCi17Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjE3YmNjLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1wdWJsaWMgY2xhc3MgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGV4dGVuZHMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi17Ci0gICAgcHVibGljIFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpIHt9Ci0gICAgcHVibGljIFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeyBzdXBlcihtZXNzYWdlKTsgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvc29hcC9TT0FQQXJyYXlUeXBlLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9zb2FwL1NPQVBBcnJheVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzYmZmNy4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9zb2FwL1NPQVBBcnJheVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5OCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuc29hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sV2hpdGVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUHJlZml4UmVzb2x2ZXI7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTT0FQQXJyYXlUeXBlCi17Ci0gICAgLy8gRXhhbXBsZSBmb286YmFyWyxdW11bLCxdWzcsOV0KLSAgICAvLyAtPiBfdHlwZSA9IFFOYW1lKGZvbzpiYXIpCi0gICAgLy8gLT4gX3JhbmtzID0gezIsMSwzfQotICAgIC8vIC0+IF9kaW1lbnNpb25zID0gezcsOX0KLSAgICBwcml2YXRlIFFOYW1lIF90eXBlOwotICAgIHByaXZhdGUgaW50W10gX3JhbmtzOyAvLyBpZiByYW5rcyBpcyBlbXB0eSwgaXQgbWVhbnMgdGhlcmUgYXJlIG5vIG5lc3RlZCBhcnJheXMKLSAgICBwcml2YXRlIGludFtdIF9kaW1lbnNpb25zOyAvLyBBbnkgZGltZW5zaW9uIGNhbiBiZSAtMSB0byBpbmRpY2F0ZSAiYW55Ii4KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIHJhbmtzIGZvciB0aGUgcGFzc2VkIFNPQVBBcnJheVR5cGUKLSAgICAgKiBhcmUgZXF1YWwgdG8gdGhpcyBvbmUuCi0gICAgICoKLSAgICAgKiBEb2VzIE5PVCBjb21wYXJlIHRoZSBfdHlwZSBmaWVsZHMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTYW1lUmFua0FzKFNPQVBBcnJheVR5cGUgb3RoZXJUeXBlKQotICAgIHsKLSAgICAgICAgaWYgKF9yYW5rcy5sZW5ndGggIT0gb3RoZXJUeXBlLl9yYW5rcy5sZW5ndGgpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3JhbmtzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3JhbmtzW2ldICE9IG90aGVyVHlwZS5fcmFua3NbaV0pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChfZGltZW5zaW9ucy5sZW5ndGggIT0gb3RoZXJUeXBlLl9kaW1lbnNpb25zLmxlbmd0aCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gU09BUCAxLjEtZm9ybWF0dGVkIGluZGV4IHN0cmluZywgcmV0dXJucyBhbiBhcnJheQotICAgICAqIGluZGV4LiAgRm9yIGV4YW1wbGUsIGdpdmVuICJbNCwzLDVdIiwgcmV0dXJucyBhbiBpbnQgYXJyYXkKLSAgICAgKiBjb250YWluaW5nIDQsIDMsIGFuZCA1LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50W10gcGFyc2VTb2FwMTFJbmRleChTdHJpbmcgaW5icmFjZXMpCi0gICAgewotICAgICAgICBpbmJyYWNlcyA9IFhtbFdoaXRlc3BhY2UuY29sbGFwc2UoaW5icmFjZXMsIFhtbFdoaXRlc3BhY2UuV1NfQ09MTEFQU0UpOwotICAgICAgICBpZiAoIWluYnJhY2VzLnN0YXJ0c1dpdGgoIlsiKSB8fCAhaW5icmFjZXMuZW5kc1dpdGgoIl0iKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1pc2Zvcm1lZCBTT0FQIDEuMSBpbmRleDogbXVzdCBiZSBjb250YWluZWQgaW4gYnJhY2VzIFtdIik7Ci0gICAgICAgIHJldHVybiBpbnRlcm5hbFBhcnNlQ29tbWFJbnRTdHJpbmcoaW5icmFjZXMuc3Vic3RyaW5nKDEsIGluYnJhY2VzLmxlbmd0aCgpIC0gMSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludFtdIGludGVybmFsUGFyc2VDb21tYUludFN0cmluZyhTdHJpbmcgY3NsKQotICAgIHsKLSAgICAgICAgTGlzdCBkaW1TdHJpbmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBqID0gY3NsLmluZGV4T2YoJywnLCBpKTsKLSAgICAgICAgICAgIGlmIChqIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkaW1TdHJpbmdzLmFkZChjc2wuc3Vic3RyaW5nKGkpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRpbVN0cmluZ3MuYWRkKGNzbC5zdWJzdHJpbmcoaSwgaikpOwotICAgICAgICAgICAgaSA9IGogKyAxOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFtkaW1TdHJpbmdzLnNpemUoKV07Ci0gICAgICAgIGkgPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZGltU3RyaW5ncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGRpbVN0cmluZyA9IFhtbFdoaXRlc3BhY2UuY29sbGFwc2UoKFN0cmluZylpdC5uZXh0KCksIFhtbFdoaXRlc3BhY2UuV1NfQ09MTEFQU0UpOwotICAgICAgICAgICAgaWYgKGRpbVN0cmluZy5lcXVhbHMoIioiKSB8fCBkaW1TdHJpbmcuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IEludGVnZXIucGFyc2VJbnQoZGltU3RyaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigiTWFsZm9ybWVkIGludGVnZXIgaW4gU09BUCBhcnJheSBpbmRleCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhIFNPQVAgMS4xIGFycmF5IHR5cGUgc3RyaW5nLgotICAgICAqCi0gICAgICogU2luY2UgYW4gYXJyYXkgdHlwZSBzdHJpbmcgY29udGFpbnMgYSBRTmFtZSwgYSBwcmVmaXggcmVzb2x2ZXIKLSAgICAgKiBtdXN0IGJlIHBhc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEFycmF5VHlwZShTdHJpbmcgcywgUHJlZml4UmVzb2x2ZXIgbSkKLSAgICB7Ci0gICAgICAgIGludCBmaXJzdGJyYWNlID0gcy5pbmRleE9mKCdbJyk7Ci0gICAgICAgIGlmIChmaXJzdGJyYWNlIDwgMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLQotICAgICAgICAvLyBncmFiIHRoZSBRTmFtZQotICAgICAgICBTdHJpbmcgZmlyc3RwYXJ0ID0gWG1sV2hpdGVzcGFjZS5jb2xsYXBzZShzLnN1YnN0cmluZygwLCBmaXJzdGJyYWNlKSwgWG1sV2hpdGVzcGFjZS5XU19DT0xMQVBTRSk7Ci0gICAgICAgIGludCBmaXJzdGNvbG9uID0gZmlyc3RwYXJ0LmluZGV4T2YoJzonKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9ICIiOwotICAgICAgICBpZiAoZmlyc3Rjb2xvbiA+PSAwKQotICAgICAgICAgICAgcHJlZml4ID0gZmlyc3RwYXJ0LnN1YnN0cmluZygwLCBmaXJzdGNvbG9uKTsKLQotICAgICAgICBTdHJpbmcgdXJpID0gbS5nZXROYW1lc3BhY2VGb3JQcmVmaXgocHJlZml4KTsKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIF90eXBlID0gUU5hbWVIZWxwZXIuZm9yTE5TKGZpcnN0cGFydC5zdWJzdHJpbmcoZmlyc3Rjb2xvbiArIDEpLCB1cmkpOwotCi0gICAgICAgIGluaXREaW1lbnNpb25zKHMsIGZpcnN0YnJhY2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludFtdIEVNUFRZX0lOVF9BUlJBWSA9IG5ldyBpbnRbMF07Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgU09BUCAxLjEoYWR2YW5jZWQpIGFycmF5IHR5cGUgc3RyaW5ncy4KLSAgICAgKgotICAgICAqIFNpbmNlIGluIFNPQVAgMS4xKGFkdmFuY2VkKSB0aGUgZGltZW5zaW9uIHNwZWNpZmljYXRpb24gaXMgc2VwYXJhdGVkIGZyb20gdGhlCi0gICAgICogUU5hbWUgZm9yIHRoZSB1bmRlcmx5aW5nIHR5cGUsIHRoZXNlIGFyZSBwYXNzZWQgaW4gc2VwYXJhdGUKLSAgICAgKiBhcmd1bWVudHMuCi0gICAgICovCi0gICAgcHVibGljIFNPQVBBcnJheVR5cGUoUU5hbWUgbmFtZSwgU3RyaW5nIGRpbWVuc2lvbnMpCi0gICAgewotICAgICAgICBpbnQgZmlyc3RicmFjZSA9IGRpbWVuc2lvbnMuaW5kZXhPZignWycpOwotICAgICAgICBpZiAoZmlyc3RicmFjZSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF90eXBlID0gbmFtZTsKLSAgICAgICAgICAgIF9yYW5rcyA9IEVNUFRZX0lOVF9BUlJBWTsKLSAgICAgICAgICAgIGRpbWVuc2lvbnMgPSBYbWxXaGl0ZXNwYWNlLmNvbGxhcHNlKGRpbWVuc2lvbnMsIFhtbFdoaXRlc3BhY2UuV1NfQ09MTEFQU0UpOwotICAgICAgICAgICAgU3RyaW5nW10gZGltU3RyaW5ncyA9IGRpbWVuc2lvbnMuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGltU3RyaW5ncy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGltU3RyaW5nID0gZGltU3RyaW5nc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoZGltU3RyaW5nLmVxdWFscygiKiIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2RpbWVuc2lvbnNbaV0gPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgLy8gX2hhc0luZGV0ZXJtaW5hdGVEaW1lbnNpb25zID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9kaW1lbnNpb25zW2ldID0gSW50ZWdlci5wYXJzZUludChkaW1TdHJpbmdzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIF90eXBlID0gbmFtZTsKLSAgICAgICAgICAgIGluaXREaW1lbnNpb25zKGRpbWVuc2lvbnMsIGZpcnN0YnJhY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYSBuZXN0ZWQgU09BUEFycmF5VHlwZSBhbmQgYSBzZXQgb2YgZGltZW5zaW9ucyBmb3IgdGhlIG91dGVybW9zdAotICAgICAqIGFycmF5LCBjb21lcyB1cCB3aXRoIHRoZSByaWdodCBTT0FQQXJyYXlUeXBlIGZvciB0aGUgd2hvbGUgdGhpbmcuCi0gICAgICoKLSAgICAgKiBFLmcuLAotICAgICAqIE5lc3RlZCBmb286YmFyWyxdW11bLCxdWzEsMl0KLSAgICAgKiBEaW1lbnNpb25zIFs2LDcsOF0KLSAgICAgKiBSZXN1bHQgLT4gZm9vOmJhclssXVtdWywsXVssXVs2LDcsOF0KLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEFycmF5VHlwZShTT0FQQXJyYXlUeXBlIG5lc3RlZCwgaW50W10gZGltZW5zaW9ucykKLSAgICB7Ci0gICAgICAgIF90eXBlID0gbmVzdGVkLl90eXBlOwotCi0gICAgICAgIF9yYW5rcyA9IG5ldyBpbnRbbmVzdGVkLl9yYW5rcy5sZW5ndGggKyAxXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShfcmFua3MsIDAsIG5lc3RlZC5fcmFua3MsIDAsIG5lc3RlZC5fcmFua3MubGVuZ3RoKTsKLSAgICAgICAgX3JhbmtzW19yYW5rcy5sZW5ndGggLSAxXSA9IG5lc3RlZC5fZGltZW5zaW9ucy5sZW5ndGg7Ci0KLSAgICAgICAgX2RpbWVuc2lvbnMgPSBuZXcgaW50W2RpbWVuc2lvbnMubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShkaW1lbnNpb25zLCAwLCBfZGltZW5zaW9ucywgMCwgZGltZW5zaW9ucy5sZW5ndGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgZGltZW5zaW9ucyBiYXNlZCBvbiBTT0FQMTEgcGFyc2VkIGRpbWVuc2lvbiBzdWJzdHJpbmcKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdERpbWVuc2lvbnMoU3RyaW5nIHMsIGludCBmaXJzdGJyYWNlKQotICAgIHsKLSAgICAgICAgTGlzdCBicmFjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGludCBsYXN0YnJhY2UgPSAtMTsKLSAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0YnJhY2U7IGkgPj0gMDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBsYXN0YnJhY2UgPSBzLmluZGV4T2YoJ10nLCBpKTsKLSAgICAgICAgICAgIGlmIChsYXN0YnJhY2UgPCAwKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGJyYWNlcy5hZGQocy5zdWJzdHJpbmcoaSArIDEsIGxhc3RicmFjZSkpOwotICAgICAgICAgICAgaSA9IHMuaW5kZXhPZignWycsIGxhc3RicmFjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdHJhaWxlciA9IHMuc3Vic3RyaW5nKGxhc3RicmFjZSArIDEpOwotICAgICAgICBpZiAoIVhtbFdoaXRlc3BhY2UuaXNBbGxTcGFjZSh0cmFpbGVyKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLQotICAgICAgICAvLyBub3cgZmlsbCBpbiByYW5rIGFycmF5Ci0gICAgICAgIF9yYW5rcyA9IG5ldyBpbnRbYnJhY2VzLnNpemUoKSAtIDFdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9yYW5rcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGNvbW1hcyA9IChTdHJpbmcpYnJhY2VzLmdldChpKTsKLSAgICAgICAgICAgIGludCBjb21tYWNvdW50ID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29tbWFzLmxlbmd0aCgpOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBjaCA9IGNvbW1hcy5jaGFyQXQoaik7Ci0gICAgICAgICAgICAgICAgaWYgKGNoID09ICcsJykKLSAgICAgICAgICAgICAgICAgICAgY29tbWFjb3VudCArPSAxOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFYbWxXaGl0ZXNwYWNlLmlzU3BhY2UoY2gpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfcmFua3NbaV0gPSBjb21tYWNvdW50ICsgMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZpbmFsbHkgZmlsbCBpbiBkaW1lbnNpb24gYXJyYXkKLSAgICAgICAgX2RpbWVuc2lvbnMgPSBpbnRlcm5hbFBhcnNlQ29tbWFJbnRTdHJpbmcoKFN0cmluZylicmFjZXMuZ2V0KGJyYWNlcy5zaXplKCkgLSAxKSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfZGltZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9kaW1lbnNpb25zW2ldIDwgMCkKLSAgICAgICAgICAgICAgICBfaGFzSW5kZXRlcm1pbmF0ZURpbWVuc2lvbnMgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgUU5hbWUgZm9yIHRoZSByZWZlcmVuY2VkIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lIGdldFFOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiByYW5rcyBmb3IgaW5uZXIgbmVzdGVkIGFycmF5cy4KLSAgICAgKiBJbiBTT0FQIDEuMS1hZHZhbmNlZCwgdGhpcyBpcyBhbHdheXMgYW4gYXJyYXkgb2YgbGVuZ3RoIHplcm8uCi0gICAgICogSW4gU09BUCAxLjEsIHRoaXMgYXJyYXkgcmVmbGVjdHMgdGhlIHJhbmtzIG9mIG5lc3RlZAotICAgICAqIGFycmF5cy4gRm9yIGV4YW1wbGUgZm9vOmJhclssXVssLF1bXVs1LDZdIHdpbGwgcHJvZHVjZQotICAgICAqIGEgcmFua3MgcmVzdWx0IG9mIDIsIDMsIDEuCi0gICAgICovCi0gICAgcHVibGljIGludFtdIGdldFJhbmtzKCkKLSAgICB7Ci0gICAgICAgIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbX3JhbmtzLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX3JhbmtzLCAwLCByZXN1bHQsIDAsIHJlc3VsdC5sZW5ndGgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIGRpbWVuc2lvbnMuCi0gICAgICovCi0gICAgcHVibGljIGludFtdIGdldERpbWVuc2lvbnMoKQotICAgIHsKLSAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFtfZGltZW5zaW9ucy5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF9kaW1lbnNpb25zLCAwLCByZXN1bHQsIDAsIHJlc3VsdC5sZW5ndGgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBhcnJheSBjb250YWlucyBuZXN0ZWQgYXJyYXlzLiBFcXVpdmFsZW50Ci0gICAgICogdG8gKGdldFJhbmtzKCkubGVuZ3RoID4gMCkuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNOZXN0ZWRBcnJheXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChfcmFua3MubGVuZ3RoID4gMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGltZW5zaW9ucyBhcyBhIHN0cmluZywgZS5nLiwgWyxdWzIsMyw0XQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc29hcDExRGltZW5zaW9uU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzb2FwMTFEaW1lbnNpb25TdHJpbmcoX2RpbWVuc2lvbnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIGFuIGFjdHVhbCBzZXQgb2YgZGltZW5zaW9ucyB0aGF0IG1heSBkaWZmZXIgZnJvbQotICAgICAqIHRoZSBkZWZhdWx0IHRoYXQgaXMgc3RvcmVkLCBvdXRwdXRzIHRoZSBzb2FwIGFycmF5VHlwZQotICAgICAqIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHNvYXAxMURpbWVuc2lvblN0cmluZyhpbnRbXSBhY3R1YWxEaW1lbnNpb25zKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9yYW5rcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCdbJyk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8IF9yYW5rc1tpXTsgaisrKQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCddJyk7Ci0gICAgICAgIH0KLQotICAgICAgICBzYi5hcHBlbmQoJ1snKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY3R1YWxEaW1lbnNpb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcsJyk7Ci0gICAgICAgICAgICBpZiAoYWN0dWFsRGltZW5zaW9uc1tpXSA+PSAwKQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChhY3R1YWxEaW1lbnNpb25zW2ldKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQoJ10nKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTT0FQQXJyYXlUeXBlKCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU09BUCAxLjIKLSAgICAgKiBDb25zdHJ1Y3RzIGEgU09BUEFycmF5VHlwZSBmcm9tIHNvYXAtZW5jOml0ZW1UeXBlIGFuZAotICAgICAqIHNvYXAtZW5jOmFycmF5U2l6ZSBhdHRyaWJ1dGVzCi0gICAgICogQHBhcmFtIGl0ZW1UeXBlIHRoZSBpdGVtIHR5cGUgUU5hbWUKLSAgICAgKiBAcGFyYW0gYXJyYXlTaXplIGEgc3RyaW5nIHdpdGggZGltZW50aW9ucyBsaWtlOiAqIDMgNAotICAgICAqIEByZXR1cm4gYSBTT0FQQXJyYXlUeXBlIHRvIHJlcHJlc2VudCB0aGlzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTT0FQQXJyYXlUeXBlIG5ld1NvYXAxMkFycmF5KFFOYW1lIGl0ZW1UeXBlLCBTdHJpbmcgYXJyYXlTaXplKQotICAgIHsKLSAgICAgICAgaW50IFtdIHJhbmtzID0gRU1QVFlfSU5UX0FSUkFZOwotICAgICAgICBhcnJheVNpemUgPSBYbWxXaGl0ZXNwYWNlLmNvbGxhcHNlKGFycmF5U2l6ZSwgWG1sV2hpdGVzcGFjZS5XU19DT0xMQVBTRSk7Ci0gICAgICAgIFN0cmluZ1tdIGRpbVN0cmluZ3MgPSBhcnJheVNpemUuc3BsaXQoIiAiKTsKLSAgICAgICAgaW50W10gZGltZW5zaW9ucyA9IG5ldyBpbnRbZGltU3RyaW5ncy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpbVN0cmluZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBkaW1TdHJpbmcgPSBkaW1TdHJpbmdzW2ldOwotICAgICAgICAgICAgaWYgKGk9PTAgJiYgZGltU3RyaW5nLmVxdWFscygiKiIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRpbWVuc2lvbnNbaV0gPSAtMTsKLSAgICAgICAgICAgICAgICAvLyBfaGFzSW5kZXRlcm1pbmF0ZURpbWVuc2lvbnMgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uc1tpXSA9IEludGVnZXIucGFyc2VJbnQoZGltU3RyaW5nc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU09BUEFycmF5VHlwZSBzb3QgPSBuZXcgU09BUEFycmF5VHlwZSgpOwotICAgICAgICBzb3QuX3JhbmtzID0gcmFua3M7Ci0gICAgICAgIHNvdC5fdHlwZSA9IGl0ZW1UeXBlOwotICAgICAgICBzb3QuX2RpbWVuc2lvbnMgPSBkaW1lbnNpb25zOwotICAgICAgICByZXR1cm4gc290OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNPQVAgMS4yCi0gICAgICogR2l2ZW4gYW4gYWN0dWFsIHNldCBvZiBkaW1lbnNpb25zIHRoYXQgbWF5IGRpZmZlciBmcm9tCi0gICAgICogdGhlIGRlZmF1bHQgdGhhdCBpcyBzdG9yZWQsIG91dHB1dHMgdGhlIHNvYXAgYXJyYXlTaXplCi0gICAgICogc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc29hcDEyRGltZW5zaW9uU3RyaW5nKGludFtdIGFjdHVhbERpbWVuc2lvbnMpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY3R1YWxEaW1lbnNpb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICBpZiAoYWN0dWFsRGltZW5zaW9uc1tpXSA+PSAwKQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChhY3R1YWxEaW1lbnNpb25zW2ldKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgU09BUEFycmF5VHlwZSByZWZsZWN0aW5nIHRoZSBkaW1lbnNpb25zCi0gICAgICogb2YgdGhlIG5leHQgbmVzdGVkIGFycmF5LgotICAgICAqLwotICAgIHB1YmxpYyBTT0FQQXJyYXlUeXBlIG5lc3RlZEFycmF5VHlwZSgpCi0gICAgewotICAgICAgICBpZiAoIWNvbnRhaW5zTmVzdGVkQXJyYXlzKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgU09BUEFycmF5VHlwZSByZXN1bHQgPSBuZXcgU09BUEFycmF5VHlwZSgpOwotCi0gICAgICAgIHJlc3VsdC5fdHlwZSA9IF90eXBlOwotCi0gICAgICAgIHJlc3VsdC5fcmFua3MgPSBuZXcgaW50W19yYW5rcy5sZW5ndGggLSAxXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShfcmFua3MsIDAsIHJlc3VsdC5fcmFua3MsIDAsIHJlc3VsdC5fcmFua3MubGVuZ3RoKTsKLQotICAgICAgICByZXN1bHQuX2RpbWVuc2lvbnMgPSBuZXcgaW50W19yYW5rc1tfcmFua3MubGVuZ3RoIC0gMV1dOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5fZGltZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHJlc3VsdC5fZGltZW5zaW9uc1tpXSA9IC0xOwotCi0gICAgICAgIC8vIHJlc3VsdC5faGFzSW5kZXRlcm1pbmF0ZURpbWVuc2lvbnMgPSAocmVzdWx0Ll9kaW1lbnNpb25zLmxlbmd0aCA+IDApOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKF90eXBlLmhhc2hDb2RlKCkgKyBfZGltZW5zaW9ucy5sZW5ndGggKyBfcmFua3MubGVuZ3RoICsgKF9kaW1lbnNpb25zLmxlbmd0aCA9PSAwID8gMCA6IF9kaW1lbnNpb25zWzBdKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopCi0gICAgewotICAgICAgICBpZiAob2JqID09IHRoaXMpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBpZiAoIW9iai5nZXRDbGFzcygpLmVxdWFscyhnZXRDbGFzcygpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBTT0FQQXJyYXlUeXBlIHNhdCA9IChTT0FQQXJyYXlUeXBlKW9iajsKLQotICAgICAgICBpZiAoIV90eXBlLmVxdWFscyhzYXQuX3R5cGUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmIChfcmFua3MubGVuZ3RoICE9IHNhdC5fcmFua3MubGVuZ3RoKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmIChfZGltZW5zaW9ucy5sZW5ndGggIT0gc2F0Ll9kaW1lbnNpb25zLmxlbmd0aCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9yYW5rcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIGlmIChfcmFua3NbaV0gIT0gc2F0Ll9yYW5rc1tpXSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfZGltZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIGlmIChfZGltZW5zaW9uc1tpXSAhPSBzYXQuX2RpbWVuc2lvbnNbaV0pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL3NvYXAvU2NoZW1hV1NETEFycmF5VHlwZS5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvc29hcC9TY2hlbWFXU0RMQXJyYXlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWE3NjkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvc29hcC9TY2hlbWFXU0RMQXJyYXlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuc29hcDsKLQotLyoqCi0gKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgc2NoZW1hIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzCi0gKiBjYW4gYmUgY29lcmNlZCB0byB0aGlzIGludGVyZmFjZSBpbiBvcmRlciB0byByZXRyaWV2ZSB0aGUgdmFsdWUKLSAqIG9mIHRoZSB3c2RsOmFycmF5VHlwZSBhdHRyaWJ1dGVzIG9uIGF0dHJpYnV0ZXMgYW5kIGVsZW1lbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYVdTRExBcnJheVR5cGUKLXsKLSAgICBTT0FQQXJyYXlUeXBlIGdldFdTRExBcnJheVR5cGUoKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9OYW1lc3BhY2VNYW5hZ2VyLmphdmEgYi92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvTmFtZXNwYWNlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzQ2Njc5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9OYW1lc3BhY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlByZWZpeFJlc29sdmVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVzcGFjZU1hbmFnZXIgZXh0ZW5kcyBQcmVmaXhSZXNvbHZlcgotewotICAgIC8qKgotICAgICAqIENhbGVkIHdoZW4gdGhlIHVzZXIgbmVlZHMgYSBwcmVmaXggYnkgd2hpY2ggdG8gcmVmZXJlbmNlIGEgZ2l2ZW4KLSAgICAgKiBYbWwgbmFtZXNwYWNlLiBBIHN1Z2dlc3RlZCBwcmVmaXggaXMgcGFzc2VkLCB3aGljaCBtYXkgYmUgbnVsbDsKLSAgICAgKiB0aGUgc3VnZ2VzdGlvbiBtYXkgYmUgaWdub3JlZC4KLSAgICAgKi8KLSAgICAKLSAgICBTdHJpbmcgZmluZF9wcmVmaXhfZm9yX25zdXJpICggU3RyaW5nIG5zdXJpLCBTdHJpbmcgc3VnZ2VzdGVkX3ByZWZpeCApOwotfQotICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZS5qYXZhIGIvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzE3M2MxLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRvckxpc3RlbmVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGVTdG9yZSBleHRlbmRzIE5hbWVzcGFjZU1hbmFnZXIKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGN1cnNvciBwb3NpdGlvbmVkIGp1c3QgYmVmb3JlIHRoZSBwYXJ0IG9mIHRoZSB0cmVlCi0gICAgICogd2hlcmUgdGhpcyBUeXBlU3RvcmUgaXMgbG9jYXRlZC4KLSAgICAgKi8KLSAgICBYbWxDdXJzb3IgbmV3X2N1cnNvcigpOwotCi0gICAgLyoqCi0gICAgICovCi0gICAgdm9pZCB2YWxpZGF0ZSAoIFZhbGlkYXRvckxpc3RlbmVyIHZFdmVudFNpbmsgKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgU2NoZW1hVHlwZUxvYWRlciBhc3NvY2lhdGVkIHdpdGggdGhlIHN0b3JlIGNvbnRpYW5pbmcgdGhpcwotICAgICAqIFR5cGVTdG9yZS4KLSAgICAgKi8KLSAgICBTY2hlbWFUeXBlTG9hZGVyIGdldF9zY2hlbWF0eXBlbG9hZGVyICggKTsKLQotICAgIC8qKgotICAgICAqIENoYW5nZSB0aGUgdHlwZSBvZiB0aGlzIHN0b3JlIChwZXJoYXBzIGJ5IGFwcGx5aW5nIHhzaTp0eXBlKSBhbmQKLSAgICAgKiByZXR1cm4gdGhlIG5ldyBUeXBlU3RvcmVVc2VyIChvciBvbGQgb25lIGlmIHRoZSBuZXcgdHlwZSBpcyBub3QKLSAgICAgKiBkaWZmZXJlbnQpLgotICAgICAqLwotICAgIFR5cGVTdG9yZVVzZXIgY2hhbmdlX3R5cGUgKCBTY2hlbWFUeXBlIHNUeXBlICk7Ci0KLSAgICAvKioKLSAgICAgKiBUZWxscyBpZiB0aGlzIHN0b3JlIGlzIGFuIGF0dHJpYnV0ZSBvciBub3QKLSAgICAgKi8KLSAgICBib29sZWFuIGlzX2F0dHJpYnV0ZSAoICk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHhzaTp0eXBlLiAgUmV0dXJuIG51bGwgaWYgbm9uZSBvciB0aGlzIGlzIGFuIGF0dHJpYnV0ZQotICAgICAqIHN0b3JlLgotICAgICAqLwotICAgIFFOYW1lIGdldF94c2lfdHlwZSAoICk7Ci0KLSAgICAvKioKLSAgICAgKiBBIHVzZXIgb2YgYSBUeXBlU3RvcmUgY2FsbHMgaW52YWxpZGF0ZV90ZXh0IHdoZW4gdGhlIHVuZGVybHlpbmcKLSAgICAgKiB2YWx1ZSBoYXMgY2hhbmdlZCBhbmQgaGUgd2FudHMgdGhlIHRleHRzdG9yZSB0byBjYWxsIGhpbSBiYWNrIHdpdGgKLSAgICAgKiBhIGZldGNoX3RleHQgKFR5cGVTdG9yZS9UeXBlU3RvcmVVc2VycyB3b3JrIGluIHBhaXJzKS4KLSAgICAgKi8KLSAgICB2b2lkIGludmFsaWRhdGVfdGV4dCgpOwotCi0gICAgLyoqCi0gICAgICogQSB1c2VyIG9mIGEgVHlwZVN0b3JlIGNhbGxzIGZldGNoX3RleHQgd2hlbiBoZSBrbm93cyBoaXMgdmlldwotICAgICAqIG9mIHRoZSB0ZXh0IGlzIGludmFsaWQgYW5kIGhlIHdhbnRzIHRvIHNlZSB3aGF0IHRoZSBhY3R1YWwgdGV4dAotICAgICAqIHZhbHVlIGlzLgotICAgICAqLwotICAgIC8vIEJVR0JVRyAoZXJpY3ZhcykgMTIxMTEKLSAgICBTdHJpbmcgZmV0Y2hfdGV4dChpbnQgd2hpdGVzcGFjZVJ1bGUpOwotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgV1NfVU5TUEVDSUZJRUQgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgaW50IFdTX1BSRVNFUlZFID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGludCBXU19SRVBMQUNFID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGludCBXU19DT0xMQVBTRSA9IDM7Ci0KLSAgICAvKioKLSAgICAgKiBBIHVzZXIgb2YgYSBUeXBlU3RvcmUgY2FsbHMgc3RvcmVfdGV4dCB3aGVuIGhlIHdhbnRzIHRoZSBUeXBlU3RvcmUKLSAgICAgKiB0byByZW1lbWJlciB0aGUgZ2l2ZW4gdGV4dCBpbW1lZGlhdGVseS4gVGhpcyB0eXBpY2FsbHkgaGFwcGVucyB3aGVuCi0gICAgICogdGhlIHVzZXIgaGFzIGEgbm9uY2Fub25pY2FsIChidXQgdmFsaWQpIHN0cmluZyByZXByZXNlbnRhdGlvbiB0byBzYXZlLAotICAgICAqIGJ1dCBkb2Vzbid0IGhhdmUgdGhlIHN0b3JhZ2UgaW4gd2hpY2ggdG8gc2F2ZSBpdC4KLSAgICAgKi8KLSAgICB2b2lkIHN0b3JlX3RleHQoU3RyaW5nIHRleHQpOwotCi0gICAgLyoqCi0gICAgICogSGVyZSB0aGUgVHlwZVN0b3JlIGlzIHJlc3BvbnNpYmxlIGZvciBsb2NhdGluZyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiBUaGlzIGlzIGRvbmUgYXMgZm9sbG93cwotICAgICAqICgxKSBnbyB0byB0aGUgcGFyZW50IFR5cGVTdG9yZVVzZXIKLSAgICAgKiAoMikgYXNrIGl0IHRvIGdldF9kZWZhdWx0X2VsZW1lbnRfdGV4dChxbmFtZSkgKG9yIF9hdHRyaWJ1dGVfKSwgYW5kIHJldHVybiBpdCBpZiBub3QgbnVsbC4KLSAgICAgKiAoMikgb3RoZXJ3aXNlLCBncmFiIGEgbmV3IFR5cGVTdG9yZVVzZXJWaXNpdG9yIHZpYSB2ID0gcGFyZW50dXNlci5uZXdfdmlzaXRvcigpOwotICAgICAqICgzKSBjYWxsIHYudmlzaXQobmFtZSkgb24gX2V2ZXJ5XyBlbGVtZW50IHFuYW1lIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhpcyBvbmUgaW4gb3JkZXIKLSAgICAgKiAoNCkgcmV0dXJuIHRoZSByZXN1bHQgb2Ygdi5nZXRfZGVmYXVsdF90ZXh0KCkuCi0gICAgICovCi0gICAgU3RyaW5nIGNvbXB1dGVfZGVmYXVsdF90ZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBIZXJlIHRoZSBUeXBlU3RvcmUgaXMgcmVzcG9uc2libGUgZm9yIGZpZ3VyaW5nIGlmIHRoaXMgdmFsdWUgaXMKLSAgICAgKiBuaWxsYWJsZSBhbmQvb3IgZml4ZWQuIFRoaXMgaXMgZG9uZSBieQotICAgICAqICgxKSBnbyB0byB0aGUgcGFyZW50IFR5cGVTdG9yZVVzZXIKLSAgICAgKiAoMikgYXNrIGl0IHRvIGdldF9lbGVtZW50ZmxhZ3MocW5hbWUpLCBhbmQgcmV0dXJuIGl0IGlmIG5vdCAtMS4KLSAgICAgKiAoMikgb3RoZXJ3aXNlLCBncmFiIGEgbmV3IFR5cGVTdG9yZVVzZXJWaXNpdG9yIHZpYSB2ID0gcGFyZW50dXNlci5uZXdfdmlzaXRvcigpOwotICAgICAqICgzKSBjYWxsIHYudmlzaXQobmFtZSkgb24gX2V2ZXJ5XyBlbGVtZW50IHFuYW1lIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhpcyBvbmUgaW4gb3JkZXIKLSAgICAgKiAoNCkgcmV0dXJuIHRoZSByZXN1bHQgb2Ygdi5nZXRfZWxlbWVudGZsYWdzKCkuCi0gICAgICovCi0gICAgaW50IGNvbXB1dGVfZmxhZ3MoKTsKLQotCi0gICAgLyoqCi0gICAgICogVGVsbHMgaWYgdGhpcyBzdG9yZSB3YXMgY3JlYXRlZCB3aXRoIHRoaXMgb3B0aW9uIHdoaWNoIHRlbGxzIHRoZSBzdHJvbmdseSB0eXBlZAotICAgICAqIG9iamVjdHMgdG8gcGVyZm9ybSBsZXhpY2FsIGFuZCB2YWx1ZSB2YWxpZGF0aW9uIGFmdGVyIGEgc2V0dGVyIGlzIGNhbGxlZC4KLSAgICAgKi8KLSAgICBib29sZWFuIHZhbGlkYXRlX29uX3NldCgpOwotCi0gICAgLyoqCi0gICAgICogSGVyZSB0aGUgdHlwZXN0b3JlIGlzIHJlc3Bvc2libGUgZm9yIGZpbmRpbmcgdGhlIHNjaGVtYSBmaWVsZCBmb3IKLSAgICAgKiB0aGlzIG9iamVjdC4gVGhpcyBpcyBkb25lIGJ5Ci0gICAgICogKDEpIG90aGVyd2lzZSwgZ3JhYiBhIG5ldyBUeXBlU3RvcmVVc2VyVmlzaXRvciB2aWEgdiA9IHBhcmVudHVzZXIubmV3X3Zpc2l0b3IoKTsKLSAgICAgKiAoMikgY2FsbCB2LnZpc2l0KG5hbWUpIG9uIF9ldmVyeV8gZWxlbWVudCBxbmFtZSB1cCB0byBhbmQgaW5jbHVkaW5nIHRoaXMgb25lIGluIG9yZGVyCi0gICAgICogKDMpIHJldHVybiB0aGUgcmVzdWx0IG9mIHYuZ2V0X3NjaGVtYV9maWVsZCgpLgotICAgICAqLwotICAgIFNjaGVtYUZpZWxkIGdldF9zY2hlbWFfZmllbGQoKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5JTExBQkxFID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIQVNERUZBVUxUID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSVhFRCA9IDQ7IC8vIGFsd2F5cyBzZXQgd2l0aCBIQVNERUZBVUxUCi0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdmFsdWUgaGFzIGJlZW4gbmlsbGVkIG9yIHVubmlsbGVkLCBzbyB0aGUgdGV4dHN0b3JlCi0gICAgICoga25vd3MgaXQgbmVlZHMgdG8gdXBkYXRlIHRoZSB4c2k6bmlsIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICB2b2lkIGludmFsaWRhdGVfbmlsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgVHlwZVN0b3JlIGlzIHJlcG9uc2libGUgZm9yIGRpc2NvdmVyaW5nIGlmIHRoaXMgdmFsdWUgaXMgbmlsLgotICAgICAqIFRoaXMgaXMgZG9uZSBieSAoMSkgZ29pbmcgdG8gdGhlIGVsZW1lbnQgYW5kICgyKSBmaW5kaW5nIHRoZQotICAgICAqIHhzaTpuaWwgYXR0cmlidXRlIGlmIHByZXNlbnQgYW5kICgzKSByZXR1cm4gdHJ1ZSBpZiB0aGUgY29sbGFwc2VkCi0gICAgICogdGV4dHVhbCB2YWx1ZSBpcyBlaXRoZXIgZXhhY3RseSB0aGUgc3RyaW5nICJ0cnVlIiBvciAiMSIuCi0gICAgICovCi0gICAgYm9vbGVhbiBmaW5kX25pbCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY291bnQgb2YgZWxlbWVudHMgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvd25lZCBieSB0aGlzCi0gICAgICogdGV4dHN0b3JlLgotICAgICAqLwotICAgIGludCBjb3VudF9lbGVtZW50cyhRTmFtZSBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvdW50IG9mIGVsZW1lbnRzIHRoYXQgbWF0Y2ggb2YgdGhlIG5hbWVzLgotICAgICAqLwotICAgIGludCBjb3VudF9lbGVtZW50cyhRTmFtZVNldCBuYW1lcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBUeXBlU3RvcmVVc2VyIHVuZGVybmVhdGggdGhlIGl0aCBlbGVtZW50IHdpdGggdGhlIGdpdmVuCi0gICAgICogbmFtZSBvd25lZCBieSB0aGlzIHRleHRzdG9yZSwgb3IgbnVsbCBpZiBub25lIHdhcyBmb3VuZC4KLSAgICAgKgotICAgICAqIERvIG5vdCB0aHJvdyBhbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGkgaXMgYmFkIC0KLSAgICAgKiByZXR1cm4gbnVsbCBpbnN0ZWFkLiBUaGUgcmVhc29uIGlzIHRvIGFsbG93IHVzIHRvIGZhaWwKLSAgICAgKiBhbmQgdGhlbiBmb2xsb3cgd2l0aCBhbiBhZGRfZWxlbWVudF9ldGMgaWYgd2UgY2hvb3NlIHRvLAotICAgICAqIHdpdGhvdXQgcmFuZG9tbHkgY2F0Y2hpbmcgZXhjZXB0aW9ucy4KLSAgICAgKi8KLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2VsZW1lbnQKLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2VsZW1lbnQKLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2VsZW1lbnQKLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2VsZW1lbnQKLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2VsZW1lbnQKLSAgICBUeXBlU3RvcmVVc2VyIGZpbmRfZWxlbWVudF91c2VyKFFOYW1lIG5hbWUsIGludCBpKTsKLQotICAgIC8qKgotICAgICAqIExpa2UgZmluZF9lbGVtZW50X3VzZXIgYnV0IGFjY2VwdHMgYSBzZXQgb2YgbmFtZXMgdG8gc2VhcmNoIGZvci4KLSAgICAgKi8KLSAgICBUeXBlU3RvcmVVc2VyIGZpbmRfZWxlbWVudF91c2VyKFFOYW1lU2V0IG5hbWVzLCBpbnQgaSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCB0aGUgVHlwZVN0b3JlVXNlcnMgY29ycmVzcG9uZGluZyB0byBlbGVtZW50cyB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUgb3duZWQgYnkgdGhpcyB0eXBlc3RvcmUsIG9yIHRoZSBlbXB0eSBhcnJheSBvZgotICAgICAqIFR5cGVTdG9yZVVzZXJzIGlmIG5vbmUgd2FzIGZvdW5kLgotICAgICAqLwotLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGZpbmRfYWxsX2VsZW1lbnQKLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2FsbF9lbGVtZW50Ci0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9hbGxfZWxlbWVudAotLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGZpbmRfYWxsX2VsZW1lbnQKLSAgICB2b2lkIGZpbmRfYWxsX2VsZW1lbnRfdXNlcnMoUU5hbWUgbmFtZSwgTGlzdCBmaWxsTWVVcCk7Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIFR5cGVTdG9yZVVzZXJzIGNvcnJlc3BvbmRpbmcgdG8gZWxlbWVudHMgd2l0aCBvbmUKLSAgICAgKiBvZiB0aGUgbmFtZXMgaXMgdGhlIFFOYW1lU2V0LgotICAgICAqLwotICAgIHZvaWQgZmluZF9hbGxfZWxlbWVudF91c2VycyhRTmFtZVNldCBuYW1lLCBMaXN0IGZpbGxNZVVwKTsKLQotICAgIC8qKgotICAgICAqIEluc2VydHMgYSBuZXcgZWxlbWVudCBhdCB0aGUgcG9zaXRpb24gdGhhdCB3aWxsIG1ha2UgaXQKLSAgICAgKiB0aGUgaXRoIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvd25lZCBieSB0aGlzIHRleHRzdG9yZSwKLSAgICAgKiBhbmQgcmV0dXJucyBhIFR5cGVTdG9yZVVzZXIgZm9yIHRoYXQgZWxlbWVudC4KLSAgICAgKgotICAgICAqIE5vdGUgdGhhdCBpZiB0aGVyZSBhcmUgbm8gZXhpc3RpbmcgZWxlbWVudHMgb2YgdGhlIGdpdmVuCi0gICAgICogbmFtZSwgeW91IG1heSBuZWVkIHRvIGNhbGwgYmFjayB0byBkaXNjb3ZlciB0aGUgcHJvcGVyCi0gICAgICogb3JkZXJpbmcgdG8gdXNlIHRvIGluc2VydCB0aGUgZmlyc3Qgb25lLiBPdGhlcndpc2UsCi0gICAgICogaXQgc2hvdWxkIGJlIGluc2VydGVkIGFkamFjZW50IHRvIGV4aXN0aW5nIGVsZW1lbnRzIHdpdGgKLSAgICAgKiB0aGUgc2FtZSBuYW1lLgotICAgICAqCi0gICAgICogU2hvdWxkIHRocm93IGFuIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgaSA8IDAKLSAgICAgKiBvciBpZiBpID4gIyBvZiBlbHRzCi0gICAgICovCi0KLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbnNlcnRfZWxlbWVudAotLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGluc2VydF9lbGVtZW50Ci0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgaW5zZXJ0X2VsZW1lbnQKLSAgICBUeXBlU3RvcmVVc2VyIGluc2VydF9lbGVtZW50X3VzZXIoUU5hbWUgbmFtZSwgaW50IGkpOwotCi0gICAgLyoqCi0gICAgICogTGlrZSB0aGUgYWJvdmUgbWV0aG9kLCBleGNlcHQgdGhhdCBpdCBpbnNlcnRzIGFuIGVsZW1lbnQgbmFtZWQKLSAgICAgKiBuYW1lLCBhZnRlciB0aGUgaXRoIG1lbWJlciBvZiBzZXQuCi0gICAgICovCi0gICAgVHlwZVN0b3JlVXNlciBpbnNlcnRfZWxlbWVudF91c2VyKFFOYW1lU2V0IHNldCwgUU5hbWUgbmFtZSwgaW50IGkpOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldyBlbGVtZW50IGF0IHRoZSBsYXN0IHBvc2l0aW9uIGFkamFjZW50IHRvIGV4aXN0aW5nCi0gICAgICogZWxlbWVudHMgb2YgdGhlIHNhbWUgbmFtZS4KLSAgICAgKgotICAgICAqIE5vdGUgdGhhdCBpZiB0aGVyZSBhcmUgbm8gZXhpc3RpbmcgZWxlbWVudHMgb2YgdGhlIGdpdmVuCi0gICAgICogbmFtZSwgdGhlIHNhbWUgY29tbWVudCBhcHBsaWVzIGFzIHdpdGggaW5zZXJ0X2VsZW1lbnRfdXNlci4KLSAgICAgKi8KLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZGRfZWxlbWVudAotLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGFkZF9lbGVtZW50Ci0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgYWRkX2VsZW1lbnQKLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZGRfZWxlbWVudAotICAgIFR5cGVTdG9yZVVzZXIgYWRkX2VsZW1lbnRfdXNlcihRTmFtZSBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGl0aCBlbGVtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICoKLSAgICAgKiBTaG91bGQgdGhyb3cgYW4gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBpIDwgMAotICAgICAqIG9yIGlmIGkgPiAjIG9mIGVsdHMtMS4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZV9lbGVtZW50KFFOYW1lIG5hbWUsIGludCBpKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGl0aCBlbGVtZW50IHRoYXQgbWF0Y2hlcyBuYW1lcy4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZV9lbGVtZW50KFFOYW1lU2V0IG5hbWVzLCBpbnQgaSk7Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFR5cGVTdG9yZVVzZXIgdW5kZXJuZWF0aCB0aGUgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuCi0gICAgICogbmFtZSwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIGF0dHJpYnV0ZS4KLSAgICAgKi8KLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2F0dHJpYnV0ZQotLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGZpbmRfYXR0cmlidXRlCi0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9hdHRyaWJ1dGUKLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2F0dHJpYnV0ZQotICAgIFR5cGVTdG9yZVVzZXIgZmluZF9hdHRyaWJ1dGVfdXNlcihRTmFtZSBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHJldHVybnMgYSBUeXBlU3RvcmVVc2VyCi0gICAgICogdW5kZXJuZWF0aCBpdC4gU2hvdWxkIHRocm93IGFuIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlcmUKLSAgICAgKiBpcyBhbHJlYWR5IGFuIGV4aXN0aW5nIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqLwotLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGFkZF9hdHRyaWJ1dGUKLS8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZGRfYXR0cmlidXRlCi0vLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgYWRkX2F0dHJpYnV0ZQotLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGFkZF9hdHRyaWJ1dGUKLSAgICBUeXBlU3RvcmVVc2VyIGFkZF9hdHRyaWJ1dGVfdXNlcihRTmFtZSBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlX2F0dHJpYnV0ZShRTmFtZSBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIFR5cGVTdG9yZSAoaW5jbHVkaW5nIGF0dHJpYnV0ZXMsCi0gICAgICogZWxlbWVudHMsIGFuZCBtaXhlZCBjb250ZW50KSwgdG8gdGhlIHRhcmdldCB0eXBlIHN0b3JlLgotICAgICAqCi0gICAgICogU1BFQ0lBTCBOT1RFOiBUaGUgeHNpOnR5cGUgYXR0cmlidXRlIHNob3VsZCBub3QgYmUgcmVtb3ZlZCBmcm9tCi0gICAgICogdGhlIHRhcmdldCBvciBjb3BpZWQgZnJvbSB0aGUgc29ydWNlLCBhbmQgdGhlIFR5cGVTdG9yZVVzZXIgYXR0YWNoZWQKLSAgICAgKiB0byB0aGlzIFR5cGVTdG9yZSBzaG91bGQgbm90IGJlIGRpc2Nvbm5lY3RlZC4KLSAgICAgKgotICAgICAqIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyBvYmouc2V0KGZvbykuCi0gICAgICovCi0gICAgVHlwZVN0b3JlVXNlciBjb3B5X2NvbnRlbnRzX2Zyb20oVHlwZVN0b3JlIHNvdXJjZSk7Ci0gICAgCi0vLyBCVUdCVUcgLSBOZWVkIHRvIHVzZSB0aGlzIGluIHRoZSBmdXR1cmUKLS8vICAgIC8qKgotLy8gICAgICogQ29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gVHlwZVN0b3JlIChpbmNsdWRpbmcgYXR0cmlidXRlcywKLS8vICAgICAqIGVsZW1ldHMsIG1peGVkIGNvbnRlbnQpLCB0byB0aGUgY2hpbGQgZWxlbWVudCBnaXZlbiBieSB0aGUgZ2l2ZW4KLS8vICAgICAqIG5hbWUgYW5kIGluZGV4LiBBbnkgVHlwZVN0b3JlVXNlciB0aGF0IG1pZ2h0IGJlIGN1cnJlbnRseSBhdHRhY2hlZAotLy8gICAgICogdG8gdGhhdCBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZC4gIFRoZSB4c2k6dHlwZSBhdHRyaWJ1dGUgb2YgdGhlCi0vLyAgICAgKiBlbGVtZW50IHNob3VsZCBiZSBzZXQgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBRTmFtZSAob3IgZGVsZXRlZCBpZgotLy8gICAgICogdGhlIHhzaXR5cGUgYXJndW1lbnQgaXMgbnVsbCkKLS8vICAgICAqLwotLy8gICAgdm9pZCBjb3B5X3RvX2VsZW1lbnQoCi0vLyAgICAgICAgVHlwZVN0b3JlIHNvdXJjZSwgUU5hbWUgeHNpdHlwZSwgUU5hbWUgbmFtZSwgaW50IGkpOwotCi0gICAgLyoqCi0gICAgICogQ29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gYXJyYXkgb2YgWG1sT2JqZWN0IChpbmNsdWRpbmcKLSAgICAgKiBhdHRyaWJ1dGVzLCBlbGVtZW50cywgbWl4ZWQgY29udGVudCksIG92ZXIgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUKLSAgICAgKiBnaXZlbiBuYW1lIHVuZGVyIHRoZSBjdXJyZW50IHR5cGVzdG9yZS4KLSAgICAgKgotICAgICAqIFRoZSBsZW5ndGhzIG9mIHRoZSB0d28gYXJyYXlzIHRoYXQgYXJlIHBhc3NlZCBzaG91bGQgYmUgdGhlIHNhbWUuCi0gICAgICoKLSAgICAgKiBJZiB0aGVyZSBhcmUgbiBjdXJyZW50IGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBuYW1lIGFuZCBtIGVsZW1lbnRzCi0gICAgICogaW4gdGhlIHNvdXJjZSBhcnJheSwgdGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgZm9yIGluZGl2aWR1YWwgZWxlbWVudHM6Ci0gICAgICoKLSAgICAgKiAxLiBJZiBpIDwgbiBhbmQgaSA8IG0sIHRoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBpdGggc291cmNlIGFyZSBjb3BpZWQKLSAgICAgKiAgICB1bmRlcm5lYXRoIHRoZSBpdGggZWxlbWVudDsgdGhlIGl0aCBlbGVtZW50IGlzIG5vdCBtb3ZlZCwgYnV0IGl0cwotICAgICAqICAgIFR5cGVTdG9yZVVzZXIgaXMgZGlzY29ubmVjdGVkLgotICAgICAqIDIuIGlmIGkgPj0gbiBhbmQgaSA8IG0sIHRoZW4gZmlyc3QgZW5vdWdoIG5ldyBlbGVtZW50cyBhcmUgYXBwZW5kZWQKLSAgICAgKiAgICBzbyB0aGF0IHRoZXJlIGlzIGFuIGVsZW1lbnQgd2l0aCB0aGUgbmFtZSBpLCB0aGVuIHJ1bGUgIzEgaXMgZm9sbG93ZWQuCi0gICAgICogMy4gaWYgaSA+PSBtIGFuZCBpIDwgbiwgdGhlbiB0aGUgZWxlbWVudCAjaSBhbmQgYWxsIGl0cyBjb250ZW50cwotICAgICAqICAgIGFyZSByZW1vdmVkLgotICAgICAqLwotICAgIAotICAgIHZvaWQgYXJyYXlfc2V0dGVyICggWG1sT2JqZWN0W10gc291cmNlcywgUU5hbWUgZWxlbWVudE5hbWUgKTsKLQotICAgIC8qKgotICAgICAqIFZpc2l0cyBhbGwgdGhlIGVsZW1lbnRzIGltbWVkaWF0ZWx5LCB1c2luZyB0aGUgZ2l2ZW4gdmlzaXRvci4KLSAgICAgKiBBIFR5cGVTdG9yZVVzZXIgY2FsbHMgdGhpcyB3aGVuIHNvbWVib2R5IGhhcyByZXF1ZXN0ZWQgdmFsaWRhdGlvbi4KLSAgICAgKi8KLSAgICB2b2lkIHZpc2l0X2VsZW1lbnRzKFR5cGVTdG9yZVZpc2l0b3IgdmlzaXRvcik7Ci0KLSAgICBYbWxPYmplY3RbXSBleGVjX3F1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgdGhyb3dzIFhtbEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1vbml0b3Igb2JqZWN0LCB1c2VkIGZvciBzeW5jaHJvbml6aW5nIGFjY2VzcyB0byB0aGUgZG9jLgotICAgICAqLyAKLSAgICBPYmplY3QgZ2V0X3Jvb3Rfb2JqZWN0KCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvVHlwZVN0b3JlRmFjdG9yeS5qYXZhIGIvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNkYWQ4NS4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvVHlwZVN0b3JlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogVGhpcyBnaXZlcyB0aGUgbm9uIGRlZmF1bHQgYmluZGluZ3MgdG8gdGFrZSBjb250cm9sIG9mIFR5cGVTdG9yZVVzZXIKLSAqIGNyZWF0aW9uLiBJdCBpcyBzZXQgb25jZSBwZXIgZG9jdW1lbnQgYW5kIGNhbGxlZCBlYWNoIHRpbWUgaW5zdGVhZCBvZgotICogVHlwZVN0b3JlVXNlci5jcmVhdGVFbGVtZW50VXNlcigpIGFuZCBjcmVhdGVBdHRyaWJ1dGVVc2VyKCkKLSAqLwotcHVibGljIGludGVyZmFjZSBUeXBlU3RvcmVGYWN0b3J5Ci17Ci0gICAgLyoqIEEga2V5IHRvIHBhc3MgaW4gZm9yIHRoZSBYbWxPcHRpb25zIHRvIHNldCB0aGUgZmFjdG9yeSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9ICJUeXBlU3RvcmVGYWN0b3J5IjsKLQotICAgIFR5cGVTdG9yZVVzZXIgY3JlYXRlRWxlbWVudFVzZXIoU2NoZW1hVHlwZSBwYXJlbnRUeXBlLCBRTmFtZSBuYW1lLCBRTmFtZSB4c2lUeXBlKTsKLQotICAgIFR5cGVTdG9yZVVzZXIgY3JlYXRlQXR0cmlidXRlVXNlcihTY2hlbWFUeXBlIHBhcmVudFR5cGUsIFFOYW1lIG5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZVVzZXIuamF2YSBiL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmVVc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZmVmNTMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZVVzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0aGUgc3Ryb25nbHktdHlwZWQgdXNlciBvZiBhIHR5cGVzdG9yZS4KLSAqIEEgdHlwZXN0b3JlIGlzIHJlc3BvbnNpYmxlIGZvciBhbGwgdGhlIGxleGljYWwgYXNwZWN0cyBvZiBYTUwsIGFuZAotICogYSB0eXBlc3RvcmUgdXNlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsIHN0cm9uZ2x5LXR5cGVkIGFzcGVjdHMuCi0gKiBXaGVyZSB0aGVyZSBpcyBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSB0d28gbW9kZWxzLCBpdCBpcyByZXByZXNlbnRlZAotICogYnkgdGhlIFR5cGVTdG9yZSBhbmQgVHlwZVN0b3JlVXNlciBpbnRlcmZhY2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGVTdG9yZVVzZXIKLXsKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgdG8gYXR0YWNoIHRvIHRoZSBnaXZlbiB0ZXh0U3RvcmUuIFdoZW4gYSBUeXBlU3RvcmVVc2VyIGlzCi0gICAgICogYXR0YWNoZWQsIGl0IGlzIHB1dCBpbnRvIGEgY29tcGxldGVseSBpbnZhbGlkYXRlZCBzdGF0ZS4KLSAgICAgKi8KLSAgICB2b2lkIGF0dGFjaF9zdG9yZShUeXBlU3RvcmUgc3RvcmUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2NoZW1hIHR5cGUgb2YgdGhpcyB1c2VyCi0gICAgICovCi0gICAgU2NoZW1hVHlwZSBnZXRfc2NoZW1hX3R5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0b3JlIHRvIHdoaWNoIHRoaXMgdHlwZXN0b3JldXNlciBpcyBhdHRhY2hlZCwgb3IKLSAgICAgKiBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgVHlwZVN0b3JlIGdldF9zdG9yZSgpOwotCi0gICAgLyoqCi0gICAgICogQSBzdG9yZSB3aWxsIGNhbGwgYmFjayBvbiBpbnZhbGlkYXRlX3ZhbHVlIHdoZW4gaXRzIHRleHQgaGFzCi0gICAgICogY2hhbmdlZCBhbmQgaXQgdGhlcmVmb3JlIGtub3dzIHRoYXQgYW55IGNhY2hlZCB0eXBlIHZhbHVlIGlzCi0gICAgICogaW52YWxpZC4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsdHkgb2YgdGhlIHR5cGUgdG8gY2FsbCBmZXRjaF90ZXh0Ci0gICAgICogYW5kIHJlcGFyc2UgbmV4dCB0aW1lIHRoZSB1c2VyIGRvZXMgYSBzdHJvbmdseS10eXBlZCBnZXQuCi0gICAgICovCi0gICAgdm9pZCBpbnZhbGlkYXRlX3ZhbHVlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIHN0b3JlIGNhbiBjYWxsIHVzZXNfaW52YWxpZGF0ZV92YWx1ZSB0byBrbm93IGlmIGNhbGxzIHRvCi0gICAgICogaW52YWxpZGF0ZV92YWx1ZSB3aWxsIGJlIGZydWl0ZnVsLiAgSWYgdXNlc19pbnZhbGlkYXRlX3ZhbHVlCi0gICAgICogcmV0dXJucyBmYWxzZSwgaW52YWxpZGF0ZV92YWx1ZSBuZWVkIG5ldmVyIGJlIGNhbGxlZC4KLSAgICAgKi8KLSAgICBib29sZWFuIHVzZXNfaW52YWxpZGF0ZV92YWx1ZSgpOwotCi0gICAgLyoqCi0gICAgICogQSBzdG9yZSB3aWxsIGNhbGwgYmFjayBvbiBidWlsZF90ZXh0IHdoZW4gaXQga25vd3MgaXRzIG93biB0ZXh0Ci0gICAgICogaXMgaW52YWxpZCBhbmQgbmVlZHMgdG8gZmlsbCBpdCBpbi4gIElmIGZvckV4dGVybmFsIGlzIHRydWUsIHRoZW4KLSAgICAgKiB0aGUgdmFsdWUgcmV0dXJuZWQgd2lsbCBiZSB1c2VkIHRvIHJlcGxlbmlzaCB0aGUgc3RvcmUncyBjYWNoZSBvZgotICAgICAqIHRoZSB2YWx1ZS4gIE90aGVyd2lzZSwgdGhlIHZhbHVlIGlzIGJlaW5nIGNvbXB1dGVkIGZvciBwdXJwb3NlcwotICAgICAqIG90aGVyIHRoYW4gdmFsaWRhdGlvbiwgbGlrZSBwZXJzaXN0ZW5jZS4KLSAgICAgKgotICAgICAqIEFsc28sIHRoZSBvbmx5IG1lbWJlciBvbiBUeXBlU3RvcmUgd2hpY2ggbWF5IGJlIGNhbGxlZCB3aGlsZSBidWlsZF90ZXh0Ci0gICAgICogaXMgb24gdGhlIHN0YWNrIGlzIGZpbmRfcHJlZml4X2Zvcl9uc3VyaSB3aGljaCBtdXN0IGhhdmUgdGhlCi0gICAgICogZm9yRXh0ZXJuYWwgc3RhdGUgcGFzc2VkIHRvIGl0IGFzIGl0IGlzIHBhc3NlZCBoZXJlLgotICAgICAqLwotICAgIFN0cmluZyBidWlsZF90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKTsKLQotICAgIC8qKgotICAgICAqIEEgc3RvcmUgd2lsbCBjYWxsIGJhY2sgb24gYnVpbGRfbmlsIGFmdGVyIHlvdSd2ZSBjYWxsZWQgaW52YWxpZGF0ZV9uaWwKLSAgICAgKiBhbmQgaXQgbmVlZHMgdG8ga25vdyB3aGF0IHRoZSBuaWwgdmFsdWUgaXMuCi0gICAgICovCi0gICAgYm9vbGVhbiBidWlsZF9uaWwoKTsKLQotICAgIC8qKgotICAgICAqIEEgc3RvcmUgY2FsbHMgYmFjayBvbiBpbnZhbGlkYXRlX25pbHZhbHVlIHdoZW4gdGhlIHZhbHVlIG9mCi0gICAgICogdGhlIHhzaTpuaWwgdGFnIGhhcyBjaGFuZ2VkLgotICAgICAqLwotICAgIHZvaWQgaW52YWxpZGF0ZV9uaWx2YWx1ZSgpOwotCi0gICAgLyoqCi0gICAgICogQSBzdG9yZSBjYWxscyBiYWNrIG9uIGludmFsaWRhdGVfZWxlbWVudF9vcmRlciB3aGVuIGEgcmVhcnJhbmdtZW50Ci0gICAgICogb2Ygc2libGluZyBlbGVtZW50cyB0byB0aGUgbGVmdCBvZiB0aGlzIGVsZW1lbnQgbWVhbnMgdGhhdCB0aGUKLSAgICAgKiBuaWxsYWJsZSB2YWx1ZSBtYXkgbm8gbG9uZ2VyIGJlIHZhbGlkLgotICAgICAqLwotICAgIHZvaWQgaW52YWxpZGF0ZV9lbGVtZW50X29yZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIHN0b3JlIHdpbGwgY2FsbCBiYWNrIG9uIHZhbGlkYXRlX25vdyB0byBmb3JjZSB1cyB0byBsb29rIGF0Ci0gICAgICogdGhlIHRleHQgaWYgd2UncmUgaW4gYW4gaW52YWxpZCBzdGF0ZS4gVGhpcyBmdW5jdGlvbiBpcyBhbGxvd2VkCi0gICAgICogYW5kIGV4cGVjdGVkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgdGV4dCBpc24ndCB2YWxpZCBmb3IKLSAgICAgKiBvdXIgdHlwZS4KLSAgICAgKi8KLSAgICB2b2lkIHZhbGlkYXRlX25vdygpOwotCi0gICAgLyoqCi0gICAgICogQSBzdG9yZSBjYWxscyBiYWNrIG9uIHRoaXMgY2FsbCBpbiBvcmRlciB0byBmb3JjZSBhIGRpc2Nvbm5lY3QuCi0gICAgICogQWZ0ZXIgdGhpcyBpcyBkb25lLCB0aGUgb2JqZWN0IHNob3VsZCBiZSBjb25zaWRlcmVkIGludmFsaWQuCi0gICAgICovCi0gICAgdm9pZCBkaXNjb25uZWN0X3N0b3JlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIHR5cGVzdG9yZSB1c2VyIGNhbiBjcmVhdGUgYSBuZXcgVHlwZVN0b3JlVXNlciBpbnN0YW5jZSBmb3IKLSAgICAgKiBhIGdpdmVuIGVsZW1lbnQgY2hpbGQgbmFtZSBhcyBsb25nIGFzIHlvdSBhbHNvIHBhc3MgdGhlCi0gICAgICogcW5hbWUgY29udGFpbmVkIGJ5IHRoZSB4c2k6dHlwZSBhdHRyaWJ1dGUsIGlmIGFueS4KLSAgICAgKgotICAgICAqIE5vdGUgdGhhdCB3ZSB3aWxsIGlnbm9yZSB0aGUgeHNpVHlwZSBpZiBpdCB0dXJucyBvdXQgdG8gYmUgaW52YWxpZC4KLSAgICAgKi8KLSAgICBUeXBlU3RvcmVVc2VyIGNyZWF0ZV9lbGVtZW50X3VzZXIoUU5hbWUgZWx0TmFtZSwgUU5hbWUgeHNpVHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiBBIHR5cGVzdG9yZSB1c2VyIGNhbiBjcmVhdGUgYSBuZXcgVHlwZVN0b3JlVXNlciBpbnN0YW5jZSBmb3IKLSAgICAgKiBhIGdpdmVuIGF0dHJpYnV0ZSBjaGlsZCwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZSBuYW1lLgotICAgICAqLwotICAgIFR5cGVTdG9yZVVzZXIgY3JlYXRlX2F0dHJpYnV0ZV91c2VyKFFOYW1lIGF0dHJOYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgU2NoZW1hVHlwZSB3aGljaCBhIGNoaWxkIGVsZW1lbnQgb2YgdGhpcyBuYW1lIGFuZCB4c2k6dHlwZQotICAgICAqIHdvdWxkIGJlLgotICAgICAqLwotCi0gICAgU2NoZW1hVHlwZSBnZXRfZWxlbWVudF90eXBlKFFOYW1lIGVsdE5hbWUsIFFOYW1lIHhzaVR5cGUpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgU2NoZW1hVHlwZSB3aGljaCBhbiBhdHRyaWJ1dGUgb2YgdGhpcyBuYW1lIHdvdWxkIGJlLgotICAgICAqLwotCi0gICAgU2NoZW1hVHlwZSBnZXRfYXR0cmlidXRlX3R5cGUoUU5hbWUgYXR0ck5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBlbGVtZW50IHRleHQsIGlmIGl0J3MgY29uc2lzdGVudC4gSWYgaXQncwotICAgICAqIG5vdCBjb25zaXN0ZW50LCByZXR1cm5zIG51bGwsIGFuZCByZXF1aXJlcyBhIHZpc2l0b3Igd2Fsay4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0X2RlZmF1bHRfZWxlbWVudF90ZXh0KFFOYW1lIGVsdE5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBhdHRyaWJ1dGUgdGV4dCBmb3IgdGhlIGF0dHJpYnV0ZSB3aXRoCi0gICAgICogdGhlIGdpdmVuIG5hbWUuCi0gICAgICovCi0gICAgU3RyaW5nIGdldF9kZWZhdWx0X2F0dHJpYnV0ZV90ZXh0KFFOYW1lIGF0dHJOYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnRmbGFncywgaWYgdGhleSdyZSBjb25zaXN0ZW50LiBJZiB0aGV5J3JlCi0gICAgICogbm90LCByZXR1cm5zIC0xLCBhbmQgcmVxdWlyZXMgYSB2aXN0b3Igd2Fsay4KLSAgICAgKi8KLSAgICBpbnQgZ2V0X2VsZW1lbnRmbGFncyhRTmFtZSBlbHROYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZsYWdzIGZvciBhbiBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgaW50IGdldF9hdHRyaWJ1dGVmbGFncyhRTmFtZSBhdHRyTmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzY2hlbWEgZmllbGQgZm9yIGFuIGF0dHJpYnV0ZQotICAgICAqLwotICAgIFNjaGVtYUZpZWxkIGdldF9hdHRyaWJ1dGVfZmllbGQoUU5hbWUgYXR0ck5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBmYWxzZSBpZiBjaGlsZCBlbGVtZW50cyBhcmUgaW5zZW5zaXRpdmUgdG8gb3JkZXI7Ci0gICAgICogaWYgaXQgcmV0dXJucyB0cnVlLCB5b3UncmUgcmVxdWlyZWQgdG8gY2FsbCBpbnZhbGlkYXRlX2VsZW1lbnRfb3JkZXIKLSAgICAgKiBvbiBjaGlsZHJlbiB0byB0aGUgcmlnaHQgb2YgYW55IGNoaWxkIG9yZGVyIHJlYXJyYW5nZW1lbnQuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc19jaGlsZF9lbGVtZW50X29yZGVyX3NlbnNpdGl2ZSgpOwotCi0gICAgLyoqCi0gICAgICogQSB0eXBlc3RvcmUgdXNlciBjYW4gcmV0dXJuIHRoZSBlbGVtZW50IHNvcnQgb3JkZXIgdG8gdXNlIGZvcgotICAgICAqIGluc2VydGlvbiBvcGVyYXRpb25zIGlmIG5lZWRlZC4gU2V0dGFibGUgZWxlbWVudHMgc2hvdWxkCi0gICAgICogYmUgc3RvcmVkIGluIHRoaXMgb3JkZXIgaWYgcG9zc2libGUuCi0gICAgICovCi0gICAgUU5hbWVTZXQgZ2V0X2VsZW1lbnRfZW5kaW5nX2RlbGltaXRlcnMoUU5hbWUgZWx0bmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBBIHR5cGVzdG9yZSB1c2VyIGNhbiByZXR1cm4gYSB2aXNpdG9yIHRoYXQgaXMgdXNlZCB0byBjb21wdXRlCi0gICAgICogZGVmYXVsdCB0ZXh0IGFuZCBlbGVtZW50ZmxhZ3MgZm9yIGFuIGFyYml0cmFyeSBlbGVtZW50LgotICAgICAqLwotICAgIFR5cGVTdG9yZVZpc2l0b3IgbmV3X3Zpc2l0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmVVc2VyRmFjdG9yeS5qYXZhIGIvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZVVzZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMTRmYjguLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZVVzZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLS8qKgotICogRXZlcnkgU2NoZW1hVHlwZUxvYWRlciBpcyBhY3R1YWxseSBhIFR5cGVTdG9yZVVzZXJGYWN0b3J5LgotICoKLSAqIFRvIGdldCBhbmQgdXNlIHRoZSBkZWZhdWx0IFR5cGVTdG9yZVVzZXJGYWN0b3J5LCBkbyB0aGUgZm9sbG93aW5nOgotICoKLSAqIFR5cGVTdG9yZVVzZXIgdXNlciA9ICgoVHlwZVN0b3JlVXNlckZhY3RvcnkpU2NoZW1hVHlwZUxvYWRlci5nbG9iYWwoKSkuY3JlYXRlVHlwZVN0b3JlVXNlcihzdG9yZSk7Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHlwZVN0b3JlVXNlckZhY3RvcnkKLXsKLSAgICBUeXBlU3RvcmVVc2VyIGNyZWF0ZVR5cGVTdG9yZVVzZXIoKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmVWaXNpdG9yLmphdmEgYi92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvVHlwZVN0b3JlVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDU1ZmE5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmVWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSB0aGUgVHlwZVN0b3JlIHRvIHZpc2l0IGV2ZXJ5IGVsZW1lbnQgaW4gb3JkZXIKLSAqIHRvIGNvbXB1dGUgbmlsbGFibGUgZmxhZ3MgYW5kIGRlZmF1bHQgdmFsdWVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGVTdG9yZVZpc2l0b3IKLXsKLSAgICAvKioKLSAgICAgKiBXaGVuIHVzaW5nIGEgdmlzaXRvciwgeW91IG11c3QgY2FsbCAidmlzaXQiIG9uIGV2ZXJ5IHFuYW1lIG9mCi0gICAgICogZXZlcnkgZWxlbWVudCBpbiBvcmRlciB1cCB0byB0aGUgb25lIHlvdSdyZSBpbnRlcmVzdGVkIGluLgotICAgICAqCi0gICAgICogSWYgeW91J3JlIHVzaW5nIGl0IGZvciB2YWxpZGF0aW9uLCBjYWxsIHZpc2l0KG51bGwpIGF0IHRoZSBlbmQKLSAgICAgKiBvZiB0aGUgc2VxdWVuY2Ugb2YgY2hpbGRyZW4uIElmIHlvdSdyZSBub3QgdmFsaWRhdGluZywgeW91IGNhbgotICAgICAqIGp1c3Qgd2FsayBhd2F5IG9uY2UgeW91IGdldCB0aGUgaW5mbyB5b3UgbmVlZC4KLSAgICAgKi8KLSAgICBib29sZWFuIHZpc2l0KFFOYW1lIGVsdE5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWxlbWVudGZsYWdzIGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgaW50IGdldF9lbGVtZW50ZmxhZ3MoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIFN0cmluZyBnZXRfZGVmYXVsdF90ZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzY2hlbWEgZmllbGQgZm9yIHRoaXMgZmllbGQuCi0gICAgICovCi0gICAgU2NoZW1hRmllbGQgZ2V0X3NjaGVtYV9maWVsZCgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFN0b3JlLmphdmEgYi92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sU3RvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA5NmM4Ny4uMDAwMDAwMAotLS0gYS92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sU3RvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTYXhIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgWG1sU3RvcmUKLXsKLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIFhtbE9iamVjdCBsb2FkWG1sICggU3RyaW5nIHMsICAgICAgICAgICBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb247Ci0gICAgWG1sT2JqZWN0IGxvYWRYbWwgKCBJbnB1dFN0cmVhbSBpbiwgICAgIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0gICAgWG1sT2JqZWN0IGxvYWRYbWwgKCBSZWFkZXIgciwgICAgICAgICAgIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0gICAgWG1sT2JqZWN0IGxvYWRYbWwgKCBYTUxJbnB1dFN0cmVhbSB4aXMsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAgIFhtbE9iamVjdCBsb2FkWG1sICggTm9kZSBub2RlLCAgICAgICAgICBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb247Ci0gICAgCi0gICAgWG1sU2F4SGFuZGxlciBuZXdTYXhIYW5kbGVyICggU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKTsKLQotICAgIFhtbE9iamVjdCBnZXRPYmplY3QgKCApOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0Jhc2VTY2hlbWFSZXNvdXJjZU1hbmFnZXIuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0Jhc2VTY2hlbWFSZXNvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc5MjM4YS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9CYXNlU2NoZW1hUmVzb3VyY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKLQotaW1wb3J0IGNvbS5iZWEueDIwMDMueDAxLnhtbGJlYW4ueHNkb3dubG9hZC5Eb3dubG9hZGVkU2NoZW1hc0RvY3VtZW50OwotaW1wb3J0IGNvbS5iZWEueDIwMDMueDAxLnhtbGJlYW4ueHNkb3dubG9hZC5Eb3dubG9hZGVkU2NoZW1hRW50cnk7Ci1pbXBvcnQgY29tLmJlYS54MjAwMy54MDEueG1sYmVhbi54c2Rvd25sb2FkLkRvd25sb2FkZWRTY2hlbWFzRG9jdW1lbnQuRG93bmxvYWRlZFNjaGVtYXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnV0aWwuSGV4QmluOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uSU9VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkRpZ2VzdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQuU2NoZW1hOwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlU2NoZW1hUmVzb3VyY2VNYW5hZ2VyIGV4dGVuZHMgU2NoZW1hSW1wb3J0UmVzb2x2ZXIKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfZGVmYXVsdENvcHlEaXJlY3Rvcnk7Ci0gICAgcHJpdmF0ZSBEb3dubG9hZGVkU2NoZW1hc0RvY3VtZW50IF9pbXBvcnRzRG9jOwotICAgIHByaXZhdGUgTWFwIF9yZXNvdXJjZUZvckZpbGVuYW1lID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIE1hcCBfcmVzb3VyY2VGb3JVUkwgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9yZXNvdXJjZUZvck5hbWVzcGFjZSA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX3Jlc291cmNlRm9yRGlnZXN0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIE1hcCBfcmVzb3VyY2VGb3JDYWNoZUVudHJ5ID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIFNldCBfcmVkb3dubG9hZFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICBwcm90ZWN0ZWQgQmFzZVNjaGVtYVJlc291cmNlTWFuYWdlcigpCi0gICAgewotICAgICAgICAvLyBjb25jcmV0ZSBzdWJjbGFzc2VzIHNob3VsZCBjYWxsIGluaXQgaW4gdGhlaXIgY29uc3RydWN0b3JzCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdCgpCi0gICAgewotICAgICAgICBpZiAoZmlsZUV4aXN0cyhnZXRJbmRleEZpbGVuYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfaW1wb3J0c0RvYyA9IERvd25sb2FkZWRTY2hlbWFzRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSggaW5wdXRTdHJlYW1Gb3JGaWxlKCBnZXRJbmRleEZpbGVuYW1lKCkgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2ltcG9ydHNEb2MgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IChJbGxlZ2FsU3RhdGVFeGNlcHRpb24pKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByb2JsZW0gcmVhZGluZyB4c2Rvd25sb2FkLnhtbDogcGxlYXNlIGZpeCBvciBkZWxldGUgdGhpcyBmaWxlIikpLmluaXRDYXVzZShlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoX2ltcG9ydHNEb2MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2ltcG9ydHNEb2MgPSBEb3dubG9hZGVkU2NoZW1hc0RvY3VtZW50LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgICAgICI8ZGxzOmRvd25sb2FkZWQtc2NoZW1hcyB4bWxuczpkbHM9J2h0dHA6Ly93d3cuYmVhLmNvbS8yMDAzLzAxL3htbGJlYW4veHNkb3dubG9hZCcgZGVmYXVsdERpcmVjdG9yeT0nIiArIGdldERlZmF1bHRTY2hlbWFEaXIoKSArICInLz4iCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uKShuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpLmluaXRDYXVzZShlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBkZWZhdWx0RGlyID0gX2ltcG9ydHNEb2MuZ2V0RG93bmxvYWRlZFNjaGVtYXMoKS5nZXREZWZhdWx0RGlyZWN0b3J5KCk7Ci0gICAgICAgIGlmIChkZWZhdWx0RGlyID09IG51bGwpCi0gICAgICAgICAgICBkZWZhdWx0RGlyID0gZ2V0RGVmYXVsdFNjaGVtYURpcigpOzsKLSAgICAgICAgX2RlZmF1bHRDb3B5RGlyZWN0b3J5ID0gZGVmYXVsdERpcjsKLQotICAgICAgICAvLyBub3cgaW5pdGlhbGl6ZSBkYXRhIHN0cnVjdHVyZXMKLSAgICAgICAgRG93bmxvYWRlZFNjaGVtYUVudHJ5W10gZW50cmllcyA9IF9pbXBvcnRzRG9jLmdldERvd25sb2FkZWRTY2hlbWFzKCkuZ2V0RW50cnlBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0ZVJlc291cmNlKGVudHJpZXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVDYWNoZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBfaW1wb3J0c0RvYy5uZXdJbnB1dFN0cmVhbShuZXcgWG1sT3B0aW9ucygpLnNldFNhdmVQcmV0dHlQcmludCgpKTsKLSAgICAgICAgd3JpdGVJbnB1dFN0cmVhbVRvRmlsZShpbnB1dCwgZ2V0SW5kZXhGaWxlbmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBwcm9jZXNzQWxsKGJvb2xlYW4gc3luYywgYm9vbGVhbiByZWZyZXNoLCBib29sZWFuIGltcG9ydHMpCi0gICAgewotICAgICAgICBpZiAocmVmcmVzaCkKLSAgICAgICAgewotICAgICAgICAgICAgX3JlZG93bmxvYWRTZXQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgX3JlZG93bmxvYWRTZXQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gYWxsRmlsZW5hbWVzID0gZ2V0QWxsWFNERmlsZW5hbWVzKCk7Ci0KLSAgICAgICAgaWYgKHN5bmMpCi0gICAgICAgICAgICBzeW5jQ2FjaGVXaXRoTG9jYWxYc2RGaWxlcyhhbGxGaWxlbmFtZXMsIGZhbHNlKTsKLQotICAgICAgICBTY2hlbWFSZXNvdXJjZVtdIHN0YXJ0ZXJzID0gKFNjaGVtYVJlc291cmNlW10pCi0gICAgICAgICAgICAgICAgX3Jlc291cmNlRm9yRmlsZW5hbWUudmFsdWVzKCkudG9BcnJheShuZXcgU2NoZW1hUmVzb3VyY2VbMF0pOwotCi0gICAgICAgIGlmIChyZWZyZXNoKQotICAgICAgICAgICAgcmVkb3dubG9hZEVudHJpZXMoc3RhcnRlcnMpOwotCi0gICAgICAgIGlmIChpbXBvcnRzKQotICAgICAgICAgICAgcmVzb2x2ZUltcG9ydHMoc3RhcnRlcnMpOwotCi0gICAgICAgIF9yZWRvd25sb2FkU2V0ID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBwcm9jZXNzKFN0cmluZ1tdIHVyaXMsIFN0cmluZ1tdIGZpbGVuYW1lcywgYm9vbGVhbiBzeW5jLCBib29sZWFuIHJlZnJlc2gsIGJvb2xlYW4gaW1wb3J0cykKLSAgICB7Ci0gICAgICAgIGlmIChyZWZyZXNoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcmVkb3dubG9hZFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBfcmVkb3dubG9hZFNldCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmlsZW5hbWVzLmxlbmd0aCA+IDApCi0gICAgICAgICAgICBzeW5jQ2FjaGVXaXRoTG9jYWxYc2RGaWxlcyhmaWxlbmFtZXMsIHRydWUpOwotICAgICAgICBlbHNlIGlmIChzeW5jKQotICAgICAgICAgICAgc3luY0NhY2hlV2l0aExvY2FsWHNkRmlsZXMoZ2V0QWxsWFNERmlsZW5hbWVzKCksIGZhbHNlKTsKLQotICAgICAgICBTZXQgc3RhcnRlcnNldCA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFSZXNvdXJjZSByZXNvdXJjZSA9IChTY2hlbWFSZXNvdXJjZSlsb29rdXBSZXNvdXJjZShudWxsLCB1cmlzW2ldKTsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHN0YXJ0ZXJzZXQuYWRkKHJlc291cmNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZW5hbWVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFSZXNvdXJjZSByZXNvdXJjZSA9IChTY2hlbWFSZXNvdXJjZSlfcmVzb3VyY2VGb3JGaWxlbmFtZS5nZXQoZmlsZW5hbWVzKTsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHN0YXJ0ZXJzZXQuYWRkKHJlc291cmNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNjaGVtYVJlc291cmNlW10gc3RhcnRlcnMgPSAoU2NoZW1hUmVzb3VyY2VbXSkKLSAgICAgICAgICAgICAgIHN0YXJ0ZXJzZXQudG9BcnJheShuZXcgU2NoZW1hUmVzb3VyY2VbMF0pOwotCi0gICAgICAgIGlmIChyZWZyZXNoKQotICAgICAgICAgICAgcmVkb3dubG9hZEVudHJpZXMoc3RhcnRlcnMpOwotCi0gICAgICAgIGlmIChpbXBvcnRzKQotICAgICAgICAgICAgcmVzb2x2ZUltcG9ydHMoc3RhcnRlcnMpOwotCi0gICAgICAgIF9yZWRvd25sb2FkU2V0ID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGl0ZW1zIHRvIHRoZSBjYWNoZSB0aGF0IHBvaW50IHRvIG5ldyBmaWxlcyB0aGF0IGFyZW4ndAotICAgICAqIGRlc2NyaWJlZCBpbiB0aGUgY2FjaGUsIGFuZCBvcHRpb25hbGx5IGRlbGV0ZXMgb2xkIGVudHJpZXMuCi0gICAgICoKLSAgICAgKiBJZiBhbiBvbGQgZmlsZSBpcyBnb25lIGFuZCBhIG5ldyBmaWxlIGlzCi0gICAgICogZm91bmQgd2l0aCBleGFjdGx5IHRoZSBzYW1lIGNvbnRlbnRzLCB0aGUgY2FjaGUgZW50cnkgaXMgbW92ZWQKLSAgICAgKiB0byBwb2ludCB0byB0aGUgbmV3IGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3luY0NhY2hlV2l0aExvY2FsWHNkRmlsZXMoU3RyaW5nW10gZmlsZW5hbWVzLCBib29sZWFuIGRlbGV0ZU9ubHlNZW50aW9uZWQpCi0gICAgewotICAgICAgICBTZXQgc2VlblJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIFNldCB2YW5pc2hlZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlbmFtZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGZpbGVuYW1lc1tpXTsKLQotICAgICAgICAgICAgLy8gZmlyc3QsIGlmIHRoZSBmaWxlbmFtZSBtYXRjaGVzIGV4YWN0bHksIHRydXN0IHRoZSBmaWxlbmFtZQotICAgICAgICAgICAgU2NoZW1hUmVzb3VyY2UgcmVzb3VyY2UgPSAoU2NoZW1hUmVzb3VyY2UpX3Jlc291cmNlRm9yRmlsZW5hbWUuZ2V0KGZpbGVuYW1lKTsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChmaWxlRXhpc3RzKGZpbGVuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgc2VlblJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgdmFuaXNoZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbmV3IGZpbGUgdGhhdCBpcyBub3QgaW4gdGhlIGluZGV4PwotICAgICAgICAgICAgLy8gbm90IGlmIHRoZSBkaWdlc3QgaXMga25vd24gdG8gdGhlIGluZGV4IGFuZCB0aGUgb3JpZ2luYWwgZmlsZSBpcyBnb25lIC0gdGhhdCdzIGEgcmVuYW1lIQotICAgICAgICAgICAgU3RyaW5nIGRpZ2VzdCA9IG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkaWdlc3QgPSBzaGFEaWdlc3RGb3JGaWxlKGZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICByZXNvdXJjZSA9IChTY2hlbWFSZXNvdXJjZSlfcmVzb3VyY2VGb3JEaWdlc3QuZ2V0KGRpZ2VzdCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb2xkRmlsZW5hbWUgPSByZXNvdXJjZS5nZXRGaWxlbmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGVFeGlzdHMob2xkRmlsZW5hbWUpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJGaWxlICIgKyBmaWxlbmFtZSArICIgaXMgYSByZW5hbWUgb2YgIiArIG9sZEZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlLnNldEZpbGVuYW1lKGZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5SZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfcmVzb3VyY2VGb3JGaWxlbmFtZS5nZXQob2xkRmlsZW5hbWUpID09IHJlc291cmNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXNvdXJjZUZvckZpbGVuYW1lLnJlbW92ZShvbGRGaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3Jlc291cmNlRm9yRmlsZW5hbWUuY29udGFpbnNLZXkoZmlsZW5hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXNvdXJjZUZvckZpbGVuYW1lLnB1dChmaWxlbmFtZSwgcmVzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyB1bmFibGUgdG8gcmVhZCBkaWdlc3QuLi4gbm8gcHJvYmxlbSwgaWdub3JlIHRoZW4KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gb2ssIHRoaXMgcmVhbGx5IGlzIGEgbmV3IFhTRCBmaWxlIHRoZW4sIG9mIHVua25vd24gVVJMIG9yaWdpbgotICAgICAgICAgICAgRG93bmxvYWRlZFNjaGVtYUVudHJ5IG5ld0VudHJ5ID0gYWRkTmV3RW50cnkoKTsKLSAgICAgICAgICAgIG5ld0VudHJ5LnNldEZpbGVuYW1lKGZpbGVuYW1lKTsKLSAgICAgICAgICAgIHdhcm5pbmcoIkNhY2hpbmcgaW5mb3JtYXRpb24gb24gbmV3IGxvY2FsIGZpbGUgIiArIGZpbGVuYW1lKTsKLSAgICAgICAgICAgIGlmIChkaWdlc3QgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBuZXdFbnRyeS5zZXRTaGExKGRpZ2VzdCk7Ci0KLSAgICAgICAgICAgIHNlZW5SZXNvdXJjZXMuYWRkKHVwZGF0ZVJlc291cmNlKG5ld0VudHJ5KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVsZXRlT25seU1lbnRpb25lZCkKLSAgICAgICAgICAgIGRlbGV0ZVJlc291cmNlc0luU2V0KHZhbmlzaGVkUmVzb3VyY2VzLCB0cnVlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZGVsZXRlUmVzb3VyY2VzSW5TZXQoc2VlblJlc291cmNlcywgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEl0ZXJhdGVzIHRocm91Z2ggZXZlcnkgZW50cnkgYW5kIHJlZmV0Y2hlcyBpdCBmcm9tIGl0cyBwcmltYXJ5IFVSTCwKLSAgICAgKiBpZiBrbm93bi4gIFJlcGxhY2VzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBpZiB0aGUgZGF0YSBpcyBkaWZmZXJlbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlZG93bmxvYWRFbnRyaWVzKFNjaGVtYVJlc291cmNlW10gcmVzb3VyY2VzKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZG93bmxvYWRSZXNvdXJjZShyZXNvdXJjZXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZVJlc291cmNlc0luU2V0KFNldCBzZWVuUmVzb3VyY2VzLCBib29sZWFuIHNldFRvRGVsZXRlKQotICAgIHsKLSAgICAgICAgU2V0IHNlZW5DYWNoZUVudHJpZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZWVuUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVJlc291cmNlIHJlc291cmNlID0gKFNjaGVtYVJlc291cmNlKWkubmV4dCgpOwotICAgICAgICAgICAgc2VlbkNhY2hlRW50cmllcy5hZGQocmVzb3VyY2UuX2NhY2hlRW50cnkpOwotICAgICAgICB9Ci0KLSAgICAgICAgRG93bmxvYWRlZFNjaGVtYXMgZG93bmxvYWRlZFNjaGVtYXMgPSBfaW1wb3J0c0RvYy5nZXREb3dubG9hZGVkU2NoZW1hcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRvd25sb2FkZWRTY2hlbWFzLnNpemVPZkVudHJ5QXJyYXkoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBEb3dubG9hZGVkU2NoZW1hRW50cnkgY2FjaGVFbnRyeSA9IGRvd25sb2FkZWRTY2hlbWFzLmdldEVudHJ5QXJyYXkoaSk7Ci0KLSAgICAgICAgICAgIGlmIChzZWVuQ2FjaGVFbnRyaWVzLmNvbnRhaW5zKGNhY2hlRW50cnkpID09IHNldFRvRGVsZXRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtYVJlc291cmNlIHJlc291cmNlID0gKFNjaGVtYVJlc291cmNlKV9yZXNvdXJjZUZvckNhY2hlRW50cnkuZ2V0KGNhY2hlRW50cnkpOwotICAgICAgICAgICAgICAgIHdhcm5pbmcoIlJlbW92aW5nIG9ic29sZXRlIGNhY2hlIGVudHJ5IGZvciAiICsgcmVzb3VyY2UuZ2V0RmlsZW5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9yZXNvdXJjZUZvckNhY2hlRW50cnkucmVtb3ZlKGNhY2hlRW50cnkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSA9PSBfcmVzb3VyY2VGb3JGaWxlbmFtZS5nZXQocmVzb3VyY2UuZ2V0RmlsZW5hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBfcmVzb3VyY2VGb3JGaWxlbmFtZS5yZW1vdmUocmVzb3VyY2UuZ2V0RmlsZW5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlID09IF9yZXNvdXJjZUZvckRpZ2VzdC5nZXQocmVzb3VyY2UuZ2V0U2hhMSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIF9yZXNvdXJjZUZvckRpZ2VzdC5yZW1vdmUocmVzb3VyY2UuZ2V0U2hhMSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgPT0gX3Jlc291cmNlRm9yTmFtZXNwYWNlLmdldChyZXNvdXJjZS5nZXROYW1lc3BhY2UoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBfcmVzb3VyY2VGb3JOYW1lc3BhY2UucmVtb3ZlKHJlc291cmNlLmdldE5hbWVzcGFjZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBGaW5hbGx5LCBhbnkgb3IgYWxsIFVSSXMKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdXJscyA9IHJlc291cmNlLmdldFNjaGVtYUxvY2F0aW9uQXJyYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB1cmxzLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgPT0gX3Jlc291cmNlRm9yVVJMLmdldCh1cmxzW2pdKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzb3VyY2VGb3JVUkwucmVtb3ZlKHVybHNbal0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZG93bmxvYWRlZFNjaGVtYXMucmVtb3ZlRW50cnkoaSk7Ci0gICAgICAgICAgICAgICAgaSAtPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTY2hlbWFSZXNvdXJjZSB1cGRhdGVSZXNvdXJjZShEb3dubG9hZGVkU2NoZW1hRW50cnkgZW50cnkpCi0gICAgewotICAgICAgICAvLyBUaGUgZmlsZQotICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBlbnRyeS5nZXRGaWxlbmFtZSgpOwotICAgICAgICBpZiAoZmlsZW5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFNjaGVtYVJlc291cmNlIHJlc291cmNlID0gbmV3IFNjaGVtYVJlc291cmNlKGVudHJ5KTsKLSAgICAgICAgX3Jlc291cmNlRm9yQ2FjaGVFbnRyeS5wdXQoZW50cnksIHJlc291cmNlKTsKLQotICAgICAgICBpZiAoIV9yZXNvdXJjZUZvckZpbGVuYW1lLmNvbnRhaW5zS2V5KGZpbGVuYW1lKSkKLSAgICAgICAgICAgIF9yZXNvdXJjZUZvckZpbGVuYW1lLnB1dChmaWxlbmFtZSwgcmVzb3VyY2UpOwotCi0gICAgICAgIC8vIFRoZSBkaWdlc3QKLSAgICAgICAgU3RyaW5nIGRpZ2VzdCA9IHJlc291cmNlLmdldFNoYTEoKTsKLSAgICAgICAgaWYgKGRpZ2VzdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIV9yZXNvdXJjZUZvckRpZ2VzdC5jb250YWluc0tleShkaWdlc3QpKQotICAgICAgICAgICAgICAgIF9yZXNvdXJjZUZvckRpZ2VzdC5wdXQoZGlnZXN0LCByZXNvdXJjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOZXh0LCB0aGUgbmFtZXNwYWNlCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSByZXNvdXJjZS5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIV9yZXNvdXJjZUZvck5hbWVzcGFjZS5jb250YWluc0tleShuYW1lc3BhY2UpKQotICAgICAgICAgICAgICAgIF9yZXNvdXJjZUZvck5hbWVzcGFjZS5wdXQobmFtZXNwYWNlLCByZXNvdXJjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGaW5hbGx5LCBhbnkgb3IgYWxsIFVSSXMKLSAgICAgICAgU3RyaW5nW10gdXJscyA9IHJlc291cmNlLmdldFNjaGVtYUxvY2F0aW9uQXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB1cmxzLmxlbmd0aDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIV9yZXNvdXJjZUZvclVSTC5jb250YWluc0tleSh1cmxzW2pdKSkKLSAgICAgICAgICAgICAgICBfcmVzb3VyY2VGb3JVUkwucHV0KHVybHNbal0sIHJlc291cmNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXNvdXJjZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBEaWdlc3RJbnB1dFN0cmVhbSBkaWdlc3RJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICB7Ci0gICAgICAgIE1lc3NhZ2VEaWdlc3Qgc2hhOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc2hhID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiU0hBIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uKShuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkuaW5pdENhdXNlKGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIERpZ2VzdElucHV0U3RyZWFtIHN0ciA9IG5ldyBEaWdlc3RJbnB1dFN0cmVhbShpbnB1dCwgc2hhKTsKLQotICAgICAgICByZXR1cm4gc3RyOwotICAgIH0KLQotICAgIHByaXZhdGUgRG93bmxvYWRlZFNjaGVtYUVudHJ5IGFkZE5ld0VudHJ5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaW1wb3J0c0RvYy5nZXREb3dubG9hZGVkU2NoZW1hcygpLmFkZE5ld0VudHJ5KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBTY2hlbWFSZXNvdXJjZSBpbXBsZW1lbnRzIFNjaGVtYUltcG9ydFJlc29sdmVyLlNjaGVtYVJlc291cmNlCi0gICAgewotICAgICAgICBTY2hlbWFSZXNvdXJjZShEb3dubG9hZGVkU2NoZW1hRW50cnkgZW50cnkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jYWNoZUVudHJ5ID0gZW50cnk7Ci0gICAgICAgIH0KLQotICAgICAgICBEb3dubG9hZGVkU2NoZW1hRW50cnkgX2NhY2hlRW50cnk7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RmlsZW5hbWUoU3RyaW5nIGZpbGVuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBfY2FjaGVFbnRyeS5zZXRGaWxlbmFtZShmaWxlbmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVuYW1lKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9jYWNoZUVudHJ5LmdldEZpbGVuYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2NoZW1hIGdldFNjaGVtYSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghZmlsZUV4aXN0cyhnZXRGaWxlbmFtZSgpKSkKLSAgICAgICAgICAgICAgICByZWRvd25sb2FkUmVzb3VyY2UodGhpcyk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFEb2N1bWVudC5GYWN0b3J5LnBhcnNlKGlucHV0U3RyZWFtRm9yRmlsZShnZXRGaWxlbmFtZSgpKSkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIHJldHVybiBudWxsIGlmIF9hbnlfIHByb2JsZW1zIHJlYWRpbmcgc2NoZW1hIGZpbGUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hhMSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfY2FjaGVFbnRyeS5nZXRTaGExKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfY2FjaGVFbnRyeS5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBfY2FjaGVFbnRyeS5zZXROYW1lc3BhY2UobmFtZXNwYWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hTG9jYXRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2NhY2hlRW50cnkuc2l6ZU9mU2NoZW1hTG9jYXRpb25BcnJheSgpID4gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gX2NhY2hlRW50cnkuZ2V0U2NoZW1hTG9jYXRpb25BcnJheSgwKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFNjaGVtYUxvY2F0aW9uQXJyYXkoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2NhY2hlRW50cnkuZ2V0U2NoZW1hTG9jYXRpb25BcnJheSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRGaWxlbmFtZSgpLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMgPT0gb2JqIHx8IGdldEZpbGVuYW1lKCkuZXF1YWxzKCgoU2NoZW1hUmVzb3VyY2Upb2JqKS5nZXRGaWxlbmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFNjaGVtYUxvY2F0aW9uKFN0cmluZyBzY2hlbWFMb2NhdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgX2NhY2hlRW50cnkuYWRkU2NoZW1hTG9jYXRpb24oc2NoZW1hTG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIEltcG9ydExvYWRlciB3aXNoZXMgdG8gcmVzb2x2ZSB0aGUKLSAgICAgKiBnaXZlbiBpbXBvcnQuICBTaG91bGQgcmV0dXJuIGEgU2NoZW1hUmVzb3VyY2Ugd2hvc2UKLSAgICAgKiAiZXF1YWxzIiByZWxhdGlvbnNoaXAgcmV2ZWFscyB3aGVuIGEgU2NoZW1hUmVzb3VyY2UgaXMKLSAgICAgKiBkdXBsaWNhdGVkIGFuZCBzaG91bGRuJ3QgYmUgZXhhbWluZWQgYWdhaW4uCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHJlc291cmNlIHJlZmVyZW5jZSBzaG91bGQgYmUgaWdub3JlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hSW1wb3J0UmVzb2x2ZXIuU2NoZW1hUmVzb3VyY2UgbG9va3VwUmVzb3VyY2UoU3RyaW5nIG5zVVJJLCBTdHJpbmcgc2NoZW1hTG9jYXRpb24pCi0gICAgewotICAgICAgICBTY2hlbWFSZXNvdXJjZSByZXN1bHQgPSBmZXRjaEZyb21DYWNoZShuc1VSSSwgc2NoZW1hTG9jYXRpb24pOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfcmVkb3dubG9hZFNldCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlZG93bmxvYWRSZXNvdXJjZShyZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzY2hlbWFMb2NhdGlvbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB3YXJuaW5nKCJObyBjYWNoZWQgc2NoZW1hIGZvciBuYW1lc3BhY2UgJyIgKyBuc1VSSSArICInLCBhbmQgbm8gdXJsIHNwZWNpZmllZCIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQgPSBjb3B5T3JJZGVudGlmeUR1cGxpY2F0ZVVSTChzY2hlbWFMb2NhdGlvbiwgbnNVUkkpOwotICAgICAgICBpZiAoX3JlZG93bmxvYWRTZXQgIT0gbnVsbCkKLSAgICAgICAgICAgIF9yZWRvd25sb2FkU2V0LmFkZChyZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgU2NoZW1hUmVzb3VyY2UgZmV0Y2hGcm9tQ2FjaGUoU3RyaW5nIG5zVVJJLCBTdHJpbmcgc2NoZW1hTG9jYXRpb24pCi0gICAgewotICAgICAgICBTY2hlbWFSZXNvdXJjZSByZXN1bHQ7Ci0KLSAgICAgICAgaWYgKHNjaGVtYUxvY2F0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IChTY2hlbWFSZXNvdXJjZSlfcmVzb3VyY2VGb3JVUkwuZ2V0KHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5zVVJJICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IChTY2hlbWFSZXNvdXJjZSlfcmVzb3VyY2VGb3JOYW1lc3BhY2UuZ2V0KG5zVVJJKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdW5pcXVlRmlsZW5hbWVGb3JVUkkoU3RyaW5nIHNjaGVtYUxvY2F0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGxvY2FsRmlsZW5hbWUgPSBuZXcgVVJJKCBzY2hlbWFMb2NhdGlvbiApLmdldFJhd1BhdGgoKTsKLSAgICAgICAgaW50IGkgPSBsb2NhbEZpbGVuYW1lLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgIGlmIChpID49IDApCi0gICAgICAgICAgICBsb2NhbEZpbGVuYW1lID0gbG9jYWxGaWxlbmFtZS5zdWJzdHJpbmcoaSArIDEpOwotICAgICAgICBpZiAobG9jYWxGaWxlbmFtZS5lbmRzV2l0aCgiLnhzZCIpKQotICAgICAgICAgICAgbG9jYWxGaWxlbmFtZSA9IGxvY2FsRmlsZW5hbWUuc3Vic3RyaW5nKDAsIGxvY2FsRmlsZW5hbWUubGVuZ3RoKCkgLSA0KTsKLSAgICAgICAgaWYgKGxvY2FsRmlsZW5hbWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIGxvY2FsRmlsZW5hbWUgPSAic2NoZW1hIjsKLQotICAgICAgICAvLyBUT0RPOiByZW1vdmUgb3RoZXIgdW5zYWZlIGNoYXJhY3RlcnMgZm9yIGZpbGVuYW1lcz8KLQotICAgICAgICBTdHJpbmcgY2FuZGlkYXRlRmlsZW5hbWUgPSBsb2NhbEZpbGVuYW1lOwotICAgICAgICBpbnQgc3VmZml4ID0gMTsKLSAgICAgICAgd2hpbGUgKHN1ZmZpeCA8IDEwMDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBjYW5kaWRhdGUgPSBfZGVmYXVsdENvcHlEaXJlY3RvcnkgKyAiLyIgKyBjYW5kaWRhdGVGaWxlbmFtZSArICIueHNkIjsKLSAgICAgICAgICAgIGlmICghZmlsZUV4aXN0cyhjYW5kaWRhdGUpKQotICAgICAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGU7Ci0gICAgICAgICAgICBzdWZmaXggKz0gMTsKLSAgICAgICAgICAgIGNhbmRpZGF0ZUZpbGVuYW1lID0gbG9jYWxGaWxlbmFtZSArIHN1ZmZpeDsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiUHJvYmxlbSB3aXRoIGZpbGVuYW1lICIgKyBsb2NhbEZpbGVuYW1lICsgIi54c2QiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVkb3dubG9hZFJlc291cmNlKFNjaGVtYVJlc291cmNlIHJlc291cmNlKQotICAgIHsKLSAgICAgICAgaWYgKF9yZWRvd25sb2FkU2V0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfcmVkb3dubG9hZFNldC5jb250YWlucyhyZXNvdXJjZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgX3JlZG93bmxvYWRTZXQuYWRkKHJlc291cmNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IHJlc291cmNlLmdldEZpbGVuYW1lKCk7Ci0gICAgICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IHJlc291cmNlLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBkaWdlc3QgPSBudWxsOwotCi0gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8/Ci0gICAgICAgIGlmIChzY2hlbWFMb2NhdGlvbiA9PSBudWxsIHx8IGZpbGVuYW1lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoIHNjaGVtYUxvY2F0aW9uICk7Ci0gICAgICAgICAgICBVUkxDb25uZWN0aW9uIGNvbm4gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgIGNvbm4uYWRkUmVxdWVzdFByb3BlcnR5KCJVc2VyLUFnZW50IiwgIkJFQSBYTUwgQmVhbnMvMS4wIik7Ci0gICAgICAgICAgICBjb25uLmFkZFJlcXVlc3RQcm9wZXJ0eSgiQWNjZXB0IiwgImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwsICovKiIpOwotICAgICAgICAgICAgRGlnZXN0SW5wdXRTdHJlYW0gaW5wdXQgPSBkaWdlc3RJbnB1dFN0cmVhbShjb25uLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgSU9VdGlsLmNvcHlDb21wbGV0ZWx5KGlucHV0LCBidWZmZXIpOwotICAgICAgICAgICAgZGlnZXN0ID0gSGV4QmluLmJ5dGVzVG9TdHJpbmcoaW5wdXQuZ2V0TWVzc2FnZURpZ2VzdCgpLmRpZ2VzdCgpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdhcm5pbmcoIkNvdWxkIG5vdCBjb3B5IHJlbW90ZSByZXNvdXJjZSAiICsgc2NoZW1hTG9jYXRpb24gKyAiOiIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGlnZXN0LmVxdWFscyhyZXNvdXJjZS5nZXRTaGExKCkpICYmIGZpbGVFeGlzdHMoZmlsZW5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICB3YXJuaW5nKCJSZXNvdXJjZSAiICsgZmlsZW5hbWUgKyAiIGlzIHVuY2hhbmdlZCBmcm9tICIgKyBzY2hlbWFMb2NhdGlvbiArICIuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gc291cmNlID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmZlci50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgIHdyaXRlSW5wdXRTdHJlYW1Ub0ZpbGUoc291cmNlLCBmaWxlbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdhcm5pbmcoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICIgKyBmaWxlbmFtZSArICIgZm9yICIgKyBzY2hlbWFMb2NhdGlvbiArICI6IiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHdhcm5pbmcoIlJlZnJlc2hlZCAiICsgZmlsZW5hbWUgKyAiIGZyb20gIiArIHNjaGVtYUxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYVJlc291cmNlIGNvcHlPcklkZW50aWZ5RHVwbGljYXRlVVJMKFN0cmluZyBzY2hlbWFMb2NhdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyB0YXJnZXRGaWxlbmFtZTsKLSAgICAgICAgU3RyaW5nIGRpZ2VzdDsKLSAgICAgICAgU2NoZW1hUmVzb3VyY2UgcmVzdWx0OwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRGaWxlbmFtZSA9IHVuaXF1ZUZpbGVuYW1lRm9yVVJJKHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdhcm5pbmcoIkludmFsaWQgVVJJICciICsgc2NoZW1hTG9jYXRpb24gKyAiJzoiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgbG9jYWwgZmlsZSBmb3IgIiArIHNjaGVtYUxvY2F0aW9uICsgIjoiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoIHNjaGVtYUxvY2F0aW9uICk7Ci0gICAgICAgICAgICBEaWdlc3RJbnB1dFN0cmVhbSBpbnB1dCA9IGRpZ2VzdElucHV0U3RyZWFtKHVybC5vcGVuU3RyZWFtKCkpOwotICAgICAgICAgICAgd3JpdGVJbnB1dFN0cmVhbVRvRmlsZShpbnB1dCwgdGFyZ2V0RmlsZW5hbWUpOwotICAgICAgICAgICAgZGlnZXN0ID0gSGV4QmluLmJ5dGVzVG9TdHJpbmcoaW5wdXQuZ2V0TWVzc2FnZURpZ2VzdCgpLmRpZ2VzdCgpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdhcm5pbmcoIkNvdWxkIG5vdCBjb3B5IHJlbW90ZSByZXNvdXJjZSAiICsgc2NoZW1hTG9jYXRpb24gKyAiOiIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdCA9IChTY2hlbWFSZXNvdXJjZSlfcmVzb3VyY2VGb3JEaWdlc3QuZ2V0KGRpZ2VzdCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZGVsZXRlRmlsZSh0YXJnZXRGaWxlbmFtZSk7Ci0gICAgICAgICAgICByZXN1bHQuYWRkU2NoZW1hTG9jYXRpb24oc2NoZW1hTG9jYXRpb24pOwotICAgICAgICAgICAgaWYgKCFfcmVzb3VyY2VGb3JVUkwuY29udGFpbnNLZXkoc2NoZW1hTG9jYXRpb24pKQotICAgICAgICAgICAgICAgIF9yZXNvdXJjZUZvclVSTC5wdXQoc2NoZW1hTG9jYXRpb24sIHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgd2FybmluZygiRG93bmxvYWRlZCAiICsgc2NoZW1hTG9jYXRpb24gKyAiIHRvICIgKyB0YXJnZXRGaWxlbmFtZSk7Ci0KLSAgICAgICAgRG93bmxvYWRlZFNjaGVtYUVudHJ5IG5ld0VudHJ5ID0gYWRkTmV3RW50cnkoKTsKLSAgICAgICAgbmV3RW50cnkuc2V0RmlsZW5hbWUodGFyZ2V0RmlsZW5hbWUpOwotICAgICAgICBuZXdFbnRyeS5zZXRTaGExKGRpZ2VzdCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgICAgICAgIG5ld0VudHJ5LnNldE5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgICAgICBuZXdFbnRyeS5hZGRTY2hlbWFMb2NhdGlvbihzY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgIHJldHVybiB1cGRhdGVSZXNvdXJjZShuZXdFbnRyeSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyBhY3R1YWwgbmFtZXNwYWNlIGluIHRoZSB0YWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXBvcnRBY3R1YWxOYW1lc3BhY2UoU2NoZW1hSW1wb3J0UmVzb2x2ZXIuU2NoZW1hUmVzb3VyY2UgcnJlc291cmNlLCBTdHJpbmcgYWN0dWFsTmFtZXNwYWNlKQotICAgIHsKLSAgICAgICAgU2NoZW1hUmVzb3VyY2UgcmVzb3VyY2UgPSAoU2NoZW1hUmVzb3VyY2UpcnJlc291cmNlOwotICAgICAgICBTdHJpbmcgb2xkTmFtZXNwYWNlID0gcmVzb3VyY2UuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGlmIChvbGROYW1lc3BhY2UgIT0gbnVsbCAmJiBfcmVzb3VyY2VGb3JOYW1lc3BhY2UuZ2V0KG9sZE5hbWVzcGFjZSkgPT0gcmVzb3VyY2UpCi0gICAgICAgICAgICBfcmVzb3VyY2VGb3JOYW1lc3BhY2UucmVtb3ZlKG9sZE5hbWVzcGFjZSk7Ci0gICAgICAgIGlmICghX3Jlc291cmNlRm9yTmFtZXNwYWNlLmNvbnRhaW5zS2V5KGFjdHVhbE5hbWVzcGFjZSkpCi0gICAgICAgICAgICBfcmVzb3VyY2VGb3JOYW1lc3BhY2UucHV0KGFjdHVhbE5hbWVzcGFjZSwgcmVzb3VyY2UpOwotICAgICAgICByZXNvdXJjZS5zZXROYW1lc3BhY2UoYWN0dWFsTmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzaGFEaWdlc3RGb3JGaWxlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBEaWdlc3RJbnB1dFN0cmVhbSBzdHIgPSBkaWdlc3RJbnB1dFN0cmVhbShpbnB1dFN0cmVhbUZvckZpbGUoZmlsZW5hbWUpKTsKLQotICAgICAgICBieXRlW10gZHVtbXkgPSBuZXcgYnl0ZVs0MDk2XTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPiAwOyBpID0gc3RyLnJlYWQoZHVtbXkpKTsKLQotICAgICAgICBzdHIuY2xvc2UoKTsKLQotICAgICAgICByZXR1cm4gSGV4QmluLmJ5dGVzVG9TdHJpbmcoc3RyLmdldE1lc3NhZ2VEaWdlc3QoKS5kaWdlc3QoKSk7Ci0gICAgfQotCi0gICAgLy8gU09NRSBNRVRIT0RTIFRPIE9WRVJSSURFID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SW5kZXhGaWxlbmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gIi4veHNkb3dubG9hZC54bWwiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYURpcigpCi0gICAgewotICAgICAgICByZXR1cm4gIi4vc2NoZW1hIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9kdWNlcyBkaWFnbm9zdGljIG1lc3NhZ2VzIHN1Y2ggYXMgImRvd25sb2FkaW5nIFggdG8gZmlsZSBZIi4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCB3YXJuaW5nKFN0cmluZyBtc2cpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBmaWxlbmFtZSBleGlzdHMuICBUaGUgZmlsZW5hbWVzCi0gICAgICogYXJlIG9mIHRoZSBmb3JtICIvZm9vL2Jhci96ZWUueHNkIiBhbmQgc2hvdWxkIGJlIGNvbnN0cnVlZAotICAgICAqIGFzIHJvb3RlZCBhdCB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdC4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBmaWxlRXhpc3RzKFN0cmluZyBmaWxlbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkYXRhIGluIHRoZSBnaXZlbiBmaWxlbmFtZSBhcyBhbiBJbnB1dFN0cmVhbS4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW1Gb3JGaWxlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGFuIGVudGlyZSBmaWxlIGluIG9uZSBzdGVwLiAgQW4gSW5wdXRTdHJlYW0gaXMgcGFzc2VkIGFuZAotICAgICAqIGNvcGllZCB0byB0aGUgZmlsZS4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCB3cml0ZUlucHV0U3RyZWFtVG9GaWxlKElucHV0U3RyZWFtIGlucHV0LCBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgYSBmaWxlLiAgU29tZXRpbWVzIGltbWVkaWF0ZWx5IGFmdGVyIHdyaXRpbmcgYSBuZXcgZmlsZQotICAgICAqIHdlIG5vdGljZSB0aGF0IGl0J3MgZXhhY3RseSB0aGUgc2FtZSBhcyBhbiBleGlzdGluZyBmaWxlIGFuZAotICAgICAqIHdlIGRlbGV0ZSBpdC4gV2UgbmV2ZXIgZGVsZXRlIGEgZmlsZSB0aGF0IHdhcyBnaXZlbiB0byB1cwotICAgICAqIGJ5IHRoZSB1c2VyLgotICAgICAqLwotICAgIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGRlbGV0ZUZpbGUoU3RyaW5nIGZpbGVuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgWFNEIGZpbGVzbmFtZXMgaW4gdGhlIHByb2plY3QuCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZ1tdIGdldEFsbFhTREZpbGVuYW1lcygpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvQ29kZUdlblV0aWwuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0NvZGVHZW5VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYzczNzAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvQ29kZUdlblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ29kZUdlblV0aWwKLXsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX01FTV9TVEFSVCA9ICI4bSI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9NRU1fTUFYID0gIjI1Nm0iOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfQ09NUElMRVIgPSAiamF2YWMiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfSkFSID0gImphciI7Ci0KLSAgICAvL3dvcmthcm91bmQgZm9yIFN1biBidWcgIyA0NzIzNzI2Ci0gICAgcHVibGljIHN0YXRpYyBVUkkgcmVzb2x2ZShVUkkgYmFzZSwgVVJJIGNoaWxkKQotICAgIHsKLSAgICAgICAgVVJJIHJ1cmkgPSBiYXNlLnJlc29sdmUoY2hpbGQpOwotICAgICAgICAKLSAgICAgICAgLy9maXggdXAgbm9ybWFsaXphdGlvbiBidWcKLSAgICAgICAgaWYgKCJmaWxlIi5lcXVhbHMocnVyaS5nZXRTY2hlbWUoKSkgJiYgISBjaGlsZC5lcXVhbHMocnVyaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChiYXNlLmdldFBhdGgoKS5zdGFydHNXaXRoKCIvLyIpICYmICFydXJpLmdldFBhdGgoKS5zdGFydHNXaXRoKCIvLyIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gIi8vLyIuY29uY2F0KHJ1cmkuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJ1cmkgPSBuZXcgVVJJKCJmaWxlIiwgbnVsbCwgcGF0aCwgcnVyaS5nZXRRdWVyeSgpLCBydXJpLmdldEZyYWdtZW50KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaChVUklTeW50YXhFeGNlcHRpb24gdXJpcykKLSAgICAgICAgICAgICAgICB7fQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBydXJpOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdm9pZCBhZGRBbGxKYXZhRmlsZXMoTGlzdCBzcmNGaWxlcywgTGlzdCBhcmdzKQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc3JjRmlsZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmID0gKEZpbGUpaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIWYuaXNEaXJlY3RvcnkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcmdzLmFkZChxdW90ZUFuZEVzY2FwZUZpbGVuYW1lKGYuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMaXN0IGluc2lkZSA9IChBcnJheXMuYXNMaXN0KGYubGlzdEZpbGVzKAotICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZUZpbHRlcigpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKGZpbGUuaXNGaWxlKCkgJiYgZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXZhIikpIHx8IGZpbGUuaXNEaXJlY3RvcnkoKTsgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKSkpOwotICAgICAgICAgICAgICAgIGFkZEFsbEphdmFGaWxlcyhpbnNpZGUsIGFyZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHByaXZhdGUgU3RyaW5nIHF1b3RlQW5kRXNjYXBlRmlsZW5hbWUoU3RyaW5nIGZpbGVuYW1lKQotICAgIHsKLSAgICAgICAgLy8gZG9uJ3QgcXVvdGUgaWYgdGhlcmUncyBubyBzcGFjZQotICAgICAgICBpZiAoZmlsZW5hbWUuaW5kZXhPZigiICIpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZTsKLQotICAgICAgICAvLyBiaXphcnJlLiAgamF2YWMgZXhwZWN0cyBiYWNrc2xhc2ggZXNjYXBpbmcgaWYgd2UgcXVvdGUgdGhlIGNsYXNzcGF0aAotICAgICAgICAvLyBiaXphcnJlIGFsc28uICByZXBsYWNlQWxsIGV4cGVjdHMgcmVwbGFjZW1lbnQgYmFja3NsYXNoZXMgdG8gYmUgZG91YmxlIGVzY2FwZWQuCi0gICAgICAgIHJldHVybiAiXCIiICsgZmlsZW5hbWUucmVwbGFjZUFsbCgiXFxcXCIsICJcXFxcXFxcXCIpICsgIlwiIjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgcXVvdGVOb0VzY2FwZUZpbGVuYW1lKFN0cmluZyBmaWxlbmFtZSkKLSAgICB7Ci0gICAgICAgIC8vIGRvbid0IHF1b3RlIGlmIHRoZXJlJ3Mgbm8gc3BhY2UsIGFuZCBkb24ndCBxdW90ZSBvbiBsaW51eAotICAgICAgICBpZiAoZmlsZW5hbWUuaW5kZXhPZigiICIpIDwgMCB8fCBGaWxlLnNlcGFyYXRvckNoYXIgPT0gJy8nKQotICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lOwotCi0gICAgICAgIHJldHVybiAiXCIiICsgZmlsZW5hbWUgKyAiXCIiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMgamF2YWMgb24gdGhlIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXMgaW4gb3JkZXIgdG8gdHVybiB0aGVtCi0gICAgICogaW50byBiaW5hcnkgZmlsZXMgaW4gdGhlIG91dHB1dCBkaXJlY3RvcnkuICBUaGlzIHdpbGwgcmV0dXJuIGEgbGlzdCBvZgotICAgICAqIDxjb2RlPkdlbkZpbGU8L2NvZGU+cyBmb3IgYWxsIG9mIHRoZSBjbGFzc2VzIHByb2R1Y2VkIG9yIG51bGwgaWYgYW4KLSAgICAgKiBlcnJvciBvY2N1cnJlZC4KLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBib29sZWFuIGV4dGVybmFsQ29tcGlsZShMaXN0IHNyY0ZpbGVzLCBGaWxlIG91dGRpciwgRmlsZVtdIGNwLCBib29sZWFuIGRlYnVnKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGV4dGVybmFsQ29tcGlsZShzcmNGaWxlcywgb3V0ZGlyLCBjcCwgZGVidWcsIERFRkFVTFRfQ09NUElMRVIsIERFRkFVTFRfTUVNX1NUQVJULCBERUZBVUxUX01FTV9NQVgsIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyBqYXZhYyBvbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcyBpbiBvcmRlciB0byB0dXJuIHRoZW0KLSAgICAgKiBpbnRvIGJpbmFyeSBmaWxlcyBpbiB0aGUgb3V0cHV0IGRpcmVjdG9yeS4gIFRoaXMgd2lsbCByZXR1cm4gYSBsaXN0IG9mCi0gICAgICogPGNvZGU+R2VuRmlsZTwvY29kZT5zIGZvciBhbGwgb2YgdGhlIGNsYXNzZXMgcHJvZHVjZWQgb3IgbnVsbCBpZiBhbgotICAgICAqIGVycm9yIG9jY3VycmVkLgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBleHRlcm5hbENvbXBpbGUoTGlzdCBzcmNGaWxlcywgRmlsZSBvdXRkaXIsIEZpbGVbXSBjcCwgYm9vbGVhbiBkZWJ1ZywgU3RyaW5nIGphdmFjUGF0aCwgU3RyaW5nIG1lbVN0YXJ0LCBTdHJpbmcgbWVtTWF4LCAgYm9vbGVhbiBxdWlldCwgYm9vbGVhbiB2ZXJib3NlKQotICAgIHsKLSAgICAgICAgTGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIEZpbGUgamF2YWMgPSBmaW5kSmF2YVRvb2woamF2YWNQYXRoID09IG51bGwgPyBERUZBVUxUX0NPTVBJTEVSIDogamF2YWNQYXRoKTsKLSAgICAgICAgYXNzZXJ0IChqYXZhYy5leGlzdHMoKSkgOiAiY29tcGlsZXIgbm90IGZvdW5kICIgKyBqYXZhYzsKLSAgICAgICAgYXJncy5hZGQoamF2YWMuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0gICAgICAgIGlmIChvdXRkaXIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0ZGlyID0gbmV3IEZpbGUoIi4iKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFyZ3MuYWRkKCItZCIpOwotICAgICAgICAgICAgYXJncy5hZGQocXVvdGVBbmRFc2NhcGVGaWxlbmFtZShvdXRkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjcCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBjcCA9IHN5c3RlbUNsYXNzcGF0aCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNwLmxlbmd0aCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBjbGFzc1BhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAvLyBBZGQgdGhlIG91dHB1dCBkaXJlY3RvcnkgdG8gdGhlIGNsYXNzcGF0aC4gIFdlIGRvIHRoaXMgc28gdGhhdAotICAgICAgICAgICAgLy8gamF2YWMgd2lsbCBiZSBhYmxlIHRvIGZpbmQgY2xhc3NlcyB0aGF0IHdlcmUgY29tcGlsZWQKLSAgICAgICAgICAgIC8vIHByZXZpb3VzbHkgYnV0IGFyZSBub3QgaW4gdGhlIGxpc3Qgb2Ygc291cmNlcyB0aGlzIHRpbWUuCi0gICAgICAgICAgICBjbGFzc1BhdGguYXBwZW5kKG91dGRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLSAgICAgICAgICAgIC8vIEFkZCBldmVyeXRoaW5nIG9uIG91ciBjbGFzc3BhdGguCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNsYXNzUGF0aC5hcHBlbmQoRmlsZS5wYXRoU2VwYXJhdG9yKTsKLSAgICAgICAgICAgICAgICBjbGFzc1BhdGguYXBwZW5kKGNwW2ldLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXJncy5hZGQoIi1jbGFzc3BhdGgiKTsKLQotICAgICAgICAgICAgLy8gYml6YXJyZS4gIGphdmFjIGV4cGVjdHMgYmFja3NsYXNoIGVzY2FwaW5nIGlmIHdlIHF1b3RlIHRoZSBjbGFzc3BhdGgKLSAgICAgICAgICAgIGFyZ3MuYWRkKHF1b3RlQW5kRXNjYXBlRmlsZW5hbWUoY2xhc3NQYXRoLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFyZ3MuYWRkKCItc291cmNlIik7Ci0gICAgICAgIGFyZ3MuYWRkKCIxLjQiKTsKLQotICAgICAgICBhcmdzLmFkZChkZWJ1ZyA/ICItZyIgOiAiLWc6bm9uZSIpOwotCi0gICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgYXJncy5hZGQoIi12ZXJib3NlIik7Ci0KLSAgICAgICAgYWRkQWxsSmF2YUZpbGVzKHNyY0ZpbGVzLCBhcmdzKTsKLQotICAgICAgICBGaWxlIGNsRmlsZSA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBjbEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJqYXZhYyIsICIiKTsKLSAgICAgICAgICAgIEZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcihjbEZpbGUpOwotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IGFyZ3MuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGZvciAoaS5uZXh0KCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYXJnID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBmdy53cml0ZShhcmcpOwotICAgICAgICAgICAgICAgIGZ3LndyaXRlKCdcbicpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZncuY2xvc2UoKTsKLSAgICAgICAgICAgIExpc3QgbmV3YXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIG5ld2FyZ3MuYWRkKGFyZ3MuZ2V0KDApKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1lbVN0YXJ0ICE9IG51bGwgJiYgbWVtU3RhcnQubGVuZ3RoKCkgIT0gMCkKLSAgICAgICAgICAgICAgICBuZXdhcmdzLmFkZCgiLUotWG1zIiArIG1lbVN0YXJ0KTsKLSAgICAgICAgICAgIGlmIChtZW1NYXggIT0gbnVsbCAmJiBtZW1NYXgubGVuZ3RoKCkgIT0gMCkKLSAgICAgICAgICAgICAgICBuZXdhcmdzLmFkZCgiLUotWG14IiArIG1lbU1heCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG5ld2FyZ3MuYWRkKCJAIiArIGNsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICBhcmdzID0gbmV3YXJnczsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ291bGQgbm90IGNyZWF0ZSBjb21tYW5kLWxpbmUgZmlsZSBmb3IgamF2YWMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBzdHJBcmdzID0gKFN0cmluZ1tdKSBhcmdzLnRvQXJyYXkobmV3IFN0cmluZ1thcmdzLnNpemUoKV0pOwotCi0gICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJjb21waWxlIGNvbW1hbmQ6Iik7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJBcmdzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIiArIHN0ckFyZ3NbaV0pOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBQcm9jZXNzIHByb2MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKHN0ckFyZ3MpOwotCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgZXJyb3JCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgb3V0cHV0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgICAgICBUaHJlYWRlZFJlYWRlciBvdXQgPSBuZXcgVGhyZWFkZWRSZWFkZXIocHJvYy5nZXRJbnB1dFN0cmVhbSgpLCBvdXRwdXRCdWZmZXIpOwotICAgICAgICAgICAgVGhyZWFkZWRSZWFkZXIgZXJyID0gbmV3IFRocmVhZGVkUmVhZGVyKHByb2MuZ2V0RXJyb3JTdHJlYW0oKSwgZXJyb3JCdWZmZXIpOwotCi0gICAgICAgICAgICBwcm9jLndhaXRGb3IoKTsKLQotICAgICAgICAgICAgaWYgKHZlcmJvc2UgfHwgcHJvYy5leGl0VmFsdWUoKSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihvdXRwdXRCdWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGVycm9yQnVmZmVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZXJyb3JCdWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIuZmx1c2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHByb2MuZXhpdFZhbHVlKCkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZS5nZXRDYXVzZSgpKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNsRmlsZSAhPSBudWxsKQotICAgICAgICAgICAgY2xGaWxlLmRlbGV0ZSgpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRmlsZVtdIHN5c3RlbUNsYXNzcGF0aCgpCi0gICAgewotICAgICAgICBMaXN0IGNwID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTdHJpbmdbXSBzeXN0ZW1jcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIikuc3BsaXQoRmlsZS5wYXRoU2VwYXJhdG9yKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzeXN0ZW1jcC5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgY3AuYWRkKG5ldyBGaWxlKHN5c3RlbWNwW2ldKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChGaWxlW10pY3AudG9BcnJheShuZXcgRmlsZVtjcC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIGJvb2xlYW4gZXh0ZXJuYWxKYXIoRmlsZSBzcmNkaXIsIEZpbGUgb3V0ZmlsZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBleHRlcm5hbEphcihzcmNkaXIsIG91dGZpbGUsIERFRkFVTFRfSkFSLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBleHRlcm5hbEphcihGaWxlIHNyY2RpciwgRmlsZSBvdXRmaWxlLCBTdHJpbmcgamFyUGF0aCwgYm9vbGVhbiBxdWlldCwgYm9vbGVhbiB2ZXJib3NlKQotICAgIHsKLSAgICAgICAgTGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIEZpbGUgamFyID0gZmluZEphdmFUb29sKGphclBhdGggPT0gbnVsbCA/IERFRkFVTFRfSkFSIDogamFyUGF0aCk7Ci0gICAgICAgIGFzc2VydCAoamFyLmV4aXN0cygpKSA6ICJqYXIgbm90IGZvdW5kICIgKyBqYXI7Ci0gICAgICAgIGFyZ3MuYWRkKGphci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLSAgICAgICAgYXJncy5hZGQoImNmIiArICh2ZXJib3NlID8gInYiIDogIiIpKTsKLSAgICAgICAgYXJncy5hZGQocXVvdGVOb0VzY2FwZUZpbGVuYW1lKG91dGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQotICAgICAgICBhcmdzLmFkZCgiLUMiKTsKLSAgICAgICAgYXJncy5hZGQocXVvdGVOb0VzY2FwZUZpbGVuYW1lKHNyY2Rpci5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCi0gICAgICAgIGFyZ3MuYWRkKCIuIik7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHN0ckFyZ3MgPSAoU3RyaW5nW10pIGFyZ3MudG9BcnJheShuZXcgU3RyaW5nW2FyZ3Muc2l6ZSgpXSk7Ci0KLSAgICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoImphciBjb21tYW5kOiIpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyQXJncy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICIgKyBzdHJBcmdzW2ldKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgUHJvY2VzcyBwcm9jID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhzdHJBcmdzKTsKLQotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGVycm9yQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIG91dHB1dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgVGhyZWFkZWRSZWFkZXIgb3V0ID0gbmV3IFRocmVhZGVkUmVhZGVyKHByb2MuZ2V0SW5wdXRTdHJlYW0oKSwgb3V0cHV0QnVmZmVyKTsKLSAgICAgICAgICAgIFRocmVhZGVkUmVhZGVyIGVyciA9IG5ldyBUaHJlYWRlZFJlYWRlcihwcm9jLmdldEVycm9yU3RyZWFtKCksIGVycm9yQnVmZmVyKTsKLQotICAgICAgICAgICAgcHJvYy53YWl0Rm9yKCk7Ci0KLSAgICAgICAgICAgIGlmICh2ZXJib3NlIHx8IHByb2MuZXhpdFZhbHVlKCkgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ob3V0cHV0QnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlcnJvckJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGVycm9yQnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByb2MuZXhpdFZhbHVlKCkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9vayBmb3IgdG9vbCBpbiBjdXJyZW50IGRpcmVjdG9yeSBhbmQgJHtKQVZBX0hPTUV9Ly4uL2JpbiBhbmQKLSAgICAgKiB0cnkgd2l0aCAuZXhlIGZpbGUgZXh0ZW5zaW9uLgotICAgICAqLyAKLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIGZpbmRKYXZhVG9vbChTdHJpbmcgdG9vbCkKLSAgICB7Ci0gICAgICAgIEZpbGUgdG9vbEZpbGUgPSBuZXcgRmlsZSh0b29sKTsKLSAgICAgICAgaWYgKHRvb2xGaWxlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdG9vbEZpbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlIHJlc3VsdCA9IG5ldyBGaWxlKHRvb2wgKyAiLmV4ZSIpOwotICAgICAgICBpZiAocmVzdWx0LmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgaG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIik7Ci0KLSAgICAgICAgU3RyaW5nIHNlcCAgPSBGaWxlLnNlcGFyYXRvcjsKLSAgICAgICAgcmVzdWx0ID0gbmV3IEZpbGUoaG9tZSArIHNlcCArICIuLiIgKyBzZXAgKyAiYmluIiwgdG9vbCk7Ci0gICAgICAgIAotICAgICAgICBpZiAocmVzdWx0LmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXN1bHQgPSBuZXcgRmlsZShyZXN1bHQuZ2V0UGF0aCgpICsgIi5leGUiKTsKLSAgICAgICAgaWYgKHJlc3VsdC5pc0ZpbGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdCA9IG5ldyBGaWxlKGhvbWUgKyBzZXAgKyAiYmluIiwgdG9vbCk7Ci0gICAgICAgIGlmIChyZXN1bHQuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQgPSBuZXcgRmlsZShyZXN1bHQuZ2V0UGF0aCgpICsgIi5leGUiKTsKLSAgICAgICAgaWYgKHJlc3VsdC5pc0ZpbGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGp1c3QgcmV0dXJuIHRoZSBvcmlnaW5hbCB0b29sRmlsZSBhbmQgaG9wZSB0aGF0IGl0IGlzIG9uIHRoZSBQQVRILgotICAgICAgICByZXR1cm4gdG9vbEZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgdGhlIGdpdmVuIGlucHV0IHN0cmVhbSBpbnRvIHRoZSBnaXZlbiBidWZmZXIgdW50aWwgdGhlcmUgaXMKLSAgICAgKiBub3RoaW5nIGxlZnQgdG8gcmVhZC4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHJpdmF0ZSBjbGFzcyBUaHJlYWRlZFJlYWRlcgotICAgIHsKLSAgICAgICAgcHVibGljIFRocmVhZGVkUmVhZGVyKElucHV0U3RyZWFtIHN0cmVhbSwgZmluYWwgU3RyaW5nQnVmZmVyIG91dHB1dCkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0KLSAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSkpOwotCi0gICAgICAgICAgICBUaHJlYWQgcmVhZGVyVGhyZWFkID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzOwotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChzID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZChzICsgIlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICB7fQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgcmVhZGVyVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9Db21tYW5kTGluZS5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvQ29tbWFuZExpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUyYWUzNy4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9Db21tYW5kTGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLklPVXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZExpbmUKLXsKLSAgICBwdWJsaWMgQ29tbWFuZExpbmUoU3RyaW5nW10gYXJncywgQ29sbGVjdGlvbiBzY2hlbWUpCi0gICAgewotICAgICAgICBfb3B0aW9ucyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIEFycmF5TGlzdCBlbmRhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFyZ3NbaV0uaW5kZXhPZignLScpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG9wdCA9IGFyZ3NbaV0uc3Vic3RyaW5nKDEpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWwgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChzY2hlbWUgIT0gbnVsbCAmJiBzY2hlbWUuY29udGFpbnMob3B0KSAmJiBpIDwgYXJncy5sZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgIHZhbCA9IGFyZ3NbKytpXTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHZhbCA9ICIiOwotCi0gICAgICAgICAgICAgICAgX29wdGlvbnMucHV0KG9wdCwgdmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbmRhcmdzLmFkZChhcmdzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIF9hcmdzID0gKFN0cmluZ1tdKWVuZGFyZ3MudG9BcnJheShuZXcgU3RyaW5nW2VuZGFyZ3Muc2l6ZSgpXSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludExpY2Vuc2UoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIElPVXRpbC5jb3B5Q29tcGxldGVseShDb21tYW5kTGluZS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlQXNTdHJlYW0oImxpY2Vuc2UudHh0IiksIFN5c3RlbS5vdXQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMaWNlbnNlIGF2YWlsYWJsZSBpbiB0aGlzIEpBUiBpbiBsaWNlbnNlLnR4dCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXAgX29wdGlvbnM7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBfYXJnczsKLQotICAgIHB1YmxpYyBTdHJpbmdbXSBhcmdzKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbX2FyZ3MubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShfYXJncywgMCwgcmVzdWx0LCAwLCBfYXJncy5sZW5ndGgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3B0KFN0cmluZyBvcHQpCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZylfb3B0aW9ucy5nZXQob3B0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0IGNvbGxlY3RGaWxlcyhGaWxlW10gZGlycykKLSAgICB7Ci0gICAgICAgIExpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmID0gZGlyc1tpXTsKLSAgICAgICAgICAgIGlmICghZi5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbGVzLmFkZChmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWxlcy5hZGRBbGwoY29sbGVjdEZpbGVzKGYubGlzdEZpbGVzKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmlsZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0IF9maWxlczsKLSAgICBwcml2YXRlIEZpbGUgX2Jhc2VEaXI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVtdIEVNUFRZX0ZJTEVBUlJBWSA9IG5ldyBGaWxlWzBdOwotCi0gICAgcHJpdmF0ZSBMaXN0IGdldEZpbGVMaXN0KCkKLSAgICB7Ci0gICAgICAgIGlmIChfZmlsZXMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nW10gYXJncyA9IGFyZ3MoKTsKLSAgICAgICAgICAgIEZpbGVbXSBmaWxlcyA9IG5ldyBGaWxlW2FyZ3MubGVuZ3RoXTsKLSAgICAgICAgICAgIGJvb2xlYW4gbm9CYXNlRGlyID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmlsZXNbaV0gPSBuZXcgRmlsZShhcmdzW2ldKTsKLSAgICAgICAgICAgICAgICBpZiAoIW5vQmFzZURpciAmJiAoX2Jhc2VEaXIgPT0gbnVsbCkpIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBfYmFzZURpciA9IGZpbGVzW2ldOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBfYmFzZURpciA9IGZpbGVzW2ldLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVVJJIGN1cnJVcmkgPSBmaWxlc1tpXS50b1VSSSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gR2l2ZSB1cCBvbiB0aGUgYmFzZWRpci4gVGhlcmUgbWF5IGJlIG5vbmUKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9iYXNlRGlyICE9IG51bGwgJiYgX2Jhc2VEaXIudG9VUkkoKS5yZWxhdGl2aXplKGN1cnJVcmkpLmVxdWFscyhjdXJyVXJpKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX2Jhc2VEaXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgbm9CYXNlRGlyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9maWxlcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoY29sbGVjdEZpbGVzKGZpbGVzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIF9maWxlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZVtdIGdldEZpbGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRmlsZVtdKWdldEZpbGVMaXN0KCkudG9BcnJheShFTVBUWV9GSUxFQVJSQVkpOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldEJhc2VEaXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9iYXNlRGlyOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlW10gZmlsZXNFbmRpbmdXaXRoKFN0cmluZyBleHQpCi0gICAgewotICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RmlsZUxpc3QoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIGYgPSAoRmlsZSlpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChmLmdldE5hbWUoKS5lbmRzV2l0aChleHQpKQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChGaWxlW10pcmVzdWx0LnRvQXJyYXkoRU1QVFlfRklMRUFSUkFZKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9FeHRlbnNpb24uamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0V4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTVmYzE5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0V4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0KLSAvKioKLSAgKiBBbiBleHRlbnNpb24gaXMgYSBqYXZhYmVhbiB0aGF0IHJlcHJlc2VudHMgYSBTY2hlbWFDb21waWxlckV4dGVuc2lvbiB0byBiZSBwYXNzZWQgZm9yIGNhbGxiYWNrIGludG8gdGhlCi0gICogIFhtbEJlYW5zIFNjaGVtYSBDb21waWxlci4KLSAgKi8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb24gewotICAgICAgICBwcml2YXRlIENsYXNzIGNsYXNzTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBMaXN0IHBhcmFtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBwdWJsaWMgQ2xhc3MgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShDbGFzcyBjbGFzc05hbWUpIHsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBMaXN0IGdldFBhcmFtcygpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJhbXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUGFyYW0gY3JlYXRlUGFyYW0oKSB7Ci0gICAgICAgICAgICBQYXJhbSBwID0gbmV3IFBhcmFtKCk7Ci0gICAgICAgICAgICBwYXJhbXMuYWRkKHApOwotICAgICAgICAgICAgcmV0dXJuIHA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQSBQYXJhbSBpcyBqdXN0IGEgbmFtZSB2YWx1ZSBwYWlyIGFwcGxpY2FibGUgdG8gdGhlIGV4dGVuc2lvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBjbGFzcyBQYXJhbSB7Ci0gICAgICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvRmFjdG9ySW1wb3J0cy5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvRmFjdG9ySW1wb3J0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDAyMGVlLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0ZhY3RvckltcG9ydHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlRvcExldmVsQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5Ub3BMZXZlbFNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5Ub3BMZXZlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5Ub3BMZXZlbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLk5hbWVkR3JvdXA7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5OYW1lZEF0dHJpYnV0ZUdyb3VwOwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuRm9ybUNob2ljZTsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkluY2x1ZGVEb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBUaGlzIHByb2dyYW0gdGFrZXMgYSBjb2xsZWN0aW9uIG9mIC54c2QgZmlsZXMgYXMgaW5wdXQsIGZpbmRzIGFsbCBkdXBsaWNhdGUKLSAqIG5hbWUgZGVmaW5pdGlvbnMsIGFuZCBmYWN0b3JzIG91dCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgZWFjaCBvZiB0aG9zZSBpbnRvCi0gKiBhIGNvbW1vbi54c2QgZmlsZSwgYWRkaW5nIGFuIGFwcHJvcHJpYXRlIDxpbXBvcnQ+IHN0YXRlbWVudCBpbiB0aGUgb3JpZ2luYWwKLSAqIHhzZCBmaWxlLgotICovIAotcHVibGljIGNsYXNzIEZhY3RvckltcG9ydHMKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb21tYW5kTGluZSBjbCA9IG5ldyBDb21tYW5kTGluZShhcmdzLCBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ImltcG9ydCIsICJvdXQifSkpOwotICAgICAgICBpZiAoY2wuZ2V0T3B0KCJsaWNlbnNlIikgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29tbWFuZExpbmUucHJpbnRMaWNlbnNlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGFyZ3MgPSBjbC5hcmdzKCk7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlZmFjdG9ycyBhIGRpcmVjdG9yeSBvZiAueHNkIGZpbGVzIHRvIHJlbW92ZSBuYW1lIGNvbmZsaWN0cyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZToiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2ZhY3RvciBbLWltcG9ydCBjb21tb24ueHNkXSBbLW91dCBvdXRwdXRkaXJdIGlucHV0ZGlyIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiB3aGVyZSBpbnB1dGRpciBpcyBhIGRpcmVjdG9yeSBjb250YWluaW5nIC54c2QgZmlsZXMiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIGFuZCBvdXRwdXRkaXIgaXMgYSBkaXJlY3RvcnkgaW50byB3aGljaCBuZXcgeHNkIGZpbGVzLCIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgcGx1cyBhIGNvbW1vbmx5IGltcG9ydGVkIGNvbW1vbi54c2QsIGlzIHBsYWNlZC4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIC1saWNlbnNlIHByaW50cyBsaWNlbnNlIGluZm9ybWF0aW9uIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGNvbW1vbk5hbWUgPSBjbC5nZXRPcHQoImltcG9ydCIpOwotICAgICAgICBpZiAoY29tbW9uTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgY29tbW9uTmFtZSA9ICJjb21tb24ueHNkIjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBvdXQgPSBjbC5nZXRPcHQoIm91dCIpOwotICAgICAgICBpZiAob3V0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgb3V0cHV0IGRpcmVjdG9yeSAnb3V0JyIpOwotICAgICAgICAgICAgb3V0ID0gIm91dCI7Ci0gICAgICAgIH0KLSAgICAgICAgRmlsZSBvdXRkaXIgPSBuZXcgRmlsZShvdXQpOwotICAgICAgICBGaWxlIGJhc2VkaXIgPSBuZXcgRmlsZShhcmdzWzBdKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGZpcnN0LCBwYXJzZSBhbGwgdGhlIHNjaGVtYSBmaWxlcwotICAgICAgICBGaWxlW10gZmlsZXMgPSBjbC5nZXRGaWxlcygpOwotICAgICAgICBNYXAgc2NoZW1hRG9jcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIFNldCBlbGVtZW50TmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBTZXQgYXR0cmlidXRlTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBTZXQgdHlwZU5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgU2V0IG1vZGVsR3JvdXBOYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIFNldCBhdHRyR3JvdXBOYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIAotICAgICAgICBTZXQgZHVwZUVsZW1lbnROYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIFNldCBkdXBlQXR0cmlidXRlTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBTZXQgZHVwZVR5cGVOYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIFNldCBkdXBlTW9kZWxHcm91cE5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgU2V0IGR1cGVBdHRyR3JvdXBOYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIFNldCBkdXBlTmFtZXNwYWNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBsb2FkIHNjaGVtYQotICAgICAgICAgICAgICAgIFNjaGVtYURvY3VtZW50IGRvYyA9IFNjaGVtYURvY3VtZW50LkZhY3RvcnkucGFyc2UoZmlsZXNbaV0pOwotICAgICAgICAgICAgICAgIHNjaGVtYURvY3MucHV0KGRvYywgZmlsZXNbaV0pOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHdhcm4gYWJvdXQgZm9yIGltcG9ydHMsIGluY2x1ZGVzCi0gICAgICAgICAgICAgICAgaWYgKGRvYy5nZXRTY2hlbWEoKS5zaXplT2ZJbXBvcnRBcnJheSgpID4gMCB8fCBkb2MuZ2V0U2NoZW1hKCkuc2l6ZU9mSW5jbHVkZUFycmF5KCkgPiAwKQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIndhcm5pbmc6ICIgKyBmaWxlc1tpXSArICIgY29udGFpbnMgaW1wb3J0cyBvciBpbmNsdWRlcyB0aGF0IGFyZSBiZWluZyBpZ25vcmVkLiIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgdG9nZXRoZXIgbmFtZXMKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZG9jLmdldFNjaGVtYSgpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gIiI7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVG9wTGV2ZWxDb21wbGV4VHlwZSBjdFtdID0gZG9jLmdldFNjaGVtYSgpLmdldENvbXBsZXhUeXBlQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGN0Lmxlbmd0aDsgaisrKQotICAgICAgICAgICAgICAgICAgICBub3RlTmFtZShjdFtqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgdHlwZU5hbWVzLCBkdXBlVHlwZU5hbWVzLCBkdXBlTmFtZXNwYWNlcyk7Ci0KLSAgICAgICAgICAgICAgICBUb3BMZXZlbFNpbXBsZVR5cGUgc3RbXSA9IGRvYy5nZXRTY2hlbWEoKS5nZXRTaW1wbGVUeXBlQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHN0Lmxlbmd0aDsgaisrKQotICAgICAgICAgICAgICAgICAgICBub3RlTmFtZShzdFtqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgdHlwZU5hbWVzLCBkdXBlVHlwZU5hbWVzLCBkdXBlTmFtZXNwYWNlcyk7Ci0KLSAgICAgICAgICAgICAgICBUb3BMZXZlbEVsZW1lbnQgZWxbXSA9IGRvYy5nZXRTY2hlbWEoKS5nZXRFbGVtZW50QXJyYXkoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVsLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgICAgICAgICBub3RlTmFtZShlbFtqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgZWxlbWVudE5hbWVzLCBkdXBlRWxlbWVudE5hbWVzLCBkdXBlTmFtZXNwYWNlcyk7Ci0KLSAgICAgICAgICAgICAgICBUb3BMZXZlbEF0dHJpYnV0ZSBhdFtdID0gZG9jLmdldFNjaGVtYSgpLmdldEF0dHJpYnV0ZUFycmF5KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhdC5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICAgICAgbm90ZU5hbWUoYXRbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIGF0dHJpYnV0ZU5hbWVzLCBkdXBlQXR0cmlidXRlTmFtZXMsIGR1cGVOYW1lc3BhY2VzKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBOYW1lZEdyb3VwIGdyW10gPSBkb2MuZ2V0U2NoZW1hKCkuZ2V0R3JvdXBBcnJheSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZ3IubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgICAgICAgIG5vdGVOYW1lKGdyW2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCBtb2RlbEdyb3VwTmFtZXMsIGR1cGVNb2RlbEdyb3VwTmFtZXMsIGR1cGVOYW1lc3BhY2VzKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBOYW1lZEF0dHJpYnV0ZUdyb3VwIGFnW10gPSBkb2MuZ2V0U2NoZW1hKCkuZ2V0QXR0cmlidXRlR3JvdXBBcnJheSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYWcubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgICAgICAgIG5vdGVOYW1lKGFnW2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCBhdHRyR3JvdXBOYW1lcywgZHVwZUF0dHJHcm91cE5hbWVzLCBkdXBlTmFtZXNwYWNlcyk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ3YXJuaW5nOiAiICsgZmlsZXNbaV0gKyAiIGlzIG5vdCBhIHNjaGVtYSBmaWxlIC0gIiArIGUuZ2V0RXJyb3IoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVW5hYmxlIHRvIGxvYWQgIiArIGZpbGVzW2ldICsgIiAtICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoc2NoZW1hRG9jcy5zaXplKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJObyBzY2hlbWEgZmlsZXMgZm91bmQuIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGR1cGVUeXBlTmFtZXMuc2l6ZSgpICsgZHVwZUVsZW1lbnROYW1lcy5zaXplKCkgKyBkdXBlQXR0cmlidXRlTmFtZXMuc2l6ZSgpICsKLSAgICAgICAgICAgICAgICBkdXBlTW9kZWxHcm91cE5hbWVzLnNpemUoKSArIGR1cGVBdHRyR3JvdXBOYW1lcy5zaXplKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJObyBkdXBsaWNhdGUgbmFtZXMgZm91bmQuIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gY3JlYXRlIGEgc2NoZW1hIGRvYyBmb3IgZWFjaCBuYW1lc3BhY2UgdG8gYmUgaW1wb3J0ZWQKLSAgICAgICAgTWFwIGNvbW1vbkRvY3MgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBNYXAgY29tbW9uRmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBpbnQgY291bnQgPSBkdXBlTmFtZXNwYWNlcy5zaXplKCkgPT0gMSA/IDAgOiAxOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkdXBlTmFtZXNwYWNlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgIFNjaGVtYURvY3VtZW50IGNvbW1vbkRvYyA9IFNjaGVtYURvY3VtZW50LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScvPiIKLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICBjb21tb25Eb2MuZ2V0U2NoZW1hKCkuc2V0VGFyZ2V0TmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICBjb21tb25Eb2MuZ2V0U2NoZW1hKCkuc2V0RWxlbWVudEZvcm1EZWZhdWx0KEZvcm1DaG9pY2UuUVVBTElGSUVEKTsKLSAgICAgICAgICAgIGNvbW1vbkRvY3MucHV0KG5hbWVzcGFjZSwgY29tbW9uRG9jKTsKLSAgICAgICAgICAgIGNvbW1vbkZpbGVzLnB1dChjb21tb25Eb2MsIGNvbW1vbkZpbGVGb3IoY29tbW9uTmFtZSwgbmFtZXNwYWNlLCBjb3VudCsrLCBvdXRkaXIpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gcHVsbCBvdXQgYWxsIHRoZSBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgYW5kIGRyb3AgdGhlbSBpbnRvIHRoZSBmaWxlCi0gICAgICAgIC8vIHdlIHJldXNlIHRoZSBlbGVtZW50TmFtZXMgKGV0Yykgc2V0cyB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIGRlZmluaXRpb25zCi0gICAgICAgIC8vIHdlIGhhdmUgYWxyZWFkeSBpbnNlcnRlZC4KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc2NoZW1hRG9jcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFEb2N1bWVudCBkb2MgPSAoU2NoZW1hRG9jdW1lbnQpaS5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGNvbGxlY3QgdG9nZXRoZXIgbmFtZXMKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBkb2MuZ2V0U2NoZW1hKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gIiI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNjaGVtYURvY3VtZW50IGNvbW1vbkRvYyA9IChTY2hlbWFEb2N1bWVudCljb21tb25Eb2NzLmdldCh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBib29sZWFuIG5lZWRJbXBvcnQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFRvcExldmVsQ29tcGxleFR5cGUgY3RbXSA9IGRvYy5nZXRTY2hlbWEoKS5nZXRDb21wbGV4VHlwZUFycmF5KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gY3QubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0R1cGxpY2F0ZShjdFtqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgZHVwZVR5cGVOYW1lcykpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChpc0ZpcnN0RHVwbGljYXRlKGN0W2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCB0eXBlTmFtZXMsIGR1cGVUeXBlTmFtZXMpKQotICAgICAgICAgICAgICAgICAgICBjb21tb25Eb2MuZ2V0U2NoZW1hKCkuYWRkTmV3Q29tcGxleFR5cGUoKS5zZXQoY3Rbal0pOwotICAgICAgICAgICAgICAgIG5lZWRJbXBvcnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGRvYy5nZXRTY2hlbWEoKS5yZW1vdmVDb21wbGV4VHlwZShqKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVG9wTGV2ZWxTaW1wbGVUeXBlIHN0W10gPSBkb2MuZ2V0U2NoZW1hKCkuZ2V0U2ltcGxlVHlwZUFycmF5KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHN0Lmxlbmd0aDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghaXNEdXBsaWNhdGUoc3Rbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIGR1cGVUeXBlTmFtZXMpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAoaXNGaXJzdER1cGxpY2F0ZShzdFtqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgdHlwZU5hbWVzLCBkdXBlVHlwZU5hbWVzKSkKLSAgICAgICAgICAgICAgICAgICAgY29tbW9uRG9jLmdldFNjaGVtYSgpLmFkZE5ld1NpbXBsZVR5cGUoKS5zZXQoc3Rbal0pOwotICAgICAgICAgICAgICAgIG5lZWRJbXBvcnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGRvYy5nZXRTY2hlbWEoKS5yZW1vdmVTaW1wbGVUeXBlKGopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUb3BMZXZlbEVsZW1lbnQgZWxbXSA9IGRvYy5nZXRTY2hlbWEoKS5nZXRFbGVtZW50QXJyYXkoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZWwubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0R1cGxpY2F0ZShlbFtqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgZHVwZUVsZW1lbnROYW1lcykpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChpc0ZpcnN0RHVwbGljYXRlKGVsW2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCBlbGVtZW50TmFtZXMsIGR1cGVFbGVtZW50TmFtZXMpKQotICAgICAgICAgICAgICAgICAgICBjb21tb25Eb2MuZ2V0U2NoZW1hKCkuYWRkTmV3RWxlbWVudCgpLnNldChlbFtqXSk7Ci0gICAgICAgICAgICAgICAgbmVlZEltcG9ydCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZG9jLmdldFNjaGVtYSgpLnJlbW92ZUVsZW1lbnQoaik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFRvcExldmVsQXR0cmlidXRlIGF0W10gPSBkb2MuZ2V0U2NoZW1hKCkuZ2V0QXR0cmlidXRlQXJyYXkoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYXQubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0R1cGxpY2F0ZShhdFtqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgZHVwZUF0dHJpYnV0ZU5hbWVzKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRmlyc3REdXBsaWNhdGUoYXRbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIGF0dHJpYnV0ZU5hbWVzLCBkdXBlQXR0cmlidXRlTmFtZXMpKQotICAgICAgICAgICAgICAgICAgICBjb21tb25Eb2MuZ2V0U2NoZW1hKCkuYWRkTmV3RWxlbWVudCgpLnNldChhdFtqXSk7Ci0gICAgICAgICAgICAgICAgbmVlZEltcG9ydCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZG9jLmdldFNjaGVtYSgpLnJlbW92ZUVsZW1lbnQoaik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE5hbWVkR3JvdXAgZ3JbXSA9IGRvYy5nZXRTY2hlbWEoKS5nZXRHcm91cEFycmF5KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGdyLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghaXNEdXBsaWNhdGUoZ3Jbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIGR1cGVNb2RlbEdyb3VwTmFtZXMpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAoaXNGaXJzdER1cGxpY2F0ZShncltqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgbW9kZWxHcm91cE5hbWVzLCBkdXBlTW9kZWxHcm91cE5hbWVzKSkKLSAgICAgICAgICAgICAgICAgICAgY29tbW9uRG9jLmdldFNjaGVtYSgpLmFkZE5ld0VsZW1lbnQoKS5zZXQoZ3Jbal0pOwotICAgICAgICAgICAgICAgIG5lZWRJbXBvcnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGRvYy5nZXRTY2hlbWEoKS5yZW1vdmVFbGVtZW50KGopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgTmFtZWRBdHRyaWJ1dGVHcm91cCBhZ1tdID0gZG9jLmdldFNjaGVtYSgpLmdldEF0dHJpYnV0ZUdyb3VwQXJyYXkoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYWcubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0R1cGxpY2F0ZShhZ1tqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgZHVwZUF0dHJHcm91cE5hbWVzKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRmlyc3REdXBsaWNhdGUoYWdbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIGF0dHJHcm91cE5hbWVzLCBkdXBlQXR0ckdyb3VwTmFtZXMpKQotICAgICAgICAgICAgICAgICAgICBjb21tb25Eb2MuZ2V0U2NoZW1hKCkuYWRkTmV3RWxlbWVudCgpLnNldChhZ1tqXSk7Ci0gICAgICAgICAgICAgICAgbmVlZEltcG9ydCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZG9jLmdldFNjaGVtYSgpLnJlbW92ZUVsZW1lbnQoaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChuZWVkSW1wb3J0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEluY2x1ZGVEb2N1bWVudC5JbmNsdWRlIG5ld0luY2x1ZGUgPSBkb2MuZ2V0U2NoZW1hKCkuYWRkTmV3SW5jbHVkZSgpOwotICAgICAgICAgICAgICAgIEZpbGUgaW5wdXRGaWxlID0gKEZpbGUpc2NoZW1hRG9jcy5nZXQoZG9jKTsKLSAgICAgICAgICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSBvdXRwdXRGaWxlRm9yKGlucHV0RmlsZSwgYmFzZWRpciwgb3V0ZGlyKTsKLSAgICAgICAgICAgICAgICBGaWxlIGNvbW1vbkZpbGUgPSAoRmlsZSljb21tb25GaWxlcy5nZXQoY29tbW9uRG9jKTsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIG5ld0luY2x1ZGUuc2V0U2NoZW1hTG9jYXRpb24ocmVsYXRpdmVVUklGb3Iob3V0cHV0RmlsZSwgY29tbW9uRmlsZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBtYWtlIHRoZSBkaXJlY3RvcnkgZm9yIG91dHB1dAotICAgICAgICBpZiAoIW91dGRpci5pc0RpcmVjdG9yeSgpICYmICFvdXRkaXIubWtkaXJzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVW5hYmxlIHRvIG1ha2VkaXIgIiArIG91dGRpcik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gbm93IHdyaXRlIGFsbCB0aG9zZSBkb2NzIGJhY2sgb3V0LgotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzY2hlbWFEb2NzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYURvY3VtZW50IGRvYyA9IChTY2hlbWFEb2N1bWVudClpLm5leHQoKTsKLSAgICAgICAgICAgIEZpbGUgaW5wdXRGaWxlID0gKEZpbGUpc2NoZW1hRG9jcy5nZXQoZG9jKTsKLSAgICAgICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IG91dHB1dEZpbGVGb3IoaW5wdXRGaWxlLCBiYXNlZGlyLCBvdXRkaXIpOwotICAgICAgICAgICAgaWYgKG91dHB1dEZpbGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhbm5vdCBjb3B5ICIgKyBpbnB1dEZpbGUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGRvYy5zYXZlKG91dHB1dEZpbGUsIG5ldyBYbWxPcHRpb25zKCkuc2V0U2F2ZVByZXR0eVByaW50KCkuc2V0U2F2ZUFnZ3Jlc2l2ZU5hbWVzcGFjZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbW1vbkZpbGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYURvY3VtZW50IGRvYyA9IChTY2hlbWFEb2N1bWVudClpLm5leHQoKTsKLSAgICAgICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IChGaWxlKWNvbW1vbkZpbGVzLmdldChkb2MpOwotICAgICAgICAgICAgZG9jLnNhdmUob3V0cHV0RmlsZSwgbmV3IFhtbE9wdGlvbnMoKS5zZXRTYXZlUHJldHR5UHJpbnQoKS5zZXRTYXZlQWdncmVzaXZlTmFtZXNwYWNlcygpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBvdXRwdXRGaWxlRm9yKEZpbGUgZmlsZSwgRmlsZSBiYXNlRGlyLCBGaWxlIG91dGRpcikKLSAgICB7Ci0gICAgICAgIFVSSSBiYXNlID0gYmFzZURpci5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSSSgpOwotICAgICAgICBVUkkgYWJzID0gZmlsZS5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSSSgpOwotICAgICAgICBVUkkgcmVsID0gYmFzZS5yZWxhdGl2aXplKGFicyk7Ci0gICAgICAgIGlmIChyZWwuaXNBYnNvbHV0ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhbm5vdCByZWxhdGl2aXplICIgKyBmaWxlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBVUkkgb3V0YmFzZSA9IG91dGRpci50b1VSSSgpOwotICAgICAgICBVUkkgb3V0ID0gQ29kZUdlblV0aWwucmVzb2x2ZShvdXRiYXNlLCByZWwpOwotICAgICAgICByZXR1cm4gbmV3IEZpbGUob3V0KTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgVVJJIGNvbW1vbkFuY2VzdG9yKFVSSSBmaXJzdCwgVVJJIHNlY29uZCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBmaXJzdFN0ciA9IGZpcnN0LnRvU3RyaW5nKCk7Ci0gICAgICAgIFN0cmluZyBzZWNvbmRTdHIgPSBzZWNvbmQudG9TdHJpbmcoKTsKLSAgICAgICAgaW50IGxlbiA9IGZpcnN0U3RyLmxlbmd0aCgpOwotICAgICAgICBpZiAoc2Vjb25kU3RyLmxlbmd0aCgpIDwgbGVuKQotICAgICAgICAgICAgbGVuID0gc2Vjb25kU3RyLmxlbmd0aCgpOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZmlyc3RTdHIuY2hhckF0KGkpICE9IHNlY29uZFN0ci5jaGFyQXQoaSkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaSAtPSAxOwotICAgICAgICBpZiAoaSA+PSAwKQotICAgICAgICAgICAgaSA9IGZpcnN0U3RyLmxhc3RJbmRleE9mKCcvJywgaSk7Ci0gICAgICAgIGlmIChpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkoZmlyc3RTdHIuc3Vic3RyaW5nKDAsIGkpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZWxhdGl2ZVVSSUZvcihGaWxlIHNvdXJjZSwgRmlsZSB0YXJnZXQpCi0gICAgewotICAgICAgICBVUkkgYmFzZSA9IHNvdXJjZS5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSSSgpOwotICAgICAgICBVUkkgYWJzID0gdGFyZ2V0LmdldEFic29sdXRlRmlsZSgpLnRvVVJJKCk7Ci0gICAgICAgIC8vIGZpbmQgY29tbW9uIHN1YnN0cmluZy4uLgotICAgICAgICBVUkkgY29tbW9uQmFzZSA9IGNvbW1vbkFuY2VzdG9yKGJhc2UsIGFicyk7Ci0gICAgICAgIGlmIChjb21tb25CYXNlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gYWJzLnRvU3RyaW5nKCk7Ci0gICAgICAgIAotICAgICAgICBVUkkgYmFzZXJlbCA9IGNvbW1vbkJhc2UucmVsYXRpdml6ZShiYXNlKTsKLSAgICAgICAgVVJJIHRhcmdldHJlbCA9IGNvbW1vbkJhc2UucmVsYXRpdml6ZShhYnMpOwotICAgICAgICBpZiAoYmFzZXJlbC5pc0Fic29sdXRlKCkgfHwgdGFyZ2V0cmVsLmlzQWJzb2x1dGUoKSkKLSAgICAgICAgICAgIHJldHVybiBhYnMudG9TdHJpbmcoKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9ICIiOwotICAgICAgICBTdHJpbmcgc291cmNlUmVsID0gYmFzZXJlbC50b1N0cmluZygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZVJlbC5sZW5ndGgoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkgPSBzb3VyY2VSZWwuaW5kZXhPZignLycsIGkpOwotICAgICAgICAgICAgaWYgKGkgPCAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgcHJlZml4ICs9ICIuLi8iOwotICAgICAgICAgICAgaSArPSAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcmVmaXggKyB0YXJnZXRyZWwudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBjb21tb25GaWxlRm9yKFN0cmluZyBjb21tb25OYW1lLCBTdHJpbmcgbmFtZXNwYWNlLCBpbnQgaSwgRmlsZSBvdXRkaXIpCi0gICAgewotICAgICAgICBTdHJpbmcgbmFtZSA9IGNvbW1vbk5hbWU7Ci0gICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGluZGV4ID0gY29tbW9uTmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKLSAgICAgICAgICAgICAgICBpbmRleCA9IGNvbW1vbk5hbWUubGVuZ3RoKCk7Ci0gICAgICAgICAgICBuYW1lID0gY29tbW9uTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpICsgaSArIGNvbW1vbk5hbWUuc3Vic3RyaW5nKGluZGV4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEZpbGUob3V0ZGlyLCBuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBub3RlTmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgU2V0IHNlZW4sIFNldCBkdXBlcywgU2V0IGR1cGVOYW1lc3BhY2VzKQotICAgIHsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgUU5hbWUgcU5hbWUgPSBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCBuYW1lKTsKLSAgICAgICAgaWYgKHNlZW4uY29udGFpbnMocU5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBkdXBlcy5hZGQocU5hbWUpOwotICAgICAgICAgICAgZHVwZU5hbWVzcGFjZXMuYWRkKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc2Vlbi5hZGQocU5hbWUpOwotICAgICAgICAKLSAgICB9Ci0gICAgICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNGaXJzdER1cGxpY2F0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgU2V0IG5vdHNlZW4sIFNldCBkdXBlcykKLSAgICB7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgbmFtZSk7Ci0gICAgICAgIGlmIChkdXBlcy5jb250YWlucyhxTmFtZSkgJiYgbm90c2Vlbi5jb250YWlucyhxTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5vdHNlZW4ucmVtb3ZlKHFOYW1lKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0R1cGxpY2F0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgU2V0IGR1cGVzKQotICAgIHsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgUU5hbWUgcU5hbWUgPSBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCBuYW1lKTsKLSAgICAgICAgcmV0dXJuIChkdXBlcy5jb250YWlucyhxTmFtZSkpOwotICAgIH0KLSAgICAgICAgCi0gICAgCi19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9JbnN0YW5jZVZhbGlkYXRvci5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvSW5zdGFuY2VWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZmYjRkMC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9JbnN0YW5jZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgSW5zdGFuY2VWYWxpZGF0b3IKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICAgIHsKLSAgICAgICAgQ29tbWFuZExpbmUgY2wgPSBuZXcgQ29tbWFuZExpbmUoYXJncywgQ29sbGVjdGlvbnMuRU1QVFlfU0VUKTsKLSAgICAgICAgaWYgKGNsLmdldE9wdCgibGljZW5zZSIpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbW1hbmRMaW5lLnByaW50TGljZW5zZSgpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNsLmFyZ3MoKS5sZW5ndGggPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJWYWxpZGF0ZXMgYSBzY2hlbWEgZGVmaW50aW9uIGFuZCBpbnN0YW5jZXMgd2l0aGluIHRoZSBzY2hlbWEuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiB2YWxpZGF0ZSBbc3dpdGNoZXNdIHNjaGVtYS54c2QgaW5zdGFuY2UueG1sIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaGVzOiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWRsICAgIGVuYWJsZSBuZXR3b3JrIGRvd25sb2FkcyBmb3IgaW1wb3J0cyBhbmQgaW5jbHVkZXMiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1ub3B2ciBkaXNhYmxlIHBhcnRpY2xlIHZhbGlkIChyZXN0cmljdGlvbikgcnVsZSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLW5vdXBhIGRpYWJsZSB1bmlxdWUgcGFydGljbGUgYXR0cmlidXRlaW9uIHJ1bGUiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1saWNlbnNlIHByaW50cyBsaWNlbnNlIGluZm9ybWF0aW9uIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gZGwgPSAoY2wuZ2V0T3B0KCJkbCIpICE9IG51bGwpOwotICAgICAgICBib29sZWFuIG5vcHZyID0gKGNsLmdldE9wdCgibm9wdnIiKSAhPSBudWxsKTsKLSAgICAgICAgYm9vbGVhbiBub3VwYSA9IChjbC5nZXRPcHQoIm5vdXBhIikgIT0gbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBGaWxlW10gc2NoZW1hRmlsZXMgPSBjbC5maWxlc0VuZGluZ1dpdGgoIi54c2QiKTsKLSAgICAgICAgRmlsZVtdIGluc3RhbmNlRmlsZXMgPSBjbC5maWxlc0VuZGluZ1dpdGgoIi54bWwiKTsKLSAgICAgICAgCi0gICAgICAgIExpc3Qgc2RvY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFGaWxlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2RvY3MuYWRkKAotICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUZpbGVzW2ldLCAobmV3IFhtbE9wdGlvbnMoKSkuc2V0TG9hZExpbmVOdW1iZXJzKCkuc2V0TG9hZE1lc3NhZ2VEaWdlc3QoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggc2NoZW1hRmlsZXNbaV0gKyAiIG5vdCBsb2FkYWJsZTogIiArIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFhtbE9iamVjdFtdIHNjaGVtYXMgPSAoWG1sT2JqZWN0W10pc2RvY3MudG9BcnJheShuZXcgWG1sT2JqZWN0WzBdKTsKLQotICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIHNMb2FkZXI7Ci0gICAgICAgIENvbGxlY3Rpb24gY29tcEVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgWG1sT3B0aW9ucyBzY2hlbWFPcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgc2NoZW1hT3B0aW9ucy5zZXRFcnJvckxpc3RlbmVyKGNvbXBFcnJvcnMpOwotICAgICAgICBpZiAoZGwpCi0gICAgICAgICAgICBzY2hlbWFPcHRpb25zLnNldENvbXBpbGVEb3dubG9hZFVybHMoKTsKLSAgICAgICAgaWYgKG5vcHZyKQotICAgICAgICAgICAgc2NoZW1hT3B0aW9ucy5zZXRDb21waWxlTm9QdnJSdWxlKCk7Ci0gICAgICAgIGlmIChub3VwYSkKLSAgICAgICAgICAgIHNjaGVtYU9wdGlvbnMuc2V0Q29tcGlsZU5vVXBhUnVsZSgpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNMb2FkZXIgPSBYbWxCZWFucy5sb2FkWHNkKHNjaGVtYXMsIHNjaGVtYU9wdGlvbnMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbXBFcnJvcnMuaXNFbXB0eSgpIHx8ICEoZSBpbnN0YW5jZW9mIFhtbEV4Y2VwdGlvbikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNjaGVtYSBpbnZhbGlkIik7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb21wRXJyb3JzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGkubmV4dCgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZUZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxPYmplY3QgeG9iajsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeG9iaiA9Ci0gICAgICAgICAgICAgICAgICAgIHNMb2FkZXIucGFyc2UoIGluc3RhbmNlRmlsZXNbaV0sIG51bGwsIChuZXcgWG1sT3B0aW9ucygpKS5zZXRMb2FkTGluZU51bWJlcnMoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihpbnN0YW5jZUZpbGVzW2ldICsgIiBub3QgbG9hZGFibGU6ICIgKyBlKTsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ29sbGVjdGlvbiBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgIGlmICh4b2JqLnNjaGVtYVR5cGUoKSA9PSBYbWxPYmplY3QudHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW5zdGFuY2VGaWxlc1tpXSArICIgTk9UIHZhbGlkLiAgIik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIERvY3VtZW50IHR5cGUgbm90IGZvdW5kLiIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHhvYmoudmFsaWRhdGUobmV3IFhtbE9wdGlvbnMoKS5zZXRFcnJvckxpc3RlbmVyKGVycm9ycykpKQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbnN0YW5jZUZpbGVzW2ldICsgIiB2YWxpZC4iKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW5zdGFuY2VGaWxlc1tpXSArICIgTk9UIHZhbGlkLiIpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaXQubmV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9QcmV0dHlQcmludGVyLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9QcmV0dHlQcmludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2Mzk4ZmEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvUHJldHR5UHJpbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBQcmV0dHlQcmludGVyCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgICB7Ci0gICAgICAgIENvbW1hbmRMaW5lIGNsID0gbmV3IENvbW1hbmRMaW5lKGFyZ3MsIENvbGxlY3Rpb25zLnNpbmdsZXRvbigiaW5kZW50IikpOwotICAgICAgICBpZiAoY2wuZ2V0T3B0KCJsaWNlbnNlIikgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29tbWFuZExpbmUucHJpbnRMaWNlbnNlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGNsLmFyZ3MoKS5sZW5ndGggPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQcmV0dHkgcHJpbnRzIFhNTCBmaWxlcy4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IHhwcmV0dHkgW3N3aXRjaGVzXSBmaWxlLnhtbCIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hlczoiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1pbmRlbnQgIyAgIHVzZSB0aGUgZ2l2ZW4gaW5kZW50Iik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtbGljZW5zZSBwcmludHMgbGljZW5zZSBpbmZvcm1hdGlvbiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgaW5kZW50U3RyID0gY2wuZ2V0T3B0KCJpbmRlbnQiKTsKLSAgICAgICAgaW50IGluZGVudDsKLSAgICAgICAgaWYgKGluZGVudFN0ciA9PSBudWxsKQotICAgICAgICAgICAgaW5kZW50ID0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaW5kZW50ID0gSW50ZWdlci5wYXJzZUludChpbmRlbnRTdHIpOwotICAgICAgICAKLSAgICAgICAgRmlsZVtdIGZpbGVzID0gY2wuZ2V0RmlsZXMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE9iamVjdCBkb2M7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkb2MgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShmaWxlc1tpXSwgKG5ldyBYbWxPcHRpb25zKCkpLnNldExvYWRMaW5lTnVtYmVycygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZmlsZXNbaV0gKyAiIG5vdCBsb2FkYWJsZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG9jLnNhdmUoU3lzdGVtLm91dCwgbmV3IFhtbE9wdGlvbnMoKS5zZXRTYXZlUHJldHR5UHJpbnQoKS5zZXRTYXZlUHJldHR5UHJpbnRJbmRlbnQoaW5kZW50KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVuYWJsZSB0byBwcmV0dHkgcHJpbnQgIiArIGZpbGVzW2ldICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1J1blhRdWVyeS5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvUnVuWFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlM2Y0OWQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvUnVuWFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLio7Ci0KLXB1YmxpYyBjbGFzcyBSdW5YUXVlcnkKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb21tYW5kTGluZSBjbCA9Ci0gICAgICAgICAgICBuZXcgQ29tbWFuZExpbmUoCi0gICAgICAgICAgICAgICAgYXJncywKLSAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCBuZXcgU3RyaW5nW10geyAicSIsICJxZiIgfSApICk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2wuZ2V0T3B0KCJsaWNlbnNlIikgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29tbWFuZExpbmUucHJpbnRMaWNlbnNlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGFyZ3MgPSBjbC5hcmdzKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSdW4gYW4gWFF1ZXJ5IGFnYWluc3QgYW4gWE1MIGluc3RhbmNlIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ4cXVlcnkgWy12ZXJib3NlXSBbLXByZXR0eV0gWy1xIDxxdWVyeT4gfCAtcWYgcXVlcnkueHFdIFtmaWxlLnhtbF0qIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAtcSA8cXVlcnk+IHRvIHNwZWNpZnkgYSBxdWVyeSBvbiB0aGUgY29tbWFuZC1saW5lIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAtcWYgPHF1ZXJ5PiB0byBzcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgcXVlcnkiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIC1wcmV0dHkgcHJldHR5LXByaW50cyB0aGUgcmVzdWx0cyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgLWxpY2Vuc2UgcHJpbnRzIGxpY2Vuc2UgaW5mb3JtYXRpb24iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIHRoZSBxdWVyeSBpcyBydW4gb24gZWFjaCBYTUwgZmlsZSBzcGVjaWZpZWQiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gdmVyYm9zZSA9IGNsLmdldE9wdCggInZlcmJvc2UiICkgIT0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBwcmV0dHkgPSBjbC5nZXRPcHQoICJwcmV0dHkiICkgIT0gbnVsbDsKLQotICAgICAgICAvLwotICAgICAgICAvLyBHZXQgYW5kIGNvbXBpbGUgdGhlIHF1ZXJ5Ci0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICBTdHJpbmcgcXVlcnkgPSBjbC5nZXRPcHQoICJxIiApOwotICAgICAgICBTdHJpbmcgcXVlcnlmaWxlID0gY2wuZ2V0T3B0KCAicWYiICk7Ci0KLSAgICAgICAgaWYgKHF1ZXJ5ID09IG51bGwgJiYgcXVlcnlmaWxlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIk5vIHF1ZXJ5IHNwZWNpZmllZCIgKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCAmJiBxdWVyeWZpbGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiU3BlY2lmeSAtcWYgb3IgLXEsIG5vdCBib3RoLiIgKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHF1ZXJ5ZmlsZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbGUgcXVlcnlGaWxlID0gbmV3IEZpbGUoIHF1ZXJ5ZmlsZSApOwotICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oIHF1ZXJ5RmlsZSApOwotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIHIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIGlzICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9IHIucmVhZCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIChjaGFyKSBjaCApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgcXVlcnkgPSBzYi50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggVGhyb3dhYmxlIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJDYW5ub3QgcmVhZCBxdWVyeSBmaWxlOiAiICsgZS5nZXRNZXNzYWdlKCkgKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNvbXBpbGUgUXVlcnk6IiApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCBxdWVyeSApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcXVlcnk9IFhtbEJlYW5zLmNvbXBpbGVRdWVyeSggcXVlcnkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiRXJyb3IgY29tcGlsaW5nIHF1ZXJ5OiAiICsgZS5nZXRNZXNzYWdlKCkgKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gR2V0IHRoZSBpbnN0YW5jZQotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgRmlsZVtdIGZpbGVzID0gY2wuZ2V0RmlsZXMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE9iamVjdCB4OwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oIGZpbGVzW2ldICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gaXMucmVhZCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LndyaXRlKCBjaCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIGZpbGVzW2ldICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFRocm93YWJsZSBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJFcnJvciBwYXJzaW5nIGluc3RhbmNlOiAiICsgZS5nZXRNZXNzYWdlKCkgKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkV4ZWN1dGluZyBRdWVyeS4uLiIgKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oKTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIFhtbE9iamVjdFtdIHJlc3VsdCA9IG51bGw7Ci0gICAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSB4LmV4ZWNRdWVyeSggcXVlcnkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggVGhyb3dhYmxlIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIkVycm9yIGV4ZWN1dGluZyBxdWVyeTogIiArIGUuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiUXVlcnkgUmVzdWx0OiIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgWG1sT3B0aW9ucyBvcHRzID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgICAgIG9wdHMuc2V0U2F2ZU91dGVyKCk7Ci0gICAgICAgICAgICBpZiAocHJldHR5KQotICAgICAgICAgICAgICAgIG9wdHMuc2V0U2F2ZVByZXR0eVByaW50KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVzdWx0Lmxlbmd0aDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdFtqXS5zYXZlKCBTeXN0ZW0ub3V0LCBvcHRzICk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29kZUdlbmVyYXRvci5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29kZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWQ0NGZkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvZGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yV2F0Y2hlcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlNjaGVtYVR5cGVDb2RlUHJpbnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLklPVXRpbDsKLQotaW1wb3J0IHJlcGFja2FnZS5SZXBhY2thZ2VyOwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hQ29kZUdlbmVyYXRvcgotewotICAgIC8vIGlucHV0IGRpcmVjdG9yeSwgb3V0cHV0IGRpciBmaWxlbmFtZQotICAgIC8vIHRvZG86IG91dHB1dCBqYXIKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGlsZVR5cGVTeXN0ZW0oU2NoZW1hVHlwZVN5c3RlbSBzYXZlciwgRmlsZSBzb3VyY2VkaXIsIEZpbGVbXSBqYXZhc3JjLCBNYXAgc291cmNlc1RvQ29weU1hcCwgRmlsZVtdIGNsYXNzcGF0aCwgRmlsZSBjbGFzc2VzZGlyLCBGaWxlIG91dHB1dEphciwgYm9vbGVhbiBub2phdmFjLCBib29sZWFuIGpheGIsIFhtbEVycm9yV2F0Y2hlciBlcnJvcnMsIFN0cmluZyByZXBhY2thZ2UsIGJvb2xlYW4gdmVyYm9zZSwgTGlzdCBzb3VyY2VmaWxlcyApCi0gICAgewotCi0gICAgICAgIGlmIChzb3VyY2VkaXIgPT0gbnVsbCB8fCBjbGFzc2VzZGlyID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTb3VyY2UgYW5kIGNsYXNzIGdlbiBkaXIgbXVzdCBub3QgYmUgbnVsbC4iKTsKLQotICAgICAgICBib29sZWFuIGZhaWx1cmUgPSBmYWxzZTsKLQotICAgICAgICBzYXZlci5zYXZlVG9EaXJlY3RvcnkoY2xhc3Nlc2Rpcik7Ci0KLSAgICAgICAgLy8gU2F2ZSB0aGUgc2NoZW1hIHNvdXJjZXMgdG8gdGhlIGNsYXNzZXMgZGlyZWN0b3J5Ci0gICAgICAgIGlmICgoc291cmNlc1RvQ29weU1hcCAhPSBudWxsKSAmJiAoc291cmNlc1RvQ29weU1hcC5zaXplKCkgPiAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBzY2hlbWFzZGlyID0gY3JlYXRlRGlyKGNsYXNzZXNkaXIsICJzY2hlbWEvc3JjIik7Ci0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNvdXJjZXNUb0NvcHlNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKWl0ZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChrZXkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2NoZW1hbG9jYXRpb24gPSAoU3RyaW5nKXNvdXJjZXNUb0NvcHlNYXAuZ2V0KGtleSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUoc2NoZW1hc2Rpciwgc2NoZW1hbG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBGaWxlIHBhcmVudERpciA9IG5ldyBGaWxlKHRhcmdldEZpbGUuZ2V0UGFyZW50KCkpOwotICAgICAgICAgICAgICAgICAgICBjcmVhdGVEaXIocGFyZW50RGlyLCBudWxsKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRoZSBmaWxlIGZyb20gZmlsZXBhdGggdG8gc2NoZW1hL3NyYy88c2NoZW1hRmlsZT4KLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSB1cmwub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKHNjaGVtYXNkaXIsIHNjaGVtYWxvY2F0aW9uKSk7Ci0gICAgICAgICAgICAgICAgICAgIElPVXRpbC5jb3B5Q29tcGxldGVseShpbiwgb3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIklPIEVycm9yICIgKyBlKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gZmFpbHVyZSA9IHRydWU7IC0gbm90IGNhdXNlIGZvciBmYWlsdXJlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgUmVwYWNrYWdlciByZXBhY2thZ2VyID0gcmVwYWNrYWdlID09IG51bGwgPyBudWxsIDogbmV3IFJlcGFja2FnZXIoIHJlcGFja2FnZSApOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBTY2hlbWFUeXBlQ29kZVByaW50ZXIuaW5kZXhDbGFzc0ZvclN5c3RlbShzYXZlcikucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikgKyAiLmphdmEiOwotICAgICAgICAgICAgRmlsZSBzb3VyY2VmaWxlID0gbmV3IEZpbGUoc291cmNlZGlyLCBmaWxlbmFtZSk7Ci0gICAgICAgICAgICBzb3VyY2VmaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgV3JpdGVyIHdyaXRlciA9Ci0gICAgICAgICAgICAgICAgcmVwYWNrYWdlciA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgID8gKFdyaXRlcikgbmV3IEZpbGVXcml0ZXIoIHNvdXJjZWZpbGUgKQotICAgICAgICAgICAgICAgICAgICA6IChXcml0ZXIpIG5ldyBSZXBhY2thZ2luZ1dyaXRlciggc291cmNlZmlsZSwgcmVwYWNrYWdlciApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgU2NoZW1hVHlwZUNvZGVQcmludGVyLnByaW50TG9hZGVyKHdyaXRlciwgc2F2ZXIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc291cmNlZmlsZXMuYWRkKHNvdXJjZWZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIklPIEVycm9yICIgKyBlKTsKLSAgICAgICAgICAgIGZhaWx1cmUgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEgamF4YikKLSAgICAgICAgICAgIGZhaWx1cmUgJj0gZ2VuVHlwZXMoc2F2ZXIsIHNvdXJjZWZpbGVzLCBzb3VyY2VkaXIsIHJlcGFja2FnZXIsIHZlcmJvc2UpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmYWlsdXJlICY9IGpheGJDb2RlR2VuZXJhdG9yKHNhdmVyLCBzb3VyY2VmaWxlcywgc291cmNlZGlyLCBjbGFzc2VzZGlyLCBlcnJvcnMpOwotCi0gICAgICAgIGlmIChmYWlsdXJlKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZ2VuVHlwZXMoU2NoZW1hVHlwZVN5c3RlbSBzYXZlciwgTGlzdCBzb3VyY2VmaWxlcywgRmlsZSBzb3VyY2VkaXIsIFJlcGFja2FnZXIgcmVwYWNrYWdlciwgYm9vbGVhbiB2ZXJib3NlKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBmYWlsdXJlID0gZmFsc2U7Ci0KLSAgICAgICAgTGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc2F2ZXIuZ2xvYmFsVHlwZXMoKSkpOwotICAgICAgICB0eXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzYXZlci5kb2N1bWVudFR5cGVzKCkpKTsKLSAgICAgICAgdHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc2F2ZXIuYXR0cmlidXRlVHlwZXMoKSkpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHR5cGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgdHlwZSA9IChTY2hlbWFUeXBlKWkubmV4dCgpOwotICAgICAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDb21waWxpbmcgdHlwZSAiICsgdHlwZSk7Ci0gICAgICAgICAgICBpZiAodHlwZS5pc0J1aWx0aW5UeXBlKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBpZiAodHlwZS5nZXRGdWxsSmF2YU5hbWUoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgZmpuID0gdHlwZS5nZXRGdWxsSmF2YU5hbWUoKTsKLQotICAgICAgICAgICAgaWYgKGZqbi5pbmRleE9mKCckJykgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZqbiA9Ci0gICAgICAgICAgICAgICAgICAgIGZqbi5zdWJzdHJpbmcoIDAsIGZqbi5sYXN0SW5kZXhPZiggJy4nICkgKSArICIuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBmam4uc3Vic3RyaW5nKCBmam4uaW5kZXhPZiggJyQnICkgKyAxICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGZqbi5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKSArICIuamF2YSI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFdyaXRlciB3cml0ZXIgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWxlIHNvdXJjZWZpbGUgPSBuZXcgRmlsZShzb3VyY2VkaXIsIGZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICBzb3VyY2VmaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJjcmVhdGVkICIgKyBzb3VyY2VmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIgPQotICAgICAgICAgICAgICAgICAgICByZXBhY2thZ2VyID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgID8gKFdyaXRlcikgbmV3IEZpbGVXcml0ZXIoIHNvdXJjZWZpbGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgOiAoV3JpdGVyKSBuZXcgUmVwYWNrYWdpbmdXcml0ZXIoIHNvdXJjZWZpbGUsIHJlcGFja2FnZXIgKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVDb2RlUHJpbnRlci5wcmludFR5cGUod3JpdGVyLCB0eXBlKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzb3VyY2VmaWxlcy5hZGQoc291cmNlZmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIklPIEVycm9yICIgKyBlKTsKLSAgICAgICAgICAgICAgICBmYWlsdXJlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRyeSB7IGlmICh3cml0ZXIgIT0gbnVsbCkgd3JpdGVyLmNsb3NlKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlIEltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSB0eXBlLmdldEZ1bGxKYXZhSW1wbE5hbWUoKS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKSArICIuamF2YSI7Ci0gICAgICAgICAgICAgICAgRmlsZSBpbXBsRmlsZSA9IG5ldyBGaWxlKHNvdXJjZWRpciwgIGZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJjcmVhdGVkICIgKyBpbXBsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgaW1wbEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd3JpdGVyID0KLSAgICAgICAgICAgICAgICAgICAgcmVwYWNrYWdlciA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICA/IChXcml0ZXIpIG5ldyBGaWxlV3JpdGVyKCBpbXBsRmlsZSApCi0gICAgICAgICAgICAgICAgICAgICAgICA6IChXcml0ZXIpIG5ldyBSZXBhY2thZ2luZ1dyaXRlciggaW1wbEZpbGUsIHJlcGFja2FnZXIgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlQ29kZVByaW50ZXIucHJpbnRUeXBlSW1wbCh3cml0ZXIsIHR5cGUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHNvdXJjZWZpbGVzLmFkZChpbXBsRmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIklPIEVycm9yICIgKyBlKTsKLSAgICAgICAgICAgICAgICBmYWlsdXJlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRyeSB7IGlmICh3cml0ZXIgIT0gbnVsbCkgd3JpdGVyLmNsb3NlKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFpbHVyZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKYXhiQ29kZUdlbmVyYXRvckhvbGRlcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIF9qYXhiQ29kZUdlbmVyYXRvck1ldGhvZCA9IGJ1aWxkSmF4YkNvZGVHZW5lcmF0b3JNZXRob2QoKTsKLSAgICAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGJ1aWxkSmF4YkNvZGVHZW5lcmF0b3JNZXRob2QoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmpheGIuY29tcGlsZXIuSmF4YkNvZGVHZW5lcmF0b3IiLCBmYWxzZSwgU2NoZW1hQ29kZUdlbmVyYXRvci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKQotICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0aG9kKCJjb21waWxlIiwgbmV3IENsYXNzW10ge1NjaGVtYVR5cGVTeXN0ZW0uY2xhc3MsIExpc3QuY2xhc3MsIEZpbGUuY2xhc3MsIEZpbGUuY2xhc3MsIFhtbEVycm9yV2F0Y2hlci5jbGFzcyB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZTIgPSAgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgSmF4YkNvZGVHZW5lcmF0b3I6IHZlcmlmeSB0aGF0IHhiZWFuLmphciBpcyBvbiB0aGUgY2xhc3NwYXRoIik7Ci0gICAgICAgICAgICAgICAgZTIuaW5pdENhdXNlKGUpOwotICAgICAgICAgICAgICAgIHRocm93IGUyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBqYXhiQ29kZUdlbmVyYXRvcihTY2hlbWFUeXBlU3lzdGVtIHNhdmVyLCBMaXN0IHNvdXJjZWZpbGVzLCBGaWxlIHNvdXJjZWRpciwgRmlsZSBjbGFzc2VzZGlyLCBYbWxFcnJvcldhdGNoZXIgZXJyb3JzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoKEJvb2xlYW4pSmF4YkNvZGVHZW5lcmF0b3JIb2xkZXIuX2pheGJDb2RlR2VuZXJhdG9yTWV0aG9kLmludm9rZShudWxsLCBuZXcgT2JqZWN0W10geyBzYXZlciwgc291cmNlZmlsZXMsIHNvdXJjZWRpciwgY2xhc3Nlc2RpciwgZXJyb3JzIH0pKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZTIgPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGUyLmluaXRDYXVzZShlKTsKLSAgICAgICAgICAgIHRocm93IGUyOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlMiA9IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZTIuaW5pdENhdXNlKGUpOwotICAgICAgICAgICAgdGhyb3cgZTI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIEZpbGUgY3JlYXRlRGlyKEZpbGUgcm9vdGRpciwgU3RyaW5nIHN1YmRpcikKLSAgICB7Ci0gICAgICAgIEZpbGUgbmV3ZGlyID0gKHN1YmRpciA9PSBudWxsKSA/IHJvb3RkaXIgOiBuZXcgRmlsZShyb290ZGlyLCBzdWJkaXIpOwotICAgICAgICBib29sZWFuIGNyZWF0ZWQgPSAobmV3ZGlyLmV4aXN0cygpICYmIG5ld2Rpci5pc0RpcmVjdG9yeSgpKSB8fCBuZXdkaXIubWtkaXJzKCk7Ci0gICAgICAgIGFzc2VydChjcmVhdGVkKSA6ICJDb3VsZCBub3QgY3JlYXRlICIgKyBuZXdkaXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIHJldHVybiBuZXdkaXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBGaWxlIGNyZWF0ZVRlbXBEaXIoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEZpbGUgdG1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInhiZWFuIiwgbnVsbCk7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gdG1wRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgaWYgKCFwYXRoLmVuZHNXaXRoKCIudG1wIikpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVycm9yOiBjcmVhdGVUZW1wRmlsZSBkaWQgbm90IGNyZWF0ZSBhIGZpbGUgZW5kaW5nIHdpdGggLnRtcCIpOwotICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDQpOwotICAgICAgICBGaWxlIHRtcFNyY0RpciA9IG51bGw7Ci0KLSAgICAgICAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8IDEwMDsgY291bnQrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXRoICsgIi5kIiArIChjb3VudCA9PSAwID8gIiIgOiBJbnRlZ2VyLnRvU3RyaW5nKGNvdW50KyspKTsKLQotICAgICAgICAgICAgdG1wU3JjRGlyID0gbmV3IEZpbGUobmFtZSk7Ci0KLSAgICAgICAgICAgIGlmICghdG1wU3JjRGlyLmV4aXN0cygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gY3JlYXRlZCA9IHRtcFNyY0Rpci5ta2RpcnMoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQgY3JlYXRlZCA6ICJDb3VsZCBub3QgY3JlYXRlICIgKyB0bXBTcmNEaXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdG1wRmlsZS5kZWxldGVPbkV4aXQoKTsKLQotICAgICAgICByZXR1cm4gdG1wU3JjRGlyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCB0cnlIYXJkVG9EZWxldGUoRmlsZSBkaXIpCi0gICAgewotICAgICAgICB0cnlUb0RlbGV0ZShkaXIpOwotICAgICAgICBpZiAoZGlyLmV4aXN0cygpKQotICAgICAgICAgICAgdHJ5VG9EZWxldGVMYXRlcihkaXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdHJ5VG9EZWxldGUoRmlsZSBkaXIpCi0gICAgewotICAgICAgICBpZiAoZGlyLmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gbGlzdCA9IGRpci5saXN0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB0cnlUb0RlbGV0ZShuZXcgRmlsZShkaXIsIGxpc3RbaV0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZGlyLmRlbGV0ZSgpKQotICAgICAgICAgICAgICAgIHJldHVybjsgLy8gZG9uJ3QgdHJ5IHZlcnkgaGFyZCwgYmVjYXVzZSB3ZSdyZSBqdXN0IGRlbGV0aW5nIHRtcAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFNldCBkZWxldGVGaWxlUXVldWUgPSBuZXcgSGFzaFNldCgpOwotICAgIHByaXZhdGUgc3RhdGljIGludCB0cmllc1JlbWFpbmluZyA9IDA7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0cnlOb3dUaGF0SXRzTGF0ZXIoKQotICAgIHsKLSAgICAgICAgTGlzdCBmaWxlczsKLSAgICAgICAgCi0gICAgICAgIHN5bmNocm9uaXplZCAoZGVsZXRlRmlsZVF1ZXVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlcyA9IG5ldyBBcnJheUxpc3QoZGVsZXRlRmlsZVF1ZXVlKTsKLSAgICAgICAgICAgIGRlbGV0ZUZpbGVRdWV1ZS5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBMaXN0IHJldHJ5ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZmlsZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gKEZpbGUpaS5uZXh0KCk7Ci0gICAgICAgICAgICB0cnlUb0RlbGV0ZShmaWxlKTsKLSAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKQotICAgICAgICAgICAgICAgIHJldHJ5LmFkZChmaWxlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc3luY2hyb25pemVkIChkZWxldGVGaWxlUXVldWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0cmllc1JlbWFpbmluZyA+IDApCi0gICAgICAgICAgICAgICAgdHJpZXNSZW1haW5pbmcgLT0gMTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh0cmllc1JlbWFpbmluZyA8PSAwIHx8IHJldHJ5LnNpemUoKSA9PSAwKSAvLyBkb25lPwotICAgICAgICAgICAgICAgIHRyaWVzUmVtYWluaW5nID0gMDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkZWxldGVGaWxlUXVldWUuYWRkQWxsKHJldHJ5KTsgLy8gdHJ5IGFnYWluPwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gKHRyaWVzUmVtYWluaW5nIDw9IDApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2l2ZVVwKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoZGVsZXRlRmlsZVF1ZXVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxldGVGaWxlUXVldWUuY2xlYXIoKTsKLSAgICAgICAgICAgIHRyaWVzUmVtYWluaW5nID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyeVRvRGVsZXRlTGF0ZXIoRmlsZSBkaXIpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGRlbGV0ZUZpbGVRdWV1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgZGVsZXRlRmlsZVF1ZXVlLmFkZChkaXIpOwotICAgICAgICAgICAgaWYgKHRyaWVzUmVtYWluaW5nID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3IFRocmVhZCgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBlYXRzIHRyeU5vdyB1bnRpbCB0cmllc1JlbWFpbmluZyA9PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyeU5vd1RoYXRJdHNMYXRlcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBzdWNjZWVkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDAgKiAzKTsgLy8gd2FpdCB0aHJlZSBzZWNvbmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZVVwKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodHJpZXNSZW1haW5pbmcgPCAxMCkKLSAgICAgICAgICAgICAgICB0cmllc1JlbWFpbmluZyA9IDEwOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBjbGFzcyBSZXBhY2thZ2luZ1dyaXRlciBleHRlbmRzIFN0cmluZ1dyaXRlcgotICAgIHsKLSAgICAgICAgcHVibGljIFJlcGFja2FnaW5nV3JpdGVyICggRmlsZSBmaWxlLCBSZXBhY2thZ2VyIHJlcGFja2FnZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZmlsZSA9IGZpbGU7Ci0gICAgICAgICAgICBfcmVwYWNrYWdlciA9IHJlcGFja2FnZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSAoICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IGdldEJ1ZmZlcigpOwotCi0gICAgICAgICAgICBfcmVwYWNrYWdlci5yZXBhY2thZ2UoIHNiICk7Ci0KLSAgICAgICAgICAgIEZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlciggX2ZpbGUgKTsKLSAgICAgICAgICAgIGZ3LndyaXRlKCBzYi50b1N0cmluZygpICk7Ci0gICAgICAgICAgICBmdy5jbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBGaWxlIF9maWxlOwotICAgICAgICBwcml2YXRlIFJlcGFja2FnZXIgX3JlcGFja2FnZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29tcGlsZXIuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvbXBpbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYzI4M2IuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29tcGlsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzNyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcwotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlU3lzdGVtQ29tcGlsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5QYXRoUmVzb3VyY2VMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5SZXNvdXJjZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlN0c2NTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlNjaGVtYVR5cGVMb2FkZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JQcmludGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JXYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlOwotaW1wb3J0IGNvbS5iZWEueDIwMDIueDA5LnhiZWFuLmNvbmZpZy5Db25maWdEb2N1bWVudDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hQ29tcGlsZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICAgIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29tcGlsZXMgYSBzY2hlbWEgaW50byBYTUwgQmVhbiBjbGFzc2VzIGFuZCBtZXRhZGF0YS4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IHNjb21wIFtvcHRzXSBbZGlyc10qIFtzY2hlbWEueHNkXSogW3NlcnZpY2Uud3NkbF0qIFtjb25maWcueHNkY29uZmlnXSoiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT3B0aW9ucyBpbmNsdWRlOiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWNwIFthO2I7Y10gLSBjbGFzc3BhdGgiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1kIFtkaXJdIC0gdGFyZ2V0IGJpbmFyeSBkaXJlY3RvcnkgZm9yIC5jbGFzcyBhbmQgLnhzYiBmaWxlcyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLXNyYyBbZGlyXSAtIHRhcmdldCBkaXJlY3RvcnkgZm9yIGdlbmVyYXRlZCAuamF2YSBmaWxlcyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLXNyY29ubHkgLSBkbyBub3QgY29tcGlsZSAuamF2YSBmaWxlcyBvciBqYXIgdGhlIG91dHB1dC4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1vdXQgW3Jlc3VsdC5qYXJdIC0gdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBqYXIiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1kbCAtIHBlcm1pdCBuZXR3b3JrIGRvd25sb2FkcyBmb3IgaW1wb3J0cyBhbmQgaW5jbHVkZXMgKGRlZmF1bHQgaXMgb2ZmKSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLW5vdXBhIC0gZG8gbm90IGVuZm9yY2UgdGhlIHVuaXF1ZSBwYXJ0aWNsZSBhdHRyaWJ1dGlvbiBydWxlIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtbm9wdnIgLSBkbyBub3QgZW5mb3JjZSB0aGUgcGFydGljbGUgdmFsaWQgKHJlc3RyaWN0aW9uKSBydWxlIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtY29tcGlsZXIgLSBwYXRoIHRvIGV4dGVybmFsIGphdmEgY29tcGlsZXIiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1qYXIgLSBwYXRoIHRvIGphciB1dGlsaXR5Iik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtbXMgLSBpbml0aWFsIG1lbW9yeSBmb3IgZXh0ZXJuYWwgamF2YSBjb21waWxlciAoZGVmYXVsdCAnIiArIENvZGVHZW5VdGlsLkRFRkFVTFRfTUVNX1NUQVJUICsgIicpIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtbXggLSBtYXhpbXVtIG1lbW9yeSBmb3IgZXh0ZXJuYWwgamF2YSBjb21waWxlciAoZGVmYXVsdCAnIiArIENvZGVHZW5VdGlsLkRFRkFVTFRfTUVNX01BWCArICInKSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWRlYnVnIC0gY29tcGlsZSB3aXRoIGRlYnVnIHN5bWJvbHMiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1xdWlldCAtIHByaW50IGZld2VyIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC12ZXJib3NlIC0gcHJpbnQgbW9yZSBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtbGljZW5zZSAtIHByaW50cyBsaWNlbnNlIGluZm9ybWF0aW9uIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtYWxsb3dtZGVmIFwiW25zXSBbbnNdIFtuc11cIiAtIGlnbm9yZXMgbXVsdGlwbGUgZGVmcyBpbiBnaXZlbiBuYW1lc3BhY2VzIik7Ci0gICAgICAgICAgICAvKiBVbmRvY3VtZW50ZWQgZmVhdHVyZSAtIHBhc3MgaW4gb25lIHNjaGVtYSBjb21waWxlciBleHRlbnNpb24gYW5kIHJlbGF0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLXJlcGFja2FnZSAtIHJlcGFja2FnZSBzcGVjaWZpY2F0aW9uIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtZXh0ZW5zaW9uIC0gcmVnaXN0ZXJzIGEgc2NoZW1hIGNvbXBpbGVyIGV4dGVuc2lvbiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWV4dGVuc2lvblBhcm1zIC0gc3BlY2lmeSBwYXJhbWV0ZXJzIGZvciB0aGUgY29tcGlsZXIgZXh0ZW5zaW9uIik7Ci0gICAgICAgICAgICAqLwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklmIHlvdSByZXF1aXJlIGEgZGlmZmVyZW50IGphdmEgY29tcGlsZXIsIHVzZSB0aGUgWE1MQmVhbiBBbnQgdGFzayBpbnN0ZWFkLiIpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTZXQgb3B0cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIG9wdHMuYWRkKCJvdXQiKTsKLSAgICAgICAgb3B0cy5hZGQoIm5hbWUiKTsKLSAgICAgICAgb3B0cy5hZGQoInNyYyIpOwotICAgICAgICBvcHRzLmFkZCgiZCIpOwotICAgICAgICBvcHRzLmFkZCgiY3AiKTsKLSAgICAgICAgb3B0cy5hZGQoImNvbXBpbGVyIik7Ci0gICAgICAgIG9wdHMuYWRkKCJqYXIiKTsKLSAgICAgICAgb3B0cy5hZGQoIm1zIik7Ci0gICAgICAgIG9wdHMuYWRkKCJteCIpOwotICAgICAgICBvcHRzLmFkZCgicmVwYWNrYWdlIik7Ci0gICAgICAgIG9wdHMuYWRkKCJleHRlbnNpb24iKTsKLSAgICAgICAgb3B0cy5hZGQoImV4dGVuc2lvblBhcm1zIik7Ci0gICAgICAgIG9wdHMuYWRkKCJhbGxvd21kZWYiKTsKLSAgICAgICAgQ29tbWFuZExpbmUgY2wgPSBuZXcgQ29tbWFuZExpbmUoYXJncywgb3B0cyk7Ci0KLSAgICAgICAgaWYgKGNsLmdldE9wdCgibGljZW5zZSIpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbW1hbmRMaW5lLnByaW50TGljZW5zZSgpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBhcmdzID0gY2wuYXJncygpOwotICAgICAgICBib29sZWFuIHZlcmJvc2UgPSAoY2wuZ2V0T3B0KCJ2ZXJib3NlIikgIT0gbnVsbCk7Ci0gICAgICAgIGJvb2xlYW4gcXVpZXQgPSAoY2wuZ2V0T3B0KCJxdWlldCIpICE9IG51bGwpOwotICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgIHF1aWV0ID0gZmFsc2U7Ci0KLSAgICAgICAgU3RyaW5nIG91dHB1dGZpbGVuYW1lID0gY2wuZ2V0T3B0KCJvdXQiKTsKLQotICAgICAgICBTdHJpbmcgcmVwYWNrYWdlID0gY2wuZ2V0T3B0KCJyZXBhY2thZ2UiKTsKLQotICAgICAgICBTdHJpbmcgbmFtZSA9IGNsLmdldE9wdCgibmFtZSIpOwotCi0gICAgICAgIGJvb2xlYW4gZG93bmxvYWQgPSAoY2wuZ2V0T3B0KCJkbCIpICE9IG51bGwpOwotICAgICAgICBib29sZWFuIG5vVXBhID0gKGNsLmdldE9wdCgibm91cGEiKSAhPSBudWxsKTsKLSAgICAgICAgYm9vbGVhbiBub1B2ciA9IChjbC5nZXRPcHQoIm5vcHZyIikgIT0gbnVsbCk7Ci0gICAgICAgIGJvb2xlYW4gbm9qYXZhYyA9IChjbC5nZXRPcHQoInNyY29ubHkiKSAhPSBudWxsKTsKLSAgICAgICAgYm9vbGVhbiBkZWJ1ZyA9IChjbC5nZXRPcHQoImRlYnVnIikgIT0gbnVsbCk7Ci0gICAgICAgIGJvb2xlYW4gamF4YiA9IChjbC5nZXRPcHQoImpheGIiKSAhPSBudWxsKTsKLQotICAgICAgICBTdHJpbmcgYWxsb3dtZGVmID0gY2wuZ2V0T3B0KCJhbGxvd21kZWYiKTsKLSAgICAgICAgU2V0IG1kZWZOYW1lc3BhY2VzID0gKGFsbG93bWRlZiA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDoKLSAgICAgICAgICAgICAgICBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KFhtbExpc3RJbXBsLnNwbGl0X2xpc3QoYWxsb3dtZGVmKSkpKTsKLQotICAgICAgICBMaXN0IGV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmIChjbC5nZXRPcHQoImV4dGVuc2lvbiIpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGUgPSBuZXcgRXh0ZW5zaW9uKCk7Ci0gICAgICAgICAgICAgICAgZS5zZXRDbGFzc05hbWUoQ2xhc3MuZm9yTmFtZShjbC5nZXRPcHQoImV4dGVuc2lvbiIpLCBmYWxzZSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSkpOwotICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuYWRkKGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDb3VsZCBub3QgZmluZCBleHRlbnNpb24gY2xhc3M6ICIgKyBjbC5nZXRPcHQoImV4dGVuc2lvbiIpICsgIiAgSXMgaXQgb24geW91ciBjbGFzc3BhdGg/Iik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXh0ZW5zaW9ucy5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBleGFtcGxlOiAtZXh0ZW5zaW9uUGFybXMgdHlwZU1hcHBpbmdGaWxlTG9jYXRpb249ZDpcdHlwZXMKLSAgICAgICAgICAgIGlmIChjbC5nZXRPcHQoImV4dGVuc2lvblBhcm1zIikgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlID0gKEV4dGVuc2lvbikgZXh0ZW5zaW9ucy5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgLy8gZXh0ZW5zaW9uUGFybXMgYXJlIGRlbGltaXRlZCBieSAnOycKLSAgICAgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgcGFybVRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2wuZ2V0T3B0KCJleHRlbnNpb25QYXJtcyIpLCAiOyIpOwotICAgICAgICAgICAgICAgIHdoaWxlIChwYXJtVG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgbmFtZSB2YWx1ZSBwYWlyIGZvciBlYWNoIGV4dGVuc2lvbiBwYXJtcyBhbmQgc3RpY2sgaW50byBleHRlbnNpb24gcGFybXMKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG52UGFpciA9IHBhcm1Ub2tlbnMubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG52UGFpci5pbmRleE9mKCc9Jyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiZXh0ZW5zaW9uUGFybXMgc2hvdWxkIGJlIG5hbWU9dmFsdWU7bmFtZT12YWx1ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG4gPSBudlBhaXIuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHYgPSBudlBhaXIuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbi5QYXJhbSBwYXJhbSA9IGUuY3JlYXRlUGFyYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0TmFtZShuKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0VmFsdWUodik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGNsYXNzZXNkaXIgPSBjbC5nZXRPcHQoImQiKTsKLSAgICAgICAgRmlsZSBjbGFzc2VzID0gbnVsbDsKLSAgICAgICAgaWYgKGNsYXNzZXNkaXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGNsYXNzZXMgPSBuZXcgRmlsZShjbGFzc2VzZGlyKTsKLQotICAgICAgICBTdHJpbmcgc3JjZGlyID0gY2wuZ2V0T3B0KCJzcmMiKTsKLSAgICAgICAgRmlsZSBzcmMgPSBudWxsOwotICAgICAgICBpZiAoc3JjZGlyICE9IG51bGwpCi0gICAgICAgICAgICBzcmMgPSBuZXcgRmlsZShzcmNkaXIpOwotICAgICAgICBpZiAobm9qYXZhYyAmJiBzcmNkaXIgPT0gbnVsbCAmJiBjbGFzc2VzICE9IG51bGwpCi0gICAgICAgICAgICBzcmMgPSBjbGFzc2VzOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0ZW1wIGRpcmVjdG9yeQotICAgICAgICBGaWxlIHRlbXBkaXIgPSBudWxsOwotICAgICAgICBpZiAoc3JjID09IG51bGwgfHwgY2xhc3NlcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wZGlyID0gU2NoZW1hQ29kZUdlbmVyYXRvci5jcmVhdGVUZW1wRGlyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3IgY3JlYXRpbmcgdGVtcCBkaXIgIiArIGUpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZSBqYXJmaWxlID0gbnVsbDsKLSAgICAgICAgaWYgKG91dHB1dGZpbGVuYW1lID09IG51bGwgJiYgY2xhc3NlcyA9PSBudWxsICYmICFub2phdmFjKQotICAgICAgICAgICAgb3V0cHV0ZmlsZW5hbWUgPSAieG1sdHlwZXMuamFyIjsKLSAgICAgICAgaWYgKG91dHB1dGZpbGVuYW1lICE9IG51bGwpCi0gICAgICAgICAgICBqYXJmaWxlID0gbmV3IEZpbGUob3V0cHV0ZmlsZW5hbWUpOwotCi0gICAgICAgIGlmIChzcmMgPT0gbnVsbCkKLSAgICAgICAgICAgIHNyYyA9IFNjaGVtYUNvZGVHZW5lcmF0b3IuY3JlYXRlRGlyKHRlbXBkaXIsICJzcmMiKTsKLSAgICAgICAgaWYgKGNsYXNzZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIGNsYXNzZXMgPSBTY2hlbWFDb2RlR2VuZXJhdG9yLmNyZWF0ZURpcih0ZW1wZGlyLCAiY2xhc3NlcyIpOwotCi0gICAgICAgIEZpbGVbXSBjbGFzc3BhdGggPSBudWxsOwotICAgICAgICBTdHJpbmcgY3BTdHJpbmcgPSBjbC5nZXRPcHQoImNwIik7Ci0gICAgICAgIGlmIChjcFN0cmluZyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBjcHBhcnRzID0gY3BTdHJpbmcuc3BsaXQoRmlsZS5wYXRoU2VwYXJhdG9yKTsKLSAgICAgICAgICAgIExpc3QgY3BMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjcHBhcnRzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGNwTGlzdC5hZGQobmV3IEZpbGUoY3BwYXJ0c1tpXSkpOwotICAgICAgICAgICAgY2xhc3NwYXRoID0gKEZpbGVbXSljcExpc3QudG9BcnJheShuZXcgRmlsZVtjcExpc3Quc2l6ZSgpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBjbGFzc3BhdGggPSBDb2RlR2VuVXRpbC5zeXN0ZW1DbGFzc3BhdGgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBjb21waWxlciA9IGNsLmdldE9wdCgiY29tcGlsZXIiKTsKLSAgICAgICAgU3RyaW5nIGphciA9IGNsLmdldE9wdCgiamFyIik7Ci0KLSAgICAgICAgU3RyaW5nIG1lbW9yeUluaXRpYWxTaXplID0gY2wuZ2V0T3B0KCJtcyIpOwotICAgICAgICBTdHJpbmcgbWVtb3J5TWF4aW11bVNpemUgPSBjbC5nZXRPcHQoIm14Iik7Ci0KLSAgICAgICAgRmlsZVtdIHhzZEZpbGVzID0gY2wuZmlsZXNFbmRpbmdXaXRoKCIueHNkIik7Ci0gICAgICAgIEZpbGVbXSB3c2RsRmlsZXMgPSBjbC5maWxlc0VuZGluZ1dpdGgoIi53c2RsIik7Ci0gICAgICAgIEZpbGVbXSBqYXZhRmlsZXMgPSBjbC5maWxlc0VuZGluZ1dpdGgoIi5qYXZhIik7Ci0gICAgICAgIEZpbGVbXSBjb25maWdGaWxlcyA9IGNsLmZpbGVzRW5kaW5nV2l0aCgiLnhzZGNvbmZpZyIpOwotCi0gICAgICAgIGlmICh4c2RGaWxlcy5sZW5ndGggKyB3c2RsRmlsZXMubGVuZ3RoID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ291bGQgbm90IGZpbmQgYW55IHhzZCBvciB3c2RsIGZpbGVzIHRvIHByb2Nlc3MuIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgICBGaWxlIGJhc2VEaXIgPSBjbC5nZXRCYXNlRGlyKCk7Ci0gICAgICAgIFVSSSBiYXNlVVJJID0gYmFzZURpciA9PSBudWxsID8gbnVsbCA6IGJhc2VEaXIudG9VUkkoKTsKLQotICAgICAgICBYbWxFcnJvclByaW50ZXIgZXJyID0gbmV3IFhtbEVycm9yUHJpbnRlcih2ZXJib3NlLCBiYXNlVVJJKTsKLQotICAgICAgICBQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIHBhcmFtcy5zZXRCYXNlRGlyKGJhc2VEaXIpOwotICAgICAgICBwYXJhbXMuc2V0WHNkRmlsZXMoeHNkRmlsZXMpOwotICAgICAgICBwYXJhbXMuc2V0V3NkbEZpbGVzKHdzZGxGaWxlcyk7Ci0gICAgICAgIHBhcmFtcy5zZXRKYXZhRmlsZXMoamF2YUZpbGVzKTsKLSAgICAgICAgcGFyYW1zLnNldENvbmZpZ0ZpbGVzKGNvbmZpZ0ZpbGVzKTsKLSAgICAgICAgcGFyYW1zLnNldENsYXNzcGF0aChjbGFzc3BhdGgpOwotICAgICAgICBwYXJhbXMuc2V0T3V0cHV0SmFyKGphcmZpbGUpOwotICAgICAgICBwYXJhbXMuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgcGFyYW1zLnNldFNyY0RpcihzcmMpOwotICAgICAgICBwYXJhbXMuc2V0Q2xhc3Nlc0RpcihjbGFzc2VzKTsKLSAgICAgICAgcGFyYW1zLnNldENvbXBpbGVyKGNvbXBpbGVyKTsKLSAgICAgICAgcGFyYW1zLnNldEphcihqYXIpOwotICAgICAgICBwYXJhbXMuc2V0TWVtb3J5SW5pdGlhbFNpemUobWVtb3J5SW5pdGlhbFNpemUpOwotICAgICAgICBwYXJhbXMuc2V0TWVtb3J5TWF4aW11bVNpemUobWVtb3J5TWF4aW11bVNpemUpOwotICAgICAgICBwYXJhbXMuc2V0Tm9qYXZhYyhub2phdmFjKTsKLSAgICAgICAgcGFyYW1zLnNldFF1aWV0KHF1aWV0KTsKLSAgICAgICAgcGFyYW1zLnNldFZlcmJvc2UodmVyYm9zZSk7Ci0gICAgICAgIHBhcmFtcy5zZXREb3dubG9hZChkb3dubG9hZCk7Ci0gICAgICAgIHBhcmFtcy5zZXROb1VwYShub1VwYSk7Ci0gICAgICAgIHBhcmFtcy5zZXROb1B2cihub1B2cik7Ci0gICAgICAgIHBhcmFtcy5zZXREZWJ1ZyhkZWJ1Zyk7Ci0gICAgICAgIHBhcmFtcy5zZXRFcnJvckxpc3RlbmVyKGVycik7Ci0gICAgICAgIHBhcmFtcy5zZXRSZXBhY2thZ2UocmVwYWNrYWdlKTsKLSAgICAgICAgcGFyYW1zLnNldEV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7Ci0gICAgICAgIHBhcmFtcy5zZXRKYXhiKGpheGIpOwotICAgICAgICBwYXJhbXMuc2V0TWRlZk5hbWVzcGFjZXMobWRlZk5hbWVzcGFjZXMpOwotCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gY29tcGlsZShwYXJhbXMpOwotCi0gICAgICAgIGlmICh0ZW1wZGlyICE9IG51bGwpCi0gICAgICAgICAgICBTY2hlbWFDb2RlR2VuZXJhdG9yLnRyeUhhcmRUb0RlbGV0ZSh0ZW1wZGlyKTsKLQotICAgICAgICBpZiAoIXJlc3VsdCkKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotCi0gICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1ldGVycwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBGaWxlIGJhc2VEaXI7Ci0gICAgICAgIHByaXZhdGUgRmlsZVtdIHhzZEZpbGVzOwotICAgICAgICBwcml2YXRlIEZpbGVbXSB3c2RsRmlsZXM7Ci0gICAgICAgIHByaXZhdGUgRmlsZVtdIGphdmFGaWxlczsKLSAgICAgICAgcHJpdmF0ZSBGaWxlW10gY29uZmlnRmlsZXM7Ci0gICAgICAgIHByaXZhdGUgRmlsZVtdIGNsYXNzcGF0aDsKLSAgICAgICAgcHJpdmF0ZSBGaWxlIG91dHB1dEphcjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICAgICAgcHJpdmF0ZSBGaWxlIHNyY0RpcjsKLSAgICAgICAgcHJpdmF0ZSBGaWxlIGNsYXNzZXNEaXI7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1lbW9yeUluaXRpYWxTaXplOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtZW1vcnlNYXhpbXVtU2l6ZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY29tcGlsZXI7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGphcjsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG5vamF2YWM7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBxdWlldDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHZlcmJvc2U7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBkb3dubG9hZDsKLSAgICAgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGVycm9yTGlzdGVuZXI7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBub1VwYTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG5vUHZyOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZGVidWc7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHJlcGFja2FnZTsKLSAgICAgICAgcHJpdmF0ZSBMaXN0IGV4dGVuc2lvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gamF4YjsKLSAgICAgICAgcHJpdmF0ZSBTZXQgbWRlZk5hbWVzcGFjZXMgPSBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0KLSAgICAgICAgcHVibGljIEZpbGUgZ2V0QmFzZURpcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiYXNlRGlyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QmFzZURpcihGaWxlIGJhc2VEaXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuYmFzZURpciA9IGJhc2VEaXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRmlsZVtdIGdldFhzZEZpbGVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHhzZEZpbGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0WHNkRmlsZXMoRmlsZVtdIHhzZEZpbGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnhzZEZpbGVzID0geHNkRmlsZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRmlsZVtdIGdldFdzZGxGaWxlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB3c2RsRmlsZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRXc2RsRmlsZXMoRmlsZVtdIHdzZGxGaWxlcykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy53c2RsRmlsZXMgPSB3c2RsRmlsZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRmlsZVtdIGdldEphdmFGaWxlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhRmlsZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRKYXZhRmlsZXMoRmlsZVtdIGphdmFGaWxlcykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5qYXZhRmlsZXMgPSBqYXZhRmlsZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRmlsZVtdIGdldENvbmZpZ0ZpbGVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ0ZpbGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q29uZmlnRmlsZXMoRmlsZVtdIGNvbmZpZ0ZpbGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmNvbmZpZ0ZpbGVzID0gY29uZmlnRmlsZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRmlsZVtdIGdldENsYXNzcGF0aCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjbGFzc3BhdGg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoRmlsZVtdIGNsYXNzcGF0aCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRmlsZSBnZXRPdXRwdXRKYXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gb3V0cHV0SmFyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0SmFyKEZpbGUgb3V0cHV0SmFyKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm91dHB1dEphciA9IG91dHB1dEphcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBGaWxlIGdldFNyY0RpcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzcmNEaXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTcmNEaXIoRmlsZSBzcmNEaXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuc3JjRGlyID0gc3JjRGlyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGUgZ2V0Q2xhc3Nlc0RpcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjbGFzc2VzRGlyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q2xhc3Nlc0RpcihGaWxlIGNsYXNzZXNEaXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuY2xhc3Nlc0RpciA9IGNsYXNzZXNEaXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc05vamF2YWMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbm9qYXZhYzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5vamF2YWMoYm9vbGVhbiBub2phdmFjKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm5vamF2YWMgPSBub2phdmFjOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNRdWlldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBxdWlldDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFF1aWV0KGJvb2xlYW4gcXVpZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucXVpZXQgPSBxdWlldDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzVmVyYm9zZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB2ZXJib3NlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIHZlcmJvc2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Rvd25sb2FkKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGRvd25sb2FkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RG93bmxvYWQoYm9vbGVhbiBkb3dubG9hZCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5kb3dubG9hZCA9IGRvd25sb2FkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNOb1VwYSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBub1VwYTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5vVXBhKGJvb2xlYW4gbm9VcGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubm9VcGEgPSBub1VwYTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzTm9QdnIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbm9QdnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXROb1B2cihib29sZWFuIG5vUHZyKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm5vUHZyID0gbm9QdnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RlYnVnKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGRlYnVnOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RGVidWcoYm9vbGVhbiBkZWJ1ZykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZW1vcnlJbml0aWFsU2l6ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtZW1vcnlJbml0aWFsU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE1lbW9yeUluaXRpYWxTaXplKFN0cmluZyBtZW1vcnlJbml0aWFsU2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5tZW1vcnlJbml0aWFsU2l6ZSA9IG1lbW9yeUluaXRpYWxTaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZW1vcnlNYXhpbXVtU2l6ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtZW1vcnlNYXhpbXVtU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE1lbW9yeU1heGltdW1TaXplKFN0cmluZyBtZW1vcnlNYXhpbXVtU2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5tZW1vcnlNYXhpbXVtU2l6ZSA9IG1lbW9yeU1heGltdW1TaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb21waWxlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb21waWxlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENvbXBpbGVyKFN0cmluZyBjb21waWxlcikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jb21waWxlciA9IGNvbXBpbGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRKYXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gamFyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SmFyKFN0cmluZyBqYXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuamFyID0gamFyOwotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRKYXhiKGJvb2xlYW4gamF4YikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5qYXhiID0gamF4YjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGdldEpheGIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5qYXhiOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0RXJyb3JMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBlcnJvckxpc3RlbmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RXJyb3JMaXN0ZW5lcihDb2xsZWN0aW9uIGVycm9yTGlzdGVuZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZXJyb3JMaXN0ZW5lciA9IGVycm9yTGlzdGVuZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlcGFja2FnZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZXBhY2thZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZXBhY2thZ2UoU3RyaW5nIG5ld1JlcGFja2FnZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVwYWNrYWdlID0gbmV3UmVwYWNrYWdlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExpc3QgZ2V0RXh0ZW5zaW9ucygpIHsKLSAgICAgICAgICAgIHJldHVybiBleHRlbnNpb25zOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9ucyhMaXN0IGV4dGVuc2lvbnMpIHsKLSAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2V0IGdldE1kZWZOYW1lc3BhY2VzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1kZWZOYW1lc3BhY2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TWRlZk5hbWVzcGFjZXMoU2V0IG1kZWZOYW1lc3BhY2VzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm1kZWZOYW1lc3BhY2VzID0gbWRlZk5hbWVzcGFjZXM7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFNjaGVtYVR5cGVTeXN0ZW0gbG9hZFR5cGVTeXN0ZW0oCi0gICAgICAgIFN0cmluZyBuYW1lLCBGaWxlW10geHNkRmlsZXMsCi0gICAgICAgIEZpbGVbXSB3c2RsRmlsZXMsIEZpbGVbXSBjb25maWdGaWxlcywgUmVzb3VyY2VMb2FkZXIgY3BSZXNvdXJjZUxvYWRlciwKLSAgICAgICAgYm9vbGVhbiBkb3dubG9hZCwgYm9vbGVhbiBub1VwYSwgYm9vbGVhbiBub1B2ciwgU2V0IG1kZWZOYW1lc3BhY2VzLAotICAgICAgICBGaWxlIGJhc2VEaXIsIE1hcCBzb3VyY2VzVG9Db3B5TWFwLCBDb2xsZWN0aW9uIG91dGVyRXJyb3JMaXN0ZW5lcikKLSAgICB7Ci0gICAgICAgIFhtbEVycm9yV2F0Y2hlciBlcnJvckxpc3RlbmVyID0gbmV3IFhtbEVycm9yV2F0Y2hlcihvdXRlckVycm9yTGlzdGVuZXIpOwotCi0gICAgICAgIC8vIEZvciBwYXJzaW5nIFhTRCBhbmQgV1NETCBmaWxlcywgd2Ugc2hvdWxkIHVzZSB0aGUgU2NoZW1hRG9jdW1lbnQKLSAgICAgICAgLy8gY2xhc3Nsb2FkZXIgcmF0aGVyIHRoYW4gdGhlIHRocmVhZCBjb250ZXh0IGNsYXNzbG9hZGVyLiAgVGhpcyBpcwotICAgICAgICAvLyBiZWNhdXNlIGluIHNvbWUgc2l0dWF0aW9ucyAoc3VjaCBhcyB3aGVuIGJlaW5nIGludm9rZWQgYnkgYW50Ci0gICAgICAgIC8vIHVuZGVybmVhdGggdGhlIGlkZSkgdGhlIGNvbnRleHQgY2xhc3Nsb2FkZXIgaXMgcG90ZW50aWFsbHkgd2VpcmQKLSAgICAgICAgLy8gKGJlY2F1c2Ugb2YgdGhlIGRlc2lnbiBvZiBhbnQpLgotCi0gICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyID0gWG1sQmVhbnMudHlwZUxvYWRlckZvckNsYXNzTG9hZGVyKFNjaGVtYURvY3VtZW50LmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotCi0gICAgICAgIC8vIHN0ZXAgMSwgcGFyc2UgYWxsIHRoZSBYU0QgZmlsZXMuCi0gICAgICAgIEFycmF5TGlzdCBzY29udGVudGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmICh4c2RGaWxlcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHhzZEZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRMb2FkTGluZU51bWJlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRMb2FkTWVzc2FnZURpZ2VzdCgpOwotCi0gICAgICAgICAgICAgICAgICAgIFhtbE9iamVjdCBzY2hlbWFkb2MgPSBsb2FkZXIucGFyc2UoeHNkRmlsZXNbaV0sIG51bGwsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIShzY2hlbWFkb2MgaW5zdGFuY2VvZiBTY2hlbWFEb2N1bWVudCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5hZGRFcnJvcihlcnJvckxpc3RlbmVyLCAiRG9jdW1lbnQgIiArIHhzZEZpbGVzW2ldICsgIiBpcyBub3QgYSBzY2hlbWEgZmlsZSIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfTE9BRF9YU0RfRklMRSwgc2NoZW1hZG9jKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5hZGRJbmZvKGVycm9yTGlzdGVuZXIsICJMb2FkaW5nIHNjaGVtYSBmaWxlICIgKyB4c2RGaWxlc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxPcHRpb25zIG9wdHMgPSBuZXcgWG1sT3B0aW9ucygpLnNldEVycm9yTGlzdGVuZXIoZXJyb3JMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hZG9jLnZhbGlkYXRlKG9wdHMpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb250ZW50bGlzdC5hZGQoKChTY2hlbWFEb2N1bWVudClzY2hlbWFkb2MpLmdldFNjaGVtYSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnJvckxpc3RlbmVyLmFkZChlLmdldEVycm9yKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuYWRkRXJyb3IoZXJyb3JMaXN0ZW5lciwgIkNhbm5vdCBsb2FkIGZpbGUgIiArIHhzZEZpbGVzW2ldICsgIjogIiArIGUsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfTE9BRF9YU0RfRklMRSwgeHNkRmlsZXNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHN0ZXAgMiwgcGFyc2UgYWxsIFdTREwgZmlsZXMKLSAgICAgICAgaWYgKHdzZGxGaWxlcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdzZGxGaWxlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZExpbmVOdW1iZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZFN1YnN0aXR1dGVOYW1lc3BhY2VzKENvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLCAiaHR0cDovL3d3dy5hcGFjaGUub3JnL2ludGVybmFsL3htbGJlYW5zL3dzZGxzdWJzdCIKLSAgICAgICAgICAgICAgICAgICAgKSk7Ci0KLQotICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3Qgd3NkbGRvYyA9IGxvYWRlci5wYXJzZSh3c2RsRmlsZXNbaV0sIG51bGwsIG9wdGlvbnMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghKHdzZGxkb2MgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmludGVybmFsLnhtbGJlYW5zLndzZGxzdWJzdC5EZWZpbml0aW9uc0RvY3VtZW50KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5hZGRFcnJvcihlcnJvckxpc3RlbmVyLCAiRG9jdW1lbnQgIiArIHdzZGxGaWxlc1tpXSArICIgaXMgbm90IGEgd3NkbCBmaWxlIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9MT0FEX1hTRF9GSUxFLCB3c2RsZG9jKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3NkbENvbnRhaW5zRW5jb2RlZCh3c2RsZG9jKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuYWRkV2FybmluZyhlcnJvckxpc3RlbmVyLCAiVGhlIFdTREwgIiArIHdzZGxGaWxlc1tpXSArICIgdXNlcyBTT0FQIGVuY29kaW5nLiBTT0FQIGVuY29kaW5nIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggbGl0ZXJhbCBYTUwgU2NoZW1hLiIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfTE9BRF9YU0RfRklMRSwgd3NkbGRvYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuYWRkSW5mbyhlcnJvckxpc3RlbmVyLCAiTG9hZGluZyB3c2RsIGZpbGUgIiArIHdzZGxGaWxlc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3RbXSB0eXBlcyA9ICgob3JnLmFwYWNoZS5pbnRlcm5hbC54bWxiZWFucy53c2Rsc3Vic3QuRGVmaW5pdGlvbnNEb2N1bWVudCl3c2RsZG9jKS5nZXREZWZpbml0aW9ucygpLmdldFR5cGVzQXJyYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHR5cGVzLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0IGNhc3QgZm9yIHBhcmFub2lhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hRG9jdW1lbnQuU2NoZW1hW10gc2NoZW1hcyA9IChTY2hlbWFEb2N1bWVudC5TY2hlbWFbXSl0eXBlc1tqXS5zZWxlY3RQYXRoKCJkZWNsYXJlIG5hbWVzcGFjZSB4cz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIgeHM6c2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzY2hlbWFzLmxlbmd0aDsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYXNba10udmFsaWRhdGUobmV3IFhtbE9wdGlvbnMoKS5zZXRFcnJvckxpc3RlbmVyKGVycm9yTGlzdGVuZXIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb250ZW50bGlzdC5hZGQoc2NoZW1hc1trXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHNjaGVtYXMubGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmFkZEluZm8oZXJyb3JMaXN0ZW5lciwgIlByb2Nlc3NpbmcgIiArIGNvdW50ICsgIiBzY2hlbWEocykgaW4gIiArIHdzZGxGaWxlc1tpXS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnJvckxpc3RlbmVyLmFkZChlLmdldEVycm9yKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuYWRkRXJyb3IoZXJyb3JMaXN0ZW5lciwgIkNhbm5vdCBsb2FkIGZpbGUgIiArIHdzZGxGaWxlc1tpXSArICI6ICIgKyBlLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0xPQURfWFNEX0ZJTEUsIHdzZGxGaWxlc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hRG9jdW1lbnQuU2NoZW1hW10gc2RvY3MgPSAoU2NoZW1hRG9jdW1lbnQuU2NoZW1hW10pc2NvbnRlbnRsaXN0LnRvQXJyYXkobmV3IFNjaGVtYURvY3VtZW50LlNjaGVtYVtzY29udGVudGxpc3Quc2l6ZSgpXSk7Ci0KLSAgICAgICAgLy8gbm93IHRoZSBjb25maWcgZmlsZXMuCi0gICAgICAgIEFycmF5TGlzdCBjZG9jbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYgKGNvbmZpZ0ZpbGVzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnRmlsZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5MT0FEX0xJTkVfTlVNQkVSUyApOwotCi0gICAgICAgICAgICAgICAgICAgIFhtbE9iamVjdCBjb25maWdkb2MgPSBsb2FkZXIucGFyc2UoY29uZmlnRmlsZXNbaV0sIG51bGwsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIShjb25maWdkb2MgaW5zdGFuY2VvZiBDb25maWdEb2N1bWVudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuYWRkRXJyb3IoZXJyb3JMaXN0ZW5lciwgIkRvY3VtZW50ICIgKyBjb25maWdGaWxlc1tpXSArICIgaXMgbm90IGFuIHhzZCBjb25maWcgZmlsZSIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfTE9BRF9YU0RfRklMRSwgY29uZmlnZG9jKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuYWRkSW5mbyhlcnJvckxpc3RlbmVyLCAiTG9hZGluZyBjb25maWcgZmlsZSAiICsgY29uZmlnRmlsZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ2RvYy52YWxpZGF0ZShuZXcgWG1sT3B0aW9ucygpLnNldEVycm9yTGlzdGVuZXIoZXJyb3JMaXN0ZW5lcikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNkb2NsaXN0LmFkZCgoKENvbmZpZ0RvY3VtZW50KWNvbmZpZ2RvYykuZ2V0Q29uZmlnKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yTGlzdGVuZXIuYWRkKGUuZ2V0RXJyb3IoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5hZGRFcnJvcihlcnJvckxpc3RlbmVyLCAiQ2Fubm90IGxvYWQgeHNkIGNvbmZpZyBmaWxlICIgKyBjb25maWdGaWxlc1tpXSArICI6ICIgKyBlLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0xPQURfWFNEX0NPTkZJR19GSUxFLCBjb25maWdGaWxlc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIENvbmZpZ0RvY3VtZW50LkNvbmZpZ1tdIGNkb2NzID0gKENvbmZpZ0RvY3VtZW50LkNvbmZpZ1tdKWNkb2NsaXN0LnRvQXJyYXkobmV3IENvbmZpZ0RvY3VtZW50LkNvbmZpZ1tjZG9jbGlzdC5zaXplKCldKTsKLQotICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIGxpbmtUbyA9IFNjaGVtYVR5cGVMb2FkZXJJbXBsLmJ1aWxkKG51bGwsIGNwUmVzb3VyY2VMb2FkZXIsIG51bGwpOwotCi0gICAgICAgIFVSSSBiYXNlVVJJID0gbnVsbDsKLSAgICAgICAgaWYgKGJhc2VEaXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGJhc2VVUkkgPSBiYXNlRGlyLnRvVVJJKCk7Ci0KLSAgICAgICAgWG1sT3B0aW9ucyBvcHRzID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgaWYgKGRvd25sb2FkKQotICAgICAgICAgICAgb3B0cy5zZXRDb21waWxlRG93bmxvYWRVcmxzKCk7Ci0gICAgICAgIGlmIChub1VwYSkKLSAgICAgICAgICAgIG9wdHMuc2V0Q29tcGlsZU5vVXBhUnVsZSgpOwotICAgICAgICBpZiAobm9QdnIpCi0gICAgICAgICAgICBvcHRzLnNldENvbXBpbGVOb1B2clJ1bGUoKTsKLSAgICAgICAgaWYgKG1kZWZOYW1lc3BhY2VzICE9IG51bGwpCi0gICAgICAgICAgICBvcHRzLnNldENvbXBpbGVNZGVmTmFtZXNwYWNlcyhtZGVmTmFtZXNwYWNlcyk7Ci0gICAgICAgIG9wdHMuc2V0Q29tcGlsZU5vVmFsaWRhdGlvbigpOyAvLyBhbHJlYWR5IHZhbGlkYXRlZCBoZXJlCi0KLSAgICAgICAgLy8gbm93IHBhc3MgaXQgdG8gdGhlIG1haW4gY29tcGlsZSBmdW5jdGlvbgotICAgICAgICBTY2hlbWFUeXBlU3lzdGVtQ29tcGlsZXIuUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgU2NoZW1hVHlwZVN5c3RlbUNvbXBpbGVyLlBhcmFtZXRlcnMoKTsKLSAgICAgICAgcGFyYW1zLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIHBhcmFtcy5zZXRTY2hlbWFzKHNkb2NzKTsKLSAgICAgICAgcGFyYW1zLnNldENvbmZpZ3MoY2RvY3MpOwotICAgICAgICBwYXJhbXMuc2V0TGlua1RvKGxpbmtUbyk7Ci0gICAgICAgIHBhcmFtcy5zZXRPcHRpb25zKG9wdHMpOwotICAgICAgICBwYXJhbXMuc2V0RXJyb3JMaXN0ZW5lcihlcnJvckxpc3RlbmVyKTsKLSAgICAgICAgcGFyYW1zLnNldEphdmFpemUodHJ1ZSk7Ci0gICAgICAgIHBhcmFtcy5zZXRCYXNlVVJJKGJhc2VVUkkpOwotICAgICAgICBwYXJhbXMuc2V0U291cmNlc1RvQ29weU1hcChzb3VyY2VzVG9Db3B5TWFwKTsKLSAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGVTeXN0ZW1Db21waWxlci5jb21waWxlKHBhcmFtcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBpbGUoUGFyYW1ldGVycyBwYXJhbXMpCi0gICAgewotICAgICAgICBGaWxlIGJhc2VEaXIgPSBwYXJhbXMuZ2V0QmFzZURpcigpOwotICAgICAgICBGaWxlW10geHNkRmlsZXMgPSBwYXJhbXMuZ2V0WHNkRmlsZXMoKTsKLSAgICAgICAgRmlsZVtdIHdzZGxGaWxlcyA9IHBhcmFtcy5nZXRXc2RsRmlsZXMoKTsKLSAgICAgICAgRmlsZVtdIGphdmFGaWxlcyA9IHBhcmFtcy5nZXRKYXZhRmlsZXMoKTsKLSAgICAgICAgRmlsZVtdIGNvbmZpZ0ZpbGVzID0gcGFyYW1zLmdldENvbmZpZ0ZpbGVzKCk7Ci0gICAgICAgIEZpbGVbXSBjbGFzc3BhdGggPSBwYXJhbXMuZ2V0Q2xhc3NwYXRoKCk7Ci0gICAgICAgIEZpbGUgb3V0cHV0SmFyID0gcGFyYW1zLmdldE91dHB1dEphcigpOwotICAgICAgICBTdHJpbmcgbmFtZSA9IHBhcmFtcy5nZXROYW1lKCk7Ci0gICAgICAgIEZpbGUgc3JjRGlyID0gcGFyYW1zLmdldFNyY0RpcigpOwotICAgICAgICBGaWxlIGNsYXNzZXNEaXIgPSBwYXJhbXMuZ2V0Q2xhc3Nlc0RpcigpOwotICAgICAgICBTdHJpbmcgY29tcGlsZXIgPSBwYXJhbXMuZ2V0Q29tcGlsZXIoKTsKLSAgICAgICAgU3RyaW5nIGphciA9IHBhcmFtcy5nZXRKYXIoKTsKLSAgICAgICAgU3RyaW5nIG1lbW9yeUluaXRpYWxTaXplID0gcGFyYW1zLmdldE1lbW9yeUluaXRpYWxTaXplKCk7Ci0gICAgICAgIFN0cmluZyBtZW1vcnlNYXhpbXVtU2l6ZSA9IHBhcmFtcy5nZXRNZW1vcnlNYXhpbXVtU2l6ZSgpOwotICAgICAgICBib29sZWFuIG5vamF2YWMgPSBwYXJhbXMuaXNOb2phdmFjKCk7Ci0gICAgICAgIGJvb2xlYW4gZGVidWcgPSBwYXJhbXMuaXNEZWJ1ZygpOwotICAgICAgICBib29sZWFuIHZlcmJvc2UgPSBwYXJhbXMuaXNWZXJib3NlKCk7Ci0gICAgICAgIGJvb2xlYW4gcXVpZXQgPSBwYXJhbXMuaXNRdWlldCgpOwotICAgICAgICBib29sZWFuIGRvd25sb2FkID0gcGFyYW1zLmlzRG93bmxvYWQoKTsKLSAgICAgICAgYm9vbGVhbiBub1VwYSA9IHBhcmFtcy5pc05vVXBhKCk7Ci0gICAgICAgIGJvb2xlYW4gbm9QdnIgPSBwYXJhbXMuaXNOb1B2cigpOwotICAgICAgICBDb2xsZWN0aW9uIG91dGVyRXJyb3JMaXN0ZW5lciA9IHBhcmFtcy5nZXRFcnJvckxpc3RlbmVyKCk7Ci0gICAgICAgIFN0cmluZyByZXBhY2thZ2UgPSBwYXJhbXMuZ2V0UmVwYWNrYWdlKCk7Ci0gICAgICAgIExpc3QgZXh0ZW5zaW9ucyA9IHBhcmFtcy5nZXRFeHRlbnNpb25zKCk7Ci0gICAgICAgIGJvb2xlYW4gamF4YiA9IHBhcmFtcy5nZXRKYXhiKCk7Ci0gICAgICAgIFNldCBtZGVmTmFtZXNwYWNlcyA9IHBhcmFtcy5nZXRNZGVmTmFtZXNwYWNlcygpOwotCi0gICAgICAgIGlmIChzcmNEaXIgPT0gbnVsbCB8fCBjbGFzc2VzRGlyID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzcmMgYW5kIGNsYXNzIGdlbiBkaXJlY3RvcmllcyBtYXkgbm90IGJlIG51bGwuIik7Ci0KLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdXNlbmFtZXMgYmFzZWQgb24gdGhlIHJlbGF0aXZpemVkIGZpbGVuYW1lcyBvbiB0aGUgZmlsZXN5c3RlbQotICAgICAgICBpZiAoYmFzZURpciA9PSBudWxsKQotICAgICAgICAgICAgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSk7Ci0KLSAgICAgICAgUmVzb3VyY2VMb2FkZXIgY3BSZXNvdXJjZUxvYWRlciA9IG51bGw7Ci0KLSAgICAgICAgTWFwIHNvdXJjZXNUb0NvcHlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkKLSAgICAgICAgICAgIGNwUmVzb3VyY2VMb2FkZXIgPSBuZXcgUGF0aFJlc291cmNlTG9hZGVyKGNsYXNzcGF0aCk7Ci0KLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi0gICAgICAgIC8vIGJ1aWxkIHRoZSBpbi1tZW1vcnkgdHlwZSBzeXN0ZW0KLSAgICAgICAgWG1sRXJyb3JXYXRjaGVyIGVycm9yTGlzdGVuZXIgPSBuZXcgWG1sRXJyb3JXYXRjaGVyKG91dGVyRXJyb3JMaXN0ZW5lcik7Ci0gICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gc3lzdGVtID0gbG9hZFR5cGVTeXN0ZW0obmFtZSwgeHNkRmlsZXMsIHdzZGxGaWxlcywgY29uZmlnRmlsZXMsIGNwUmVzb3VyY2VMb2FkZXIsIGRvd25sb2FkLCBub1VwYSwgbm9QdnIsIG1kZWZOYW1lc3BhY2VzLCBiYXNlRGlyLCBzb3VyY2VzVG9Db3B5TWFwLCBlcnJvckxpc3RlbmVyKTsKLSAgICAgICAgaWYgKGVycm9yTGlzdGVuZXIuaGFzRXJyb3IoKSkKLSAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICBsb25nIGZpbmlzaCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBpZiAoIXF1aWV0KQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaW1lIHRvIGJ1aWxkIHNjaGVtYSB0eXBlIHN5c3RlbTogIiArICgoZG91YmxlKShmaW5pc2ggLSBzdGFydCkgLyAxMDAwLjApICsgIiBzZWNvbmRzIiApOwotCi0gICAgICAgIC8vIG5vdyBjb2RlIGdlbmVyYXRlIGFuZCBjb21waWxlIHRoZSBKQVIKLSAgICAgICAgaWYgKHJlc3VsdCAmJiBzeXN0ZW0gIT0gbnVsbCkgLy8gdG9kbzogZG9uJ3QgY2hlY2sgInJlc3VsdCIgaGVyZSBpZiB3ZSB3YW50IHRvIGNvbXBpbGUgYW55d2F5LCBpZ25vcmluZyBpbnZhbGlkIHNjaGVtYXMKLSAgICAgICAgewotICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotICAgICAgICAgICAgLy8gZ2VuZXJhdGUgc291cmNlIGFuZCAueHNiCi0gICAgICAgICAgICBMaXN0IHNvdXJjZWZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgcmVzdWx0ICY9IFNjaGVtYUNvZGVHZW5lcmF0b3IuY29tcGlsZVR5cGVTeXN0ZW0oc3lzdGVtLCBzcmNEaXIsIGphdmFGaWxlcywgc291cmNlc1RvQ29weU1hcCwgY2xhc3NwYXRoLCBjbGFzc2VzRGlyLCBvdXRwdXRKYXIsIG5vamF2YWMsIGpheGIsIGVycm9yTGlzdGVuZXIsIHJlcGFja2FnZSwgdmVyYm9zZSwgc291cmNlZmlsZXMpOwotICAgICAgICAgICAgcmVzdWx0ICY9ICFlcnJvckxpc3RlbmVyLmhhc0Vycm9yKCk7Ci0KLSAgICAgICAgICAgIGlmIChyZXN1bHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluaXNoID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFxdWlldCkKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaW1lIHRvIGdlbmVyYXRlIGNvZGU6ICIgKyAoKGRvdWJsZSkoZmluaXNoIC0gc3RhcnQpIC8gMTAwMC4wKSArICIgc2Vjb25kcyIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY29tcGlsZSBzb3VyY2UKLSAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgIW5vamF2YWMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotICAgICAgICAgICAgICAgIGlmIChqYXZhRmlsZXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc291cmNlZmlsZXMuYWRkQWxsKGphdmEudXRpbC5BcnJheXMuYXNMaXN0KGphdmFGaWxlcykpOwotICAgICAgICAgICAgICAgIGlmICghQ29kZUdlblV0aWwuZXh0ZXJuYWxDb21waWxlKHNvdXJjZWZpbGVzLCBjbGFzc2VzRGlyLCBjbGFzc3BhdGgsIGRlYnVnLCBjb21waWxlciwgbWVtb3J5SW5pdGlhbFNpemUsIG1lbW9yeU1heGltdW1TaXplLCBxdWlldCwgdmVyYm9zZSkpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgZmluaXNoID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiAhcGFyYW1zLmlzUXVpZXQoKSkKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaW1lIHRvIGNvbXBpbGUgY29kZTogIiArICgoZG91YmxlKShmaW5pc2ggLSBzdGFydCkgLyAxMDAwLjApICsgIiBzZWNvbmRzIiApOwotCi0gICAgICAgICAgICAgICAgLy8gamFyIGNsYXNzZXMgYW5kIC54c2IKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICYmIG91dHB1dEphciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFDb2RlR2VuVXRpbC5leHRlcm5hbEphcihjbGFzc2VzRGlyLCBvdXRwdXRKYXIsIGphciwgcXVpZXQsIHZlcmJvc2UpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiAhcGFyYW1zLmlzUXVpZXQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29tcGlsZWQgdHlwZXMgdG86ICIgKyBvdXRwdXRKYXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcmVzdWx0ICYmICFxdWlldCkKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQlVJTEQgRkFJTEVEIik7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gY2FsbCBzY2hlbWEgY29tcGlsZXIgZXh0ZW5zaW9uIGlmIHJlZ2lzdGVyZWQKLSAgICAgICAgICAgIHJ1bkV4dGVuc2lvbnMoZXh0ZW5zaW9ucywgc3lzdGVtKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjcFJlc291cmNlTG9hZGVyICE9IG51bGwpCi0gICAgICAgICAgICBjcFJlc291cmNlTG9hZGVyLmNsb3NlKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBydW5FeHRlbnNpb25zKExpc3QgZXh0ZW5zaW9ucywgU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0pCi0gICAgewotICAgICAgICBpZiAoZXh0ZW5zaW9ucyAhPSBudWxsICYmIGV4dGVuc2lvbnMuc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hQ29tcGlsZXJFeHRlbnNpb24gc2NlID0gbnVsbDsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBleHRlbnNpb25zLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChFeHRlbnNpb24pIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2NlID0gKFNjaGVtYUNvbXBpbGVyRXh0ZW5zaW9uKSBleHRlbnNpb24uZ2V0Q2xhc3NOYW1lKCkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVU5BQkxFIHRvIGluc3RhbnRpYXRlIHNjaGVtYSBjb21waWxlciBleHRlbnNpb246IiArIGV4dGVuc2lvbi5nZXRDbGFzc05hbWUoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVYVEVOU0lPTiBDbGFzcyB3YXMgbm90IHJ1biIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJTExFR0FMIEFDQ0VTUyBFeGNlcHRpb24gd2hlbiBhdHRlbXB0aW5nIHRvIGluc3RhbnRpYXRlIHNjaGVtYSBjb21waWxlciBleHRlbnNpb246ICIgKyBleHRlbnNpb24uZ2V0Q2xhc3NOYW1lKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFWFRFTlNJT04gQ2xhc3Mgd2FzIG5vdCBydW4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSdW5uaW5nIFNjaGVtYSBDb21waWxlciBFeHRlbnNpb246ICIgKyBzY2UuZ2V0RXh0ZW5zaW9uTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBNYXAgZXh0ZW5zaW9uUGFybXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHBhcm1zaSA9IGV4dGVuc2lvbi5nZXRQYXJhbXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChwYXJtc2kuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uLlBhcmFtIHAgPSAoRXh0ZW5zaW9uLlBhcmFtKSBwYXJtc2kubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25QYXJtcy5wdXQocC5nZXROYW1lKCksIHAuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNjZS5zY2hlbWFDb21waWxlckV4dGVuc2lvbihzeXN0ZW0sIGV4dGVuc2lvblBhcm1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB3c2RsQ29udGFpbnNFbmNvZGVkKFhtbE9iamVjdCB3c2RsZG9jKQotICAgIHsKLSAgICAgICAgLy8gc2VhcmNoIGZvciBhbnkgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiLz4gZXRjLgotICAgICAgICBYbWxPYmplY3RbXSB1c2VBdHRycyA9IHdzZGxkb2Muc2VsZWN0UGF0aCgKLSAgICAgICAgICAgICAgICAiZGVjbGFyZSBuYW1lc3BhY2Ugc29hcD0naHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLycgIiArCi0gICAgICAgICAgICAgICAgIi4vL3NvYXA6Ym9keS9AdXNlfC4vL3NvYXA6aGVhZGVyL0B1c2V8Li8vc29hcDpmYXVsdC9AdXNlIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXNlQXR0cnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgiZW5jb2RlZCIuZXF1YWxzKCgoU2ltcGxlVmFsdWUpdXNlQXR0cnNbaV0pLmdldFN0cmluZ1ZhbHVlKCkpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29tcGlsZXJFeHRlbnNpb24uamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvbXBpbGVyRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMGM5YjIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29tcGlsZXJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgU2NoZW1hIENvbXBpbGVyIEV4dGVuc2lvbnMuICBCeSBpbXBsZW1lbnRpbmcgdGhpcyBjbGFzcwotICogIHlvdSBjYW4gdGhlbiBwYXNzIHRoaXMgY2xhc3MgdmlhIHRoZSBjb21tYW5kIGxpbmUgcGFyYW0gPGk+ZXh0ZW5zaW9uPC9pPiB0byB0aGUgU2NoZW1hQ29tcGlsZXIgY2xhc3MKLSAqICB3aGljaCB3aWxsIHRoZW4gaW4gdHVybiBjYWxsIHRoaXMgY2xhc3MgYmFjayBvbmNlIHRoZSBjb21waWxhdGlvbiBpcyBjb21wbGV0ZSB3aXRoIHRoZSByZXN1bHRpbmcKLSAqICBTY2hlbWFUeXBlU3lzdGVtLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUNvbXBpbGVyRXh0ZW5zaW9uIHsKLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYmFjayBieSB0aGUgWG1sQmVhbnMgU2NoZW1hIENvbXBpbGVyIHdpdGgKLSAgICAgKiAgdGhlIFNjaGVtYSBUeXBlIFN5c3RlbSB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQgYXMgYSByZXN1bHQgb2YgdGhlIGNvbXBpbGUuCi0gICAgICogQHBhcmFtIHNjaGVtYVR5cGVTeXN0ZW0gLSBUaGUgc2NoZW1hIHR5cGUgc3lzdGVtcyB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQgYnkgdGhlIGNvbXBpbGVyIGp1c3QgcHJpb3IgdG8gY2FsbGluZwotICAgICAqICAgdGhpcyBleHRlbnNpb24gY2xhc3MuCi0gICAgICogQHBhcmFtIHBhcm1zIC0gbmFtZSB2YWx1ZSBwYWlycyBvZiBvcHRpb25zIHRvIHRoaXMgc2NoZW1hIGNvbXBpbGVyIGV4dGVuc2lvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNjaGVtYUNvbXBpbGVyRXh0ZW5zaW9uKFNjaGVtYVR5cGVTeXN0ZW0gc2NoZW1hVHlwZVN5c3RlbSwgTWFwIHBhcm1zKTsKLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbk5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvcHkuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyYzY5OC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb3B5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLklPVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmludGVybmFsLnhtbGJlYW5zLndzZGxzdWJzdC5EZWZpbml0aW9uc0RvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuaW50ZXJuYWwueG1sYmVhbnMud3NkbHN1YnN0LlRJbXBvcnQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkltcG9ydERvY3VtZW50OwotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuSW5jbHVkZURvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hQ29weQotewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgICB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDEgfHwgYXJncy5sZW5ndGggPiAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBzY2hlbWFjb3B5IHNvdXJjZXVybCBbdGFyZ2V0ZmlsZV0iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFVSSSBzb3VyY2UgPSBudWxsOwotICAgICAgICBVUkkgdGFyZ2V0ID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc291cmNlID0gbmV3IFVSSShhcmdzWzBdKTsKLSAgICAgICAgICAgIHNvdXJjZS50b1VSTCgpOyAvLyB0byB0cmlnZ2VyIGV4Y2VwdGlvbgotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJCYWRseSBmb3JtZWQgVVJMICIgKyBzb3VyY2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVVJJIGRpciA9IG5ldyBGaWxlKCIuIikuZ2V0Q2Fub25pY2FsRmlsZSgpLnRvVVJJKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxhc3RQYXJ0ID0gc291cmNlLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICBsYXN0UGFydCA9IGxhc3RQYXJ0LnN1YnN0cmluZyhsYXN0UGFydC5sYXN0SW5kZXhPZignLycpICsgMSk7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gQ29kZUdlblV0aWwucmVzb2x2ZShkaXIsIFVSSS5jcmVhdGUobGFzdFBhcnQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNhbm5vdCBjYW5vbmljYWxpemUgY3VycmVudCBkaXJlY3RvcnkiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YXJnZXQgPSBuZXcgVVJJKGFyZ3NbMV0pOwotICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0LmlzQWJzb2x1dGUoKSkKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICghdGFyZ2V0LmdldFNjaGVtZSgpLmVxdWFscygiZmlsZSIpKQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IG5ldyBGaWxlKHRhcmdldCkuZ2V0Q2Fub25pY2FsRmlsZSgpLnRvVVJJKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2Fubm90IGNhbm9uaWNhbGl6ZSBjdXJyZW50IGRpcmVjdG9yeSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTWFwIHRoaW5nc1RvQ29weSA9IGZpbmRBbGxSZWxhdGl2ZShzb3VyY2UsIHRhcmdldCk7Ci0gICAgICAgIGNvcHlBbGwodGhpbmdzVG9Db3B5LCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHlBbGwoTWFwIHVyaU1hcCwgYm9vbGVhbiBzdGRvdXQpCi0gICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB1cmlNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgVVJJIHNvdXJjZSA9IChVUkkpaS5uZXh0KCk7Ci0gICAgICAgICAgICBVUkkgdGFyZ2V0ID0gKFVSSSl1cmlNYXAuZ2V0KHNvdXJjZSk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJT1V0aWwuY29weUNvbXBsZXRlbHkoc291cmNlLCB0YXJnZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzdGRvdXQpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGNvcHkgIiArIHNvdXJjZSArICIgLT4gIiArIHRhcmdldCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3Rkb3V0KQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb3BpZWQgIiArIHNvdXJjZSArICIgLT4gIiArIHRhcmdldCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgc2NoZW1hIG9yIHdzZGwgYXQgdGhlIHNvdXJjZSBVUkkgdG8gdGhlIHRhcmdldCBVUkksIGFsb25nCi0gICAgICogd2l0aCBhbnkgcmVsYXRpdmUgcmVmZXJlbmNlcy4gIFRoZSB0YXJnZXQgVVJJIHNob3VsZCBiZSBhIGZpbGUgVVJJLgotICAgICAqIElmIGRvQ29weSBpcyBmYWxzZSwgdGhlIGZpbGUgY29waWVzIGFyZSBub3QgYWN0dWFsbHkgZG9uZTsgdGhlIG1hcAotICAgICAqIHJldHVybmVkIGp1c3QgZGVzY3JpYmVzIHRoZSBjb3BpZXMgdGhhdCB3b3VsZCBoYXZlIGJlZW4gZG9uZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2UgYW4gYXJiaXRyYXJ5IFVSSSBkZXNjcmliaW5nIGEgc291cmNlIFNjaGVtYSBvciBXU0RMCi0gICAgICogQHBhcmFtIHRhcmdldCBhIGZpbGUgVVJJIGRlc2NyaWJpbmcgYSB0YXJnZXQgZmlsZW5hbWUKLSAgICAgKiBAcmV0dXJuIGEgbWFwIG9mIGFsbCB0aGUgc291cmNlL3RhcmdldCBVUklzIG5lZWRlZCB0byBjb3B5Ci0gICAgICogdGhlIGZpbGUgYWxvbmcgd2l0aCBhbGwgaXRzIHJlbGF0aXZlIHJlZmVyZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcCBmaW5kQWxsUmVsYXRpdmUoVVJJIHNvdXJjZSwgVVJJIHRhcmdldCkKLSAgICB7Ci0gICAgICAgIE1hcCByZXN1bHQgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICByZXN1bHQucHV0KHNvdXJjZSwgdGFyZ2V0KTsKLQotICAgICAgICBMaW5rZWRMaXN0IHByb2Nlc3MgPSBuZXcgTGlua2VkTGlzdCgpOwotICAgICAgICBwcm9jZXNzLmFkZChzb3VyY2UpOwotCi0gICAgICAgIHdoaWxlICghcHJvY2Vzcy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFVSSSBuZXh0U291cmNlID0gKFVSSSlwcm9jZXNzLnJlbW92ZUZpcnN0KCk7Ci0gICAgICAgICAgICBVUkkgbmV4dFRhcmdldCA9IChVUkkpcmVzdWx0LmdldChuZXh0U291cmNlKTsKLSAgICAgICAgICAgIE1hcCBuZXh0UmVzdWx0cyA9IGZpbmRSZWxhdGl2ZUluT25lKG5leHRTb3VyY2UsIG5leHRUYXJnZXQpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbmV4dFJlc3VsdHMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBVUkkgbmV3U291cmNlID0gKFVSSSlpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmNvbnRhaW5zS2V5KG5ld1NvdXJjZSkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQobmV3U291cmNlLCBuZXh0UmVzdWx0cy5nZXQobmV3U291cmNlKSk7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzcy5hZGQobmV3U291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhtbE9wdGlvbnMgbG9hZE9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpLgotICAgICAgICAgICAgc2V0TG9hZFN1YnN0aXR1dGVOYW1lc3BhY2VzKENvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcCgKLSAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiwgImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbnRlcm5hbC94bWxiZWFucy93c2Rsc3Vic3QiIAotICAgICAgICAgICAgKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgZmluZFJlbGF0aXZlSW5PbmUoVVJJIHNvdXJjZSwgVVJJIHRhcmdldCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBVUkwgc291cmNlVVJMID0gc291cmNlLnRvVVJMKCk7Ci0gICAgICAgICAgICBYbWxPYmplY3QgeG9iaiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHNvdXJjZVVSTCwgbG9hZE9wdGlvbnMpOwotICAgICAgICAgICAgWG1sQ3Vyc29yIHhjdXIgPSB4b2JqLm5ld0N1cnNvcigpOwotICAgICAgICAgICAgeGN1ci50b0ZpcnN0Q2hpbGQoKTsKLQotICAgICAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0KLSAgICAgICAgICAgIGlmICh4b2JqIGluc3RhbmNlb2YgU2NoZW1hRG9jdW1lbnQpCi0gICAgICAgICAgICAgICAgcHV0TWFwcGluZ3NGcm9tU2NoZW1hKHJlc3VsdCwgc291cmNlLCB0YXJnZXQsICgoU2NoZW1hRG9jdW1lbnQpeG9iaikuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgICAgZWxzZSBpZiAoeG9iaiBpbnN0YW5jZW9mIERlZmluaXRpb25zRG9jdW1lbnQpCi0gICAgICAgICAgICAgICAgcHV0TWFwcGluZ3NGcm9tV3NkbChyZXN1bHQsIHNvdXJjZSwgdGFyZ2V0LCAoKERlZmluaXRpb25zRG9jdW1lbnQpeG9iaikuZ2V0RGVmaW5pdGlvbnMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gYW55IGV4Y2VwdGlvbnMgcGFyc2luZyB0aGUgZ2l2ZW4gVVJMPyAgVGhlbiBza2lwIHRoaXMgZmlsZSBzaWxlbnRseQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXROZXdNYXBwaW5nKE1hcCByZXN1bHQsIFVSSSBvcmlnU291cmNlLCBVUkkgb3JpZ1RhcmdldCwgU3RyaW5nIGxpdGVyYWxVUkkpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGxpdGVyYWxVUkkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBVUkkgbmV3UmVsYXRpdmUgPSBuZXcgVVJJKGxpdGVyYWxVUkkpOwotICAgICAgICAgICAgaWYgKG5ld1JlbGF0aXZlLmlzQWJzb2x1dGUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBVUkkgbmV3U291cmNlID0gQ29kZUdlblV0aWwucmVzb2x2ZShvcmlnU291cmNlLCBuZXdSZWxhdGl2ZSk7Ci0gICAgICAgICAgICBVUkkgbmV3VGFyZ2V0ID0gQ29kZUdlblV0aWwucmVzb2x2ZShvcmlnVGFyZ2V0LCBuZXdSZWxhdGl2ZSk7Ci0gICAgICAgICAgICByZXN1bHQucHV0KG5ld1NvdXJjZSwgbmV3VGFyZ2V0KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHVyaSBzeW50YXggcHJvYmxlbT8gZG8gbm90aGluZyBzaWxlbnRseS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHV0TWFwcGluZ3NGcm9tU2NoZW1hKE1hcCByZXN1bHQsIFVSSSBzb3VyY2UsIFVSSSB0YXJnZXQsIFNjaGVtYURvY3VtZW50LlNjaGVtYSBzY2hlbWEpCi0gICAgewotICAgICAgICBJbXBvcnREb2N1bWVudC5JbXBvcnRbXSBpbXBvcnRzID0gc2NoZW1hLmdldEltcG9ydEFycmF5KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHB1dE5ld01hcHBpbmcocmVzdWx0LCBzb3VyY2UsIHRhcmdldCwgaW1wb3J0c1tpXS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKLQotICAgICAgICBJbmNsdWRlRG9jdW1lbnQuSW5jbHVkZVtdIGluY2x1ZGVzID0gc2NoZW1hLmdldEluY2x1ZGVBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgcHV0TmV3TWFwcGluZyhyZXN1bHQsIHNvdXJjZSwgdGFyZ2V0LCBpbmNsdWRlc1tpXS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHB1dE1hcHBpbmdzRnJvbVdzZGwoTWFwIHJlc3VsdCwgVVJJIHNvdXJjZSwgVVJJIHRhcmdldCwgRGVmaW5pdGlvbnNEb2N1bWVudC5EZWZpbml0aW9ucyB3ZG9jKQotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0W10gdHlwZXMgPSB3ZG9jLmdldFR5cGVzQXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hRG9jdW1lbnQuU2NoZW1hW10gc2NoZW1hcyA9IChTY2hlbWFEb2N1bWVudC5TY2hlbWFbXSl0eXBlc1tpXS5zZWxlY3RQYXRoKCJkZWNsYXJlIG5hbWVzcGFjZSB4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnIHhzOnNjaGVtYSIpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzY2hlbWFzLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgICAgIHB1dE1hcHBpbmdzRnJvbVNjaGVtYShyZXN1bHQsIHNvdXJjZSwgdGFyZ2V0LCBzY2hlbWFzW2pdKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRJbXBvcnRbXSBpbXBvcnRzID0gd2RvYy5nZXRJbXBvcnRBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBwdXROZXdNYXBwaW5nKHJlc3VsdCwgc291cmNlLCB0YXJnZXQsIGltcG9ydHNbaV0uZ2V0TG9jYXRpb24oKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hSW1wb3J0UmVzb2x2ZXIuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUltcG9ydFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwM2M4MmYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hSW1wb3J0UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudC5TY2hlbWE7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5JbXBvcnREb2N1bWVudC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5JbmNsdWRlRG9jdW1lbnQuSW5jbHVkZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNjaGVtYUltcG9ydFJlc29sdmVyCi17Ci0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIEltcG9ydExvYWRlciB3aXNoZXMgdG8gcmVzb2x2ZSB0aGUKLSAgICAgKiBnaXZlbiBpbXBvcnQuICBTaG91bGQgcmV0dXJuIGEgU2NoZW1hUmVzb3VyY2Ugd2hvc2UKLSAgICAgKiAiZXF1YWxzIiByZWxhdGlvbnNoaXAgcmV2ZWFscyB3aGVuIGEgU2NoZW1hUmVzb3VyY2UgaXMKLSAgICAgKiBkdXBsaWNhdGVkIGFuZCBzaG91bGRuJ3QgYmUgZXhhbWluZWQgYWdhaW4uCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHJlc291cmNlIHJlZmVyZW5jZSBzaG91bGQgYmUgaWdub3JlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hUmVzb3VyY2UgbG9va3VwUmVzb3VyY2UoU3RyaW5nIG5zVVJJLCBTdHJpbmcgVVJMKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB0byBub3RpZnkgdGhhdCB0aGUgZXhwZWN0ZWQgbmFtZXNwYWNlIGlzIGRpZmZlcmVudCBmcm9tIHRoZQotICAgICAqIGFjdHVhbCBuYW1lc3BhY2UsIG9yIGlmIG5vIG5hbWVzcGFjZSBpcyBrbm93biwgdG8gcmVwb3J0IHRoZQotICAgICAqIGRpc2NvdmVyZWQgbmFtZXNwYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlcG9ydEFjdHVhbE5hbWVzcGFjZShTY2hlbWFSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGFjdHVhbE5hbWVzcGFjZSk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIHN1cHBseSBhIHNjaGVtYSByZXNvdXJjZSB3aXRoIGFuIG9wdGlvbmFsIGFzc29jaWF0ZWQKLSAgICAgKiBleHBlY3RlZC1uYW1lc3BhY2UtVVJJIGFuZCBvcmlnaW5hbC1sb2NhdGlvbi1VUkwuCi0gICAgICoKLSAgICAgKiBUaGUgZXF1YWxzIChhbmQgaGFzaENvZGUpIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgU2NoZW1hUmVzb3VyY2UKLSAgICAgKiBvYmplY3RzIHdpbGwgYmUgdXNlZCB0byBhdm9pZCBleGFtaW5pbmcgdGhlIHNhbWUgcmVzb3VyY2UgdHdpY2U7Ci0gICAgICogdGhlc2UgbXVzdCBiZSBpbXBsZW1lbnRlZCBhY2NvcmRpbmcgdG8gdGhlIGRlc2lyZWQgcnVsZXMgZm9yCi0gICAgICogZGV0ZXJtaW5pbmcgdGhhdCB0d28gcmVzb3VyY2VzIGFyZSB0aGUgc2FtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFNjaGVtYVJlc291cmNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBhIHBhcnNlZCBzY2hlbWEgb2JqZWN0LgotICAgICAgICAgKi8KLQotICAgICAgICBwdWJsaWMgU2NoZW1hIGdldFNjaGVtYSgpOwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hTG9jYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCByZXNvbHZlSW1wb3J0cyhTY2hlbWFSZXNvdXJjZVtdIHJlc291cmNlcykKLSAgICB7Ci0gICAgICAgIExpbmtlZExpc3QgcXVldWVPZlJlc291cmNlcyA9IG5ldyBMaW5rZWRMaXN0KEFycmF5cy5hc0xpc3QocmVzb3VyY2VzKSk7Ci0gICAgICAgIExpbmtlZExpc3QgcXVldWVPZkxvY2F0b3JzID0gbmV3IExpbmtlZExpc3QoKTsKLSAgICAgICAgU2V0IHNlZW5SZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYVJlc291cmNlIG5leHRSZXNvdXJjZTsKLQotICAgICAgICAgICAgLy8gZmV0Y2ggbmV4dCByZXNvdXJjZS4KLSAgICAgICAgICAgIGlmICghcXVldWVPZlJlc291cmNlcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gZWl0aGVyIG9mZiB0aGUgaW5pdGlhbCBxdWV1ZQotICAgICAgICAgICAgICAgIG5leHRSZXNvdXJjZSA9IChTY2hlbWFSZXNvdXJjZSlxdWV1ZU9mUmVzb3VyY2VzLnJlbW92ZUZpcnN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghcXVldWVPZkxvY2F0b3JzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBvciBvZmYgdGhlIGxpc3Qgb2YgbG9jYXRvcnMKLSAgICAgICAgICAgICAgICBTY2hlbWFMb2NhdG9yIGxvY2F0b3IgPSAoU2NoZW1hTG9jYXRvcilxdWV1ZU9mTG9jYXRvcnMucmVtb3ZlRmlyc3QoKTsKLSAgICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UgPSBsb29rdXBSZXNvdXJjZShsb2NhdG9yLm5hbWVzcGFjZSwgbG9jYXRvci5zY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKG5leHRSZXNvdXJjZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBpZiBubyBtb3JlLCB0aGVuIHRlcm1pbmF0ZSBsb29wCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHRyYWNrIGFuZCBza2lwIGR1cGxpY2F0ZXMKLSAgICAgICAgICAgIGlmIChzZWVuUmVzb3VyY2VzLmNvbnRhaW5zKG5leHRSZXNvdXJjZSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBzZWVuUmVzb3VyY2VzLmFkZChuZXh0UmVzb3VyY2UpOwotCi0gICAgICAgICAgICAvLyBnZXQgcmVzb3VyY2UgY29udGVudHMKLSAgICAgICAgICAgIFNjaGVtYSBzY2hlbWEgPSBuZXh0UmVzb3VyY2UuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICBpZiAoc2NoZW1hID09IG51bGwpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGFjdHVhbCBuYW1lc3BhY2UKLSAgICAgICAgICAgIFN0cmluZyBhY3R1YWxUYXJnZXROYW1lc3BhY2UgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBpZiAoYWN0dWFsVGFyZ2V0TmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgICAgICAgICAgYWN0dWFsVGFyZ2V0TmFtZXNwYWNlID0gIiI7Ci0KLSAgICAgICAgICAgIC8vIHJlcG9ydCBhY3R1YWwgbmFtZXNwYWNlCi0gICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRUYXJnZXROYW1lc3BhY2UgPSBuZXh0UmVzb3VyY2UuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBpZiAoZXhwZWN0ZWRUYXJnZXROYW1lc3BhY2UgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAhYWN0dWFsVGFyZ2V0TmFtZXNwYWNlLmVxdWFscyhleHBlY3RlZFRhcmdldE5hbWVzcGFjZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVwb3J0QWN0dWFsTmFtZXNwYWNlKG5leHRSZXNvdXJjZSwgYWN0dWFsVGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm93IGdvIHRocm91Z2ggYW5kIHJlY29yZCBhbGwgdGhlIGltcG9ydHMKLSAgICAgICAgICAgIEltcG9ydFtdIHNjaGVtYUltcG9ydHMgPSBzY2hlbWEuZ2V0SW1wb3J0QXJyYXkoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hSW1wb3J0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBxdWV1ZU9mTG9jYXRvcnMuYWRkKG5ldyBTY2hlbWFMb2NhdG9yKHNjaGVtYUltcG9ydHNbaV0uZ2V0TmFtZXNwYWNlKCkgPT0gbnVsbCA/ICIiIDogc2NoZW1hSW1wb3J0c1tpXS5nZXROYW1lc3BhY2UoKSwgc2NoZW1hSW1wb3J0c1tpXS5nZXRTY2hlbWFMb2NhdGlvbigpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGFuZCByZWNvcmQgYWxsIHRoZSBpbmNsdWRlcyB0b28KLSAgICAgICAgICAgIEluY2x1ZGVbXSBzY2hlbWFJbmNsdWRlcyA9IHNjaGVtYS5nZXRJbmNsdWRlQXJyYXkoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hSW5jbHVkZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcXVldWVPZkxvY2F0b3JzLmFkZChuZXcgU2NoZW1hTG9jYXRvcihudWxsLCBzY2hlbWFJbmNsdWRlc1tpXS5nZXRTY2hlbWFMb2NhdGlvbigpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTY2hlbWFMb2NhdG9yCi0gICAgewotICAgICAgICBwdWJsaWMgU2NoZW1hTG9jYXRvcihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgc2NoZW1hTG9jYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotICAgICAgICAgICAgdGhpcy5zY2hlbWFMb2NhdGlvbiA9IHNjaGVtYUxvY2F0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBuYW1lc3BhY2U7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgc2NoZW1hTG9jYXRpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hUmVzb3VyY2VNYW5hZ2VyLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFSZXNvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ4ODIzNC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFSZXNvdXJjZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5JT1V0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIFNjaGVtYVJlc291cmNlTWFuYWdlciBleHRlbmRzIEJhc2VTY2hlbWFSZXNvdXJjZU1hbmFnZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1haW50YWlucyBcInhzZG93bmxvYWQueG1sXCIsIGFuIGluZGV4IG9mIGxvY2FsbHkgZG93bmxvYWRlZCAueHNkIGZpbGVzIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInVzYWdlOiBzZG93bmxvYWQgWy1kaXIgZGlyZWN0b3J5XSBbLXJlZnJlc2hdIFstcmVjdXJzZV0gWy1zeW5jXSBbdXJsL2ZpbGUuLi5dIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVUkxzIHRoYXQgYXJlIHNwZWNpZmllZCBhcmUgZG93bmxvYWRlZCBpZiB0aGV5IGFyZW4ndCBhbHJlYWR5IGNhY2hlZC4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW4gYWRkaXRpb246Iik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWRpciBzcGVjaWZpZXMgdGhlIGRpcmVjdG9yeSBmb3IgdGhlIHhzZG93bmxvYWQueG1sIGZpbGUgKGRlZmF1bHQgLikuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLXN5bmMgc3luY2hyb25pemVzIHRoZSBpbmRleCB0byBhbnkgbG9jYWwgLnhzZCBmaWxlcyBpbiB0aGUgdHJlZS4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtcmVjdXJzZSByZWN1cnNpdmVseSBkb3dubG9hZHMgaW1wb3J0ZWQgYW5kIGluY2x1ZGVkIC54c2QgZmlsZXMuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLXJlZnJlc2ggcmVkb3dubG9hZHMgYWxsIGluZGV4ZWQgLnhzZCBmaWxlcy4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSWYgbm8gZmlsZXMgb3IgVVJMcyBhcmUgc3BlY2lmaWVkLCBhbGwgaW5kZXhlZCBmaWxlcyBhcmUgcmVsZXZhbnQuIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFNldCBvcHRzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgb3B0cy5hZGQoImRpciIpOwotICAgICAgICBDb21tYW5kTGluZSBjbCA9IG5ldyBDb21tYW5kTGluZShhcmdzLCBvcHRzKTsKLSAgICAgICAgaWYgKGNsLmdldE9wdCgibGljZW5zZSIpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbW1hbmRMaW5lLnByaW50TGljZW5zZSgpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGFyZ3MgPSBjbC5hcmdzKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBzeW5jID0gKGNsLmdldE9wdCgic3luYyIpICE9IG51bGwpOwotICAgICAgICBib29sZWFuIHJlZnJlc2ggPSAoY2wuZ2V0T3B0KCJyZWZyZXNoIikgIT0gbnVsbCk7Ci0gICAgICAgIGJvb2xlYW4gaW1wb3J0cyA9IChjbC5nZXRPcHQoInJlY3Vyc2UiKSAhPSBudWxsKTsKLSAgICAgICAgU3RyaW5nIGRpciA9IGNsLmdldE9wdCgiZGlyIik7Ci0gICAgICAgIGlmIChkaXIgPT0gbnVsbCkKLSAgICAgICAgICAgIGRpciA9ICIuIjsKLSAgICAgICAgRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZShkaXIpOwotCi0gICAgICAgIFNjaGVtYVJlc291cmNlTWFuYWdlciBtZ3I7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBtZ3IgPSBuZXcgU2NoZW1hUmVzb3VyY2VNYW5hZ2VyKGRpcmVjdG9yeSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgdXJpTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTGlzdCBmaWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobG9va3NMaWtlVVJMKGFyZ3NbaV0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVyaUxpc3QuYWRkKGFyZ3NbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbGVMaXN0LmFkZChuZXcgRmlsZShkaXJlY3RvcnksIGFyZ3NbaV0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRlYWwgd2l0aCBmaWxlcyB0aGF0IGFyZSBub3QgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZmlsZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gKEZpbGUpaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIWlzSW5EaXJlY3RvcnkoZmlsZSwgZGlyZWN0b3J5KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkZpbGUgbm90IHdpdGhpbiBkaXJlY3Rvcnk6ICIgKyBmaWxlKTsKLSAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGVhbCB3aXRoIGRpcmVjdG9yaWVzCi0gICAgICAgIGZpbGVMaXN0ID0gY29sbGVjdFhTREZpbGVzKChGaWxlW10pZmlsZUxpc3QudG9BcnJheShuZXcgRmlsZVswXSkpOwotCi0gICAgICAgIFN0cmluZ1tdIHVyaXMgPSAoU3RyaW5nW10pdXJpTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICBGaWxlW10gZmlsZXMgPSAoRmlsZVtdKWZpbGVMaXN0LnRvQXJyYXkobmV3IEZpbGVbMF0pOwotICAgICAgICBTdHJpbmdbXSBmaWxlbmFtZXMgPSByZWxhdGl2ZUZpbGVuYW1lcyhmaWxlcywgZGlyZWN0b3J5KTsKLQotICAgICAgICBpZiAodXJpcy5sZW5ndGggKyBmaWxlbmFtZXMubGVuZ3RoID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgbWdyLnByb2Nlc3ModXJpcywgZmlsZW5hbWVzLCBzeW5jLCByZWZyZXNoLCBpbXBvcnRzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1nci5wcm9jZXNzQWxsKHN5bmMsIHJlZnJlc2gsIGltcG9ydHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgbWdyLndyaXRlQ2FjaGUoKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBsb29rc0xpa2VVUkwoU3RyaW5nIHN0cikKLSAgICB7Ci0gICAgICAgIHJldHVybiBzdHIuc3RhcnRzV2l0aCgiaHR0cDoiKSB8fCBzdHIuc3RhcnRzV2l0aCgiaHR0cHM6IikgfHwgc3RyLnN0YXJ0c1dpdGgoImZ0cDoiKSB8fCBzdHIuc3RhcnRzV2l0aCgiZmlsZToiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVsYXRpdmVGaWxlbmFtZShGaWxlIGZpbGUsIEZpbGUgZGlyZWN0b3J5KQotICAgIHsKLSAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCB8fCBmaWxlLmVxdWFscyhkaXJlY3RvcnkpKQotICAgICAgICAgICAgcmV0dXJuICIuIjsKLSAgICAgICAgcmV0dXJuIHJlbGF0aXZlRmlsZW5hbWUoZmlsZS5nZXRQYXJlbnRGaWxlKCksIGRpcmVjdG9yeSkgKyAiLyIgKyBmaWxlLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSByZWxhdGl2ZUZpbGVuYW1lcyhGaWxlW10gZmlsZXMsIEZpbGUgZGlyZWN0b3J5KQotICAgIHsKLSAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tmaWxlcy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHRbaV0gPSByZWxhdGl2ZUZpbGVuYW1lKGZpbGVzW2ldLCBkaXJlY3RvcnkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luRGlyZWN0b3J5KEZpbGUgZmlsZSwgRmlsZSBkaXIpCi0gICAgewotICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoZmlsZS5lcXVhbHMoZGlyKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gaXNJbkRpcmVjdG9yeShmaWxlLmdldFBhcmVudEZpbGUoKSwgZGlyKTsKLSAgICB9Ci0KLQotCi0KLQotICAgIHB1YmxpYyBTY2hlbWFSZXNvdXJjZU1hbmFnZXIoRmlsZSBkaXJlY3RvcnkpCi0gICAgewotICAgICAgICBfZGlyZWN0b3J5ID0gZGlyZWN0b3J5OwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlIF9kaXJlY3Rvcnk7Ci0KLQotICAgIC8vIFNPTUUgTUVUSE9EUyBUTyBPVkVSUklERSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBtZXNzYWdlcyB0byBTeXN0ZW0ub3V0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdhcm5pbmcoU3RyaW5nIG1zZykKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZmlsZW5hbWUgZXhpc3RzLiAgVGhlIGZpbGVuYW1lcwotICAgICAqIGFyZSBvZiB0aGUgZm9ybSAiL2Zvby9iYXIvemVlLnhzZCIgYW5kIHNob3VsZCBiZSBjb25zdHJ1ZWQKLSAgICAgKiBhcyByb290ZWQgYXQgdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZmlsZUV4aXN0cyhTdHJpbmcgZmlsZW5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKG5ldyBGaWxlKF9kaXJlY3RvcnksIGZpbGVuYW1lKSkuZXhpc3RzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGF0YSBpbiB0aGUgZ2l2ZW4gZmlsZW5hbWUgYXMgYW4gSW5wdXRTdHJlYW0uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGlucHV0U3RyZWFtRm9yRmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoX2RpcmVjdG9yeSwgZmlsZW5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYW4gZW50aXJlIGZpbGUgaW4gb25lIHN0ZXAuICBBbiBJbnB1dFN0cmVhbSBpcyBwYXNzZWQgYW5kCi0gICAgICogY29waWVkIHRvIHRoZSBmaWxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlSW5wdXRTdHJlYW1Ub0ZpbGUoSW5wdXRTdHJlYW0gaW5wdXQsIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShfZGlyZWN0b3J5LCBmaWxlbmFtZSk7Ci0KLSAgICAgICAgRmlsZSBwYXJlbnQgPSB0YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgaWYgKCFwYXJlbnQuZXhpc3RzKCkpCi0gICAgICAgICAgICBwYXJlbnQubWtkaXJzKCk7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXRGaWxlKTsKLSAgICAgICAgSU9VdGlsLmNvcHlDb21wbGV0ZWx5KGlucHV0LCBvdXRwdXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgYSBmaWxlLiAgU29tZXRpbWVzIGltbWVkaWF0ZWx5IGFmdGVyIHdyaXRpbmcgYSBuZXcgZmlsZQotICAgICAqIHdlIG5vdGljZSB0aGF0IGl0J3MgZXhhY3RseSB0aGUgc2FtZSBhcyBhbiBleGlzdGluZyBmaWxlIGFuZAotICAgICAqIHdlIGRlbGV0ZSBpdC4gV2UgbmV2ZXIgZGVsZXRlIGEgZmlsZSB0aGF0IHdhcyBnaXZlbiB0byB1cwotICAgICAqIGJ5IHRoZSB1c2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRlbGV0ZUZpbGUoU3RyaW5nIGZpbGVuYW1lKQotICAgIHsKLSAgICAgICAgbmV3IEZpbGUoX2RpcmVjdG9yeSwgZmlsZW5hbWUpLmRlbGV0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgWFNEIGZpbGVzbmFtZXMgaW4gdGhlIHByb2plY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldEFsbFhTREZpbGVuYW1lcygpCi0gICAgewotICAgICAgICBGaWxlW10gYWxsRmlsZXMgPSAoRmlsZVtdKWNvbGxlY3RYU0RGaWxlcyhuZXcgRmlsZVtdIHsgX2RpcmVjdG9yeSB9KS50b0FycmF5KG5ldyBGaWxlWzBdKTsKLSAgICAgICAgcmV0dXJuIHJlbGF0aXZlRmlsZW5hbWVzKGFsbEZpbGVzLCBfZGlyZWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaW1wbGUgcmVjdXJzaXZlIGZpbGUgZmlsdGVyIHRvIGRvIHRoZSBhYm92ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0IGNvbGxlY3RYU0RGaWxlcyhGaWxlW10gZGlycykKLSAgICB7Ci0gICAgICAgIExpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmID0gZGlyc1tpXTsKLSAgICAgICAgICAgIGlmICghZi5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbGVzLmFkZChmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWxlcy5hZGRBbGwoY29sbGVjdFhTREZpbGVzKAotICAgICAgICAgICAgICAgICAgICBmLmxpc3RGaWxlcyhuZXcgRmlsZUZpbHRlcigpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gZmlsZS5pc0RpcmVjdG9yeSgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmlzRmlsZSgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnhzZCIpOyB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICApKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpbGVzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvVHlwZUhpZXJhcmNoeVByaW50ZXIuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1R5cGVIaWVyYXJjaHlQcmludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZTM2MzIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvVHlwZUhpZXJhcmNoeVByaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgVHlwZUhpZXJhcmNoeVByaW50ZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb21tYW5kTGluZSBjbCA9IG5ldyBDb21tYW5kTGluZShhcmdzLCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQpOwotICAgICAgICBpZiAoY2wuZ2V0T3B0KCJsaWNlbnNlIikgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29tbWFuZExpbmUucHJpbnRMaWNlbnNlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2wuYXJncygpLmxlbmd0aCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW50cyBpbmhlcml0YW5jZSBoaWVyYXJjaHkgb2YgdHlwZXMgZGVmaW5lZCBpbiBhIHNjaGVtYS4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IHhzZHRyZWUgWy1ub2Fub25dIFstbm9wdnJdIFstbm91cGFdIFstbGljZW5zZV0gZmlsZTEueHNkIGZpbGUyLnhzZCAuLi4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBub2Fub24gPSAoY2wuZ2V0T3B0KCJub2Fub24iKSAhPSBudWxsKTsKLSAgICAgICAgYm9vbGVhbiBub3B2ciA9IChjbC5nZXRPcHQoIm5vcHZyIikgIT0gbnVsbCk7Ci0gICAgICAgIGJvb2xlYW4gbm91cGEgPSAoY2wuZ2V0T3B0KCJub3VwYSIpICE9IG51bGwpOwotICAgICAgICAKLSAgICAgICAgRmlsZVtdIHNjaGVtYUZpbGVzID0gY2wuZ2V0RmlsZXMoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHN0ZXAgMTogbG9hZCBhbGwgdGhlIGZpbGVzCi0gICAgICAgIExpc3Qgc2RvY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hRmlsZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNkb2NzLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUZpbGVzW2ldLCAobmV3IFhtbE9wdGlvbnMoKSkuc2V0TG9hZExpbmVOdW1iZXJzKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIHNjaGVtYUZpbGVzW2ldICsgIiBub3QgbG9hZGFibGU6ICIgKyBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0KLSAgICAgICAgWG1sT2JqZWN0W10gc2NoZW1hcyA9IChYbWxPYmplY3RbXSlzZG9jcy50b0FycmF5KG5ldyBYbWxPYmplY3RbMF0pOwotICAgICAgICAKLSAgICAgICAgLy8gc3RlcCAyOiBjb21waWxlIGFsbCB0aGUgc2NoZW1hcwotICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHR5cGVTeXN0ZW07Ci0gICAgICAgIENvbGxlY3Rpb24gY29tcEVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgWG1sT3B0aW9ucyBzY2hlbWFPcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgc2NoZW1hT3B0aW9ucy5zZXRFcnJvckxpc3RlbmVyKGNvbXBFcnJvcnMpOwotICAgICAgICBzY2hlbWFPcHRpb25zLnNldENvbXBpbGVEb3dubG9hZFVybHMoKTsKLSAgICAgICAgaWYgKG5vcHZyKQotICAgICAgICAgICAgc2NoZW1hT3B0aW9ucy5zZXRDb21waWxlTm9QdnJSdWxlKCk7Ci0gICAgICAgIGlmIChub3VwYSkKLSAgICAgICAgICAgIHNjaGVtYU9wdGlvbnMuc2V0Q29tcGlsZU5vVXBhUnVsZSgpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHR5cGVTeXN0ZW0gPSBYbWxCZWFucy5jb21waWxlWHNkKHNjaGVtYXMsIFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCksIHNjaGVtYU9wdGlvbnMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTY2hlbWEgaW52YWxpZCIpOwotICAgICAgICAgICAgaWYgKGNvbXBFcnJvcnMuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBlbHNlIGZvciAoSXRlcmF0b3IgaSA9IGNvbXBFcnJvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaS5uZXh0KCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBzdGVwIDM6IGdvIHRocm91Z2ggYWxsIHRoZSB0eXBlcywgYW5kIG5vdGUgdGhlaXIgYmFzZSB0eXBlcyBhbmQgbmFtZXNwYWNlcwotICAgICAgICBNYXAgcHJlZml4ZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBwcmVmaXhlcy5wdXQoImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsICJ4bWwiKTsKLSAgICAgICAgcHJlZml4ZXMucHV0KCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJ4cyIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInhtbG5zOnhzPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIiIpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGEgbWFwIG9mIChiYXNlIFNjaGVtYVR5cGUgLT4gQ29sbGVjdGlvbiBvZiBkaXJlY3RseSBkZXJ2aWVkIHR5cGVzKQotICAgICAgICBNYXAgY2hpbGRUeXBlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBicmVhZHRoZmlyc3QgdHJhdmVyc2FsIG9mIHRoZSB0eXBlIGNvbnRhaW5tZW50IHRyZWUKLSAgICAgICAgTGlzdCBhbGxTZWVuVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0eXBlU3lzdGVtLmRvY3VtZW50VHlwZXMoKSkpOwotICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QodHlwZVN5c3RlbS5hdHRyaWJ1dGVUeXBlcygpKSk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0eXBlU3lzdGVtLmdsb2JhbFR5cGVzKCkpKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbFNlZW5UeXBlcy5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSA9IChTY2hlbWFUeXBlKWFsbFNlZW5UeXBlcy5nZXQoaSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHJlY3Vyc2UgdGhyb3VnaCBuZXN0ZWQgYW5vbnltb3VzIHR5cGVzIGFzIHdlbGwKLSAgICAgICAgICAgIGlmICghbm9hbm9uKQotICAgICAgICAgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCBpbnRlcmVzdGVkIGluIGRvY3VtZW50IHR5cGVzLCBhdHRyaWJ1dGUgdHlwZXMsIG9yIGNoYXNpbmcgdGhlIGJhc2UgdHlwZSBvZiBhbnlUeXBlCi0gICAgICAgICAgICBpZiAoc1R5cGUuaXNEb2N1bWVudFR5cGUoKSB8fCBzVHlwZS5pc0F0dHJpYnV0ZVR5cGUoKSB8fCBzVHlwZSA9PSBYbWxPYmplY3QudHlwZSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gYXNzaWduIGEgcHJlZml4IHRvIHRoZSBuYW1lc3BhY2Ugb2YgdGhpcyB0eXBlIGlmIG5lZWRlZAotICAgICAgICAgICAgbm90ZU5hbWVzcGFjZShwcmVmaXhlcywgc1R5cGUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBlbnRlciB0aGlzIHR5cGUgaW4gdGhlIGxpc3Qgb2YgY2hpbGRyZW4gb2YgaXRzIGJhc2UgdHlwZQotICAgICAgICAgICAgQ29sbGVjdGlvbiBjaGlsZHJlbiA9IChDb2xsZWN0aW9uKWNoaWxkVHlwZXMuZ2V0KHNUeXBlLmdldEJhc2VUeXBlKCkpOwotICAgICAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgY2hpbGRUeXBlcy5wdXQoc1R5cGUuZ2V0QmFzZVR5cGUoKSwgY2hpbGRyZW4pOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCB0aW1lIGEgYnVpbHRpbiB0eXBlIGlzIHNlZW4sIGFkZCBpdCB0b28gKHRvIGdldCBhIGNvbXBsZXRlIHRyZWUgdXAgdG8gYW55VHlwZSkKLSAgICAgICAgICAgICAgICBpZiAoc1R5cGUuZ2V0QmFzZVR5cGUoKS5pc0J1aWx0aW5UeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgIGFsbFNlZW5UeXBlcy5hZGQoc1R5cGUuZ2V0QmFzZVR5cGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGlsZHJlbi5hZGQoc1R5cGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBzdGVwIDQ6IHByaW50IHRoZSB0cmVlLCBzdGFydGluZyBmcm9tIHhzOmFueVR5cGUgKGkuZS4sIFhtbE9iamVjdC50eXBlKQotICAgICAgICBMaXN0IHR5cGVzVG9QcmludCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdHlwZXNUb1ByaW50LmFkZChYbWxPYmplY3QudHlwZSk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzcGFjZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHdoaWxlICghdHlwZXNUb1ByaW50LmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSA9IChTY2hlbWFUeXBlKXR5cGVzVG9QcmludC5yZW1vdmUodHlwZXNUb1ByaW50LnNpemUoKSAtIDEpOwotICAgICAgICAgICAgaWYgKHNUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgc3BhY2VzLnNldExlbmd0aChNYXRoLm1heCgwLCBzcGFjZXMubGVuZ3RoKCkgLSAyKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNwYWNlcyArICIrLSIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSwgcHJlZml4ZXMpICsgbm90ZXMoc1R5cGUpKTsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIGNoaWxkcmVuID0gKENvbGxlY3Rpb24pY2hpbGRUeXBlcy5nZXQoc1R5cGUpOwotICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLnNpemUoKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzcGFjZXMuYXBwZW5kKHR5cGVzVG9QcmludC5zaXplKCkgPT0gMCB8fCB0eXBlc1RvUHJpbnQuZ2V0KHR5cGVzVG9QcmludC5zaXplKCkgLSAxKSA9PSBudWxsID8gIiAgIiA6ICJ8ICIpOwotICAgICAgICAgICAgICAgICAgICB0eXBlc1RvUHJpbnQuYWRkKG51bGwpOwotICAgICAgICAgICAgICAgICAgICB0eXBlc1RvUHJpbnQuYWRkQWxsKGNoaWxkcmVuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5vdGVzKFNjaGVtYVR5cGUgc1R5cGUpCi0gICAgewotICAgICAgICBpZiAoc1R5cGUuaXNCdWlsdGluVHlwZSgpKQotICAgICAgICAgICAgcmV0dXJuICIgKGJ1aWx0aW4pIjsKLSAgICAgICAgCi0gICAgICAgIGlmIChzVHlwZS5pc1NpbXBsZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiIChsaXN0KSI7Ci0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiAodW5pb24pIjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBpZiAoc1R5cGUuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIgKGVudW1lcmF0aW9uKSI7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc3dpdGNoIChzVHlwZS5nZXRDb250ZW50VHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIiAobWl4ZWQpIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIiAoY29tcGxleCkiOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBub3RlTmFtZXNwYWNlKE1hcCBwcmVmaXhlcywgU2NoZW1hVHlwZSBzVHlwZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBRTmFtZUhlbHBlci5uYW1lc3BhY2Uoc1R5cGUpOwotICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikgfHwgcHJlZml4ZXMuY29udGFpbnNLZXkobmFtZXNwYWNlKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBiYXNlID0gUU5hbWVIZWxwZXIuc3VnZ2VzdFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gYmFzZTsKLSAgICAgICAgZm9yIChpbnQgbiA9IDA7IHByZWZpeGVzLmNvbnRhaW5zVmFsdWUocmVzdWx0KTsgbiArPSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBiYXNlICsgbjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJlZml4ZXMucHV0KG5hbWVzcGFjZSwgcmVzdWx0KTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ4bWxuczoiICsgcmVzdWx0ICsgIj1cIiIgKyBuYW1lc3BhY2UgKyAiXCIiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9YTUxCZWFuLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9YTUxCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMThmYTEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvWE1MQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzM2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hdGNoaW5nVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhYzsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRmlsZVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci0KLS8qKgotICogTW9kZWxlZCBhZnRlciBBbnQncyBqYXZhYyBhbmQgemlwIHRhc2tzLgotICoKLSAqIFNjaGVtYSBmaWxlcyB0byBwcm9jZXNzLCBvciBkaXJlY3RvcmllcyBvZiBzY2hlbWEgZmlsZXMsIGFyZSBzZXQgd2l0aCB0aGUgJ3NjaGVtYScKLSAqIGF0dHJpYnV0ZSwgYW5kIGNhbiBiZSBmaWx0ZXJlZCB3aXRoICdpbmNsdWRlcycgYW5kICdleGNsdWRlcycuCi0gKiBBbHRlcm5hdGl2ZWx5LCBvbmUgb3IgbW9yZSBuZXN0ZWQgJmx0O2ZpbGVzZXQmZ3Q7IGVsZW1lbnRzIGNhbiBzcGVjaWZ5IHRoZSAKLSAqIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB0byBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoaXMgWE1MQmVhbi4KLSAqIFRoZSBpbmNsdWRlIHNldCBjYW4gYWxzbyBkZWZpbmUgLmphdmEgZmlsZXMgdGhhdCBzaG91bGQgYmUgYnVpbHQgYXMgd2VsbC4gIAotICogU2VlIHRoZSBGaWxlU2V0IGRvY3VtZW50YXRpb24gYXQgaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9hbnQvbWFudWFsL2luZGV4Lmh0bWwKLSAqIGZvciBpbnN0cnVjdGlvbnMgb24gRmlsZVNldHMgaWYgeW91IGFyZSB1bmZhbWlsaWFyIHdpdGggdGhlaXIgdXNhZ2UuCi0gKi8KLQotcHVibGljIGNsYXNzIFhNTEJlYW4gZXh0ZW5kcyBNYXRjaGluZ1Rhc2sKLXsKLSAgICBwcml2YXRlIEFycmF5TGlzdCAgIHNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBQYXRoICAgICAgICBjbGFzc3BhdGg7Ci0gICAgCi0gICAgcHJpdmF0ZSBGaWxlICAgICAgICBkZXN0ZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY2dlbmRpciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZ2VuZGlyOwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgcXVpZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkLAotICAgICAgICAgICAgICAgICAgICAgICAgc3Jjb25seSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxvbmVycm9yID0gdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmsgPSB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFudFJ1bnRpbWUgPSB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUphdmFSdW50aW1lID0gZmFsc2U7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgICAgICB0eXBlc3lzdGVtbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmtlZEV4ZWN1dGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlJbml0aWFsU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeU1heGltdW1TaXplOwotICAgIAotICAgIHByaXZhdGUgTGlzdCAgICAgICAgZXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHByaXZhdGUgSGFzaE1hcCAgICAgX2V4dFJvdXRlciA9IG5ldyBIYXNoTWFwKDUpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRCA9ICIueHNkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETCA9ICIud3NkbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBVkEgPSAiLmphdmEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYU0RDT05GSUcgPSAiLnhzZGNvbmZpZyI7Ci0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8qIFZBTElEQVRJT04gKi8KLSAgICAgICAgLy9yZXF1aXJlZAotICAgICAgICBpZiAoc2NoZW1hcy5zaXplKCkgPT0gMAotICAgICAgICAgICAgJiYgc2NoZW1hID09IG51bGwKLSAgICAgICAgICAgICYmIGZpbGVzZXQuZ2V0RGlyKHByb2plY3QpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiVGhlICdzY2hlbWEnIG9yICdkaXInIGF0dHJpYnV0ZSBvciBhIG5lc3RlZCBmaWxlc2V0IGlzIHJlcXVpcmVkLiI7Ci0gICAgICAgICAgICBpZiAoZmFpbG9uZXJyb3IpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nKG1zZywgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIF9leHRSb3V0ZXIucHV0KFhTRCwgbmV3IEhhc2hTZXQoKSk7Ci0gICAgICAgIF9leHRSb3V0ZXIucHV0KFdTREwsIG5ldyBIYXNoU2V0KCkpOwotICAgICAgICBfZXh0Um91dGVyLnB1dChKQVZBLCBuZXcgSGFzaFNldCgpKTsKLSAgICAgICAgX2V4dFJvdXRlci5wdXQoWFNEQ09ORklHLCBuZXcgSGFzaFNldCgpKTsKLQotICAgICAgICBGaWxlIHRoZUJhc2VkaXIgPSBzY2hlbWE7Ci0KLSAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2NoZW1hLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsZVNjYW5uZXIgc2Nhbm5lciA9IGdldERpcmVjdG9yeVNjYW5uZXIoc2NoZW1hKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXRocyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NQYXRocyhwYXRocywgc2Nhbm5lci5nZXRCYXNlZGlyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoZUJhc2VkaXIgPSBzY2hlbWEuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NQYXRocyhuZXcgU3RyaW5nW10geyBzY2hlbWEuZ2V0TmFtZSgpIH0sIHRoZUJhc2VkaXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZmlsZXNldC5nZXREaXIocHJvamVjdCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHNjaGVtYXMuYWRkKGZpbGVzZXQpOwotICAgICAgICAKLSAgICAgICAgSXRlcmF0b3Igc2kgPSBzY2hlbWFzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChzaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldCkgc2kubmV4dCgpOwotICAgICAgICAgICAgRmlsZVNjYW5uZXIgc2Nhbm5lciA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIocHJvamVjdCk7Ci0gICAgICAgICAgICBGaWxlIGJhc2VkaXIgPSBzY2FubmVyLmdldEJhc2VkaXIoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHBhdGhzID0gc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0KLSAgICAgICAgICAgIHByb2Nlc3NQYXRocyhwYXRocywgYmFzZWRpcik7Ci0gICAgICAgIH0KLQotICAgICAgICBTZXQgeHNkTGlzdCA9IChTZXQpIF9leHRSb3V0ZXIuZ2V0KFhTRCk7Ci0gICAgICAgIFNldCB3c2RsTGlzdCA9IChTZXQpIF9leHRSb3V0ZXIuZ2V0KFdTREwpOwotICAgICAgICAKLSAgICAgICAgaWYgKHhzZExpc3Quc2l6ZSgpICsgd3NkbExpc3Quc2l6ZSgpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZygiQ291bGQgbm90IGZpbmQgYW55IHhzZCBvciB3c2RsIGZpbGVzIHRvIHByb2Nlc3MuIiwgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvL29wdGlvbmFsCi0gICAgICAgIFNldCBqYXZhTGlzdCA9IChTZXQpIF9leHRSb3V0ZXIuZ2V0KEpBVkEpOwotICAgICAgICBTZXQgeHNkY29uZmlnTGlzdCA9IChTZXQpIF9leHRSb3V0ZXIuZ2V0KFhTRENPTkZJRyk7Ci0KLSAgICAgICAgaWYgKHNyY2dlbmRpciA9PSBudWxsICYmIHNyY29ubHkpCi0gICAgICAgICAgICBzcmNnZW5kaXIgPSBjbGFzc2dlbmRpcjsKLQotICAgICAgICBpZiAoZGVzdGZpbGUgPT0gbnVsbCAmJiBjbGFzc2dlbmRpciA9PSBudWxsICYmICEgc3Jjb25seSkKLSAgICAgICAgICAgIGRlc3RmaWxlID0gbmV3IEZpbGUoInhtbHR5cGVzLmphciIpOwotCi0gICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgcXVpZXQgPSBmYWxzZTsKLQotICAgICAgICAvKiBFWEVDVVRJT04gKi8KLQotICAgICAgICBGaWxlW10geHNkQXJyYXkgPSAoRmlsZVtdKSB4c2RMaXN0LnRvQXJyYXkobmV3IEZpbGVbeHNkTGlzdC5zaXplKCldKTsKLSAgICAgICAgRmlsZVtdIHdzZGxBcnJheSA9IChGaWxlW10pIHdzZGxMaXN0LnRvQXJyYXkobmV3IEZpbGVbd3NkbExpc3Quc2l6ZSgpXSk7Ci0gICAgICAgIEZpbGVbXSBqYXZhQXJyYXkgPSAoRmlsZVtdKSBqYXZhTGlzdC50b0FycmF5KG5ldyBGaWxlW2phdmFMaXN0LnNpemUoKV0pOwotICAgICAgICBGaWxlW10geHNkY29uZmlnQXJyYXkgPSAoRmlsZVtdKSB4c2Rjb25maWdMaXN0LnRvQXJyYXkobmV3IEZpbGVbeHNkY29uZmlnTGlzdC5zaXplKCldKTsKLSAgICAgICAgRXJyb3JMb2dnZXIgZXJyID0gbmV3IEVycm9yTG9nZ2VyKHZlcmJvc2UpOwotCi0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYSB0ZW1wIGRpcmVjdG9yeQotICAgICAgICAgICAgRmlsZSB0bXBkaXIgPSBudWxsOwotICAgICAgICAgICAgaWYgKHNyY2dlbmRpciA9PSBudWxsIHx8IGNsYXNzZ2VuZGlyID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wZGlyID0gU2NoZW1hQ29kZUdlbmVyYXRvci5jcmVhdGVUZW1wRGlyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjZ2VuZGlyID09IG51bGwpCi0gICAgICAgICAgICAgICAgc3JjZ2VuZGlyID0gU2NoZW1hQ29kZUdlbmVyYXRvci5jcmVhdGVEaXIodG1wZGlyLCAic3JjIik7Ci0gICAgICAgICAgICBpZiAoY2xhc3NnZW5kaXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjbGFzc2dlbmRpciA9IFNjaGVtYUNvZGVHZW5lcmF0b3IuY3JlYXRlRGlyKHRtcGRpciwgImNsYXNzZXMiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gdXNlIHRoZSBzeXN0ZW0gY2xhc3NwYXRoIGlmIHVzZXIgZGlkbid0IHByb3ZpZGUgYW55Ci0gICAgICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2xhc3NwYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgY2xhc3NwYXRoLmNvbmNhdFN5c3RlbUNsYXNzcGF0aCgpOwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgICAgIC8vIHByZXBlbmQgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb24gdGhlIGNsYXNzcGF0aAotICAgICAgICAgICAgUGF0aC5QYXRoRWxlbWVudCBwYXRoRWxlbWVudCA9IGNsYXNzcGF0aC5jcmVhdGVQYXRoRWxlbWVudCgpOwotICAgICAgICAgICAgcGF0aEVsZW1lbnQuc2V0TG9jYXRpb24oY2xhc3NnZW5kaXIpOwotICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZ1tdIHBhdGhzID0gY2xhc3NwYXRoLmxpc3QoKTsKLSAgICAgICAgICAgIEZpbGVbXSBjcCA9IG5ldyBGaWxlW3BhdGhzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGNwW2ldID0gbmV3IEZpbGUocGF0aHNbaV0pOwotICAgICAgICAKLSAgICAgICAgICAgIC8vIGdlbmVyYXRlIHRoZSBzb3VyY2UKLSAgICAgICAgICAgIFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRCYXNlRGlyKHRoZUJhc2VkaXIpOwotICAgICAgICAgICAgcGFyYW1zLnNldFhzZEZpbGVzKHhzZEFycmF5KTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRXc2RsRmlsZXMod3NkbEFycmF5KTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRKYXZhRmlsZXMoamF2YUFycmF5KTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRDb25maWdGaWxlcyh4c2Rjb25maWdBcnJheSk7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0Q2xhc3NwYXRoKGNwKTsKLSAgICAgICAgICAgIC8vcGFyYW1zLnNldE91dHB1dEphcihkZXN0ZmlsZSk7IC8vIGFsd2F5cyB1c2UgdGhlIGphciB0YXNrIGJlbG93Ci0gICAgICAgICAgICBwYXJhbXMuc2V0TmFtZSh0eXBlc3lzdGVtbmFtZSk7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0U3JjRGlyKHNyY2dlbmRpcik7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0Q2xhc3Nlc0RpcihjbGFzc2dlbmRpcik7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0Tm9qYXZhYyh0cnVlKTsgLy8gYWx3YXlzIGNvbXBpbGUgdXNpbmcgamF2YWMgdGFzayBiZWxvdwotICAgICAgICAgICAgcGFyYW1zLnNldERlYnVnKGRlYnVnKTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRWZXJib3NlKHZlcmJvc2UpOwotICAgICAgICAgICAgcGFyYW1zLnNldFF1aWV0KHF1aWV0KTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXREb3dubG9hZChkb3dubG9hZCk7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0RXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRFcnJvckxpc3RlbmVyKGVycik7Ci0gICAgICAgICAgICBzdWNjZXNzID0gU2NoZW1hQ29tcGlsZXIuY29tcGlsZShwYXJhbXMpOwotCi0gICAgICAgICAgICBpZiAoc3VjY2VzcyAmJiAhc3Jjb25seSkgewotICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGhlIHNvdXJjZQotICAgICAgICAgICAgICAgIEphdmFjIGphdmFjID0gbmV3IEphdmFjKCk7Ci0gICAgICAgICAgICAgICAgamF2YWMuc2V0UHJvamVjdChwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICBqYXZhYy5zZXRUYXNrTmFtZShnZXRUYXNrTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBqYXZhYy5zZXRDbGFzc3BhdGgoY2xhc3NwYXRoKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGlsZXIgIT0gbnVsbCkgamF2YWMuc2V0Q29tcGlsZXIoY29tcGlsZXIpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldERlYnVnKGRlYnVnKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVidWdMZXZlbCAhPSBudWxsKSBqYXZhYy5zZXREZWJ1Z0xldmVsKGRlYnVnTGV2ZWwpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldERlc3RkaXIoY2xhc3NnZW5kaXIpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldEV4ZWN1dGFibGUoZm9ya2VkRXhlY3V0YWJsZSk7Ci0gICAgICAgICAgICAgICAgamF2YWMuc2V0RmFpbG9uZXJyb3IoZmFpbG9uZXJyb3IpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldEZvcmsoZm9yayk7Ci0gICAgICAgICAgICAgICAgamF2YWMuc2V0SW5jbHVkZWFudHJ1bnRpbWUoaW5jbHVkZUFudFJ1bnRpbWUpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldEluY2x1ZGVqYXZhcnVudGltZShpbmNsdWRlSmF2YVJ1bnRpbWUpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldFNyY2RpcihuZXcgUGF0aChwcm9qZWN0LCBzcmNnZW5kaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLSAgICAgICAgICAgICAgICBpZiAobWVtb3J5SW5pdGlhbFNpemUgIT0gbnVsbCkgamF2YWMuc2V0TWVtb3J5SW5pdGlhbFNpemUobWVtb3J5SW5pdGlhbFNpemUpOwotICAgICAgICAgICAgICAgIGlmIChtZW1vcnlNYXhpbXVtU2l6ZSAhPSBudWxsKSBqYXZhYy5zZXRNZW1vcnlNYXhpbXVtU2l6ZShtZW1vcnlNYXhpbXVtU2l6ZSk7Ci0gICAgICAgICAgICAgICAgamF2YWMuc2V0T3B0aW1pemUob3B0aW1pemUpOwotICAgICAgICAgICAgICAgIGphdmFjLnNldFZlcmJvc2UodmVyYm9zZSk7Ci0gICAgICAgICAgICAgICAgamF2YWMuZXhlY3V0ZSgpOwotCi0gICAgICAgICAgICAgICAgbG9uZyBmaW5pc2ggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXF1aWV0KQotICAgICAgICAgICAgICAgICAgICBsb2coIlRpbWUgdG8gY29tcGlsZSBjb2RlOiAiICsgKChkb3VibGUpKGZpbmlzaCAtIHN0YXJ0KSAvIDEwMDAuMCkgKyAiIHNlY29uZHMiKTsKLQotICAgICAgICAgICAgICAgIGlmIChkZXN0ZmlsZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gamFyIHRoZSBjb21waWxlZCBjbGFzc2VzCi0gICAgICAgICAgICAgICAgICAgIEphciBqYXIgPSBuZXcgSmFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGphci5zZXRQcm9qZWN0KHByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICBqYXIuc2V0VGFza05hbWUoZ2V0VGFza05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGphci5zZXRCYXNlZGlyKGNsYXNzZ2VuZGlyKTsKLSAgICAgICAgICAgICAgICAgICAgamFyLnNldERlc3RGaWxlKGRlc3RmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgamFyLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0bXBkaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFNjaGVtYUNvZGVHZW5lcmF0b3IudHJ5SGFyZFRvRGVsZXRlKHRtcGRpcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2ludGVycnVwdGVkIG1lYW5zIGNhbmNlbAotICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGxvZygiRXhjZXB0aW9uIHdoaWxlIGJ1aWxkaW5nIHNjaGVtYXM6ICIgKyBlLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdykpOwotICAgICAgICAgICAgbG9nKHN3LnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzdWNjZXNzICYmIGZhaWxvbmVycm9yKQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCk7IC8vc3RvcCB0aGUgYnVpbGQKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1BhdGhzKFN0cmluZ1tdIHBhdGhzLCBGaWxlIGJhc2VEaXIpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgZG90ID0gcGF0aHNbaV0ubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgIGlmIChkb3QgPiAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHBhdGhzW2ldOwotICAgICAgICAgICAgICAgIFN0cmluZyBwb3NzRXh0ID0gcGF0aC5zdWJzdHJpbmcoZG90KS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgICAgIFNldCBzZXQgPSAoU2V0KSBfZXh0Um91dGVyLmdldChwb3NzRXh0KTsKLQotICAgICAgICAgICAgICAgIGlmIChzZXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChuZXcgRmlsZShiYXNlRGlyLCBwYXRoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KEZpbGVTZXQgZmlsZXNldCkKLSAgICB7Ci0gICAgICAgIHNjaGVtYXMuYWRkKGZpbGVzZXQpOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy9HZXR0ZXIvU2V0dGVycwotICAgIHB1YmxpYyBGaWxlIGdldFNjaGVtYSgpCi0gICAgewotICAgICAgICByZXR1cm4gc2NoZW1hOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgZmlsZSB0aGF0IHBvaW50cyB0byBlaXRoZXIgYW4gaW5kaXZpZHVhbCBzY2hlbWEgZmlsZSBvciBhIGRpcmVjdG9yeSBvZiBmaWxlcy4KLSAgICAgKiBJdCBpcyBvcHRpb25hbCBvbmx5IGlmIG9uZSBvciBtb3JlICZsdDtmaWxlc2V0Jmd0OyBlbGVtZW50cyBhcmUgbmVzdGVkIGluIHRoaXMKLSAgICAgKiB0YXNrLgotICAgICAqIEBwYXJhbSBzY2hlbWEgUmVxdWlyZWQsIHVubGVzcyBhIGZpbGVzZXQgZWxlbWVudCBpcyBuZXN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2NoZW1hKEZpbGUgc2NoZW1hKQotICAgIHsKLSAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGNsYXNzcGF0aCB0byB1c2UgaWYgc2NoZW1hcyBpbiB0aGUgZmlsZXNldCBpbXBvcnQgZGVmaW5pdGlvbnMgdGhhdCBhcmUKLSAgICAgKiBzdXBwbGllZCBieSBvdGhlciBjb21waWxlZCB4bWwgYmVhbnMgSkFSIGZpbGVzLCBvciBpZiAuamF2YSBmaWxlcyBhcmUgaW4gdGhlCi0gICAgICogc2NoZW1hIGZpbGVzZXQuCi0gICAgICogQHBhcmFtIGNsYXNzcGF0aCBPcHRpb25hbC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuY2xhc3NwYXRoICE9IG51bGwpCi0gICAgICAgICAgICB0aGlzLmNsYXNzcGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgYSBwYXRoIHRvIHRoZSBjbGFzc3BhdGguCi0gICAgICovCi0gICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgewotICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIGNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGFzc3BhdGguY3JlYXRlUGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUuCi0gICAgICogQHBhcmFtIGNsYXNzcGF0aHJlZiBPcHRpb25hbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIGNsYXNzcGF0aHJlZikKLSAgICB7Ci0gICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkKLSAgICAgICAgICAgIGNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOwotICAgICAgICAKLSAgICAgICAgY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKS5zZXRSZWZpZChjbGFzc3BhdGhyZWYpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUGF0aCBnZXRDbGFzc3BhdGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXREZXN0ZmlsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVzdGZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBqYXIgZmlsZSBjcmVhdGVkLiAgRm9yIGluc3RhbmNlLCAibXlYTUxCZWFuLmphciIKLSAgICAgKiB3aWxsIG91dHB1dCB0aGUgcmVzdWx0cyBvZiB0aGlzIHRhc2sgaW50byBhIGphciB3aXRoIHRoZSBzYW1lIG5hbWUuCi0gICAgICogT3B0aW9uYWwsIGRlZmF1bHRzIHRvICJ4bWx0eXBlcy5qYXIiLgotICAgICAqIEBwYXJhbSBkZXN0ZmlsZSBPcHRpb25hbC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0RGVzdGZpbGUoRmlsZSBkZXN0ZmlsZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVzdGZpbGUgPSBkZXN0ZmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRTcmNnZW5kaXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNyY2dlbmRpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYSBsb2NhdGlvbiB0byBnZW5lcmF0ZSAuamF2YSBmaWxlcyBpbnRvLiAgT3B0aW9uYWwsIGRlZmF1bHRzIHRvCi0gICAgICogYSB0ZW1wIGRpci4KLSAgICAgKiBAcGFyYW0gc3JjZ2VuZGlyIE9wdGlvbmFsLgotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCBzZXRTcmNnZW5kaXIoRmlsZSBzcmNnZW5kaXIpCi0gICAgewotICAgICAgICB0aGlzLnNyY2dlbmRpciA9IHNyY2dlbmRpcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRDbGFzc2dlbmRpcigpCi0gICAgewotICAgICAgICByZXR1cm4gY2xhc3NnZW5kaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGEgbG9jYXRpb24gdG8gZ2VuZXJhdGUgLmNsYXNzIGZpbGVzIGludG8uICBPcHRpb25hbCwgZGVmYXVsdHMgdG8KLSAgICAgKiBhIHRlbXAgZGlyLgotICAgICAqIEBwYXJhbSBjbGFzc2dlbmRpciBPcHRpb25hbC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NnZW5kaXIoRmlsZSBjbGFzc2dlbmRpcikKLSAgICB7Ci0gICAgICAgIHRoaXMuY2xhc3NnZW5kaXIgPSBjbGFzc2dlbmRpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaG9vc2UgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHBhcnRpY3VsYXIgdGFzay4KLSAgICAgKgotICAgICAqIEBzaW5jZSBBbnQgMS41Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcGlsZXIoU3RyaW5nIGNvbXBpbGVyKQotICAgIHsKLSAgICAgICAgdGhpcy5jb21waWxlciA9IGNvbXBpbGVyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rvd25sb2FkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkb3dubG9hZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdG8gdHJ1ZSB0byBwZXJtaXQgdGhlIGNvbXBpbGVyIHRvIGRvd25sb2FkIFVSTHMgZm9yIGltcG9ydHMKLSAgICAgKiBhbmQgaW5jbHVkZXMuICBEZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyBhbGwgaW1wb3J0cyBhbmQgaW5jbHVkZXMKLSAgICAgKiBtdXN0IGJlIGNvcGllZCBsb2NhbGx5LgotICAgICAqIEBwYXJhbSBkb3dubG9hZCBPcHRpb25hbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREb3dubG9hZChib29sZWFuIGRvd25sb2FkKQotICAgIHsKLSAgICAgICAgdGhpcy5kb3dubG9hZCA9IGRvd25sb2FkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRydWUsIGNvbXBpbGVzIHdpdGggb3B0aW1pemF0aW9uIGVuYWJsZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3B0aW1pemUoYm9vbGVhbiBvcHRpbWl6ZSkgewotICAgICAgICB0aGlzLm9wdGltaXplID0gb3B0aW1pemU7Ci0gICAgfQotCi0gICAgLyoqIEdldHMgdGhlIG9wdGltaXplIGZsYWcuICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0T3B0aW1pemUoKSB7Ci0gICAgICAgIHJldHVybiBvcHRpbWl6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcmJvc2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZlcmJvc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udHJvbHMgdGhlIGFtb3VudCBvZiBvdXRwdXQuICBEZWZhdWx0cyB0byB0cnVlLgotICAgICAqIEBwYXJhbSB2ZXJib3NlIE9wdGlvbmFsLgotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdmVyYm9zZSkKLSAgICB7Ci0gICAgICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNRdWlldCgpCi0gICAgewotICAgICAgICByZXR1cm4gcXVpZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udHJvbHMgdGhlIGFtb3VudCBvZiBvdXRwdXQuICBEZWZhdWx0cyB0byBmYWxzZS4KLSAgICAgKiBAcGFyYW0gcXVpZXQgT3B0aW9uYWwuCi0gICAgICovIAotICAgIHB1YmxpYyB2b2lkIHNldFF1aWV0KGJvb2xlYW4gcXVpZXQpCi0gICAgewotICAgICAgICB0aGlzLnF1aWV0ID0gcXVpZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWJ1ZygpCi0gICAgewotICAgICAgICByZXR1cm4gZGVidWc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2YWx1ZSBvZiBkZWJ1Z0xldmVsLgotICAgICAqIEByZXR1cm4gdmFsdWUgb2YgZGVidWdMZXZlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlYnVnTGV2ZWwoKSB7Ci0gICAgICAgIHJldHVybiBkZWJ1Z0xldmVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEtleXdvcmQgbGlzdCB0byBiZSBhcHBlbmRlZCB0byB0aGUgLWcgY29tbWFuZC1saW5lIHN3aXRjaC4KLSAgICAgKgotICAgICAqIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMgZXhjZXB0IG1vZGVybgotICAgICAqIGFuZCBjbGFzc2ljKHZlciA+PSAxLjIpLiBMZWdhbCB2YWx1ZXMgYXJlIG5vbmUgb3IgYQotICAgICAqIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBmb2xsb3dpbmcga2V5d29yZHM6IGxpbmVzLCB2YXJzLAotICAgICAqIGFuZCBzb3VyY2UuIElmIGRlYnVnbGV2ZWwgaXMgbm90IHNwZWNpZmllZCwgYnkgZGVmYXVsdCwgOm5vbmUKLSAgICAgKiB3aWxsIGJlIGFwcGVuZGVkIHRvIC1nLiBJZiBkZWJ1ZyBpcyBub3QgdHVybmVkIG9uLCB0aGlzIGF0dHJpYnV0ZQotICAgICAqIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2ICBWYWx1ZSB0byBhc3NpZ24gdG8gZGVidWdMZXZlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Z0xldmVsKFN0cmluZyAgdikgewotICAgICAgICB0aGlzLmRlYnVnTGV2ZWwgPSB2OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlIGRlYnVnZ2luZyBzeW1ib2xzLgotICAgICAqIEBwYXJhbSBkZWJ1ZyBPcHRpb25hbC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0RGVidWcoYm9vbGVhbiBkZWJ1ZykKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0cnVlLCBmb3JrcyB0aGUgamF2YWMgY29tcGlsZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZiAidHJ1ZXxmYWxzZXxvbnxvZmZ8eWVzfG5vIgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvcmsoYm9vbGVhbiBmKSB7Ci0gICAgICAgIGZvcmsgPSBmOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRoZSBuYW1lIG9mIHRoZSBqYXZhYyBleGVjdXRhYmxlLgotICAgICAqCi0gICAgICogPHA+SWdub3JlZCB1bmxlc3MgZm9yayBpcyB0cnVlIG9yIGV4dEphdmFjIGhhcyBiZWVuIHNwZWNpZmllZAotICAgICAqIGFzIHRoZSBjb21waWxlci48L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhlY3V0YWJsZShTdHJpbmcgZm9ya0V4ZWMpIHsKLSAgICAgICAgZm9ya2VkRXhlY3V0YWJsZSA9IGZvcmtFeGVjOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhlY3V0YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGZvcmtlZEV4ZWN1dGFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTcmNvbmx5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzcmNvbmx5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgdmFsdWUgb2YgdHJ1ZSBtZWFucyB0aGF0IG9ubHkgc291cmNlIHdpbGwgYmUgZ2VuZXJhdGVkLiAgT3B0aW9uYWwsCi0gICAgICogZGVmYXVsdCBpcyBmYWxzZS4KLSAgICAgKiBAcGFyYW0gc3Jjb25seSBPcHRpb25hbC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0U3Jjb25seShib29sZWFuIHNyY29ubHkpCi0gICAgewotICAgICAgICB0aGlzLnNyY29ubHkgPSBzcmNvbmx5OwotICAgIH0KLSAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVzeXN0ZW1uYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0eXBlc3lzdGVtbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPbmUgb3IgbW9yZSBTY2hlbWFDb21waWxlciBleHRlbnNpb25zIGNhbiBiZSBwYXNzZWQgaW4gdmlhIHRoZSAmbHQ7ZXh0ZW5zaW9uPiBzdWJlbGVtZW50LgotICAgICAqICBTY2hlbWEgQ29tcGlsZXIgZXh0ZW5zaW9ucyBtdXN0IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlIGNvbS54YmVhbi50b28uU2NoZW1hQ29tcGlsZXJFeHRlbnNpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgRXh0ZW5zaW9uIGNyZWF0ZUV4dGVuc2lvbigpIHsKLSAgICAgICAgRXh0ZW5zaW9uIGUgPSBuZXcgRXh0ZW5zaW9uKCk7Ci0gICAgICAgIGV4dGVuc2lvbnMuYWRkKGUpOwotICAgICAgICByZXR1cm4gZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0aGF0IHRoZSBUeXBlU3lzdGVtSG9sZGVyIGNsYXNzIHNob3VsZCBiZSAKLSAgICAgKiBnZW5lcmF0ZWQgaW4uIE5vcm1hbGx5IHRoaXMgc2hvdWxkIGJlIGxlZnQgdW5zcGVjaWZpZWQuICBOb25lIG9mCi0gICAgICogdGhlIHhtbCBiZWFucyBhcmUgZ2VuZXJhdGVkIGluIHRoaXMgcGFja2FnZS4KLSAgICAgKiA8QlI+PEJSPlVzZSAueHNkY29uZmlnIGZpbGVzIHRvIG1vZGlmeSB4bWwgYmVhbiBwYWNrYWdlIG9yIGNsYXNzIG5hbWVzLgotICAgICAqIEBwYXJhbSB0eXBlc3lzdGVtbmFtZSBPcHRpb25hbC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZXN5c3RlbW5hbWUoU3RyaW5nIHR5cGVzeXN0ZW1uYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy50eXBlc3lzdGVtbmFtZSA9IHR5cGVzeXN0ZW1uYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmFpbG9uZXJyb3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhaWxvbmVycm9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIGFudCB0YXJnZXQgd2lsbCBjb250aW51ZSBpZiB0aGUgWE1MQmVhbgotICAgICAqIGNyZWF0aW9uIGVuY291bnRlcnMgYSBidWlsZCBlcnJvci4gIERlZmF1bHRzIHRvIHRydWUuICBPcHRpb25hbC4KLSAgICAgKiBAcGFyYW0gZmFpbG9uZXJyb3IgT3B0aW9uYWwuCi0gICAgICovIAotICAgIHB1YmxpYyB2b2lkIHNldEZhaWxvbmVycm9yKGJvb2xlYW4gZmFpbG9uZXJyb3IpCi0gICAgewotICAgICAgICB0aGlzLmZhaWxvbmVycm9yID0gZmFpbG9uZXJyb3I7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbmNsdWRlQW50UnVudGltZSgpCi0gICAgewotICAgICAgICByZXR1cm4gaW5jbHVkZUFudFJ1bnRpbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZUFudFJ1bnRpbWUoYm9vbGVhbiBpbmNsdWRlQW50UnVudGltZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuaW5jbHVkZUFudFJ1bnRpbWUgPSBpbmNsdWRlQW50UnVudGltZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luY2x1ZGVKYXZhUnVudGltZSgpCi0gICAgewotICAgICAgICByZXR1cm4gaW5jbHVkZUphdmFSdW50aW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVKYXZhUnVudGltZShib29sZWFuIGluY2x1ZGVKYXZhUnVudGltZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuaW5jbHVkZUphdmFSdW50aW1lID0gaW5jbHVkZUphdmFSdW50aW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgaW5pdGlhbCBtZW1vcnkgc2l6ZSBvZiB0aGUgdW5kZXJseWluZyBqYXZhYyBwcm9jZXNzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVtb3J5SW5pdGlhbFNpemUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1lbW9yeUluaXRpYWxTaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1lbW9yeUluaXRpYWxTaXplKFN0cmluZyBtZW1vcnlJbml0aWFsU2l6ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubWVtb3J5SW5pdGlhbFNpemUgPSBtZW1vcnlJbml0aWFsU2l6ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG1heGltdW0gbWVtb3J5IHNpemUgb2YgdGhlIHVuZGVybHlpbmcgamF2YWMgcHJvY2Vzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lbW9yeU1heGltdW1TaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtZW1vcnlNYXhpbXVtU2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZW1vcnlNYXhpbXVtU2l6ZShTdHJpbmcgbWVtb3J5TWF4aW11bVNpemUpCi0gICAgewotICAgICAgICB0aGlzLm1lbW9yeU1heGltdW1TaXplID0gbWVtb3J5TWF4aW11bVNpemU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVVJJIHVyaUZyb21GaWxlKEZpbGUgZikKLSAgICB7Ci0gICAgICAgIGlmIChmID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGYuZ2V0Q2Fub25pY2FsRmlsZSgpLnRvVVJJKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBEb24ndCBzcGl0IG91dCBhbiBleGNlcHRpb24gaGVyZSBiZWNhdXNlIG9uIFdpbmRvd3MgeW91J2xsIGdldCBvbmUKLSAgICAgICAgICAgIC8vIGlmIHRoZSBmaWxlbmFtZSBpcyAiYXV4IiwgImxwdDEiLCBldGMuIEl0J3MgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5Ci0gICAgICAgICAgICAvLyB0byBkZWFsIHdpdGggdGhvc2UgY2FzZXMgY29ycmVjdGx5LCB1c3VhbGx5IGJ5IGNhbGxpbmcgRmlsZVN2Yy5pbnZhbGlkUGF0aENoZWNrKCkKLSAgICAgICAgICAgIC8vIE1lc3NhZ2VTdmMuZ2V0KCkubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgcmV0dXJuIGYuZ2V0QWJzb2x1dGVGaWxlKCkudG9VUkkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBFcnJvckxvZ2dlciBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIF9ub2lzeTsKLSAgICAgICAgcHJpdmF0ZSBVUkkgX2Jhc2VVUkk7Ci0KLSAgICAgICAgcHVibGljIEVycm9yTG9nZ2VyKGJvb2xlYW4gbm9pc3kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9ub2lzeSA9IG5vaXN5OwotICAgICAgICAgICAgX2Jhc2VVUkkgPSB1cmlGcm9tRmlsZShwcm9qZWN0LmdldEJhc2VEaXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgWG1sRXJyb3IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sRXJyb3IgZXJyID0gKFhtbEVycm9yKW87Ci0gICAgICAgICAgICAgICAgaWYgKGVyci5nZXRTZXZlcml0eSgpID09IFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICBsb2coZXJyLnRvU3RyaW5nKF9iYXNlVVJJKSwgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChlcnIuZ2V0U2V2ZXJpdHkoKSA9PSBYbWxFcnJvci5TRVZFUklUWV9XQVJOSU5HKQotICAgICAgICAgICAgICAgICAgICBsb2coZXJyLnRvU3RyaW5nKF9iYXNlVVJJKSwgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoX25vaXN5KQotICAgICAgICAgICAgICAgICAgICBsb2coZXJyLnRvU3RyaW5nKF9iYXNlVVJJKSwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBzaXplKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9YTUxCZWFuWFNUQ0hhcm5lc3MuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hNTEJlYW5YU1RDSGFybmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmFmYzliLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hNTEJlYW5YU1RDSGFybmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotcHVibGljIGNsYXNzIFhNTEJlYW5YU1RDSGFybmVzcyBpbXBsZW1lbnRzIFhTVENUZXN0ZXIuSGFybmVzcwotewotICAgIHB1YmxpYyB2b2lkIHJ1blRlc3RDYXNlKFhTVENUZXN0ZXIuVGVzdENhc2VSZXN1bHQgcmVzdWx0KQotICAgIHsKLSAgICAgICAgWFNUQ1Rlc3Rlci5UZXN0Q2FzZSB0ZXN0Q2FzZSA9IHJlc3VsdC5nZXRUZXN0Q2FzZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJSdW5uaW5nIGNhc2UgIiArIHRlc3RDYXNlLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb24gZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgYm9vbGVhbiBzY2hlbWFWYWxpZCA9IHRydWU7Ci0gICAgICAgICAgICBib29sZWFuIGluc3RhbmNlVmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodGVzdENhc2UuZ2V0U2NoZW1hRmlsZSgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBzdGVwIDEsIGxvYWQgc2NoZW1hIGZpbGUgZXRjLgotICAgICAgICAgICAgU2NoZW1hVHlwZUxvYWRlciBsb2FkZXIgPSBudWxsOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0IHNjaGVtYSA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHRlc3RDYXNlLmdldFNjaGVtYUZpbGUoKSwgbmV3IFhtbE9wdGlvbnMoKS5zZXRFcnJvckxpc3RlbmVyKGVycm9ycykuc2V0TG9hZExpbmVOdW1iZXJzKCkpOwotICAgICAgICAgICAgICAgIFhtbE9iamVjdCBzY2hlbWEyID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAodGVzdENhc2UuZ2V0UmVzb3VyY2VGaWxlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hMiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHRlc3RDYXNlLmdldFJlc291cmNlRmlsZSgpLCBuZXcgWG1sT3B0aW9ucygpLnNldEVycm9yTGlzdGVuZXIoZXJyb3JzKS5zZXRMb2FkTGluZU51bWJlcnMoKSk7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0W10gc2NoZW1hcyA9IHNjaGVtYTIgPT0gbnVsbCA/IG5ldyBYbWxPYmplY3RbXSB7IHNjaGVtYSB9IDogbmV3IFhtbE9iamVjdFtdIHsgc2NoZW1hLCBzY2hlbWEyIH07Ci0gICAgICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0gPSBYbWxCZWFucy5jb21waWxlWHNkKHNjaGVtYXMsIFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCksIG5ldyBYbWxPcHRpb25zKCkuc2V0RXJyb3JMaXN0ZW5lcihlcnJvcnMpKTsKLSAgICAgICAgICAgICAgICBsb2FkZXIgPSBYbWxCZWFucy50eXBlTG9hZGVyVW5pb24obmV3IFNjaGVtYVR5cGVMb2FkZXJbXSB7IHN5c3RlbSwgWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKSB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzY2hlbWFWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBYbWxFeGNlcHRpb24pIHx8IGVycm9ycy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0Q3Jhc2godHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHN3KSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRTdk1lc3NhZ2VzKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdy50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXN1bHQuYWRkU3ZNZXNzYWdlcyhlcnJvcnMpOwotICAgICAgICAgICAgcmVzdWx0LnNldFN2QWN0dWFsKHNjaGVtYVZhbGlkKTsKLSAgICAgICAgICAgIGVycm9ycy5jbGVhcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobG9hZGVyID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodGVzdENhc2UuZ2V0SW5zdGFuY2VGaWxlKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHN0ZXAgMiwgbG9hZCBpbnN0YW5jZSBmaWxlIGFuZCB2YWxpZGF0ZQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0IGluc3RhbmNlID0gbG9hZGVyLnBhcnNlKHRlc3RDYXNlLmdldEluc3RhbmNlRmlsZSgpLCBudWxsLCBuZXcgWG1sT3B0aW9ucygpLnNldEVycm9yTGlzdGVuZXIoZXJyb3JzKS5zZXRMb2FkTGluZU51bWJlcnMoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbnN0YW5jZS52YWxpZGF0ZShuZXcgWG1sT3B0aW9ucygpLnNldEVycm9yTGlzdGVuZXIoZXJyb3JzKSkpCi0gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnN0YW5jZVZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIFhtbEV4Y2VwdGlvbikgfHwgZXJyb3JzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRDcmFzaCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc3cpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEl2TWVzc2FnZXMoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN3LnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQuYWRkSXZNZXNzYWdlcyhlcnJvcnMpOwotICAgICAgICAgICAgcmVzdWx0LnNldEl2QWN0dWFsKGluc3RhbmNlVmFsaWQpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQuc3VjY2VlZGVkKCkgPyAiU3VjY2Vzcy4iOiAiRmFpbHVyZS4iKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hTVENUZXN0ZXIuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hTVENUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkyZDY4Ny4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9YU1RDVGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKLQotaW1wb3J0IGNvbS5iZWEueDIwMDMueDA1LnhtbGJlYW4ubHRnZm10LlRlc3RzRG9jdW1lbnQ7Ci1pbXBvcnQgY29tLmJlYS54MjAwMy54MDUueG1sYmVhbi5sdGdmbXQuRmlsZURlc2M7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDYWxlbmRhcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLXB1YmxpYyBjbGFzcyBYU1RDVGVzdGVyCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIAotICAgICAgICBDb21tYW5kTGluZSBjbCA9IG5ldyBDb21tYW5kTGluZShhcmdzLCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQpOwotICAgICAgICBib29sZWFuIHNob3dwYXNzID0gKGNsLmdldE9wdCgic2hvd3Bhc3MiKSAhPSBudWxsKTsKLSAgICAgICAgRmlsZVtdIGFsbEZpbGVzID0gY2wuZ2V0RmlsZXMoKTsKLSAgICAgICAgQ29sbGVjdGlvbiBsdGdGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSGFybmVzcyBoYXJuZXNzID0gbmV3IFhNTEJlYW5YU1RDSGFybmVzcygpOwotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxGaWxlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFsbEZpbGVzW2ldLmdldE5hbWUoKS5pbmRleE9mKCJMVEciKSA+PSAwKQotICAgICAgICAgICAgICAgIGx0Z0ZpbGVzLmFkZChhbGxGaWxlc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEZpbGUgcmVzdWx0c0ZpbGUgPSBuZXcgRmlsZSgib3V0Lmh0bWwiKTsKLSAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlV3JpdGVyKHJlc3VsdHNGaWxlKSk7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCI8aHRtbD4iKTsKLSAgICAgICAgd3JpdGVyLnByaW50bG4oIjxzdHlsZT50ZCB7Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrfSB4bXAge3doaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtd3JhcDogYnJlYWstd29yZDsgd29yZC1icmVhazogYnJlYWstYWxsfSA8L3N0eWxlPiIpOwotICAgICAgICB3cml0ZXIucHJpbnRsbigiPGJvZHk+Iik7Ci0KLSAgICAgICAgd3JpdGVyLnByaW50bG4oIjxzY3JpcHQgbGFuZ3VhZ2U9J0phdmFTY3JpcHQnIHR5cGU9J3RleHQvamF2YXNjcmlwdCc+Iik7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCJ2YXIgdzsiKTsKLSAgICAgICAgd3JpdGVyLnByaW50bG4oImZ1bmN0aW9uIG9wZW5XaW5kb3coc2NoZW1hLCBpbnN0YW5jZSkgeyIpOwotCSAgICB3cml0ZXIucHJpbnRsbigiICBpZiAodyA9PSBudWxsKSB7Iik7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCIgICAgdyA9IHdpbmRvdy5vcGVuKCdhYm91dDpibGFuaycsICd4c3RjJyk7Iik7Ci0JICAgIHdyaXRlci5wcmludGxuKCIgIH0iKTsKLQkgICAgd3JpdGVyLnByaW50bG4oIiAgaWYgKHcuY2xvc2VkKSB7Iik7Ci0JCXdyaXRlci5wcmludGxuKCIgICAgdyA9IHdpbmRvdy5vcGVuKCdhYm91dDpibGFuaycsICd4c3RjJyk7Iik7Ci0JICAgIHdyaXRlci5wcmludGxuKCIgIH0iKTsKLQkgICAgd3JpdGVyLnByaW50bG4oIiAgdy5kb2N1bWVudC5vcGVuKCk7Iik7Ci0JICAgIHdyaXRlci5wcmludGxuKCIgIHcuZG9jdW1lbnQud3JpdGUoXCI8ZnJhbWVzZXQgcm93cz0qLCo+PGZyYW1lIHNyYz0nXCIgKyBzY2hlbWEgKyBcIic+PGZyYW1lIHNyYz0nXCIgKyBpbnN0YW5jZSArIFwiJz48L2ZyYW1lc2V0PlwiKTsiKTsKLQkgICAgd3JpdGVyLnByaW50bG4oIiAgdy5kb2N1bWVudC5jbG9zZSgpOyIpOwotCSAgICB3cml0ZXIucHJpbnRsbigiICB3LmZvY3VzKCk7Iik7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCJ9Iik7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCI8L3NjcmlwdD4iKTsKLQotICAgICAgICB3cml0ZXIucHJpbnRsbigiPGgxPlhNTCBTY2hlbWEgVGVzdCBDb2xsZWN0aW9uIFJlc3VsdHM8L2gxPiIpOwotICAgICAgICB3cml0ZXIucHJpbnRsbigiPHA+UnVuIG9uICIgKyAobmV3IFhtbENhbGVuZGFyKG5ldyBEYXRlKCkpKSArICI8L3A+Iik7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCI8dGFibGUgc3R5bGU9J2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrJyBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Iik7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCI8dHI+PHRkIHdpZHRoPTc1JT5EZXNjcmlwdGlvbjwvdGQ+PHRkIHdpZHRoPTEyLjUlPnNjaCB2PC90ZD48dGQgd2lkdGg9MTIuNSU+aW5zIHY8L3RkPjwvdHI+Iik7Ci0gICAgICAgIGludCBmYWlsdXJlcyA9IDA7Ci0gICAgICAgIGludCBjYXNlcyA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGx0Z0ZpbGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgbHRnRmlsZSA9IChGaWxlKWkubmV4dCgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzaW5nIHRlc3QgY2FzZXMgaW4gIiArIGx0Z0ZpbGUpOwotICAgICAgICAgICAgQ29sbGVjdGlvbiBsdGdFcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBUZXN0Q2FzZVtdIHRlc3RDYXNlcyA9IHBhcnNlTFRHRmlsZShsdGdGaWxlLCBsdGdFcnJvcnMpOwotICAgICAgICAgICAgQ29sbGVjdGlvbiByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgaWYgKHRlc3RDYXNlcyAhPSBudWxsKSBmb3IgKGludCBqID0gMDsgaiA8IHRlc3RDYXNlcy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUZXN0Q2FzZVJlc3VsdCByZXN1bHQgPSBuZXcgVGVzdENhc2VSZXN1bHQoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQudGVzdENhc2UgPSB0ZXN0Q2FzZXNbal07Ci0gICAgICAgICAgICAgICAgaGFybmVzcy5ydW5UZXN0Q2FzZShyZXN1bHQpOwotICAgICAgICAgICAgICAgIGNhc2VzICs9IDE7Ci0gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuc3VjY2VlZGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzICs9IDE7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXNob3dwYXNzKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChyZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjx0cj48dGQgY29sc3Bhbj0zIGJnY29sb3I9c2t5Ymx1ZT4iICsgbHRnRmlsZSArICI8L3RkPjwvdHI+Iik7Ci0gICAgICAgICAgICBpZiAoIWx0Z0Vycm9ycy5pc0VtcHR5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjx0cj48dGQ+RXJyb3JzIHdpdGhpbiB0aGUgTFRHIGZpbGU6Iik7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjx4bXA+Iik7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBqID0gbHRnRXJyb3JzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKGoubmV4dCgpKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiPC94bXA+Iik7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjwvdGQ+PC90cj4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0cy5zaXplKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjx0cj48dGQgY29sc3Bhbj0zIGJnY29sb3I9Z3JlZW4+Tm90aGluZyB0byByZXBvcnQ8L3RkPjwvdHI+Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVzdWx0cyA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBqID0gcmVzdWx0cy5pdGVyYXRvcigpOyBqLmhhc05leHQoKSA7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1bW1hcml6ZVJlc3VsdEFzSFRNTFRhYmxlUm93cygoVGVzdENhc2VSZXN1bHQpai5uZXh0KCksIHdyaXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd3JpdGVyLnByaW50bG4oIjx0cj48dGQgY29sc3Bhbj0zPlN1bW1hcnk6ICIgKyBmYWlsdXJlcyArICIgZmFpbHVyZXMgb3V0IG9mICIgKyBjYXNlcyArICIgY2FzZXMgcnVuLjwvdGQ+PC90cj4iKTsKLSAgICAgICAgd3JpdGVyLnByaW50bG4oIjwvdGFibGU+Iik7Ci0gICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAKLSAgICAgICAgbG9uZyBmaW5pc2ggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaW1lIHJ1biB0ZXN0czogIiArICgoZG91YmxlKShmaW5pc2ggLSBzdGFydCkgLyAxMDAwLjApICsgIiBzZWNvbmRzIiApOwotICAgICAgICAKLSAgICAgICAgLy8gTGF1bmNoIHJlc3VsdHMKLSAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigid2luZG93cyIpID49IDApCi0gICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKCJjbWQgL2Mgc3RhcnQgaWV4cGxvcmUgXCIiICsgcmVzdWx0c0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXCIiKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHRzIG91dHB1dCB0byAiICsgcmVzdWx0c0ZpbGUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RDYXNlCi0gICAgewotICAgICAgICBwcml2YXRlIEZpbGUgbHRnRmlsZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG9yaWdpbjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0gICAgICAgIHByaXZhdGUgRmlsZSBzY2hlbWFGaWxlOwotICAgICAgICBwcml2YXRlIEZpbGUgaW5zdGFuY2VGaWxlOwotICAgICAgICBwcml2YXRlIEZpbGUgcmVzb3VyY2VGaWxlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc3ZFeHBlY3RlZDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGl2RXhwZWN0ZWQ7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBydkV4cGVjdGVkOwotCi0gICAgICAgIHB1YmxpYyBGaWxlIGdldEx0Z0ZpbGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbHRnRmlsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE9yaWdpbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBvcmlnaW47Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGUgZ2V0U2NoZW1hRmlsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzY2hlbWFGaWxlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGUgZ2V0SW5zdGFuY2VGaWxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlRmlsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBGaWxlIGdldFJlc291cmNlRmlsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUZpbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N2RXhwZWN0ZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3ZFeHBlY3RlZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzSXZFeHBlY3RlZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpdkV4cGVjdGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSdkV4cGVjdGVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJ2RXhwZWN0ZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0Q2FzZVJlc3VsdAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBUZXN0Q2FzZSB0ZXN0Q2FzZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHN2QWN0dWFsOwotICAgICAgICBwcml2YXRlIENvbGxlY3Rpb24gc3ZNZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGl2QWN0dWFsOwotICAgICAgICBwcml2YXRlIENvbGxlY3Rpb24gaXZNZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNyYXNoOwotCi0gICAgICAgIHB1YmxpYyBUZXN0Q2FzZSBnZXRUZXN0Q2FzZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXN0Q2FzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3ZBY3R1YWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3ZBY3R1YWw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdkFjdHVhbChib29sZWFuIHN2QWN0dWFsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnN2QWN0dWFsID0gc3ZBY3R1YWw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0l2QWN0dWFsKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGl2QWN0dWFsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SXZBY3R1YWwoYm9vbGVhbiBpdkFjdHVhbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pdkFjdHVhbCA9IGl2QWN0dWFsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0U3ZNZXNzYWdlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKHN2TWVzc2FnZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkU3ZNZXNzYWdlcyhDb2xsZWN0aW9uIHN2TWVzc2FnZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuc3ZNZXNzYWdlcy5hZGRBbGwoc3ZNZXNzYWdlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRJdk1lc3NhZ2VzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oaXZNZXNzYWdlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRJdk1lc3NhZ2VzKENvbGxlY3Rpb24gaXZNZXNzYWdlcykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pdk1lc3NhZ2VzLmFkZEFsbChpdk1lc3NhZ2VzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q3Jhc2goYm9vbGVhbiBjcmFzaCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jcmFzaCA9IGNyYXNoOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NyYXNoKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNyYXNoOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdWNjZWVkZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIWNyYXNoICYmIChpc0l2QWN0dWFsKCkgPT0gdGVzdENhc2UuaXNJdkV4cGVjdGVkKCkpICYmIChpc1N2QWN0dWFsKCkgPT0gdGVzdENhc2UuaXNTdkV4cGVjdGVkKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEhhcm5lc3MKLSAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1blRlc3RDYXNlKFRlc3RDYXNlUmVzdWx0IHJlc3VsdCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VIVE1MTGluayhGaWxlIGZpbGUsIGJvb2xlYW4gdmFsdWUpCi0gICAgewotICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICImbmJzcDsiOwotICAgICAgICBVUkkgdXJpID0gZmlsZS5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSSSgpOwotICAgICAgICByZXR1cm4gIjxhIGhyZWY9XCIiICsgdXJpICsgIlwiIHRhcmdldD1fYmxhbms+IiArIEJvb2xlYW4udG9TdHJpbmcodmFsdWUpICsgIjwvYT4iOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIGxlYWRpbmdTcGFjZSA9IFBhdHRlcm4uY29tcGlsZSgiXlxccysiLCBQYXR0ZXJuLk1VTFRJTElORSk7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZUhUTUxEZXNjcmlwdGlvbihUZXN0Q2FzZSB0ZXN0Q2FzZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKCI8YSBjbGFzcz1ub2xpbmUgaHJlZj0namF2YXNjcmlwdDpvcGVuV2luZG93KFwiIik7Ci0gICAgICAgIGlmICh0ZXN0Q2FzZS5nZXRTY2hlbWFGaWxlKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiYWJvdXQ6Tm8gc2NoZW1hIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNiLmFwcGVuZCh0ZXN0Q2FzZS5nZXRTY2hlbWFGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZUFsbCgiXFxcXCIsICJcXFxcXFxcXCIpKTsKLQotICAgICAgICBzYi5hcHBlbmQoIlwiLCBcIiIpOwotICAgICAgICBpZiAodGVzdENhc2UuZ2V0SW5zdGFuY2VGaWxlKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiYWJvdXQ6Tm8gaW5zdGFuY2UiKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc2IuYXBwZW5kKHRlc3RDYXNlLmdldEluc3RhbmNlRmlsZSgpLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2VBbGwoIlxcXFwiLCAiXFxcXFxcXFwiKSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiXCIpJz48eG1wPiIpOwotICAgICAgICBzYi5hcHBlbmQobGVhZGluZ1NwYWNlLm1hdGNoZXIodGVzdENhc2UuZ2V0RGVzY3JpcHRpb24oKSkucmVwbGFjZUFsbCgiIikgKyAiKCIgKyB0ZXN0Q2FzZS5nZXRJZCgpICsgIikiKTsKLSAgICAgICAgc2IuYXBwZW5kKCI8L3htcD48L2E+Iik7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3VtbWFyaXplUmVzdWx0QXNIVE1MVGFibGVSb3dzKFRlc3RDYXNlUmVzdWx0IHJlc3VsdCwgUHJpbnRXcml0ZXIgb3V0KQotICAgIHsKLSAgICAgICAgVGVzdENhc2UgdGVzdENhc2UgPSByZXN1bHQuZ2V0VGVzdENhc2UoKTsKLSAgICAgICAgYm9vbGVhbiBzUmlnaHQgPSB0ZXN0Q2FzZS5nZXRTY2hlbWFGaWxlKCkgPT0gbnVsbCB8fCB0ZXN0Q2FzZS5pc1N2RXhwZWN0ZWQoKSA9PSByZXN1bHQuaXNTdkFjdHVhbCgpOwotICAgICAgICBib29sZWFuIGlSaWdodCA9IHRlc3RDYXNlLmdldEluc3RhbmNlRmlsZSgpID09IG51bGwgfHwgdGVzdENhc2UuaXNJdkV4cGVjdGVkKCkgPT0gcmVzdWx0LmlzSXZBY3R1YWwoKTsKLSAgICAgICAgCi0gICAgICAgIG91dC5wcmludGxuKHJlc3VsdC5pc0NyYXNoKCkgPyAiPHRyIGJnY29sb3I9YmxhY2sgY29sb3I9d2hpdGU+IiA6ICI8dHI+Iik7Ci0gICAgICAgIG91dC5wcmludGxuKCI8dGQgdmFsaWduPXRvcD4iICsgbWFrZUhUTUxEZXNjcmlwdGlvbih0ZXN0Q2FzZSkgKyAiPC90ZD4iKTsKLSAgICAgICAgU3RyaW5nIHNMaW5rczsKLSAgICAgICAgaWYgKHRlc3RDYXNlLmdldFJlc291cmNlRmlsZSgpID09IG51bGwpCi0gICAgICAgICAgICBzTGlua3MgPSBtYWtlSFRNTExpbmsodGVzdENhc2UuZ2V0U2NoZW1hRmlsZSgpLCByZXN1bHQuaXNTdkFjdHVhbCgpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc0xpbmtzID0gbWFrZUhUTUxMaW5rKHRlc3RDYXNlLmdldFNjaGVtYUZpbGUoKSwgcmVzdWx0LmlzU3ZBY3R1YWwoKSkgKyAiPGJyPiIgKyBtYWtlSFRNTExpbmsodGVzdENhc2UuZ2V0UmVzb3VyY2VGaWxlKCksIHJlc3VsdC5pc1N2QWN0dWFsKCkpOwotICAgICAgICAKLSAgICAgICAgb3V0LnByaW50bG4oKHNSaWdodCA/ICI8dGQgdmFsaWduPXRvcD4iIDogcmVzdWx0LmlzU3ZBY3R1YWwoKSA/ICI8dGQgYmdjb2xvcj1vcmFuZ2UgdmFsaWduPXRvcD4iIDogIjx0ZCBiZ2NvbG9yPXJlZCB2YWxpZ249dG9wPiIpICsgc0xpbmtzICsgIjwvdGQ+Iik7Ci0gICAgICAgIG91dC5wcmludGxuKChpUmlnaHQgPyAiPHRkIHZhbGlnbj10b3A+IiA6IHJlc3VsdC5pc0l2QWN0dWFsKCkgPyAiPHRkIGJnY29sb3I9b3JhbmdlIHZhbGlnbj10b3A+IiA6ICI8dGQgYmdjb2xvcj1yZWQgdmFsaWduPXRvcD4iKSArIG1ha2VIVE1MTGluayh0ZXN0Q2FzZS5nZXRJbnN0YW5jZUZpbGUoKSwgcmVzdWx0LmlzSXZBY3R1YWwoKSkgKyAiPC90ZD4iKTsKLSAgICAgICAgb3V0LnByaW50bG4oIjwvdHI+Iik7Ci0gICAgICAgIGlmICghcmVzdWx0LmdldEl2TWVzc2FnZXMoKS5pc0VtcHR5KCkgfHwgIXJlc3VsdC5nZXRTdk1lc3NhZ2VzKCkuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXJlc3VsdC5zdWNjZWVkZWQoKSkKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPHRyPjx0ZCBjb2xzcGFuPTMgYmdjb2xvcj15ZWxsb3c+PHhtcD4iKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPHRyPjx0ZCBjb2xzcGFuPTM+PHhtcD4iKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IHJlc3VsdC5nZXRTdk1lc3NhZ2VzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihqLm5leHQoKSk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSByZXN1bHQuZ2V0SXZNZXNzYWdlcygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oai5uZXh0KCkpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oIjwveG1wPjwvdHI+PC90ZD4iKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3RDYXNlW10gcGFyc2VMVEdGaWxlKEZpbGUgbHRnRmlsZSwgQ29sbGVjdGlvbiBvdXRlckVycm9ycykKLSAgICB7Ci0gICAgICAgIENvbGxlY3Rpb24gZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sT3B0aW9ucyBsdGdPcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgICAgIGx0Z09wdGlvbnMuc2V0TG9hZFN1YnN0aXR1dGVOYW1lc3BhY2VzKENvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcCgiIiwgImh0dHA6Ly93d3cuYmVhLmNvbS8yMDAzLzA1L3htbGJlYW4vbHRnZm10IikpOwotICAgICAgICAgICAgbHRnT3B0aW9ucy5zZXRFcnJvckxpc3RlbmVyKGVycm9ycyk7Ci0gICAgICAgICAgICBsdGdPcHRpb25zLnNldExvYWRMaW5lTnVtYmVycygpOwotICAgICAgICAgICAgVGVzdHNEb2N1bWVudCBkb2MgPSBUZXN0c0RvY3VtZW50LkZhY3RvcnkucGFyc2UobHRnRmlsZSwgbHRnT3B0aW9ucyk7Ci0gICAgICAgICAgICBpZiAoIWRvYy52YWxpZGF0ZShsdGdPcHRpb25zKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJEb2N1bWVudCAiICsgbHRnRmlsZSArICIgbm90IHZhbGlkLiIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjb20uYmVhLngyMDAzLngwNS54bWxiZWFuLmx0Z2ZtdC5UZXN0Q2FzZVtdIHRlc3RDYXNlcyA9IGRvYy5nZXRUZXN0cygpLmdldFRlc3RBcnJheSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdENhc2VzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRlc3RDYXNlIG5ld0Nhc2UgPSBuZXcgVGVzdENhc2UoKTsKLSAgICAgICAgICAgICAgICBuZXdDYXNlLmx0Z0ZpbGUgPSBsdGdGaWxlOwotICAgICAgICAgICAgICAgIG5ld0Nhc2UuaWQgPSB0ZXN0Q2FzZXNbaV0uZ2V0SWQoKTsKLSAgICAgICAgICAgICAgICBuZXdDYXNlLm9yaWdpbiA9IHRlc3RDYXNlc1tpXS5nZXRPcmlnaW4oKTsKLSAgICAgICAgICAgICAgICBuZXdDYXNlLmRlc2NyaXB0aW9uID0gdGVzdENhc2VzW2ldLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgRmlsZURlc2NbXSBmaWxlZGVzY3MgPSB0ZXN0Q2FzZXNbaV0uZ2V0RmlsZXMoKS5nZXRGaWxlQXJyYXkoKTsKLSAgICAgICAgICAgICAgICB0ZXN0Q2FzZXNbaV0uZ2V0T3JpZ2luKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmaWxlZGVzY3MubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGlyID0gZmlsZWRlc2NzW2pdLmdldEZvbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlZGVzY3Nbal0uZ2V0RmlsZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSB0aGVGaWxlID0gbmV3IEZpbGUobHRnRmlsZS5nZXRQYXJlbnRGaWxlKCksIGRpciArICIvIiArIGZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGVGaWxlLmV4aXN0cygpIHx8ICF0aGVGaWxlLmlzRmlsZSgpIHx8ICF0aGVGaWxlLmNhblJlYWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJFcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdCgiQ2FuJ3QgcmVhZCBmaWxlICIgKyB0aGVGaWxlLCBmaWxlZGVzY3Nbal0pLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZmlsZWRlc2NzW2pdLmdldFJvbGUoKS5pbnRWYWx1ZSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpbGVEZXNjLlJvbGUuSU5UX0lOU1RBTkNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDYXNlLmluc3RhbmNlRmlsZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlckVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KCJNb3JlIHRoYW4gb25lIGluc3RhbmNlIGZpbGUgc3BlaWNpZmVkIC0gaWdub3JpbmcgYWxsIGJ1dCBsYXN0IiwgZmlsZWRlc2NzW2pdKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDYXNlLmluc3RhbmNlRmlsZSA9IHRoZUZpbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2FzZS5pdkV4cGVjdGVkID0gZmlsZWRlc2NzW2pdLmdldFZhbGlkaXR5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpbGVEZXNjLlJvbGUuSU5UX1NDSEVNQToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q2FzZS5zY2hlbWFGaWxlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyRXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoIk1vcmUgdGhhbiBvbmUgc2NoZW1hIGZpbGUgc3BlaWNpZmVkIC0gaWdub3JpbmcgYWxsIGJ1dCBsYXN0IiwgZmlsZWRlc2NzW2pdKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDYXNlLnNjaGVtYUZpbGUgPSB0aGVGaWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nhc2Uuc3ZFeHBlY3RlZCA9IGZpbGVkZXNjc1tqXS5nZXRWYWxpZGl0eSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWxlRGVzYy5Sb2xlLklOVF9SRVNPVVJDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q2FzZS5yZXNvdXJjZUZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJFcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdCgiTW9yZSB0aGFuIG9uZSByZXNvdXJjZSBmaWxlIHNwZWljaWZlZCAtIGlnbm9yaW5nIGFsbCBidXQgbGFzdCIsIGZpbGVkZXNjc1tqXSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2FzZS5yZXNvdXJjZUZpbGUgPSB0aGVGaWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nhc2UucnZFeHBlY3RlZCA9IGZpbGVkZXNjc1tqXS5nZXRWYWxpZGl0eSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxFeGNlcHRpb24oWG1sRXJyb3IuZm9yT2JqZWN0KCJVbmV4cGVjdGVkIGZpbGUgcm9sZSIsIGZpbGVkZXNjc1tqXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobmV3Q2FzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKFRlc3RDYXNlW10pcmVzdWx0LnRvQXJyYXkobmV3IFRlc3RDYXNlW3Jlc3VsdC5zaXplKCldKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlcnJvcnMuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIG91dGVyRXJyb3JzLmFkZChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBlbHNlIGZvciAoSXRlcmF0b3IgaSA9IGVycm9ycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIG91dGVyRXJyb3JzLmFkZChpLm5leHQoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvWHNiRHVtcGVyLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9Yc2JEdW1wZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNkZjEyOS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9Yc2JEdW1wZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNTcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudXRpbC5IZXhCaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zb2FwLlNPQVBBcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBYc2JEdW1wZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBkdW1wKG5ldyBGaWxlKGFyZ3NbaV0pLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZHVtcChGaWxlIGZpbGUsIGJvb2xlYW4gZm9yY2UpCi0gICAgewotICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBmaWxlLmxpc3RGaWxlcygKLSAgICAgICAgICAgICAgICBuZXcgRmlsZUZpbHRlcigpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmaWxlKQotICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gZmlsZS5pc0RpcmVjdG9yeSgpIHx8IGZpbGUuaXNGaWxlKCkgJiYgZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi54c2IiKTsgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGR1bXAoZmlsZXNbaV0sIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphciIpIHx8IGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuemlwIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGR1bXBaaXAoZmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZm9yY2UgfHwgZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi54c2IiKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGZpbGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgZHVtcChuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpLCAiICAiKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wWmlwKEZpbGUgZmlsZSkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBaaXBGaWxlIHppcEZpbGUgPSBuZXcgWmlwRmlsZShmaWxlKTsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSB6aXBGaWxlLmVudHJpZXMoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIueHNiIikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZW50cnkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZHVtcCh6aXBGaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KSwgIiAgIik7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcChJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICB7Ci0gICAgICAgIGR1bXAoaW5wdXQsICIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcChJbnB1dFN0cmVhbSBpbnB1dCwgU3RyaW5nIGluZGVudCkKLSAgICB7Ci0gICAgICAgIFhzYkR1bXBlciBkdW1wZXIgPSBuZXcgWHNiRHVtcGVyKGlucHV0LCBpbmRlbnQpOwotICAgICAgICBkdW1wZXIuZHVtcEFsbCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgWHNiRHVtcGVyKElucHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGluZGVudCkKLSAgICB7Ci0gICAgICAgIF9pbnB1dCA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgX2luZGVudCA9IGluZGVudDsKLSAgICB9Ci0KLSAgICB2b2lkIGZsdXNoKCkgeyBTeXN0ZW0ub3V0LmZsdXNoKCk7IH0KLSAgICB2b2lkIGVtaXQoU3RyaW5nIHN0cikgeyBTeXN0ZW0ub3V0LnByaW50bG4oX2luZGVudCArIHN0cik7IGZsdXNoKCk7IH0KLSAgICB2b2lkIGVtaXQoKSB7IFN5c3RlbS5vdXQucHJpbnRsbigpOyBmbHVzaCgpOyB9Ci0gICAgdm9pZCBlcnJvcihFeGNlcHRpb24gZSkgeyBTeXN0ZW0ub3V0LnByaW50bG4oZS50b1N0cmluZygpKTsgZmx1c2goKTsgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUyID0gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCkgKTsgZTIuaW5pdENhdXNlKCBlICk7IHRocm93IGUyOyB9Ci0gICAgdm9pZCBlcnJvcihTdHJpbmcgc3RyKSB7IFN5c3RlbS5vdXQucHJpbnRsbihzdHIpOyBmbHVzaCgpOyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZTIgPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCBzdHIgKTsgdGhyb3cgZTI7IH0KLSAgICBwcml2YXRlIFN0cmluZyBfaW5kZW50OwotICAgIHZvaWQgaW5kZW50KCkgeyBfaW5kZW50ICs9ICIgICI7IH0KLSAgICB2b2lkIG91dGRlbnQoKSB7IF9pbmRlbnQgPSBfaW5kZW50LnN1YnN0cmluZygwLCBfaW5kZW50Lmxlbmd0aCgpIC0gMik7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEFfQkFCRSA9IDB4REE3QUJBQkU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFKT1JfVkVSU0lPTiA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOT1JfVkVSU0lPTiA9IDE2OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BSU5ERVggPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVUWVBFX1NDSEVNQVRZUEUgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVUWVBFX1NDSEVNQUVMRU1FTlQgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURSA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BUE9JTlRFUiA9IDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BTU9ERUxHUk9VUCA9IDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFR1JPVVAgPSA3OwotCi0gICAgc3RhdGljIFN0cmluZyBmaWxldHlwZVN0cmluZyhpbnQgY29kZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFJTkRFWDogcmV0dXJuICJGSUxFVFlQRV9TQ0hFTUFJTkRFWCI7Ci0gICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQVRZUEU6IHJldHVybiAiRklMRVRZUEVfU0NIRU1BVFlQRSI7Ci0gICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUVMRU1FTlQ6IHJldHVybiAiRklMRVRZUEVfU0NIRU1BRUxFTUVOVCI7Ci0gICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURTogcmV0dXJuICJGSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEUiOwotICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFQT0lOVEVSOiByZXR1cm4gIkZJTEVUWVBFX1NDSEVNQVBPSU5URVIiOwotICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFNT0RFTEdST1VQOiByZXR1cm4gIkZJTEVUWVBFX1NDSEVNQU1PREVMR1JPVVAiOwotICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEVHUk9VUDogcmV0dXJuICJGSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEVHUk9VUCI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBGSUxFVFlQRSAoIiArIGNvZGUgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfU0tJUFBBQkxFID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfRklYRUQgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9OSUxMQUJMRSA9IDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0JMT0NLRVhUID0gMTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0JMT0NLUkVTVCA9IDMyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9CTE9DS1NVQlNUID0gNjQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0FCU1RSQUNUID0gMTI4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9GSU5BTEVYVCA9IDI1NjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfRklOQUxSRVNUID0gNTEyOwotCi0gICAgc3RhdGljIFN0cmluZyBwYXJ0aWNsZWZsYWdzU3RyaW5nKGludCBmbGFncykKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1BBUlRfU0tJUFBBQkxFKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1BBUlRfU0tJUFBBQkxFIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1BBUlRfRklYRUQpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfUEFSVF9GSVhFRCB8ICIpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19QQVJUX05JTExBQkxFKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1BBUlRfTklMTEFCTEUgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUEFSVF9CTE9DS0VYVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19QQVJUX0JMT0NLRVhUIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1BBUlRfQkxPQ0tSRVNUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1BBUlRfQkxPQ0tSRVNUIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1BBUlRfQkxPQ0tTVUJTVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19QQVJUX0JMT0NLU1VCU1QgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUEFSVF9BQlNUUkFDVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19QQVJUX0FCU1RSQUNUIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1BBUlRfRklOQUxFWFQpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfUEFSVF9GSU5BTEVYVCB8ICIpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19QQVJUX0ZJTkFMUkVTVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19QQVJUX0ZJTkFMUkVTVCB8ICIpOwotICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCgpID09IDApIHJlc3VsdC5hcHBlbmQoIjAgfCAiKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC5zdWJzdHJpbmcoMCwgcmVzdWx0Lmxlbmd0aCgpIC0gMyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QUk9QX0lTQVRUUiA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QUk9QX0pBVkFTSU5HTEVUT04gPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUFJPUF9KQVZBT1BUSU9OQUwgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUFJPUF9KQVZBQVJSQVkgPSA4OwotCi0gICAgc3RhdGljIFN0cmluZyBwcm9wZXJ0eWZsYWdzU3RyaW5nKGludCBmbGFncykKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1BST1BfSVNBVFRSKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1BST1BfSVNBVFRSIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1BST1BfSkFWQVNJTkdMRVRPTikgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19QUk9QX0pBVkFTSU5HTEVUT04gfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUFJPUF9KQVZBT1BUSU9OQUwpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfUFJPUF9KQVZBT1BUSU9OQUwgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUFJPUF9KQVZBQVJSQVkpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfUFJPUF9KQVZBQVJSQVkgfCAiKTsKLSAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGgoKSA9PSAwKSByZXN1bHQuYXBwZW5kKCIwIHwgIik7Ci0gICAgICAgIHJldHVybiByZXN1bHQuc3Vic3RyaW5nKDAsIHJlc3VsdC5sZW5ndGgoKSAtIDMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX05PTkUgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX0dMT0JBTCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfTE9DQUxBVFRSID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9MT0NBTEVMVCA9IDM7Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGNvbnRhaW5lcmZpZWxkVHlwZVN0cmluZyhpbnQgY29kZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBGSUVMRF9OT05FOiByZXR1cm4gIkZJRUxEX05PTkUiOwotICAgICAgICAgICAgY2FzZSBGSUVMRF9HTE9CQUw6IHJldHVybiAiRklFTERfR0xPQkFMIjsKLSAgICAgICAgICAgIGNhc2UgRklFTERfTE9DQUxBVFRSOiByZXR1cm4gIkZJRUxEX0xPQ0FMQVRUUiI7Ci0gICAgICAgICAgICBjYXNlIEZJRUxEX0xPQ0FMRUxUOiByZXR1cm4gIkZJRUxEX0xPQ0FMRUxUIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIGNvbnRhaW5lciBmaWVsZCB0eXBlICgiICsgY29kZSArICIpIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHR5cGUgZmxhZ3MKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfU0lNUExFX1RZUEUgICAgID0gMHgxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ET0NVTUVOVF9UWVBFICAgPSAweDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX09SREVSRUQgICAgICAgICA9IDB4NDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfQk9VTkRFRCAgICAgICAgID0gMHg4OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSU5JVEUgICAgICAgICAgPSAweDEwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19OVU1FUklDICAgICAgICAgPSAweDIwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TVFJJTkdFTlVNICAgICAgPSAweDQwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VTklPTl9PRl9MSVNUUyAgPSAweDgwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19IQVNfUEFUVEVSTiAgICAgPSAweDEwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfT1JERVJfU0VOU0lUSVZFID0gMHgyMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX1RPVEFMX09SREVSICAgICA9IDB4NDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DT01QSUxFRCAgICAgICAgPSAweDgwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfQkxPQ0tfRVhUICAgICAgID0gMHgxMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19CTE9DS19SRVNUICAgICAgPSAweDIwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZJTkFMX0VYVCAgICAgICA9IDB4NDAwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfRklOQUxfUkVTVCAgICAgID0gMHg4MDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSU5BTF9VTklPTiAgICAgPSAweDEwMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSU5BTF9MSVNUICAgICAgPSAweDIwMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BQlNUUkFDVCAgICAgICAgPSAweDQwMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BVFRSSUJVVEVfVFlQRSAgPSAweDgwMDAwOwotCi0gICAgc3RhdGljIFN0cmluZyB0eXBlZmxhZ3NTdHJpbmcoaW50IGZsYWdzKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfU0lNUExFX1RZUEUpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfU0lNUExFX1RZUEUgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfRE9DVU1FTlRfVFlQRSkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19ET0NVTUVOVF9UWVBFIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FUVFJJQlVURV9UWVBFKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0FUVFJJQlVURV9UWVBFIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX09SREVSRUQpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfT1JERVJFRCB8ICIpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19CT1VOREVEKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0JPVU5ERUQgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfRklOSVRFKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0ZJTklURSB8ICIpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19OVU1FUklDKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX05VTUVSSUMgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfU1RSSU5HRU5VTSkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19TVFJJTkdFTlVNIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1VOSU9OX09GX0xJU1RTKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1VOSU9OX09GX0xJU1RTIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0hBU19QQVRURVJOKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0hBU19QQVRURVJOIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1RPVEFMX09SREVSKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1RPVEFMX09SREVSIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0NPTVBJTEVEKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0NPTVBJTEVEIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0JMT0NLX0VYVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19CTE9DS19FWFQgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfQkxPQ0tfUkVTVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19CTE9DS19SRVNUIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0ZJTkFMX0VYVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19GSU5BTF9FWFQgfCAiKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfRklOQUxfUkVTVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19GSU5BTF9SRVNUIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0ZJTkFMX1VOSU9OKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0ZJTkFMX1VOSU9OIHwgIik7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0ZJTkFMX0xJU1QpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfRklOQUxfTElTVCB8ICIpOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19BQlNUUkFDVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19BQlNUUkFDVCB8ICIpOwotICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCgpID09IDApIHJlc3VsdC5hcHBlbmQoIjAgfCAiKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC5zdWJzdHJpbmcoMCwgcmVzdWx0Lmxlbmd0aCgpIC0gMyk7Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wQWxsKCkKLSAgICB7Ci0gICAgICAgIGludCBmaWxldHlwZSA9IGR1bXBIZWFkZXIoKTsKLSAgICAgICAgc3dpdGNoIChmaWxldHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFJTkRFWDoKLSAgICAgICAgICAgICAgICBkdW1wSW5kZXhEYXRhKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFUWVBFOgotICAgICAgICAgICAgICAgIGR1bXBUeXBlRmlsZURhdGEoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BRUxFTUVOVDoKLSAgICAgICAgICAgICAgICBkdW1wUGFydGljbGVEYXRhKHRydWUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEU6Ci0gICAgICAgICAgICAgICAgZHVtcEF0dHJpYnV0ZURhdGEodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQVBPSU5URVI6Ci0gICAgICAgICAgICAgICAgZHVtcFBvaW50ZXJEYXRhKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQU1PREVMR1JPVVA6Ci0gICAgICAgICAgICAgICAgZHVtcE1vZGVsR3JvdXBEYXRhKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURUdST1VQOgotICAgICAgICAgICAgICAgIGR1bXBBdHRyaWJ1dGVHcm91cERhdGEoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZWFkRW5kKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBoZXgzMlN0cmluZyhpbnQgaSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnRvSGV4U3RyaW5nKGkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgZHVtcEhlYWRlcigpCi0gICAgewotICAgICAgICBpbnQgbWFnaWMgPSByZWFkSW50KCk7Ci0gICAgICAgIGVtaXQoIk1hZ2ljIGNvb2tpZTogIiArIGhleDMyU3RyaW5nKG1hZ2ljKSk7Ci0KLSAgICAgICAgaWYgKG1hZ2ljICE9IERBVEFfQkFCRSkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdCgiV3JvbmcgbWFnaWMgY29va2llLiIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBfbWFqb3J2ZXIgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgX21pbm9ydmVyID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGlmIChhdExlYXN0KDIsIDE4LCAwKSkKLSAgICAgICAgICAgIF9yZWxlYXNlbm8gPSByZWFkU2hvcnQoKTsKLQotICAgICAgICBlbWl0KCJNYWpvciB2ZXJzaW9uOiAiICsgX21ham9ydmVyKTsKLSAgICAgICAgZW1pdCgiTWlub3IgdmVyc2lvbjogIiArIF9taW5vcnZlcik7Ci0gICAgICAgIGVtaXQoIlJlbGVhc2UgbnVtYmVyOiAiICsgX3JlbGVhc2Vubyk7Ci0KLSAgICAgICAgaWYgKF9tYWpvcnZlciAhPSBNQUpPUl9WRVJTSU9OIHx8IF9taW5vcnZlciA+IE1JTk9SX1ZFUlNJT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXQoIkluY29tcGF0aWJsZSB2ZXJzaW9uLiIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgYWN0dWFsZmlsZXR5cGUgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgZW1pdCgiRmlsZXR5cGU6ICIgKyBmaWxldHlwZVN0cmluZyhhY3R1YWxmaWxldHlwZSkpOwotCi0gICAgICAgIF9zdHJpbmdQb29sID0gbmV3IFN0cmluZ1Bvb2woKTsKLSAgICAgICAgX3N0cmluZ1Bvb2wucmVhZEZyb20oX2lucHV0KTsKLQotICAgICAgICByZXR1cm4gYWN0dWFsZmlsZXR5cGU7Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wUG9pbnRlckRhdGEoKQotICAgIHsKLSAgICAgICAgZW1pdCgiVHlwZSBzeXN0ZW06ICIgKyByZWFkU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGR1bXBJbmRleERhdGEoKQotICAgIHsKLSAgICAgICAgLy8gaGFzIGEgaGFuZGxlIHBvb2wgKGNvdW50LCBoYW5kbGUvdHlwZSwgaGFuZGxlL3R5cGUuLi4pCi0gICAgICAgIGludCBzaXplID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGVtaXQoIkhhbmRsZSBwb29sICgiICsgc2l6ZSArICIpOiIpOwotICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBoYW5kbGUgPSByZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBzaG9ydCBjb2RlID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBlbWl0KGhhbmRsZSArICIgKCIgKyBmaWxldHlwZVN0cmluZyhjb2RlKSArICIpIik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0ZGVudCgpOwotCi0gICAgICAgIGR1bXBRTmFtZU1hcCgiR2xvYmFsIGVsZW1lbnRzIik7Ci0KLSAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGdsb2JhbCBhdHRyaWJ1dGVzCi0gICAgICAgIGR1bXBRTmFtZU1hcCgiR2xvYmFsIGF0dHJpYnV0ZXMiKTsKLQotICAgICAgICAvLyBhdHRyIGdyb3VwcyBhbmQgbW9kZWwgZ3JvdXBzCi0gICAgICAgIGR1bXBRTmFtZU1hcCgiTW9kZWwgZ3JvdXBzIik7Ci0gICAgICAgIGR1bXBRTmFtZU1hcCgiQXR0cmlidXRlIGdyb3VwcyIpOwotCi0gICAgICAgIGR1bXBRTmFtZU1hcCgiSWRlbnRpdHkgY29uc3RyYWludHMiKTsKLQotICAgICAgICAvLyBxbmFtZSBtYXAgb2YgZ2xvYmFsIHR5cGVzCi0gICAgICAgIGR1bXBRTmFtZU1hcCgiR2xvYmFsIHR5cGVzIik7Ci0KLSAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGRvY3VtZW50IHR5cGVzLCBieSB0aGUgcW5hbWUgb2YgdGhlIGNvbnRhaW5lZCBlbGVtZW50Ci0gICAgICAgIGR1bXBRTmFtZU1hcCgiRG9jdW1lbnQgdHlwZXMiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHFuYW1lIG1hcCBvZiBhdHRyaWJ1dGUgdHlwZXMsIGJ5IHRoZSBxbmFtZSBvZiB0aGUgY29udGFpbmVkIGF0dHJpYnV0ZQotICAgICAgICBkdW1wUU5hbWVNYXAoIkF0dHJpYnV0ZSB0eXBlcyIpOwotCi0gICAgICAgIC8vIGFsbCB0aGUgdHlwZXMgaW5kZXhlZCBieSBjbGFzc25hbWUKLSAgICAgICAgZHVtcENsYXNzbmFtZUluZGV4KCJBbGwgdHlwZXMgYnkgY2xhc3NuYW1lIik7Ci0KLSAgICAgICAgLy8gYWxsIHRoZSBuYW1lc3BhY2VzCi0gICAgICAgIGR1bXBTdHJpbmdBcnJheSgiRGVmaW5lZCBuYW1lc3BhY2VzIik7Ci0gICAgICAgIAotICAgICAgICAvLyB2ZXJzaW9uIDE1IHN0dWZmIGZvciByZWRlZmluZXMKLSAgICAgICAgaWYgKGF0TGVhc3QoMiwgMTUsIDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBkdW1wUU5hbWVNYXAoIlJlZGVmaW5lZCBnbG9iYWwgdHlwZXMiKTsKLSAgICAgICAgICAgIGR1bXBRTmFtZU1hcCgiUmVkZmluZWQgbW9kZWwgZ3JvdXBzIik7Ci0gICAgICAgICAgICBkdW1wUU5hbWVNYXAoIlJlZGZpbmVkIGF0dHJpYnV0ZSBncm91cHMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlYWRFbmQoKTsKLSAgICB9Ci0KLQotICAgIGNsYXNzIFN0cmluZ1Bvb2wKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgTGlzdCBpbnRzVG9TdHJpbmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwcml2YXRlIE1hcCBzdHJpbmdzVG9JbnRzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBTdHJpbmdQb29sKCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50c1RvU3RyaW5ncy5hZGQobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgc3RyaW5nRm9yQ29kZShpbnQgY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKWludHNUb1N0cmluZ3MuZ2V0KGNvZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGNvZGVGb3JTdHJpbmcoU3RyaW5nIHN0cikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0ciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgSW50ZWdlciByZXN1bHQgPSAoSW50ZWdlcilzdHJpbmdzVG9JbnRzLmdldChzdHIpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJbnRlZ2VyKGludHNUb1N0cmluZ3Muc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBpbnRzVG9TdHJpbmdzLmFkZChzdHIpOwotICAgICAgICAgICAgICAgIHN0cmluZ3NUb0ludHMucHV0KHN0ciwgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQuaW50VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcmVhZEZyb20oRGF0YUlucHV0U3RyZWFtIGlucHV0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaW50c1RvU3RyaW5ncy5zaXplKCkgIT0gMSB8fCBzdHJpbmdzVG9JbnRzLnNpemUoKSAhPSAwKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHNpemUgPSBpbnB1dC5yZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJTdHJpbmcgcG9vbCAoIiArIHNpemUgKyAiKToiKTsKLSAgICAgICAgICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHIgPSBpbnB1dC5yZWFkVVRGKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb2RlID0gY29kZUZvclN0cmluZyhzdHIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSBpKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBlbWl0KGNvZGUgKyAiID0gXCIiICsgc3RyICsgIlwiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dGRlbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXQoZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGFjdGl2ZSB3aGlsZSBsb2FkaW5nIG9uZSB0eXBlLgotICAgIERhdGFJbnB1dFN0cmVhbSBfaW5wdXQ7Ci0gICAgU3RyaW5nUG9vbCBfc3RyaW5nUG9vbDsKLQotICAgIHNob3J0IHJlYWRTaG9ydCgpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9pbnB1dC5yZWFkU2hvcnQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyb3IoZSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCByZWFkSW50KCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2lucHV0LnJlYWRJbnQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyb3IoZSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFN0cmluZyByZWFkU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc3RyaW5nUG9vbC5zdHJpbmdGb3JDb2RlKHJlYWRTaG9ydCgpKTsKLSAgICB9Ci0KLSAgICBRTmFtZSByZWFkUU5hbWUoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHJlYWRTdHJpbmcoKTsKLSAgICAgICAgU3RyaW5nIGxvY2FsbmFtZSA9IHJlYWRTdHJpbmcoKTsKLSAgICAgICAgaWYgKGxvY2FsbmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUobmFtZXNwYWNlLCBsb2NhbG5hbWUpOwotICAgIH0KLQotICAgIFN0cmluZyByZWFkSGFuZGxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZWFkU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgU3RyaW5nIHJlYWRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZWFkSGFuZGxlKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBxbmFtZVN0cmluZyhRTmFtZSBxbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChxbmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICIobnVsbCkiOwotICAgICAgICBpZiAocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBxbmFtZS5nZXRMb2NhbFBhcnQoKSArICJAIiArIHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBxbmFtZVNldFN0cmluZyhRTmFtZVNldCBzZXQpCi0gICAgewotICAgICAgICByZXR1cm4gc2V0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wUU5hbWVNYXAoU3RyaW5nIGZpZWxkbmFtZSkKLSAgICB7Ci0gICAgICAgIGludCBzaXplID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGVtaXQoZmllbGRuYW1lICsgIiAoIiArIHNpemUgKyAiKToiKTsKLSAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0KHFuYW1lU3RyaW5nKHJlYWRRTmFtZSgpKSArICIgPSAiICsgcmVhZEhhbmRsZSgpKTsKLSAgICAgICAgfQotICAgICAgICBvdXRkZW50KCk7Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wVHlwZUFycmF5KFN0cmluZyBmaWVsZG5hbWUpCi0gICAgewotICAgICAgICBpbnQgc2l6ZSA9IHJlYWRTaG9ydCgpOwotICAgICAgICBlbWl0KGZpZWxkbmFtZSArICIgKCIgKyBzaXplICsgIik6Iik7Ci0gICAgICAgIGluZGVudCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdChpICsgIiA9ICIgKyByZWFkVHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICBvdXRkZW50KCk7Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wQ2xhc3NuYW1lSW5kZXgoU3RyaW5nIGZpZWxkbmFtZSkKLSAgICB7Ci0gICAgICAgIGludCBzaXplID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGVtaXQoZmllbGRuYW1lICsgIiAoIiArIHNpemUgKyAiKToiKTsKLSAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0KHJlYWRTdHJpbmcoKSArICIgPSAiICsgcmVhZFR5cGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0ZGVudCgpOwotICAgIH0KLQotICAgIHZvaWQgZHVtcFN0cmluZ0FycmF5KFN0cmluZyBmaWVsZG5hbWUpCi0gICAgewotICAgICAgICBpbnQgc2l6ZSA9IHJlYWRTaG9ydCgpOwotICAgICAgICBlbWl0KGZpZWxkbmFtZSArICIgKCIgKyBzaXplICsgIik6Iik7Ci0gICAgICAgIGluZGVudCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdChyZWFkU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIG91dGRlbnQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlYWRFbmQoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIF9pbnB1dC5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBvaCwgd2VsbC4KLSAgICAgICAgfQotICAgICAgICBfaW5wdXQgPSBudWxsOwotICAgICAgICBfc3RyaW5nUG9vbCA9IG51bGw7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBwYXJ0aWNsZVR5cGVTdHJpbmcoaW50IHNwdCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoc3B0KQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDogcmV0dXJuICJBTEwiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6IHJldHVybiAiQ0hPSUNFIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDogcmV0dXJuICJFTEVNRU5UIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6IHJldHVybiAiU0VRVUVOQ0UiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDogcmV0dXJuICJXSUxEQ0FSRCI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBwYXJ0aWNsZSB0eXBlICgiICsgc3B0ICsgIikiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBiaWdJbnRlZ2VyU3RyaW5nKEJpZ0ludGVnZXIgYmlnaW50KQotICAgIHsKLSAgICAgICAgaWYgKGJpZ2ludCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICIobnVsbCkiOwotICAgICAgICByZXR1cm4gYmlnaW50LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyB3Y3Byb2Nlc3NTdHJpbmcoaW50IGNvZGUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU1RSSUNUOiByZXR1cm4gIlNUUklDVCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNLSVA6IHJldHVybiAiU0tJUCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkxBWDogcmV0dXJuICJMQVgiOwotICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gIk5PVF9XSUxEQ0FSRCI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBwcm9jZXNzIHR5cGUgKCIgKyBjb2RlICsgIikiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wUGFydGljbGVEYXRhKGJvb2xlYW4gZ2xvYmFsKQotICAgIHsKLSAgICAgICAgc2hvcnQgcGFydGljbGVUeXBlID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGVtaXQocGFydGljbGVUeXBlU3RyaW5nKHBhcnRpY2xlVHlwZSkgKyAiOiIpOwotICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgc2hvcnQgcGFydGljbGVGbGFncyA9IHJlYWRTaG9ydCgpOwotICAgICAgICBlbWl0KCJGbGFnczogIiArIHBhcnRpY2xlZmxhZ3NTdHJpbmcocGFydGljbGVGbGFncykpOwotCi0gICAgICAgIGVtaXQoIk1pbk9jY3VyczogIiArIGJpZ0ludGVnZXJTdHJpbmcocmVhZEJpZ0ludGVnZXIoKSkpOwotICAgICAgICBlbWl0KCJNYXhPY2N1cnM6ICIgKyBiaWdJbnRlZ2VyU3RyaW5nKHJlYWRCaWdJbnRlZ2VyKCkpKTsKLQotICAgICAgICBlbWl0KCJUcmFuc2l0aW9uOiAiICsgcW5hbWVTZXRTdHJpbmcocmVhZFFOYW1lU2V0KCkpKTsKLQotICAgICAgICBzd2l0Y2ggKHBhcnRpY2xlVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKLSAgICAgICAgICAgICAgICBlbWl0KCJXaWxkY2FyZCBzZXQ6ICIgKyBxbmFtZVNldFN0cmluZyhyZWFkUU5hbWVTZXQoKSkpOwotICAgICAgICAgICAgICAgIGVtaXQoIldpbGRjYXJkIHByb2Nlc3M6ICIgKyB3Y3Byb2Nlc3NTdHJpbmcocmVhZFNob3J0KCkpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgotICAgICAgICAgICAgICAgIGVtaXQoIk5hbWU6ICIgKyBxbmFtZVN0cmluZyhyZWFkUU5hbWUoKSkpOwotICAgICAgICAgICAgICAgIGVtaXQoIlR5cGU6ICIgKyByZWFkVHlwZSgpKTsKLSAgICAgICAgICAgICAgICBlbWl0KCJEZWZhdWx0OiAiICsgcmVhZFN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpZiAoYXRMZWFzdCgyLCAxNiwgMCkpCi0gICAgICAgICAgICAgICAgICAgIGVtaXQoIkRlZmF1bHQgdmFsdWU6ICIgKyByZWFkWG1sVmFsdWVPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgZW1pdCgiV3NkbEFycmF5VHlwZTogIiArIFNPQVBBcnJheVR5cGVTdHJpbmcocmVhZFNPQVBBcnJheVR5cGUoKSkpOwotICAgICAgICAgICAgICAgIGlmIChnbG9iYWwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzaG9ydCBzdWJzdEdyb3VwQ291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCgiU3Vic3RpdHV0aW9uIGdyb3VwIG1lbWJlcnMgKCIgKyBzdWJzdEdyb3VwQ291bnQgKyAiKSIpOwotICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJzdEdyb3VwQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChxbmFtZVN0cmluZyhyZWFkUU5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG91dGRlbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgZW1pdCgiSWRlbnRpdHkgY29uc3RyYWludHMgKCIgKyBjb3VudCArICIpOiIpOwotICAgICAgICAgICAgICAgIGluZGVudCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQocmVhZEhhbmRsZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0ZGVudCgpOwotICAgICAgICAgICAgICAgIGlmIChnbG9iYWwpCi0gICAgICAgICAgICAgICAgICAgIGVtaXQoIkZpbGVuYW1lOiAiICsgcmVhZFN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6Ci0gICAgICAgICAgICAgICAgZHVtcFBhcnRpY2xlQXJyYXkoIlBhcnRpY2xlIGNoaWxkcmVuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgZXJyb3IoIlVucmVjb2duaXplZCBzY2hlbWEgcGFydGljbGUgdHlwZSIpOwotICAgICAgICB9Ci0gICAgICAgIG91dGRlbnQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGR1bXBQYXJ0aWNsZUFycmF5KFN0cmluZyBmaWVsZG5hbWUpCi0gICAgewotICAgICAgICBpbnQgY291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgZW1pdChmaWVsZG5hbWUgKyAiKCIgKyBjb3VudCArICIpOiIpOwotICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICAgICAgZHVtcFBhcnRpY2xlRGF0YShmYWxzZSk7Ci0gICAgICAgIG91dGRlbnQoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGNvbXBsZXhWYXJpZXR5U3RyaW5nKGludCBjb2RlKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChjb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRU1QVFlfQ09OVEVOVDogcmV0dXJuICJFTVBUWV9DT05URU5UIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVDogcmV0dXJuICJTSU1QTEVfQ09OVEVOVCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRUxFTUVOVF9DT05URU5UOiByZXR1cm4gIkVMRU1FTlRfQ09OVEVOVCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVDogcmV0dXJuICJNSVhFRF9DT05URU5UIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIGNvbXBsZXggdmFyaWV0eSAoIiArIGNvZGUgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIHNpbXBsZVZhcmlldHlTdHJpbmcoaW50IGNvZGUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5BVE9NSUM6IHJldHVybiAiQVRPTUlDIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUOiByZXR1cm4gIkxJU1QiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OOiByZXR1cm4gIlVOSU9OIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIHNpbXBsZSB2YXJpZXR5ICgiICsgY29kZSArICIpIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFN0cmluZyBmYWNldENvZGVTdHJpbmcoaW50IGNvZGUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9MRU5HVEg6IHJldHVybiAiRkFDRVRfTEVOR1RIIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fTEVOR1RIOiByZXR1cm4gIkZBQ0VUX01JTl9MRU5HVEgiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEg6IHJldHVybiAiRkFDRVRfTUFYX0xFTkdUSCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRTogcmV0dXJuICJGQUNFVF9NSU5fRVhDTFVTSVZFIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFOiByZXR1cm4gIkZBQ0VUX01JTl9JTkNMVVNJVkUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkU6IHJldHVybiAiRkFDRVRfTUFYX0lOQ0xVU0lWRSI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRTogcmV0dXJuICJGQUNFVF9NQVhfRVhDTFVTSVZFIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9UT1RBTF9ESUdJVFM6IHJldHVybiAiRkFDRVRfVE9UQUxfRElHSVRTIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9GUkFDVElPTl9ESUdJVFM6IHJldHVybiAiRkFDRVRfRlJBQ1RJT05fRElHSVRTIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIGZhY2V0IGNvZGUgKCIgKyBjb2RlICsgIikiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU3RyaW5nIHdoaXRlc3BhY2VDb2RlU3RyaW5nKGludCBjb2RlKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChjb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuV1NfQ09MTEFQU0U6IHJldHVybiAiV1NfQ09MTEFQU0UiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLldTX1BSRVNFUlZFOiByZXR1cm4gIldTX1BSRVNFUlZFIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5XU19SRVBMQUNFOiByZXR1cm4gIldTX1JFUExBQ0UiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLldTX1VOU1BFQ0lGSUVEOiByZXR1cm4gIldTX1VOU1BFQ0lGSUVEIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIHdoaXRlc3BhY2UgY29kZSAoIiArIGNvZGUgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTdHJpbmcgZGVyaXZhdGlvblR5cGVTdHJpbmcoaW50IGNvZGUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5EVF9OT1RfREVSSVZFRDogcmV0dXJuICJEVF9OT1RfREVSSVZFRCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT046IHJldHVybiAiRFRfUkVTVFJJQ1RJT04iOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkRUX0VYVEVOU0lPTjogcmV0dXJuICJEVF9FWFRFTlNJT04iOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gZGVyaXZhdGlvbiBjb2RlICgiICsgY29kZSArICIpIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZHVtcFR5cGVGaWxlRGF0YSgpCi0gICAgewotICAgICAgICBlbWl0KCJOYW1lOiAiICsgcW5hbWVTdHJpbmcocmVhZFFOYW1lKCkpKTsKLSAgICAgICAgZW1pdCgiT3V0ZXIgdHlwZTogIiArIHJlYWRUeXBlKCkpOwotICAgICAgICBlbWl0KCJEZXB0aDogIiArIHJlYWRTaG9ydCgpKTsKLSAgICAgICAgZW1pdCgiQmFzZSB0eXBlOiAiICsgcmVhZFR5cGUoKSk7Ci0gICAgICAgIGVtaXQoIkRlcml2YXRpb24gdHlwZTogIiArIGRlcml2YXRpb25UeXBlU3RyaW5nKHJlYWRTaG9ydCgpKSk7Ci0gICAgICAgIAotICAgICAgICBlbWl0KCJDb250YWluZXIgZmllbGQ6Iik7Ci0gICAgICAgIGluZGVudCgpOwotICAgICAgICBpbnQgY29udGFpbmVyZmllbGR0eXBlID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGVtaXQoIlJlZnR5cGU6ICIgKyBjb250YWluZXJmaWVsZFR5cGVTdHJpbmcoY29udGFpbmVyZmllbGR0eXBlKSk7Ci0gICAgICAgIHN3aXRjaCAoY29udGFpbmVyZmllbGR0eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIEZJRUxEX0dMT0JBTDoKLSAgICAgICAgICAgICAgICBlbWl0KCJIYW5kbGU6ICIgKyByZWFkSGFuZGxlKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGSUVMRF9MT0NBTEFUVFI6Ci0gICAgICAgICAgICAgICAgZW1pdCgiSW5kZXg6ICIgKyByZWFkU2hvcnQoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZJRUxEX0xPQ0FMRUxUOgotICAgICAgICAgICAgICAgIGVtaXQoIkluZGV4OiAiICsgcmVhZFNob3J0KCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG91dGRlbnQoKTsKLSAgICAgICAgZW1pdCgiSmF2YSBjbGFzcyBuYW1lOiAiICsgcmVhZFN0cmluZygpKTsKLSAgICAgICAgZW1pdCgiSmF2YSBpbXBsIGNsYXNzIG5hbWU6ICIgKyByZWFkU3RyaW5nKCkpOwotCi0gICAgICAgIGR1bXBUeXBlQXJyYXkoIkFub255bW91cyB0eXBlcyIpOwotCi0gICAgICAgIGVtaXQoIkFub255bW91cyB1bmlvbiBtZW1iZXIgb3JkaW5hbDogIiArIHJlYWRTaG9ydCgpKTsKLQotICAgICAgICBpbnQgZmxhZ3M7Ci0gICAgICAgIGZsYWdzID0gcmVhZEludCgpOwotICAgICAgICBlbWl0KCJGbGFnczogIiArIHR5cGVmbGFnc1N0cmluZyhmbGFncykpOwotICAgICAgICBib29sZWFuIGlzQ29tcGxleFR5cGUgPSAoKGZsYWdzICYgRkxBR19TSU1QTEVfVFlQRSkgPT0gMCk7Ci0KLSAgICAgICAgc2hvcnQgY29tcGxleFZhcmlldHkgPSBTY2hlbWFUeXBlLk5PVF9DT01QTEVYX1RZUEU7Ci0gICAgICAgIGlmIChpc0NvbXBsZXhUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb21wbGV4VmFyaWV0eSA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgZW1pdCgiQ29tcGxleCB2YXJpZXR5OiAiICsgY29tcGxleFZhcmlldHlTdHJpbmcoY29tcGxleFZhcmlldHkpKTsKLQotICAgICAgICAgICAgc2hvcnQgYXR0ckNvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBlbWl0KCJBdHRyaWJ1dGUgbW9kZWwgKCIgKyBhdHRyQ291bnQgKyAiKToiKTsKLSAgICAgICAgICAgIGluZGVudCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICBkdW1wQXR0cmlidXRlRGF0YShmYWxzZSk7Ci0KLSAgICAgICAgICAgIGVtaXQoIldpbGRjYXJkIHNldDogIiArIHFuYW1lU2V0U3RyaW5nKHJlYWRRTmFtZVNldCgpKSk7Ci0gICAgICAgICAgICBlbWl0KCJXaWxkY2FyZCBwcm9jZXNzOiAiICsgd2Nwcm9jZXNzU3RyaW5nKHJlYWRTaG9ydCgpKSk7Ci0gICAgICAgICAgICBvdXRkZW50KCk7Ci0KLSAgICAgICAgICAgIC8vIEF0dHJpYnV0ZSBQcm9wZXJ0eSBUYWJsZQotICAgICAgICAgICAgc2hvcnQgYXR0clByb3BDb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgZW1pdCgiQXR0cmlidXRlIHByb3BlcnRpZXMgKCIgKyBhdHRyUHJvcENvdW50ICsgIik6Iik7Ci0gICAgICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0clByb3BDb3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGR1bXBQcm9wZXJ0eURhdGEoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dGRlbnQoKTsKLQotICAgICAgICAgICAgaWYgKGNvbXBsZXhWYXJpZXR5ID09IFNjaGVtYVR5cGUuRUxFTUVOVF9DT05URU5UIHx8IGNvbXBsZXhWYXJpZXR5ID09IFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0KCJJc0FsbDogIiArIHJlYWRTaG9ydCgpKTsKLQotICAgICAgICAgICAgICAgIC8vIENvbnRlbnQgbW9kZWwgdHJlZQotICAgICAgICAgICAgICAgIGR1bXBQYXJ0aWNsZUFycmF5KCJDb250ZW50IG1vZGVsIik7Ci0KLSAgICAgICAgICAgICAgICAvLyBFbGVtZW50IFByb3BlcnR5IFRhYmxlCi0gICAgICAgICAgICAgICAgc2hvcnQgZWxlbVByb3BDb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgIGVtaXQoIkVsZW1lbnQgcHJvcGVydGllcyAoIiArIGVsZW1Qcm9wQ291bnQgKyAiKToiKTsKLSAgICAgICAgICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1Qcm9wQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGR1bXBQcm9wZXJ0eURhdGEoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0ZGVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc0NvbXBsZXhUeXBlIHx8IGNvbXBsZXhWYXJpZXR5ID09IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNob3J0IHNpbXBsZVZhcmlldHkgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGVtaXQoIlNpbXBsZSB0eXBlIHZhcmlldHk6ICIgKyBzaW1wbGVWYXJpZXR5U3RyaW5nKHNpbXBsZVZhcmlldHkpKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBpc1N0cmluZ0VudW0gPSAoKGZsYWdzICYgRkxBR19TVFJJTkdFTlVNKSAhPSAwKTsKLQotICAgICAgICAgICAgc2hvcnQgZmFjZXRDb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgZW1pdCgiRmFjZXRzICgiICsgZmFjZXRDb3VudCArICIpOiIpOwotICAgICAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZhY2V0Q291bnQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0KGZhY2V0Q29kZVN0cmluZyhyZWFkU2hvcnQoKSkpOwotICAgICAgICAgICAgICAgIGVtaXQoIlZhbHVlOiAiICsgcmVhZFhtbFZhbHVlT2JqZWN0KCkpOwotICAgICAgICAgICAgICAgIGVtaXQoIkZpeGVkOiAiICsgcmVhZFNob3J0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0ZGVudCgpOwotCi0gICAgICAgICAgICBlbWl0KCJXaGl0ZXNwYWNlIHJ1bGU6ICIgKyB3aGl0ZXNwYWNlQ29kZVN0cmluZyhyZWFkU2hvcnQoKSkpOwotCi0gICAgICAgICAgICBzaG9ydCBwYXR0ZXJuQ291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGVtaXQoIlBhdHRlcm5zICgiICsgcGF0dGVybkNvdW50ICsgIik6Iik7Ci0gICAgICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0dGVybkNvdW50OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdChyZWFkU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0ZGVudCgpOwotCi0gICAgICAgICAgICBzaG9ydCBlbnVtQ291bnQgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgIGVtaXQoIkVudW1lcmF0aW9uIHZhbHVlcyAoIiArIGVudW1Db3VudCArICIpOiIpOwotICAgICAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1Db3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXQocmVhZFhtbFZhbHVlT2JqZWN0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0ZGVudCgpOwotCi0gICAgICAgICAgICBlbWl0KCJCYXNlIGVudW0gdHlwZTogIiArIHJlYWRUeXBlKCkpOwotICAgICAgICAgICAgaWYgKGlzU3RyaW5nRW51bSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzaG9ydCBzZUNvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgZW1pdCgiU3RyaW5nIGVudW0gZW50cmllcyAoIiArIHNlQ291bnQgKyAiKToiKTsKLSAgICAgICAgICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIlwiIiArIHJlYWRTdHJpbmcoKSArICJcIiAtPiAiICsgcmVhZFNob3J0KCkgKyAiID0gIiArIHJlYWRTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dGRlbnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3dpdGNoIChzaW1wbGVWYXJpZXR5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5BVE9NSUM6Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIlByaW1pdGl2ZSB0eXBlOiAiICsgcmVhZFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIkRlY2ltYWwgc2l6ZTogIiArIHJlYWRJbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoIkxpc3QgaXRlbSB0eXBlOiAiICsgcmVhZFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OOgotICAgICAgICAgICAgICAgICAgICBkdW1wVHlwZUFycmF5KCJVbmlvbiBtZW1iZXJzIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IoIlVua25vd24gc2ltcGxlIHR5cGUgdmFyaWV0eSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZW1pdCgiRmlsZW5hbWU6ICIgKyByZWFkU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgYXR0cnVzZUNvZGVTdHJpbmcoaW50IGNvZGUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hTG9jYWxBdHRyaWJ1dGUuT1BUSU9OQUw6IHJldHVybiAiT1BUSU9OQUwiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5SRVFVSVJFRDogcmV0dXJuICJSRVFVSVJFRCI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYUxvY2FsQXR0cmlidXRlLlBST0hJQklURUQ6IHJldHVybiAiUFJPSElCSVRFRCI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biB1c2UgY29kZSAoIiArIGNvZGUgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGR1bXBBdHRyaWJ1dGVEYXRhKGJvb2xlYW4gZ2xvYmFsKQotICAgIHsKLSAgICAgICAgZW1pdCgiTmFtZTogIiArIHFuYW1lU3RyaW5nKHJlYWRRTmFtZSgpKSk7Ci0gICAgICAgIGVtaXQoIlR5cGU6ICIgKyByZWFkVHlwZSgpKTsKLSAgICAgICAgZW1pdCgiVXNlOiAiICsgYXR0cnVzZUNvZGVTdHJpbmcocmVhZFNob3J0KCkpKTsKLSAgICAgICAgZW1pdCgiRGVmYXVsdDogIiArIHJlYWRTdHJpbmcoKSk7Ci0gICAgICAgIGlmIChhdExlYXN0KDIsIDE2LCAwKSkKLSAgICAgICAgICAgIGVtaXQoIkRlZmF1bHQgdmFsdWU6ICIgKyByZWFkWG1sVmFsdWVPYmplY3QoKSk7Ci0gICAgICAgIGVtaXQoIkZpeGVkOiAiICsgcmVhZFNob3J0KCkpOwotICAgICAgICBlbWl0KCJXc2RsQXJyYXlUeXBlOiAiICsgU09BUEFycmF5VHlwZVN0cmluZyhyZWFkU09BUEFycmF5VHlwZSgpKSk7Ci0gICAgICAgIGlmIChnbG9iYWwpCi0gICAgICAgICAgICBlbWl0KCJGaWxlbmFtZTogIiArIHJlYWRTdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWG1sT3B0aW9ucyBwcmV0dHlPcHRpb25zID0KLSAgICAgICAgbmV3IFhtbE9wdGlvbnMoKS5zZXRTYXZlUHJldHR5UHJpbnQoKTsKLSAgICAKLSAgICB2b2lkIGR1bXBYbWwoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHhtbCA9IHJlYWRTdHJpbmcoKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXQoIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKS54bWxUZXh0KCBwcmV0dHlPcHRpb25zICkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFhtbEV4Y2VwdGlvbiB4ICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdCggIiEhISEhISBCQUQgWE1MICEhISEhIiApOwotICAgICAgICAgICAgZW1pdCggeG1sICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCBkdW1wTW9kZWxHcm91cERhdGEoKQotICAgIHsKLSAgICAgICAgZW1pdCgiTmFtZTogIiArIHFuYW1lU3RyaW5nKHJlYWRRTmFtZSgpKSk7Ci0gICAgICAgIGVtaXQoIlRhcmdldCBuYW1lc3BhY2U6ICIgKyByZWFkU3RyaW5nKCkpOwotICAgICAgICBlbWl0KCJDaGFtZWxlb246ICIgKyByZWFkU2hvcnQoKSk7Ci0gICAgICAgIGlmIChhdExlYXN0KDIsIDE1LCAwKSkKLSAgICAgICAgICAgIGVtaXQoIlJlZGVmaW5lOiAiICsgcmVhZFNob3J0KCkpOwotICAgICAgICBlbWl0KCJNb2RlbCBHcm91cCBYbWw6ICIpOwotICAgICAgICBkdW1wWG1sKCk7Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wQXR0cmlidXRlR3JvdXBEYXRhKCkKLSAgICB7Ci0gICAgICAgIGVtaXQoIk5hbWU6ICIgKyBxbmFtZVN0cmluZyhyZWFkUU5hbWUoKSkpOwotICAgICAgICBlbWl0KCJUYXJnZXQgbmFtZXNwYWNlOiAiICsgcmVhZFN0cmluZygpKTsKLSAgICAgICAgZW1pdCgiQ2hhbWVsZW9uOiAiICsgcmVhZFNob3J0KCkpOwotICAgICAgICBpZiAoYXRMZWFzdCgyLCAxNSwgMCkpCi0gICAgICAgICAgICBlbWl0KCJSZWRlZmluZTogIiArIHJlYWRTaG9ydCgpKTsKLSAgICAgICAgZW1pdCgiQXR0cmlidXRlIEdyb3VwIFhtbDogIik7Ci0gICAgICAgIGR1bXBYbWwoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGFsd2F5c1N0cmluZyhpbnQgY29kZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5DT05TSVNURU5UTFk6IHJldHVybiAiQ09OU0lTVEVOVExZIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuTkVWRVI6IHJldHVybiAiTkVWRVIiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRTogcmV0dXJuICJWQVJJQUJMRSI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBmcmVxdWVuY3kgY29kZSAoIiArIGNvZGUgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGp0Y1N0cmluZyhpbnQgY29kZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUOiByZXR1cm4gIlhNTF9PQkpFQ1QiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JPT0xFQU46IHJldHVybiAiSkFWQV9CT09MRUFOIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9GTE9BVDogcmV0dXJuICJKQVZBX0ZMT0FUIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9ET1VCTEU6IHJldHVybiAiSkFWQV9ET1VCTEUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEU6IHJldHVybiAiSkFWQV9CWVRFIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9TSE9SVDogcmV0dXJuICJKQVZBX1NIT1JUIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9JTlQ6IHJldHVybiAiSkFWQV9JTlQiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xPTkc6IHJldHVybiAiSkFWQV9MT05HIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19ERUNJTUFMOiByZXR1cm4gIkpBVkFfQklHX0RFQ0lNQUwiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19JTlRFR0VSOiByZXR1cm4gIkpBVkFfQklHX0lOVEVHRVIiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NUUklORzogcmV0dXJuICJKQVZBX1NUUklORyI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURV9BUlJBWTogcmV0dXJuICJKQVZBX0JZVEVfQVJSQVkiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEQVRFOiByZXR1cm4gIkpBVkFfR0RBVEUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEVVJBVElPTjogcmV0dXJuICJKQVZBX0dEVVJBVElPTiI7Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfREFURTogcmV0dXJuICJKQVZBX0RBVEUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1FOQU1FOiByZXR1cm4gIkpBVkFfUU5BTUUiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0NBTEVOREFSOiByZXR1cm4gIkpBVkFfQ0FMRU5EQVIiOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xJU1Q6IHJldHVybiAiSkFWQV9MSVNUIjsKLQotICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0VOVU06IHJldHVybiAiSkFWQV9FTlVNIjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9PQkpFQ1Q6IHJldHVybiAiSkFWQV9PQkpFQ1QiOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBqYXZhIHR5cGUgY29kZSAoIiArIGNvZGUgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGR1bXBQcm9wZXJ0eURhdGEoKQotICAgIHsKLSAgICAgICAgZW1pdCgiUHJvcGVydHkiKTsKLSAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgIGVtaXQoIk5hbWU6ICIgKyBxbmFtZVN0cmluZyhyZWFkUU5hbWUoKSkpOwotICAgICAgICBlbWl0KCJUeXBlOiAiICsgcmVhZFR5cGUoKSk7Ci0gICAgICAgIGVtaXQoIkZsYWdzOiAiICsgcHJvcGVydHlmbGFnc1N0cmluZyhyZWFkU2hvcnQoKSkpOwotICAgICAgICBlbWl0KCJDb250YWluZXIgdHlwZTogIiArIHJlYWRUeXBlKCkpOwotICAgICAgICBlbWl0KCJNaW4gb2NjdXJhbmNlczogIiArIGJpZ0ludGVnZXJTdHJpbmcocmVhZEJpZ0ludGVnZXIoKSkpOwotICAgICAgICBlbWl0KCJNYXggb2NjdXJhbmNlczogIiArIGJpZ0ludGVnZXJTdHJpbmcocmVhZEJpZ0ludGVnZXIoKSkpOwotICAgICAgICBlbWl0KCJOaWxsYWJsZTogIiArIGFsd2F5c1N0cmluZyhyZWFkU2hvcnQoKSkpOwotICAgICAgICBlbWl0KCJEZWZhdWx0OiAiICsgYWx3YXlzU3RyaW5nKHJlYWRTaG9ydCgpKSk7Ci0gICAgICAgIGVtaXQoIkZpeGVkOiAiICsgYWx3YXlzU3RyaW5nKHJlYWRTaG9ydCgpKSk7Ci0gICAgICAgIGVtaXQoIkRlZmF1bHQgdGV4dDogIiArIHJlYWRTdHJpbmcoKSk7Ci0gICAgICAgIGVtaXQoIkphdmEgcHJvcCBuYW1lOiAiICsgcmVhZFN0cmluZygpKTsKLSAgICAgICAgZW1pdCgiSmF2YSB0eXBlIGNvZGU6ICIgKyBqdGNTdHJpbmcocmVhZFNob3J0KCkpKTsKLSAgICAgICAgZW1pdCgiVHlwZSBmb3IgamF2YSBzaWduYXR1cmU6ICIgKyByZWFkVHlwZSgpKTsKLSAgICAgICAgZW1pdCgiSmF2YSBzZXR0ZXIgZGVsaW1pdGVyOiAiICsgcW5hbWVTZXRTdHJpbmcocmVhZFFOYW1lU2V0KCkpKTsKLSAgICAgICAgaWYgKGF0TGVhc3QoMiwgMTYsIDApKQotICAgICAgICAgICAgZW1pdCgiRGVmYXVsdCB2YWx1ZTogIiArIHJlYWRYbWxWYWx1ZU9iamVjdCgpKTsKLSAgICAgICAgb3V0ZGVudCgpOwotICAgIH0KLQotICAgIFN0cmluZyByZWFkWG1sVmFsdWVPYmplY3QoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSByZWFkVHlwZSgpOwotICAgICAgICBpZiAodHlwZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKLSAgICAgICAgCi0gICAgICAgIGludCBidGMgPSByZWFkU2hvcnQoKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlOwotICAgICAgICBzd2l0Y2ggKGJ0YykKLSAgICAgICAgewotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHZhbHVlID0gIm5pbCI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSToKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19USU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjoKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgotICAgICAgICAgICAgICAgIHZhbHVlID0gcmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgU3RyaW5nKEhleEJpbi5lbmNvZGUocmVhZEJ5dGVBcnJheSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA+IDE5KQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJTZXF1ZW5jZSgwLCAxNikgKyAiLi4uIjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOgotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjoKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IFFOYW1lSGVscGVyLnByZXR0eShyZWFkUU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRToKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IERvdWJsZS50b1N0cmluZyhyZWFkRG91YmxlKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZSArICIgKCIgKyB0eXBlICsgIjogIiArIGJ0YyArIikiOwotICAgIH0KLQotICAgIGRvdWJsZSByZWFkRG91YmxlKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2lucHV0LnJlYWREb3VibGUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyb3IoZSk7Ci0gICAgICAgICAgICByZXR1cm4gMC4wOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU3RyaW5nIFNPQVBBcnJheVR5cGVTdHJpbmcoU09BUEFycmF5VHlwZSB0KQotICAgIHsKLSAgICAgICAgaWYgKHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAibnVsbCI7Ci0gICAgICAgIHJldHVybiBRTmFtZUhlbHBlci5wcmV0dHkodC5nZXRRTmFtZSgpKSArIHQuc29hcDExRGltZW5zaW9uU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgU09BUEFycmF5VHlwZSByZWFkU09BUEFycmF5VHlwZSgpCi0gICAgewotICAgICAgICBRTmFtZSBxTmFtZSA9IHJlYWRRTmFtZSgpOwotICAgICAgICBTdHJpbmcgZGltZW5zaW9ucyA9IHJlYWRTdHJpbmcoKTsKLSAgICAgICAgaWYgKHFOYW1lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIG5ldyBTT0FQQXJyYXlUeXBlKHFOYW1lLCBkaW1lbnNpb25zKTsKLSAgICB9Ci0KLSAgICBRTmFtZVNldCByZWFkUU5hbWVTZXQoKQotICAgIHsKLSAgICAgICAgc2hvcnQgZmxhZyA9IHJlYWRTaG9ydCgpOwotCi0gICAgICAgIFNldCB1cmlTZXQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBzaG9ydCB1cmlDb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVyaUNvdW50OyBpKyspCi0gICAgICAgICAgICB1cmlTZXQuYWRkKHJlYWRTdHJpbmcoKSk7Ci0KLSAgICAgICAgU2V0IHFuYW1lU2V0MSA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIHNob3J0IHFuY291bnQxID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5jb3VudDE7IGkrKykKLSAgICAgICAgICAgIHFuYW1lU2V0MS5hZGQocmVhZFFOYW1lKCkpOwotCi0gICAgICAgIFNldCBxbmFtZVNldDIgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBzaG9ydCBxbmNvdW50MiA9IHJlYWRTaG9ydCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuY291bnQyOyBpKyspCi0gICAgICAgICAgICBxbmFtZVNldDIuYWRkKHJlYWRRTmFtZSgpKTsKLQotICAgICAgICBpZiAoZmxhZyA9PSAxKQotICAgICAgICAgICAgcmV0dXJuIFFOYW1lU2V0LmZvclNldHModXJpU2V0LCBudWxsLCBxbmFtZVNldDEsIHFuYW1lU2V0Mik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBRTmFtZVNldC5mb3JTZXRzKG51bGwsIHVyaVNldCwgcW5hbWVTZXQyLCBxbmFtZVNldDEpOwotICAgIH0KLQotICAgIGJ5dGVbXSByZWFkQnl0ZUFycmF5KCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzaG9ydCBsZW4gPSBfaW5wdXQucmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbbGVuXTsKLSAgICAgICAgICAgIF9pbnB1dC5yZWFkRnVsbHkocmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVycm9yKGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBCaWdJbnRlZ2VyIHJlYWRCaWdJbnRlZ2VyKCkKLSAgICB7Ci0gICAgICAgIGJ5dGVbXSByZXN1bHQgPSByZWFkQnl0ZUFycmF5KCk7Ci0gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09IDApCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMSAmJiByZXN1bHRbMF0gPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLlpFUk87Ci0gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09IDEgJiYgcmVzdWx0WzBdID09IDEpCi0gICAgICAgICAgICByZXR1cm4gQmlnSW50ZWdlci5PTkU7Ci0gICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcihyZXN1bHQpOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBieXRlW10gU0lOR0xFX1pFUk9fQllURSA9IG5ldyBieXRlW10geyAoYnl0ZSkwIH07Ci0KLSAgICBwcml2YXRlIGludCBfbWFqb3J2ZXI7Ci0gICAgcHJpdmF0ZSBpbnQgX21pbm9ydmVyOwotICAgIHByaXZhdGUgaW50IF9yZWxlYXNlbm87Ci0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGF0TGVhc3QoaW50IG1ham9ydmVyLCBpbnQgbWlub3J2ZXIsIGludCByZWxlYXNlbm8pCi0gICAgewotICAgICAgICBpZiAoX21ham9ydmVyID4gbWFqb3J2ZXIpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKF9tYWpvcnZlciA8IG1ham9ydmVyKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoX21pbm9ydmVyID4gbWlub3J2ZXIpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKF9taW5vcnZlciA8IG1pbm9ydmVyKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gKF9yZWxlYXNlbm8gPj0gcmVsZWFzZW5vKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhdE1vc3QoaW50IG1ham9ydmVyLCBpbnQgbWlub3J2ZXIsIGludCByZWxlYXNlbm8pCi0gICAgewotICAgICAgICBpZiAoX21ham9ydmVyID4gbWFqb3J2ZXIpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChfbWFqb3J2ZXIgPCBtYWpvcnZlcikKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoX21pbm9ydmVyID4gbWlub3J2ZXIpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChfbWlub3J2ZXIgPCBtaW5vcnZlcikKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gKF9yZWxlYXNlbm8gPD0gcmVsZWFzZW5vKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb25maWcvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbmZpZy9TY2hlbWFDb25maWcuamF2YSBiL3YxL3NyYy94bWxjb25maWcvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbmZpZy9TY2hlbWFDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA3ZGQ1MS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sY29uZmlnL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb25maWcvU2NoZW1hQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29uZmlnOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGNvbS5iZWEueDIwMDIueDA5LnhiZWFuLmNvbmZpZy5Db25maWdEb2N1bWVudC5Db25maWc7Ci1pbXBvcnQgY29tLmJlYS54MjAwMi54MDkueGJlYW4uY29uZmlnLk5zY29uZmlnOwotaW1wb3J0IGNvbS5iZWEueDIwMDIueDA5LnhiZWFuLmNvbmZpZy5RbmFtZWNvbmZpZzsKLQotcHVibGljIGNsYXNzIFNjaGVtYUNvbmZpZwotewotICAgIHByaXZhdGUgTWFwIF9wYWNrYWdlTWFwOwotICAgIHByaXZhdGUgTWFwIF9wcmVmaXhNYXA7Ci0gICAgcHJpdmF0ZSBNYXAgX3N1ZmZpeE1hcDsKLSAgICBwcml2YXRlIE1hcCBfcW5hbWVNYXA7Ci0KLSAgICBwcml2YXRlIFNjaGVtYUNvbmZpZygpCi0gICAgewotICAgICAgICBfcGFja2FnZU1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICAgICAgX3ByZWZpeE1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICAgICAgX3N1ZmZpeE1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICAgICAgX3FuYW1lTWFwID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNjaGVtYUNvbmZpZyBmb3JDb25maWdEb2N1bWVudHMoQ29uZmlnW10gY29uZmlncykKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU2NoZW1hQ29uZmlnKGNvbmZpZ3MpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFNjaGVtYUNvbmZpZyhDb25maWdbXSBjb25maWdzKQotICAgIHsKLSAgICAgICAgX3BhY2thZ2VNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBfcHJlZml4TWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgX3N1ZmZpeE1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIF9xbmFtZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgQ29uZmlnIGNvbmZpZyA9IGNvbmZpZ3NbaV07Ci0gICAgICAgICAgICBOc2NvbmZpZ1tdIG5zYSA9IGNvbmZpZy5nZXROYW1lc3BhY2VBcnJheSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuc2EubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVjb3JkTmFtZXNwYWNlU2V0dGluZyhuc2Fbal0uZ2V0VXJpKCksIG5zYVtqXS5nZXRQYWNrYWdlKCksIF9wYWNrYWdlTWFwKTsKLSAgICAgICAgICAgICAgICByZWNvcmROYW1lc3BhY2VTZXR0aW5nKG5zYVtqXS5nZXRVcmkoKSwgbnNhW2pdLmdldFByZWZpeCgpLCBfcHJlZml4TWFwKTsKLSAgICAgICAgICAgICAgICByZWNvcmROYW1lc3BhY2VTZXR0aW5nKG5zYVtqXS5nZXRVcmkoKSwgbnNhW2pdLmdldFN1ZmZpeCgpLCBfc3VmZml4TWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgUW5hbWVjb25maWdbXSBxbmMgPSBjb25maWcuZ2V0UW5hbWVBcnJheSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBxbmMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3FuYW1lTWFwLnB1dChxbmNbal0uZ2V0TmFtZSgpLCBxbmNbal0uZ2V0SmF2YW5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlY29yZE5hbWVzcGFjZVNldHRpbmcoT2JqZWN0IGtleSwgU3RyaW5nIHZhbHVlLCBNYXAgcmVzdWx0KQotICAgIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGVsc2UgaWYgKGtleSA9PSBudWxsKQotICAgICAgICAgICAgcmVzdWx0LnB1dCgiIiwgdmFsdWUpOwotICAgICAgICBlbHNlIGlmIChrZXkgaW5zdGFuY2VvZiBTdHJpbmcgJiYgIiMjYW55Ii5lcXVhbHMoa2V5KSkKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIGVsc2UgaWYgKGtleSBpbnN0YW5jZW9mIExpc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9ICgoTGlzdClrZXkpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCIjI2xvY2FsIi5lcXVhbHModXJpKSkKLSAgICAgICAgICAgICAgICAgICAgdXJpID0gIiI7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnB1dCh1cmksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBsb29rdXAoTWFwIG1hcCwgU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgICAgIHVyaSA9ICIiOwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZyltYXAuZ2V0KHVyaSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKW1hcC5nZXQoIiMjYW55Iik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBsb29rdXBQYWNrYWdlRm9yTmFtZXNwYWNlKFN0cmluZyB1cmkpCi0gICAgewotICAgICAgICByZXR1cm4gbG9va3VwKF9wYWNrYWdlTWFwLCB1cmkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgbG9va3VwUHJlZml4Rm9yTmFtZXNwYWNlKFN0cmluZyB1cmkpCi0gICAgewotICAgICAgICByZXR1cm4gbG9va3VwKF9wcmVmaXhNYXAsIHVyaSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBsb29rdXBTdWZmaXhGb3JOYW1lc3BhY2UoU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsb29rdXAoX3N1ZmZpeE1hcCwgdXJpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGxvb2t1cEphdmFuYW1lRm9yUU5hbWUoUU5hbWUgcW5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZylfcW5hbWVNYXAuZ2V0KHFuYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMvdXRpbHMvTmVzdGVkVGhyb3dhYmxlLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMvdXRpbHMvTmVzdGVkVGhyb3dhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZWVmNjEuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3V0aWxzL05lc3RlZFRocm93YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZQotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMudXRpbHM7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBOZXN0ZWRFeGNlcHRpb24sIE5lc3RlZEVycm9yLCBhbmQKLSAqIE5lc3RlZFJ1bnRpbWVFeGNlcHRpb24gbGFyZ2VseSBzbyBVdGlsIGNhbiBwcm92aWRlIGEgc3RhbmRhcmQKLSAqIGltcGxlbWVudGF0aW9uIG9mIHRvU3RyaW5nKCkgYW5kIHByaW50U3RhY2tUcmFjZSgpCi0gKgotICogQGRlcHJlY2F0ZWQgdXNlIEpESyAxLjQgc3R5bGUgbmVzdGVkIHRocm93YWJsZXMgd2hlcmUgcG9zc2libGUuCi0gKgotICogQGF1dGhvciBXZWJMb2dpYwotICovCi0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBOZXN0ZWRUaHJvd2FibGUgewotCi0gIC8qKiBHZXQgdGhlIG5lc3RlZCBUaHJvd2FibGUuICovCi0gIFRocm93YWJsZSBnZXROZXN0ZWQoKTsKLQotICAvKiogQ2FsbCBzdXBlci50b1N0cmluZygpLiBbS2x1ZGdlIGJ1dCBuZWNlc3NhcnkuXSAqLwotICBTdHJpbmcgc3VwZXJUb1N0cmluZygpOwotCi0gIC8qKiBDYWxsIHN1cGVyLnByaW50U3RhY2tUcmFjZSgpLiBbS2x1ZGdlIGJ1dCBuZWNlc3NhcnkuXSAqLwotICB2b2lkIHN1cGVyUHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIHBzKTsKLQotICAvKiogQ2FsbCBzdXBlci5wcmludFN0YWNrVHJhY2UoKS4gW0tsdWRnZSBidXQgbmVjZXNzYXJ5Ll0gKi8KLSAgdm9pZCBzdXBlclByaW50U3RhY2tUcmFjZShQcmludFdyaXRlciBwbyk7Ci0KLSAgc3RhdGljIGNsYXNzIFV0aWwgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEVPTCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgYW5kIGl0cyBuZXN0ZWQgZXhjZXB0aW9uIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKE5lc3RlZFRocm93YWJsZSBudCkgewotICAgICAgVGhyb3dhYmxlIG5lc3RlZCA9IG50LmdldE5lc3RlZCgpOwotICAgICAgaWYgKG5lc3RlZCA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybiBudC5zdXBlclRvU3RyaW5nKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbnQuc3VwZXJUb1N0cmluZygpICsgIiAtIHdpdGggbmVzdGVkIGV4Y2VwdGlvbjoiICsKLSAgICAgICAgICBFT0wgKyAiWyIgKyBuZXN0ZWRUb1N0cmluZyhuZXN0ZWQpICsgIl0iOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBuZXN0ZWRUb1N0cmluZyhUaHJvd2FibGUgbmVzdGVkKSB7Ci0gICAgICBpZiAobmVzdGVkIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotICAgICAgICBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSA9IChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBuZXN0ZWQ7Ci0gICAgICAgIHJldHVybiBuZXN0ZWQudG9TdHJpbmcoKSArICIgLSB3aXRoIHRhcmdldCBleGNlcHRpb246IiArCi0gICAgICAgICAgRU9MICsgIlsiICsgaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpLnRvU3RyaW5nKCkgKwotICAgICAgICAgICJdIjsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuZXN0ZWQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIHN0YWNrIHRyYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV4Y2VwdGlvbiBhbmQKLSAgICAgKiBpdHMgbmVzdGVkIGV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzICAgICAgICAgICAgICAgICBQcmludFN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFN0YWNrVHJhY2UoTmVzdGVkVGhyb3dhYmxlIG50LCBQcmludFN0cmVhbSBzKSB7Ci0gICAgICBUaHJvd2FibGUgbmVzdGVkID0gbnQuZ2V0TmVzdGVkKCk7Ci0gICAgICBpZiAobmVzdGVkICE9IG51bGwpIHsKLSAgICAgICAgbmVzdGVkLnByaW50U3RhY2tUcmFjZShzKTsKLSAgICAgICAgcy5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0gbmVzdGVkIHdpdGhpbjogLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICB9Ci0gICAgICBudC5zdXBlclByaW50U3RhY2tUcmFjZShzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIHN0YWNrIHRyYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV4Y2VwdGlvbiBhbmQKLSAgICAgKiBpdHMgbmVzdGVkIGV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3ICAgICAgICAgICAgICAgICBQcmludFdyaXRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFN0YWNrVHJhY2UoTmVzdGVkVGhyb3dhYmxlIG50LCBQcmludFdyaXRlciB3KSB7Ci0gICAgICBUaHJvd2FibGUgbmVzdGVkID0gbnQuZ2V0TmVzdGVkKCk7Ci0gICAgICBpZiAobmVzdGVkICE9IG51bGwpIHsKLSAgICAgICAgbmVzdGVkLnByaW50U3RhY2tUcmFjZSh3KTsKLSAgICAgICAgdy5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0gbmVzdGVkIHdpdGhpbjogLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICB9Ci0gICAgICBudC5zdXBlclByaW50U3RhY2tUcmFjZSh3KTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vQXR0cmlidXRlLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9BdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg3NzQxNS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9BdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhbiBhdHRyaWJ1dGUKLSAqCi0gKiBAc2luY2UgV2VibG9naWMgWE1MIElucHV0IFN0cmVhbSAxLjAKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTE5hbWUKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5BdHRyaWJ1dGUKLSAqLwotcHVibGljIGludGVyZmFjZSBBdHRyaWJ1dGUgewotICAvKioKLSAgICogR2V0IHRoZSBYTUxOYW1lIG9mIHRoZSBjdXJyZW50IGF0dHJpYnV0ZS4KLSAgICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTE5hbWUKLSAgICovCi0gIHB1YmxpYyBYTUxOYW1lIGdldE5hbWUoKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgYXR0cmlidXRlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGF0dHJpYnV0ZSB0eXBlIG9mIHRoZSBjdXJyZW50IGF0dHJpYnV0ZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgYXR0cmlidXRlIHR5cGUgb2YgdGhlIGN1cnJlbnQgYXR0cmlidXRlCi0gICAqLwotICBwdWJsaWMgWE1MTmFtZSBnZXRTY2hlbWFUeXBlKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9BdHRyaWJ1dGVJdGVyYXRvci5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vQXR0cmlidXRlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBhMzVhMS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9BdHRyaWJ1dGVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSB3ZWJsb2dpYy54bWwuc3RyZWFtOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHNwZWNpZmllcyBtZXRob2RzIGZvciBpdGVyYXRpbmcgb3ZlciBhdHRyaWJ1dGVzLgotICogQHNpbmNlIFdlYmxvZ2ljIFhNTCBJbnB1dCBTdHJlYW0gMS4wCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5BdHRyaWJ1dGUKLSovCi0KLXB1YmxpYyBpbnRlcmZhY2UgQXR0cmlidXRlSXRlcmF0b3IgewotICAvKioKLSAgICogR2V0IHRoZSBuZXh0IEF0dHJpYnV0ZSBvbiB0aGUgc3RyZWFtCi0gICAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5BdHRyaWJ1dGUKLSAgICovCi0gIHB1YmxpYyBBdHRyaWJ1dGUgbmV4dCgpOwotCi0gIC8qKgotICAgKiBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGF0dHJpYnV0ZXMgb24gdGhlIHN0cmVhbQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG5leHQgZWxlbWVudCBvbiB0aGUgc3RyZWFtIHdpdGhvdXQgc2hpZnRpbmcgaXQKLSAgICovCi0gIHB1YmxpYyBBdHRyaWJ1dGUgcGVlaygpOwotCi0KLSAgLyoqCi0gICAqIFNraXAgdGhlIG5leHQgZWxlbWVudCBvbiB0aGUgc3RyZWFtCi0gICAqLwotICBwdWJsaWMgdm9pZCBza2lwKCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0J1ZmZlcmVkWE1MSW5wdXRTdHJlYW0uamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0J1ZmZlcmVkWE1MSW5wdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczMmEzZC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9CdWZmZXJlZFhNTElucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIHdlYmxvZ2ljLnhtbC5zdHJlYW07Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotLyoqCi0gKiBFeHRlbmRzIHRoZSBYTUxJbnB1dFN0cmVhbSB0byBhbGxvdyBtYXJraW5nIGFuZCByZXNldGluZyBvZiB0aGUgc3RyZWFtLgotICoKLSAqIEBzaW5jZSBYTUxJbnB1dFN0cmVhbSAxLjAKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLkNoYXJhY3RlckRhdGEKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5TdGFydEVsZW1lbnQKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5FbmRFbGVtZW50Ci0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uQ2hhcmFjdGVyRGF0YQotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTE5hbWUKLSAqLwotcHVibGljIGludGVyZmFjZSBCdWZmZXJlZFhNTElucHV0U3RyZWFtIGV4dGVuZHMgWE1MSW5wdXRTdHJlYW0gewotICAvKioKLSAgICogU2V0cyB0aGUgbWFya3MgYSBwb2ludCB0byByZXR1cm4gdG8gaW4gdGhlIHN0cmVhbSwKLSAgICogdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc3RyZWFtIGRvZXMgbm90IHN1cHBvcnQgbWFyay4KLSAgICogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBCdWZmZXJlZFN0cmVhbXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIG1hcmsoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAvKioKLSAgICogUmVzZXRzIHRoZSBzdHJlYW0gdG8gdGhlIHByZXZpb3VzIG1hcmsuCi0gICAqIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IG1hcms7Ci0gICAqLwotICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vQ2hhbmdlUHJlZml4TWFwcGluZy5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vQ2hhbmdlUHJlZml4TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzY1NDkzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0NoYW5nZVByZWZpeE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IHNpZ25hbHMgdGhhdCBhIHByZWZpeCBtYXBwaW5nIGhhcyBjaGFuZ2VkIGZyb20KLSAqIE9sZE5hbWVzcGFjZU5hbWUgdG8gdGhlIE5ld05hbWVzcGFjZU5hbWUKLSAqCi0gKiBAc2luY2UgV2VibG9naWMgWE1MIElucHV0IFN0cmVhbSAxLjAKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlN0YXJ0UHJlZml4TWFwcGluZwotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLkVuZFByZWZpeE1hcHBpbmcKLSAqLwotcHVibGljIGludGVyZmFjZSBDaGFuZ2VQcmVmaXhNYXBwaW5nIGV4dGVuZHMgWE1MRXZlbnQgewotICAvKgotICAgKiByZXR1cm5zIHRoZSB1cmkgdGhhdCB0aGUgcHJlZml4IHdhcyBib3VuZCB0bwotICAgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZSBvZiB0aGUgdXJpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE9sZE5hbWVzcGFjZVVyaSgpOwotICAvKgotICAgKiByZXR1cm5zIHRoZSBuZXcgdXJpIHRoYXQgdGhlIHByZWZpeCBpcyBib3VuZCB0bwotICAgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZSBvZiB0aGUgdXJpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5ld05hbWVzcGFjZVVyaSgpOwotICAvKgotICAgKiByZXR1cm5zIHRoZSBwcmVmaXggdGhhdCBpcyBib3VuZAotICAgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZSBvZiB0aGUgcHJlZml4Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vQ2hhcmFjdGVyRGF0YS5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vQ2hhcmFjdGVyRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmNiZDhiLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0NoYXJhY3RlckRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBBIG1hcmtlciBpbnRlcmZhY2UgZm9yIGNoYXJhY3RlciBkYXRhCi0gKgotICogQHNpbmNlIFdlYmxvZ2ljIFhNTCBJbnB1dCBTdHJlYW0gMS4wCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5YTUxFdmVudAotKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2hhcmFjdGVyRGF0YSBleHRlbmRzIFhNTEV2ZW50IHsKLSAgLyoqCi0gICAqIEdldCB0aGUgY29udGVudCBvZiB0aGlzIGVsZW1lbnQsCi0gICAqIHJldHVybnMgbnVsbCBpZiB0aGUgZWxlbWVudCBoYXMgbm8gY29udGVudAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb250ZW50KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgaGFzIGNvbnRlbnQgYW5kIGZhbHNlIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzQ29udGVudCgpOwotCi19CmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9Db21tZW50LmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9Db21tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1M2M2ZTAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vQ29tbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSB3ZWJsb2dpYy54bWwuc3RyZWFtOwotCi0vKioKLSAqIEEgbWFya2VyIGludGVyZmFjZSBmb3IgY29tbWVudCBkYXRhCi0gKgotICogQHNpbmNlIFdlYmxvZ2ljIFhNTCBJbnB1dCBTdHJlYW0gMS4wCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5YTUxFdmVudAotKi8KLQotcHVibGljIGludGVyZmFjZSBDb21tZW50IGV4dGVuZHMgQ2hhcmFjdGVyRGF0YSB7Ci0gIC8qKgotICAgKiBObyBtZXRob2RzIGFyZSBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlLgotICAgKi8KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0VsZW1lbnRGaWx0ZXIuamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0VsZW1lbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljZWE1Ny4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9FbGVtZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIHdlYmxvZ2ljLnhtbC5zdHJlYW07Ci0KLS8qKgotICoKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBmaWx0ZXIgb24gZWxlbWVudHMKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnRGaWx0ZXIgewotICAvKioKLSAgICogdGVzdHMgd2hldGhlciB0aGlzIGV2ZW50IGlzIHBhcnQgb2YgdGhpcyBzdHJlYW0gCi0gICAqLwotICBib29sZWFuIGFjY2VwdChYTUxFdmVudCBlbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0VuZERvY3VtZW50LmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9FbmREb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2RiN2QwLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0VuZERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIHdlYmxvZ2ljLnhtbC5zdHJlYW07Ci0KLS8qKgotICogQSBtYXJrZXIgaW50ZXJmYWNlIGZvciB0aGUgZW5kIG9mIGEgZG9jdW1lbnQKLSAqCi0gKiBAc2luY2UgV2VibG9naWMgWE1MIElucHV0IFN0cmVhbSAxLjAKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTEV2ZW50Ci0qLwotcHVibGljIGludGVyZmFjZSBFbmREb2N1bWVudCBleHRlbmRzIFhNTEV2ZW50IHsKLSAgLyoqCi0gICAqIE5vIG1ldGhvZHMgYXJlIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UuCi0gICAqLwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vRW5kRWxlbWVudC5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vRW5kRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWZlNDk4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0VuZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBBIG1hcmtlciBpbnRlcmZhY2UgZm9yIHRoZSBlbmQgZWxlbWVudCBldmVudC4KLSAqIFRoZSBuYW1lIGlzIGF2YWlsYWJsZSBpbiB0aGUgZ2V0TmFtZSBtZXRob2Qgb2YKLSAqIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MRXZlbnQgaW50ZXJmYWNlLgotICoKLSAqIEBzaW5jZSBXZWJsb2dpYyBYTUwgSW5wdXQgU3RyZWFtIDEuMAotICogQHZlcnNpb24gMS4wCi0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MRXZlbnQKLSovCi1wdWJsaWMgaW50ZXJmYWNlIEVuZEVsZW1lbnQgZXh0ZW5kcyBYTUxFdmVudCB7Ci0gIC8qKgotICAgKiBObyBtZXRob2RzIGFyZSBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlLiAgCi0gICAqLwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vRW5kUHJlZml4TWFwcGluZy5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vRW5kUHJlZml4TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjUzZDRmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL0VuZFByZWZpeE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IHNpZ25hbHMgdGhhdCBhIHByZWZpeCBtYXBwaW5nIGhhcyBnb25lIG91dCBvZiBzY29wZQotICoKLSAqIEBzaW5jZSBXZWJsb2dpYyBYTUwgSW5wdXQgU3RyZWFtIDEuMAotICogQHZlcnNpb24gMS4wCi0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uU3RhcnRQcmVmaXhNYXBwaW5nCi0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uQ2hhbmdlUHJlZml4TWFwcGluZwotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgRW5kUHJlZml4TWFwcGluZyBleHRlbmRzIFhNTEV2ZW50IHsKLSAgLyogCi0gICAqIFJldHVybnMgdGhlIHByZWZpeCB0aGF0IGhhcyBnb25lIG91dCBvZiBzY29wZQotICAgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZSBvZiB0aGUgcHJlZml4Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vRW50aXR5UmVmZXJlbmNlLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9FbnRpdHlSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJmMjExZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9FbnRpdHlSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIGhhbmRsaW5nIEVudGl0eSBEZWNsYXJhdGlvbnMKLSAqCi0gKiBAc2luY2UgV2VibG9naWMgWE1MIElucHV0IFN0cmVhbSAxLjAKLSAqIEB2ZXJzaW9uIDEuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgRW50aXR5UmVmZXJlbmNlIGV4dGVuZHMgWE1MRXZlbnQgewotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZW50aXR5IHdhcyBza2lwcGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBza2lwcGVkKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9Mb2NhdGlvbi5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vTG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU1MTgxNC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9Mb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSB3ZWJsb2dpYy54bWwuc3RyZWFtOwotCi0vKioKLSAqIFJldHVybnMgdGhlIGRvY3VtZW50IGxvY2F0aW9uIG9mIHRoZSBldmVudC4gIFRoaXMgaXMgbm90Ci0gKiByZXF1aXJlZCB0byBiZSBleGFjdCBhbmQgaXMgaW5mb3JtYXRpb25hbCBvbmx5LgotICogCi0gKiBAc2luY2UgV2VibG9naWMgWE1MIElucHV0IFN0cmVhbSAxLjAKLSAqIEB2ZXJzaW9uIDEuMAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBMb2NhdGlvbiB7Ci0gIC8qCi0gICAqIHJldHVybnMgdGhlIGN1cnJlbnQgY29sdW1uIG51bWJlcgotICAgKgotICAgKiBAcmV0dXJuIGludGVnZXIgdmFsdWUgb2YgdGhlIGN1cnJlbnQgY29sdW1uIG51bWJlcgotICAgKi8KLSAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKTsgCi0gIC8qCi0gICAqIHJldHVybnMgdGhlIGN1cnJlbnQgbGluZQotICAgKgotICAgKiBAcmV0dXJuIGludGVnZXIgdmFsdWUgb2YgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpOwotICAvKgotICAgKiByZXR1cm5zIHRoZSBTdHJpbmcgdmFsdWUgb2YgdGhlIHB1YmxpYyBJRAotICAgKgotICAgKiBAcmV0dXJuIHB1YmxpYyBJRCBvciBudWxsIGlmIG5vdCBzZXQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKTsgCi0gIC8qCi0gICAqIHJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgc3lzdGVtIElECi0gICAqCi0gICAqIEByZXR1cm4gc3lzdGVtIElEIG9yIG51bGwgaWYgbm90IHNldAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpOwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vUHJvY2Vzc2luZ0luc3RydWN0aW9uLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI3ZDQ2Mi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBBIG1hcmtlciBpbnRlcmZhY2UgZm9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zCi0gKgotICogQHNpbmNlIFdlYmxvZ2ljIFhNTCBJbnB1dCBTdHJlYW0gMS4wCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5YTUxFdmVudAotKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc2luZ0luc3RydWN0aW9uIGV4dGVuZHMgWE1MRXZlbnQgewotICAvKgotICAgKiB0aGUgdGFyZ2V0IHNlY3Rpb24gb2YgdGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KLSAgICoKLSAgICogQHJldHVybiB0aGUgU3RyaW5nIHZhbHVlIG9mIHRoZSBQSSBvciBudWxsCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldCgpOwotICAvKgotICAgKiB0aGUgZGF0YSBzZWN0aW9uIG9mIHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgUEkncyBkYXRhIG9yIG51bGwKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vUmVmZXJlbmNlUmVzb2x2ZXIuamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL1JlZmVyZW5jZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZjY3ZTIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vUmVmZXJlbmNlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgY2FuIGJlIGltcGxlbWVudGVkIHRvIGFsbG93IHJlc29sdXRpb24gb2YgcmVmZXJlbmNlcwotICogb24gYSBzdHJlYW0uICAKLSAqLwotcHVibGljIGludGVyZmFjZSBSZWZlcmVuY2VSZXNvbHZlciB7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB4bWwgcG9pbnRlZCB0byBieSB0aGlzIGlkcmVmIGFzIGFuIFhNTElucHV0U3RyZWFtCi0gICAqIEBwYXJhbSBpZHJlZgotICAgKi8KLSAgWE1MSW5wdXRTdHJlYW0gcmVzb2x2ZShTdHJpbmcgaWRyZWYpCi0gICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaWQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIGlkcmVmCi0gICAqIEBwYXJhbSBpZHJlZgotICAgKi8KLSAgU3RyaW5nIGdldElkKFN0cmluZyBpZHJlZik7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9TcGFjZS5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vU3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRiNWMxNC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9TcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSB3ZWJsb2dpYy54bWwuc3RyZWFtOwotCi0vKioKLSAqIFRoaXMgZWxlbWVudCByZXR1cm5zIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBhbGxvdyBzZXBhcmF0ZQotICogaGFuZGxpbmcgYnkgdGhlIGFwcGxpY2F0aW9uCi0gKgotICogQHNpbmNlIFdlYmxvZ2ljIFhNTCBJbnB1dCBTdHJlYW0gMS4wCi0gKiBAdmVyc2lvbiAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBTcGFjZSBleHRlbmRzIENoYXJhY3RlckRhdGEgewotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgaWdub3JhYmxlIHdoaXRlc3BhY2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlnbm9yYWJsZSgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vU3RhcnREb2N1bWVudC5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vU3RhcnREb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDdkMTYzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL1N0YXJ0RG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIHRoZSBzdGFydCBkb2N1bWVudCBldmVudAotICoKLSAqIEBzaW5jZSBXZWJsb2dpYyBYTUwgSW5wdXQgU3RyZWFtIDEuMAotICogQHZlcnNpb24gMS4wCi0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MRXZlbnQKLSovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXJ0RG9jdW1lbnQgZXh0ZW5kcyBYTUxFdmVudCB7Ci0gIC8qIAotICAgKiBSZXR1cm5zIHRoZSBzeXN0ZW0gaWQgb2YgdGhlIHN0cmVhbQotICAgKiBAcmV0dXJuIHRoZSBzeXN0ZW0gaWQsIGRlZmF1bHRzIHRvICIiCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCk7Ci0gIC8qIAotICAgKiBSZXR1cm5zIHRoZSBlbmNvZGluZyBzdHlsZSBvZiB0aGlzIFhNTCBzdHJlYW0KLSAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nLCBkZWZhdWx0cyB0byAiVVRGLTgiCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCk7Ci0gIC8qIAotICAgKiBSZXR1cm5zIGlmIHRoaXMgWE1MIGlzIHN0YW5kYWxvbmUKLSAgICogQHJldHVybiB0aGUgdmVyc2lvbiBvZiBYTUwsIGRlZmF1bHRzIHRvICJ5ZXMiCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1N0YW5kYWxvbmUoKTsKLSAgLyogCi0gICAqIFJldHVybnMgdGhlIHZlcnNpb24gb2YgWE1MIG9mIHRoaXMgWE1MIHN0cmVhbQotICAgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIG9mIFhNTCwgZGVmYXVsdHMgdG8gIjEuMCIKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vU3RhcnRFbGVtZW50LmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9TdGFydEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwNzYxMy4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9TdGFydEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0vKioKLSAqIFRoZSBTdGFydEVsZW1lbnQgaW50ZXJmYWNlIHByb3ZpZGVzIGFjY2VzcyB0byBpbmZvcm1hdGlvbiBhYm91dAotICogc3RhcnQgZWxlbWVudHMKLSAqCi0gKiBAc2luY2UgV2VibG9naWMgWE1MIElucHV0IFN0cmVhbSAxLjAKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLkF0dHJpYnV0ZUl0ZXJhdG9yCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBTdGFydEVsZW1lbnQgZXh0ZW5kcyBYTUxFdmVudCB7Ci0gIC8qKgotICAgKiBSZXR1cm5zIGFuIEF0dHJpYnV0ZUl0ZXJhdG9yIG9mIG5vbi1uYW1lc3BhY2UgZGVjbGFyZWQgYXR0cmlidXRlcwotICAgKi8KLSAgcHVibGljIEF0dHJpYnV0ZUl0ZXJhdG9yIGdldEF0dHJpYnV0ZXMoKTsKLSAgLyoqCi0gICAqIFJldHVybnMgYW4gQXR0cmlidXRlSXRlcmF0b3Igb2YgbmFtZXNwYWNlcyBkZWNsYXJlZCBpbiB0aGlzIGVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBBdHRyaWJ1dGVJdGVyYXRvciBnZXROYW1lc3BhY2VzKCk7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB1bmlvbiBvZiBkZWNsYXJlZCBhdHRyaWJ1dGVzIGFuZCBuYW1lc3BhY2VzCi0gICAqLwotICBwdWJsaWMgQXR0cmlidXRlSXRlcmF0b3IgZ2V0QXR0cmlidXRlc0FuZE5hbWVzcGFjZXMoKTsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSByZWZlcnJlZCB0byBieSB0aGlzIG5hbWUKLSAgICovCi0gIHB1YmxpYyBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlQnlOYW1lKFhNTE5hbWUgbmFtZSk7Ci0gIC8qKgotICAgKiBHZXRzIHRoZSB2YWx1ZSB0aGF0IHRoZSBwcmVmaXggaXMgYm91bmQgdG8gaW4gdGhlCi0gICAqIGNvbnRleHQgb2YgdGhpcyBlbGVtZW50LiAgUmV0dXJucyBudWxsIGlmIAotICAgKiB0aGUgcHJlZml4IGlzIG5vdCBib3VuZCBpbiB0aGlzIGNvbnRleHQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVXJpKFN0cmluZyBwcmVmaXgpOwotICAvKioKLSAgICogR2V0cyBhIGphdmEudXRpbC5NYXAgZnJvbSBwcmVmaXhlcyB0byBVUklzIGluIHNjb3BlIGZvciB0aGlzCi0gICAqIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgTWFwIGdldE5hbWVzcGFjZU1hcCgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vU3RhcnRQcmVmaXhNYXBwaW5nLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9TdGFydFByZWZpeE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E5MTliZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9TdGFydFByZWZpeE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IHNpZ25hbHMgdGhhdCBhIHByZWZpeCBtYXBwaW5nIGhhcyBiZWd1biBzY29wZQotICoKLSAqIEBzaW5jZSBXZWJsb2dpYyBYTUwgSW5wdXQgU3RyZWFtIDEuMAotICogQHZlcnNpb24gMS4wCi0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uRW5kUHJlZml4TWFwcGluZwotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLkNoYW5nZVByZWZpeE1hcHBpbmcKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXJ0UHJlZml4TWFwcGluZyBleHRlbmRzIFhNTEV2ZW50IHsKLSAgLyogCi0gICAqIFJldHVybnMgdGhlIHVyaSBvZiB0aGUgcHJlZml4IHRoYXQgaXMgaW4gc2NvcGUgZm9yIHRoZSBmb2xsb3dpbmcgCi0gICAqIGVsZW1lbnQKLSAgICogQHJldHVybiBTdHJpbmcgdmFsdWUgb2YgdGhlIHVyaQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVcmkoKTsKLSAgLyogCi0gICAqIFJldHVybnMgdGhlIHByZWZpeCB0aGF0IGlzIG5vdyBpbiBzY29wZQotICAgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZSBvZiB0aGUgcHJlZml4Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vWE1MRXZlbnQuamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL1hNTEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMTdjOTUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vWE1MRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIHdlYmxvZ2ljLnhtbC5zdHJlYW07Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgYmFzZSBlbGVtZW50IGludGVyZmFjZSBmb3IgaGFuZGxpbmcgbWFya3VwIGV2ZW50cy4KLSAqCi0gKiBAc2luY2UgV2VibG9naWMgWE1MIElucHV0IFN0cmVhbSAxLjAKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLkNoYXJhY3RlckRhdGEKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5TdGFydEVsZW1lbnQKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5FbmRFbGVtZW50Ci0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uQ2hhcmFjdGVyRGF0YQotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTE5hbWUKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5TdGFydERvY3VtZW50Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBYTUxFdmVudCB7Ci0gIC8qKgotICAgKiBBIGNvbnN0YW50IHdoaWNoIGlkZW50aWZpZXMgYW4gWE1MRXZlbnQKLSAgICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTEV2ZW50Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRVZFTlQ9MHgwMDAwMDAwMTsKLSAgLyoqCi0gICAqIEEgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBhIFN0YXJ0RWxlbWVudAotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uU3RhcnRFbGVtZW50Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9FTEVNRU5UPTB4MDAwMDAwMDI7Ci0gIC8qKgotICAgKiBBIGNvbnN0YW50IHdoaWNoIGlkZW50aWZpZXMgYW4gRW5kRWxlbWVudAotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uRW5kRWxlbWVudAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5EX0VMRU1FTlQ9MHgwMDAwMDAwNDsKLSAgLyoqCi0gICAqIEEgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBhIFByb2Nlc3NpbmdJbnN0cnVjdGlvbgotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OPTB4MDAwMDAwMDg7Ci0gIC8qKgotICAgKiBBIGNvbnN0YW50IHdoaWNoIGlkZW50aWZpZXMgYSBDaGFyYWN0ZXJEYXRhIEV2ZW50Ci0gICAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5DaGFyYWN0ZXJEYXRhCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFSQUNURVJfREFUQT0weDAwMDAwMDEwOwotICAvKioKLSAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGEgQ29tbWVudAotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uQ29tbWVudAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVD0weDAwMDAwMDIwOwotICAvKioKLSAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGEgU3BhY2UKLSAgICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlNwYWNlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUEFDRT0weDAwMDAwMDQwOwotICAvKioKLSAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGEgTnVsbEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTExfRUxFTUVOVD0weDAwMDAwMDgwOwotICAvKioKLSAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGEgU3RhcnREb2N1bWVudAotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uU3RhcnREb2N1bWVudAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfRE9DVU1FTlQ9MHgwMDAwMDEwMDsKLSAgLyoqCi0gICAqIEEgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBhbiBFbmREb2N1bWVudAotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uRW5kRG9jdW1lbnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVORF9ET0NVTUVOVD0weDAwMDAwMjAwOwotICAvKioKLSAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGEgU3RhcnRQcmVmaXhNYXBwaW5nCi0gICAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5TdGFydFByZWZpeE1hcHBpbmcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1BSRUZJWF9NQVBQSU5HPTB4MDAwMDA0MDA7Ci0gIC8qKgotICAgKiBBIGNvbnN0YW50IHdoaWNoIGlkZW50aWZpZXMgYSBFbmRQcmVmaXhNYXBwaW5nCi0gICAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5FbmRQcmVmaXhNYXBwaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkRfUFJFRklYX01BUFBJTkc9MHgwMDAwMDgwMDsKLSAgLyoqCi0gICAqIEEgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBhIENoYW5nZVByZWZpeE1hcHBpbmcKLSAgICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLkNoYW5nZVByZWZpeE1hcHBpbmcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9QUkVGSVhfTUFQUElORz0weDAwMDAxMDAwOwotICAvKioKLSAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGFuIEVudGl0eVJlZmVyZW5jZSAKLSAgICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLkVudGl0eVJlZmVyZW5jZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX1JFRkVSRU5DRT0weDAwMDAyMDAwOwotICAvKioKLSAgICogR2V0IHRoZSBldmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQsCi0gICAqIHJldHVybnMgYW4gaW50ZWdlciBzbyB0aGF0IHN3aXRjaCBzdGF0ZW1lbnRzCi0gICAqIGNhbiBiZSB3cml0dGVuIG9uIHRoZSByZXN1bHQKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0VHlwZSgpOwotICAvKioKLSAgICogR2V0IHRoZSBldmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQsCi0gICAqIHJldHVybnMgYW4gaW50ZWdlciBzbyB0aGF0IHN3aXRjaCBzdGF0ZW1lbnRzCi0gICAqIGNhbiBiZSB3cml0dGVuIG9uIHRoZSByZXN1bHQKLSAgICovCi0gIHB1YmxpYyBYTUxOYW1lIGdldFNjaGVtYVR5cGUoKTsKLSAgLyoqCi0gICAqIEdldCB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSB0eXBlIG5hbWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZUFzU3RyaW5nKCk7Ci0gIC8qKgotICAgKiBHZXQgdGhlIFhNTE5hbWUgb2YgdGhlIGN1cnJlbnQgZWxlbWVudAotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MTmFtZQotICAgKi8KLSAgcHVibGljIFhNTE5hbWUgZ2V0TmFtZSgpOwotCi0gIC8qKgotICAgKiBDaGVjayBpZiB0aGlzIEVsZW1lbnQgaGFzIGEgbmFtZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoaXMgRWxlbWVudAotICAgKi8KLSAgcHVibGljIExvY2F0aW9uIGdldExvY2F0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBhY2Nlc3MgdG8gdGhlIGVsZW1lbnRzIHR5cGUKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzU3RhcnRFbGVtZW50KCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzRW5kRWxlbWVudCgpOwotICBwdWJsaWMgYm9vbGVhbiBpc0VudGl0eVJlZmVyZW5jZSgpOwotICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0UHJlZml4TWFwcGluZygpOwotICBwdWJsaWMgYm9vbGVhbiBpc0VuZFByZWZpeE1hcHBpbmcoKTsKLSAgcHVibGljIGJvb2xlYW4gaXNDaGFuZ2VQcmVmaXhNYXBwaW5nKCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzUHJvY2Vzc2luZ0luc3RydWN0aW9uKCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzQ2hhcmFjdGVyRGF0YSgpOwotICBwdWJsaWMgYm9vbGVhbiBpc1NwYWNlKCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzTnVsbCgpOwotICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0RG9jdW1lbnQoKTsKLSAgcHVibGljIGJvb2xlYW4gaXNFbmREb2N1bWVudCgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vWE1MSW5wdXRTdHJlYW0uamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL1hNTElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZWE2ZmUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vWE1MSW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIHdlYmxvZ2ljLnhtbC5zdHJlYW07Ci0KLS8qKgotICoKLSAqIFRoaXMgaXMgdGhlIHRvcCBsZXZlbCBpbnRlcmZhY2UgZm9yIGl0ZXJhdGluZyBvdmVyIFhNTCBFdmVudHMKLSAqIGluIGFuIFhNTCBkb2N1bWVudC4KLSAqCi0gKiA8cD4gRGlmZmVyZW5jZSBmcm9tIFNBWCA8L3A+Ci0gKiA8cD4gQW4gZXZlbnQgc3RyZWFtIGNhbiBiZSB0aG91Z2h0IG9mIGVuY2Fwc3VsYXRpbmcgU0FYCi0gKiBldmVudHMuIEl0IGFwcGxpZXMgYW4gaXRlcmF0b3IvcHVsbCBtZXRhcGhvciB0byB0aGUgcGFyc2VyIAotICogYWxsb3dpbmcgcHJvY2VkdXJhbCwgc3RyZWFtLWJhc2VkLCBoYW5kbGluZyBvZiBpbnB1dCBYTUwgcmF0aGVyIHRoYW4KLSAqIGhhdmluZyB0byB3cml0ZSBjaGFpbmVkIGV2ZW50IGhhbmRsZXJzIHRvIGhhbmRsZSBjb21wbGV4IFhNTAotICogZG9jdW1lbnRzLgotICogPHA+IERpZmZlcmVuY2UgZnJvbSBET00gPC9wPgotICogPHA+VGhlIHB1bGwgbWV0YXBob3IgYWxsb3dzIHNpbmdsZS1wYXNzLCBzdHJlYW0tYmFzZWQgIHBhcnNpbmcgb2YgdGhlIGRvY3VtZW50IHJhdGhlcgotICogdGhhbiB0cmVlIGJhc2VkIG1hbmlwdWxhdGlvbi48L3A+Ci0gKgotICogQHNpbmNlIFhNTElucHV0U3RyZWFtIDEuMAotICogQHZlcnNpb24gMS4wCi0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MRXZlbnQKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5DaGFyYWN0ZXJEYXRhCi0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uU3RhcnRFbGVtZW50Ci0gKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uRW5kRWxlbWVudAotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLkNoYXJhY3RlckRhdGEKLSAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5YTUxOYW1lCi0gKi8KLQotLy8gUkVWSUVXIHBkYXBrdXNAYmVhLmNvbSAyMDAyLVNlcC0xMyAtLSB3aGlsZSBJIGxpa2UgdGhlIGNvbnZlbmllbmNlCi0vLyBvZiBtYW55IG9mIHRoZXNlIG1ldGhvZHMsIGl0IHN0cmlrZXMgbWUgdGhhdCBtYW55IG9mIHRoZXNlIG1ldGhvZHMKLS8vIGNvdWxkIGltcGxlbWVudGVkIGFzIHN0YXRpYyBtZXRob2RzIGluIGEgdXRpbGl0eSBjbGFzcy4gIHRoZSBkb3duCi0vLyBzaWRlIHRvIGhhdmluZyB0aGVtIGluIHRoaXMgYmFzZSBpbnRlcmZhY2UgaXMgdGhhdCBpdCBtYWtlcyB0aGUKLS8vIGNvbnRyYWN0IGZvciBpbXBsZW1lbnRlcnMgdW5uZWNlc3NhcmlseSBzdGVhcCBhbmQgcmVzdWx0cyBpbgotLy8gZHVwbGljYXRlZCBjb2RlIGluIG1ldGhvZHMgdGhhdCBjYW4ndCBleHRlbmQgb25lIG9mIHRoZSBjb21tb24gYmFzZQotLy8gY2xhc3Nlcy4gIAotCi1wdWJsaWMgaW50ZXJmYWNlIFhNTElucHV0U3RyZWFtIHsKLSAgLyoqCi0gICAqIEdldCB0aGUgbmV4dCBYTUxFdmVudCBvbiB0aGUgc3RyZWFtCi0gICAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5YTUxFdmVudAotICAgKi8KLSAgcHVibGljIFhNTEV2ZW50IG5leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAvKioKLSAgICogQ2hlY2sgaWYgdGhlcmUgYXJlIG1vcmUgZXZlbnRzIHRvIHB1bGwgb2YgdGhlIHN0cmVhbQotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MRXZlbnQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAvKioKLSAgICogU2tpcCB0aGUgbmV4dCBzdHJlYW0gZXZlbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNraXAoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAvKioKLSAgICogU2tpcHMgdGhlIGVudGlyZSBuZXh0IHN0YXJ0IHRhZyAvIGVuZCB0YWcgcGFpci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNraXBFbGVtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLSAgLyoqCi0gICAqIENoZWNrIHRoZSBuZXh0IFhNTEV2ZW50IHdpdGhvdXQgcmVhZGluZyBpdCBmcm9tIHRoZSBzdHJlYW0uCi0gICAqIFJldHVybnMgbnVsbCBpZiB0aGUgc3RyZWFtIGlzIGF0IEVPRiBvciBoYXMgbm8gbW9yZSBYTUxFdmVudHMuCi0gICAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5YTUxFdmVudAotICAgKi8KLSAgcHVibGljIFhNTEV2ZW50IHBlZWsoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAvKioKLSAgICogUG9zaXRpb24gdGhlIHN0cmVhbSBhdCB0aGUgbmV4dCBYTUxFdmVudCBvZiB0aGlzIHR5cGUuICBUaGUgbWV0aG9kCi0gICAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyZWFtIGNvbnRhaW5zIGFub3RoZXIgWE1MRXZlbnQgb2YgdGhpcyB0eXBlCi0gICAqIGFuZCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIEBwYXJhbSBldmVudFR5cGUgQW4gaW50ZWdlciBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBlbGVtZW50IHR5cGUuCi0gICAqIEBzZWUgd2VibG9naWMueG1sLnN0cmVhbS5YTUxFdmVudAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2tpcChpbnQgZXZlbnRUeXBlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAvKioKLSAgICogUG9zaXRpb24gdGhlIHN0cmVhbSBhdCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoaXMgbmFtZS4gIFRoZSBtZXRob2QKLSAgICogcmV0dXJucyB0cnVlIGlmIHRoZSBzdHJlYW0gY29udGFpbnMgYW5vdGhlciBlbGVtZW50IHdpdGggdGhpcyBuYW1lCi0gICAqIGFuZCBmYWxzZSBvdGhlcndpc2UuICBTa2lwIGlzIGEgZm9yd2FyZCBvcGVyYXRvciBvbmx5LiAgSXQgZG9lcwotICAgKiBub3QgbG9vayBiYWNrd2FyZCBpbiB0aGUgc3RyZWFtLgotICAgKiBAcGFyYW0gbmFtZSBBbiBvYmplY3QgdGhhdCBkZWZpbmVzIGFuIFhNTCBuYW1lLgotICAgKiBJZiB0aGUgWE1MTmFtZS5nZXROYW1lU3BhY2VOYW1lKCkgbWV0aG9kIG9uIHRoZSBYTUxOYW1lIGFyZ3VtZW50IHJldHVybnMKLSAgICogbnVsbCB0aGUgWE1MTmFtZSB3aWxsIG1hdGNoIGp1c3QgdGhlIGxvY2FsIG5hbWUuICBQcmVmaXhlcyBhcmUKLSAgICogbm90IGNoZWNrZWQgZm9yIGVxdWFsaXR5LgotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MTmFtZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2tpcChYTUxOYW1lIG5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247Ci0gIC8qKgotICAgKiBQb3NpdGlvbiB0aGUgc3RyZWFtIGF0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhpcyBuYW1lIGFuZCB0aGlzIHR5cGUuCi0gICAqIFRoZSBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBzdHJlYW0gY29udGFpbnMgYW5vdGhlciBlbGVtZW50IAotICAgKiB3aXRoIHRoaXMgbmFtZSBvZiB0aGlzIHR5cGUgYW5kIGZhbHNlIG90aGVyd2lzZS4gIAotICAgKiBAcGFyYW0gbmFtZSBBbiBvYmplY3QgdGhhdCBkZWZpbmVzIGFuIFhNTCBuYW1lLgotICAgKiBJZiB0aGUgWE1MTmFtZS5nZXROYW1lU3BhY2VOYW1lKCkgbWV0aG9kIG9uIHRoZSBYTUxOYW1lIGFyZ3VtZW50IHJldHVybnMKLSAgICogbnVsbCB0aGUgWE1MTmFtZSB3aWxsIG1hdGNoIGp1c3QgdGhlIGxvY2FsIG5hbWUuICBQcmVmaXhlcyBhcmUKLSAgICogbm90IGNoZWNrZWQgZm9yIGVxdWFsaXR5LgotICAgKiBAcGFyYW0gZXZlbnRUeXBlIEFuIGludGVnZXIgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZWxlbWVudCB0eXBlLgotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MRXZlbnQKLSAgICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTE5hbWUKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNraXAoWE1MTmFtZSBuYW1lLCBpbnQgZXZlbnRUeXBlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAvKioKLSAgICogZ2V0U3ViU3RyZWFtKCkgcmV0dXJucyBhIHN0cmVhbSB3aGljaCBwb2ludHMgdG8gdGhlIGVudGlyZSBuZXh0IGVsZW1lbnQgaW4gdGhlCi0gICAqIGN1cnJlbnQgc3RyZWFtLiAgRm9yIGV4YW1wbGU6IHRha2UgYSBkb2N1bWVudCB0aGF0IGhhcyBhIHJvb3Qgbm9kZSBBLCB3aGVyZSB0aGUgY2hpbGRyZW4KLSAgICogb2YgQSBhcmUgQiwgQywgYW5kIEQuIElmIHRoZSBzdHJlYW0gaXMgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IGVsZW1lbnQgb2YgQSwgZ2V0U3ViU3RyZWFtKCkgd2lsbCByZXR1cm4gCi0gICAqIEEsIEIsIEMgYW5kIEQgaW5jbHVkaW5nIHRoZSBzdGFydCBlbGVtZW50IG9mIEEgYW5kIHRoZSBlbmQgZWxlbWVudCBvZiBBLiAgVGhlIHBvc2l0aW9uIG9mIHRoZSBwYXJlbnQKLSAgICogc3RyZWFtIGlzIG5vdCBjaGFuZ2VkIGFuZCB0aGUgZXZlbnRzIHJlYWQgYnkgdGhlIHN1YnN0cmVhbSBhcmUgd3JpdHRlbiBiYWNrIHRvIGl0cyBwYXJlbnQuICAgCi0gICAqLwotICBwdWJsaWMgWE1MSW5wdXRTdHJlYW0gZ2V0U3ViU3RyZWFtKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLSAgLyoqCi0gICAqIENsb3NlcyB0aGlzIGlucHV0IHN0cmVhbSBhbmQgcmVsZWFzZXMgYW55IHN5c3RlbSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHJlYW0uCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlZmVyZW5jZSByZXNvbHZlciB0aGF0IHdhcyBzZXQgZm9yIHRoaXMgc3RyZWFtLAotICAgKiByZXR1cm5zIG51bGwgaWYgbm8gUmVmZXJlbmNlUmVzb2x2ZXIgaGFzIGJlZW4gc2V0LgotICAgKiBAc2VlIHdlYmxvZ2ljLnhtbC5zdHJlYW0uUmVmZXJlbmNlUmVzb2x2ZXIKLSAgICovCi0gIHB1YmxpYyBSZWZlcmVuY2VSZXNvbHZlciBnZXRSZWZlcmVuY2VSZXNvbHZlcigpOwotICAvKioKLSAgICogUHJvdmlkZXMgYSB3YXkgdG8gc2V0IHRoZSBSZWZlcmVuY2VSZXNvbHZlciBvZiB0aGUgc3RyZWFtLAotICAgKiB0aGlzIGlzIG1vc3RseSBuZWVkZWQgZm9yIGhhbmRsZSByZWZlcmVuY2VzIHRvIG90aGVyIHBhcnRzIG9mIHRoZQotICAgKiBkb2N1bWVudC4KLSAgICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlJlZmVyZW5jZVJlc29sdmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VSZXNvbHZlcihSZWZlcmVuY2VSZXNvbHZlciByZXNvbHZlcik7Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vWE1MTmFtZS5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vWE1MTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjIzNGM2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS93ZWJsb2dpYy94bWwvc3RyZWFtL1hNTE5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbTsKLQotLyoqCi0gKiBFbmNhcHN1bGF0ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFF1YWxpZmllZCBOYW1lIG9mIGFuIFhNTCBldmVudC4KLSAqCi0gKiBAc2luY2UgV2VibG9naWMgWE1MIElucHV0IFN0cmVhbSAxLjAKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlN0YXJ0RWxlbWVudAotICogQHNlZSB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTEV2ZW50Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBYTUxOYW1lIHsKLSAgLyoKLSAgICogcmV0dXJucyB0aGUgdXJpIG9mIHRoZSBwcmVmaXggb2YgdGhpcyBuYW1lCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIHVyaSwgCi0gICAqIGVtcHR5IHN0cmluZyBpZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgaXMgYm91bmQgdG8gZW1wdHkgc3RyaW5nIAotICAgKiBvciBudWxsIGlmIHRoZSBuYW1lIGRvZXMgbm90IGhhdmUgYSBuYW1lc3BhY2UKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVXJpKCk7Ci0gIC8qCi0gICAqIHJldHVybnMgdGhlIGxvY2FsbmFtZSBvZiB0aGUgeG1sIG5hbWUKLSAgICogCi0gICAqIEByZXR1cm4gdGhlIGxvY2FsbmFtZSwgY2Fubm90IGJlIG51bGwKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCk7Ci0gIC8qCi0gICAqIHJldHVybnMgdGhlIHByZWZpeCBvZiB0aGUgeG1sIG5hbWUKLSAgICogCi0gICAqIEByZXR1cm4gdGhlIHByZWZpeCBvZiB0aGUgeG1sIG5hbWUgb3IgbnVsbAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKTsKLQotICAvKgotICAgKiByZXR1cm5zIHRoZSBwcmVmaXggb2YgdGhlIHhtbCBuYW1lICsgJzonICsgdGhlIGxvY2FsIG5hbWUKLSAgICogaWYgdGhlIHByZWZpeCBpcyBub3QgbnVsbAotICAgKiByZXR1cm5zIHRoZSBsb2NhbCBuYW1lIG90aGVyd2lzZQotICAgKiAKLSAgICogQHJldHVybiB0aGUgcHJlZml4IHBsdXMgdGhlIGxvY2FsIG5hbWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vWE1MU3RyZWFtRXhjZXB0aW9uLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9YTUxTdHJlYW1FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk4MGRmMy4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9YTUxTdHJlYW1FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIHdlYmxvZ2ljLnhtbC5zdHJlYW07Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLQotaW1wb3J0IHdlYmxvZ2ljLnV0aWxzLk5lc3RlZFRocm93YWJsZTsKLQotLyoqCi0gKiBUaGUgYmFzZSBleGNlcHRpb24gZm9yIHVuZXhwZWN0ZWQgaW5wdXQgZHVyaW5nIFhNTCBoYW5kbGluZwotICoKLSAqIEBzaW5jZSBXZWJsb2dpYyBYTUwgSW5wdXQgU3RyZWFtIDEuMAotICogQHZlcnNpb24gMS4wCi0gKi8KLQotcHVibGljIGNsYXNzIFhNTFN0cmVhbUV4Y2VwdGlvbiAKLSAgZXh0ZW5kcyBJT0V4Y2VwdGlvbiAKLSAgaW1wbGVtZW50cyBOZXN0ZWRUaHJvd2FibGUgCi17Ci0gIHByb3RlY3RlZCBUaHJvd2FibGUgdGg7Ci0KLSAgcHVibGljIFhNTFN0cmVhbUV4Y2VwdGlvbigpIHt9Ci0KLSAgcHVibGljIFhNTFN0cmVhbUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7IAotICAgIHN1cGVyKG1zZyk7IAotICB9Ci0KLSAgcHVibGljIFhNTFN0cmVhbUV4Y2VwdGlvbihUaHJvd2FibGUgdGgpIHsKLSAgICB0aGlzLnRoID0gdGg7Ci0gICAgCi0gIH0KLQotICBwdWJsaWMgWE1MU3RyZWFtRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSB0aCkgewotICAgIHN1cGVyKG1zZyk7Ci0gICAgdGhpcy50aCA9IHRoOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5lc3RlZCBleGNlcHRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gICAgICAgICAgICAgICAgIE5lc3RlZCBleGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBUaHJvd2FibGUgZ2V0TmVzdGVkRXhjZXB0aW9uKCkgewotICAgIHJldHVybiBnZXROZXN0ZWQoKTsKLSAgfQotCi0gIC8vdHJ5IHRvIGRvIHNvbWV0aW5nIHVzZWZ1bAotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0gICAgU3RyaW5nIG1zZyA9IHN1cGVyLmdldE1lc3NhZ2UoKTsKLQotICAgIGlmIChtc2cgPT0gbnVsbCAmJiB0aCAhPSBudWxsKSB7Ci0gICAgICByZXR1cm4gdGguZ2V0TWVzc2FnZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbXNnOwotICAgIH0KLSAgfQotCi0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gTmVzdGVkVGhyb3dhYmxlIGltcGxlbWVudGF0aW9uLgotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXN0ZWQgVGhyb3dhYmxlLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICBOZXN0ZWQgZXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgVGhyb3dhYmxlIGdldE5lc3RlZCgpIHsKLSAgICByZXR1cm4gdGg7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHN1cGVyVG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzdXBlclByaW50U3RhY2tUcmFjZShQcmludFN0cmVhbSBwcykgewotICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShwcyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzdXBlclByaW50U3RhY2tUcmFjZShQcmludFdyaXRlciBwdykgewotICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShwdyk7Ci0gIH0KLQotICAvLyBFbmQgTmVzdGVkVGhyb3dhYmxlIGltcGxlbWVudGF0aW9uLgotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8qKgotICAgKiBQcmludHMgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIGFuZCBpdHMgbmVzdGVkIGV4Y2VwdGlvbiBtZXNzYWdlLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gTmVzdGVkVGhyb3dhYmxlLlV0aWwudG9TdHJpbmcodGhpcyk7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnRzIHRoZSBzdGFjayB0cmFjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBleGNlcHRpb24gYW5kCi0gICAqIGl0cyBuZXN0ZWQgZXhjZXB0aW9uLgotICAgKgotICAgKiBAcGFyYW0gcyAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0KLSAgICovCi0gIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFN0cmVhbSBzKSB7IAotICAgIE5lc3RlZFRocm93YWJsZS5VdGlsLnByaW50U3RhY2tUcmFjZSh0aGlzLCBzKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludHMgdGhlIHN0YWNrIHRyYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV4Y2VwdGlvbiBhbmQKLSAgICogaXRzIG5lc3RlZCBleGNlcHRpb24uCi0gICAqCi0gICAqIEBwYXJhbSBzICAgICAgICAgICAgICAgICBQcmludFN0cmVhbQotICAgKi8KLSAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50V3JpdGVyIHcpIHsgCi0gICAgTmVzdGVkVGhyb3dhYmxlLlV0aWwucHJpbnRTdGFja1RyYWNlKHRoaXMsIHcpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50cyB0aGUgc3RhY2sgdHJhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXhjZXB0aW9uIGFuZAotICAgKiBpdHMgbmVzdGVkIGV4Y2VwdGlvbiB0byBTeXN0ZW0uZXJyLgotICAgKgotICAgKiBAcGFyYW0gcyAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0KLSAgICovCi0gIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKLSAgICBwcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gIH0KLX0KLQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9ldmVudHMvRWxlbWVudFR5cGVOYW1lcy5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL3dlYmxvZ2ljL3htbC9zdHJlYW0vZXZlbnRzL0VsZW1lbnRUeXBlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZkNjBmOS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1saW5wdXRzdHJlYW0vd2VibG9naWMveG1sL3N0cmVhbS9ldmVudHMvRWxlbWVudFR5cGVOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugd2VibG9naWMueG1sLnN0cmVhbS5ldmVudHM7Ci0KLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTEV2ZW50OwotCi1wdWJsaWMgY2xhc3MgRWxlbWVudFR5cGVOYW1lcyB7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWUoaW50IHZhbCkgeyAKLSAgICBzd2l0Y2godmFsKSB7Ci0gICAgY2FzZSBYTUxFdmVudC5YTUxfRVZFTlQ6IHJldHVybiAoIlhNTF9FVkVOVCIpOwotICAgIGNhc2UgWE1MRXZlbnQuU1RBUlRfRUxFTUVOVDogcmV0dXJuICgiU1RBUlRfRUxFTUVOVCIpOwotICAgIGNhc2UgWE1MRXZlbnQuRU5EX0VMRU1FTlQ6IHJldHVybiAoIkVORF9FTEVNRU5UIik7Ci0gICAgY2FzZSBYTUxFdmVudC5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOiByZXR1cm4gKCJQUk9DRVNTSU5HX0lOU1RSVUNUSU9OIik7Ci0gICAgY2FzZSBYTUxFdmVudC5DSEFSQUNURVJfREFUQTogcmV0dXJuICgiQ0hBUkFDVEVSX0RBVEEiKTsKLSAgICBjYXNlIFhNTEV2ZW50LkNPTU1FTlQ6IHJldHVybiAoIkNPTU1FTlQiKTsKLSAgICBjYXNlIFhNTEV2ZW50LlNQQUNFOiByZXR1cm4gKCJTUEFDRSIpOwotICAgIGNhc2UgWE1MRXZlbnQuTlVMTF9FTEVNRU5UOiByZXR1cm4gKCJOVUxMX0VMRU1FTlQiKTsKLSAgICBjYXNlIFhNTEV2ZW50LlNUQVJUX0RPQ1VNRU5UOiByZXR1cm4gKCJTVEFSVF9ET0NVTUVOVCIpOwotICAgIGNhc2UgWE1MRXZlbnQuRU5EX0RPQ1VNRU5UOiByZXR1cm4gKCJFTkRfRE9DVU1FTlQiKTsKLSAgICBjYXNlIFhNTEV2ZW50LlNUQVJUX1BSRUZJWF9NQVBQSU5HOiByZXR1cm4gKCJTVEFSVF9QUkVGSVhfTUFQUElORyIpOwotICAgIGNhc2UgWE1MRXZlbnQuQ0hBTkdFX1BSRUZJWF9NQVBQSU5HOiByZXR1cm4gKCJDSEFOR0VfUFJFRklYX01BUFBJTkciKTsKLSAgICBjYXNlIFhNTEV2ZW50LkVORF9QUkVGSVhfTUFQUElORzogcmV0dXJuICgiRU5EX1BSRUZJWF9NQVBQSU5HIik7Ci0gICAgY2FzZSBYTUxFdmVudC5FTlRJVFlfUkVGRVJFTkNFOiByZXR1cm4gKCJFTlRJVFlfUkVGRVJFTkNFIik7Ci0gICAgZGVmYXVsdDogcmV0dXJuICIiOwotICAgIH0KLSAgfQotICBwdWJsaWMgc3RhdGljIGludCBnZXRUeXBlKFN0cmluZyB2YWwpIHsKLSAgICBpZiAodmFsLmVxdWFscygiWE1MX0VWRU5UIikpIAotICAgICAgcmV0dXJuIFhNTEV2ZW50LlhNTF9FVkVOVDsKLSAgICBpZiAodmFsLmVxdWFscyAoIlNUQVJUX0VMRU1FTlQiKSkgcmV0dXJuIAotICAgICAgICBYTUxFdmVudC5TVEFSVF9FTEVNRU5UOyAKLSAgICBpZiAodmFsLmVxdWFscyAoIkVORF9FTEVNRU5UIikpIHJldHVybiBYTUxFdmVudC5FTkRfRUxFTUVOVDsKLSAgICBpZiAodmFsLmVxdWFscyAoIlBST0NFU1NJTkdfSU5TVFJVQ1RJT04iKSkKLSAgICAgIHJldHVybiBYTUxFdmVudC5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOyAKLSAgICBpZiAodmFsLmVxdWFscyAoIkNIQVJBQ1RFUl9EQVRBIikpCi0gICAgICByZXR1cm4gWE1MRXZlbnQuQ0hBUkFDVEVSX0RBVEE7IAotICAgIGlmICh2YWwuZXF1YWxzICgiQ09NTUVOVCIpKQotICAgICAgcmV0dXJuIFhNTEV2ZW50LkNPTU1FTlQ7IAotICAgIGlmICh2YWwuZXF1YWxzICgiU1BBQ0UiKSkKLSAgICAgIHJldHVybiBYTUxFdmVudC5TUEFDRTsgCi0gICAgaWYgKHZhbC5lcXVhbHMgKCJOVUxMX0VMRU1FTlQiKSkKLSAgICAgIHJldHVybiBYTUxFdmVudC5OVUxMX0VMRU1FTlQ7IAotICAgIGlmICh2YWwuZXF1YWxzICgiU1RBUlRfRE9DVU1FTlQiKSkKLSAgICAgIHJldHVybiBYTUxFdmVudC5TVEFSVF9ET0NVTUVOVDsgCi0gICAgaWYgKHZhbC5lcXVhbHMgKCJFTkRfRE9DVU1FTlQiKSkKLSAgICAgIHJldHVybiBYTUxFdmVudC5FTkRfRE9DVU1FTlQ7IAotICAgIGlmICh2YWwuZXF1YWxzICgiU1RBUlRfUFJFRklYX01BUFBJTkciKSkKLSAgICAgIHJldHVybiBYTUxFdmVudC5TVEFSVF9QUkVGSVhfTUFQUElORzsgCi0gICAgaWYgKHZhbC5lcXVhbHMgKCJDSEFOR0VfUFJFRklYX01BUFBJTkciKSkKLSAgICAgIHJldHVybiBYTUxFdmVudC5DSEFOR0VfUFJFRklYX01BUFBJTkc7Ci0gICAgaWYgKHZhbC5lcXVhbHMgKCJFTlRJVFlfUkVGRVJFTkNFIikpCi0gICAgICByZXR1cm4gWE1MRXZlbnQuRU5USVRZX1JFRkVSRU5DRTsgCi0gICAgaWYgKHZhbC5lcXVhbHMgKCJFTkRfUFJFRklYX01BUFBJTkciKSkKLSAgICAgIHJldHVybiBYTUxFdmVudC5FTkRfUFJFRklYX01BUFBJTkc7Ci0KLSAgICByZXR1cm4gWE1MRXZlbnQuTlVMTF9FTEVNRU5UOwotICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL2phdmF4L3htbC9uYW1lc3BhY2UvUU5hbWUuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvamF2YXgveG1sL25hbWVzcGFjZS9RTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWJhMzZkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvamF2YXgveG1sL25hbWVzcGFjZS9RTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXhpcyIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBqYXZheC54bWwubmFtZXNwYWNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIDxjb2RlPlFOYW1lPC9jb2RlPiBjbGFzcyByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZiBhIHF1YWxpZmllZCBuYW1lCi0gKiBhcyBzcGVjaWZpZWQgaW4gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI1FOYW1lIj5YTUwKLSAqIFNjaGVtYSBQYXJ0MjogRGF0YXR5cGVzIHNwZWNpZmljYXRpb248L2E+LgotICogPHA+Ci0gKiBUaGUgdmFsdWUgb2YgYSBRTmFtZSBjb250YWlucyBhIDxiPm5hbWVzcGFjZVVSSTwvYj4sIGEgPGI+bG9jYWxQYXJ0PC9iPiBhbmQgYSA8Yj5wcmVmaXg8L2I+LgotICogVGhlIGxvY2FsUGFydCBwcm92aWRlcyB0aGUgbG9jYWwgcGFydCBvZiB0aGUgcXVhbGlmaWVkIG5hbWUuIFRoZQotICogbmFtZXNwYWNlVVJJIGlzIGEgVVJJIHJlZmVyZW5jZSBpZGVudGlmeWluZyB0aGUgbmFtZXNwYWNlLgotICoKLSAqIEB2ZXJzaW9uIDEuMQotICovCi1wdWJsaWMgY2xhc3MgUU5hbWUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIGNvbW1lbnQvc2hhcmVkIGVtcHR5IHN0cmluZyAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBlbXB0eVN0cmluZyA9ICIiLmludGVybigpOwotCi0gICAgLyoqIEZpZWxkIG5hbWVzcGFjZVVSSSAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSTsKLQotICAgIC8qKiBGaWVsZCBsb2NhbFBhcnQgKi8KLSAgICBwcml2YXRlIFN0cmluZyBsb2NhbFBhcnQ7Ci0KLSAgICAvKiogRmllbGQgcHJlZml4ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBRTmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhbFBhcnQgTG9jYWwgcGFydCBvZiB0aGUgUU5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgUU5hbWUoU3RyaW5nIGxvY2FsUGFydCkgewotICAgICAgICB0aGlzKGVtcHR5U3RyaW5nLCBsb2NhbFBhcnQsIGVtcHR5U3RyaW5nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIFFOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSSBOYW1lc3BhY2UgVVJJIGZvciB0aGUgUU5hbWUKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0IExvY2FsIHBhcnQgb2YgdGhlIFFOYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZShTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxQYXJ0KSB7Ci0gICAgICAgIHRoaXMobmFtZXNwYWNlVVJJLCBsb2NhbFBhcnQsIGVtcHR5U3RyaW5nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIFFOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSSBOYW1lc3BhY2UgVVJJIGZvciB0aGUgUU5hbWUKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0IExvY2FsIHBhcnQgb2YgdGhlIFFOYW1lLgotICAgICAqIEBwYXJhbSBwcmVmaXggUHJlZml4IG9mIHRoZSBRTmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUU5hbWUoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsUGFydCwgU3RyaW5nIHByZWZpeCkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IChuYW1lc3BhY2VVUkkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICA/IGVtcHR5U3RyaW5nCi0gICAgICAgICAgICAgICAgOiBuYW1lc3BhY2VVUkkuaW50ZXJuKCk7Ci0gICAgICAgIGlmIChsb2NhbFBhcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBRTmFtZSBsb2NhbCBwYXJ0Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmxvY2FsUGFydCA9IGxvY2FsUGFydC5pbnRlcm4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBRTmFtZSBwcmVmaXgiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4LmludGVybigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgTmFtZXNwYWNlIFVSSSBmb3IgdGhpcyBRTmFtZQotICAgICAqCi0gICAgICogQHJldHVybiBOYW1lc3BhY2UgVVJJCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VVUkk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgTG9jYWwgcGFydCBmb3IgdGhpcyBRTmFtZQotICAgICAqCi0gICAgICogQHJldHVybiBMb2NhbCBwYXJ0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbFBhcnQoKSB7Ci0gICAgICAgIHJldHVybiBsb2NhbFBhcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgUHJlZml4IGZvciB0aGlzIFFOYW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFByZWZpeAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICByZXR1cm4gcHJlZml4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBRTmFtZQotICAgICAqCi0gICAgICogQHJldHVybiAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFFOYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQotICAgICAgICByZXR1cm4gKChuYW1lc3BhY2VVUkkgPT0gZW1wdHlTdHJpbmcpCi0gICAgICAgICAgICAgICAgPyBsb2NhbFBhcnQKLSAgICAgICAgICAgICAgICA6ICd7JyArIG5hbWVzcGFjZVVSSSArICd9JyArIGxvY2FsUGFydCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhpcyBRTmFtZSBmb3IgZXF1YWxpdHkgd2l0aCBhbm90aGVyIG9iamVjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCBhIFFOYW1lIG9yIGlzIG51bGwgdGhlbiB0aGlzIG1ldGhvZAotICAgICAqIHJldHVybnMgPHR0PmZhbHNlPC90dD4uCi0gICAgICogPHA+Ci0gICAgICogRm9yIHR3byBRTmFtZXMgdG8gYmUgY29uc2lkZXJlZCBlcXVhbCByZXF1aXJlcyB0aGF0IGJvdGgKLSAgICAgKiBsb2NhbFBhcnQgYW5kIG5hbWVzcGFjZVVSSSBtdXN0IGJlIGVxdWFsLiBUaGlzIG1ldGhvZCB1c2VzCi0gICAgICogPGNvZGU+U3RyaW5nLmVxdWFsczwvY29kZT4gdG8gY2hlY2sgZXF1YWxpdHkgb2YgbG9jYWxQYXJ0Ci0gICAgICogYW5kIG5hbWVzcGFjZVVSSS4gQW55IGNsYXNzIHRoYXQgZXh0ZW5kcyBRTmFtZSBpcyByZXF1aXJlZAotICAgICAqIHRvIHNhdGlzZnkgdGhpcyBlcXVhbGl0eSBjb250cmFjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBzYXRpc2ZpZXMgdGhlIGdlbmVyYWwgY29udHJhY3Qgb2YgdGhlIDxjb2RlPk9iamVjdC5lcXVhbHM8L2NvZGU+IG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmogdGhlIHJlZmVyZW5jZSBvYmplY3Qgd2l0aCB3aGljaCB0byBjb21wYXJlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgaWRlbnRpY2FsIHRvIHRoaXMKLSAgICAgKiAgICAgIFFOYW1lOiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0KLSAgICAgICAgaWYgKG9iaiA9PSB0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFFOYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChuYW1lc3BhY2VVUkkgPT0gKChRTmFtZSkgb2JqKS5uYW1lc3BhY2VVUkkpCi0gICAgICAgICAgICAgICAgJiYgKGxvY2FsUGFydCA9PSAoKFFOYW1lKSBvYmopLmxvY2FsUGFydCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBRTmFtZSBob2xkaW5nIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIFN0cmluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc3RyaW5nIG11c3QgYmUgaW4gdGhlIGZvcm0gcmV0dXJuZWQgYnkgdGhlIFFOYW1lLnRvU3RyaW5nKCkKLSAgICAgKiBtZXRob2QsIGkuZS4gIntuYW1lc3BhY2VVUkl9bG9jYWxQYXJ0Iiwgd2l0aCB0aGUgIntuYW1lc3BhY2VVUkl9IgotICAgICAqIHBhcnQgYmVpbmcgb3B0aW9uYWwuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgZG9lc24ndCBkbyBhIGZ1bGwgdmFsaWRhdGlvbiBvZiB0aGUgcmVzdWx0aW5nIFFOYW1lLgotICAgICAqIEluIHBhcnRpY3VsYXIsIGl0IGRvZXNuJ3QgY2hlY2sgdGhhdCB0aGUgcmVzdWx0aW5nIG5hbWVzcGFjZSBVUkkKLSAgICAgKiBpcyBhIGxlZ2FsIFVSSSAocGVyIFJGQyAyMzk2IGFuZCBSRkMgMjczMiksIG5vciB0aGF0IHRoZSByZXN1bHRpbmcKLSAgICAgKiBsb2NhbCBwYXJ0IGlzIGEgbGVnYWwgTkNOYW1lIHBlciB0aGUgWE1MIE5hbWVzcGFjZXMgc3BlY2lmaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzIHRoZSBzdHJpbmcgdG8gYmUgcGFyc2VkCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGNhbm5vdCBiZSBwYXJzZWQgYXMgYSBRTmFtZQotICAgICAqIEByZXR1cm4gUU5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZSB2YWx1ZU9mKFN0cmluZyBzKSB7Ci0KLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBRTmFtZSBsaXRlcmFsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocy5jaGFyQXQoMCkgPT0gJ3snKSB7Ci0gICAgICAgICAgICBpbnQgaSA9IHMuaW5kZXhPZignfScpOwotCi0gICAgICAgICAgICBpZiAoaSA9PSAtMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgUU5hbWUgbGl0ZXJhbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaSA9PSBzLmxlbmd0aCgpIC0gMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgUU5hbWUgbGl0ZXJhbCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKHMuc3Vic3RyaW5nKDEsIGkpLCBzLnN1YnN0cmluZyhpICsgMSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgUU5hbWUgb2JqZWN0LiBUaGUgaGFzaCBjb2RlCi0gICAgICogaXMgYmFzZWQgb24gYm90aCB0aGUgbG9jYWxQYXJ0IGFuZCBuYW1lc3BhY2VVUkkgcGFydHMgb2YgdGhlCi0gICAgICogUU5hbWUuIFRoaXMgbWV0aG9kIHNhdGlzZmllcyB0aGUgIGdlbmVyYWwgY29udHJhY3Qgb2YgdGhlCi0gICAgICogPGNvZGU+T2JqZWN0Lmhhc2hDb2RlPC9jb2RlPiBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIFFuYW1lIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VVUkkuaGFzaENvZGUoKSBeIGxvY2FsUGFydC5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuc3VyZSB0aGF0IGRlc2VyaWFsaXphdGlvbiBwcm9wZXJseSBpbnRlcm5zIHRoZSByZXN1bHRzLgotICAgICAqIEBwYXJhbSBpbiB0aGUgT2JqZWN0SW5wdXRTdHJlYW0gdG8gYmUgcmVhZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MKLSAgICAgICAgICAgIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgaW4uZGVmYXVsdFJlYWRPYmplY3QoKTsKLQotICAgICAgICBuYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkkuaW50ZXJuKCk7Ci0gICAgICAgIGxvY2FsUGFydCA9IGxvY2FsUGFydC5pbnRlcm4oKTsKLSAgICAgICAgcHJlZml4ID0gcHJlZml4LmludGVybigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9GaWx0ZXJYbWxPYmplY3QuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9GaWx0ZXJYbWxPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyYzBiMi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvRmlsdGVyWG1sT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBBIEZpbHRlclhtbE9iamVjdCBkZWxlZ2F0ZXMgdG8gc29tZSBvdGhlciBYbWxPYmplY3QsIHdoaWNoIGl0IGNhbiB1c2UgYXMKLSAqIGl0cyBiYXNpYyBzb3VyY2Ugb2YgZGF0YSwgcG9zc2libHkgdHJhbnNmb3JtaW5nIHRoZSBkYXRhIGFsb25nIHRoZSB3YXkgb3IKLSAqIHByb3ZpZGluZyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkuIFRoZSBjbGFzcyBGaWx0ZXJYbWxPYmplY3QgaXRzZWxmCi0gKiBzaW1wbHkgb3ZlcnJpZGVzIGFsbCBtZXRob2RzIG9mIFhtbE9iamVjdCB3aXRoIHZlcnNpb25zIHRoYXQgcGFzcyBhbGwKLSAqIHJlcXVlc3RzIHRvIHRoZSB1bmRlcmx5aW5nIFhtbE9iamVjdC4gU3ViY2xhc3NlcyBvZiBGaWx0ZXJYbWxPYmplY3QgbWF5Ci0gKiBmdXJ0aGVyIG92ZXJyaWRlIHNvbWUgb2YgdGhlc2UgbWV0aG9kcyBhbmQgbWF5IGFsc28gcHJvdmlkZSBhZGRpdGlvbmFsCi0gKiBtZXRob2RzIGFuZCBmaWVsZHMuCi0gKiA8cD4KLSAqIE5vdGU6IGl0IGlzIGltcG9ydGFudCB0aGF0IEZpbHRlclhtbE9CamVjdCBoYXMgbm8gc3RvcmFnZSAoaS5lLiwgbm8KLSAqIG5vbi10cmFuc2llbnQgZmllbGRzKSwgYmVjYXVzZSBzdWJjbGFzc2VzIG1heSBiZSBzZXJpYWxpemFibGUgYW5kCi0gKiBhZGRpbmcgc3RvcmFnZSB3b3VsZCBicmVhayB0aGUgc2VyaWFsaXphdGlvbiBmb3JtYXQuCi0gKi8gCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlsdGVyWG1sT2JqZWN0IGltcGxlbWVudHMgWG1sT2JqZWN0LCBTaW1wbGVWYWx1ZQotewotICAgIC8qKgotICAgICAqIFRoaXMgYWJzdHJhY3QgbWV0aG9kIGlzIGNhbGxlZCB0byBvYnRhaW4gdGhlIHVuZGVybHlpbmcgWG1sT2JqZWN0LgotICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHN1cHBseSBvciBjb21wdXRlIHRoZSB3cmFwcGVkIG9iamVjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBFdmVyeSBvdGhlciBtZXRob2Qgb2YgdGhpcyBjbGFzcyBkZWxlZ2F0ZXMgdG8gdGhlIG9iamVjdCByZXR1cm5lZAotICAgICAqIGZyb20gdGhpcyBtZXRob2QuIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgb2JqZWN0IGltcGxlbWVudHMgYWxsIHRoZQotICAgICAqIG1ldGhvZHMgb2YgYm90aCBYbWxPYmplY3QgYW5kIFNpbXBsZVZhbHVlLgotICAgICAqLyAKLSAgICBwdWJsaWMgYWJzdHJhY3QgWG1sT2JqZWN0IHVuZGVybHlpbmdYbWxPYmplY3QoKTsKLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5zY2hlbWFUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS52YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlKFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICB7Ci0gICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkudmFsaWRhdGUob3B0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdFtdIHNlbGVjdFBhdGgoU3RyaW5nIHBhdGgpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLnNlbGVjdFBhdGgocGF0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdFtdIHNlbGVjdFBhdGgoU3RyaW5nIHBhdGgsIFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICB7Ci0gICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuc2VsZWN0UGF0aChwYXRoLCBvcHRpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0W10gZXhlY1F1ZXJ5KFN0cmluZyBxdWVyeSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuZXhlY1F1ZXJ5KHF1ZXJ5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0W10gZXhlY1F1ZXJ5KFN0cmluZyBxdWVyeSwgWG1sT3B0aW9ucyBvcHRpb25zKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5leGVjUXVlcnkocXVlcnksIG9wdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgY2hhbmdlVHlwZShTY2hlbWFUeXBlIG5ld1R5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLmNoYW5nZVR5cGUobmV3VHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNOaWwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5pc05pbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5pbCgpCi0gICAgewotICAgICAgICB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuc2V0TmlsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbW11dGFibGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5pc0ltbXV0YWJsZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3Qgc2V0KFhtbE9iamVjdCBzcmNPYmopCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLnNldChzcmNPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgY29weSgpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLmNvcHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB2YWx1ZUVxdWFscyhYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS52YWx1ZUVxdWFscyhvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgdmFsdWVIYXNoQ29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLnZhbHVlSGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5jb21wYXJlVG8ob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGNvbXBhcmVWYWx1ZShYbWxPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5jb21wYXJlVmFsdWUob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG1vbml0b3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5tb25pdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbERvY3VtZW50UHJvcGVydGllcyBkb2N1bWVudFByb3BlcnRpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5kb2N1bWVudFByb3BlcnRpZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sQ3Vyc29yIG5ld0N1cnNvcigpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLm5ld0N1cnNvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MwotICAgICAqLwotICAgIHB1YmxpYyBYTUxJbnB1dFN0cmVhbSBuZXdYTUxJbnB1dFN0cmVhbSgpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLm5ld1hNTElucHV0U3RyZWFtKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB4bWxUZXh0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkueG1sVGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbSgpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLm5ld0lucHV0U3RyZWFtKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlYWRlciBuZXdSZWFkZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5uZXdSZWFkZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBuZXdEb21Ob2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkubmV3RG9tTm9kZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoQ29udGVudEhhbmRsZXIgY2gsIExleGljYWxIYW5kbGVyIGxoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgICB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuc2F2ZShjaCwgbGgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHVuZGVybHlpbmdYbWxPYmplY3QoKS5zYXZlKGZpbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHVuZGVybHlpbmdYbWxPYmplY3QoKS5zYXZlKG9zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHVuZGVybHlpbmdYbWxPYmplY3QoKS5zYXZlKHcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MwotICAgICAqLwotICAgIHB1YmxpYyBYTUxJbnB1dFN0cmVhbSBuZXdYTUxJbnB1dFN0cmVhbShYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLm5ld1hNTElucHV0U3RyZWFtKG9wdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgeG1sVGV4dChYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLnhtbFRleHQob3B0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIG5ld0lucHV0U3RyZWFtKFhtbE9wdGlvbnMgb3B0aW9ucykKLSAgICB7Ci0gICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkubmV3SW5wdXRTdHJlYW0ob3B0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlYWRlciBuZXdSZWFkZXIoWG1sT3B0aW9ucyBvcHRpb25zKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5uZXdSZWFkZXIob3B0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgbmV3RG9tTm9kZShYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgewotICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLm5ld0RvbU5vZGUob3B0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZShDb250ZW50SGFuZGxlciBjaCwgTGV4aWNhbEhhbmRsZXIgbGgsIFhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdW5kZXJseWluZ1htbE9iamVjdCgpLnNhdmUoY2gsIGxoLCBvcHRpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKEZpbGUgZmlsZSwgWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHVuZGVybHlpbmdYbWxPYmplY3QoKS5zYXZlKGZpbGUsIG9wdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG9zLCBYbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdW5kZXJseWluZ1htbE9iamVjdCgpLnNhdmUob3MsIG9wdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoV3JpdGVyIHcsIFhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuc2F2ZSh3LCBvcHRpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBpbnN0YW5jZVR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5pbnN0YW5jZVR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc3RyaW5nVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBib29sZWFuVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5ieXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNob3J0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGludFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuaW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5sb25nVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBiaWdJbnRlZ2VyVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5iaWdJbnRlZ2VyVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5iaWdEZWNpbWFsVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmZsb2F0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZG91YmxlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGJ5dGVBcnJheVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuYnl0ZUFycmF5VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBlbnVtVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5lbnVtVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2FsZW5kYXIgY2FsZW5kYXJWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmNhbGVuZGFyVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0ZSBkYXRlVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5kYXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR0RhdGUgZ0RhdGVWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdEYXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR0R1cmF0aW9uIGdEdXJhdGlvblZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ0R1cmF0aW9uVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgcU5hbWVWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnFOYW1lVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBsaXN0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5saXN0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCB4bGlzdFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkueGxpc3RWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3Qgb2JqZWN0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5vYmplY3RWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChTdHJpbmcgb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldChvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChib29sZWFuIHYpCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChieXRlIHYpCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChzaG9ydCB2KQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldCh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXQoaW50IHYpCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChsb25nIHYpCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChCaWdJbnRlZ2VyIG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXQob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXQoQmlnRGVjaW1hbCBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0KGZsb2F0IHYpCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChkb3VibGUgdikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXQodik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0KGJ5dGVbXSBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0KFN0cmluZ0VudW1BYnN0cmFjdEJhc2Ugb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldChvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChDYWxlbmRhciBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0KERhdGUgb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldChvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldChvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChHRHVyYXRpb25TcGVjaWZpY2F0aW9uIG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXQob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXQoUU5hbWUgb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldChvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChMaXN0IG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXQob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1ZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0U3RyaW5nVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRCb29sZWFuVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZSBnZXRCeXRlVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRCeXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldFNob3J0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEludFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0SW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRMb25nVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRMb25nVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRCaWdJbnRlZ2VyVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRCaWdEZWNpbWFsVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldEZsb2F0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0RG91YmxlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVBcnJheVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0Qnl0ZUFycmF5VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBnZXRFbnVtVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRFbnVtVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldENhbGVuZGFyVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXREYXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldEdEYXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR0R1cmF0aW9uIGdldEdEdXJhdGlvblZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0R0R1cmF0aW9uVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0UU5hbWVWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldFFOYW1lVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRMaXN0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRMaXN0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCB4Z2V0TGlzdFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkueGdldExpc3RWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRPYmplY3RWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZ1ZhbHVlKFN0cmluZyBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0U3RyaW5nVmFsdWUob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCb29sZWFuVmFsdWUoYm9vbGVhbiB2KQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldEJvb2xlYW5WYWx1ZSh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCeXRlVmFsdWUoYnl0ZSB2KQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldEJ5dGVWYWx1ZSh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydFZhbHVlKHNob3J0IHYpCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0U2hvcnRWYWx1ZSh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnRWYWx1ZShpbnQgdikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRJbnRWYWx1ZSh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb25nVmFsdWUobG9uZyB2KQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldExvbmdWYWx1ZSh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaWdJbnRlZ2VyVmFsdWUoQmlnSW50ZWdlciBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0QmlnSW50ZWdlclZhbHVlKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmlnRGVjaW1hbFZhbHVlKEJpZ0RlY2ltYWwgb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldEJpZ0RlY2ltYWxWYWx1ZShvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZsb2F0VmFsdWUoZmxvYXQgdikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRGbG9hdFZhbHVlKHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERvdWJsZVZhbHVlKGRvdWJsZSB2KQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldERvdWJsZVZhbHVlKHYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJ5dGVBcnJheVZhbHVlKGJ5dGVbXSBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0Qnl0ZUFycmF5VmFsdWUob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnVtVmFsdWUoU3RyaW5nRW51bUFic3RyYWN0QmFzZSBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0RW51bVZhbHVlKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2FsZW5kYXJWYWx1ZShDYWxlbmRhciBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0Q2FsZW5kYXJWYWx1ZShvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERhdGVWYWx1ZShEYXRlIG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXREYXRlVmFsdWUob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHRGF0ZVZhbHVlKEdEYXRlIG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRHRGF0ZVZhbHVlKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R0R1cmF0aW9uVmFsdWUoR0R1cmF0aW9uIG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRHRHVyYXRpb25WYWx1ZShvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFFOYW1lVmFsdWUoUU5hbWUgb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldFFOYW1lVmFsdWUob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMaXN0VmFsdWUoTGlzdCBvYmopCi0gICAgewotICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0TGlzdFZhbHVlKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T2JqZWN0VmFsdWUoT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRPYmplY3RWYWx1ZShvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9iamVjdFNldChPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLm9iamVjdFNldChvYmopOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRGF0ZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNTBiY2IuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTA0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gWE1MIFNjaGVtYS1jb21wYXRpYmxlIEdyZWdvcmlhbiBkYXRlLgotICogPHA+Ci0gKiBUaGVyZSBhcmUgbWFueSBkYXRlIHR5cGVzIGluIFhNTCBTY2hlbWEsIGFuZCB0aGlzIHR5cGUKLSAqIHJlcHJlc2VudHMgdGhlIG5hdHVyYWwgdW5pb24gb2YgYWxsIHRob3NlIHR5cGVzLiAgQSBHRGF0ZQotICogY2FuIGhvbGQgYW55IHN1YnNldCBvZiBkYXRlIGZpZWxkcyAoWWVhciwgTW9udGgsIERheSwgVGltZSwKLSAqIFRpbWV6b25lLCBvciBzb21lIGNvbWJpbmF0aW9uKS4gV2hlcmV2ZXIgdGhlIHNwZWNpZmljYXRpb24KLSAqIHByb3ZpZGVzIGd1aWRhbmNlLCB0aGUgZ3VpZGVsaW5lcyBpbiB0aGUKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8iPlhNTCBTY2hlbWEgMS4wIHNwZWNpZmljYXRpb248L2E+Ci0gKiAocGx1cyA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNS94bWxzY2hlbWEtZXJyYXRhIj5wdWJsaXNoZWQgZXJyYXRhPC9hPikgYXJlIGZvbGxvd2VkLgotICogPHA+Ci0gKiBJbnN0YW5jZXMgbWF5IHNlcGFyYXRlbHkgaGF2ZSB2YWx1ZXMgb3Igbm8gdmFsdWVzIGZvcgotICogdGhlIHllYXIsIG1vbnRoLCBkYXktb2YtbW9udGgsIGFuZCB0aW1lLW9mLWRheS4gTm90IGFsbAotICogb3BlcmF0aW9ucyBhcmUgbWVhbmluZ2Z1bCBvbiBhbGwgY29tYmluYXRpb25zLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgR0RhdGUgaW1wbGVtZW50cyBHRGF0ZVNwZWNpZmljYXRpb24sIGphdmEuaW8uU2VyaWFsaXphYmxlCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgCi0gICAgLy8gZm9yIGZhc3QgZXF1YWxpdHkgY29tcGFyaXNvbiwgaGFzaGluZywgYW5kIHNlcmlhbGl6YXRpb24KLSAgICBwcml2YXRlIHRyYW5zaWVudCBTdHJpbmcgX2Nhbm9uaWNhbFN0cmluZzsKLSAgICBwcml2YXRlIHRyYW5zaWVudCBTdHJpbmcgX3N0cmluZzsKLQotICAgIHByaXZhdGUgaW50IF9iaXRzOwotICAgIHByaXZhdGUgaW50IF9DWTsKLSAgICBwcml2YXRlIGludCBfTTsKLSAgICBwcml2YXRlIGludCBfRDsKLSAgICBwcml2YXRlIGludCBfaDsKLSAgICBwcml2YXRlIGludCBfbTsKLSAgICBwcml2YXRlIGludCBfczsKLSAgICBwcml2YXRlIEJpZ0RlY2ltYWwgX2ZzOwotICAgIHByaXZhdGUgaW50IF90enNpZ247Ci0gICAgcHJpdmF0ZSBpbnQgX3R6aDsKLSAgICBwcml2YXRlIGludCBfdHptOwotICAgIAotICAgIAotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgX3plcm8gPSBCaWdEZWNpbWFsLnZhbHVlT2YoMCk7Ci0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBfb25lID0gQmlnRGVjaW1hbC52YWx1ZU9mKDEpOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEdEYXRlIGJhc2VkIG9uIGEgbGV4aWNhbCByZXByZXNlbnRhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGUoQ2hhclNlcXVlbmNlIHN0cmluZykKLSAgICB7Ci0gICAgICAgIC8vIGZpcnN0IHRyaW0gWE1MIHdoaXRlc3BhY2UKLSAgICAgICAgaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKLSAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgd2hpbGUgKGxlbiA+IDAgJiYgaXNTcGFjZShzdHJpbmcuY2hhckF0KGxlbiAtIDEpKSkKLSAgICAgICAgICAgIGxlbiAtPSAxOwotICAgICAgICB3aGlsZSAoc3RhcnQgPCBsZW4gJiYgaXNTcGFjZShzdHJpbmcuY2hhckF0KHN0YXJ0KSkpCi0gICAgICAgICAgICBzdGFydCArPSAxOwotCi0gICAgICAgIC8vIHBpY2sgb3B0aW9uYWwgdGltZXpvbmUgb2ZmIHRoZSBlbmQKLSAgICAgICAgaWYgKGxlbiAtIHN0YXJ0ID49IDEgJiYgc3RyaW5nLmNoYXJBdChsZW4gLSAxKSA9PSAnWicpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9iaXRzIHw9IEhBU19USU1FWk9ORTsKLSAgICAgICAgICAgIGxlbiAtPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGxlbiAtIHN0YXJ0ID49IDYpCi0gICAgICAgIHRpbWV6b25lOiB7Ci0gICAgICAgICAgICBpbnQgdHpzaWduOwotICAgICAgICAgICAgaW50IHR6aG91cjsKLSAgICAgICAgICAgIGludCB0em1pbnV0ZTsKLQotICAgICAgICAgICAgaWYgKHN0cmluZy5jaGFyQXQobGVuIC0gMykgIT0gJzonKQotICAgICAgICAgICAgICAgIGJyZWFrIHRpbWV6b25lOwotCi0gICAgICAgICAgICBzd2l0Y2ggKHN0cmluZy5jaGFyQXQobGVuIC0gNikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnLSc6Ci0gICAgICAgICAgICAgICAgICAgIHR6c2lnbiA9IC0xOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICcrJzoKLSAgICAgICAgICAgICAgICAgICAgdHpzaWduID0gMTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgdGltZXpvbmU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHR6aG91ciA9IHR3b0RpZ2l0KHN0cmluZywgbGVuIC0gNSk7Ci0gICAgICAgICAgICB0em1pbnV0ZSA9IHR3b0RpZ2l0KHN0cmluZywgbGVuIC0gMik7Ci0gICAgICAgICAgICBpZiAodHpob3VyID4gMTQpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGltZSB6b25lIGhvdXIgbXVzdCBiZSB0d28gZGlnaXRzIGJldHdlZW4gLTE0IGFuZCArMTQiKTsKLSAgICAgICAgICAgIGlmICh0em1pbnV0ZSA+IDU5KQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRpbWUgem9uZSBtaW51dGUgbXVzdCBiZSB0d28gZGlnaXRzIGJldHdlZW4gMDAgYW5kIDU5Iik7Ci0gICAgICAgICAgICBfYml0cyB8PSBIQVNfVElNRVpPTkU7Ci0gICAgICAgICAgICBfdHpzaWduID0gdHpzaWduOwotICAgICAgICAgICAgX3R6aCA9IHR6aG91cjsKLSAgICAgICAgICAgIF90em0gPSB0em1pbnV0ZTsKLSAgICAgICAgICAgIGxlbiAtPSA2OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcGljayBkYXRlIGZpZWxkcyBvZmYgdGhlIGJlZ2lubmluZyBpZiBpdCBkb2Vzbid0IGxvb2sgbGlrZSBhIHRpbWUKLSAgICAgICAgaWYgKHN0YXJ0IDwgbGVuICYmIChzdGFydCArIDIgPj0gbGVuIHx8IHN0cmluZy5jaGFyQXQoc3RhcnQgKyAyKSAhPSAnOicpKQotICAgICAgICBzY2FuZGF0ZToKLSAgICAgICAgewotICAgICAgICAgICAgLy8gcGFyc2UgeWVhciBzaWduCi0gICAgICAgICAgICBib29sZWFuIG5lZ3llYXIgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChzdGFydCA8IGxlbiAmJiBzdHJpbmcuY2hhckF0KHN0YXJ0KSA9PSAnLScpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmVneWVhciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc3RhcnQgKz0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2NhbiB5ZWFyIGRpZ2l0cwotICAgICAgICAgICAgaW50IHZhbHVlID0gMDsKLSAgICAgICAgICAgIGludCBkaWdpdHMgPSAtc3RhcnQ7Ci0gICAgICAgICAgICBjaGFyIGNoOwotICAgICAgICAgICAgZm9yICg7OykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaCA9IHN0YXJ0IDwgbGVuID8gc3RyaW5nLmNoYXJBdChzdGFydCkgOiAnXDAnOwotICAgICAgICAgICAgICAgIGlmICghaXNEaWdpdChjaCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiAxMCArIGRpZ2l0VmFsKGNoKTsKLSAgICAgICAgICAgICAgICBzdGFydCArPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGlnaXRzICs9IHN0YXJ0OwotICAgICAgICAgICAgaWYgKGRpZ2l0cyA+IDYpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigieWVhciB0b28gbG9uZyAodXAgdG8gNiBkaWdpdHMpIik7Ci0gICAgICAgICAgICBlbHNlIGlmIChkaWdpdHMgPj0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfYml0cyB8PSBIQVNfWUVBUjsKLSAgICAgICAgICAgICAgICBfQ1kgPSAgbmVneWVhciA/IC12YWx1ZSA6IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZGlnaXRzID4gMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ5ZWFyIG11c3QgYmUgZm91ciBkaWdpdHMgKG1heSBwYWQgd2l0aCB6ZXJvZXMsIGUuZy4sIDA1NjApIik7Ci0KLSAgICAgICAgICAgIC8vIGh5cGhlbiBpbnRyb2R1Y2VzIGEgbW9udGgKLSAgICAgICAgICAgIGlmIChjaCAhPSAnLScpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG5lZ3llYXIgJiYgIWhhc1llYXIoKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOyAvLyBhIHNpbmdsZSBtaW51cwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2NhbmRhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydCArPSAxOwotCi0gICAgICAgICAgICAvLyB0d28tZGlnaXQgbW9udGgKLSAgICAgICAgICAgIGlmIChsZW4gLSBzdGFydCA+PSAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbHVlID0gdHdvRGlnaXQoc3RyaW5nLCBzdGFydCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID49IDEgJiYgdmFsdWUgPD0gMTIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfYml0cyB8PSBIQVNfTU9OVEg7Ci0gICAgICAgICAgICAgICAgICAgIF9NID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ICs9IDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBoeXBoZW4gaW50cm9kdWNlcyBhIGRheQotICAgICAgICAgICAgY2ggPSBzdGFydCA8IGxlbiA/IHN0cmluZy5jaGFyQXQoc3RhcnQpIDogJ1wwJzsKLSAgICAgICAgICAgIGlmIChjaCAhPSAnLScpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFoYXNNb250aCgpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7IC8vIG1pbnVzIGFmdGVyIGEgeWVhcgotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2NhbmRhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydCArPSAxOwotCi0gICAgICAgICAgICAvLyB0d28tZGlnaXQgZGF5Ci0gICAgICAgICAgICBpZiAobGVuIC0gc3RhcnQgPj0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHR3b0RpZ2l0KHN0cmluZywgc3RhcnQpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IDMxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2JpdHMgfD0gSEFTX0RBWTsKLSAgICAgICAgICAgICAgICAgICAgX0QgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghaGFzRGF5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gZXJyb3IgaW4gdGhlIG9yaWdpbmFsIHNjaGVtYSBzcGVjIHBlcm1pdHMgYW4gZXh0cmEgJy0nIGhlcmUKLSAgICAgICAgICAgICAgICBpZiAoaGFzTW9udGgoKSAmJiAhaGFzWWVhcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2ggPSBzdGFydCA8IGxlbiA/IHN0cmluZy5jaGFyQXQoc3RhcnQpIDogJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICctJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNjYW5kYXRlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsgLy8gbWludXMgYWZ0ZXIgYSBtb250aAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGltZQotICAgICAgICBpZiAoc3RhcnQgPCBsZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChoYXNZZWFyKCkgfHwgaGFzTW9udGgoKSB8fCBoYXNEYXkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLmNoYXJBdChzdGFydCkgIT0gJ1QnKQotICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRhdGUgYW5kIHRpbWUgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgJ1QnIik7Ci0gICAgICAgICAgICAgICAgc3RhcnQgKz0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGxlbiA8IHN0YXJ0ICsgOCB8fCBzdHJpbmcuY2hhckF0KHN0YXJ0ICsgMikgIT0gJzonIHx8IHN0cmluZy5jaGFyQXQoc3RhcnQgKyA1KSAhPSAnOicpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCi0gICAgICAgICAgICBpbnQgaCA9IHR3b0RpZ2l0KHN0cmluZywgc3RhcnQpOwotICAgICAgICAgICAgaWYgKGggPj0gMjQpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaG91ciBtdXN0IGJlIGJldHdlZW4gMDAgYW5kIDIzIik7Ci0gICAgICAgICAgICBpbnQgbSA9IHR3b0RpZ2l0KHN0cmluZywgc3RhcnQgKyAzKTsKLSAgICAgICAgICAgIGlmIChtID49IDYwKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1pbnV0ZSBtdXN0IGJlIGJldHdlZW4gMDAgYW5kIDU5Iik7Ci0gICAgICAgICAgICBpbnQgcyA9IHR3b0RpZ2l0KHN0cmluZywgc3RhcnQgKyA2KTsKLSAgICAgICAgICAgIGlmIChzID49IDYwKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlY29uZCBtdXN0IGJlIGJldHdlZW4gMDAgYW5kIDU5Iik7Ci0KLSAgICAgICAgICAgIHN0YXJ0ICs9IDg7Ci0KLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgZnMgPSBfemVybzsKLSAgICAgICAgICAgIGlmIChzdGFydCA8IGxlbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLmNoYXJBdChzdGFydCkgIT0gJy4nKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ICsgMSA8IGxlbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCArIDE7IGkgPCBsZW47IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0RpZ2l0KHN0cmluZy5jaGFyQXQoaSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnMgPSBuZXcgQmlnRGVjaW1hbChzdHJpbmcuc3ViU2VxdWVuY2Uoc3RhcnQsIGxlbikudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9iaXRzIHw9IEhBU19USU1FOwotICAgICAgICAgICAgX2ggPSBoOwotICAgICAgICAgICAgX20gPSBtOwotICAgICAgICAgICAgX3MgPSBzOwotICAgICAgICAgICAgX2ZzID0gZnM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlzVmFsaWQoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgZGF0ZSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBHRGF0ZSB3aXRoIHRoZSBzcGVjaWZpZWQgeWVhciwgbW9udGgsIGRheSwKLSAgICAgKiBob3VycywgbWludXRlcywgc2Vjb25kcywgYW5kIG9wdGlvbmFsIGZyYWN0aW9uYWwgc2Vjb25kcywgaW4KLSAgICAgKiBhbiB1bnNwZWNpZmllZCB0aW1lem9uZS4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgYnkgbm90IHNwZWNpZnlpbmcgdGhlIHRpbWV6b25lIHRoZSBHRGF0ZQotICAgICAqIGJlY29tZXMgcGFydGlhbGx5IHVub3JkZXJlZCB3aXRoIHJlc3BlY3QgdG8gdGltZXMgdGhhdAotICAgICAqIGRvIGhhdmUgYSBzcGVjaWZpZWQgdGltZXpvbmUuCi0gICAgICovCi0gICAgcHVibGljIEdEYXRlKAotICAgICAgICAgICAgaW50IHllYXIsCi0gICAgICAgICAgICBpbnQgbW9udGgsCi0gICAgICAgICAgICBpbnQgZGF5LAotICAgICAgICAgICAgaW50IGhvdXIsCi0gICAgICAgICAgICBpbnQgbWludXRlLAotICAgICAgICAgICAgaW50IHNlY29uZCwKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgZnJhY3Rpb24pCi0gICAgewotICAgICAgICBfYml0cyA9IEhBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWSB8IEhBU19USU1FOwotCi0gICAgICAgIF9DWSA9IHllYXI7Ci0gICAgICAgIF9NID0gbW9udGg7Ci0gICAgICAgIF9EID0gZGF5OwotICAgICAgICBfaCA9IGhvdXI7Ci0gICAgICAgIF9tID0gbWludXRlOwotICAgICAgICBfcyA9IHNlY29uZDsKLSAgICAgICAgX2ZzID0gZnJhY3Rpb24gPT0gbnVsbCA/IF96ZXJvIDogZnJhY3Rpb247Ci0KLSAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBhYnNvbHV0ZSBHRGF0ZSB3aXRoIHRoZSBzcGVjaWZpZWQgeWVhciwKLSAgICAgKiBtb250aCwgZGF5LCBob3VycywgbWludXRlcywgc2Vjb25kcywgYW5kIG9wdGlvbmFsIGZyYWN0aW9uYWwKLSAgICAgKiBzZWNvbmRzLCBhbmQgaW4gdGhlIHRpbWV6b25lIHNwZWNpZmllZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB5b3Ugd2lzaCB0byBoYXZlIGEgdGltZSBvciBkYXRlIHRoYXQgaXNuJ3QgaW4gYSBzcGVjaWZpZWQgdGltZXpvbmUsCi0gICAgICogdGhlbiB1c2UgdGhlIGNvbnN0cnVjdG9yIHRoYXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgdGltZXpvbmUgYXJndW1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyBHRGF0ZSgKLSAgICAgICAgICAgIGludCB5ZWFyLAotICAgICAgICAgICAgaW50IG1vbnRoLAotICAgICAgICAgICAgaW50IGRheSwKLSAgICAgICAgICAgIGludCBob3VyLAotICAgICAgICAgICAgaW50IG1pbnV0ZSwKLSAgICAgICAgICAgIGludCBzZWNvbmQsCi0gICAgICAgICAgICBCaWdEZWNpbWFsIGZyYWN0aW9uLAotICAgICAgICAgICAgaW50IHR6U2lnbiwKLSAgICAgICAgICAgIGludCB0ekhvdXIsCi0gICAgICAgICAgICBpbnQgdHpNaW51dGUpCi0gICAgewotICAgICAgICBfYml0cyA9IEhBU19USU1FWk9ORSB8IEhBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWSB8IEhBU19USU1FOwotCi0gICAgICAgIF9DWSA9IHllYXI7Ci0gICAgICAgIF9NID0gbW9udGg7Ci0gICAgICAgIF9EID0gZGF5OwotICAgICAgICBfaCA9IGhvdXI7Ci0gICAgICAgIF9tID0gbWludXRlOwotICAgICAgICBfcyA9IHNlY29uZDsKLSAgICAgICAgX2ZzID0gZnJhY3Rpb24gPT0gbnVsbCA/IF96ZXJvIDogZnJhY3Rpb247Ci0gICAgICAgIF90enNpZ24gPSB0elNpZ247Ci0gICAgICAgIF90emggPSB0ekhvdXI7Ci0gICAgICAgIF90em0gPSB0ek1pbnV0ZTsKLQotICAgICAgICBpZiAoIWlzVmFsaWQoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgR0RhdGUgYmFzZWQgb24gYSBqYXZhLnV0aWwuRGF0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY3VycmVudCBvZmZzZXQgb2YgdGhlIGRlZmF1bHQgdGltZXpvbmUgaXMgdXNlZCBhcyB0aGUgdGltZXpvbmUuCi0gICAgICogPHA+Ci0gICAgICogRm9yIGV4YW1wbGUsIGlmIGVhc3Rlcm4gZGF5bGlnaHQgdGltZSBpcyBpbiBlZmZlY3QgYXQgdGhlIGdpdmVuCi0gICAgICogZGF0ZSwgdGhlIHRpbWV6b25lIG9uIHRoZSBlYXN0IGNvYXN0IG9mIHRoZSB1bml0ZWQgc3RhdGVzCi0gICAgICogdHJhbnNsYXRlcyB0byBHTVQtMDU6MDAgKEVTVCkgKyAxOjAwIChEVCBvZmZzZXQpID09IEdNVC0wNDowMC4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGUoRGF0ZSBkYXRlKQotICAgIHsKLSAgICAgICAgLy8gcmVxdWlyZXMgc29tZSBkYXRlIG1hdGgsIHNvIGN0b3IgbGl2ZXMgb24gR0RhdGVCdWlsZGVyCi0gICAgICAgIHRoaXMobmV3IEdEYXRlQnVpbGRlcihkYXRlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEdEYXRlIGJhc2VkIG9uIGEgamF2YS51dGlsLkNhbGVuZGFyLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjYWxlbmRhciBkb2VzIG5vdCBoYXZlIHNvbWUgZmllbGRzIHNldCwgdGhlIHNhbWUgYWJzZW5jZQotICAgICAqIG9mIGluZm9ybWF0aW9uIGlzIHJlZmxlY3RlZCBpbiB0aGUgR0RhdGUuICBOb3RlIHRoYXQKLSAgICAgKiBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIgZmlsbHMgaW4gYWxsIGZpZWxkcyBhcyBzb29uIGFzIGFueQotICAgICAqIGFyZSBmZXRjaGVkLCBzbyBjb25zdHJ1Y3RpbmcgYSBHRGF0ZSB3aXRoIHRoZSBzYW1lIGNhbGVuZGFyIG9iamVjdAotICAgICAqIHR3aWNlIG1heSByZXN1bHQgaW4gYSBkaWZmZXJlbnQgR0RhdGUgYmVjYXVzZSBvZiBhIGNoYW5nZWQgY2FsZW5kYXIuCi0gICAgICogTm90ZSB0aGF0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ2FsZW5kYXIgaXMgc3RhYmxlIGlmIHlvdSByZS1nZXQgYSBzZXQgZmllbGQsCi0gICAgICogc28gaXQgZG9lcyBub3QgaGF2ZSB0aGUgc2FtZSBwcm9ibGVtLgotICAgICAqLwotICAgIHB1YmxpYyBHRGF0ZShDYWxlbmRhciBjYWxlbmRhcikKLSAgICB7Ci0gICAgICAgIC8vIHdlIG11c3Qgc2NyYXBlIHRoZSAiaXNTZXQiIGluZm9ybWF0aW9uIG91dCBiZWZvcmUgYWNjZXNzaW5nIGFueXRoaW5nCi0gICAgICAgIGJvb2xlYW4gaXNTZXRZZWFyID0gY2FsZW5kYXIuaXNTZXQoQ2FsZW5kYXIuWUVBUik7Ci0gICAgICAgIGJvb2xlYW4gaXNTZXRFcmEgPSBjYWxlbmRhci5pc1NldChDYWxlbmRhci5FUkEpOwotICAgICAgICBib29sZWFuIGlzU2V0TW9udGggPSBjYWxlbmRhci5pc1NldChDYWxlbmRhci5NT05USCk7Ci0gICAgICAgIGJvb2xlYW4gaXNTZXREYXkgPSBjYWxlbmRhci5pc1NldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpOwotICAgICAgICBib29sZWFuIGlzU2V0SG91ck9mRGF5ID0gY2FsZW5kYXIuaXNTZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpOwotICAgICAgICBib29sZWFuIGlzU2V0SG91ciA9IGNhbGVuZGFyLmlzU2V0KENhbGVuZGFyLkhPVVIpOwotICAgICAgICBib29sZWFuIGlzU2V0QW1QbSA9IGNhbGVuZGFyLmlzU2V0KENhbGVuZGFyLkFNX1BNKTsKLSAgICAgICAgYm9vbGVhbiBpc1NldE1pbnV0ZSA9IGNhbGVuZGFyLmlzU2V0KENhbGVuZGFyLk1JTlVURSk7Ci0gICAgICAgIGJvb2xlYW4gaXNTZXRTZWNvbmQgPSBjYWxlbmRhci5pc1NldChDYWxlbmRhci5TRUNPTkQpOwotICAgICAgICBib29sZWFuIGlzU2V0TWlsbGlzID0gY2FsZW5kYXIuaXNTZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQpOwotICAgICAgICBib29sZWFuIGlzU2V0Wm9uZSA9IGNhbGVuZGFyLmlzU2V0KENhbGVuZGFyLlpPTkVfT0ZGU0VUKTsKLSAgICAgICAgYm9vbGVhbiBpc1NldERzdCA9IGNhbGVuZGFyLmlzU2V0KENhbGVuZGFyLkRTVF9PRkZTRVQpOwotCi0gICAgICAgIGlmIChpc1NldFllYXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCB5ID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLllFQVIpOwotICAgICAgICAgICAgaWYgKGlzU2V0RXJhICYmIGNhbGVuZGFyIGluc3RhbmNlb2YgR3JlZ29yaWFuQ2FsZW5kYXIpCi0gICAgICAgICAgICAgICAgaWYgKGNhbGVuZGFyLmdldChDYWxlbmRhci5FUkEpID09IEdyZWdvcmlhbkNhbGVuZGFyLkJDKQotICAgICAgICAgICAgICAgICAgICB5ID0gMSAtIHk7Ci0gICAgICAgICAgICBfYml0cyB8PSBIQVNfWUVBUjsKLSAgICAgICAgICAgIF9DWSA9IHk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzU2V0TW9udGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9iaXRzIHw9IEhBU19NT05USDsKLSAgICAgICAgICAgIF9NID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1PTlRIKSArIDE7IC8vICEhbm90ZQotICAgICAgICB9Ci0gICAgICAgIGlmIChpc1NldERheSkKLSAgICAgICAgewotICAgICAgICAgICAgX2JpdHMgfD0gSEFTX0RBWTsKLSAgICAgICAgICAgIF9EID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBnb3RUaW1lID0gZmFsc2U7Ci0KLSAgICAgICAgaW50IGggPSAwOwotICAgICAgICBpbnQgbSA9IDA7Ci0gICAgICAgIGludCBzID0gMDsKLSAgICAgICAgQmlnRGVjaW1hbCBmcyA9IF96ZXJvOwotCi0gICAgICAgIGlmIChpc1NldEhvdXJPZkRheSkKLSAgICAgICAgewotICAgICAgICAgICAgaCA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5IT1VSX09GX0RBWSk7Ci0gICAgICAgICAgICBnb3RUaW1lID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpc1NldEhvdXIgJiYgaXNTZXRBbVBtKQotICAgICAgICB7Ci0gICAgICAgICAgICBoID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkhPVVIpICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkFNX1BNKSAqIDEyOwotICAgICAgICAgICAgZ290VGltZSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNTZXRNaW51dGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG0gPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuTUlOVVRFKTsKLSAgICAgICAgICAgIGdvdFRpbWUgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzU2V0U2Vjb25kKQotICAgICAgICB7Ci0gICAgICAgICAgICBzID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLlNFQ09ORCk7Ci0gICAgICAgICAgICBnb3RUaW1lID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1NldE1pbGxpcykKLSAgICAgICAgewotICAgICAgICAgICAgZnMgPSBCaWdEZWNpbWFsLnZhbHVlT2YoY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1JTExJU0VDT05EKSwgMyk7Ci0gICAgICAgICAgICBnb3RUaW1lID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnb3RUaW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBfYml0cyB8PSBIQVNfVElNRTsKLSAgICAgICAgICAgIF9oID0gaDsKLSAgICAgICAgICAgIF9tID0gbTsKLSAgICAgICAgICAgIF9zID0gczsKLSAgICAgICAgICAgIF9mcyA9IGZzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzU2V0Wm9uZSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5aT05FX09GRlNFVCk7Ci0gICAgICAgICAgICBpZiAoaXNTZXREc3QpCi0gICAgICAgICAgICAgICAgem9uZU9mZnNldEluTWlsbGlzZWNvbmRzICs9IGNhbGVuZGFyLmdldChDYWxlbmRhci5EU1RfT0ZGU0VUKTsKLQotICAgICAgICAgICAgX2JpdHMgfD0gSEFTX1RJTUVaT05FOwotICAgICAgICAgICAgaWYgKHpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF90enNpZ24gPSAwOwotICAgICAgICAgICAgICAgIF90emggPSAwOwotICAgICAgICAgICAgICAgIF90em0gPSAwOwotICAgICAgICAgICAgICAgIFRpbWVab25lIHpvbmUgPSBjYWxlbmRhci5nZXRUaW1lWm9uZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IHpvbmUuZ2V0SUQoKTsKLSAgICAgICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiBpZC5sZW5ndGgoKSA+IDMpIHN3aXRjaCAoaWQuY2hhckF0KDMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnKyc6IF90enNpZ24gPSAxOyBicmVhazsgICAvLyBHTVQrMDA6MDAKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnLSc6IF90enNpZ24gPSAtMTsgYnJlYWs7ICAvLyBHTVQtMDA6MDAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3R6c2lnbiA9ICh6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMgPCAwID8gLTEgOiArMSk7Ci0gICAgICAgICAgICAgICAgem9uZU9mZnNldEluTWlsbGlzZWNvbmRzID0gem9uZU9mZnNldEluTWlsbGlzZWNvbmRzICogX3R6c2lnbjsKLSAgICAgICAgICAgICAgICBfdHpoID0gem9uZU9mZnNldEluTWlsbGlzZWNvbmRzIC8gMzYwMDAwMDsKLSAgICAgICAgICAgICAgICBfdHptID0gKHpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyAtIF90emggKiAzNjAwMDAwKSAvIDYwMDAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEdEYXRlIGJhc2VkIG9uIGFub3RoZXIgR0RhdGVTcGVjaWZpY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBHRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gZ2RhdGUpCi0gICAgewotICAgICAgICBpZiAoZ2RhdGUuaGFzVGltZVpvbmUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgX2JpdHMgfD0gSEFTX1RJTUVaT05FOwotICAgICAgICAgICAgX3R6c2lnbiA9IGdkYXRlLmdldFRpbWVab25lU2lnbigpOwotICAgICAgICAgICAgX3R6aCA9IGdkYXRlLmdldFRpbWVab25lSG91cigpOwotICAgICAgICAgICAgX3R6bSA9IGdkYXRlLmdldFRpbWVab25lTWludXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2RhdGUuaGFzVGltZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBfYml0cyB8PSBIQVNfVElNRTsKLSAgICAgICAgICAgIF9oID0gZ2RhdGUuZ2V0SG91cigpOwotICAgICAgICAgICAgX20gPSBnZGF0ZS5nZXRNaW51dGUoKTsKLSAgICAgICAgICAgIF9zID0gZ2RhdGUuZ2V0U2Vjb25kKCk7Ci0gICAgICAgICAgICBfZnMgPSBnZGF0ZS5nZXRGcmFjdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdkYXRlLmhhc0RheSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBfYml0cyB8PSBIQVNfREFZOwotICAgICAgICAgICAgX0QgPSBnZGF0ZS5nZXREYXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZGF0ZS5oYXNNb250aCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBfYml0cyB8PSBIQVNfTU9OVEg7Ci0gICAgICAgICAgICBfTSA9IGdkYXRlLmdldE1vbnRoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2RhdGUuaGFzWWVhcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBfYml0cyB8PSBIQVNfWUVBUjsKLSAgICAgICAgICAgIF9DWSA9IGdkYXRlLmdldFllYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNEaWdpdChjaGFyIGNoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoY2hhcikoY2ggLSAnMCcpIDw9ICc5JyAtICcwJyk7IC8vIGNoYXIgaXMgdW5zaWduZWQKLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzU3BhY2UoY2hhciBjaCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoY2gpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgJyAnOgotICAgICAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgZGlnaXRWYWwoY2hhciBjaCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoY2ggLSAnMCcpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCB0d29EaWdpdChDaGFyU2VxdWVuY2Ugc3RyLCBpbnQgaW5kZXgpCi0gICAgewotICAgICAgICBjaGFyIGNoMSA9IHN0ci5jaGFyQXQoaW5kZXgpOwotICAgICAgICBjaGFyIGNoMiA9IHN0ci5jaGFyQXQoaW5kZXggKyAxKTsKLSAgICAgICAgaWYgKCFpc0RpZ2l0KGNoMSkgfHwgIWlzRGlnaXQoY2gyKSkKLSAgICAgICAgICAgIHJldHVybiAxMDA7IC8vIG5vdCB0d28gZGlnaXRzCi0gICAgICAgIHJldHVybiBkaWdpdFZhbChjaDEpICogMTAgKyBkaWdpdFZhbChjaDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZTogYWxsIEdEYXRlIGluc3RhbmNlcyBhcmUgaW1tdXRhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzSW1tdXRhYmxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb21iaW5hdGlvbiBvZiBmbGFncyBpbmRpY2F0aW5nIHRoZSBpbmZvcm1hdGlvbgotICAgICAqIGNvbnRhaW5lZCBieSB0aGlzIEdEYXRlLiAgVGhlIGZpdmUgZmxhZ3MgYXJlCi0gICAgICogSEFTX1RJTUVaT05FLCBIQVNfWUVBUiwgSEFTX01PTlRILCBIQVNfREFZLCBhbmQgSEFTX1RJTUUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRGbGFncygpCi0gICAgewotICAgICAgICByZXR1cm4gX2JpdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIHRpbWV6b25lLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1RpbWVab25lKCkKLSAgICAgICAgeyByZXR1cm4gKChfYml0cyAmIEhBU19USU1FWk9ORSkgIT0gMCk7IH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSB5ZWFyLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1llYXIoKQotICAgICAgICB7IHJldHVybiAoKF9iaXRzICYgSEFTX1lFQVIpICE9IDApOyB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgZGF0ZS90aW1lIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgbW9udGgtb2YteWVhci4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb250aCgpCi0gICAgICAgIHsgcmV0dXJuICgoX2JpdHMgJiBIQVNfTU9OVEgpICE9IDApOyB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgZGF0ZS90aW1lIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgZGF5LW9mLW1vbnRoLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0RheSgpCi0gICAgICAgIHsgcmV0dXJuICgoX2JpdHMgJiBIQVNfREFZKSAhPSAwKTsgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIHRpbWUtb2YtZGF5LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1RpbWUoKQotICAgICAgICB7IHJldHVybiAoKF9iaXRzICYgSEFTX1RJTUUpICE9IDApOyB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgZGF0ZS90aW1lIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgZnVsbCBkYXRlICh5ZWFyLCBtb250aCwgZGF5KQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0RhdGUoKQotICAgICAgICB7IHJldHVybiAoKF9iaXRzICYgKEhBU19EQVkgfCBIQVNfTU9OVEggfCBIQVNfWUVBUikpID09IChIQVNfREFZIHwgSEFTX01PTlRIIHwgSEFTX1lFQVIpKTsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgeWVhci4gU2hvdWxkIGJlIGEgZm91ci1kaWdpdCB5ZWFyIHNwZWNpZmljYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRZZWFyKCkKLSAgICAgICAgeyByZXR1cm4gX0NZOyAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbW9udGgtb2YteWVhci4gSmFudWFyeSBpcyAxLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TW9udGgoKQotICAgICAgICB7IHJldHVybiBfTTsgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRheS1vZi1tb250aC4gVGhlIGZpcnN0IGRheSBvZiBlYWNoIG1vbnRoIGlzIDEuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXREYXkoKQotICAgICAgICB7IHJldHVybiBfRDsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgaG91ci1vZi1kYXkuIE1pZG5pZ2h0IGlzIDAsIGFuZCAxMVBNIGlzIDIzLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0SG91cigpCi0gICAgICAgIHsgcmV0dXJuIF9oOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtaW51dGUtb2YtaG91ci4gUmFuZ2UgZnJvbSAwIHRvIDU5LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TWludXRlKCkKLSAgICAgICAgeyByZXR1cm4gX207IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNlY29uZC1vZi1taW51dGUuIFJhbmdlIGZyb20gMCB0byA1OS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFNlY29uZCgpCi0gICAgICAgIHsgcmV0dXJuIF9zOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmcmFjdGlvbi1vZi1zZWNvbmQuIFJhbmdlIGZyb20gMCAoaW5jbHVzaXZlKSB0byAxIChleGNsdXNpdmUpLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBCaWdEZWNpbWFsIGdldEZyYWN0aW9uKCkKLSAgICAgICAgeyByZXR1cm4gX2ZzOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0aW1lIHpvbmUgc2lnbi4gRm9yIHRpbWUgem9uZXMgZWFzdCBvZiBHTVQsCi0gICAgICogdGhpcyBpcyBwb3NpdGl2ZTsgZm9yIHRpbWUgem9uZXMgd2VzdCwgdGhpcyBpcyBuZWdhdGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFRpbWVab25lU2lnbigpCi0gICAgICAgIHsgcmV0dXJuIF90enNpZ247IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbWUgem9uZSBob3VyLgotICAgICAqCi0gICAgICogVGhpcyBpcyBhbHdheXMgcG9zaXRpdmU6IGZvciB0aGUgc2lnbiwgbG9vayBhdAotICAgICAqIGdldFRpbWVab25lU2lnbigpLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VGltZVpvbmVIb3VyKCkKLSAgICAgICAgeyByZXR1cm4gX3R6aDsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZSB6b25lIG1pbnV0ZXMuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIGFsd2F5cyBwb3NpdGl2ZTogZm9yIHRoZSBzaWduLCBsb29rIGF0Ci0gICAgICogZ2V0VGltZVpvbmVTaWduKCkuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRUaW1lWm9uZU1pbnV0ZSgpCi0gICAgICAgIHsgcmV0dXJuIF90em07IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdW5kZWQgbWlsbGlzZWNvbmQgdmFsdWUuIFJhbmdlIGZyb20gMCB0byA5OTkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1pbGxpc2Vjb25kKCkKLSAgICB7Ci0gICAgICAgIGlmIChfZnMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gX2ZzLnNldFNjYWxlKDMsIEJpZ0RlY2ltYWwuUk9VTkRfSEFMRl9VUCkudW5zY2FsZWRWYWx1ZSgpLmludFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGNhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24uIFNwZWNpZmljIG1vbWVudHMgb3IKLSAgICAgKiB0aW1lcy1vZi1kYXkgaW4gYSBzcGVjaWZpZWQgdGltZXpvbmUgYXJlIG5vcm1hbGl6ZWQgdG8KLSAgICAgKiBVVEMgdGltZSB0byBwcm9kdWNlIGEgY2Fub25pY2FsIHN0cmluZyBmb3JtIGZvciB0aGVtLgotICAgICAqIE90aGVyIHJlY3VycmluZyB0aW1lIHNwZWNpZmljYXRpb25zIGtlZXAgdGhlaXIgdGltZXpvbmUKLSAgICAgKiBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNhbm9uaWNhbFN0cmluZygpCi0gICAgewotICAgICAgICBlbnN1cmVDYW5vbmljYWxTdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuIF9jYW5vbmljYWxTdHJpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIEdEYXRlIGNvcnJlc3BvbmRzIHRvIGEgdmFsaWQgZ3JlZ29yaWFuIGRhdGUgdmFsdWUKLSAgICAgKiBpbiBYTUwgc2NoZW1hLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdEYXRlQnVpbGRlci5pc1ZhbGlkR0RhdGUodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSnVsaWFuIGRhdGUgY29ycmVzcG9uZGluZyB0byB0aGlzIEdyZWdvcmlhbiBkYXRlLgotICAgICAqIFRoZSBKdWxpYW4gZGF0ZSAoSkQpIGlzIGEgY29udGludW91cyBjb3VudCBvZiBkYXlzIGZyb20KLSAgICAgKiAxIEphbnVhcnkgNDcxMyBCQyAoPSAtNDcxMiBKYW51YXJ5IDEpLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SnVsaWFuRGF0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gR0RhdGVCdWlsZGVyLmp1bGlhbkRhdGVGb3JHRGF0ZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHRpbWUgYXMgYW4ge0BsaW5rIFhtbENhbGVuZGFyfS4KLSAgICAgKiA8cD4KLSAgICAgKiB7QGxpbmsgWG1sQ2FsZW5kYXJ9IGlzIGEgc3ViY2xhc3Mgb2Yge0BsaW5rIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcn0KLSAgICAgKiB3aGljaCBpcyBzbGlnaHRseSBjdXN0b21pemVkIHRvIG1hdGNoIFhNTCBzY2hlbWEgZGF0ZSBydWxlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmV0dXJuZWQge0BsaW5rIFhtbENhbGVuZGFyfSBoYXMgb25seSB0aG9zZSB0aW1lIGFuZCBkYXRlIGZpZWxkcwotICAgICAqIHNldCB0aGF0IGFyZSByZWZsZWN0ZWQgaW4gdGhlIEdEYXRlIG9iamVjdC4gIEJlY2F1c2Ugb2YgdGhlIHdheSB0aGUKLSAgICAgKiB7QGxpbmsgamF2YS51dGlsLkNhbGVuZGFyfSBjb250cmFjdCB3b3JrcywgYW55IGluZm9ybWF0aW9uIGluIHRoZSBpc1NldCgpIHZhbmlzaGVzCi0gICAgICogYXMgc29vbiBhcyB5b3UgdmlldyBhbnkgdW5zZXQgZmllbGQgdXNpbmcgZ2V0KCkgbWV0aG9kcy4KLSAgICAgKiBUaGlzIG1lYW5zIHRoYXQgaWYgaXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgd2hpY2ggZGF0ZSBmaWVsZHMKLSAgICAgKiBhcmUgc2V0LCB5b3UgbXVzdCBjYWxsIGlzU2V0KCkgZmlyc3QgYmVmb3JlIGdldCgpLgotICAgICAqLwotICAgIHB1YmxpYyBYbWxDYWxlbmRhciBnZXRDYWxlbmRhcigpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFhtbENhbGVuZGFyKHRoaXMpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCB0aW1lIGFzIGEgamF2YS51dGlsLkRhdGUKLSAgICAgKiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHRGF0ZUJ1aWxkZXIuZGF0ZUZvckdEYXRlKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmlzb24gdG8gYW5vdGhlciBHRGF0ZS4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPlJldHVybnMgLTEgaWYgdGhpcyA8IGRhdGUuIChsZXNzLXRoYW4pCi0gICAgICogPGxpPlJldHVybnMgMCBpZiB0aGlzID09IGRhdGUuIChlcXVhbCkKLSAgICAgKiA8bGk+UmV0dXJucyAxIGlmIHRoaXMgPiBkYXRlLiAoZ3JlYXRlci10aGFuKQotICAgICAqIDxsaT5SZXR1cm5zIDIgaWYgdGhpcyA8PiBkYXRlLiAoaW5jb21wYXJhYmxlKQotICAgICAqIDwvdWw+Ci0gICAgICogVHdvIGluc3RhbmNlcyBhcmUgaW5jb21wYXJhYmxlIGlmIHRoZXkgaGF2ZSBkaWZmZXJlbnQgYW1vdW50cwotICAgICAqIG9mIGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvR0RhdGUoR0RhdGVTcGVjaWZpY2F0aW9uIGRhdGVzcGVjKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdEYXRlQnVpbGRlci5jb21wYXJlR0RhdGUodGhpcywgZGF0ZXNwZWMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJ1aWx0aW4gdHlwZSBjb2RlIGZvciB0aGUgc2hhcGUgb2YgdGhlIGluZm9ybWF0aW9uCi0gICAgICogY29udGFpbmVkIGluIHRoaXMgaW5zdGFuY2UsIG9yIDAgaWYgdGhlCi0gICAgICogaW5zdGFuY2UgZG9lc24ndCBjb250YWluIGluZm9ybWF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYQotICAgICAqIFNjaGVtYSB0eXBlLgotICAgICAqIDxwPiAKLSAgICAgKiBWYWx1ZSB3aWxsIGJlIGVxdWFsIHRvCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX05PVF9CVUlMVElOfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19ZRUFSfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19ZRUFSX01PTlRIfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19NT05USH0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfTU9OVEhfREFZfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19EQVl9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19EQVRFfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfREFURV9USU1FfSwgb3IKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfVElNRX0uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRCdWlsdGluVHlwZUNvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdEYXRlQnVpbGRlci5idGNGb3JGbGFncyhfYml0cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGR1cmF0aW9uIHRvIHRoaXMgR0RhdGUsIGFuZCByZXR1cm5zIGEgbmV3IEdEYXRlLgotICAgICAqLwotICAgIHB1YmxpYyBHRGF0ZSBhZGQoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIEdEYXRlQnVpbGRlciBidWlsZGVyID0gbmV3IEdEYXRlQnVpbGRlcih0aGlzKTsKLSAgICAgICAgYnVpbGRlci5hZGRHRHVyYXRpb24oZHVyYXRpb24pOwotICAgICAgICByZXR1cm4gYnVpbGRlci50b0dEYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGR1cmF0aW9uIHRvIHRoaXMgR0RhdGUsIGFuZCByZXR1cm5zIGEgbmV3IEdEYXRlLgotICAgICAqLwotICAgIHB1YmxpYyBHRGF0ZSBzdWJ0cmFjdChHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGR1cmF0aW9uKQotICAgIHsKLSAgICAgICAgR0RhdGVCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgR0RhdGVCdWlsZGVyKHRoaXMpOwotICAgICAgICBidWlsZGVyLnN1YnRyYWN0R0R1cmF0aW9uKGR1cmF0aW9uKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9HRGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdEYXRlIGlzIGFuIGltbXV0YWJsZSBjbGFzcywgYW5kIGVxdWFsaXR5IGlzIGNvbXB1dGVkIGJhc2VkCi0gICAgICogb24gaXRzIGNhbm9uaWNhbCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIGlmIChvYmogPT0gdGhpcykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBHRGF0ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgZW5zdXJlQ2Fub25pY2FsU3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiBfY2Fub25pY2FsU3RyaW5nLmVxdWFscygoKEdEYXRlKW9iaikuY2Fub25pY2FsU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgZm9yIHRoaXMgR0RhdGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgewotICAgICAgICBlbnN1cmVDYW5vbmljYWxTdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuIF9jYW5vbmljYWxTdHJpbmcuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2Fub25pY2FsIHN0cmluZyByZXByZXNlbnRhdGlvbi4gU3BlY2lmaWMgbW9tZW50cyBvcgotICAgICAqIHRpbWVzLW9mLWRheSBpbiBhIHNwZWNpZmllZCB0aW1lem9uZSBhcmUgbm9ybWFsaXplZCB0bwotICAgICAqIFVUQyB0aW1lIHRvIHByb2R1Y2UgYSBjYW5vbmljYWwgc3RyaW5nIGZvcm0gZm9yIHRoZW0uCi0gICAgICogT3RoZXIgcmVjdXJyaW5nIHRpbWUgc3BlY2lmaWNhdGlvbnMga2VlcCB0aGVpciB0aW1lem9uZQotICAgICAqIGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVDYW5vbmljYWxTdHJpbmcoKQotICAgIHsKLSAgICAgICAgaWYgKF9jYW5vbmljYWxTdHJpbmcgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBib29sZWFuIG5lZWROb3JtYWxpemUgPQotICAgICAgICAgICAgKGhhc1RpbWVab25lKCkgJiYgZ2V0VGltZVpvbmVTaWduKCkgIT0gMCAmJiBoYXNUaW1lKCkgJiYKLSAgICAgICAgICAgICgoaGFzRGF5KCkgPT0gaGFzTW9udGgoKSAmJiBoYXNEYXkoKSA9PSBoYXNZZWFyKCkpKSk7Ci0KLSAgICAgICAgaWYgKCFuZWVkTm9ybWFsaXplICYmIGdldEZyYWN0aW9uKCkgIT0gbnVsbCAmJiBnZXRGcmFjdGlvbigpLnNjYWxlKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIGJpID0gZ2V0RnJhY3Rpb24oKS51bnNjYWxlZFZhbHVlKCk7Ci0gICAgICAgICAgICBuZWVkTm9ybWFsaXplID0gKGJpLm1vZChHRGF0ZUJ1aWxkZXIuVEVOKS5zaWdudW0oKSA9PSAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbmVlZE5vcm1hbGl6ZSkKLSAgICAgICAgICAgIF9jYW5vbmljYWxTdHJpbmcgPSB0b1N0cmluZygpOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEdEYXRlQnVpbGRlciBnZGIgPSBuZXcgR0RhdGVCdWlsZGVyKHRoaXMpOwotICAgICAgICAgICAgZ2RiLm5vcm1hbGl6ZSgpOwotICAgICAgICAgICAgX2Nhbm9uaWNhbFN0cmluZyA9IGdkYi50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIG5hdHVyYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiBUaGlzIHJlcHJlc2VudHMgdGhlIGluZm9ybWF0aW9uCi0gICAgICogdGhhdCBpcyBhdmFpbGFibGUsIGluY2x1ZGluZyB0aW1lem9uZS4gRm9yIHR5cGVzIHRoYXQgY29ycmVzcG9uZAotICAgICAqIHRvIGRlZmluZWQgc2NoZW1hIHR5cGVzIChzY2hlbWFCdWlsdGluVHlwZUNvZGUoKSA+IDApLAotICAgICAqIHRoaXMgcHJvdmlkZXMgdGhlIG5hdHVyYWwgbGV4aWNhbCByZXByZXNlbnRhdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIGJvdGggdGltZSBhbmQgdGltZXpvbmUgYXJlIHNwZWNpZmllZCwgdGhpcyBzdHJpbmcgaXMgbm90Ci0gICAgICogdGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiB1bmxlc3MgdGhlIHRpbWV6b25lIGlzIFVUQyAoWikKLSAgICAgKiAoc2luY2UgdGhlIHNhbWUgbW9tZW50IGluIHRpbWUgY2FuIGJlIGV4cHJlc3NlZCBpbiBkaWZmZXJlbnQKLSAgICAgKiB0aW1lem9uZXMpLiBUbyBnZXQgYSBjYW5vbmljYWwgc3RyaW5nLCB1c2UgdGhlIGNhbm9uaWNhbFN0cmluZygpCi0gICAgICogbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgaWYgKF9zdHJpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgIF9zdHJpbmcgPSBmb3JtYXRHRGF0ZSh0aGlzKTsKLSAgICAgICAgcmV0dXJuIF9zdHJpbmc7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIF90ZW5zRGlnaXQgPQotICAgIHsKLSAgICAgICAgJzAnLCAnMCcsICcwJywgJzAnLCAnMCcsICcwJywgJzAnLCAnMCcsICcwJywgJzAnLAotICAgICAgICAnMScsICcxJywgJzEnLCAnMScsICcxJywgJzEnLCAnMScsICcxJywgJzEnLCAnMScsCi0gICAgICAgICcyJywgJzInLCAnMicsICcyJywgJzInLCAnMicsICcyJywgJzInLCAnMicsICcyJywKLSAgICAgICAgJzMnLCAnMycsICczJywgJzMnLCAnMycsICczJywgJzMnLCAnMycsICczJywgJzMnLAotICAgICAgICAnNCcsICc0JywgJzQnLCAnNCcsICc0JywgJzQnLCAnNCcsICc0JywgJzQnLCAnNCcsCi0gICAgICAgICc1JywgJzUnLCAnNScsICc1JywgJzUnLCAnNScsICc1JywgJzUnLCAnNScsICc1JywKLSAgICAgICAgJzYnLCAnNicsICc2JywgJzYnLCAnNicsICc2JywgJzYnLCAnNicsICc2JywgJzYnLAotICAgICAgICAnNycsICc3JywgJzcnLCAnNycsICc3JywgJzcnLCAnNycsICc3JywgJzcnLCAnNycsCi0gICAgICAgICc4JywgJzgnLCAnOCcsICc4JywgJzgnLCAnOCcsICc4JywgJzgnLCAnOCcsICc4JywKLSAgICAgICAgJzknLCAnOScsICc5JywgJzknLCAnOScsICc5JywgJzknLCAnOScsICc5JywgJzknLAotICAgIH07Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIF9vbmVzRGlnaXQgPQotICAgIHsKLSAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAotICAgICAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCi0gICAgICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKLSAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAotICAgICAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCi0gICAgICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKLSAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAotICAgICAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCi0gICAgICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKLSAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX3BhZFR3b0FwcGVuZChjaGFyW10gYiwgaW50IGksIGludCBuKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KG4gPj0gMCAmJiBuIDwgMTAwKTsKLSAgICAgICAgYltpXSA9IF90ZW5zRGlnaXRbbl07Ci0gICAgICAgIGJbaSArIDFdID0gX29uZXNEaWdpdFtuXTsKLSAgICAgICAgcmV0dXJuIGkgKyAyOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfcGFkRm91ckFwcGVuZChjaGFyW10gYiwgaW50IGksIGludCBuKQotICAgIHsKLSAgICAgICAgaWYgKG4gPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBiW2krK10gPSAnLSc7Ci0gICAgICAgICAgICBuID0gLW47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG4gPj0gMTAwMDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gSW50ZWdlci50b1N0cmluZyhuKTsKLSAgICAgICAgICAgIHMuZ2V0Q2hhcnMoMCwgcy5sZW5ndGgoKSwgYiwgaSk7Ci0gICAgICAgICAgICByZXR1cm4gaSArIHMubGVuZ3RoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHEgPSBuIC8gMTAwOwotICAgICAgICBpbnQgciA9IG4gLSBxICogMTAwOwotICAgICAgICBiW2ldID0gX3RlbnNEaWdpdFtxXTsKLSAgICAgICAgYltpICsgMV0gPSBfb25lc0RpZ2l0W3FdOwotICAgICAgICBiW2kgKyAyXSA9IF90ZW5zRGlnaXRbcl07Ci0gICAgICAgIGJbaSArIDNdID0gX29uZXNEaWdpdFtyXTsKLSAgICAgICAgcmV0dXJuIGkgKyA0OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaW1lWm9uZSBHTVRaT05FID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRpbWVab25lW10gTUlOVVNaT05FID0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTAwOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0wMTowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMDI6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTAzOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0wNDowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMDU6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTA2OjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0wNzowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMDg6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTA5OjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0xMDowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMTE6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTEyOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0xMzowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMTQ6MDAiKSwKLSAgICAgICAgICAgIH07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGltZVpvbmVbXSBQTFVTWk9ORSA9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswMDowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMDE6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzAyOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswMzowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMDQ6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzA1OjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswNjowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMDc6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzA4OjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswOTowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMTA6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzExOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCsxMjowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMTM6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzE0OjAwIiksCi0gICAgICAgICAgICB9OwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgVGltZVpvbmUgdGltZVpvbmVGb3JHRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gZGF0ZSkKLSAgICB7Ci0gICAgICAgIC8vIHVzZSBhIGNhY2hlZCB0aW1lem9uZSBpZiBpbnRlZ3JhbDsgb3RoZXJ3aXNlIG1ha2UgYSBuZXcgb25lLgotICAgICAgICBpZiAoIWRhdGUuaGFzVGltZVpvbmUoKSkKLSAgICAgICAgICAgIHJldHVybiBUaW1lWm9uZS5nZXREZWZhdWx0KCk7Ci0gICAgICAgIGlmIChkYXRlLmdldFRpbWVab25lU2lnbigpID09IDApCi0gICAgICAgICAgICByZXR1cm4gR01UWk9ORTsKLSAgICAgICAgaWYgKGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSA9PSAwICYmIGRhdGUuZ2V0VGltZVpvbmVIb3VyKCkgPD0gMTQgJiYgZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSA+PSAwKQotICAgICAgICAgICAgcmV0dXJuIGRhdGUuZ2V0VGltZVpvbmVTaWduKCkgPCAwID8gTUlOVVNaT05FW2RhdGUuZ2V0VGltZVpvbmVIb3VyKCldIDogUExVU1pPTkVbZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKV07Ci0gICAgICAgIAotICAgICAgICBjaGFyW10gemIgPSBuZXcgY2hhcls5XTsKLSAgICAgICAgemJbMF0gPSAnRyc7Ci0gICAgICAgIHpiWzFdID0gJ00nOwotICAgICAgICB6YlsyXSA9ICdUJzsKLSAgICAgICAgemJbM10gPSAoZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKSA8IDApID8gJy0nIDogJysnOwotICAgICAgICBHRGF0ZS5fcGFkVHdvQXBwZW5kKHpiLCA0LCBkYXRlLmdldFRpbWVab25lSG91cigpKTsKLSAgICAgICAgemJbNl0gPSAnOic7Ci0gICAgICAgIEdEYXRlLl9wYWRUd29BcHBlbmQoemIsIDcsIGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSk7Ci0gICAgICAgIHJldHVybiBUaW1lWm9uZS5nZXRUaW1lWm9uZShuZXcgU3RyaW5nKHpiKSk7Ci0gICAgfQotICAgIAotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIFN0cmluZyBmb3JtYXRHRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gc3BlYykKLSAgICB7Ci0gICAgICAgIC8vIFdlJ3ZlIHVzZWQgYSBjaGFyW10gcmF0aGVyIHRoYW4gYSBTdHJpbmdCdWZmZXIgZm9yIGEgNHggc3BlZWR1cAotICAgICAgICAvLyAtWVkoMTApWVktTU0tRERUSEg6TU06U1MuRkZGRkZGK1pIOlpNCi0gICAgICAgIC8vIDEgKyAxMCAgICsgMysgMysgMysgMysgMysxICsgcyArIDMrIDMgPSAzMyArIHMKLSAgICAgICAgQmlnRGVjaW1hbCBmcyA9IHNwZWMuZ2V0RnJhY3Rpb24oKTsKLSAgICAgICAgY2hhcltdIG1lc3NhZ2UgPSBuZXcgY2hhclszMyArIChmcyA9PSBudWxsID8gMCA6IGZzLnNjYWxlKCkpXTsKLSAgICAgICAgaW50IGkgPSAwOwotCi0gICAgICAgIGlmIChzcGVjLmhhc1llYXIoKSB8fCBzcGVjLmhhc01vbnRoKCkgfHwgc3BlYy5oYXNEYXkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZG15OiB7Ci0gICAgICAgICAgICAgICAgaWYgKHNwZWMuaGFzWWVhcigpKQotICAgICAgICAgICAgICAgICAgICBpID0gX3BhZEZvdXJBcHBlbmQobWVzc2FnZSwgMCwgc3BlYy5nZXRZZWFyKCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVtpKytdID0gJy0nOwotCi0gICAgICAgICAgICAgICAgaWYgKCEoc3BlYy5oYXNNb250aCgpIHx8IHNwZWMuaGFzRGF5KCkpKQotICAgICAgICAgICAgICAgICAgICBicmVhayBkbXk7Ci0KLSAgICAgICAgICAgICAgICBtZXNzYWdlW2krK10gPSAnLSc7Ci0gICAgICAgICAgICAgICAgaWYgKHNwZWMuaGFzTW9udGgoKSkKLSAgICAgICAgICAgICAgICAgICAgaSA9IF9wYWRUd29BcHBlbmQobWVzc2FnZSwgaSwgc3BlYy5nZXRNb250aCgpKTsKLQotICAgICAgICAgICAgICAgIGlmICghc3BlYy5oYXNEYXkoKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgZG15OwotCi0gICAgICAgICAgICAgICAgbWVzc2FnZVtpKytdID0gJy0nOwotICAgICAgICAgICAgICAgIGkgPSBfcGFkVHdvQXBwZW5kKG1lc3NhZ2UsIGksIHNwZWMuZ2V0RGF5KCkpOwotICAgICAgICAgICAgICAgIGJyZWFrIGRteTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcGVjLmhhc1RpbWUoKSkKLSAgICAgICAgICAgICAgICBtZXNzYWdlW2krK10gPSAnVCc7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3BlYy5oYXNUaW1lKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkgPSBfcGFkVHdvQXBwZW5kKG1lc3NhZ2UsIGksIHNwZWMuZ2V0SG91cigpKTsKLSAgICAgICAgICAgIG1lc3NhZ2VbaSsrXSA9ICc6JzsKLSAgICAgICAgICAgIGkgPSBfcGFkVHdvQXBwZW5kKG1lc3NhZ2UsIGksIHNwZWMuZ2V0TWludXRlKCkpOwotICAgICAgICAgICAgbWVzc2FnZVtpKytdID0gJzonOwotICAgICAgICAgICAgaSA9IF9wYWRUd29BcHBlbmQobWVzc2FnZSwgaSwgc3BlYy5nZXRTZWNvbmQoKSk7Ci0gICAgICAgICAgICBpZiAoZnMgIT0gX3plcm8pIC8vIChvcHRpbWl6YXRpb24gfjMlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBmcmFjID0gc3BlYy5nZXRGcmFjdGlvbigpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgaW50IHBvaW50ID0gZnJhYy5pbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICAgICAgaWYgKHBvaW50ID49IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmFjLmdldENoYXJzKHBvaW50LCBmcmFjLmxlbmd0aCgpLCBtZXNzYWdlLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgaSArPSBmcmFjLmxlbmd0aCgpIC0gcG9pbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNwZWMuaGFzVGltZVpvbmUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNwZWMuZ2V0VGltZVpvbmVTaWduKCkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlW2krK10gPSAnWic7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZVtpKytdID0gc3BlYy5nZXRUaW1lWm9uZVNpZ24oKSA+IDAgPyAnKycgOiAnLSc7Ci0gICAgICAgICAgICAgICAgaSA9IF9wYWRUd29BcHBlbmQobWVzc2FnZSwgaSwgc3BlYy5nZXRUaW1lWm9uZUhvdXIoKSk7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZVtpKytdID0gJzonOwotICAgICAgICAgICAgICAgIGkgPSBfcGFkVHdvQXBwZW5kKG1lc3NhZ2UsIGksIHNwZWMuZ2V0VGltZVpvbmVNaW51dGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpdCB3b3VsZCBiZSBuaWNlIHRvIHVzZSAoMCwgaSwgbWVzc2FnZSkgY3RvciBpbnN0ZWFkCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKG1lc3NhZ2UsIDAsIGkpOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0RhdGVCdWlsZGVyLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0RhdGVCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMmI1YjMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEYXRlQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2MSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotCi0vKioKLSAqIFVzZWQgdG8gYnVpbGQge0BsaW5rIEdEYXRlIEdEYXRlc30uCi0gKiA8cD4KLSAqIExpa2UgR0RhdGUsIGEgR0RhdGVCdWlsZGVyIHJlcHJlc2VudHMgYW4gR3JlZ29yaWFuIERhdGUsIFRpbWUsCi0gKiBhbmQgVGltZXpvbmUsIG9yIHN1YnNldCBvZiBpbmZvcm1hdGlvbiAoWWVhciwgTW9udGgsIERheSwKLSAqIFRpbWUsIFRpbWV6b25lLCBvciBzb21lIGNvbWJpbmF0aW9uKS4gV2hlcmV2ZXIgaXQgcHJvdmlkZXMKLSAqIGd1aWRhbmNlLCB0aGUgWE1MIFNjaGVtYSAxLjAgc3BlY2lmaWNhdGlvbiAocGx1cyBwdWJsaXNoZWQKLSAqIGVycmF0YSkgaXMgZm9sbG93ZWQuCi0gKiA8cD4KLSAqIEluc3RhbmNlcyBtYXkgc2VwYXJhdGVseSBzZXQgb3IgY2xlYXIgdGhlIHllYXIsIG1vbnRoLAotICogZGF5LW9mLW1vbnRoLCBhbmQgdGltZS1vZi1kYXkuIE5vdCBhbGwgb3BlcmF0aW9ucyBhcmUKLSAqIG1lYW5pbmdmdWwgb24gYWxsIGNvbWJpbmF0aW9ucy4gSW4gcGFydGljdWxhciwgdGltZXpvbmUKLSAqIG5vcm1hbGl6YXRpb24gaXMgb25seSBwb3NzaWJsZSBpZiB0aGVyZSBpcyBhIHRpbWUsIG9yCi0gKiBhIHRpbWUgdG9nZXRoZXIgd2l0aCBhIGZ1bGwgZGF0ZS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEdEYXRlQnVpbGRlciBpbXBsZW1lbnRzIEdEYXRlU3BlY2lmaWNhdGlvbiwgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICAKLSAgICBwcml2YXRlIGludCBfYml0czsKLSAgICBwcml2YXRlIGludCBfQ1k7Ci0gICAgcHJpdmF0ZSBpbnQgX007Ci0gICAgcHJpdmF0ZSBpbnQgX0Q7Ci0gICAgcHJpdmF0ZSBpbnQgX2g7Ci0gICAgcHJpdmF0ZSBpbnQgX207Ci0gICAgcHJpdmF0ZSBpbnQgX3M7Ci0gICAgcHJpdmF0ZSBCaWdEZWNpbWFsIF9mczsKLSAgICBwcml2YXRlIGludCBfdHpzaWduOwotICAgIHByaXZhdGUgaW50IF90emg7Ci0gICAgcHJpdmF0ZSBpbnQgX3R6bTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBHRGF0ZUJ1aWxkZXIgc3BlY2lmeWluZyBubyBkYXRlIG9yIHRpbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGVCdWlsZGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGFub3RoZXIgR0RhdGVCdWlsZGVyIHdpdGggdGhlIHNhbWUgdmFsdWUKLSAgICAgKiBhcyB0aGlzIG9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgR0RhdGVCdWlsZGVyKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyBhIEdEYXRlIGZyb20gdGhpcyBHRGF0ZUJ1aWxkZXIuCi0gICAgICovCi0gICAgcHVibGljIEdEYXRlIHRvR0RhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHRGF0ZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1dHMgYSBHRGF0ZUJ1aWxkZXIgYnkgY29weWluZyBhbm90aGVyIEdEYXRlU3BlY2lmaWNhaXRvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGVCdWlsZGVyKEdEYXRlU3BlY2lmaWNhdGlvbiBnZGF0ZSkKLSAgICB7Ci0gICAgICAgIGlmIChnZGF0ZS5oYXNUaW1lWm9uZSgpKQotICAgICAgICAgICAgc2V0VGltZVpvbmUoZ2RhdGUuZ2V0VGltZVpvbmVTaWduKCksIGdkYXRlLmdldFRpbWVab25lSG91cigpLCBnZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpKTsKLQotICAgICAgICBpZiAoZ2RhdGUuaGFzVGltZSgpKQotICAgICAgICAgICAgc2V0VGltZShnZGF0ZS5nZXRIb3VyKCksIGdkYXRlLmdldE1pbnV0ZSgpLCBnZGF0ZS5nZXRTZWNvbmQoKSwgZ2RhdGUuZ2V0RnJhY3Rpb24oKSk7Ci0KLSAgICAgICAgaWYgKGdkYXRlLmhhc0RheSgpKQotICAgICAgICAgICAgc2V0RGF5KGdkYXRlLmdldERheSgpKTsKLQotICAgICAgICBpZiAoZ2RhdGUuaGFzTW9udGgoKSkKLSAgICAgICAgICAgIHNldE1vbnRoKGdkYXRlLmdldE1vbnRoKCkpOwotCi0gICAgICAgIGlmIChnZGF0ZS5oYXNZZWFyKCkpCi0gICAgICAgICAgICBzZXRZZWFyKGdkYXRlLmdldFllYXIoKSk7Ci0gICAgfQotCi0gICAgLy8gRm9ybXM6Ci0KLSAgICAvLyBEYXRlIHBhcnQ6Ci0gICAgLy8gWWVhcjogICAgICAgKC0/XGR7NCx9KQotICAgIC8vIFllYXJNb250aDogICgtP1xkezQsfSktKFxkezJ9KQotICAgIC8vIERhdGU6ICAgICAgICgtP1xkezQsfSktKFxkezJ9KS0oXGR7Mn0pCi0gICAgLy8gTW9udGg6ICAgICAgLS0oXGR7Mn0pKC0tKT8gICAgICAgICAgICAgIC8vZXJyYXRhIFItNDgKLSAgICAvLyBNb250aERheTogICAtLShcZHsyfSktKFxkezJ9KQotICAgIC8vIERheTogICAgICAgIC0tLShcZHsyfSkKLQotICAgIC8vIFRpbWUgcGFydDoKLSAgICAvLyBUaW1lOiAgICAgICAoXGR7Mn0pOihcZHsyfSk6KFxkezJ9KSguXGQqKT8KLQotICAgIC8vIFRpbWV6b25lIHBhcnQ6Ci0gICAgLy8gVFo6ICAgICAgICAgKFopfChbKy1dXGR7Mn0pOihcZHsyfSkKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBHRGF0ZUJ1aWxkZXIgZnJvbSBhIGxleGljYWwKLSAgICAgKiByZXByZXNlbnRhdGlvbi4gVGhlIGxleGljYWwgc3BhY2UgY29udGFpbnMgdGhlCi0gICAgICogdW5pb24gb2YgdGhlIGxleGljYWwgc3BhY2VzIG9mIGFsbCB0aGUgc2NoZW1hCi0gICAgICogZGF0ZS90aW1lIHR5cGVzIChleGNlcHQgZm9yIGR1cmF0aW9uKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGVCdWlsZGVyKENoYXJTZXF1ZW5jZSBzdHJpbmcpCi0gICAgewotICAgICAgICB0aGlzKG5ldyBHRGF0ZShzdHJpbmcpKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBHRGF0ZUJ1aWxkZXIoQ2FsZW5kYXIgY2FsZW5kYXIpCi0gICAgewotICAgICAgICB0aGlzKG5ldyBHRGF0ZShjYWxlbmRhcikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBHRGF0ZUJ1aWxkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHllYXIsIG1vbnRoLCBkYXksCi0gICAgICogaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBvcHRpb25hbCBmcmFjdGlvbmFsIHNlY29uZHMsIGluCi0gICAgICogYW4gdW5zcGVjaWZpZWQgdGltZXpvbmUuCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IGJ5IG5vdCBzcGVjaWZ5aW5nIHRoZSB0aW1lem9uZSB0aGUgR0RhdGVCdWlsZGVyCi0gICAgICogYmVjb21lcyBwYXJ0aWFsbHkgdW5vcmRlcmVkIHdpdGggcmVzcGVjdCB0byB0aW1lc3RoYXQgZG8gaGF2ZSBhCi0gICAgICogc3BlY2lmaWVkIHRpbWV6b25lLgotICAgICAqIAotICAgICAqIEBwYXJhbSB5ZWFyIFRoZSB5ZWFyCi0gICAgICogQHBhcmFtIG1vbnRoIFRoZSBtb250aCwgZnJvbSAxLTEyCi0gICAgICogQHBhcmFtIGRheSBUaGUgZGF5IG9mIG1vbnRoLCBmcm9tIDEtMzEKLSAgICAgKiBAcGFyYW0gaG91ciBUaGUgaG91ciBvZiBkYXksIGZyb20gMC0yMwotICAgICAqIEBwYXJhbSBtaW51dGUgVGhlIG1pbnV0ZSBvZiBob3VyLCBmcm9tIDAtNTkKLSAgICAgKiBAcGFyYW0gc2Vjb25kIFRoZSBzZWNvbmQgb2YgbWludXRlLCBmcm9tIDAtNTkKLSAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIGZyYWN0aW9uIG9mIHNlY29uZCwgMC4wIHRvIDAuOTk5Li4uIChtYXkgYmUgbnVsbCkgCi0gICAgICovCi0gICAgcHVibGljIEdEYXRlQnVpbGRlcigKLSAgICAgICAgICAgIGludCB5ZWFyLAotICAgICAgICAgICAgaW50IG1vbnRoLAotICAgICAgICAgICAgaW50IGRheSwKLSAgICAgICAgICAgIGludCBob3VyLAotICAgICAgICAgICAgaW50IG1pbnV0ZSwKLSAgICAgICAgICAgIGludCBzZWNvbmQsCi0gICAgICAgICAgICBCaWdEZWNpbWFsIGZyYWN0aW9uKQotICAgIHsKLSAgICAgICAgX2JpdHMgPSBIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkgfCBIQVNfVElNRTsKLQotICAgICAgICBfQ1kgPSB5ZWFyOwotICAgICAgICBfTSA9IG1vbnRoOwotICAgICAgICBfRCA9IGRheTsKLSAgICAgICAgX2ggPSBob3VyOwotICAgICAgICBfbSA9IG1pbnV0ZTsKLSAgICAgICAgX3MgPSBzZWNvbmQ7Ci0gICAgICAgIF9mcyA9IGZyYWN0aW9uID09IG51bGwgPyBHRGF0ZS5femVybyA6IGZyYWN0aW9uOwotCi0gICAgICAgIGlmICghaXNWYWxpZCgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gYWJzb2x1dGUgR0RhdGVCdWlsZGVyIHdpdGggdGhlIHNwZWNpZmllZCB5ZWFyLAotICAgICAqIG1vbnRoLCBkYXksIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgb3B0aW9uYWwgZnJhY3Rpb25hbAotICAgICAqIHNlY29uZHMsIGFuZCBpbiB0aGUgdGltZXpvbmUgc3BlY2lmaWVkLgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB5b3UgY2FuIHJlZXhwcmVzcyB0aGUgR0RhdGVCdWlsZGVyIGluIGFueSB0aW1lem9uZSB1c2luZwotICAgICAqIG5vcm1hbGl6ZVRvVGltZVpvbmUoKS4gVGhlIG5vcm1hbGl6ZSgpIG1ldGhvZCBub3JtYWxpemVzIHRvIFVUQy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB5b3Ugd2lzaCB0byBoYXZlIGEgdGltZSBvciBkYXRlIHRoYXQgaXNuJ3QgaW4gYSBzcGVjaWZpZWQgdGltZXpvbmUsCi0gICAgICogdGhlbiB1c2UgdGhlIGNvbnN0cnVjdG9yIHRoYXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgdGltZXpvbmUgYXJndW1lbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIHllYXIgdGhlIHllYXIKLSAgICAgKiBAcGFyYW0gbW9udGggdGhlIG1vbnRoLCBmcm9tIDEtMTIKLSAgICAgKiBAcGFyYW0gZGF5IHRoZSBkYXkgb2YgbW9udGgsIGZyb20gMS0zMQotICAgICAqIEBwYXJhbSBob3VyIHRoZSBob3VyIG9mIGRheSwgZnJvbSAwLTIzCi0gICAgICogQHBhcmFtIG1pbnV0ZSB0aGUgbWludXRlIG9mIGhvdXIsIGZyb20gMC01OQotICAgICAqIEBwYXJhbSBzZWNvbmQgdGhlIHNlY29uZCBvZiBtaW51dGUsIGZyb20gMC01OQotICAgICAqIEBwYXJhbSBmcmFjdGlvbiB0aGUgZnJhY3Rpb24gb2Ygc2Vjb25kLCAwLjAgdG8gMC45OTkuLi4gKG1heSBiZSBudWxsKQotICAgICAqIEBwYXJhbSB0elNpZ24gdGhlIHRpbWV6b25lIG9mZnNldCBzaWduLCBlaXRoZXIgKzEsIDAsIG9yIC0xCi0gICAgICogQHBhcmFtIHR6SG91ciB0aGUgdGltZXpvbmUgb2Zmc2V0IGhvdXIKLSAgICAgKiBAcGFyYW0gdHpNaW51dGUgdGhlIHRpbWV6b25lIG9mZnNldCBtaW51dGUgCi0gICAgICovCi0gICAgcHVibGljIEdEYXRlQnVpbGRlcigKLSAgICAgICAgICAgIGludCB5ZWFyLAotICAgICAgICAgICAgaW50IG1vbnRoLAotICAgICAgICAgICAgaW50IGRheSwKLSAgICAgICAgICAgIGludCBob3VyLAotICAgICAgICAgICAgaW50IG1pbnV0ZSwKLSAgICAgICAgICAgIGludCBzZWNvbmQsCi0gICAgICAgICAgICBCaWdEZWNpbWFsIGZyYWN0aW9uLAotICAgICAgICAgICAgaW50IHR6U2lnbiwKLSAgICAgICAgICAgIGludCB0ekhvdXIsCi0gICAgICAgICAgICBpbnQgdHpNaW51dGUpCi0gICAgewotICAgICAgICBfYml0cyA9IEhBU19USU1FWk9ORSB8IEhBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWSB8IEhBU19USU1FOwotCi0gICAgICAgIF9DWSA9IHllYXI7Ci0gICAgICAgIF9NID0gbW9udGg7Ci0gICAgICAgIF9EID0gZGF5OwotICAgICAgICBfaCA9IGhvdXI7Ci0gICAgICAgIF9tID0gbWludXRlOwotICAgICAgICBfcyA9IHNlY29uZDsKLSAgICAgICAgX2ZzID0gZnJhY3Rpb24gPT0gbnVsbCA/IEdEYXRlLl96ZXJvIDogZnJhY3Rpb247Ci0gICAgICAgIF90enNpZ24gPSB0elNpZ247Ci0gICAgICAgIF90emggPSB0ekhvdXI7Ci0gICAgICAgIF90em0gPSB0ek1pbnV0ZTsKLQotICAgICAgICBpZiAoIWlzVmFsaWQoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgR0RhdGVCdWlsZGVyIGJhc2VkIG9uIGEgamF2YS51dGlsLkRhdGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGN1cnJlbnQgb2Zmc2V0IG9mIHRoZSBkZWZhdWx0IHRpbWV6b25lIGlzIHVzZWQgYXMgdGhlIHRpbWV6b25lLgotICAgICAqIDxwPgotICAgICAqIEZvciBleGFtcGxlLCBpZiBlYXN0ZXJuIGRheWxpZ2h0IHRpbWUgaXMgaW4gZWZmZWN0IGF0IHRoZSBnaXZlbgotICAgICAqIGRhdGUsIHRoZSB0aW1lem9uZSBvbiB0aGUgZWFzdCBjb2FzdCBvZiB0aGUgdW5pdGVkIHN0YXRlcwotICAgICAqIHRyYW5zbGF0ZXMgdG8gR01ULTA1OjAwIChFU1QpICsgMTowMCAoRFQgb2Zmc2V0KSA9PSBHTVQtMDQ6MDAuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRhdGUgdGhlIGRhdGUgb2JqZWN0IHRvIGNvcHkKLSAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGVCdWlsZGVyKERhdGUgZGF0ZSkKLSAgICB7Ci0gICAgICAgIHNldERhdGUoZGF0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgaW5zdGFuY2UgaXMgaW1tdXRhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSW1tdXRhYmxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY29tYmluYXRpb24gb2YgZmxhZ3MgaW5kaWNhdGluZyB0aGUgaW5mb3JtYXRpb24KLSAgICAgKiBjb250YWluZWQgYnkgdGhpcyBHRGF0ZS4gIFRoZSBmaXZlIGZsYWdzIGFyZQotICAgICAqIEhBU19USU1FWk9ORSwgSEFTX1lFQVIsIEhBU19NT05USCwgSEFTX0RBWSwgYW5kIEhBU19USU1FLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RmxhZ3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9iaXRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSB0aW1lem9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNUaW1lWm9uZSgpCi0gICAgICAgIHsgcmV0dXJuICgoX2JpdHMgJiBIQVNfVElNRVpPTkUpICE9IDApOyB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgZGF0ZS90aW1lIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgeWVhci4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNZZWFyKCkKLSAgICAgICAgeyByZXR1cm4gKChfYml0cyAmIEhBU19ZRUFSKSAhPSAwKTsgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIG1vbnRoLW9mLXllYXIuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9udGgoKQotICAgICAgICB7IHJldHVybiAoKF9iaXRzICYgSEFTX01PTlRIKSAhPSAwKTsgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIGRheS1vZi1tb250aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNEYXkoKQotICAgICAgICB7IHJldHVybiAoKF9iaXRzICYgSEFTX0RBWSkgIT0gMCk7IH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSB0aW1lLW9mLWRheS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNUaW1lKCkKLSAgICAgICAgeyByZXR1cm4gKChfYml0cyAmIEhBU19USU1FKSAhPSAwKTsgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIGZ1bGwgZGF0ZSAoeWVhciwgbW9udGgsIGRheSkKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNEYXRlKCkKLSAgICAgICAgeyByZXR1cm4gKChfYml0cyAmIChIQVNfREFZIHwgSEFTX01PTlRIIHwgSEFTX1lFQVIpKSA9PSAoSEFTX0RBWSB8IEhBU19NT05USCB8IEhBU19ZRUFSKSk7IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHllYXIuIFNob3VsZCBiZSBhIGZvdXItZGlnaXQgeWVhciBzcGVjaWZpY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0WWVhcigpCi0gICAgICAgIHsgcmV0dXJuIF9DWTsgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1vbnRoLW9mLXllYXIuIEphbnVhcnkgaXMgMS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldE1vbnRoKCkKLSAgICAgICAgeyByZXR1cm4gX007ICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkYXktb2YtbW9udGguIFRoZSBmaXJzdCBkYXkgb2YgZWFjaCBtb250aCBpcyAxLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RGF5KCkKLSAgICAgICAgeyByZXR1cm4gX0Q7IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhvdXItb2YtZGF5LiBNaWRuaWdodCBpcyAwLCBhbmQgMTFQTSBpcyAyMy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEhvdXIoKQotICAgICAgICB7IHJldHVybiBfaDsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWludXRlLW9mLWhvdXIuIFJhbmdlIGZyb20gMCB0byA1OS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldE1pbnV0ZSgpCi0gICAgICAgIHsgcmV0dXJuIF9tOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZWNvbmQtb2YtbWludXRlLiBSYW5nZSBmcm9tIDAgdG8gNTkuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRTZWNvbmQoKQotICAgICAgICB7IHJldHVybiBfczsgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmcmFjdGlvbi1vZi1zZWNvbmQuIFJhbmdlIGZyb20gMCAoaW5jbHVzaXZlKSB0byAxIChleGNsdXNpdmUpLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBCaWdEZWNpbWFsIGdldEZyYWN0aW9uKCkKLSAgICAgICAgeyByZXR1cm4gX2ZzOyB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdW5kZWQgbWlsbGlzZWNvbmQgdmFsdWUuIFJhbmdlIGZyb20gMCB0byA5OTkKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldE1pbGxpc2Vjb25kKCkKLSAgICB7Ci0gICAgICAgIGlmIChfZnMgPT0gbnVsbCB8fCBfZnMgPT0gR0RhdGUuX3plcm8pCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIF9mcy5zZXRTY2FsZSgzLCBCaWdEZWNpbWFsLlJPVU5EX0hBTEZfVVApLnVuc2NhbGVkVmFsdWUoKS5pbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbWUgem9uZSBzaWduLiBGb3IgdGltZSB6b25lcyBlYXN0IG9mIEdNVCwKLSAgICAgKiB0aGlzIGlzIHBvc2l0aXZlOyBmb3IgdGltZSB6b25lcyB3ZXN0LCB0aGlzIGlzIG5lZ2F0aXZlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VGltZVpvbmVTaWduKCkKLSAgICAgICAgeyByZXR1cm4gX3R6c2lnbjsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZSB6b25lIGhvdXIuCi0gICAgICogVGhpcyBpcyBhbHdheXMgcG9zaXRpdmU6IGZvciB0aGUgc2lnbiwgbG9vayBhdAotICAgICAqIGdldFRpbWVab25lU2lnbigpLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VGltZVpvbmVIb3VyKCkKLSAgICAgICAgeyByZXR1cm4gX3R6aDsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZSB6b25lIG1pbnV0ZXMuCi0gICAgICogVGhpcyBpcyBhbHdheXMgcG9zaXRpdmU6IGZvciB0aGUgc2lnbiwgbG9vayBhdAotICAgICAqIGdldFRpbWVab25lU2lnbigpLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VGltZVpvbmVNaW51dGUoKQotICAgICAgICB7IHJldHVybiBfdHptOyB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB5ZWFyLiBTaG91bGQgYmUgYSBmb3VyLWRpZ2l0IHllYXIgc3BlY2lmaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0geWVhciB0aGUgeWVhcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFllYXIoaW50IHllYXIpCi0gICAgewotICAgICAgICBpZiAoeWVhciA8IC00NzEyIHx8IHllYXIgPiA5OTk5OTkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ5ZWFyIG91dCBvZiByYW5nZSIpOwotICAgICAgICBfYml0cyB8PSBIQVNfWUVBUjsgX0NZID0geWVhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtb250aC1vZi15ZWFyLiBKYW51YXJ5IGlzIDEuCi0gICAgICogQHBhcmFtIG1vbnRoIHRoZSBtb250aCwgZnJvbSAxLTEyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TW9udGgoaW50IG1vbnRoKQotICAgIHsKLSAgICAgICAgaWYgKG1vbnRoIDwgMSB8fCBtb250aCA+IDEyKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibW9udGggb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgIF9iaXRzIHw9IEhBU19NT05USDsgX00gPSBtb250aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkYXktb2YtbW9udGguIFRoZSBmaXJzdCBkYXkgb2YgZWFjaCBtb250aCBpcyAxLgotICAgICAqIEBwYXJhbSBkYXkgdGhlIGRheSBvZiBtb250aCwgZnJvbSAxLTMxCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGF5KGludCBkYXkpCi0gICAgewotICAgICAgICBpZiAoZGF5IDwgMSB8fCBkYXkgPiAzMSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRheSBvdXQgb2YgcmFuZ2UiKTsKLSAgICAgICAgX2JpdHMgfD0gSEFTX0RBWTsgX0QgPSBkYXk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGltZS4gSG91cnMgaW4gdGhlIGRheSByYW5nZSBmcm9tIDAgdG8gMjM7Ci0gICAgICogbWludXRlcyBhbmQgc2Vjb25kcyByYW5nZSBmcm9tIDAgdG8gNTk7IGFuZCBmcmFjdGlvbmFsCi0gICAgICogc2Vjb25kcyByYW5nZSBmcm9tIDAgKGluY2x1c2l2ZSkgdG8gMSAoZXhjbHVzaXZlKS4KLSAgICAgKiBUaGUgZnJhY3Rpb24gY2FuIGJlIG51bGwgYW5kIGlzIGFzc3VtZWQgdG8gYmUgemVyby4KLSAgICAgKiBAcGFyYW0gaG91ciB0aGUgaG91ciBvZiBkYXksIGZyb20gMC0yMwotICAgICAqIEBwYXJhbSBtaW51dGUgdGhlIG1pbnV0ZSBvZiBob3VyLCBmcm9tIDAtNTkKLSAgICAgKiBAcGFyYW0gc2Vjb25kIHRoZSBzZWNvbmQgb2YgbWludXRlLCBmcm9tIDAtNTkKLSAgICAgKiBAcGFyYW0gZnJhY3Rpb24gdGhlIGZyYWN0aW9uIG9mIHNlY29uZCwgMC4wIHRvIDAuOTk5Li4uIChtYXkgYmUgbnVsbCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaW1lKGludCBob3VyLCBpbnQgbWludXRlLCBpbnQgc2Vjb25kLCBCaWdEZWNpbWFsIGZyYWN0aW9uKQotICAgIHsKLSAgICAgICAgaWYgKGhvdXIgPCAwIHx8IGhvdXIgPiAyMykKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImhvdXIgb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgIGlmIChtaW51dGUgPCAwIHx8IG1pbnV0ZSA+IDU5KQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWludXRlIG91dCBvZiByYW5nZSIpOwotICAgICAgICBpZiAoc2Vjb25kIDwgMCB8fCBzZWNvbmQgPiA1OSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlY29uZCBvdXQgb2YgcmFuZ2UiKTsKLSAgICAgICAgaWYgKGZyYWN0aW9uICE9IG51bGwgJiYgKGZyYWN0aW9uLnNpZ251bSgpIDwgMCB8fCBmcmFjdGlvbi5jb21wYXJlVG8oR0RhdGUuX29uZSkgPiAxKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZyYWN0aW9uIG91dCBvZiByYW5nZSIpOwotICAgICAgICBfYml0cyB8PSBIQVNfVElNRTsKLSAgICAgICAgX2ggPSBob3VyOwotICAgICAgICBfbSA9IG1pbnV0ZTsKLSAgICAgICAgX3MgPSBzZWNvbmQ7Ci0gICAgICAgIF9mcyA9IGZyYWN0aW9uID09IG51bGwgPyBHRGF0ZS5femVybyA6IGZyYWN0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRpbWUgem9uZSB3aXRob3V0IGNoYW5naW5nIHRoZSBvdGhlciB0aW1lCi0gICAgICogZmllbGRzLiBJZiB5b3Ugd2l0aCB0byBhZGp1c3Qgb3RoZXIgdGltZSBmaWVsZHMgdG8gZXhwcmVzcwotICAgICAqIHRoZSBzYW1lIGFjdHVhbCBtb21lbnQgaW4gdGltZSBpbiBhIGRpZmZlcmVudCB0aW1lIHpvbmUsCi0gICAgICogdXNlIG5vcm1hbGl6ZVRvVGltZVpvbmUuCi0gICAgICogPHA+Ci0gICAgICogVGltZXpvbmVzIG11c3QgYmUgYmV0d2VlbiAtMTQ6MDAgYW5kICsxNDowMC4gU2lnbgotICAgICAqIG11c3QgYmUgLTEgb3IgMSAob3IgMCBmb3IgVVRDIG9ubHkpLCBhbmQgdGhlIG9mZnNldCBob3VycwotICAgICAqIGFuZCBtaW51dGUgYXJndW1lbnRzIG11c3QgYmUgbm9ubmVnYXRpdmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHR6U2lnbiB0aGUgdGltZXpvbmUgb2Zmc2V0IHNpZ24sIGVpdGhlciArMSwgMCwgb3IgLTEKLSAgICAgKiBAcGFyYW0gdHpIb3VyIHRoZSB0aW1lem9uZSBvZmZzZXQgaG91cgotICAgICAqIEBwYXJhbSB0ek1pbnV0ZSB0aGUgdGltZXpvbmUgb2Zmc2V0IG1pbnV0ZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaW1lWm9uZShpbnQgdHpTaWduLCBpbnQgdHpIb3VyLCBpbnQgdHpNaW51dGUpCi0gICAgewotICAgICAgICBpZiAoISgodHpTaWduID09IDAgJiYgdHpIb3VyID09IDAgJiYgdHpNaW51dGUgPT0gMCkgfHwKLSAgICAgICAgICAgICAgKCh0elNpZ24gPT0gLTEgfHwgdHpTaWduID09IDEpICYmCi0gICAgICAgICAgICAgICAodHpIb3VyID49IDAgJiYgdHpNaW51dGUgPj0gMCkgJiYKLSAgICAgICAgICAgICAgICh0ekhvdXIgPT0gMTQgJiYgdHpNaW51dGUgPT0gMCB8fCB0ekhvdXIgPCAxNCAmJiB0ek1pbnV0ZSA8IDYwKSkpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGltZSB6b25lIG91dCBvZiByYW5nZSAoLTE0OjAwIHRvICsxNDowMCkuICgiICsKLSAgICAgICAgICAgICAgICAodHpTaWduPDAgPyAiLSIgOiAiKyIpICsgdHpIb3VyICsgIjoiICsgdHpNaW51dGUgKyAiKSIpOwotCi0gICAgICAgIF9iaXRzIHw9IEhBU19USU1FWk9ORTsKLSAgICAgICAgX3R6c2lnbiA9IHR6U2lnbjsKLSAgICAgICAgX3R6aCA9IHR6SG91cjsKLSAgICAgICAgX3R6bSA9IHR6TWludXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgeWVhci4gQWZ0ZXIgY2xlYXJpbmcsIGhhc1llYXIgcmV0dXJucyBmYWxzZSBhbmQgdGhlCi0gICAgICogdmFsdWUgb2YgZ2V0WWVhciBpcyB1bmRlZmluZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJZZWFyKCkKLSAgICAgICAgeyBfYml0cyAmPSB+SEFTX1lFQVI7IF9DWSA9IDA7ICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIG1vbnRoLW9mLXllYXIuIEFmdGVyIGNsZWFyaW5nLiBoYXNNb250aCByZXR1cm5zIGZhbHNlIGFuZAotICAgICAqIHRoZSB2YWx1ZSBvZiBnZXRNb250aCBpcyB1bmRlZmluZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJNb250aCgpCi0gICAgICAgIHsgX2JpdHMgJj0gfkhBU19NT05USDsgX00gPSAwOyAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBkYXktb2YtbW9udGguIEFmdGVyIGNsZWFyaW5nLiBoYXNEYXkgcmV0dXJucyBmYWxzZSBhbmQKLSAgICAgKiB0aGUgdmFsdWUgb2YgZ2V0RGF5IGlzIHVuZGVmaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhckRheSgpCi0gICAgICAgIHsgX2JpdHMgJj0gfkhBU19EQVk7IF9EID0gMDsgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgdGltZS1vZi1kYXkuCi0gICAgICogQWZ0ZXIgY2xlYXJpbmcuIGhhc1RpbWUgcmV0dXJucyBmYWxzZSBhbmQKLSAgICAgKiB0aGUgdmFsdWUgb2YgZ2V0VGltZSBpcyB1bmRlZmluZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJUaW1lKCkKLSAgICB7Ci0gICAgICAgIF9iaXRzICY9IH5IQVNfVElNRTsKLSAgICAgICAgX2ggPSAwOwotICAgICAgICBfbSA9IDA7Ci0gICAgICAgIF9zID0gMDsKLSAgICAgICAgX2ZzID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIHRpbWV6b25lLiBBZnRlciBjbGVhcmluZy4gaGFzVGltZVpvbmUgcmV0dXJucyBmYWxzZSBhbmQKLSAgICAgKiB0aGUgdmFsdWUgb2YgZ2V0VGltZVpvbmVIb3VyIGFuZCBnZXRUaW1lWm9uZU1pbnV0ZSBhcmUgdW5kZWZpbmVkLgotICAgICAqIERvZXMgbm90IGNoYW5nZSB0aGUgb3RoZXIgdGltZSBmaWVsZHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJUaW1lWm9uZSgpCi0gICAgewotICAgICAgICBfYml0cyAmPSB+SEFTX1RJTUVaT05FOwotICAgICAgICBfdHpzaWduID0gMDsKLSAgICAgICAgX3R6aCA9IDA7Ci0gICAgICAgIF90em0gPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgYWxsIGRhdGUgZmllbGRzIGxpZSB3aXRoaW4gdGhlaXIgbGVnYWwgcmFuZ2VzLiAgQSBHRGF0ZUJ1aWxkZXIKLSAgICAgKiBjYW4gYmUgaW52YWxpZCwgZm9yIGV4YW1wbGUsIGlmIHlvdSBjaGFuZ2UgdGhlIG1vbnRoIHRvIEZlYnJ1YXJ5Ci0gICAgICogYW5kIHRoZSBkYXktb2YtbW9udGggaXMgMzEuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpCi0gICAgewotICAgICAgICByZXR1cm4gaXNWYWxpZEdEYXRlKHRoaXMpOwotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNWYWxpZEdEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiBkYXRlKQotICAgIHsKLSAgICAgICAgaWYgKGRhdGUuaGFzTW9udGgoKSAmJiAoZGF0ZS5nZXRNb250aCgpIDwgMSB8fCBkYXRlLmdldE1vbnRoKCkgPiAxMikpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGRhdGUuaGFzRGF5KCkgJiYgKGRhdGUuZ2V0RGF5KCkgPCAxIHx8IGRhdGUuZ2V0RGF5KCkgPiAzMSB8fAotICAgICAgICAgICAgZGF0ZS5nZXREYXkoKSA+IDI4ICYmIGRhdGUuaGFzTW9udGgoKSAmJgotICAgICAgICAgICAgICAgIChkYXRlLmhhc1llYXIoKSA/IGRhdGUuZ2V0RGF5KCkgPiBfbWF4RGF5SW5Nb250aEZvcihkYXRlLmdldFllYXIoKSwgZGF0ZS5nZXRNb250aCgpKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZS5nZXREYXkoKSA+IF9tYXhEYXlJbk1vbnRoKGRhdGUuZ2V0TW9udGgoKSkpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoZGF0ZS5oYXNUaW1lKCkgJiYgKGRhdGUuZ2V0SG91cigpIDwgMCB8fCBkYXRlLmdldEhvdXIoKSA+IDIzIHx8Ci0gICAgICAgICAgICBkYXRlLmdldE1pbnV0ZSgpIDwgMCB8fCBkYXRlLmdldE1pbnV0ZSgpID4gNTkgfHwKLSAgICAgICAgICAgIGRhdGUuZ2V0U2Vjb25kKCkgPCAwIHx8IGRhdGUuZ2V0U2Vjb25kKCkgPiA1OSB8fAotICAgICAgICAgICAgZGF0ZS5nZXRGcmFjdGlvbigpLnNpZ251bSgpIDwgMCB8fCBkYXRlLmdldEZyYWN0aW9uKCkuY29tcGFyZVRvKEdEYXRlLl9vbmUpID49IDApKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmIChkYXRlLmhhc1RpbWVab25lKCkgJiYKLSAgICAgICAgICAgICghKChkYXRlLmdldFRpbWVab25lU2lnbigpID09IDAgJiYgZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSA9PSAwICYmIGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSA9PSAwKSB8fAotICAgICAgICAgICAgICAoKGRhdGUuZ2V0VGltZVpvbmVTaWduKCkgPT0gLTEgfHwgZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKSA9PSArMSkgJiYKLSAgICAgICAgICAgICAgICAvLyBOQjogYWxsb3cgKzAwOjAwIGFuZCAtMDA6MDAKLSAgICAgICAgICAgICAgICAvLyAoZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSA9PSAwICYmIGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSA+IDAgfHwgZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSA+IDAgJiYgZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpID49IDApICYmCi0gICAgICAgICAgICAgICAoZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSA+PSAwICYmIGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSA+PSAwKSAmJgotICAgICAgICAgICAgICAgKGRhdGUuZ2V0VGltZVpvbmVIb3VyKCkgPT0gMTQgJiYgZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpID09IDAgfHwgZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSA8IDE0ICYmIGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSA8IDYwKSkpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAvLyBldmVyeXRpbmcgbG9va3Mga29zaGVyCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogTm9ybWFsaXplcyB0aGUgaW5zdGFuY2UsIGVuc3VyaW5nIGRhdGUgYW5kIHRpbWUgZmllbGRzIGFyZSB3aXRoaW4KLSAgICAgKiB0aGVpciBub3JtYWwgcmFuZ2VzLgotICAgICAqIDxwPgotICAgICAqIElmIG5vIHRpbWV6b25lIG9yIG5vIHRpbWUgaXMgc3BlY2lmaWVkLCBvciBpZiBhIHBhcnRpYWwgZGF0ZSBpcyBzcGVjaWZpZWQsIHRoaXMKLSAgICAgKiBtZXRob2QgZG9lcyBub3RoaW5nLCBhbmQgbGVhdmVzIHRoZSB0aW1lem9uZSBpbmZvcm1hdGlvbiBhcy1pcy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiBhIHRpbWUgb3IgdGltZSBhbmQgZGF0ZSBpcyBzcGVjaWZpZWQsIHRoaXMgbWV0aG9kIG5vcm1hbGl6ZXMgdGhlIHRpbWV6b25lCi0gICAgICogdG8gVVRDLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vcm1hbGl6ZSgpCi0gICAgewotICAgICAgICAvLyBEYXRlVGltZSBvciBUaW1lLCB3aXRoIFRpbWVab25lOiBub3JtYWxpemUgdG8gVVRDLgotICAgICAgICAvLyBJbiB0aGUgcHJvY2VzcyBhbGwgdGhlIGZpZWxkcyB3aWxsIGJlIG5vcm1hbGl6ZWQuCi0gICAgICAgIGlmIChoYXNEYXkoKSA9PSBoYXNNb250aCgpICYmIGhhc0RheSgpID09IGhhc1llYXIoKSAmJgotICAgICAgICAgICAgaGFzVGltZVpvbmUoKSAmJiBoYXNUaW1lKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5vcm1hbGl6ZVRvVGltZVpvbmUoMCwgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBObyB0aW1lem9uZSwgb3IgaW5jb21wbGV0ZSBkYXRlLgotICAgICAgICAgICAgbG9uZyBjYXJyeSA9IDA7Ci0KLSAgICAgICAgICAgIGlmIChoYXNUaW1lKCkpCi0gICAgICAgICAgICAgICAgY2FycnkgPSBfbm9ybWFsaXplVGltZSgpOwotCi0gICAgICAgICAgICBpZiAoaGFzRGF5KCkpCi0gICAgICAgICAgICAgICAgX0QgKz0gY2Fycnk7Ci0KLSAgICAgICAgICAgIGlmIChoYXNEYXRlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX25vcm1hbGl6ZURhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGhhc01vbnRoKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gd2l0aCBpbmNvbXBsZXRlIGRhdGVzLCBqdXN0IG1vbnRocyBjYW4gYmUgbm9ybWFsaXplZDoKLSAgICAgICAgICAgICAgICAvLyBkYXlzIHN0YXkgZGVub3JtYWxpemVkLgotICAgICAgICAgICAgICAgIGlmIChfTSA8IDEgfHwgX00gPiAxMikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB0ZW1wID0gX007Ci0gICAgICAgICAgICAgICAgICAgIF9NID0gX21vZHVsbyh0ZW1wLCAxLCAxMyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYXNZZWFyKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBfQ1kgPSBfQ1kgKyAoaW50KV9mUXVvdGllbnQodGVtcCwgMSwgMTMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB6ZXJvcyBmcm9tIGZyYWN0aW9uYWwgc2Vjb25kcwotICAgICAgICBpZiAoaGFzVGltZSgpICYmIF9mcyAhPSBudWxsICYmIF9mcy5zY2FsZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9mcy5zaWdudW0oKSA9PSAwKQotICAgICAgICAgICAgICAgIF9mcyA9IEdEYXRlLl96ZXJvOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgYmkgPSBfZnMudW5zY2FsZWRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBzdHIgPSBiaS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGludCBsYXN0emVybzsKLSAgICAgICAgICAgICAgICBmb3IgKGxhc3R6ZXJvID0gc3RyLmxlbmd0aCgpOyBsYXN0emVybyA+IDA7IGxhc3R6ZXJvIC09IDEpCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHIuY2hhckF0KGxhc3R6ZXJvIC0gMSkgIT0gJzAnKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3R6ZXJvIDwgc3RyLmxlbmd0aCgpKQotICAgICAgICAgICAgICAgICAgICBfZnMgPSBfZnMuc2V0U2NhbGUoX2ZzLnNjYWxlKCkgLSBzdHIubGVuZ3RoKCkgKyBsYXN0emVybyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgdGltZSBhbmQgdGltZXpvbmUgYXJlIGtub3duLCB0aGlzIG1ldGhvZCBjaGFuZ2VzIHRoZSB0aW1lem9uZSB0byB0aGUKLSAgICAgKiBzcGVjaWZpZWQgVVRDIG9mZnNldCwgYWx0ZXJpbmcgbWludXRlcywgaG91cnMsIGRheSwgbW9udGgsIGFuZCB5ZWFyIGFzCi0gICAgICogbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBhY3R1YWwgZGVzY3JpYmVkIG1vbWVudCBpbiB0aW1lIGlzIHRoZSBzYW1lLgotICAgICAqIDxwPgotICAgICAqIEl0IGlzIGFuIGVycm9yIHRvIG9wZXJhdGUgb24gaW5zdGFuY2VzIHdpdGhvdXQgYSB0aW1lIG9yIHRpbWV6b25lLCBvcgotICAgICAqIHdpdGggYSBwYXJ0aWFsbHkgc3BlY2lmaWVkIGRhdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHR6U2lnbiB0aGUgdGltZXpvbmUgb2Zmc2V0IHNpZ24sIGVpdGhlciArMSwgMCwgb3IgLTEKLSAgICAgKiBAcGFyYW0gdHpIb3VyIHRoZSB0aW1lem9uZSBvZmZzZXQgaG91cgotICAgICAqIEBwYXJhbSB0ek1pbnV0ZSB0aGUgdGltZXpvbmUgb2Zmc2V0IG1pbnV0ZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3JtYWxpemVUb1RpbWVab25lKGludCB0elNpZ24sIGludCB0ekhvdXIsIGludCB0ek1pbnV0ZSkKLSAgICB7Ci0gICAgICAgIGlmICghKCh0elNpZ24gPT0gMCAmJiB0ekhvdXIgPT0gMCAmJiB0ek1pbnV0ZSA9PSAwKSB8fAotICAgICAgICAgICAgICAoKHR6U2lnbiA9PSAtMSB8fCB0elNpZ24gPT0gMSkgJiYKLSAgICAgICAgICAgICAgICh0ekhvdXIgPT0gMCAmJiB0ek1pbnV0ZSA+IDAgfHwgdHpIb3VyID4gMCAmJiB0ek1pbnV0ZSA+PSAwKSAmJgotICAgICAgICAgICAgICAgKHR6SG91ciA9PSAxNCAmJiB0ek1pbnV0ZSA9PSAwIHx8IHR6SG91ciA8IDE0ICYmIHR6TWludXRlIDwgNjApKSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aW1lIHpvbmUgbXVzdCBiZSBiZXR3ZW4gLTE0OjAwIGFuZCArMTQ6MDAiKTsKLQotICAgICAgICBpZiAoIWhhc1RpbWVab25lKCkgfHwgIWhhc1RpbWUoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCBub3JtYWxpemUgdGltZSB6b25lIHdpdGhvdXQgYm90aCB0aW1lIGFuZCB0aW1lem9uZSIpOwotCi0gICAgICAgIGlmICghKGhhc0RheSgpID09IGhhc01vbnRoKCkgJiYgaGFzRGF5KCkgPT0gaGFzWWVhcigpKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCBkbyBkYXRlIG1hdGggd2l0aG91dCBhIGNvbXBsZXRlIGRhdGUiKTsKLQotICAgICAgICBpbnQgaHNoaWZ0ID0gdHpTaWduICogdHpIb3VyIC0gX3R6c2lnbiAqIF90emg7Ci0gICAgICAgIGludCBtc2hpZnQgPSB0elNpZ24gKiB0ek1pbnV0ZSAtIF90enNpZ24gKiBfdHptOwotCi0gICAgICAgIF90enNpZ24gPSB0elNpZ247Ci0gICAgICAgIF90emggPSB0ekhvdXI7Ci0gICAgICAgIF90em0gPSB0ek1pbnV0ZTsKLSAgICAgICAgYWRkRHVyYXRpb24oMSwgMCwgMCwgMCwgaHNoaWZ0LCBtc2hpZnQsIDAsIG51bGwpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGdpdmVuIGR1cmF0aW9uIHRvIHRoZSBkYXRlL3RpbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGR1cmF0aW9uIHRoZSBkdXJhdGlvbiB0byBhZGQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRHRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIGFkZER1cmF0aW9uKGR1cmF0aW9uLmdldFNpZ24oKSwgZHVyYXRpb24uZ2V0WWVhcigpLCBkdXJhdGlvbi5nZXRNb250aCgpLCBkdXJhdGlvbi5nZXREYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24uZ2V0SG91cigpLCBkdXJhdGlvbi5nZXRNaW51dGUoKSwgZHVyYXRpb24uZ2V0U2Vjb25kKCksIGR1cmF0aW9uLmdldEZyYWN0aW9uKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN1YnRyYWN0cyBhIGdpdmVuIGR1cmF0aW9uIGZyb20gdGhlIGRhdGUvdGltZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZHVyYXRpb24gdGhlIGR1cmF0aW9uIHRvIHN1YnRyYWN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3VidHJhY3RHRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIGFkZER1cmF0aW9uKC1kdXJhdGlvbi5nZXRTaWduKCksIGR1cmF0aW9uLmdldFllYXIoKSwgZHVyYXRpb24uZ2V0TW9udGgoKSwgZHVyYXRpb24uZ2V0RGF5KCksCi0gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLmdldEhvdXIoKSwgZHVyYXRpb24uZ2V0TWludXRlKCksIGR1cmF0aW9uLmdldFNlY29uZCgpLCBkdXJhdGlvbi5nZXRGcmFjdGlvbigpKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIE5vcm1hbGl6ZXMgdGhlIGRhdGUgYnkgY2Fycnlpbmcgb3ZlciB0byB0aGUgeWVhciBhbnkgbW9udGhzIG91dHNpZGUgMS4uMTIKLSAgICAgKiBhbmQgY2Fycnlpbmcgb3ZlciB0byB0aGUgbW9udGggYW55IGRheXMgb3V0c2lkZSAxLi4oZGF5cy1pbi1tb250aCkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIF9ub3JtYWxpemVEYXRlKCkKLSAgICB7Ci0gICAgICAgIGlmIChfTSA8IDEgfHwgX00gPiAxMiB8fCBfRCA8IDEgfHwgX0QgPiBfbWF4RGF5SW5Nb250aEZvcihfQ1ksIF9NKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZml4IG1vbnRocyBmaXJzdAotICAgICAgICAgICAgaW50IHRlbXAgPSBfTTsKLSAgICAgICAgICAgIF9NID0gX21vZHVsbyh0ZW1wLCAxLCAxMyk7Ci0gICAgICAgICAgICBfQ1kgPSBfQ1kgKyAoaW50KV9mUXVvdGllbnQodGVtcCwgMSwgMTMpOwotCi0gICAgICAgICAgICAvLyB0aGVuIHB1bGwgZGF5cyBvdXQKLSAgICAgICAgICAgIGludCBleHRyYWRheXMgPSBfRCAtIDE7Ci0gICAgICAgICAgICBfRCA9IDE7Ci0KLSAgICAgICAgICAgIC8vIHRoZW4gdXNlIHRoZSBqdWxpYW4gZGF0ZSBmdW5jdGlvbiB0byBmaXgKLSAgICAgICAgICAgIHNldEp1bGlhbkRhdGUoZ2V0SnVsaWFuRGF0ZSgpICsgZXh0cmFkYXlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vcm1hbGl6ZXMgdGltZSBzbyB0aGF0IGZyYWN0aW9ucyBhcmUgMC4uMShleGMpLCBzZWNvbmRzL21pbnV0ZXMgMC4uNTksCi0gICAgICogYW5kIGhvdXJzIDAuLjI0LiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF5cyB0byBjYXJyeSBvdmVyIGZyb20gbm9ybWFsaXppbmcKLSAgICAgKiBhd2F5IG1vcmUgdGhhbiAyNCBob3Vycy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGxvbmcgX25vcm1hbGl6ZVRpbWUoKQotICAgIHsKLSAgICAgICAgbG9uZyBjYXJyeSA9IDA7Ci0gICAgICAgIGxvbmcgdGVtcDsKLQotICAgICAgICAvLyBmcmFjdGlvbnMKLSAgICAgICAgaWYgKF9mcyAhPSBudWxsICYmIChfZnMuc2lnbnVtKCkgPCAwIHx8IF9mcy5jb21wYXJlVG8oR0RhdGUuX29uZSkgPj0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgYmRjYXJyeSA9IF9mcy5zZXRTY2FsZSgwLCBCaWdEZWNpbWFsLlJPVU5EX0ZMT09SKTsKLSAgICAgICAgICAgIF9mcyA9IF9mcy5zdWJ0cmFjdChiZGNhcnJ5KTsKLSAgICAgICAgICAgIGNhcnJ5ID0gYmRjYXJyeS5sb25nVmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjYXJyeSAhPSAwIHx8IF9zIDwgMCB8fCBfcyA+IDU5IHx8IF9tIDwgMCB8fCBfbSA+IDUwIHx8IF9oIDwgMCB8fCBfaCA+IDIzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBzZWNvbmRzCi0gICAgICAgICAgICB0ZW1wID0gX3MgKyBjYXJyeTsKLSAgICAgICAgICAgIGNhcnJ5ID0gX2ZRdW90aWVudCh0ZW1wLCA2MCk7Ci0gICAgICAgICAgICBfcyA9IF9tb2QodGVtcCwgNjAsIGNhcnJ5KTsKLQotICAgICAgICAgICAgLy8gbWludXRlcwotICAgICAgICAgICAgdGVtcCA9IF9tICsgY2Fycnk7Ci0gICAgICAgICAgICBjYXJyeSA9IF9mUXVvdGllbnQodGVtcCwgNjApOwotICAgICAgICAgICAgX20gPSBfbW9kKHRlbXAsIDYwLCBjYXJyeSk7Ci0KLSAgICAgICAgICAgIC8vIGhvdXJzCi0gICAgICAgICAgICB0ZW1wID0gX2ggKyBjYXJyeTsKLSAgICAgICAgICAgIGNhcnJ5ID0gX2ZRdW90aWVudCh0ZW1wLCAyNCk7Ci0gICAgICAgICAgICBfaCA9IF9tb2QodGVtcCwgMjQsIGNhcnJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjYXJyeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZ2l2ZW4gZHVyYXRpb24gdG8gdGhlIGRhdGUvdGltZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2lnbiArMSB0byBhZGQsIC0xIHRvIHN1YnRyYWN0Ci0gICAgICogQHBhcmFtIHllYXIgdGhlIG51bWJlciBvZiB5ZWFycyB0byBhZGQKLSAgICAgKiBAcGFyYW0gbW9udGggdGhlIG51bWJlciBvZiBtb250aHMgdG8gYWRkCi0gICAgICogQHBhcmFtIGRheSB0aGUgbnVtYmVyIG9mIGRheXMgdG8gYWRkCi0gICAgICogQHBhcmFtIGhvdXIgdGhlIG51bWJlciBvZiBob3VycyB0byBhZGQKLSAgICAgKiBAcGFyYW0gbWludXRlIHRoZSBudW1iZXIgb2YgbWludXRlcyB0byBhZGQKLSAgICAgKiBAcGFyYW0gc2Vjb25kIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBhZGQKLSAgICAgKiBAcGFyYW0gZnJhY3Rpb24gdGhlIG51bWJlciBvZiBmcmFjdGlvbmFsIHNlY29uZHMgdG8gYWRkIChtYXkgYmUgbnVsbCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGREdXJhdGlvbihpbnQgc2lnbiwgaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaG91ciwgaW50IG1pbnV0ZSwgaW50IHNlY29uZCwgQmlnRGVjaW1hbCBmcmFjdGlvbikKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gdGltZW1hdGggPSBob3VyICE9IDAgfHwgbWludXRlICE9IDAgfHwgc2Vjb25kICE9IDAgfHwgZnJhY3Rpb24gIT0gbnVsbCAmJiBmcmFjdGlvbi5zaWdudW0oKSAhPSAwOwotICAgICAgICBpZiAodGltZW1hdGggJiYgIWhhc1RpbWUoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCBkbyB0aW1lIG1hdGggd2l0aG91dCBhIGNvbXBsZXRlIHRpbWUiKTsKLSAgICAgICAgYm9vbGVhbiBkYXRlbWF0aCA9IGhhc0RheSgpICYmIChkYXkgIT0gMCB8fCB0aW1lbWF0aCk7Ci0gICAgICAgIGlmIChkYXRlbWF0aCAmJiAhaGFzRGF0ZSgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2Fubm90IGRvIGRhdGUgbWF0aCB3aXRob3V0IGEgY29tcGxldGUgZGF0ZSIpOwotCi0gICAgICAgIGludCB0ZW1wOwotCi0gICAgICAgIC8vIG1vbnRocyArIHllYXJzIGFyZSBlYXN5Ci0gICAgICAgIGlmIChtb250aCAhPSAwIHx8IHllYXIgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgX0QgdG8gYmUgcGVnZ2VkIGJlZm9yZSBjaGFuZ2luZyBtb250aAotICAgICAgICAgICAgaWYgKGhhc0RheSgpKQotICAgICAgICAgICAgICAgIF9ub3JtYWxpemVEYXRlKCk7Ci0KLSAgICAgICAgICAgIC8vIEFkZCBtb250aHMgYW5kIHllYXJzCi0gICAgICAgICAgICB0ZW1wID0gX00gKyBzaWduICogbW9udGg7Ci0gICAgICAgICAgICBfTSA9IF9tb2R1bG8odGVtcCwgMSwgMTMpOwotICAgICAgICAgICAgX0NZID0gX0NZICsgc2lnbiAqIHllYXIgKyAoaW50KV9mUXVvdGllbnQodGVtcCwgMSwgMTMpOwotCi0gICAgICAgICAgICAvLyBJbiBuZXcgbW9udGgsIGRheSBtYXkgbmVlZCB0byBiZSBwZWdnZWQgYmVmb3JlIHByb2NlZWRpbmcKLSAgICAgICAgICAgIGlmIChoYXNEYXkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQoX0QgPj0gMSk7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IF9tYXhEYXlJbk1vbnRoRm9yKF9DWSwgX00pOwotICAgICAgICAgICAgICAgIGlmIChfRCA+IHRlbXApCi0gICAgICAgICAgICAgICAgICAgIF9EID0gdGVtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgY2FycnkgPSAwOwotCi0gICAgICAgIGlmICh0aW1lbWF0aCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZnJhY3Rpb25zCi0gICAgICAgICAgICBpZiAoZnJhY3Rpb24gIT0gbnVsbCAmJiBmcmFjdGlvbi5zaWdudW0oKSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZnMuc2lnbnVtKCkgPT0gMCAmJiBzaWduID09IDEpCi0gICAgICAgICAgICAgICAgICAgIF9mcyA9IGZyYWN0aW9uOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgX2ZzID0gKHNpZ24gPT0gMSkgPyBfZnMuYWRkKGZyYWN0aW9uKSA6IF9mcy5zdWJ0cmFjdChmcmFjdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNlY29uZHMsIG1pbnV0ZXMsIGhvdXJzCi0gICAgICAgICAgICBfcyArPSBzaWduICogc2Vjb25kOwotICAgICAgICAgICAgX20gKz0gc2lnbiAqIG1pbnV0ZTsKLSAgICAgICAgICAgIF9oICs9IHNpZ24gKiBob3VyOwotCi0gICAgICAgICAgICAvLyBub3JtYWxpemUgdGltZQotICAgICAgICAgICAgY2FycnkgPSBfbm9ybWFsaXplVGltZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRhdGVtYXRoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBkYXlzOiBtYXkgcmVxdWlyZSByZW5vcm1hbGl6YXRpb24KLSAgICAgICAgICAgIF9EICs9IHNpZ24gKiBkYXkgKyBjYXJyeTsKLSAgICAgICAgICAgIF9ub3JtYWxpemVEYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiB7eWVhcixtb250aH0gY29tcHV0ZXMgbWF4aW11bQotICAgICAqIG51bWJlciBvZiBkYXlzIGZvciBnaXZlbiBtb250aAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBfbWF4RGF5SW5Nb250aEZvcihpbnQgeWVhciwgaW50IG1vbnRoKQotICAgIHsKLSAgICAgICAgaWYgKG1vbnRoID09IDQgfHwgbW9udGggPT0gNiB8fCBtb250aCA9PSA5IHx8IG1vbnRoID09IDExKQotICAgICAgICAgICAgcmV0dXJuIDMwOwotCi0gICAgICAgIGlmIChtb250aCA9PSAyKQotICAgICAgICAgICAgcmV0dXJuIChfaXNMZWFwWWVhcih5ZWFyKSA/IDI5IDogMjgpOwotCi0gICAgICAgIHJldHVybiAzMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiB7eWVhcixtb250aH0gY29tcHV0ZXMgbWF4aW11bQotICAgICAqIG51bWJlciBvZiBkYXlzIGZvciBnaXZlbiBtb250aAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBfbWF4RGF5SW5Nb250aChpbnQgbW9udGgpCi0gICAgewotICAgICAgICBpZiAobW9udGggPT0gNCB8fCBtb250aCA9PSA2IHx8IG1vbnRoID09IDkgfHwgbW9udGggPT0gMTEpCi0gICAgICAgICAgICByZXR1cm4gMzA7Ci0KLSAgICAgICAgaWYgKG1vbnRoID09IDIpCi0gICAgICAgICAgICByZXR1cm4gMjk7Ci0KLSAgICAgICAgcmV0dXJuIDMxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEp1bGlhbiBkYXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBHcmVnb3JpYW4gZGF0ZS4KLSAgICAgKiBUaGUgSnVsaWFuIGRhdGUgKEpEKSBpcyBhIGNvbnRpbnVvdXMgY291bnQgb2YgZGF5cyBmcm9tCi0gICAgICogMSBKYW51YXJ5IDQ3MTMgQkMgKD0gLTQ3MTIgSmFudWFyeSAxKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEp1bGlhbkRhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGp1bGlhbkRhdGVGb3JHRGF0ZSh0aGlzKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEdyZWdvcmlhbiBkYXRlIGJhc2VkIG9uIHRoZSBnaXZlbiBKdWxpYW4gZGF0ZS4KLSAgICAgKiBUaGUgSnVsaWFuIGRhdGUgKEpEKSBpcyBhIGNvbnRpbnVvdXMgY291bnQgb2YgZGF5cyBmcm9tCi0gICAgICogMSBKYW51YXJ5IDQ3MTMgQkMgKD0gLTQ3MTIgSmFudWFyeSAxKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ganVsaWFuZGF5IHRoZSBqdWxpYW4gZGF5IG51bWJlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEp1bGlhbkRhdGUoaW50IGp1bGlhbmRheSkKLSAgICB7Ci0gICAgICAgIGlmIChqdWxpYW5kYXkgPCAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGF0ZSBiZWZvcmUgeWVhciAtNDcxMiIpOwotCi0gICAgICAgIGludCB0ZW1wOwotICAgICAgICBpbnQgcWVwb2M7Ci0KLSAgICAgICAgLy8gZnJvbSBodHRwOi8vYWEudXNuby5uYXZ5Lm1pbC9mYXEvZG9jcy9KRF9Gb3JtdWxhLmh0bWwKLSAgICAgICAgdGVtcCA9IGp1bGlhbmRheSArIDY4NTY5OwotICAgICAgICBxZXBvYyA9IDQgKiB0ZW1wIC8gMTQ2MDk3OwotICAgICAgICB0ZW1wID0gdGVtcCAtICgxNDYwOTcgKiBxZXBvYyArIDMpIC8gNDsKLSAgICAgICAgX0NZID0gNDAwMCAqICh0ZW1wICsgMSkgLyAxNDYxMDAxOwotICAgICAgICB0ZW1wID0gdGVtcCAtIDE0NjEgKiBfQ1kgLyA0ICsgMzE7Ci0gICAgICAgIF9NID0gODAgKiB0ZW1wIC8gMjQ0NzsKLSAgICAgICAgX0QgPSB0ZW1wIC0gMjQ0NyAqIF9NIC8gODA7Ci0gICAgICAgIHRlbXAgPSBfTSAvIDExOwotICAgICAgICBfTSA9IF9NICsgMiAtIDEyICogdGVtcDsKLSAgICAgICAgX0NZID0gMTAwICogKHFlcG9jIC0gNDkpICsgX0NZICsgdGVtcDsKLQotICAgICAgICBfYml0cyB8PSBIQVNfREFZIHwgSEFTX01PTlRIIHwgSEFTX1lFQVI7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHRpbWUgYW5kIGRhdGUgYmFzZWQgb24gYSBqYXZhLnV0aWwuRGF0ZSBpbnN0YW5jZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdGltZXpvbmUgb2Zmc2V0IHVzZWQgaXMgYmFzZWQgb24gdGhlIGRlZmF1bHQgVGltZVpvbmUuIChUaGUKLSAgICAgKiBkZWZhdWx0IFRpbWVab25lIGlzIGNvbnN1bHRlZCB0byBpbmNvcnBvcmF0ZSBkYXlsaWdodCBzYXZpbmdzIG9mZnNldHMKLSAgICAgKiBpZiBhcHBsaWNhYmxlIGZvciB0aGUgY3VycmVudCBkYXRlIGFzIHdlbGwgYXMgdGhlIGJhc2UgdGltZXpvbmUgb2Zmc2V0LikKLSAgICAgKiA8cD4KLSAgICAgKiBJZiB5b3Ugd2lzaCB0byBub3JtYWxpemUgdGhlIHRpbWV6b25lLCBlLmcuLCB0byBVVEMsIGZvbGxvdyB0aGlzIHdpdGgKLSAgICAgKiBhIGNhbGwgdG8gbm9ybWFsaXplVG9UaW1lWm9uZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0ZSB0aGUgRGF0ZSBvYmplY3QgdG8gY29weQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERhdGUoRGF0ZSBkYXRlKQotICAgIHsKLSAgICAgICAgLy8gRGVmYXVsdCB0aW1lem9uZQotICAgICAgICBUaW1lWm9uZSBkdHogPSBUaW1lWm9uZS5nZXREZWZhdWx0KCk7Ci0gICAgICAgIGludCBvZmZzZXQgPSBkdHouZ2V0T2Zmc2V0KGRhdGUuZ2V0VGltZSgpKTsKLSAgICAgICAgaW50IG9mZnNldHNpZ24gPSAxOwotICAgICAgICBpZiAob2Zmc2V0IDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgb2Zmc2V0c2lnbiA9IC0xOwotICAgICAgICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKLSAgICAgICAgfQotICAgICAgICBpbnQgb2Zmc2V0bWluID0gb2Zmc2V0IC8gKDEwMDAgKiA2MCk7Ci0gICAgICAgIGludCBvZmZzZXRociA9IG9mZnNldG1pbiAvIDYwOwotICAgICAgICBvZmZzZXRtaW4gPSBvZmZzZXRtaW4gLSBvZmZzZXRociAqIDYwOwotCi0gICAgICAgIHNldFRpbWVab25lKG9mZnNldHNpZ24sIG9mZnNldGhyLCBvZmZzZXRtaW4pOwotICAgICAgICAKLSAgICAgICAgLy8gcGFyYW5vaWE6IHR6LmdldE9mZnNldCBjYW4gcmV0dXJuIGZyYWN0aW9ucyBvZiBtaW51dGVzLCBidXQgd2UgbXVzdCByb3VuZAotICAgICAgICBpbnQgcm91bmRlZG9mZnNldCA9IG9mZnNldHNpZ24gKiAob2Zmc2V0aHIgKiA2MCArIG9mZnNldG1pbikgKiA2MCAqIDEwMDA7Ci0KLSAgICAgICAgLy8gbWlkbmlnaHQKLSAgICAgICAgc2V0VGltZSgwLCAwLCAwLCBHRGF0ZS5femVybyk7Ci0KLSAgICAgICAgLy8gU2V0IHRvIEphbnVhcnkgMSwgMTk3MC4KLSAgICAgICAgLy8gc2V0SnVsaWFuRGF0ZSgyNDQwNTg4KTsKLSAgICAgICAgX2JpdHMgfD0gSEFTX0RBWSB8IEhBU19NT05USCB8IEhBU19ZRUFSOwotICAgICAgICBfQ1kgPSAxOTcwOwotICAgICAgICBfTSA9IDE7Ci0gICAgICAgIF9EID0gMTsKLQotICAgICAgICAvLyBBZGQgYSBkdXJhdGlvbiByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMKLSAgICAgICAgYWRkR0R1cmF0aW9uKG5ldyBHRHVyYXRpb24oMSwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAgICAgICAgICAgICBCaWdEZWNpbWFsLnZhbHVlT2YoZGF0ZS5nZXRUaW1lKCkgKyByb3VuZGVkb2Zmc2V0LCAzKSkpOwotCi0gICAgICAgIC8vIHNwZWNpYWwgY2FzZTogc3MuMDAwIC0+IHNzCi0gICAgICAgIGlmIChfZnMuc2lnbnVtKCkgPT0gMCkKLSAgICAgICAgICAgIF9mcyA9IEdEYXRlLl96ZXJvOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb3BpZXMgYSBHRGF0ZVNwZWNpZmljYXRpb24sIGNvbXBsZXRlbHkgcmVwbGFjaW5nIHRoZSBjdXJyZW50Ci0gICAgICogaW5mb3JtYXRpb24gaW4gdGhpcyBHRGF0ZUJ1aWxkZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGdkYXRlIHRoZSBHRGF0ZVNwZWNpZmljYXRpb24gdG8gY29weQotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCBzZXRHRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gZ2RhdGUpCi0gICAgewotICAgICAgICBfYml0cyA9IGdkYXRlLmdldEZsYWdzKCkgJiAoSEFTX1RJTUVaT05FIHwgSEFTX1lFQVIgfCBIQVNfTU9OVEggfCBIQVNfREFZIHwgSEFTX1RJTUUpOwotICAgICAgICBfQ1kgPSBnZGF0ZS5nZXRZZWFyKCk7Ci0gICAgICAgIF9NID0gZ2RhdGUuZ2V0TW9udGgoKTsKLSAgICAgICAgX0QgPSBnZGF0ZS5nZXREYXkoKTsKLSAgICAgICAgX2ggPSBnZGF0ZS5nZXRIb3VyKCk7Ci0gICAgICAgIF9tID0gZ2RhdGUuZ2V0TWludXRlKCk7Ci0gICAgICAgIF9zID0gZ2RhdGUuZ2V0U2Vjb25kKCk7Ci0gICAgICAgIF9mcyA9IGdkYXRlLmdldEZyYWN0aW9uKCk7Ci0gICAgICAgIF90enNpZ24gPSBnZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKTsKLSAgICAgICAgX3R6aCA9IGdkYXRlLmdldFRpbWVab25lSG91cigpOwotICAgICAgICBfdHptID0gZ2RhdGUuZ2V0VGltZVpvbmVNaW51dGUoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgdGltZSBhcyBhbiB7QGxpbmsgWG1sQ2FsZW5kYXJ9LgotICAgICAqIDxwPgotICAgICAqIHtAbGluayBYbWxDYWxlbmRhcn0gaXMgYSBzdWJjbGFzcyBvZiB7QGxpbmsgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyfQotICAgICAqIHdoaWNoIGlzIHNsaWdodGx5IGN1c3RvbWl6ZWQgdG8gbWF0Y2ggWE1MIHNjaGVtYSBkYXRlIHJ1bGVzLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXR1cm5lZCB7QGxpbmsgWG1sQ2FsZW5kYXJ9IGhhcyBvbmx5IHRob3NlIHRpbWUgYW5kIGRhdGUgZmllbGRzCi0gICAgICogc2V0IHRoYXQgYXJlIHJlZmxlY3RlZCBpbiB0aGUgR0RhdGUgb2JqZWN0LiAgQmVjYXVzZSBvZiB0aGUgd2F5IHRoZQotICAgICAqIHtAbGluayBqYXZhLnV0aWwuQ2FsZW5kYXJ9IGNvbnRyYWN0IHdvcmtzLCBhbnkgaW5mb3JtYXRpb24gaW4gdGhlIGlzU2V0KCkgdmFuaXNoZXMKLSAgICAgKiBhcyBzb29uIGFzIHlvdSB2aWV3IGFueSB1bnNldCBmaWVsZCB1c2luZyBnZXQoKSBtZXRob2RzLgotICAgICAqIFRoaXMgbWVhbnMgdGhhdCBpZiBpdCBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB3aGljaCBkYXRlIGZpZWxkcwotICAgICAqIGFyZSBzZXQsIHlvdSBtdXN0IGNhbGwgaXNTZXQoKSBmaXJzdCBiZWZvcmUgZ2V0KCkuCi0gICAgICovCi0gICAgcHVibGljIFhtbENhbGVuZGFyIGdldENhbGVuZGFyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWG1sQ2FsZW5kYXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCB0aW1lIGFzIGEgamF2YS51dGlsLkRhdGUKLSAgICAgKiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkYXRlRm9yR0RhdGUodGhpcyk7Ci0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgaW50IGp1bGlhbkRhdGVGb3JHRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gZGF0ZSkKLSAgICB7Ci0gICAgICAgIGlmICghZGF0ZS5oYXNEYXRlKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjYW5ub3QgZG8gZGF0ZSBtYXRoIHdpdGhvdXQgYSBjb21wbGV0ZSBkYXRlIik7Ci0KLSAgICAgICAgLy8gZnJvbSBodHRwOi8vYWEudXNuby5uYXZ5Lm1pbC9mYXEvZG9jcy9KRF9Gb3JtdWxhLmh0bWwKLSAgICAgICAgaW50IHJlc3VsdCA9IGRhdGUuZ2V0RGF5KCktMzIwNzUrMTQ2MSooZGF0ZS5nZXRZZWFyKCkrNDgwMCsoZGF0ZS5nZXRNb250aCgpLTE0KS8xMikvNCsKLSAgICAgICAgICAgIDM2NyooZGF0ZS5nZXRNb250aCgpLTItKGRhdGUuZ2V0TW9udGgoKS0xNCkvMTIqMTIpLzEyLTMqKChkYXRlLmdldFllYXIoKSs0OTAwKyhkYXRlLmdldE1vbnRoKCktMTQpLzEyKS8xMDApLzQ7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA8IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRlIHRvbyBmYXIgaW4gdGhlIHBhc3QgKHllYXIgYWxsb3dlZCB0byAtNDcxMikiKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIERhdGUgZGF0ZUZvckdEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiBkYXRlKQotICAgIHsKLSAgICAgICAgbG9uZyBqRGF0ZSA9IGp1bGlhbkRhdGVGb3JHRGF0ZShkYXRlKTsKLSAgICAgICAgbG9uZyB0bzE5NzBEYXRlID0gakRhdGUgLSAyNDQwNTg4OwotICAgICAgICBsb25nIHRvMTk3ME1zID0gMTAwMCAqIDYwICogNjAgKiAyNCAqIHRvMTk3MERhdGU7Ci0KLSAgICAgICAgdG8xOTcwTXMgKz0gZGF0ZS5nZXRNaWxsaXNlY29uZCgpOwotICAgICAgICB0bzE5NzBNcyArPSBkYXRlLmdldFNlY29uZCgpICogMTAwMDsKLSAgICAgICAgdG8xOTcwTXMgKz0gZGF0ZS5nZXRNaW51dGUoKSAqIDYwICogMTAwMDsKLSAgICAgICAgdG8xOTcwTXMgKz0gZGF0ZS5nZXRIb3VyKCkgKiA2MCAqIDYwICogMTAwMDsKLSAgICAgICAgaWYgKGRhdGUuaGFzVGltZVpvbmUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdG8xOTcwTXMgLT0gKGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSAqIGRhdGUuZ2V0VGltZVpvbmVTaWduKCkpICogNjAgKiAxMDAwOwotICAgICAgICAgICAgdG8xOTcwTXMgLT0gKGRhdGUuZ2V0VGltZVpvbmVIb3VyKCkgKiBkYXRlLmdldFRpbWVab25lU2lnbigpKSAqIDYwICogNjAgKiAxMDAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgVGltZVpvbmUgZGVmID0gVGltZVpvbmUuZ2V0RGVmYXVsdCgpOwotICAgICAgICAgICAgaW50IG9mZnNldCA9IGRlZi5nZXRPZmZzZXQodG8xOTcwTXMpOwotICAgICAgICAgICAgdG8xOTcwTXMgLT0gb2Zmc2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRvMTk3ME1zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGZvciBsZWFwIHllYXJzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gX2lzTGVhcFllYXIoaW50IHllYXIpCi0gICAgewotICAgICAgICAvLyBCVUdCVUc6IEp1bGlhbiBjYWxlbmRhcj8KLSAgICAgICAgcmV0dXJuICgoeWVhciAlIDQgPT0gMCkgJiYgKCh5ZWFyICUgMTAwICE9IDApIHx8ICh5ZWFyICUgNDAwID09IDApKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZlF1b3RpZW50KGEsIGIpID0gdGhlIGdyZWF0ZXN0IGludGVnZXIgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGEvYgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgX2ZRdW90aWVudChsb25nIGEsIGludCBiKQotICAgIHsKLSAgICAgICAgaWYgKChhIDwgMCkgPT0gKGIgPCAwKSkKLSAgICAgICAgICAgIHJldHVybiBhIC8gYjsKLQotICAgICAgICByZXR1cm4gLSgoYiAtIGEgLSAxKSAvIGIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIG1vZHVsbyhhLCBiKSA9IGEgLSBmUXVvdGllbnQoYSxiKSpiCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IF9tb2QobG9uZyBhLCBpbnQgYiwgbG9uZyBxdW90aWVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaW50KShhIC0gcXVvdGllbnQqYikgOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIG1vZHVsbyhhIC0gbG93LCBoaWdoIC0gbG93KSArIGxvdwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfbW9kdWxvKGxvbmcgdGVtcCwgaW50IGxvdywgaW50IGhpZ2gpCi0gICAgewotICAgICAgICBsb25nIGEgPSB0ZW1wIC0gbG93OwotICAgICAgICBpbnQgYiA9IGhpZ2ggLSBsb3c7Ci0gICAgICAgIHJldHVybiAoX21vZChhLCBiLCBfZlF1b3RpZW50KGEsIGIpKSArIGxvdykgOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFF1b3RpZW50KGEgLSBsb3csIGhpZ2ggLSBsb3cpCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBfZlF1b3RpZW50KGxvbmcgdGVtcCwgaW50IGxvdywgaW50IGhpZ2gpCi0gICAgewotICAgICAgICByZXR1cm4gX2ZRdW90aWVudCh0ZW1wIC0gbG93LCBoaWdoIC0gbG93KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRvIHRoZSBmaXJzdCBwb3NzaWJsZSBtb21lbnQgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbgotICAgICAqIHNwZWNpZmljYXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIF9zZXRUb0ZpcnN0TW9tZW50KCkKLSAgICB7Ci0gICAgICAgIC8vIDE1ODQgd2FzIHRoZSBmaXJzdCBsZWFwIHllYXIgZHVyaW5nIHdoaWNoIHRoZSBHcmVnb3JpYW4KLSAgICAgICAgLy8gY2FsZW5kYXIgd2FzIGluIHVzZTogc2VlbXMgbGlrZSB0aGUgbW9zdCByZWFzb25hYmxlICJmaXJzdCIKLSAgICAgICAgLy8geWVhciB0byB1c2UgaW4gYWJzZW5jZSBvZiBhIHllYXIuCi0KLSAgICAgICAgaWYgKCFoYXNZZWFyKCkpCi0gICAgICAgICAgICBzZXRZZWFyKDE1ODQpOwotCi0gICAgICAgIGlmICghaGFzTW9udGgoKSkKLSAgICAgICAgICAgIHNldE1vbnRoKDEpOwotCi0gICAgICAgIGlmICghaGFzRGF5KCkpCi0gICAgICAgICAgICBzZXREYXkoMSk7Ci0KLSAgICAgICAgaWYgKCFoYXNUaW1lKCkpCi0gICAgICAgICAgICBzZXRUaW1lKDAsIDAsIDAsIEdEYXRlLl96ZXJvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJpc29uIHRvIGFub3RoZXIgR0RhdGUuCi0gICAgICogPHVsPgotICAgICAqIDxsaT5SZXR1cm5zIC0xIGlmIHRoaXMgPCBkYXRlLiAobGVzcy10aGFuKQotICAgICAqIDxsaT5SZXR1cm5zIDAgaWYgdGhpcyA9PSBkYXRlLiAoZXF1YWwpCi0gICAgICogPGxpPlJldHVybnMgMSBpZiB0aGlzID4gZGF0ZS4gKGdyZWF0ZXItdGhhbikKLSAgICAgKiA8bGk+UmV0dXJucyAyIGlmIHRoaXMgPD4gZGF0ZS4gKGluY29tcGFyYWJsZSkKLSAgICAgKiA8L3VsPgotICAgICAqIFR3byBpbnN0YW5jZXMgYXJlIGluY29tcGFyYWJsZSBpZiB0aGV5IGhhdmUgZGlmZmVyZW50IGFtb3VudHMKLSAgICAgKiBvZiBpbmZvcm1hdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0ZXNwZWMgdGhlIGRhdGUgdG8gY29tcGFyZSBhZ2FpbnN0Ci0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBjb21wYXJlVG9HRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gZGF0ZXNwZWMpCi0gICAgewotICAgICAgICByZXR1cm4gY29tcGFyZUdEYXRlKHRoaXMsIGRhdGVzcGVjKTsKLSAgICB9Ci0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBjb21wYXJlR0RhdGUoR0RhdGVTcGVjaWZpY2F0aW9uIHRkYXRlLCBHRGF0ZVNwZWNpZmljYXRpb24gZGF0ZXNwZWMpCi0gICAgewotICAgICAgICAvLyBzYW1lIGFtb3VudCBvZiBpbmZvcm1hdGlvbjogbG9va3MgZ29vZAotICAgICAgICBpbnQgYml0ZGlmZiA9IHRkYXRlLmdldEZsYWdzKCkgXiBkYXRlc3BlYy5nZXRGbGFncygpOwotCi0gICAgICAgIGVhc3k6IGlmICgoYml0ZGlmZiAmIChIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkgfCBIQVNfVElNRSB8IEhBU19USU1FWk9ORSkpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBvdGhlciBkYXRlIG5lZWRzIHRvIGJlIG5vcm1hbGl6ZWQgdG8KLSAgICAgICAgICAgIC8vIG91ciB0aW1lem9uZSwgbWFrZSBhIGNsb25lIGFuZCBkbyBzbyBpZiBwb3NzaWJsZQotICAgICAgICAgICAgaWYgKHRkYXRlLmhhc1RpbWVab25lKCkgJiYKLSAgICAgICAgICAgICAgICAoZGF0ZXNwZWMuZ2V0VGltZVpvbmVIb3VyKCkgIT0gdGRhdGUuZ2V0VGltZVpvbmVIb3VyKCkgfHwKLSAgICAgICAgICAgICAgICAgZGF0ZXNwZWMuZ2V0VGltZVpvbmVNaW51dGUoKSAhPSB0ZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpIHx8Ci0gICAgICAgICAgICAgICAgIGRhdGVzcGVjLmdldFRpbWVab25lU2lnbigpICE9IHRkYXRlLmdldFRpbWVab25lU2lnbigpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkYXRlc3BlYyA9IG5ldyBHRGF0ZUJ1aWxkZXIoZGF0ZXNwZWMpOwotCi0gICAgICAgICAgICAgICAgaW50IGZsYWdzID0gdGRhdGUuZ2V0RmxhZ3MoKSAmIChIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkpOwotICAgICAgICAgICAgICAgIGlmIChmbGFncyAhPSAwICYmIGZsYWdzICE9IChIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkpIHx8ICF0ZGF0ZS5oYXNUaW1lKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGVzZSBjYXNlcyB3ZSdsbCBuZWVkIHRvIGZpbGwgaW4gZmllbGRzCi0gICAgICAgICAgICAgICAgICAgICgoR0RhdGVCdWlsZGVyKWRhdGVzcGVjKS5fc2V0VG9GaXJzdE1vbWVudCgpOwotICAgICAgICAgICAgICAgICAgICB0ZGF0ZSA9IG5ldyBHRGF0ZUJ1aWxkZXIodGRhdGUpOwotICAgICAgICAgICAgICAgICAgICAoKEdEYXRlQnVpbGRlcil0ZGF0ZSkuX3NldFRvRmlyc3RNb21lbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAoKEdEYXRlQnVpbGRlcilkYXRlc3BlYykubm9ybWFsaXplVG9UaW1lWm9uZSh0ZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKSwgdGRhdGUuZ2V0VGltZVpvbmVIb3VyKCksIHRkYXRlLmdldFRpbWVab25lTWludXRlKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjb21wYXJlIGJ5IGZpZWxkCi0gICAgICAgICAgICByZXR1cm4gZmllbGR3aXNlQ29tcGFyZSh0ZGF0ZSwgZGF0ZXNwZWMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGlmZmVyZW50IGFtb3VudHMgb2YgaW5mb3JtYXRpb24gKGV4Y2VwdCB0aW1lem9uZSk6IG5vdCBjb21wYXJhYmxlCi0gICAgICAgIGlmICgoYml0ZGlmZiAmIChIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkgfCBIQVNfVElNRSkpICE9IDApCi0gICAgICAgICAgICByZXR1cm4gMjsKLQotICAgICAgICAvLyBUaGUgc2NoZW1hIHNwZWMgc2F5cyB3ZSBzaG91bGQgdHJ5IHRvIGNvbXBhcmUgd2l0aC10aW1lem9uZSBhbmQKLSAgICAgICAgLy8gd2l0aG91dC10aW1lem9uZSBzcGVjaWZpY2F0aW9ucy4uLiBXZWxsLCBPSywgc3VyZSwgaWYgdGhleSBzYXkgc28uCi0KLSAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhIHRpbWV6b25lIGJ1dCB0aGUgb3RoZXIgZG9lczogcmV2ZXJzZSB0aGUgY2FsbAotICAgICAgICBpZiAoIXRkYXRlLmhhc1RpbWVab25lKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSBjb21wYXJlR0RhdGUoZGF0ZXNwZWMsIHRkYXRlKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQgPT0gMiA/IDIgOiAtcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IHRkYXRlIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBhIHRpbWV6b25lIGFuZCBkYXRlc3BlYyBub3QuCi0KLSAgICAgICAgLy8gVG8gbXVjayB3aXRoIHRoZSB0aW1lcywgbWFrZSBjbG9uZXMKLSAgICAgICAgR0RhdGVCdWlsZGVyIHBkYXRlID0gbmV3IEdEYXRlQnVpbGRlcih0ZGF0ZSk7Ci0KLSAgICAgICAgLy8gVG8gY292ZXIgdGhlIG9uZSB1bmNvdmVyZWQgY2FzZTogaWYgb25lIGRhdGUgaXMgMDIvMjggYW5kIHRoZQotICAgICAgICAvLyBvdGhlciBkYXRlIGlzIDAzLzAxLCBzaGlmdCBkYXlzIGNsb3NlciBieSBvbmUgdG8gc2ltdWxhdGUgYmVpbmcKLSAgICAgICAgLy8gdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCB3aXRoaW4gYSBsZWFwIHllYXIKLSAgICAgICAgaWYgKCh0ZGF0ZS5nZXRGbGFncygpICYgKEhBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWSkpID09IChIQVNfTU9OVEggfCBIQVNfREFZKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRkYXRlLmdldERheSgpID09IDI4ICYmIHRkYXRlLmdldE1vbnRoKCkgPT0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZGF0ZXNwZWMuZ2V0RGF5KCkgPT0gMDEgJiYgZGF0ZXNwZWMuZ2V0TW9udGgoKSA9PSAzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGRhdGUuc2V0RGF5KDI5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChkYXRlc3BlYy5nZXREYXkoKSA9PSAyOCAmJiBkYXRlc3BlYy5nZXRNb250aCgpID09IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHRkYXRlLmdldERheSgpID09IDAxICYmIHRkYXRlLmdldE1vbnRoKCkgPT0gMykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBkYXRlLnNldE1vbnRoKDAyKTsKLSAgICAgICAgICAgICAgICAgICAgcGRhdGUuc2V0RGF5KDI5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGb3IgdGltZXNwYW5zLCBjb21wYXJlIGJ5IGZpcnN0IGluc3RhbnQgb2YgdGltZQotICAgICAgICAvLyBwb3NzaWJsZS4gVGhlcmVmb3JlLCBmaWxsIGluIE1pZG5pZ2h0LCBKYW51YXJ5IDEsIDE1ODQgKGEgbGVhcCB5ZWFyKQotICAgICAgICAvLyBpbiBhYnNlbmNlIG9mIG90aGVyIGluZm9ybWF0aW9uLgotICAgICAgICBwZGF0ZS5fc2V0VG9GaXJzdE1vbWVudCgpOwotCi0gICAgICAgIC8vIFAgPCBRIGlmIFAgPCAoUSB3aXRoIHRpbWUgem9uZSArMTQ6MDApCi0gICAgICAgIEdEYXRlQnVpbGRlciBxcGx1c2RhdGUgPSBuZXcgR0RhdGVCdWlsZGVyKGRhdGVzcGVjKTsKLSAgICAgICAgcXBsdXNkYXRlLl9zZXRUb0ZpcnN0TW9tZW50KCk7Ci0gICAgICAgIHFwbHVzZGF0ZS5zZXRUaW1lWm9uZSgxLCAxNCwgMCk7Ci0gICAgICAgIHFwbHVzZGF0ZS5ub3JtYWxpemVUb1RpbWVab25lKHRkYXRlLmdldFRpbWVab25lU2lnbigpLCB0ZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSwgdGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSk7Ci0gICAgICAgIGlmIChmaWVsZHdpc2VDb21wYXJlKHBkYXRlLCBxcGx1c2RhdGUpID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgIC8vIFAgPiBRIGlmIFAgPiAoUSB3aXRoIHRpbWUgem9uZSAtMTQ6MDApCi0gICAgICAgIEdEYXRlQnVpbGRlciBxbWludXNkYXRlID0gcXBsdXNkYXRlOwotICAgICAgICBxbWludXNkYXRlLnNldEdEYXRlKGRhdGVzcGVjKTsKLSAgICAgICAgcW1pbnVzZGF0ZS5fc2V0VG9GaXJzdE1vbWVudCgpOwotICAgICAgICBxbWludXNkYXRlLnNldFRpbWVab25lKC0xLCAxNCwgMCk7Ci0gICAgICAgIHFtaW51c2RhdGUubm9ybWFsaXplVG9UaW1lWm9uZSh0ZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKSwgdGRhdGUuZ2V0VGltZVpvbmVIb3VyKCksIHRkYXRlLmdldFRpbWVab25lTWludXRlKCkpOwotICAgICAgICBpZiAoZmllbGR3aXNlQ29tcGFyZShwZGF0ZSwgcW1pbnVzZGF0ZSkgPT0gMSkKLSAgICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgIC8vIFAgPD4gUSBvdGhlcndpc2UKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG9lcyBhIHNpbXBsZSBtb3N0LXNpZ25pZmljYW50LWRpZ2l0LWZpcnN0IGNvbXBhcmlzb24sCi0gICAgICogaWdub3JpbmcgYW55IHRpbWV6b25lIG9yIGhhcy9kb2Vzbid0IGhhdmUgaXNzdWVzLgotICAgICAqIFRoZSBkYXRhIG11c3QgaGF2ZSBiZWVuIGRpZ2VzdGVkIGZpcnN0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBmaWVsZHdpc2VDb21wYXJlKEdEYXRlU3BlY2lmaWNhdGlvbiB0ZGF0ZSwgR0RhdGVTcGVjaWZpY2F0aW9uIGRhdGUpCi0gICAgewotICAgICAgICBpZiAodGRhdGUuaGFzWWVhcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgQ1kgPSBkYXRlLmdldFllYXIoKTsKLSAgICAgICAgICAgIGludCBUQ1kgPSB0ZGF0ZS5nZXRZZWFyKCk7Ci0gICAgICAgICAgICBpZiAoVENZIDwgQ1kpIHJldHVybiAtMTsKLSAgICAgICAgICAgIGlmIChUQ1kgPiBDWSkgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRkYXRlLmhhc01vbnRoKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBNID0gZGF0ZS5nZXRNb250aCgpOwotICAgICAgICAgICAgaW50IFRNID0gdGRhdGUuZ2V0TW9udGgoKTsKLSAgICAgICAgICAgIGlmIChUTSA8IE0pIHJldHVybiAtMTsKLSAgICAgICAgICAgIGlmIChUTSA+IE0pIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0ZGF0ZS5oYXNEYXkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IEQgPSBkYXRlLmdldERheSgpOwotICAgICAgICAgICAgaW50IFREID0gdGRhdGUuZ2V0RGF5KCk7Ci0gICAgICAgICAgICBpZiAoVEQgPCBEKSByZXR1cm4gLTE7Ci0gICAgICAgICAgICBpZiAoVEQgPiBEKSByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGRhdGUuaGFzVGltZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaCA9IGRhdGUuZ2V0SG91cigpOwotICAgICAgICAgICAgaW50IHRoID0gdGRhdGUuZ2V0SG91cigpOwotICAgICAgICAgICAgaWYgKHRoIDwgaCkgcmV0dXJuIC0xOwotICAgICAgICAgICAgaWYgKHRoID4gaCkgcmV0dXJuIDE7Ci0gICAgICAgICAgICBpbnQgbSA9IGRhdGUuZ2V0TWludXRlKCk7Ci0gICAgICAgICAgICBpbnQgdG0gPSB0ZGF0ZS5nZXRNaW51dGUoKTsKLSAgICAgICAgICAgIGlmICh0bSA8IG0pIHJldHVybiAtMTsKLSAgICAgICAgICAgIGlmICh0bSA+IG0pIHJldHVybiAxOwotICAgICAgICAgICAgaW50IHMgPSBkYXRlLmdldFNlY29uZCgpOwotICAgICAgICAgICAgaW50IHRzID0gdGRhdGUuZ2V0U2Vjb25kKCk7Ci0gICAgICAgICAgICBpZiAodHMgPCBzKSByZXR1cm4gLTE7Ci0gICAgICAgICAgICBpZiAodHMgPiBzKSByZXR1cm4gMTsKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgZnMgPSBkYXRlLmdldEZyYWN0aW9uKCk7Ci0gICAgICAgICAgICBCaWdEZWNpbWFsIHRmcyA9IHRkYXRlLmdldEZyYWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAodGZzID09IG51bGwgJiYgZnMgPT0gbnVsbCkgcmV0dXJuIDA7Ci0gICAgICAgICAgICByZXR1cm4gKHRmcyA9PSBudWxsID8gR0RhdGUuX3plcm8gOiB0ZnMpLmNvbXBhcmVUbyhmcyA9PSBudWxsID8gR0RhdGUuX3plcm8gOiBmcyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBidWlsdGluIHR5cGUgY29kZSBmb3IgdGhlIHNoYXBlIG9mIHRoZSBpbmZvcm1hdGlvbgotICAgICAqIGNvbnRhaW5lZCBpbiB0aGlzIGluc3RhbmNlLCBvciAwIGlmIHRoZQotICAgICAqIGluc3RhbmNlIGRvZXNuJ3QgY29udGFpbiBpbmZvcm1hdGlvbiBjb3JyZXNwb25kaW5nIHRvIGEKLSAgICAgKiBTY2hlbWEgdHlwZS4KLSAgICAgKiA8cD4gCi0gICAgICogVmFsdWUgd2lsbCBiZSBlcXVhbCB0bwotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19OT1RfQlVJTFRJTn0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfWUVBUn0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfWUVBUl9NT05USH0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfTU9OVEh9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX01PTlRIX0RBWX0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfREFZfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfREFURX0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0RBVEVfVElNRX0sIG9yCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX1RJTUV9LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0QnVpbHRpblR5cGVDb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBidGNGb3JGbGFncyhfYml0cyk7Ci0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgaW50IGJ0Y0ZvckZsYWdzKGludCBmbGFncykKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoZmxhZ3MgJiAoSEFTX1lFQVIgfCBIQVNfTU9OVEggfCBIQVNfREFZIHwgSEFTX1RJTUUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIEhBU19ZRUFSOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLkJUQ19HX1lFQVI7Ci0gICAgICAgICAgICBjYXNlIEhBU19ZRUFSIHwgSEFTX01PTlRIOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg7Ci0gICAgICAgICAgICBjYXNlIEhBU19NT05USDoKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5CVENfR19NT05USDsKLSAgICAgICAgICAgIGNhc2UgSEFTX01PTlRIIHwgSEFTX0RBWToKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk7Ci0gICAgICAgICAgICBjYXNlIEhBU19EQVk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuQlRDX0dfREFZOwotICAgICAgICAgICAgY2FzZSBIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuQlRDX0RBVEU7Ci0gICAgICAgICAgICBjYXNlIEhBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWSB8IEhBU19USU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU7Ci0gICAgICAgICAgICBjYXNlIEhBU19USU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLkJUQ19USU1FOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5CVENfTk9UX0JVSUxUSU47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGZpZWxkcyBpbiB0aGlzIEdEYXRlQnVpbGRlciB0aGF0IGFyZSBub3QgYXBwbGljYWJsZQotICAgICAqIGZvciB0aGUgZ2l2ZW4gU2NoZW1hVHlwZSBkYXRlIGNvZGUuICBUaGUgY29kZSBzaG91bGQgYmUKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19ZRUFSfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19ZRUFSX01PTlRIfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19NT05USH0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfTU9OVEhfREFZfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19EQVl9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19EQVRFfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfREFURV9USU1FfSwgb3IKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfVElNRX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGVDb2RlIHRoZSB0eXBlIGNvZGUgdG8gYXBwbHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCdWlsdGluVHlwZUNvZGUoaW50IHR5cGVDb2RlKQotICAgIHsKLSAgICAgICAgc3dpdGNoICh0eXBlQ29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6Ci0gICAgICAgICAgICAgICAgLy9IQVNfWUVBUgotICAgICAgICAgICAgICAgIGNsZWFyTW9udGgoKTsKLSAgICAgICAgICAgICAgICBjbGVhckRheSgpOwotICAgICAgICAgICAgICAgIGNsZWFyVGltZSgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIOgotICAgICAgICAgICAgICAgIC8vSEFTX1lFQVIgfCBIQVNfTU9OVEgKLSAgICAgICAgICAgICAgICBjbGVhckRheSgpOwotICAgICAgICAgICAgICAgIGNsZWFyVGltZSgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKLSAgICAgICAgICAgICAgICAvL0hBU19NT05USAotICAgICAgICAgICAgICAgIGNsZWFyWWVhcigpOwotICAgICAgICAgICAgICAgIGNsZWFyRGF5KCk7Ci0gICAgICAgICAgICAgICAgY2xlYXJUaW1lKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKLSAgICAgICAgICAgICAgICAvL0hBU19NT05USCB8IEhBU19EQVkKLSAgICAgICAgICAgICAgICBjbGVhclllYXIoKTsKLSAgICAgICAgICAgICAgICBjbGVhclRpbWUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgotICAgICAgICAgICAgICAgIC8vSEFTX0RBWQotICAgICAgICAgICAgICAgIGNsZWFyWWVhcigpOwotICAgICAgICAgICAgICAgIGNsZWFyTW9udGgoKTsKLSAgICAgICAgICAgICAgICBjbGVhclRpbWUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6Ci0gICAgICAgICAgICAgICAgLy9IQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkKLSAgICAgICAgICAgICAgICBjbGVhclRpbWUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRToKLSAgICAgICAgICAgICAgICAvL0hBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWSB8IEhBU19USU1FCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19USU1FOgotICAgICAgICAgICAgICAgIC8vSEFTX1RJTUUKLSAgICAgICAgICAgICAgICBjbGVhclllYXIoKTsKLSAgICAgICAgICAgICAgICBjbGVhck1vbnRoKCk7Ci0gICAgICAgICAgICAgICAgY2xlYXJEYXkoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvZGVUeXBlIG11c3QgYmUgb25lIG9mIFNjaGVtYVR5cGUgQlRDXyAgREFURSBUSU1FIHJlbGF0ZWQgdHlwZXMuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVEVOID0gQmlnSW50ZWdlci52YWx1ZU9mKDEwKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYW5vbmljYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiBTcGVjaWZpYyBtb21lbnRzIG9yCi0gICAgICogdGltZXMtb2YtZGF5IGluIGEgc3BlY2lmaWVkIHRpbWV6b25lIGFyZSBub3JtYWxpemVkIHRvCi0gICAgICogVVRDIHRpbWUgdG8gcHJvZHVjZSBhIGNhbm9uaWNhbCBzdHJpbmcgZm9ybSBmb3IgdGhlbS4KLSAgICAgKiBPdGhlciByZWN1cnJpbmcgdGltZSBzcGVjaWZpY2F0aW9ucyBrZWVwIHRoZWlyIHRpbWV6b25lCi0gICAgICogaW5mb3JtYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjYW5vbmljYWxTdHJpbmcoKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBuZWVkTm9ybWFsaXplID0KLSAgICAgICAgICAgIChoYXNUaW1lWm9uZSgpICYmIGdldFRpbWVab25lU2lnbigpICE9IDAgJiYgaGFzVGltZSgpICYmCi0gICAgICAgICAgICAoKGhhc0RheSgpID09IGhhc01vbnRoKCkgJiYgaGFzRGF5KCkgPT0gaGFzWWVhcigpKSkpOwotCi0gICAgICAgIGlmICghbmVlZE5vcm1hbGl6ZSAmJiBnZXRGcmFjdGlvbigpLnNjYWxlKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIGJpID0gZ2V0RnJhY3Rpb24oKS51bnNjYWxlZFZhbHVlKCk7Ci0gICAgICAgICAgICBuZWVkTm9ybWFsaXplID0gKGJpLm1vZChURU4pLnNpZ251bSgpID09IDApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFuZWVkTm9ybWFsaXplKQotICAgICAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCk7Ci0KLSAgICAgICAgR0RhdGVCdWlsZGVyIGNkYXRlID0gbmV3IEdEYXRlQnVpbGRlcih0aGlzKTsKLSAgICAgICAgY2RhdGUubm9ybWFsaXplKCk7Ci0gICAgICAgIHJldHVybiBjZGF0ZS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBuYXR1cmFsIHN0cmluZyByZXByZXNlbnRhdGlvbi4gVGhpcyByZXByZXNlbnRzIHRoZSBpbmZvcm1hdGlvbgotICAgICAqIHRoYXQgaXMgYXZhaWxhYmxlLCBpbmNsdWRpbmcgdGltZXpvbmUuIEZvciB0eXBlcyB0aGF0IGNvcnJlc3BvbmQKLSAgICAgKiB0byBkZWZpbmVkIHNjaGVtYSB0eXBlcyAoc2NoZW1hQnVpbHRpblR5cGVDb2RlKCkgPiAwKSwKLSAgICAgKiB0aGlzIHByb3ZpZGVzIHRoZSBuYXR1cmFsIGxleGljYWwgcmVwcmVzZW50YXRpb24uCi0gICAgICogPHA+Ci0gICAgICogV2hlbiBib3RoIHRpbWUgYW5kIHRpbWV6b25lIGFyZSBzcGVjaWZpZWQsIHRoaXMgc3RyaW5nIGlzIG5vdAotICAgICAqIHRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gdW5sZXNzIHRoZSB0aW1lem9uZSBpcyBVVEMgKFopCi0gICAgICogKHNpbmNlIHRoZSBzYW1lIG1vbWVudCBpbiB0aW1lIGNhbiBiZSBleHByZXNzZWQgaW4gZGlmZmVyZW50Ci0gICAgICogdGltZXpvbmVzKS4gVG8gZ2V0IGEgY2Fub25pY2FsIHN0cmluZywgdXNlIHRoZSBjYW5vbmljYWxTdHJpbmcoKQotICAgICAqIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHRGF0ZS5mb3JtYXRHRGF0ZSh0aGlzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRGF0ZVNwZWNpZmljYXRpb24uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRGF0ZVNwZWNpZmljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkMDc3MS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0RhdGVTcGVjaWZpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBYTUwgU2NoZW1hLWNvbXBhdGlibGUgR3JlZ29yaWFuIGRhdGUuCi0gKiA8cD4KLSAqIEJvdGggdGhlIGltbXV0YWJsZSBHRGF0ZSBhbmQgdGhlIG11dGFibGUgR0RhdGVCdWlsZGVyIGFyZQotICogR0RhdGVTcGVjaWZpY2F0aW9ucy4gIFVzZSB0aGlzIGludGVyZmFjZSB3aGVyZSB5b3Ugd2FudCB0bwotICogYWxsb3cgY2FsbGVycyB0byBwYXNzIGFueSBpbXBsZW1lbnRhdGlvbiBvZiBhIEdEYXRlLgotICogCi0gKiBAc2VlIEdEYXRlCi0gKiBAc2VlIFhtbENhbGVuZGFyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR0RhdGVTcGVjaWZpY2F0aW9uCi17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvbWJpbmF0aW9uIG9mIGZsYWdzIGluZGljYXRpbmcgdGhlIGluZm9ybWF0aW9uCi0gICAgICogY29udGFpbmVkIGJ5IHRoaXMgR0RhdGUuICBUaGUgZml2ZSBmbGFncyBhcmUKLSAgICAgKiB7QGxpbmsgI0hBU19USU1FWk9ORX0sIHtAbGluayAjSEFTX1lFQVJ9LCB7QGxpbmsgI0hBU19NT05USH0sCi0gICAgICoge0BsaW5rICNIQVNfREFZfSwgYW5kIHtAbGluayAjSEFTX1RJTUV9LgotICAgICAqLwotICAgIGludCBnZXRGbGFncygpOwotCi0gICAgLyoqIFRpbWV6b25lIGlzIHNwZWNpZmllZC4gU2VlIHtAbGluayAjZ2V0RmxhZ3N9LiAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgSEFTX1RJTUVaT05FID0gMTsKLSAgICAvKiogWWVhciBpcyBzcGVjaWZpZWQuIFNlZSB7QGxpbmsgI2dldEZsYWdzfS4gKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IEhBU19ZRUFSID0gMjsKLSAgICAvKiogTW9udGggb2YgeWVhciBpcyBzcGVjaWZpZWQuIFNlZSB7QGxpbmsgI2dldEZsYWdzfS4gKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IEhBU19NT05USCA9IDQ7Ci0gICAgLyoqIERheSBvZiBtb250aCBpcyBzcGVjaWZpZWQuIFNlZSB7QGxpbmsgI2dldEZsYWdzfS4gKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IEhBU19EQVkgPSA4OwotICAgIC8qKiBUaW1lIG9mIGRheSBpcyBzcGVjaWZpZWQuIFNlZSB7QGxpbmsgI2dldEZsYWdzfS4gKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IEhBU19USU1FID0gMTY7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgR0RhdGUgc3BlY2lmaWNhdGlvbiBpcyBpbW11dGFibGUuIEdEYXRlIHJldHVybnMgdHJ1ZSwKLSAgICAgKiBhbmQgR0RhdGVCdWlsZGVyIHJldHVybnMgZmFsc2UuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0ltbXV0YWJsZSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIEdEYXRlIGNvcnJlc3BvbmRzIHRvIGEgdmFsaWQgZ3JlZ29yaWFuIGRhdGUgdmFsdWUKLSAgICAgKiBpbiBYTUwgc2NoZW1hLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNWYWxpZCgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIHRpbWV6b25lLgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzVGltZVpvbmUoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSB5ZWFyLgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzWWVhcigpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIG1vbnRoLW9mLXllYXIuCi0gICAgICovCi0gICAgYm9vbGVhbiBoYXNNb250aCgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIGRheS1vZi1tb250aC4KLSAgICAgKi8KLSAgICBib29sZWFuIGhhc0RheSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIHRpbWUtb2YtZGF5LgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzVGltZSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIGZ1bGwgZGF0ZSAoeWVhciwgbW9udGgsIGRheSkKLSAgICAgKi8KLSAgICBib29sZWFuIGhhc0RhdGUoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHllYXIuIFNob3VsZCBiZSBhIGZvdXItZGlnaXQgeWVhciBzcGVjaWZpY2F0aW9uLgotICAgICAqLwotICAgIGludCBnZXRZZWFyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtb250aC1vZi15ZWFyLiBKYW51YXJ5IGlzIDEuCi0gICAgICovCi0gICAgaW50IGdldE1vbnRoKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkYXktb2YtbW9udGguIFRoZSBmaXJzdCBkYXkgb2YgZWFjaCBtb250aCBpcyAxLgotICAgICAqLwotICAgIGludCBnZXREYXkoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhvdXItb2YtZGF5LiBNaWRuaWdodCBpcyAwLCBhbmQgMTFQTSBpcyAyMy4KLSAgICAgKi8KLSAgICBpbnQgZ2V0SG91cigpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWludXRlLW9mLWhvdXIuIFJhbmdlIGZyb20gMCB0byA1OS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0TWludXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZWNvbmQtb2YtbWludXRlLiBSYW5nZSBmcm9tIDAgdG8gNTkuCi0gICAgICovCi0gICAgaW50IGdldFNlY29uZCgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZSB6b25lIHNpZ24uIEZvciB0aW1lIHpvbmVzIGVhc3Qgb2YgR01ULAotICAgICAqIHRoaXMgaXMgcG9zaXRpdmU7IGZvciB0aW1lIHpvbmVzIHdlc3QsIHRoaXMgaXMgbmVnYXRpdmUuCi0gICAgICovCi0gICAgaW50IGdldFRpbWVab25lU2lnbigpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZSB6b25lIGhvdXIuCi0gICAgICogVGhpcyBpcyBhbHdheXMgcG9zaXRpdmU6IGZvciB0aGUgc2lnbiwgbG9vayBhdAotICAgICAqIGdldFRpbWVab25lU2lnbigpLgotICAgICAqLwotICAgIGludCBnZXRUaW1lWm9uZUhvdXIoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbWUgem9uZSBtaW51dGVzLgotICAgICAqIFRoaXMgaXMgYWx3YXlzIHBvc2l0aXZlOiBmb3IgdGhlIHNpZ24sIGxvb2sgYXQKLSAgICAgKiBnZXRUaW1lWm9uZVNpZ24oKS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0VGltZVpvbmVNaW51dGUoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZyYWN0aW9uLW9mLXNlY29uZC4gUmFuZ2UgZnJvbSAwIChpbmNsdXNpdmUpIHRvIDEgKGV4Y2x1c2l2ZSkuCi0gICAgICovCi0gICAgQmlnRGVjaW1hbCBnZXRGcmFjdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm91bmRlZCBtaWxsaXNlY29uZCB2YWx1ZS4gUmFuZ2UgZnJvbSAwIHRvIDk5OQotICAgICAqLwotICAgIGludCBnZXRNaWxsaXNlY29uZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSnVsaWFuIGRhdGUgY29ycmVzcG9uZGluZyB0byB0aGlzIEdyZWdvcmlhbiBkYXRlLgotICAgICAqIFRoZSBKdWxpYW4gZGF0ZSAoSkQpIGlzIGEgY29udGludW91cyBjb3VudCBvZiBkYXlzIGZyb20KLSAgICAgKiAxIEphbnVhcnkgNDcxMyBCQyAoPSAtNDcxMiBKYW51YXJ5IDEpLgotICAgICAqLwotICAgIGludCBnZXRKdWxpYW5EYXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHRpbWUgYXMgYW4ge0BsaW5rIFhtbENhbGVuZGFyfS4KLSAgICAgKiA8cD4KLSAgICAgKiB7QGxpbmsgWG1sQ2FsZW5kYXJ9IGlzIGEgc3ViY2xhc3Mgb2Yge0BsaW5rIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcn0KLSAgICAgKiB3aGljaCBpcyBzbGlnaHRseSBjdXN0b21pemVkIHRvIG1hdGNoIFhNTCBzY2hlbWEgZGF0ZSBydWxlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmV0dXJuZWQge0BsaW5rIFhtbENhbGVuZGFyfSBoYXMgb25seSB0aG9zZSB0aW1lIGFuZCBkYXRlIGZpZWxkcwotICAgICAqIHNldCB0aGF0IGFyZSByZWZsZWN0ZWQgaW4gdGhlIEdEYXRlIG9iamVjdC4gIEJlY2F1c2Ugb2YgdGhlIHdheSB0aGUKLSAgICAgKiB7QGxpbmsgamF2YS51dGlsLkNhbGVuZGFyfSBjb250cmFjdCB3b3JrcywgYW55IGluZm9ybWF0aW9uIGluIHRoZSBpc1NldCgpIHZhbmlzaGVzCi0gICAgICogYXMgc29vbiBhcyB5b3UgdmlldyBhbnkgdW5zZXQgZmllbGQgdXNpbmcgZ2V0KCkgbWV0aG9kcy4KLSAgICAgKiBUaGlzIG1lYW5zIHRoYXQgaWYgaXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgd2hpY2ggZGF0ZSBmaWVsZHMKLSAgICAgKiBhcmUgc2V0LCB5b3UgbXVzdCBjYWxsIGlzU2V0KCkgZmlyc3QgYmVmb3JlIGdldCgpLgotICAgICAqLwotICAgIFhtbENhbGVuZGFyIGdldENhbGVuZGFyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHRpbWUgYXMgYSBqYXZhLnV0aWwuRGF0ZQotICAgICAqIGluc3RhbmNlLgotICAgICAqLwotICAgIERhdGUgZ2V0RGF0ZSgpOwotCi0gICAgLyoqCi0gICAgICogQ29tcGFyaXNvbiB0byBhbm90aGVyIEdEYXRlLgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+UmV0dXJucyAtMSBpZiB0aGlzIDwgZGF0ZS4gKGxlc3MtdGhhbikKLSAgICAgKiA8bGk+UmV0dXJucyAwIGlmIHRoaXMgPT0gZGF0ZS4gKGVxdWFsKQotICAgICAqIDxsaT5SZXR1cm5zIDEgaWYgdGhpcyA+IGRhdGUuIChncmVhdGVyLXRoYW4pCi0gICAgICogPGxpPlJldHVybnMgMiBpZiB0aGlzIDw+IGRhdGUuIChpbmNvbXBhcmFibGUpCi0gICAgICogPC91bD4KLSAgICAgKiBUd28gaW5zdGFuY2VzIGFyZSBpbmNvbXBhcmFibGUgaWYgdGhleSBoYXZlIGRpZmZlcmVudCBhbW91bnRzCi0gICAgICogb2YgaW5mb3JtYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGdkYXRlc3BlYyB0aGUgZGF0ZSB0byBjb21wYXJlIGFnYWluc3QuCi0gICAgICovCi0gICAgaW50IGNvbXBhcmVUb0dEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiBnZGF0ZXNwZWMpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYnVpbHRpbiB0eXBlIGNvZGUgZm9yIHRoZSBzaGFwZSBvZiB0aGUgaW5mb3JtYXRpb24KLSAgICAgKiBjb250YWluZWQgaW4gdGhpcyBpbnN0YW5jZSwgb3IgMCBpZiB0aGUKLSAgICAgKiBpbnN0YW5jZSBkb2Vzbid0IGNvbnRhaW4gaW5mb3JtYXRpb24gY29ycmVzcG9uZGluZyB0byBhCi0gICAgICogU2NoZW1hIHR5cGUuCi0gICAgICogPHA+IAotICAgICAqIFZhbHVlIHdpbGwgYmUgZXF1YWwgdG8KLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfTk9UX0JVSUxUSU59LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX1lFQVJ9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX1lFQVJfTU9OVEh9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX01PTlRIfSwKLSAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19NT05USF9EQVl9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX0RBWX0sCi0gICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0RBVEV9LAotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19EQVRFX1RJTUV9LCBvcgotICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19USU1FfS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0QnVpbHRpblR5cGVDb2RlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2Fub25pY2FsIHN0cmluZyByZXByZXNlbnRhdGlvbi4gU3BlY2lmaWMgbW9tZW50cyBvcgotICAgICAqIHRpbWVzLW9mLWRheSBpbiBhIHNwZWNpZmllZCB0aW1lem9uZSBhcmUgbm9ybWFsaXplZCB0bwotICAgICAqIFVUQyB0aW1lIHRvIHByb2R1Y2UgYSBjYW5vbmljYWwgc3RyaW5nIGZvcm0gZm9yIHRoZW0uCi0gICAgICogT3RoZXIgcmVjdXJyaW5nIHRpbWUgc3BlY2lmaWNhdGlvbnMga2VlcCB0aGVpciB0aW1lem9uZQotICAgICAqIGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIFN0cmluZyBjYW5vbmljYWxTdHJpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYXR1cmFsIHN0cmluZyByZXByZXNlbnRhdGlvbi4gVGhpcyByZXByZXNlbnRzIHRoZSBpbmZvcm1hdGlvbgotICAgICAqIHRoYXQgaXMgYXZhaWxhYmxlLCBpbmNsdWRpbmcgdGltZXpvbmUuIEZvciB0eXBlcyB0aGF0IGNvcnJlc3BvbmQKLSAgICAgKiB0byBkZWZpbmVkIHNjaGVtYSB0eXBlcyAoc2NoZW1hQnVpbHRpblR5cGVDb2RlKCkgPiAwKSwKLSAgICAgKiB0aGlzIHByb3ZpZGVzIHRoZSBuYXR1cmFsIGxleGljYWwgcmVwcmVzZW50YXRpb24uCi0gICAgICoKLSAgICAgKiBXaGVuIGJvdGggdGltZSBhbmQgdGltZXpvbmUgYXJlIHNwZWNpZmllZCwgdGhpcyBzdHJpbmcgaXMgbm90Ci0gICAgICogdGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiB1bmxlc3MgdGhlIHRpbWV6b25lIGlzIFVUQyAoWikKLSAgICAgKiAoc2luY2UgdGhlIHNhbWUgbW9tZW50IGluIHRpbWUgY2FuIGJlIGV4cHJlc3NlZCBpbiBkaWZmZXJlbnQKLSAgICAgKiB0aW1lem9uZXMpLiBUbyBnZXQgYSBjYW5vbmljYWwgc3RyaW5nLCB1c2UgdGhlIGNhbm9uaWNhbFN0cmluZygpCi0gICAgICogbWV0aG9kLgotICAgICAqLwotICAgIFN0cmluZyB0b1N0cmluZygpOwotCi19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0R1cmF0aW9uLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0R1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NmU3OWYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEdXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gWE1MIFNjaGVtYS1jb21wYXRpYmxlIGR1cmF0aW9uLgotICogPHA+Ci0gKiBBIGR1cmF0aW9uIGlzIG1hZGUgdXAgb2YgYSBudW1iZXIgb2YgeWVhcnMsIG1vbnRocywgZGF5cywgaG91cnMsCi0gKiBtaW51dGVzLCBzZWNvbmRzLCBhbmQgZnJhY3Rpb25zIG9mIHNlY29uZHMuIFNlZSB0aGUKLSAqIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbgotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkdXJhdGlvbiI+c2VjdGlvbiBvbiB4czpkdXJhdGlvbjwvYT4KLSAqIGZvciBkZXRhaWxzIG9uIHRoZSBydWxlcyBmb3IKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZHVyYXRpb24tb3JkZXIiPmNvbXBhcmluZyBkdXJhdGlvbnM8L2E+IGFuZAotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNhZGRpbmctZHVyYXRpb25zLXRvLWRhdGVUaW1lcyI+YWRkaW5nIGR1cmF0aW9ucyB0byBkYXRlczwvYT4uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBHRHVyYXRpb24gaW1wbGVtZW50cyBHRHVyYXRpb25TcGVjaWZpY2F0aW9uLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIAotICAgIHByaXZhdGUgaW50IF9zaWduOwotICAgIHByaXZhdGUgaW50IF9DWTsKLSAgICBwcml2YXRlIGludCBfTTsKLSAgICBwcml2YXRlIGludCBfRDsKLSAgICBwcml2YXRlIGludCBfaDsKLSAgICBwcml2YXRlIGludCBfbTsKLSAgICBwcml2YXRlIGludCBfczsKLSAgICBwcml2YXRlIEJpZ0RlY2ltYWwgX2ZzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSBHRHVyYXRpb24gcmVwcmVzZW50aW5nIHplcm8gc2Vjb25kcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0R1cmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIF9zaWduID0gKzE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFRU5fTk9USElORyA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFRU5fWUVBUiA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFRU5fTU9OVEggPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUVOX0RBWSA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFRU5fSE9VUiA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFRU5fTUlOVVRFID0gNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VFTl9TRUNPTkQgPSA2OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEdEdXJhdGlvbiBmcm9tIGEgbGV4aWNhbAotICAgICAqIHJlcHJlc2VudGF0aW9uLiBUaGUgbGV4aWNhbCBzcGFjZSBjb250YWlucyB0aGUKLSAgICAgKiB1bmlvbiBvZiB0aGUgbGV4aWNhbCBzcGFjZXMgb2YgYWxsIHRoZSBzY2hlbWEKLSAgICAgKiBkYXRlL3RpbWUgdHlwZXMgKGV4Y2VwdCBmb3IgZHVyYXRpb24pLgotICAgICAqLwotICAgIHB1YmxpYyBHRHVyYXRpb24oQ2hhclNlcXVlbmNlIHN0cikKLSAgICB7Ci0gICAgICAgIC8vIEZvcm06ICAgICAgICAtUG5Zbk1uRFRuSG5NblMKLSAgICAgICAgLy8gKHdoZXJlIGVhY2ggbiBtYXkgYmUgcHJlY2VkZWQgYnkgYSAtIGZvciB1cywgYW5kIHRoZSB3aG9sZSBtYXkgYmUgLSkKLQotICAgICAgICAvLyBmaXJzdCB0cmltIFhNTCB3aGl0ZXNwYWNlCi0gICAgICAgIGludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0gICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgIHdoaWxlIChsZW4gPiAwICYmIEdEYXRlLmlzU3BhY2Uoc3RyLmNoYXJBdChsZW4gLSAxKSkpCi0gICAgICAgICAgICBsZW4gLT0gMTsKLSAgICAgICAgd2hpbGUgKHN0YXJ0IDwgbGVuICYmIEdEYXRlLmlzU3BhY2Uoc3RyLmNoYXJBdChzdGFydCkpKQotICAgICAgICAgICAgc3RhcnQgKz0gMTsKLQotICAgICAgICBfc2lnbiA9IDE7Ci0gICAgICAgIGJvb2xlYW4gdG1hcmsgPSBmYWxzZTsKLQotICAgICAgICBpZiAoc3RhcnQgPCBsZW4gJiYgc3RyLmNoYXJBdChzdGFydCkgPT0gJy0nKQotICAgICAgICB7Ci0gICAgICAgICAgICBfc2lnbiA9IC0xOwotICAgICAgICAgICAgc3RhcnQgKz0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdGFydCA+PSBsZW4gfHwgc3RyLmNoYXJBdChzdGFydCkgIT0gJ1AnKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZHVyYXRpb24gbXVzdCBiZWdpbiB3aXRoIFAiKTsKLQotICAgICAgICBzdGFydCArPSAxOwotCi0gICAgICAgIGludCBzZWVuID0gU0VFTl9OT1RISU5HOwotICAgICAgICBfZnMgPSBHRGF0ZS5femVybzsKLQotICAgICAgICBmb3IgKDtzdGFydCA8IGxlbjsgc3RhcnQgKz0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBuZWd2YWwgPSBmYWxzZTsKLSAgICAgICAgICAgIGNoYXIgY2ggPSBzdHIuY2hhckF0KHN0YXJ0KTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnVCcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHRtYXJrKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkdXJhdGlvbiBtdXN0IGhhdmUgbm8gbW9yZSB0aGFuIG9uZSBUJyIpOwotICAgICAgICAgICAgICAgIGlmIChzZWVuID4gU0VFTl9EQVkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlQgaW4gZHVyYXRpb24gbXVzdCBwcmVjZWRlIHRpbWUgZmllbGRzIik7Ci0gICAgICAgICAgICAgICAgc2VlbiA9IFNFRU5fREFZOwotICAgICAgICAgICAgICAgIHRtYXJrID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzdGFydCArPSAxOwotICAgICAgICAgICAgICAgIGlmIChzdGFydCA+PSBsZW4pCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgZHVyYXRpb24iKTsKLSAgICAgICAgICAgICAgICBjaCA9IHN0ci5jaGFyQXQoc3RhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoID09ICctJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZWd2YWwgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmIChzdGFydCA9PSBsZW4pCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgZHVyYXRpb24iKTsKLSAgICAgICAgICAgICAgICBzdGFydCArPSAxOwotICAgICAgICAgICAgICAgIGNoID0gc3RyLmNoYXJBdChzdGFydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIUdEYXRlLmlzRGlnaXQoY2gpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgZHVyYXRpb24iKTsKLSAgICAgICAgICAgIGludCB2YWx1ZSA9IEdEYXRlLmRpZ2l0VmFsKGNoKTsKLSAgICAgICAgICAgIGZvciAoOzspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhcnQgKz0gMTsKLSAgICAgICAgICAgICAgICBjaCA9IChzdGFydCA8IGxlbikgPyBzdHIuY2hhckF0KHN0YXJ0KSA6ICdcMCc7Ci0gICAgICAgICAgICAgICAgaWYgKCFHRGF0ZS5pc0RpZ2l0KGNoKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAqIDEwICsgR0RhdGUuZGlnaXRWYWwoY2gpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoID09ICcuJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IHN0YXJ0OwotICAgICAgICAgICAgICAgIGRvIGkgKz0gMTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGxlbiAmJiBHRGF0ZS5pc0RpZ2l0KGNoID0gc3RyLmNoYXJBdChpKSkpOwotICAgICAgICAgICAgICAgIF9mcyA9IG5ldyBCaWdEZWNpbWFsKHN0ci5zdWJTZXF1ZW5jZShzdGFydCwgaSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPj0gbGVuIHx8IGNoICE9ICdTJykKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCBkdXJhdGlvbiIpOwotICAgICAgICAgICAgICAgIHN0YXJ0ID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuZWd2YWwpCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAtdmFsdWU7Ci0gICAgICAgICAgICBzd2l0Y2ggKHNlZW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRUVOX05PVEhJTkc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnWScpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZW4gPSBTRUVOX1lFQVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfQ1kgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IC8vIGZhbGx0aHJvdWdoCi0gICAgICAgICAgICAgICAgY2FzZSBTRUVOX1lFQVI6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnTScpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZW4gPSBTRUVOX01PTlRIOwotICAgICAgICAgICAgICAgICAgICAgICAgX00gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IC8vIGZhbGx0aHJvdWdoCi0gICAgICAgICAgICAgICAgY2FzZSBTRUVOX01PTlRIOgotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ0QnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWVuID0gU0VFTl9EQVk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfRCA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gLy8gZmFsbHRocm91Z2gKLSAgICAgICAgICAgICAgICBjYXNlIFNFRU5fREFZOgotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ0gnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRtYXJrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRpbWUgaW4gZHVyYXRpb24gbXVzdCBmb2xsb3cgVCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VlbiA9IFNFRU5fSE9VUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9oID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSAvLyBmYWxsdGhyb3VnaAotICAgICAgICAgICAgICAgIGNhc2UgU0VFTl9IT1VSOgotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ00nKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRtYXJrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRpbWUgaW4gZHVyYXRpb24gbXVzdCBmb2xsb3cgVCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VlbiA9IFNFRU5fTUlOVVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgX20gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IC8vIGZhbGx0aHJvdWdoCi0gICAgICAgICAgICAgICAgY2FzZSBTRUVOX01JTlVURToKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICdTJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0bWFyaykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aW1lIGluIGR1cmF0aW9uIG11c3QgZm9sbG93IFQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZW4gPSBTRUVOX1NFQ09ORDsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9zID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSAvLyBmYWxsdGhyb3VnaAotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cmF0aW9uIG11c3Qgc3BlY2lmeSBZIE0gRCBUIEggTSBTIGluIG9yZGVyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgR0R1cmF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBzaWduLAotICAgICAqIHllYXIsIG1vbnRoLCBkYXksIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgb3B0aW9uYWwKLSAgICAgKiBmcmFjdGlvbmFsIHNlY29uZHMuCi0gICAgICovCi0gICAgcHVibGljIEdEdXJhdGlvbigKLSAgICAgICAgICAgIGludCBzaWduLAotICAgICAgICAgICAgaW50IHllYXIsCi0gICAgICAgICAgICBpbnQgbW9udGgsCi0gICAgICAgICAgICBpbnQgZGF5LAotICAgICAgICAgICAgaW50IGhvdXIsCi0gICAgICAgICAgICBpbnQgbWludXRlLAotICAgICAgICAgICAgaW50IHNlY29uZCwKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgZnJhY3Rpb24pCi0gICAgewotICAgICAgICBpZiAoc2lnbiAhPSAxICYmIHNpZ24gIT0gLTEpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIF9zaWduID0gc2lnbjsKLSAgICAgICAgX0NZID0geWVhcjsKLSAgICAgICAgX00gPSBtb250aDsKLSAgICAgICAgX0QgPSBkYXk7Ci0gICAgICAgIF9oID0gaG91cjsKLSAgICAgICAgX20gPSBtaW51dGU7Ci0gICAgICAgIF9zID0gc2Vjb25kOwotICAgICAgICBfZnMgPSBmcmFjdGlvbiA9PSBudWxsID8gR0RhdGUuX3plcm8gOiBmcmFjdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgR0R1cmF0aW9uIGZyb20gYW5vdGhlciBHRHVyYXRpb25TcGVjaWZpY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBHRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBnRHVyYXRpb24pCi0gICAgewotICAgICAgICBfc2lnbiA9IGdEdXJhdGlvbi5nZXRTaWduKCk7Ci0gICAgICAgIF9DWSA9IGdEdXJhdGlvbi5nZXRZZWFyKCk7Ci0gICAgICAgIF9NID0gZ0R1cmF0aW9uLmdldE1vbnRoKCk7Ci0gICAgICAgIF9EID0gZ0R1cmF0aW9uLmdldERheSgpOwotICAgICAgICBfaCA9IGdEdXJhdGlvbi5nZXRIb3VyKCk7Ci0gICAgICAgIF9tID0gZ0R1cmF0aW9uLmdldE1pbnV0ZSgpOwotICAgICAgICBfcyA9IGdEdXJhdGlvbi5nZXRTZWNvbmQoKTsKLSAgICAgICAgX2ZzID0gZ0R1cmF0aW9uLmdldEZyYWN0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGFub3RoZXIgR0RhdGUgd2l0aCB0aGUgc2FtZSB2YWx1ZQotICAgICAqIGFzIHRoaXMgb25lLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHRHVyYXRpb24odGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWxsIEdEdXJhdGlvbiBpbnN0YW5jZXMgcmV0dXJuIHRydWUuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbW11dGFibGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2lnbiBvZiB0aGUgZHVyYXRpb246ICsxIGlzIGZvcndhcmRzCi0gICAgICogYW5kIC0xIGlzIGJhY2t3YXJkcyBpbiB0aW1lLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0U2lnbigpCi0gICAgICAgIHsgcmV0dXJuIF9zaWduOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB5ZWFyIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFllYXIoKQotICAgICAgICB7IHJldHVybiBfQ1k7ICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtb250aC1vZi15ZWFyIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldE1vbnRoKCkKLSAgICAgICAgeyByZXR1cm4gX007ICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkYXktb2YtbW9udGggY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RGF5KCkKLSAgICAgICAgeyByZXR1cm4gX0Q7IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhvdXItb2YtZGF5IGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEhvdXIoKQotICAgICAgICB7IHJldHVybiBfaDsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWludXRlLW9mLWhvdXIgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TWludXRlKCkKLSAgICAgICAgeyByZXR1cm4gX207IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNlY29uZC1vZi1taW51dGUgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0U2Vjb25kKCkKLSAgICAgICAgeyByZXR1cm4gX3M7IH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZnJhY3Rpb24tb2Ytc2Vjb25kLiBSYW5nZSBmcm9tIDAgKGluY2x1c2l2ZSkgdG8gMSAoZXhjbHVzaXZlKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRGcmFjdGlvbigpCi0gICAgICAgIHsgcmV0dXJuIF9mczsgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIGFsbCBvZiB0aGUgaW5kaXZpZHVhbCBjb21wb25lbnRzCi0gICAgICogb2YgdGhlIGR1cmF0aW9uIGFyZSBub25uZWdhdGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHRHVyYXRpb25CdWlsZGVyLmlzVmFsaWREdXJhdGlvbih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJpc29uIHRvIGFub3RoZXIgR0R1cmF0aW9uLgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+UmV0dXJucyAtMSBpZiB0aGlzIDwgZGF0ZS4gKGxlc3MtdGhhbikKLSAgICAgKiA8bGk+UmV0dXJucyAwIGlmIHRoaXMgPT0gZGF0ZS4gKGVxdWFsKQotICAgICAqIDxsaT5SZXR1cm5zIDEgaWYgdGhpcyA+IGRhdGUuIChncmVhdGVyLXRoYW4pCi0gICAgICogPGxpPlJldHVybnMgMiBpZiB0aGlzIDw+IGRhdGUuIChpbmNvbXBhcmFibGUpCi0gICAgICogPC91bD4KLSAgICAgKiBUd28gaW5zdGFuY2VzIGFyZSBpbmNvbXBhcmFibGUgaWYgdGhleSBoYXZlIGRpZmZlcmVudCBhbW91bnRzCi0gICAgICogb2YgaW5mb3JtYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBjb21wYXJlVG9HRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBHRHVyYXRpb25CdWlsZGVyLmNvbXBhcmVEdXJhdGlvbnModGhpcywgZHVyYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBuYXR1cmFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZHVyYXRpb24uCi0gICAgICogPHA+Ci0gICAgICogQW55IGNvbXBvbmVudHMgdGhhdCBhcmUgemVybyBhcmUgb21pdHRlZC4gTm90ZSB0aGF0IGlmIHRoZSBkdXJhdGlvbgotICAgICAqIGlzIGludmFsaWQsIGkuZS4sIGl0IGhhcyBuZWdhdGl2ZSBjb21wb25lbnRzLCB0aG9zZSBuZWdhdGl2ZQotICAgICAqIGNvbXBvbmVudHMgYXJlIHNlcmlhbGl6ZWQgb3V0IGhlcmUuIFRvIGNoZWNrIGZvciB2YWxpZGl0eSwgdXNlCi0gICAgICogdGhlIGlzVmFsaWQoKSBtZXRob2Q7IGFuZCB0byBub3JtYWxpemUgbW9zdCBkdXJhdGlvbnMgdG8gYSB2YWxpZAotICAgICAqIGZvcm0gdXNlIHRoZSBub3JtYWxpemUoKSBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gR0R1cmF0aW9uQnVpbGRlci5mb3JtYXREdXJhdGlvbih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IEdEdXJhdGlvbiB3aGljaCBpcyB0aGUgc3VtIG9mIHRoaXMgb25lIGFuZCB0aGUKLSAgICAgKiBzdXBwbGllZCBkdXJhdGlvbi4gIERvZXMgYSBmaWVsZHdpc2UgYWRkaXRpb24sIHdpdGggbm8gbm9ybWFsaXphdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0R1cmF0aW9uIGFkZChHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGR1cmF0aW9uKQotICAgIHsKLSAgICAgICAgaW50IHNpZ24gPSBfc2lnbiAqIGR1cmF0aW9uLmdldFNpZ24oKTsKLSAgICAgICAgcmV0dXJuIF9hZGQoZHVyYXRpb24sIHNpZ24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgR0R1cmF0aW9uIHdoaWNoIGlzIHRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcKLSAgICAgKiB0aGUgc3VwcGxpZWQgZHVyYXRpb24gZnJvbSB0aGlzIG9uZS4gIERvZXMgYSBmaWVsZHdpc2UKLSAgICAgKiBzdWJ0cmFjdGlvbiwgd2l0aCBubyBub3JtYWxpemF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBHRHVyYXRpb24gc3VidHJhY3QoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIGludCBzaWduID0gLV9zaWduICogZHVyYXRpb24uZ2V0U2lnbigpOwotICAgICAgICByZXR1cm4gX2FkZChkdXJhdGlvbiwgc2lnbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBHRHVyYXRpb24gX2FkZChHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGR1cmF0aW9uLCBpbnQgc2lnbikKLSAgICB7Ci0gICAgICAgIEdEdXJhdGlvbiByZXN1bHQgPSBuZXcgR0R1cmF0aW9uKHRoaXMpOwotICAgICAgICByZXN1bHQuX0NZICs9IHNpZ24gKiBkdXJhdGlvbi5nZXRZZWFyKCk7Ci0gICAgICAgIHJlc3VsdC5fTSArPSBzaWduICogZHVyYXRpb24uZ2V0TW9udGgoKTsKLSAgICAgICAgcmVzdWx0Ll9EICs9IHNpZ24gKiBkdXJhdGlvbi5nZXREYXkoKTsKLSAgICAgICAgcmVzdWx0Ll9oICs9IHNpZ24gKiBkdXJhdGlvbi5nZXRIb3VyKCk7Ci0gICAgICAgIHJlc3VsdC5fbSArPSBzaWduICogZHVyYXRpb24uZ2V0TWludXRlKCk7Ci0gICAgICAgIHJlc3VsdC5fcyArPSBzaWduICogZHVyYXRpb24uZ2V0U2Vjb25kKCk7Ci0KLSAgICAgICAgaWYgKGR1cmF0aW9uLmdldEZyYWN0aW9uKCkuc2lnbnVtKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAgICAgaWYgKHJlc3VsdC5fZnMuc2lnbnVtKCkgPT0gMCAmJiBzaWduID09IDEpCi0gICAgICAgICAgICByZXN1bHQuX2ZzID0gZHVyYXRpb24uZ2V0RnJhY3Rpb24oKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVzdWx0Ll9mcyA9IHNpZ24gPiAwID8KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0Ll9mcy5hZGQoZHVyYXRpb24uZ2V0RnJhY3Rpb24oKSkgOgotICAgICAgICAgICAgICAgICAgICByZXN1bHQuX2ZzLnN1YnRyYWN0KGR1cmF0aW9uLmdldEZyYWN0aW9uKCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFR3byBHRHVyYXRpb25zIGFyZSBlcXVhbCBpZiBhbGwgdGhlaXIgZmllbGRzIGFyZSBlcXVhbC4KLSAgICAgKiBUaGUgZXF1YWxzIGZ1bmN0aW9uIGRvZXMgbm90IGFwcGx5IG5vcm1hbGl6YXRpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIGlmIChvYmogPT0gdGhpcykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBHRHVyYXRpb24pKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIEdEdXJhdGlvbiBkdXJhdGlvbiA9IChHRHVyYXRpb24pb2JqOwotICAgICAgICByZXR1cm4gKF9zaWduID09IGR1cmF0aW9uLmdldFNpZ24oKSAmJgotICAgICAgICAgICAgICAgIF9DWSA9PSBkdXJhdGlvbi5nZXRZZWFyKCkgJiYKLSAgICAgICAgICAgICAgICBfTSA9PSBkdXJhdGlvbi5nZXRNb250aCgpICYmCi0gICAgICAgICAgICAgICAgX0QgPT0gZHVyYXRpb24uZ2V0RGF5KCkgJiYKLSAgICAgICAgICAgICAgICBfaCA9PSBkdXJhdGlvbi5nZXRIb3VyKCkgJiYKLSAgICAgICAgICAgICAgICBfbSA9PSBkdXJhdGlvbi5nZXRNaW51dGUoKSAmJgotICAgICAgICAgICAgICAgIF9zID09IGR1cmF0aW9uLmdldFNlY29uZCgpICYmCi0gICAgICAgICAgICAgICAgX2ZzLmVxdWFscyhkdXJhdGlvbi5nZXRGcmFjdGlvbigpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKF9zICsKLSAgICAgICAgICAgICAgICBfbSAqICg2MCArIDcpICsKLSAgICAgICAgICAgICAgICBfaCAqICg2MCAqIDYwICsgNykgKwotICAgICAgICAgICAgICAgIF9EICogKDYwICogNjAgKiAyNCArIDcpICsKLSAgICAgICAgICAgICAgICBfTSAqICg2MCAqIDYwICogMjQgKiAzMSArIDcpICsKLSAgICAgICAgICAgICAgICBfQ1kgKig2MCAqIDYwICogMjQgKiAzNzIgKyA3KSArCi0gICAgICAgICAgICAgICAgX3NpZ24gKiAxMTkxNzA0OSk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEdXJhdGlvbkJ1aWxkZXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRHVyYXRpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMGM2ODcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEdXJhdGlvbkJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLQotLyoqCi0gKiBVc2VkIHRvIGJ1aWxkIHtAbGluayBHRHVyYXRpb24gR0R1cmF0aW9uc30uCi0gKi8gCi1wdWJsaWMgY2xhc3MgR0R1cmF0aW9uQnVpbGRlciBpbXBsZW1lbnRzIEdEdXJhdGlvblNwZWNpZmljYXRpb24sIGphdmEuaW8uU2VyaWFsaXphYmxlCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgX3NpZ247Ci0gICAgcHJpdmF0ZSBpbnQgX0NZOwotICAgIHByaXZhdGUgaW50IF9NOwotICAgIHByaXZhdGUgaW50IF9EOwotICAgIHByaXZhdGUgaW50IF9oOwotICAgIHByaXZhdGUgaW50IF9tOwotICAgIHByaXZhdGUgaW50IF9zOwotICAgIHByaXZhdGUgQmlnRGVjaW1hbCBfZnM7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IEdEdXJhdGlvbkJ1aWxkZXIgcmVwcmVzZW50aW5nIHplcm8gc2Vjb25kcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0R1cmF0aW9uQnVpbGRlcigpCi0gICAgewotICAgICAgICBfc2lnbiA9ICsxOwotICAgICAgICBfZnMgPSBHRGF0ZS5femVybzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgR0R1cmF0aW9uIGZyb20gYSBsZXhpY2FsCi0gICAgICogcmVwcmVzZW50YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIEdEdXJhdGlvbkJ1aWxkZXIoU3RyaW5nIHMpCi0gICAgewotICAgICAgICB0aGlzKG5ldyBHRHVyYXRpb24ocykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBHRHVyYXRpb25CdWlsZGVyIHdpdGggdGhlIHNwZWNpZmllZCBzaWduLAotICAgICAqIHllYXIsIG1vbnRoLCBkYXksIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgb3B0aW9uYWwKLSAgICAgKiBmcmFjdGlvbmFsIHNlY29uZHMuCi0gICAgICovCi0gICAgcHVibGljIEdEdXJhdGlvbkJ1aWxkZXIoCi0gICAgICAgICAgICBpbnQgc2lnbiwKLSAgICAgICAgICAgIGludCB5ZWFyLAotICAgICAgICAgICAgaW50IG1vbnRoLAotICAgICAgICAgICAgaW50IGRheSwKLSAgICAgICAgICAgIGludCBob3VyLAotICAgICAgICAgICAgaW50IG1pbnV0ZSwKLSAgICAgICAgICAgIGludCBzZWNvbmQsCi0gICAgICAgICAgICBCaWdEZWNpbWFsIGZyYWN0aW9uKQotICAgIHsKLSAgICAgICAgaWYgKHNpZ24gIT0gMSAmJiBzaWduICE9IC0xKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICBfc2lnbiA9IHNpZ247Ci0gICAgICAgIF9DWSA9IHllYXI7Ci0gICAgICAgIF9NID0gbW9udGg7Ci0gICAgICAgIF9EID0gZGF5OwotICAgICAgICBfaCA9IGhvdXI7Ci0gICAgICAgIF9tID0gbWludXRlOwotICAgICAgICBfcyA9IHNlY29uZDsKLSAgICAgICAgX2ZzID0gZnJhY3Rpb24gPT0gbnVsbCA/IEdEYXRlLl96ZXJvIDogZnJhY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEdEdXJhdGlvbkJ1aWxkZXIgZnJvbSBhbm90aGVyIEdEdXJhdGlvbkJ1aWxkZXJTcGVjaWZpY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBHRHVyYXRpb25CdWlsZGVyKEdEdXJhdGlvblNwZWNpZmljYXRpb24gZ0R1cmF0aW9uKQotICAgIHsKLSAgICAgICAgX3NpZ24gPSBnRHVyYXRpb24uZ2V0U2lnbigpOwotICAgICAgICBfQ1kgPSBnRHVyYXRpb24uZ2V0WWVhcigpOwotICAgICAgICBfTSA9IGdEdXJhdGlvbi5nZXRNb250aCgpOwotICAgICAgICBfRCA9IGdEdXJhdGlvbi5nZXREYXkoKTsKLSAgICAgICAgX2ggPSBnRHVyYXRpb24uZ2V0SG91cigpOwotICAgICAgICBfbSA9IGdEdXJhdGlvbi5nZXRNaW51dGUoKTsKLSAgICAgICAgX3MgPSBnRHVyYXRpb24uZ2V0U2Vjb25kKCk7Ci0gICAgICAgIF9mcyA9IGdEdXJhdGlvbi5nZXRGcmFjdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyBhbm90aGVyIEdEdXJhdGlvbkJ1aWxkZXIgd2l0aCB0aGUgc2FtZSB2YWx1ZQotICAgICAqIGFzIHRoaXMgb25lLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHRHVyYXRpb25CdWlsZGVyKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyBhIEdEdXJhdGlvbiBmcm9tIHRoaXMgR0R1cmF0aW9uQnVpbGRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgR0R1cmF0aW9uIHRvR0R1cmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgR0R1cmF0aW9uKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdG8gdGhpcyBkdXJhdGlvbi4gIERvZXMgYSBmaWVsZHdpc2UgYWRkLCB3aXRoIG5vCi0gICAgICogbm9ybWFsaXphdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRHRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIGludCBzaWduID0gX3NpZ24gKiBkdXJhdGlvbi5nZXRTaWduKCk7Ci0gICAgICAgIF9hZGQoZHVyYXRpb24sIHNpZ24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN1YnRyYWN0cyBmcm9tIHRoaXMgZHVyYXRpb24uICBEb2VzIGEgZmllbGR3aXNlIHN1YnRyYWN0aW9uLAotICAgICAqIHdpdGggbm8gbm9ybWFsaXphdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdWJ0cmFjdEdEdXJhdGlvbihHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGR1cmF0aW9uKQotICAgIHsKLSAgICAgICAgaW50IHNpZ24gPSAtX3NpZ24gKiBkdXJhdGlvbi5nZXRTaWduKCk7Ci0gICAgICAgIF9hZGQoZHVyYXRpb24sIHNpZ24pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBfYWRkKEdEdXJhdGlvblNwZWNpZmljYXRpb24gZHVyYXRpb24sIGludCBzaWduKQotICAgIHsKLSAgICAgICAgX0NZICs9IHNpZ24gKiBkdXJhdGlvbi5nZXRZZWFyKCk7Ci0gICAgICAgIF9NICs9IHNpZ24gKiBkdXJhdGlvbi5nZXRNb250aCgpOwotICAgICAgICBfRCArPSBzaWduICogZHVyYXRpb24uZ2V0RGF5KCk7Ci0gICAgICAgIF9oICs9IHNpZ24gKiBkdXJhdGlvbi5nZXRIb3VyKCk7Ci0gICAgICAgIF9tICs9IHNpZ24gKiBkdXJhdGlvbi5nZXRNaW51dGUoKTsKLSAgICAgICAgX3MgKz0gc2lnbiAqIGR1cmF0aW9uLmdldFNlY29uZCgpOwotCi0gICAgICAgIGlmIChkdXJhdGlvbi5nZXRGcmFjdGlvbigpLnNpZ251bSgpID09IDApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKF9mcy5zaWdudW0oKSA9PSAwICYmIHNpZ24gPT0gMSkKLSAgICAgICAgICAgIF9mcyA9IGR1cmF0aW9uLmdldEZyYWN0aW9uKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIF9mcyA9IHNpZ24gPiAwID8KLSAgICAgICAgICAgICAgICAgICAgX2ZzLmFkZChkdXJhdGlvbi5nZXRGcmFjdGlvbigpKSA6Ci0gICAgICAgICAgICAgICAgICAgIF9mcy5zdWJ0cmFjdChkdXJhdGlvbi5nZXRGcmFjdGlvbigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzaWduLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFNpZ24oaW50IHNpZ24pCi0gICAgewotICAgICAgICBpZiAoc2lnbiAhPSAxICYmIHNpZ24gIT0gLTEpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIF9zaWduID0gc2lnbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB5ZWFyIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRZZWFyKGludCB5ZWFyKQotICAgICAgICB7IF9DWSA9IHllYXI7IH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1vbnRoIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNb250aChpbnQgbW9udGgpCi0gICAgICAgIHsgX00gPSBtb250aDsgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGF5IGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREYXkoaW50IGRheSkKLSAgICAgICAgeyBfRCA9IGRheTsgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGhvdXIgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhvdXIoaW50IGhvdXIpCi0gICAgICAgIHsgX2ggPSBob3VyOyAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWludXRlIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNaW51dGUoaW50IG1pbnV0ZSkKLSAgICAgICAgeyBfbSA9IG1pbnV0ZTsgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2Vjb25kIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWNvbmQoaW50IHNlY29uZCkKLSAgICAgICAgeyBfcyA9IHNlY29uZDsgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZnJhY3Rpb24tb2Ytc2Vjb25kIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGcmFjdGlvbihCaWdEZWNpbWFsIGZyYWN0aW9uKQotICAgICAgICB7IF9mcyA9IGZyYWN0aW9uID09IG51bGwgPyBHRGF0ZS5femVybyA6IGZyYWN0aW9uOyB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGwgR0R1cmF0aW9uIGluc3RhbmNlcyByZXR1cm4gdHJ1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0ltbXV0YWJsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaWduIG9mIHRoZSBkdXJhdGlvbjogKzEgaXMgZm9yd2FyZHMKLSAgICAgKiBhbmQgLTEgaXMgYmFja3dhcmRzIGluIHRpbWUuCi0gICAgICogVGhpcyB2YWx1ZSBkb2VzIG5vdCBuZWNlc3NhcmlseSByZWZsZWN0IHRoZQotICAgICAqIHRydWUgZGlyZWN0aW9uIG9mIHRoZSBkdXJhdGlvbiBpZiB0aGUgZHVyYXRpb24KLSAgICAgKiBpcyBub3Qgbm9ybWFsaXplZCBvciBub3Qgbm9ybWFsaXphYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0U2lnbigpCi0gICAgICAgIHsgcmV0dXJuIF9zaWduOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB5ZWFyIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFllYXIoKQotICAgICAgICB7IHJldHVybiBfQ1k7ICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtb250aC1vZi15ZWFyIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldE1vbnRoKCkKLSAgICAgICAgeyByZXR1cm4gX007ICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkYXktb2YtbW9udGggY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RGF5KCkKLSAgICAgICAgeyByZXR1cm4gX0Q7IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhvdXItb2YtZGF5IGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEhvdXIoKQotICAgICAgICB7IHJldHVybiBfaDsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWludXRlLW9mLWhvdXIgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TWludXRlKCkKLSAgICAgICAgeyByZXR1cm4gX207IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNlY29uZC1vZi1taW51dGUgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0U2Vjb25kKCkKLSAgICAgICAgeyByZXR1cm4gX3M7IH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZnJhY3Rpb24tb2Ytc2Vjb25kLiBSYW5nZSBmcm9tIDAgKGluY2x1c2l2ZSkgdG8gMSAoZXhjbHVzaXZlKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRGcmFjdGlvbigpCi0gICAgICAgIHsgcmV0dXJuIF9mczsgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIGFsbCBvZiB0aGUgaW5kaXZpZHVhbCBjb21wb25lbnRzCi0gICAgICogb2YgdGhlIGR1cmF0aW9uIGFyZSBub25uZWdhdGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHRHVyYXRpb25CdWlsZGVyLmlzVmFsaWREdXJhdGlvbih0aGlzKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIE5vcm1hbGl6ZSBhIGR1cmF0aW9uIHZhbHVlLiBUaGlzIGVuc3VyZXMgdGhhdCBtb250aHMsCi0gICAgICogaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBmcmFjdGlvbnMgYXJlIHBvc2l0aXZlIGFuZAotICAgICAqIHdpdGhpbiB0aGUgcmFuZ2VzIDAuLjExLCAwLi4yMywgMC4uNTksIGV0Yy4gTmVnYXRpdmUKLSAgICAgKiBkdXJhdGlvbnMgYXJlIGluZGljYXRlZCBieSBhIG5lZ2F0aXZlIHNpZ24gcmF0aGVyCi0gICAgICogdGhhbiBuZWdhdGl2ZSBjb21wb25lbnRzLgotICAgICAqIDxwPgotICAgICAqIE1vc3QgZHVyYXRpb24gc3BlY2lmaWNhdGlvbnMgY2FuIGJlIG5vcm1hbGl6ZWQgdG8KLSAgICAgKiB2YWxpZCBkdXJhdGlvbnMgd2l0aCBhbGwgcG9zaXRpdmUgY29tcG9uZW50cywgYnV0Ci0gICAgICogbm90IGFsbCBvZiB0aGVtIGNhbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgb25seSBzaXR1YXRpb25zIHdoaWNoIGNhbm5vdCBiZSBub3JtYWxpemVkIGFyZQotICAgICAqIHdoZXJlIHRoZSB5ZWFyL21vbnRoIGFuZCB0aGUgZGF5L2hvdXIvbWludXRlL3NlY29uZAotICAgICAqIG9mZnNldHMgYXJlIG9mIG9wcG9zaXRlIHNpZ24uIERheXMgY2Fubm90IGJlIGNhcnJpZWQKLSAgICAgKiBpbnRvIG1vbnRocyBzaW5jZSB0aGUgbGVuZ3RoIG9mIGEgR3JlZ29yaWFuIG1vbnRoIGlzCi0gICAgICogdmFyaWFibGUgZGVwZW5kaW5nIG9uIHdoZW4gdGhlIGR1cmF0aW9uIGlzIGFwcGxpZWQuCi0gICAgICogSW4gdGhlc2UgY2FzZXMsIHRoaXMgbWV0aG9kIG5vcm1hbGl6ZXMgdGhlIGNvbXBvbmVudHMKLSAgICAgKiBzbyB0aGF0ICJkYXkiIGlzIHRoZSBvbmx5IG5lZ2F0aXZlIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3JtYWxpemUoKQotICAgIHsKLSAgICAgICAgX25vcm1hbGl6ZUltcGwodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZlF1b3RpZW50KGEsIGIpID0gdGhlIGdyZWF0ZXN0IGludGVnZXIgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGEvYgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgX2ZRdW90aWVudChsb25nIGEsIGludCBiKQotICAgIHsKLSAgICAgICAgaWYgKChhIDwgMCkgPT0gKGIgPCAwKSkKLSAgICAgICAgICAgIHJldHVybiBhIC8gYjsKLQotICAgICAgICByZXR1cm4gLSgoYiAtIGEgLSAxKSAvIGIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIG1vZHVsbyhhLCBiKSA9IGEgLSBmUXVvdGllbnQoYSxiKSpiCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9tb2QobG9uZyBhLCBpbnQgYiwgbG9uZyBxdW90aWVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaW50KShhIC0gcXVvdGllbnQqYikgOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUHJpdmF0ZSBpbXBsZW1lbmF0aW9uIG9mIG5vcm1hbGl6ZS4gVGhlIGZsYWcgaXMKLSAgICAgKiB0byBmYWNpbGl0YXRlIHRoaXMgbWV0aG9kIGNhbGxpbmcgaXRzZWxmIHdpdGhvdXQKLSAgICAgKiBkYW5nZXIgb2YgaW5maW5pdGUgcmVjdXJzaW9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBfbm9ybWFsaXplSW1wbChib29sZWFuIGFkanVzdFNpZ24pCi0gICAgewotICAgICAgICBsb25nIHRlbXA7Ci0KLSAgICAgICAgLy8gbW9udGhzIHRvIHllYXJzCi0gICAgICAgIGlmIChfTSA8IDAgfHwgX00gPiAxMSkKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcCA9IF9NOwotICAgICAgICAgICAgbG9uZyB5Y2FycnkgPSBfZlF1b3RpZW50KHRlbXAsIDEyKTsKLSAgICAgICAgICAgIF9NID0gX21vZCh0ZW1wLCAxMiwgeWNhcnJ5KTsKLSAgICAgICAgICAgIF9DWSArPSB5Y2Fycnk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIGNhcnJ5ID0gMDsKLQotICAgICAgICAvLyBmcmFjdGlvbnMgdG8gc2Vjb25kcwotICAgICAgICBpZiAoX2ZzICE9IG51bGwgJiYgKF9mcy5zaWdudW0oKSA8IDAgfHwgX2ZzLmNvbXBhcmVUbyhHRGF0ZS5fb25lKSA+PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgQmlnRGVjaW1hbCBiZGNhcnJ5ID0gX2ZzLnNldFNjYWxlKDAsIEJpZ0RlY2ltYWwuUk9VTkRfRkxPT1IpOwotICAgICAgICAgICAgX2ZzID0gX2ZzLnN1YnRyYWN0KGJkY2FycnkpOwotICAgICAgICAgICAgY2FycnkgPSBiZGNhcnJ5LmludFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2FycnkgIT0gMCB8fCBfcyA8IDAgfHwgX3MgPiA1OSB8fCBfbSA8IDAgfHwgX20gPiA1MCB8fCBfaCA8IDAgfHwgX2ggPiAyMykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gc2Vjb25kcwotICAgICAgICAgICAgdGVtcCA9IF9zICsgY2Fycnk7Ci0gICAgICAgICAgICBjYXJyeSA9IF9mUXVvdGllbnQodGVtcCwgNjApOwotICAgICAgICAgICAgX3MgPSBfbW9kKHRlbXAsIDYwLCBjYXJyeSk7Ci0KLSAgICAgICAgICAgIC8vIG1pbnV0ZXMKLSAgICAgICAgICAgIHRlbXAgPSBfbSArIGNhcnJ5OwotICAgICAgICAgICAgY2FycnkgPSBfZlF1b3RpZW50KHRlbXAsIDYwKTsKLSAgICAgICAgICAgIF9tID0gX21vZCh0ZW1wLCA2MCwgY2FycnkpOwotCi0gICAgICAgICAgICAvLyBob3VycwotICAgICAgICAgICAgdGVtcCA9IF9oICsgY2Fycnk7Ci0gICAgICAgICAgICBjYXJyeSA9IF9mUXVvdGllbnQodGVtcCwgMjQpOwotICAgICAgICAgICAgX2ggPSBfbW9kKHRlbXAsIDI0LCBjYXJyeSk7Ci0gICAgICAgICAgICBfRCArPSBjYXJyeTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfQ1kgPT0gMCAmJiBfTSA9PSAwICYmIF9EID09IDAgJiYgX2ggPT0gMCAmJiBfbSA9PSAwICYmIF9zID09IDAgJiYgKF9mcyA9PSBudWxsIHx8IF9mcy5zaWdudW0oKSA9PSAwKSkKLSAgICAgICAgICAgIF9zaWduID0gMTsKLQotICAgICAgICBpZiAoYWRqdXN0U2lnbiAmJiAoX0QgPCAwIHx8IF9DWSA8IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgc2lnbiA9IChfRCA8PSAwICYmIChfQ1kgPCAwIHx8IF9DWSA9PSAwICYmIF9NID09IDApKSA/IC1fc2lnbiA6IF9nZXRUb3RhbFNpZ25TbG93bHkoKTsKLSAgICAgICAgICAgIGlmIChzaWduID09IDIpCi0gICAgICAgICAgICAgICAgc2lnbiA9IChfQ1kgPCAwKSA/IC1fc2lnbiA6IF9zaWduOwotICAgICAgICAgICAgaWYgKHNpZ24gPT0gMCkKLSAgICAgICAgICAgICAgICBzaWduID0gMTsKLSAgICAgICAgICAgIGlmIChzaWduICE9IF9zaWduKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9zaWduID0gc2lnbjsKLSAgICAgICAgICAgICAgICBfQ1kgPSAtX0NZOwotICAgICAgICAgICAgICAgIF9NID0gLV9NOwotICAgICAgICAgICAgICAgIF9EID0gLV9EOwotICAgICAgICAgICAgICAgIF9oID0gLV9oOwotICAgICAgICAgICAgICAgIF9tID0gLV9tOwotICAgICAgICAgICAgICAgIF9zID0gLV9zOwotICAgICAgICAgICAgICAgIGlmIChfZnMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgX2ZzID0gX2ZzLm5lZ2F0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX25vcm1hbGl6ZUltcGwoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBib29sZWFuIGlzVmFsaWREdXJhdGlvbihHRHVyYXRpb25TcGVjaWZpY2F0aW9uIHNwZWMpCi0gICAgewotICAgICAgICBpZiAoIShzcGVjLmdldFNpZ24oKSA9PSAxIHx8IHNwZWMuZ2V0U2lnbigpID09IC0xKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gKHNwZWMuZ2V0WWVhcigpID49IDAgJiYgc3BlYy5nZXRNb250aCgpID49IDAgJiYgc3BlYy5nZXREYXkoKSA+PSAwICYmCi0gICAgICAgICAgICAgICAgc3BlYy5nZXRIb3VyKCkgPj0gMCAmJiBzcGVjLmdldE1pbnV0ZSgpID49IDAgICYmIHNwZWMuZ2V0U2Vjb25kKCkgPj0gMCAmJgotICAgICAgICAgICAgICAgIHNwZWMuZ2V0RnJhY3Rpb24oKS5zaWdudW0oKSA+PSAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJpc29uIHRvIGFub3RoZXIgR0R1cmF0aW9uLgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+UmV0dXJucyAtMSBpZiB0aGlzIDwgZGF0ZS4gKGxlc3MtdGhhbikKLSAgICAgKiA8bGk+UmV0dXJucyAwIGlmIHRoaXMgPT0gZGF0ZS4gKGVxdWFsKQotICAgICAqIDxsaT5SZXR1cm5zIDEgaWYgdGhpcyA+IGRhdGUuIChncmVhdGVyLXRoYW4pCi0gICAgICogPGxpPlJldHVybnMgMiBpZiB0aGlzIDw+IGRhdGUuIChpbmNvbXBhcmFibGUpCi0gICAgICogPC91bD4KLSAgICAgKiBUd28gaW5zdGFuY2VzIGFyZSBpbmNvbXBhcmFibGUgaWYgdGhleSBoYXZlIGRpZmZlcmVudCBhbW91bnRzCi0gICAgICogb2YgaW5mb3JtYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBjb21wYXJlVG9HRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBHRHVyYXRpb25CdWlsZGVyLmNvbXBhcmVEdXJhdGlvbnModGhpcywgZHVyYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBuYXR1cmFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZHVyYXRpb24uCi0gICAgICogPHA+Ci0gICAgICogQW55IGNvbXBvbmVudHMgdGhhdCBhcmUgemVybyBhcmUgb21pdHRlZC4gTm90ZSB0aGF0IGlmIHRoZSBkdXJhdGlvbgotICAgICAqIGlzIGludmFsaWQsIGkuZS4sIGl0IGhhcyBuZWdhdGl2ZSBjb21wb25lbnRzLCB0aG9zZSBuZWdhdGl2ZQotICAgICAqIGNvbXBvbmVudHMgYXJlIHNlcmlhbGl6ZWQgb3V0IGhlcmUuIFRvIGNoZWNrIGZvciB2YWxpZGl0eSwgdXNlCi0gICAgICogdGhlIGlzVmFsaWQoKSBtZXRob2Q7IGFuZCB0byBub3JtYWxpemUgbW9zdCBkdXJhdGlvbnMgdG8gYSB2YWxpZAotICAgICAqIGZvcm0gdXNlIHRoZSBub3JtYWxpemUoKSBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gR0R1cmF0aW9uQnVpbGRlci5mb3JtYXREdXJhdGlvbih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBpbnQgY29tcGFyZUR1cmF0aW9ucyhHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGQxLCBHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGQyKQotICAgIHsKLSAgICAgICAgLy8gZmlyc3QgZG8gYW4gYWxsLWZpZWxkcyBjaGVjawotICAgICAgICBpZiAoZDEuZ2V0RnJhY3Rpb24oKS5zaWdudW0oKSA9PSAwICYmIGQyLmdldEZyYWN0aW9uKCkuc2lnbnVtKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHMxID0gZDEuZ2V0U2lnbigpOwotICAgICAgICAgICAgaW50IHMyID0gZDIuZ2V0U2lnbigpOwotICAgICAgICAgICAgbG9uZyBtb250aDEgPSBzMSAqICgobG9uZylkMS5nZXRZZWFyKCkgKiAxMiArIGQxLmdldE1vbnRoKCkpOwotICAgICAgICAgICAgbG9uZyBtb250aDIgPSBzMiAqICgobG9uZylkMi5nZXRZZWFyKCkgKiAxMiArIGQyLmdldE1vbnRoKCkpOwotICAgICAgICAgICAgbG9uZyBzZWMxID0gczEgKiAoKCgobG9uZylkMS5nZXREYXkoKSAqIDI0ICsgZDEuZ2V0SG91cigpKSAqIDYwICsgZDEuZ2V0TWludXRlKCkpICogNjAgKyBkMS5nZXRTZWNvbmQoKSk7Ci0gICAgICAgICAgICBsb25nIHNlYzIgPSBzMiAqICgoKChsb25nKWQyLmdldERheSgpICogMjQgKyBkMi5nZXRIb3VyKCkpICogNjAgKyBkMi5nZXRNaW51dGUoKSkgKiA2MCArIGQyLmdldFNlY29uZCgpKTsKLSAgICAgICAgICAgIGlmIChtb250aDEgPT0gbW9udGgyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzZWMxID09IHNlYzIpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIGlmIChzZWMxIDwgc2VjMikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIGlmIChzZWMxID4gc2VjMikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobW9udGgxIDwgbW9udGgyICYmIHNlYzEgLSBzZWMyIDwgMjggKiAyNCAqIDYwICogNjApCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgaWYgKG1vbnRoMSA+IG1vbnRoMiAmJiBzZWMyIC0gc2VjMSA8IDI4ICogMjQgKiA2MCAqIDYwKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhlIGFuc3dlciBpc24ndCBvYnZpb3VzLCBzbyB0aGVuIGRvIGEgdG90YWwtc2lnbiBjaGVjawotICAgICAgICBHRHVyYXRpb25CdWlsZGVyIGRpZmYgPSBuZXcgR0R1cmF0aW9uQnVpbGRlcihkMSk7Ci0gICAgICAgIGRpZmYuc3VidHJhY3RHRHVyYXRpb24oZDIpOwotICAgICAgICByZXR1cm4gZGlmZi5fZ2V0VG90YWxTaWduU2xvd2x5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyIHNjaGVtYSBzcGVjLCBjb21wYXJpc29uIG9mIGR1cmF0aW9ucyBpcyBzaW1wbHkgZG9uZQotICAgICAqIGJ5IGNhbGN1bGF0aW5nIGFkZGluZyB0aGUgZHVyYXRpb24gdG8gdGhlc2UgZm91ciBkYXRlcyBhbmQKLSAgICAgKiBjb21wYXJpbmcgdGhlIHJlc3VsdHMuIElmIHRoZSByZXN1bHRzIGFyZSBhbWJpZ3VvdXMsIHRoZQotICAgICAqIGFuc3dlciBpcyAiaW5jb21wYXJhYmxlIi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBHRGF0ZVtdIF9jb21wRGF0ZSA9IG5ldyBHRGF0ZVtdCi0gICAgewotICAgICAgICBuZXcgR0RhdGUoMTY5NiwgOSwgMSwgMCwgMCwgMCwgbnVsbCwgMCwgMCwgMCksCi0gICAgICAgIG5ldyBHRGF0ZSgxNjk3LCAyLCAxLCAwLCAwLCAwLCBudWxsLCAwLCAwLCAwKSwKLSAgICAgICAgbmV3IEdEYXRlKDE5MDMsIDMsIDEsIDAsIDAsIDAsIG51bGwsIDAsIDAsIDApLAotICAgICAgICBuZXcgR0RhdGUoMTkwMywgNywgMSwgMCwgMCwgMCwgbnVsbCwgMCwgMCwgMCkKLSAgICB9OwotCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIHJldHVybnMgdGhlIHRvdGFsIHNpZ24gb2YgdGhlIGR1cmF0aW9uLCArMQotICAgICAqIGlmIHRoZSBkdXJhdGlvbiBtb3ZlcyBmb3J3YXJkIGluIHRpbWUsIC0xIGlmIHRoZQotICAgICAqIGR1cmF0aW9uIG1vdmVzIGJhY2t3YXJkcyBpbiB0aW1lLCAwIGlmIHRoZSBkdXJhdGlvbgotICAgICAqIGlzIHplcm8tbGVuZ3RoLCBhbmQgMiBpZiB0aGUgZHVyYXRpb24gbWF5IGJlIHBvc2l0aXZlCi0gICAgICogb3IgbmVnYXRpdmUgZGVwZW5kaW5nIG9uIHRoZSBkYXRlLgotICAgICAqCi0gICAgICogKEZvciBleGFtcGxlLCBvbmUgbW9udGggbWludXMgMzAgZGF5cyBpcyBpbmRldGVybWluYXRlKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBfZ2V0VG90YWxTaWduU2xvd2x5KCkKLSAgICB7Ci0gICAgICAgIGludCBwb3MgPSAwOwotICAgICAgICBpbnQgbmVnID0gMDsKLSAgICAgICAgaW50IHplciA9IDA7Ci0KLSAgICAgICAgR0RhdGVCdWlsZGVyIGVuZGRhdGUgPSBuZXcgR0RhdGVCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2NvbXBEYXRlLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmRkYXRlLnNldEdEYXRlKF9jb21wRGF0ZVtpXSk7Ci0gICAgICAgICAgICBlbmRkYXRlLmFkZEdEdXJhdGlvbih0aGlzKTsKLSAgICAgICAgICAgIHN3aXRjaCAoZW5kZGF0ZS5jb21wYXJlVG9HRGF0ZShfY29tcERhdGVbaV0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgLTE6Ci0gICAgICAgICAgICAgICAgICAgIG5lZysrOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgIHplcisrOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHBvcysrOyBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwb3MgPT0gX2NvbXBEYXRlLmxlbmd0aCkKLSAgICAgICAgICAgIHJldHVybiArMTsKLSAgICAgICAgaWYgKG5lZyA9PSBfY29tcERhdGUubGVuZ3RoKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoemVyID09IF9jb21wRGF0ZS5sZW5ndGgpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgU3RyaW5nIGZvcm1hdER1cmF0aW9uKEdEdXJhdGlvblNwZWNpZmljYXRpb24gZHVyYXRpb24pCi0gICAgewotICAgICAgICAvLyBTaWduK1A6ICAgICAgKC0pP1AKLSAgICAgICAgLy8gWWVhcjogICAgICAgICg/OihcZCspWSk/Ci0gICAgICAgIC8vIE1vbnRoOiAgICAgICAoPzooXGQrKU0pPwotICAgICAgICAvLyBEYXk6ICAgICAgICAgKD86KFxkKylEKT8KLSAgICAgICAgLy8gVGltZTogICAgICAgICg/OihUKQotICAgICAgICAvLyBIb3VyczogICAgICAgICAgKD86KFxkKylIKT8KLSAgICAgICAgLy8gTWludXRlczogICAgICAgICg/OihcZCspTSk/Ci0gICAgICAgIC8vIFNlY29uZHM6ICAgICAgICAoPzooXGQrKD86XC5cZCopP3woPzouXGQrKVMpPwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigzMCk7Ci0KLSAgICAgICAgaWYgKGR1cmF0aW9uLmdldFNpZ24oKSA8IDApCi0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgnLScpOwotCi0gICAgICAgIG1lc3NhZ2UuYXBwZW5kKCdQJyk7Ci0KLSAgICAgICAgaWYgKGR1cmF0aW9uLmdldFllYXIoKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChkdXJhdGlvbi5nZXRZZWFyKCkpOwotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoJ1knKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkdXJhdGlvbi5nZXRNb250aCgpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGR1cmF0aW9uLmdldE1vbnRoKCkpOwotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoJ00nKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkdXJhdGlvbi5nZXREYXkoKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChkdXJhdGlvbi5nZXREYXkoKSk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgnRCcpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGR1cmF0aW9uLmdldEhvdXIoKSAhPSAwIHx8IGR1cmF0aW9uLmdldE1pbnV0ZSgpICE9IDAgfHwgZHVyYXRpb24uZ2V0U2Vjb25kKCkgIT0gMCB8fAotICAgICAgICAgICAgIChkdXJhdGlvbi5nZXRGcmFjdGlvbigpLnNpZ251bSgpICE9IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgnVCcpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGR1cmF0aW9uLmdldEhvdXIoKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChkdXJhdGlvbi5nZXRIb3VyKCkpOwotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoJ0gnKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkdXJhdGlvbi5nZXRNaW51dGUoKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChkdXJhdGlvbi5nZXRNaW51dGUoKSk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgnTScpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGR1cmF0aW9uLmdldEZyYWN0aW9uKCkuc2lnbnVtKCkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgQmlnRGVjaW1hbCBzID0gZHVyYXRpb24uZ2V0RnJhY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChkdXJhdGlvbi5nZXRTZWNvbmQoKSAhPSAwKQotICAgICAgICAgICAgICAgIHMgPSBzLmFkZChCaWdEZWNpbWFsLnZhbHVlT2YoZHVyYXRpb24uZ2V0U2Vjb25kKCkpKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKHMpOwotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoJ1MnKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChkdXJhdGlvbi5nZXRTZWNvbmQoKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChkdXJhdGlvbi5nZXRTZWNvbmQoKSk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgnUycpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UubGVuZ3RoKCkgPD0gMikKLSAgICAgICAgICAgIC8vIFNwZWNpZnkgemVybyBzZWNvbmRzIGlmIGV2ZXJ5dGhpbmcgd2FzIDAKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCJUMFMiKTsKLQotICAgICAgICByZXR1cm4gbWVzc2FnZS50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRHVyYXRpb25TcGVjaWZpY2F0aW9uLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0R1cmF0aW9uU3BlY2lmaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjZhNDFiLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRHVyYXRpb25TcGVjaWZpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBYTUwgU2NoZW1hLWNvbXBhdGlibGUgZHVyYXRpb24uCi0gKiA8cD4KLSAqIEJvdGggdGhlIGltbXV0YWJsZSBHRHVyYXRpb24gYW5kIHRoZSBtdXRhYmxlIEdEdXJhdGlvbkJ1aWxkZXIgYXJlCi0gKiBHRHVyYXRpb25TcGVjaWZpY2F0aW9ucy4gIFVzZSB0aGlzIGludGVyZmFjZSB3aGVyZSB5b3Ugd2FudCB0bwotICogYWxsb3cgY2FsbGVycyB0byBwYXNzIGFueSBpbXBsZW1lbnRhdGlvbiBvZiBhIEdEdXJhdGlvbi4KLSAqIAotICogQHNlZSBHRHVyYXRpb24KLSAqLwotcHVibGljIGludGVyZmFjZSBHRHVyYXRpb25TcGVjaWZpY2F0aW9uCi17Ci0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGluc3RhbmNlIGlzIGltbXV0YWJsZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzSW1tdXRhYmxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaWduIG9mIHRoZSBkdXJhdGlvbjogKzEgaXMgZm9yd2FyZHMKLSAgICAgKiBhbmQgLTEgaXMgYmFja3dhcmRzIGluIHRpbWUuCi0gICAgICovCi0gICAgaW50IGdldFNpZ24oKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHllYXIgY29tcG9uZW50LgotICAgICAqLwotICAgIGludCBnZXRZZWFyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtb250aC1vZi15ZWFyIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBpbnQgZ2V0TW9udGgoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRheS1vZi1tb250aCBjb21wb25lbnQuCi0gICAgICovCi0gICAgaW50IGdldERheSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgaG91ci1vZi1kYXkgY29tcG9uZW50LgotICAgICAqLwotICAgIGludCBnZXRIb3VyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtaW51dGUtb2YtaG91ciBjb21wb25lbnQuCi0gICAgICovCi0gICAgaW50IGdldE1pbnV0ZSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2Vjb25kLW9mLW1pbnV0ZSBjb21wb25lbnQuCi0gICAgICovCi0gICAgaW50IGdldFNlY29uZCgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZnJhY3Rpb24tb2Ytc2Vjb25kLiBSYW5nZSBmcm9tIDAgKGluY2x1c2l2ZSkgdG8gMSAoZXhjbHVzaXZlKS4KLSAgICAgKi8KLSAgICBCaWdEZWNpbWFsIGdldEZyYWN0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYWxsIG9mIHRoZSBpbmRpdmlkdWFsIGNvbXBvbmVudHMKLSAgICAgKiBvZiB0aGUgZHVyYXRpb24gYXJlIG5vbm5lZ2F0aXZlLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNWYWxpZCgpOwotCi0gICAgLyoqCi0gICAgICogQ29tcGFyaXNvbiB0byBhbm90aGVyIEdEdXJhdGlvbi4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPlJldHVybnMgLTEgaWYgdGhpcyA8IGRhdGUuIChsZXNzLXRoYW4pCi0gICAgICogPGxpPlJldHVybnMgMCBpZiB0aGlzID09IGRhdGUuIChlcXVhbCkKLSAgICAgKiA8bGk+UmV0dXJucyAxIGlmIHRoaXMgPiBkYXRlLiAoZ3JlYXRlci10aGFuKQotICAgICAqIDxsaT5SZXR1cm5zIDIgaWYgdGhpcyA8PiBkYXRlLiAoaW5jb21wYXJhYmxlKQotICAgICAqIDwvdWw+Ci0gICAgICogVHdvIGluc3RhbmNlcyBhcmUgaW5jb21wYXJhYmxlIGlmIHRoZXkgaGF2ZSBkaWZmZXJlbnQgYW1vdW50cwotICAgICAqIG9mIGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIGludCBjb21wYXJlVG9HRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbik7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVDYWNoZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lQ2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc1NDMyMS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVDYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogQSBjYWNoZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvb2wgUU5hbWUgaW5zdGFuY2VzLiAgRWFjaCB0aHJlYWQgaGFzIG9uZS4KLSAqLyAKLXB1YmxpYyBmaW5hbCBjbGFzcyBRTmFtZUNhY2hlCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9MT0FEID0gMC43MGY7Ci0gICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBsb2FkRmFjdG9yOwotICAgIHByaXZhdGUgaW50IG51bUVudHJpZXMgPSAwOwotICAgIHByaXZhdGUgaW50IHRocmVzaG9sZDsKLSAgICBwcml2YXRlIGludCBoYXNobWFzazsKLSAgICBwcml2YXRlIFFOYW1lW10gdGFibGU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgUU5hbWVDYWNoZSB3aXRoIHRoZSBnaXZlbiBpbml0aWFsQ2FwYWNpdHkgYW5kIGxvYWRGYWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgdG8gaW5pdGlhbGx5IG1ha2Ugc3BhY2UgZm9yCi0gICAgICogQHBhcmFtIGxvYWRGYWN0b3IgYSBudW1iZXIgdG8gY29udHJvbCB0aGUgZGVuc2l0eSBvZiB0aGUgaGFzaHRhYmxlCi0gICAgICovIAotICAgIHB1YmxpYyBRTmFtZUNhY2hlKGludCBpbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpCi0gICAgewotICAgICAgICBhc3NlcnQgaW5pdGlhbENhcGFjaXR5ID4gMDsKLSAgICAgICAgYXNzZXJ0IGxvYWRGYWN0b3IgPiAwICYmIGxvYWRGYWN0b3IgPCAxOwotCi0gICAgICAgIC8vIEZpbmQgYSBwb3dlciBvZiAyID49IGluaXRpYWxDYXBhY2l0eQotICAgICAgICBpbnQgY2FwYWNpdHkgPSAxNjsKLSAgICAgICAgd2hpbGUgKGNhcGFjaXR5IDwgaW5pdGlhbENhcGFjaXR5KSAKLSAgICAgICAgICAgIGNhcGFjaXR5IDw8PSAxOwotICAgIAotICAgICAgICB0aGlzLmxvYWRGYWN0b3IgPSBsb2FkRmFjdG9yOwotICAgICAgICB0aGlzLmhhc2htYXNrID0gY2FwYWNpdHkgLSAxOwotICAgICAgICB0aHJlc2hvbGQgPSAoaW50KShjYXBhY2l0eSAqIGxvYWRGYWN0b3IpOwotICAgICAgICB0YWJsZSA9IG5ldyBRTmFtZVtjYXBhY2l0eV07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFFOYW1lQ2FjaGUgd2l0aCB0aGUgZ2l2ZW4gaW5pdGlhbENhcGFjaXR5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgdGhlIG51bWJlciBvZiBlbnRyaWVzIHRvIGluaXRpYWxseSBtYWtlIHNwYWNlIGZvcgotICAgICAqLyAKLSAgICBwdWJsaWMgUU5hbWVDYWNoZShpbnQgaW5pdGlhbENhcGFjaXR5KQotICAgIHsKLSAgICAgICAgdGhpcyhpbml0aWFsQ2FwYWNpdHksIERFRkFVTFRfTE9BRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmV0Y2hlcyBhIFFOYW1lIHdpdGggdGhlIGdpdmVuIG5hbWVzcGFjZSBhbmQgbG9jYWxuYW1lLgotICAgICAqIENyZWF0ZXMgb25lIGlmIG9uZSBpcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmkgdGhlIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgdGhlIGxvY2FsbmFtZQotICAgICAqIEByZXR1cm4gdGhlIGNhY2hlZCBRTmFtZQotICAgICAqLyAKLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZShTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSh1cmksIGxvY2FsTmFtZSk7Ci0gICAgICAgICovCi0gICAgICAgIGFzc2VydCBsb2NhbE5hbWUgIT0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgdXJpID0gIiI7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gaGFzaCh1cmksIGxvY2FsTmFtZSkgJiBoYXNobWFzazsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIFFOYW1lIHEgPSB0YWJsZVtpbmRleF07Ci0gICAgICAgICAgICBpZiAocSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG51bUVudHJpZXMrKzsKLSAgICAgICAgICAgICAgICBpZiAobnVtRW50cmllcyA+PSB0aHJlc2hvbGQpCi0gICAgICAgICAgICAgICAgICAgIHJlaGFzaCgpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlW2luZGV4XSA9IG5ldyBRTmFtZSh1cmksIGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChlcXVhbHMocSwgdXJpLCBsb2NhbE5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiBxOwotICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICBpbmRleCA9IChpbmRleC0xKSAmIGhhc2htYXNrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlaGFzaCgpCi0gICAgewotICAgICAgICBpbnQgbmV3TGVuZ3RoID0gdGFibGUubGVuZ3RoICogMjsKLSAgICAgICAgUU5hbWVbXSBuZXdUYWJsZSA9IG5ldyBRTmFtZVtuZXdMZW5ndGhdOwotICAgICAgICBpbnQgbmV3SGFzaG1hc2sgPSBuZXdMZW5ndGggLSAxOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHRhYmxlLmxlbmd0aCA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgcSA9IHRhYmxlW2ldOwotICAgICAgICAgICAgaWYgKHEgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgbmV3SW5kZXggPSBoYXNoKHEuZ2V0TmFtZXNwYWNlVVJJKCksIHEuZ2V0TG9jYWxQYXJ0KCkpICYgbmV3SGFzaG1hc2s7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG5ld1RhYmxlW25ld0luZGV4XSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBuZXdJbmRleCA9IChuZXdJbmRleCAtIDEpICYgbmV3SGFzaG1hc2s7Ci0gICAgICAgICAgICAgICAgbmV3VGFibGVbbmV3SW5kZXhdID0gcTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRhYmxlID0gbmV3VGFibGU7Ci0gICAgICAgIGhhc2htYXNrID0gbmV3SGFzaG1hc2s7Ci0gICAgICAgIHRocmVzaG9sZCA9IChpbnQpKG5ld0xlbmd0aCAqIGxvYWRGYWN0b3IpOwotICAgIH0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgaGFzaChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuICh1cmkuaGFzaENvZGUoKSA8PCA1KSArIGxvY2FsTmFtZS5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXF1YWxzKFFOYW1lIHEsIFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gcS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMobG9jYWxOYW1lKSAmJiBxLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyh1cmkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9RTmFtZVNldC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZDJjOTkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBsYXR0aWNlIG9mIGZpbml0ZSBhbmQgaW5maW5pdGUgc2V0cyBvZiBRTmFtZXMuCi0gKiBUaGUgbGF0dGljZSB0aGUgbWluaW1hbCBvbmUgdGhhdCBpcyBjbG9zZWQgdW5kZXIgdW5pb24sIGludGVyc2VjdGlvbiwgYW5kCi0gKiBpbnZlcnNlLCBhbmQgY29udGFpbnMgaW5kaXZpZHVhbCBRTmFtZXMgYXMgd2VsbCBhcyBlbnRpcmUgbmFtZXNwYWNlcy4KLSAqIEhlcmUgaXMgYSBzdW1tYXJ5IG9mIHRoZSB0d28ga2luZHMgb2YgUU5hbWVTZXRzOgotICogPHVsPgotICogPGxpPkEgUU5hbWVTZXQgY2FuIGNvdmVyIGEgZmluaXRlIHNldCBvZiBuYW1lc3BhY2VzLCBhZGRpdGlvbmFsbHkgaW5jbHVkaW5nIGEgZmluaXRlCi0gKiAgICAgc2V0IG9mIFFOYW1lcyBvdXRzaWRlIHRob3NlIG5hbWVzcGFjZXMsIGFuZCB3aXRoIHRoZSBleGNlcHRpb24gb2YKLSAqICAgICBhIGZpbml0ZSBzZXQgb2YgUU5hbWVzIGV4Y2x1ZGVkIGZyb20gdGhvc2UgbmFtZXNwYWVzOgotICogICA8dWw+Ci0gKiAgIDxsaT5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzID09IHRoZSBzZXQgb2YgZXhjbHVkZWQgUU5hbWVzIGZyb20gY292ZXJlZFVSSXMgbmFtZXNwYWNlcwotICogICA8bGk+ZXhjbHVkZWRVUklzID09IG51bGwKLSAqICAgPGxpPmluY2x1ZGVkVVJJcyA9PSB0aGUgc2V0IG9mIGNvdmVyZWQgbmFtZXNwYWNlIFVSSXMKLSAqICAgPGxpPmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMgPT0gc2V0IG9mIGFkZGl0aW9uYWwgUU5hbWVzIG91dHNpZGUgY292ZXJlZFVSSXMgbmFtZXNwYWNlcwotICogICA8L3VsPgotICogPC9saT4KLSAqIDxsaT5BIFFOYW1lU2V0IGNhbiBjb3ZlciBhbGwgbmFtZXNwYWNlcyBleGNlcHQgZm9yIGEgZmluaXRlIG51bWJlciBvZiBleGNsdWRlZCBvbmVzLAotICogICAgIGFkZGl0aW9uYWxseSBpbmNsdWRpbmcgYSBmaW5pdGUgc2V0IG9mIFFOYW1lcyB3aXRoaW4gdGhlIGV4Y2x1ZGVkIG5hbWVzcGFjZXMsCi0gKiAgICAgYW5kIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBhIGZpbml0ZSBzZXQgb2YgUU5hbWVzIG91dHNpZGUgdGhlIGV4Y2x1ZGVkIG5hbWVzcGFjZXM6Ci0gKiAgIDx1bD4KLSAqICAgPGxpPmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMgPT0gdGhlIHNldCBvZiBleGNsdWRlZCBRTmFtZXMgb3V0c2lkZSB1bmNvdmVyZWRVUklzIG5hbWVzcGFjZXMKLSAqICAgPGxpPmV4Y2x1ZGVkVVJJcyA9PSB0aGUgc2V0IG9mIHVuY292ZXJlZCBuYW1lc3BhY2UgVVJJcwotICogICA8bGk+aW5jbHVkZWRVUklzID09IG51bGwKLSAqICAgPGxpPmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMgPT0gc2V0IG9mIGFkZGl0aW9uYWwgUU5hbWVzIGZyb20gdW5jb3ZlcmVkVVJJcyBuYW1lc3BhY2VzCi0gKiAgIDwvdWw+Ci0gKiA8L2xpPgotICogPC91bD4KLSAqIDxwPgotICogTm90aWNlIHRoYXQgYSBmaW5pdGUgc2V0IG9mIFFOYW1lcyBpcyBhIGRlZ2VuZXJhdGUgY2FzZSBvZiB0aGUgZmlyc3QKLSAqIGNhdGVnb3J5IG91dGxpbmVkIGFib3ZlOgotICogPHVsPgotICogPGxpPkEgUW5hbWVTZXQgY2FuIGNvbnRhaW4gYSBmaW5pdGUgbnVtYmVyIG9mIFFOYW1lczoKLSAqICAgPHVsPgotICogICA8bGk+ZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcyA9PSBudWxsCi0gKiAgIDxsaT5leGNsdWRlZFVSSXMgPT0gbnVsbAotICogICA8bGk+aW5jbHVkZWRVUklzID09IGVtcHR5IHNldAotICogICA8bGk+aW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcyA9PSBzZXQgb2YgaW5jbHVkZWQgUU5hbWVzCi0gKiAgIDwvdWw+Ci0gKiA8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFFOYW1lU2V0IGltcGxlbWVudHMgUU5hbWVTZXRTcGVjaWZpY2F0aW9uLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIAotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfaW52ZXJ0ZWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQgX2luY2x1ZGVkVVJJczsKLSAgICBwcml2YXRlIGZpbmFsIFNldCBfZXhjbHVkZWRRTmFtZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQgX2luY2x1ZGVkUU5hbWVzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGVtcHR5IFFOYW1lU2V0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWVTZXQgRU1QVFkgPSBuZXcgUU5hbWVTZXQobnVsbCwgQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgUU5hbWVTZXQgY29udGFpbmluZyBhbGwgUU5hbWVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWVTZXQgQUxMID0gbmV3IFFOYW1lU2V0KENvbGxlY3Rpb25zLkVNUFRZX1NFVCwgbnVsbCwgQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQpOwotCi0gICAgLyoqCi0gICAgICogVGhlIFFOYW1lU2V0IGNvbnRhaW5pbmcgYWxsIFFOYW1lcyBpbiB0aGUgbG9jYWwgKG5vLSluYW1lc3BhY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZVNldCBMT0NBTCA9IG5ldyBRTmFtZVNldChudWxsLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIiIpLCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgUU5hbWVTZXQgY29udGFpbmluZyBhbGwgUU5hbWVzIGV4Y2VwdCBmb3IgdGhvc2UgaW4gdGhlIGxvY2FsIChuby0pbmFtZXNwYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWVTZXQgTk9OTE9DQUwgPSBuZXcgUU5hbWVTZXQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKCIiKSwgbnVsbCwgQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQpOwotCi0gICAgLyoqCi0gICAgICogUHJpdmF0ZSBmdW5jdGlvbiB0byBtaW5pbWl6ZSBvYmplY3QgY3JlYXRpb24gd2hlbiBjb3B5aW5nIHNldHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0IG1pblNldENvcHkoU2V0IG9yaWdpbmFsKQotICAgIHsKLSAgICAgICAgaWYgKG9yaWdpbmFsID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgaWYgKG9yaWdpbmFsLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0gICAgICAgIGlmIChvcmlnaW5hbC5zaXplKCkgPT0gMSkKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ob3JpZ2luYWwuaXRlcmF0b3IoKS5uZXh0KCkpOwotICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQob3JpZ2luYWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBRTmFtZVNldCBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2V0cyBvZiBleGNsdWRlZCBVUklzLAotICAgICAqIGluY2x1ZGVkIFVSSXMsIGV4Y2x1ZGVkIFFOYW1lcyBpbiBpbmNsdWRlZCBuYW1lc3BhY2VzLCBhbmQgaW5jbHVkZWQKLSAgICAgKiBRTmFtZXMgaW4gZXhjbHVkZWQgbmFtZXNwYWNlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXhjbHVkZWRVUklzIHRoZSBmaW5pdGUgc2V0IG9mIG5hbWVzcGFjZSBVUkkgc3RyaW5ncyB0byBleGNsdWRlIGZyb20gdGhlIHNldCwgb3IgbnVsbCBpZiB0aGlzIHNldCBpcyBpbmZpbml0ZQotICAgICAqIEBwYXJhbSBpbmNsdWRlZFVSSXMgdGhlIGZpbml0ZSBzZXQgb2YgbmFtZXNwYWNlIFVSSSBzdHJpbmdzIHRvIGluY2x1ZGUgaW4gdGhlIHNldCwgb3IgbnVsbCBpZiB0aGlzIHNldCBpcyBpbmZpbml0ZQotICAgICAqIEBwYXJhbSBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzIHRoZSBmaW5pdGUgc2V0IG9mIGV4Y2VwdGlvbmFsIFFOYW1lcyB0byBleGNsdWRlIGZyb20gdGhlIGluY2x1ZGVkIG5hbWVzcGFjZXMKLSAgICAgKiBAcGFyYW0gZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcyB0aGUgZmluaXRlIHNldCBvZiBleGNlcHRpb25hbCBRTmFtZXMgdG8gaW5jbHVkZSB0aGF0IGFyZSBpbiB0aGUgZXhjbHVkZWQgbmFtZXNwYWNlcwotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdGVkIFFOYW1lU2V0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZVNldCBmb3JTZXRzKFNldCBleGNsdWRlZFVSSXMsIFNldCBpbmNsdWRlZFVSSXMsIFNldCBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzLCBTZXQgaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcykKLSAgICB7Ci0gICAgICAgIGlmICgoZXhjbHVkZWRVUklzICE9IG51bGwpID09IChpbmNsdWRlZFVSSXMgIT0gbnVsbCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFeGFjdGx5IG9uZSBvZiBleGNsdWRlZFVSSXMgYW5kIGluY2x1ZGVkVVJJcyBtdXN0IGJlIG51bGwiKTsKLQotICAgICAgICBpZiAoZXhjbHVkZWRVUklzID09IG51bGwgJiYgaW5jbHVkZWRVUklzLmlzRW1wdHkoKSAmJiBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWTsKLSAgICAgICAgaWYgKGluY2x1ZGVkVVJJcyA9PSBudWxsICYmIGV4Y2x1ZGVkVVJJcy5pc0VtcHR5KCkgJiYgZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gQUxMOwotICAgICAgICBpZiAoZXhjbHVkZWRVUklzID09IG51bGwgJiYgaW5jbHVkZWRVUklzLnNpemUoKSA9PSAxICYmIGluY2x1ZGVkVVJJcy5jb250YWlucygiIikgJiYKLSAgICAgICAgICAgIGluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMuaXNFbXB0eSgpICYmIGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIExPQ0FMOwotICAgICAgICBpZiAoaW5jbHVkZWRVUklzID09IG51bGwgJiYgZXhjbHVkZWRVUklzLnNpemUoKSA9PSAxICYmIGV4Y2x1ZGVkVVJJcy5jb250YWlucygiIikgJiYKLSAgICAgICAgICAgIGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMuaXNFbXB0eSgpICYmIGluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIE5PTkxPQ0FMOwotCi0gICAgICAgIHJldHVybiBuZXcgUU5hbWVTZXQoCi0gICAgICAgICAgICAgICAgbWluU2V0Q29weShleGNsdWRlZFVSSXMpLAotICAgICAgICAgICAgICAgIG1pblNldENvcHkoaW5jbHVkZWRVUklzKSwKLSAgICAgICAgICAgICAgICBtaW5TZXRDb3B5KGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMpLAotICAgICAgICAgICAgICAgIG1pblNldENvcHkoaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBRTmFtZVNldCBiYXNlZCBvbiB0aGUgZ2l2ZW4gYXJyYXkgb2YgaW5jbHVkZWQgUU5hbWVzCi0gICAgICogCi0gICAgICogQHBhcmFtIGluY2x1ZGVkUU5hbWVzIHRoZSBhcnJheSBvZiBpbmNsdWRlZCBRTmFtZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lU2V0IGZvckFycmF5KFFOYW1lW10gaW5jbHVkZWRRTmFtZXMpCi0gICAgewotICAgICAgICBpZiAoaW5jbHVkZWRRTmFtZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluY2x1ZGVkUU5hbWVzIGNhbm5vdCBiZSBudWxsIik7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZVNldChudWxsLCBuZXcgSGFzaFNldCgpLCBudWxsLCBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KGluY2x1ZGVkUU5hbWVzKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBRTmFtZVNldCB3aXRoIHRoZSBzYW1lIGNvbnRlbnRzIGFzIHRoZSBnaXZlbgotICAgICAqIFFOYW1lU2V0U3BlY2lmaWNhdGlvbi4KLSAgICAgKiBAcmV0dXJuIHRoZSBjb3BpZWQgUU5hbWVTZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lU2V0IGZvclNwZWNpZmljYXRpb24oUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNwZWMpCi0gICAgewotICAgICAgICBpZiAoc3BlYyBpbnN0YW5jZW9mIFFOYW1lU2V0KQotICAgICAgICAgICAgcmV0dXJuIChRTmFtZVNldClzcGVjOwotICAgICAgICByZXR1cm4gUU5hbWVTZXQuZm9yU2V0cyhzcGVjLmV4Y2x1ZGVkVVJJcygpLCBzcGVjLmluY2x1ZGVkVVJJcygpLCBzcGVjLmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKSwgc3BlYy5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBRTmFtZVNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiB3aWxkY2FyZCBuYW1lc3BhY2Ugc3RyaW5nLgotICAgICAqIFRoaXMgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBVUklzLCBwbHVzIHNwZWNpYWwgdG9rZW5zIGFzIHNwZWNpZmllZAotICAgICAqIGluIHRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb24gKCMjYW55LCAjI290aGVyLCAjI3RhcmdldE5hbWVzcGFjZSwgIyNsb2NhbCkuCi0gICAgICogQHJldHVybiB0aGUgY29uc3RydWN0ZWQgUU5hbWVTZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lU2V0IGZvcldpbGRjYXJkTmFtZXNwYWNlU3RyaW5nKFN0cmluZyB3aWxkY2FyZCwgU3RyaW5nIHRhcmdldFVSSSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBRTmFtZVNldC5mb3JTcGVjaWZpY2F0aW9uKG5ldyBRTmFtZVNldEJ1aWxkZXIod2lsZGNhcmQsIHRhcmdldFVSSSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBRTmFtZVNldCBjb250YWluaW5nIG9ubHkgdGhlIGdpdmVuIFFOYW1lLgotICAgICAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdGVkIFFOYW1lU2V0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZVNldCBzaW5nbGV0b24oUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWVTZXQobnVsbCwgQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihuYW1lKSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgUU5hbWVTZXRCdWlsZGVyIHdob3NlIGNvbnRlbnRzIGFyZSBnaXZlbiBieQotICAgICAqIHRoZSBmb3VyIHNldHMuCi0gICAgICoKLSAgICAgKiBUaGlzIGNvbnN0dWN0b3IgaXMgUFJJVkFURSBiZWNhdXNlIGl0IHVzZXMgdGhlIGdpdmVuCi0gICAgICogc2V0cyBkaXJlY3RseSwgYW5kIGl0IHRydXN0cyBpdHMgY2FsbGVycyB0byBzZXQgb25seSBpbW11dGFibGUgdmFsdWVzLgotICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgaXMgb25seSBjYWxsZWQgYnkgdGhlIHN0YXRpYyBidWlsZGVyIG1ldGhvZHMgb24KLSAgICAgKiBRTmFtZVNldDogdGhvc2UgbWV0aG9kcyBhcmUgYWxsIGNhcmVmdWwgYXNzaWduIG9ubHkgdW5jaGFuZ2luZyBzZXRzLgotICAgICAqLwotICAgIHByaXZhdGUgUU5hbWVTZXQoU2V0IGV4Y2x1ZGVkVVJJcywgU2V0IGluY2x1ZGVkVVJJcywgU2V0IGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMsIFNldCBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKQotICAgIHsKLSAgICAgICAgaWYgKGluY2x1ZGVkVVJJcyAhPSBudWxsICYmIGV4Y2x1ZGVkVVJJcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBfaW52ZXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIF9pbmNsdWRlZFVSSXMgPSBpbmNsdWRlZFVSSXM7Ci0gICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMgPSBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzOwotICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzID0gaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJczsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChleGNsdWRlZFVSSXMgIT0gbnVsbCAmJiBpbmNsdWRlZFVSSXMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX2ludmVydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIF9pbmNsdWRlZFVSSXMgPSBleGNsdWRlZFVSSXM7Ci0gICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMgPSBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzOwotICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzID0gZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJczsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFeGFjdGx5IG9uZSBvZiBleGNsdWRlZFVSSXMgYW5kIGluY2x1ZGVkVVJJcyBtdXN0IGJlIG51bGwiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2NhbCB4bWwgbmFtZXMgYXJlIGhhc2VkIHVzaW5nICIiIGFzIHRoZSBuYW1lc3BhY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5zRnJvbU5hbWUoUU5hbWUgeG1sTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBucyA9IHhtbE5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIHJldHVybiBucyA9PSBudWxsID8gIiIgOiBuczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgTW9kZWxUcmFuc2l0aW9uU2V0IGNvbnRhaW5zIHRoZSBnaXZlbiBxbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbiA9IF9pbmNsdWRlZFVSSXMuY29udGFpbnMobnNGcm9tTmFtZShuYW1lKSkgPwotICAgICAgICAgICAgICAgICAgICAgIV9leGNsdWRlZFFOYW1lcy5jb250YWlucyhuYW1lKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzLmNvbnRhaW5zKG5hbWUpOwotICAgICAgICByZXR1cm4gX2ludmVydGVkIF4gaW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIE1vZGVsVHJhbnNpdGlvblNldCBjb250YWlucyBhbGwgUU5hbWVzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaW52ZXJ0ZWQgJiYgX2luY2x1ZGVkVVJJcy5pc0VtcHR5KCkgJiYgX2luY2x1ZGVkUU5hbWVzLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgTW9kZWxUcmFuc2l0aW9uU2V0IGNvbnRhaW5zIG5vIFFOYW1lcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAhX2ludmVydGVkICYmIF9pbmNsdWRlZFVSSXMuaXNFbXB0eSgpICYmIF9pbmNsdWRlZFFOYW1lcy5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBRTmFtZVNldCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBvbmUgYW5kIGFub3RoZXIuCi0gICAgICogQHBhcmFtIHNldCB0aGUgc2V0IHRvIGluc2Vyc2VjdCB3aXRoCi0gICAgICogQHJldHVybiB0aGUgaW50ZXJzZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lU2V0IGludGVyc2VjdChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KQotICAgIHsKLSAgICAgICAgUU5hbWVTZXRCdWlsZGVyIHJlc3VsdCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIodGhpcyk7Ci0gICAgICAgIHJlc3VsdC5yZXN0cmljdChzZXQpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvUU5hbWVTZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IFFOYW1lU2V0IHRoYXQgaXMgdGhlIHVuaW9uIG9mIHRoaXMgb25lIGFuZCBhbm90aGVyLgotICAgICAqIEBwYXJhbSBzZXQgdGhlIHNldCB0byB1bmlvbiB3aXRoCi0gICAgICogQHJldHVybiB0aGUgdW5pb24KLSAgICAgKi8KLSAgICBwdWJsaWMgUU5hbWVTZXQgdW5pb24oUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCkKLSAgICB7Ci0gICAgICAgIFFOYW1lU2V0QnVpbGRlciByZXN1bHQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKHRoaXMpOwotICAgICAgICByZXN1bHQuYWRkQWxsKHNldCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9RTmFtZVNldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgUU5hbWVTZXQgdGhhdCBpcyB0aGUgaW52ZXJzZSBvZiB0aGlzIG9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUU5hbWVTZXQgaW52ZXJzZSgpCi0gICAgewotICAgICAgICBpZiAodGhpcyA9PSBFTVBUWSkKLSAgICAgICAgICAgIHJldHVybiBBTEw7Ci0gICAgICAgIGlmICh0aGlzID09IEFMTCkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWTsKLSAgICAgICAgaWYgKHRoaXMgPT0gTE9DQUwpCi0gICAgICAgICAgICByZXR1cm4gTk9OTE9DQUw7Ci0gICAgICAgIGlmICh0aGlzID09IE5PTkxPQ0FMKQotICAgICAgICAgICAgcmV0dXJuIExPQ0FMOwotICAgICAgICByZXR1cm4gbmV3IFFOYW1lU2V0KGluY2x1ZGVkVVJJcygpLCBleGNsdWRlZFVSSXMoKSwgaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpLCBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIGdpdmVuIHNldCBpcyBhIHN1YnNldCBvZiB0aGlzIG9uZS4KLSAgICAgKiBAcGFyYW0gc2V0IHRoZSBzZXQgdG8gdGVzdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGNvbnRhaW5zIGFsbCBRTmFtZXMgY29udGFpbmVkIGJ5IHRoZSBnaXZlbiBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KQotICAgIHsKLSAgICAgICAgLy8gYS5jb250YWlucyhiKSA9PSBhLmludmVyc2UuaXNEaXNqb2ludChiKQotICAgICAgICBpZiAoIV9pbnZlcnRlZCAmJiBzZXQuZXhjbHVkZWRVUklzKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBpbnZlcnNlKCkuaXNEaXNqb2ludChzZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIGdpdmVuIHNldCBpcyBkaXNqb2ludCBmcm9tIHRoaXMgb25lLgotICAgICAqIEBwYXJhbSBzZXQgdGhlIHNldCB0byB0ZXN0Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzZXQgaXMgZGlzam9pbnQgZnJvbSB0aGlzIHNldAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGlzam9pbnQoUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCkKLSAgICB7Ci0gICAgICAgIGlmIChfaW52ZXJ0ZWQgJiYgc2V0LmV4Y2x1ZGVkVVJJcygpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKF9pbnZlcnRlZCkKLSAgICAgICAgICAgIHJldHVybiBpc0Rpc2pvaW50SW1wbChzZXQsIHRoaXMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gaXNEaXNqb2ludEltcGwodGhpcywgc2V0KTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRGlzam9pbnRJbXBsKFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQxLCBRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0MikKLSAgICB7Ci0gICAgICAgIFNldCBpbmNsdWRlVVJJcyA9IHNldDEuaW5jbHVkZWRVUklzKCk7Ci0gICAgICAgIFNldCBvdGhlckluY2x1ZGVVUklzID0gc2V0Mi5pbmNsdWRlZFVSSXMoKTsKLSAgICAgICAgaWYgKG90aGVySW5jbHVkZVVSSXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gaW5jbHVkZVVSSXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAob3RoZXJJbmNsdWRlVVJJcy5jb250YWlucyhpLm5leHQoKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldCBvdGhlckV4Y2x1ZGVVUklzID0gc2V0Mi5leGNsdWRlZFVSSXMoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGluY2x1ZGVVUklzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFvdGhlckV4Y2x1ZGVVUklzLmNvbnRhaW5zKGkubmV4dCgpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc2V0MS5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNldDIuY29udGFpbnMoKFFOYW1lKWkubmV4dCgpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW5jbHVkZVVSSXMuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNldDIuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzZXQxLmNvbnRhaW5zKChRTmFtZSlpLm5leHQoKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgCi0gICAgLyoqCi0gICAgICogTmFtZXNwYWNlcyB0aGF0IGFyZSBmdWxseSBleGNsdWRlZCBmcm9tIHRoZSBzZXQgZXhjZXB0IGZvciBhIGZpbml0ZQotICAgICAqIG51bWJlciBvZiBpbmRpdmlkdWFsIFFOYW1lIGV4Y2VwdGlvbnMuICBSZXR1cm5zIG51bGwgaWYgdGhpcyBzZXQgaXMgaW5maW5pdGUuCi0gICAgICogQHJldHVybiB0aGUgc2V0IG9mIGV4Y2x1ZGVkIG5hbWVzcGFjZSBVUkkgc3RyaW5ncwotICAgICAqLyAKLSAgICBwdWJsaWMgU2V0IGV4Y2x1ZGVkVVJJcygpCi0gICAgewotICAgICAgICBpZiAoX2ludmVydGVkKSByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KF9pbmNsdWRlZFVSSXMpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lc3BhY2VzIHRoYXQgYXJlIGZ1bGx5IGluY2x1ZGVkIGluIHNldCBleGNlcHQgZm9yIGEgZmluaXRlCi0gICAgICogbnVtYmVyIG9mIGluZGl2aWR1YWwgUU5hbWUgZXhjZXB0aW9ucy4gUmV0dXJucyBudWxsIGlmIHRoaXMgc2V0IGlzIGluZmluaXRlLgotICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBpbmNsdWRlZCBuYW1lc3BhY2UgVVJJIHN0cmluZ3MKLSAgICAgKi8gCi0gICAgcHVibGljIFNldCBpbmNsdWRlZFVSSXMoKQotICAgIHsKLSAgICAgICAgaWYgKCFfaW52ZXJ0ZWQpIHJldHVybiBfaW5jbHVkZWRVUklzOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIHNldCBvZiBRTmFtZXMgZXhjbHVkZWQgZnJvbSB0aGUgc2V0IGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHdpdGhpbgotICAgICAqIGEgbmFtZXNwYWNlIHRoYXQgaXMgb3RoZXJ3aXNlIGZ1bGx5IGluY2x1ZGVkIGluIHRoZSBzZXQuCi0gICAgICogQHJldHVybiB0aGUgc2V0IG9mIGV4Y2x1ZGVkIFFOYW1lcyBmcm9tIHdpdGhpbiBpbmNsdWRlZFVSSSBuYW1lc3BhY2VzCi0gICAgICovIAotICAgIHB1YmxpYyBTZXQgZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcygpCi0gICAgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KF9pbnZlcnRlZCA/IF9pbmNsdWRlZFFOYW1lcyA6IF9leGNsdWRlZFFOYW1lcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHNldCBvZiBRTmFtZXMgaW5jbHVkZWQgaW4gdGhlIHNldCBldmVuIHRob3VnaCB0aGV5IGFyZSB3aXRoaW4KLSAgICAgKiBhIG5hbWVzcGFjZSB0aGF0IGlzIG90aGVyd2lzZSBmdWxseSBpbmNsdWRlZCBpbiB0aGUgc2V0LgotICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBpbmNsdWRlZCBRTmFtZXMgZnJvbSB3aXRoaW4gZXhjbHVkZWRVUkkgbmFtZXNwYWNlcwotICAgICAqLyAKLSAgICBwdWJsaWMgU2V0IGluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChfaW52ZXJ0ZWQgPyBfZXhjbHVkZWRRTmFtZXMgOiBfaW5jbHVkZWRRTmFtZXMpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBwcmV0dHlRTmFtZShRTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKSArICJAIiArIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiB1c2VmdWwgZm9yIGRlYnVnZ2luZywgc3ViamVjdCB0byBjaGFuZ2UuCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQoIlFOYW1lU2V0Iik7Ci0gICAgICAgIHNiLmFwcGVuZChfaW52ZXJ0ZWQgPyAiLSgiIDogIisoIik7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9pbmNsdWRlZFVSSXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCIrKkAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChpLm5leHQoKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2V4Y2x1ZGVkUU5hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLSIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHByZXR0eVFOYW1lKChRTmFtZSlpLm5leHQoKSkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9pbmNsdWRlZFFOYW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIisiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChwcmV0dHlRTmFtZSgoUU5hbWUpaS5uZXh0KCkpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgaW5kZXggPSBzYi5sYXN0SW5kZXhPZigiLCAiKTsKLSAgICAgICAgaWYgKGluZGV4ID4gMCkKLSAgICAgICAgICAgIHNiLnNldExlbmd0aChpbmRleCk7Ci0gICAgICAgIHNiLmFwcGVuZCgnKScpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVTZXRCdWlsZGVyLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVTZXRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNWI1N2IuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lU2V0QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBVc2VkIHRvIGJ1aWxkIHtAbGluayBRTmFtZVNldCBRTmFtZVNldHN9LgotICovIAotcHVibGljIGNsYXNzIFFOYW1lU2V0QnVpbGRlciBpbXBsZW1lbnRzIFFOYW1lU2V0U3BlY2lmaWNhdGlvbiwgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gX2ludmVydGVkOwotICAgIHByaXZhdGUgU2V0IF9pbmNsdWRlZFVSSXM7Ci0gICAgcHJpdmF0ZSBTZXQgX2V4Y2x1ZGVkUU5hbWVzOwotICAgIHByaXZhdGUgU2V0IF9pbmNsdWRlZFFOYW1lczsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgUU5hbWVTZXRCdWlsZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZVNldEJ1aWxkZXIoKQotICAgIHsKLSAgICAgICAgX2ludmVydGVkID0gZmFsc2U7Ci0gICAgICAgIF9pbmNsdWRlZFVSSXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBfZXhjbHVkZWRRTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBfaW5jbHVkZWRRTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBRTmFtZVNldEJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUgZ2l2ZW4gYnkKLSAgICAgKiBhbm90aGVyIFFOYW1lU2V0U3BlY2lmaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gc2V0IHRoZSBRTmFtZVNldFNwZWNpZmljYWl0b24gdG8gY29weQotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZVNldEJ1aWxkZXIoUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCkKLSAgICB7Ci0gICAgICAgIFNldCBpbmNsdWRlZFVSSXMgPSBzZXQuaW5jbHVkZWRVUklzKCk7Ci0gICAgICAgIGlmIChpbmNsdWRlZFVSSXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX2ludmVydGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBfaW5jbHVkZWRVUklzID0gbmV3IEhhc2hTZXQoaW5jbHVkZWRVUklzKTsKLSAgICAgICAgICAgIF9leGNsdWRlZFFOYW1lcyA9IG5ldyBIYXNoU2V0KHNldC5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkpOwotICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzID0gbmV3IEhhc2hTZXQoc2V0LmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBfaW52ZXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgX2luY2x1ZGVkVVJJcyA9IG5ldyBIYXNoU2V0KHNldC5leGNsdWRlZFVSSXMoKSk7Ci0gICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMgPSBuZXcgSGFzaFNldChzZXQuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpKTsKLSAgICAgICAgICAgIF9pbmNsdWRlZFFOYW1lcyA9IG5ldyBIYXNoU2V0KHNldC5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIFFOYW1lU2V0QnVpbGRlciB3aG9zZSBpbml0YWwgY29udGVudHMgYXJlIGdpdmVuIGJ5Ci0gICAgICogdGhlIGZvdXIgc2V0cy4gIEV4YWN0bHkgb25lIG9mIGVpdGhlciBleGNsdWRlZFVSSXMgb3IgaW5jbHVkZWRVUklzIG11c3QKLSAgICAgKiBiZSBub24tbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXhjbHVkZWRVUklzIHRoZSBmaW5pdGUgc2V0IG9mIG5hbWVzcGFjZSBVUkkgc3RyaW5ncyB0byBleGNsdWRlIGZyb20gdGhlIHNldCwgb3IgbnVsbCBpZiB0aGlzIHNldCBpcyBpbmZpbml0ZQotICAgICAqIEBwYXJhbSBpbmNsdWRlZFVSSXMgdGhlIGZpbml0ZSBzZXQgb2YgbmFtZXNwYWNlIFVSSSBzdHJpbmdzIHRvIGluY2x1ZGUgaW4gdGhlIHNldCwgb3IgbnVsbCBpZiB0aGlzIHNldCBpcyBpbmZpbml0ZQotICAgICAqIEBwYXJhbSBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzIHRoZSBmaW5pdGUgc2V0IG9mIGV4Y2VwdGlvbmFsIFFOYW1lcyB0byBleGNsdWRlIGZyb20gdGhlIGluY2x1ZGVkIG5hbWVzcGFjZXMKLSAgICAgKiBAcGFyYW0gZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcyB0aGUgZmluaXRlIHNldCBvZiBleGNlcHRpb25hbCBRTmFtZXMgdG8gaW5jbHVkZSB0aGF0IGFyZSBpbiB0aGUgZXhjbHVkZWQgbmFtZXNwYWNlcwotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZVNldEJ1aWxkZXIoU2V0IGV4Y2x1ZGVkVVJJcywgU2V0IGluY2x1ZGVkVVJJcywgU2V0IGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMsIFNldCBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKQotICAgIHsKLSAgICAgICAgaWYgKGluY2x1ZGVkVVJJcyAhPSBudWxsICYmIGV4Y2x1ZGVkVVJJcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBfaW52ZXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIF9pbmNsdWRlZFVSSXMgPSBuZXcgSGFzaFNldChpbmNsdWRlZFVSSXMpOwotICAgICAgICAgICAgX2V4Y2x1ZGVkUU5hbWVzID0gbmV3IEhhc2hTZXQoZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcyk7Ci0gICAgICAgICAgICBfaW5jbHVkZWRRTmFtZXMgPSBuZXcgSGFzaFNldChpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChleGNsdWRlZFVSSXMgIT0gbnVsbCAmJiBpbmNsdWRlZFVSSXMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX2ludmVydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIF9pbmNsdWRlZFVSSXMgPSBuZXcgSGFzaFNldChleGNsdWRlZFVSSXMpOwotICAgICAgICAgICAgX2V4Y2x1ZGVkUU5hbWVzID0gbmV3IEhhc2hTZXQoaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcyk7Ci0gICAgICAgICAgICBfaW5jbHVkZWRRTmFtZXMgPSBuZXcgSGFzaFNldChleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFeGFjdGx5IG9uZSBvZiBleGNsdWRlZFVSSXMgYW5kIGluY2x1ZGVkVVJJcyBtdXN0IGJlIG51bGwiKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBRTmFtZVNldEJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUgZ2l2ZW4KLSAgICAgKiBhcyBhIGxpc3Qgb2YgbmFtZXNwYWNlIFVSSXMsIHVzaW5nIHRoZSBzYW1lIGZvcm1hdCB1c2VkIGJ5IHdpbGRjYXJkcwotICAgICAqIGluIFhTRCBmaWxlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyIGEgd2lsZGNhcmQgbmFtZXNwYWNlIHNwZWNpZmljYXRpb24gc3RyaW5nIHN1Y2ggYXMgIiMjYW55IiwKLSAgICAgKiAgICAgICAgIiMjb3RoZXIiLCAiIyNsb2NhbCIsICIjI3RhcmdldE5hbWVzcGFjZSIsIG9yIGEgc3BhY2Utc2VwYXJhdGVkCi0gICAgICogICAgICAgIGxpc3Qgb2YgVVJJcy4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0VVJJIHRoZSBjdXJyZW50IHRhcmdldE5hbWVzcGFjZQotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZVNldEJ1aWxkZXIoU3RyaW5nIHN0ciwgU3RyaW5nIHRhcmdldFVSSSkKLSAgICB7Ci0gICAgICAgIHRoaXMoKTsKLQotICAgICAgICBpZiAoc3RyID09IG51bGwpCi0gICAgICAgICAgICBzdHIgPSAiIyNhbnkiOwotCi0gICAgICAgIFN0cmluZ1tdIHVyaSA9IHNwbGl0TGlzdChzdHIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVyaS5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGFkZHVyaSA9IHVyaVtpXTsKLSAgICAgICAgICAgIGlmIChhZGR1cmkuc3RhcnRzV2l0aCgiIyMiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYWRkdXJpLmVxdWFscygiIyNvdGhlciIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldFVSSSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBRTmFtZVNldEJ1aWxkZXIgdGVtcCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcC5hZGROYW1lc3BhY2UodGFyZ2V0VVJJKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcC5hZGROYW1lc3BhY2UoIiIpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wLmludmVydCgpOwotICAgICAgICAgICAgICAgICAgICBhZGRBbGwodGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChhZGR1cmkuZXF1YWxzKCIjI2FueSIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaW52ZXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh1cmlbaV0uZXF1YWxzKCIjI3RhcmdldE5hbWVzcGFjZSIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldFVSSSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBhZGR1cmkgPSB0YXJnZXRVUkk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVyaVtpXS5lcXVhbHMoIiMjbG9jYWwiKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHVyaSA9ICIiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZE5hbWVzcGFjZShhZGR1cmkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIExvY2FsIHhtbCBuYW1lcyBhcmUgaGFzZWQgdXNpbmcgIiIgYXMgdGhlIG5hbWVzcGFjZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbnNGcm9tTmFtZShRTmFtZSBRTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBucyA9IFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICByZXR1cm4gbnMgPT0gbnVsbCA/ICIiIDogbnM7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX1NUUklOR0FSUkFZID0gbmV3IFN0cmluZ1swXTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3BhY2UoY2hhciBjaCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoY2gpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgJyAnOgotICAgICAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBzcGxpdExpc3QoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBpZiAocy5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NUUklOR0FSUkFZOwotICAgICAgICAgICAgICAgIAotICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoaSA8IHMubGVuZ3RoKCkgJiYgaXNTcGFjZShzLmNoYXJBdChpKSkpCi0gICAgICAgICAgICAgICAgaSArPSAxOwotICAgICAgICAgICAgaWYgKGkgPj0gcy5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZ1tdKXJlc3VsdC50b0FycmF5KEVNUFRZX1NUUklOR0FSUkFZKTsKLSAgICAgICAgICAgIHN0YXJ0ID0gaTsKLSAgICAgICAgICAgIHdoaWxlIChpIDwgcy5sZW5ndGgoKSAmJiAhaXNTcGFjZShzLmNoYXJBdChpKSkpCi0gICAgICAgICAgICAgICAgaSArPSAxOwotICAgICAgICAgICAgcmVzdWx0LmFkZChzLnN1YnN0cmluZyhzdGFydCwgaSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZSBhbGwgeG1sIG5hbWVzIGZyb20gcW5hbWVzZXQgd2hvc2UgbmFtZXNwYWNlIG1hdGNoZXMgdGhlIHVyaS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE1hdGNoaW5nTnMoU3RyaW5nIHVyaSwgU2V0IHFuYW1lc2V0KQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcW5hbWVzZXQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHVyaS5lcXVhbHMobnNGcm9tTmFtZSgoUU5hbWUpaS5uZXh0KCkpKSkKLSAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGFsbCB4bWwgbmFtZXMgZnJvbSBxbmFtZXNldCB3aG9zZSBuYW1lc3BhY2UgaXMgaW4gdGhlCi0gICAgICogZmlyc3Qgc2V0IG9mIHVyaXMgYnV0IG5vdCB0aGUgc2Vjb25kLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsTWF0Y2hpbmdGaXJzdE9ubHkoU2V0IHNldEZpcnN0LCBTZXQgc2V0U2Vjb25kLCBTZXQgcW5hbWVzZXQpCi0gICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBxbmFtZXNldC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbnMgPSBuc0Zyb21OYW1lKChRTmFtZSlpLm5leHQoKSk7Ci0gICAgICAgICAgICBpZiAoc2V0Rmlyc3QuY29udGFpbnMobnMpICYmICFzZXRTZWNvbmQuY29udGFpbnMobnMpKQotICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYWxsIHhtbCBuYW1lcyBmcm9tIHFuYW1lc2V0IHdob3NlIG5hbWVzcGFjZSBpcyBpbiBib3RoCi0gICAgICogc2V0cyBvZiB1cmlzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsTWF0Y2hpbmdCb3RoKFNldCBzZXRGaXJzdCwgU2V0IHNldFNlY29uZCwgU2V0IHFuYW1lc2V0KQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcW5hbWVzZXQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5zID0gbnNGcm9tTmFtZSgoUU5hbWUpaS5uZXh0KCkpOwotICAgICAgICAgICAgaWYgKHNldEZpcnN0LmNvbnRhaW5zKG5zKSAmJiBzZXRTZWNvbmQuY29udGFpbnMobnMpKQotICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYWxsIHhtbCBuYW1lcyBmcm9tIHFuYW1lc2V0IHdob3NlIG5hbWVzcGFjZSBpcyBpbiBuZWl0aGVyCi0gICAgICogc2V0IG9mIHVyaXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxNYXRjaGluZ05laXRoZXIoU2V0IHNldEZpcnN0LCBTZXQgc2V0U2Vjb25kLCBTZXQgcW5hbWVzZXQpCi0gICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBxbmFtZXNldC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbnMgPSBuc0Zyb21OYW1lKChRTmFtZSlpLm5leHQoKSk7Ci0gICAgICAgICAgICBpZiAoIXNldEZpcnN0LmNvbnRhaW5zKG5zKSAmJiAhc2V0U2Vjb25kLmNvbnRhaW5zKG5zKSkKLSAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIE1vZGVsVHJhbnNpdGlvblNldCBjb250YWlucyB0aGUgZ2l2ZW4gcW5hbWUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoUU5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW4gPSBfaW5jbHVkZWRVUklzLmNvbnRhaW5zKG5zRnJvbU5hbWUobmFtZSkpID8KLSAgICAgICAgICAgICAgICAgICAgICFfZXhjbHVkZWRRTmFtZXMuY29udGFpbnMobmFtZSkgOgotICAgICAgICAgICAgICAgICAgICAgIF9pbmNsdWRlZFFOYW1lcy5jb250YWlucyhuYW1lKTsKLSAgICAgICAgcmV0dXJuIF9pbnZlcnRlZCBeIGluOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBNb2RlbFRyYW5zaXRpb25TZXQgY29udGFpbnMgYWxsIFFOYW1lcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2ludmVydGVkICYmIF9pbmNsdWRlZFVSSXMuc2l6ZSgpID09IDAgJiYgX2luY2x1ZGVkUU5hbWVzLnNpemUoKSA9PSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBNb2RlbFRyYW5zaXRpb25TZXQgY29udGFpbnMgbm8gUU5hbWVzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICFfaW52ZXJ0ZWQgJiYgX2luY2x1ZGVkVVJJcy5zaXplKCkgPT0gMCAmJiBfaW5jbHVkZWRRTmFtZXMuc2l6ZSgpID09IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBRTmFtZVNldCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBvbmUgYW5kIGFub3RoZXIuCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lU2V0IGludGVyc2VjdChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KQotICAgIHsKLSAgICAgICAgUU5hbWVTZXRCdWlsZGVyIHJlc3VsdCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIodGhpcyk7Ci0gICAgICAgIHJlc3VsdC5yZXN0cmljdChzZXQpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvUU5hbWVTZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IFFOYW1lU2V0IHRoYXQgaXMgdGhlIHVuaW9uIG9mIHRoaXMgb25lIGFuZCBhbm90aGVyLgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZVNldCB1bmlvbihRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KQotICAgIHsKLSAgICAgICAgUU5hbWVTZXRCdWlsZGVyIHJlc3VsdCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIodGhpcyk7Ci0gICAgICAgIHJlc3VsdC5hZGRBbGwoc2V0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1FOYW1lU2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBRTmFtZVNldCB0aGF0IGlzIHRoZSBpbnZlcnNlIG9mIHRoaXMgb25lLgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZVNldCBpbnZlcnNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBRTmFtZVNldC5mb3JTZXRzKGluY2x1ZGVkVVJJcygpLCBleGNsdWRlZFVSSXMoKSwgaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpLCBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIHBhcmFtZXRlciBpcyBhIHN1YnNldCBvZiB0aGlzIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KQotICAgIHsKLSAgICAgICAgaWYgKCFfaW52ZXJ0ZWQgJiYgc2V0LmV4Y2x1ZGVkVVJJcygpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaW52ZXJzZSgpLmlzRGlzam9pbnQoc2V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBnaXZlbiBzZXQgaXMgZGlzam9pbnQgZnJvbSB0aGlzIG9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rpc2pvaW50KFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQpCi0gICAgewotICAgICAgICBpZiAoX2ludmVydGVkICYmIHNldC5leGNsdWRlZFVSSXMoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmIChfaW52ZXJ0ZWQpCi0gICAgICAgICAgICByZXR1cm4gaXNEaXNqb2ludEltcGwoc2V0LCB0aGlzKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGlzRGlzam9pbnRJbXBsKHRoaXMsIHNldCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRGlzam9pbnRJbXBsKFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQxLCBRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0MikKLSAgICB7Ci0gICAgICAgIFNldCBpbmNsdWRlVVJJcyA9IHNldDEuaW5jbHVkZWRVUklzKCk7Ci0gICAgICAgIFNldCBvdGhlckluY2x1ZGVVUklzID0gc2V0Mi5pbmNsdWRlZFVSSXMoKTsKLSAgICAgICAgaWYgKG90aGVySW5jbHVkZVVSSXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gaW5jbHVkZVVSSXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAob3RoZXJJbmNsdWRlVVJJcy5jb250YWlucyhpLm5leHQoKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldCBvdGhlckV4Y2x1ZGVVUklzID0gc2V0Mi5leGNsdWRlZFVSSXMoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGluY2x1ZGVVUklzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFvdGhlckV4Y2x1ZGVVUklzLmNvbnRhaW5zKGkubmV4dCgpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc2V0MS5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNldDIuY29udGFpbnMoKFFOYW1lKWkubmV4dCgpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW5jbHVkZVVSSXMuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNldDIuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzZXQxLmNvbnRhaW5zKChRTmFtZSlpLm5leHQoKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhpcyBRTmFtZVNldEJ1aWxkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpCi0gICAgewotICAgICAgICBfaW52ZXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgX2luY2x1ZGVkVVJJcy5jbGVhcigpOwotICAgICAgICBfZXhjbHVkZWRRTmFtZXMuY2xlYXIoKTsKLSAgICAgICAgX2luY2x1ZGVkUU5hbWVzLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52ZXJ0cyB0aGlzIFFOYW1lU2V0QnVpbGRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnZlcnQoKQotICAgIHsKLSAgICAgICAgX2ludmVydGVkID0gIV9pbnZlcnRlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgc2luZ2xlIFFOYW1lIHRvIHRoaXMgUU5hbWVTZXRCdWlsZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZChRTmFtZSBxbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmICghX2ludmVydGVkKQotICAgICAgICAgICAgYWRkSW1wbChxbmFtZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlbW92ZUltcGwocW5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gZW50aXJlIG5hbWVzcGFjZSBVUkkgb2YgUU5hbWVzIHRvIHRoaXMgUU5hbWVTZXRCdWlsZGVyLgotICAgICAqIFRoZSBlbXB0eSBzdHJpbmcgaXMgdXNlZCB0byBzaWduaWZpeSB0aGUgKGxvY2FsKSBuby1uYW1lc3BhY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlKFN0cmluZyB1cmkpCi0gICAgewotICAgICAgICBpZiAoIV9pbnZlcnRlZCkKLSAgICAgICAgICAgIGFkZE5hbWVzcGFjZUltcGwodXJpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVtb3ZlTmFtZXNwYWNlSW1wbCh1cmkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgUU5hbWVTZXQgdG8gdGhpcyBRTmFtZVNldEJ1aWxkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQWxsKFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQpCi0gICAgewotICAgICAgICBpZiAoX2ludmVydGVkKQotICAgICAgICAgICAgcmVtb3ZlQWxsSW1wbChzZXQuaW5jbHVkZWRVUklzKCksIHNldC5leGNsdWRlZFVSSXMoKSwgc2V0LmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKSwgc2V0LmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFkZEFsbEltcGwoc2V0LmluY2x1ZGVkVVJJcygpLCBzZXQuZXhjbHVkZWRVUklzKCksIHNldC5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCksIHNldC5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGdpdmVuIHFuYW1lIGZyb20gdGhpcyBRTmFtZVNldEJ1aWxkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKFFOYW1lIHFuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKF9pbnZlcnRlZCkKLSAgICAgICAgICAgIGFkZEltcGwocW5hbWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZW1vdmVJbXBsKHFuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFuIGVudGlyZSBuYW1lc3BhY2UgVVJJIGZyb20gdGhpcyBRTmFtZVNldEJ1aWxkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTmFtZXNwYWNlKFN0cmluZyB1cmkpCi0gICAgewotICAgICAgICBpZiAoX2ludmVydGVkKQotICAgICAgICAgICAgYWRkTmFtZXNwYWNlSW1wbCh1cmkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZW1vdmVOYW1lc3BhY2VJbXBsKHVyaSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgY29udGVudHMgb2YgYSBnaXZlbiBRTmFtZVNldCBmcm9tIHRoaXMgUU5hbWVTZXRCdWlsZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KQotICAgIHsKLSAgICAgICAgaWYgKF9pbnZlcnRlZCkKLSAgICAgICAgICAgIGFkZEFsbEltcGwoc2V0LmluY2x1ZGVkVVJJcygpLCBzZXQuZXhjbHVkZWRVUklzKCksIHNldC5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCksIHNldC5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZW1vdmVBbGxJbXBsKHNldC5pbmNsdWRlZFVSSXMoKSwgc2V0LmV4Y2x1ZGVkVVJJcygpLCBzZXQuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpLCBzZXQuZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN0cmljdHMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgUU5hbWVTZXRCdWlsZGVyIHRvIGJlIGEgc3Vic2V0IG9mIHRoZQotICAgICAqIGdpdmVuIFFOYW1lU2V0LiBJbiBvdGhlciB3b3JkcywgY29tcHV0ZXMgYW4gaW50ZXJzZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc3RyaWN0KFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQpCi0gICAgewotICAgICAgICBpZiAoX2ludmVydGVkKQotICAgICAgICAgICAgYWRkQWxsSW1wbChzZXQuZXhjbHVkZWRVUklzKCksIHNldC5pbmNsdWRlZFVSSXMoKSwgc2V0LmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKSwgc2V0LmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlbW92ZUFsbEltcGwoc2V0LmV4Y2x1ZGVkVVJJcygpLCBzZXQuaW5jbHVkZWRVUklzKCksIHNldC5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCksIHNldC5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFkZChxbmFtZSkgdGhhdCBpZ25vcmVzIGludmVyc2lvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkSW1wbChRTmFtZSBxbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChfaW5jbHVkZWRVUklzLmNvbnRhaW5zKG5zRnJvbU5hbWUocW5hbWUpKSkKLSAgICAgICAgICAgIF9leGNsdWRlZFFOYW1lcy5yZW1vdmUocW5hbWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBfaW5jbHVkZWRRTmFtZXMuYWRkKHFuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhZGQobnMpIHRoYXQgaWdub3JlcyBpbnZlcnNpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE5hbWVzcGFjZUltcGwoU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICAgIGlmIChfaW5jbHVkZWRVUklzLmNvbnRhaW5zKHVyaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlbW92ZUFsbE1hdGNoaW5nTnModXJpLCBfZXhjbHVkZWRRTmFtZXMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlQWxsTWF0Y2hpbmdOcyh1cmksIF9pbmNsdWRlZFFOYW1lcyk7Ci0gICAgICAgICAgICBfaW5jbHVkZWRVUklzLmFkZCh1cmkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gb2YgYWRkKHNldCkgdGhhdCBpZ25vcmVzIGludmVyc2lvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkQWxsSW1wbChTZXQgaW5jbHVkZWRVUklzLCBTZXQgZXhjbHVkZWRVUklzLCBTZXQgaW5jbHVkZWRRTmFtZXMsIFNldCBleGNsdWRlZFFOYW1lcykKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZXhjbHVkZSA9IChleGNsdWRlZFVSSXMgIT0gbnVsbCk7Ci0gICAgICAgIFNldCBzcGVjaWFsVVJJcyA9IGV4Y2x1ZGUgPyBleGNsdWRlZFVSSXMgOiBpbmNsdWRlZFVSSXM7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2V4Y2x1ZGVkUU5hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFFOYW1lIG5hbWUgPSAoUU5hbWUpaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdXJpID0gbnNGcm9tTmFtZShuYW1lKTsKLSAgICAgICAgICAgIGlmICgoZXhjbHVkZSBeIHNwZWNpYWxVUklzLmNvbnRhaW5zKHVyaSkpICYmICFleGNsdWRlZFFOYW1lcy5jb250YWlucyhuYW1lKSkKLSAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZXhjbHVkZWRRTmFtZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IChRTmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuc0Zyb21OYW1lKG5hbWUpOwotICAgICAgICAgICAgaWYgKCFfaW5jbHVkZWRVUklzLmNvbnRhaW5zKHVyaSkgJiYgIV9pbmNsdWRlZFFOYW1lcy5jb250YWlucyhuYW1lKSkKLSAgICAgICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMuYWRkKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gaW5jbHVkZWRRTmFtZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IChRTmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuc0Zyb21OYW1lKG5hbWUpOwotICAgICAgICAgICAgaWYgKCFfaW5jbHVkZWRVUklzLmNvbnRhaW5zKHVyaSkpCi0gICAgICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzLmFkZChuYW1lKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMucmVtb3ZlKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFleGNsdWRlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZW1vdmVBbGxNYXRjaGluZ0ZpcnN0T25seShpbmNsdWRlZFVSSXMsIF9pbmNsdWRlZFVSSXMsIF9pbmNsdWRlZFFOYW1lcyk7Ci0gICAgICAgICAgICBfaW5jbHVkZWRVUklzLmFkZEFsbChpbmNsdWRlZFVSSXMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlQWxsTWF0Y2hpbmdOZWl0aGVyKGV4Y2x1ZGVkVVJJcywgX2luY2x1ZGVkVVJJcywgX2luY2x1ZGVkUU5hbWVzKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9pbmNsdWRlZFVSSXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWV4Y2x1ZGVkVVJJcy5jb250YWlucyh1cmkpKQotICAgICAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBleGNsdWRlZFVSSXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIV9pbmNsdWRlZFVSSXMuY29udGFpbnModXJpKSkKLSAgICAgICAgICAgICAgICAgICAgX2luY2x1ZGVkVVJJcy5hZGQodXJpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIF9pbmNsdWRlZFVSSXMucmVtb3ZlKHVyaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXQgdGVtcCA9IF9leGNsdWRlZFFOYW1lczsKLSAgICAgICAgICAgIF9leGNsdWRlZFFOYW1lcyA9IF9pbmNsdWRlZFFOYW1lczsKLSAgICAgICAgICAgIF9pbmNsdWRlZFFOYW1lcyA9IHRlbXA7Ci0gICAgICAgICAgICBfaW52ZXJ0ZWQgPSAhX2ludmVydGVkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gb2YgcmVtb3ZlKHFuYW1lKSB0aGF0IGlnbm9yZXMgaW52ZXJzaW9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZW1vdmVJbXBsKFFOYW1lIHFuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKF9pbmNsdWRlZFVSSXMuY29udGFpbnMobnNGcm9tTmFtZShxbmFtZSkpKQotICAgICAgICAgICAgX2V4Y2x1ZGVkUU5hbWVzLmFkZChxbmFtZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIF9pbmNsdWRlZFFOYW1lcy5yZW1vdmUocW5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHJlbW92ZShucykgdGhhdCBpZ25vcmVzIGludmVyc2lvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlTmFtZXNwYWNlSW1wbChTdHJpbmcgdXJpKQotICAgIHsKLSAgICAgICAgaWYgKF9pbmNsdWRlZFVSSXMuY29udGFpbnModXJpKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlQWxsTWF0Y2hpbmdOcyh1cmksIF9leGNsdWRlZFFOYW1lcyk7Ci0gICAgICAgICAgICBfaW5jbHVkZWRVUklzLnJlbW92ZSh1cmkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlQWxsTWF0Y2hpbmdOcyh1cmksIF9pbmNsdWRlZFFOYW1lcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiByZW1vdmUoc2V0KSB0aGF0IGlnbm9yZXMgaW52ZXJzaW9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZW1vdmVBbGxJbXBsKFNldCBpbmNsdWRlZFVSSXMsIFNldCBleGNsdWRlZFVSSXMsIFNldCBpbmNsdWRlZFFOYW1lcywgU2V0IGV4Y2x1ZGVkUU5hbWVzKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBleGNsdWRlID0gKGV4Y2x1ZGVkVVJJcyAhPSBudWxsKTsKLSAgICAgICAgU2V0IHNwZWNpYWxVUklzID0gZXhjbHVkZSA/IGV4Y2x1ZGVkVVJJcyA6IGluY2x1ZGVkVVJJczsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfaW5jbHVkZWRRTmFtZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IChRTmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuc0Zyb21OYW1lKG5hbWUpOwotICAgICAgICAgICAgaWYgKGV4Y2x1ZGUgXiBzcGVjaWFsVVJJcy5jb250YWlucyh1cmkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghZXhjbHVkZWRRTmFtZXMuY29udGFpbnMobmFtZSkpCi0gICAgICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVkUU5hbWVzLmNvbnRhaW5zKG5hbWUpKQotICAgICAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gaW5jbHVkZWRRTmFtZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IChRTmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuc0Zyb21OYW1lKG5hbWUpOwotICAgICAgICAgICAgaWYgKF9pbmNsdWRlZFVSSXMuY29udGFpbnModXJpKSkKLSAgICAgICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMuYWRkKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZXhjbHVkZWRRTmFtZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IChRTmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuc0Zyb21OYW1lKG5hbWUpOwotICAgICAgICAgICAgaWYgKF9pbmNsdWRlZFVSSXMuY29udGFpbnModXJpKSAmJiAhX2V4Y2x1ZGVkUU5hbWVzLmNvbnRhaW5zKG5hbWUpKQotICAgICAgICAgICAgICAgIF9pbmNsdWRlZFFOYW1lcy5hZGQobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXhjbHVkZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlQWxsTWF0Y2hpbmdGaXJzdE9ubHkoX2luY2x1ZGVkVVJJcywgZXhjbHVkZWRVUklzLCBfZXhjbHVkZWRRTmFtZXMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlQWxsTWF0Y2hpbmdCb3RoKF9pbmNsdWRlZFVSSXMsIGluY2x1ZGVkVVJJcywgX2V4Y2x1ZGVkUU5hbWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9pbmNsdWRlZFVSSXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGV4Y2x1ZGUgXiBzcGVjaWFsVVJJcy5jb250YWlucyhpLm5leHQoKSkpCi0gICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgZXhjbHVkZWRVUklzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfaW52ZXJ0ZWQpIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoX2luY2x1ZGVkVVJJcyk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgaW5jbHVkZWRVUklzKCkKLSAgICB7Ci0gICAgICAgIGlmICghX2ludmVydGVkKSByZXR1cm4gX2luY2x1ZGVkVVJJczsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoX2ludmVydGVkID8gX2luY2x1ZGVkUU5hbWVzIDogX2V4Y2x1ZGVkUU5hbWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChfaW52ZXJ0ZWQgPyBfZXhjbHVkZWRRTmFtZXMgOiBfaW5jbHVkZWRRTmFtZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHByZXR0eVFOYW1lKFFOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBpZiAobmFtZS5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsUGFydCgpICsgIkAiICsgbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHVzZWZ1bCBmb3IgZGVidWdnaW5nLCBzdWJqZWN0IHRvIGNoYW5nZS4KLSAgICAgKi8gCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZCgiUU5hbWVTZXRCdWlsZGVyIik7Ci0gICAgICAgIHNiLmFwcGVuZChfaW52ZXJ0ZWQgPyAiLSgiIDogIisoIik7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9pbmNsdWRlZFVSSXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCIrKkAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChpLm5leHQoKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2V4Y2x1ZGVkUU5hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLSIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHByZXR0eVFOYW1lKChRTmFtZSlpLm5leHQoKSkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9pbmNsdWRlZFFOYW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIisiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChwcmV0dHlRTmFtZSgoUU5hbWUpaS5uZXh0KCkpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgaW5kZXggPSBzYi5sYXN0SW5kZXhPZigiLCAiKTsKLSAgICAgICAgaWYgKGluZGV4ID4gMCkKLSAgICAgICAgICAgIHNiLnNldExlbmd0aChpbmRleCk7Ci0gICAgICAgIHNiLmFwcGVuZCgnKScpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHtAbGluayBRTmFtZVNldH0gZXF1aXZhbGVudCB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGlzCi0gICAgICogUU5hbWVTZXRCdWlsZGVyLgotICAgICAqLyAKLSAgICBwdWJsaWMgUU5hbWVTZXQgdG9RTmFtZVNldCgpCi0gICAgewotICAgICAgICByZXR1cm4gUU5hbWVTZXQuZm9yU3BlY2lmaWNhdGlvbih0aGlzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVTZXRTcGVjaWZpY2F0aW9uLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVTZXRTcGVjaWZpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOTNmZmIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lU2V0U3BlY2lmaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBsYXR0aWNlIG9mIGZpbml0ZSBhbmQgaW5maW5pdGUgc2V0cyBvZiBRTmFtZXMuCi0gKiAKLSAqIEBzZWUgUU5hbWVTZXQKLSAqLwotcHVibGljIGludGVyZmFjZSBRTmFtZVNldFNwZWNpZmljYXRpb24KLXsKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBzZXQgY29udGFpbnMgdGhlIGdpdmVuIFFOYW1lLgotICAgICAqCi0gICAgICogUm91Z2hseSBlcXVpdmFsZW50IHRvOgotICAgICAqICAgIChpbmNsdWRlZFVSSXMoKSA9PSBudWxsID8KLSAgICAgKiAgICAgICAgICAgZXhjbHVkZWRVUklzKCkuY29udGFpbnMobmFtZXNwYWNlKSA6Ci0gICAgICogICAgICAgICAgIGluY2x1ZGVkVVJJcygpLmNvbnRhaW5zKG5hbWVzcGFjZSkKLSAgICAgKiAgICApID8KLSAgICAgKiAgICAgICAgIWV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKS5jb250YWlucyhuYW1lKSA6Ci0gICAgICogICAgICAgICBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCkuY29udGFpbnMobmFtZSkKLSAgICAgKi8KLSAgICBib29sZWFuIGNvbnRhaW5zKFFOYW1lIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgc2V0IGlzIHRoZSBzZXQgb2YgYWxsIFFOYW1lcy4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzQWxsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBzZXQgaXMgZW1wdHkuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0VtcHR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBwYXJhbWV0ZXIgaXMgYSBzdWJzZXQgb2YgdGhpcyBzZXQuCi0gICAgICovIAotICAgIGJvb2xlYW4gY29udGFpbnNBbGwoUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiBpcyBkaXNqb2ludCBmcm9tIHRoZSBzcGVjaWZpZWQgc2V0LgotICAgICAqLwotICAgIGJvb2xlYW4gaXNEaXNqb2ludChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGludGVyc2VjdGlvbiB3aXRoIGFub3RoZXIgUU5hbWVTZXQuCi0gICAgICovCi0gICAgUU5hbWVTZXQgaW50ZXJzZWN0KFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdW5pb24gd2l0aCBhbm90aGVyIFFOYW1lU2V0LgotICAgICAqLwotICAgIFFOYW1lU2V0IHVuaW9uKFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBpbnZlcnNlIG9mIHRoaXMgUU5hbWVTZXQuIFRoYXQgaXMgdGhlIFFOYW1lU2V0IHdoaWNoCi0gICAgICogY29udGFpbnMgYWxsIHRoZSBRTmFtZXMgbm90IGNvbnRhaW5lZCBpbiB0aGlzIHNldC4gSW4gb3RoZXIgd29yZHMKLSAgICAgKiBmb3Igd2hpY2ggc2V0LmNvbnRhaW5zKG5hbWUpICE9IHNldC5pbnZlcnNlKCkuY29udGFpbnMobmFtZSkgZm9yCi0gICAgICogYWxsIG5hbWVzLgotICAgICAqLwotICAgIFFOYW1lU2V0IGludmVyc2UoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmaW5pdGUgc2V0IG9mIG5hbWVzcGFjZSBVUklzIHRoYXQgYXJlIGFsbW9zdCBjb21wbGV0ZWx5IGV4Y2x1ZGVkIGZyb20KLSAgICAgKiB0aGUgc2V0ICh0aGF0IGlzLCBlYWNoIG5hbWVzcGFjZSBVUkkgdGhhdCBpbmNsdWRlZCBpbiB0aGUgc2V0IHdpdGggd2l0aAotICAgICAqIGEgZmluaXRlIG51bWJlciBvZiBRTmFtZSBleGNlcHRpb25zKS4gTnVsbCBpZiB0aGUgc2V0IG9mIG5hbWVzcGFjZVVSSXMKLSAgICAgKiB0aGF0IGFyZSBhbG1vc3QgY29tcGxldGVseSBpbmNsdWRlZCBpcyBpbmZpbml0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBOdWxsIChtZWFuaW5nIGFsbW9zdCBhbGwgVVJJcyBleGNsdWRlZCkgaWYgaW5jbHVkZWRVUklzKCkgaXMgbm9uLW51bGw7Ci0gICAgICogbm9uLW51bGwgb3RoZXJ3aXNlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzYW1lIHNldCBhcyBpbnZlcnNlKCkuaW5jbHVkZWRVUklzKCkuCi0gICAgICovCi0gICAgU2V0IGV4Y2x1ZGVkVVJJcygpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbml0ZSBzZXQgb2YgbmFtZXNwYWNlIFVSSXMgdGhhdCBhcmUgYWxtb3N0IGNvbXBsZXRlbHkgaW5jbHVkZWQgaW4KLSAgICAgKiB0aGUgc2V0ICh0aGF0IGlzLCBlYWNoIG5hbWVzcGFjZSBVUkkgdGhhdCBpbmNsdWRlZCBpbiB0aGUgc2V0IHdpdGggd2l0aAotICAgICAqIGEgZmluaXRlIG51bWJlciBvZiBRTmFtZSBleGNlcHRpb25zKS4gTnVsbCBpZiB0aGUgc2V0IG9mIG5hbWVzcGFjZVVSSXMKLSAgICAgKiB0aGF0IGFyZSBhbG1vc3QgY29tcGxldGVseSBpbmNsdWRlZCBpcyBpbmZpbml0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBOdWxsIChtZWFuaW5nIGFsbW9zdCBhbGwgVVJJcyBpbmNsdWRlZCkgaWYgZXhjbHVkZWRVUklzKCkgaXMgbm9uLW51bGw7Ci0gICAgICogbm9uLW51bGwgb3RoZXJ3aXNlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzYW1lIGFzIGludmVyc2UuZXhjbHVkZWRVUklzKCkuCi0gICAgICovCi0gICAgU2V0IGluY2x1ZGVkVVJJcygpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbml0ZSBzZXQgb2YgUU5hbWVzIHRoYXQgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIHNldCB3aXRoaW4gbmFtZXNwYWNlcwotICAgICAqIHRoYXQgYXJlIG90aGVyd2lzZSBpbmNsdWRlZC4gU2hvdWxkIG9ubHkgY29udGFpbiBRTmFtZXMgd2l0aGluIG5hbWVzcGFjZQotICAgICAqIHRoYXQgYXJlIHdpdGhpbiB0aGUgc2V0IGluY2x1ZGVkVVJJcygpIChvciBhbnkgVVJJLCBpZiBpbmNsdWRlZFVSSXMoKQotICAgICAqIGlzIG51bGwsIHdoaWNoIG1lYW5zIHRoYXQgYWxsIFVSSXMgYXJlIGFsbW9zdCBjb21wbGV0ZWx5IGluY2x1ZGVkKS4KLSAgICAgKiA8cD4KLSAgICAgKiBOZXZlciBudWxsLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzYW1lIHNldCBhcyBpbnZlcnNlKCkuaW5jbHVkZWRRTmFtZXMoKS4KLSAgICAgKi8KLSAgICBTZXQgZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcygpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbml0ZSBzZXQgb2YgUU5hbWVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBzZXQgd2l0aGluIG5hbWVzcGFjZXMKLSAgICAgKiB0aGF0IGFyZSBvdGhlcndpc2UgZXhjbHVkZWQuIFNob3VsZCBvbmx5IGNvbnRhaW4gUU5hbWVzIHdpdGhpbiBuYW1lc3BhY2UKLSAgICAgKiB0aGF0IGFyZSB3aXRoaW4gdGhlIHNldCBleGNsdWRlZFVSSXMoKSAob3IgYW55IFVSSSwgaWYgZXhjbHVkZWRVUklzKCkKLSAgICAgKiBpcyBudWxsLCB3aGljaCBtZWFucyB0aGF0IGFsbCBVUklzIGFyZSBhbG1vc3QgY29tcGxldGVseSBleGNsdWRlZCkuCi0gICAgICogPHA+Ci0gICAgICogTmV2ZXIgbnVsbC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc2FtZSBhcyBpbnZlcnNlKCkuZXhjbHVkZWRRTmFtZXMoKS4KLSAgICAgKi8KLSAgICBTZXQgaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUF0dHJpYnV0ZUdyb3VwLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQXR0cmlidXRlR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUxMTAwZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQXR0cmlidXRlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gYXR0cmlidXRlIGdyb3VwLgotICogPHA+Ci0gKiBBbiBhdHRyaWJ1dGUgZ3JvdXAgaXMgYSBzeW50YWN0aWMgY29uc3RydWN0LCBub3QgYSBwYXJ0Ci0gKiBvZiB0aGUgbG9naWNhbCBtb2RlbC4gRm9yIGV4YW1wbGUsIHR5cGVzIGRlY2xhcmVkIHdpdGhpbiBhbgotICogYXR0cmlidXRlIGdyb3VwIGJlY29tZSBsb2NhbCB0byB0aGUgdHlwZSB0aGF0IHVzZXMgdGhlIGdyb3VwIC0KLSAqIHRoZXkncmUgbm90IGxvY2FsIHRvIHRoZSBhdHRyaWJ1dGUgZ3JvdXAgaXRzZWxmLiBUaGVyZWZvcmUKLSAqIGluIHRoZSBsb2dpY2FsIG1vZGVsIG9mIGEgc2NoZW1hIHR5cGUgc3lzdGVtLCBhbiBhdHRyaWJ1dGUKLSAqIGdyb3VwIGRvZXNuJ3QgcmVwcmVzZW50IGFueXRoaW5nLiBJdHMgY29udGVudHMgYXJlIG1lcmdlZAotICogaW50byB0aGUgbG9naWNhbCBtb2RlbCBhdCBwYXJzZSB0aW1lLgotICogCi0gKiBAc2VlIFNjaGVtYVR5cGVMb2FkZXIjZmluZEF0dHJpYnV0ZUdyb3VwCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hQXR0cmlidXRlR3JvdXAgZXh0ZW5kcyBTY2hlbWFDb21wb25lbnQKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIFNjaGVtYUNvbXBvbmVudC5BVFRSSUJVVEVfR1JPVVAuCi0gICAgICovCi0gICAgaW50IGdldENvbXBvbmVudFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBtb2RlbCBncm91cC4KLSAgICAgKi8KLSAgICBRTmFtZSBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIGFsbG93IG9uLWRlbWFuZCBsb2FkaW5nIG9mIGF0dHJpYnV0ZSBncm91cHMuCi0gICAgICogCi0gICAgICogQGV4Y2x1ZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIFJlZiBleHRlbmRzIFNjaGVtYUNvbXBvbmVudC5SZWYKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hQXR0cmlidXRlR3JvdXAgYXR0cmlidXRlR3JvdXApCi0gICAgICAgICAgICB7IHN1cGVyKGF0dHJpYnV0ZUdyb3VwKTsgfQotCi0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0sIFN0cmluZyBoYW5kbGUpCi0gICAgICAgICAgICB7IHN1cGVyKHN5c3RlbSwgaGFuZGxlKTsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCi0gICAgICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFX0dST1VQOyB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIFNjaGVtYUF0dHJpYnV0ZUdyb3VwIGdldCgpCi0gICAgICAgICAgICB7IHJldHVybiAoU2NoZW1hQXR0cmlidXRlR3JvdXApZ2V0Q29tcG9uZW50KCk7IH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQXR0cmlidXRlTW9kZWwuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFBdHRyaWJ1dGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjYzMzJkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFBdHRyaWJ1dGVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRoZSBhdHRyaWJ1dGUgc3RydWN0dXJlIGFsbG93ZWQgb24gYSBjb21wbGV4IHR5cGUuCi0gKiAKLSAqIEBzZWUgU2NoZW1hVHlwZSNnZXRBdHRyaWJ1dGVNb2RlbAotICovIAotcHVibGljIGludGVyZmFjZSBTY2hlbWFBdHRyaWJ1dGVNb2RlbAotewotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIGF0dHJpYnV0ZXMgaW4gdGhlIG1vZGVsLgotICAgICAqLwotICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlW10gZ2V0QXR0cmlidXRlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICovCi0gICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKFFOYW1lIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUU5hbWVTZXQgcmVwcmVzZW50aW5nIHRoZSBhdHRyaWJ1dGUgd2lsZGNhcmQgc3BlY2lmaWNhdGlvbi4KLSAgICAgKi8KLSAgICBRTmFtZVNldCBnZXRXaWxkY2FyZFNldCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvY2Vzc2luZyBjb2RlICh7QGxpbmsgI1NUUklDVH0sIHtAbGluayAjTEFYfSwge0BsaW5rICNTS0lQfSkuCi0gICAgICogUmV0dXJucyAwICh7QGxpbmsgI05PTkV9KSBpZiBubyB3aWxkY2FyZCBzcGVjaWZpZWQuCi0gICAgICovCi0gICAgaW50IGdldFdpbGRjYXJkUHJvY2VzcygpOwotCi0gICAgLyoqIFNlZSB7QGxpbmsgI2dldFdpbGRjYXJkUHJvY2Vzc30gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOwotICAgIC8qKiBTdHJpY3Qgd2lsZGNhcmQgcHJvY2Vzc2luZy4gU2VlIHtAbGluayAjZ2V0V2lsZGNhcmRQcm9jZXNzfSAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RSSUNUID0gMTsKLSAgICAvKiogTGF4IHdpbGRjYXJkIHByb2Nlc3NpbmcuIFNlZSB7QGxpbmsgI2dldFdpbGRjYXJkUHJvY2Vzc30gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IExBWCA9IDI7Ci0gICAgLyoqIFNraXAgd2lsZGNhcmQgcHJvY2Vzc2luZy4gU2VlIHtAbGluayAjZ2V0V2lsZGNhcmRQcm9jZXNzfSAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0tJUCA9IDM7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQ29tcG9uZW50LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZGRhM2EuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUNvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGdsb2JhbCBTY2hlbWEgQ29tcG9uZW50LiAgVGhhdCBpcywgYSB0eXBlLCBlbGVtZW50LCBhdHRyaWJ1dGUsCi0gKiBtb2RlbCBncm91cCwgYXR0cmlidXRlIGdyb3VwLCBvciBpZGVudGl0eSBjb25zdHJhaW50LgotICogPHA+Ci0gKiBOb3RlIHRoYXQgbm90IGFsbCB0eXBlcywgZWxlbWVudHMsIGFuZCBhdHRyaWJ1dGVzIGFyZSBnbG9iYWw7IGxvY2FsCi0gKiB0eXBlcywgZWxlbWVudCwgYW5kIGF0dHJpYnV0ZXMgZG8gbm90IGFwcGVhciBpbiB0aGUgZ2xvYmFsIGxvb2t1cCB0YWJsZS4KLSAqIEFsc28gbm90ZSB0aGF0IG90aGVyIGluZm9ybWF0aW9uIGl0ZW1zIHN1Y2ggYXMgcGFydGljbGVzLCBmYWNldHMsIGFuZAotICogc28gb24gYXJlIG5vdCBnbG9iYWxseSBpbmRleGVkLCBzbyBhcmUgbm90IFNjaGVtYUNvbXBvbmVudHMuCi0gKiAKLSAqIEBzZWUgU2NoZW1hVHlwZQotICogQHNlZSBTY2hlbWFHbG9iYWxFbGVtZW50Ci0gKiBAc2VlIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZQotICogQHNlZSBTY2hlbWFBdHRyaWJ1dGVHcm91cAotICogQHNlZSBTY2hlbWFNb2RlbEdyb3VwCi0gKiBAc2VlIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUNvbXBvbmVudAotewotICAgIC8qKiBBIHR5cGUgZGVmaW5pdGlvbi4gIFNlZSB7QGxpbmsgI2dldENvbXBvbmVudFR5cGV9ICovCi0gICAgc3RhdGljIGZpbmFsIGludCBUWVBFID0gMDsKLSAgICAvKiogQW4gZWxlbWVudCBkZWZpbml0aW9uLiAgU2VlIHtAbGluayAjZ2V0Q29tcG9uZW50VHlwZX0gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlQgPSAxOwotICAgIC8qKiBBbiBhdHRyaWJ1dGUgZGVmaW5pdGlvbi4gIFNlZSB7QGxpbmsgI2dldENvbXBvbmVudFR5cGV9ICovCi0gICAgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEUgPSAzOwotICAgIC8qKiBBbiBhdHRyaWJ1dGUgZ3JvdXAgZGVmaW5pdGlvbi4gIFNlZSB7QGxpbmsgI2dldENvbXBvbmVudFR5cGV9ICovCi0gICAgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVfR1JPVVAgPSA0OwotICAgIC8qKiBBbiBpZGVudGl0eSBjb25zdHJhaW50IGRlZmluaXRpb24uICBTZWUge0BsaW5rICNnZXRDb21wb25lbnRUeXBlfSAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSURFTlRJVFlfQ09OU1RSQUlOVCA9IDU7Ci0gICAgLyoqIEEgbW9kZWwgZ3JvdXAgZGVmaW5pdGlvbi4gIFNlZSB7QGxpbmsgI2dldENvbXBvbmVudFR5cGV9ICovCi0gICAgc3RhdGljIGZpbmFsIGludCBNT0RFTF9HUk9VUCA9IDY7Ci0gICAgLyoqIEEgbm90YXRpb24gZGVmaW5pdGlvbi4gIFNlZSB7QGxpbmsgI2dldENvbXBvbmVudFR5cGV9ICovCi0gICAgc3RhdGljIGZpbmFsIGludCBOT1RBVElPTiA9IDc7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIGNvZGUgZm9yIHRoZSBzY2hlbWEgb2JqZWN0LCBlaXRoZXIge0BsaW5rICNUWVBFfSwKLSAgICAgKiB7QGxpbmsgI0VMRU1FTlR9LCB7QGxpbmsgI0FUVFJJQlVURX0sIHtAbGluayAjQVRUUklCVVRFX0dST1VQfSwKLSAgICAgKiB7QGxpbmsgI01PREVMX0dST1VQfSwge0BsaW5rICNJREVOVElUWV9DT05TVFJBSU5UfSwgb3Ige0BsaW5rICNOT1RBVElPTn0uCi0gICAgICovCi0gICAgaW50IGdldENvbXBvbmVudFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGVzeXN0ZW0gd2l0aGluIHdoaWNoIHRoaXMgY29tcG9uZW50IGRlZmluaXRpb24gcmVzaWRlcwotICAgICAqLwotICAgIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0VHlwZVN5c3RlbSgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIHNjaGVtYSBjb21wb25lbnQKLSAgICAgKi8KLSAgICBRTmFtZSBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGxhenkgcmVmZXJlbmNlIHRvIGEgY29tcG9uZW50LiBVc2VkIGJ5IFNjaGVtYVR5cGVMb2FkZXJzIHRvCi0gICAgICogYXZvaWQgbG9hZGluZyBjb21wb25lbnRzIHVudGlsIHRoZXkgYXJlIGFjdHVhbGx5IG5lZWRlZC4KLSAgICAgKiAKLSAgICAgKiBAZXhjbHVkZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUmVmCi0gICAgewotICAgICAgICBwcm90ZWN0ZWQgUmVmKFNjaGVtYUNvbXBvbmVudCBzY2hlbWFDb21wb25lbnQpCi0gICAgICAgICAgICB7IF9zY2hlbWFDb21wb25lbnQgPSBzY2hlbWFDb21wb25lbnQ7IH0KLQotICAgICAgICBwcm90ZWN0ZWQgUmVmKFNjaGVtYVR5cGVTeXN0ZW0gc2NoZW1hVHlwZVN5c3RlbSwgU3RyaW5nIGhhbmRsZSkKLSAgICAgICAgICAgIHsgYXNzZXJ0KGhhbmRsZSAhPSBudWxsKTsgX3NjaGVtYVR5cGVTeXN0ZW0gPSBzY2hlbWFUeXBlU3lzdGVtOyBfaGFuZGxlID0gaGFuZGxlOyB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTY2hlbWFDb21wb25lbnQgX3NjaGVtYUNvbXBvbmVudDsKLSAgICAgICAgcHJpdmF0ZSBTY2hlbWFUeXBlU3lzdGVtIF9zY2hlbWFUeXBlU3lzdGVtOwotICAgICAgICBwdWJsaWMgU3RyaW5nIF9oYW5kbGU7Ci0KLSAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRDb21wb25lbnRUeXBlKCk7Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0VHlwZVN5c3RlbSgpCi0gICAgICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZVN5c3RlbTsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTY2hlbWFDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9zY2hlbWFDb21wb25lbnQgPT0gbnVsbCAmJiBfaGFuZGxlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgX3NjaGVtYUNvbXBvbmVudCA9IF9zY2hlbWFUeXBlU3lzdGVtLnJlc29sdmVIYW5kbGUoX2hhbmRsZSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBfc2NoZW1hQ29tcG9uZW50OwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFVzZWQgZm9yIG9uLWRlbWFuZCBsb2FkaW5nIG9mIHNjaGVtYSBjb21wb25lbnRzLgotICAgICAqLyAKLSAgICBwdWJsaWMgUmVmIGdldENvbXBvbmVudFJlZigpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUZpZWxkLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNmODUyYy4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBlbGVtZW50IG9yIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4KLSAqIAotICogQHNlZSBTY2hlbWFUeXBlI2dldENvbnRhaW5lckZpZWxkCi0gKiBAc2VlIFNjaGVtYUxvY2FsRWxlbWVudAotICogQHNlZSBTY2hlbWFMb2NhbEF0dHJpYnV0ZQotICovIAotcHVibGljIGludGVyZmFjZSBTY2hlbWFGaWVsZAotewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZvcm0tdW5xdWFsaWZpZWQtb3ItcXVhbGlmaWVkIG5hbWUuCi0gICAgICovCi0gICAgUU5hbWUgZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIHVzZSBpcyBhbiBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBib29sZWFuIGlzQXR0cmlidXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIG5pbGxhYmxlOyBhbHdheXMgZmFsc2UgZm9yIGF0dHJpYnV0ZXMuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc05pbGxhYmxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgdXNlLgotICAgICAqLwotICAgIFNjaGVtYVR5cGUgZ2V0VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWluT2NjdXJzIHZhbHVlIGZvciB0aGlzIHBhcnRpY2xlLgotICAgICAqIElmIGl0IGlzIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseSwgdGhpcyBkZWZhdWx0cyB0byBCaWdJbnRlZ2VyLk9ORS4KLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyIGdldE1pbk9jY3VycygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWF4T2NjdXJzIHZhbHVlIGZvciB0aGlzIHBhcnRpY2xlLCBvciBudWxsIGlmIGl0Ci0gICAgICogaXMgdW5ib3VuZGVkLgotICAgICAqIElmIGl0IGlzIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseSwgdGhpcyBkZWZhdWx0cyB0byBCaWdJbnRlZ2VyLk9ORS4KLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyIGdldE1heE9jY3VycygpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgYXMgcGxhaW4gdGV4dC4gU2VlIHtAbGluayAjaXNEZWZhdWx0fSBhbmQge0BsaW5rICNpc0ZpeGVkfS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGVmYXVsdFRleHQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBhcyBhIHN0cm9uZ2x5LXR5cGVkIHZhbHVlLiAgU2VlIHtAbGluayAjaXNEZWZhdWx0fSBhbmQge0BsaW5rICNpc0ZpeGVkfS4KLSAgICAgKi8KLSAgICBYbWxBbnlTaW1wbGVUeXBlIGdldERlZmF1bHRWYWx1ZSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiBhIGRlZmF1bHQgaXMgc3VwcGxpZWQuIElmIHtAbGluayAjaXNGaXhlZH0sIHRoZW4gaXNEZWZhdWx0IGlzIGFsd2F5cyB0cnVlLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNEZWZhdWx0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBmaXhlZC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzRml4ZWQoKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFHbG9iYWxBdHRyaWJ1dGUuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFHbG9iYWxBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk1NjgwZi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hR2xvYmFsQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGdsb2JhbCBhdHRyaWJ1dGUgZGVmaW5pdGlvbgotICogCi0gKiBAc2VlIFNjaGVtYVR5cGVMb2FkZXIjZmluZEF0dHJpYnV0ZQotICovIAotcHVibGljIGludGVyZmFjZSBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgZXh0ZW5kcyBTY2hlbWFMb2NhbEF0dHJpYnV0ZSwgU2NoZW1hQ29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSAueHNkIGZpbGUgd2l0aGluIHdoaWNoIHRoaXMgYXR0cmlidXRlIHdhcyBkZWZpbmVkCi0gICAgICovIAotICAgIFN0cmluZyBnZXRTb3VyY2VOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIGFsbG93IG9uLWRlbWFuZCBsb2FkaW5nIG9mIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEBleGNsdWRlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBjbGFzcyBSZWYgZXh0ZW5kcyBTY2hlbWFDb21wb25lbnQuUmVmCi0gICAgewotICAgICAgICBwdWJsaWMgUmVmKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBlbGVtZW50KQotICAgICAgICAgICAgeyBzdXBlcihlbGVtZW50KTsgfQotCi0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0sIFN0cmluZyBoYW5kbGUpCi0gICAgICAgICAgICB7IHN1cGVyKHN5c3RlbSwgaGFuZGxlKTsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCi0gICAgICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFOyB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBnZXQoKQotICAgICAgICAgICAgeyByZXR1cm4gKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSlnZXRDb21wb25lbnQoKTsgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJ1bnMgYSBTY2hlbWFHbG9iYWxFbGVtZW50LlJlZiBwb2ludGluZyB0byB0aGlzIGVsZW1lbnQgaXRzZWxmLgotICAgICAqLwotICAgIHB1YmxpYyBSZWYgZ2V0UmVmKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFHbG9iYWxFbGVtZW50LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hR2xvYmFsRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzZiMzQ1Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFHbG9iYWxFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgZ2xvYmFsIGVsZW1lbnQgZGVmaW5pdGlvbi4KLSAqIAotICogQHNlZSBTY2hlbWFUeXBlTG9hZGVyI2ZpbmRFbGVtZW50Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hR2xvYmFsRWxlbWVudCBleHRlbmRzIFNjaGVtYUxvY2FsRWxlbWVudCwgU2NoZW1hQ29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSAueHNkIGZpbGUgd2l0aGluIHdoaWNoIHRoaXMgYXR0cmlidXRlIHdhcyBkZWZpbmVkCi0gICAgICovIAotICAgIFN0cmluZyBnZXRTb3VyY2VOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgb2YgUU5hbWVzIGZvciBlbGVtZW50cyB0aGF0IGFyZSB0aGUgbWVtYmVycyBvZiB0aGUKLSAgICAgKiBzdWJzdGl0dXRpb24gZ3JvdXAgZm9yIHdoaWNoIHRoaXMgZWxlbWVudCBpcyB0aGUgaGVhZCwKLSAgICAgKiBub3QgaW5jbHVkaW5nIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBRTmFtZVtdIHN1YnN0aXR1dGlvbkdyb3VwTWVtYmVycygpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGVsZW1lbnQgdGhhdCBpcyB0aGUgaGVhZCBvZiB0aGlzIGVsZW1lbnQncyBzdWJzdGl0dXRpb24KLSAgICAgKiBncm91cCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGlzIG5vdCBhIG1lbWJlcgotICAgICAqIG9mIGEgc3Vic3RpdHV0aW9uIGdyb3VwLgotICAgICAqLwotICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQgc3Vic3RpdHV0aW9uR3JvdXAoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdXNpbmcgdGhpcyBlbGVtZW50IGFzIHRoZSBoZWFkIG9mIGEgc3Vic3RpdHV0aW9uCi0gICAgICogZ3JvdXAgZm9yIGEgc3Vic3RpdHV0aW9uIHZpYSB0eXBlIGV4dGVuc2lvbiBpcyBwcm9oaWJpdGVkLgotICAgICAqIElmIGJvdGggZmluYWxFeHRlbnNpb24gYW5kIGZpbmFsUmVzdHJpY3Rpb24gYXJlIHRydWUsIHRoaXMKLSAgICAgKiBlbGVtZW50IGNhbm5vdCBiZSBoZWFkIG9mIGEgc3Vic3RpdHV0aW9uIGdyb3VwLgotICAgICAqIFNlbnNpYmxlIG9ubHkgZm9yIGdsb2JhbCBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5hbEV4dGVuc2lvbigpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB1c2luZyB0aGlzIGVsZW1lbnQgYXMgdGhlIGhlYWQgb2YgYSBzdWJzdGl0dXRpb24KLSAgICAgKiBncm91cCBmb3IgYSBzdWJzdGl0dXRpb24gdmlhIHR5cGUgcmVzdHJpY3Rpb24gaXMgcHJvaGliaXRlZC4KLSAgICAgKiBJZiBib3RoIGZpbmFsRXh0ZW5zaW9uIGFuZCBmaW5hbFJlc3RyaWN0aW9uIGFyZSB0cnVlLCB0aGlzCi0gICAgICogZWxlbWVudCBjYW5ub3QgYmUgaGVhZCBvZiBhIHN1YnN0aXR1dGlvbiBncm91cC4KLSAgICAgKiBTZW5zaWJsZSBvbmx5IGZvciBnbG9iYWwgZWxlbWVudHMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZmluYWxSZXN0cmljdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBhbGxvdyBvbi1kZW1hbmQgbG9hZGluZyBvZiBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAZXhjbHVkZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgUmVmIGV4dGVuZHMgU2NoZW1hQ29tcG9uZW50LlJlZgotICAgIHsKLSAgICAgICAgcHVibGljIFJlZihTY2hlbWFHbG9iYWxFbGVtZW50IGVsZW1lbnQpCi0gICAgICAgICAgICB7IHN1cGVyKGVsZW1lbnQpOyB9Ci0KLSAgICAgICAgcHVibGljIFJlZihTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSwgU3RyaW5nIGhhbmRsZSkKLSAgICAgICAgICAgIHsgc3VwZXIoc3lzdGVtLCBoYW5kbGUpOyB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIGludCBnZXRDb21wb25lbnRUeXBlKCkKLSAgICAgICAgICAgIHsgcmV0dXJuIFNjaGVtYUNvbXBvbmVudC5FTEVNRU5UOyB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIFNjaGVtYUdsb2JhbEVsZW1lbnQgZ2V0KCkKLSAgICAgICAgICAgIHsgcmV0dXJuIChTY2hlbWFHbG9iYWxFbGVtZW50KWdldENvbXBvbmVudCgpOyB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cnVucyBhIFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmIHBvaW50aW5nIHRvIHRoaXMgZWxlbWVudCBpdHNlbGYuCi0gICAgICovCi0gICAgcHVibGljIFJlZiBnZXRSZWYoKTsKLQotCi19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljM2QwNDYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUlkZW50aXR5Q29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIGlkZW50aXR5IGNvbnN0cmFpbnQgZGVmaW5pdGlvbi4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGV4dGVuZHMgU2NoZW1hQ29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBzZWxlY3RvciB4cGF0aCBhcyBhIHN0cmluZy4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0U2VsZWN0b3IoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIGNvbXBpbGVkIHhwYXRoIG9iamVjdCBmb3IgdGhlIHNlbGVjdG9yLgotICAgICAqLwotICAgIE9iamVjdCBnZXRTZWxlY3RvclBhdGgoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiAoYSBjb3B5IG9mKSB0aGUgeHBhdGhzIGZvciBhbGwgdGhlIGZpZWxkcy4KLSAgICAgKi8KLSAgICBTdHJpbmdbXSBnZXRGaWVsZHMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIGNvbXBpbGVkIHhwYXRoIG9iamVjdCBmb3IgdGhlIGZpZWxkLgotICAgICAqLwotICAgIE9iamVjdCBnZXRGaWVsZFBhdGgoaW50IGluZGV4KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIHJlYWQtb25seSBjb3B5IG9mIHRoZSBuYW1lc3BhY2UgbWFwLiBUaGlzIGlzIHRoZSAKLSAgICAgKiBzZXQgb2YgcHJlZml4IHRvIFVSSSBtYXBwaW5ncyB0aGF0IHdlcmUgaW4gc2NvcGUgaW4gdGhlCi0gICAgICogc2NoZW1hIGF0IHRoZSBwb2ludCBhdCB3aGljaCB0aGlzIGNvbnN0cmFpbnQgd2FzIGRlY2xhcmVkCi0gICAgICovCi0gICAgTWFwIGdldE5TTWFwKCk7Ci0KLSAgICAvKiogQSA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2RlY2xhcmUta2V5Ij54czprZXk8L2E+IGNvbnN0cmFpbnQuICBTZWUge0BsaW5rICNnZXRDb25zdHJhaW50Q2F0ZWdvcnl9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENDX0tFWSA9IDE7Ci0gICAgLyoqIEEgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNkZWNsYXJlLWtleSI+eHM6a2V5UmVmPC9hPiBjb25zdHJhaW50LiAgU2VlIHtAbGluayAjZ2V0Q29uc3RyYWludENhdGVnb3J5fS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQ19LRVlSRUYgPSAyOwotICAgIC8qKiBBIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZGVjbGFyZS1rZXkiPnhzOnVuaXF1ZTwvYT4gY29uc3RyYWludC4gIFNlZSB7QGxpbmsgI2dldENvbnN0cmFpbnRDYXRlZ29yeX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0NfVU5JUVVFID0gMzsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY29uc3RyYWludCBjYXRlZ29yeS4gRWl0aGVyIHtAbGluayAjQ0NfS0VZfSwge0BsaW5rICNDQ19LRVlSRUZ9LAotICAgICAqIG9yIHtAbGluayAjQ0NfVU5JUVVFfS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0Q29uc3RyYWludENhdGVnb3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgdGhhdCBhIGtleSByZWYgcmVmZXJzIHRvLiBPbmx5IHZhbGlkIGZvcgotICAgICAqIGtleXJlZnMuCi0gICAgICovCi0gICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGdldFJlZmVyZW5jZWRLZXkoKTsKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gYWxsb3cgb24tZGVtYW5kIGxvYWRpbmcgb2YgaWRlbnRpdHkgY29uc3RyYWludHMuCi0gICAgICogCi0gICAgICogQGV4Y2x1ZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJlZiBleHRlbmRzIFNjaGVtYUNvbXBvbmVudC5SZWYKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGlkYykKLSAgICAgICAgICAgIHsgc3VwZXIoaWRjKTsgfQotCi0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0sIFN0cmluZyBoYW5kbGUpCi0gICAgICAgICAgICB7IHN1cGVyKHN5c3RlbSwgaGFuZGxlKTsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCi0gICAgICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuSURFTlRJVFlfQ09OU1RSQUlOVDsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgZ2V0KCkKLSAgICAgICAgICAgIHsgcmV0dXJuIChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQpZ2V0Q29tcG9uZW50KCk7IH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hTG9jYWxBdHRyaWJ1dGUuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFMb2NhbEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWEyOTA4Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFMb2NhbEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBsb2NhbCBvciBnbG9iYWwgYXR0cmlidXRlIGRlZmluaXRpb24uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUxvY2FsQXR0cmlidXRlIGV4dGVuZHMgU2NoZW1hRmllbGQKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHtAbGluayAjUFJPSElCSVRFRH0sIHtAbGluayAjT1BUSU9OQUx9LCBvciB7QGxpbmsgI1JFUVVJUkVEfS4KLSAgICAgKiAoQWN0dWFsbHksIG5ldmVyIHJldHVybnMgUFJPSElCSVRFRCBiZWNhdXNlIHRoZSBzY2hlbWEgc3BlY2lmaWNhaW9uCi0gICAgICogc3RhdGVzIHRoYXQgYSBwcm9oaWJpdGVkIGF0dHJpYnV0ZSBpcyBlcXVpdmFsZW50IHRvIG5vIGF0dHJpYnV0ZQotICAgICAqIGF0IGFsbCwgc28gYSBwcm9oaWJpdGVkIGF0dHJpYnV0ZSB3aWxsIG5ldmVyIGJlIHByZXNlbnQgaW4gdGhlIGNvbXBpbGVkCi0gICAgICogbW9kZWwuKQotICAgICAqLwotICAgIGludCBnZXRVc2UoKTsKLQotICAgIC8qKiBBIHByb2hpYml0ZWQgYXR0cmlidXRlLiAgU2VlIHtAbGluayAjZ2V0VXNlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFBST0hJQklURUQgPSAxOwotICAgIC8qKiBBbiBvcHRpb25hbCBhdHRyaWJ1dGUuICBTZWUge0BsaW5rICNnZXRVc2V9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OQUwgPSAyOwotICAgIC8qKiBBIHJlcXVpcmVkIGF0dHJpYnV0ZS4gIFNlZSB7QGxpbmsgI2dldFVzZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBSRVFVSVJFRCA9IDM7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hTG9jYWxFbGVtZW50LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hTG9jYWxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MDY4ZGMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUxvY2FsRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBsb2NhbCBvciBnbG9iYWwgZWxlbWVudCBkZWZpbml0aW9uLgotICovIAotcHVibGljIGludGVyZmFjZSBTY2hlbWFMb2NhbEVsZW1lbnQgZXh0ZW5kcyBTY2hlbWFGaWVsZAotewotICAgIC8qKgotICAgICAqIFRydWUgaWYgZXh0ZW5zaW9uIGlzIGJsb2NrZWQuCi0gICAgICovCi0gICAgYm9vbGVhbiBibG9ja0V4dGVuc2lvbigpOwotICAgIC8qKgotICAgICAqIFRydWUgaWYgcmVzdHJpY3Rpb24gaXMgYmxvY2tlZC4KLSAgICAgKi8KLSAgICBib29sZWFuIGJsb2NrUmVzdHJpY3Rpb24oKTsKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIGVsZW1lbnQgc3Vic3RpdHV0aW9uIGlzIGJsb2NrZWQuCi0gICAgICovCi0gICAgYm9vbGVhbiBibG9ja1N1YnN0aXR1dGlvbigpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGVsZW1lbnQgaXMgcHJvaGliaXRlZCBpbiBjb250ZW50LiBPbmx5Ci0gICAgICogc2Vuc2libGUgaWYgdGhpcyBpcyB0aGUgaGVhZCBvZiBhIHN1YnN0aXR1dGlvbiBncm91cDsKLSAgICAgKiB0aGVuIG9ubHkgc3Vic3RpdHV0aW9uIGdyb3VwIG1lbWJlcnMgY2FuIGFwcGVhci48UD4KLSAgICAgKiAKLSAgICAgKiBBbHRob3VnaCBsb2NhbCBlbGVtZW50cyBjYW5ub3QgYmUgYWJzdHJhY3QsIGlmIGFuIGVsZW1lbnQgCi0gICAgICogdXNlIGlzIGEgcmVmIHRvIGEgZ2xvYmFsIGVsZW1lbnQsIHRoZW4gdGhlIGZsYWcgZnJvbSB0aGUgCi0gICAgICogZ2xvYmFsIGVsZW1lbnQgaXMgY29waWVkIGluIHRvIHRoZSBsb2NhbCBlbGVtZW50IHdoZXJlIHRoZSAKLSAgICAgKiB1c2Ugb2NjdXJzLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNBYnN0cmFjdCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgdGhlIEtleSwgS2V5UmVmLCBhbmQgVW5pcXVlIGNvbnN0cmFpbnRzCi0gICAgICogb24gdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtdIGdldElkZW50aXR5Q29uc3RyYWludHMoKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFNb2RlbEdyb3VwLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hTW9kZWxHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2QyZDc1Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFNb2RlbEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgbW9kZWwgZ3JvdXAuCi0gKiA8cD4KLSAqIEEgbW9kZWwgZ3JvdXAgaXMgYSBzeW50YWN0aWMgY29uc3RydWN0LCBub3QgYSBwYXJ0IG9mCi0gKiB0aGUgbG9naWNhbCBtb2RlbC4gRm9yIGV4YW1wbGUsIHR5cGVzIGRlY2xhcmVkIHdpdGhpbiBhCi0gKiBtb2RlbCBncm91cCBiZWNvbWUgbG9jYWwgdG8gdGhlIHR5cGUgdGhhdCB1c2VzIHRoZSBncm91cCAtCi0gKiB0aGV5J3JlIG5vdCBsb2NhbCB0byB0aGUgbW9kZWwgZ3JvdXAgaXRzZWxmLiBUaGVyZWZvcmUgaW4KLSAqIHRoZSBsb2dpY2FsIG1vZGVsIG9mIGEgc2NoZW1hIHR5cGUgc3lzdGVtLCBhIG1vZGVsIGdyb3VwCi0gKiBkb2Vzbid0IHJlcHJlc2VudCBhbnl0aGluZy4gSXRzIGNvbnRlbnRzIGFyZSBtZXJnZWQgaW50bwotICogdGhlIGxvZ2ljYWwgbW9kZWwgYXQgcGFyc2UgdGltZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBTY2hlbWFNb2RlbEdyb3VwIGV4dGVuZHMgU2NoZW1hQ29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyBTY2hlbWFDb21wb25lbnQuR1JPVVAuCi0gICAgICovCi0gICAgaW50IGdldENvbXBvbmVudFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBtb2RlbCBncm91cC4KLSAgICAgKi8KLSAgICBRTmFtZSBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIGFsbG93IG9uLWRlbWFuZCBsb2FkaW5nIG9mIG1vZGVsIGdyb3Vwcy4KLSAgICAgKiAKLSAgICAgKiBAZXhjbHVkZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgUmVmIGV4dGVuZHMgU2NoZW1hQ29tcG9uZW50LlJlZgotICAgIHsKLSAgICAgICAgcHVibGljIFJlZihTY2hlbWFNb2RlbEdyb3VwIG1vZGVsR3JvdXApCi0gICAgICAgICAgICB7IHN1cGVyKG1vZGVsR3JvdXApOyB9Ci0KLSAgICAgICAgcHVibGljIFJlZihTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSwgU3RyaW5nIGhhbmRsZSkKLSAgICAgICAgICAgIHsgc3VwZXIoc3lzdGVtLCBoYW5kbGUpOyB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIGludCBnZXRDb21wb25lbnRUeXBlKCkKLSAgICAgICAgICAgIHsgcmV0dXJuIFNjaGVtYUNvbXBvbmVudC5NT0RFTF9HUk9VUDsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTY2hlbWFNb2RlbEdyb3VwIGdldCgpCi0gICAgICAgICAgICB7IHJldHVybiAoU2NoZW1hTW9kZWxHcm91cClnZXRDb21wb25lbnQoKTsgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFQYXJ0aWNsZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVBhcnRpY2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYTg1YTAuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVBhcnRpY2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBTY2hlbWEgcGFydGljbGUgZGVmaW5pdGlvbi4KLSAqIDxwPgotICogVGhlIGNvbnRlbnQgbW9kZWwgb2YgYSBjb21wbGV4IHR5cGUgaXMgYSB0cmVlIG9mIHBhcnRpY2xlcy4gIEVhY2gKLSAqIHBhcnRpY2xlIGlzIGVpdGhlciBhbiB7QGxpbmsgI0FMTH0sIHtAbGluayAjQ0hPSUNFfSwge0BsaW5rICNTRVFVRU5DRX0sCi0gKiB7QGxpbmsgI0VMRU1FTlR9LCBvciB7QGxpbmsgI1dJTERDQVJEfS4KLSAqIEFsbCwgY2hvaWNlIGFuZCBzZXF1ZW5jZSBwYXJ0aWNsZXMgYXJlIGdyb3VwcyB0aGF0IGNhbiBoYXZlIGNoaWxkCi0gKiBwYXJ0aWNsZXM7IGVsZW1lbnRzIGFuZCB3aWxkY2FyZHMgYXJlIGFsd2F5cyBsZWF2ZXMgb2YgdGhlIHBhcnRpY2xlIHRyZWUuCi0gKiA8cD4KLSAqIFRoZSB0cmVlIG9mIHBhcnRpY2xlcyBhdmFpbGFibGUgb24gYSBzY2hlbWEgdHlwZSBpcyBtaW5pbWl6ZWQsIHRoYXQKLSAqIGlzLCBpdCBhbHJlYWR5IGhhcyByZW1vdmVkICJwb2ludGxlc3MiIHBhcnRpY2xlcyBzdWNoIGFzIGVtcHR5Ci0gKiBzZXF1ZW5jZXMsIG5vbnJlcGVhdGluZyBzZXF1ZW5jZXMgd2l0aCBvbmx5IG9uZSBpdGVtLCBhbmQgc28gb24uCi0gKiAoPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNjb3MtcGFydGljbGUtcmVzdHJpY3QiPlBvaW50bGVzcyBwYXJ0aWNsZXM8L2E+Ci0gKiBhcmUgZGVmaW5lZCBwcmVjaXNlbHkgaW4gdGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbi4pCi0gKiAKLSAqIEBzZWUgU2NoZW1hVHlwZSNnZXRDb250ZW50TW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBTY2hlbWFQYXJ0aWNsZQotewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhcnRpY2xlIHR5cGUgKHtAbGluayAjQUxMfSwge0BsaW5rICNDSE9JQ0V9LAotICAgICAqIHtAbGluayAjU0VRVUVOQ0V9LCB7QGxpbmsgI0VMRU1FTlR9LCBvciB7QGxpbmsgI1dJTERDQVJEfSkuIAotICAgICAqLyAKLSAgICBpbnQgZ2V0UGFydGljbGVUeXBlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQW4gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNkZWNsYXJlLWNvbnRlbnRNb2RlbCI+eHM6YWxsPC9hPiBncm91cC4KLSAgICAgKiBTZWUge0BsaW5rICNnZXRQYXJ0aWNsZVR5cGV9LgotICAgICAqLyAKLSAgICBzdGF0aWMgZmluYWwgaW50IEFMTCA9IDE7Ci0gICAgLyoqCi0gICAgICogQSA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2RlY2xhcmUtY29udGVudE1vZGVsIj54czpjaG9pY2U8L2E+IGdyb3VwLgotICAgICAqIFNlZSB7QGxpbmsgI2dldFBhcnRpY2xlVHlwZX0uCi0gICAgICovIAotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFID0gMjsKLSAgICAvKioKLSAgICAgKiBBIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZGVjbGFyZS1jb250ZW50TW9kZWwiPnhzOnNlcXVlbmNlPC9hPiBncm91cC4KLSAgICAgKiBTZWUge0BsaW5rICNnZXRQYXJ0aWNsZVR5cGV9LgotICAgICAqLyAKLSAgICBzdGF0aWMgZmluYWwgaW50IFNFUVVFTkNFID0gMzsKLSAgICAvKioKLSAgICAgKiBBbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2RlY2xhcmUtZWxlbWVudCI+eHM6ZWxlbWVudDwvYT4gcGFydGljbGUuCi0gICAgICogVGhpcyBjb2RlIG1lYW5zIHRoZSBwYXJ0aWNsZSBjYW4gYmUgY29lcmNlZCB0byB7QGxpbmsgU2NoZW1hTG9jYWxFbGVtZW50fS4KLSAgICAgKiBTZWUge0BsaW5rICNnZXRQYXJ0aWNsZVR5cGV9LgotICAgICAqLyAKLSAgICBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlQgPSA0OwotICAgIC8qKgotICAgICAqIEFuIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZGVjbGFyZS1vcGVubmVzcyI+eHM6YW55PC9hPiBwYXJ0aWNsZSwKLSAgICAgKiBhbHNvIGtub3duIGFzIGFuIGVsZW1lbnQgd2lsZGNhcmQuCi0gICAgICogU2VlIHtAbGluayAjZ2V0UGFydGljbGVUeXBlfS4KLSAgICAgKi8gCi0gICAgc3RhdGljIGZpbmFsIGludCBXSUxEQ0FSRCA9IDU7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtaW5PY2N1cnMgdmFsdWUgZm9yIHRoaXMgcGFydGljbGUuCi0gICAgICogSWYgaXQncyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHksIHRoaXMgcmV0dXJucyBCaWdJbnRlZ2VyLk9ORS4KLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyIGdldE1pbk9jY3VycygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWF4T2NjdXJzIHZhbHVlIGZvciB0aGlzIHBhcnRpY2xlLCBvciBudWxsIGlmIGl0Ci0gICAgICogaXMgdW5ib3VuZGVkLgotICAgICAqIElmIGl0J3Mgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5LCB0aGlzIHJldHVybnMgQmlnSW50ZWdlci5PTkUuCi0gICAgICovCi0gICAgQmlnSW50ZWdlciBnZXRNYXhPY2N1cnMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1pbk9jY3VycyB2YWx1ZSwgcGVnZ2VkIHRvIGEgMzItYml0IGludCBmb3IKLSAgICAgKiBjb252ZW5pZW5jZSBvZiBhIHZhbGlkYXRpbmcgc3RhdGUgbWFjaGluZSB0aGF0IGRvZXNuJ3QgY291bnQKLSAgICAgKiBoaWdoZXIgdGhhbiBNQVhfSU5UIGFueXdheS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEludE1pbk9jY3VycygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWF4T2NjdXJzIHZhbHVlLCBwZWdnZWQgdG8gYSAzMi1iaXQgaW50IGZvcgotICAgICAqIGNvbnZlbmllbmNlIG9mIGEgdmFsaWRhdGluZyBzdGF0ZSBtYWNoaW5lIHRoYXQgZG9lc24ndCBjb3VudAotICAgICAqIGhpZ2hlciB0aGFuIE1BWF9JTlQgYW55d2F5LiBVbmJvdW5kZWQgaXMgZ2l2ZW4gYXMgTUFYX0lOVC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEludE1heE9jY3VycygpOwotCi0KLSAgICAvKioKLSAgICAgKiBPbmUgaWYgbWluT2NjdXJzID09IG1heE9jY3VycyA9PSAxLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNTaW5nbGV0b24oKTsKLQotICAgIC8qKgotICAgICAqIEFwcGxpZXMgdG8gc2VxdWVuY2UsIGNob2ljZSwgYW5kIGFsbCBwYXJ0aWNsZXMgb25seTogcmV0dXJucyBhbiBhcnJheQotICAgICAqIG9mIGFsbCB0aGUgcGFydGljbGUgY2hpbGRyZW4gaW4gb3JkZXIuCi0gICAgICovCi0gICAgU2NoZW1hUGFydGljbGVbXSBnZXRQYXJ0aWNsZUNoaWxkcmVuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBbm90aGVyIHdheSB0byBhY2Nlc3MgdGhlIHBhcnRpY2xlIGNoaWxkcmVuLgotICAgICAqLwotICAgIFNjaGVtYVBhcnRpY2xlIGdldFBhcnRpY2xlQ2hpbGQoaW50IGkpOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICBpbnQgY291bnRPZlBhcnRpY2xlQ2hpbGQoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBwYXJ0aWNsZSBjYW4gc3RhcnQgd2l0aCB0aGUgZ2l2ZW4gZWxlbWVudAotICAgICAqICh0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzdHJ1Y3R1cmUgb2YgYWxsIGNoaWxkIHBhcnRpY2xlcwotICAgICAqIG9mIGNvdXJzZSkuCi0gICAgICovCi0gICAgYm9vbGVhbiBjYW5TdGFydFdpdGhFbGVtZW50KFFOYW1lIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgUU5hbWVTZXQgb2YgZWxlbWVudCBuYW1lcyB0aGF0IGNhbiBiZQotICAgICAqIGFjY2VwdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBwYXJ0aWNsZS4KLSAgICAgKi8KLSAgICBRTmFtZVNldCBhY2NlcHRlZFN0YXJ0TmFtZXMoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBwYXJ0aWNsZSBjYW4gYmUgc2tpcHBlZCAodGFraW5nIGludG8gYWNjb3VudAotICAgICAqIGJvdGggdGhlIG1pbk9jdXJzIGFzIHdlbGwgYXMgdGhlIHN0cnVjdHVyZSBvZiBhbGwgdGhlCi0gICAgICogY2hpbGQgcGFydGljbGVzKQotICAgICAqLwotICAgIGJvb2xlYW4gaXNTa2lwcGFibGUoKTsKLQotICAgIC8qKgotICAgICAqIEZvciB3aWxkY2FyZHMsIHJldHVybnMgYSBRTmFtZVNldCByZXByZXNlbnRpbmcgdGhlIHdpbGRjYXJkLgotICAgICAqLwotICAgIFFOYW1lU2V0IGdldFdpbGRjYXJkU2V0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3Igd2lsZGNhcmRzLCByZXR1cm5zIHRoZSBwcm9jZXNzaW5nIGNvZGUgKHtAbGluayAjU1RSSUNUfSwge0BsaW5rICNMQVh9LCB7QGxpbmsgI1NLSVB9KS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0V2lsZGNhcmRQcm9jZXNzKCk7Ci0KLSAgICAvKiogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNXaWxkY2FyZF9kZXRhaWxzIj5TdHJpY3Qgd2lsZGNhcmQ8L2E+IHByb2Nlc3NpbmcuIFNlZSB7QGxpbmsgI2dldFdpbGRjYXJkUHJvY2Vzc30gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFNUUklDVCA9IDE7Ci0gICAgLyoqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jV2lsZGNhcmRfZGV0YWlscyI+TGF4IHdpbGRjYXJkPC9hPiBwcm9jZXNzaW5nLiBTZWUge0BsaW5rICNnZXRXaWxkY2FyZFByb2Nlc3N9ICovCi0gICAgc3RhdGljIGZpbmFsIGludCBMQVggPSAyOwotICAgIC8qKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI1dpbGRjYXJkX2RldGFpbHMiPlNraXAgd2lsZGNhcmQ8L2E+IHByb2Nlc3NpbmcuIFNlZSB7QGxpbmsgI2dldFdpbGRjYXJkUHJvY2Vzc30gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFNLSVAgPSAzOwotCi0gICAgLyoqCi0gICAgICogRm9yIGVsZW1lbnRzIG9ubHk6IHRoZSBRTmFtZSBmb3IgdGhlIGVsZW1lbnQgdXNlLgotICAgICAqIE1heSBiZSB1bnF1YWxpZmllZCB2ZXJzaW9uIG9mIHJlZmVyZW5jZWQgZWxlbWVudCdzIG5hbWUuCi0gICAgICovCi0gICAgUU5hbWUgZ2V0TmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIEZvciBlbGVtZW50cyBvbmx5OiByZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50LgotICAgICAqLwotICAgIFNjaGVtYVR5cGUgZ2V0VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogRm9yIGVsZW1lbnRzIG9ubHk6IHRydWUgaWYgbmlsbGFibGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc05pbGxhYmxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgZWxlbWVudHMgb25seTogcmV0dXJucyB0aGUgZGVmYXVsdCAob3IgZml4ZWQpIHRleHQgdmFsdWUKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGVmYXVsdFRleHQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBGb3IgZWxlbWVudHMgb25seTogcmV0dXJucyB0aGUgZGVmYXVsdCAob3IgZml4ZWQpIHN0cm9uZ2x5LXR5cGVkIHZhbHVlCi0gICAgICovCi0gICAgWG1sQW55U2ltcGxlVHlwZSBnZXREZWZhdWx0VmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIEZvciBlbGVtZW50cyBvbmx5OiBUcnVlIGlmIGhhcyBkZWZhdWx0LiBJZiBpc0ZpeGVkLCB0aGVuIGlzRGVmYXVsdCBpcyBhbHdheXMgdHJ1ZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzRGVmYXVsdCgpOwotCi0gICAgLyoqCi0gICAgICogRm9yIGVsZW1lbnRzIG9ubHk6IHRydWUgaWYgaXMgZml4ZWQgdmFsdWUuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0ZpeGVkKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hUHJvcGVydHkuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGNhZWVmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgc3VtbWFyeSBvZiBzaW1pbGFyIFNjaGVtYUZpZWxkcyBpbiBhIGNvbXBsZXggdHlwZS4KLSAqIDxwPgotICogSW4gYSBzY2hlbWEgdHlwZSwgZXZlcnkgZWxlbWVudCB3aXRoIHRoZSBzYW1lIG5hbWUgbXVzdCBoYXZlIHRoZQotICogc2FtZSB0eXBlLiAgVGhlcmVmb3JlLCBhbGwgdG9nZXRoZXIsIGVsZW1lbnRzIHdpdGggdGhlIHNhbWUgbmFtZQotICogZm9ybSBhIGNvaGVyZW50IGNvbGxlY3Rpb24gb2Ygc2ltaWxhciBlbGVtZW50cy4gIFNpbWlsYXJseSwgYXR0cmlidXRlcwotICogY2FuIG9ubHkgYmUgZGVmaW5lZCBvbmNlLCBzbyBlYWNoIGF0dHJpYnV0ZSBvYnZpb3VzbHkgaXMgYSBjb2hlcmVudAotICogZ3JvdXAgb24gaXRzIG93bi4KLSAqIDxwPgotICogQSBTY2hlbWFQcm9wZXJ0eSByZXByZXNlbnRzIGEgc3VtbWFyeSBvZiB0aGUgdGhlIGVsZW1lbnRzIHdpdGggYQotICogZ2l2ZW4gbmFtZSBvciB0aGUgYXR0cmlidXRlIHdpdGggYSBnaXZlbiBuYW1lLiAgSXQgcmVwcmVzZW50cyB0aGUKLSAqIHN1bW1hcnkgY2FyZGluYWxpdHkgb2YgdGhlIGZpZWxkcywgdGhlIHN1bW1hcnkgZGVmYXVsdCBhbmQgZml4ZWQKLSAqIHZhbHVlcywgYW5kIHNvIG9uLiAgV2hlbiBpbmZlcnJpbmcgaW5mb3JtYXRpb24gYWJvdXQgYW4gZWxlbWVudAotICogb3IgYXR0cmlidXRlLCBpdCBpcyB0eXBpY2FsbHkgZWFzaWVyIHRvIGNvbnN1bHQgdGhlbiBTY2hlbWFQcm9wZXJ0eQotICogdGhhbiB0byBodW50IGZvciB0aGUgZXhhY3QgU2NoZW1hRmllbGQgaW4gdGhlIHBhcnRpY2xlIHRyZWUgb3IKLSAqIGF0dHJpYnV0ZSBtb2RlbC4KLSAqIAotICogQHNlZSBTY2hlbWFUeXBlI2dldFByb3BlcnRpZXMKLSAqIEBzZWUgU2NoZW1hVHlwZSNnZXRBdHRyaWJ1dGVQcm9wZXJ0aWVzCi0gKiBAc2VlIFNjaGVtYVR5cGUjZ2V0RWxlbWVudFByb3BlcnRpZXMKLSAqIEBzZWUgU2NoZW1hVHlwZSNnZXRBdHRyaWJ1dGVQcm9wZXJ0eQotICogQHNlZSBTY2hlbWFUeXBlI2dldEVsZW1lbnRQcm9wZXJ0eQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYVByb3BlcnR5Ci17Ci0gICAgLyoqCi0gICAgICogVGhlIHR5cGUgd2l0aGluIHdoaWNoIHRoaXMgcHJvcGVydHkgYXBwZWFycwotICAgICAqLyAKLSAgICBTY2hlbWFUeXBlIGdldENvbnRhaW5lclR5cGUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGlzIGVsZW1lbnQgb3IgYXR0cmlidXRlCi0gICAgICovIAotICAgIFFOYW1lIGdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIEZvciBlbGVtZW50IHByb3BlcnRpZXMgdGhlIHNldCBvZiBuYW1lcyB0aGF0IGFyZSBhY2NlcHRlZCBmb3IgdGhpcyBwcm9wZXJ0eQotICAgICAqIGlmIHRoaXMgZWxlbWVudCBpcyB0aGUgaGVhZCBvZiBhIHN1YnN0aXR1dGlvbiBncm91cC4gVGhpcyB3aWxsIGFsd2F5cwotICAgICAqIGhhdmUgYXQgbGVhc3Qgb25lIGVsZW1lbnQsIGllLCB0aGUgcHJvcGVydHkncyBuYW1lLgotICAgICAqLwotICAgIFFOYW1lW10gYWNjZXB0ZWROYW1lcygpOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBKYXZhIG5hbWUgZm9yIHRoaXMgcHJvcGVydHkuICBGb3IgZXhhbXBsZSwgaWYgdGhlIG1ldGhvZCB0bwotICAgICAqIGFjY2VzcyB0aGlzIHByb3BlcnR5IGlzIGNhbGxlZCBnZXRGaXJzdE5hbWUsIHRoZW4gdGhpcyBtZXRob2QKLSAgICAgKiByZXR1cm5zIHRoZSBzdHJpbmcgIkZpcnN0TmFtZSIuICBNYXkgYmUgbnVsbCBpZiB0aGUgc2NoZW1hIHR5cGUKLSAgICAgKiBoYXMgbm90IGJlZW4gY29tcGlsZWQgdG8gSmF2YS4KLSAgICAgKi8gCi0gICAgU3RyaW5nIGdldEphdmFQcm9wZXJ0eU5hbWUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGZvciByZWFkLW9ubHkgcHJvcGVydGllcy4KLSAgICAgKi8gCi0gICAgYm9vbGVhbiBpc1JlYWRPbmx5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGZvciBhdHRyaWJ1dGVzLgotICAgICAqLyAKLSAgICBib29sZWFuIGlzQXR0cmlidXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc2NoZW1hIHR5cGUgZm9yIHRoZSBwcm9wZXJ0eS4KLSAgICAgKi8gCi0gICAgU2NoZW1hVHlwZSBnZXRUeXBlKCk7Ci0KLSAgICAvLyBub3RlIHRoYXQgaW4gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSwgaWYgdGhlIGFycmF5IGdldHRlciBzaG93cyB1cCBmaXJzdCwKLSAgICAvLyB0aGVuIHRoZSBzaW5nZWx0b24gZ2V0dGVyIGlzIG5ldmVyIGFsbG93ZWQgdG8gc2hvdyB1cC4KLQotICAgIC8qKgotICAgICAqIFRoZSBzY2hlbWEgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBKYXZhIGdldHRlciBmb3IgdGhpcyBwcm9wZXJ0eS4KLSAgICAgKiBBcHBsaWVzIG9ubHkgdG8gdHlwZXMgdGhhdCBoYXZlIGJlZW4gY29kZSBnZW5lcmF0ZWQgdG8gSmF2YTsgbWF5Ci0gICAgICogYmUgYSBiYXNlIHR5cGUgb2YgZ2V0VHlwZSgpLgotICAgICAqLyAKLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBqYXZhQmFzZWRPblR5cGUoKTsgLy8gSmF2YSBwcm9wZXJ0eSB0eXBlIGJhc2VkIG9uIHRoaXMgYmFzZSB0eXBlCi0gICAgCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGVyZSBpcyBhIEphdmEgZ2V0dGVyIHRoYXQgcmV0dXJucyBhIHNpbmdsZXRvbi4KLSAgICAgKi8gCi0gICAgYm9vbGVhbiBleHRlbmRzSmF2YVNpbmdsZXRvbigpOyAvLyBoYXMgc2luZ2xldG9uIGdldHRlcgotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlcmUgaXMgYW4gSmF2YSBpc1NldCBtZXRob2QgdGhhdCB0ZXN0cyBmb3IgcHJlc2VuY2UuCi0gICAgICovIAotICAgIGJvb2xlYW4gZXh0ZW5kc0phdmFPcHRpb24oKTsgICAgLy8gaGFzIGlzU2V0IHRlc3RlcgotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlcmUgaXMgYSBKYXZhIGdldHRlciB0aGF0IHJldHVybnMgYW4gYXJyYXkuCi0gICAgICovIAotICAgIGJvb2xlYW4gZXh0ZW5kc0phdmFBcnJheSgpOyAgICAgLy8gaGFzIGFycmF5IGdldHRlciAoY2FsbGVkIC1BcnJheSwgaWYgc2luZ2xldG9uIGlzIHByZXNlbnQpCi0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmF0dXJhbCBKYXZhIHR5cGUgZm9yIHRoaXMgcHJvcGVydHkuICBSZXR1cm5zIGVpdGhlcgotICAgICAqIFhNTF9PQkpFQ1QgKGZvciBjb21wbGV4IHR5cGVzKSBvciBvbmUgb2YgdGhlIEpBVkFfKiBjb25zdGFudHMgZGVzY3JpYmVkCi0gICAgICogaW4gdGhpcyBpbnRlcmZhY2UuCi0gICAgICovIAotICAgIGludCBnZXRKYXZhVHlwZUNvZGUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgZWxlbWVudCBuYW1lcyB3aGljaCBzaG91bGQgYXBwZWFyIHN0cmljdGx5IGFmdGVyIGFsbAotICAgICAqIG9jY3VyZW5jZXMgb2YgdGhlIGVsZW1lbnRzIGRlc2NyaWJlZCBieSB0aGlzIHByb3BlcnR5LiBGb3IgZWxlbWVudCBwcm9wZXJ0aWVzIG9ubHkuCi0gICAgICovIAotICAgIFFOYW1lU2V0IGdldEphdmFTZXR0ZXJEZWxpbWl0ZXIoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdW1tYXJpemVkIG1pbmltdW0gb2NjdXJyYW5jZSBudW1iZXIuCi0gICAgICogRm9yIGV4YW1wbGUsIGEgc2VxdWVuY2UgY29udGFpbmluZyBhIG5vbm9wdGlvbmFsIHNpbmdsZXRvbiBlbGVtZW50IHJlcGVhdGVkIHR3aWNlIHdpbGwKLSAgICAgKiByZXN1bHQgaW4gYSBwcm9wZXJ0eSBnZXRNaW5PY2N1cnMoKSBvZiAyLgotICAgICAqLyAKLSAgICBCaWdJbnRlZ2VyIGdldE1pbk9jY3VycygpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdW1tYXJpemVkIG1pbmltdW0gb2NjdXJyYW5jZSBudW1iZXIuCi0gICAgICogRm9yIGV4YW1wbGUsIGEgc2VxdWVuY2UgY29udGFpbmluZyBhIG5vbm9wdGlvbmFsIHNpbmdsZXRvbiBlbGVtZW50IHJlcGVhdGVkIHR3aWNlIHdpbGwKLSAgICAgKiByZXN1bHQgaW4gYSBwcm9wZXJ0eSBnZXRNYXhPY2N1cnMoKSBvZiAyLgotICAgICAqLyAKLSAgICBCaWdJbnRlZ2VyIGdldE1heE9jY3VycygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB7QGxpbmsgI05FVkVSfSwge0BsaW5rICNWQVJJQUJMRX0sIG9yIHtAbGluayAjQ09OU0lTVEVOVExZfSBuaWxsYWJsZSwgZGVwZW5kaW5nIG9uIHRoZQotICAgICAqIG5pbGxhYmlsaXR5IG9mIHRoZSBlbGVtZW50cyBpbiB0aGlzIHByb3BlcnR5LiAKLSAgICAgKi8KLSAgICBpbnQgaGFzTmlsbGFibGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMge0BsaW5rICNORVZFUn0sIHtAbGluayAjVkFSSUFCTEV9LCBvciB7QGxpbmsgI0NPTlNJU1RFTlRMWX0gZGVmYXVsdGVkLCBkZXBlbmRpbmcgb24gdGhlCi0gICAgICogZGVmYXVsdHMgcHJlc2VudCBpbiB0aGUgZWxlbWVudHMgaW4gdGhpcyBwcm9wZXJ0eS4gCi0gICAgICovCi0gICAgaW50IGhhc0RlZmF1bHQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMge0BsaW5rICNORVZFUn0sIHtAbGluayAjVkFSSUFCTEV9LCBvciB7QGxpbmsgI0NPTlNJU1RFTlRMWX0gZml4ZWQsIGRlcGVuZGluZyBvbiB0aGUKLSAgICAgKiBmaXhlZCBjb25zdHJhaW50cyBwcmVzZW50IGluIHRoZSBlbGVtZW50cyBpbiB0aGlzIHByb3BlcnR5LiAKLSAgICAgKi8KLSAgICBpbnQgaGFzRml4ZWQoKTsKLQotICAgIC8qKiBBcHBsaWVzIHRvIG5vIGVsZW1lbnRzIGZvciB0aGlzIHByb3BlcnR5LiAgU2VlIHtAbGluayAjaGFzTmlsbGFibGV9LCB7QGxpbmsgI2hhc0RlZmF1bHR9LCB7QGxpbmsgI2hhc0ZpeGVkfSAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTkVWRVIgPSAwOwotICAgIC8qKiBBcHBsaWVzIHRvIHNvbWUsIGJ1dCBub3Qgb3RoZXIgZWxlbWVudHMgZm9yIHRoaXMgcHJvcGVydHkuICBTZWUge0BsaW5rICNoYXNOaWxsYWJsZX0sIHtAbGluayAjaGFzRGVmYXVsdH0sIHtAbGluayAjaGFzRml4ZWR9ICovCi0gICAgc3RhdGljIGZpbmFsIGludCBWQVJJQUJMRSA9IDE7Ci0gICAgLyoqIEFwcGxpZXMgdG8gYWxsIGVsZW1lbnRzIGZvciB0aGlzIHByb3BlcnR5LiAgU2VlIHtAbGluayAjaGFzTmlsbGFibGV9LCB7QGxpbmsgI2hhc0RlZmF1bHR9LCB7QGxpbmsgI2hhc0ZpeGVkfSAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OU0lTVEVOVExZID0gMjsKLQotICAgIC8qKiBBbiBYTUwgQmVhbiB0eXBlIHRoYXQgaW5oZXJpdHMgZnJvbSB7QGxpbmsgWG1sT2JqZWN0fS4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFhNTF9PQkpFQ1QgPSAwOwotCi0gICAgLyoqIEphdmEgcHJpbWl0aXZlIHR5cGUgY29kZXMgKGZvciBub24tbnVsbGFibGUgSmF2YSB0eXBlcykgYXJlIGJldHdlZW4gSkFWQV9GSVJTVF9QUklNSVRJVkUgYW5kIEpBVkFfTEFTVF9QUklNSVRJVkUsIGluY2x1c2l2ZS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfRklSU1RfUFJJTUlUSVZFID0gMTsKLQotICAgIC8qKiBBIEphdmEgYm9vbGVhbi4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfQk9PTEVBTiA9IDE7Ci0gICAgLyoqIEEgSmF2YSBmbG9hdC4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfRkxPQVQgPSAyOwotICAgIC8qKiBBIEphdmEgZG91YmxlLiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9ET1VCTEUgPSAzOwotICAgIC8qKiBBIEphdmEgYnl0ZS4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfQllURSA9IDQ7Ci0gICAgLyoqIEEgSmF2YSBzaG9ydC4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfU0hPUlQgPSA1OwotICAgIC8qKiBBIEphdmEgaW50LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9JTlQgPSA2OwotICAgIC8qKiBBIEphdmEgbG9uZy4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfTE9ORyA9IDc7Ci0KLSAgICAvKiogSmF2YSBwcmltaXRpdmUgdHlwZSBjb2RlcyAoZm9yIG5vbi1udWxsYWJsZSBKYXZhIHR5cGVzKSBhcmUgYmV0d2VlbiBKQVZBX0ZJUlNUX1BSSU1JVElWRSBhbmQgSkFWQV9MQVNUX1BSSU1JVElWRSwgaW5jbHVzaXZlLiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9MQVNUX1BSSU1JVElWRSA9IDc7Ci0KLSAgICAvKiogQSB7QGxpbmsgamF2YS5tYXRoLkJpZ0RlY2ltYWx9LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9CSUdfREVDSU1BTCA9IDg7Ci0gICAgLyoqIEEge0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyfS4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfQklHX0lOVEVHRVIgPSA5OwotICAgIC8qKiBBIHtAbGluayBTdHJpbmd9LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9TVFJJTkcgPSAxMDsKLSAgICAvKiogQSBieXRlW10uIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0JZVEVfQVJSQVkgPSAxMTsKLSAgICAvKiogQSB7QGxpbmsgR0RhdGV9LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9HREFURSA9IDEyOwotICAgIC8qKiBBIHtAbGluayBHRHVyYXRpb259LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9HRFVSQVRJT04gPSAxMzsKLSAgICAvKiogQSB7QGxpbmsgamF2YS51dGlsLkRhdGV9LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9EQVRFID0gMTQ7Ci0gICAgLyoqIEEge0BsaW5rIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWV9LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9RTkFNRSA9IDE1OwotICAgIC8qKiBBIHtAbGluayBqYXZhLnV0aWwuTGlzdH0uIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0xJU1QgPSAxNjsKLSAgICAvKiogQSB7QGxpbmsgamF2YS51dGlsLkNhbGVuZGFyfS4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfQ0FMRU5EQVIgPSAxNzsKLQotICAgIC8qKiBBIGdlbmVyYXRlZCB7QGxpbmsgU3RyaW5nRW51bUFic3RyYWN0QmFzZX0gc3ViY2xhc3MuIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0VOVU0gPSAxODsKLSAgICAvKiogQSB7QGxpbmsgamF2YS5sYW5nLk9iamVjdH0sIHVzZWQgZm9yIHNvbWUgc2ltcGxlIHR5cGUgdW5pb25zLiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9PQkpFQ1QgPSAxOTsgLy8gZm9yIHNvbWUgdW5pb25zCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IG9yIGZpeGVkIHZhbHVlLAotICAgICAqIGlmIGl0IGlzIGNvbnNpc3RlbnQuIElmIGl0IGlzIG5vdCBjb25zaXN0ZW50LAotICAgICAqIHRoZW4gcmV0dXJucyBudWxsLgotICAgICAqIFNlZSB7QGxpbmsgI2hhc0RlZmF1bHR9IGFuZCB7QGxpbmsgI2hhc0ZpeGVkfS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGVmYXVsdFRleHQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IG9yIGZpeGVkIHZhbHVlIGFzIGEgc3Ryb25nbHktdHlwZWQgdmFsdWUsCi0gICAgICogaWYgaXQgaXMgY29uc2lzdGVudC4gSWYgaXQgaXMgbm90IGNvbnNpc3RlbnQsCi0gICAgICogdGhlbiByZXR1cm5zIG51bGwuCi0gICAgICogU2VlIHtAbGluayAjaGFzRGVmYXVsdH0gYW5kIHtAbGluayAjaGFzRml4ZWR9LgotICAgICAqLwotICAgIFhtbEFueVNpbXBsZVR5cGUgZ2V0RGVmYXVsdFZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hU3RyaW5nRW51bUVudHJ5LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hU3RyaW5nRW51bUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OWY1NGYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVN0cmluZ0VudW1FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIERlc2NyaWJlcyBhIGNvZGUtZ2VuZXJhdGVkIHN0cmluZyBlbnVtZXJhdGlvbgotICogCi0gKiBAc2VlIFNjaGVtYVR5cGUjZ2V0U3RyaW5nRW51bUVudHJpZXMKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hU3RyaW5nRW51bUVudHJ5Ci17Ci0gICAgLyoqCi0gICAgICogVGhlIGVudW1lcmF0ZWQgc3RyaW5nIHZhbHVlCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQW4gaW50ZWdlciB0byByZXByZXNlbnQgdGhpcyBjaG9pY2UgaW4gdGhlIGVudW1lcmF0aW9uCi0gICAgICovIAotICAgIHB1YmxpYyBpbnQgZ2V0SW50VmFsdWUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNhcGl0YWxpemVkIG5hbWUgdG8gdXNlIGZvciB0aGUgZW51bWVyYXRpb24gY29uc3RhbnQgbmFtZQotICAgICAqLyAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEVudW1OYW1lKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkxOGYyNy4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTA1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHNjaGVtYSB0eXBlLgotICogPHA+Ci0gKiBTY2hlbWFUeXBlIGlzIHRoZSBtZXRhZGF0YSAidHlwZSIgY2xhc3MgZm9yIHtAbGluayBYbWxPYmplY3R9LCBhbmQgaXQgcGxheXMgdGhlCi0gKiBhbmFsb2dvdXMgcm9sZSBmb3Ige0BsaW5rIFhtbE9iamVjdH0gdGhhdCB7QGxpbmsgamF2YS5sYW5nLkNsYXNzfSBwbGF5cyBmb3IKLSAqIHtAbGluayBqYXZhLmxhbmcuT2JqZWN0fS4KLSAqIDxwPgotICogRXZlcnkgWE1MIEJlYW4gY2xhc3MgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGV0b24gU2NoZW1hVHlwZSBvYmplY3QKLSAqIG9idGFpbmFibGUgYnkgQ2xhc3NOYW1lLnR5cGUgKGUuZy4sIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXIjdHlwZX0pLCBhbmQKLSAqIGV2ZXJ5IFhNTCBCZWFuIGluc3RhbmNlIGhhcyBhbiBhY3R1YWwgU2NoZW1hVHlwZSwgb2J0YWluYWJsZSBieQotICoge0BsaW5rIFhtbE9iamVjdCNzY2hlbWFUeXBlfS4gIFRoZSBDbGFzc05hbWUudHlwZSBhbmQgc2NoZW1hVHlwZSgpIG1lY2hhbmlzbXMgYXJlCi0gKiBhbmFsb2dvdXMgdG8gdGhlIG9yZGluYXJ5IEphdmEgQ2xhc3NOYW1lLmNsYXNzIGFuZCBvYmouZ2V0Q2xhc3MoKSBtZWNoYW5pc21zLgotICogPHA+Ci0gKiBBbGwgc2NoZW1hIHR5cGVzIGFyZSByZXByZXNlbnRlZCBieSBhIFNjaGVtYVR5cGUsIHRoaXMgaW5jbHVkZXMgYWxsIHR5cGVzCi0gKiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBhcmUgYnVpbHQtaW4gb3IgdXNlci1kZWZpbmVkLCBjb21waWxlZCBvcgotICogdW5jb21waWxlZCwgc2ltcGxlIG9yIGNvbXBsZXguCi0gKiA8cD4KLSAqIEluIGFkZGl0aW9uLCBhIGNvbXBpbGVkIFhNTCBCZWFuIHR5cGUgc3lzdGVtIGluY2x1ZGVzIHNwZWNpYWwgImRvY3VtZW50IiBzY2hlbWEgdHlwZXMKLSAqIGVhY2ggcmVwcmVzZW50aW5nIGEgZG9jdW1lbnQgY29udGFpbmluZyBub3RoaW5nIGJ1dCBhIHNpbmdsZSBlbGVtZW50IGZvciBlYWNoCi0gKiBnbG9iYWwgZWxlbWVudCwgYW5kIHNwZWNpYWwgImF0dHJpYnV0ZSIgc2NoZW1hIHR5cGVzIGVhY2ggcmVwcmVzZW50aW5nCi0gKiBhIGZyYWdtZW50IGNvbnRhaW5pbmcgbm90aGluZyBidXQgYSBzaW5nbGUgZ2xvYmFsIGF0dHJpYnV0ZSBmb3IgZ2xvYmFsCi0gKiBhdHRyaWJ1dGUuCi0gKiA8cD4KLSAqIERvIG5vdCBjb25mdXNlIFNjaGVtYSBUeXBlcyB3aXRoIG90aGVyIHR5cGVzIG9mIFNjaGVtYSBDb21wb25lbnRzIHN1Y2ggYXMKLSAqIHtAbGluayBTY2hlbWFHbG9iYWxFbGVtZW50IEdsb2JhbCBFbGVtZW50c30sIHtAbGluayBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgR2xvYmFsIEF0dHJpYnV0ZXN9LAotICoge0BsaW5rIFNjaGVtYU1vZGVsR3JvdXAgTmFtZWQgTW9kZWwgR3JvdXBzfSwgb3Ige0BsaW5rIFNjaGVtYUF0dHJpYnV0ZUdyb3VwIEF0dHJpYnV0ZSBHcm91cHN9LgotICogU2NoZW1hVHlwZSByZXByZXNlbnRzIGEgVHlwZSBjb21wb25lbnQsIG5vdCBhbnkgb2YgdGhlIG90aGVyIGtpbmRzIG9mIGNvbXBvbmVudHMuCi0gKiBUaGVyZSBhcmUgZGlmZmVyZW50IGtpbmRzIG9mIG1ldGFkYXRhIG9iamVjdHMgZm9yIHRoZSBkaWZmZXJlbnQgU2NoZW1hIGNvbXBvbmVudHMuIAotICogPHA+Ci0gKiBUaGUgc3BhY2Ugb2YgU2NoZW1hVHlwZXMgaXMgZGl2aWRlZCBhcyBmb2xsb3dzOgotICogCi0gKiA8dWw+Ci0gKiA8bGk+Rmlyc3QsIHRoZXJlIGlzIHRoZSB1bml2ZXJzYWwgYmFzZSB0eXBlIGFuZCB0aGUgdW5pdmVyc2FsCi0gKiAgICAgc3VidHlwZS4gIFRoZXNlIGFyZSB7QGxpbmsgWG1sT2JqZWN0I3R5cGV9Ci0gKiAgICAgKGNvcnJlc3BvbmRpbmcgdG8geHM6YW55VHlwZSkgYW5kIHtAbGluayBYbWxCZWFucyNOT19UWVBFfSwKLSAqICAgICByZXNwZWN0aXZlbHkuICBUaGUgZmlyc3QgdHlwZSBpcyBhIGJhc2UgdHlwZSBvZiBhbGwgb3RoZXIKLSAqICAgICB0eXBlcy4gIFRoZSBvdGhlciB0eXBlIGluZGljYXRlcyB0aGUgYWJzZW5jZSBvZiB0eXBlIGluZm9ybWF0aW9uCi0gKiAgICAgYW5kLCBhdCBsZWFzdCBpbiBzZXQtdGhlb3JldGljIHRlcm1zLCBpcyBhIHN1YnR5cGUgb2YgYWxsIG90aGVyIHR5cGVzLgotICogPGxpPlRoZXJlIGlzIGFub3RoZXIgdW5pdmVyc2FsIGJhc2UgdHlwZSB0aGF0IGlzIHRoZSBiYXNlIHR5cGUKLSAqICAgICBmb3IgYWxsIHNpbXBsZSB0eXBlcy4gIFRoaXMgaXMgdGhlIHtAbGluayBYbWxBbnlTaW1wbGVUeXBlI3R5cGV9LAotICogICAgIGNvcnJlc3BvbmRpbmcgdG8geHM6YW55U2ltcGxlVHlwZS4gICBPbmx5IFhtbE9iamVjdC50eXBlIGFuZAotICogICAgIFhtbEFueVNpbXBsZVR5cGUudHlwZSByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIHtAbGluayAjaXNVUlR5cGV9LCBhbmQKLSAqICAgICBvbmx5IFhtbEJlYW5zLk5PX1RZUEUgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBmb3Ige0BsaW5rICNpc05vVHlwZX0uCi0gKiA8bGk+VGhlIHR3byAic3BlY2lhbCIga2luZHMgb2YgdHlwZXMgdGhhdCBhcmUgZ2VuZXJhdGVkIHRoYXQKLSAqICAgICBkbyBub3QgZm9ybWFsbHkgZXhpc3QgaW4gdGhlIGFjdHVhbCBTY2hlbWEgc3BlY2lmaWNhdGlvbiBhcmUKLSAqICAgICBkb2N1bWVudCB0eXBlcyBhbmQgZ2xvYmFsIGF0dHJpYnV0ZSB0eXBlcyAoY29ycmVzcG9uZGluZyB0bwotICogICAgIGRvY3VtZW50cyB0aGF0IGNvbnRhaW4gYSBnbG9iYWwgZWxlbWVudCwgb3IgZnJhZ21lbnRzIHRoYXQKLSAqICAgICBjb250YWluIGEgZ2xvYmFsIGF0dHJpYnV0ZSkuICBUaGV5IGNhbiBiZSBkZXRlY3RlZCB1c2luZwotICogICAgIHtAbGluayAjaXNEb2N1bWVudFR5cGV9IGFuZCB7QGxpbmsgI2lzQXR0cmlidXRlVHlwZX0uIE90aGVyCi0gKiAgICAgdGhhbiB0aGVpciBhbm9ueW1pdHkgKGxhY2sgb2YgYSB0eXBlIG5hbWUpIGFuZCB0aGVpciBhcHBlYXJhbmNlCi0gKiAgICAgb25seSBhdCB0aGUgcm9vdCBvZiBhbiBpbnN0YW5jZSwgdGhleSBhcmUgb3RoZXJ3aXNlIGp1c3QgbGlrZQotICogICAgIG9yZGluYXJ5IGNvbXBsZXggdHlwZXMuCi0gKiA8bGk+U2ltcGxlIHR5cGVzIGNhbiBiZSBkZXRlY3RlZCB1c2luZyB7QGxpbmsgI2lzU2ltcGxlVHlwZX0uCi0gKiAgICAgQ29tcGxleCB0eXBlcyBhcmUgY29uc2RlcmVkIHRvIGJlIGFsbCB0aGUgdHlwZXMgdGhhdCBhcmUKLSAqICAgICBub3Qgc2ltcGxlLgotICogPGxpPlNpbXBsZSB0eXBlcyBhcmUgZGl2aWRlZCBpbnRvIHRocmVlIHZhcmlldGllczogYXRvbWljIHR5cGVzLAotICogICAgIGxpc3QgdHlwZXMsIGFuZCB1bmlvbiB0eXBlcy4gIFdoaWNoIHZhcmlldHkgb2Ygc2ltcGxlIHR5cGUKLSAqICAgICB5b3UgaGF2ZSBjYW4gYmUgZGlzY292ZXJkIHVzaW5nIHtAbGluayAjZ2V0U2ltcGxlVmFyaWV0eX0uCi0gKiAgICAgSXQgd2lsbCByZXR1cm4gZWl0aGVyIHtAbGluayAjQVRPTUlDfSwge0BsaW5rICNMSVNUfSwgb3IKLSAqICAgICB7QGxpbmsgI1VOSU9OfS4KLSAqIDxsaT5BbiB7QGxpbmsgI0FUT01JQ30gc2ltcGxlIHR5cGUgaXMgYWx3YXlzIGJhc2VkIG9uIG9uZSBvZiB0aGUKLSAqICAgICAyMCBidWlsdC1pbiBwcmltaXRpdmUgc2NoZW1hIHR5cGVzLiAgWW91IGNhbiBkZXRlcm1pbmUKLSAqICAgICB0aGUgdW5kZXJseWluZyBwcmltaXRpdmUgdHlwZSBmb3IgYW4gYXRvbWljIHNpbXBsZSB0eXBlCi0gKiAgICAgYnkgY2FsbGluZyB7QGxpbmsgI2dldFByaW1pdGl2ZVR5cGV9LiAgQW4gYXRvbWljIHR5cGUKLSAqICAgICBtYXkgYWRkIGZhY2V0IHJlc3RyaWN0aW9ucyBvbiB0b3Agb2YgdGhlIHByaW1pdGl2ZSB0eXBlLAotICogICAgIGFuZCB0aGVzZSBmYWNldHMgY2FuIGJlIGV4cGxvcmVkIHVzaW5nIHtAbGluayAjZ2V0RmFjZXR9LAotICogICAgIHtAbGluayAjZ2V0V2hpdGVTcGFjZVJ1bGV9LCB7QGxpbmsgI21hdGNoUGF0dGVybkZhY2V0fSwKLSAqICAgICB7QGxpbmsgI2dldEVudW1lcmF0aW9uVmFsdWVzfSwgYW5kIHJlbGF0ZWQgbWV0aG9kcy4KLSAqIDxsaT5BIHtAbGluayAjTElTVH0gc2ltcGxlIHR5cGUgaXMgYWx3YXlzIGJhc2VkIG9uIGFub3RoZXIgbm9uLWxpc3QKLSAqICAgICBzaW1wbGUgdHlwZS4gIFRoZSB1bmRlcmx5aW5nIGxpc3QgaXRlbSB0eXBlIGNhbiBiZSBvYnRhaW5lZAotICogICAgIGJ5IHVzaW5nIHtAbGluayAjZ2V0TGlzdEl0ZW1UeXBlfS4KLSAqIDxsaT5BIHtAbGluayAjVU5JT059IHNpbXBsZSB0eXBlIGlzIGFsd2F5cyBjb21wb3NlZCBvdXQgb2YgYSBudW1iZXIgb2YKLSAqICAgICBvdGhlciBzaW1wbGUgdHlwZXMuICBUaGUgZGlyZWN0IG1lbWJlcnMgb2YgdGhlIHVuaW9uIGNhbgotICogICAgIGJlIG9idGFpbmVkIGJ5IHtAbGluayAjZ2V0VW5pb25NZW1iZXJUeXBlc30uICBXaGVuIHVuaW9ucwotICogICAgIGNvbnNpc3Qgb2Ygb3RoZXIgdW5pb25zLCBpdCBpcyB1c2VmdWwgdG8ga25vdyB1c2VmdWwgdG8ga25vdwotICogICAgIHRoZSAibGVhdmVzIG9mIHRoZSB1bmlvbiB0cmVlIiwgc28gdGhlCi0gKiAgICAgc2V0IG9mIG5vbi11bmlvbiB0eXBlcyBtYWtpbmcgdXAgdGhlIHVuaW9uIGNhbiBiZSBvYnRhaW5lZAotICogICAgIGJ5IHtAbGluayAjZ2V0VW5pb25Db25zdGl0dWVudFR5cGVzfS4gIFRoZSBjbG9zdXJlIG9mIHRoZQotICogICAgIGVudGlyZSAidW5pb24gdHJlZSIgaXMge0BsaW5rICNnZXRVbmlvblN1YlR5cGVzfSAodGhpcyBpbmNsdWRlcwotICogICAgIHRoZSB0eXBlIGl0c2VsZikuICBGb3IKLSAqICAgICBzaW1wbGUgdW5pb25zIHRoYXQgZG8gbm90IGNvbnNpc3Qgb2Ygb3RoZXIgdW5pb25zLCBhbGwgdGhyZWUKLSAqICAgICBvZiB0aGVzZSBzZXRzIGFyZSB0aGUgc2FtZS4KLSAqIDxsaT5Db21wbGV4IHR5cGVzIGhhdmUgbmVzdGVkIHN0cnVjdHVyZS4gIFRoZXkgYXJlIGRpdmlkZWQgaW50bwotICogICAgIGZvdXIgY29udGVudCB0eXBlczogZW1wdHkgY29udGVudCwgc2ltcGxlIGNvbnRlbnQsIGVsZW1lbnQtb25seQotICogICAgIGNvbnRlbnQsIGFuZCBtaXhlZCBjb250ZW50LiAgQWxsIGtpbmRzIG9mIGNvbXBsZXggdHlwZXMgbWF5Ci0gKiAgICAgaGF2ZSBhdHRyaWJ1dGVzLiAgVGhlIGNvbnRlbnQgdHlwZSBmb3IgYSBjb21wbGV4IHR5cGUgY2FuCi0gKiAgICAgYmUgZGVybWluZWQgdXNpbmcge0BsaW5rICNnZXRDb250ZW50VHlwZX0uICBUaGlzIHdpbGwgcmV0dXJuCi0gKiAgICAge0BsaW5rICNFTVBUWV9DT05URU5UfSwge0BsaW5rICNTSU1QTEVfQ09OVEVOVH0sCi0gKiAgICAge0BsaW5rICNFTEVNRU5UX0NPTlRFTlR9LCBvciB7QGxpbmsgI01JWEVEX0NPTlRFTlR9LgotICogPGxpPklmIGEgY29tcGxleCB0eXBlIGhhcyB7QGxpbmsgI0VNUFRZX0NPTlRFTlR9LCB0aGUgY29udGVudCBtb2RlbCB3aWxsIGJlIG51bGwuCi0gKiA8bGk+SWYgYSBjb21wbGV4IHR5cGUgaGFzIHtAbGluayAjU0lNUExFX0NPTlRFTlR9LCB0aGVuIGl0IHdpbGwgZXh0ZW5kIHRoZQotICogICAgIHNpbXBsZSB0eXBlIHRoYXQgZGVzY3JpYmVzIHRoZSBjb250ZW50LiAgSW4gYWRkaXRpb24sIHRoZSB0eXBlCi0gKiAgICAgbWF5IGltcG9zZSBhZGRpdGlvbmFsIHNpbXBsZSB0eXBlIGZhY2V0IHJlc3RyaWN0aW9uczsgdGhlc2UgY2FuIAotICogICAgIGJlIGRldGVybWluZWQgaW4gdGhlIHNhbWUgd2F5IHRoZXkgYXJlIGZvciBhIHNpbXBsZSB0eXBlLgotICogPGxpPklmIGEgY29tcGxleCB0eXBlIGhhcyB7QGxpbmsgI0VMRU1FTlRfQ09OVEVOVH0gb3Ige0BsaW5rICNNSVhFRF9DT05URU5UfSwgdGhlbgotICogICAgIHRoZSBkZXRhaWxlZCBjb250ZW50IG1vZGVsIGNhbiBiZSBkZXRlcm1pbmVkIGJ5IGV4YW1pbmluZwotICogICAgIHRoZSBwYXJ0aWNsZSB0cmVlICh3aGljaCBtYXkgYmUgbnVsbCBmb3IgTUlYRURfQ09OVEVOVCkuCi0gKiAgICAgVGhlIHBhcnRpY2xlIHRyZWUgY2FuIGJlIG9idGFpbmVkIHZpYSB7QGxpbmsgI2dldENvbnRlbnRNb2RlbH0uCi0gKiA8bGk+V2hlbiB3b3JraW5nIHdpdGggYSBjb21wbGV4IHR5cGUsIG1vc3QgdXNlcnMgd2lsbCBmaW5kIGl0Ci0gKiAgICAgc3VmZmljaWVudCB0byBkaXNjb3ZlciB0aGUgc3VtbWFyaXplZCBzaGFwZSBvZiB0aGUgY29udGVudCBtb2RlbAotICogICAgIGFuZCBhdHRyaWJ1dGUgbW9kZWwgdXNpbmcge0BsaW5rICNnZXRFbGVtZW50UHJvcGVydGllc30sCi0gKiAgICAge0BsaW5rICNnZXRBdHRyaWJ1dGVQcm9wZXJ0aWVzfSwgYW5kIHJlbGF0ZWQgbWV0aG9kcyByYXRoZXIgdGhhbgotICogICAgIGV4YW1pbmluZyB0aGUgcGFydGljbGUgdHJlZSBhbmQgYXR0cmlidXRlIG1vZGVsIGRpcmVjdGx5LgotICogPC91bD4KLSAqIAotICogQHNlZSBTY2hlbWFUeXBlTG9hZGVyCi0gKiBAc2VlIFhtbE9iamVjdCNzY2hlbWFUeXBlCi0gKiBAc2VlIFNpbXBsZVZhbHVlI2luc3RhbmNlVHlwZQotICovIAotcHVibGljIGludGVyZmFjZSBTY2hlbWFUeXBlIGV4dGVuZHMgU2NoZW1hQ29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgdXNlZCB0byBkZXNjcmliZSB0aGUgdHlwZSBpbiB0aGUgc2NoZW1hLgotICAgICAqIE51bGwgaWYgdGhlIHR5cGUgaXMgYW5vbnltb3VzIChuZXN0ZWQpLCBvciBpZiBpdCBpcyBhIGRvY3VtZW50IHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFFOYW1lIGdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBwYXJlbnQgc2NoZW1hIGVsZW1lbnQuCi0gICAgICogTnVsbCBmb3IgdG9wLWxldmVsIChuYW1lZCkgdHlwZXMgYW5kIGRvY3VtZW50IHR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFGaWVsZCBnZXRDb250YWluZXJGaWVsZCgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGlzIGEgZG9jdW1lbnQgdHlwZS4KLSAgICAgKiA8cD4KLSAgICAgKiBEb2N1bWVudCB0eXBlcyBhcmUgZ2VuZXJhdGVkIGZvciBldmVyeSBnbG9iYWwgZWxlbWVudC4gQSBkb2N1bWVudAotICAgICAqIHR5cGUgaXMgYW4gdW5uYW1lZCBjb21wbGV4IHR5cGUgdGhhdCBjb250YWlucyBleGFjdGx5IG9uZSBlbGVtZW50OgotICAgICAqIHdlIGRlZmluZSB0aGVzZSB0eXBlcywgYmVjYXVzZSB0aGV5IGFyZSB0aGUgdHlwZXMgb2YgdGhlICJkb2N1bWVudHMiCi0gICAgICogd2hpY2ggY29udGFpbiB0aGUgZGVmaW5lZCBnbG9iYWwgZWxlbWVudHMsIGFuZCB0aGV5IGFsbCB0dXJuIGludG8KLSAgICAgKiBKYXZhIHR5cGVzLiAoTmFtZWQgRWxlbWVudG5hbWVEb2N1bWVudC4pCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEb2N1bWVudFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBpcyBhIGF0dHJpYnV0ZSB0eXBlLgotICAgICAqIDxwPgotICAgICAqIEF0dHJpYnV0ZSB0eXBlcyBhcmUgZ2VuZXJhdGVkIGZvciBldmVyeSBnbG9iYWwgYXR0cmlidXRlLiBBbiBhdHRyaWJ1dGUKLSAgICAgKiB0eXBlIGlzIGFuIHVubmFtZWQgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgZXhhY3RseSBvbmUgYXR0cmlidXRlOgotICAgICAqIHdlIGRlZmluZSB0aGVzZSB0eXBlcywgYmVjYXVzZSB0aGV5IGFyZSB0aGUgdHlwZXMgb2YgdGhlICJhdHRyaWJ1dGUgZG9jdW1lbnRzIgotICAgICAqIHdoaWNoIGNvbnRhaW4gdGhlIGRlZmluZWQgZ2xvYmFsIGF0dHJpYnV0ZSwgYW5kIHRoZXkgYWxsIHR1cm4gaW50bwotICAgICAqIEphdmEgdHlwZXMuIChOYW1lZCBBdHRyaWJ1dGVuYW1lQXR0cmlidXRlLikKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZVR5cGUoKTsKLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZG9jdW1lbnQgZWxlbWVudCBuYW1lIGlmIHRoaXMgaXMgYSBkb2N1bWVudCB0eXBlLAotICAgICAqIG9yIG51bGwgb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXREb2N1bWVudEVsZW1lbnROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgcW5hbWUgaWYgdGhpcyBpcyBhIGF0dHJpYnV0ZSB0eXBlLAotICAgICAqIG9yIG51bGwgb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRBdHRyaWJ1dGVUeXBlQXR0cmlidXRlTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIG91dGVyIHNjaGVtYSB0eXBlLgotICAgICAqIE51bGwgZm9yIHRvcC1sZXZlbCAobmFtZWQpIHR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlIGdldE91dGVyVHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGFub255bW91cyB0eXBlIGhhcyBubyBjb3JyZXNwb25kaW5nIEphdmEgdHlwZS4gVHJ1ZSBmb3IKLSAgICAgKiBhbm9ueW1vdXMgdHlwZXMgbmVzdGVkIHdpdGhpbiBzaW1wbGUgdHlwZSByZXN0cmljdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTa2lwcGVkQW5vbnltb3VzVHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIHNjaGVtYSB0eXBlIHdhcyBjb21waWxlZCB0byBoYXZlIGEgY29ycmVzcG9uZGluZwotICAgICAqIEphdmEgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDb21waWxlZCgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZSBvZiB0aGUgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRGdWxsSmF2YU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBzaG9ydCB1bnF1YWxmaWllZCBKYXZhIG5hbWUgZm9yIHRoZSBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFNob3J0SmF2YU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RnVsbEphdmFJbXBsTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIHNob3J0IHVucXVhbGZpaWVkIEphdmEgbmFtZSBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U2hvcnRKYXZhSW1wbE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBKYXZhIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzY2hlbWEgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgQ2xhc3MgZ2V0SmF2YUNsYXNzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgSmF2YSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbnVtZXJhdGlvbiB0eXBlIGZvciB0aGlzIHNjaGVtYSB0eXBlLAotICAgICAqIGlmIGFwcGxpY2FibGUgKG9yIG51bGwgaWYgbm90IGFuIGVudW1lcmF0aW9uKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgQ2xhc3MgZ2V0RW51bUphdmFDbGFzcygpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgWHNkIHR5cGUgaXMgYW5vbnltb3VzIChpLmUuLCBub3QgdG9wLWxldmVsKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0Fub255bW91c1R5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgZm9yIGFueSBvZiB0aGUgNDArIGJ1aWx0LWluIHR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQnVpbHRpblR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgZm9yIHRoZSBhbnlTaW1wbGVUeXBlIGFuZCBhbnkgcmVzdHJpY3Rpb25zL3VuaW9ucy9saXN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1NpbXBsZVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYmFzZSByZXN0cmljdGlvbiBvciBleHRlbnNpb24gdHlwZS4gVW5pb25zIGFuZCBsaXN0cwotICAgICAqIHJldHVybiB0aGUgYW55U2ltcGxlVHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hVHlwZSBnZXRCYXNlVHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjb21tb24gYmFzZSB0eXBlIHdpdGggdGhlIGdpdmVuIHR5cGUuIFRoZSByZXR1cm5lZAotICAgICAqIHR5cGUgaXMgdGhlIG1vc3Qgc3BlY2lmaWMgZGVjbGFyZWQgYmFzZSB0eXBlIG9mIGJvdGggdHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVR5cGUgZ2V0Q29tbW9uQmFzZVR5cGUoU2NoZW1hVHlwZSB0eXBlKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIHNwZWNpZmllZCB0eXBlIGRlcml2ZXMgZnJvbSB0aGlzIHR5cGUgKG9yIGlmCi0gICAgICogaXQgaXMgdGhlIHNhbWUgdHlwZSkuCi0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgWG1sT2JqZWN0LnR5cGUgKHRoZSBhbnlUeXBlKSBpcyBhc3NpZ25hYmxlCi0gICAgICogZnJvbSBhbGwgdHlwZSwgYW5kIHRoZSBYbWxCZWFucy5ub1R5cGUgKHRoZSBhYnNlbmNlIG9mCi0gICAgICogYSB0eXBlKSBpcyBhc3NpZ25hYmxlIHRvIGFsbCB0eXBlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tKFNjaGVtYVR5cGUgdHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgZm9yIHRoZSBkZXJpdmF0aW9uIHR5cGUsIGVpdGhlciAKLSAgICAgKiB7QGxpbmsgI0RUX0VYVEVOU0lPTn0sIHtAbGluayAjRFRfUkVTVFJJQ1RJT059LCB7QGxpbmsgI0RUX05PVF9ERVJJVkVEfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldERlcml2YXRpb25UeXBlKCk7Ci0gICAgCi0gICAgLyoqIE5vdCBkZXJpdmVkLiAgVHJ1ZSBmb3IgWG1sT2JqZWN0LnR5cGUgb25seS4gU2VlIHtAbGluayAjZ2V0RGVyaXZhdGlvblR5cGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERUX05PVF9ERVJJVkVEID0gMDsKLSAgICAvKiogRGVyaXZlZCBieSByZXN0cmljdGlvbi4gU2VlIHtAbGluayAjZ2V0RGVyaXZhdGlvblR5cGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERUX1JFU1RSSUNUSU9OID0gMTsKLSAgICAvKiogRGVyaXZlZCBieSBleHRlbnNpb24uIFNlZSB7QGxpbmsgI2dldERlcml2YXRpb25UeXBlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVF9FWFRFTlNJT04gPSAyOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGZvciBidWlsdGluIHR5cGVzIHRoYXQgY2FuIGJlIHVzZWQKLSAgICAgKiBmb3IgcXVpY2sgY29tcGFyaXNvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEJ1aWx0aW5UeXBlQ29kZSgpOwotCi0gICAgLyoqIE5vdCBhIGJ1aWx0aW4gdHlwZSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTk9UX0JVSUxUSU4gPSAwOwotICAgIC8qKiB4czphbnlUeXBlLCBha2Ege0BsaW5rIFhtbE9iamVjdCN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfQU5ZX1RZUEUgPSAxOwotICAgIAotICAgIC8qKiBUaGUgcHJpbWl0aXZlIHR5cGVzIGhhdmUgY29kZXMgYmV0d2VlbiBCVENfRklSU1RfUFJJTUlUSVZFIGFuZCBCVENfTEFTVF9QUklNSVRJVkUgaW5jbHVzaXZlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0ZJUlNUX1BSSU1JVElWRSA9IDI7Ci0KLSAgICAvKiogeHM6YW55U2ltcGxlVHlwZSwgYWthIHtAbGluayBYbWxBbnlTaW1wbGVUeXBlI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19BTllfU0lNUExFID0gMjsKLQotICAgIC8qKiB4czpib29sZWFuLCBha2Ege0BsaW5rIFhtbEJvb2xlYW4jdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0JPT0xFQU4gPSAzOwotICAgIC8qKiB4czpiYXNlNjRCaW5hcnksIGFrYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5I3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19CQVNFXzY0X0JJTkFSWSA9IDQ7Ci0gICAgLyoqIHhzOmhleEJpbmFyeSwgYWthIHtAbGluayBYbWxCYXNlNjRCaW5hcnkjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0hFWF9CSU5BUlkgPSA1OwotICAgIC8qKiB4czphbnlVUkksIGFrYSB7QGxpbmsgWG1sQW55VVJJI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19BTllfVVJJID0gNjsKLSAgICAvKiogeHM6UU5hbWUsIGFrYSB7QGxpbmsgWG1sUU5hbWUjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX1FOQU1FID0gNzsKLSAgICAvKiogeHM6Tk9UQVRJT04sIGFrYSB7QGxpbmsgWG1sTk9UQVRJT04jdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX05PVEFUSU9OID0gODsKLSAgICAvKiogeHM6ZmxvYXQsIGFrYSB7QGxpbmsgWG1sRmxvYXQjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0ZMT0FUID0gOTsKLSAgICAvKiogeHM6ZG91YmxlLCBha2Ege0BsaW5rIFhtbERvdWJsZSN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfRE9VQkxFID0gMTA7Ci0gICAgLyoqIHhzOmRlY2ltYWwsIGFrYSB7QGxpbmsgWG1sRGVjaW1hbCN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfREVDSU1BTCA9IDExOwotICAgIC8qKiB4czpzdHJpbmcsIGFrYSB7QGxpbmsgWG1sU3RyaW5nI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19TVFJJTkcgPSAxMjsKLQotICAgIC8qKiB4czpkdXJhdGlvbiwgYWthIHtAbGluayBYbWxEdXJhdGlvbiN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfRFVSQVRJT04gPSAxMzsKLSAgICAvKiogeHM6ZGF0ZVRpbWUsIGFrYSB7QGxpbmsgWG1sRGF0ZVRpbWUjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0RBVEVfVElNRSA9IDE0OwotICAgIC8qKiB4czp0aW1lLCBha2Ege0BsaW5rIFhtbFRpbWUjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX1RJTUUgPSAxNTsKLSAgICAvKiogeHM6ZGF0ZSwgYWthIHtAbGluayBYbWxEYXRlI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19EQVRFID0gMTY7Ci0gICAgLyoqIHhzOmdZZWFyTW9udGgsIGFrYSB7QGxpbmsgWG1sR1llYXJNb250aCN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfR19ZRUFSX01PTlRIID0gMTc7Ci0gICAgLyoqIHhzOmdZZWFyLCBha2Ege0BsaW5rIFhtbEdZZWFyI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19HX1lFQVIgPSAxODsKLSAgICAvKiogeHM6Z01vbnRoRGF5LCBha2Ege0BsaW5rIFhtbEdNb250aERheSN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfR19NT05USF9EQVkgPSAxOTsKLSAgICAvKiogeHM6Z0RheSwgYWthIHtAbGluayBYbWxHRGF5I3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19HX0RBWSA9IDIwOwotICAgIC8qKiB4czpnTW9udGgsIGFrYSB7QGxpbmsgWG1sR01vbnRoI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19HX01PTlRIID0gMjE7Ci0KLSAgICAvKiogVGhlIHByaW1pdGl2ZSB0eXBlcyBoYXZlIGNvZGVzIGJldHdlZW4gQlRDX0ZJUlNUX1BSSU1JVElWRSBhbmQgQlRDX0xBU1RfUFJJTUlUSVZFIGluY2x1c2l2ZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19MQVNUX1BSSU1JVElWRSA9IDIxOwotCi0gICAgLy8gZGVyaXZlZCBudW1lcmljcwotICAgIC8qKiB4czppbnRlZ2VyLCBha2Ege0BsaW5rIFhtbEludGVnZXIjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0lOVEVHRVIgPSAyMjsKLSAgICAvKiogeHM6bG9uZywgYWthIHtAbGluayBYbWxMb25nI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19MT05HID0gMjM7Ci0gICAgLyoqIHhzOmludCwgYWthIHtAbGluayBYbWxJbnQjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0lOVCA9IDI0OwotICAgIC8qKiB4czpzaG9ydCwgYWthIHtAbGluayBYbWxTaG9ydCN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfU0hPUlQgPSAyNTsKLSAgICAvKiogeHM6Ynl0ZSwgYWthIHtAbGluayBYbWxCeXRlI3R5cGV9ICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19CWVRFID0gMjY7Ci0gICAgLyoqIHhzOm5vblBvc2l0aXZlSW50ZWdlciwgYWthIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXIjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX05PTl9QT1NJVElWRV9JTlRFR0VSID0gMjc7Ci0gICAgLyoqIHhzOk5lZ2F0aXZlSW50ZWdlciwgYWthIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXIjdHlwZX0gKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX05FR0FUSVZFX0lOVEVHRVIgPSAyODsKLSAgICAvKiogeHM6bm9uTmVnYXRpdmVJbnRlZ2VyLCBha2Ege0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTk9OX05FR0FUSVZFX0lOVEVHRVIgPSAyOTsKLSAgICAvKiogeHM6cG9zaXRpdmVJbnRlZ2VyLCBha2Ege0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlciN0eXBlfSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfUE9TSVRJVkVfSU5URUdFUiA9IDMwOwotICAgIC8qKiB4czp1bnNpZ25lZExvbmcsIGFrYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nI3R5cGV9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX1VOU0lHTkVEX0xPTkcgPSAzMTsKLSAgICAvKiogeHM6dW5zaWduZWRJbnQsIGFrYSB7QGxpbmsgWG1sVW5zaWduZWRJbnQjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfVU5TSUdORURfSU5UID0gMzI7Ci0gICAgLyoqIHhzOnVuc2lnbmVkU2hvcnQsIGFrYSB7QGxpbmsgWG1sVW5zaWduZWRTaG9ydCN0eXBlfSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19VTlNJR05FRF9TSE9SVCA9IDMzOwotICAgIC8qKiB4czp1bnNpZ25lZEJ5dGUsIGFrYSB7QGxpbmsgWG1sVW5zaWduZWRCeXRlI3R5cGV9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX1VOU0lHTkVEX0JZVEUgPSAzNDsKLQotICAgIC8vIGRlcml2ZWQgc3RyaW5ncwotICAgIC8qKiB4czpub3JtYWxpemVkU3RyaW5nLCBha2Ege0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmcjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTk9STUFMSVpFRF9TVFJJTkcgPSAzNTsKLSAgICAvKiogeHM6dG9rZW4sIGFrYSB7QGxpbmsgWG1sVG9rZW4jdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfVE9LRU4gPSAzNjsKLSAgICAvKiogeHM6TmFtZSwgYWthIHtAbGluayBYbWxOYW1lI3R5cGV9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX05BTUUgPSAzNzsKLSAgICAvKiogeHM6TkNOYW1lLCBha2Ege0BsaW5rIFhtbE5DTmFtZSN0eXBlfSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19OQ05BTUUgPSAzODsKLSAgICAvKiogeHM6bGFuZ3VhZ2UsIGFrYSB7QGxpbmsgWG1sTGFuZ3VhZ2UjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTEFOR1VBR0UgPSAzOTsKLSAgICAvKiogeHM6SUQsIGFrYSB7QGxpbmsgWG1sSUQjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfSUQgPSA0MDsKLSAgICAvKiogeHM6SURSRUYsIGFrYSB7QGxpbmsgWG1sSURSRUYjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfSURSRUYgPSA0MTsKLSAgICAvKiogeHM6SURSRUZTLCBha2Ege0BsaW5rIFhtbElEUkVGUyN0eXBlfSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19JRFJFRlMgPSA0MjsKLSAgICAvKiogeHM6RU5USVRZLCBha2Ege0BsaW5rIFhtbEVOVElUWSN0eXBlfSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19FTlRJVFkgPSA0MzsKLSAgICAvKiogeHM6RU5USVRJRVMsIGFrYSB7QGxpbmsgWG1sRU5USVRJRVMjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfRU5USVRJRVMgPSA0NDsKLSAgICAvKiogeHM6Tk1UT0tFTiwgYWthIHtAbGluayBYbWxOTVRPS0VOI3R5cGV9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX05NVE9LRU4gPSA0NTsKLSAgICAvKiogeHM6Tk1UT0tFTlMsIGFrYSB7QGxpbmsgWG1sTk1UT0tFTlMjdHlwZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTk1UT0tFTlMgPSA0NjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19MQVNUX0JVSUxUSU4gPSA0NjsKLQotICAgIC8qKgotICAgICAqIFRydWUgZm9yIGFueVR5cGUgYW5kIGFueVNpbXBsZVR5cGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNVUlR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgZm9yIHRoZSB0eXBlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSB0aGUgYWJzZW5jZSBvZiBhIGRldGVybWluZWQgdHlwZS4KLSAgICAgKiBYTUwgT2JqZWN0cyB3aG9zZSB0eXBlIGlzTm9UeXBlKCkgYXJlIG5ldmVyIHZhbGlkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTm9UeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTY2hlbWFUeXBlTG9hZGVyIGluIHdoaWNoIHRoaXMgdHlwZSB3YXMgZGVmaW5lZC4KLSAgICAgKiBDb21wbGV4IHR5cGVzIGFyZSBkZWZpbmVkIGFuZCB1c2VkIGluIGV4YWN0bHkgb25lIHNjaGVtYSB0eXBlCi0gICAgICogc3lzdGVtLCBidXQgc2ltcGxlIHR5cGVzIGFyZSBkZWZpbmVkIGluIG9uZSB0eXBlIHN5c3RlbSBhbmQgY2FuCi0gICAgICogYmUgdXNlZCBpbiBhbnkgbnVtYmVyIG9mIHR5cGUgc3lzdGVtcy4gVGhlIG1vc3QgY29tbW9uIGNhc2UgaXMKLSAgICAgKiB0aGUgYnVpbHRpbiB0eXBlcywgd2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIGJ1aWx0aW4gdHlwZSBzeXN0ZW0KLSAgICAgKiBhbmQgdXNlZCBlbHNld2hlcmUuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0VHlwZVN5c3RlbSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlsZW5hbWUgZm9yIHRoZSBYU0QgZmlsZSBmcm9tIHdoaWNoIHRoaXMgdHlwZQotICAgICAqIHdhcyBsb2FkZWQuIEludGVuZGVkIGZvciB1c2Ugd2hlbiBkZWJ1Z2dpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lKCk7Ci0KLSAgICAvKiogVHJ1ZSBpZiB0aGlzIHR5cGUgY2Fubm90IGJlIHVzZWQgZGlyZWN0bHkgaW4gaW5zdGFuY2VzICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdCgpOwotCi0gICAgLyoqIFRydWUgaWYgb3RoZXIgdHlwZXMgY2Fubm90IGV4dGVuZCB0aGlzIHR5cGUgKG9ubHkgZm9yIGNvbXBsZXggdHlwZXMpICovCi0gICAgcHVibGljIGJvb2xlYW4gZmluYWxFeHRlbnNpb24oKTsKLQotICAgIC8qKiBUcnVlIGlmIG90aGVyIHR5cGVzIGNhbm5vdCByZXN0cmljdCB0aGlzIHR5cGUgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5hbFJlc3RyaWN0aW9uKCk7Ci0KLSAgICAvKiogVHJ1ZSBpZiBsaXN0IGRlcml2YXRpb24gb2YgdGhpcyB0eXBlIGlzIHByb2hpYml0ZWQgKG9ubHkgZm9yIHNpbXBsZSB0eXBlcykgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5hbExpc3QoKTsKLQotICAgIC8qKiBUcnVlIGlmIHVuaW9uIGRlcml2YXRpb24gb2YgdGhpcyB0eXBlIGlzIHByb2hpYml0ZWQgKG9ubHkgZm9yIHNpbXBsZSB0eXBlcykgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5hbFVuaW9uKCk7Ci0KLSAgICAvKiogVHJ1ZSBpZiBleHRlbnNpb25zIG9mIHRoaXMgdHlwZSBjYW5ub3QgYmUgc3Vic3RpdHV0ZWQgZm9yIHRoaXMgdHlwZSAqLwotICAgIHB1YmxpYyBib29sZWFuIGJsb2NrRXh0ZW5zaW9uKCk7Ci0KLSAgICAvKiogVHJ1ZSBpZiByZXN0cmljdGlvbnMgb2YgdGhpcyB0eXBlIGNhbm5vdCBiZSBzdWJzdGl0dXRlZCBmb3IgdGhpcyB0eXBlICovCi0gICAgcHVibGljIGJvb2xlYW4gYmxvY2tSZXN0cmljdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB7QGxpbmsgI0VNUFRZX0NPTlRFTlR9LCB7QGxpbmsgI1NJTVBMRV9DT05URU5UfSwge0BsaW5rICNFTEVNRU5UX0NPTlRFTlR9LCBvcgotICAgICAqIHtAbGluayAjTUlYRURfQ09OVEVOVH0gZm9yIGNvbXBsZXggdHlwZXMuIEZvciBub25jb21wbGV4IHR5cGVzLCByZXR1cm5zCi0gICAgICoge0BsaW5rICNOT1RfQ09NUExFWF9UWVBFfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldENvbnRlbnRUeXBlKCk7Ci0gICAgCi0gICAgLyoqIE5vdCBhIGNvbXBsZXggdHlwZS4gIFNlZSB7QGxpbmsgI2dldENvbnRlbnRUeXBlKCl9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9DT01QTEVYX1RZUEUgPSAwOwotICAgIC8qKiBFbXB0eSBjb250ZW50LiAgU2VlIHtAbGluayAjZ2V0Q29udGVudFR5cGUoKX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU1QVFlfQ09OVEVOVCA9IDE7Ci0gICAgLyoqIFNpbXBsZSBjb250ZW50LiAgU2VlIHtAbGluayAjZ2V0Q29udGVudFR5cGUoKX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lNUExFX0NPTlRFTlQgPSAyOwotICAgIC8qKiBFbGVtZW50LW9ubHkgY29udGVudC4gIFNlZSB7QGxpbmsgI2dldENvbnRlbnRUeXBlKCl9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfQ09OVEVOVCA9IDM7Ci0gICAgLyoqIE1peGVkIGNvbnRlbnQuICBTZWUge0BsaW5rICNnZXRDb250ZW50VHlwZSgpfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSVhFRF9DT05URU5UID0gNDsKLQotCi0gICAgLyoqCi0gICAgICogVGhlIGFycmF5IG9mIGlubmVyIChhbm9ueW1vdXMpIHR5cGVzIGRlZmluZWQKLSAgICAgKiB3aXRoaW4gdGhpcyB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlW10gZ2V0QW5vbnltb3VzVHlwZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBTY2hlbWFQcm9wZXJ0eSBjb3JyZXNwb25kaW5nIHRvIGFuIGVsZW1lbnQgd2l0aGluIHRoaXMKLSAgICAgKiBjb21wbGV4IHR5cGUgYnkgbG9va2luZyB1cCB0aGUgZWxlbWVudCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFQcm9wZXJ0eSBnZXRFbGVtZW50UHJvcGVydHkoUU5hbWUgZWx0TmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCB0aGUgU2NoZW1hUHJvcGVydGllcyBjb3JyZXNwb25kaW5nIHRvIGVsZW1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFQcm9wZXJ0eVtdIGdldEVsZW1lbnRQcm9wZXJ0aWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU2NoZW1hUHJvcGVydHkgY29ycmVzcG9uZGluZyB0byBhbiBhdHRyaWJ1dGUgd2l0aGluIHRoaXMKLSAgICAgKiBjb21wbGV4IHR5cGUgYnkgbG9va2luZyB1cCB0aGUgYXR0cmlidXRlIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVByb3BlcnR5IGdldEF0dHJpYnV0ZVByb3BlcnR5KFFOYW1lIGF0dHJOYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIHRoZSBTY2hlbWFQcm9wZXJ0aWVzIGNvcnJlc3BvbmRpbmcgdG8gYXR0cmlidXRlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hUHJvcGVydHlbXSBnZXRBdHRyaWJ1dGVQcm9wZXJ0aWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCB0aGUgU2NoZW1hUHJvcGVydGllcyB3aXRoaW4gdGhpcyBjb21wbGV4IHR5cGUsCi0gICAgICogZWxlbWVudHMgZm9sbG93ZWQgYnkgYXR0cmlidXRlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hUHJvcGVydHlbXSBnZXRQcm9wZXJ0aWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTY2hlbWFQcm9wZXJ0aWVzIGRlZmluZWQgYnkgdGhpcyBjb21wbGV4IHR5cGUsCi0gICAgICogZXhjbHVzaXZlIG9mIHRoZSBiYXNlIHR5cGUgKGlmIGFueSkuCi0gICAgICovCi0gICAgU2NoZW1hUHJvcGVydHlbXSBnZXREZXJpdmVkUHJvcGVydGllcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXR0cmlidXRlIG1vZGVsIGZvciB0aGlzIGNvbXBsZXggdHlwZSAod2l0aCBzaW1wbGUgb3IgY29tcGxleCBjb250ZW50KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hQXR0cmlidXRlTW9kZWwgZ2V0QXR0cmlidXRlTW9kZWwoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyB0eXBlIHBlcm1pdHMgd2lsZGNhcmQgYXR0cmlidXRlcy4gU2VlIHRoZSBhdHRyaWJ1dGUgbW9kZWwgZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCB3aWxkY2FyZHMgYXJlIGFsbG93ZWQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzQXR0cmlidXRlV2lsZGNhcmRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb21wbGV4IGNvbnRlbnQgbW9kZWwgZm9yIHRoaXMgY29tcGxleCB0eXBlICh3aXRoIGNvbXBsZXggY29udGVudCkuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVBhcnRpY2xlIGdldENvbnRlbnRNb2RlbCgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIHR5cGUgcGVybWl0cyBlbGVtZW50IHdpbGRjYXJkcy4gU2VlIHRoZSBjb250ZW50IG1vZGVsIGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggd2lsZGNhcmRzIGFyZSBhbGxvd2VkLCBhbmQgd2hlcmUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzRWxlbWVudFdpbGRjYXJkcygpOwotCi0gICAgLyoqCi0gICAgICogRm9yIGRvY3VtZW50IHR5cGVzLCB0cnVlIGlmIHRoZSBnaXZlbiBuYW1lIGNhbiBiZSBzdWJzdGl0dXRlZCBmb3IgdGhlCi0gICAgICogZG9jdW1lbnQgZWxlbWVudCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRTdWJzdGl0dXRpb24oUU5hbWUgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSBjb21wbGV4IGNvbnRlbnQgbW9kZWwgZm9yIHRoaXMgY29tcGxleCB0eXBlIGlzIGFuICJhbGwiIGdyb3VwLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc0FsbENvbnRlbnQoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgcGFydGljbGVzIGhhdmUgc2FtZSBkZWZhdWx0cywgbmlsbGFiaWxpdHksIGV0YywgdGhhdCBhcmUKLSAgICAgKiBpbnZhcmlhbnQgd2hlbiBvcmRlciBjaGFuZ2VzLiBDb21wdXRlZCBvbmx5IGZvciBKYXZhaXplZCB0eXBlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc09yZGVyU2Vuc2l0aXZlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIGEgY2hpbGQgZWxlbWVudCBiYXNlZCBvbiB0aGUgZWxlbWVudCBuYW1lIGFuZAotICAgICAqIGFuIHhzaTp0eXBlIGF0dHJpYnV0ZSAoYW5kIHRoZSB0eXBlIHN5c3RlbSB3aXRoaW4gd2hpY2ggbmFtZXMgYXJlCi0gICAgICogcmVzb2x2ZWQpLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlIGdldEVsZW1lbnRUeXBlKFFOYW1lIGVsdE5hbWUsIFFOYW1lIHhzaVR5cGUsIFNjaGVtYVR5cGVMb2FkZXIgd2lsZGNhcmRUeXBlTG9hZGVyKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgYW4gYXR0cmlidXRlIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGUgbmFtZSBhbmQKLSAgICAgKiB0aGUgdHlwZSBzeXN0ZW0gd2l0aGluIHdoaWNoICh3aWxkY2FyZCkgbmFtZXMgYXJlIHJlc29sdmVkLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlIGdldEF0dHJpYnV0ZVR5cGUoUU5hbWUgZWx0TmFtZSwgU2NoZW1hVHlwZUxvYWRlciB3aWxkY2FyZFR5cGVMb2FkZXIpOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogU0lNUExFIFRZUEUgTU9ERUwgQkVMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiogeHM6bGVuZ3RoIGZhY2V0ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDRVRfTEVOR1RIID0gMDsKLSAgICAvKiogeHM6bWluTGVuZ3RoIGZhY2V0ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDRVRfTUlOX0xFTkdUSCA9IDE7Ci0gICAgLyoqIHhzOm1heExlbmd0aCBmYWNldCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX01BWF9MRU5HVEggPSAyOwotICAgIC8qKiB4czptaW5FeGNsdXNpdmUgZmFjZXQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9NSU5fRVhDTFVTSVZFID0gMzsKLSAgICAvKiogeHM6bWluSW5jbHVzaXZlIGZhY2V0ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDRVRfTUlOX0lOQ0xVU0lWRSA9IDQ7Ci0gICAgLyoqIHhzOm1heEluY2x1c2l2ZSBmYWNldCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX01BWF9JTkNMVVNJVkUgPSA1OwotICAgIC8qKiB4czptYXhFeGNsdXNpdmUgZmFjZXQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9NQVhfRVhDTFVTSVZFID0gNjsKLSAgICAvKiogeHM6dG90YWxEaWdpdHMgZmFjZXQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9UT1RBTF9ESUdJVFMgPSA3OwotICAgIC8qKiB4czpmcmFjdGlvbkRpZ2l0cyBmYWNldCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX0ZSQUNUSU9OX0RJR0lUUyA9IDg7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVNUX0JBU0lDX0ZBQ0VUID0gODsKLQotICAgIC8qKiB4czp3aGl0ZVNwYWNlIGZhY2V0IC0gdXNlIHtAbGluayAjZ2V0V2hpdGVTcGFjZVJ1bGV9IGluc3RlYWQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9XSElURV9TUEFDRSA9IDk7Ci0gICAgLyoqIHhzOnBhdHRlcm4gZmFjZXQgLSB1c2Uge0BsaW5rICNtYXRjaFBhdHRlcm5GYWNldH0gaW5zdGVhZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX1BBVFRFUk4gPSAxMDsKLSAgICAvKiogeHM6ZW51bWVyYXRpb24gZmFjZXQgLSB1c2Uge0BsaW5rICNnZXRFbnVtZXJhdGlvblZhbHVlc30gaW5zdGVhZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX0VOVU1FUkFUSU9OID0gMTE7Ci0KLSAgICAvKiogVGhlIGxhc3Qgb3JkaW5hcnkgZmFjZXQgY29kZSAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVNUX0ZBQ0VUID0gMTE7Ci0gICAgCi0gICAgLyoqIEBzZWUgI29yZGVyZWQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PUkRFUkVEID0gMTI7Ci0gICAgLyoqIEBzZWUgI2lzQm91bmRlZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0JPVU5ERUQgPSAxMzsKLSAgICAvKiogQHNlZSAjaXNGaW5pdGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9DQVJESU5BTElUWSA9IDE0OwotICAgIC8qKiBAc2VlICNpc051bWVyaWMgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9OVU1FUklDID0gMTU7Ci0gICAgCi0gICAgLyoqIFRoZSBsYXN0IHByb3BlcnR5IGNvZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVNUX1BST1BFUlRZID0gMTU7Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmYWNldCwgb3IgbnVsbCBpZgotICAgICAqIG5vbmUgaXMgc2V0LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBYbWxBbnlTaW1wbGVUeXBlIGdldEZhY2V0KGludCBmYWNldENvZGUpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgZ2l2ZW4gZmFjZXQgaXMgZml4ZWQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNGYWNldEZpeGVkKGludCBmYWNldENvZGUpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiBvcmRlcmVkLiAgUmV0dXJucyBlaXRoZXIge0BsaW5rICNVTk9SREVSRUR9LAotICAgICAqIHtAbGluayAjUEFSVElBTF9PUkRFUn0sIG9yIHtAbGluayAjVE9UQUxfT1JERVJ9LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgb3JkZXJlZCgpOwotCi0gICAgLyoqIFVub3JkZXJlZC4gU2VlIHtAbGluayAjb3JkZXJlZH0uICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgVU5PUkRFUkVEID0gMDsKLSAgICAvKiogUGFydGlhbGx5IG9yZGVyZWQuIFNlZSB7QGxpbmsgI29yZGVyZWR9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IFBBUlRJQUxfT1JERVIgPSAxOwotICAgIC8qKiBUb3RhbGx5IG9yZGVyZWQuIFNlZSB7QGxpbmsgI29yZGVyZWR9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IFRPVEFMX09SREVSID0gMjsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgYm91bmRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0JvdW5kZWQoKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgZmluaXRlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRmluaXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIG51bWVyaWMuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNOdW1lcmljKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZXJlIGFyZSByZWdleCBwYXR0ZXJuIGZhY2VudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNQYXR0ZXJuRmFjZXQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRQYXR0ZXJucygpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RyaW5nIG1hdGNoZXMgdGhlIHBhdHRlcm4gZmFjZXRzLgotICAgICAqIEFsd2F5cyB0cnVlIGlmIHRoZXJlIGFyZSBubyBwYXR0ZXJuIGZhY2V0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBtYXRjaFBhdHRlcm5GYWNldChTdHJpbmcgcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiB2YWxpZCBvYmplY3RzIGZyb20gdGhlCi0gICAgICogZW51bWVyYXRpb24gZmFjZXQsIG51bGwgaWYgbm8gZW51bWVyYXRpb24gZGVmaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgWG1sQW55U2ltcGxlVHlwZVtdIGdldEVudW1lcmF0aW9uVmFsdWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgaXMgYSBzdHJpbmcgZW51bSB3aGVyZSBhbiBpbnRlZ2VyCi0gICAgICogaXMgYXNzaWduZWQgdG8gZWFjaCBlbnVtZXJhdGVkIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1N0cmluZ0VudW1WYWx1ZXMoKTsKLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgaXMgYSBzdHJpbmcgZW51bWVyYXRpb24sIHJldHVybnMgdGhlIG1vc3QgYmFzaWMgYmFzZSBzY2hlbWEKLSAgICAgKiB0eXBlIHRoYXQgdGhpcyBlbnVlbXJhdGlvbiBpcyBiYXNlZCBvbi4gT3RoZXJ3aXNlIHJldHVybnMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hVHlwZSBnZXRCYXNlRW51bVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIFNjaGVtYVN0cmluZ0VudW1FbnRyaWVzIGZvciB0aGlzIHR5cGU6IHRoaXMKLSAgICAgKiBhcnJheSBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgamF2YSBjb25zdGFudCBuYW1lcyB1c2VkIGZvcgotICAgICAqIGVhY2ggc3RyaW5nIGVudW0gZW50cnkuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYVN0cmluZ0VudW1FbnRyeVtdIGdldFN0cmluZ0VudW1FbnRyaWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZW51bSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBlbnVtZXJhdGVkCi0gICAgICogc3RyaW5nLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIG1hdGNoIG9yIHRoaXMgdHlwZSBpcyBub3QKLSAgICAgKiBhIHN0cmluZyBlbnVtZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hU3RyaW5nRW51bUVudHJ5IGVudW1FbnRyeUZvclN0cmluZyhTdHJpbmcgcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZW51bSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBlbnVtZXJhdGVkCi0gICAgICogc3RyaW5nLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIG1hdGNoIG9yIHRoaXMgdHlwZSBpcyBub3QKLSAgICAgKiBhIHN0cmluZyBlbnVtZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBlbnVtRm9yU3RyaW5nKFN0cmluZyBzKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyBlbnVtIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGVudW1lcmF0ZWQKLSAgICAgKiBzdHJpbmcsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gbWF0Y2ggb3IgdGhpcyB0eXBlIGlzIG5vdAotICAgICAqIGEgc3RyaW5nIGVudW1lcmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1Gb3JJbnQoaW50IGkpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBmb3IgYW55IG9mIHRoZSAyMCBwcmltaXRpdmUgdHlwZXMgKHBsdXMgYW55U2ltcGxlVHlwZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1ByaW1pdGl2ZVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgc2ltcGxlIHR5cGUgaXMgQVRPTUlDLCBVTklPTiwgb3IgTElTVC4KLSAgICAgKiBSZXR1cm5zIHtAbGluayAjTk9UX1NJTVBMRX0sIHtAbGluayAjQVRPTUlDfSwge0BsaW5rICNVTklPTn0sCi0gICAgICogb3Ige0BsaW5rICNMSVNUfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFNpbXBsZVZhcmlldHkoKTsKLSAgICAKLSAgICAvKiogTm90IGEgc2ltcGxlIHR5cGUgb3Igc2ltcGxlIGNvbnRlbnQuIFNlZSB7QGxpbmsgI2dldFNpbXBsZVZhcmlldHl9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9TSU1QTEUgPSAwOwotICAgIC8qKiBBdG9taWMgdHlwZS4gIFNlZSB7QGxpbmsgI2dldFNpbXBsZVZhcmlldHl9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRPTUlDID0gMTsKLSAgICAvKiogVW5pb24gdHlwZS4gIFNlZSB7QGxpbmsgI2dldFNpbXBsZVZhcmlldHl9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5JT04gPSAyOwotICAgIC8qKiBTaW1wbGUgbGlzdCB0eXBlLiAgU2VlIHtAbGluayAjZ2V0U2ltcGxlVmFyaWV0eX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVNUID0gMzsKLQotCi0gICAgLyoqCi0gICAgICogRm9yIGF0b21pYyB0eXBlcyBvbmx5OiBnZXQgdGhlIHByaW1pdGl2ZSB0eXBlIHVuZGVybHlpbmcgdGhpcyBvbmUuCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyBudWxsIGlmIHRoaXMgaXMgbm90IGFuIGF0b21pYyB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlIGdldFByaW1pdGl2ZVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIEZvciBhdG9taWMgbnVtZXJpYyByZXN0cmljdGlvbnMgb2YgZGVjaW1hbCBvbmx5OiB0aGUKLSAgICAgKiBudW1lcmljIHNpemUgY2F0ZWdvcnkuIFRha2VzIGludG8gYWNjb3VudCBtaW4gYW5kIG1heAotICAgICAqIHJlc3RyaWN0aW9ucyBhcyB3ZWxsIGFzIHRvdGFsRGlnaXRzIGFuZCBmcmFjdGlvbkRpZ2l0cwotICAgICAqIGZhY2V0cy4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIGVpdGhlciB7QGxpbmsgI05PVF9ERUNJTUFMfSwKLSAgICAgKiB7QGxpbmsgI1NJWkVfQllURX0sIHtAbGluayAjU0laRV9TSE9SVH0sIHtAbGluayAjU0laRV9JTlR9LAotICAgICAqIHtAbGluayAjU0laRV9MT05HfSwge0BsaW5rICNTSVpFX0JJR19JTlRFR0VSfSwgb3IKLSAgICAgKiB7QGxpbmsgI1NJWkVfQklHX0RFQ0lNQUx9LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RGVjaW1hbFNpemUoKTsKLQotICAgIC8qKiBOb3QgYSBkZWNpbWFsIHJlc3RyaWN0aW9uLiBTZWUge0BsaW5rICNnZXREZWNpbWFsU2l6ZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0RFQ0lNQUwgPSAwOwotICAgIC8qKiBGaXRzIGluIGEgYnl0ZS4gU2VlIHtAbGluayAjZ2V0RGVjaW1hbFNpemV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfQllURSA9IDg7Ci0gICAgLyoqIEZpdHMgaW4gYSBzaG9ydC4gU2VlIHtAbGluayAjZ2V0RGVjaW1hbFNpemV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfU0hPUlQgPSAxNjsKLSAgICAvKiogRml0cyBpbiBhbiBpbnQuIFNlZSB7QGxpbmsgI2dldERlY2ltYWxTaXplfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFX0lOVCA9IDMyOwotICAgIC8qKiBGaXRzIGluIGEgbG9uZy4gU2VlIHtAbGluayAjZ2V0RGVjaW1hbFNpemV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfTE9ORyA9IDY0OwotICAgIC8qKiBGaXRzIGluIGEge0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyfS4gU2VlIHtAbGluayAjZ2V0RGVjaW1hbFNpemV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfQklHX0lOVEVHRVIgPSAxMDAwMDAwOyAvLyAibWlsbGlvbnMiCi0gICAgLyoqIEZpdHMgaW4gYSB7QGxpbmsgamF2YS5tYXRoLkJpZ0RlY2ltYWx9LiBTZWUge0BsaW5rICNnZXREZWNpbWFsU2l6ZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9CSUdfREVDSU1BTCA9IDEwMDAwMDE7IC8vICJldmVuIG1vcmUiCi0KLSAgICAvKioKLSAgICAgKiBGb3IgdW5pb24gdHlwZXMgb25seTogZ2V0IHRoZSBzaGFsbG93IG1lbWJlciB0eXBlcy4gVGhpcwotICAgICAqIHJldHVybnMgdGhlIGRlY2xhcmVkIG1lbWJlciB0eXBlcyBvZiB0aGUgdW5pb24sIHNvLCBmb3IKLSAgICAgKiBleGFtcGxlIGlmIHRoZSB0eXBlIGNvbnRhaW5zIGFub3RoZXIgdW5pb24sIHRoZSBuZXN0ZWQKLSAgICAgKiBtZW1iZXJzIG9mIHRoYXQgdW5pb24gYXJlIE5PVCByZXR1cm5lZCBoZXJlLgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGlzIHR5cGUgaXMgbm90IGEgdW5pb24uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVR5cGVbXSBnZXRVbmlvbk1lbWJlclR5cGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgdW5pb24gdHlwZXMgb25seTogZ2V0cyB0aGUgZnVsbCB0cmVlIG9mIG1lbWJlciB0eXBlcy4KLSAgICAgKiBUaGlzIGNvbXB1dGVzIHRoZSBjbG9zdXJlIG9mIHRoZSBzZXQgcmV0dXJuZWQgYnkKLSAgICAgKiBnZXRVbmlvbk1lbWJlclR5cGVzKCksIHNvLCBmb3IgZXhhbXBsZSwgaXQgcmV0dXJucwotICAgICAqIGFsbCB0aGUgdHlwZXMgbmVzdGVkIHdpdGhpbiB1bmlvbnMgb2YgdW5pb25zIGFzIHdlbGwKLSAgICAgKiBhcyB0aGUgdG9wLWxldmVsIG1lbWJlcnM7IHRoZSBzZXQgYWxzbyBpbmNsdWRlcyB0aGUKLSAgICAgKiB0eXBlIGl0c2VsZi4gSWYgeW91IGFyZSBzZWVraW5nIG9ubHkgdGhlIGJhc2ljCi0gICAgICogbm9uLXVuaW9uIGNvbnNpdHVlbnRzLCB1c2UgZ2V0VW5pb25Db25zdGl0dWVudFR5cGVzLgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGlzIHR5cGUgaXMgbm90IGEgdW5pb24uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVR5cGVbXSBnZXRVbmlvblN1YlR5cGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgdW5pb24gdHlwZXMgb25seTogZ2V0IHRoZSBjb25zdGl0dWVudCBtZW1iZXIgdHlwZXMuIFRoaXMKLSAgICAgKiByZXR1cm5zIG9ubHkgbm9uLXVuaW9uIHR5cGVzLCBzbywgZm9yIGV4YW1wbGUsIGZvciB1bmlvbnMgb2YKLSAgICAgKiB1bmlvbnMsIHRoaXMgcmV0dXJucyB0aGUgZmxhdHRlbmVkIGxpc3Qgb2YgaW5kaXZpZHVhbCBtZW1iZXIKLSAgICAgKiB0eXBlcyB3aXRoaW4gdGhlIGlubmVybW9zdCB1bmlvbnMuCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyBudWxsIGlmIHRoaXMgdHlwZSBpcyBub3QgYSB1bmlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hVHlwZVtdIGdldFVuaW9uQ29uc3RpdHVlbnRUeXBlcygpOwotCi0gICAgLyoqCi0gICAgICogRm9yIHVuaW9uIHR5cGVzIG9ubHk6IGdldCB0aGUgbW9zdCBzcGVjaWZpYyBjb21tb24gYmFzZQotICAgICAqIHR5cGUgb2YgdGhlIGNvbnN0aXR1ZW50IG1lbWJlciB0eXBlcy4gTWF5IHJldHVybiBhIFVSIHR5cGUuCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyBudWxsIGlmIHRoaXMgdHlwZSBpcyBub3QgYSB1bmlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hVHlwZSBnZXRVbmlvbkNvbW1vbkJhc2VUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgYW5vbnltb3VzIHR5cGVzIGRlZmluZWQgaW5zaWRlIGEgdW5pb24gb25seTogZ2V0cwotICAgICAqIHRoZSBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIGRlY2xhcmF0aW9uIG9yZGVyIG9mIHRoaXMKLSAgICAgKiB0eXBlIHdpdGhpbiB0aGUgb3V0ZXIgdW5pb24gdHlwZSwgb3IgemVybyBpZiB0aGlzIGlzCi0gICAgICogbm90IGFwcGxpY2FibGUuIFRoZSBmaXJzdCBhbm9ueW1vdXMgdW5pb24gbWVtYmVyIHdpdGhpbgotICAgICAqIGEgdW5pb24gdHlwZSBpcyBudW1iZXJlZCAiMSIuIFVzZWQgdG8gZGlmZmVyZW50aWF0ZQotICAgICAqIGJldHdlZW4gZGlmZmVyZW50IGFub255bW91cyB0eXBlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEFub255bW91c1VuaW9uTWVtYmVyT3JkaW5hbCgpOwotCi0gICAgLyoqCi0gICAgICogRm9yIGxpc3QgdHlwZXMgb25seTogZ2V0IHRoZSBpdGVtIHR5cGUuIFRoaXMgaXMgdGhlIGF0b21pYwotICAgICAqIG9yIHVuaW9uIHR5cGUgdGhhdCBpcyB0aGUgdHlwZSBvZiBldmVyeSBlbnRyeSBpbiB0aGUgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhpcyB0eXBlIGlzIG5vdCBhIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVR5cGUgZ2V0TGlzdEl0ZW1UeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3Igbm9udW5pb24gc2ltcGxlIHR5cGVzOiBnZXQgdGhlIHdoaXRlc3BhY2UgcnVsZS4gVGhpcyBpcwotICAgICAqIGVpdGhlciB7QGxpbmsgI1dTX1BSRVNFUlZFfSwge0BsaW5rICNXU19SRVBMQUNFfSwgb3IKLSAgICAgKiB7QGxpbmsgI1dTX0NPTExBUFNFfS4gUmV0dXJucyB7QGxpbmsgI1dTX1VOU1BFQ0lGSUVEfQotICAgICAqIGZvciB1bmlvbnMgYW5kIGNvbXBsZXggdHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGludCBnZXRXaGl0ZVNwYWNlUnVsZSgpOwotCi0gICAgLyoqIFdoaXRlc3BhY2UgcnVsZSB1bnNwZWNpZmllZC4gIFNlZSB7QGxpbmsgI2dldFdoaXRlU3BhY2VSdWxlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXU19VTlNQRUNJRklFRCA9IDA7Ci0gICAgLyoqIFdoaXRlc3BhY2UgcHJlc2VydmVkLiAgU2VlIHtAbGluayAjZ2V0V2hpdGVTcGFjZVJ1bGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdTX1BSRVNFUlZFID0gMTsKLSAgICAvKiogV2hpdGVzcGFjZSByZXBsYWNlZCBieSBvcmRpbmFyeSBzcGFjZS4gIFNlZSB7QGxpbmsgI2dldFdoaXRlU3BhY2VSdWxlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXU19SRVBMQUNFID0gMjsKLSAgICAvKiogV2hpdGVzcGFjZSBjb2xsYXBzZWQgYW5kIHRyaW1tZWQuICBTZWUge0BsaW5rICNnZXRXaGl0ZVNwYWNlUnVsZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1NfQ09MTEFQU0UgPSAzOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbW11dGFibGUgc2ltcGxlIHR5cGUgdmFsdWUgdGhhdCBkb2VzIG5vdCByZXNpZGUgaW4gYSB0cmVlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBYbWxBbnlTaW1wbGVUeXBlIG5ld1ZhbHVlKE9iamVjdCB2KTsKLSAgICAKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gYWxsb3cgb24tZGVtYW5kIGxvYWRpbmcgb2YgdHlwZXMuCi0gICAgICogCi0gICAgICogQGV4Y2x1ZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIFJlZiBleHRlbmRzIFNjaGVtYUNvbXBvbmVudC5SZWYKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hVHlwZSB0eXBlKQotICAgICAgICAgICAgeyBzdXBlcih0eXBlKTsgfQotCi0gICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0sIFN0cmluZyBoYW5kbGUpCi0gICAgICAgICAgICB7IHN1cGVyKHN5c3RlbSwgaGFuZGxlKTsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCi0gICAgICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuVFlQRTsgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTY2hlbWFUeXBlIGdldCgpCi0gICAgICAgICAgICB7IHJldHVybiAoU2NoZW1hVHlwZSlnZXRDb21wb25lbnQoKTsgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJ1bnMgYSBTY2hlbWFUeXBlLlJlZiBwb2ludGluZyB0byB0aGlzIHNjaGVtYSB0eXBlIGl0c2VsZi4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVmIGdldFJlZigpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGVMb2FkZXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFUeXBlTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlN2IwNTkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGVMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHNlYXJjaGFibGUgc2V0IG9mIFhNTCBTY2hlbWEgY29tcG9uZW50IGRlZmluaXRpb25zLgotICogPHA+Ci0gKiBTY2hlbWFUeXBlTG9hZGVyIGlzIHNvbWV3aGF0IGFuYWxvZ291cyB0byB7QGxpbmsgamF2YS5sYW5nLkNsYXNzTG9hZGVyfSwKLSAqIGJlY2F1c2UgaXQgaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcge0BsaW5rIFNjaGVtYUNvbXBvbmVudH0gZGVmaW5pdGlvbnMKLSAqIGJ5IG5hbWUsIHlldCBpdCBpcyBub3QgcmVzcG9uc2libGUgZm9yIGJlaW5nIGFibGUgdG8gZW51bWVyYXRlIGFsbCB0aGUKLSAqIGNvbXBvbmVudCBkZWZpbml0b25zIGF2YWlsYWJsZS4gKElmIHlvdSB3aXNoIHRvIGVudW1lcmF0ZSBjb21wb25lbnQKLSAqIGRlZmluaXRpb25zLCBzZWUge0BsaW5rIFNjaGVtYVR5cGVTeXN0ZW19LikgVGhlcmUgYXJlIHNvbWUgd2F5cyBpbiB3aGljaAotICogU2NoZW1hVHlwZVN5c3RlbXMgYXJlIGRpc3NpbWlsYXIgZnJvbSBDbGFzc0xvYWRlcnMsIGhvd2V2ZXIuCi0gKiBTaW5jZSBYTUwgU2NoZW1hIGhhcyBhIG51bWJlciBvZiBpbnN0YW5jZS1vcmllbnRlZCB0eXBpbmcgbWVjaGFuaXNtcwotICogKHN1Y2ggYXMgd2lsZGNhcmRzKSB0aGF0IGRvIG5vdCBleGlzdCBpbiBKYXZhLCBhIFNjaGVtYVR5cGVMb2FkZXIgaXMKLSAqIG5vdCBhc3NvY2lhdGVkIHdpdGggYSB0eXBlOyBpbnN0ZWFkLCBhIFNjaGVtYVR5cGVMb2FkZXIgaXMgYXNzb2NpYXRlZAotICogd2l0aCBlYWNoIFhNTCBpbnN0YW5jZS4KLSAqIDxwPgotICogRXZlcnkgWE1MIGluc3RhbmNlIGlzIGxvYWRlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYSBTY2hlbWFUeXBlTG9hZGVyOwotICogdGhlIFNjaGVtYVR5cGVMb2FkZXIgZm9yIGFuIGluc3RhbmNlIGlzIHVzZWQgdG8gcmVzb2x2ZSBhbGwgdHlwZSBkZWZpbml0aW9ucwotICogd2l0aGluIHRoZSBpbnN0YW5jZSBhbmQgZm9yIGFwcGx5aW5nIHR5cGUtc2Vuc2l0aXZlIG1ldGhvZHMgc3VjaCBhcwotICoge0BsaW5rIFhtbE9iamVjdCN2YWxpZGF0ZX0uCi0gKiA8cD4KLSAqIE5vcm1hbGx5IHRoZSBTY2hlbWFUeXBlTG9hZGVyIGJlaW5nIHVzZWQgZm9yIGFsbCBpbnN0YW5jZXMgaXMgdGhlCi0gKiBjb250ZXh0IHR5cGUgbG9hZGVyICh0aGF0IGlzLCB0aGUgU2NoZW1hVHlwZUxvYWRlciByZXR1cm5lZCBmcm9tCi0gKiB7QGxpbmsgWG1sQmVhbnMjZ2V0Q29udGV4dFR5cGVMb2FkZXIoKX0pLiAgVGhlIGNvbnRleHQgdHlwZSBsb2FkZXIKLSAqIGNvbnN1bHRzIHRoZSB0aHJlYWQncyBjb250ZXh0IENsYXNzTG9hZGVyIChzZWUge0BsaW5rIFRocmVhZCNnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKX0pCi0gKiB0byBmaW5kIHNjaGVtYSB0eXBlIGRlZmludGlvbnMgdGhhdCBhcmUgYXZhaWxhYmxlIG9uIHRoZSBjbGFzc3BhdGguCi0gKiBUaGUgbmV0IHJlc3VsdCBpcyB0aGF0IHlvdSBjYW4gdXNlIHNjaGVtYSB0eXBlcyBzaW1wbHkgYnkgcHV0dGluZwotICogdGhlaXIgY29tcGlsZWQgc2NoZW1hIEpBUnMgb24geW91ciBjbGFzc3BhdGguCi0gKiBJZiB5b3Ugd2lzaCB0byBsb2FkIGluc3RhbmNlcyB1c2luZyBhIGRpZmZlcmVudCBTY2hlbWFUeXBlTG9hZGVyLCB0aGVuIHlvdSBtdXN0Ci0gKiBjYWxsIHtAbGluayAjcGFyc2V9IG1ldGhvZHMgb24gdGhlIFNjaGVtYVR5cGVMb2FkZXIgaW5zdGFuY2UgZXhwbGljaXRseQotICogcmF0aGVyIHRoYW4gdXNpbmcgdGhlIG5vcm1hbCBjb252ZW5pZW50IEZhY3RvcnkgbWV0aG9kcy4KLSAqIDxwPgotICogQSBTY2hlbWFUeXBlTG9hZGVyIGNhbiBiZSBvYnRhaW5lZCBieSBkeW5hbWljYWxseSBsb2FkaW5nIFhTRCBmaWxlcwotICogdXNpbmcge0BsaW5rIFhtbEJlYW5zI2xvYWRYc2R9LCBvciBieSBhc3NlbWJsaW5nIG90aGVyIFNjaGVtYVR5cGVMb2FkZXJzCi0gKiBvciBTY2hlbWFUeXBlU3lzdGVtcyBvbiBhIHBhdGggdXNpbmcge0BsaW5rIFhtbEJlYW5zI3R5cGVMb2FkZXJVbmlvbn0uCi0gKiAKLSAqIEBzZWUgWG1sQmVhbnMjbG9hZFhzZAotICogQHNlZSBYbWxCZWFucyNnZXRDb250ZXh0VHlwZUxvYWRlcgotICogQHNlZSBYbWxCZWFucyN0eXBlTG9hZGVyVW5pb24KLSAqIEBzZWUgU2NoZW1hVHlwZVN5c3RlbQotICovIAotcHVibGljIGludGVyZmFjZSBTY2hlbWFUeXBlTG9hZGVyCi17Ci0gICAgLyoqIFJldHVybnMgdGhlIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgbnVsbCBpZiBub25lLiAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGZpbmRUeXBlKFFOYW1lIG5hbWUpOwotCi0gICAgLyoqIFJldHVybnMgdGhlIGRvY3VtZW50IHR5cGUgcm9vdGVkIGF0IHRoZSBnaXZlbiBlbGVtZW50IG5hbWUsIG9yIG51bGwgaWYgbm9uZS4gKi8KLSAgICBwdWJsaWMgU2NoZW1hVHlwZSBmaW5kRG9jdW1lbnRUeXBlKFFOYW1lIG5hbWUpOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdHlwZSBjb250YWluaW5nIHRoZSBnaXZlbiBhdHRyaWJ1dGUgbmFtZSwgb3IgbnVsbCBpZiBub25lLiAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlIGZpbmRBdHRyaWJ1dGVUeXBlKFFOYW1lIG5hbWUpOwotCi0gICAgLyoqIFJldHVybnMgdGhlIGdsb2JhbCBlbGVtZW50IGRlZmludGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBudWxsIGlmIG5vbmUuICovCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEVsZW1lbnQgZmluZEVsZW1lbnQoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgZ2xvYmFsIGF0dHJpYnV0ZSBkZWZpbnRpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgbnVsbCBpZiBub25lLiAqLwotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgZmluZEF0dHJpYnV0ZShRTmFtZSBuYW1lKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGUgbW9kZWwgZ3JvdXAgZGVmaW50aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIG51bGwgaWYgbm9uZS4gKi8KLSAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cCBmaW5kTW9kZWxHcm91cChRTmFtZSBuYW1lKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGUgYXR0cmlidXRlIGdyb3VwIGRlZmludGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBudWxsIGlmIG5vbmUuICovCi0gICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZUdyb3VwIGZpbmRBdHRyaWJ1dGVHcm91cChRTmFtZSBuYW1lKTsKLQotICAgIC8qKiBUcnVlIGlmIHRoZSB0eXBlbG9hZGVyIGNvbnRhaW5zIGFueSBkZWZpbml0aW9ucyBpbiB0aGUgZ2l2ZW4gbmFtZXNwYWNlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTmFtZXNwYWNlRGVmaW5lZChTdHJpbmcgbmFtZXNwYWNlKTsKLQotICAgIC8qKiBVc2VkIGZvciBvbi1kZW1hbmQgbG9hZGluZy4gKi8KLSAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZmluZFR5cGVSZWYoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKiogVXNlZCBmb3Igb24tZGVtYW5kIGxvYWRpbmcuICovCi0gICAgcHVibGljIFNjaGVtYVR5cGUuUmVmIGZpbmREb2N1bWVudFR5cGVSZWYoUU5hbWUgbmFtZSk7Ci0gICAgCi0gICAgLyoqIFVzZWQgZm9yIG9uLWRlbWFuZCBsb2FkaW5nLiAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlLlJlZiBmaW5kQXR0cmlidXRlVHlwZVJlZihRTmFtZSBuYW1lKTsKLQotICAgIC8qKiBVc2VkIGZvciBvbi1kZW1hbmQgbG9hZGluZy4gKi8KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYgZmluZEVsZW1lbnRSZWYoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKiogVXNlZCBmb3Igb24tZGVtYW5kIGxvYWRpbmcuICovCi0gICAgcHVibGljIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZS5SZWYgZmluZEF0dHJpYnV0ZVJlZihRTmFtZSBuYW1lKTsKLSAgICAKLSAgICAvKiogVXNlZCBmb3Igb24tZGVtYW5kIGxvYWRpbmcuICovCi0gICAgcHVibGljIFNjaGVtYU1vZGVsR3JvdXAuUmVmIGZpbmRNb2RlbEdyb3VwUmVmKFFOYW1lIG5hbWUpOwotICAgIAotICAgIC8qKiBVc2VkIGZvciBvbi1kZW1hbmQgbG9hZGluZy4gKi8KLSAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlR3JvdXAuUmVmIGZpbmRBdHRyaWJ1dGVHcm91cFJlZihRTmFtZSBuYW1lKTsKLQotICAgIC8qKiBVc2VkIGZvciBvbi1kZW1hbmQgbG9hZGluZy4gKi8KLSAgICBwdWJsaWMgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZiBmaW5kSWRlbnRpdHlDb25zdHJhaW50UmVmKFFOYW1lIG5hbWUpOwotCi0gICAgLyoqIEZpbmRzIGEgdHlwZSBmb3IgYSBnaXZlbiBzaWduYXR1cmUgc3RyaW5nICovCi0gICAgcHVibGljIFNjaGVtYVR5cGUgdHlwZUZvclNpZ25hdHVyZShTdHJpbmcgc2lnbmF0dXJlKTsKLQotICAgIC8qKiBGaW5kcyBhIHR5cGUgZm9yIGEgZ2l2ZW4gZnVsbHktcXVhbGlmaWVkIFhNTCBCZWFuIGNsYXNzbmFtZSAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHR5cGVGb3JDbGFzc25hbWUoU3RyaW5nIGNsYXNzbmFtZSk7Ci0KLSAgICAvKiogTG9hZHMgb3JpZ2luYWwgWFNEIHNvdXJjZSBhcyBhIHN0cmVhbS4gIFNlZSB7QGxpbmsgU2NoZW1hVHlwZSNnZXRTb3VyY2VOYW1lfS4gKi8KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0U291cmNlQXNTdHJlYW0oU3RyaW5nIHNvdXJjZU5hbWUpOwotICAgIAotICAgIC8qKiBDb21waWxlcyBhbiBYUGF0aCAqLwotICAgIHB1YmxpYyBTdHJpbmcgY29tcGlsZVBhdGgoU3RyaW5nIHBhdGhFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBYbWxFeGNlcHRpb247Ci0KLSAgICAvKiogQ29tcGlsZXMgYW4gWFF1ZXJ5ICovCi0gICAgcHVibGljIFN0cmluZyBjb21waWxlUXVlcnkoU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgWG1sRXhjZXB0aW9uOwotCi0gICAgLyoqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIHR5cGUuICovCi0gICAgcHVibGljIFhtbE9iamVjdCBuZXdJbnN0YW5jZSAoIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICk7Ci0gICAgLyoqIFBhcnNlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gKi8KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggU3RyaW5nIHhtbFRleHQsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbjsKLSAgICAvKiogUGFyc2VzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLiAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBGaWxlIGZpbGUsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0gICAgLyoqIFBhcnNlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gKi8KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggVVJMIGZpbGUsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0gICAgLyoqIFBhcnNlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gKi8KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggSW5wdXRTdHJlYW0gamlvaXMsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0gICAgLyoqIFBhcnNlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gKi8KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggUmVhZGVyIGppb3IsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0gICAgLyoqIFBhcnNlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gKi8KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggTm9kZSBub2RlLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb247Ci0gICAgLyoqIFBhcnNlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gdHlwZS4KLSAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggWE1MSW5wdXRTdHJlYW0geGlzLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLSAgICAvKiogUmV0dXJucyBhbiBYbWxTYXhIYW5kbGVyIHRoYXQgY2FuIHBhcnNlIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLiAqLwotICAgIHB1YmxpYyBYbWxTYXhIYW5kbGVyIG5ld1htbFNheEhhbmRsZXIgKCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApOwotICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbSB0aGF0IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBYTUwgaXMgbm90IHZhbGlkIAotICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MwotICAgICAqLwotICAgIHB1YmxpYyBYTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0gKCBYTUxJbnB1dFN0cmVhbSB4aXMsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNGIyYmQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQW4gZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIGlmIHRoZXJlIGlzIGNvcnJ1cHRpb24gb3IgYSB2ZXJzaW9uIG1pc21hdGNoCi0gKiBpbiBhIGNvbXBpbGVkIHNjaGVtYSB0eXBlIHN5c3RlbS4KLSAqLyAKLXB1YmxpYyBjbGFzcyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uIGV4dGVuZHMgWG1sUnVudGltZUV4Y2VwdGlvbgotewotICAgIHByaXZhdGUgaW50IF9jb2RlOwotICAgIAotICAgIC8qKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLCBmaWxlbmFtZSwgZXh0ZW5zaW9uLCBhbmQgY29kZSAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGhhbmRsZSwgaW50IGNvZGUpCi0gICAgewotICAgICAgICBzdXBlcihtZXNzYWdlICsgIiAoIiArIG5hbWUgKyAiLiIgKyBoYW5kbGUgKyAiKSAtIGNvZGUgIiArIGNvZGUpOwotICAgICAgICBfY29kZSA9IGNvZGU7Ci0gICAgfQotCi0gICAgLyoqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UsIGZpbGVuYW1lLCBleHRlbnNpb24sIGNvZGUsIGFuZCBjYXVzZSAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGhhbmRsZSwgaW50IGNvZGUsIEV4Y2VwdGlvbiBjYXVzZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UgKyAiICgiICsgbmFtZSArICIuIiArIGhhbmRsZSArICIpIC0gY29kZSAiICsgY29kZSk7Ci0gICAgICAgIF9jb2RlID0gY29kZTsKLSAgICAgICAgaW5pdENhdXNlKGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZSwgZ2l2ZW4gYnkgb25lIG9mIHRoZSBudW1lcmljIGNvbnN0YW50cyBpbiB0aGlzIGNsYXNzICovCi0gICAgcHVibGljIGludCBnZXRDb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY29kZTsKLSAgICB9Ci0KLSAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19SRVNPVVJDRSA9IDA7Ci0gICAgLyogU2VlIHtAbGluayAjZ2V0Q29kZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JPTkdfTUFHSUNfQ09PS0lFID0gMTsKLSAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUk9OR19NQUpPUl9WRVJTSU9OID0gMjsKLSAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUk9OR19NSU5PUl9WRVJTSU9OID0gMzsKLSAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUk9OR19GSUxFX1RZUEUgPSA0OwotICAgIC8qIFNlZSB7QGxpbmsgI2dldENvZGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOUkVDT0dOSVpFRF9JTkRFWF9FTlRSWSA9IDU7Ci0gICAgLyogU2VlIHtAbGluayAjZ2V0Q29kZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JPTkdfUFJPUEVSVFlfVFlQRSA9IDY7Ci0gICAgLyogU2VlIHtAbGluayAjZ2V0Q29kZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFMRk9STUVEX0NPTlRFTlRfTU9ERUwgPSA3OwotICAgIC8qIFNlZSB7QGxpbmsgI2dldENvZGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdST05HX1NJTVBMRV9WQVJJRVRZID0gODsKLSAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJT19FWENFUFRJT04gPSA5OwotICAgIC8qIFNlZSB7QGxpbmsgI2dldENvZGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVF9UT09fTEFSR0UgPSAxMDsKLSAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQURfUEFSVElDTEVfVFlQRSA9IDExOwotICAgIC8qIFNlZSB7QGxpbmsgI2dldENvZGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9XUklURUFCTEUgPSAxMjsKLSAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQURfSEFORExFID0gMTM7Ci0gICAgLyogU2VlIHtAbGluayAjZ2V0Q29kZX0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVTVEVEX0VYQ0VQVElPTiA9IDE0OwotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZVN5c3RlbS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGVTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UyMGY1ZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZVN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBBIGZpbml0ZSBzZXQgb2YgWE1MIFNjaGVtYSBjb21wb25lbnQgZGVmaW5pdGlvbnMuCi0gKiA8cD4KLSAqIEV2ZXJ5IHtAbGluayBTY2hlbWFDb21wb25lbnR9IHN1Y2ggYXMgYSB7QGxpbmsgU2NoZW1hVHlwZX0sCi0gKiB7QGxpbmsgU2NoZW1hR2xvYmFsRWxlbWVudH0sIHtAbGluayBTY2hlbWFHbG9iYWxBdHRyaWJ1dGV9LAotICoge0BsaW5rIFNjaGVtYU1vZGVsR3JvdXB9LCB7QGxpbmsgU2NoZW1hQXR0cmlidXRlR3JvdXB9LCBvcgotICoge0BsaW5rIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludH0sIGlzIGRlZmluZWQgaW4gZXhhY3RseSBvbmUKLSAqIFNjaGVtYVR5cGVTeXN0ZW0uICAoU2VlIHtAbGluayBTY2hlbWFDb21wb25lbnQjZ2V0VHlwZVN5c3RlbSgpfS4pCi0gKiBBIHNpbmdsZSBTY2hlbWFUeXBlU3lzdGVtIGNhbiBpbmNsdWRlIGRlZmluaXRpb25zCi0gKiBmcm9tIGFueSBudW1iZXIgb2YgbmFtZXNwYWNlczsgb25lIFNjaGVtYVR5cGVTeXN0ZW0gY29uc2lzdHMgc2ltcGx5Ci0gKiBvZiBhIHNldCBvZiBjb21wb25lbnQgZGVmaW5pdGlvbnMgdGhhdCB3ZXJlIGNvbXBpbGVkIHRvZ2V0aGVyLgotICogPHA+Ci0gKiBTaW5jZSBldmVyeSBjb21wb25lbnQgaXMgZGVmaW5lZCBpbiBhIHNpbmdsZSBTY2hlbWFUeXBlU3lzdGVtLCBubwotICogU2NoZW1hVHlwZVN5c3RlbSBvdGhlciB0aGFuIHtAbGluayBYbWxCZWFucyNnZXRCdWlsdGluVHlwZVN5c3RlbSgpfQotICogaW5jbHVkZXMgYW55IG9mIHRoZSB0aGUgYnVpbHQtaW4gdHlwZXMuICBUaGF0IG1lYW5zCi0gKiB5b3UgY2Fubm90IG9yZGluYXJpbHkgbG9hZCBpbnN0YW5jZXMgdXNpbmcgYSBzaW5nbGUKLSAqIFNjaGVtYVR5cGVTeXN0ZW0gYnkgaXRzZWxmLiBJbnN0ZWFkLCB5b3Ugd2lsbCB3YW50IHRvIGNvbWJpbmUgYSBwYXRoIG9mCi0gKiBTY2hlbWFUeXBlU3lzdGVtcyB0b2dldGhlciB1c2luZyB7QGxpbmsgWG1sQmVhbnMjdHlwZUxvYWRlclVuaW9ufQotICogdG8gZm9ybSBhIFNjaGVtYVR5cGVMb2FkZXIgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbG9hZGluZyBpbnN0YW5jZXMuCi0gKiA8cD4KLSAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgY29tcGlsZXMgdGhlIHNjaGVtYSBpbiBteVhTREZpbGUKLSAqIGluIHRoZSBwcmVzZW5jZSBvZiBvbmx5IHRoZSBtaW5pbWFsIGJ1aWx0aW4gdHlwZSBzeXN0ZW0uCi0gKiBUaGUgcmVzdWx0aW5nIFNjaGVtYVR5cGVTeXN0ZW0gPGNvZGU+c3RzPC9jb2RlPiBjb250YWlucyBvbmx5IHRoZSBkZWZpbml0aW9ucwotICogZnJvbSBteVhTRCBmaWxlLiAgSW4gb3JkZXIgdG8gbG9hZCBhbmQgdmFsaWRhdGUgYW4gaW5zdGFuY2Ugd2l0aGluCi0gKiB0aGUgY29udGV4dCBvZiB0aG9zZSB0eXBlcywgd2UgbXVzdCBuZXh0IGNvbnN0cnVjdCBhCi0gKiB7QGxpbmsgU2NoZW1hVHlwZUxvYWRlcn0gPGNvZGU+c3RsPC9jb2RlPiB0aGF0IGNvbnRhaW5zIGJvdGgKLSAqIHRoZSBidWlsdGluIHR5cGUgc3lzdGVtIGFuZCB0aGUgdHlwZXMgZGVmaW5lZCB3aXRoaW4gdGhlIG15WFNEIGZpbGUuCi0gKiA8cHJlPgotICogU2NoZW1hVHlwZVN5c3RlbSBzdHMgPSBYbWxCZWFucy5jb21waWxlWHNkKG5ldyBYbWxPYmplY3RbXQotICogICAgeyBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShteVhTREZpbGUpIH0sCi0gKiAgICBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLAotICogICAgbnVsbCk7Ci0gKiBTY2hlbWFUeXBlTG9hZGVyIHN0bCA9IFhtbEJlYW5zLnR5cGVMb2FkZXJVbmlvbihuZXcgU2NoZW1hVHlwZUxvYWRlcltdCi0gKiAgICB7IHN0cywgWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKSB9KTsKLSAqIFhtbE9iamVjdCBteWRvYyA9IHN0bC5wYXJzZShpbnN0YW5jZUZpbGUsIG51bGwsIG51bGwpOwotICogU3lzdGVtLm91dC5wcmludGxuKCJEb2N1bWVudCB2YWxpZDogIiArIG15ZG9jLnZhbGlkYXRlKCkpOwotICogPC9wcmU+Ci0gKiA8cD4KLSAqIEFzIHlvdSBjYW4gc2VlLCBmb3Igd29ya2luZyB3aXRoIGluc3RhbmNlcywgeW91IHR5cGljYWxseSB3YW50IHRvCi0gKiB3b3JrIHdpdGggYSBTY2hlbWFUeXBlTG9hZGVyIGNvbnN0cnVjdGVkIGZyb20gYSBwYXRoIHJhdGhlciB0aGFuCi0gKiBhIHNvbGl0YXJ5IFNjaGVtYVR5cGVTeXN0ZW0uICBTZWUge0BsaW5rIFhtbEJlYW5zI2xvYWRYc2R9IGZvcgotICogYSBjb252ZW5pZW50IGFsdGVybmF0aXZlIHRvIHtAbGluayBYbWxCZWFucyNjb21waWxlWHNkfS4KLSAqIDxwPgotICogQSBTY2hlbWFUeXBlU3lzdGVtIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvIGVudW1lcmF0ZSB0aGUgZXhhY3Qgc2V0Ci0gKiBvZiBjb21wb25lbnQgZGVmaW5pdGlvbnMgZGVyaXZlZCBmcm9tIGEgc2V0IG9mIFhTRCBmaWxlcywgZm9yIGV4YW1wbGUsCi0gKiB3aGVuIHlvdSBhcmUgYW5hbHl6aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgWFNEIGZpbGVzIHRoZW1zZWx2ZXMuCi0gKiBIZXJlIGlzIGhvdyB0byB1c2UgYSBTY2hlbWFUeXBlU3lzdGVtIHRvIGluc3BlY3QgYSBzZXQgb2Ygc2NoZW1hCi0gKiBkZWZpbml0aW9uczoKLSAqIDxvbD4KLSAqIDxsaT5GaXJzdCwgdXNlIHtAbGluayBYbWxCZWFucyNjb21waWxlWHNkfSB0byBjb21waWxlIGFueSBudW1iZXIKLSAqICAgICBvZiBzY2hlbWEgZmlsZXMuICBJZiB0aGUgc2NoZW1hIGZpbGVzIGFyZSB2YWxpZCwgcmVzdWx0IHdpbGwKLSAqICAgICBiZSBhIFNjaGVtYVR5cGVTeXN0ZW0gdGhhdCBjb250YWlucyBhbGwgdGhlIGNvbXBvbmVudCBkZWZpbml0aW9ucwotICogICAgIGZyb20gdGhvc2UgZmlsZXMuICBJdCB3aWxsIGNvbnRhaW4gbm8gb3RoZXIgY29tcG9uZW50IGRlZmluaXRpb25zLgotICogPGxpPkFsdGVybmF0aXZlbHksIGNhbGwge0BsaW5rIFNjaGVtYUNvbXBvbmVudCNnZXRUeXBlU3lzdGVtfSBvbgotICogICAgIGEgcHJlY29tcGlsZWQgc2NoZW1hIGNvbXBvbmVudCB0byBkaXNjb3ZlciB0aGUgU2NoZW1hVHlwZVN5c3RlbQotICogICAgIHdpdGhpbiB3aGljaCB0aGF0IGNvbXBvbmVudCB3YXMgb3JpZ2luYWxseSBjb21waWxlZC4KLSAqIDxsaT5PbmNlIHlvdSBoYXZlIGEgU2NoZW1hVHlwZVN5c3RlbSwgY2FsbDoKLSAqICAgPHVsPgotICogICA8bGk+IHtAbGluayAjZ2xvYmFsVHlwZXMoKX0gZm9yIGFsbCB0aGUgZ2xvYmFsIHR5cGUgZGVmaW5pdGlvbnMuCi0gKiAgIDxsaT4ge0BsaW5rICNnbG9iYWxFbGVtZW50cygpfSBmb3IgYWxsIHRoZSBnbG9iYWwgZWxlbWVudCBkZWZpbml0aW9ucy4KLSAqICAgPGxpPiB7QGxpbmsgI2dsb2JhbEF0dHJpYnV0ZXMoKX0gZm9yIGFsbCB0aGUgZ2xvYmFsIGF0dHJpYnV0ZSBkZWZpbml0aW9ucy4KLSAqICAgPGxpPiB7QGxpbmsgI21vZGVsR3JvdXBzKCl9IGZvciBhbGwgdGhlIG5hbWVkIG1vZGVsIGdyb3VwIGRlZmluaXRpb25zLgotICogICA8bGk+IHtAbGluayAjYXR0cmlidXRlR3JvdXBzKCl9IGZvciBhbGwgdGhlIGF0dHJpYnV0ZSBncm91cCBkZWZpbml0aW9ucy4KLSAqICAgPC91bD4KLSAqIDxsaT5JbiBhZGRpdGlvbiwgdGhlcmUgYXJlIHNwZWNpYWwgdHlwZXMgZ2VuZXJhdGVkIGZvciBYTUwgQmVhbnMgdGhhcmUKLSAqICAgICBhcmUgbm90IGZvcm1hbGx5IHBhcnQgb2YgdGhlIFNjaGVtYSBzcGVjaWZpY2F0aW9uOgotICogICA8dWw+Ci0gKiAgIDxsaT4ge0BsaW5rICNkb2N1bWVudFR5cGVzKCl9IHJldHVybnMgYWxsIHRoZSBkb2N1bWVudCB0eXBlcy4KLSAqICAgPGxpPiB7QGxpbmsgI2F0dHJpYnV0ZVR5cGVzKCl9IHJldHVybnMgYWxsIHRoZSBhdHRyaWJ1dGUgdHlwZXMuCi0gKiAgIDwvdWw+Ci0gKiA8L29sPgotICogCi0gKiA8cD4KLSAqIEEgZG9jdW1lbnQgdHlwZSBpcyBhIHR5cGUgdGhhdCBjb250YWlucyBhIHNpbmdsZSBnbG9iYWwgZWxlbWVudDsgdGhlcmUKLSAqIGlzIG9uZSBkb2N1bWVudCB0eXBlIGZvciBlYWNoIGdsb2JhbCBlbGVtZW50IGRlZmluaXRpb24gaW4gYQotICogU2NoZW1hVHlwZVN5c3RlbS4gIEluIGFuIGluc3RhbmNlIGRvY3VtZW50LCBvbmx5IHRoZSByb290IFhtbE9iamVjdAotICogY2FuIGhhdmUgYSBkb2N1bWVudCB0eXBlIGFzIGl0cyB0eXBlLgotICogPHA+Ci0gKiBTaW1pbGFybHksIGFuIGF0dHJpYnV0ZSB0eXBlIGlzIGEgdHlwZSB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIGdsb2JhbAotICogYXR0cmlidXRlLCBhbmQgdGhlcmUgaXMgb25lIGF0dHJpYnV0ZSB0eXBlIGZvciBlYWNoIGdsb2JhbCBhdHRyaWJ1dGUKLSAqIGRlZmluaXRpb24gaW4gYSBTY2hlbWFUeXBlU3lzdGVtLiAgSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIHJvb3QKLSAqIFhtbE9iamVjdCByZXByZXNlbnRpbmcgYSBmcmFnbWVudCB3aG9zZSB0eXBlIGlzIGFuIGF0dHJpYnV0ZSB0eXBlLAotICogYnV0IGF0dHJpYnV0ZSB0eXBlcyBhcmUgcHJlc2VudCBtYWlubHkgZm9yIHN5bW1ldHJ5IGFuZCB0byBzaW1wbGlmeQotICogY29kZSBzdWNoIGFzIHRoZSB0eXBlLXRyZWUtd2Fsa2luZyBjb2RlIGJlbG93LgotICogPHA+Ci0gKiBUaGUgZ2xvYmFsIGNvbXBvbmVudCBtZXRob2RzIGFib3ZlIG9ubHkgcHJvdmlkZSBhIHZpZXcgb2YgdGhlIHRvcC1sZXZlbAotICogY29tcG9uZW50cyBvZiBhIFNjaGVtYVR5cGVTeXN0ZW0gYW5kIGRvIG5vdCBpbmNsdWRlIGFueSBuZXN0ZWQKLSAqIGRlZmluaXRpb25zLiAgVG8gdmlldyBhbGwgdGhlIG5lc3RlZCBkZWZpbml0aW9ucywgeW91IHdpbGwgd2FudCB0bwotICogdHJhdmVyc2UgdGhlIGVudGlyZSB0cmVlIG9mIHtAbGluayBTY2hlbWFUeXBlfSBkZWZpbnRpb25zIHdpdGhpbiBhCi0gKiBTY2hlbWFUeXBlU3lzdGVtIGJ5IGV4YW1pbmluZyB0aGUge0BsaW5rIFNjaGVtYVR5cGUjZ2V0QW5vbnltb3VzVHlwZXMoKX0KLSAqIHdpdGhpbiBlYWNoIHtAbGluayBTY2hlbWFUeXBlfSByZWN1cnNpdmVseS4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgY29kZSBpcyBhIHN0YW5kYXJkIHRyZWV3YWxrIHRoYXQgdmlzaXRzIGV2ZXJ5Ci0gKiB7QGxpbmsgU2NoZW1hVHlwZX0gaW4gdGhlIFNjaGVtYVR5cGVTeXN0ZW0gb25jZSwgaW5jbHVkaW5nIG5lc3RlZAotICogZGVmaW5pdGlvbnMuCi0gKiA8cHJlPgotICogTGlzdCBhbGxTZWVuVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gKiBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QodHlwZVN5c3RlbS5kb2N1bWVudFR5cGVzKCkpKTsKLSAqIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0eXBlU3lzdGVtLmF0dHJpYnV0ZVR5cGVzKCkpKTsKLSAqIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0eXBlU3lzdGVtLmdsb2JhbFR5cGVzKCkpKTsKLSAqIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsU2VlblR5cGVzLnNpemUoKTsgaSsrKQotICogewotICogICAgIFNjaGVtYVR5cGUgc1R5cGUgPSAoU2NoZW1hVHlwZSlhbGxTZWVuVHlwZXMuZ2V0KGkpOwotICogICAgIFN5c3RlbS5vdXQucHJpbmxudCgiVmlzaXRpbmcgIiArIHNUeXBlLnRvU3RyaW5nKCkpOwotICogICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpKSk7Ci0gKiB9Ci0gKiA8L3ByZT4KLSAqCi0gKiBAc2VlIFNjaGVtYVR5cGUgCi0gKiBAc2VlIFNjaGVtYVR5cGVMb2FkZXIgCi0gKiBAc2VlIFhtbEJlYW5zI2NvbXBpbGVYc2QKLSAqIEBzZWUgWG1sQmVhbnMjdHlwZUxvYWRlclVuaW9uCi0gKiBAc2VlIFhtbEJlYW5zI2dldEJ1aWx0aW5UeXBlU3lzdGVtCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYVR5cGVTeXN0ZW0gZXh0ZW5kcyBTY2hlbWFUeXBlTG9hZGVyCi17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGdsb2JhbCB0eXBlcyBkZWZpbmVkIGluIHRoaXMgbG9hZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVbXSBnbG9iYWxUeXBlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZG9jdW1lbnQgdHlwZXMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlW10gZG9jdW1lbnRUeXBlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXR0cmlidXRlIHR5cGVzIGRlZmluZWQgaW4gdGhpcyBsb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVtdIGF0dHJpYnV0ZVR5cGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudFtdIGdsb2JhbEVsZW1lbnRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgYXR0cmlidXRlcyBkZWZpbmVkIGluIHRoaXMgbG9hZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbXSBnbG9iYWxBdHRyaWJ1dGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtb2RlbCBncm91cHMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cFtdIG1vZGVsR3JvdXBzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgZ3JvdXBzIGRlZmluZWQgaW4gdGhpcyBsb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZUdyb3VwW10gYXR0cmlidXRlR3JvdXBzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyBhIHR5cGUgc3lzdGVtIChyZXNvbHZlcyBhbGwgaGFuZGxlcyB3aXRoaW4gdGhlIHR5cGUgc3lzdGVtKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBMb2NhdGVzIGEgdHlwZSwgZWxlbWVudCwgb3IgYXR0cmlidXRlIHVzaW5nIHRoZSBoYW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYUNvbXBvbmVudCByZXNvbHZlSGFuZGxlKFN0cmluZyBoYW5kbGUpOwotCi0gICAgLyoqCi0gICAgICogTG9jYXRlcyBhIHR5cGUsIGVsZW1lbnQsIG9yIGF0dHJpYnV0ZSB1c2luZyB0aGUgaGFuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBTY2hlbWFUeXBlIHR5cGVGb3JIYW5kbGUoU3RyaW5nIGhhbmRsZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbGFzc2xvYWRlciB1c2VkIGJ5IHRoaXMgbG9hZGVyIGZvciByZXNvbHZpbmcgdHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyB0aGlzIHR5cGUgdG8gYSBkaXJlY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2F2ZVRvRGlyZWN0b3J5KEZpbGUgY2xhc3NEaXIpOwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NpbXBsZVZhbHVlLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2ltcGxlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5YmNhNy4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2ltcGxlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLQotLyoqCi0gKiBBbGwgWG1sT2JqZWN0IGltcGxlbWVudGF0aW9ucyBjYW4gYmUgY29lcmNlZCB0byBTaW1wbGVWYWx1ZS4KLSAqIEZvciBhbnkgZ2l2ZW4gc2NoZW1hIHR5cGUsIG9ubHkgYSBzdWJzZXQgb2YgdGhlIGNvbnZlcnNpb24KLSAqIG1ldGhvZHMgd2lsbCB3b3JrLiAgT3RoZXJzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgotICogPHA+Ci0gKiBTaW1wbGVWYWx1ZSBpcyB1c2VmdWwgZm9yIGRlY2xhcmluZyB2YXJpYWJsZXMgd2hpY2ggY2FuIGhvbGQKLSAqIG1vcmUgdGhhbiBvbmUgc2ltaWxhciBzY2hlbWEgdHlwZSB0aGF0IG1heSBub3QgaGFwcGVuIHRvCi0gKiBoYXZlIGEgY29tbW9uIFhNTCBiYXNlIHR5cGUsIGZvciBleGFtcGxlLCB0d28gbGlzdCB0eXBlcywKLSAqIG9yIHR3byB1bnJlbGF0ZWQgaW50ZWdlciByZXN0cmljdGlvbnMgdGhhdCBoYXBwZW4gdG8gZml0Ci0gKiBpbnRvIGFuIGludC4KLSAqLwotcHVibGljIGludGVyZmFjZSBTaW1wbGVWYWx1ZSBleHRlbmRzIFhtbE9iamVjdAotewotICAgIC8qKgotICAgICAqIFRoZSBzYW1lIGFzIGdldFNjaGVtYVR5cGUgdW5sZXNzIHRoaXMgaXMgYSB1bmlvbiBpbnN0YW5jZQotICAgICAqIG9yIG5pbCB2YWx1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBGb3IgdW5pb25zLCB0aGlzIHJldHVybnMgdGhlIG5vbi11bmlvbiBjb25zaXR1ZW50IHR5cGUgb2YKLSAgICAgKiB0aGlzIGluc3RhbmNlLiBUaGlzIHR5cGUgbWF5IGNoYW5nZSBpZiBzZXR0ZXJzIGFyZSBjYWxsZWQKLSAgICAgKiB0aGF0IGNhdXNlIHRoZSBpbnN0YW5jZSB0byBjaGFuZ2UgdG8gYW5vdGhlciBjb25zdGl0dWVudAotICAgICAqIHR5cGUgb2YgdGhlIHVuaW9uLgotICAgICAqIDxwPgotICAgICAqIEZvciBuaWwgdmFsdWVzLCB0aGlzIHJldHVybnMgbnVsbC4KLSAgICAgKi8KLSAgICBTY2hlbWFUeXBlIGluc3RhbmNlVHlwZSgpOwotCi0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFN0cmluZ30uICovCi0gICAgU3RyaW5nIGdldFN0cmluZ1ZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEgYm9vbGVhbi4gKi8KLSAgICBib29sZWFuIGdldEJvb2xlYW5WYWx1ZSgpOwotICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIGJ5dGUuICovCi0gICAgcHVibGljIGJ5dGUgZ2V0Qnl0ZVZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEgc2hvcnQuICovCi0gICAgcHVibGljIHNob3J0IGdldFNob3J0VmFsdWUoKTsKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYW4gaW50LiAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW50VmFsdWUoKTsKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBsb25nLiAqLwotICAgIHB1YmxpYyBsb25nIGdldExvbmdWYWx1ZSgpOwotICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBCaWdJbnRlZ2VyfS4gKi8KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRCaWdJbnRlZ2VyVmFsdWUoKTsKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgQmlnRGVjaW1hbH0uICovCi0gICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbFZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEgZmxvYXQuICovCi0gICAgcHVibGljIGZsb2F0IGdldEZsb2F0VmFsdWUoKTsKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBkb3VibGUuICovCi0gICAgcHVibGljIGRvdWJsZSBnZXREb3VibGVWYWx1ZSgpOwotICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIGJ5dGUgYXJyYXkuICovCi0gICAgYnl0ZVtdIGdldEJ5dGVBcnJheVZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFN0cmluZ0VudW1BYnN0cmFjdEJhc2V9LiAqLwotICAgIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZ2V0RW51bVZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfS4gKi8KLSAgICBDYWxlbmRhciBnZXRDYWxlbmRhclZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIERhdGV9LiAqLwotICAgIERhdGUgZ2V0RGF0ZVZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlfS4gKi8KLSAgICBHRGF0ZSBnZXRHRGF0ZVZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEdEdXJhdGlvbn0uICovCi0gICAgR0R1cmF0aW9uIGdldEdEdXJhdGlvblZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFFOYW1lfS4gKi8KLSAgICBRTmFtZSBnZXRRTmFtZVZhbHVlKCk7Ci0gICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9IG9mIGZyaWVuZGx5IEphdmEgb2JqZWN0cyAoU3RyaW5nLCBJbnRlZ2VyLCBCeXRlLCBTaG9ydCwgTG9uZywgQmlnSW50ZWdlciwgRGVjaW1hbCwgRmxvYXQsIERvdWJsZSwgYnl0ZVtdLCBDYWxlbmRhciwgR0R1cmF0aW9uKS4gKi8KLSAgICBMaXN0IGdldExpc3RWYWx1ZSgpOwotICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSBvZiBYbWxBbnlTaW1wbGVUeXBlIG9iamVjdHMuICovCi0gICAgTGlzdCB4Z2V0TGlzdFZhbHVlKCk7Ci0KLSAgICAvKiogUmV0dXJucyBhIHVuaW9uIHZhbHVlIGFzIGEgaXRzIG5hdHVyYWwgZnJpZW5kbHkgSmF2YSBvYmplY3QgKFN0cmluZywgSW50ZWdlciwgQnl0ZSwgU2hvcnQsIExvbmcsIEJpZ0ludGVnZXIsIERlY2ltYWwsIEZsb2F0LCBEb3VibGUsIGJ5dGVbXSwgQ2FsZW5kYXIsIEdEdXJhdGlvbikuICovCi0gICAgT2JqZWN0IGdldE9iamVjdFZhbHVlKCk7Ci0KLSAgICAvLyBmb2xsb3dpbmcgYXJlIHNpbXBsZSB0eXBlIHZhbHVlIHNldHRlcnMKLQotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBTdHJpbmd9LiAqLwotICAgIHZvaWQgc2V0U3RyaW5nVmFsdWUoU3RyaW5nIG9iaik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEgYm9vbGVhbi4gKi8KLSAgICB2b2lkIHNldEJvb2xlYW5WYWx1ZShib29sZWFuIHYpOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIGJ5dGUuICovCi0gICAgdm9pZCBzZXRCeXRlVmFsdWUoYnl0ZSB2KTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSBzaG9ydC4gKi8KLSAgICB2b2lkIHNldFNob3J0VmFsdWUoc2hvcnQgdik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGFuIGludC4gKi8KLSAgICB2b2lkIHNldEludFZhbHVlKGludCB2KTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSBsb25nLiAqLwotICAgIHZvaWQgc2V0TG9uZ1ZhbHVlKGxvbmcgdik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0ludGVnZXJ9LiAqLwotICAgIHZvaWQgc2V0QmlnSW50ZWdlclZhbHVlKEJpZ0ludGVnZXIgb2JqKTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgQmlnRGVjaW1hbH0uICovCi0gICAgdm9pZCBzZXRCaWdEZWNpbWFsVmFsdWUoQmlnRGVjaW1hbCBvYmopOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIGZsb2F0LiAqLwotICAgIHZvaWQgc2V0RmxvYXRWYWx1ZShmbG9hdCB2KTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSBkb3VibGUuICovCi0gICAgdm9pZCBzZXREb3VibGVWYWx1ZShkb3VibGUgdik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEgYnl0ZSBhcnJheS4gKi8KLSAgICB2b2lkIHNldEJ5dGVBcnJheVZhbHVlKGJ5dGVbXSBvYmopOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlfS4gKi8KLSAgICB2b2lkIHNldEVudW1WYWx1ZShTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIG9iaik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfS4gKi8KLSAgICB2b2lkIHNldENhbGVuZGFyVmFsdWUoQ2FsZW5kYXIgb2JqKTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgRGF0ZX0uICovCi0gICAgdm9pZCBzZXREYXRlVmFsdWUoRGF0ZSBvYmopOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0uICovCi0gICAgdm9pZCBzZXRHRGF0ZVZhbHVlKEdEYXRlIG9iaik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEdEdXJhdGlvbn0uICovCi0gICAgdm9pZCBzZXRHRHVyYXRpb25WYWx1ZShHRHVyYXRpb24gb2JqKTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgUU5hbWV9LiAqLwotICAgIHZvaWQgc2V0UU5hbWVWYWx1ZShRTmFtZSBvYmopOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fS4gKi8KLSAgICB2b2lkIHNldExpc3RWYWx1ZShMaXN0IG9iaik7Ci0gICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGFuIGFyYml0cmFyeSB7QGxpbmsgT2JqZWN0fS4gKi8KLSAgICB2b2lkIHNldE9iamVjdFZhbHVlKE9iamVjdCBvYmopOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgU3RyaW5nfS4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRTdHJpbmdWYWx1ZX0KLSAgICAgKi8KLSAgICBTdHJpbmcgc3RyaW5nVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIGJvb2xlYW4uICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0Qm9vbGVhblZhbHVlfQotICAgICAqLwotICAgIGJvb2xlYW4gYm9vbGVhblZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBieXRlLiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEJ5dGVWYWx1ZX0KLSAgICAgKi8KLSAgICBwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHNob3J0LiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldFNob3J0VmFsdWV9Ci0gICAgICovCi0gICAgcHVibGljIHNob3J0IHNob3J0VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhbiBpbnQuICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0SW50VmFsdWV9Ci0gICAgICovCi0gICAgcHVibGljIGludCBpbnRWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEgbG9uZy4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRMb25nVmFsdWV9Ci0gICAgICovCi0gICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgQmlnSW50ZWdlcn0uICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0QmlnSW50ZWdlclZhbHVlfQotICAgICAqLwotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGJpZ0ludGVnZXJWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0RlY2ltYWx9LiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEJpZ0RlY2ltYWxWYWx1ZX0KLSAgICAgKi8KLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIGZsb2F0LiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEZsb2F0VmFsdWV9Ci0gICAgICovCi0gICAgcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIGRvdWJsZS4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXREb3VibGVWYWx1ZX0KLSAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBieXRlIGFycmF5LiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEJ5dGVBcnJheVZhbHVlfQotICAgICAqLwotICAgIGJ5dGVbXSBieXRlQXJyYXlWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFN0cmluZ0VudW1BYnN0cmFjdEJhc2V9LiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEVudW1WYWx1ZX0KLSAgICAgKi8KLSAgICBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1WYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfS4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRDYWxlbmRhclZhbHVlfQotICAgICAqLwotICAgIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfS4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXREYXRlVmFsdWV9Ci0gICAgICovCi0gICAgRGF0ZSBkYXRlVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0uICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0RhdGVWYWx1ZX0KLSAgICAgKi8KLSAgICBHRGF0ZSBnRGF0ZVZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgR0R1cmF0aW9ufS4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRHRHVyYXRpb25WYWx1ZX0KLSAgICAgKi8KLSAgICBHRHVyYXRpb24gZ0R1cmF0aW9uVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBRTmFtZX0uICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0UU5hbWVWYWx1ZX0KLSAgICAgKi8KLSAgICBRTmFtZSBxTmFtZVZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2YgZnJpZW5kbHkgSmF2YSBvYmplY3RzIChTdHJpbmcsIEludGVnZXIsIEJ5dGUsIFNob3J0LCBMb25nLCBCaWdJbnRlZ2VyLCBEZWNpbWFsLCBGbG9hdCwgRG91YmxlLCBieXRlW10sIENhbGVuZGFyLCBHRHVyYXRpb24pLiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldExpc3RWYWx1ZX0KLSAgICAgKi8KLSAgICBMaXN0IGxpc3RWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9IG9mIFhtbEFueVNpbXBsZVR5cGUgb2JqZWN0cy4gKgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRMaXN0VmFsdWV9Ci0gICAgICovCi0gICAgTGlzdCB4bGlzdFZhbHVlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHVuaW9uIHZhbHVlIGFzIGEgaXRzIG5hdHVyYWwgZnJpZW5kbHkgSmF2YSBvYmplY3QgKFN0cmluZywgSW50ZWdlciwgQnl0ZSwgU2hvcnQsIExvbmcsIEJpZ0ludGVnZXIsIERlY2ltYWwsIEZsb2F0LCBEb3VibGUsIGJ5dGVbXSwgQ2FsZW5kYXIsIEdEdXJhdGlvbikuICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0T2JqZWN0VmFsdWV9Ci0gICAgICovCi0gICAgT2JqZWN0IG9iamVjdFZhbHVlKCk7Ci0KLSAgICAvLyBmb2xsb3dpbmcgYXJlIHNpbXBsZSB0eXBlIHZhbHVlIHNldHRlcnMKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFN0cmluZ30uICoKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0U3RyaW5nVmFsdWV9Ci0gICAgICovCi0gICAgdm9pZCBzZXQoU3RyaW5nIG9iaik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSBib29sZWFuLiAqCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEJvb2xlYW5WYWx1ZX0KLSAgICAgKi8KLSAgICB2b2lkIHNldChib29sZWFuIHYpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEgYnl0ZS4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0Qnl0ZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChieXRlIHYpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEgc2hvcnQuCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldFNob3J0VmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KHNob3J0IHYpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGFuIGludC4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0SW50VmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KGludCB2KTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIGxvbmcuCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldExvbmdWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQobG9uZyB2KTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBCaWdJbnRlZ2VyfS4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0QmlnSW50ZWdlclZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChCaWdJbnRlZ2VyIG9iaik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgQmlnRGVjaW1hbH0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0QmlnRGVjaW1hbFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChCaWdEZWNpbWFsIG9iaik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSBmbG9hdC4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0RmxvYXRWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoZmxvYXQgdik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSBkb3VibGUuCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldERvdWJsZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChkb3VibGUgdik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSBieXRlIGFycmF5LgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRCeXRlQXJyYXlWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoYnl0ZVtdIG9iaik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgU3RyaW5nRW51bUFic3RyYWN0QmFzZX0uCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEVudW1WYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoU3RyaW5nRW51bUFic3RyYWN0QmFzZSBvYmopOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfS4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0Q2FsZW5kYXJWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoQ2FsZW5kYXIgb2JqKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfS4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0RGF0ZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChEYXRlIG9iaik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9LgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRHRGF0ZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gb2JqKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBHRHVyYXRpb259LgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRHRHVyYXRpb25WYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBvYmopOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFFOYW1lfS4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0UU5hbWVWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoUU5hbWUgb2JqKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fS4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0TGlzdFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChMaXN0IG9iaik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYW4gYXJiaXRyYXJ5IHtAbGluayBPYmplY3R9LgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRPYmplY3RWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBvYmplY3RTZXQoT2JqZWN0IG9iaik7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU3RyaW5nRW51bUFic3RyYWN0QmFzZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1N0cmluZ0VudW1BYnN0cmFjdEJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM4ZTEzMC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU3RyaW5nRW51bUFic3RyYWN0QmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBUaGUgYmFzZSBjbGFzcyBmb3IgY29kZS1nZW5lcmF0ZWQgc3RyaW5nIGVudW1lcmF0aW9uIHZhbHVlIGNsYXNzZXMuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgYXJlIGludGVuZGVkIHRvIGJlIGZpbmFsIHR5cGVzIHdpdGggYSBmaW5pdGUgc2V0IG9mCi0gKiBzaW5nbGV0b24gaW5zdGFuY2VzLiAgRWFjaCBpbnN0YW5jZSBoYXMgYSBzdHJpbmcgdmFsdWUsIHdoaWNoCi0gKiBpdCByZXR1cm5zIHZpYSB7QGxpbmsgI3RvU3RyaW5nfSwgYW5kIGFuIGludCB2YWx1ZSBmb3IgdGhlIHB1cnBvc2UKLSAqIG9mIHN3aXRjaGluZyBpbiBjYXNlIHN0YXRlbWVudHMsIHJldHVybmVkIHZpYSB7QGxpbmsgI2ludFZhbHVlfS4KLSAqIDxwPgotICogRWFjaCBzdWJjbGFzcyBtYW5hZ2VzIGFuIGluc3RhbmNlIG9mIHtAbGluayBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlLlRhYmxlfSwKLSAqIHdoaWNoIGhvbGRzIGFsbCB0aGUgc2luZ2xldG9uIGluc3RhbmNlcyBmb3IgdGhlIHN1YmNsYXNzLiBBIFRhYmxlCi0gKiBjYW4gcmV0dXJuIGEgc2luZ2xldG9uIGluc3RhbmNlIGdpdmVuIGEgU3RyaW5nIG9yIGFuIGludGVnZXIgY29kZS4KLSAqLyAKLXB1YmxpYyBjbGFzcyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBfc3RyaW5nOwotICAgIHByaXZhdGUgaW50IF9pbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBTaW5nbGV0b24gaW5zdGFuY2VzIHNob3VsZCBvbmx5IGJlIGNyZWF0ZWQgYnkgc3ViY2xhc3Nlcy4KLSAgICAgKi8gCi0gICAgcHJvdGVjdGVkIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UoU3RyaW5nIHMsIGludCBpKQotICAgICAgICB7IF9zdHJpbmcgPSBzOyBfaW50ID0gaTsgfQotCi0gICAgLyoqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgc3RyaW5nIHZhbHVlICovCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpCi0gICAgICAgIHsgcmV0dXJuIF9zdHJpbmc7IH0KLSAgICAvKiogUmV0dXJucyBhbiBpbnQgY29kZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBzd2l0Y2ggc3RhdGVtZW50cyAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgaW50VmFsdWUoKQotICAgICAgICB7IHJldHVybiBfaW50OyB9Ci0gICAgLyoqIFJldHVybnMgdGhlIGhhc2ggY29kZSBvZiB0aGUgdW5kZXJseWluZyBzdHJpbmcgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkKLSAgICAgICAgeyByZXR1cm4gX3N0cmluZy5oYXNoQ29kZSgpOyB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIG1hbmFnZSBzaW5nbGV0b24gaW5zdGFuY2VzIG9mIGVudW1lcmF0aW9ucy4KLSAgICAgKiBFYWNoIHN1YmNsYXNzIG9mIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgaGFzIGFuIGluc3RhbmNlCi0gICAgICogb2YgYSB0YWJsZSB0byBob2xkIHRoZSBzaW5nbGV0b24gaW5zdGFuY2VzLgotICAgICAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRhYmxlCi0gICAgewotICAgICAgICBwcml2YXRlIE1hcCBfbWFwOwotICAgICAgICBwcml2YXRlIExpc3QgX2xpc3Q7Ci0gICAgICAgIHB1YmxpYyBUYWJsZShTdHJpbmdFbnVtQWJzdHJhY3RCYXNlW10gYXJyYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9tYXAgPSBuZXcgSGFzaE1hcChhcnJheS5sZW5ndGgpOwotICAgICAgICAgICAgX2xpc3QgPSBuZXcgQXJyYXlMaXN0KGFycmF5Lmxlbmd0aCArIDEpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfbWFwLnB1dChhcnJheVtpXS50b1N0cmluZygpLCBhcnJheVtpXSk7Ci0gICAgICAgICAgICAgICAgaW50IGogPSBhcnJheVtpXS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHdoaWxlIChfbGlzdC5zaXplKCkgPD0gaikKLSAgICAgICAgICAgICAgICAgICAgX2xpc3QuYWRkKG51bGwpOwotICAgICAgICAgICAgICAgIF9saXN0LnNldChqLCBhcnJheVtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gZm9yIGEge0BsaW5rIFN0cmluZ30sIG9yIG51bGwgaWYgbm9uZS4gKi8KLSAgICAgICAgcHVibGljIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZm9yU3RyaW5nKFN0cmluZyBzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZ0VudW1BYnN0cmFjdEJhc2UpX21hcC5nZXQocyk7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBmb3IgYW4gaW50IGNvZGUsIG9yIG51bGwgaWYgbm9uZS4gKi8KLSAgICAgICAgcHVibGljIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZm9ySW50KGludCBpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSA8IDAgfHwgaSA+IF9saXN0LnNpemUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nRW51bUFic3RyYWN0QmFzZSlfbGlzdC5nZXQoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIGxhc3QgdmFsaWQgaW50IGNvZGUgKHRoZSBmaXJzdCBpcyAxOyB6ZXJvIGlzIG5vdCB1c2VkKS4gKi8KLSAgICAgICAgcHVibGljIGludCBsYXN0SW50KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9saXN0LnNpemUoKSAtIDE7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWE1MU3RyZWFtVmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1hNTFN0cmVhbVZhbGlkYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhOTNhMS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWE1MU3RyZWFtVmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLS8qKgotICogQW4gZXhjZXB0aW9uIHRocm93biBmcm9tIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAqIAotICogQHNlZSBYbWxPYmplY3QuRmFjdG9yeSNuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0KLSAqIEBzZWUgU2NoZW1hVHlwZUxvYWRlciNuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0KLSAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MwotICovCi1wdWJsaWMgY2xhc3MgWE1MU3RyZWFtVmFsaWRhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFhNTFN0cmVhbUV4Y2VwdGlvbgotewotICAgIHB1YmxpYyBYTUxTdHJlYW1WYWxpZGF0aW9uRXhjZXB0aW9uICggWG1sRXJyb3IgeG1sRXJyb3IgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHhtbEVycm9yLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgCi0gICAgICAgIF94bWxFcnJvciA9IHhtbEVycm9yOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxFcnJvciBnZXRYbWxFcnJvciAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfeG1sRXJyb3I7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBYbWxFcnJvciBfeG1sRXJyb3I7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEFueVNpbXBsZVR5cGUuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxBbnlTaW1wbGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZmU4Y2EuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEFueVNpbXBsZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jU2ltcGxlX1R5cGVfRGVmaW5pdGlvbiI+eHM6YW55U2ltcGxlVHlwZTwvYT4gdHlwZS4KLSAqIDxwPgotICogQWxsIHNpbXBsZSB0eXBlcyBhcmUgY29udmVydGlibGUgdG8ge0BsaW5rIFN0cmluZ30uIAotICovIAotcHVibGljIGludGVyZmFjZSBYbWxBbnlTaW1wbGVUeXBlIGV4dGVuZHMgWG1sT2JqZWN0Ci17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfYW55U2ltcGxlVHlwZSIpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFN0cmluZ30KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldFN0cmluZ1ZhbHVlfQotICAgICAqKi8KLSAgICBTdHJpbmcgc3RyaW5nVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBTdHJpbmd9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNzZXRTdHJpbmdWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoU3RyaW5nIHMpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgU3RyaW5nfQotICAgICAqKi8KLSAgICBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFN0cmluZ30KLSAgICAgKiovCi0gICAgdm9pZCBzZXRTdHJpbmdWYWx1ZShTdHJpbmcgcyk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDthbnl0aGluZyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDthbnl0aGluZyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlTaW1wbGVUeXBlfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlTaW1wbGVUeXBlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlTaW1wbGVUeXBlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlTaW1wbGVUeXBlfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQW55VVJJLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQW55VVJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MjEyZDkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEFueVVSSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNhbnlVUkkiPnhzOmFueVVSSTwvYT4gdHlwZS4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIFN0cmluZ30uIAotICovIAotcHVibGljIGludGVyZmFjZSBYbWxBbnlVUkkgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfYW55VVJJIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxBbnlVUkl9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEFueVVSSX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEFueVVSSX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEFueVVSSX0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlVUkl9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtodHRwOi8vd3d3LnczLm9yZy8mbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7aHR0cDovL3d3dy53My5vcmcvJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55VVJJIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlVUkl9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVVSSX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55VVJJIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVVSSX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVVSSX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVVSSX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlVUkl9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVVSSX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55VVJJIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQmFzZTY0QmluYXJ5LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQmFzZTY0QmluYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMmNkODYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEJhc2U2NEJpbmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNiYXNlNjRCaW5hcnkiPnhzOmJhc2U2NEJpbmFyeTwvYT4gdHlwZS4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8gYSBieXRlIGFycmF5LiAKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sQmFzZTY0QmluYXJ5IGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2Jhc2U2NEJpbmFyeSIpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIGJ5dGUgYXJyYXkuCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRCeXRlQXJyYXlWYWx1ZX0KLSAgICAgKiovCi0gICAgYnl0ZVtdIGJ5dGVBcnJheVZhbHVlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBieXRlIGFycmF5LgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjc2V0Qnl0ZUFycmF5VmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KGJ5dGVbXSBiYSk7Ci0KLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgYnl0ZSBhcnJheS4gKiovCi0gICAgYnl0ZVtdIGdldEJ5dGVBcnJheVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGJ5dGUgYXJyYXkuICovCi0gICAgdm9pZCBzZXRCeXRlQXJyYXlWYWx1ZShieXRlW10gYmEpOwotCi0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEJhc2U2NEJpbmFyeX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCYXNlNjRCaW5hcnkpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJhc2U2NEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O1ZHaHBjeUJ6ZEhKcCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCYXNlNjRCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtWR2hwY3lCemRISnAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCYXNlNjRCaW5hcnkgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJhc2U2NEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCYXNlNjRCaW5hcnkgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCYXNlNjRCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCYXNlNjRCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJhc2U2NEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCYXNlNjRCaW5hcnkgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCZWFucy5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEJlYW5zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNTUyZGIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEJlYW5zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLyoqCi0gKiBQcm92aWRlcyBhbiBhc3NvcnRtZW50IG9mIHV0aWxpdGllcwotICogZm9yIG1hbmFnaW5nIFhNTCBCZWFuIHR5cGVzLCB0eXBlIHN5c3RlbXMsIFFOYW1lcywgcGF0aHMsCi0gKiBhbmQgcXVlcmllcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbEJlYW5zCi17Ci0gICAgLyoqCi0gICAgICogVGhyZWFkIGxvY2FsIFFOYW1lIGNhY2hlIGZvciBnZW5lcmFsIHVzZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRocmVhZExvY2FsIF90aHJlYWRMb2NhbExvYWRlclFOYW1lQ2FjaGUgPQotICAgICAgICBuZXcgVGhyZWFkTG9jYWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGluaXRpYWxWYWx1ZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZUNhY2hlKCAzMiApOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHRocmVhZCBsb2NhbCBRTmFtZUNhY2hlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZUNhY2hlIGdldFFOYW1lQ2FjaGUgKCApCi0gICAgewotICAgICAgICByZXR1cm4gKFFOYW1lQ2FjaGUpIF90aHJlYWRMb2NhbExvYWRlclFOYW1lQ2FjaGUuZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT2J0YWlucyBhIG5hbWUgZnJvbSB0aGUgdGhyZWFkIGxvY2FsIFFOYW1lQ2FjaGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldFFOYW1lICggU3RyaW5nIGxvY2FsUGFydCApCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0UU5hbWVDYWNoZSgpLmdldE5hbWUoICIiLCAgbG9jYWxQYXJ0ICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT2J0YWlucyBhIG5hbWUgZnJvbSB0aGUgdGhyZWFkIGxvY2FsIFFOYW1lQ2FjaGUKLSAgICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgZ2V0UU5hbWUgKCBTdHJpbmcgbmFtZXNwYWNlVXJpLCBTdHJpbmcgbG9jYWxQYXJ0ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRRTmFtZUNhY2hlKCkuZ2V0TmFtZSggbmFtZXNwYWNlVXJpLCAgbG9jYWxQYXJ0ICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIF9nZXRDb250ZXh0VHlwZUxvYWRlck1ldGhvZCA9IGJ1aWxkR2V0Q29udGV4dFR5cGVMb2FkZXJNZXRob2QoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgX2dldEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtTWV0aG9kID0gYnVpbGRHZXRCdWlsdGluU2NoZW1hVHlwZVN5c3RlbU1ldGhvZCgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBfZ2V0Tm9UeXBlTWV0aG9kID0gYnVpbGRHZXROb1R5cGVNZXRob2QoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgX3R5cGVMb2FkZXJCdWlsZGVyTWV0aG9kID0gYnVpbGRUeXBlTG9hZGVyQnVpbGRlck1ldGhvZCgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBfY29tcGlsYXRpb25NZXRob2QgPSBidWlsZENvbXBpbGF0aW9uTWV0aG9kKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBSdW50aW1lRXhjZXB0aW9uIGNhdXNlZEV4Y2VwdGlvbihSdW50aW1lRXhjZXB0aW9uIGUsIFRocm93YWJsZSBjYXVzZSkKLSAgICB7Ci0gICAgICAgIGUuaW5pdENhdXNlKGNhdXNlKTsKLSAgICAgICAgcmV0dXJuIGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgWG1sRXhjZXB0aW9uIHdyYXBwZWRFeGNlcHRpb24oVGhyb3dhYmxlIGUpCi0gICAgewotICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFhtbEV4Y2VwdGlvbikKLSAgICAgICAgICAgIHJldHVybiAoWG1sRXhjZXB0aW9uKSBlOwotCi0gICAgICAgIHJldHVybiBuZXcgWG1sRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBidWlsZEdldENvbnRleHRUeXBlTG9hZGVyTWV0aG9kKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlTG9hZGVySW1wbCIsIGZhbHNlLCBYbWxCZWFucy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKS5nZXRNZXRob2QoImdldENvbnRleHRUeXBlTG9hZGVyIiwgbmV3IENsYXNzWzBdKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBTY2hlbWFUeXBlTG9hZGVySW1wbDogdmVyaWZ5IHRoYXQgeGJlYW4uamFyIGlzIG9uIHRoZSBjbGFzc3BhdGgiKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBidWlsZEdldEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtTWV0aG9kKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbSIsIGZhbHNlLCBYbWxCZWFucy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKS5nZXRNZXRob2QoImdldCIsIG5ldyBDbGFzc1swXSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW06IHZlcmlmeSB0aGF0IHhiZWFuLmphciBpcyBvbiB0aGUgY2xhc3NwYXRoIiksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIGJ1aWxkR2V0Tm9UeXBlTWV0aG9kKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbSIsIGZhbHNlLCBYbWxCZWFucy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKS5nZXRNZXRob2QoImdldE5vVHlwZSIsIG5ldyBDbGFzc1swXSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW06IHZlcmlmeSB0aGF0IHhiZWFuLmphciBpcyBvbiB0aGUgY2xhc3NwYXRoIiksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgYnVpbGRUeXBlTG9hZGVyQnVpbGRlck1ldGhvZCgpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MgcmVzb3VyY2VMb2FkZXJDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuUmVzb3VyY2VMb2FkZXIiLCBmYWxzZSwgWG1sQmVhbnMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlTG9hZGVySW1wbCIsIGZhbHNlLCBYbWxCZWFucy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKS5nZXRNZXRob2QoImJ1aWxkIiwgbmV3IENsYXNzW10geyBTY2hlbWFUeXBlTG9hZGVyW10uY2xhc3MsIHJlc291cmNlTG9hZGVyQ2xhc3MsIENsYXNzTG9hZGVyLmNsYXNzIH0pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBsb2FkIFNjaGVtYVR5cGVMb2FkZXJJbXBsOiB2ZXJpZnkgdGhhdCB4YmVhbi5qYXIgaXMgb24gdGhlIGNsYXNzcGF0aCIpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIGJ1aWxkQ29tcGlsYXRpb25NZXRob2QoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlNjaGVtYVR5cGVTeXN0ZW1JbXBsIiwgZmFsc2UsIFhtbEJlYW5zLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpLmdldE1ldGhvZCgiZm9yU2NoZW1hWG1sIiwgbmV3IENsYXNzW10geyBYbWxPYmplY3RbXS5jbGFzcywgU2NoZW1hVHlwZUxvYWRlci5jbGFzcywgWG1sT3B0aW9ucy5jbGFzcyB9KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBTY2hlbWFUeXBlU3lzdGVtSW1wbDogdmVyaWZ5IHRoYXQgeGJlYW4uamFyIGlzIG9uIHRoZSBjbGFzc3BhdGgiKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21waWxlcyBhbiBYUGF0aCwgcmV0dXJuaW5nIGEgU3RyaW5nIGVxdWFsIHRvIHRoYXQgd2hpY2ggd2FzIHBhc3NlZCwKLSAgICAgKiBidXQgd2hvc2UgaWRlbnRpdHkgaXMgdGhhdCBvZiBvbmUgd2hpY2ggaGFzIGJlZW4gcHJlY29tcGlsZWQgYW5kIGNhY2hlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21waWxlUGF0aCAoIFN0cmluZyBwYXRoRXhwciApIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21waWxlUGF0aCggcGF0aEV4cHIsIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29tcGlsZXMgYW4gWFBhdGgsIHJldHVybmluZyBhIFN0cmluZyBlcXVhbCB0byB0aGF0IHdoaWNoIHdhcyBwYXNzZWQsCi0gICAgICogYnV0IHdob3NlIGlkZW50aXR5IGlzIHRoYXQgb2Ygb25lIHdoaWNoIGhhcyBiZWVuIHByZWNvbXBpbGVkIGFuZCBjYWNoZWQ7IAotICAgICAqIHRha2VzIGFuIG9wdGlvbiBmb3Igc3BlY2lmeWluZyB0ZXh0IHRoYXQgaW5kaWNhdGVzIHRoZSBuYW1lIG9mIGNvbnRleHQgbm9kZS4KLSAgICAgKiBUaGUgZGVmYXVsdCBpcyAidGhpcyIsIGFzIGluICIkdGhpcyIuCi0gICAgICogCi0gICAgICogQHBhcmFtICBvcHRpb25zICBPcHRpb25zIGZvciB0aGUgcGF0aC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gY2FsbCAKLSAgICAgKiB0aGUge0BsaW5rIFhtbE9wdGlvbnMjc2V0WHF1ZXJ5Q3VycmVudE5vZGVWYXIoU3RyaW5nKSBYbWxPcHRpb25zLnNldFhxdWVyeUN1cnJlbnROb2RlVmFyKFN0cmluZyl9Ci0gICAgICogbWV0aG9kIHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIG5hbWUgZm9yIHRoZSBleHByZXNzaW9uIAotICAgICAqIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIHRoZSBjb250ZXh0IG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGlsZVBhdGggKCBTdHJpbmcgcGF0aEV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDb250ZXh0VHlwZUxvYWRlcigpLmNvbXBpbGVQYXRoKCBwYXRoRXhwciwgb3B0aW9ucyApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb21waWxlcyBhbiBYUXVlcnksIHJldHVybmluZyBhIFN0cmluZyBlcXVhbCB0byB0aGF0IHdoaWNoIHdhcyBwYXNzZWQsCi0gICAgICogYnV0IHdob3NlIGlkZW50aXR5IGlzIHRoYXQgb2Ygb25lIHdoaWNoIGhhcyBiZWVuIHByZWNvbXBpbGVkIGFuZCBjYWNoZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGlsZVF1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciApIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21waWxlUXVlcnkoIHF1ZXJ5RXhwciwgbnVsbCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb21waWxlcyBhbiBYUXVlcnksIHJldHVybmluZyBhIFN0cmluZyBlcXVhbCB0byB0aGF0IHdoaWNoIHdhcyBwYXNzZWQsCi0gICAgICogYnV0IHdob3NlIGlkZW50aXR5IGlzIHRoYXQgb2Ygb25lIHdoaWNoIGhhcyBiZWVuIHByZWNvbXBpbGVkIGFuZCBjYWNoZWQ7Ci0gICAgICogdGFrZXMgYW4gb3B0aW9uIGZvciBzcGVjaWZ5aW5nIHRleHQgdGhhdCBpbmRpY2F0ZXMgdGhlIGNvbnRleHQgbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG9wdGlvbnMgIE9wdGlvbnMgZm9yIHRoZSBxdWVyeS4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gY2FsbCAKLSAgICAgKiB0aGUge0BsaW5rIFhtbE9wdGlvbnMjc2V0WHF1ZXJ5Q3VycmVudE5vZGVWYXIoU3RyaW5nKSBYbWxPcHRpb25zLnNldFhxdWVyeUN1cnJlbnROb2RlVmFyKFN0cmluZyl9Ci0gICAgICogbWV0aG9kIHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIG5hbWUgZm9yIHRoZSBleHByZXNzaW9uIAotICAgICAqIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIHRoZSBjb250ZXh0IG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGlsZVF1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldENvbnRleHRUeXBlTG9hZGVyKCkuY29tcGlsZVF1ZXJ5KCBxdWVyeUV4cHIsIG9wdGlvbnMgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgU2NoZW1hVHlwZUxvYWRlciBiYXNlZCBvbiB0aGUgY3VycmVudCB0aHJlYWQncyBjb250ZXh0Ci0gICAgICogQ2xhc3NMb2FkZXIuIFRoaXMgaXMgdGhlIFNjaGVtYVR5cGVMb2FkZXIgdGhhdCBpcyB1c2VkIHRvIGFzc2lnbgotICAgICAqIHNjaGVtYSB0eXBlcyB0byBYTUwgZG9jdW1lbnRzIGJ5IGRlZmF1bHQuIFRoZSBTY2hlbWFUeXBlTG9hZGVyIGlzCi0gICAgICogYWxzbyBjb25zdWx0ZWQgdG8gcmVzb2x2ZSB3aWxkY2FyZHMgYW5kIHhzaTp0eXBlIGF0dHJpYnV0ZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhlICJwYXJzZSIgbWV0aG9kcyBvZiBYbWxCZWFucyBhbGwgZGVsZWdhdGUgdG8gdGhlCi0gICAgICogInBhcnNlSW5zdGFuY2UiIG1ldGhvZHMgb2YgdGhlIGNvbnRleHQgdHlwZSBsb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlTG9hZGVyIGdldENvbnRleHRUeXBlTG9hZGVyKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGVMb2FkZXIpX2dldENvbnRleHRUeXBlTG9hZGVyTWV0aG9kLmludm9rZShudWxsLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gYWNjZXNzIHRvIFNjaGVtYVR5cGVMb2FkZXJJbXBsLmdldENvbnRleHRUeXBlTG9hZGVyKCk6IHZlcmlmeSB0aGF0IHZlcnNpb24gb2YgeGJlYW4uamFyIGlzIGNvcnJlY3QiKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpLCBlLmdldENhdXNlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYnVpbHRpbiB0eXBlIHN5c3RlbS4gVGhpcyBTY2hlbWFUeXBlU3lzdGVtIGNvbnRhaW5zCi0gICAgICogb25seSB0aGUgNDYgYnVpbHRpbiB0eXBlcyBkZWZpbmVkIGJ5IHRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlU3lzdGVtIGdldEJ1aWx0aW5UeXBlU3lzdGVtKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGVTeXN0ZW0pX2dldEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtTWV0aG9kLmludm9rZShudWxsLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gYWNjZXNzIHRvIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLmdldCgpOiB2ZXJpZnkgdGhhdCB2ZXJzaW9uIG9mIHhiZWFuLmphciBpcyBjb3JyZWN0IiksIGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKSwgZS5nZXRDYXVzZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFNjaGVtYVR5cGVTeXN0ZW0gdGhhdCByZXN1bHRzIGZyb20gY29tcGlsaW5nIHRoZSBYTUwKLSAgICAgKiBzY2hlbWEgZGVmaW5pdGlvbnMgcGFzc2VkLgotICAgICAqIDxwPgotICAgICAqIEp1c3QgbGlrZSBjb21waWxlVHlwZVN5c3RlbSwgYnV0IHVzZXMgdGhlIGNvbnRleHQgdHlwZSBsb2FkZXIgZm9yCi0gICAgICogbGlua2luZywgYW5kIHJldHVybnMgYSB1bmlvbmVkIHR5cGVsb2FkZXIgdGhhdCBpcyBzdWl0YWJsZSBmb3IKLSAgICAgKiBjcmVhdGluZyBpbnN0YW5jZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlTG9hZGVyIGxvYWRYc2QoWG1sT2JqZWN0W10gc2NoZW1hcykgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGxvYWRYc2Qoc2NoZW1hcywgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIDxwPlJldHVybnMgdGhlIFNjaGVtYVR5cGVTeXN0ZW0gdGhhdCByZXN1bHRzIGZyb20gY29tcGlsaW5nIHRoZSBYTUwKLSAgICAgKiBzY2hlbWEgZGVmaW5pdGlvbnMgcGFzc2VkIGluIDxlbT5zY2hlbWFzPC9lbT4uPC9wPgotICAgICAqIAotICAgICAqIDxwPlRoaXMgaXMganVzdCBsaWtlIGNvbXBpbGVUeXBlU3lzdGVtLCBidXQgdXNlcyB0aGUgY29udGV4dCB0eXBlIGxvYWRlciBmb3IKLSAgICAgKiBsaW5raW5nLCBhbmQgcmV0dXJucyBhIHVuaW9uZWQgdHlwZWxvYWRlciB0aGF0IGlzIHN1aXRhYmxlIGZvcgotICAgICAqIGNyZWF0aW5nIGluc3RhbmNlcy48L3A+Ci0gICAgICogCi0gICAgICogPHA+VXNlIHRoZSA8ZW0+b3B0aW9uczwvZW0+IHBhcmFtZXRlciB0byBzcGVjaWZ5IG9uZSBvciBib3RoIG9mIHRoZSBmb2xsb3dpbmc6PC9wPgotICAgICAqIAotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QSBjb2xsZWN0aW9uIGluc3RhbmNlIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgYW4gZXJyb3IgbGlzdGVuZXIgZHVyaW5nCi0gICAgICogY29tcGlsYXRpb24sIGFzIGRlc2NyaWJlZCBpbiB7QGxpbmsgWG1sT3B0aW9ucyNzZXRFcnJvckxpc3RlbmVyfS48L2xpPgotICAgICAqIDxsaT5XaGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIG5vdCBiZSBkb25lIHdoZW4gYnVpbGRpbmcgdGhlIFNjaGVtYVR5cGVTeXN0ZW0sCi0gICAgICogYXMgZGVzY3JpYmVkIGluIHtAbGluayBYbWxPcHRpb25zI3NldENvbXBpbGVOb1ZhbGlkYXRpb259LjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2NoZW1hcyBUaGUgc2NoZW1hIGRlZmluaXRpb25zIGZyb20gd2hpY2ggdG8gYnVpbGQgdGhlIHNjaGVtYSB0eXBlIHN5c3RlbS4KLSAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHNwZWNpZnlpbmcgYW4gZXJyb3IgbGlzdGVuZXIgYW5kL29yIHZhbGlkYXRpb24gYmVoYXZpb3IuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlTG9hZGVyIGxvYWRYc2QoWG1sT2JqZWN0W10gc2NoZW1hcywgWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSBzdHMgPQotICAgICAgICAgICAgICAgIChTY2hlbWFUeXBlU3lzdGVtKQotICAgICAgICAgICAgICAgICAgICBfY29tcGlsYXRpb25NZXRob2QuaW52b2tlKAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbmV3IE9iamVjdFtdIHsgc2NoZW1hcywgZ2V0Q29udGV4dFR5cGVMb2FkZXIoKSwgb3B0aW9ucyB9KTsKLQotICAgICAgICAgICAgaWYgKHN0cyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICB0eXBlTG9hZGVyVW5pb24oCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTY2hlbWFUeXBlTG9hZGVyW10geyBzdHMsIGdldENvbnRleHRUeXBlTG9hZGVyKCkgfSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBhY2Nlc3MgdG8gU2NoZW1hVHlwZUxvYWRlckltcGwuZm9yU2NoZW1hWG1sKCk6IHZlcmlmeSB0aGF0IHZlcnNpb24gb2YgeGJlYW4uamFyIGlzIGNvcnJlY3QiKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgd3JhcHBlZEV4Y2VwdGlvbihlLmdldENhdXNlKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIDxwPlJldHVybnMgdGhlIFNjaGVtYVR5cGVTeXN0ZW0gdGhhdCByZXN1bHRzIGZyb20gY29tcGlsaW5nIHRoZSBYTUwKLSAgICAgKiBzY2hlbWEgZGVmaW5pdGlvbnMgcGFzc2VkLjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD5UaGUgWG1sT2JqZWN0cyBwYXNzZWQgaW4gc2hvdWxkIGJlIHczYyAmbHQ7c2NoZW1hJmd0OyBlbGVtZW50cyB3aG9zZSB0eXBlCi0gICAgICogaXMgb3JnLnczYy54MjAwMS54bWxTY2hlbWEuU2NoZW1hLiAoVGhhdCBpcywgc2NoZW1hIGVsZW1lbnRzIGluCi0gICAgICogdGhlIFhNTCBuYW1lc3BhY2UgaHR0cDovL3d3dy53M2Mub3JnLzIwMDEvWE1MU2NoZW1hLikgIEFsc28KLSAgICAgKiBvcmcudzNjLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudCBpcyBwZXJtaXR0ZWQuPC9wPgotICAgICAqIAotICAgICAqIDxwPlRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgaXMgYSBTY2hlbWFUeXBlTG9hZGVyIHdoaWNoIHdpbGwgYmUKLSAgICAgKiBjb25zdWx0ZWQgZm9yIGFscmVhZHktY29tcGlsZWQgc2NoZW1hIHR5cGVzIHdoaWNoIG1heSBiZSBsaW5rZWQKLSAgICAgKiB3aGlsZSBwcm9jZXNzaW5nIHRoZSBnaXZlbiBzY2hlbWFzLjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD5UaGUgU2NoZW1hVHlwZVN5c3RlbSB0aGF0IGlzIHJldHVybmVkIHNob3VsZCBiZSBjb21iaW5lZAotICAgICAqICh2aWEge0BsaW5rICN0eXBlTG9hZGVyVW5pb259KSB3aXRoIHRoZSB0eXBlcGF0aCB0eXBlbG9hZGVyIGluIG9yZGVyCi0gICAgICogdG8gY3JlYXRlIGEgdHlwZWxvYWRlciB0aGF0IGNhbiBiZSB1c2VkIGZvciBjcmVhdGluZyBhbmQgdmFsaWRhdGluZwotICAgICAqIGluc3RhbmNlcy48L3A+Ci0gICAgICogCi0gICAgICogPHA+VXNlIHRoZSA8ZW0+b3B0aW9uczwvZW0+IHBhcmFtZXRlciB0byBzcGVjaWZ5IHRoZSBmb2xsb3dpbmc6PC9wPgotICAgICAqIAotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QSBjb2xsZWN0aW9uIGluc3RhbmNlIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgYW4gZXJyb3IgbGlzdGVuZXIgZHVyaW5nCi0gICAgICogY29tcGlsYXRpb24sIGFzIGRlc2NyaWJlZCBpbiB7QGxpbmsgWG1sT3B0aW9ucyNzZXRFcnJvckxpc3RlbmVyfS48L2xpPgotICAgICAqIDxsaT5XaGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIG5vdCBiZSBkb25lIHdoZW4gYnVpbGRpbmcgdGhlIFNjaGVtYVR5cGVTeXN0ZW0sCi0gICAgICogYXMgZGVzY3JpYmVkIGluIHtAbGluayBYbWxPcHRpb25zI3NldENvbXBpbGVOb1ZhbGlkYXRpb259LjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2NoZW1hcyBUaGUgc2NoZW1hIGRlZmluaXRpb25zIGZyb20gd2hpY2ggdG8gYnVpbGQgdGhlIHNjaGVtYSB0eXBlIHN5c3RlbS4KLSAgICAgKiBAcGFyYW0gdHlwZXBhdGggVGhlIHBhdGggdG8gYWxyZWFkeS1jb21waWxlZCBzY2hlbWEgdHlwZXMgZm9yIGxpbmtpbmcgd2hpbGUgcHJvY2Vzc2luZy4KLSAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHNwZWNpZnlpbmcgYW4gZXJyb3IgbGlzdGVuZXIgYW5kL29yIHZhbGlkYXRpb24gYmVoYXZpb3IuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlU3lzdGVtIGNvbXBpbGVYc2QoWG1sT2JqZWN0W10gc2NoZW1hcywgU2NoZW1hVHlwZUxvYWRlciB0eXBlcGF0aCwgWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAodHlwZXBhdGggPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk11c3Qgc3VwcGx5IGEgU2NoZW1hVHlwZUxvYWRlciBmb3IgY29tcGlsZXRpbWUgbGlua2luZyIpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGVTeXN0ZW0pX2NvbXBpbGF0aW9uTWV0aG9kLmludm9rZShudWxsLCBuZXcgT2JqZWN0W10geyBzY2hlbWFzLCB0eXBlcGF0aCwgb3B0aW9ucyB9KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBhY2Nlc3MgdG8gU2NoZW1hVHlwZUxvYWRlckltcGwuZm9yU2NoZW1hWG1sKCk6IHZlcmlmeSB0aGF0IHZlcnNpb24gb2YgeGJlYW4uamFyIGlzIGNvcnJlY3QiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyB3cmFwcGVkRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdW5pb24gb2YgYSBsaXN0IG9mIHR5cGVMb2FkZXJzLiBUaGUgcmV0dXJuZWQKLSAgICAgKiBTY2hlbWFUeXBlTG9hZGVyIHNlYXJjaGVzIHRoZSBnaXZlbiBsaXN0IG9mIFNjaGVtYVR5cGVMb2FkZXJzCi0gICAgICogaW4gb3JkZXIgZnJvbSBmaXJzdCB0byBsYXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hVHlwZUxvYWRlciB0eXBlTG9hZGVyVW5pb24oU2NoZW1hVHlwZUxvYWRlcltdIHR5cGVMb2FkZXJzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0eXBlTG9hZGVycy5sZW5ndGggPT0gMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZUxvYWRlcnNbMF07Ci0KLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZUxvYWRlcilfdHlwZUxvYWRlckJ1aWxkZXJNZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7dHlwZUxvYWRlcnMsIG51bGwsIG51bGx9KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gYWNjZXNzIHRvIFNjaGVtYVR5cGVMb2FkZXJJbXBsOiB2ZXJpZnkgdGhhdCB2ZXJzaW9uIG9mIHhiZWFuLmphciBpcyBjb3JyZWN0IiksIGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKSwgZS5nZXRDYXVzZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBTY2hlbWFUeXBlTG9hZGVyIHRoYXQgc2VhcmNoZXMgZm9yIGNvbXBpbGVkIHNjaGVtYSB0eXBlcwotICAgICAqIGluIHRoZSBnaXZlbiBDbGFzc0xvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVMb2FkZXIgdHlwZUxvYWRlckZvckNsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGxvYWRlcikKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGVMb2FkZXIpX3R5cGVMb2FkZXJCdWlsZGVyTWV0aG9kLmludm9rZShudWxsLCBuZXcgT2JqZWN0W10ge251bGwsIG51bGwsIGxvYWRlcn0pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBhY2Nlc3MgdG8gU2NoZW1hVHlwZUxvYWRlckltcGw6IHZlcmlmeSB0aGF0IHZlcnNpb24gb2YgeGJlYW4uamFyIGlzIGNvcnJlY3QiKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKSwgZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgU2NoZW1hVHlwZSBmcm9tIGEgY29ycmVzcG9uZGluZyBYbWxPYmplY3Qgc3ViY2xhc3MsCi0gICAgICogb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hVHlwZSB0eXBlRm9yQ2xhc3MoQ2xhc3MgYykKLSAgICB7Ci0gICAgICAgIGlmIChjID09IG51bGwgfHwgIVhtbE9iamVjdC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGMpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkIHR5cGVGaWVsZCA9IGMuZ2V0RmllbGQoInR5cGUiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHR5cGVGaWVsZCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGUpdHlwZUZpZWxkLmdldChudWxsKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hVHlwZSBnZXROb1R5cGUoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZSlfZ2V0Tm9UeXBlTWV0aG9kLmludm9rZShudWxsLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gYWNjZXNzIHRvIFNjaGVtYVR5cGVMb2FkZXJJbXBsLmdldENvbnRleHRUeXBlTG9hZGVyKCk6IHZlcmlmeSB0aGF0IHZlcnNpb24gb2YgeGJlYW4uamFyIGlzIGNvcnJlY3QiKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpLCBlLmdldENhdXNlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIFNjaGVtYVR5cGUgb2JqZWN0IGdpdmVuIHRvIGFuIFhtbE9iamVjdCBpbnN0YW5jZSB3aGVuCi0gICAgICogbm8gdHlwZSBjYW4gYmUgZGV0ZXJtaW5lZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgTk9fVFlQRSBpcyB0aGUgdW5pdmVyc2FsIGRlcml2ZWQgdHlwZS4gIFRoYXQgaXMsIGl0IGlzCi0gICAgICogZGVyaXZlZCBmcm9tIGFsbCBvdGhlciBzY2hlbWEgdHlwZXMsIGFuZCBubyBpbnN0YW5jZXMgb2YgdGhlCi0gICAgICogTk9fVFlQRSBhcmUgdmFsaWQuIChJdCBpcyBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCB0aGUgYW55VHlwZSwKLSAgICAgKiB3aGljaCBpcyB0aGUgdW5pdmVyc2FsIGJhc2UgdHlwZSBmcm9tIHdoaWNoIGFsbCBvdGhlciB0eXBlcwotICAgICAqIGNhbiBiZSBkZXJpdmVkLCBhbmQgb2Ygd2hpY2ggYWxsIGluc3RhbmNlcyBhcmUgdmFsaWQuKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hVHlwZSBOT19UWVBFID0gZ2V0Tm9UeXBlKCk7Ci0KLSAgICBwcml2YXRlIFhtbEJlYW5zICggKSB7IH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCb29sZWFuLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQm9vbGVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTA2M2MxLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCb29sZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2Jvb2xlYW4iPnhzOmJvb2xlYW48L2E+IHR5cGUuCi0gKiA8cD4KLSAqIE5hdHVyYWxseSwgY29udmVydGlibGUgdG8gSmF2YSBib29sZWFuLiAKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sQm9vbGVhbiBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9ib29sZWFuIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgYm9vbGVhbgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0Qm9vbGVhblZhbHVlfQotICAgICAqKi8KLSAgICBib29sZWFuIGJvb2xlYW5WYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGJvb2xlYW4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI3NldEJvb2xlYW5WYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoYm9vbGVhbiB2KTsKLQotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBib29sZWFuICovCi0gICAgYm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEgYm9vbGVhbiAqLwotICAgIHZvaWQgc2V0Qm9vbGVhblZhbHVlKGJvb2xlYW4gdik7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEJvb2xlYW59LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEJvb2xlYW59ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJvb2xlYW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEJvb2xlYW59ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEJvb2xlYW59IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7dHJ1ZSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJvb2xlYW59IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDt0cnVlJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJvb2xlYW59IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQm9vbGVhbn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQm9vbGVhbn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCb29sZWFuIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJvb2xlYW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQm9vbGVhbn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCb29sZWFuIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJvb2xlYW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQm9vbGVhbn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJvb2xlYW59IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCb29sZWFuIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQm9vbGVhbn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCb29sZWFuIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCeXRlLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQnl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGFhNGRiLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCeXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2J5dGUiPnhzOmJ5dGU8L2E+IHR5cGUuCi0gKiA8cD4KLSAqIE5hdHVyYWxseSwgY29udmVydGlibGUgdG8gSmF2YSBieXRlLiAKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sQnl0ZSBleHRlbmRzIFhtbFNob3J0Ci17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfYnl0ZSIpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIGJ5dGUKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldEJ5dGVWYWx1ZX0KLSAgICAgKiovCi0gICAgcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEgYnl0ZQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjc2V0Qnl0ZVZhbHVlfQotICAgICAqKi8KLSAgICBwdWJsaWMgdm9pZCBzZXQoYnl0ZSBzKTsKLQotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBieXRlICovCi0gICAgcHVibGljIGJ5dGUgZ2V0Qnl0ZVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGJ5dGUgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCeXRlVmFsdWUoYnl0ZSBzKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEJ5dGV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEJ5dGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEJ5dGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEJ5dGV9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCeXRlfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJ5dGUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCeXRlfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJ5dGUgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCeXRlfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJ5dGUgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ2FsZW5kYXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDYWxlbmRhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGIwYzllLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDYWxlbmRhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotCi0vKioKLSAqIEFuIFhNTCBTY2hlbWEgY29tcGF0aWJsZSBzdWJjbGFzcyBvZiB7QGxpbmsgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyIEdyZWdvcmlhbkNhbGVuZGFyfS4KLSAqIFhtbENhbGVuZGFyIG1vZGlmaWVzIHNldmVyYWwga2V5IGRldGFpbHMgaW4gdGhlIGJlaGF2aW9yIG9mCi0gKiBHcmVnb3JpYW5DYWxlbmRhciB0byBtYWtlIGl0IG1vcmUgdXNlZnVsIHdoZW4gZGVhbGluZyB3aXRoIFhNTCBkYXRlcy4KLSAqIDxwPgotICogSXQgaXMgZWFzeSB0byBjb252ZXJ0IGJldHdlZW4gWG1sQ2FsZW5kYXIgYW5kIHtAbGluayBHRGF0ZX0sIG9yIHRvCi0gKiBwYXJzZSBvciBlbWl0IGFuIFhtbENhbGVuZGFyIHVzaW5nIGEgc3RhbmRhcmQgWE1MIFNjaGVtYQotICogbGV4aWNhbCByZXByZXNlbnRhdGlvbi4KLSAqIDxvbD4KLSAqIDxsaT4KLSAqIFRvIG1hdGNoIFhNTCBTY2hlbWEgZGF0ZXMsIHRoaXMgWG1sQ2FsZW5kYXIgaXMgYSBmdWxseSBwcm9sZXB0aWMKLSAqIEdyZWdvcmlhbiBjYWxlbmRhciBieSBkZWZhdWx0LCB3aGljaCBtZWFucyB0aGF0IEdyZWdvcmlhbiBjYWxlbmRhcgotICogcnVsZXMgYXJlIGFwcGxpZWQgYmFja3dhcmRzIGluIHRpbWUgYXMgaWYgdGhleSBoYWQgYWx3YXlzIGJlZW4gaW4KLSAqIGVmZmVjdCwgYWN0dWFsIGhpc3RvcmljYWwgY2lyY3Vtc3RhbmNlcyBjb25jZXJuaW5nIHRoZSBvYnNlcnZhbmNlCi0gKiBvZiB0aGUgMTU4MiBkZWNyZWUgb2YgUG9wZSBHcmVnb3J5IFhJSUkgbm90d2l0aHN0YW5kaW5nLgotICogPC9saT4KLSAqIDxsaT4KLSAqIEluIG9yZGVyIHRvIGJldHRlciBzdXBwb3J0IHBhcnRpYWxseS1zcGVjaWZpZWQgZGF0ZXMgZm9yIFhNTCBTY2hlbWEsCi0gKiB0aGlzIGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGEgc3RhYmxlIGdldChmaWVsZCkgbWV0aG9kCi0gKiB0aGF0IGRvZXMgbm90IG1vZGlmeSB0aGUgaW5zdGFuY2UgaWYgeW91IGFyZSBhY2Vzc2luZyBhIGZpZWxkIHJpZ2h0Ci0gKiBhZnRlciBpdCB3YXMgZXhwbGljaXRseSBzZXQ6IGEgc2V0IGZvbGxvd2VkIGJ5IGEgZ2V0IHdpbGwgYWx3YXlzCi0gKiByZXR1cm4gdGhlIHNhbWUgdGhpbmcgYW5kIHdpbGwgbm90IGZpbGwgaW4gYW55IG90aGVyIGZpZWxkcy4gSG93ZXZlciwKLSAqIGlmIHlvdSBnZXQgYSBmaWVsZCB0aGF0IHdhcyBub3QgZXhwbGljaXRseSBzZXQsIHRoZW4gYWxsIHRoZSBmaWVsZHMKLSAqIGFyZSBzdGlsbCBhdXRvbWF0aWNhbGx5IGZpbGxlZCBhbmQgbm9ybWFsaXplZCBmb3IgeW91LCBqdXN0IGxpa2UgYQotICogcmVndWxhciBHcmVnb3JpYW5DYWxlbmRhci4gSWYgeW91IHdpc2ggdG8gZm9yY2UgdGhlIGNvbXBsZXRpb24gYW5kCi0gKiBkZWZhdWx0aW5nIG9mIGFsbCB0aGUgZmllbGRzICh3aXRob3V0IGh1bnRpbmcgdG8gZ2V0IG9uZSB0aGF0IGhhcHBlbnMKLSAqIHRvIGJlIHVuc2V0KSwgeW91IGNhbiBhbHdheXMgZG8gc28gYnkgY2FsbGluZyBnZXRUaW1lKCkuCi0gKiA8L2xpPgotICogPGxpPgotICogV2hlbiBhIHllYXIgaXMgdW5zcGVjaWZpZWQgYW5kIG5lZWRzIHRvIGJlIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5Ci0gKiAoZm9yIGV4YW1wbGUgd2hlbiB1c2luZyBhIC5nZXQgb3IgLmdldFRpbWUgbWV0aG9kIGFzIGRpc2N1c3NlZCBhYm92ZSksCi0gKiB0aGUgeWVhciBpcyBkZWZhdWx0ZWQgdG8geWVhciAwIChhbHNvIGtub3duIGFzIDEgQkMpLiAgVGhpcyBpcyBkaWZmZXJlbnQKLSAqIGZyb20ge0BsaW5rIEdyZWdvcmlhbkNhbGVuZGFyfSwgd2hpY2ggY2hvb3NlcyAxOTcwLiBUaGUgcmVhc29uIDAgaXMgcHJlZmVyYWJsZQotICogaXMgdGhhdCBpdCBpcyBhIGxlYXAgeWVhciBhbmQgc28gaXQgcGVybWl0cyB0aGUgZGF0ZSAtLTItMjkgdG8gYmUgc3BlY2lmaWVkCi0gKiBzdGFibHkuIEEgZGlmZmVyZW50IGRlZmF1bHQgeWVhciBjYW4gYmUgY2hvc2VuIHZpYSB0aGUgc3RhdGljIG1ldGhvZAotICoge0BsaW5rICNzZXREZWZhdWx0WWVhcihpbnQpIFhtbENhbGVuZGFyLnNldERlZmF1bHRZZWFyKCl9LCBvciBieSBzZXR0aW5nIHRoZSAKLSAqIHN5c3RlbSBwcm9wZXJ0eSAidXNlci5kZWZhdWx0eWVhciIuIElmIHlvdSBkbyBjaGFuZ2UgdGhpcyB2YWx1ZSwgeW91IHNob3VsZCAKLSAqIHBpY2sgYW5vdGhlciBsZWFwIHllYXIgc3VjaCBhcyAyMDAwIGFuZCBhdm9pZCBub24tbGVhcCB5ZWFycyBzdWNoIGFzIDE5MDAuCi0gKiA8L2xpPgotICogPGxpPgotICogV2hlbiBjb25zdHJ1Y3RpbmcgYW4gWG1sQ2FsZW5kYXIgZnJvbSBhbiBYTUwgU2NoZW1hCi0gKiBmb3JtYXR0ZWQgZGF0ZSBvciB0aW1lIHN0cmluZyBvciBHRGF0ZSBvYmplY3QsIHRoZSB0aW1lem9uZQotICogZm9yIHRoZSBjYWxlbmRhciBpcyB0YWtlbiBmcm9tIHRoZSBzdHJpbmcgaWYgaXQgaXMgcHJlc2VudCwgb3IKLSAqIHRha2VuIHRvIGJlIHtAbGluayBqYXZhLnV0aWwuVGltZVpvbmUjZ2V0RGVmYXVsdCgpIFRpbWVab25lLmdldERlZmF1bHQoKX0gaWYgbm90LgotICogPHA+Ci0gKiAgICAgRm9yIGV4YW1wbGUsIHRoZSBYTUwgdGltZXpvbmUgIloiIGlzIHRyYW5zbGF0ZWQgdG8gIkdNVCI7Ci0gKiAgICAgdGhlIFhNTCB0aW1lem9uZSAiKzA1OjAwIiBpcyB0cmFuc2xhdGVkIHRvICJHTVQrMDU6MDAiLgotICogPC9wPgotICogPC9saT4KLSAqIDxsaT4KLSAqIEZpbmFsbHksIHRoaXMgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgYSBTdHJpbmcgY29uc3RydWN0b3IgYW5kIGEKLSAqIHRvU3RyaW5nKCkgbWV0aG9kIHRoYXQgY29tcGx5IHdpdGggdGhlIFhNTCBTY2hlbWEgY29udmVudGlvbnMKLSAqIGZvciBmb3JtYXR0aW5nIGEgZGF0ZS4gSWYgb25seSBhIHN1YnNldCBvZiBmaWVsZHMgaGF2ZSBiZWVuCi0gKiBleHBsaWNpdGx5IHNldCwgdG9TdHJpbmcoKSBwcm9kdWNlcyBhIHN0cmluZyB3aXRoIHRoZSBwcm9wZXIgc3Vic2V0Ci0gKiBvZiBpbmZvcm1hdGlvbi4KLSAqIDwvbGk+Ci0gKiA8L29sPgotICovIAotcHVibGljIGNsYXNzIFhtbENhbGVuZGFyIGV4dGVuZHMgR3JlZ29yaWFuQ2FsZW5kYXIKLXsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbENhbGVuZGFyIGZvciBhIHN0YW5kYXJkIFhNTAotICAgICAqIHNjaGVtYSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmcuCi0gICAgICogCi0gICAgICogVGhlIHBhcnNlciBhY2NlcHRzIGFueSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6Ci0gICAgICogCi0gICAgICogWVlZWS1NTS1ERFRoaDptbTpzcyAgICAgICAgICAtIGRhdGVUaW1lCi0gICAgICogWVlZWS1NTS1ERCAgICAgICAgICAgICAgICAgICAtIGRhdGUKLSAgICAgKiAgICAgICAgICAgIGhoOm1tOnNzICAgICAgICAgIC0gdGltZQotICAgICAqIFlZWVkgICAgICAgICAgICAgICAgICAgICAgICAgLSBnWWVhcgotICAgICAqICAgIC0tTU0gICAgICAgICAgICAgICAgICAgICAgLSBnTW9udGgKLSAgICAgKiAgICAgIC0tLUREICAgICAgICAgICAgICAgICAgIC0gZ0RheQotICAgICAqIAotICAgICAqIFRoZSBwYXJzZXIgYWN0dWFsbHkgYWNjZXB0cyBhbGwgMTYgY29tYmluYXRpb25zIG9mIHN1YnNldHMgb2YKLSAgICAgKiBmaWVsZHMgKFksIE0sIEQsIFQpIHVzaW5nIHRoZSBzYW1lIHNjaGVtZSwgZXZlbiBmb3IgY29tYmluYXRpb25zCi0gICAgICogdGhhdCBhcmUgbm90IGRlZmluZWQgYXMgdHlwZXMgaW4gdGhlIHNjaGVtYSBzcGVjLCBzdWNoIGFzCi0gICAgICogeWVhciwgZGF5LCBhbmQgdGltZToKLSAgICAgKiAKLSAgICAgKiBZWVlZLS1ERFRoaDptbTpzcyAgICAgICAgICAgIC0gW2V2ZXJ5dGhpbmcgYnV0IG1vbnRoIHNwZWNpZmllZF0KLSAgICAgKiAKLSAgICAgKiBJbiB0aGUgc3RyaW5nLCBlYWNoIGZpZWxkIG11c3QgYmUgcGFkZGVkIHRvIGl0cyBmdWxsIHdpZHRoLCBmb3IKLSAgICAgKiBleGFtcGxlLCBKYW51YXJ5IG11c3QgYmUgLS0wMSwgbm90IGp1c3QgLS0xLgotICAgICAqIAotICAgICAqIEluIHBhcnRpY3VsYXIsIGEgeWVhciBtdXN0IGJlIHBhZGRlZCB0byBhdCBsZWFzdCBmb3VyIGRpZ2l0cywgc28KLSAgICAgKiAiOTgiIGlzIG5vdCBhIHZhbGlkIHllYXIsIGFsdGhvdWdoICIxOTk4IiBhbmQgIjAwOTgiIGFyZSBib3RoIHZhbGlkCi0gICAgICogeWVhcnMsIHVuYW1iaWd1b3VzbHkgMTkgY2VudHVyaWVzIHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIuICBBIHllYXIKLSAgICAgKiBtYXkgYWxzbyBiZSBwcmVjZWRlZCBieSBhIG1pbnVzIHN5bWJvbDogMDAwMCBpcyAxIEJDIGFuZCAtMDAwMSBpcwotICAgICAqIDIgQkMuCi0gICAgICoKLSAgICAgKiBGaW5hbGx5IGEgdGltZXpvbmUgaXMgYWx3YXlzIGFsbG93ZWQgKHlldCBvcHRpb25hbCkgYXQgdGhlIGVuZC4KLSAgICAgKiBUaW1lem9uZXMgbXVzdCBiZSBlaXRoZXIgIloiIChVVEMsIHdoaWNoIHdlIHRyYW5zbGF0ZSB0byBHTVQpLAotICAgICAqIG9yIHNpbXBsZSBvZmZzZXRzIGZyb20gVVRDIGluIHRoZSByYW5nZSAiLTE0OjAwIiB0byAiKzE0OjAwIiwKLSAgICAgKiBmb3IgZXhhbXBsZTogIjE0OjMwOjAwLTA1OjAwIiBzcGVjaWZpZXMgMjozMCBQTSBpbiB0aGUKLSAgICAgKiBhZnRlcm5vb24gYXQgVVRDLTA1OjAwLCB3aGljaCBpcyB0aGUgc2FtZSBhcyBFU1QuCi0gICAgICogCi0gICAgICogSWYgYSB0aW1lem9uZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBUaW1lWm9uZSBpcyB1c2VkLgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sQ2FsZW5kYXIoU3RyaW5nIHhtbFNjaGVtYURhdGVTdHJpbmcpCi0gICAgewotICAgICAgICB0aGlzKG5ldyBHRGF0ZSh4bWxTY2hlbWFEYXRlU3RyaW5nKSk7IC8vIHVzZSBHRGF0ZSB0byBwYXJzZQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbENhbGVuZGFyIGZyb20gYSBHRGF0ZS4KLSAgICAgKiAKLSAgICAgKiBJZiB0aGUgaW5zdGFuY2UgaXMgbm90IGNvbXBsZXRlZCwgeW91IGNhbiByb3VuZC10cmlwIHRvIGFuCi0gICAgICogZXF1aXZhbGVudCBHRGF0ZSBieSB3cml0aW5nICJuZXcgR0RhdGUobmV3IFhtbENhbGVuZGFyKGdkYXRlKSkiLgotICAgICAqIEhvd2V2ZXIsIGlmIHlvdSBhY2Nlc3MgYW55IG9mIHRoZSB1bnNldCBmaWVsZHMgb2YgdGhlIGNhbGVuZGFyLCBhbGwKLSAgICAgKiB0aGUgZmllbGRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBmaWxsZWQgaW4sIHNvIHBhcnRpYWwgZGF0ZXMKLSAgICAgKiB3aXRob3V0IHRpbWV6b25lcyBvciBvdGhlciBmaWVsZHMgd2lsbCBub3Qgcm91bmQtdHJpcCBhZnRlciBhY2Nlc3MuCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxDYWxlbmRhcihHRGF0ZVNwZWNpZmljYXRpb24gZGF0ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMoR0RhdGUudGltZVpvbmVGb3JHRGF0ZShkYXRlKSwgZGF0ZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgWG1sQ2FsZW5kYXIoVGltZVpvbmUgdHosIEdEYXRlU3BlY2lmaWNhdGlvbiBkYXRlKQotICAgIHsKLSAgICAgICAgc3VwZXIodHopOwotICAgICAgICBzZXRHcmVnb3JpYW5DaGFuZ2UoX2JlZ2lubmluZ09mVGltZSk7IC8vIHByb2xlcHRpYwotICAgICAgICBjbGVhcigpOwotICAgICAgICAKLSAgICAgICAgaWYgKGRhdGUuaGFzWWVhcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgeSA9IGRhdGUuZ2V0WWVhcigpOwotICAgICAgICAgICAgaWYgKHkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNldChDYWxlbmRhci5FUkEsIEdyZWdvcmlhbkNhbGVuZGFyLkFEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZXQoQ2FsZW5kYXIuRVJBLCBHcmVnb3JpYW5DYWxlbmRhci5CQyk7Ci0gICAgICAgICAgICAgICAgeSA9IDEgLSB5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0KENhbGVuZGFyLllFQVIsIHkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkYXRlLmhhc01vbnRoKCkpCi0gICAgICAgICAgICBzZXQoQ2FsZW5kYXIuTU9OVEgsIGRhdGUuZ2V0TW9udGgoKSAtIDEpOyAvLyBub3RlISEKLSAgICAgICAgaWYgKGRhdGUuaGFzRGF5KCkpCi0gICAgICAgICAgICBzZXQoQ2FsZW5kYXIuREFZX09GX01PTlRILCBkYXRlLmdldERheSgpKTsKLSAgICAgICAgaWYgKGRhdGUuaGFzVGltZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIGRhdGUuZ2V0SG91cigpKTsKLSAgICAgICAgICAgIHNldChDYWxlbmRhci5NSU5VVEUsIGRhdGUuZ2V0TWludXRlKCkpOwotICAgICAgICAgICAgc2V0KENhbGVuZGFyLlNFQ09ORCwgZGF0ZS5nZXRTZWNvbmQoKSk7Ci0gICAgICAgICAgICBpZiAoZGF0ZS5nZXRGcmFjdGlvbigpLnNjYWxlKCkgPiAwKQotICAgICAgICAgICAgICAgIHNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgZGF0ZS5nZXRNaWxsaXNlY29uZCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGF0ZS5oYXNUaW1lWm9uZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXQoQ2FsZW5kYXIuWk9ORV9PRkZTRVQsIGRhdGUuZ2V0VGltZVpvbmVTaWduKCkgKiAxMDAwICogNjAgKiAoZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSAqIDYwICsgZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpKSk7Ci0gICAgICAgICAgICBzZXQoQ2FsZW5kYXIuRFNUX09GRlNFVCwgMCk7IC8vIG5vdGUhISAgaWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlbiBHcmVnb3JpYW5DYWxlbmRhciB3aWxsIHBpY2sgdXAgRFNUIGZyb20gdGhlIHRpbWUgem9uZQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sQ2FsZW5kYXIgZnJvbSBhIERhdGUuCi0gICAgICogCi0gICAgICogVGhlIGRlZmF1bHQgVGltZVpvbmUgaXMgdXNlZCBmb3IgY29tcHV0aW5nIHRoZSB2YXJpb3VzIGZpZWxkcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sQ2FsZW5kYXIoRGF0ZSBkYXRlKQotICAgIHsKLSAgICAgICAgdGhpcyhUaW1lWm9uZS5nZXREZWZhdWx0KCksIG5ldyBHRGF0ZShkYXRlKSk7Ci0gICAgICAgIGNvbXBsZXRlKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sQ2FsZW5kYXIgd2l0aCB0aGUgc3BlY2lmaWVkIHllYXIsIG1vbnRoLCBkYXksCi0gICAgICogaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBvcHRpb25hbCBmcmFjdGlvbmFsIHNlY29uZHMsIGluCi0gICAgICogdGhlIGRlZmF1bHQgdGltZXpvbmUuCi0gICAgICovCi0gICAgcHVibGljIFhtbENhbGVuZGFyKAotICAgICAgICAgICAgaW50IHllYXIsCi0gICAgICAgICAgICBpbnQgbW9udGgsCi0gICAgICAgICAgICBpbnQgZGF5LAotICAgICAgICAgICAgaW50IGhvdXIsCi0gICAgICAgICAgICBpbnQgbWludXRlLAotICAgICAgICAgICAgaW50IHNlY29uZCwKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgZnJhY3Rpb24pCi0gICAgewotICAgICAgICB0aGlzKFRpbWVab25lLmdldERlZmF1bHQoKSwgbmV3IEdEYXRlKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbikpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbENhbGVuZGFyIHdpdGggdGhlIHNwZWNpZmllZCB5ZWFyLCBtb250aCwgZGF5LAotICAgICAqIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgb3B0aW9uYWwgZnJhY3Rpb25hbCBzZWNvbmRzLCBpbgotICAgICAqIHRoZSBzcGVjaWZpZWQgdGltZXpvbmUuCi0gICAgICovCi0gICAgcHVibGljIFhtbENhbGVuZGFyKAotICAgICAgICAgICAgaW50IHllYXIsCi0gICAgICAgICAgICBpbnQgbW9udGgsCi0gICAgICAgICAgICBpbnQgZGF5LAotICAgICAgICAgICAgaW50IGhvdXIsCi0gICAgICAgICAgICBpbnQgbWludXRlLAotICAgICAgICAgICAgaW50IHNlY29uZCwKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgZnJhY3Rpb24sCi0gICAgICAgICAgICBpbnQgdHpTaWduLAotICAgICAgICAgICAgaW50IHR6SG91ciwKLSAgICAgICAgICAgIGludCB0ek1pbnV0ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMobmV3IEdEYXRlKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbiwgdHpTaWduLCB0ekhvdXIsIHR6TWludXRlKSk7Ci0gICAgfQotICAgIAotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4gdGltZSBmaWVsZC4KLSAgICAgKiAKLSAgICAgKiBVbmxpa2UgdGhlIEdyZWdvcmlhbkNhbGVuZGFyIGltcGxlbWVudGF0aW9uLCB0aGUgZ2V0KCkgZG9lcyBub3QKLSAgICAgKiBmb3JjZSBhIGNvbXBsZXRlIG9mIGFsbCBmaWVsZHMuICBJZiB5b3Ugd2lzaCB0byBmb3JjZSBhIGNvbXBsZXRpb24KLSAgICAgKiBvZiBhbGwgdGhlIGZpZWxkcywgY2FsbCBnZXRUaW1lKCkgZmlyc3QuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXQoaW50IGZpZWxkKQotICAgIHsKLSAgICAgICAgaWYgKCFpc1NldChmaWVsZCkgfHwgaXNUaW1lU2V0KQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldChmaWVsZCk7IC8vIGZvcmNlcyBhIGNvbXBsZXRlCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbEdldChmaWVsZCk7IC8vIGRvZXMgbm90IGZvcmNlIGEgY29tcGxldGUuCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSBpbnN0YW5jZSB3aXRoIG5vIGZpZWxkcyBzZXQuCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxDYWxlbmRhcigpCi0gICAgewotICAgICAgICBzZXRHcmVnb3JpYW5DaGFuZ2UoX2JlZ2lubmluZ09mVGltZSk7IC8vIHByb2xlcHRpYwotICAgICAgICBjbGVhcigpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZGVmYXVsdFllYXIgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ERUZBVUxUX1lFQVIgPSAwOyAKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHllYXIgdGhhdCBpcyB1c2VkIHdoZW4gbm8geWVhciBpcyBzcGVjaWZpZWQuCi0gICAgICovIAotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERlZmF1bHRZZWFyKCkKLSAgICB7Ci0gICAgICAgIGlmIChkZWZhdWx0WWVhciA9PSBJbnRlZ2VyLk1JTl9WQUxVRSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHllYXJzdHJpbmcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGVmYXVsdHllYXIiKTsKLSAgICAgICAgICAgICAgICBpZiAoeWVhcnN0cmluZyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0WWVhciA9IEludGVnZXIucGFyc2VJbnQoeWVhcnN0cmluZyk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0WWVhciA9IERFRkFVTFRfREVGQVVMVF9ZRUFSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlZmF1bHRZZWFyID0gREVGQVVMVF9ERUZBVUxUX1lFQVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlZmF1bHRZZWFyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHllYXIgdG8gYmUgdXNlZCB3aGVuIG5vIHllYXIgaXMgc3BlY2lmaWVkLgotICAgICAqLyAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdFllYXIoaW50IHllYXIpCi0gICAgewotICAgICAgICBkZWZhdWx0WWVhciA9IHllYXI7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIE92ZXJyaWRlcyBHcmVnb3JpYW5DYWxlbmRhci5jb21wdXRlVGltZSB0byBhcHBseSBhIGRpZmZlcmVudAotICAgICAqIGRlZmF1bHQgeWVhci4gIChJdCBtdXN0IGJlIGEgbGVhcCB5ZWFyLikKLSAgICAgKi8gCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVRpbWUoKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiB1bnNldFllYXIgPSAhaXNTZXQoWUVBUik7Ci0gICAgICAgIGlmICh1bnNldFllYXIpCi0gICAgICAgICAgICBzZXQoWUVBUiwgZ2V0RGVmYXVsdFllYXIoKSk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlci5jb21wdXRlVGltZSgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHVuc2V0WWVhcikKLSAgICAgICAgICAgICAgICBjbGVhcihZRUFSKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgRGF0ZSBfYmVnaW5uaW5nT2ZUaW1lID0gbmV3IERhdGUoTG9uZy5NSU5fVkFMVUUpOwotICAgIAotICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgWG1sQ2FsZW5kYXIgdXNpbmcgYSBzdGFuZGFyZCBYTUwgU2NoZW1hCi0gICAgICogZm9ybWF0LCBhcyBkZXNjcmliZWQgaW4gWG1sQ2FsZW5kYXIoU3RyaW5nIHMpLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChuZXcgR0RhdGUodGhpcykpLnRvU3RyaW5nKCk7IC8vIHVzZSBHRGF0ZSB0byBwcmludAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjliMTBlLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDdXJzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MTEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgcG9zaXRpb24gYmV0d2VlbiB0d28gbG9naWNhbCB0b2tlbnMgaW4gYW4gWE1MIGRvY3VtZW50LiAKLSAqIAotICogVGhlIHRva2VucyB0aGVtc2VsdmVzIGFyZSBub3QgZXhwb3NlZCBhcyBvYmplY3RzLCBidXQgdGhlaXIgdHlwZSBhbmQgcHJvcGVydGllcwotICogYXJlIGRpc2NvdmVyYWJsZSB0aHJvdWdoIG1ldGhvZHMgb24gdGhlIGN1cnNvci4gIEluIHBhcnRpY3VsYXIsIHRoZSBnZW5lcmFsCi0gKiBjYXRlZ29yeSBvZiB0b2tlbiBpcyByZXByZXNlbnRlZCBieSBhIHtAbGluayBYbWxDdXJzb3IuVG9rZW5UeXBlIFRva2VuVHlwZX0uPGJyLz48YnIvPgotICogCi0gKiBZb3UgdXNlIGFuIFhtbEN1cnNvciBpbnN0YW5jZSB0byBuYXZpZ2F0ZSB0aHJvdWdoIGFuZCBtYW5pcHVsYXRlIGFuIFhNTCAKLSAqIGluc3RhbmNlIGRvY3VtZW50LiAKLSAqIE9uY2UgeW91IG9idGFpbiBhbiBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gY3JlYXRlIGEgY3Vyc29yIHRvIHJlcHJlc2VudCAKLSAqIGEgc3BlY2lmaWMgcGxhY2UgaW4gdGhlIFhNTC4gQmVjYXVzZSB5b3UgY2FuIHVzZSBhIGN1cnNvciB3aXRoIG9yIAotICogd2l0aG91dCBhIHNjaGVtYSBjb3JyZXNwb25kaW5nIHRvIHRoZSBYTUwsIGN1cnNvcnMgYXJlIGFuIGlkZWFsIAotICogd2F5IHRvIGhhbmRsZSBYTUwgd2l0aG91dCBhIHNjaGVtYS4gWW91IGNhbiBjcmVhdGUgYSBuZXcgY3Vyc29yIGJ5Ci0gKiBjYWxsaW5nIHRoZSB7QGxpbmsgWG1sVG9rZW5Tb3VyY2UjbmV3Q3Vyc29yKCkgbmV3Q3Vyc29yfSBtZXRob2QgCi0gKiBleHBvc2VkIGJ5IGFuIG9iamVjdCByZXByZXNlbnRpbmcKLSAqIHRoZSBYTUwsIHdoZXRoZXIgaXQgd2FzIHBhcnNlZCBpbnRvIGEgc3Ryb25nIHR5cGUgY29tcGlsZWQgZnJvbSAKLSAqIHNjaGVtYSBvciBhbiB7QGxpbmsgWG1sT2JqZWN0IFhtbE9iamVjdH0gKGFzIGluIHRoZSBuby1zY2hlbWEgY2FzZSkuPGJyLz48YnIvPgotICogCi0gKiBXaXRoIGFuIFhtbEN1cnNvciwgeW91IGNhbiBhbHNvOiA8YnIvPjxici8+Ci0gKiAKLSAqIDx1bD4KLSAqIDxsaT5FeGVjdXRlIFhRdWVyeSBhbmQgWFBhdGggZXhwcmVzc2lvbnMgYWdhaW5zdCB0aGUgWE1MIHdpdGggdGhlCi0gKiBleGVjUXVlcnkgYW5kIHNlbGVjdFBhdGggbWV0aG9kcy48L2xpPgotICogCi0gKiA8bGk+RWRpdCBhbmQgcmVzaGFwZSB0aGUgZG9jdW1lbnQgYnkgaW5zZXJ0aW5nLCBtb3ZpbmcsIGNvcHlpbmcsIGFuZCByZW1vdmluZwotICogWE1MLjwvbGk+Ci0gKiAKLSAqIDxsaT5JbnNlcnQgYm9va21hcmtzIHRoYXQgInN0aWNrIiB0byB0aGUgWE1MIGF0IHRoZSBjdXJzb3IncwotICogcG9zaXRpb24gZXZlbiBpZiB0aGUgY3Vyc29yIG9yIFhNTCBtb3Zlcy48L2xpPgotCi0gKiA8bGk+R2V0IGFuZCBzZXQgdmFsdWVzIGZvciBjb250YWluZXJzIChlbGVtZW50cyBhbmQgd2hvbGUgZG9jdW1lbnRzKSwKLSAqIGF0dHJpYnV0ZXMsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCBhbmQgY29tbWVudHMuPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIEEgY3Vyc29yIG1vdmVzIHRocm91Z2ggWE1MIGJ5IG1vdmluZyBwYXN0IHRva2Vucy4gQQotICogdG9rZW4gcmVwcmVzZW50cyBhIGNhdGVnb3J5IG9mIFhNTCBtYXJrdXAsIHN1Y2ggYXMgdGhlIHN0YXJ0IG9mIGFuIGVsZW1lbnQsIAotICogaXRzIGVuZCwgYW4gYXR0cmlidXRlLCBjb21tZW50LCBhbmQgc28gb24uIFhtbEN1cnNvciBtZXRob2RzIHN1Y2ggYXMKLSAqIHRvTmV4dFRva2VuLCB0b05leHRTaWJsaW5nLCB0b1BhcmVudCwgYW5kIHNvIG9uIG1vdmUgdGhlIGN1cnNvciAKLSAqIGFtb25nIHRva2Vucy4gRWFjaCB0b2tlbidzIGNhdGVnb3J5IGlzIG9mIGEgcGFydGljdWxhciA8ZW0+dHlwZTwvZW0+LCByZXByZXNlbnRlZCAKLSAqIGJ5IG9uZSBvZiB0aGUgbmluZSB0eXBlcyBkZWZpbmVkIGJ5IHRoZSB7QGxpbmsgWG1sQ3Vyc29yLlRva2VuVHlwZSBUb2tlblR5cGV9IGNsYXNzLiA8YnIvPjxici8+Ci0gKiAKLSAqIFdoZW4geW91IGdldCBhIG5ldyBjdXJzb3IgZm9yIGEgd2hvbGUgaW5zdGFuY2UgZG9jdW1lbnQsIHRoZSBjdXJzb3IgaXMKLSAqIGludGlhbGx5IGxvY2F0ZWQgYmVmb3JlIHRoZSBTVEFSVERPQyB0b2tlbi4gVGhpcyB0b2tlbiwgd2hpY2ggaGFzIG5vIGFuYWxvZ3kKLSAqIGluIHRoZSBYTUwgc3BlY2lmaWNhdGlvbiwgaXMgcHJlc2VudCBpbiB0aGlzIGxvZ2ljYWwgbW9kZWwgb2YgWE1MCi0gKiBzbyB0aGF0IHlvdSBtYXkgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgZG9jdW1lbnQgYXMgYSB3aG9sZQotICogYW5kIHRoZSBjb250ZW50IG9mIHRoZSBkb2N1bWVudC4gVGVybWluYXRpbmcgdGhlIGRvY3VtZW50IGlzIGFuIEVORERPQwotICogdG9rZW4uIFRoaXMgdG9rZW4gaXMgYWxzbyBub3QgcGFydCBvZiB0aGUgWE1MIHNwZWNpZmljYXRpb24uIEEgY3Vyc29yIAotICogbG9jYXRlZCBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyB0b2tlbiBpcyBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGRvY3VtZW50LiAKLSAqIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBwb3NpdGlvbiB0aGUgY3Vyc29yIGFmdGVyIHRoZSBFTkRET0MgdG9rZW4uIAotICogVGh1cywgdGhlIFNUQVJURE9DIGFuZCBFTkRET0MgdG9rZW5zIGFyZSBlZmZlY3RpdmVseSAiYm9va2VuZHMiIGZvciB0aGUgY29udGVudCBvZiAKLSAqIHRoZSBkb2N1bWVudC48YnIvPjxici8+Ci0gKiAKLSAqIEZvciBleGFtcGxlLCBmb3IgdGhlIGZvbGxvd2luZyBYTUwsIGlmIHlvdSB3ZXJlIHRoZSBuYXZpZ2F0ZSBhIGN1cnNvcgotICogdGhyb3VnaCB0aGUgWE1MIGRvY3VtZW50IHVzaW5nIHRvTmV4dFRva2VuKCksIHRoZSBsaXN0IG9mIHRva2VuIHR5cGVzIHRoYXQgCi0gKiBmb2xsb3dzIHJlcHJlc2VudHMgdGhlIHRva2VuIHNlcXVlbmNlIHlvdSB3b3VsZCBlbmNvdW50ZXIuIDxici8+PGJyLz4KLSAqIAotICogPHByZT4KLSAqICZsdDtzYW1wbGUgeD0neScmZ3Q7Ci0gKiAgICAgJmx0O3ZhbHVlJmd0O2ZvbyZsdDsvdmFsdWUmZ3Q7Ci0gKiAmbHQ7L3NhbXBsZSZndDsKLSAqIDwvcHJlPgotICogCi0gKiBTVEFSVERPQyA8YnIvPgotICogU1RBUlQgKHNhbXBsZSkgPGJyLz4KLSAqIEFUVFIgKHg9J3knKSA8YnIvPgotICogVEVYVCAoIlxuICAgICIpIDxici8+Ci0gKiBTVEFSVCAodmFsdWUpIDxici8+Ci0gKiBURVhUICgiZm9vIikgPGJyLz4KLSAqIEVORCAodmFsdWUpIDxici8+Ci0gKiBURVhUICgiXG4iKSA8YnIvPgotICogRU5EIChzYW1wbGUpPGJyLz4KLSAqIEVORERPQyA8YnIvPjxici8+Ci0gKgotICogV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSB0b2tlbnMgYXZhaWxhYmxlLCBoYXNOZXh0VG9rZW4oKSByZXR1cm5zCi0gKiBmYWxzZSBhbmQgdG9OZXh0VG9rZW4oKSByZXR1cm5zIHRoZSBzcGVjaWFsIHRva2VuIHR5cGUgTk9ORSBhbmQgZG9lcyBub3QgbW92ZQotICogdGhlIGN1cnNvci4KLSAqIDxici8+PGJyLz4KLSAqIAotICogVGhlIHtAbGluayAjY3VycmVudFRva2VuVHlwZSgpIGN1cnJlbnRUb2tlblR5cGUoKX0gbWV0aG9kIAotICogd2lsbCByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIHRva2VuIHRoYXQgaXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGN1cnNvci4gCi0gKiBZb3UgY2FuIGFsc28gdXNlIGEgbnVtYmVyIG9mIGNvbnZlbmllbmNlIG1ldGhvZHMgdGhhdCB0ZXN0IGZvciBhIHBhcnRpY3VsYXIgCi0gKiB0b2tlbiB0eXBlLiBUaGVzZSBpbmNsdWRlIHRoZSBtZXRob2RzIGlzU3RhcnQoKSwgCi0gKiBpc1N0YXJ0ZG9jKCksIGlzVGV4dCgpLCBpc0F0dHIoKSwgYW5kIHNvIG9uLiBFYWNoIHJldHVybnMgYSBib29sZWFuIAotICogdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0b2tlbiB0aGF0IGZvbGxvd3MgdGhlIGN1cnNvciBpcyB0aGUgdHlwZSAKLSAqIGluIHF1ZXN0aW9uLiAKLSAqIDxici8+PGJyLz4KLSAqIAotICogQSBmZXcgb3RoZXIgbWV0aG9kcyBkZXRlcm1pbmUgd2hldGhlciB0aGUgdG9rZW4gaXMgb2YgYSBraW5kIHRoYXQgbWF5IGluY2x1ZGUgCi0gKiBtdWx0aXBsZSB0b2tlbiB0eXBlcy4gVGhlIGlzQW55QXR0cigpIG1ldGhvZCwgZm9yIGV4YW1wbGUsIHJldHVybnMgdHJ1ZSBpZgotICogdGhlIHRva2VuIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgY3Vyc29yIGlzIGFueSBraW5kIG9mIGF0dHJpYnV0ZSwgCi0gKiBpbmNsdWRpbmcgdGhvc2Ugb2YgdGhlIEFUVFIgdG9rZW4gdHlwZSBhbmQgeG1sbnMgYXR0cmlidXRlcy4KLSAqIDxici8+PGJyLz4KLSAqIAotICogTGVnaXRpbWF0ZSBzZXF1ZW5jZXMgb2YgdG9rZW5zIGZvciBhbiBYTUwgZG9jdW1lbnQgYXJlIGRlc2NyaWJlZAotICogYnkgdGhlIGZvbGxvd2luZyBCYWNrdXMtTmF1ciBGb3JtIChCTkYpOiA8YnIvPgotICogCi0gKiA8cHJlPgotICogJmx0O2RvYyZndDsgOjo9IFNUQVJURE9DICZsdDthdHRyaWJ1dGVzJmd0OyAmbHQ7Y29udGVudCZndDsgRU5ERE9DCi0gKiAmbHQ7ZWxlbWVudCZndDsgOjo9IFNUQVJUICZsdDthdHRyaWJ1dGVzJmd0OyAmbHQ7Y29udGVudCZndDsgRU5ECi0gKiAmbHQ7YXR0cmlidXRlcyZndDsgOjo9ICggQVRUUiB8IE5BTUVTUEFDRSApICoKLSAqICZsdDtjb250ZW50Jmd0OyA6Oj0gKCBDT01NRU5UIHwgUFJPQ0lOU1QgfCBURVhUIHwgJmx0O2VsZW1lbnQmZ3Q7ICkgKgotICogPC9wcmU+Ci0gKiAKLSAqIE5vdGUgdGhhdCBhIGxlZ2l0aW1hdGUgc2VxdWVuY2UgaXMgU1RBUlRET0MgRU5ERE9DLCB0aGUgcmVzdWx0IG9mIAotICogY3JlYXRpbmcgYSBicmFuZCBuZXcgaW5zdGFuY2Ugb2YgYW4gZW1wdHkgZG9jdW1lbnQuIEFsc28gbm90ZSB0aGF0IAotICogYXR0cmlidXRlcyBtYXkgb25seSBmb2xsb3cgY29udGFpbmVyIHRva2VucyAoU1RBUlRET0Mgb3IgU1RBUlQpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQ3Vyc29yIGV4dGVuZHMgWG1sVG9rZW5Tb3VyY2UKLXsKLSAgICAvKioKLSAgICAgKiBBbiBlbnVtZXJhdGlvbiB0aGF0IGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgYW4gWE1MIHRva2VuLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVG9rZW5UeXBlCi0gICAgewotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICggKSB7IHJldHVybiBfbmFtZTsgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBvbmUgb2YgdGhlIElOVF8gdmFsdWVzIGRlZmluZWQgaW4gdGhpcyBjbGFzcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgaW50VmFsdWUgKCApIHsgcmV0dXJuIF92YWx1ZTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIE5vIHRva2VuLiAgU2VlIHtAbGluayAjaW50VmFsdWV9LiAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX05PTkUgICAgICA9IDA7Ci0gICAgICAgIC8qKiBUaGUgc3RhcnQtZG9jdW1lbnQgdG9rZW4uICBTZWUge0BsaW5rICNpbnRWYWx1ZX0uICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRfU1RBUlRET0MgID0gMTsKLSAgICAgICAgLyoqIFRoZSBlbmQtZG9jdW1lbnQgdG9rZW4uICBTZWUge0BsaW5rICNpbnRWYWx1ZX0uICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRfRU5ERE9DICAgID0gMjsKLSAgICAgICAgLyoqIFRoZSBzdGFydC1lbGVtZW50IHRva2VuLiAgU2VlIHtAbGluayAjaW50VmFsdWV9LiAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX1NUQVJUICAgICA9IDM7Ci0gICAgICAgIC8qKiBUaGUgZW5kLWVsZW1lbnQgdG9rZW4uICBTZWUge0BsaW5rICNpbnRWYWx1ZX0uICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRfRU5EICAgICAgID0gNDsKLSAgICAgICAgLyoqIFRoZSB0ZXh0IHRva2VuLiAgU2VlIHtAbGluayAjaW50VmFsdWV9LiAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX1RFWFQgICAgICA9IDU7Ci0gICAgICAgIC8qKiBUaGUgYXR0cmlidXRlIHRva2VuLiAgU2VlIHtAbGluayAjaW50VmFsdWV9LiAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX0FUVFIgICAgICA9IDY7Ci0gICAgICAgIC8qKiBUaGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHRva2VuLiAgU2VlIHtAbGluayAjaW50VmFsdWV9LiAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX05BTUVTUEFDRSA9IDc7Ci0gICAgICAgIC8qKiBUaGUgY29tbWVudCB0b2tlbi4gIFNlZSB7QGxpbmsgI2ludFZhbHVlfS4gKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVF9DT01NRU5UICAgPSA4OwotICAgICAgICAvKiogVGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdG9rZW4uICBTZWUge0BsaW5rICNpbnRWYWx1ZX0uICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRfUFJPQ0lOU1QgID0gOTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUcnVlIGlmIG5vIHRva2VuLiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc05vbmUgICAgICAoICkgeyByZXR1cm4gdGhpcyA9PSBOT05FOyAgICAgIH0KLSAgICAgICAgLyoqIFRydWUgaWYgaXMgc3RhcnQtZG9jdW1lbnQgdG9rZW4uICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnRkb2MgICggKSB7IHJldHVybiB0aGlzID09IFNUQVJURE9DOyAgfQotICAgICAgICAvKiogVHJ1ZSBpZiBpcyBlbmQtZG9jdW1lbnQgdG9rZW4uICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5kZG9jICAgICggKSB7IHJldHVybiB0aGlzID09IEVORERPQzsgICAgfQotICAgICAgICAvKiogVHJ1ZSBpZiBpcyBzdGFydC1lbGVtZW50IHRva2VuLiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0ICAgICAoICkgeyByZXR1cm4gdGhpcyA9PSBTVEFSVDsgICAgIH0KLSAgICAgICAgLyoqIFRydWUgaWYgaXMgZW5kLWVsZW1lbnQgdG9rZW4uICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5kICAgICAgICggKSB7IHJldHVybiB0aGlzID09IEVORDsgICAgICAgfQotICAgICAgICAvKiogVHJ1ZSBpZiBpcyB0ZXh0IHRva2VuLiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1RleHQgICAgICAoICkgeyByZXR1cm4gdGhpcyA9PSBURVhUOyAgICAgIH0KLSAgICAgICAgLyoqIFRydWUgaWYgaXMgYXR0cmlidXRlIHRva2VuLiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHIgICAgICAoICkgeyByZXR1cm4gdGhpcyA9PSBBVFRSOyAgICAgIH0KLSAgICAgICAgLyoqIFRydWUgaWYgaXMgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHRva2VuLiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZSAoICkgeyByZXR1cm4gdGhpcyA9PSBOQU1FU1BBQ0U7IH0KLSAgICAgICAgLyoqIFRydWUgaWYgaXMgY29tbWVudCB0b2tlbi4gKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb21tZW50ICAgKCApIHsgcmV0dXJuIHRoaXMgPT0gQ09NTUVOVDsgICB9Ci0gICAgICAgIC8qKiBUcnVlIGlmIGlzIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdG9rZW4uICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJvY2luc3QgICggKSB7IHJldHVybiB0aGlzID09IFBST0NJTlNUOyAgfQotCi0gICAgICAgIC8qKiBUcnVlIGlmIGlzIHN0YXJ0LWRvY3VtZW50IG9yIHN0YXJ0LWVsZW1lbnQgdG9rZW4gKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIgKCApIHsgcmV0dXJuIHRoaXMgPT0gU1RBUlRET0MgIHx8IHRoaXMgPT0gU1RBUlQ7IH0KLSAgICAgICAgLyoqIFRydWUgaWYgaXMgZW5kLWRvY3VtZW50IG9yIGVuZC1lbGVtZW50IHRva2VuICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRmluaXNoICAgICggKSB7IHJldHVybiB0aGlzID09IEVORERPQyAgICB8fCB0aGlzID09IEVORDsgICB9Ci0gICAgICAgIC8qKiBUcnVlIGlmIGlzIGF0dHJpYnV0ZSBvciBuYW1lc3BhY2UgZGVjbGFyYXRpb24gdG9rZW4gKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBbnlBdHRyICAgKCApIHsgcmV0dXJuIHRoaXMgPT0gTkFNRVNQQUNFIHx8IHRoaXMgPT0gQVRUUjsgIH0KLQotICAgICAgICAvKiogVGhlIHNpbmdsZXRvbiBuby10b2tlbiB0eXBlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9rZW5UeXBlIE5PTkUgICAgICA9IG5ldyBUb2tlblR5cGUoICJOT05FIiwgICAgICBJTlRfTk9ORSAgICAgICk7Ci0gICAgICAgIC8qKiBUaGUgc2luZ2xldG9uIHN0YXJ0LWRvY3VtZW50IHRva2VuIHR5cGUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlblR5cGUgU1RBUlRET0MgID0gbmV3IFRva2VuVHlwZSggIlNUQVJURE9DIiwgIElOVF9TVEFSVERPQyAgKTsKLSAgICAgICAgLyoqIFRoZSBzaW5nbGV0b24gc3RhcnQtZG9jdW1lbnQgdG9rZW4gdHlwZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRva2VuVHlwZSBFTkRET0MgICAgPSBuZXcgVG9rZW5UeXBlKCAiRU5ERE9DIiwgICAgSU5UX0VORERPQyAgICApOwotICAgICAgICAvKiogVGhlIHNpbmdsZXRvbiBzdGFydC1lbGVtZW50IHRva2VuIHR5cGUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlblR5cGUgU1RBUlQgICAgID0gbmV3IFRva2VuVHlwZSggIlNUQVJUIiwgICAgIElOVF9TVEFSVCAgICAgKTsKLSAgICAgICAgLyoqIFRoZSBzaW5nbGV0b24gZW5kLWVsZW1lbnQgdG9rZW4gdHlwZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRva2VuVHlwZSBFTkQgICAgICAgPSBuZXcgVG9rZW5UeXBlKCAiRU5EIiwgICAgICAgSU5UX0VORCAgICAgICApOwotICAgICAgICAvKiogVGhlIHNpbmdsZXRvbiB0ZXh0IHRva2VuIHR5cGUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlblR5cGUgVEVYVCAgICAgID0gbmV3IFRva2VuVHlwZSggIlRFWFQiLCAgICAgIElOVF9URVhUICAgICAgKTsKLSAgICAgICAgLyoqIFRoZSBzaW5nbGV0b24gYXR0cmlidXRlIHRva2VuIHR5cGUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlblR5cGUgQVRUUiAgICAgID0gbmV3IFRva2VuVHlwZSggIkFUVFIiLCAgICAgIElOVF9BVFRSICAgICAgKTsKLSAgICAgICAgLyoqIFRoZSBzaW5nbGV0b24gbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHRva2VuIHR5cGUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlblR5cGUgTkFNRVNQQUNFID0gbmV3IFRva2VuVHlwZSggIk5BTUVTUEFDRSIsIElOVF9OQU1FU1BBQ0UgKTsKLSAgICAgICAgLyoqIFRoZSBzaW5nbGV0b24gY29tbWVudCB0b2tlbiB0eXBlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9rZW5UeXBlIENPTU1FTlQgICA9IG5ldyBUb2tlblR5cGUoICJDT01NRU5UIiwgICBJTlRfQ09NTUVOVCAgICk7Ci0gICAgICAgIC8qKiBUaGUgc2luZ2xldG9uIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdG9rZW4gdHlwZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRva2VuVHlwZSBQUk9DSU5TVCAgPSBuZXcgVG9rZW5UeXBlKCAiUFJPQ0lOU1QiLCAgSU5UX1BST0NJTlNUICApOwotCi0gICAgICAgIHByaXZhdGUgVG9rZW5UeXBlICggU3RyaW5nIG5hbWUsIGludCB2YWx1ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICAgICAgICAgIF92YWx1ZSA9IHZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFN0cmluZyBfbmFtZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgICAgX3ZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlYWxsb2NhdGVzIHJlc291cmNlcyBuZWVkZWQgdG8gbWFuYWdlIHRoZSBjdXJzb3IsIHJlbmRlcmluZyB0aGlzIGN1cnNvcgotICAgICAqIGlub3BlcmFibGUuIEJlY2F1c2UgY3Vyc29ycyBhcmUgbWFuYWdlZCBieSBhIG1lY2hhbmlzbSB3aGljaCBzdG9yZXMgdGhlIAotICAgICAqIFhNTCwgc2ltcGx5IGxldHRpbmcgYSBjdXJzb3IgZ28gb3V0IG9mIHNjb3BlIGFuZCBoYXZpbmcgdGhlIGdhcmJhZ2UgY29sbGVjdG9yCi0gICAgICogYXR0ZW1wdCB0byByZWNsYWltIGl0IG1heSBub3QgcHJvZHVjZSBkZXNpcmFibGUgcGVyZm9ybWFuY2UuPGJyLz48YnIvPgotICAgICAqCi0gICAgICogU28sIGV4cGxpY2l0bHkgZGlzcG9zaW5nIGEgY3Vyc29yIGFsbG93cyB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbgotICAgICAqIHRvIHJlbGVhc2UgaXRzIHJlc3BvbnNpYmlsaXR5IG9mIG1haW50YWluaW5nIGl0cyBwb3NpdGlvbi48YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBBZnRlciBhIGN1cnNvciBoYXMgYmVlbiBkaXNwb3NlZCwgaXQgbWF5IG5vdCBiZSB1c2VkIGFnYWluLiAgSXQgY2FuCi0gICAgICogdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG9yIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHVzZWQgYWZ0ZXIKLSAgICAgKiBkaXNwb3NhbC48YnIvPjxici8+Ci0gICAgICovCi0KLSAgICB2b2lkIGRpc3Bvc2UgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoaXMgY3Vyc29yIHRvIHRoZSBzYW1lIHBvc2l0aW9uIGFzIHRoZSBtb3ZlVG8gY3Vyc29yLiAgaWYgdGhlCi0gICAgICogbW92ZVRvIGN1cnNvciBpcyBpbiBhIGRpZmZlcmVudCBkb2N1bWVudCBmcm9tIHRoaXMgY3Vyc29yLCB0aGlzIGN1cnNvcgotICAgICAqIHdpbGwgbm90IGJlIG1vdmVkLCBhbmQgZmFsc2UgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtICBtb3ZlVG8gIFRoZSBjdXJzb3IgYXQgdGhlIGxvY2F0aW9uIHRvIHdoaWNoIHRoaXMgY3Vyc29yCi0gICAgICogc2hvdWxkIGJlIG1vdmVkLgotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9DdXJzb3IgKCBYbWxDdXJzb3IgbW92ZVRvICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIGN1cnJlbnQgbG9jYXRpb24gb2YgdGhpcyBjdXJzb3Igb24gYW4gaW50ZXJuYWwgc3RhY2sgb2Ygc2F2ZWQKLSAgICAgKiBwb3NpdGlvbnMgKGluZGVwZW5kZW50IG9mIHNlbGVjdGlvbikuIFRoaXMgbG9jYXRpb24gbWF5IGJlIHJlc3RvcmVkCi0gICAgICogbGF0ZXIgYnkgY2FsbGluZyB0aGUgcG9wKCkgbWV0aG9kLgotICAgICAqLwotCi0gICAgdm9pZCBwdXNoICggKTsKLQotICAgIC8qKgotICAgICAqIFJlc3RvcmVzIHRoZSBjdXJzb3IgbG9jYXRpb24gbW9zdCByZWNlbnRseSBzYXZlZCB3aXRoIHRoZSBwdXNoKCkgbWV0aG9kLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlcmUgd2FzIGEgbG9jYXRpb24gdG8gcmVzdG9yZTsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gcG9wICggKTsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgWFBhdGggZXhwcmVzc2lvbiBhZ2FpbnN0IHRoZSBYTUwgdGhhdCB0aGlzIAotICAgICAqIGN1cnNvciBpcyBpbi4gIFRoZSBjdXJzb3JzIHBvc2l0aW9uIGRvZXMgbm90IGNoYW5nZS4gIFRvIG5hdmlnYXRlIHRvIHRoZQotICAgICAqIHNlbGVjdGlvbnMsIHVzZSBoYXNOZXh0U2VsZWN0aW9uIGFuZCB0b05leHRTZWxlY3Rpb24gKHNpbWlsYXIgdG8KLSAgICAgKiBqYXZhLnV0aWwuSXRlcmF0b3IpLjxici8+PGJyLz4KLSAgICAgKiAKLSAgICAgKiBUaGUgcm9vdCByZWZlcnJlZCB0byBieSB0aGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgZ2l2ZW4gYXMgCi0gICAgICogYSBkb3QuIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBwYXRoIGV4cHJlc3Npb246Ci0gICAgICogPHByZT4KLSAgICAgKiBjdXJzb3Iuc2VsZWN0UGF0aCgiLi9wdXJjaGFzZS1vcmRlci9saW5lLWl0ZW1bcHJpY2UgPD0gMjAuMDBdIik7Ci0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogQHBhcmFtICBwYXRoICBUaGUgcGF0aCBleHByZXNzaW9uIHRvIGV4ZWN1dGUuCi0gICAgICogQHRocm93cyAgWG1sUnVudGltZUV4Y2VwdGlvbiAgSWYgdGhlIHF1ZXJ5IGV4cHJlc3Npb24gaXMgaW52YWxpZC4KLSAgICAgKi8KLSAgICB2b2lkIHNlbGVjdFBhdGggKCBTdHJpbmcgcGF0aCApOwotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIHNwZWNpZmllZCBYUGF0aCBleHByZXNzaW9uIGFnYWluc3QgdGhlIFhNTCB0aGF0IHRoaXMgCi0gICAgICogY3Vyc29yIGlzIGluLiBUaGUgY3Vyc29yJ3MgcG9zaXRpb24gZG9lcyBub3QgY2hhbmdlLiAgVG8gbmF2aWdhdGUgdG8gdGhlCi0gICAgICogc2VsZWN0aW9ucywgdXNlIGhhc05leHRTZWxlY3Rpb24gYW5kIHRvTmV4dFNlbGVjdGlvbiAoc2ltaWxhciB0bwotICAgICAqIGphdmEudXRpbC5JdGVyYXRvcikuPGJyLz48YnIvPgotICAgICAqIAotICAgICAqIFRoZSByb290IHJlZmVycmVkIHRvIGJ5IHRoZSBleHByZXNzaW9uIHNob3VsZCBiZSBnaXZlbiBhcyAKLSAgICAgKiBhIGRvdC4gVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIHBhdGggZXhwcmVzc2lvbjoKLSAgICAgKiA8cHJlPgotICAgICAqIGN1cnNvci5zZWxlY3RQYXRoKCIuL3B1cmNoYXNlLW9yZGVyL2xpbmUtaXRlbVtwcmljZSA8PSAyMC4wMF0iKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIHBhdGggIFRoZSBwYXRoIGV4cHJlc3Npb24gdG8gZXhlY3V0ZS4KLSAgICAgKiBAcGFyYW0gIG9wdGlvbnMgIE9wdGlvbnMgZm9yIHRoZSBxdWVyeS4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gY2FsbCAKLSAgICAgKiB0aGUge0BsaW5rIFhtbE9wdGlvbnMjc2V0WHF1ZXJ5Q3VycmVudE5vZGVWYXIoU3RyaW5nKSBYbWxPcHRpb25zLnNldFhxdWVyeUN1cnJlbnROb2RlVmFyKFN0cmluZyl9Ci0gICAgICogbWV0aG9kIHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIG5hbWUgZm9yIHRoZSBxdWVyeSBleHByZXNzaW9uIAotICAgICAqIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIHRoZSBjb250ZXh0IG5vZGUuCi0gICAgICogQHRocm93cyAgWG1sUnVudGltZUV4Y2VwdGlvbiAgSWYgdGhlIHF1ZXJ5IGV4cHJlc3Npb24gaXMgaW52YWxpZC4KLSAgICAgKi8KLSAgICB2b2lkIHNlbGVjdFBhdGggKCBTdHJpbmcgcGF0aCwgWG1sT3B0aW9ucyBvcHRpb25zICk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIGEgbmV4dCBzZWxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGVyZSBpcyBhIG5leHQgc2VsZWN0aW9uOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBoYXNOZXh0U2VsZWN0aW9uICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGlzIGN1cnNvciB0byB0aGUgbmV4dCBsb2NhdGlvbiBpbiB0aGUgc2VsZWN0aW9uLCAKLSAgICAgKiBpZiBhbnkuIFNlZSB0aGUgc2VsZWN0UGF0aCgpIGFuZCBhZGRUb1NlbGVjdGlvbigpIG1ldGhvZHMuCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b05leHRTZWxlY3Rpb24gKCApOwotICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhpcyBjdXJzb3IgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpbiB0aGUgc2VsZWN0aW9uLiAKLSAgICAgKiBJZiBpIGlzIGxlc3MgdGhhbiB6ZXJvIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2VsZWN0aW9uCi0gICAgICogY291bnQsIHRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UuCi0gICAgICogIAotICAgICAqIFNlZSBhbHNvIHRoZSBzZWxlY3RQYXRoKCkgYW5kIGFkZFRvU2VsZWN0aW9uKCkgbWV0aG9kcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGkgIFRoZSBpbmRleCBvZiB0aGUgZGVzaXJlZCBsb2NhdGlvbi4KLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b1NlbGVjdGlvbiAoIGludCBpICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY291bnQgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiBTZWUgYWxzbyB0aGUgc2VsZWN0UGF0aCgpIAotICAgICAqIGFuZCBhZGRUb1NlbGVjdGlvbigpIG1ldGhvZHMuCi0gICAgICogCi0gICAgICogWW91IG1heSBleHBlcmllbmNlIGJldHRlciBwZXJmb3JtYW5jZSBpZiB5b3UgdXNlIHRoZSBpdGVyYXRpb24KLSAgICAgKiBtb2RlbCB1c2luZyB0aGUgdG9OZXh0U2VsZWN0aW9uIG1ldGhvZCwgcmF0aGVyIHRoYW4gCi0gICAgICogdGhlIGluZGV4aW5nIG1vZGVsIHVzaW5nIHRoZSBnZXRTZWxlY3Rpb25Db3VudCBhbmQgCi0gICAgICogdG9TZWxlY3Rpb24gbWV0aG9kcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICBBIG51bWJlciBpbmRpY2F0aW5nIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLSAgICAgKi8KLQotICAgIGludCBnZXRTZWxlY3Rpb25Db3VudCAoICk7Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBcHBlbmRzIHRoZSBjdXJyZW50IGxvY2F0aW9uIG9mIHRoZSBjdXJzb3IgdG8gdGhlIHNlbGVjdGlvbi4gIAotICAgICAqIFNlZSBhbHNvIHRoZSBzZWxlY3RQYXRoKCkgbWV0aG9kLiBZb3UgY2FuIHVzZSB0aGlzIGFzIGFuIAotICAgICAqIGFsdGVybmF0aXZlIHRvIGNhbGxpbmcgdGhlIHNlbGVjdFBhdGggbWV0aG9kIHdoZW4geW91IHdhbnQKLSAgICAgKiB0byBkZWZpbmUgeW91ciBvd24gc2VsZWN0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBhZGRUb1NlbGVjdGlvbiAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoaXMgY3Vyc29yJ3Mgc2VsZWN0aW9uLCBidXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBkb2N1bWVudC4KLSAgICAgKi8KLSAgICB2b2lkIGNsZWFyU2VsZWN0aW9ucyAoICk7ICAgIAotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoaXMgY3Vyc29yIHRvIHRoZSBzYW1lIHBvc2l0aW9uIGFzIHRoZSBib29rbWFyay4gIElmIHRoZQotICAgICAqIGJvb2ttYXJrIGlzIGluIGEgZGlmZmVyZW50IGRvY3VtZW50IGZyb20gdGhpcyBjdXJzb3Igb3IgaWYgdGhlIAotICAgICAqIGJvb2ttYXJrIGlzIG9ycGhhbmVkLCB0aGlzIGN1cnNvcgotICAgICAqIHdpbGwgbm90IGJlIG1vdmVkLCBhbmQgZmFsc2Ugd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGJvb2ttYXJrICBUaGUgYm9va21hcmsgYXQgdGhlIGxvY2F0aW9uIHRvIHdoaWNoIHRoaXMKLSAgICAgKiBjdXJzb3Igc2hvdWxkIGJlIG1vdmVkLgotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9Cb29rbWFyayAoIFhtbEJvb2ttYXJrIGJvb2ttYXJrICk7Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGlzIGN1cnNvciB0byB0aGUgbG9jYXRpb24gYWZ0ZXIgaXRzIGN1cnJlbnQgcG9zaXRpb24KLSAgICAgKiB3aGVyZSBhIGJvb2ttYXJrIHdpdGggdGhlIGdpdmVuIGtleSBleGlzdHMuICBSZXR1cm5zIGZhbHNlIGlmIG5vCi0gICAgICogc3VjaCBib29rbWFyayBleGlzdHMuCi0gICAgICogCi0gICAgICogQHBhcmFtICBrZXkgIFRoZSBrZXkgaGVsZCBieSB0aGUgbmV4dCBib29rbWFyayBhdCB0aGUgbG9jYXRpb24gdG8gCi0gICAgICogd2hpY2ggdGhpcyBjdXJzb3Igc2hvdWxkIGJlIG1vdmVkLgotICAgICAqIEByZXR1cm4gIFRoZSBuZXh0IGNvcnJlc3BvbmRpbmcgYm9va21hcmssIGlmIGl0IGV4aXN0czsgbnVsbCBpZiB0aGVyZQotICAgICAqIGlzIG5vIG5leHQgYm9va21hcmsgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICAgKi8KLQotICAgIFhtbEJvb2ttYXJrIHRvTmV4dEJvb2ttYXJrICggT2JqZWN0IGtleSApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoaXMgY3Vyc29yIHRvIHRoZSBsb2NhdGlvbiBiZWZvcmUgaXRzIGN1cnJlbnQgcG9zaXRpb24KLSAgICAgKiB3aGVyZSBhIGJvb2ttYXJrIHdpdGggdGhlIGdpdmVuIGtleSBleGlzdHMuICBSZXR1cm5zIGZhbHNlIGlmIG5vCi0gICAgICogc3VjaCBib29rbWFyayBleGlzdHMuCi0gICAgICogCi0gICAgICogQHBhcmFtICBrZXkgIFRoZSBrZXkgaGVsZCBieSB0aGUgcHJldmlvdXMgYm9va21hcmsgYXQgdGhlIGxvY2F0aW9uIHRvIAotICAgICAqIHdoaWNoIHRoaXMgY3Vyc29yIHNob3VsZCBiZSBtb3ZlZC4KLSAgICAgKiBAcmV0dXJuICBUaGUgcHJldmlvdXMgY29ycmVzcG9uZGluZyBib29rbWFyaywgaWYgaXQgZXhpc3RzOyBudWxsIGlmIAotICAgICAqIHRoZXJlIGlzIG5vIHByZXZpb3VzIGJvb2ttYXJrIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICovCi0KLSAgICBYbWxCb29rbWFyayB0b1ByZXZCb29rbWFyayAoIE9iamVjdCBrZXkgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRva2VuLiBOYW1lcyBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoCi0gICAgICogU1RBUlQsIEFUVFIsIE5BTUVTUEFDRSBvciBQUk9DSU5TVC4gUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vCi0gICAgICogbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgdG9rZW4uIEZvciBTVEFSVCBhbmQgQVRUUiwgdGhlIAotICAgICAqIG5hbWUgcmV0dXJuZWQgaWRlbnRpZmllcyB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBvciBhdHRyaWJ1dGUuIAotICAgICAqIEZvciBOQU1FU1BBQ0UsIHRoZSBsb2NhbCBwYXJ0IG9mIHRoZSBuYW1lIGlzIHRoZSBwcmVmaXgsIHdoaWxlIAotICAgICAqIHRoZSBVUkkgaXMgdGhlIG5hbWVzcGFjZSBkZWZpbmVkLiBGb3IgUFJPQ0lOU1QsIHRoZSBsb2NhbCBwYXJ0IAotICAgICAqIGlzIHRoZSB0YXJnZXQgYW5kIHRoZSB1cmkgaXMgIiIuCi0gICAgICogCi0gICAgICogQHJldHVybiAgVGhlIG5hbWUgb2YgdGhlIFhNTCBhdCB0aGlzIGN1cnNvcidzIGxvY2F0aW9uOyBudWxsIGlmIHRoZXJlCi0gICAgICogaXMgbm8gbmFtZS4KLSAgICAgKi8KLQotICAgIFFOYW1lIGdldE5hbWUgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdG9rZW4uIFRoaXMgdG9rZW4gY2FuIGJlIFNUQVJULCBOQU1FU1BBQ0UsCi0gICAgICogQVRUUiBvciBQUk9DSU5TVC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBuZXcgbmFtZSBmb3IgdGhlIGN1cnJlbnQgdG9rZW4uCi0gICAgICovCi0KLSAgICB2b2lkIHNldE5hbWUgKCBRTmFtZSBuYW1lICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIFVSSSBpbmRpY2F0ZWQgYnkgdGhlIGdpdmVuIHByZWZpeC4gVGhlIGN1cnJlbnQKLSAgICAgKiBjb250ZXh0IG11c3QgYmUgYXQgYSBTVEFSVCBvciBTVEFSVERPQy4gTmFtZXNwYWNlIHByZWZpeCBtYXBwaW5ncwotICAgICAqIGFyZSBxdWVyaWVkIGZvciB0aGUgbWFwcGluZ3MgZGVmaW5lZCBhdCB0aGUgY3VycmVudCBjb250YWluZXIgZmlyc3QsCi0gICAgICogdGhlbiBwYXJlbnRzIGFyZSBxdWVyaWVkLiBUaGUgcHJlZml4IGNhbiBiZSAiIiBvciBudWxsIHRvIGluZGljYXRlCi0gICAgICogYSBzZWFyY2ggZm9yIHRoZSBkZWZhdWx0IG5hbWVzcGFjZS48YnIvPjxici8+LgotICAgICAqIAotICAgICAqIE5vdGUgdGhhdCB0aGlzIHF1ZXJpZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGRvY3VtZW50LiBXaGVuIHRoZSAKLSAgICAgKiBkb2N1bWVudCBpcyBwZXJzaXN0ZWQsIHRoZSBzYXZpbmcgbWVjaGFuaXNtIG1heSBzeW50aGVzaXplIG5hbWVzcGFjZXMgCi0gICAgICogKG5zMSwgbnMyLCBhbmQgc28gb24pIGZvciB0aGUgcHVycG9zZXMgb2YgcGVyc2lzdGVuY2UuIFRoZXNlIG5hbWVwYWNlcyBhcmUgCi0gICAgICogb25seSBwcmVzZW50IGluIHRoZSBzZXJpYWxpemVkIGZvcm0sIGFuZCBhcmUgbm90IHJlZmxlY3RlZCBiYWNrIGludG8gCi0gICAgICogdGhlIGRvY3VtZW50IGJlaW5nIHNhdmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgcHJlZml4ICBUaGUgbmFtZXNwYWNlIHByZWZpeCBmb3IgdGhlIHJlcXVlc3RlZCBuYW1lc3BhY2UuCi0gICAgICogQHJldHVybiAgVGhlIFVSSSBmb3IgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIHByZWZpeCBpZiBpdAotICAgICAqIGV4aXN0czsgb3RoZXJ3aXNlLCBudWxsLgotICAgICAqLwotICAgIFN0cmluZyBuYW1lc3BhY2VGb3JQcmVmaXggKCBTdHJpbmcgcHJlZml4ICk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcHJlZml4IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgYSBuYW1lc3BhY2UgVVJJLiAgVGhlCi0gICAgICogY3VycmVudCBjb250ZXh0IG11c3QgYmUgYXQgYSBTVEFSVCBvciBTVEFSVERPQy4gIElmIHRoZXJlIGlzIGFuCi0gICAgICogZXhpc3RpbmcgcHJlZml4IHRoYXQgaW5kaWNhdGVzIHRoZSBVUkkgaW4gdGhlIGN1cnJlbnQgY29udGV4dCwgdGhhdAotICAgICAqIHByZWZpeCBtYXkgYmUgcmV0dXJuZWQuIE90aGVyd2lzZSwgYSBuZXcgcHJlZml4IGZvciB0aGUgVVJJIHdpbGwgYmUKLSAgICAgKiBkZWZpbmVkIGJ5IGFkZGluZyBhbiB4bWxucyBhdHRyaWJ1dGUgdG8gdGhlIGN1cnJlbnQgY29udGFpbmVyIG9yIGEKLSAgICAgKiBwYXJlbnQgY29udGFpbmVyLgotICAgICAqIAotICAgICAqIE5vdGUgdGhhdCB0aGlzIHF1ZXJpZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGRvY3VtZW50LiBXaGVuIHRoZSAKLSAgICAgKiBkb2N1bWVudCBpcyBwZXJzaXN0ZWQsIHRoZSBzYXZpbmcgbWVjaGFuaXNtIG1heSBzeW50aGVzaXplIG5hbWVzcGFjZXMgCi0gICAgICogKG5zMSwgbnMyLCBhbmQgc28gb24pIGZvciB0aGUgcHVycG9zZXMgb2YgcGVyc2lzdGVuY2UuIFRoZXNlIG5hbWVwYWNlcyBhcmUgCi0gICAgICogb25seSBwcmVzZW50IGluIHRoZSBzZXJpYWxpemVkIGZvcm0sIGFuZCBhcmUgbm90IHJlZmxlY3RlZCBiYWNrIGludG8gCi0gICAgICogdGhlIGRvY3VtZW50IGJlaW5nIHNhdmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbmFtZXNwYWNlVVJJICBUaGUgbmFtZXNwYWNlIFVSSSBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXF1ZXN0ZWQKLSAgICAgKiBwcmVmaXguCi0gICAgICogQHJldHVybiAgVGhlIHByZWZpeCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgVVJJIGlmIGl0IGV4aXN0czsgCi0gICAgICogb3RoZXJ3aXNlLCBhIG5ld2x5IGdlbmVyYXRlZCBwcmVmaXguCi0gICAgICovCi0gICAgU3RyaW5nIHByZWZpeEZvck5hbWVzcGFjZSAoIFN0cmluZyBuYW1lc3BhY2VVUkkgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIHRvIHRoZSBzcGVjaWZpZWQgbWFwLCBhbGwgdGhlIG5hbWVzcGFjZXMgaW4gc2NvcGUgYXQgdGhlIGNvbnRhaW5lcgotICAgICAqIHdoZXJlIHRoaXMgY3Vyc29yIGlzIHBvc2l0aW9uZWQuIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgCi0gICAgICogY29udGFpbmVyIHRva2VucyBvbmx5LgotICAgICAqIAotICAgICAqIEBwYXJhbSAgYWRkVG9UaGlzICBUaGUgTWFwIHRvIGFkZCB0aGUgbmFtZXNwYWNlcyB0by4KLSAgICAgKi8KLQotICAgIHZvaWQgZ2V0QWxsTmFtZXNwYWNlcyAoIE1hcCBhZGRUb1RoaXMgKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cm9uZ2x5LXR5cGVkIFhtbE9iamVjdCBhdCB0aGUgY3VycmVudCBTVEFSVCwKLSAgICAgKiBTVEFSVERPQywgb3IgQVRUUi4gPGJyLz48YnIvPgotICAgICAqIAotICAgICAqIFRoZSBzdHJvbmdseS10eXBlZCBvYmplY3QgY2FuIGJlIGNhc3QgdG8gdGhlIHN0cm9uZ2x5LXR5cGVkCi0gICAgICogWEJlYW4gaW50ZXJmYWNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFhNTCBTY2hlbWEgVHlwZSBnaXZlbgotICAgICAqIGJ5IHJlc3VsdC5nZXRTY2hlbWFUeXBlKCkuPGJyLz48YnIvPgotICAgICAqCi0gICAgICogSWYgYSBtb3JlIHNwZWNpZmljIHR5cGUgY2Fubm90IGJlIGRldGVybWluZWQsIGFuIFhtbE9iamVjdAotICAgICAqIHdob3NlIHNjaGVtYSB0eXBlIGlzIGFueVR5cGUgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICBUaGUgc3Ryb25nbHktdHlwZWQgb2JqZWN0IGF0IHRoZSBjdXJzb3IncyBjdXJyZW50IGxvY2F0aW9uOwotICAgICAqIG51bGwgaWYgdGhlIGN1cnJlbnQgbG9jYXRpb24gaXMgbm90IGEgU1RBUlQsIFNUQVJURE9DLCBvciBBVFRSLgotICAgICAqLwotCi0gICAgWG1sT2JqZWN0IGdldE9iamVjdCAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCB0b2tlbi4gQnkgZGVmaW5pdGlvbiwgdGhlIGN1cnJlbnQKLSAgICAgKiB0b2tlbiBpcyB0aGUgdG9rZW4gaW1tZWRpYXRlbHkgdG8gdGhlIHJpZ2h0IG9mIHRoZSBjdXJzb3IuIAotICAgICAqIElmIHlvdSdyZSBpbiB0aGUgbWlkZGxlIG9mIHRleHQsIGJlZm9yZSBhIGNoYXJhY3RlciwgeW91IGdldCBURVhULgotICAgICAqIFlvdSBjYW4ndCBkaXZlIGludG8gdGhlIHRleHQgb2YgYW4gQVRUUiwgQ09NTUVOVCBvciBQUk9DSU5TVC48YnIvPjxici8+Ci0gICAgICogCi0gICAgICogQXMgYW4gYWx0ZXJuYXRpdmUsIGl0IG1heSBiZSBtb3JlIGNvbnZlbmllbnQgZm9yIHlvdSB0byB1c2Ugb25lIG9mIHRoZSAKLSAgICAgKiBtZXRob2RzIHRoYXQgdGVzdCBmb3IgYSBwYXJ0aWN1bGFyIHRva2VuIHR5cGUuIFRoZXNlIGluY2x1ZGUgdGhlIG1ldGhvZHMgCi0gICAgICogaXNTdGFydCgpLCBpc1N0YXJ0ZG9jKCksIGlzVGV4dCgpLCBpc0F0dHIoKSwgYW5kIHNvIG9uLiBFYWNoIHJldHVybnMgYSBib29sZWFuIAotICAgICAqIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdG9rZW4gdGhhdCBmb2xsb3dzIHRoZSBjdXJzb3IgaXMgdGhlIHR5cGUgCi0gICAgICogaW4gcXVlc3Rpb24uIAotICAgICAqIDxici8+PGJyLz4KLSAgICAgKgotICAgICAqIEByZXR1cm4gIFRoZSBUb2tlblR5cGUgaW5zdGFuY2UgZm9yIHRoZSB0b2tlbiBhdCB0aGUgY3Vyc29yJ3MgY3VycmVudAotICAgICAqIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgVG9rZW5UeXBlIGN1cnJlbnRUb2tlblR5cGUgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgYSBTVEFSVERPQyB0b2tlbiB0eXBlLCBtZWFuaW5nIAotICAgICAqIGF0IHRoZSB2ZXJ5IHJvb3Qgb2YgdGhlIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIFNUQVJURE9DIHRva2VuIHR5cGU7IAotICAgICAqIG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIGlzU3RhcnRkb2MgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyB0b2tlbiBpcyBhbiBFTkRET0MgdG9rZW4gdHlwZSwgbWVhbmluZyAKLSAgICAgKiBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhbiBFTkRET0MgdG9rZW4gdHlwZTsgCi0gICAgICogb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gaXNFbmRkb2MgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIFNUQVJUIHRva2VuIHR5cGUsIG1lYW5pbmcgCi0gICAgICoganVzdCBiZWZvcmUgYW4gZWxlbWVudCdzIHN0YXJ0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIFNUQVJUIHRva2VuIHR5cGU7IAotICAgICAqIG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIGlzU3RhcnQgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyB0b2tlbiBpcyBhbiBFTkQgdG9rZW4gdHlwZSwgbWVhbmluZyAKLSAgICAgKiBqdXN0IGJlZm9yZSBhbiBlbGVtZW50J3MgZW5kLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhbiBFTkQgdG9rZW4gdHlwZTsgCi0gICAgICogb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gaXNFbmQgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIHRoaXMgdG9rZW4gaXMgYSBURVhUIHRva2VuIHR5cGUsIG1lYW5pbmcgCi0gICAgICoganVzdCBiZWZvcmUgb3IgaW5zaWRlIHRleHQuCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgVEVYVCB0b2tlbiB0eXBlOyAKLSAgICAgKiBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBpc1RleHQgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyB0b2tlbiBpcyBhbiBBVFRSIHRva2VuIHR5cGUsIG1lYW5pbmcgCi0gICAgICoganVzdCBiZWZvcmUgYW4gYXR0cmlidXRlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhbiBBVFRSIHRva2VuIHR5cGU7IAotICAgICAqIG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIGlzQXR0ciAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgTkFNRVNQQUNFIHRva2VuIHR5cGUsIG1lYW5pbmcgCi0gICAgICoganVzdCBiZWZvcmUgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgTkFNRVNQQUNFIHRva2VuIHR5cGU7IAotICAgICAqIG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIGlzTmFtZXNwYWNlICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBDT01NRU5UIHRva2VuIHR5cGUsIG1lYW5pbmcgCi0gICAgICoganVzdCBiZWZvcmUgYSBjb21tZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIENPTU1FTlQgdG9rZW4gdHlwZTsgCi0gICAgICogb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gaXNDb21tZW50ICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBQUk9DSU5TVCB0b2tlbiB0eXBlLCBtZWFuaW5nIAotICAgICAqIGp1c3QgYmVmb3JlIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBQUk9DSU5TVCB0b2tlbiB0eXBlOyAKLSAgICAgKiBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBpc1Byb2NpbnN0ICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBjb250YWluZXIgdG9rZW4uIFRoZSBTVEFSVERPQyBhbmQgU1RBUlQgCi0gICAgICogdG9rZW4gdHlwZXMgYXJlIGNvbnRhaW5lcnMuIENvbnRhaW5lcnMsIGluY2x1ZGluZyBkb2N1bWVudHMgYW5kIGVsZW1lbnRzLAotICAgICAqIGhhdmUgdGhlIHNhbWUgY29udGVudCBtb2RlbC4gSW4gb3RoZXIgd29yZHMsIGEgZG9jdW1lbnQgYW5kIGFuIGVsZW1lbnQgCi0gICAgICogbWF5IGhhdmUgdGhlIHNhbWUgY29udGVudHMuIEZvciBleGFtcGxlLCBhIGRvY3VtZW50IG1heSBjb250YWluIGF0dHJpYnV0ZXMgCi0gICAgICogb3IgdGV4dCwgd2l0aG91dCBhbnkgY2hpbGQgZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgY29udGFpbmVyIHRva2VuOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBpc0NvbnRhaW5lciAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgZmluaXNoIHRva2VuLiBBIGZpbmlzaCB0b2tlbiBjYW4gYmUgYW4gRU5ERE9DCi0gICAgICogb3IgRU5EIHRva2VuIHR5cGUuCi0KLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBmaW5pc2ggdG9rZW47IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIGlzRmluaXNoICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYW55IGF0dHJpYnV0ZS4gVGhpcyBpbmNsdWRlcyBhbiBBVFRSIHRva2VuIHR5cGUgYW5kCi0gICAgICogdGhlIE5BTUVTUEFDRSB0b2tlbiB0eXBlIGF0dHJpYnV0ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJyZW50IGN1cnNvciBpcyBhdCBhbnkgYXR0cmlidXRlOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBpc0FueUF0dHIgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIHByZXZpb3VzIHRva2VuLiBCeSBkZWZpbml0aW9uLCB0aGUgcHJldmlvdXMKLSAgICAgKiB0b2tlbiBpcyB0aGUgdG9rZW4gaW1tZWRpYXRlbHkgdG8gdGhlIGxlZnQgb2YgdGhlIGN1cnNvci48YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBJZiB5b3UncmUgaW4gdGhlIG1pZGRsZSBvZiB0ZXh0LCBhZnRlciBhIGNoYXJhY3RlciwgeW91IGdldCBURVhULgotICAgICAqIAotICAgICAqIEByZXR1cm4gIFRoZSBUb2tlblR5cGUgaW5zdGFuY2UgZm9yIHRoZSB0b2tlbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIAotICAgICAqIHRva2VuIGF0IHRoZSBjdXJzb3IncyBjdXJyZW50IGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgVG9rZW5UeXBlIHByZXZUb2tlblR5cGUgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlcmUgaXMgYSBuZXh0IHRva2VuLiBXaGVuIHRoaXMgaXMgZmFsc2UsIGFzIHdoZW4gdGhlIGN1cnNvciBpcwotICAgICAqIGF0IHRoZSBFTkRET0MgdG9rZW4sIHRoZSB0b05leHRUb2tlbigpIG1ldGhvZCByZXR1cm5zIE5PTkUgYW5kIGRvZXMgbm90IAotICAgICAqIG1vdmUgdGhlIGN1cnNvci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZXJlIGlzIGEgbmV4dCB0b2tlbjsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gaGFzTmV4dFRva2VuICggKTsKLQotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIHRva2VuLiBXaGVuIHRoaXMgaXMgZmFsc2UsIHRvUHJldlRva2VuCi0gICAgICogcmV0dXJucyBOT05FIGFuZCBkb2VzIG5vdCBtb3ZlIHRoZSBjdXJzb3IuCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIHRva2VuOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBoYXNQcmV2VG9rZW4gKCApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIG5leHQgdG9rZW4uIFdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgdG9rZW5zIAotICAgICAqIGF2YWlsYWJsZSwgaGFzTmV4dFRva2VuIHJldHVybnMgZmFsc2UgYW5kIHRvTmV4dFRva2VuKCkgcmV0dXJucyAKLSAgICAgKiBOT05FIGFuZCBkb2VzIG5vdCBtb3ZlIHRoZSBjdXJzb3IuIFJldHVybnMgdGhlIHRva2VuIHR5cGUgCi0gICAgICogb2YgdGhlIHRva2VuIHRvIHRoZSByaWdodCBvZiB0aGUgY3Vyc29yIHVwb24gYSBzdWNjZXNzZnVsIG1vdmUuCi0gICAgICogCi0gICAgICogQHJldHVybiAgVGhlIHRva2VuIHR5cGUgZm9yIHRoZSBuZXh0IHRva2VuIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOwotICAgICAqIG90aGVyd2lzZSwgTk9ORS4KLSAgICAgKi8KLQotICAgIFRva2VuVHlwZSB0b05leHRUb2tlbiAoICk7Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBwcmV2aW91cyB0b2tlbi4gV2hlbiB0aGVyZSBpcyBubwotICAgICAqIHByZXZpb3VzIHRva2VuLCByZXR1cm5zIE5PTkUsIG90aGVyd2lzZSByZXR1cm5zIHRoZSB0b2tlbgotICAgICAqIHRvIHRoZSBsZWZ0IG9mIHRoZSBuZXcgcG9zaXRpb24gb2YgdGhlIGN1cnNvci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICBUaGUgdG9rZW4gdHlwZSBmb3IgdGhlIHByZXZpb3VzIHRva2VuIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOwotICAgICAqIG90aGVyd2lzZSwgTk9ORS4KLSAgICAgKi8KLQotICAgIFRva2VuVHlwZSB0b1ByZXZUb2tlbiAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQKLSAgICAgKiBTVEFSVCBvciBTVEFSVERPQy4gVGhhdCBpcywgdGhlIGZpcnN0IHRva2VuIGFmdGVyIGFsbCBBVFRSIGFuZCBOQU1FU1BBQ0UKLSAgICAgKiB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgU1RBUlQuPGJyLz48YnIvPgotICAgICAqCi0gICAgICogSWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgbm90IGEgU1RBUlQgb3IgU1RBUlRET0MsIHRoZSBjdXJzb3IgaXMgbm90Ci0gICAgICogbW92ZWQgYW5kIE5PTkUgaXMgcmV0dXJuZWQuIElmIHRoZSBjdXJyZW50IFNUQVJUIG9yIFNUQVJURE9DCi0gICAgICogaGFzIG5vIGNvbnRlbnQsIHRoZSBjdXJzb3IgaXMgbW92ZWQgdG8gdGhlIEVORCBvciBFTkRET0MgdG9rZW4uPGJyLz48YnIvPgotICAgICAqIAotICAgICAqIEByZXR1cm4gIFRoZSBuZXcgY3VycmVudCB0b2tlbiB0eXBlLgotICAgICAqLwotCi0gICAgVG9rZW5UeXBlIHRvRmlyc3RDb250ZW50VG9rZW4gKCApOwotCi0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBFTkQgb3IgRU5ERE9DIHRva2VuIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAgICogY3VycmVudCBTVEFSVCBvciBTVEFSVERPQywgYW5kIHJldHVybnMgRU5EIG9yIEVORERPQy4gPGJyLz48YnIvPgotICAgICAqCi0gICAgICogSWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgbm90IGEgU1RBUlQgb3IgU1RBUlRET0MsIHRoZSBjdXJzb3IgaXMgbm90Ci0gICAgICogbW92ZWQgYW5kIE5PTkUgaXMgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiAgVGhlIG5ldyBjdXJyZW50IHRva2VuIHR5cGUuCi0gICAgICovCi0KLSAgICBUb2tlblR5cGUgdG9FbmRUb2tlbiAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciBmb3J3YXJkIGJ5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMsIGFuZAotICAgICAqIHN0b3BzIGF0IHRoZSBuZXh0IG5vbi1URVhUIHRva2VuLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycwotICAgICAqIGFjdHVhbGx5IG1vdmVkIGFjcm9zcywgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gIAotICAgICAqIDxlbT5tYXhDaGFyYWN0ZXJDb3VudDwvZW0+LiBJZiB0aGVyZSBpcyBubyBmdXJ0aGVyIHRleHQsIG9yIGlmIAotICAgICAqIHRoZXJlIGlzIG5vIHRleHQgYXQgYWxsLCByZXR1cm5zIHplcm8uPGJyLz48YnIvPgotICAgICAqCi0gICAgICogTm90ZSB0aGlzIGRvZXMgbm90IGRpdmUgaW50byBhdHRyaWJ1dGUgdmFsdWVzLCBjb21tZW50IGNvbnRlbnRzLAotICAgICAqIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gY29udGVudHMsIGV0Yy4sIGJ1dCBvbmx5IGNvbnRlbnQgdGV4dC48YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBZb3UgY2FuIHBhc3MgbWF4Q2hhcmFjdGVyQ291bnQgJmx0OyAwIHRvIG1vdmUgb3ZlciBhbGwgdGhlIHRleHQgdG8gdGhlIAotICAgICAqIHJpZ2h0LiBUaGlzIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgdG9OZXh0VG9rZW4sIGJ1dCByZXR1cm5zIHRoZSBhbW91bnQgCi0gICAgICogb2YgdGV4dCBtb3ZlZCBvdmVyLgotICAgICAqCi0gICAgICogQHBhcmFtICBtYXhDaGFyYWN0ZXJDb3VudCAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYnkgd2hpY2gKLSAgICAgKiB0aGUgY3Vyc29yIHNob3VsZCBiZSBtb3ZlZC4KLSAgICAgKiBAcmV0dXJuICBUaGUgYWN0dWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIGJ5IHdoaWNoIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyAKLSAgICAgKiAwIGlmIHRoZSBjdXJzb3Igd2FzIG5vdCBtb3ZlZC4KLSAgICAgKi8KLQotICAgIGludCB0b05leHRDaGFyICggaW50IG1heENoYXJhY3RlckNvdW50ICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciBiYWNrd2FyZHMgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGdpdmVuLiAgSGFzCi0gICAgICogc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgdG8gdGhlIHtAbGluayAjdG9OZXh0Q2hhcihpbnQpIHRvTmV4dENoYXJ9IG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG1heENoYXJhY3RlckNvdW50ICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBieSB3aGljaAotICAgICAqIHRoZSBjdXJzb3Igc2hvdWxkIGJlIG1vdmVkLgotICAgICAqIEByZXR1cm4gIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYnkgd2hpY2ggdGhlIGN1cnNvciB3YXMgbW92ZWQ7IAotICAgICAqIDAgaWYgdGhlIGN1cnNvciB3YXMgbm90IG1vdmVkLgotICAgICAqLwotCi0gICAgaW50IHRvUHJldkNoYXIgKCBpbnQgbWF4Q2hhcmFjdGVyQ291bnQgKTsKLQotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIG5leHQgc2libGluZyBlbGVtZW50LCBvciByZXR1cm5zCi0gICAgICogZmFsc2UgYW5kIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvciBpZiB0aGVyZSBpcyBubyBuZXh0IHNpYmxpbmcKLSAgICAgKiBlbGVtZW50LiAoQnkgZGVmaW5pdGlvbiB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCBpcyB0aGUgc2FtZQotICAgICAqIGFzIHRoZSBwb3NpdGlvbiBvZiBpdHMgU1RBUlQgdG9rZW4uKQotICAgICAqCi0gICAgICogSWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgbm90IHMgU1RBUlQsIHRoZSBjdXJzb3Igd2lsbCBiZSAKLSAgICAgKiBtb3ZlZCB0byB0aGUgbmV4dCBTVEFSVCB3aXRob3V0IG1vdmluZyBvdXQgb2YgdGhlIHNjb3BlIG9mIHRoZSAKLSAgICAgKiBjdXJyZW50IGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9OZXh0U2libGluZyAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgc2libGluZyBlbGVtZW50LCBvciByZXR1cm5zCi0gICAgICogZmFsc2UgYW5kIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvciBpZiB0aGVyZSBpcyBubyBwcmV2aW91cyBzaWJsaW5nCi0gICAgICogZWxlbWVudC4gKEJ5IGRlZmluaXRpb24gdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgaXMgdGhlIHNhbWUKLSAgICAgKiBhcyB0aGUgcG9zaXRpb24gb2YgaXRzIFNUQVJUIHRva2VuLikKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b1ByZXZTaWJsaW5nICggKTsKLQotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIHBhcmVudCBlbGVtZW50IG9yIFNUQVJURE9DLCBvciByZXR1cm5zCi0gICAgICogZmFsc2UgYW5kIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvciBpZiB0aGVyZSBpcyBubyBwYXJlbnQuPGJyLz48YnIvPgotICAgICAqCi0gICAgICogV29ya3MgaWYgeW91J3JlIGluIGF0dHJpYnV0ZXMgb3IgY29udGVudC4gUmV0dXJucyBmYWxzZSBvbmx5IGlmIGF0Ci0gICAgICogU1RBUlRET0MuIE5vdGUgdGhhdCB0aGUgcGFyZW50IG9mIGFuIEVORCB0b2tlbiBpcyB0aGUgY29ycmVzcG9uZGluZwotICAgICAqIFNUQVJUIHRva2VuLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IGZhbHNlIGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIFNUQVJURE9DCi0gICAgICogdG9rZW4uCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvUGFyZW50ICggKTsKLQotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQsIG9yIHJldHVybnMgZmFsc2UgYW5kCi0gICAgICogZG9lcyBub3QgbW92ZSB0aGUgY3Vyc29yIGlmIHRoZXJlIGFyZSBubyBlbGVtZW50IGNoaWxkcmVuLiA8YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBJZiB0aGUgY3Vyc29yIGlzIG5vdCBjdXJyZW50bHkgaW4gYW4gZWxlbWVudCwgaXQgbW92ZXMgaW50byB0aGUgCi0gICAgICogZmlyc3QgY2hpbGQgZWxlbWVudCBvZiB0aGUgbmV4dCBlbGVtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvRmlyc3RDaGlsZCAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgbGFzdCBlbGVtZW50IGNoaWxkLCBvciByZXR1cm5zIGZhbHNlIGFuZAotICAgICAqIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvciBpZiB0aGVyZSBhcmUgbm8gZWxlbWVudCBjaGlsZHJlbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b0xhc3RDaGlsZCAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgZmlyc3QgY2hpbGQgZWxlbWVudCBvZiB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gCi0gICAgICogbm8gbmFtZXNwYWNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbmFtZSAgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gbW92ZSB0aGUgY3Vyc29yIHRvLgotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvQ2hpbGQgKCBTdHJpbmcgbmFtZSApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgb2YgdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgbmFtZXNwYWNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbmFtZXNwYWNlICBUaGUgbmFtZXNwYWNlIFVSSSBmb3IgdGhlIGVsZW1lbnQgdG8gbW92ZSB0aGUgY3Vyc29yIAotICAgICAqIHRvLgotICAgICAqIEBwYXJhbSAgbmFtZSAgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gbW92ZSB0by4KLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b0NoaWxkICggU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUgKTsKLQotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgb2YgdGhlIHNwZWNpZmllZCBxdWFsaWZpZWQgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIG1vdmUgdGhlIGN1cnNvciB0by4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9DaGlsZCAoIFFOYW1lIG5hbWUgKTsKLQotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGNoaWxkIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IDxlbT5pbmRleDwvZW0+LgotICAgICAqIAotICAgICAqIEBwYXJhbSAgaW5kZXggIFRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCBpbiB0aGUgc2VxdWVuY2Ugb2YgY2hpbGQgCi0gICAgICogZWxlbWVudHMuCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9DaGlsZCAoIGludCBpbmRleCApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIHNwZWNpZmllZCA8ZW0+aW5kZXg8L2VtPiBjaGlsZCBlbGVtZW50IG9mIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgbmFtZSwgd2hlcmUgdGhhdCBlbGVtZW50IGlzIHRoZSAuCi0gICAgICogCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgbmFtZSBvZiB0aGUgY2hpbGQgZWxlbWVudCB0byBtb3ZlIHRoZSBjdXJzb3IgdG8uCi0gICAgICogQHBhcmFtICBpbmRleCAgVGhlIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZSBvZiBjaGlsZAotICAgICAqIGVsZW1lbnRzLgotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvQ2hpbGQgKCBRTmFtZSBuYW1lLCBpbnQgaW5kZXggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudCBvZiB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gbm8KLSAgICAgKiBuYW1lc3BhY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBtb3ZlIHRoZSBjdXJzb3IgdG8uCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9OZXh0U2libGluZyAoIFN0cmluZyBuYW1lICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQgb2YgdGhlIHNwZWNpZmllZCBuYW1lIAotICAgICAqIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbmFtZXNwYWNlICBUaGUgbmFtZXNwYWNlIFVSSSBmb3IgdGhlIGVsZW1lbnQgdG8gbW92ZSB0aGUgY3Vyc29yCi0gICAgICogdG8uCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBtb3ZlIHRoZSBjdXJzb3IgdG8uCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gdG9OZXh0U2libGluZyAoIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lICk7Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudCBvZiB0aGUgc3BlY2lmaWVkIAotICAgICAqIHF1YWxpZmllZCBuYW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbmFtZSAgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gbW92ZSB0aGUgY3Vyc29yIHRvLgotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvTmV4dFNpYmxpbmcgKCBRTmFtZSBuYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBmaXJzdCBhdHRyaWJ1dGUgb2YgdGhpcyBlbGVtZW50LCBvcgotICAgICAqIHJldHVybnMgZmFsc2UgYW5kIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvciBpZiB0aGVyZSBhcmUgbm8KLSAgICAgKiBhdHRyaWJ1dGVzLiBUaGUgb3JkZXIgb2YgYXR0cmlidXRlcyBpcyBhcmJpdHJhcnksIGJ1dCBzdGFibGUuPGJyLz48YnIvPgotICAgICAqCi0gICAgICogeG1sbnMgYXR0cmlidXRlcyAobmFtZXNwYWNlIGRlY2xhcmF0aW9ucykgYXJlIG5vdCBjb25zaWRlcmVkIAotICAgICAqIGF0dHJpYnV0ZXMgYnkgdGhpcyBmdW5jdGlvbi48YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBUaGUgY3Vyc29yIG11c3QgYmUgb24gYSBTVEFSVCBvciBTVEFSVERPQyBmb3IgdGhpcyBtZXRob2QgdG8KLSAgICAgKiBzdWNjZWVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvRmlyc3RBdHRyaWJ1dGUgKCApOwotICAgIAotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGxhc3QgYXR0cmlidXRlIG9mIHRoaXMgZWxlbWVudCwgb3IKLSAgICAgKiByZXR1cm5zIGZhbHNlIGFuZCBkb2VzIG5vdCBtb3ZlIHRoZSBjdXJzb3IgaWYgdGhlcmUgYXJlIG5vCi0gICAgICogYXR0cmlidXRlcy4gVGhlIG9yZGVyIG9mIGF0dHJpYnV0ZXMgaXMgYXJiaXRyYXJ5LCBidXQgc3RhYmxlLjxici8+PGJyLz4KLSAgICAgKgotICAgICAqIHhtbG5zIGF0dHJpYnV0ZXMgKG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMpIGFyZSBub3QgY29uc2lkZXJlZCAKLSAgICAgKiBhdHRyaWJ1dGVzIGJ5IHRoaXMgZnVuY3Rpb24uPGJyLz48YnIvPgotICAgICAqCi0gICAgICogVGhlIGN1cnNvciBtdXN0IGJlIG9uIGEgU1RBUlQgb3IgU1RBUlRET0MgZm9yIHRoaXMgbWV0aG9kCi0gICAgICogdG8gc3VjY2VlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b0xhc3RBdHRyaWJ1dGUgKCApOwotCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgbmV4dCBzaWJsaW5nIGF0dHJpYnV0ZSwgb3IgcmV0dXJucwotICAgICAqIGZhbHNlIGFuZCBkb2VzIG5vdCBtb3ZlIHRoZSBjdXJzb3IgaWYgdGhlcmUgaXMgbm8gbmV4dAotICAgICAqIHNpYmxpbmcgYXR0cmlidXRlLiBUaGUgb3JkZXIgb2YgYXR0cmlidXRlcyBpcyBhcmJpdHJhcnksIGJ1dCBzdGFibGUuPGJyLz48YnIvPgotICAgICAqIAotICAgICAqIHhtbG5zIGF0dHJpYnV0ZXMgKG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMpIGFyZSBub3QgY29uc2lkZXJlZCAKLSAgICAgKiBhdHRyaWJ1dGVzIGJ5IHRoaXMgZnVuY3Rpb24uPGJyLz48YnIvPgotICAgICAqCi0gICAgICogVGhlIGN1cnNvciBtdXN0IGJlIG9uIGFuIGF0dHJpYnV0ZSBmb3IgdGhpcyBtZXRob2QgdG8gc3VjY2VlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiB0b05leHRBdHRyaWJ1dGUgKCApOwotCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgc2libGluZyBhdHRyaWJ1dGUsIG9yIHJldHVybnMKLSAgICAgKiBmYWxzZSBhbmQgZG9lcyBub3QgbW92ZSB0aGUgY3Vyc29yIGlmIHRoZXJlIGlzIG5vIHByZXZpb3VzCi0gICAgICogc2libGluZyBhdHRyaWJ1dGUuIFRoZSBvcmRlciBvZiBhdHRyaWJ1dGVzIGlzIGFyYml0cmFyeSwgYnV0IHN0YWJsZS48YnIvPjxici8+Ci0gICAgICogCi0gICAgICogeG1sbnMgYXR0cmlidXRlcyAobmFtZXNwYWNlIGRlY2xhcmF0aW9ucykgYXJlIG5vdCBjb25zaWRlcmVkIAotICAgICAqIGF0dHJpYnV0ZXMgYnkgdGhpcyBmdW5jdGlvbi48YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBUaGUgY3Vyc29yIG11c3QgYmUgb24gYW4gYXR0cmlidXRlIGZvciB0aGlzIG1ldGhvZCB0byBzdWNjZWVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHRvUHJldkF0dHJpYnV0ZSAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogV2hlbiBhdCBhIFNUQVJUIG9yIFNUQVJURE9DLCByZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdGV4dCBmb3IgdGhlIGdpdmVuCi0gICAgICogYXR0cmlidXRlLiBXaGVuIG5vdCBhdCBhIFNUQVJUIG9yIFNUQVJURE9DIG9yIHRoZSBhdHRyaWJ1dGUgZG9lcyBub3QKLSAgICAgKiBleGlzdCwgcmV0dXJucyBudWxsLiAgCi0gICAgICogCi0gICAgICogQHBhcmFtICBhdHRyTmFtZSAgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSBpcyByZXF1ZXN0ZWQuCi0gICAgICogQHJldHVybiAgVGhlIGF0dHJpYnV0ZSdzIHZhbHVlIGlmIGl0IGhhcyBvbmU7IG90aGVyd2lzZSwgbnVsbC4KLSAgICAgKi8KLQotICAgIFN0cmluZyBnZXRBdHRyaWJ1dGVUZXh0ICggUU5hbWUgYXR0ck5hbWUgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBXaGVuIGF0IGEgU1RBUlQgb3IgU1RBUlRET0MsIHNldHMgdGhlIGF0dHJpYnV0ZSB0ZXh0IGZvciB0aGUgZ2l2ZW4KLSAgICAgKiBhdHRyaWJ1dGUuIFdoZW4gbm90IGF0IGEgU1RBUlQgb3IgU1RBUlRET0MgcmV0dXJucyBmYWxzZS4KLSAgICAgKiBJZiB0aGUgYXR0cmlidXRlIGRvZXMgbm90IGV4aXN0LCBvbmUgaXMgY3JlYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGF0dHJOYW1lICBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHdob3NlIHZhbHVlIGlzIGJlaW5nIHNldC4KLSAgICAgKiBAcGFyYW0gIHZhbHVlICBUaGUgbmV3IHZhbHVlIGZvciB0aGUgYXR0cmlidXRlLgotICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIG5ldyB2YWx1ZSB3YXMgc2V0OyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBzZXRBdHRyaWJ1dGVUZXh0ICggUU5hbWUgYXR0ck5hbWUsIFN0cmluZyB2YWx1ZSApOwotICAKLSAgICAvKioKLSAgICAgKiBXaGVuIGF0IGEgU1RBUlQgb3IgU1RBUlRET0MsIHJlbW92ZXMgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgYXR0ck5hbWUgIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZC4KLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgd2FzIHJlbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIHJlbW92ZUF0dHJpYnV0ZSAoIFFOYW1lIGF0dHJOYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LCBlbGVtZW50LCBhdHRyaWJ1dGUsCi0gICAgICogY29tbWVudCwgcHJvY2luc3Qgb3IgdGV4dCB0b2tlbi4gPGJyLz48YnIvPgotICAgICAqCi0gICAgICogV2hlbiBnZXR0aW5nIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGVsZW1lbnQsIG5vbi10ZXh0IGNvbnRlbnQgc3VjaAotICAgICAqIGFzIGNvbW1lbnRzIGFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBhcmUgaWdub3JlZCBhbmQgdGV4dCBpcyBjb25jYXRlbmF0ZWQuCi0gICAgICogRm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBuZXN0ZWQgZWxlbWVudCBjaGlsZHJlbiwgdGhpcwotICAgICAqIHJldHVybnMgdGhlIGNvbmNhdGVuYXRlZCB0ZXh0IG9mIGFsbCBtaXhlZCBjb250ZW50IGFuZCB0aGUKLSAgICAgKiB0ZXh0IG9mIGFsbCB0aGUgZWxlbWVudCBjaGlsZHJlbiwgcmVjdXJzaW5nIGluIGZpcnN0LXRvLWxhc3QKLSAgICAgKiBkZXB0aGZpcnN0IG9yZGVyLjxici8+PGJyLz4KLSAgICAgKgotICAgICAqIEZvciBhdHRyaWJ1dGVzLCB0aGlzIHJldHVybnMgdGhlIGF0dHJpYnV0ZSB2YWx1ZS48YnIvPjxici8+Ci0gICAgICoKLSAgICAgKiBGb3IgY29tbWVudHMgYW5kIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCB0aGlzIHJldHVybnMgdGhlIHRleHQgY29udGVudHMgCi0gICAgICogb2YgdGhlIGNvbW1lbnQgb3IgUEksIG5vdCBpbmNsdWRpbmcgdGhlIGRlbGltaXRpbmcgc2VxdWVuY2VzICZsdDshLS0gLS0mZ3Q7LCAmbHQ7PyA/Jmd0Oy4KLSAgICAgKjxici8+PGJyLz4KLSAgICAgKiBJZiB0aGUgY3VycmVudCB0b2tlbiBpcyBub3QgYSBTVEFSVCwgU1RBUlRET0MsIFRFWFQsIEFUVFIsIENPTU1FTlQsIG9yCi0gICAgICogUFJPQ0lOU1QsIHRoaXMgcmV0dXJucyBudWxsLiBUaGUgdmFsdWUgb2YgYW4gZW1wdHkgdGFnIGlzIHRoZQotICAgICAqIGVtcHR5IHN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICBUaGUgdGV4dCB2YWx1ZSBvZiB0aGUgY3VycmVudCB0b2tlbiwgaWYgdGhlIHRva2VuJ3MgdHlwZSBpcwotICAgICAqIFNUQVJULCBTVEFSVERPQywgVEVYVCwgQVRUUiwgQ09NTUVOVCwgb3IgUFJPQ0lOU1Q7IG51bGwgaWYgdGhlIHR5cGUgaXMKLSAgICAgKiBFTkQsIEVORERPQywgTk9ORSwgb3IgTkFNRVNQQUNFLgotICAgICAqLwotCi0gICAgU3RyaW5nIGdldFRleHRWYWx1ZSAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29waWVzIHRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LCBlbGVtZW50LCBhdHRyaWJ1dGUsCi0gICAgICogY29tbWVudCwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBvciB0ZXh0IHRva2VuLCBjb3VudGluZyByaWdodCBmcm9tIAotICAgICAqIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24gdXAgdG8gPGVtPm1heENoYXJhY3RlckNvdW50PC9lbT4sCi0gICAgICogYW5kIGNvcGllcyB0aGUgcmV0dXJuZWQgdGV4dCBpbnRvIDxlbT5yZXR1cm5lZENoYXJzPC9lbT4uIDxici8+PGJyLz4KLSAgICAgKiAKLSAgICAgKiBXaGVuIGdldHRpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gZWxlbWVudCwgbm9uLXRleHQgY29udGVudCBzdWNoCi0gICAgICogYXMgY29tbWVudHMgYW5kIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGFyZSBpZ25vcmVkIGFuZCB0ZXh0IGlzIGNvbmNhdGVuYXRlZC4KLSAgICAgKiBGb3IgZWxlbWVudHMgdGhhdCBoYXZlIG5lc3RlZCBlbGVtZW50IGNoaWxkcmVuLCB0aGlzCi0gICAgICogcmV0dXJucyB0aGUgY29uY2F0ZW5hdGVkIHRleHQgb2YgYWxsIG1peGVkIGNvbnRlbnQgYW5kIHRoZQotICAgICAqIHRleHQgb2YgYWxsIHRoZSBlbGVtZW50IGNoaWxkcmVuLCByZWN1cnNpbmcgaW4gZmlyc3QtdG8tbGFzdAotICAgICAqIGRlcHRoZmlyc3Qgb3JkZXIuPGJyLz48YnIvPgotICAgICAqCi0gICAgICogRm9yIGF0dHJpYnV0ZXMsIHRoaXMgcmV0dXJucyB0aGUgYXR0cmlidXRlIHZhbHVlLjxici8+PGJyLz4KLSAgICAgKgotICAgICAqIEZvciBjb21tZW50cyBhbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIHRoaXMgcmV0dXJucyB0aGUgdGV4dCBjb250ZW50cyAKLSAgICAgKiBvZiB0aGUgY29tbWVudCBvciBQSSwgbm90IGluY2x1ZGluZyB0aGUgZGVsaW1pdGluZyBzZXF1ZW5jZXMgJmx0OyEtLSAtLSZndDssICZsdDs/ID8mZ3Q7LgotICAgICAqIDxici8+PGJyLz4KLSAgICAgKiAKLSAgICAgKiBJZiB0aGUgY3VycmVudCB0b2tlbiBpcyBFTkQsIEVORERPQywgb3IgTkFNRVNQQUNFLCB0aGlzIHJldHVybnMgMC4gCi0gICAgICogVGhlIHZhbHVlIG9mIGFuIGVtcHR5IHRhZyBpcyB0aGUgZW1wdHkgc3RyaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgcmV0dXJuZWRDaGFycyAgQSBjaGFyYWN0ZXIgYXJyYXkgdG8gaG9sZCB0aGUgcmV0dXJuZWQgY2hhcmFjdGVycy4KLSAgICAgKiBAcGFyYW0gIG9mZnNldCAgVGhlIHBvc2l0aW9uIHdpdGhpbiByZXR1cm5lZENoYXJzIHRvIHdoaWNoIHRoZSBmaXJzdCBvZiB0aGUgCi0gICAgICogcmV0dXJuZWQgY2hhcmFjdGVycyBzaG91bGQgYmUgY29waWVkLgotICAgICAqIEBwYXJhbSAgbWF4Q2hhcmFjdGVyQ291bnQgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFmdGVyIHRoaXMgY3Vyc29yJ3MgCi0gICAgICogbG9jYXRpb24gdG8gY29weS4KLSAgICAgKiBAcmV0dXJuICBUaGUgYWN0dWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvcGllZDsgMCBpZiBubyBjaGFyYWN0ZXJzIAotICAgICAqIHdlcmUgY29waWVkLgotICAgICAqLwotCi0gICAgaW50IGdldFRleHRWYWx1ZSAoIGNoYXJbXSByZXR1cm5lZENoYXJzLCBpbnQgb2Zmc2V0LCBpbnQgbWF4Q2hhcmFjdGVyQ291bnQgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSBjdXJyZW50IFRFWFQgdG9rZW4uICBJZiB0aGUgY3VycmVudCB0b2tlbgotICAgICAqIGlzIG5vdCBURVhULCByZXR1cm5zICIiLiAgSWYgaW4gdGhlIG1pZGRsZSBvZiBhIFRFWFQgdG9rZW4sIHJldHVybnMKLSAgICAgKiB0aG9zZSBjaGFycyB0byB0aGUgcmlnaHQgb2YgdGhlIGN1cnNvciBvZiB0aGUgVEVYVCB0b2tlbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICBUaGUgcmVxdWVzdGVkIHRleHQ7IGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgY3VycmVudCB0b2tlbiB0eXBlIGlzCi0gICAgICogbm90IFRFWFQuCi0gICAgICovCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBYTUwgYXQgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiBpZiB0aGF0IFhNTCdzCi0gICAgICogdG9rZW4gdHlwZSBpcyBTVEFSVCwgU1RBUlRET0MsIEFUVFIsIENPTU1FTlQgb3IgUFJPQ0lOU1QuIDxici8+PGJyLz4KLSAgICAgKgotICAgICAqIEZvciBlbGVtZW50cyB0aGF0IGhhdmUgbmVzdGVkIGNoaWxkcmVuIHRoaXMgZmlyc3QgcmVtb3ZlcyBhbGwKLSAgICAgKiB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCBhbmQgcmVwbGFjZXMgaXQgd2l0aCB0aGUgZ2l2ZW4gdGV4dC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIHRleHQgIFRoZSB0ZXh0IHRvIHVzZSBhcyBhIG5ldyB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzICBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uICBJZiB0aGUgdG9rZW4gdHlwZSBhdCB0aGlzCi0gICAgICogY3Vyc29yJ3MgbG9jYXRpb24gaXMgbm90IFNUQVJULCBTVEFSVERPQywgQVRUUiwgQ09NTUVOVCBvcgotICAgICAqIFBST0NJTlNULgotICAgICAqLwotICAgIHZvaWQgc2V0VGV4dFZhbHVlICggU3RyaW5nIHRleHQgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBYTUwgYXQgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiAoaWYgdGhhdCBYTUwncwotICAgICAqIHRva2VuIHR5cGUgaXMgU1RBUlQsIFNUQVJURE9DLCBBVFRSLCBDT01NRU5UIG9yIFBST0NJTlNUKSB0byB0aGUgCi0gICAgICogY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXJyYXkuIDxici8+PGJyLz4KLSAgICAgKgotICAgICAqIEZvciBlbGVtZW50cyB0aGF0IGhhdmUgbmVzdGVkIGNoaWxkcmVuIHRoaXMgZmlyc3QgcmVtb3ZlcyBhbGwKLSAgICAgKiB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCBhbmQgcmVwbGFjZXMgaXQgd2l0aCB0aGUgZ2l2ZW4gdGV4dC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIHNvdXJjZUNoYXJzICBBIGNoYXJhY3RlciBhcnJheSBjb250YWluaW5nIHRoZSBYTUwncyBuZXcgdmFsdWUuCi0gICAgICogQHBhcmFtICBvZmZzZXQgIFRoZSBwb3NpdGlvbiB3aXRoaW4gc291cmNlQ2hhcnMgZnJvbSB3aGljaCB0aGUgZmlyc3Qgb2YgCi0gICAgICogdGhlIHNvdXJjZSBjaGFyYWN0ZXJzIHNob3VsZCBiZSBjb3BpZWQuCi0gICAgICogQHBhcmFtICBsZW5ndGggIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNldCBhcyB0aGUgWE1MJ3MgbmV3Ci0gICAgICogdmFsdWUuCi0gICAgICogQHRocm93cyAgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIHRva2VuIHR5cGUgYXQgdGhpcwotICAgICAqIGN1cnNvcidzIGxvY2F0aW9uIGlzIG5vdCBTVEFSVCwgU1RBUlRET0MsIEFUVFIsIENPTU1FTlQgb3IKLSAgICAgKiBQUk9DSU5TVC4KLSAgICAgKi8KLSAgICB2b2lkIHNldFRleHRWYWx1ZSAoIGNoYXJbXSBzb3VyY2VDaGFycywgaW50IG9mZnNldCwgaW50IGxlbmd0aCApOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjaGFyYWN0ZXJzIHRvIHRoZSByaWdodCBvZiB0aGUgY3Vyc29yIHVwIHRvIHRoZSBuZXh0IHRva2VuLgotICAgICAqLwotICAgIFN0cmluZyBnZXRDaGFycyAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29waWVzIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIG51bWJlciwgY291bnRpbmcgcmlnaHQgZnJvbSAKLSAgICAgKiB0aGlzIGN1cnNvcidzIGxvY2F0aW9uIHRvIHRoZSBjaGFyYWN0ZXIgYXQgPGVtPm1heENoYXJhY3RlckNvdW50PC9lbT4uICBUaGUgCi0gICAgICogcmV0dXJuZWQgY2hhcmFjdGVycyBhcmUgYWRkZWQgdG8gPGVtPnJldHVybmVkQ2hhcnM8L2VtPiwgd2l0aCB0aGUgZmlyc3QKLSAgICAgKiBjaGFyYWN0ZXIgY29waWVkIHRvIHRoZSA8ZW0+b2Zmc2V0PC9lbT4gcG9zaXRpb24uIFRoZSA8ZW0+bWF4Q2hhcmFjdGVyQ291bnQ8L2VtPiAKLSAgICAgKiBwYXJhbWV0ZXIgc2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIDxlbT5yZXR1cm5lZENoYXJzPC9lbT4gCi0gICAgICogbWludXMgPGVtPm9mZnNldDwvZW0+LiBDb3BpZXMgYSBudW1iZXIgb2YgY2hhcmFjdGVycywgd2hpY2ggaXMgCi0gICAgICogZWl0aGVyIDxlbT5tYXhDaGFyYWN0ZXJDb3VudDwvZW0+IG9yIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgbmV4dCB0b2tlbiwgCi0gICAgICogd2hpY2hldmVyIGlzIGxlc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtICByZXR1cm5lZENoYXJzICBBIGNoYXJhY3RlciBhcnJheSB0byBob2xkIHRoZSByZXR1cm5lZCBjaGFyYWN0ZXJzLgotICAgICAqIEBwYXJhbSAgb2Zmc2V0ICBUaGUgcG9zaXRpb24gd2l0aGluIHJldHVybmVkQ2hhcnMgYXQgd2hpY2ggdGhlIGZpcnN0IG9mIHRoZSAKLSAgICAgKiByZXR1cm5lZCBjaGFyYWN0ZXJzIHNob3VsZCBiZSBhZGRlZC4KLSAgICAgKiBAcGFyYW0gIG1heENoYXJhY3RlckNvdW50ICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhZnRlciB0aGlzIGN1cnNvcidzIAotICAgICAqIGxvY2F0aW9uIHRvIHJldHVybi4KLSAgICAgKiBAcmV0dXJuICBUaGUgYWN0dWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJldHVybmVkOyAwIGlmIG5vIGNoYXJhY3RlcnMgCi0gICAgICogd2VyZSByZXR1cm5lZCBvciBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBub3QgVEVYVC4gCi0gICAgICovCi0KLSAgICBpbnQgZ2V0Q2hhcnMgKCBjaGFyW10gcmV0dXJuZWRDaGFycywgaW50IG9mZnNldCwgaW50IG1heENoYXJhY3RlckNvdW50ICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgU1RBUlRET0MgdG9rZW4sIHdoaWNoIGlzIHRoZSAKLSAgICAgKiByb290IG9mIHRoZSBkb2N1bWVudC4KLSAgICAgKi8KLQotICAgIHZvaWQgdG9TdGFydERvYyAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgRU5ERE9DIHRva2VuLCB3aGljaCBpcyB0aGUgZW5kCi0gICAgICogb2YgdGhlIGRvY3VtZW50LgotICAgICAqLwotCi0gICAgdm9pZCB0b0VuZERvYyAoICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgc3BlY2lmaWVkIGN1cnNvciBpcyBpbiB0aGUgc2FtZSBkb2N1bWVudCBhcwotICAgICAqIHRoaXMgY3Vyc29yLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgY3Vyc29yICBUaGUgY3Vyc29yIHRoYXQgbWF5IGJlIGluIHRoZSBzYW1lIGRvY3VtZW50Ci0gICAgICogYXMgdGhpcyBjdXJzb3IuCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGN1cnNvciBpcyBpbiB0aGUgc2FtZSBkb2N1bWVudDsKLSAgICAgKiBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBpc0luU2FtZURvY3VtZW50ICggWG1sQ3Vyc29yIGN1cnNvciApOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGN1cnNvciBpcyBiZWZvcmUsIAotICAgICAqIGFmdGVyLCBvciBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aGUgc3BlY2lmaWVkIGN1cnNvci4gPGJyLz48YnIvPgotICAgICAqIAotICAgICAqIDxjb2RlPmEuY29tcGFyZVBvc2l0aW9uKGIpIDwgMDwvY29kZT4gbWVhbnMgYSBpcyB0byB0aGUgbGVmdCBvZiBiLjxici8+Ci0gICAgICogPGNvZGU+YS5jb21wYXJlUG9zaXRpb24oYikgPT0gMDwvY29kZT4gbWVhbnMgYSBpcyBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyBiLjxici8+Ci0gICAgICogPGNvZGU+YS5jb21wYXJlUG9zaXRpb24oYikgPiAwPC9jb2RlPiBtZWFucyBhIGlzIHRvIHRoZSByaWdodCBvZiBiLjxici8+PGJyLz4KLSAgICAgKgotICAgICAqIFRoZSBzb3J0IG9yZGVyIG9mIGN1cnNvcnMgaW4gdGhlIGRvY3VtZW50IGlzIHRoZSB0b2tlbiBvcmRlci4KLSAgICAgKiBGb3IgZXhhbXBsZSwgaWYgY3Vyc29yICJhIiBpcyBhdCBhIFNUQVJUIHRva2VuIGFuZCB0aGUgY3Vyc29yICJiIgotICAgICAqIGlzIGF0IGEgdG9rZW4gd2l0aGluIHRoZSBjb250ZW50cyBvZiB0aGUgc2FtZSBlbGVtZW50LCB0aGVuCi0gICAgICogYS5jb21wYXJlUG9zaXRpb24oYikgd2lsbCByZXR1cm4gLTEsIG1lYW5pbmcgdGhhdCB0aGUgcG9zaXRpb24KLSAgICAgKiBvZiBhIGlzIGJlZm9yZSBiLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgY3Vyc29yICBUaGUgY3Vyc29yIHdob3NlIHBvc2l0aW9uIHNob3VsZCBiZSBjb21wYXJlZAotICAgICAqIHdpdGggdGhpcyBjdXJzb3IuCi0gICAgICogQHJldHVybiAgMSBpZiB0aGlzIGN1cnNvciBpcyBhZnRlciB0aGUgc3BlY2lmaWVkIGN1cnNvcjsgMCBpZiAKLSAgICAgKiB0aGlzIGN1cnNvciBpcyBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aGUgc3BlY2lmaWVkIGN1cnNvcjsgCi0gICAgICogLTEgaWYgdGhpcyBjdXJzb3IgaXMgYmVmb3JlIHRoZSBzcGVjaWZpZWQgY3Vyc29yLgotICAgICAqIEB0aHJvd3MgIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBjdXJzb3IgaXMgbm90IGluIHRoZSBzYW1lIGRvY3VtZW50IGFzIHRoaXMgY3Vyc29yLgotICAgICAqLwotCi0gICAgaW50IGNvbXBhcmVQb3NpdGlvbiAoIFhtbEN1cnNvciBjdXJzb3IgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIGlmIHRoaXMgY3Vyc29yIGlzIHRvIHRoZSBsZWZ0IG9mIChvciBiZWZvcmUpCi0gICAgICogdGhlIHNwZWNpZmllZCBjdXJzb3IuIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBzYW1lIGFzIAotICAgICAqIDxjb2RlPmEuY29tcGFyZVBvc2l0aW9uKGIpICZsdDsgMCA8L2NvZGU+Ci0gICAgICogCi0gICAgICogQHBhcmFtICBjdXJzb3IgIFRoZSBjdXJzb3Igd2hvc2UgcG9zaXRpb24gc2hvdWxkIGJlIGNvbXBhcmVkCi0gICAgICogd2l0aCB0aGlzIGN1cnNvci4KLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoaXMgY3Vyc29yIGlzIHRvIHRoZSBsZWZ0IG9mIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBjdXJzb3I7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIGlzTGVmdE9mICggWG1sQ3Vyc29yIGN1cnNvciApOwotICAgIAotICAgIC8qKgotICAgICAqIERldGVybWluZXMgaWYgdGhpcyBjdXJzb3IgaXMgYXQgdGhlIHNhbWUgcG9zaXRpb24gYXMKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGN1cnNvci4gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIHNhbWUgYXMgCi0gICAgICogPGNvZGU+YS5jb21wYXJlUG9zaXRpb24oYikgPT0gMCA8L2NvZGU+Ci0gICAgICogCi0gICAgICogQHBhcmFtICBjdXJzb3IgIFRoZSBjdXJzb3Igd2hvc2UgcG9zaXRpb24gc2hvdWxkIGJlIGNvbXBhcmVkCi0gICAgICogd2l0aCB0aGlzIGN1cnNvci4KLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoaXMgY3Vyc29yIGlzIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGFzIAotICAgICAqIHRoZSBzcGVjaWZpZWQgY3Vyc29yOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBpc0F0U2FtZVBvc2l0aW9uQXMgKCBYbWxDdXJzb3IgY3Vyc29yICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiB0aGlzIGN1cnNvciBpcyB0byB0aGUgcmlnaHQgb2YgKG9yIGFmdGVyKQotICAgICAqIHRoZSBzcGVjaWZpZWQgY3Vyc29yLiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgc2FtZSBhcyAKLSAgICAgKiA8Y29kZT5hLmNvbXBhcmVQb3NpdGlvbihiKSAmZ3Q7IDAgPC9jb2RlPgotICAgICAqIAotICAgICAqIEBwYXJhbSAgY3Vyc29yICBUaGUgY3Vyc29yIHdob3NlIHBvc2l0aW9uIHNob3VsZCBiZSBjb21wYXJlZAotICAgICAqIHdpdGggdGhpcyBjdXJzb3IuCi0gICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGlzIGN1cnNvciBpcyB0byB0aGUgcmlnaHQgb2YgdGhlIHNwZWNpZmllZAotICAgICAqIGN1cnNvcjsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICAgKi8KLQotICAgIGJvb2xlYW4gaXNSaWdodE9mICggWG1sQ3Vyc29yIGN1cnNvciApOwotICAgIAotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgWFF1ZXJ5IGV4cHJlc3Npb24gYWdhaW5zdCB0aGUgWE1MIHRoaXMKLSAgICAgKiBjdXJzb3IgaXMgaW4uIDxici8+PGJyLz4KLSAgICAgKiAKLSAgICAgKiBUaGUgcXVlcnkgbWF5IGJlIGEgU3RyaW5nIG9yIGEgY29tcGlsZWQgcXVlcnkuIFlvdSBjYW4gcHJlY29tcGlsZQotICAgICAqIGFuIFhRdWVyeSBleHByZXNzaW9uIHVzaW5nIHRoZSBYbWxCZWFucy5jb21waWxlUXVlcnkgbWV0aG9kLiA8YnIvPjxicj4KLSAgICAgKiAKLSAgICAgKiBUaGUgcm9vdCByZWZlcnJlZCB0byBieSB0aGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgZ2l2ZW4gYXMgCi0gICAgICogYSBkb3QuIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBwYXRoIGV4cHJlc3Npb246Ci0gICAgICogPHByZT4KLSAgICAgKiBYbWxDdXJzb3IgcmVzdWx0cyA9IGN1cnNvci5leGVjUXVlcnkoInB1cmNoYXNlLW9yZGVyL2xpbmUtaXRlbVtwcmljZSAmbHQ7PSAyMC4wMF0iKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIHF1ZXJ5ICBUaGUgWFF1ZXJ5IGV4cHJlc3Npb24gdG8gZXhlY3V0ZS4KLSAgICAgKiBAcmV0dXJuICBBIGN1cnNvciBjb250YWluaW5nIHRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeS4KLSAgICAgKiBAdGhyb3dzICBYbWxSdW50aW1lRXhjZXB0aW9uICBJZiB0aGUgcXVlcnkgZXhwcmVzc2lvbiBpcyBpbnZhbGlkLgotICAgICAqLwotCi0gICAgWG1sQ3Vyc29yIGV4ZWNRdWVyeSAoIFN0cmluZyBxdWVyeSApOwotICAgIAotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgWFF1ZXJ5IGV4cHJlc3Npb24gYWdhaW5zdCB0aGUgWE1MIHRoaXMKLSAgICAgKiBjdXJzb3IgaXMgaW4sIGFuZCB1c2luZyB0aGUgc3BlY2lmaWVkIG9wdGlvbnMuIDxici8+PGJyLz4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIHF1ZXJ5ICBUaGUgWFF1ZXJ5IGV4cHJlc3Npb24gdG8gZXhlY3V0ZS4KLSAgICAgKiBAcGFyYW0gIG9wdGlvbnMgIE9wdGlvbnMgZm9yIHRoZSBxdWVyeS4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gY2FsbCAKLSAgICAgKiB0aGUge0BsaW5rIFhtbE9wdGlvbnMjc2V0WHF1ZXJ5Q3VycmVudE5vZGVWYXIoU3RyaW5nKSBYbWxPcHRpb25zLnNldFhxdWVyeUN1cnJlbnROb2RlVmFyKFN0cmluZyl9Ci0gICAgICogbWV0aG9kIHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIG5hbWUgZm9yIHRoZSBxdWVyeSBleHByZXNzaW9uIAotICAgICAqIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIHRoZSBjb250ZXh0IG5vZGUuCi0gICAgICogQHRocm93cyAgWG1sUnVudGltZUV4Y2VwdGlvbiAgSWYgdGhlIHF1ZXJ5IGV4cHJlc3Npb24gaXMgaW52YWxpZC4KLSAgICAgKi8KLQotICAgIFhtbEN1cnNvciBleGVjUXVlcnkgKCBTdHJpbmcgcXVlcnksIFhtbE9wdGlvbnMgb3B0aW9ucyApOwotICAgIAotICAgIC8qKgotICAgICAqIFJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIGEgZGNvdW1lbnQgYXQgYSBwYXJ0aWN1bGFyIHBvaW50Ci0gICAgICogaW4gdGltZS4gIEl0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgZG9jdW1lbnQgaGFzIGJlZW4gY2hhbmdlZAotICAgICAqIHNpbmNlIHRoYXQgcG9pbnQgaW4gdGltZS4KLSAgICAgKi8KLSAgICBpbnRlcmZhY2UgQ2hhbmdlU3RhbXAKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBkb2N1bWVudCBhc3NvaWF0ZWQgd2l0aCB0aGlzIENoYW5nZVN0YW1wCi0gICAgICAgICAqIGhhcyBiZWVuIGFsdGVyZWQgc2luY2UgdGhlIENoYW5nZVN0YW1wIGhhZCBiZWVuIGNyZWF0ZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGFuZ2VkICggKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBjaGFuZ2Ugc3RhbXAgZm9yIHRoZSBkb2N1bWVudCB0aGUgY3VycmVudCBjdXJzb3IgaXMgaW4uIAotICAgICAqIFRoaXMgY2hhbmdlIHN0YW1wIGNhbiBiZSBxdWVyaWVkIGF0IGEgbGF0ZXIgcG9pbnQgaW4gdGltZSB0byBmaW5kIG91dAotICAgICAqIGlmIHRoZSBkb2N1bWVudCBoYXMgY2hhbmdlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuICBUaGUgY2hhbmdlIHN0YW1wIGZvciB0aGUgZG9jdW1lbnQgdGhlIGN1cnJlbnQgY3Vyc29yIGlzIGluLgotICAgICAqLwotICAgIENoYW5nZVN0YW1wIGdldERvY0NoYW5nZVN0YW1wICggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTdWJjbGFzc2VzIG9mIFhtbEJvb2ttYXJrIGNhbiBiZSB1c2VkIHRvIGFubm90YXRlIGFuIFhNTCBkb2N1bWVudC4KLSAgICAgKiBUaGlzIGNsYXNzIGlzIGFic3RyYWN0IHRvIHByZXZlbnQgcGFydGllcyBmcm9tIGluYWR2ZXJ0ZW50bHkgCi0gICAgICogaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVycycgYm9va21hcmtzIHdpdGhvdXQgZXhwbGljaXRseQotICAgICAqIHNoYXJpbmcgYSBib29rbWFyayBjbGFzcy4KLSAgICAgKi8KLQotICAgIGFic3RyYWN0IGNsYXNzIFhtbEJvb2ttYXJrCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhIHN0cm9uZ2x5LXJlZmVyZW5jZWQgYm9va21hcmsuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIFhtbEJvb2ttYXJrICggKSB7IHRoaXMoIGZhbHNlICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgYm9va21hcmsuCi0gICAgICAgICAqIEBwYXJhbSB3ZWFrIHRydWUgaWYgdGhlIGRvY3VtZW50J3MgcmVmZXJlbmNlIHRvIHRoZSBib29rbWFyayBzaG91bGQgYmUgYSBXZWFrUmVmZXJlbmNlCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIFhtbEJvb2ttYXJrICggYm9vbGVhbiB3ZWFrICkKLSAgICAgICAgewotICAgICAgICAgICAgX3JlZiA9IHdlYWsgPyBuZXcgV2Vha1JlZmVyZW5jZSggdGhpcyApIDogbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGwgdGhlIGNyZWF0ZUN1cnNvciBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IGN1cnNvciB3aGljaCBpcwotICAgICAgICAgKiBwb3NpdGlvbmVkIGF0IHRoZSBzYW1lIHNwbGFjZSBhcyB0aGUgYm9va21hcmsuICBJdCBpcyBtdWNoIG1vcmUKLSAgICAgICAgICogZWZmaWNpZW50IHRvIGNhbGwgdG9Cb29rbWFyayBvbiBhbiBleGlzdGluZyBjdXJzb3IgdGhhbiBpdAotICAgICAgICAgKiBpcyB0byBjcmVhdGUgYSBuZXcgY3Vyc29yLiAgSG93ZXZlciwgdG9Cb29rbWFyayBtYXkgZmFpbCBpZiB0aGUKLSAgICAgICAgICogYm9va21hcmsgaXMgaW4gYSBkaWZmZXJlbnQgZG9jdW1lbnQgdGhhbiB0aGUgY3Vyc29yLiAgSXQgaXMKLSAgICAgICAgICogdW5kZXIgdGhlc2UgY2lyY3Vtc3RhbmNlcyB3aGVyZSBjcmVhdGVDdXJzb3IgbmVlZHMgdG8gYmUgY2FsbGVkCi0gICAgICAgICAqIG9uIHRoZSBib29rbWFyay4gIFN1YnNlcXVlbnQgbmF2aWdhdGlvbnMgdG8gYm9va21hcmsKLSAgICAgICAgICogcG9zaXRpb25zIHNob3VsZCBhdHRlbXB0IHRvIHJldXNlIHRoZSBsYXN0IGN1cnNvciB0bwotICAgICAgICAgKiBpbXByb3ZlIHBlcmZvcm1hY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZmluYWwgWG1sQ3Vyc29yIGNyZWF0ZUN1cnNvciAoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50TWFyayA9PSBudWxsID8gbnVsbCA6IF9jdXJyZW50TWFyay5jcmVhdGVDdXJzb3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBNb3ZlcyB0aGUgZ2l2ZW4gY3Vyc29yIHRvIHRoaXMgYm9va21hcmssIGFuZCByZXR1cm5zIGl0LgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBmaW5hbCBYbWxDdXJzb3IgdG9Cb29rbWFyayAoIFhtbEN1cnNvciBjICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGMgPT0gbnVsbCB8fCAhYy50b0Jvb2ttYXJrKCB0aGlzICkgPyBjcmVhdGVDdXJzb3IoKSA6IGM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGRlZmF1bHQga2V5IGZvciBib29rbWFya3MgaXMgdGhlIGNsYXNzIHdoaWNoIGltcGxlbWVudHMKLSAgICAgICAgICogdGhlbS4gIFRoaXMgd2F5LCBtdWx0aXBsZSBwYXJ0aWVzIHVzaW5nIGJvb2ttYXJrcyBpbiB0aGUKLSAgICAgICAgICogc2FtZSBpbnN0YW5jZSBkb2N1bWVudCB3aWxsIG5vdCBpbnRlcmZlcmUgd2l0aCBlYWNob3RoZXIuCi0gICAgICAgICAqIE9uZSBjYW4sIGhvd2V2ZXIsIG92ZXJyaWRlIGdldEtleSgpIHRvIHVzZSBhIGtleSBvdGhlciB0aGFuCi0gICAgICAgICAqIHRoZSBjbGFzcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5ICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDbGFzcygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1hcmsgaXMgc2V0IGJ5IHRoZSBob3N0IGRvY3VtZW50OyBpdCBpcyBjYXBhYmxlIG9mCi0gICAgICAgICAqIHJldHVybmluZyBhbiBYbWxDdXJzb3IgaW1wbGVtZW50YXRpb24gYXQgdGhlIGxvY2F0aW9uIG9mCi0gICAgICAgICAqIHRoZSBib29rbWFyay4KLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgICAgICAgWG1sTWFyayAgIF9jdXJyZW50TWFyazsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJZiBub24tbnVsbCwgdGhlIHJlZiBpcyB1c2VkIGJ5IHRoZSBob3N0IGRvY3VtZW50Ci0gICAgICAgICAqIHRvIG1haW50YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBib29rbWFyay4gIElmIGl0IGlzIGEgd2VhawotICAgICAgICAgKiByZWZlcmVuY2UsIHRoZSBob3N0IGRvY3VtZW50IHdpbGwgbm90IHByZXZlbnQgdGhlIEJvb2ttYXJrCi0gICAgICAgICAqIGZyb20gYmVpbmcgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIGZpbmFsIFJlZmVyZW5jZSBfcmVmOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuIGFic3RyYWN0IHtAbGluayBYbWxDdXJzb3J9IGZhY3RvcnkuCi0gICAgICogSW1wbGVtZW50YXRpb25zIG9mIFhtbEN1cnNvciBpbXBsZW1lbnQgWG1sTWFyayB0byBiZSBhYmxlIHRvCi0gICAgICogcmVjb25zdGl0dXRlIGEgY3Vyc29yIGZyb20gYSBib29rbWFyay4gV2hlbiBjb250ZW50IG1vdmVzIGJldHdlZW4KLSAgICAgKiBpbXBsZW1lbnRhdGlvbnMsIHRoZSBYbWxNYXJrIGlzIHNldCB0byB0aGUgaW1wbG1lbnRhdGlvbidzIHdoaWNoCi0gICAgICogcmVjaWV2ZXMgdGhlIG5ldyBjb250ZW50LgotICAgICAqLwotCi0gICAgaW50ZXJmYWNlIFhtbE1hcmsKLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjcmVhdGVDdXJzb3IgKCApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBib29rbWFyayB0byB0aGUgZG9jdW1lbnQgYXQgdGhpcyBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKgotICAgICAqIFRoZSBib29rbWFyayBpcyBhdHRhY2hlZCB0byB0aGUgdG9rZW4gaW4gdGhlIHRyZWUgaW1tZWRpYXRlbHkgCi0gICAgICogYWZ0ZXIgdGhlIGN1cnNvci4gSWYgdGhlIHRyZWUgaXMgbWFuaXB1bGF0ZWQgdG8gbW92ZQotICAgICAqIHRoYXQgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHBsYWNlLCB0aGUgYm9va21hcmsgbW92ZXMgd2l0aCBpdC4KLSAgICAgKiBJZiB0aGUgdHJlZSBpcyBtYW5pcHVsYXRlZCB0byBkZWxldGUgdGhhdCB0b2tlbiBmcm9tIHRoZQotICAgICAqIHRyZWUsIHRoZSBib29rbWFyayBpcyBvcnBoYW5lZC4gQ29weSBvcGVyYXRpb25zIGRvIG5vdCBjb3B5Ci0gICAgICogYm9va21hcmtzLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgYm9va21hcmsgIFRoZSBib29rbWFyayB0byBzZXQuCi0gICAgICovCi0KLSAgICB2b2lkIHNldEJvb2ttYXJrICggWG1sQm9va21hcmsgYm9va21hcmsgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIGJvb2ttYXJrIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgCi0gICAgICogYXQgdGhpcyBjdXJzb3IncyBsb2NhdGlvbi4gSWYgdGhlcmUgaXMgbm8gYm9va21hcmsgd2hvc2Uga2V5IGlzIAotICAgICAqIGdpdmVuIGJ5IHRoZSBzcGVjaWZpZWQga2V5IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLCBudWxsIGlzIHJldHVybmVkLiAKLSAgICAgKiBJZiB0aGUge0BsaW5rIFhtbEN1cnNvci5YbWxCb29rbWFyayNnZXRLZXkoKSBnZXRLZXl9IG1ldGhvZCBpcyBub3Qgb3ZlcnJpZGRlbiBvbiAKLSAgICAgKiB0aGUgYm9va21hcmssIHRoZW4gdGhlIGJvb2ttYXJrJ3MgY2xhc3MgaXMgdXNlZCBhcyB0aGUga2V5LgotICAgICAqIAotICAgICAqIEBwYXJhbSAga2V5ICBUaGUga2V5IGZvciB0aGUgYm9va21hcmsgdG8gcmV0cmlldmUuCi0gICAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCBib29rbWFyazsgbnVsbCBpZiB0aGVyZSBpcyBubyBib29rbWFyawotICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICovCi0KLSAgICBYbWxCb29rbWFyayBnZXRCb29rbWFyayAoIE9iamVjdCBrZXkgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGJvb2ttYXJrIHdob3NlIGtleSBpcyBzcGVjaWZpZWQsIGlmIHRoZSBib29rbWFyawotICAgICAqIGV4aXN0cyBhdCB0aGlzIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSAga2V5ICBUaGUgZm9yIHRoZSBib29rbWFyayB0byBjbGVhci4KLSAgICAgKi8KLQotICAgIHZvaWQgY2xlYXJCb29rbWFyayAoIE9iamVjdCBrZXkgKTsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhbGwgdGhlIGJvb2ttYXJrcyBhdCB0aGlzIGxvY2F0aW9uLCBhZGRpbmcgdGhlbSB0bwotICAgICAqIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gQm9va21hcmtzIGhlbGQgYnkgd2VhayByZWZlcmVuY2VzIGFyZQotICAgICAqIGFkZGVkIHRvIHRoaXMgY29sbGVjdGlvbiBhcyBXZWFrIHJlZmVyZW5jZWQgb2JqZWN0cyBwb2ludGluZyB0byB0aGUKLSAgICAgKiBib29rbWFyay4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGxpc3RUb0ZpbGwgIFRoZSBjb2xsZWN0aW9uIHRoYXQgd2lsbCBjb250YWluIGJvb2ttYXJrcwotICAgICAqIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kLgotICAgICAqLwotCi0gICAgdm9pZCBnZXRBbGxCb29rbWFya1JlZnMgKCBDb2xsZWN0aW9uIGxpc3RUb0ZpbGwgKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIFhNTCB0aGF0IGlzIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgY3Vyc29yLgotICAgICAqIAotICAgICAqIEZvciB0aGUgVEVYVCwgQVRUUiwgTkFNRVNQQUNFLCBDT01NRU5UIGFuZCBQUk9DSU5TVCB0b2tlbnMsIGEgc2luZ2xlIAotICAgICAqIHRva2VuIGlzIHJlbW92ZWQuIEZvciBhIFNUQVJUIHRva2VuLCB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IGFuZCBhbGwgCi0gICAgICogb2YgaXRzIGNvbnRlbnRzIGFyZSByZW1vdmVkLiBGb3IgYWxsIG90aGVyIHRva2VucywgdGhpcyBpcyBhIG5vLW9wLiAKLSAgICAgKiBZb3UgY2Fubm90IHJlbW92ZSBhIFNUQVJURE9DLgotICAgICAqIAotICAgICAqIFRoZSBjdXJzb3JzIGxvY2F0ZWQgaW4gdGhlIFhNTCB0aGF0IHdhcyByZW1vdmVkIGFsbCBjb2xsYXBzZSB0byB0aGUgCi0gICAgICogc2FtZSBsb2NhdGlvbi4gQWxsIGJvb2ttYXJrcyBpbiB0aGlzIFhNTCB3aWxsIGJlIG9ycGhhbmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnl0aGluZyB3YXMgcmVtb3ZlZDsgZmFsc2Ugb25seSBpZiB0aGUgY3Vyc29yIGlzIAotICAgICAqIGp1c3QgYmVmb3JlIEVORCBvciBFTkRET0MgdG9rZW4uCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgY3Vyc29yIGlzIGF0IGEgCi0gICAgICogU1RBUlRET0MgdG9rZW4uCi0gICAgICovCi0KLSAgICBib29sZWFuIHJlbW92ZVhtbCAoICk7Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgWE1MIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgY3Vyc29yIHRvIHRoZSBsb2NhdGlvbgotICAgICAqIHNwZWNpZmllZCBieSB0aGUgPGVtPnRvSGVyZTwvZW0+IGN1cnNvciwgc2hpZnRpbmcgWE1MIGF0IHRoYXQgbG9jYXRpb24gCi0gICAgICogdG8gdGhlIHJpZ2h0IHRvIG1ha2Ugcm9vbS4gRm9yIHRoZSBURVhULCBBVFRSLCBOQU1FU1BBQ0UsIAotICAgICAqIENPTU1FTlQgYW5kIFBST0NJTlNUIHRva2VucywgYSBzaW5nbGUgdG9rZW4gaXMgbW92ZWQuIEZvciBhIHN0YXJ0IHRva2VuLCB0aGUKLSAgICAgKiBlbGVtZW50IGFuZCBhbGwgb2YgaXRzIGNvbnRlbnRzIGFyZSBtb3ZlZC4gRm9yIGFsbCBvdGhlciB0b2tlbnMsIHRoaXMKLSAgICAgKiBpcyBhIG5vLW9wLgotICAgICAqIAotICAgICAqIFRoZSBib29rbWFya3MgbG9jYXRlZCBpbiB0aGUgWE1MIHRoYXQgd2FzIG1vdmVkIGFsc28gbW92ZSB0byB0aGUKLSAgICAgKiBuZXcgbG9jYXRpb247IHRoZSBjdXJzb3JzIGRvbid0IG1vdmUgd2l0aCB0aGUgY29udGVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIHRvSGVyZSAgVGhlIGN1cnNvciBhdCB0aGUgbG9jYXRpb24gdG8gd2hpY2ggdGhlIFhNTCBzaG91bGQKLSAgICAgKiBiZSBtb3ZlZC4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55dGhpbmcgd2FzIG1vdmVkOyBmYWxzZSBvbmx5IGlmIHRoZSBjdXJzb3IgaXMgCi0gICAgICoganVzdCBiZWZvcmUgRU5EIG9yIEVORERPQyB0b2tlbi4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICBib29sZWFuIG1vdmVYbWwgKCBYbWxDdXJzb3IgdG9IZXJlICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29waWVzIHRoZSBYTUwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBjdXJzb3IgdG8gdGhlIGxvY2F0aW9uCi0gICAgICogc3BlY2lmaWVkIGJ5IHRoZSA8ZW0+dG9IZXJlPC9lbT4gY3Vyc29yLiBGb3IgdGhlIFRFWFQsIEFUVFIsIE5BTUVTUEFDRSwgCi0gICAgICogQ09NTUVOVCBhbmQgUFJPQ0lOU1QgdG9rZW5zLCBhIHNpbmdsZSB0b2tlbiBpcyBjb3BpZWQuICBGb3IgYSBzdGFydCB0b2tlbiwgCi0gICAgICogdGhlIGVsZW1lbnQgYW5kIGFsbCBvZiBpdHMgY29udGVudHMgYXJlIGNvcGllZC4gRm9yIGFsbCBvdGhlciB0b2tlbnMsIHRoaXMKLSAgICAgKiBpcyBhIG5vLW9wLgotICAgICAqIAotICAgICAqIFRoZSBjdXJzb3JzIGFuZCBib29rbWFya3MgbG9jYXRlZCBpbiB0aGUgWE1MIHRoYXQgd2FzIGNvcGllZCBhcmUgYWxzbyBjb3BpZWQgCi0gICAgICogdG8gdGhlIG5ldyBsb2NhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIHRvSGVyZSAgVGhlIGN1cnNvciBhdCB0aGUgbG9jYXRpb24gdG8gd2hpY2ggdGhlIFhNTCBzaG91bGQKLSAgICAgKiBiZSBjb3BpZWQuCi0gICAgICogQHJldHVybiB0cnVlIGlmIGFueXRoaW5nIHdhcyBjb3BpZWQ7IGZhbHNlIGlmIHRoZSB0b2tlbiBzdXBwb3J0cyB0aGUgb3BlcmF0aW9uLAotICAgICAqIGJ1dCBub3RoaW5nIHdhcyBjb3BpZWQuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgYm9vbGVhbiBjb3B5WG1sICggWG1sQ3Vyc29yIHRvSGVyZSApOwotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb250YWluZXIgKFNUQVJURE9DIE9SIFNUQVJUKSBpbW1lZGlhdGVseSBhZnRlcgotICAgICAqIHRoaXMgY3Vyc29yLiBGb3IgYWxsIG90aGVyIHNpdHVhdGlvbnMsIHJldHVybnMgZmFsc2UuIERvZXMKLSAgICAgKiBub3QgcmVtb3ZlIGF0dHJpYnV0ZXMgb3IgbmFtc3BhY2VzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnl0aGluZyB3YXMgY29waWVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotCi0gICAgYm9vbGVhbiByZW1vdmVYbWxDb250ZW50cyAoICk7Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRhaW5lciAoU1RBUlRET0MgT1IgU1RBUlQpIGltbWVkaWF0ZWx5IGFmdGVyCi0gICAgICogdGhpcyBjdXJzb3IgdG8gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSB0aGUgPGVtPnRvSGVyZTwvZW0+IGN1cnNvci4KLSAgICAgKiBGb3IgYWxsIG90aGVyIHNpdHVhdGlvbnMsIHJldHVybnMgZmFsc2UuIERvZXMgbm90IG1vdmUgYXR0cmlidXRlcyBvcgotICAgICAqIG5hbWVzcGFjZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtICB0b0hlcmUgIFRoZSBjdXJzb3IgYXQgdGhlIGxvY2F0aW9uIHRvIHdoaWNoIHRoZSBYTUwgc2hvdWxkIGJlIG1vdmVkLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnl0aGluZyB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgICovCi0gICAgYm9vbGVhbiBtb3ZlWG1sQ29udGVudHMgKCBYbWxDdXJzb3IgdG9IZXJlICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgY29udGFpbmVyIChTVEFSVERPQyBPUiBTVEFSVCkgaW1tZWRpYXRlbHkgdG8KLSAgICAgKiB0aGUgcmlnaHQgb2YgdGhlIGN1cnNvciB0byB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSA8ZW0+dG9IZXJlPC9lbT4gY3Vyc29yLgotICAgICAqIEZvciBhbGwgb3RoZXIgc2l0dWF0aW9ucywgcmV0dXJucyBmYWxzZS4gIERvZXMgbm90IGNvcHkgYXR0cmlidXRlcyBvcgotICAgICAqIG5hbWVzcGFjZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtICB0b0hlcmUgIFRoZSBjdXJzb3IgYXQgdGhlIGxvY2F0aW9uIHRvIHdoaWNoIHRoZSBYTUwgc2hvdWxkCi0gICAgICogYmUgY29waWVkLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnl0aGluZyB3YXMgY29waWVkOyBvdGhlcndpc2UsIGZhbHNlLgotICAgICAqLwotICAgIGJvb2xlYW4gY29weVhtbENvbnRlbnRzICggWG1sQ3Vyc29yIHRvSGVyZSApOwotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZXMgY2hhcmFjdGVycyB1cCB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbnVtYmVyLCBjb3VudGluZyByaWdodCBmcm9tIAotICAgICAqIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24gdG8gdGhlIGNoYXJhY3RlciBhdCA8ZW0+bWF4Q2hhcmFjdGVyQ291bnQ8L2VtPi4gVGhlIAotICAgICAqIHNwYWNlIHJlbWFpbmluZyBmcm9tIHJlbW92aW5nIHRoZSBjaGFyYWN0ZXJzIGNvbGxhcHNlcyB1cCB0byB0aGlzIGN1cnNvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG1heENoYXJhY3RlckNvdW50ICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhZnRlciB0aGlzIGN1cnNvcidzIAotICAgICAqIGxvY2F0aW9uIHRvIHJlbW92ZS4KLSAgICAgKiBAcmV0dXJuICBUaGUgYWN0dWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlbW92ZWQuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgaW50IHJlbW92ZUNoYXJzICggaW50IG1heENoYXJhY3RlckNvdW50ICk7Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyBjaGFyYWN0ZXJzIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgY3Vyc29yIHRvIHRoZSBwb3NpdGlvbiBpbW1lZGlhdGVseSAKLSAgICAgKiBhZnRlciB0aGUgc3BlY2lmaWVkIGN1cnNvci4gQ2hhcmFjdGVycyBhcmUgY291bnRlZCB0byB0aGUgcmlnaHQgdXAgdG8gdGhlCi0gICAgICogc3BlY2lmaWVkIG1heGltdW0gbnVtYmVyLiBYTUwgYWZ0ZXIgdGhlIGRlc3RpbmF0aW9uIGN1cnNvciBpcyAKLSAgICAgKiBzaGlmdGVkIHRvIHRoZSByaWdodCB0byBtYWtlIHJvb20uIFRoZSBzcGFjZSByZW1haW5pbmcgZnJvbSBtb3ZpbmcgdGhlIAotICAgICAqIGNoYXJhY3RlcnMgY29sbGFwc2VzIHVwIHRvIHRoaXMgY3Vyc29yLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbWF4Q2hhcmFjdGVyQ291bnQgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFmdGVyIHRoaXMgY3Vyc29yJ3MgCi0gICAgICogbG9jYXRpb24gdG8gbW92ZS4KLSAgICAgKiBAcGFyYW0gIHRvSGVyZSAgVGhlIGN1cnNvciB0byB3aGljaCB0aGUgY2hhcmFjdGVycyBzaG91bGQgYmUgbW92ZWQuCi0gICAgICogQHJldHVybiAgVGhlIGFjdHVhbCBudW1iZXIgb2YgY2hhcmFjdGVycyBtb3ZlZC4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICBpbnQgbW92ZUNoYXJzICggaW50IG1heENoYXJhY3RlckNvdW50LCBYbWxDdXJzb3IgdG9IZXJlICk7Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgY2hhcmFjdGVycyB0byB0aGUgcG9zaXRpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBjdXJzb3IuCi0gICAgICogQ2hhcmFjdGVycyBhcmUgY291bnRlZCB0byB0aGUgcmlnaHQgdXAgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIG51bWJlci4gCi0gICAgICogWE1MIGFmdGVyIHRoZSBkZXN0aW5hdGlvbiBjdXJzb3IgaXMgc2hpZnRlZCB0byB0aGUgcmlnaHQgdG8gbWFrZSByb29tLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbWF4Q2hhcmFjdGVyQ291bnQgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFmdGVyIHRoaXMgY3Vyc29yJ3MgCi0gICAgICogbG9jYXRpb24gdG8gY29weS4KLSAgICAgKiBAcGFyYW0gIHRvSGVyZSAgVGhlIGN1cnNvciB0byB3aGljaCB0aGUgY2hhcmFjdGVycyBzaG91bGQgYmUgY29waWVkLgotICAgICAqIEByZXR1cm4gIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29waWVkLgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIG9wZXJhdGlvbiBpcyBub3QgYWxsb3dlZAotICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIGludCBjb3B5Q2hhcnMgKCBpbnQgbWF4Q2hhcmFjdGVyQ291bnQsIFhtbEN1cnNvciB0b0hlcmUgKTsKLQotICAgIC8qKgotICAgICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCB0ZXh0IGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgdGV4dCAgVGhlIHRleHQgdG8gaW5zZXJ0LgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAotICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIHZvaWQgaW5zZXJ0Q2hhcnMgKCBTdHJpbmcgdGV4dCApOwotICAgIAotICAgIC8qKgotICAgICAqIEluc2VydHMgYW4gZWxlbWVudCBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiwgZ2l2aW5nIAotICAgICAqIHRoZSBlbGVtZW50IHRoZSBzcGVjaWZpZWQgcXVhbGlmaWVkIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBlbGVtZW50LgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAotICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIHZvaWQgaW5zZXJ0RWxlbWVudCAoIFFOYW1lIG5hbWUgKTsKLQotICAgIC8qKgotICAgICAqIEluc2VydHMgYW4gZWxlbWVudCBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiwgZ2l2aW5nIAotICAgICAqIHRoZSBlbGVtZW50IHRoZSBzcGVjaWZpZWQgbG9jYWwgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGxvY2FsTmFtZSAgVGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGluc2VydEVsZW1lbnQgKCBTdHJpbmcgbG9jYWxOYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgbmV3IGVsZW1lbnQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24sIGdpdmluZyB0aGUKLSAgICAgKiBlbGVtZW50IHRoZSBzcGVjaWZpZWQgbG9jYWwgbmFtZSBhbmQgYXNzb2NpYXRpbmcgaXQgd2l0aCBzcGVjaWZpZWQgbmFtZXNwYWNlIAotICAgICAqIAotICAgICAqIEBwYXJhbSAgbG9jYWxOYW1lICBUaGUgbG9jYWwgbmFtZSBmb3IgdGhlIG5ldyBlbGVtZW50LgotICAgICAqIEBwYXJhbSAgdXJpICBUaGUgVVJJIGZvciB0aGUgbmV3IGVsZW1lbnQncyBuYW1lc3BhY2UuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBpbnNlcnRFbGVtZW50ICggU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHVyaSApOwotICAgIAotICAgIC8qKgotICAgICAqIEluc2VydHMgYSBuZXcgZWxlbWVudCBhcm91bmQgdGhpcyBjdXJzb3IsIGdpdmluZyB0aGUgZWxlbWVudCB0aGUgc3BlY2lmaWVkIAotICAgICAqIHF1YWxpZmllZCBuYW1lLiBBZnRlciB0aGUgZWxlbWVudCBpcyBpbnNlcnRlZCwgdGhpcyBjdXJzb3IgaXMgYmV0d2VlbiBpdHMgc3RhcnQgCi0gICAgICogYW5kIGVuZC4gVGhpcyBjdXJzb3IgY2FuIHRoZW4gYmUgdXNlZCB0byBpbnNlcnQgYWRkaXRpb25hbCBYTUwgaW50byAKLSAgICAgKiB0aGUgbmV3IGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGJlZ2luRWxlbWVudCAoIFFOYW1lIG5hbWUgKTsKLQotICAgIC8qKgotICAgICAqIEluc2VydHMgYSBuZXcgZWxlbWVudCBhcm91bmQgdGhpcyBjdXJzb3IsIGdpdmluZyB0aGUgZWxlbWVudCB0aGUgc3BlY2lmaWVkIAotICAgICAqIGxvY2FsIG5hbWUuIEFmdGVyIHRoZSBlbGVtZW50IGlzIGluc2VydGVkLCB0aGlzIGN1cnNvciBpcyBiZXR3ZWVuIGl0cyBzdGFydCAKLSAgICAgKiBhbmQgZW5kLiBUaGlzIGN1cnNvciBjYW4gdGhlbiBiZSB1c2VkIHRvIGluc2VydCBhZGRpdGlvbmFsIFhNTCBpbnRvIAotICAgICAqIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGxvY2FsTmFtZSAgVGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGJlZ2luRWxlbWVudCAoIFN0cmluZyBsb2NhbE5hbWUgKTsKLQotICAgIC8qKgotICAgICAqIEluc2VydHMgYSBuZXcgZWxlbWVudCBhcm91bmQgdGhpcyBjdXJzb3IsIGdpdmluZyB0aGUgZWxlbWVudCB0aGUgc3BlY2lmaWVkIAotICAgICAqIGxvY2FsIG5hbWUgYW5kIGFzc29jaWF0aW5nIGl0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UuIEFmdGVyIHRoZSBlbGVtZW50IAotICAgICAqIGlzIGluc2VydGVkLCB0aGlzIGN1cnNvciBpcyBiZXR3ZWVuIGl0cyBzdGFydCBhbmQgZW5kLiBUaGlzIGN1cnNvciAKLSAgICAgKiBjYW4gdGhlbiBiZSB1c2VkIHRvIGluc2VydCBhZGRpdGlvbmFsIFhNTCBpbnRvIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGxvY2FsTmFtZSAgVGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gIHVyaSAgVGhlIFVSSSBmb3IgdGhlIG5ldyBlbGVtZW50J3MgbmFtZXNwYWNlLgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAotICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIHZvaWQgYmVnaW5FbGVtZW50ICggU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHVyaSApOwotICAgIAotICAgIC8qKgotICAgICAqIEluc2VydHMgYSBuZXcgZWxlbWVudCBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiwgZ2l2aW5nIHRoZQotICAgICAqIGVsZW1lbnQgdGhlIHNwZWNpZmllZCBxdWFsaWZpZWQgbmFtZSBhbmQgY29udGVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIG5ldyBlbGVtZW50LgotICAgICAqIEBwYXJhbSAgdGV4dCAgVGhlIGNvbnRlbnQgZm9yIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGluc2VydEVsZW1lbnRXaXRoVGV4dCAoIFFOYW1lIG5hbWUsIFN0cmluZyB0ZXh0ICk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgbmV3IGVsZW1lbnQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24sIGdpdmluZyB0aGUKLSAgICAgKiBlbGVtZW50IHRoZSBzcGVjaWZpZWQgbG9jYWwgbmFtZSBhbmQgY29udGVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIGxvY2FsTmFtZSAgVGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gIHRleHQgIFRoZSBjb250ZW50IGZvciB0aGUgbmV3IGVsZW1lbnQuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBpbnNlcnRFbGVtZW50V2l0aFRleHQgKCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgdGV4dCApOwotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyBhIG5ldyBlbGVtZW50IGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzIGN1cnNvcidzIGxvY2F0aW9uLCBnaXZpbmcgdGhlCi0gICAgICogZWxlbWVudCB0aGUgc3BlY2lmaWVkIGxvY2FsIG5hbWUsIGFzc29jaWF0aW5nIGl0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UsIAotICAgICAqIGFuZCBnaXZpbmcgaXQgdGhlIHNwZWNpZmllZCBjb250ZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbG9jYWxOYW1lICBUaGUgbG9jYWwgbmFtZSBmb3IgdGhlIG5ldyBlbGVtZW50LgotICAgICAqIEBwYXJhbSAgdXJpICBUaGUgVVJJIGZvciB0aGUgbmV3IGVsZW1lbnQncyBuYW1lc3BhY2UuCi0gICAgICogQHBhcmFtICB0ZXh0ICBUaGUgY29udGVudCBmb3IgdGhlIG5ldyBlbGVtZW50LgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAotICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIHZvaWQgaW5zZXJ0RWxlbWVudFdpdGhUZXh0ICggU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHVyaSwgU3RyaW5nIHRleHQgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgbmV3IGF0dHJpYnV0ZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiwgZ2l2aW5nIGl0Ci0gICAgICogdGhlIHNwZWNpZmllZCBsb2NhbCBuYW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbG9jYWxOYW1lICBUaGUgbG9jYWwgbmFtZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBpbnNlcnRBdHRyaWJ1dGUgKCBTdHJpbmcgbG9jYWxOYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgbmV3IGF0dHJpYnV0ZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiwgZ2l2aW5nIGl0Ci0gICAgICogdGhlIHNwZWNpZmllZCBsb2NhbCBuYW1lIGFuZCBhc3NvY2lhdGluZyBpdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgbG9jYWxOYW1lICBUaGUgbG9jYWwgbmFtZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtICB1cmkgIFRoZSBVUkkgZm9yIHRoZSBuZXcgYXR0cmlidXRlJ3MgbmFtZXNwYWNlLgotICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAotICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KLSAgICAgKi8KLQotICAgIHZvaWQgaW5zZXJ0QXR0cmlidXRlICggU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHVyaSApOwotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyBhIG5ldyBhdHRyaWJ1dGUgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24sIGdpdmluZyBpdAotICAgICAqIHRoZSBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBsb2NhbCBuYW1lIGZvciB0aGUgbmV3IGF0dHJpYnV0ZS4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGluc2VydEF0dHJpYnV0ZSAoIFFOYW1lIG5hbWUgKTsKLQotICAgIC8qKgotICAgICAqIEluc2VydHMgYSBuZXcgYXR0cmlidXRlIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzIGN1cnNvcidzIGxvY2F0aW9uLCBnaXZpbmcgaXQKLSAgICAgKiB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCBuYW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSAgTmFtZSAgVGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSAgdmFsdWUgIFRoZSB2YWx1ZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBpbnNlcnRBdHRyaWJ1dGVXaXRoVmFsdWUgKCBTdHJpbmcgTmFtZSwgU3RyaW5nIHZhbHVlICk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGFuIGF0dHJpYnV0ZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGN1cnNvcidzIGxvY2F0aW9uLCBnaXZpbmcgaXQKLSAgICAgKiB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHZhbHVlLCBhbmQgYXNzb2NpYXRpbmcgaXQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBuYW1lIGZvciB0aGUgbmV3IGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gIHVyaSAgVGhlIFVSSSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUncyBuYW1lc3BhY2UuCi0gICAgICogQHBhcmFtICB2YWx1ZSAgVGhlIHZhbHVlIGZvciB0aGUgbmV3IGF0dHJpYnV0ZS4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGluc2VydEF0dHJpYnV0ZVdpdGhWYWx1ZSAoIFN0cmluZyBuYW1lLCBTdHJpbmcgdXJpLCBTdHJpbmcgdmFsdWUgKTsKLQotICAgIC8qKgotICAgICAqIEluc2VydHMgYW4gYXR0cmlidXRlIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgY3Vyc29yJ3MgbG9jYXRpb24sIGdpdmluZyBpdAotICAgICAqIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgbmFtZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtICB2YWx1ZSAgVGhlIHZhbHVlIGZvciB0aGUgbmV3IGF0dHJpYnV0ZS4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGluc2VydEF0dHJpYnV0ZVdpdGhWYWx1ZSAoIFFOYW1lIG5hbWUsIFN0cmluZyB2YWx1ZSApOwotICAgIAotICAgIC8qKgotICAgICAqIEluc2VydHMgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBjdXJzb3IncyBsb2NhdGlvbiwgCi0gICAgICogZ2l2aW5nIGl0IHRoZSBzcGVjaWZpZWQgcHJlZml4IGFuZCBVUkkuCi0gICAgICogCi0gICAgICogQHBhcmFtICBwcmVmaXggIFRoZSBwcmVmaXggZm9yIHRoZSBuYW1lc3BhY2UuCi0gICAgICogQHBhcmFtICBuYW1lc3BhY2UgIFRoZSBVUkkgZm9yIHRoZSBuYW1lc3BhY2UuCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCi0gICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgotICAgICAqLwotCi0gICAgdm9pZCBpbnNlcnROYW1lc3BhY2UgKCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyBhbiBYTUwgY29tbWVudCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGN1cnNvcidzIGxvY2F0aW9uLCAKLSAgICAgKiBnaXZpbmcgaXQgdGhlIHNwZWNpZmllZCBjb250ZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSAgdGV4dCAgVGhlIG5ldyBjb21tZW50J3MgY29udGVudC4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGluc2VydENvbW1lbnQgKCBTdHJpbmcgdGV4dCApOwotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyBhbiBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGN1cnNvcidzIGxvY2F0aW9uLCAKLSAgICAgKiBnaXZpbmcgaXQgdGhlIHNwZWNpZmllZCB0YXJnZXQgYW5kIHRleHQuCi0gICAgICogCi0gICAgICogQHBhcmFtICB0YXJnZXQgIFRoZSB0YXJnZXQgZm9yIHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLgotICAgICAqIEBwYXJhbSAgdGV4dCAgVGhlIG5ldyBwcm9jZXNzaW5nIGluc3RydWN0aW9uJ3MgdGV4dC4KLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKLSAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCi0gICAgICovCi0KLSAgICB2b2lkIGluc2VydFByb2NJbnN0ICggU3RyaW5nIHRhcmdldCwgU3RyaW5nIHRleHQgKTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEYXRlLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTAyZTM2Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZSI+eHM6ZGF0ZTwvYT4gdHlwZS4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIENhbGVuZGFyfSwge0BsaW5rIERhdGV9LCBhbmQge0BsaW5rIEdEYXRlfS4KLSAqIAotICogQHNlZSBYbWxDYWxlbmRhcgotICogQHNlZSBHRGF0ZQotICovIAotcHVibGljIGludGVyZmFjZSBYbWxEYXRlIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2RhdGUiKTsKLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChDYWxlbmRhciBjKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIEdEYXRlIGdEYXRlVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRHRGF0ZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gZ2QpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXREYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIERhdGUgZGF0ZVZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIERhdGV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldERhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoRGF0ZSBkKTsKLQotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgdm9pZCBzZXRDYWxlbmRhclZhbHVlKENhbGVuZGFyIGMpOwotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9ICovCi0gICAgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufSAqLwotICAgIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBnZCk7Ci0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfSAqLwotICAgIERhdGUgZ2V0RGF0ZVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfSAqLwotICAgIHZvaWQgc2V0RGF0ZVZhbHVlKERhdGUgZCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbERhdGV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbERhdGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbERhdGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbERhdGV9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MjAwMy0wNi0xNCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsyMDAzLTA2LTE0Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEYXRlVGltZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERhdGVUaW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2M2M5NjUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERhdGVUaW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZVRpbWUiPnhzOmRhdGVUaW1lPC9hPiB0eXBlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgQ2FsZW5kYXJ9LCB7QGxpbmsgRGF0ZX0sIGFuZCB7QGxpbmsgR0RhdGV9LgotICogCi0gKiBAc2VlIFhtbENhbGVuZGFyCi0gKiBAc2VlIEdEYXRlCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbERhdGVUaW1lIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2RhdGVUaW1lIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChDYWxlbmRhciBjKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIEdEYXRlIGdEYXRlVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRHRGF0ZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gZ2QpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXREYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIERhdGUgZGF0ZVZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIERhdGV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldERhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoRGF0ZSBkKTsKLQotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgdm9pZCBzZXRDYWxlbmRhclZhbHVlKENhbGVuZGFyIGMpOwotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9ICovCi0gICAgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufSAqLwotICAgIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBnZCk7Ci0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfSAqLwotICAgIERhdGUgZ2V0RGF0ZVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfSAqLwotICAgIHZvaWQgc2V0RGF0ZVZhbHVlKERhdGUgZCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbERhdGVUaW1lfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxEYXRlVGltZX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGVUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxEYXRlVGltZX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxEYXRlVGltZX0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsyMDAzLTA2LTE0VDEyOjAwOjAwJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlVGltZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzIwMDMtMDYtMTRUMTI6MDA6MDAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlVGltZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGVUaW1lfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGVUaW1lfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGVUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGVUaW1lfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERhdGVUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGVUaW1lfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlVGltZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGVUaW1lfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRGVjaW1hbC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERlY2ltYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwY2VlMC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRGVjaW1hbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiPnhzOmRlY2ltYWw8L2E+IHR5cGUuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBCaWdEZWNpbWFsfS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sRGVjaW1hbCBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9kZWNpbWFsIik7Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBCaWdEZWNpbWFsfSAqLwotICAgIEJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbFZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBCaWdEZWNpbWFsfSAqLwotICAgIHZvaWQgc2V0QmlnRGVjaW1hbFZhbHVlKEJpZ0RlY2ltYWwgYmQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0RlY2ltYWx9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEJpZ0RlY2ltYWxWYWx1ZX0KLSAgICAgKiovCi0gICAgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQmlnRGVjaW1hbH0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0QmlnRGVjaW1hbFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChCaWdEZWNpbWFsIGJkKTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sRGVjaW1hbH0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sRGVjaW1hbH0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sRGVjaW1hbCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sRGVjaW1hbH0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sRGVjaW1hbH0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjM0LjU2Nzg5Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGVjaW1hbH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQuNTY3ODkmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGVjaW1hbH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEZWNpbWFsfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEZWNpbWFsfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGVjaW1hbCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEZWNpbWFsfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRGVjaW1hbCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEZWNpbWFsfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGVjaW1hbH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEZWNpbWFsfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERvY3VtZW50UHJvcGVydGllcy5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERvY3VtZW50UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTQ5NWZmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEb2N1bWVudFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGF0dGFjaCBhcmJpdHJhcnkgaW5mb3JtYXRpb24gdG8gYW4gWE1MCi0gKiBkb2N1bWVudC4gIEl0IGFsc28gZGVmaW5lcyBzZXZlcmFsIHdlbGwta25vd24gdHlwZXMgb2YKLSAqIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGF0dGFjaGVkIG9yIGZvdW5kIG9uIGEgZG9jdW1lbnQuCi0gKiA8cD4KLSAqIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSB3YW50ZWQgdG8gYXNzb2NpYXRlIGEgZmlsZW5hbWUKLSAqIHdpdGggdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgYW4geG1sIG9iamVjdCAieG9iaiIuICBUaGlzCi0gKiBjb3VsZCBiZSBkb25lIHZpYSB0aGUgZm9sbG93aW5nIGNvZGU6Ci0gKiA8cD4KLSAqIHRva2VuU291cmNlLmRvY3VtZW50UHJvcGVydGllcygpLnNldChYbWxEb2N1bWVudFByb3BlcnRpZXMuTkFNRSwgIk15RmlsZW5hbWUueG1sIik7Ci0gKiA8cD4KLSAqIFRvIGZldGNoIHRoZSBmaWxlbmFtZSBsYXRlciwgZ2l2ZW4gYW4geG9iajIgYW55d2hlcmUgaW4gdGhlCi0gKiBzYW1lIGRvY3VtZW50LCB5b3UgY2FuIHdyaXRlOgotICogPHA+Ci0gKiBmaWxlbmFtZSA9IChTdHJpbmcpdG9rZW5Tb3VyY2UuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0KFhtbERvY3VtZW50UHJvcGVydGllcy5OQU1FKTsKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFhtbERvY3VtZW50UHJvcGVydGllcwotewotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIFhNTCBkb2N1bWVudCBmaWxlLiAgVHlwaWNhbGx5IGEgVVJMLCBidXQgbWF5Ci0gICAgICogYmUgYW55IFN0cmluZy4KLSAgICAgKiBAcGFyYW0gc291cmNlTmFtZSB0aGUgbmFtZSB0byBzZXQKLSAgICAgKiBAc2VlIFhtbE9wdGlvbnMjc2V0RG9jdW1lbnRTb3VyY2VOYW1lCi0gICAgKi8gCi0gICAgcHVibGljIHZvaWQgICBzZXRTb3VyY2VOYW1lICggU3RyaW5nIHNvdXJjZU5hbWUgKSB7IHB1dCggU09VUkNFX05BTUUsIHNvdXJjZU5hbWUgKTsgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIFhNTCBkb2N1bWVudCBmaWxlLiAgVHlwaWNhbGx5IGEgVVJMLCBidXQgbWF5Ci0gICAgICogYmUgYW55IFN0cmluZy4KLSAgICAgKiBAc2VlIFhtbE9wdGlvbnMjc2V0RG9jdW1lbnRTb3VyY2VOYW1lCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSAoICkgeyByZXR1cm4gKFN0cmluZykgZ2V0KCBTT1VSQ0VfTkFNRSApOyB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZW5jb2RpbmcgdG8gdXNlIGZvciB0aGUgWE1MIGRvY3VtZW50LiAgU2hvdWxkIGJlIGEgdmFsaWQKLSAgICAgKiBYTUwgZW5jb2Rpbmcgc3RyaW5nLgotICAgICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgSVNPIGVuY29kaW5nIG5hbWUKLSAgICAgKiBAc2VlIFhtbE9wdGlvbnMjc2V0Q2hhcmFjdGVyRW5jb2RpbmcKLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgICBzZXRFbmNvZGluZyAoIFN0cmluZyBlbmNvZGluZyApIHsgcHV0KCBFTkNPRElORywgZW5jb2RpbmcgKTsgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVuY29kaW5nIHVzZWQgZm9yIHRoZSBYTUwgZG9jdW1lbnQsIGFzIGFuIElTTyBlbmNvZGluZyBuYW1lLgotICAgICAqIEBzZWUgWG1sT3B0aW9ucyNzZXRDaGFyYWN0ZXJFbmNvZGluZwotICAgICAqLyAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nICggKSB7IHJldHVybiAoU3RyaW5nKSBnZXQoIEVOQ09ESU5HICk7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBYTUwgdmVyc2lvbiBzdHJpbmcgdG8gdXNlIGluIHRoZSAmbHQmIzYzO3htbCYjNjM7Jmd0OyBkZWNsYXJhdGlvbi4KLSAgICAgKiAoVGhlIFhNTCBzcGVjaWZpY2F0aW9uIGlzIHF1aXRlIHN0YWJsZSBhdCAiMS4wIi4pCi0gICAgICogQHBhcmFtIHZlcnNpb24gdGhlIFhNTCB2ZXJzaW9uIHN0cmluZwotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCAgIHNldFZlcnNpb24gKCBTdHJpbmcgdmVyc2lvbiApIHsgcHV0KCBWRVJTSU9OLCB2ZXJzaW9uICk7IH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBYTUwgdmVyc2lvbiBzdHJpbmcgdXNlZCBpbiB0aGUgJmx0JiM2Mzt4bWwmIzYzOyZndDsgZGVjbGFyYXRpb24uCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbiAoICkgeyByZXR1cm4gKFN0cmluZykgZ2V0KCBWRVJTSU9OICk7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBET0NUWVBFIG5hbWUgdXNlIGluIHRoZSAmbHQmIzMzO0RPQ1RZUEUmZ3Q7IGRlY2xhcmF0aW9uLgotICAgICAqIEBwYXJhbSBkb2N0eXBlbmFtZSB0aGUgZG9jdHlwZW5hbWUKLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgICBzZXREb2N0eXBlTmFtZSAoIFN0cmluZyBkb2N0eXBlbmFtZSApIHsgcHV0KCBET0NUWVBFX05BTUUsIGRvY3R5cGVuYW1lICk7IH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBET0NUWVBFIG5hbWUgdXNlZCBpbiB0aGUgJmx0JiMzMztET0NUWVBFJmd0OyBkZWNsYXJhdGlvbi4KLSAgICAgKi8gCi0gICAgcHVibGljIFN0cmluZyBnZXREb2N0eXBlTmFtZSAoICkgeyByZXR1cm4gKFN0cmluZykgZ2V0KCBET0NUWVBFX05BTUUgKTsgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIERPQ1RZUEUgcHVibGljIElEIHRvIHVzZSBpbiB0aGUgJmx0JiMzMztET0NUWVBFJmd0OyBkZWNsYXJhdGlvbi4KLSAgICAgKiBAcGFyYW0gcHVibGljaWQgdGhlIHB1YmxpYyBJRAotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCAgIHNldERvY3R5cGVQdWJsaWNJZCAoIFN0cmluZyBwdWJsaWNpZCApIHsgcHV0KCBET0NUWVBFX1BVQkxJQ19JRCwgcHVibGljaWQgKTsgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIERPQ1RZUEUgcHVibGljIElEIHVzZWQgaW4gdGhlICZsdCYjMzM7RE9DVFlQRSZndDsgZGVjbGFyYXRpb24uCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdHlwZVB1YmxpY0lkICggKSB7IHJldHVybiAoU3RyaW5nKSBnZXQoIERPQ1RZUEVfUFVCTElDX0lEICk7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBET0NUWVBFIHN5c3RlbSBJRCB0byB1c2UgaW4gdGhlICZsdCYjMzM7RE9DVFlQRSZndDsgZGVjbGFyYXRpb24uCi0gICAgICogQHBhcmFtIHN5c3RlbWlkIHRoZSBzeXN0ZW0gSUQKLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgICBzZXREb2N0eXBlU3lzdGVtSWQgKCBTdHJpbmcgc3lzdGVtaWQgKSB7IHB1dCggRE9DVFlQRV9TWVNURU1fSUQsIHN5c3RlbWlkICk7IH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBET0NUWVBFIHN5c3RlbSBJRCB1c2VkIGluIHRoZSAmbHQmIzMzO0RPQ1RZUEUmZ3Q7IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdHlwZVN5c3RlbUlkICggKSB7IHJldHVybiAoU3RyaW5nKSBnZXQoIERPQ1RZUEVfU1lTVEVNX0lEICk7IH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lc3NhZ2UgZGlnZXN0IHVzZWQgdG8gc3VtbWFyaXplIHRoZSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gZGlnZXN0IHRoZSBieXRlcyBvZiB0aGUgZGlnZXN0Ci0gICAgICogCi0gICAgICogQHNlZSBYbWxPcHRpb25zI3NldExvYWRNZXNzYWdlRGlnZXN0Ci0gICAgICovIAotICAgIHB1YmxpYyB2b2lkICAgc2V0TWVzc2FnZURpZ2VzdCggYnl0ZVtdIGRpZ2VzdCApIHsgcHV0KCBNRVNTQUdFX0RJR0VTVCwgZGlnZXN0ICk7IH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIGRpZ2VzdCB1c2VkIHRvIHN1bW1hcml6ZSB0aGUgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHNlZSBYbWxPcHRpb25zI3NldExvYWRNZXNzYWdlRGlnZXN0Ci0gICAgICovIAotICAgIHB1YmxpYyBieXRlW10gZ2V0TWVzc2FnZURpZ2VzdCggKSB7IHJldHVybiAoYnl0ZVtdKSBnZXQoIE1FU1NBR0VfRElHRVNUICk7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIHN0b3JlIHRoZSBvcmlnaW5hbCBuYW1lIChhIFN0cmluZykgZm9yCi0gICAgICogdGhlIHNvdXJjZSBmcm9tIHdoaWNoIHRoZSBYTUwgZG9jdW1lbnQgd2FzIGxvYWRlZC4KLSAgICAgKiBUaGlzIG5hbWUsIGlmIHByZXNlbnQsIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlCi0gICAgICogZG9jdW1lbnQgd2hlbiByZXBvcnRpbmcgdmFsaWRhdGlvbiBvciBjb21pbGF0aW9uIGVycm9ycy4KLSAgICAgKgotICAgICAqIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKEZpbGUpIGFuZCBTY2hlbWFUeXBlTG9hZGVyLmxvYWRJbnN0YW5jZShGaWxlKQotICAgICAqIGJvdGggYXV0b21hdGljYWxseSBzZXQgdGhpcyB2YWx1ZSB0byB0aGUgZmlsZW5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU09VUkNFX05BTUUgPSBuZXcgT2JqZWN0KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRG9jdW1lbnQgZW5jb2RpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFTkNPRElORyA9IG5ldyBPYmplY3QoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEb2N1bWVudCB2ZXJzaW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVkVSU0lPTiA9IG5ldyBPYmplY3QoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEb2MgdHlwZSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRE9DVFlQRV9OQU1FID0gbmV3IE9iamVjdCgpOwotICAgIAotICAgIC8qKgotICAgICAqIERvYyB0eXBlIHB1YmxpYyBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERPQ1RZUEVfUFVCTElDX0lEID0gbmV3IE9iamVjdCgpOwotICAgIAotICAgIC8qKgotICAgICAqIERvYyB0eXBlIHN5c3RlbSBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERPQ1RZUEVfU1lTVEVNX0lEID0gbmV3IE9iamVjdCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNIQSBtZXNzYWdlIGRpZ2VzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IE1FU1NBR0VfRElHRVNUID0gbmV3IE9iamVjdCgpOwotCi0gICAgLyoqCi0gICAgICogQXR0YWNoZXMgYSB2YWx1ZSB0byB0aGUgcm9vdCBvZiB0aGUgZG9jdW1lbnQgY29udGFpbmluZwotICAgICAqIHRoZSBnaXZlbiB0b2tlbiBzb3VyY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICAgVGhlIGtleTogdGhlcmUgY2FuIGJlIG9uZSB2YWx1ZSBmb3IgZWFjaCBrZXkuCi0gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBhdHRhY2ggdG8gdGhlIGRvY3VtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgcHV0ICggT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHZhbHVlIHByZXZpb3VzbHkgYXR0YWNoZWQgdG8gYSBkb2N1bWVudCB1c2luZyBzZXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICAgVGhlIGtleTogdGhpcyBpcyB0aGUga2V5IHRoYXQgd2FzIHByZXZpb3VzbHkKLSAgICAgKiAgICAgICAgICAgICAgcGFzc2VkIHRvIHNldCB0byBzdG9yZSB0aGUgdmFsdWUuCi0gICAgICogQHJldHVybiAgICAgIFRoZSBzYXZlZCB2YWx1ZSwgb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0ICggT2JqZWN0IGtleSApOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIHZhbHVlIHByZXZpb3VzbHkgYXR0YWNoZWQgdG8gYSBkb2N1bWVudCB1c2luZyBzZXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICAgVGhlIGtleTogdGhpcyBpcyB0aGUga2V5IHRoYXQgd2FzIHByZXZpb3VzbHkKLSAgICAgKiAgICAgICAgICAgICAgcGFzc2VkIHRvIHNldCB0byBzdG9yZSB0aGUgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdCByZW1vdmUgKCBPYmplY3Qga2V5ICk7Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEb3VibGUuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEb3VibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMwNzgwYi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRG91YmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RvdWJsZSI+eHM6ZG91YmxlPC9hPiB0eXBlLgotICogPHA+Ci0gKiBOYXR1cmFsbHksIGNvbnZlcnRpYmxlIHRvIGEgSmF2YSBkb3VibGUuCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbERvdWJsZSBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9kb3VibGUiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgZG91YmxlICovCi0gICAgZG91YmxlIGdldERvdWJsZVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGRvdWJsZSAqLwotICAgIHZvaWQgc2V0RG91YmxlVmFsdWUoZG91YmxlIHYpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgZG91YmxlCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldERvdWJsZVZhbHVlfQotICAgICAqKi8KLSAgICBkb3VibGUgZG91YmxlVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBkb3VibGUKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0RG91YmxlVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KGRvdWJsZSB2KTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sRG91YmxlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxEb3VibGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sRG91YmxlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxEb3VibGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxEb3VibGV9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzLjM0ZSs1NyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEb3VibGV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjMuMzRlKzU3Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEb3VibGV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEb3VibGUgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRG91YmxlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEb3VibGUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRG91YmxlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEb3VibGV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEb3VibGUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEb3VibGUgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRHVyYXRpb24uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEdXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTFiNTEzLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEdXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkdXJhdGlvbiI+eHM6ZHVyYXRpb248L2E+IHR5cGUuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIGEge0BsaW5rIEdEdXJhdGlvbn0uCi0gKiAKLSAqIEBzZWUgR0R1cmF0aW9uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbER1cmF0aW9uIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2R1cmF0aW9uIik7Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRHVyYXRpb259ICovCi0gICAgR0R1cmF0aW9uIGdldEdEdXJhdGlvblZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRHVyYXRpb259ICovCi0gICAgdm9pZCBzZXRHRHVyYXRpb25WYWx1ZShHRHVyYXRpb24gZ2QpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEdXJhdGlvbn0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0R1cmF0aW9uVmFsdWV9Ci0gICAgICoqLwotICAgIEdEdXJhdGlvbiBnRHVyYXRpb25WYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRHVyYXRpb259Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEdEdXJhdGlvblZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGdkKTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sRHVyYXRpb259LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbER1cmF0aW9ufSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbER1cmF0aW9ufSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEdXJhdGlvbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbER1cmF0aW9ufSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O1AxWTJNVDJIJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O1AxWTJNVDJIJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRHVyYXRpb259IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEdXJhdGlvbiBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEdXJhdGlvbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEdXJhdGlvbiBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxEdXJhdGlvbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRHVyYXRpb259IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEdXJhdGlvbiBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEdXJhdGlvbiBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEVOVElUSUVTLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRU5USVRJRVMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmViNjU0ZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRU5USVRJRVMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0VOVElUSUVTIj54czpFTlRJVElFUzwvYT4gdHlwZSwKLSAqIGEgbGlzdCB0eXBlLgotICogPHA+Ci0gKiBBIGxpc3QgdHlwZS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sRU5USVRJRVMgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfRU5USVRJRVMiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFN0cmluZ30gdmFsdWVzICovCi0gICAgTGlzdCBnZXRMaXN0VmFsdWUoKTsKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFhtbEVOVElUWX0gdmFsdWVzICoqLwotICAgIExpc3QgeGdldExpc3RWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSAqLwotICAgIHZvaWQgc2V0TGlzdFZhbHVlKExpc3QgbCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgU3RyaW5nfSB2YWx1ZXMKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldExpc3RWYWx1ZX0KLSAgICAgKiovCi0gICAgTGlzdCBsaXN0VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgWG1sRU5USVRZfSB2YWx1ZXMKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldExpc3RWYWx1ZX0KLSAgICAgKiovCi0gICAgTGlzdCB4bGlzdFZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldExpc3RWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoTGlzdCBsKTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sRU5USVRJRVN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEVOVElUSUVTfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRJRVMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEVOVElUSUVTfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEVOVElUSUVTfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUSUVTfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUSUVTfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRJRVMgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRJRVMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRJRVMgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRJRVMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUSUVTfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRJRVMgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRJRVMgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFTlRJVFkuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFTlRJVFkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZlNjhkZi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRU5USVRZLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0VOVElUWSI+eHM6RU5USVRZPC9hPiB0eXBlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgU3RyaW5nfS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sRU5USVRZIGV4dGVuZHMgWG1sTkNOYW1lCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfRU5USVRZIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxFTlRJVFl9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEVOVElUWX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVFkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEVOVElUWX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEVOVElUWX0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUWX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUWX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUWSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVFkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUWSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxFTlRJVFkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUWX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUWSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUWSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFcnJvci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5N2Q0NGQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIG1lc3NhZ2UgYXQgYSBzcGVjaWZpYyBYTUwgbG9jYXRpb24uCi0gKiA8cD4KLSAqIFRoZSBtZXNzYWdlIGNhbiBiZSBhbiBlcnJvciwgd2FybmluZywgb3Igc2ltcGxlIGluZm9ybWF0aW9uLCBhbmQKLSAqIGl0IG1heSBvcHRpb25hbGx5IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIGxvY2F0aW9uIGluCi0gKiBhbiBYTUwgZG9jdW1lbnQuICBUaGUgY2xhc3MgaW5jbHVkZXMgbWV0aG9kcyBmb3IgZXh0cmFjdGluZwotICogdGhlIGxvY2F0aW9uIGFzIGEgbGluZSBudW1iZXIsIFhtbEN1cnNvciwgb3IgWG1sT2JqZWN0LCBhcwotICogd2VsbCBhcyBmb3Igb2J0YWluaW5nIGFuZCBtZXNzYWdlIGFuZCBzZXZlcml0eSBvZiB0aGUKLSAqIGVycm9yLiAKLSAqIAotICogQHNlZSBYbWxPcHRpb25zI3NldEVycm9yTGlzdGVuZXIKLSAqIEBzZWUgWG1sRXhjZXB0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxFcnJvciBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfbWVzc2FnZTsKLSAgICBwcml2YXRlIFN0cmluZyBfc291cmNlOwotICAgIHByaXZhdGUgaW50ICAgIF9zZXZlcml0eSA9IFNFVkVSSVRZX0VSUk9SOwotICAgIHByaXZhdGUgaW50ICAgIF9saW5lID0gLTE7Ci0gICAgcHJpdmF0ZSBpbnQgICAgX2NvbHVtbiA9IC0xOwotICAgIHByaXZhdGUgaW50ICAgIF9vZmZzZXQgPSAtMTsKLSAgICAKLSAgICBwcml2YXRlIHRyYW5zaWVudCBYbWxDdXJzb3IgX2N1cnNvcjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgotICAgICAqIEBwYXJhbSBzcmMgVGhlIG9yaWdpbmFsIFhtbEVycm9yIHRvIGNvcHkuCi0gICAgICovCi0gICAgcHVibGljIFhtbEVycm9yKFhtbEVycm9yIHNyYykKLSAgICB7Ci0gICAgICAgIF9tZXNzYWdlID0gc3JjLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgX3NldmVyaXR5ID0gc3JjLmdldFNldmVyaXR5KCk7Ci0gICAgICAgIF9zb3VyY2UgPSBzcmMuZ2V0U291cmNlTmFtZSgpOwotICAgICAgICBfbGluZSA9IHNyYy5nZXRMaW5lKCk7Ci0gICAgICAgIF9jb2x1bW4gPSBzcmMuZ2V0Q29sdW1uKCk7Ci0gICAgICAgIF9vZmZzZXQgPSBzcmMuZ2V0T2Zmc2V0KCk7Ci0gICAgICAgIF9jdXJzb3IgPSBzcmMuZ2V0Q3Vyc29yTG9jYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc3RhdGljIGZhY3RvcnkgbWV0aG9kcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mCi0gICAgICogdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIFhtbEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBzb3VyY2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBpbnQgb2Zmc2V0LCBYbWxDdXJzb3IgY3Vyc29yKQotICAgIHsKLSAgICAgICAgX21lc3NhZ2UgPSBtZXNzYWdlOwotICAgICAgICBfc2V2ZXJpdHkgPSBzZXZlcml0eTsKLSAgICAgICAgX3NvdXJjZSA9IHNvdXJjZTsKLSAgICAgICAgX2xpbmUgPSBsaW5lOwotICAgICAgICBfY29sdW1uID0gY29sdW1uOwotICAgICAgICBfb2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICBfY3Vyc29yID0gY3Vyc29yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gWG1sRXJyb3IgZm9yIHRoZSBnaXZlbiBtZXNzYWdlLCB3aXRoIG5vIGxvY2F0aW9uIGFuZCB7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqLyAKLSAgICBwdWJsaWMgc3RhdGljIFhtbEVycm9yIGZvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpCi0gICAgewotICAgICAgICByZXR1cm4gZm9yTWVzc2FnZShtZXNzYWdlLCBTRVZFUklUWV9FUlJPUik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBYbWxFcnJvciBmb3IgdGhlIGdpdmVuIG1lc3NhZ2UsIHdpdGggbm8gbG9jYXRpb24gYW5kIHRoZSBnaXZlbiBzZXZlcml0eS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBzZXZlcml0eSB0aGUgc2V2ZXJpdHkgKHtAbGluayAjU0VWRVJJVFlfRVJST1J9LCB7QGxpbmsgI1NFVkVSSVRZX1dBUk5JTkd9LCBvciB7QGxpbmsgI1NFVkVSSVRZX0lORk99KQotICAgICAqLyAKLSAgICBwdWJsaWMgc3RhdGljIFhtbEVycm9yIGZvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBzZXZlcml0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmb3JTb3VyY2UobWVzc2FnZSwgc2V2ZXJpdHksIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gWG1sRXJyb3IgZm9yIHRoZSBnaXZlbiBtZXNzYWdlLCBsb2NhdGVkIGluIHRoZSBnaXZlbiBmaWxlIGFuZCB7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBzb3VyY2VOYW1lIHRoZSBVUkwgb3Igb3RoZXIgbmFtZSBmb3IgdGhlIGZpbGUKLSAgICAgKi8gCi0gICAgcHVibGljIHN0YXRpYyBYbWxFcnJvciBmb3JTb3VyY2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBzb3VyY2VOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZvckxvY2F0aW9uKG1lc3NhZ2UsIFNFVkVSSVRZX0VSUk9SLCBzb3VyY2VOYW1lLCAtMSwgLTEsIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIFhtbEVycm9yIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSwgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHksIGxvY2F0ZWQgaW4gdGhlIGdpdmVuIGZpbGUuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkgdGhlIHNldmVyaXR5ICh7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfSwge0BsaW5rICNTRVZFUklUWV9XQVJOSU5HfSwgb3Ige0BsaW5rICNTRVZFUklUWV9JTkZPfSkKLSAgICAgKiBAcGFyYW0gc291cmNlTmFtZSB0aGUgVVJMIG9yIG90aGVyIG5hbWUgZm9yIHRoZSBmaWxlCi0gICAgICovIAotICAgIHB1YmxpYyBzdGF0aWMgWG1sRXJyb3IgZm9yU291cmNlKFN0cmluZyBtZXNzYWdlLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBzb3VyY2VOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZvckxvY2F0aW9uKG1lc3NhZ2UsIHNldmVyaXR5LCBzb3VyY2VOYW1lLCAtMSwgLTEsIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIFhtbEVycm9yIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSwgbG9jYXRlZCBhdCBhIHNwZWNpZmljIHBvaW50IGluIHRoZSBnaXZlbiBmaWxlIGFuZCB7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBzb3VyY2VOYW1lIHRoZSBVUkwgb3Igb3RoZXIgbmFtZSBmb3IgdGhlIGZpbGUKLSAgICAgKiBAcGFyYW0gbGluZSB0aGUgMS1iYXNlZCBsaW5lIG51bWJlciwgb3IgLTEgaWYgbm90IGtub3duCi0gICAgICogQHBhcmFtIGNvbHVtbiB0aGUgMS1iYXNlZCBjb2x1bW4gbnVtYmVyLCBvciAtMSBpZiBub3Qga25vd24KLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSAwLWJhc2UgZmlsZSBjaGFyYWN0ZXIgb2Zmc2V0LCBvciAtMSBpZiBub3Qga25vd24KLSAgICAgKi8gCi0gICAgcHVibGljIHN0YXRpYyBYbWxFcnJvciBmb3JMb2NhdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHNvdXJjZU5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLCBpbnQgb2Zmc2V0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYbWxFcnJvcihtZXNzYWdlLCBTRVZFUklUWV9FUlJPUiwgc291cmNlTmFtZSwgbGluZSwgY29sdW1uLCBvZmZzZXQsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gWG1sRXJyb3IgZm9yIHRoZSBnaXZlbiBtZXNzYWdlLCB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSwgbG9jYXRlZCBhdCBhIHNwZWNpZmljIHBvaW50IGluIHRoZSBnaXZlbiBmaWxlLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIHNldmVyaXR5IHRoZSBzZXZlcml0eSAoe0BsaW5rICNTRVZFUklUWV9FUlJPUn0sIHtAbGluayAjU0VWRVJJVFlfV0FSTklOR30sIG9yIHtAbGluayAjU0VWRVJJVFlfSU5GT30pCi0gICAgICogQHBhcmFtIHNvdXJjZU5hbWUgdGhlIFVSTCBvciBvdGhlciBuYW1lIGZvciB0aGUgZmlsZQotICAgICAqIEBwYXJhbSBsaW5lIHRoZSAxLWJhc2VkIGxpbmUgbnVtYmVyLCBvciAtMSBpZiBub3Qga25vd24KLSAgICAgKiBAcGFyYW0gY29sdW1uIHRoZSAxLWJhc2VkIGNvbHVtbiBudW1iZXIsIG9yIC0xIGlmIG5vdCBrbm93bgotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIDAtYmFzZSBmaWxlIGNoYXJhY3RlciBvZmZzZXQsIG9yIC0xIGlmIG5vdCBrbm93bgotICAgICAqLyAKLSAgICBwdWJsaWMgc3RhdGljIFhtbEVycm9yIGZvckxvY2F0aW9uKFN0cmluZyBtZXNzYWdlLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBzb3VyY2VOYW1lLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgaW50IG9mZnNldCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWG1sRXJyb3IobWVzc2FnZSwgc2V2ZXJpdHksIHNvdXJjZU5hbWUsIGxpbmUsIGNvbHVtbiwgb2Zmc2V0LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIFhtbEVycm9yIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSwgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHksIGxvY2F0ZWQgYXQgdGhlIGdpdmVuIHBoeXNjaWFsIGxvY2F0aW9uIGFuZCBYbWxDdXJzb3IuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkgdGhlIHNldmVyaXR5ICh7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfSwge0BsaW5rICNTRVZFUklUWV9XQVJOSU5HfSwgb3Ige0BsaW5rICNTRVZFUklUWV9JTkZPfSkKLSAgICAgKiBAcGFyYW0gc291cmNlTmFtZSB0aGUgVVJMIG9yIG90aGVyIG5hbWUgZm9yIHRoZSBmaWxlCi0gICAgICogQHBhcmFtIGxpbmUgdGhlIDEtYmFzZWQgbGluZSBudW1iZXIsIG9yIC0xIGlmIG5vdCBrbm93bgotICAgICAqIEBwYXJhbSBjb2x1bW4gdGhlIDEtYmFzZWQgY29sdW1uIG51bWJlciwgb3IgLTEgaWYgbm90IGtub3duCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgMC1iYXNlIGZpbGUgY2hhcmFjdGVyIG9mZnNldCwgb3IgLTEgaWYgbm90IGtub3duCi0gICAgICogQHBhcmFtIGN1cnNvciB0aGUgWG1sQ3Vyc29yIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGVycm9yCi0gICAgICovIAotICAgIHB1YmxpYyBzdGF0aWMgWG1sRXJyb3IgZm9yTG9jYXRpb25BbmRDdXJzb3IoU3RyaW5nIG1lc3NhZ2UsIGludCBzZXZlcml0eSwgU3RyaW5nIHNvdXJjZU5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLCBpbnQgb2Zmc2V0LCBYbWxDdXJzb3IgY3Vyc29yKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYbWxFcnJvcihtZXNzYWdlLCBzZXZlcml0eSwgc291cmNlTmFtZSwgbGluZSwgY29sdW1uLCBvZmZzZXQsIGN1cnNvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBYbWxFcnJvciBmb3IgdGhlIGdpdmVuIG1lc3NhZ2UsIGxvY2F0ZWQgYXQgdGhlIFhtbE9iamVjdCwgd2l0aCB7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSB4b2JqIHRoZSBYbWxPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFhtbEVycm9yIGZvck9iamVjdChTdHJpbmcgbWVzc2FnZSwgWG1sT2JqZWN0IHhvYmopCi0gICAgewotICAgICAgICByZXR1cm4gZm9yT2JqZWN0KG1lc3NhZ2UsIFNFVkVSSVRZX0VSUk9SLCB4b2JqKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIFhtbEVycm9yIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSwgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHksIGxvY2F0ZWQgYXQgdGhlIFhtbE9iamVjdC4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBzZXZlcml0eSB0aGUgc2V2ZXJpdHkgKHtAbGluayAjU0VWRVJJVFlfRVJST1J9LCB7QGxpbmsgI1NFVkVSSVRZX1dBUk5JTkd9LCBvciB7QGxpbmsgI1NFVkVSSVRZX0lORk99KQotICAgICAqIEBwYXJhbSB4b2JqIHRoZSBYbWxPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFhtbEVycm9yIGZvck9iamVjdChTdHJpbmcgbWVzc2FnZSwgaW50IHNldmVyaXR5LCBYbWxPYmplY3QgeG9iaikKLSAgICB7Ci0gICAgICAgIGlmICh4b2JqID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZm9yTWVzc2FnZShtZXNzYWdlLCBzZXZlcml0eSk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IHhvYmoubmV3Q3Vyc29yKCk7Ci0gICAgICAgIFhtbEVycm9yIHJlc3VsdCA9IGZvckN1cnNvcihtZXNzYWdlLCBzZXZlcml0eSwgY3VyKTsKLSAgICAgICAgaWYgKGN1ciAhPSBudWxsKQotICAgICAgICAgICAgY3VyLmRpc3Bvc2UoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIFhtbEVycm9yIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSwgbG9jYXRlZCBhdCB0aGUgWG1sQ3Vyc29yLCB3aXRoIHtAbGluayAjU0VWRVJJVFlfRVJST1J9LgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGN1cnNvciB0aGUgWG1sQ3Vyc29yIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYbWxFcnJvciBmb3JDdXJzb3IoU3RyaW5nIG1lc3NhZ2UsIFhtbEN1cnNvciBjdXJzb3IpCi0gICAgewotICAgICAgICByZXR1cm4gZm9yQ3Vyc29yKG1lc3NhZ2UsIFNFVkVSSVRZX0VSUk9SLCBjdXJzb3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gWG1sRXJyb3IgZm9yIHRoZSBnaXZlbiBtZXNzYWdlLCB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSwgbG9jYXRlZCBhdCB0aGUgWG1sQ3Vyc29yLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIHNldmVyaXR5IHRoZSBzZXZlcml0eSAoe0BsaW5rICNTRVZFUklUWV9FUlJPUn0sIHtAbGluayAjU0VWRVJJVFlfV0FSTklOR30sIG9yIHtAbGluayAjU0VWRVJJVFlfSU5GT30pCi0gICAgICogQHBhcmFtIGN1cnNvciB0aGUgWG1sQ3Vyc29yIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYbWxFcnJvciBmb3JDdXJzb3IoU3RyaW5nIG1lc3NhZ2UsIGludCBzZXZlcml0eSwgWG1sQ3Vyc29yIGN1cnNvcikKLSAgICB7Ci0gICAgICAgIGlmIChjdXJzb3IgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmb3JNZXNzYWdlKG1lc3NhZ2UsIHNldmVyaXR5KTsKLQotICAgICAgICAvLyBIdW50IGRvd24gdGhlIGxpbmUvY29sdW1uL29mZnNldAotCi0gICAgICAgIGludCBsaW5lID0gLTE7Ci0gICAgICAgIGludCBjb2x1bW4gPSAtMTsKLSAgICAgICAgaW50IG9mZnNldCA9IC0xOwotICAgICAgICBTdHJpbmcgc291cmNlID0gbnVsbDsKLQotICAgICAgICBzb3VyY2UgPSBjdXJzb3IuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0U291cmNlTmFtZSgpOwotCi0gICAgICAgIFhtbEN1cnNvciBjID0gY3Vyc29yLm5ld0N1cnNvcigpOwotCi0gICAgICAgIFhtbExpbmVOdW1iZXIgbG4gPQotICAgICAgICAgICAgKFhtbExpbmVOdW1iZXIpIGMuZ2V0Qm9va21hcmsoIFhtbExpbmVOdW1iZXIuY2xhc3MgKTsKLQotICAgICAgICBpZiAobG4gPT0gbnVsbCkKLSAgICAgICAgICAgIGxuID0gKFhtbExpbmVOdW1iZXIpIGMudG9QcmV2Qm9va21hcmsoIFhtbExpbmVOdW1iZXIuY2xhc3MgKTsKLQotICAgICAgICBpZiAobG4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgbGluZSA9IGxuLmdldExpbmUoKTsKLSAgICAgICAgICAgIGNvbHVtbiA9IGxuLmdldENvbHVtbigpOwotICAgICAgICAgICAgb2Zmc2V0ID0gbG4uZ2V0T2Zmc2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjLmRpc3Bvc2UoKTsKLQotICAgICAgICByZXR1cm4gbmV3IFhtbEVycm9yKG1lc3NhZ2UsIHNldmVyaXR5LCBzb3VyY2UsIGxpbmUsIGNvbHVtbiwgb2Zmc2V0LCBjdXJzb3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyaWVzIHRvIHByb2R1Y2UgYSBuaWNlbHkgZm9ybWF0dGVkIGZpbGVuYW1lIGZyb20gdGhlIGdpdmVuIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBmb3JtYXR0ZWRGaWxlTmFtZShTdHJpbmcgcmF3U3RyaW5nLCBVUkkgYmFzZSkKLSAgICB7Ci0gICAgICAgIGlmIChyYXdTdHJpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFVSSSB1cmkgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZiBpdCBsb29rcyBsaWtlIGFuIGFic29sdXRlIFVSSSwgdHJlYXQgaXQgYXMgc3VjaAotICAgICAgICAgICAgdXJpID0gbmV3IFVSSShyYXdTdHJpbmcpOwotCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UsIHRyZWF0IGl0IGxpa2UgYSBmaWxlbmFtZQotICAgICAgICAgICAgaWYgKCF1cmkuaXNBYnNvbHV0ZSgpKQotICAgICAgICAgICAgICAgIHVyaSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB1cmkgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbG9va3MgbGlrZSBhIGZpbGVuYW1lOyBjb252ZXJ0IGl0IHRvIHVyaSBmb3IgcmVsYXRpdml6YXRpb24KLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKQotICAgICAgICAgICAgdXJpID0gbmV3IEZpbGUocmF3U3RyaW5nKS50b1VSSSgpOwotCi0gICAgICAgIGlmIChiYXNlICE9IG51bGwpCi0gICAgICAgICAgICB1cmkgPSBiYXNlLnJlbGF0aXZpemUodXJpKTsKLQotICAgICAgICAvLyBmaWxlbmFtZXMgZ2V0IHRoZWlyIGZpbGU6IHN0cmlwcGVkIG9mZiBhbmQgdGhlaXIgLydzIHR1cm5lZCBpbnRvIFwncyAoTVNET1MpCi0gICAgICAgIGlmICh1cmkuaXNBYnNvbHV0ZSgpID8gdXJpLmdldFNjaGVtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UoImZpbGUiKSA9PSAwIDoKLSAgICAgICAgICAgIGJhc2UgIT0gbnVsbCAmJiBiYXNlLmlzQWJzb2x1dGUoKSAmJiBiYXNlLmdldFNjaGVtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UoImZpbGUiKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBGaWxlKHVyaSkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHVyaS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuIGVycm9yLiBTZWUge0BsaW5rICNnZXRTZXZlcml0eX0uCi0gICAgICovIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVkVSSVRZX0VSUk9SICAgPSAwOwotICAgIC8qKgotICAgICAqIEEgd2FybmluZy4gU2VlIHtAbGluayAjZ2V0U2V2ZXJpdHl9LgotICAgICAqLyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVZFUklUWV9XQVJOSU5HID0gMTsKLSAgICAvKioKLSAgICAgKiBBbiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2UuIFNlZSB7QGxpbmsgI2dldFNldmVyaXR5fS4KLSAgICAgKi8gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VWRVJJVFlfSU5GTyAgICA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXZlcml0eS4gIEVpdGhlciB7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfSwge0BsaW5rICNTRVZFUklUWV9XQVJOSU5HfSwgb3Ige0BsaW5rICNTRVZFUklUWV9JTkZPfS4KLSAgICAgKi8gCi0gICAgcHVibGljIGludCAgICBnZXRTZXZlcml0eSAgICggKSB7IHJldHVybiBfc2V2ZXJpdHk7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIHdpdGhvdXQgbG9jYXRpb24gaW5mb3JtYXRpb24uCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSAgICAoICkgeyByZXR1cm4gX21lc3NhZ2U7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBVUkwgKG9yIG90aGVyIG5hbWUpIG9mIHRoZSBmaWxlIHdpdGggdGhlIGVycm9yLCBpZiBhdmFpbGFibGUuCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSAoICkgeyByZXR1cm4gX3NvdXJjZTsgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBlcnJvciwgaWYgYXZhaWxhYmxlLCAtMSBpZiBub3QuCi0gICAgICovIAotICAgIHB1YmxpYyBpbnQgICAgZ2V0TGluZSAgICAgICAoICkgeyByZXR1cm4gX2xpbmU7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBlcnJvciwgaWYgYXZhaWxhYmxlLCAtMSBpZiBub3QuCi0gICAgICovIAotICAgIHB1YmxpYyBpbnQgICAgZ2V0Q29sdW1uICAgICAoICkgeyByZXR1cm4gX2NvbHVtbjsgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpbGUgY2hhcmFjdGVyIG9mZnNldCBvZiB0aGUgZXJyb3IsIGlmIGF2YWlsYWJsZSwgLTEgaWYgbm90LgotICAgICAqLyAKLSAgICBwdWJsaWMgaW50ICAgIGdldE9mZnNldCAgICAgKCApIHsgcmV0dXJuIF9vZmZzZXQ7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbG9jYXRpb24gb2JqZWN0IG9mIHRoZSBnaXZlbiB0eXBlLiAgWG1sQ3Vyc29yLmNsYXNzIGFuZAotICAgICAqIFhtbE9iamVjdC5jbGFzcyBjYW4gYmUgcGFzc2VkLCBmb3IgZXhhbXBsZS4gIE51bGwgaWYgbm90IGF2YWlsYWJsZS4KLSAgICAgKi8gCi0gICAgcHVibGljIE9iamVjdCBnZXRMb2NhdGlvbiAoIE9iamVjdCB0eXBlICkKLSAgICB7Ci0gICAgICAgIGlmICh0eXBlID09IFhtbEN1cnNvci5jbGFzcykKLSAgICAgICAgICAgIHJldHVybiBfY3Vyc29yOwotICAgICAgICBpZiAodHlwZSA9PSBYbWxPYmplY3QuY2xhc3MgJiYgX2N1cnNvciAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIF9jdXJzb3IuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IgYXMgYW4ge0BsaW5rIFhtbEN1cnNvcn0sIG51bGwgaWYKLSAgICAgKiBub3QgYXZhaWxhYmxlLgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sQ3Vyc29yIGdldEN1cnNvckxvY2F0aW9uICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChYbWxDdXJzb3IpIGdldExvY2F0aW9uKCBYbWxDdXJzb3IuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbG9jYXRpb24gb2YgdGhlIGVycm9yIGFzIGFuIHtAbGluayBYbWxPYmplY3R9LCBudWxsIGlmCi0gICAgICogbm90IGF2YWlsYWJsZS4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbE9iamVjdCBnZXRPYmplY3RMb2NhdGlvbiAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoWG1sT2JqZWN0KSBnZXRMb2NhdGlvbiggWG1sT2JqZWN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvZHVjZXMgYSBzdGFuZGFyZCBzdHJpbmcgZm9yIHRoZSBlcnJvciBtZXNzYWdlLCBjb21wbGV0ZSB3aXRoCi0gICAgICogZmlsZW5hbWUgYW5kIGxvY2F0aW9uIG9mZnNldHMgaWYgYXZhaWxhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCApCi0gICAgewotICAgICAgICByZXR1cm4gdG9TdHJpbmcoIG51bGwgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9kdWNlcyBhIHN0YW5kYXJkIHN0cmluZyB3aXRoIHRoZSBlcnJvciBtZXNzYWdlLiAgSWYgYSBub24tbnVsbAotICAgICAqIFVSSSBpcyBzdXBwbGllZCwgc291cmNlIG5hbWVzIGFyZSByZWxhdGl2aXplZCBhZ2FpbnN0IHRoZSBnaXZlbgotICAgICAqIFVSSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICggVVJJIGJhc2UgKQotICAgIHsKLSAgICAgICAgLy8gbW9kaWZpZWQgdG8gY2FyZWZ1bGx5IG1hdGNoIHRoZSBJREUncwotICAgICAgICAvLyB3b3Jrc2hvcC53b3Jrc3BhY2UuYW50LkFudExvZ2dlciByZWdleAotICAgICAgICAvLyB3aGljaCBhbHNvIG1hdGNoZXMgamF2YWMgKGRhdmlkYmF1KQotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBTdHJpbmcgc291cmNlID0gZm9ybWF0dGVkRmlsZU5hbWUoZ2V0U291cmNlTmFtZSgpLCBiYXNlKTsKLQotICAgICAgICBpZiAoIHNvdXJjZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCBzb3VyY2UgKTsKLSAgICAgICAgICAgIGludCBsaW5lID0gZ2V0TGluZSgpOwotICAgICAgICAgICAgaWYgKCBsaW5lIDwgMCApCi0gICAgICAgICAgICAgICAgbGluZSA9IDA7Ci0KLSAgICAgICAgICAgIHNiLmFwcGVuZCggJzonICk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIGxpbmUgKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCggJzonICk7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29sdW1uKCkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggZ2V0Q29sdW1uKCkgKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICc6JyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKCIgIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKCBnZXRTZXZlcml0eSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTRVZFUklUWV9FUlJPUiAgIDogc2IuYXBwZW5kKCAiZXJyb3I6ICIgKTsgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU0VWRVJJVFlfV0FSTklORyA6IHNiLmFwcGVuZCggIndhcm5pbmc6ICIgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNFVkVSSVRZX0lORk8gOiBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBtc2cgPSBnZXRNZXNzYWdlKCk7Ci0KLSAgICAgICAgc2IuYXBwZW5kKCBtc2cgPT0gbnVsbCA/ICI8VW5zcGVjaWZpZWQgbWVzc2FnZT4iIDogbXNnICk7Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFeGNlcHRpb24uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY2ZjE5ZC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQSBjaGVja2VkIGV4Y2VwdGlvbiB0aGF0IGNhbiBiZSB0aHJvd24gd2hpbGUgcHJvY2Vzc2luZywKLSAqIHBhcnNpbmcsIG9yIGNvbXBpbGluZyBYTUwuICBNYXkgY29udGFpbiBhbnkgbnVtYmVyIG9mIHtAbGluayBYbWxFcnJvcn0KLSAqIG9iamVjdHMuCi0gKiA8cD4KLSAqIEBzZWUgWG1sRXJyb3IKLSAqIEBzZWUgWG1sUnVudGltZUV4Y2VwdGlvbgotICovCi1wdWJsaWMgY2xhc3MgWG1sRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBYbWxFeGNlcHRpb24gZnJvbSBhIG1lc3NhZ2UuCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxFeGNlcHRpb24gKCBTdHJpbmcgbSAgICAgICAgICAgICAgKSB7IHN1cGVyKCBtICk7ICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbEV4Y2VwdGlvbiBmcm9tIGEgbWVzc2FnZSBhbmQgYSBjYXVzZS4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbEV4Y2VwdGlvbiAoIFN0cmluZyBtLCBUaHJvd2FibGUgdCApIHsgc3VwZXIoIG0sIHQgKTsgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sRXhjZXB0aW9uIGZyb20gYSBjYXVzZS4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbEV4Y2VwdGlvbiAoIFRocm93YWJsZSB0ICAgICAgICAgICApIHsgc3VwZXIoIHQgKTsgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sRXhjZXB0aW9uIGZyb20gYW4ge0BsaW5rIFhtbEVycm9yfS4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbEV4Y2VwdGlvbiAoIFhtbEVycm9yIGVycm9yICkKLSAgICB7Ci0gICAgICAgIHRoaXMoIGVycm9yLnRvU3RyaW5nKCksIG51bGwsIGVycm9yICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBYbWxFeGNlcHRpb24gZnJvbSBhIG1lc3NhZ2UsIGEgY2F1c2UsIGFuZCBhbiB7QGxpbmsgWG1sRXJyb3J9LgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sRXhjZXB0aW9uICggU3RyaW5nIG0sIFRocm93YWJsZSB0LCBYbWxFcnJvciBlcnJvciApCi0gICAgewotICAgICAgICB0aGlzKCBtLCB0LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCBlcnJvciApICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sRXhjZXB0aW9uIGZyb20gYSBtZXNzYWdlLCBhIGNhdXNlLCBhbmQgYSBjb2xsZWN0aW9uIG9mIHtAbGluayBYbWxFcnJvciBYbWxFcnJvcnN9LgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sRXhjZXB0aW9uICggU3RyaW5nIG0sIFRocm93YWJsZSB0LCBDb2xsZWN0aW9uIGVycm9ycyApCi0gICAgewotICAgICAgICBzdXBlciggbSwgdCApOwotCi0gICAgICAgIGlmIChlcnJvcnMgIT0gbnVsbCkKLSAgICAgICAgICAgIF9lcnJvcnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCBuZXcgQXJyYXlMaXN0KCBlcnJvcnMgKSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sRXhjZXB0aW9uIGZyb20gYW4ge0BsaW5rIFhtbFJ1bnRpbWVFeGNlcHRpb259LgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sRXhjZXB0aW9uICggWG1sUnVudGltZUV4Y2VwdGlvbiB4bWxSdW50aW1lRXhjZXB0aW9uICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKAotICAgICAgICAgICAgeG1sUnVudGltZUV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIHhtbFJ1bnRpbWVFeGNlcHRpb24uZ2V0Q2F1c2UoKSApOwotCi0gICAgICAgIENvbGxlY3Rpb24gZXJyb3JzID0geG1sUnVudGltZUV4Y2VwdGlvbi5nZXRFcnJvcnMoKTsKLQotICAgICAgICBpZiAoZXJyb3JzICE9IG51bGwpCi0gICAgICAgICAgICBfZXJyb3JzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCggbmV3IEFycmF5TGlzdCggZXJyb3JzICkgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlyc3Qge0BsaW5rIFhtbEVycm9yIFhtbEVycm9yc30gdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbiwgaWYgYW55LgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sRXJyb3IgZ2V0RXJyb3IgKCApCi0gICAgewotICAgICAgICBpZiAoX2Vycm9ycyA9PSBudWxsIHx8IF9lcnJvcnMuc2l6ZSgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gKFhtbEVycm9yKSBfZXJyb3JzLmdldCggMCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBYbWxFcnJvciBYbWxFcnJvcnN9IHRoYXQgY2F1c2VkIHRoZSBleGNlcHRpb24sIGlmIGFueS4KLSAgICAgKi8gCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0RXJyb3JzICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9lcnJvcnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0IF9lcnJvcnM7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEZhY3RvcnlIb29rLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRmFjdG9yeUhvb2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY5NTUxMi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRmFjdG9yeUhvb2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIGhvb2sgZm9yIHRoZSBYTUwgQmVhbiBGYWN0b3J5IG1lY2hhbmlzbS4KLSAqIFByb3ZpZGVkIGZvciBhZHZhbmNlZCB1c2VycyB3aG8gd2lzaCB0byBwcm92aWRlIHRoZWlyIG93bgotICogaW1wbGVtZW50YXRpb24gb2YgdGhlIEZhY3RvcnkucGFyc2UgbWV0aG9kcy4gVGhpcyBpcyB1c2VkLCBmb3IgZXhhbXBsZSwKLSAqIHRvIGRlZmVyIHJlYWRpbmcgWE1MIHN0cmVhbXMgdW50aWwgbmVlZGVkLgotICogPHA+Ci0gKiBUbyB1c2UgdGhlIGhvb2ssIGNhbGwgWG1sRmFjdG9yeUhvb2suVGhyZWFkQ29udGV4dC5zZXRIb29rKCksIHBhc3NpbmcKLSAqIHlvdXIgb3duIFhtbEZhY3RvcnlIb29rIGltcGxlbWVudGF0aW9uLiAgVGhlbiBldmVyeSBjYWxsIHRvIGEgRmFjdG9yeQotICogbWV0aG9kIHdpbGwgYmUgZGVsZ2F0ZWQgdG8geW91ciBob29rLgotICoKLSAqIDxwcmU+Ci0gKiBNeUhvb2sgaG9vayA9IG5ldyBNeUhvb2soKTsKLSAqIFhtbEZhY3RvcnlIb29rLlRocmVhZENvbnRleHQuc2V0SG9vayhob29rKTsKLSAqIC8vIHRoaXMgcmVzdWx0cyBpbiBhIGNhbGwgdG8gaG9vay5wYXJzZSguLi4pCi0gKiBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShuZXcgRmlsZSgidGVzdC54bWwiKSk7Ci0gKiA8L3ByZT4KLSAqIAotICogSWYgdGhlIGhvb2sgbmVlZHMgdG8gdHVybiBhcm91bmQgYW5kIGludm9rZSB0aGUgYnVpbHQtaW4gcGFyc2VycywgdGhlbgotICogaXQgc2hvdWxkIGRvIHNvIGJ5IGNhbGxpbmcgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCBvbiB0aGUgcGFzc2VkCi0gKiBTY2hlbWFUeXBlTG9hZGVyLiAgU2luY2UgU2NoZW1hVHlwZUxvYWRlci5wYXJzZSgpIG1ldGhvZHMgZGVsZWdhdGUKLSAqIHRvIHRoZSByZWdpc3RlcmVkIGhvb2ssIGEgaG9vayB0aGF0IHdpc2hlcyB0byBhY3R1YWxseSBpbnZva2UgdGhlCi0gKiBkZWZhdWx0IHBhcnNlciB3aXRob3V0IGhhdmluZyBpdHNlbGYgY2FsbGVkIGJhY2sgYWdhaW4gc2hvdWxkCi0gKiB1bnJlZ2lzdGVyIGl0c2VsZiBiZWZvcmUgY2FsbGluZyBsb2FkZXIucGFyc2UoKSwgYW5kIHRoZW4gcmUtcmVnaXN0ZXIKLSAqIGl0c2VsZiBhZ2FpbiBhZnRlciB0aGUgY2FsbC4KLSAqIDxwcmU+Ci0gKiB2b2lkIHBhcnNlKFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyLCAuLi4pCi0gKiB7Ci0gKiAgICAgWG1sRmFjdG9yeUhvb2sgcmVtZW1iZXIgPSBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LmdldEhvb2soKTsKLSAqICAgICBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LnNldEhvb2sobnVsbCk7Ci0gKiAgICAgbG9hZGVyLnBhcnNlKC4uLik7IC8vIGlzbid0IGhvb2tlZC4KLSAqICAgICBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LnNldEhvb2socmVtZW1iZXIpOwotICogfQotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRmFjdG9yeUhvb2sKLXsKLSAgICAvKiogSG9va3MgRmFjdG9yeS5uZXdJbnN0YW5jZSBjYWxscyAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgbmV3SW5zdGFuY2UgKCBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciwgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKTsKLSAgICAvKiogSG9va3MgRmFjdG9yeS5wYXJzZSBjYWxscyAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciwgU3RyaW5nIHhtbFRleHQsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbjsKLSAgICAvKiogSG9va3MgRmFjdG9yeS5wYXJzZSBjYWxscyAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciwgSW5wdXRTdHJlYW0gamlvaXMsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0gICAgLyoqIEhvb2tzIEZhY3RvcnkucGFyc2UgY2FsbHMgKi8KLSAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggU2NoZW1hVHlwZUxvYWRlciBsb2FkZXIsIFJlYWRlciBqaW9yLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotICAgIC8qKiBIb29rcyBGYWN0b3J5LnBhcnNlIGNhbGxzICovCi0gICAgcHVibGljIFhtbE9iamVjdCBwYXJzZSAoIFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyLCBOb2RlIG5vZGUsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbjsKLSAgICAvKiogSG9va3MgRmFjdG9yeS5wYXJzZSBjYWxscyAqLwotICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciwgWE1MSW5wdXRTdHJlYW0geGlzLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLSAgICAvKiogSG9va3MgRmFjdG9yeS5uZXdYbWxTYXhIYW5kbGVyIGNhbGxzICovCi0gICAgcHVibGljIFhtbFNheEhhbmRsZXIgbmV3WG1sU2F4SGFuZGxlciAoIFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApOwotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBtYW5hZ2UgdGhlIFhtbEZhY3RvcnlIb29rIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCi0gICAgICovIAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgVGhyZWFkQ29udGV4dAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWwgdGhyZWFkSG9vayA9IG5ldyBUaHJlYWRMb2NhbCgpOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgaG9vaywgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmFjdG9yeUhvb2sgZ2V0SG9vaygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoWG1sRmFjdG9yeUhvb2spdGhyZWFkSG9vay5nZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBob29rIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEhvb2soWG1sRmFjdG9yeUhvb2sgaG9vaykKLSAgICAgICAgewotICAgICAgICAgICAgdGhyZWFkSG9vay5zZXQoaG9vayk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwcm92aWRlZCB0byBwcmV2ZW50IHVud2FudGVkIGNvbnN0cnVjdGlvbgotICAgICAgICBwcml2YXRlIFRocmVhZENvbnRleHQoKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRmxvYXQuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxGbG9hdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmI1ZTFhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxGbG9hdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNmbG9hdCI+eHM6ZmxvYXQ8L2E+IHR5cGUuCi0gKiA8cD4KLSAqIE5hdHVyYWxseSwgY29udmVydGlibGUgdG8gYSBKYXZhIGZsb2F0LgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxGbG9hdCBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9mbG9hdCIpOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBmbG9hdCAqLwotICAgIGZsb2F0IGdldEZsb2F0VmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEgZmxvYXQgKi8KLSAgICB2b2lkIHNldEZsb2F0VmFsdWUoZmxvYXQgdik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBmbG9hdAotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0RmxvYXRWYWx1ZX0KLSAgICAgKiovCi0gICAgZmxvYXQgZmxvYXRWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGZsb2F0Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNzZXRGbG9hdFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChmbG9hdCB2KTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEZsb2F0fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxGbG9hdH0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxGbG9hdH0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sRmxvYXQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxGbG9hdH0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMi4zNGUrNSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEZsb2F0IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMi4zNGUrNSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEZsb2F0IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEZsb2F0fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEZsb2F0IHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxGbG9hdH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxGbG9hdH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRmxvYXQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxGbG9hdH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sRmxvYXQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxGbG9hdH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEZsb2F0fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEZsb2F0IHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxGbG9hdH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHRGF5LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR0RheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWUyYTVlLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHRGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ0RheSI+eHM6Z0RheTwvYT4gdHlwZS4KLSAqIEEgZ0RheSBzcGVjaWZpZXMgb25seSBhIGRheS1vZi1tb250aC4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIENhbGVuZGFyfSwge0BsaW5rIEdEYXRlfSwgb3IgYW4gaW50LgotICogCi0gKiBAc2VlIFhtbENhbGVuZGFyCi0gKiBAc2VlIEdEYXRlCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEdEYXkgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfZ0RheSIpOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgdm9pZCBzZXRDYWxlbmRhclZhbHVlKENhbGVuZGFyIGMpOwotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9ICovCi0gICAgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufSAqLwotICAgIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBnZCk7Ci0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTMxICovCi0gICAgaW50IGdldEludFZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTMxICovCi0gICAgdm9pZCBzZXRJbnRWYWx1ZShpbnQgdik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KENhbGVuZGFyIGMpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0RhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgR0RhdGUgZ0RhdGVWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KEdEYXRlU3BlY2lmaWNhdGlvbiBnZCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGFuIGludCBmcm9tIDEtMzEKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0SW50VmFsdWV9Ci0gICAgICoqLwotICAgIGludCBpbnRWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTMxCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEludFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChpbnQgdik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxHRGF5fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxHRGF5fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxHRGF5fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxHRGF5fSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0Oy0tLTE0Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0Oy0tLTE0Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdEYXl9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdEYXl9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHTW9udGguamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHTW9udGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA3NjVjOC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR01vbnRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ01vbnRoIj54czpnTW9udGg8L2E+IHR5cGUuCi0gKiBBIGdNb250aCBzcGVjaWZpZXMgb25seSBhIG1vbnRoLW9mLXllYXIuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBDYWxlbmRhcn0sIHtAbGluayBHRGF0ZX0sIG9yIGFuIGludC4KLSAqIAotICogQHNlZSBYbWxDYWxlbmRhcgotICogQHNlZSBHRGF0ZQotICovIAotcHVibGljIGludGVyZmFjZSBYbWxHTW9udGggZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfZ01vbnRoIik7Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0gKi8KLSAgICBDYWxlbmRhciBnZXRDYWxlbmRhclZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0gKi8KLSAgICB2b2lkIHNldENhbGVuZGFyVmFsdWUoQ2FsZW5kYXIgYyk7Ci0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0gKi8KLSAgICBHRGF0ZSBnZXRHRGF0ZVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259ICovCi0gICAgdm9pZCBzZXRHRGF0ZVZhbHVlKEdEYXRlIGdkKTsKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGFuIGludCBmcm9tIDEtMTIgKi8KLSAgICBpbnQgZ2V0SW50VmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGFuIGludCBmcm9tIDEtMTIgKi8KLSAgICB2b2lkIHNldEludFZhbHVlKGludCB2KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0Q2FsZW5kYXJWYWx1ZX0KLSAgICAgKiovCi0gICAgQ2FsZW5kYXIgY2FsZW5kYXJWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0Q2FsZW5kYXJWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoQ2FsZW5kYXIgYyk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRHRGF0ZVZhbHVlfQotICAgICAqKi8KLSAgICBHRGF0ZSBnRGF0ZVZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlU3BlY2lmaWNhdGlvbn0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0R0RhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoR0RhdGVTcGVjaWZpY2F0aW9uIGdkKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYW4gaW50IGZyb20gMS0xMgotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRJbnRWYWx1ZX0KLSAgICAgKiovCi0gICAgaW50IGludFZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGFuIGludCBmcm9tIDEtMTIKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0SW50VmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KGludCB2KTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sR01vbnRofS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxHTW9udGh9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxHTW9udGh9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxHTW9udGh9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRofSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7LS0wNiZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGh9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDstLTA2Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGh9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRofSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRofSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRofSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRofSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGh9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRofSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR01vbnRoRGF5LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR01vbnRoRGF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMGRkZmYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdNb250aERheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dNb250aERheSI+eHM6Z01vbnRoRGF5PC9hPiB0eXBlLgotICogQSBnTW9udGhEYXkgc3BlY2lmaWVzIGEgZGF5IG9mIGEgc3BlY2lmaWMgbW9udGggd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSB5ZWFyLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgQ2FsZW5kYXJ9IG9yIHtAbGluayBHRGF0ZX0uCi0gKiAKLSAqIEBzZWUgWG1sQ2FsZW5kYXIKLSAqIEBzZWUgR0RhdGUKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sR01vbnRoRGF5IGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2dNb250aERheSIpOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgdm9pZCBzZXRDYWxlbmRhclZhbHVlKENhbGVuZGFyIGMpOwotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9ICovCi0gICAgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufSAqLwotICAgIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBnZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KENhbGVuZGFyIGMpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0RhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgR0RhdGUgZ0RhdGVWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KEdEYXRlU3BlY2lmaWNhdGlvbiBnZCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEdNb250aERheX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sR01vbnRoRGF5fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aERheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sR01vbnRoRGF5fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sR01vbnRoRGF5fSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0Oy0tMDYtMTQmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRoRGF5fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7LS0wNi0xNCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRoRGF5fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoRGF5IHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aERheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoRGF5IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdNb250aERheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRoRGF5fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoRGF5IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoRGF5IHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdZZWFyLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR1llYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJiYzUyNS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR1llYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnWWVhciI+eHM6Z1llYXI8L2E+IHR5cGUuCi0gKiBBIGdZZWFyIHNwZWNpZmllcyBhIEdyZWdvcmlhbiB5ZWFyIChBRCkuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBDYWxlbmRhcn0sIHtAbGluayBHRGF0ZX0sIG9yIGFuIGludC4KLSAqIAotICogQHNlZSBYbWxDYWxlbmRhcgotICogQHNlZSBHRGF0ZQotICovIAotcHVibGljIGludGVyZmFjZSBYbWxHWWVhciBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9nWWVhciIpOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgdm9pZCBzZXRDYWxlbmRhclZhbHVlKENhbGVuZGFyIGMpOwotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9ICovCi0gICAgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufSAqLwotICAgIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBnZCk7Ci0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTMxICovCi0gICAgaW50IGdldEludFZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTMxICovCi0gICAgdm9pZCBzZXRJbnRWYWx1ZShpbnQgdik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KENhbGVuZGFyIGMpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0RhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgR0RhdGUgZ0RhdGVWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KEdEYXRlU3BlY2lmaWNhdGlvbiBnZCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGFuIGludCBmcm9tIDEtMzEKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0SW50VmFsdWV9Ci0gICAgICoqLwotICAgIGludCBpbnRWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTMxCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEludFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChpbnQgdik7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEdZZWFyfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxHWWVhcn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxHWWVhcn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxHWWVhcn0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsyMDAzJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhcn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzIwMDMmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhcn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhcn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR1llYXJNb250aC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdZZWFyTW9udGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM4ZWRhZC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR1llYXJNb250aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dZZWFyTW9udGgiPnhzOmdZZWFyTW9udGg8L2E+IHR5cGUuCi0gKiBBIGdZZWFyTW9udGggc3BlY2lmaWVzIGEgbW9udGggaW4gYSBzcGVjaWZpYyB5ZWFyLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgQ2FsZW5kYXJ9LCB7QGxpbmsgR0RhdGV9LgotICogCi0gKiBAc2VlIFhtbENhbGVuZGFyCi0gKiBAc2VlIEdEYXRlCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEdZZWFyTW9udGggZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfZ1llYXJNb250aCIpOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCi0gICAgdm9pZCBzZXRDYWxlbmRhclZhbHVlKENhbGVuZGFyIGMpOwotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9ICovCi0gICAgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufSAqLwotICAgIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBnZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldENhbGVuZGFyVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KENhbGVuZGFyIGMpOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0RhdGVWYWx1ZX0KLSAgICAgKiovCi0gICAgR0RhdGUgZ0RhdGVWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KEdEYXRlU3BlY2lmaWNhdGlvbiBnZCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEdZZWFyTW9udGh9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEdZZWFyTW9udGh9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXJNb250aCBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEdZZWFyTW9udGh9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXJNb250aCBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEdZZWFyTW9udGh9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXJNb250aCBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhck1vbnRofSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MjAwMy0wNiZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyTW9udGh9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsyMDAzLTA2Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXJNb250aCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyTW9udGh9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXJNb250aCBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhck1vbnRofSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhck1vbnRofSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhck1vbnRofSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhck1vbnRofSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyTW9udGh9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXJNb250aCBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhck1vbnRofSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxIZXhCaW5hcnkuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxIZXhCaW5hcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EwYWIxMC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSGV4QmluYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2hleEJpbmFyeSI+eHM6aGV4QmluYXJ5PC9hPiB0eXBlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byBhIGJ5dGUgYXJyYXkuIAotICovIAotcHVibGljIGludGVyZmFjZSBYbWxIZXhCaW5hcnkgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfaGV4QmluYXJ5Iik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgYnl0ZSBhcnJheS4KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldEJ5dGVBcnJheVZhbHVlfQotICAgICAqKi8KLSAgICBieXRlW10gYnl0ZUFycmF5VmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGJ5dGUgYXJyYXkuCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNzZXRCeXRlQXJyYXlWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoYnl0ZVtdIGJhKTsKLQotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBieXRlIGFycmF5LiAqKi8KLSAgICBieXRlW10gZ2V0Qnl0ZUFycmF5VmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEgYnl0ZSBhcnJheS4gKi8KLSAgICB2b2lkIHNldEJ5dGVBcnJheVZhbHVlKGJ5dGVbXSBiYSk7Ci0KLQotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxIZXhCaW5hcnl9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEhleEJpbmFyeX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxIZXhCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEhleEJpbmFyeX0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEhleEJpbmFyeX0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDs2ODY1NmM2YzZmJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEhleEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzY4NjU2YzZjNmYmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEhleEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEhleEJpbmFyeSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxIZXhCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEhleEJpbmFyeSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxIZXhCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEhleEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEhleEJpbmFyeSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEhleEJpbmFyeSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJRC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MDI0M2MuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbElELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0lEIj54czpJRDwvYT4gdHlwZS4KLSAqIDxwPgotICogV2hlbiB2YWxpZGF0ZWQsIElEcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBkb2N1bWVudC4gIEFuIGVsZW1lbnQKLSAqIG1heSBub3QgaGF2ZSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aG9zZSB0eXBlIGlzIElELgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byBhIHtAbGluayBTdHJpbmd9LiAKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sSUQgZXh0ZW5kcyBYbWxOQ05hbWUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9JRCIpOwotICAgIAotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sSUR9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbElEfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbElEfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbElEfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O24xJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O24xJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSUR9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSUR9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbElEUkVGLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSURSRUYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyMGRlZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSURSRUYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jSURSRUYiPnhzOklEUkVGPC9hPiB0eXBlLgotICogPHA+Ci0gKiBXaGVuIHZhbGlkYXRlZCwgSURSRUYgdmFsdWVzIG11c3QgbWF0Y2ggYW4gSUQgdmFsdWUgdGhhdCBpcyBwcmVzZW50IHdpdGhpbgotICogdGhlIGRvY3VtZW50LiBUaGlzIHJ1bGUgaXMgb25seSB2ZXJpZmllZCB3aGVuIGEgd2hvbGUgZG9jdW1lbnQgaXMgdmFsaWRhdGVkCi0gKiBhdCBvbmNlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byBhIHtAbGluayBTdHJpbmd9LiAKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sSURSRUYgZXh0ZW5kcyBYbWxOQ05hbWUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9JRFJFRiIpOwotICAgIAotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sSURSRUZ9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbElEUkVGfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbElEUkVGfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbElEUkVGfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJRFJFRlMuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJRFJFRlMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdmY2NkZi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSURSRUZTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNJRFJFRlMiPnhzOklEUkVGUzwvYT4gdHlwZSwKLSAqIGEgbGlzdCB0eXBlLgotICogPHA+Ci0gKiBXaGVuIHZhbGlkYXRlZCwgSURSRUYgdmFsdWVzIG11c3QgbWF0Y2ggYW4gSUQgdmFsdWUgdGhhdCBpcyBwcmVzZW50IHdpdGhpbgotICogdGhlIGRvY3VtZW50LiBUaGlzIHJ1bGUgaXMgb25seSB2ZXJpZmllZCB3aGVuIGEgd2hvbGUgZG9jdW1lbnQgaXMgdmFsaWRhdGVkCi0gKiBhdCBvbmNlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byBhIHtAbGluayBMaXN0fS4gCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbElEUkVGUyBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9JRFJFRlMiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFN0cmluZ30gdmFsdWVzICovCi0gICAgTGlzdCBnZXRMaXN0VmFsdWUoKTsKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFhtbElEUkVGfSB2YWx1ZXMgKi8KLSAgICBMaXN0IHhnZXRMaXN0VmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gKi8KLSAgICB2b2lkIHNldExpc3RWYWx1ZShMaXN0IGwpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFN0cmluZ30gdmFsdWVzCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRMaXN0VmFsdWV9Ci0gICAgICoqLwotICAgIExpc3QgbGlzdFZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFhtbElEUkVGfSB2YWx1ZXMKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldExpc3RWYWx1ZX0KLSAgICAgKiovCi0gICAgTGlzdCB4bGlzdFZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0KLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldExpc3RWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoTGlzdCBsKTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sSURSRUZTfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxJRFJFRlN9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUZTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxJRFJFRlN9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxJRFJFRlN9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRlN9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRlN9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRlMgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUZTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRlMgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSURSRUZTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRlN9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRlMgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRlMgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSW50LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MGVmM2QuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNpbnQiPnhzOmludDwvYT4gdHlwZS4KLSAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiPnhzOmRlY2ltYWw8L2E+LgotICogPHA+Ci0gKiBOYXR1cmFsbHksIGNvbnZlcnRpYmxlIHRvIGEgSmF2YSBpbnQuCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEludCBleHRlbmRzIFhtbExvbmcKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9pbnQiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGFuIGludCAqLwotICAgIGludCBnZXRJbnRWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYW4gaW50ICovCi0gICAgdm9pZCBzZXRJbnRWYWx1ZShpbnQgdik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYW4gaW50Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEludFZhbHVlfQotICAgICAqKi8KLSAgICBpbnQgaW50VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYW4gaW50Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEludFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChpbnQgdik7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEludH0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sSW50fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sSW50fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sSW50fSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnQpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1NjcmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2NyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnR9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnR9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnR9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnR9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnR9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEludGVnZXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJbnRlZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMWY1MmMuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNpbnRlZ2VyIj54czppbnRlZ2VyPC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCI+eHM6ZGVjaW1hbDwvYT4uCi0gKiA8cD4KLSAqIFRoaXMgdHlwZSBzaG91bGQgbm90IGJlIGNvbmZ1c2VkIHdpdGggPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNpbnQiPnhzOmludDwvYT4KLSAqIG9yIEphdmEge0BsaW5rIEludGVnZXJ9LiAgVGhpcyB0eXBlIHJlcHJlc2VudHMgYW4gYXJiaXRyYXJ5LXByZWNpc2lvbiBpbnRlZ2VyIHdpdGgKLSAqIGFueSBudW1iZXIgb2YgZGlnaXRzLCB3aGlsZSBhIEphdmEgaW50IG9yIGFuIHhzOmludCBpcyBhIDMyLWJpdCBmaW5pdGUtcHJlY2lzaW9uIGludGVnZXIuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIGEgSmF2YSB7QGxpbmsgQmlnSW50ZWdlcn0uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEludGVnZXIgZXh0ZW5kcyBYbWxEZWNpbWFsCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfaW50ZWdlciIpOwotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQmlnSW50ZWdlcn0gKi8KLSAgICBCaWdJbnRlZ2VyIGdldEJpZ0ludGVnZXJWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQmlnSW50ZWdlcn0gKi8KLSAgICB2b2lkIHNldEJpZ0ludGVnZXJWYWx1ZShCaWdJbnRlZ2VyIGJpKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBCaWdJbnRlZ2VyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRCaWdJbnRlZ2VyVmFsdWV9Ci0gICAgICoqLwotICAgIEJpZ0ludGVnZXIgYmlnSW50ZWdlclZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0ludGVnZXJ9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEJpZ0ludGVnZXJWYWx1ZX0KLSAgICAgKiovCi0gICAgdm9pZCBzZXQoQmlnSW50ZWdlciBiaSk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbEludGVnZXJ9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEludGVnZXJ9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50ZWdlciBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEludGVnZXJ9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50ZWdlciBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEludGVnZXJ9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50ZWdlciBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2Nzg5MCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjM0NTY3ODkwJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50ZWdlciBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50ZWdlciBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50ZWdlciBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxMYW5ndWFnZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbExhbmd1YWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjODI2MTQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbExhbmd1YWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2xhbmd1YWdlIj54czpsYW5ndWFnZTwvYT4gdHlwZS4KLSAqIDxwPgotICogVGhpcyB0eXBlIGlzIGludGVuZGVkIHRvIHJlcHJlc2VudCBhbiBzdGFuZGFyZCBJU08gbGFuZ3VhZ2UgY29kZSBzdHJpbmcuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIGEgSmF2YSB7QGxpbmsgU3RyaW5nfS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sTGFuZ3VhZ2UgZXh0ZW5kcyBYbWxUb2tlbgotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2xhbmd1YWdlIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxMYW5ndWFnZX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTGFuZ3VhZ2V9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTGFuZ3VhZ2V9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExhbmd1YWdlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sTGFuZ3VhZ2V9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7ZW4tdXMmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMYW5ndWFnZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7ZW4tdXMmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMYW5ndWFnZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMYW5ndWFnZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMYW5ndWFnZSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTGFuZ3VhZ2V9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTGFuZ3VhZ2V9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExhbmd1YWdlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTGFuZ3VhZ2V9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExhbmd1YWdlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTGFuZ3VhZ2V9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMYW5ndWFnZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMYW5ndWFnZSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTGFuZ3VhZ2V9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTGluZU51bWJlci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbExpbmVOdW1iZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2NDI0MC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTGluZU51bWJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yLlhtbEJvb2ttYXJrOwotCi0vKioKLSAqIEEgc3ViY2xhc3Mgb2YgWG1sQm9va21hcmsgdGhhdCBob2xkcyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4KLSAqIElmIGEgZG9jdW1lbnQgaXMgcGFyc2VkIHdpdGggbGluZSBudW1iZXJzCi0gKiBlbmFibGVkLCB0aGVzZSBib29rbWFya3Mgd2lsbCBiZSBwbGFjZWQgYXQgYXBwcm9wcmlhdGUgbG9jYXRpb25zCi0gKiB3aXRoaW4gdGhlIGRvY3VtZW50LgotICogCi0gKiBAc2VlIFhtbE9wdGlvbnMjc2V0TG9hZExpbmVOdW1iZXJzIAotICovCi1wdWJsaWMgY2xhc3MgWG1sTGluZU51bWJlciBleHRlbmRzIFhtbEJvb2ttYXJrCi17Ci0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGxpbmUgbnVtYmVyIHdpdGggbm8gY29sdW1uIG9yIG9mZnNldCBpbmZvcm1hdGlvbi4KLSAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSBudW1iZXIgLSB0aGUgZmlyc3QgbGluZSBpcyAxCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxMaW5lTnVtYmVyICggaW50IGxpbmUgKSB7IHRoaXMoIGxpbmUsIC0xLCAtMSApOyB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGxpbmUgbnVtYmVyIGFuZCBjb2x1bW4gd2l0aCBubyBmaWxlIG9mZnNldCBpbmZvcm1hdGlvbi4KLSAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSBudW1iZXIgLSB0aGUgZmlyc3QgbGluZSBpcyAxCi0gICAgICogQHBhcmFtIGxpbmUgdGhlIGNvbHVtbiBudW1iZXIgLSB0aGUgZmlyc3QgY29sdW1uIGlzIDEKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sTGluZU51bWJlciAoIGludCBsaW5lLCBpbnQgY29sdW1uICkgeyB0aGlzKCBsaW5lLCBjb2x1bW4sIC0xICk7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbGluZSBudW1iZXIgYW5kIGNvbHVtbiB3aXRoIG5vIGZpbGUgb2Zmc2V0IGluZm9ybWF0aW9uLgotICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIG51bWJlciAtIHRoZSBmaXJzdCBsaW5lIGlzIDEKLSAgICAgKiBAcGFyYW0gbGluZSB0aGUgY29sdW1uIG51bWJlciAtIHRoZSBmaXJzdCBjb2x1bW4gaXMgMQotICAgICAqIEBwYXJhbSBsaW5lIHRoZSBmaWxlIGNoYXJhY3RlciBvZmZzZXQgLSB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBmaWxlIGlzIDAKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sTGluZU51bWJlciAoIGludCBsaW5lLCBpbnQgY29sdW1uLCBpbnQgb2Zmc2V0ICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBmYWxzZSApOwotICAgICAgICAKLSAgICAgICAgX2xpbmUgPSBsaW5lOwotICAgICAgICBfY29sdW1uID0gY29sdW1uOwotICAgICAgICBfb2Zmc2V0ID0gb2Zmc2V0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSAxLWJhc2VkIGxpbmUgbnVtYmVyLCBvciAtMSBpZiBub3Qga25vd24uCi0gICAgICovIAotICAgIHB1YmxpYyBpbnQgZ2V0TGluZSAgICggKSB7IHJldHVybiBfbGluZTsgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgMS1iYXNlZCBjb2x1bW4gbnVtYmVyLCBvciAtMSBpZiBub3Qga25vd24uCi0gICAgICovIAotICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uICggKSB7IHJldHVybiBfY29sdW1uOyB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgMC1iYXNlZCBmaWxlIG9mZnNldCBudW1iZXIsIG9yIC0xIGlmIG5vdCBrbm93bi4KLSAgICAgKi8gCi0gICAgcHVibGljIGludCBnZXRPZmZzZXQgKCApIHsgcmV0dXJuIF9vZmZzZXQ7IH0KLQotICAgIHByaXZhdGUgaW50IF9saW5lLCBfY29sdW1uLCBfb2Zmc2V0OwotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbExvbmcuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxMb25nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYjY4NDcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbExvbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbG9uZyI+eHM6bG9uZzwvYT4gdHlwZS4KLSAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiPnhzOmRlY2ltYWw8L2E+LgotICogPHA+Ci0gKiBOYXR1cmFsbHksIGNvbnZlcnRpYmxlIHRvIGEgSmF2YSBsb25nLgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxMb25nIGV4dGVuZHMgWG1sSW50ZWdlcgotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2xvbmciKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgbG9uZyAqLwotICAgIGxvbmcgZ2V0TG9uZ1ZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGxvbmcgKi8KLSAgICB2b2lkIHNldExvbmdWYWx1ZShsb25nIHYpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgbG9uZwotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRMb25nVmFsdWV9Ci0gICAgICoqLwotICAgIGxvbmcgbG9uZ1ZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEgbG9uZwotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRMb25nVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KGxvbmcgdik7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbExvbmd9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbExvbmd9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbExvbmd9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbExvbmd9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMb25nKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMb25nfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2Nzg5Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Njc4OSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMb25nfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTG9uZ30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMb25nfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTG9uZ30gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTkNOYW1lLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTkNOYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNjc4MTYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5DTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOYW1lIj54czpOYW1lPC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jc3RyaW5nIj54czpzdHJpbmc8L2E+LgotICogPHA+Ci0gKiBUaGlzIGtpbmQgb2Ygc3RyaW5nIGlzIHRoZSBzYW1lIGFzIHRoZSBub24tY29sb25pemVkIHN0cmluZ3MgdGhhdCBhcmUgdXNlZAotICogZm9yIFhNTCBsb2NhbG5hbWVzIGFuZCBwcmVmaXhlcywgIm15LWhyZWYuMiIuICBJdCBpcyBqdXN0IGEgcGh5c2ljYWwKLSAqIHN0cmluZywgaG93ZXZlciwgYW5kIGl0IHNob3VsZCBOT1QgYmUgY29uZnVzZWQgd2l0aCB7QGxpbmsgWG1sUU5hbWV9LAotICogd2hpY2ggaXMgYSBsb2dpY2FsIGNvbWJpbmF0aW9uIG9mIGxvY2FsbmFtZSBhbmQgbmFtZXNwYWNlIFVSSS4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIFN0cmluZ30uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5DTmFtZSBleHRlbmRzIFhtbE5hbWUKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9OQ05hbWUiKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbE5DTmFtZX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTkNOYW1lfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5DTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTkNOYW1lfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sTkNOYW1lfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O015LU5hbWUmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTkNOYW1lfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7TXktTmFtZSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTkNOYW1lfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTkNOYW1lIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5DTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTkNOYW1lIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5DTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTkNOYW1lfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTkNOYW1lIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTkNOYW1lIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5NVE9LRU4uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOTVRPS0VOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMmU2NTQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5NVE9LRU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk1UT0tFTiI+eHM6Tk1UT0tFTjwvYT4gdHlwZS4KLSAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3N0cmluZyI+eHM6c3RyaW5nPC9hPi4KLSAqIDxwPgotICogQW4gTk1UT0tFTiBpcyBYTUwncyBjbG9zZXN0IGNvbmNlcHQgdG8gYW4gImlkZW50aWZpZXIiOyBmb3IgZXhhbXBsZSwKLSAqIGl0IGRvZXMgbm90IHBlcm1pdCBzcGFjZXMgYW5kIG9ubHkgbGltaXRlZCBwdW5jdHVhdGlvbi4gIFNvIE5NVE9LRU4gaXMKLSAqIGNvbW1vbmx5IHVzZWQgdG8gZGVzY3JpYmUgYSBzaW5nbGUgdG9rZW4gb3IgZW51bWVyYXRlZCBzdHJpbmcgdmFsdWUuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBTdHJpbmd9LgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxOTVRPS0VOIGV4dGVuZHMgWG1sVG9rZW4KLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9OTVRPS0VOIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxOTVRPS0VOfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOTVRPS0VOfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOTVRPS0VOfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxOTVRPS0VOfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O3NhbXBsZS0xLjImbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7c2FtcGxlLTEuMiZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU59IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU59IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU59IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU59IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU59IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTk1UT0tFTlMuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOTVRPS0VOUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTBiZTg0Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOTVRPS0VOUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk1UT0tFTlMiPnhzOk5NVE9LRU5TPC9hPiB0eXBlLAotICogYSBsaXN0IHR5cGUuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBMaXN0fS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sTk1UT0tFTlMgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfTk1UT0tFTlMiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFN0cmluZ30gdmFsdWVzICovCi0gICAgTGlzdCBnZXRMaXN0VmFsdWUoKTsKLSAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFhtbE5NVE9LRU59IHZhbHVlcyAqLwotICAgIExpc3QgeGdldExpc3RWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSAqLwotICAgIHZvaWQgc2V0TGlzdFZhbHVlKExpc3QgbCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgU3RyaW5nfSB2YWx1ZXMKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldExpc3RWYWx1ZX0KLSAgICAgKiovCi0gICAgTGlzdCBsaXN0VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgWG1sTk1UT0tFTn0gdmFsdWVzCi0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRMaXN0VmFsdWV9Ci0gICAgICoqLwotICAgIExpc3QgeGxpc3RWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRMaXN0VmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KExpc3QgbCk7Ci0KLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sTk1UT0tFTlN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5NVE9LRU5TfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5NVE9LRU5TfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbE5NVE9LRU5TfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O3NhbXBsZS0xLjEgc2FtcGxlLTEuMiBzYW1wbGUtMS4zJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTlMgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O3NhbXBsZS0xLjEgc2FtcGxlLTEuMiBzYW1wbGUtMS4zJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTlMgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTlMgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU5TfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU5TfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU5TfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU5TfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTlMgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU5TfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5PVEFUSU9OLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTk9UQVRJT04uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2MzkxOS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTk9UQVRJT04uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk9UQVRJT04iPnhzOk5PVEFUSU9OPC9hPiB0eXBlLgotICogPHA+Ci0gKiBOT1RBVElPTnMgYXJlIGEgbWVjaGFuaXNtIGluIFhNTCBTY2hlbWEgdGhhdCBpcyBwcm92aWRlZAotICogZm9yIHBhcnRpYWwgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIE5PVEFUSU9OcyBpbiBEVERzLiAgWE1MIFNjaGVtYQotICogdXNlcnMgc2hvdWxkIGFsbW9zdCBuZXZlciBoYXZlIGFueSByZWFzb24gdG8gdXNlIHRoaXMgZGF0YSB0eXBlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgU3RyaW5nfS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sTk9UQVRJT04gZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfTk9UQVRJT04iKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbE5PVEFUSU9OfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOT1RBVElPTn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5PVEFUSU9OKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOT1RBVElPTn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxOT1RBVElPTn0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOT1RBVElPTn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOT1RBVElPTn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5PVEFUSU9OIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5PVEFUSU9OKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5PVEFUSU9OIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5PVEFUSU9OKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOT1RBVElPTn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5PVEFUSU9OIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5PVEFUSU9OIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTmFtZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU4MmRkYS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOYW1lIj54czpOYW1lPC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jc3RyaW5nIj54czpzdHJpbmc8L2E+LgotICogPHA+Ci0gKiBUaGlzIGtpbmQgb2Ygc3RyaW5nIGlzIHRoZSBzYW1lIGFzIHRoZSBsZXhpY2FsIHJlcHJlc2VudGF0aW9uIHVzZWQgZm9yIFhNTCAxLjAKLSAqIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBuYW1lcywgZS5nLiwgInByZTphLWIuY2RlZiIuICBJdCBpcyBqdXN0IGEgcGh5c2ljYWwKLSAqIHN0cmluZywgaG93ZXZlciwgYW5kIGl0IHNob3VsZCBOT1QgYmUgY29uZnVzZWQgd2l0aCB7QGxpbmsgWG1sUU5hbWV9LAotICogd2hpY2ggaXMgYSBsb2dpY2FsIGNvbWJpbmF0aW9uIG9mIGxvY2FsbmFtZSBhbmQgbmFtZXNwYWNlIFVSSS4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIFN0cmluZ30uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5hbWUgZXh0ZW5kcyBYbWxUb2tlbgotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX05hbWUiKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbE5hbWV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5hbWV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5hbWV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbE5hbWV9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7TXk6TmFtZSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5hbWV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtNeTpOYW1lJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5hbWV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmFtZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmFtZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmFtZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5hbWV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmFtZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOZWdhdGl2ZUludGVnZXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOZWdhdGl2ZUludGVnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwNWZlZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTmVnYXRpdmVJbnRlZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25lZ2F0aXZlSW50ZWdlciI+eHM6bmVnYXRpdmVJbnRlZ2VyPC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCI+eHM6ZGVjaW1hbDwvYT4uCi0gKiA8cD4KLSAqIFZlcmlmaWVkIHRvIGJlIG5lZ2F0aXZlIHdoZW4gdmFsaWRhdGluZy4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyfS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sTmVnYXRpdmVJbnRlZ2VyIGV4dGVuZHMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfbmVnYXRpdmVJbnRlZ2VyIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDstMTIzNDU2Nzg5MCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDstMTIzNDU2Nzg5MCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5lZ2F0aXZlSW50ZWdlciBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vbk5lZ2F0aXZlSW50ZWdlci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vbk5lZ2F0aXZlSW50ZWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTMzNGNmLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOb25OZWdhdGl2ZUludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9uTmVnYXRpdmVJbnRlZ2VyIj54czpub25OZWdhdGl2ZUludGVnZXI8L2E+IHR5cGUuCi0gKiBPbmUgb2YgdGhlIGRlcml2ZWQgdHlwZXMgYmFzZWQgb24gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkZWNpbWFsIj54czpkZWNpbWFsPC9hPi4KLSAqIDxwPgotICogVmVyaWZpZWQgdG8gYmUgemVybyBvciBwb3NpdGl2ZSB3aGVuIHZhbGlkYXRpbmcuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlcn0uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBleHRlbmRzIFhtbEludGVnZXIKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9ub25OZWdhdGl2ZUludGVnZXIiKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vbk5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Njc4OTAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2Nzg5MCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vbk5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vbk5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vblBvc2l0aXZlSW50ZWdlci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vblBvc2l0aXZlSW50ZWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGMwMmM5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOb25Qb3NpdGl2ZUludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9uUG9zaXRpdmVJbnRlZ2VyIj54czpub25Qb3NpdGl2ZUludGVnZXI8L2E+IHR5cGUuCi0gKiBPbmUgb2YgdGhlIGRlcml2ZWQgdHlwZXMgYmFzZWQgb24gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkZWNpbWFsIj54czpkZWNpbWFsPC9hPi4KLSAqIDxwPgotICogVmVyaWZpZWQgdG8gYmUgemVybyBvciBuZWdhdGl2ZSB3aGVuIHZhbGlkYXRpbmcuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlcn0uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5vblBvc2l0aXZlSW50ZWdlciBleHRlbmRzIFhtbEludGVnZXIKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9ub25Qb3NpdGl2ZUludGVnZXIiKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0Oy0xMjM0NTY3ODkwJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0Oy0xMjM0NTY3ODkwJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTm9ybWFsaXplZFN0cmluZy5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vcm1hbGl6ZWRTdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk3M2VlMS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTm9ybWFsaXplZFN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNub3JtYWxpemVkU3RyaW5nIj54czpub3JtYWxpemVkU3RyaW5nPC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jc3RyaW5nIj54czpzdHJpbmc8L2E+LgotICogPHA+Ci0gKiBBbiBub3JtYWxpemVkU3RyaW5nIHNpbXBseSBpcyBhIHN0cmluZyB3aGVyZSBhbGwgdGhlIGNhcnJpYWdlIHJldHVybiwKLSAqIGxpbmVmZWVkLCBhbmQgdGFiIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIG5vcm1hbGl6ZWQgKHN3aXRjaGVkIHRvKSBvcmRpbmFyeQotICogc3BhY2UgY2hhcmFjdGVycy4gIFVzZSBub3JtYWxpemVkU3RyaW5nIGZvciBsb25nIHN0cmluZ3MgdG8gbWFrZSB0aGVtCi0gKiBpbnNlbnNpdGl2ZSB0byBsaW5lIGJyZWFraW5nLiAgSWYgeW91IHdpc2ggdG8gb2Z0ZW4gYmUgaW5zZW5zaXRpdmUgdG8KLSAqIHJ1bnMgb2Ygd2hpdGVzcGFjZSAoYXMgaXMgb2Z0ZW4gdGhlIGNhc2UpLCB1c2UKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdG9rZW4iPnhzOnRva2VuPC9hPgotICogKGFrYSB7QGxpbmsgWG1sVG9rZW59KSBpbnN0ZWFkLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgU3RyaW5nfS4gIFdoZW4gb2J0YWluaW5nIHRoZSBzdHJpbmdWYWx1ZSwgdGhlCi0gKiB3aGl0ZXNwYWNlLW5vcm1hbGl6ZWQgdmFsdWUgaXMgcmV0dXJuZWQuCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5vcm1hbGl6ZWRTdHJpbmcgZXh0ZW5kcyBYbWxTdHJpbmcKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9ub3JtYWxpemVkU3RyaW5nIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OyBzdHJpbmcgdG8gbm9ybWFsaXplICZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsgc3RyaW5nIHRvIG5vcm1hbGl6ZSAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmd9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmd9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE9iamVjdC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDJlNjljLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8ja2V5LXVyVHlwZSI+eHM6YW55VHlwZTwvYT4sCi0gKiB0aGUgYmFzZSB0eXBlIGZvciBhbGwgWE1MIEJlYW5zLgotICogPHA+Ci0gKiBTaW5jZSBhbGwgWE1MIFNjaGVtYSB0eXBlcyBhcmUgdHJhbnNsYXRlZCBpbnRvIGNvcnJlc3BvbmRpbmcgWE1MIEJlYW4KLSAqIGNsYXNzZXMsIGFuZCBhbGwgU2NoZW1hIHR5cGUgZGVyaXZhdGlvbiBjb3JyZXNwb25kcyB0byBKYXZhIGNsYXNzCi0gKiBpbmhlcml0YW5jZSwgdGhlIGZhY3QgdGhhdCBhbGwgU2NoZW1hIHR5cGVzIGRlcml2ZSBmcm9tIHhzOmFueVR5cGUgbWVhbnMKLSAqIHRoYXQgYWxsIFhNTCBCZWFuIGNsYXNzZXMgZGVyaXZlIGZyb20gWG1sT2JqZWN0LgotICogPHA+Ci0gKiBPbiB0aGlzIGJhc2UgY2xhc3MgeW91IHdpbGwgZmluZCBhIG51bWJlciBvZiBjb21tb24gZmFjaWxpdGllcyB0aGF0Ci0gKiBhbGwgWE1MIEJlYW4gY2xhc3NlcyBwcm92aWRlOgotICogPHA+Ci0gKiA8dWw+Ci0gKiA8bGk+RXZlcnkgWE1MIEJlYW4gY2xhc3MgaGFzIGFuIGlubmVyIEZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIGFuZCBwYXJzaW5nCi0gKiAgICAgaW5zdGFuY2VzLCBpbmNsdWRpbmcgWG1sT2JqZWN0LiBVc2Uge0BsaW5rIFhtbE9iamVjdC5GYWN0b3J5fSBpdHNlbGYKLSAqICAgICB0byBwcm9kdWNlIHVudHlwZWQgWE1MIHRyZWVzIG9yIFhNTCB0cmVlcyB0aGF0IGltcGxlbWVudCBzcGVjaWZpYwotICogICAgIHN1YnR5cGVzIG9mIFhtbE9iamVjdCBkZXBlbmRpbmcgb24gYSByZWNvZ25pemVkIHJvb3QgZG9jdW1lbnQgZWxlbWVudC4KLSAqICAgICBJZiB5b3UgZGVwZW5kIG9uIHRoZSBhdXRvbWF0aWMgdHlwZSBpbmZlcmVuY2UsIHlvdSB3aWxsIHdhbnQgdG8gdW5kZXJzdGFuZAotICogICAgIHRoZSB0eXBlIGluZmVyZW5jZSBpc3N1ZXMgZGVzY3JpYmVkIGJlbG93LgotICogPGxpPlRvIHdyaXRlIG91dCBhbiBhY2N1cmF0ZSBYTUwgZmlsZSBmb3IgdGhlIFhNTCB0cmVlIHVuZGVyIHRoaXMKLSAqICAgICBYbWxPYmplY3QsIHVzZSBvbmUgb2YgdGhlIHtAbGluayAjc2F2ZX0gbWV0aG9kcywKLSAqICAgICBvciB7QGxpbmsgI25ld0lucHV0U3RyZWFtfSBvciB7QGxpbmsgI25ld1JlYWRlcn0uCi0gKiAgICAgVXNlIHtAbGluayAjdG9TdHJpbmd9IHRvIHByb2R1Y2UgYSBwcmV0dHktcHJpbnRlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUKLSAqICAgICBYTUwgc3VidHJlZSB1bmRlciB0aGlzIFhNTCBPYmplY3QuICBJZiB5b3Ugc2F2ZSBpbnRlcmlvciBwb3J0aW9ucyBvZgotICogICAgIGFuIFhNTCBkb2N1bWVudCwgeW91IHdpbGwgd2FudCB0byB1bmRlcnN0YW5kIHRoZSBpbm5lciBjb250ZW50cwotICogICAgIHZlcnN1cyBvdXRlciBjb250YWluZXIgaXNzdWVzIGRlc2NyaWJlZCBiZWxvdy4KLSAqIDxsaT5JdCBpcyBhbHNvIHNpbXBsZSB0byBjb3B5IGFuIFhtbE9iamVjdCBpbnN0YW5jZSB0byBvciBmcm9tIGEgc3RhbmRhcmQKLSAqICAgICBET00gdHJlZSBvciBTQVggc3RyZWFtLiAgVXNlIHtAbGluayBYbWxPYmplY3QuRmFjdG9yeSNwYXJzZShOb2RlKX0sCi0gKiAgICAgZm9yIGV4YW1wbGUsIHRvIGxvYWQgZnJvbSBET007IHVzZSB7QGxpbmsgWG1sT2JqZWN0LkZhY3RvcnkjbmV3WG1sU2F4SGFuZGxlcn0KLSAqICAgICB0byBsb2FkIGZyb20gU0FYOyB1c2Uge0BsaW5rICNuZXdEb21Ob2RlKCl9IHRvIHNhdmUgdG8gRE9NOyBhbmQgdXNlIAotICogICAgIHtAbGluayAjc2F2ZShvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciwgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyKX0KLSAqICAgICB0byBzYXZlIHRvIFNBWC4KLSAqIDxsaT5Vc2Uge0BsaW5rICN2YWxpZGF0ZX0gdG8gdmFsaWRhdGUgdGhlIHN1YnRyZWUgb2YgWE1MIHVuZGVyIHRoaXMKLSAqICAgICBYTUwgT2JqZWN0LiAgSWYgeW91IHdpc2ggdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhdGlvbgotICogICAgIGFuZCByZWFzb24gZm9yIHZhbGlkYXRpb24gZXJyb3JzLCBzZWUge0BsaW5rIFhtbE9wdGlvbnMjc2V0RXJyb3JMaXN0ZW5lcn0sCi0gKiAgICAgYW5kIHVzZSB7QGxpbmsgI3ZhbGlkYXRlKFhtbE9wdGlvbnMpfS4KLSAqIDxsaT5Vc2Uge0BsaW5rICNuZXdDdXJzb3J9IHRvIGFjY2VzcyB0aGUgZnVsbCBYTUwgaW5mb3NldCwgZm9yIGV4YW1wbGUsCi0gKiAgICAgaWYgeW91IG5lZWQgdG8gZGV0ZXJtaW5lIGludGVybGVhdmVkIGVsZW1lbnQgb3JkZXIgb3IgbWFuaXB1bGF0ZQotICogICAgIGFubm90YXRpb25zLCBjb21tZW50cywgb3IgbWl4ZWQgY29udGVudC4gIFNlZSB7QGxpbmsgWG1sQ3Vyc29yfS4KLSAqIDxsaT5Vc2Uge0BsaW5rICNzZWxlY3RQYXRofSB0byBmaW5kIG90aGVyIFhtbE9iamVjdHMgaW4gdGhlIHN1YnRyZWUgdW5kZXJuZWF0aAotICogICAgIHRoaXMgWG1sT2JqZWN0IHVzaW5nIHJlbGF0aXZlIFhQYXRocy4gIChJbiBzZWxlY3RQYXRoLCAiLiIgaW5kaWNhdGVzCi0gKiAgICAgdGhlIGN1cnJlbnQgZWxlbWVudCBvciBhdHRyaWJ1dGUuKQotICogPC91bD4KLSAqIDxwPgotICogVHlwZSBpbmZlcmVuY2UuICBXaGVuIHVzaW5nIHtAbGluayBYbWxPYmplY3QuRmFjdG9yeX0gdG8gcGFyc2UgWE1MIGRvY3VtZW50cywKLSAqIHRoZSBhY3R1YWwgZG9jdW1lbnQgdHlwZSBpcyBub3Qge0BsaW5rIFhtbE9iamVjdCN0eXBlfSBpdHNlbGYsIGJ1dCBhIHN1YnR5cGUKLSAqIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgcGFyc2VkIGRvY3VtZW50LiAgSWYgdGhlIHBhcnNlZCBkb2N1bWVudAotICogY29udGFpbnMgYSByZWNvZ25pemVkIHJvb3QgZG9jdW1lbnQgZWxlbWVudCwgdGhlbiB0aGUgYWN0dWFsIHR5cGUgb2YgdGhlCi0gKiBsb2FkZWQgaW5zdGFuY2Ugd2lsbCBiZSB0aGUgbWF0Y2hpbmcgRG9jdW1lbnQgdHlwZS4gIEZvciBleGFtcGxlOgotICogPHByZT4KLSAqIFhtbE9iamVjdCB4b2JqID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UobXlEb2N1bWVudCk7Ci0gKiBpZiAoeG9iaiBpbnN0YW5jZW9mIE15T3JkZXJEb2N1bWVudCkgLy8gc3RhcnRzIHcvICZsdDtteS1vcmRlciZndDsKLSAqIHsKLSAqICAgICBNeU9yZGVyRG9jdW1lbnQgbXlkb2MgPSAoTXlPcmRlckRvY3VtZW50KXhvYmo7Ci0gKiAgICAgaWYgKCF4b2JqLnZhbGlkYXRlKCkpCi0gKiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTm90IGEgdmFsaWQgbXktb3JkZXIgZG9jdW1lbnQiKTsKLSAqIH0KLSAqIGVsc2UKLSAqIHsKLSAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5vdCBhIG15LW9yZGVyIGRvY3VtZW50Iik7Ci0gKiB9Ci0gKiA8L3ByZT4KLSAqIEV2ZXJ5IFhNTCBCZWFuIGNsYXNzIGhhcyBpdHMgb3duIGlubmVyIEZhY3RvcnkgY2xhc3MsCi0gKiBzbyBpZiB5b3UgYWN0dWFsbHkga25vdyBleGFjdGx5IHdoaWNoIFhNTCBCZWFuIGRvY3VtZW50IHR5cGUKLSAqIHlvdSB3YW50IHRvIGxvYWQgYXMgaW4gdGhlIGV4YW1wbGUgYWJvdmUsIHlvdSBzaG91bGQgdXNlIHRoZQotICogdGhlIHNwZWNpZmljIFhNTCBCZWFuIEZhY3RvcnkgY2xhc3MgaW5zdGVhZC4gRm9yIGV4YW1wbGU6Ci0gKiA8cHJlPgotICogTXlPcmRlckRvY3VtZW50IG15ZG9jID0gTXlPcmRlckRvY3VtZW50LkZhY3RvcnkucGFyc2UobXlEb2N1bWVudCk7Ci0gKiA8L3ByZT4KLSAqIFRoZSBjb2RlIGFib3ZlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBwYXJzZWQgZG9jdW1lbnQKLSAqIGRvZXMgbm90IGJlZ2luIHdpdGggdGhlIHByb3BlciAobXktb3JkZXIpIGVsZW1lbnQuCi0gKiA8cD4KLSAqIElubmVyIHZlcnN1cyBvdXRlci4gIEFuIFhtbE9iamVjdCByZXByZXNlbnRzIHRoZQotICogPGVtPmNvbnRlbnRzPC9lbT4gb2YgYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUsIDxlbT5ub3Q8L2VtPiB0aGUgZWxlbWVudAotICogb3IgYXR0cmlidXRlIGl0c2VsZi4gIFNvIHdoZW4geW91IHZhbGlkYXRlIG9yIHNhdmUgYW4gWG1sT2JqZWN0LCB5b3UKLSAqIGFyZSB2YWxpZGF0aW5nIG9yIHNhdmluZyBpdHMgY29udGVudHMsIG5vdCBpdHMgY29udGFpbmVyLiAgRm9yIGV4YW1wbGUsCi0gKiBpZiB0aGUgWG1sT2JqZWN0IHJlcHJlc2VudHMgdGhlIGNvbnRlbnRzIG9mIGFuIGVsZW1lbnQgd2hpY2ggaGFwcGVucwotICogdG8gaXRzZWxmIGJlIGluIHRoZSB3cm9uZyBvcmRlciByZWxhdGl2ZSB0byBpdHMgc2libGluZ3MsIHZhbGlkYXRlIHdpbGwKLSAqIG5vdCBjb21wbGFpbiBhYm91dCB0aGUgbWlzcGxhY2VtZW50IG9mIHRoZSBlbGVtZW50IGl0c2VsZi4gIE9uIHRoZSBvdGhlciBoYW5kLCBpZgotICogZWxlbWVudHMgPGVtPndpdGhpbjwvZW0+IHRoZSBYbWxPYmplY3QgYXJlIGluIHRoZSB3cm9uZyBvcmRlciwgdmFsaWRhdGUKLSAqIHdpbGwgY29tcGxhaW4uICBTaW1pbGFybHksIHdoZW4gc2F2aW5nIHRoZSBjb250ZW50cyBvZiBhbiBpbnRlcmlvcgotICogWG1sT2JqZWN0LCBpdCBpcyB0aGUgY29udGVudHMgb2YgYW4gZWxlbWVudCwgbm90IHRoZSBlbGVtZW50IGl0c2VsZiwKLSAqIHdoaWNoIGlzIHNhdmVkIGJ5IGRlZmF1bHQuCi0gKiA8cD4KLSAqIFJlYWRpbmcgYW5kIHdyaXRpbmcgZnJhZ21lbnRzLiBXaGVuIHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgY29udGVudHMgb2YgYQotICogd2hvbGUgWE1MIGRvY3VtZW50LCB0aGUgc3RhbmRhcmQgWE1MIHJlcHJlbnRhdGlvbiBmb3IgYSBkb2N1bWVudCBpcyB1c2VkLgotICogSG93ZXZlciwgdGhlcmUgaXMgbm8gc3RhbmRhcmQgY29uY3JldGUgWE1MIHJlcHJlc2VudGF0aW9uIGZvciAianVzdCB0aGUKLSAqIGNvbnRlbnRzIiBvZiBhbiBpbnRlcmlvciBlbGVtZW50IG9yIGF0dHJpYnV0ZS4gU28gd2hlbiBvbmUgaXMgbmVlZGVkLAotICogdGhlIHRhZyAmbHQ7eG1sLWZyYWdtZW50Jmd0OyBpcyB1c2VkIHRvIHdyYXAgdGhlIGNvbnRlbnRzLiAgVGhpcyB0YWcgaXMgdXNlZAotICogY2FuIGFsc28gYmUgdXNlZCB0byBsb2FkIGp1c3QgdGhlIGNvbnRlbnRzIGZvciBhbiBYbWxPYmplY3QgZG9jdW1lbnQgZnJhZ21lbnQKLSAqIG9mIGFyYml0cmFyeSB0eXBlLiBJZiB5b3Ugd2lzaCB0byBzYXZlIG91dCB0aGUgWG1sT2JqZWN0J3MgY29udGFpbmVyIGVsZW1lbnQKLSAqIGFsb25nIHdpdGggaXRzIGNvbnRlbnRzLCB1c2Uge0BsaW5rIFhtbE9wdGlvbnMjc2V0U2F2ZU91dGVyfS4KLSAqIDxwPgotICogSW1wbGVtZW50aW5nIFhtbE9iamVjdC4gIFRoZSBYTUxCZWFucyBsaWJyYXJ5IGRvZXMgbm90IHN1cHBvcnQgYXJiaXRyYXJ5Ci0gKiBpbXBsZW1lbnRhdGlvbnMgb2YgWG1sT2JqZWN0IC0gaW4gYWxtb3N0IGFsbCBjYXNlcywgeW91IHNob3VsZCBvbmx5IHVzZQotICogdGhlIGltcGxlbWVudGF0aW9ucyBvZiBYbWxPYmplY3QgcHJvdmlkZWQgYnkgdGhlIFhNTEJlYW5zIGNvbXBpbGVyIGl0c2VsZi4KLSAqIElmIHlvdSBuZWVkIHRvIGltcGxlbWVudCBYbWxPYmplY3QgeW91cnNlbGYsIHlvdSBzaG91bGQgc3ViY2xhc3MKLSAqIEZpbHRlclhtbE9iamVjdCBpbiBvcmRlciB0byBkZWxlZ2F0ZSB0byBhbm90aGVyIHVuZGVybHlpbmcgWG1sT2JqZWN0Ci0gKiBpbXBsZW1lbnRhdGlvbi4gVGhpcyB0ZWNobmlxdWUgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHlvdXIgY29kZSB1bmNoYW5nZWQKLSAqIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIFhNTEJlYW5zIHRoYXQgYWRkIGFkZGl0aW9uYWwgbWV0aG9kcyBvbiBYbWxPYmplY3QuIAotICovIAotcHVibGljIGludGVyZmFjZSBYbWxPYmplY3QgZXh0ZW5kcyBYbWxUb2tlblNvdXJjZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2FueVR5cGUiKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBzY2hlbWEgdHlwZSBmb3IgdGhpcyBpbnN0YW5jZS4gVGhpcyBpcyBhIHBlcm1hbmVudCwKLSAgICAgKiB1bmNoYW5naW5nIHByb3BlcnR5IG9mIHRoZSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGVudHMgb2YgdGhpcyBvYmplY3QgYXJlIHZhbGlkCi0gICAgICogYWNjb3JpbmcgdG8gc2NoZW1hVHlwZSgpLgotICAgICAqIDxwPgotICAgICAqIERvZXMgYSBkZWVwIHZhbGlkYXRpb24gb2YgdGhlIGVudGlyZSBzdWJ0cmVlIHVuZGVyIHRoZQotICAgICAqIG9iamVjdCwgYnV0IGRvZXMgbm90IHZhbGlkYXRlIHRoZSBwYXJlbnRzIG9yIHNpYmxpbmdzCi0gICAgICogb2YgdGhlIG9iamVjdCBpZiB0aGUgb2JqZWN0IGlzIGluIHRoZSBpbnRlcmlvciBvZiBhbiB4bWwKLSAgICAgKiB0cmVlLgotICAgICAqLwotICAgIGJvb2xlYW4gdmFsaWRhdGUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5KdXN0IGxpa2UgdmFsaWRhdGUoKSwgYnV0IHdpdGggb3B0aW9ucy48L3A+Ci0gICAgICogPHA+SWYgeW91IHdpc2ggdG8gY29sbGVjdCBlcnJvciBtZXNzYWdlcyBhbmQgbG9jYXRpb25zIHdoaWxlIHZhbGlkYXRpbmcsCi0gICAgICogdXNlIHRoZSB7QGxpbmsgWG1sT3B0aW9ucyNzZXRFcnJvckxpc3RlbmVyfSBtZXRob2QuIFdpdGggdGhhdCBtZXRob2QsCi0gICAgICogeW91IGNhbiBzcGVjaWZ5IGFuIG9iamVjdCBpbiB3aGljaCB0byBzdG9yZSBtZXNzYWdlcyByZWxhdGVkIHRvIHZhbGlkYXRpb24uCi0gICAgICogVGhlIGZvbGxvd2luZyBpcyBhIHNpbXBsZSBleGFtcGxlLjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cHJlPgotICAgICAqIC8vIENyZWF0ZSBhbiBYbWxPcHRpb25zIGluc3RhbmNlIGFuZCBzZXQgdGhlIGVycm9yIGxpc3RlbmVyLgotICAgICAqIFhtbE9wdGlvbnMgdmFsaWRhdGVPcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgKiBBcnJheUxpc3QgZXJyb3JMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAqIHZhbGlkYXRlT3B0aW9ucy5zZXRFcnJvckxpc3RlbmVyKGVycm9yTGlzdCk7Ci0gICAgICogCi0gICAgICogLy8gVmFsaWRhdGUgdGhlIFhNTC4KLSAgICAgKiBib29sZWFuIGlzVmFsaWQgPSBuZXdFbXAudmFsaWRhdGUodmFsaWRhdGVPcHRpb25zKTsKLSAgICAgKiAKLSAgICAgKiAvLyBJZiB0aGUgWE1MIGlzbid0IHZhbGlkLCBsb29wIHRocm91Z2ggdGhlIGxpc3RlbmVyJ3MgY29udGVudHMsCi0gICAgICogLy8gcHJpbnRpbmcgY29udGFpbmVkIG1lc3NhZ2VzLgotICAgICAqIGlmICghaXNWYWxpZCkKLSAgICAgKiB7Ci0gICAgICogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVycm9yTGlzdC5zaXplKCk7IGkrKykKLSAgICAgKiAgICAgIHsKLSAgICAgKiAgICAgICAgICBYbWxFcnJvciBlcnJvciA9IChYbWxFcnJvcillcnJvckxpc3QuZ2V0KGkpOwotICAgICAqICAgICAgICAgIAotICAgICAqICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4iKTsKLSAgICAgKiAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1lc3NhZ2U6ICIgKyBlcnJvci5nZXRNZXNzYWdlKCkgKyAiXG4iKTsKLSAgICAgKiAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxvY2F0aW9uIG9mIGludmFsaWQgWE1MOiAiICsgCi0gICAgICogICAgICAgICAgICAgIGVycm9yLmdldEN1cnNvckxvY2F0aW9uKCkueG1sVGV4dCgpICsgIlxuIik7Ci0gICAgICogICAgICB9Ci0gICAgICogfQotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIEBwYXJhbSBvcHRpb25zIEFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbiAKLSAgICAgKiBDb2xsZWN0aW9ufSBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgYm9vbGVhbiB2YWxpZGF0ZShYbWxPcHRpb25zIG9wdGlvbnMpOwotCi0gICAgLyoqCi0gICAgICogU2VsZWN0cyBhIHBhdGguICBQYXRoIGNhbiBiZSBhIHN0cmluZyBvciBwcmVjb21waWxlZCBwYXRoIFN0cmluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcGF0aCBtdXN0IGJlIGEgcmVsYXRpdmUgcGF0aCwgd2hlcmUgIi4iIHJlcHJlc2VudHMgdGhlCi0gICAgICogZWxlbWVudCBvciBhdHRyaWJ1dGUgY29udGFpbmcgdGhpcyBYbWxPYmplY3QsIGFuZCBpdCBtdXN0IHNlbGVjdAotICAgICAqIG9ubHkgb3RoZXIgZWxlbWVudHMgb3IgYXR0cmlidXRlcy4gIElmIGEgbm9uLWVsZW1lbnQgb3Igbm9uLWF0dHJpYnV0ZQotICAgICAqIGlzIHNlbGVjdGVkLCBhbiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgYXJyYXkgdGhhdCBpcyByZXR1cm5lZCBjb250YWlucyBhbGwgdGhlIHNlbGVjdGVkCi0gICAgICogWG1sT2JqZWN0cywgd2l0aGluIHRoZSBzYW1lIGRvY3VtZW50LCBsaXN0ZWQgaW4gZG9jdW1lbnQKLSAgICAgKiBvcmRlci4gIFRoZSBhY3R1YWwgYXJyYXkgdHlwZSBvZiB0aGUgcmVzdWx0IGlzIGluZmVycmVkCi0gICAgICogZnJvbSB0aGUgY2xvc2VzdCBjb21tb24gYmFzZSB0eXBlIG9mIHNlbGVjdGVkIHJlc3VsdHMuCi0gICAgICogPHA+Ci0gICAgICogSGVyZSBpcyBhbiBleGFtcGxlIG9mIHVzYWdlLiAgU3VwcG9zZSB3ZSBoYXZlIGEgZ2xvYmFsCi0gICAgICogZWxlbWVudCBkZWZpbml0aW9uIGZvciAib3duZXIiIHdob3NlIHR5cGUgaXMgInBlcnNvbiI6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICZsdDtzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvc2FtcGxlIj4KLSAgICAgKiAgICAgICZsdDtlbGVtZW50IG5hbWU9Im93bmVyIiB0eXBlPSJwZXJzb24iLz4KLSAgICAgKiAgICAgICZsdDtjb21wbGV4VHlwZSBuYW1lPSJwZXJzb24iPgotICAgICAqICAgICAgICAgWy4uLl0KLSAgICAgKiAgICAgICZsdDsvY29tcGxleFR5cGU+Ci0gICAgICogICAmbHQ7L3NjaGVtYT4KLSAgICAgKiA8L3ByZT4KLSAgICAgKiBhbmQgc3VwcG9zZSAib3duZXIiIHRhZ3MgY2FuIGJlIHNjYXR0ZXJlZCB0aHJvdWdob3V0IHRoZQotICAgICAqIGRvY3VtZW50LiAgVGhlbiB3ZSBjYW4gd3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlIHRvIGZpbmQKLSAgICAgKiB0aGVtIGFsbDoKLSAgICAgKiA8cHJlPgotICAgICAqIGltcG9ydCBvcmcub3BlbnVyaS5zYW1wbGUuUGVyc29uOwotICAgICAqIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLio7Ci0gICAgICogWy4uLl0KLSAgICAgKiAgIFhtbE9iamVjdCB4b2JqID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UobXlGaWxlKTsKLSAgICAgKiAgIFBlcnNvbltdIHJlc3VsdHM7Ci0gICAgICogICByZXN1bHRzID0gKFBlcnNvbltdKXhvYmouc2VsZWN0UGF0aCgKLSAgICAgKiAgICAgICJkZWNsYXJlIG5hbWVzcGFjZSBzPSdodHRwOi8vd3d3Lm9wZW51cmkub3JnL3NhbXBsZScgIiArCi0gICAgICogICAgICAiLi8vczpvd25lciIpOwotICAgICAqIDwvcHJlPgotICAgICAqIE5vdGljZSB0aGUgd2F5IGluIHdoaWNoIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgYXJlIGRvbmUgaW4gWFBhdGggMi4wLgotICAgICAqIFNpbmNlIFhQYXRoIGNhbiBvbmx5IG5hdmlnYXRlIHdpdGhpbiBhbiBYTUwgZG9jdW1lbnQgLSBpdCBjYW5ub3QKLSAgICAgKiBjb25zdHJ1Y3QgbmV3IFhNTCAtIHRoZSByZXN1bHRpbmcgWG1sT2JqZWN0cyBhbGwgcmVzaWRlIGluCi0gICAgICogdGhlIHNhbWUgWE1MIGRvY3VtZW50IGFzIHRoaXMgWG1sT2JqZWN0IGl0c2VsZi4KLSAgICAgKi8KLSAgICBYbWxPYmplY3RbXSBzZWxlY3RQYXRoICggU3RyaW5nIHBhdGggKTsKLQotICAgIC8qKgotICAgICAqIFNlbGVjdHMgYSBwYXRoLCBhcHBseWluZyBvcHRpb25zLgotICAgICAqIAotICAgICAqIEBzZWUgI3NlbGVjdFBhdGgoU3RyaW5nKQotICAgICAqLwotICAgIFhtbE9iamVjdFtdIHNlbGVjdFBhdGggKCBTdHJpbmcgcGF0aCwgWG1sT3B0aW9ucyBvcHRpb25zICk7Ci0gICAgCi0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyBhIHF1ZXJ5LiAgUXVlcnkgY2FuIGJlIGEgc3RyaW5nIG9yIHByZWNvbXBpbGVkIHF1ZXJ5IFN0cmluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBBbiBYUXVlcnkgaXMgdmVyeSBzaW1pbGFyIHRvIGFuIFhQYXRoLCBleGNlcHQgdGhhdCBpdCBhbHNvIHBlcm1pdHMKLSAgICAgKiBjb25zdHJ1Y3Rpb24gb2YgbmV3IFhNTC4gIEFzIGEgcmVzdWx0LCB0aGUgWG1sT2JqZWN0cyB0aGF0IGFyZQotICAgICAqIHJldHVybmVkIGZyb20gZXhlY1F1ZXJ5IGFyZSBpbiBuZXdseSBjcmVhdGVkIGRvY3VtZW50cywgc2VwYXJhdGUKLSAgICAgKiBmcm9tIHRoZSBYbWxPYmplY3Qgb24gd2hpY2ggdGhlIHF1ZXJ5IGlzIGV4ZWN1dGVkLgotICAgICAqIDxwPgotICAgICAqIFN5bnRheCBhbmQgdXNhZ2UgaXMgb3RoZXJ3aXNlIHNpbWlsYXIgdG8gc2VsZWN0UGF0aC4KLSAgICAgKiA8cD4KLSAgICAgKiBAc2VlICNzZWxlY3RQYXRoKFN0cmluZykKLSAgICAgKi8KLSAgICBYbWxPYmplY3RbXSBleGVjUXVlcnkgKCBTdHJpbmcgcXVlcnkgKTsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIGEgcXVlcnkgd2l0aCBvcHRpb25zLgotICAgICAqIAotICAgICAqIFVzZSB0aGUgPGVtPm9wdGlvbnM8L2VtPiBwYXJhbWV0ZXIgdG8gc3BlY2lmeSB0aGUgZm9sbG93aW5nOjwvcD4KLSAgICAgKiAKLSAgICAgKiA8dGFibGU+Ci0gICAgICogPHRyPjx0aD5UbyBzcGVjaWZ5IHRoaXM8L3RoPjx0aD5Vc2UgdGhpcyBtZXRob2Q8L3RoPjwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+VGhlIGRvY3VtZW50IHR5cGUgZm9yIHRoZSByb290IGVsZW1lbnQuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldERvY3VtZW50VHlwZX08L3RkPgotICAgICAqIDwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+VG8gcmVwbGFjZSB0aGUgZG9jdW1lbnQgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgUU5hbWUgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlCi0gICAgICogIHJlc3VsdGluZyBkb2N1bWVudC48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFJlcGxhY2VEb2N1bWVudEVsZW1lbnR9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDx0cj4KLSAgICAgKiAgPHRkPlRvIHN0cmlwIGFsbCBpbnNpZ25pZmljYW50IHdoaXRlc3BhY2Ugd2hlbiBjb25zdHJ1Y3RpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFN0cmlwV2hpdGVzcGFjZX08L3RkPgotICAgICAqIDwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+VG8gc3RyaXAgYWxsIGNvbW1lbnRzIHdoZW4gY29uc3RydWN0aW5nIGEgZG9jdW1lbnQuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRTdHJpcENvbW1lbnRzfTwvdGQ+Ci0gICAgICogPC90cj4KLSAgICAgKiA8dHI+Ci0gICAgICogIDx0ZD5UbyBzdHJpcCBhbGwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgd2hlbiBjb25zdHJ1Y3RpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFN0cmlwUHJvY2luc3RzfTwvdGQ+Ci0gICAgICogPC90cj4KLSAgICAgKiA8dHI+Ci0gICAgICogIDx0ZD5BIG1hcCBvZiBuYW1lc3BhY2UgVVJJIHN1YnN0aXR1dGlvbnMgdG8gdXNlIHdoZW4gY29uc3RydWN0aW5nIGEgZG9jdW1lbnQuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRTdWJzdGl0dXRlTmFtZXNwYWNlc308L3RkPgotICAgICAqIDwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+QWRkaXRpb25hbCBuYW1lc3BhY2UgbWFwcGluZ3MgdG8gYmUgYWRkZWQgd2hlbiBjb25zdHJ1Y3RpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZEFkZGl0aW9uYWxOYW1lc3BhY2VzfTwvdGQ+Ci0gICAgICogPC90cj4KLSAgICAgKiA8dHI+Ci0gICAgICogIDx0ZD5UbyB0cmltIHRoZSB1bmRlcmx5aW5nIFhNTCB0ZXh0IGJ1ZmZlciBpbW1lZGlhdGVseSBhZnRlciBjb25zdHJ1Y3RpbmcgCi0gICAgICogIGEgZG9jdW1lbnQsIHJlc3VsdGluZyBpbiBhIHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludC48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFRyaW1UZXh0QnVmZmVyfTwvdGQ+Ci0gICAgICogPC90cj4KLSAgICAgKiA8dHI+Ci0gICAgICogIDx0ZD5XaGV0aGVyIHZhbHVlIGZhY2V0cyBzaG91bGQgYmUgY2hlY2tlZCBhcyB0aGV5IGFyZSBzZXQuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFZhbGlkYXRlT25TZXR9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDwvdGFibGU+IAotICAgICAqIAotICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgWFF1ZXJ5IGV4cHJlc3Npb24uCi0gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBhcyBkZXNjcmliZWQuCi0gICAgICogCi0gICAgICogQHNlZSAjZXhlY1F1ZXJ5KFN0cmluZykKLSAgICAgKi8KLSAgICBYbWxPYmplY3RbXSBleGVjUXVlcnkgKCBTdHJpbmcgcXVlcnksIFhtbE9wdGlvbnMgb3B0aW9ucyApOwotICAgIAotCi0gICAgLyoqCi0gICAgICogQ2hhbmdlcyB0aGUgc2NoZW1hIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGF0YSBhbmQKLSAgICAgKiByZXR1cm5zIGEgbmV3IFhtbE9iamVjdCBpbnN0YW5jZSB3aG9zZSBzY2hlbWFUeXBlIGlzIHRoZQotICAgICAqIG5ldyB0eXBlLgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgdHlwZSBjaGFuZ2UgaXMgbm90IGFsbG93ZWQuIENlcnRhaW4KLSAgICAgKiB0eXBlIGNoYW5nZXMgbWF5IGJlIHByb2hpYml0ZWQgb24gdGhlIGludGVyaW9yIG9mIGFuIHhtbAotICAgICAqIHRyZWUgZHVlIHRvIHNjaGVtYSB0eXBlIHN5c3RlbSBjb25zdHJhaW50cyAodGhhdCBpcywgZHVlCi0gICAgICogdG8gYSBwYXJlbnQgY29udGFpbmVyIHdpdGhpbiB3aGljaCB0aGUgbmV3bHkgc3BlY2lmaWVkCi0gICAgICogdHlwZSBpcyBub3QgcGVybWlzc2libGUpLCBidXQgdGhlcmUgYXJlIG5vIGNvbnN0cmFpbnRzCi0gICAgICogYXQgdGhlIHJvb3R0eXBlIGNoYW5nZXMgYXJlIG5ldmVyCi0gICAgICogcHJvaGliaXRlZCBhdCB0aGUgcm9vdCBvZiBhbiB4bWwgdHJlZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgdHlwZSBjaGFuZ2UgaXMgYWxsb3dlZCwgdGhlbiB0aGUgbmV3IFhtbE9iamVjdCBzaG91bGQKLSAgICAgKiBiZSB1c2VkIHJhdGhlciB0aGFuIHRoZSBvbGQgb25lLiBUaGUgb2xkIFhtbE9iamVjdCBpbnN0YW5jZSBhbmQKLSAgICAgKiBhbnkgb3RoZXIgWG1sT2JqZWN0IGluc3RhbmNlcyBpbiB0aGUgc3VidHJlZSBhcmUgcGVybWFuZW50bHkKLSAgICAgKiBpbnZhbGlkYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiAoVGhleSB3aWxsIHJldHVybgotICAgICAqIEludmFsaWRTdGF0ZUV4Y2VwdGlvbiBpZiB5b3UgdHJ5IHRvIHVzZSB0aGVtLikKLSAgICAgKgotICAgICAqIElmIGEgdHlwZSBjaGFuZ2UgaXMgZG9uZSBvbiB0aGUgaW50ZXJpb3Igb2YgYW4gWG1sCi0gICAgICogdHJlZSwgdGhlbiB4c2k6dHlwZSBhdHRyaWJ1dGVzIGFyZSB1cGRhdGVkIGFzIG5lZWRlZC4KLSAgICAgKi8KLSAgICBYbWxPYmplY3QgY2hhbmdlVHlwZShTY2hlbWFUeXBlIG5ld1R5cGUpOwotCi0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBuaWwuIE5vdGUgdGhhdCBpbiBvcmRlciB0byBiZSBuaWwsCi0gICAgICogdGhlIHZhbHVlIG11c3QgYmUgaW4gYW4gZWxlbWVudCwgYW5kIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcKLSAgICAgKiB0aGUgdmFsdWUgbXVzdCBiZSBtYXJrZWQgYXMgbmlsbGFibGUgaW4gdGhlIHNjaGVtYS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzTmlsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSB0byBuaWwuIFRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIHZhbHVlIG11c3QKLSAgICAgKiBiZSBtYXJrZWQgYXMgbmlsbGFibGUgaW4gdGhlIHNjaGVtYS4KLSAgICAgKi8KLSAgICB2b2lkIHNldE5pbCgpOwotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIFhNTCBzdHJpbmcgZm9yIHRoaXMgWE1MIG9iamVjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc3RyaW5nIGlzIHByZXR0eS1wcmludGVkLiAgSWYgeW91IHdhbnQgYSBub24tcHJldHR5LXByaW50ZWQKLSAgICAgKiBzdHJpbmcsIG9yIGlmIHlvdSB3YW50IHRvIGNvbnRyb2wgb3B0aW9ucyBwcmVjaXNlbHksIHVzZSB0aGUKLSAgICAgKiB4bWxUZXh0KCkgbWV0aG9kcy4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgd2hlbiBwcm9kdWNpbmcgWE1MIGFueSBvYmplY3Qgb3RoZXIgdGhhbiB2ZXJ5IHJvb3Qgb2YgdGhlCi0gICAgICogZG9jdW1lbnQsIHRoZW4geW91IGFyZSBndWFyYW50ZWVkIHRvIGJlIGxvb2tpbmcgYXQgb25seSBhIGZyYWdtZW50Ci0gICAgICogb2YgWE1MLCBpLmUuLCBqdXN0IHRoZSBjb250ZW50cyBvZiBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZSwgYW5kCi0gICAgICogYW5kIHdlIHdpbGwgcHJvZHVjZSBhIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoIGFuIDxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiB0YWcuCi0gICAgICogVGhlIFhtbE9wdGlvbnMuc2V0U2F2ZU91dGVyKCkgb3B0aW9uIG9uIHhtbFRleHQgY2FuIGJlIHVzZWQgdG8gcHJvZHVjZQotICAgICAqIHRoZSBhY3R1YWwgZWxlbWVudCBuYW1lIGFib3ZlIHRoZSBvYmplY3QgaWYgeW91IHdpc2guCi0gICAgICovCi0gICAgU3RyaW5nIHRvU3RyaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbW11dGFibGUgdmFsdWUuIEltbXV0YWJsZSB2YWx1ZXMgZG8gbm90Ci0gICAgICogaGF2ZSBhIHBvc2l0aW9uIGluIGEgdHJlZTsgcmF0aGVyLCB0aGV5IGFyZSBzdGFuZC1hbG9uZSBzaW1wbGUgdHlwZQotICAgICAqIHZhbHVlcy4gSWYgdGhlIG9iamVjdCBpcyBpbW11dGFibGUsIHRoZSBlcXVhbHMoKSBtZXRob2RzIHRlc3RzIGZvcgotICAgICAqIHZhbHVlIGVxdWFsaXR5LCBhbmQgdGhlIG9iamVjdCBjYW4gYmUgdXNlZCBhcyB0aGUga2V5IGZvciBhIGhhc2guCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0ltbXV0YWJsZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZS90eXBlIG9mIHRoaXMgWG1sT2JqZWN0IHRvIGJlIGEgY29weSBvZiB0aGUgc291cmNlCi0gICAgICogWG1sT2JqZWN0LiAgQmVjYXVzZSB0aGUgdHlwZSBvZiB0aGUgc291cmNlIG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGlzCi0gICAgICogdGFyZ2V0LCB0aGlzIFhtbE9iamVjdCBtYXkgYmVjb21lIGRlZnVuY3QuICBJbiB0aGlzIGNhc2UgdGhlIG5ldwotICAgICAqIFhtbE9iamVjdCBpcyByZXR1cm5lZC4gIElmIG5vIHR5cGUgY2hhbmdlIGhhcHBlbnMsIHRoZSBzYW1lIHRoaXMgd2lsbCBiZQotICAgICAqIHJldHVybmVkLgotICAgICAqLwotICAgIFhtbE9iamVjdCBzZXQoWG1sT2JqZWN0IHNyY09iaik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGRlZXAgY29weSBvZiB0aGlzIFhtbE9iamVjdC4gIFRoZSByZXR1cm5lZCBvYmplY3QgaGFzIHRoZQotICAgICAqIHNhbWUgdHlwZSBhcyB0aGUgY3VycmVudCBvYmplY3QsIGFuZCBoYXMgYWxsIHRoZSBjb250ZW50IG9mCi0gICAgICogdGhlIFhNTCBkb2N1bWVudCB1bmRlcm5lYXRoIHRoZSBjdXJyZW50IG9iamVjdC4gIE5vdGUgdGhhdAotICAgICAqIGFueSBwYXJ0cyBvZiB0aGUgWE1MIGRvY3VtZW50IGFib3ZlIG9yIG91dHNpZGUgdGhpcyBYbWxPYmplY3QgYXJlCi0gICAgICogbm90IGNvcGllZC4KLSAgICAgKi8KLSAgICBYbWxPYmplY3QgY29weSgpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgeG1sIHZhbHVlcyBhcmUgZXF1YWwuIFR3byBkaWZmZXJlbnQgb2JqZWN0cwotICAgICAqICh3aGljaCBhcmUgZGlzdGluZ3Vpc2hlZCBieSBlcXVhbHMob2JqKSA9PSBmYWxzZSkgbWF5IG9mCi0gICAgICogY291cnNlIGhhdmUgZXF1YWwgdmFsdWVzICh2YWx1ZUVxdWFscyhvYmopID09IHRydWUpLgotICAgICAqIDxwPgotICAgICAqIFVzdWFsbHkgdGhpcyBtZXRob2QgY2FuIGJlIHRyZWF0ZWQgYXMgYW4gb3JkaW5hcnkgZXF1dmFsZW5jZQotICAgICAqIHJlbGF0aW9uLCBidXQgYWN0dWFsbHkgaXQgaXMgbm90IGlzIG5vdCB0cmFuc2l0aXZlLgotICAgICAqIEhlcmUgaXMgYSBwcmVjaXNlIHNwZWNpZmljYXRpb246Ci0gICAgICogPHA+Ci0gICAgICogVGhlcmUgYXJlIHR3byBjYXRlZ29yaWVzIG9mIFhNTCBvYmplY3Q6IG9iamVjdHMgd2l0aCBhIGtub3duCi0gICAgICogaW5zdGFuY2UgdHlwZSwgYW5kIG9iamVjdHMgd2hvc2Ugb25seSBrbm93biB0eXBlIGlzIG9uZSBvZiB0aGUKLSAgICAgKiB1ci10eXBlcyAoZWl0aGVyIEFueVR5cGUgb3IgQW55U2ltcGxlVHlwZSkuIFRoZSBmaXJzdCBjYXRlZ29yeQotICAgICAqIGlzIGNvbXBhcmVkIGluIHRlcm1zIG9mIGxvZ2ljYWwgdmFsdWUgc3BhY2VzLCBhbmQgdGhlIHNlY29uZAotICAgICAqIGNhdGVnb3J5IGlzIGNvbXBhcmVkIGxleGljYWxseS4KLSAgICAgKiA8cD4KLSAgICAgKiBXaXRoaW4gZWFjaCBvZiB0aGVzZSB0d28gY2F0ZWdvcmllcywgdmFsdWVFcXVhbHMgaXMgYSB3ZWxsLWJlaGF2ZWQKLSAgICAgKiBlcXVpdmFsZW5jZSByZWxhdGlvbi4gSG93ZXZlciwgd2hlbiBjb21wYXJpbmcgYW4gb2JqZWN0IG9mIGtub3duCi0gICAgICogdHlwZSB3aXRoIGFuIG9iamVjdCB3aXRoIHVyLXR5cGUsIHRoZSBjb21wYXJpc29uIGlzIGRvbmUgYnkgYXR0ZW1wdGluZwotICAgICAqIHRvIGNvbnZlcnQgdGhlIGxleGljYWwgZm9ybSBvZiB0aGUgdXItdHlwZWQgb2JqZWN0IGludG8gdGhlIG90aGVyCi0gICAgICogdHlwZSwgYW5kIHRoZW4gY29tcGFyaW5nIHRoZSByZXN1bHRzLiBVci10eXBlZCBvYmplY3RzIGFyZSB0aGVyZWZvcmUKLSAgICAgKiB0cmVhdGVkIGFzIGxleGljYWwgd2lsZGNhcmRzIGFuZCBtYXkgYmUgZXF1YWwgdG8gb2JqZWN0cyBpbiBkaWZmZXJlbnQKLSAgICAgKiB2YWx1ZSBzcGFjZXMsIGV2ZW4gdGhvdWdoIHRoZSBvYmplY3RzIGluIGRpZmZlcmVudCB2YWx1ZSBzcGFjZXMgYXJlCi0gICAgICogbm90IGVxdWFsIHRvIGVhY2ggb3RoZXIuCi0gICAgICogPHA+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRoZSBhbnlTaW1wbGVUeXBlIHZhbHVlICIxIiB3aWxsIGNvbXBhcmUgYXMgYW4KLSAgICAgKiBlcXVhbFZhbHVlIHRvIHRoZSBzdHJpbmcgIjEiLCB0aGUgZmxvYXQgdmFsdWUgIjEuMCIsIHRoZSBkb3VibGUKLSAgICAgKiB2YWx1ZSAiMS4wIiwgdGhlIGRlY2ltYWwgIjEiLCBhbmQgdGhlIEdZZWFyICIxIiwgZXZlbiB0aG91Z2gKLSAgICAgKiBhbGwgdGhlc2Ugb2JqZWN0cyB3aWxsIGNvbXBhcmUgdW5lcXVhbCB0byBlYWNoIG90aGVyIHNpbmNlIHRoZXkKLSAgICAgKiBsaWUgaW4gZGlmZmVyZW50IHZhbHVlIHNwYWNlcy4KLSAgICAgKi8KLSAgICBib29sZWFuIHZhbHVlRXF1YWxzKFhtbE9iamVjdCBvYmopOwotCi0gICAgaW50IHZhbHVlSGFzaENvZGUoKTsKLQotICAgIC8qKgotICAgICAqIEltcGVsZW1lbnRzIHRoZSBDb21wYXJhYmxlIGludGVyZmFjZSBieSBjb21wYXJpbmcgdHdvIHNpbXBsZQotICAgICAqIHhtbCB2YWx1ZXMgYmFzZWQgb24gdGhlaXIgc3RhbmRhcmQgWE1MIHNjaGVtYSBvcmRlcmluZy4KLSAgICAgKiBUaHJvd3MgYSBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgbm8gc3RhbmRhcmQgb3JkZXJpbmcgYXBwbGllcywKLSAgICAgKiBvciBpZiB0aGUgdHdvIHZhbHVlcyBhcmUgaW5jb21wYXJhYmxlIHdpdGhpbiBhIHBhcnRpYWwgb3JkZXIuCi0gICAgICovCi0gICAgaW50IGNvbXBhcmVUbyhPYmplY3Qgb2JqKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgY29tcGFyaXNvbiBtZXRob2QgaXMgc2ltaWxhciB0byBjb21wYXJlVG8sIGJ1dCByYXRoZXIKLSAgICAgKiB0aGFuIHRocm93aW5nIGEgQ2xhc3NDYXN0RXhjZXB0aW9uIHdoZW4gdHdvIHZhbHVlcyBhcmUgaW5jb21wYXJhYmxlLAotICAgICAqIGl0IHJldHVybnMgdGhlIG51bWJlciAyLiBUaGUgcmVzdWx0IGNvZGVzIGFyZSAtMSBpZiB0aGlzIG9iamVjdAotICAgICAqIGlzIGxlc3MgdGhhbiBvYmosIDEgaWYgdGhpcyBvYmplY3QgaXMgZ3JlYXRlciB0aGFuIG9iaiwgemVybyBpZgotICAgICAqIHRoZSBvYmplY3RzIGFyZSBlcXVhbCwgYW5kIDIgaWYgdGhlIG9iamVjdHMgYXJlIGluY29tcGFyYWJsZS4KLSAgICAgKi8KLSAgICBpbnQgY29tcGFyZVZhbHVlKFhtbE9iamVjdCBvYmopOwotICAgIAotICAgIC8qKiBMRVNTX1RIQU4gaXMgLTEuIFNlZSB7QGxpbmsgI2NvbXBhcmVWYWx1ZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBMRVNTX1RIQU4gPSAtMTsKLSAgICAvKiogRVFVQUwgaXMgMC4gU2VlIHtAbGluayAjY29tcGFyZVZhbHVlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IEVRVUFMID0gMDsKLSAgICAvKiogR1JFQVRFUl9USEFOIGlzIDEuIFNlZSB7QGxpbmsgI2NvbXBhcmVWYWx1ZX0uICovCi0gICAgc3RhdGljIGZpbmFsIGludCBHUkVBVEVSX1RIQU4gPSAxOwotICAgIC8qKiBOT1RfRVFVQUwgaXMgMi4gU2VlIHtAbGluayAjY29tcGFyZVZhbHVlfS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IE5PVF9FUVVBTCA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBTdGF0aWMgZmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlcy4gIE5vdGUgdGhhdCBpZgotICAgICAqIGEgdHlwZSBjYW4gYmUgaW5mZXJyZWQgZnJvbSB0aGUgWE1MIGJlaW5nIGxvYWRlZCAoZm9yIGV4YW1wbGUsCi0gICAgICogYnkgcmVjb2duaXppbmcgdGhlIGRvY3VtZW50IGVsZW1lbnQgUU5hbWUpLCB0aGVuIHRoZSBpbnN0YW5jZQotICAgICAqIHJldHVybmVkIGJ5IGEgZmFjdG9yeSB3aWxsIGhhdmUgdGhlIGluZmVycmVkIHR5cGUuICBPdGhlcndpc2UKLSAgICAgKiB0aGUgRmFjdG9yeSB3aWxsIHJldHVybmVkIGFuIHVudHlwZWQgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG5ldywgY29tcGxldGVseSBlbXB0eSBpbnN0YW5jZS4KLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBuZXdJbnN0YW5jZSAoICkgewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCBudWxsLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiA8cD5DcmVhdGVzIGEgbmV3LCBjb21wbGV0ZWx5IGVtcHR5IGluc3RhbmNlLCBzcGVjaWZ5aW5nIG9wdGlvbnMKLSAgICAgICAgICogZm9yIHRoZSByb290IGVsZW1lbnQncyBkb2N1bWVudCB0eXBlIGFuZC9vciB3aGV0aGVyIHRvIHZhbGlkYXRlCi0gICAgICAgICAqIHZhbHVlIGZhY2V0cyBhcyB0aGV5IGFyZSBzZXQuPC9wPgotICAgICAgICAgKiAKLSAgICAgICAgICogVXNlIHRoZSA8ZW0+b3B0aW9uczwvZW0+IHBhcmFtZXRlciB0byBzcGVjaWZ5IHRoZSBmb2xsb3dpbmc6PC9wPgotICAgICAgICAgKiAKLSAgICAgICAgICogPHRhYmxlPgotICAgICAgICAgKiA8dHI+PHRoPlRvIHNwZWNpZnkgdGhpczwvdGg+PHRoPlVzZSB0aGlzIG1ldGhvZDwvdGg+PC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlRoZSBkb2N1bWVudCB0eXBlIGZvciB0aGUgcm9vdCBlbGVtZW50LjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0RG9jdW1lbnRUeXBlfTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDx0cj4KLSAgICAgICAgICogIDx0ZD5XaGV0aGVyIHZhbHVlIGZhY2V0cyBzaG91bGQgYmUgY2hlY2tlZCBhcyB0aGV5IGFyZSBzZXQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRWYWxpZGF0ZU9uU2V0fTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDwvdGFibGU+IAotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBzcGVjaWZ5aW5nIHJvb3QgZG9jdW1lbnQgdHlwZSBhbmQvb3IgdmFsdWUgZmFjZXQgCi0gICAgICAgICAqIGNoZWNraW5nLgotICAgICAgICAgKiBAcmV0dXJuIEEgbmV3LCBlbXB0eSBpbnN0YW5jZSBvZiBYbWxPYmplY3QuPC9saT4KLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBuZXdJbnN0YW5jZSAoIFhtbE9wdGlvbnMgb3B0aW9ucyApIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggbnVsbCwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBpbW11dGFibGUgdmFsdWUuCi0gICAgICAgICAqLyAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxPYmplY3R9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IG5ld1ZhbHVlICggT2JqZWN0IG9iaiApIHsKLSAgICAgICAgICByZXR1cm4gdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIHtAbGluayBTdHJpbmd9IGFzIFhNTC4KLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBwYXJzZSAoIFN0cmluZyBzICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIG51bGwsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4ge0BsaW5rIFN0cmluZ30gYXMgWE1MLgotICAgICAgICAgKiAKLSAgICAgICAgICogVXNlIHRoZSA8ZW0+b3B0aW9uczwvZW0+IHBhcmFtZXRlciB0byBzcGVjaWZ5IHRoZSBmb2xsb3dpbmc6PC9wPgotICAgICAgICAgKiAKLSAgICAgICAgICogPHRhYmxlPgotICAgICAgICAgKiA8dHI+PHRoPlRvIHNwZWNpZnkgdGhpczwvdGg+PHRoPlVzZSB0aGlzIG1ldGhvZDwvdGg+PC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlRoZSBkb2N1bWVudCB0eXBlIGZvciB0aGUgcm9vdCBlbGVtZW50LjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0RG9jdW1lbnRUeXBlfTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDx0cj4KLSAgICAgICAgICogIDx0ZD5UbyBwbGFjZSBsaW5lIG51bWJlciBhbm5vdGF0aW9ucyBpbiB0aGUgc3RvcmUgd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkTGluZU51bWJlcnN9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlRvIHJlcGxhY2UgdGhlIGRvY3VtZW50IGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIFFOYW1lIHdoZW4gcGFyc2luZy48L3RkPgotICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRSZXBsYWNlRG9jdW1lbnRFbGVtZW50fTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDx0cj4KLSAgICAgICAgICogIDx0ZD5UbyBzdHJpcCBhbGwgaW5zaWduaWZpY2FudCB3aGl0ZXNwYWNlIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFN0cmlwV2hpdGVzcGFjZX08L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+VG8gc3RyaXAgYWxsIGNvbW1lbnRzIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFN0cmlwQ29tbWVudHN9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlRvIHN0cmlwIGFsbCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRTdHJpcFByb2NpbnN0c308L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+QSBtYXAgb2YgbmFtZXNwYWNlIFVSSSBzdWJzdGl0dXRpb25zIHRvIHVzZSB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRTdWJzdGl0dXRlTmFtZXNwYWNlc308L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+QWRkaXRpb25hbCBuYW1lc3BhY2UgbWFwcGluZ3MgdG8gYmUgYWRkZWQgd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkQWRkaXRpb25hbE5hbWVzcGFjZXN9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlRvIHRyaW0gdGhlIHVuZGVybHlpbmcgWE1MIHRleHQgYnVmZmVyIGltbWVkaWF0ZWx5IGFmdGVyIHBhcnNpbmcgCi0gICAgICAgICAqICBhIGRvY3VtZW50LCByZXN1bHRpbmcgaW4gYSBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkVHJpbVRleHRCdWZmZXJ9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPC90YWJsZT4gCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gcyBUaGUgc3RyaW5nIHRvIHBhcnNlLgotICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGFzIHNwZWNpZmllZC4KLSAgICAgICAgICogQHJldHVybiBBIG5ldyBpbnN0YW5jZSBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgWE1MLgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IHBhcnNlICggU3RyaW5nIHMsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCBudWxsLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIHtAbGluayBGaWxlfSBhcyBYTUwuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UgKCBGaWxlIGYgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIG51bGwsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIHtAbGluayBGaWxlfSBhcyBYTUwuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UgKCBGaWxlIGYsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgbnVsbCwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogRG93bmxvYWRzIHRoZSBnaXZlbiB7QGxpbmsgamF2YS5uZXQuVVJMfSBhcyBYTUwuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIG51bGwsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBEb3dubG9hZHMgdGhlIGdpdmVuIHtAbGluayBqYXZhLm5ldC5VUkx9IGFzIFhNTC4KLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIG51bGwsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBEZWNvZGVzIGFuZCBwYXJzZXMgdGhlIGdpdmVuIHtAbGluayBJbnB1dFN0cmVhbX0gYXMgWE1MLgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IHBhcnNlICggSW5wdXRTdHJlYW0gaXMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCBudWxsLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBEZWNvZGVzIGFuZCBwYXJzZXMgdGhlIGdpdmVuIHtAbGluayBJbnB1dFN0cmVhbX0gYXMgWE1MLgotICAgICAgICAgKiAKLSAgICAgICAgICogVXNlIHRoZSA8ZW0+b3B0aW9uczwvZW0+IHBhcmFtZXRlciB0byBzcGVjaWZ5IHRoZSBmb2xsb3dpbmc6PC9wPgotICAgICAgICAgKiAKLSAgICAgICAgICogPHRhYmxlPgotICAgICAgICAgKiA8dHI+PHRoPlRvIHNwZWNpZnkgdGhpczwvdGg+PHRoPlVzZSB0aGlzIG1ldGhvZDwvdGg+PC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gdXNlIHdoZW4gcGFyc2luZyBvciB3cml0aW5nIGEgZG9jdW1lbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRDaGFyYWN0ZXJFbmNvZGluZ308L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+VGhlIGRvY3VtZW50IHR5cGUgZm9yIHRoZSByb290IGVsZW1lbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXREb2N1bWVudFR5cGV9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlBsYWNlIGxpbmUgbnVtYmVyIGFubm90YXRpb25zIGluIHRoZSBzdG9yZSB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRMaW5lTnVtYmVyc308L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+UmVwbGFjZSB0aGUgZG9jdW1lbnQgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgUU5hbWUgd2hlbiBwYXJzaW5nLjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFJlcGxhY2VEb2N1bWVudEVsZW1lbnR9PC90ZD4KLSAgICAgICAgICogPC90cj4KLSAgICAgICAgICogPHRyPgotICAgICAgICAgKiAgPHRkPlN0cmlwIGFsbCBpbnNpZ25pZmljYW50IHdoaXRlc3BhY2Ugd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkU3RyaXBXaGl0ZXNwYWNlfTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDx0cj4KLSAgICAgICAgICogIDx0ZD5TdHJpcCBhbGwgY29tbWVudHMgd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuPC90ZD4KLSAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkU3RyaXBDb21tZW50c308L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+U3RyaXAgYWxsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFN0cmlwUHJvY2luc3RzfTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDx0cj4KLSAgICAgICAgICogIDx0ZD5TZXQgYSBtYXAgb2YgbmFtZXNwYWNlIFVSSSBzdWJzdGl0dXRpb25zIHRvIHVzZSB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC48L3RkPgotICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRTdWJzdGl0dXRlTmFtZXNwYWNlc308L3RkPgotICAgICAgICAgKiA8L3RyPgotICAgICAgICAgKiA8dHI+Ci0gICAgICAgICAqICA8dGQ+U2V0IGFkZGl0aW9uYWwgbmFtZXNwYWNlIG1hcHBpbmdzIHRvIGJlIGFkZGVkIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZEFkZGl0aW9uYWxOYW1lc3BhY2VzfTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDx0cj4KLSAgICAgICAgICogIDx0ZD5UcmltIHRoZSB1bmRlcmx5aW5nIFhNTCB0ZXh0IGJ1ZmZlciBpbW1lZGlhdGVseSBhZnRlciBwYXJzaW5nIAotICAgICAgICAgKiAgYSBkb2N1bWVudCwgcmVzdWx0aW5nIGluIGEgc21hbGxlciBtZW1vcnkgZm9vdHByaW50LjwvdGQ+Ci0gICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFRyaW1UZXh0QnVmZmVyfTwvdGQ+Ci0gICAgICAgICAqIDwvdHI+Ci0gICAgICAgICAqIDwvdGFibGU+IAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IHBhcnNlICggSW5wdXRTdHJlYW0gaXMsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIG51bGwsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4ge0BsaW5rIFJlYWRlcn0gYXMgWE1MLgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IHBhcnNlICggUmVhZGVyIHIgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIG51bGwsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4ge0BsaW5rIFJlYWRlcn0gYXMgWE1MLgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IHBhcnNlICggUmVhZGVyIHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgbnVsbCwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQ29udmVydHMgdGhlIGdpdmVuIERPTSB7QGxpbmsgTm9kZX0gaW50byBhbiBYbWxPYmplY3QuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UgKCBOb2RlIG5vZGUgKSB0aHJvd3MgWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgbnVsbCwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQ29udmVydHMgdGhlIGdpdmVuIERPTSB7QGxpbmsgTm9kZX0gaW50byBhbiBYbWxPYmplY3QuCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UgKCBOb2RlIG5vZGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCBudWxsLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4ge0BsaW5rIFhNTElucHV0U3RyZWFtfSBpbnRvIGFuIFhtbE9iamVjdC4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UgKCBYTUxJbnB1dFN0cmVhbSB4aXMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIG51bGwsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIExvYWRzIHRoZSBnaXZlbiB7QGxpbmsgWE1MSW5wdXRTdHJlYW19IGludG8gYW4gWG1sT2JqZWN0LgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBwYXJzZSAoIFhNTElucHV0U3RyZWFtIHhpcywgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCBudWxsLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBhbiB7QGxpbmsgWG1sU2F4SGFuZGxlcn0gdGhhdCBjYW4gbG9hZCBhbiBYbWxPYmplY3QgZnJvbSBTQVggZXZlbnRzLgotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2F4SGFuZGxlciBuZXdYbWxTYXhIYW5kbGVyICggKSB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3WG1sU2F4SGFuZGxlciggbnVsbCwgbnVsbCApOyB9Ci0gICAgICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgYW4ge0BsaW5rIFhtbFNheEhhbmRsZXJ9IHRoYXQgY2FuIGxvYWQgYW4gWG1sT2JqZWN0IGZyb20gU0FYIGV2ZW50cy4KLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNheEhhbmRsZXIgbmV3WG1sU2F4SGFuZGxlciAoIFhtbE9wdGlvbnMgb3B0aW9ucyApIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdYbWxTYXhIYW5kbGVyKCBudWxsLCBvcHRpb25zICk7IH0KLSAgICAgICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBhIG5ldyB2YWxpZGF0aW5nIHtAbGluayBYTUxJbnB1dFN0cmVhbX0gdGhhdCB0aHJvd3MgZXhjZXB0aW9ucyB3aGVuIHRoZSBpbnB1dCBpcyBub3QgdmFsaWQuCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MwotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtICggWE1MSW5wdXRTdHJlYW0geGlzICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgbnVsbCwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBhIG5ldyB2YWxpZGF0aW5nIHtAbGluayBYTUxJbnB1dFN0cmVhbX0gdGhhdCB0aHJvd3MgZXhjZXB0aW9ucyAKLSAgICAgICAgICogd2hlbiB0aGUgaW5wdXQgaXMgbm90IHZhbGlkLCBzcGVjaWZ5aW5nIG9wdGlvbnMKLSAgICAgICAgICogZm9yIHRoZSByb290IGVsZW1lbnQncyBkb2N1bWVudCB0eXBlIGFuZC9vciB0aGUgY29sbGVjdGlvbiBvYmplY3QgdG8gdXNlCi0gICAgICAgICAqIGFzIGFuIGVycm9yIGxpc3RlbmVyIHdoaWxlIHZhbGlkYXRpbmcuPC9wPgotICAgICAgICAgKiAKLSAgICAgICAgICogPHA+VXNlIHRoZSA8ZW0+b3B0aW9uczwvZW0+IHBhcmFtZXRlciB0byBzcGVjaWZ5IHRoZSBmb2xsb3dpbmc6PC9wPgotICAgICAgICAgKiAKLSAgICAgICAgICogPHVsPgotICAgICAgICAgKiA8bGk+QSBjb2xsZWN0aW9uIGluc3RhbmNlIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgYW4gZXJyb3IgbGlzdGVuZXIgZHVyaW5nCi0gICAgICAgICAqIGNvbXBpbGF0aW9uLCBhcyBkZXNjcmliZWQgaW4ge0BsaW5rIFhtbE9wdGlvbnMjc2V0RXJyb3JMaXN0ZW5lcn0uPC9saT4KLSAgICAgICAgICogPGxpPlRoZSBkb2N1bWVudCB0eXBlIGZvciB0aGUgcm9vdCBlbGVtZW50LCBhcyBkZXNjcmliZWQgaW4gCi0gICAgICAgICAqIHtAbGluayBYbWxPcHRpb25zI3NldERvY3VtZW50VHlwZShTY2hlbWFUeXBlKX0uPC9saT4KLSAgICAgICAgICogPC91bD4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4aXMgVGhlIGJhc2lzIGZvciB0aGUgbmV3IFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHNwZWNpZnlpbmcgcm9vdCBkb2N1bWVudCB0eXBlIGFuZC9vciBhbiBlcnJvciBsaXN0ZW5lci4KLSAgICAgICAgICogQHJldHVybiBBIG5ldyB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgc3RhdGljIFhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSAoIFhNTElucHV0U3RyZWFtIHhpcywgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgbnVsbCwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogSW5zdGFuY2VzIGNhbm5vdCBiZSBjcmVhdGVkLgotICAgICAgICAgKi8gCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxPcHRpb25zLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmJiZTAwLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogVXNlZCB0byBzdXBwbHkgb3B0aW9ucyBmb3IgbG9hZGluZywgc2F2aW5nLCBhbmQgY29tcGlsaW5nLCBhbmQgdmFsaWRhdGluZy4KLSAqIDxwPgotICogVGhlcmUgYXJlIHR3byBzdHlsZXMgZm9yIHVzaW5nIFhtbE9wdGlvbnM6IG11bHRpbGluZSBzZXR1cCwgYW5kIHNpbmdsZS1saW5lIHVzZS4KLSAqIEhlcmUgYXJlIHR3byBleGFtcGxlcy4gIEZpcnN0LCBtdWx0aWxpbmUgc3R5bGU6Ci0gKiA8cHJlPgotICogWG1sT3B0aW9ucyBvcHRzID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAqIG9wdHMuc2V0U2F2ZVByZXR0eVByaW50KCk7Ci0gKiBvcHRzLnNldFNhdmVQcmV0dHlQcmludEluZGVudCg0KTsKLSAqIFN5c3RlbS5vdXQucHJpbnRsbih4b2JqLnhtbFRleHQob3B0cykpOwotICogPC9wcmU+Ci0gKiAKLSAqIFRoZSBhbHRlcm5hdGl2ZSBpcyBzaW5nbGUtbGluZSB1c2FnZToKLSAqIDxwcmU+Ci0gKiBTeXN0ZW0ub3V0LnByaW50bG4oeG9iai54bWxUZXh0KAotICogICAgIG5ldyBYbWxPcHRpb25zKCkuc2V0U2F2ZVByZXR0eVByaW50KCkuc2V0U2F2ZVByZXR0eVByaW50SW5kZW50KDQpKSk7Ci0gKiA8L3ByZT4KLSAqLwotcHVibGljIGNsYXNzIFhtbE9wdGlvbnMgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIAotICAgIHByaXZhdGUgTWFwIF9tYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgYmxhbmsgWG1sT3B0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyAoICkgeyB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgWG1sT3B0aW9ucywgY29weWluZyB0aGUgb3B0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyAoWG1sT3B0aW9ucyBvdGhlcikgewotICAgICAgICBpZiAob3RoZXIgIT0gbnVsbCkgX21hcC5wdXRBbGwob3RoZXIuX21hcCk7Ci0gICAgfQotICAgICAgICAgICAgCi0gICAgLy8KLSAgICAvLyBIYW5keS1kYW5keSBoZWxwZXIgbWV0aG9kcyBmb3Igc2V0dGluZyBzb21lIG9wdGlvbnMKLSAgICAvLwotCi0gICAgLyoqCi0gICAgICogVGhpcyBvcHRpb24gd2lsbCBjYXVzZSB0aGUgc2F2ZXIgdG8gc2F2ZSBuYW1lc3BhY2UgYXR0cmlidXRlcyBmaXJzdC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFNhdmVOYW1lc3BhY2VzRmlyc3QoKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBTQVZFX05BTUVTUEFDRVNfRklSU1QgKTsgCi0gICAgfQotICAgIC8qKgotICAgICAqIFRoaXMgb3B0aW9uIHdpbGwgY2F1c2UgdGhlIHNhdmVyIHRvIHJlZm9ybWF0IHdoaXRlIHNwYWNlIGZvciBlYXNpZXIgcmVhZGluZy4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFNhdmVQcmV0dHlQcmludCgpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfUFJFVFRZX1BSSU5UICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gdXNlZCB3aXRoIDxjb2RlPnNldFNhdmVQcmV0dHlQcmludDwvY29kZT4gdGhpcyBzZXRzIHRoZSBpbmRlbnQKLSAgICAgKiBhbW91bnQgdG8gdXNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRlbnQgdGhlIGluZGVudCBhbW91bnQgdG8gdXNlCi0gICAgICogQHNlZSAjc2V0U2F2ZVByZXR0eVByaW50Ci0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSNzYXZlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKLSAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3htbFRleHQoWG1sT3B0aW9ucykKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRTYXZlUHJldHR5UHJpbnRJbmRlbnQoaW50IGluZGVudCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggU0FWRV9QUkVUVFlfUFJJTlRfSU5ERU5ULCBpbmRlbnQgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiB1c2VkIHdpdGggPGNvZGU+c2V0U2F2ZVByZXR0eVByaW50PC9jb2RlPiB0aGlzIHNldHMgdGhlIG9mZnNldAotICAgICAqIGFtb3VudCB0byB1c2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGFtb3VudCB0byB1c2UKLSAgICAgKiBAc2VlICNzZXRTYXZlUHJldHR5UHJpbnQKLSAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFNhdmVQcmV0dHlQcmludE9mZnNldChpbnQgb2Zmc2V0KSB7IAotICAgICAgICByZXR1cm4gc2V0KCBTQVZFX1BSRVRUWV9QUklOVF9PRkZTRVQsIG9mZnNldCApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIHBhcnNpbmcgb3Igd3JpdGluZyBhIGRvY3VtZW50LCB0aGlzIHNldHMgdGhlIGNoYXJhY3RlcgotICAgICAqIGVuY29kaW5nIHRvIHVzZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcgdGhlIGNoYXJhY3RlciBlbmNvZGluZwotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0Q2hhcmFjdGVyRW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBDSEFSQUNURVJfRU5DT0RJTkcsIGVuY29kaW5nICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gcGFyc2luZyBhIGRvY3VtZW50LCB0aGlzIHNldHMgdGhlIHR5cGUgb2YgdGhlIHJvb3QKLSAgICAgKiBlbGVtZW50LiBJZiB0aGlzIGlzIHNldCwgdGhlIHBhcnNlciB3aWxsIG5vdCB0cnkgdG8gZ3Vlc3MKLSAgICAgKiB0aGUgdHlwZSBiYXNlZCBvbiB0aGUgZG9jdW1lbnQncyA8Y29kZT5RTmFtZTwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGUgVGhlIHJvb3QgZWxlbWVudCdzIGRvY3VtZW50IHR5cGUuCi0gICAgICogQHNlZSBYbWxPYmplY3QuRmFjdG9yeSNwYXJzZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0RG9jdW1lbnRUeXBlKFNjaGVtYVR5cGUgdHlwZSkgewotICAgICAgICByZXR1cm4gc2V0KCBET0NVTUVOVF9UWVBFLCB0eXBlICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPlNldHMgYSBjb2xsZWN0aW9uIG9iamVjdCBmb3IgY29sbGVjdGluZyB7QGxpbmsgWG1sRXJyb3J9IG9iamVjdHMgCi0gICAgICogZHVyaW5nIHBhcnNpbmcsIHZhbGlkYXRpb24sIGFuZCBjb21waWxhdGlvbi4gV2hlbiBzZXQsIHRoZSBjb2xsZWN0aW9uIAotICAgICAqIHdpbGwgY29udGFpbiBhbGwgdGhlIGVycm9ycyBhZnRlciB0aGUgb3BlcmF0aW9uIHRha2VzIHBsYWNlLiAgTm90aWNlIHRoYXQKLSAgICAgKiB0aGUgZXJyb3JzIHdpbGwgb25seSBoYXZlIGxpbmUgbnVtYmVycyBpZiB0aGUgZG9jdW1lbnQgd2FzCi0gICAgICogbG9hZGVkIHdpdGggbGluZSBudW1iZXJzIGVuYWJsZWQuPC9wPgotICAgICAqIAotICAgICAqIDxwPlRoZSBmb2xsb3dpbmcgc2ltcGxlIGV4YW1wbGUgaWxsdXN0cmF0ZXMgdXNpbmcgYW4gZXJyb3IgbGlzdGVuZXIKLSAgICAgKiBkdXJpbmcgdmFsaWRhdGlvbi48L3A+Ci0gICAgICogCi0gICAgICogPHByZT4KLSAgICAgKiAvLyBDcmVhdGUgYW4gWG1sT3B0aW9ucyBpbnN0YW5jZSBhbmQgc2V0IHRoZSBlcnJvciBsaXN0ZW5lci4KLSAgICAgKiBYbWxPcHRpb25zIHZhbGlkYXRlT3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICogQXJyYXlMaXN0IGVycm9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgKiB2YWxpZGF0ZU9wdGlvbnMuc2V0RXJyb3JMaXN0ZW5lcihlcnJvckxpc3QpOwotICAgICAqIAotICAgICAqIC8vIFZhbGlkYXRlIHRoZSBYTUwuCi0gICAgICogYm9vbGVhbiBpc1ZhbGlkID0gbmV3RW1wLnZhbGlkYXRlKHZhbGlkYXRlT3B0aW9ucyk7Ci0gICAgICogCi0gICAgICogLy8gSWYgdGhlIFhNTCBpc24ndCB2YWxpZCwgbG9vcCB0aHJvdWdoIHRoZSBsaXN0ZW5lcidzIGNvbnRlbnRzLAotICAgICAqIC8vIHByaW50aW5nIGNvbnRhaW5lZCBtZXNzYWdlcy4KLSAgICAgKiBpZiAoIWlzVmFsaWQpCi0gICAgICogewotICAgICAqICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJvckxpc3Quc2l6ZSgpOyBpKyspCi0gICAgICogICAgICB7Ci0gICAgICogICAgICAgICAgWG1sRXJyb3IgZXJyb3IgPSAoWG1sRXJyb3IpZXJyb3JMaXN0LmdldChpKTsKLSAgICAgKiAgICAgICAgICAKLSAgICAgKiAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuIik7Ci0gICAgICogICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNZXNzYWdlOiAiICsgZXJyb3IuZ2V0TWVzc2FnZSgpICsgIlxuIik7Ci0gICAgICogICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2NhdGlvbiBvZiBpbnZhbGlkIFhNTDogIiArIAotICAgICAqICAgICAgICAgICAgICBlcnJvci5nZXRDdXJzb3JMb2NhdGlvbigpLnhtbFRleHQoKSArICJcbiIpOwotICAgICAqICAgICAgfQotICAgICAqIH0KLSAgICAgKiA8L3ByZT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYyBBIGNvbGxlY3Rpb24gdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHtAbGluayBYbWxFcnJvcn0gb2JqZWN0cyAKLSAgICAgKiB2aWEge0BsaW5rIENvbGxlY3Rpb24jYWRkfQotICAgICAqIAotICAgICAqIEBzZWUgWG1sRXJyb3IKLSAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKLSAgICAgKiBAc2VlIFhtbE9iamVjdCN2YWxpZGF0ZShYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sQmVhbnMjY29tcGlsZVhzZAotICAgICAqIEBzZWUgWG1sT3B0aW9ucyNzZXRMb2FkTGluZU51bWJlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRFcnJvckxpc3RlbmVyIChDb2xsZWN0aW9uIGMpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIEVSUk9SX0xJU1RFTkVSLCBjICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhdXNlcyB0aGUgc2F2ZXIgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgbmFtZXNwYWNlIHByZWZpeCBkZWNsYXJhdGlvbnMuCi0gICAgICogVGhlIHNhdmVyIHdpbGwgZG8gdGhpcyBieSBwYXNzaW5nIG92ZXIgdGhlIGRvY3VtZW50IHR3aWNlLCBmaXJzdCB0bwotICAgICAqIGNvbGxlY3QgdGhlIHNldCBvZiBuZWVkZWQgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucywgYW5kIHRoZW4gc2Vjb25kCi0gICAgICogdG8gYWN0dWFsbHkgc2F2ZSB0aGUgZG9jdW1lbnQgd2l0aCB0aGUgZGVjbGFyYXRpb25zIGNvbGxlY3RlZAotICAgICAqIGF0IHRoZSByb290LgotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZUFnZ3Jlc2l2ZU5hbWVzcGFjZXMoKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBTQVZFX0FHR1JFU1NJVkVfTkFNRVNQQUNFUyApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG9wdGlvbiBjYXVzZXMgdGhlIHNhdmVyIHRvIHdyYXAgdGhlIGN1cnJlbnQgZnJhZ21lbnQgaW4KLSAgICAgKiBhbiBlbGVtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gdXNlIGZvciB0aGUgdG9wIGxldmVsIGVsZW1lbnQKLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFNhdmVTeW50aGV0aWNEb2N1bWVudEVsZW1lbnQgKFFOYW1lIG5hbWUpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfU1lOVEhFVElDX0RPQ1VNRU5UX0VMRU1FTlQsIG5hbWUgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCB0aGUgc2F2ZXIgd2lsbCB0cnkgdG8gdXNlIHRoZSBkZWZhdWx0Ci0gICAgICogbmFtZXNwYWNlIGZvciB0aGUgbW9zdCBjb21tb25seSB1c2VkIFVSSS4gSWYgaXQgaXMgbm90IHNldAotICAgICAqIHRoZSBzYXZlciB3aWxsIGFsd2F5cyBjcmVhdGVkIG5hbWVkIHByZWZpeGVzLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0VXNlRGVmYXVsdE5hbWVzcGFjZSAoKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBTQVZFX1VTRV9ERUZBVUxUX05BTUVTUEFDRSApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiBuYW1lc3BhY2VzIGhhdmUgYWxyZWFkeSBiZWVuIGRlY2xhcmVkIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoZQotICAgICAqIGZyYWdtZW50IGJlaW5nIHNhdmVkLCB0aGlzIGFsbG93cyB0aG9zZSBtYXBwaW5ncyB0byBiZSBwYXNzZWQKLSAgICAgKiBkb3duIHRvIHRoZSBzYXZlciwgc28gdGhlIHByZWZpeGVzIGFyZSBub3QgcmUtZGVjbGFyZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGltcGxpY2l0TmFtZXNwYWNlcyBhIG1hcCBvZiBwcmVmaXhlcyB0byB1cmlzIHRoYXQgY2FuIGJlCi0gICAgICogIHVzZWQgYnkgdGhlIHNhdmVyIHdpdGhvdXQgYmVpbmcgZGVjbGFyZWQKLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRTYXZlSW1wbGljaXROYW1lc3BhY2VzIChNYXAgaW1wbGljaXROYW1lc3BhY2VzKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBTQVZFX0lNUExJQ0lUX05BTUVTUEFDRVMsIGltcGxpY2l0TmFtZXNwYWNlcyApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIG1hcCBvZiBoaW50cyB0byBwYXNzIHRvIHRoZSBzYXZlciBmb3Igd2hpY2ggcHJlZml4ZXMgdG8gdXNlCi0gICAgICogZm9yIHdoaWNoIG5hbWVzcGFjZSBVUkkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN1Z2dlc3RlZFByZWZpeGVzIGEgbWFwIGZyb20gVVJJcyB0byBwcmVmaXhlcwotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZVN1Z2dlc3RlZFByZWZpeGVzIChNYXAgc3VnZ2VzdGVkUHJlZml4ZXMpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfU1VHR0VTVEVEX1BSRUZJWEVTLCBzdWdnZXN0ZWRQcmVmaXhlcyApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG9wdGlvbiBjYXVzZXMgdGhlIHNhdmVyIHRvIGZpbHRlciBhIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24KLSAgICAgKiB3aXRoIHRoZSBnaXZlbiB0YXJnZXQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmlsdGVyUHJvY2luc3QgdGhlIG5hbWUgb2YgYSBQcm9jZXNzaW5nIEluc3RydWN0aW9uIHRvIGZpbHRlcgotICAgICAqICAgb24gc2F2ZQotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZUZpbHRlclByb2NpbnN0IChTdHJpbmcgZmlsdGVyUHJvY2luc3QpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfRklMVEVSX1BST0NJTlNULCBmaWx0ZXJQcm9jaW5zdCApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIHNhdmluZyBhIGZyYWdtZW50LCB0aGlzIG9wdGlvbiBjaGFuZ2VzIHRoZSBxbmFtZSBvZiB0aGUgc3ludGhlc2l6ZWQKLSAgICAgKiByb290IGVsZW1lbnQuICBOb3JtYWxseSAmbHQ7eG1sLWZyYWdtZW50Jmd0OyBpcyB1c2VkLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZVVzZU9wZW5GcmFnICgpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfVVNFX09QRU5fRlJBR01FTlQgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBvcHRpb24gY29udHJvbHMgd2hldGhlciBzYXZpbmcgYmVnaW5zIG9uIHRoZSBlbGVtZW50IG9yIGl0cyBjb250ZW50cwotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZU91dGVyICgpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfT1VURVIgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBvcHRpb24gY29udHJvbHMgd2hldGhlciBzYXZpbmcgYmVnaW5zIG9uIHRoZSBlbGVtZW50IG9yIGl0cyBjb250ZW50cwotICAgICAqIAotICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZUlubmVyICgpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFNBVkVfSU5ORVIgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCB0aGUgZG9jdW1lbnQgZWxlbWVudCBpcyByZXBsYWNlZCB3aXRoIHRoZQotICAgICAqIGdpdmVuIFFOYW1lIHdoZW4gcGFyc2luZy4gIElmIG51bGwgaXMgc3VwcGxpZWQsIHRoZSBkb2N1bWVudCBlbGVtZW50Ci0gICAgICogaXMgcmVtb3ZlZC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRMb2FkUmVwbGFjZURvY3VtZW50RWxlbWVudCAoIFFOYW1lIHJlcGxhY2VtZW50ICkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggTE9BRF9SRVBMQUNFX0RPQ1VNRU5UX0VMRU1FTlQsIHJlcGxhY2VtZW50ICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCwgYWxsIGluc2lnbmlmaWNhbnQgd2hpdGVzcGFjZSBpcyBzdHJpcHBlZAotICAgICAqIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LiAgQ2FuIGJlIHVzZWQgdG8gc2F2ZSBtZW1vcnkgb24gbGFyZ2UKLSAgICAgKiBkb2N1bWVudHMgd2hlbiB5b3Uga25vdyB0aGVyZSBpcyBubyBtaXhlZCBjb250ZW50LgotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldExvYWRTdHJpcFdoaXRlc3BhY2UgKCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggTE9BRF9TVFJJUF9XSElURVNQQUNFKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCBhbGwgY29tbWVudHMgYXJlIHN0cmlwcGVkIHdoZW4gcGFyc2luZwotICAgICAqIGEgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHNlZSBYbWxPYmplY3QuRmFjdG9yeSNwYXJzZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCi0gICAgICovCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0TG9hZFN0cmlwQ29tbWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBzZXQoIExPQURfU1RSSVBfQ09NTUVOVFMgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCBhbGwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgCi0gICAgICogYXJlIHN0cmlwcGVkIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldExvYWRTdHJpcFByb2NpbnN0cyAoKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBMT0FEX1NUUklQX1BST0NJTlNUUyApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQsIGxpbmUgbnVtYmVyIGFubm90YXRpb25zIGFyZSBwbGFjZWQKLSAgICAgKiBpbiB0aGUgc3RvcmUgd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuICBUaGlzIGlzIHBhcnRpY3VsYXJseQotICAgICAqIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHtAbGluayBYbWxFcnJvcn0gb2JqZWN0cyB0byBjb250YWluCi0gICAgICogbGluZSBudW1iZXJzLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqIEBzZWUgWG1sRXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRMb2FkTGluZU51bWJlcnMgKCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggTE9BRF9MSU5FX05VTUJFUlMgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBvcHRpb24gc2V0cyBhIG1hcCBvZiBuYW1lc3BhY2UgdXJpIHN1YnN0aXR1dGlvbnMgdGhhdCBoYXBwZW4KLSAgICAgKiB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaWYgeW91Ci0gICAgICogaGF2ZSBkb2N1bWVudHMgdGhhdCB1c2Ugbm8gbmFtZXNwYWNlLCBidXQgeW91IHdpc2ggdG8gYXZvaWQKLSAgICAgKiB0aGUgbmFtZSBjb2xsaXNpb24gcHJvYmxlbXMgdGhhdCBvY2N1ciB3aGVuIHlvdSBpbnRyb2R1Y2UKLSAgICAgKiBzY2hlbWEgZGVmaW5pdGlvbnMgd2l0aG91dCBhIHRhcmdldCBuYW1lc3BhY2UuCi0gICAgICogPHA+Ci0gICAgICogQnkgbWFwcGluZyB0aGUgZW1wdHkgc3RyaW5nICIiICh0aGUgYWJzZW5jZSBvZiBhIFVSSSkgdG8gYSBzcGVjaWZpYwotICAgICAqIG5hbWVzcGFjZSwgeW91IGNhbiBmb3JjZSB0aGUgcGFyc2VyIHRvIGJlaGF2ZSBhcyBpZiBhIG5vLW5hbWVzcGFjZQotICAgICAqIGRvY3VtZW50IHdlcmUgYWN0dWFsbHkgaW4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UuIFRoaXMgYWxsb3dzIHlvdQotICAgICAqIHRvIHR5cGUgdGhlIGluc3RhbmNlIGFjY29yZGluZyB0byBhIHNjaGVtYSBpbiBhIG5vbmVtcHR5IG5hbWVzcGFjZSwKLSAgICAgKiBhbmQgdGhlcmVmb3JlIGF2b2lkIHRoZSBwcm9ibGVtYXRpYyBwcmFjdGljZSBvZiB1c2luZyBzY2hlbWEKLSAgICAgKiBkZWZpbml0aW9ucyB3aXRob3V0IGEgdGFyZ2V0IG5hbWVzcGFjZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3Vic3ROYW1lc3BhY2VzIGEgbWFwIG9mIGRvY3VtZW50IFVSSXMgdG8gcmVwbGFjZW1lbnQgVVJJcwotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldExvYWRTdWJzdGl0dXRlTmFtZXNwYWNlcyAoTWFwIHN1YnN0TmFtZXNwYWNlcykgeyAKLSAgICAgICAgcmV0dXJuIHNldCggTE9BRF9TVUJTVElUVVRFX05BTUVTUEFDRVMsIHN1YnN0TmFtZXNwYWNlcyApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQsIHRoZSB1bmRlcmx5aW5nIHhtbCB0ZXh0IGJ1ZmZlciBpcyB0cmltbWVkCi0gICAgICogaW1tZWRpYXRlbHkgYWZ0ZXIgcGFyc2luZyBhIGRvY3VtZW50IHJlc3VsdGluZyBpbiBhIHNtYWxsZXIgbWVtb3J5Ci0gICAgICogZm9vdHByaW50LiAgVXNlIHRoaXMgb3B0aW9uIGlmIHlvdSBhcmUgbG9hZGluZyBhIGxhcmdlIG51bWJlcgotICAgICAqIG9mIHVuY2hhbmdpbmcgZG9jdW1lbnRzIHRoYXQgd2lsbCBzdGF5IGluIG1lbW9yeSBmb3Igc29tZSB0aW1lLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldExvYWRUcmltVGV4dEJ1ZmZlciAoKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBMT0FEX1RSSU1fVEVYVF9CVUZGRVIgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGFkZGl0aW9uYWwgbmFtZXNwYWNlIG1hcHBpbmdzIHRvIGJlIGFkZGVkIHdoZW4gcGFyc2luZwotICAgICAqIGEgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5zZXMgYWRkaXRpb25hbCBuYW1lc3BhY2UgbWFwcGluZ3MKLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRMb2FkQWRkaXRpb25hbE5hbWVzcGFjZXMgKE1hcCBuc2VzKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBMT0FEX0FERElUSU9OQUxfTkFNRVNQQUNFUywgbnNlcyApOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQgd2hlbiBsb2FkaW5nIGZyb20gYW4gSW5wdXRTdHJlYW0gb3IgRmlsZSwgdGhlbgotICAgICAqIHRoZSBsb2FkZXIgd2lsbCBjb21wdXRlIGEgMTYwLWJpdCBTSEEtMSBtZXNzYWdlIGRpZ2VzdCBvZiB0aGUgWE1MCi0gICAgICogZmlsZSB3aGlsZSBsb2FkaW5nIGl0IGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB2aWEKLSAgICAgKiBYbWxPYmplY3QuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0TWVzc2FnZURpZ2VzdCgpOwotICAgICAqIDxicj4KLSAgICAgKiBUaGUgc2NoZW1hIGNvbXBpbGVyIHVzZXMgbWVzc2FnZSBkaWdlc3RzIHRvIGRldGVjdCBhbmQgZWxpbWluYXRlCi0gICAgICogZHVwbGljYXRlIGltcG9ydGVkIHhzZCBmaWxlcy4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRMb2FkTWVzc2FnZURpZ2VzdCAoKSB7IAotICAgICAgICByZXR1cm4gc2V0KCBMT0FEX01FU1NBR0VfRElHRVNUICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRoYXQgcmVwcmVzZW50cwotICAgICAqIHRoZSBjdXJyZW50IG5vZGUgaW4gYSBxdWVyeSBleHByZXNzaW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YXJOYW1lIFRoZSBuZXcgdmFyaWFibGUgbmFtZSB0byB1c2UgZm9yIHRoZSBxdWVyeS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbE9iamVjdCNleGVjUXVlcnkKLSAgICAgKiBAc2VlIFhtbEN1cnNvciNleGVjUXVlcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRYcXVlcnlDdXJyZW50Tm9kZVZhciAoU3RyaW5nIHZhck5hbWUpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIFhRVUVSWV9DVVJSRU5UX05PREVfVkFSLCB2YXJOYW1lICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgb3B0aW9uIHNldHMgdGhlIGRvY3VtZW50IHNvdXJjZSBuYW1lIGludG8gdGhlIHhtbCBzdG9yZQotICAgICAqIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LiAgSWYgYSBkb2N1bWVudCBpcyBwYXJzZWQgZnJvbSBhCi0gICAgICogRmlsZSBvciBVUkksIGl0IGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIHRoZSBVUkkgb2YgdGhlCi0gICAgICogc291cmNlOyBvdGhlcndpc2UsIGZvciBleGFtcGxlLCB3aGVuIHBhcnNpbmcgYSBTdHJpbmcsCi0gICAgICogeW91IGNhbiB1c2UgdGhpcyBvcHRpb24gdG8gc3BlY2lmeSB0aGUgc291cmNlIG5hbWUgeW91cnNlbGYuIAotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5sYW5nLlN0cmluZywgWG1sT3B0aW9ucykKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXREb2N1bWVudFNvdXJjZU5hbWUgKFN0cmluZyBkb2N1bWVudFNvdXJjZU5hbWUpIHsgCi0gICAgICAgIHJldHVybiBzZXQoIERPQ1VNRU5UX1NPVVJDRV9OQU1FLCBkb2N1bWVudFNvdXJjZU5hbWUgKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBvcHRpb24gYWxsb3dzIGZvciA8Y29kZT5RTmFtZTwvY29kZT4gc3Vic3RpdHV0aW9uIGR1cmluZyBzY2hlbWEgY29tcGlsYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWVNYXAgYSBtYXAgZnJvbSA8Y29kZT5RTmFtZTwvY29kZT5zIHRvIHN1YnN0aXR1dGUgPGNvZGU+UU5hbWU8L2NvZGU+cy4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbEJlYW5zI2NvbXBpbGVYc2QKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRDb21waWxlU3Vic3RpdHV0ZU5hbWVzIChNYXAgbmFtZU1hcCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggQ09NUElMRV9TVUJTVElUVVRFX05BTUVTLCBuYW1lTWFwICk7IAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQsIHZhbGlkYXRpb24gaXMgbm90IGRvbmUgb24gdGhlIFNjaGVtYSBYbWxCZWFucwotICAgICAqIHdoZW4gYnVpbGRpbmcgYSA8Y29kZT5TY2hlbWFUeXBlU3lzdGVtPC9jb2RlPgotICAgICAqIAotICAgICAqIEBzZWUgWG1sQmVhbnMjY29tcGlsZVhzZAotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldENvbXBpbGVOb1ZhbGlkYXRpb24gKCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggQ09NUElMRV9OT19WQUxJREFUSU9OICk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCwgdGhlIHVuaXF1ZSBwYXJ0aWNsZSBhdHRyaWJ1dGlvbiBydWxlIGlzIG5vdAotICAgICAqIGVuZm9yY2VkIHdoZW4gYnVpbGRpbmcgYSA8Y29kZT5TY2hlbWFUeXBlU3lzdGVtPC9jb2RlPi4gU2VlCi0gICAgICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNub24tYW1iaWciPkFwcGVuZGl4IEggb2YgdGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbjwvYT4KLSAgICAgKiBmb3IgaW5mb3JtYXRpb24gb24gdGhlIFVQQSBydWxlLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sQmVhbnMjY29tcGlsZVhzZAotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldENvbXBpbGVOb1VwYVJ1bGUgKCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggQ09NUElMRV9OT19VUEFfUlVMRSApOyAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCB0aGUgcGFydGljbGUgdmFsaWQgKHJlc3RyaWNpdG9uKSBydWxlIGlzIG5vdAotICAgICAqIGVuZm9yY2VkIHdoZW4gYnVpbGRpbmcgYSA8Y29kZT5TY2hlbWFUeXBlU3lzdGVtPC9jb2RlPi4gU2VlCi0gICAgICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNjb3MtcGFydGljbGUtcmVzdHJpY3QiPlNlY3Rpb24gMy45LjYgb2YgdGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbjwvYT4KLSAgICAgKiBmb3IgaW5mb3JtYXRpb24gb24gdGhlIFBWUiBydWxlLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sQmVhbnMjY29tcGlsZVhzZAotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldENvbXBpbGVOb1B2clJ1bGUgKCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggQ09NUElMRV9OT19QVlJfUlVMRSApOyAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCB0aGVuIHRoZSBzY2hlbWEgY29tcGlsZXIgd2lsbCB0cnkgdG8gZG93bmxvYWQKLSAgICAgKiBzY2hlbWFzIHRoYXQgYXBwZWFyIGluIGltcG9ydHMgYW5kIGluY2x1ZGVzIGZyb20gbmV0d29yayBiYXNlZCBVUkxzLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sQmVhbnMjY29tcGlsZVhzZAotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldENvbXBpbGVEb3dubG9hZFVybHMgKCkgeyAKLSAgICAgICAgcmV0dXJuIHNldCggQ09NUElMRV9ET1dOTE9BRF9VUkxTKTsgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCwgdGhlbiB0aGUgc2NoZW1hIGNvbXBpbGVyIHdpbGwgcGVybWl0IGFuZAotICAgICAqIGlnbm9yZSBtdWx0aXBsZSBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBjb21wb25lbnQgKGVsZW1lbnQsIGF0dHJpYnV0ZSwKLSAgICAgKiB0eXBlLCBldGMpIG5hbWVzIGluIHRoZSBnaXZlbiBuYW1lc3BhY2VzLiAgSWYgbXVsdGlwbGUgZGVmaW5pdGlvbnMKLSAgICAgKiB3aXRoIHRoZSBzYW1lIG5hbWUgYXBwZWFyLCB0aGUgZGVmaW5pdGlvbnMgdGhhdCBoYXBwZW4gdG8gYmUgcHJvY2Vzc2VkCi0gICAgICogbGFzdCB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1kZWZOYW1lc3BhY2VzIGEgc2V0IG9mIG5hbWVzcGFjZSBVUklzIGFzIFN0cmluZ3MKLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbEJlYW5zI2NvbXBpbGVYc2QKLSAgICAgKi8gCi0gICAgcHVibGljIFhtbE9wdGlvbnMgc2V0Q29tcGlsZU1kZWZOYW1lc3BhY2VzKFNldCBtZGVmTmFtZXNwYWNlcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBzZXQoIENPTVBJTEVfTURFRl9OQU1FU1BBQ0VTLCBtZGVmTmFtZXNwYWNlcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCB3aGVuIGFuIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRoZW4gdmFsdWUKLSAgICAgKiBmYWNldHMgd2lsbCBiZSBjaGVja2VkIG9uIGVhY2ggY2FsbCB0byBhIHNldHRlciBvciBnZXR0ZXIKLSAgICAgKiBtZXRob2Qgb24gaW5zdGFuY2VzIG9mIFhtbE9iamVjdCB3aXRoaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50LgotICAgICAqIElmIHRoZSBmYWNldHMgYXJlIG5vdCBzYXRpc2ZpZWQsIHRoZW4gYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiBpcwotICAgICAqIHRocm93biBpbW1lZGlhdGVseS4gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBmb3IgZmluZGluZyBjb2RlIHRoYXQKLSAgICAgKiBpcyBpbnRyb2R1Y2luZyBpbnZhbGlkIHZhbHVlcyBpbiBhbiBYTUwgZG9jdW1lbnQsIGJ1dCBpdAotICAgICAqIHNsb3dzIHBlcmZvcm1hbmNlLgotICAgICAqIAotICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQotICAgICAqLwotICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFZhbGlkYXRlT25TZXQoKSB7Ci0gICAgICAgIHJldHVybiBzZXQoIFZBTElEQVRFX09OX1NFVCApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCB3aGVuIGNvbXBpbGluZyBhIHNjaGVtYSwgdGhlbiB0aGUgZ2l2ZW4KLSAgICAgKiBFbnRpdHlSZXNvbHZlciB3aWxsIGJlIGNvbnN1bHRlZCBpbiBvcmRlciB0byByZXNvbHZlIGFueQotICAgICAqIFVSSXMgd2hpbGUgZG93bmxvYWRpbmcgaW1wb3J0ZWQgc2NoZW1hcy4KLSAgICAgKgotICAgICAqIEVudGl0eVJlc29sdmVycyBhcmUgY3VycmVudGx5IG9ubHkgdXNlZCBieSBjb21waWxlWHNkOyB0aGV5Ci0gICAgICogYXJlIG5vdCBjb25zdWx0ZWQgYnkgb3RoZXIgZnVuY3Rpb25zLCBmb3IgZXhhbXBsZSwgcGFyc2UuCi0gICAgICogVGhpcyB3aWxsIGxpa2VseSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIFhtbEJlYW5zI2NvbXBpbGVYc2QKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRFbnRpdHlSZXNvbHZlcihFbnRpdHlSZXNvbHZlciByZXNvbHZlcikgewotICAgICAgICByZXR1cm4gc2V0KCBFTlRJVFlfUkVTT0xWRVIsIHJlc29sdmVyICk7Ci0gICAgfQotCi0KLSAgICAvLwotICAgIC8vIENvbXBsZXRlIHNldCBvZiBYbWxPcHRpb24ncwotICAgIC8vCi0gICAgICAgICAgICAKLSAgICAvLyBUT0RPIC0gQWRkIHNlbGVjdFBhdGggb3B0aW9uIHRvIHRyYWNrIHRoZSBzZWxldGlvbiAoZGVhdWx0IGlzIHRvIGNsZWFuIHNlbGVjdGlvbnMgZmFzdCkuIAotICAgIAotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfTkFNRVNQQUNFU19GSVJTVCAgICAgICAgICAgPSAgIlNBVkVfTkFNRVNQQUNFU19GSVJTVCI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9TWU5USEVUSUNfRE9DVU1FTlRfRUxFTUVOVCA9ICAiU0FWRV9TWU5USEVUSUNfRE9DVU1FTlRfRUxFTUVOVCI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9QUkVUVFlfUFJJTlQgICAgICAgICAgICAgICA9ICAiU0FWRV9QUkVUVFlfUFJJTlQiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfUFJFVFRZX1BSSU5UX0lOREVOVCAgICAgICAgPSAgIlNBVkVfUFJFVFRZX1BSSU5UX0lOREVOVCI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9QUkVUVFlfUFJJTlRfT0ZGU0VUICAgICAgICA9ICAiU0FWRV9QUkVUVFlfUFJJTlRfT0ZGU0VUIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0FHR1JFU1NJVkVfTkFNRVNQQUNFUyAgICAgID0gICJTQVZFX0FHR1JFU1NJVkVfTkFNRVNQQUNFUyI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9VU0VfREVGQVVMVF9OQU1FU1BBQ0UgICAgICA9ICAiU0FWRV9VU0VfREVGQVVMVF9OQU1FU1BBQ0UiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfSU1QTElDSVRfTkFNRVNQQUNFUyAgICAgICAgPSAgIlNBVkVfSU1QTElDSVRfTkFNRVNQQUNFUyI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9TVUdHRVNURURfUFJFRklYRVMgICAgICAgICA9ICAiU0FWRV9TVUdHRVNURURfUFJFRklYRVMiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfRklMVEVSX1BST0NJTlNUICAgICAgICAgICAgPSAgIlNBVkVfRklMVEVSX1BST0NJTlNUIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX1VTRV9PUEVOX0ZSQUdNRU5UICAgICAgICAgID0gICJTQVZFX1VTRV9PUEVOX0ZSQUdNRU5UIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX09VVEVSICAgICAgICAgICAgICAgICAgICAgID0gICJTQVZFX09VVEVSIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0lOTkVSICAgICAgICAgICAgICAgICAgICAgID0gICJTQVZFX0lOTkVSIjsKLSAgICAKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX1JFUExBQ0VfRE9DVU1FTlRfRUxFTUVOVCAgID0gICJMT0FEX1JFUExBQ0VfRE9DVU1FTlRfRUxFTUVOVCI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9BRF9TVFJJUF9XSElURVNQQUNFICAgICAgICAgICA9ICAiTE9BRF9TVFJJUF9XSElURVNQQUNFIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX1NUUklQX0NPTU1FTlRTICAgICAgICAgICAgID0gICJMT0FEX1NUUklQX0NPTU1FTlRTIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX1NUUklQX1BST0NJTlNUUyAgICAgICAgICAgID0gICJMT0FEX1NUUklQX1BST0NJTlNUUyI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9BRF9MSU5FX05VTUJFUlMgICAgICAgICAgICAgICA9ICAiTE9BRF9MSU5FX05VTUJFUlMiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQURfU1VCU1RJVFVURV9OQU1FU1BBQ0VTICAgICAgPSAgIkxPQURfU1VCU1RJVFVURV9OQU1FU1BBQ0VTIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX1RSSU1fVEVYVF9CVUZGRVIgICAgICAgICAgID0gICJMT0FEX1RSSU1fVEVYVF9CVUZGRVIiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQURfQURESVRJT05BTF9OQU1FU1BBQ0VTICAgICAgPSAgIkxPQURfQURESVRJT05BTF9OQU1FU1BBQ0VTIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX01FU1NBR0VfRElHRVNUICAgICAgICAgICAgID0gICJMT0FEX01FU1NBR0VfRElHRVNUIjsKLQotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhRVUVSWV9DVVJSRU5UX05PREVfVkFSICAgICAgICAgPSAgIlhRVUVSWV9DVVJSRU5UX05PREVfVkFSIjsKLQotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJBQ1RFUl9FTkNPRElORyAgICAgICAgICAgICAgPSAgIkNIQVJBQ1RFUl9FTkNPRElORyI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTElTVEVORVIgICAgICAgICAgICAgICAgICA9ICAiRVJST1JfTElTVEVORVIiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX1RZUEUgICAgICAgICAgICAgICAgICAgPSAgIkRPQ1VNRU5UX1RZUEUiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX1NPVVJDRV9OQU1FICAgICAgICAgICAgPSAgIkRPQ1VNRU5UX1NPVVJDRV9OQU1FIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFX1NVQlNUSVRVVEVfTkFNRVMgICAgICAgID0gICJDT01QSUxFX1NVQlNUSVRVVEVfTkFNRVMiOwotICAgIC8qKiBAZXhjbHVkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVfTk9fVkFMSURBVElPTiAgICAgICAgICAgPSAgIkNPTVBJTEVfTk9fVkFMSURBVElPTiI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRV9OT19VUEFfUlVMRSAgICAgICAgICAgICA9ICAiQ09NUElMRV9OT19VUEFfUlVMRSI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRV9OT19QVlJfUlVMRSAgICAgICAgICAgICA9ICAiQ09NUElMRV9OT19QVlJfUlVMRSI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRV9ET1dOTE9BRF9VUkxTICAgICAgICAgICA9ICAiQ09NUElMRV9ET1dOTE9BRF9VUkxTIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFX01ERUZfTkFNRVNQQUNFUyAgICAgICAgID0gICJDT01QSUxFX01ERUZfTkFNRVNQQUNFUyI7Ci0gICAgLyoqIEBleGNsdWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVEVfT05fU0VUICAgICAgICAgICAgICAgICA9ICAiVkFMSURBVEVfT05fU0VUIjsKLSAgICAvKiogQGV4Y2x1ZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfUkVTT0xWRVIgICAgICAgICAgICAgICAgID0gICJFTlRJVFlfUkVTT0xWRVIiOwotICAgIAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWG1sT3B0aW9ucyBFTVBUWV9PUFRJT05TOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIEVNUFRZX09QVElPTlMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICBFTVBUWV9PUFRJT05TLl9tYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoRU1QVFlfT1BUSU9OUy5fbWFwKTsKLSAgICB9Ci0KLSAgICAvKiogSWYgcGFzc2VkIG51bGwsIHJldHVybnMgYW4gZW1wdHkgb3B0aW9ucyBvYmplY3QuICBPdGhlcndpc2UsIHJldHVybnMgaXRzIGFyZ3VtZW50LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgWG1sT3B0aW9ucyBtYXNrTnVsbChYbWxPcHRpb25zIG8pIHsKLSAgICAgICAgcmV0dXJuIChvID09IG51bGwpID8gRU1QVFlfT1BUSU9OUyA6IG87Ci0gICAgfQotCi0gICAgCi0gICAgLyoqIFVzZWQgdG8gc2V0IGEgZ2VuZXJpYyBvcHRpb24gKi8KLSAgICBwdWJsaWMgdm9pZCAgcHV0ICggT2JqZWN0IG9wdGlvbiAgICAgICAgICAgICAgICkgeyBwdXQoIG9wdGlvbiwgbnVsbCApOyB9Ci0gICAgLyoqIFVzZWQgdG8gc2V0IGEgZ2VuZXJpYyBvcHRpb24gKi8KLSAgICBwdWJsaWMgdm9pZCAgcHV0ICggT2JqZWN0IG9wdGlvbiwgT2JqZWN0IHZhbHVlICkgeyBfbWFwLnB1dChvcHRpb24sIHZhbHVlKTsgfQotICAgIC8qKiBVc2VkIHRvIHNldCBhIGdlbmVyaWMgb3B0aW9uICovCi0gICAgcHVibGljIHZvaWQgcHV0ICAoIE9iamVjdCBvcHRpb24sIGludCB2YWx1ZSAgICApIHsgcHV0KCBvcHRpb24sIG5ldyBJbnRlZ2VyKCB2YWx1ZSApICk7IH0KLQotICAgIHByaXZhdGUgWG1sT3B0aW9ucyBzZXQoT2JqZWN0IG9wdGlvbikgICAgICAgICAgICAgICB7IHJldHVybiBzZXQob3B0aW9uLCBudWxsKTsgfQotICAgIHByaXZhdGUgWG1sT3B0aW9ucyBzZXQoT2JqZWN0IG9wdGlvbiwgT2JqZWN0IHZhbHVlKSB7IF9tYXAucHV0KG9wdGlvbiwgdmFsdWUpOyByZXR1cm4gdGhpczt9Ci0gICAgcHJpdmF0ZSBYbWxPcHRpb25zIHNldChPYmplY3Qgb3B0aW9uLCBpbnQgdmFsdWUpICAgIHsgcmV0dXJuIHNldChvcHRpb24sIG5ldyBJbnRlZ2VyKHZhbHVlKSk7IH0KLQotICAgIC8qKiBVc2VkIHRvIHRlc3QgYSBnZW5lcmljIG9wdGlvbiAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc09wdGlvbiAgICggT2JqZWN0IG9wdGlvbiApIHsgcmV0dXJuIF9tYXAuY29udGFpbnNLZXkoIG9wdGlvbiApOyB9Ci0gICAgLyoqIFVzZWQgdG8gZ2V0IGEgZ2VuZXJpYyBvcHRpb24gKi8KLSAgICBwdWJsaWMgT2JqZWN0ICBnZXQgICAgICAgICAoIE9iamVjdCBvcHRpb24gKSB7IHJldHVybiBfbWFwLmdldCggb3B0aW9uICk7IH0KLQotICAgIC8qKiBVc2VkIHRvIHRlc3QgYSBnZW5lcmljIG9wdGlvbiBvbiBhbiBvcHRpb25zIG9iamVjdCB0aGF0IG1heSBiZSBudWxsICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3Qgc2FmZUdldChYbWxPcHRpb25zIG8sIE9iamVjdCBvcHRpb24pIHsKLSAgICAgICAgcmV0dXJuIG8gPT0gbnVsbCA/IG51bGwgOiBvLmdldChvcHRpb24pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFBvc2l0aXZlSW50ZWdlci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFBvc2l0aXZlSW50ZWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWYyYWYxLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxQb3NpdGl2ZUludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jcG9zaXRpdmVJbnRlZ2VyIj54czpwb3NpdGl2ZUludGVnZXI8L2E+IHR5cGUuCi0gKiBPbmUgb2YgdGhlIGRlcml2ZWQgdHlwZXMgYmFzZWQgb24gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkZWNpbWFsIj54czpkZWNpbWFsPC9hPi4KLSAqIDxwPgotICogVmVyaWZpZWQgdG8gYmUgcG9zaXRpdmUgd2hlbiB2YWxpZGF0aW5nLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXJ9LgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxQb3NpdGl2ZUludGVnZXIgZXh0ZW5kcyBYbWxOb25OZWdhdGl2ZUludGVnZXIKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9wb3NpdGl2ZUludGVnZXIiKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFBvc2l0aXZlSW50ZWdlciBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFBvc2l0aXZlSW50ZWdlciBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFBvc2l0aXZlSW50ZWdlciBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Njc4OTAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2Nzg5MCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFBvc2l0aXZlSW50ZWdlciBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFFOYW1lLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sUU5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlkYzQyMy4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sUU5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jUU5hbWUiPnhzOlFOYW1lPC9hPiB0eXBlLgotICogPHA+Ci0gKiBBIFFOYW1lIGlzIHRoZSBsb2dpY2FsIGNvbWJpbmF0aW9uIG9mIGFuIFhNTCBuYW1lc3BhY2UgVVJJIGFuZCBhIGxvY2FsTmFtZS4KLSAqIEFsdGhvdWdoIGluIGFuIFhNTCBpbnN0YW5jZSBkb2N1bWVudCwgYSBRTmFtZSBhcHBlYXJzIGFzICJwcmVmaXg6bG9jYWxOYW1lIiwKLSAqIHRoZSBsb2dpY2FsIHZhbHVlIG9mIGEgUU5hbWUgZG9lcyBOT1QgY29udGFpbiBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0gKiBwcmVmaXgsIG9ubHkgdGhlIG5hbWVzcGFjZSBVUkkgdG8gd2hpY2ggdGhlIHByZWZpeCBtYXBzLiAgRm9yIGV4YW1wbGUsCi0gKiB0d28gUU5hbWVzICJhOmhlbGxvIiBhbmQgImI6aGVsbG8iIGFyZSBwZXJmZWN0bHkgZXF1aXZhbGVudCBpZiAiYToiIGluCi0gKiB0aGUgZmlyc3QgaW5zdGFuY2UgbWFwcyB0byB0aGUgc2FtZSBVUkkgYXMgImI6IiBpbiB0aGUgc2Vjb25kIGluc3RhbmNlLgotICogPHA+Ci0gKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZX0uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFFOYW1lIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX1FOYW1lIik7Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBRTmFtZX0gKi8KLSAgICBRTmFtZSBnZXRRTmFtZVZhbHVlKCk7Ci0gICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBRTmFtZX0gKi8KLSAgICB2b2lkIHNldFFOYW1lVmFsdWUoUU5hbWUgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgUU5hbWV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldFFOYW1lVmFsdWV9Ci0gICAgICoqLwotICAgIFFOYW1lIHFOYW1lVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgUU5hbWV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldFFOYW1lVmFsdWV9Ci0gICAgICoqLwotICAgIHZvaWQgc2V0KFFOYW1lIG5hbWUpOwotICAgIAotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sUU5hbWV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFFOYW1lfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFFOYW1lfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxRTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFFOYW1lfSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50IHhtbG5zOng9Imh0dHA6Ly9vcGVudXJpLm9yZy8iJmd0O3g6c2FtcGxlJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUU5hbWUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50IHhtbG5zOng9Imh0dHA6Ly9vcGVudXJpLm9yZy8iJmd0O3g6c2FtcGxlJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUU5hbWUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUU5hbWV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUU5hbWUgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFFOYW1lfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFFOYW1lfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxRTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFFOYW1lfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxRTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFFOYW1lfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUU5hbWV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUU5hbWUgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFFOYW1lfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFJ1bnRpbWVFeGNlcHRpb24uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxSdW50aW1lRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZjU4ZTYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFJ1bnRpbWVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBBbiB1bmNoZWNrZWQgWE1MIGV4Y2VwdGlvbi4KLSAqIE1heSBjb250YWluIGFueSBudW1iZXIgb2Yge0BsaW5rIFhtbEVycm9yfSBvYmplY3RzLgotICogCi0gKiBAc2VlIFhtbEVycm9yCi0gKiBAc2VlIFhtbEV4Y2VwdGlvbgotICovIAotcHVibGljIGNsYXNzIFhtbFJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBYbWxSdW50aW1lRXhjZXB0aW9uIGZyb20gYSBtZXNzYWdlLgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sUnVudGltZUV4Y2VwdGlvbiAoIFN0cmluZyBtICAgICAgICAgICAgICApIHsgc3VwZXIoIG0gKTsgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sUnVudGltZUV4Y2VwdGlvbiBmcm9tIGEgbWVzc2FnZSBhbmQgYSBjYXVzZS4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbFJ1bnRpbWVFeGNlcHRpb24gKCBTdHJpbmcgbSwgVGhyb3dhYmxlIHQgKSB7IHN1cGVyKCBtLCB0ICk7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbFJ1bnRpbWVFeGNlcHRpb24gZnJvbSBhIGNhdXNlLgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sUnVudGltZUV4Y2VwdGlvbiAoIFRocm93YWJsZSB0ICAgICAgICAgICApIHsgc3VwZXIoIHQgKTsgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sUnVudGltZUV4Y2VwdGlvbiBmcm9tIGEgbWVzc2FnZSwgYSBjYXVzZSwgYW5kIGEgY29sbGVjdGlvbiBvZiBYbWxFcnJvcnMuCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxSdW50aW1lRXhjZXB0aW9uICggU3RyaW5nIG0sIFRocm93YWJsZSB0LCBDb2xsZWN0aW9uIGVycm9ycyApCi0gICAgewotICAgICAgICBzdXBlciggbSwgdCApOwotCi0gICAgICAgIGlmIChlcnJvcnMgIT0gbnVsbCkKLSAgICAgICAgICAgIF9lcnJvcnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCBuZXcgQXJyYXlMaXN0KGVycm9ycykgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbFJ1bnRpbWVFeGNlcHRpb24gZnJvbSBhbiBYbWxFcnJvci4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbFJ1bnRpbWVFeGNlcHRpb24gKCBYbWxFcnJvciBlcnJvciApCi0gICAgewotICAgICAgICB0aGlzKCBlcnJvci50b1N0cmluZygpLCBudWxsLCBlcnJvciApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gWG1sUnVudGltZUV4Y2VwdGlvbiBmcm9tIGEgbWVzc2FnZSwgYSBjYXVzZSwgYW5kIGFuIFhtbEVycm9yLgotICAgICAqLyAKLSAgICBwdWJsaWMgWG1sUnVudGltZUV4Y2VwdGlvbiAoIFN0cmluZyBtLCBUaHJvd2FibGUgdCwgWG1sRXJyb3IgZXJyb3IgKQotICAgIHsKLSAgICAgICAgdGhpcyggbSwgdCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggZXJyb3IgKSApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbFJ1bnRpbWVFeGNlcHRpb24gZnJvbSBhbiB7QGxpbmsgWG1sRXhjZXB0aW9ufS4KLSAgICAgKi8gCi0gICAgcHVibGljIFhtbFJ1bnRpbWVFeGNlcHRpb24gKCBYbWxFeGNlcHRpb24geG1sRXhjZXB0aW9uICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB4bWxFeGNlcHRpb24uZ2V0TWVzc2FnZSgpLCB4bWxFeGNlcHRpb24uZ2V0Q2F1c2UoKSApOwotCi0gICAgICAgIENvbGxlY3Rpb24gZXJyb3JzID0geG1sRXhjZXB0aW9uLmdldEVycm9ycygpOwotCi0gICAgICAgIGlmIChlcnJvcnMgIT0gbnVsbCkKLSAgICAgICAgICAgIF9lcnJvcnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCBuZXcgQXJyYXlMaXN0KCBlcnJvcnMgKSApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB7QGxpbmsgWG1sRXJyb3J9IHRoYXQgY2F1c2VkIHRoaXMgZXhjZXB0aW9uLCBpZiBhbnkuCi0gICAgICovIAotICAgIHB1YmxpYyBYbWxFcnJvciBnZXRFcnJvciAoICkKLSAgICB7Ci0gICAgICAgIGlmIChfZXJyb3JzID09IG51bGwgfHwgX2Vycm9ycy5zaXplKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiAoWG1sRXJyb3IpIF9lcnJvcnMuZ2V0KCAwICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFhtbEVycm9yIFhtbEVycm9yc30gdGhhdCBjYXVzZWQgdGhpcyBleGNlcHRpb24sIGlmIGFueS4KLSAgICAgKi8gCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0RXJyb3JzICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9lcnJvcnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0IF9lcnJvcnM7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFNheEhhbmRsZXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTYXhIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YmRmMjkuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFNheEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKLQotLyoqCi0gKiBBIGhvbGRlciBmb3IgYSBTQVgge0BsaW5rIENvbnRlbnRIYW5kbGVyfSBhbmQge0BsaW5rIExleGljYWxIYW5kbGVyfSB0aGF0IGFyZQotICogY2FwYWJsZSBvZiBsb2FkaW5nIGFuIHtAbGluayBYbWxPYmplY3R9IGluc3RhbmNlLiAgT25jZSBhbGwgdGhlIFNBWCBldmVudHMgYXJlIHB1c2hlZAotICogdG8gdGhlIGhhbmRsZXJzLCBjYWxsIHtAbGluayAjZ2V0T2JqZWN0KCl9IHRvIGdldCB0aGUgbG9hZGVkIFhtbE9iamVjdC4KLSAqIAotICogQHNlZSBYbWxPYmplY3QuRmFjdG9yeSNuZXdYbWxTYXhIYW5kbGVyCi0gKiBAc2VlIFNjaGVtYVR5cGVMb2FkZXIjbmV3WG1sU2F4SGFuZGxlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFNheEhhbmRsZXIKLXsKLSAgICAvKioKLSAgICAgKiBUaGUgQ29udGVudEhhbmRsZXIgZXhwZWN0aW5nIFNBWCBjb250ZW50IGV2ZW50cy4KLSAgICAgKiBAc2VlIENvbnRlbnRIYW5kbGVyCi0gICAgICovIAotICAgIENvbnRlbnRIYW5kbGVyIGdldENvbnRlbnRIYW5kbGVyICggKTsKLSAgICAvKioKLSAgICAgKiBUaGUgTGV4aWNhbEhhbmRsZXIgZXhwZWN0aW5nIFNBWCBsZXhpY2FsIGV2ZW50cy4KLSAgICAgKiBAc2VlIExleGljYWxIYW5kbGVyCi0gICAgICovIAotICAgIExleGljYWxIYW5kbGVyIGdldExleGljYWxIYW5kbGVyICggKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGUgbG9hZGVkIFhtbE9iamVjdCBhZnRlciBhbGwgdGhlIFNBWCBldmVudHMgaGF2ZSBiZWVuIGZpbmlzaGVkICovCi0gICAgWG1sT2JqZWN0IGdldE9iamVjdCAoICkgdGhyb3dzIFhtbEV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sU2hvcnQuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTaG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGRmNGFkLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTaG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNzaG9ydCI+eHM6c2hvcnQ8L2E+IHR5cGUuCi0gKiBPbmUgb2YgdGhlIGRlcml2ZWQgdHlwZXMgYmFzZWQgb24gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkZWNpbWFsIj54czpkZWNpbWFsPC9hPi4KLSAqIDxwPgotICogTmF0dXJhbGx5LCBjb252ZXJ0aWJsZSB0byBhIEphdmEgc2hvcnQuCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFNob3J0IGV4dGVuZHMgWG1sSW50Ci17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfc2hvcnQiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgc2hvcnQgKi8KLSAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnRWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBzaG9ydCAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNob3J0VmFsdWUoc2hvcnQgcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBzaG9ydAotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRTaG9ydFZhbHVlfQotICAgICAqKi8KLSAgICBwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHNob3J0Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldFNob3J0VmFsdWV9Ci0gICAgICoqLwotICAgIHB1YmxpYyB2b2lkIHNldChzaG9ydCBzKTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sU2hvcnR9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFNob3J0fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFNob3J0fSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFNob3J0fSB2YWx1ZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU2hvcnR9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTaG9ydCBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTaG9ydCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU2hvcnR9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTaG9ydCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTaG9ydCBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFNpbXBsZUxpc3QuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTaW1wbGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMjU2ZDQuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFNpbXBsZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBUaGUgaW1tdXRhYmxlIHtAbGluayBMaXN0fSByZXR1cm5lZCBmb3IgWE1MIHNpbXBsZSBsaXN0IHZhbHVlcy4KLSAqIAotICogWG1sU2ltcGxlTGlzdCBpbXBsZW1lbnRzIGFuIGVxdWFscygpIGFuZCBoYXNoQ29kZSgpIHRoYXQgY29tcGFyZSBsaXN0Ci0gKiBjb250ZW50cywgc28gdHdvIFhtbFNpbXBsZUxpc3RzIGFyZSB0aGUgc2FtZSBpZiB0aGV5IGhhdmUgdGhlIHNhbWUKLSAqIHZhbHVlcyBpbiB0aGUgc2FtZSBvcmRlci4KLSAqLyAKLXB1YmxpYyBjbGFzcyBYbWxTaW1wbGVMaXN0IGltcGxlbWVudHMgTGlzdCwgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICAKLQlwcml2YXRlIExpc3QgdW5kZXJseWluZzsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGltbXV0YWJsZSBYbWxTaW1wbGVMaXN0IHRoYXQgd3JhcHMgKGRvZXMgbm90IGNvcHkpCi0gICAgICogdGhlIGdpdmVuIHtAbGluayBMaXN0fS4gIEFsbCBub24tbXV0YXRpbmcgbWV0aG9kcyBkZWxlZ2F0ZSB0bwotICAgICAqIHRoZSB1bmRlcmx5aW5nIExpc3QgaW5zdGFuY2UuCi0gICAgICovIAotCXB1YmxpYyBYbWxTaW1wbGVMaXN0KExpc3QgbGlzdCkgICAgIHsgdGhpcy51bmRlcmx5aW5nID0gbGlzdDsgfQotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBsaXN0LiAqLwotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIAkJICAgICAgICAgICAgeyByZXR1cm4gdW5kZXJseWluZy5zaXplKCk7IH0KLSAgICAvKiogVHJ1ZSBpZiB0aGUgbGlzdCBpcyBlbXB0eS4gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgCSAgICAgICAgeyByZXR1cm4gdW5kZXJseWluZy5pc0VtcHR5KCk7IH0KLSAgICAvKiogVHJ1ZSBpZiB0aGUgbGlzdCBpcyBjb250YWlucyBhbiBvYmplY3QgZXF1YWwgdG8gby4gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgICB7IHJldHVybiB1bmRlcmx5aW5nLmNvbnRhaW5zKG8pOyB9Ci0gICAgLyoqIFRydWUgaWYgdGhlIGxpc3QgaXMgY29udGFpbnMgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBnaXZlbiBjb2xsZWN0aW9uLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb24gY29sbCkgeyByZXR1cm4gdW5kZXJseWluZy5jb250YWluc0FsbChjb2xsKTsgfQotICAgIC8qKiBDb3BpZXMgdGhlIGNvbGxlY3Rpb24gdG8gYW4gYXJyYXkuICovCi0gICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSAJICAgICAgICB7IHJldHVybiB1bmRlcmx5aW5nLnRvQXJyYXkoKTsgfQotICAgIC8qKiBDb3BpZXMgdGhlIGNvbGxlY3Rpb24gdG8gYW4gYXJyYXkgb2YgYSBzcGVjaWZpZWQgdHlwZS4gKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhKSB7IHJldHVybiB1bmRlcmx5aW5nLnRvQXJyYXkoYSk7IH0KLSAgICAKLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykgICAgICAgIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGwpIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgICAgIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGwpIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIGNvbGwpIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgICAgICAgICAgICAgICAgIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3QuICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSAgICAgICAgeyByZXR1cm4gdW5kZXJseWluZy5nZXQoaW5kZXgpOyB9Ci0gICAgLyoqIFVuc3VwcG9ydGVkIGJlY2F1c2UgdGhpcyBsaXN0IGlzIGltbXV0YWJsZS4gKi8KLSAgICBwdWJsaWMgT2JqZWN0IHNldChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9Ci0gICAgLyoqIFVuc3VwcG9ydGVkIGJlY2F1c2UgdGhpcyBsaXN0IGlzIGltbXV0YWJsZS4gKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3QgZWxlbWVudCkgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQotICAgIC8qKiBVbnN1cHBvcnRlZCBiZWNhdXNlIHRoaXMgbGlzdCBpcyBpbW11dGFibGUuICovCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoaW50IGluZGV4KSAgICAgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQotICAgIC8qKiBSZXR1cm5zIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cmFuY2Ugb2YgYW4gb2JqZWN0IGVxdWFsIHRvIG8uICovCi0gICAgcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSAgICAgICAgeyByZXR1cm4gdW5kZXJseWluZy5pbmRleE9mKG8pOyB9Ci0gICAgLyoqIFJldHVybnMgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJhbmNlIG9mIGFuIG9iamVjdCBlcXVhbCB0byBvLiAqLwotICAgIHB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG8pICAgIHsgcmV0dXJuIHVuZGVybHlpbmcubGFzdEluZGV4T2Yobyk7IH0KLSAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb24gYykgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQotICAgIC8qKiBSZXR1cm5zIGEgdmlldyBvZiB0aGUgcG9ydGlvbiBvZiB0aGlzIGxpc3QgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIGZyb21JbmRleCwgaW5jbHVzaXZlLCBhbmQgdG9JbmRleCwgZXhjbHVzaXZlLiAqLwotICAgIHB1YmxpYyBMaXN0IHN1Ykxpc3QoaW50IGZyb20sIGludCB0bykgeyByZXR1cm4gbmV3IFhtbFNpbXBsZUxpc3QodW5kZXJseWluZy5zdWJMaXN0KGZyb20sIHRvKSk7IH0KLQotICAgIC8qKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGVsZW1lbnRzIGluIHRoaXMgbGlzdCBpbiBwcm9wZXIgc2VxdWVuY2UuICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkKLSAgICB7IAotICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCkKLSAgICAgICAgeyAKLSAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSB1bmRlcmx5aW5nLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgICAgeyByZXR1cm4gaS5oYXNOZXh0KCk7IH0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIAkgICAgeyByZXR1cm4gaS5uZXh0KCk7IH0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpICAgICAgICB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBlbGVtZW50cyBpbiB0aGlzIGxpc3QgaW4gcHJvcGVyIHNlcXVlbmNlLiAqLwotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKCkgCXsgcmV0dXJuIGxpc3RJdGVyYXRvcigwKTsgfQotICAgIC8qKiBSZXR1cm5zIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgZWxlbWVudHMgaW4gdGhpcyBsaXN0IGluIHByb3BlciBzZXF1ZW5jZSwgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3QuICovCi0gICAgcHVibGljIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoZmluYWwgaW50IGluZGV4KQotICAgIHsgCi0gICAgICAgIHJldHVybiBuZXcgTGlzdEl0ZXJhdG9yKCkKLSAgICAgICAgeyAKLSAgICAgICAgICAgIExpc3RJdGVyYXRvciBpID0gdW5kZXJseWluZy5saXN0SXRlcmF0b3IoaW5kZXgpOwotICAgIAotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpICAgIHsgcmV0dXJuIGkuaGFzTmV4dCgpOyB9Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSAgICAgICAgeyByZXR1cm4gaS5uZXh0KCk7IH0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCl7IHJldHVybiBpLmhhc1ByZXZpb3VzKCk7IH0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcHJldmlvdXMoKSAgICB7IHJldHVybiBpLnByZXZpb3VzKCk7IH0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgbmV4dEluZGV4KCkgICAgICB7IHJldHVybiBpLm5leHRJbmRleCgpOyB9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSAgeyByZXR1cm4gaS5wcmV2aW91c0luZGV4KCk7IH0KLSAgICAKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpICAgICAgICB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IG8pICAgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkKE9iamVjdCBvKSAgIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLSAgICAgICAgfTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3RyaW5nVmFsdWUoT2JqZWN0IG8pCi0gICAgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFNpbXBsZVZhbHVlKQotICAgICAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpbykuc3RyaW5nVmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIGFsbAotICAgICAqIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gIEZvciBtb3N0IGxpc3RzLCB0aGlzIGlzIGEgdmFsaWQgeG1sIGxleGljYWwKLSAgICAgKiB2YWx1ZSBmb3IgdGhlIGxpc3QuIChUaGUgbm90YWJsZSBleGNlcHRpb24gaXMgYSBsaXN0IG9mIFFOYW1lcy4pCi0gICAgICovIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgaW50IHNpemUgPSB1bmRlcmx5aW5nLnNpemUoKTsKLSAgICAgICAgaWYgKHNpemUgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgU3RyaW5nIGZpcnN0ID0gc3RyaW5nVmFsdWUodW5kZXJseWluZy5nZXQoMCkpOwotICAgICAgICBpZiAoc2l6ZSA9PSAxKQotICAgICAgICAgICAgcmV0dXJuIGZpcnN0OwotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihmaXJzdCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKHN0cmluZ1ZhbHVlKHVuZGVybHlpbmcuZ2V0KGkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUd28gWG1sU2ltcGxlTGlzdHMgYXJlIGVxdWFsIGlmIGFsbCB0aGVpciBpdGVtcyBhcmUgZXF1YWwuCi0gICAgICogKFRoZXkgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcywgYW5kIHRoZSBpdGVtcyBtdXN0IGJlIGluCi0gICAgICogdGhlIHNhbWUgb3JkZXIuKQotICAgICAqLyAKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCi0gICAgeyAKLSAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBYbWxTaW1wbGVMaXN0KSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBmaW5hbCBYbWxTaW1wbGVMaXN0IHhtbFNpbXBsZUxpc3QgPSAoWG1sU2ltcGxlTGlzdClvOwotICAgICAgICBMaXN0IHVuZGVybHlpbmcyID0geG1sU2ltcGxlTGlzdC51bmRlcmx5aW5nOwotICAgICAgICBpbnQgc2l6ZSA9IHVuZGVybHlpbmcuc2l6ZSgpOwotICAgICAgICBpZiAoc2l6ZSAhPSB1bmRlcmx5aW5nMi5zaXplKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICB7IAotICAgICAgICAgICAgT2JqZWN0IGl0ZW0gPSB1bmRlcmx5aW5nLmdldChpKTsKLSAgICAgICAgICAgIE9iamVjdCBpdGVtMiA9IHVuZGVybHlpbmcyLmdldChpKTsKLSAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwgPyBpdGVtMiAhPSBudWxsIDogIWl0ZW0uZXF1YWxzKGl0ZW0yKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbWJpbmVzIHRoZSBoYXNoIGNvZGVzIG9mIGFsbCB0aGUgbGlzdCBpdGVtcy4KLSAgICAgKi8gCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgeyAKLSAgICAgICAgaW50IHNpemUgPSB1bmRlcmx5aW5nLnNpemUoKTsKLSAgICAgICAgaW50IGhhc2ggPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgeyAKLSAgICAgICAgICAgIE9iamVjdCBpdGVtID0gdW5kZXJseWluZy5nZXQoaSk7Ci0gICAgICAgICAgICBoYXNoICo9IDE5OwotICAgICAgICAgICAgaGFzaCArPSBpdGVtLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTdHJpbmcuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3YTc4MC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3N0cmluZyI+eHM6c3RyaW5nPC9hPiB0eXBlLgotICogPHA+Ci0gKiBBIGJhc2ljIHN0cmluZyBpbiBYTUwgc2NoZW1hIGlzIG5vdCB3aGl0ZXNwYWNlIG5vcm1hbGl6ZWQuICBJZiB5b3UKLSAqIHdhbnQgeW91ciBzdHJpbmcgdHlwZSB0byBiZSBpbnNlbnNpdGl2ZSB0byB2YXJpYXRpb25zIGluIHJ1bnMgb2YKLSAqIHdoaXRlc3BhY2UsIGNvbnNpZGVyIHVzaW5nIAotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN0b2tlbiI+eHM6dG9rZW48L2E+Ci0gKiAoYWthIHtAbGluayBYbWxUb2tlbn0pIGluc3RlYWQuCi0gKiBUbyBmb3JiaWQgd2hpdGVzcGFjZSBhbmQgcGVybWl0IGp1c3QgYWxwaGFudW1lcmljIGFuZCBvdGhlcgotICogY29tbW9uIGlkZW50aWZpZXIgY2hhcmFjdGVycyBjb25zaWRlcgotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOTVRPS0VOIj54czpOTVRPS0VOPC9hPgotICogKGFrYSB7QGxpbmsgWG1sTk1UT0tFTn0pIGluc3RlYWQuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBTdHJpbmd9LgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxTdHJpbmcgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfc3RyaW5nIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxTdHJpbmd9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFN0cmluZ30gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFN0cmluZ30gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFN0cmluZ30gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsgYXJiaXRyYXJ5IHN0cmluZyAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7IGFyYml0cmFyeSBzdHJpbmcgJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU3RyaW5nfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU3RyaW5nfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVGltZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwYjgzYi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3RpbWUiPnhzOnRpbWU8L2E+IHR5cGUuCi0gKiBBIGdEYXkgc3BlY2lmaWVzIG9ubHkgYSBkYXktb2YtbW9udGguCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBDYWxlbmRhcn0gb3Ige0BsaW5rIEdEYXRlfS4KLSAqIAotICogQHNlZSBYbWxDYWxlbmRhcgotICogQHNlZSBHRGF0ZQotICovIAotcHVibGljIGludGVyZmFjZSBYbWxUaW1lIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX3RpbWUiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfSAqLwotICAgIENhbGVuZGFyIGdldENhbGVuZGFyVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfSAqLwotICAgIHZvaWQgc2V0Q2FsZW5kYXJWYWx1ZShDYWxlbmRhciBjKTsKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlfSAqLwotICAgIEdEYXRlIGdldEdEYXRlVmFsdWUoKTsKLSAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlU3BlY2lmaWNhdGlvbn0gKi8KLSAgICB2b2lkIHNldEdEYXRlVmFsdWUoR0RhdGUgZ2QpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRDYWxlbmRhclZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChDYWxlbmRhciBjKTsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEdEYXRlVmFsdWV9Ci0gICAgICoqLwotICAgIEdEYXRlIGdEYXRlVmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufQotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRHRGF0ZVZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gZ2QpOwotCi0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbFRpbWV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFRpbWV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFRpbWV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFRpbWV9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTI6MDA6MDAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUaW1lIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTI6MDA6MDAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUaW1lIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVGltZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUaW1lIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRpbWV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRpbWV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRpbWV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRpbWV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVGltZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUaW1lIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRpbWV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFRva2VuLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2NjQ5ZC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdG9rZW4iPnhzOnRva2VuPC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jc3RyaW5nIj54czpzdHJpbmc8L2E+LgotICogPHA+Ci0gKiBBIHRva2VuIGlzIFhNTCdzIGJlc3QgcmVwcmVzZW50YXRpb24gZm9yIGEgIndoaXRlc3BhY2UgaW5zZW5zaXRpdmUgc3RyaW5nLiIKLSAqIEFsbCBjYXJyaWFnZSByZXR1cm5zLCBsaW5lZmVlZHMsIGFuZCB0YWJzIGFyZSBjb252ZXJ0ZWQgdG8gb3JkaW5hcnkgc3BhY2UKLSAqIGNoYXJhY3RlcnMgKGFzIHdpdGggPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNub3JtYWxpemVkU3RyaW5nIj54czpub3JtYWxpemVkU3RyaW5nPC9hPiksCi0gKiBhbmQgZnVydGhlcm1vcmUsIGFsbCBjb250aWd1b3VzIHJ1bnMgb2Ygc3BhY2UgYXJlIGNvbGxhcHNlZCB0byBzaW5nbGUgc3BhY2VzLAotICogYW5kIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyBhcmUgdHJpbW1lZC4KLSAqIDxwPgotICogSWYgeW91IHdhbnQgPGNvZGU+IiZuYnNwOyZuYnNwO2hpZ2gmbmJzcDsmbmJzcDtwcmlvcml0eSZuYnNwOyZuYnNwOyI8L2NvZGU+Ci0gKiB0byBiZSBlcXVpdmFsZW50IHRvIDxjb2RlPiJoaWdoIHByaW9yaXR5IjwvY29kZT4sIHlvdSBzaG91bGQgY29uc2lkZXIKLSAqIHVzaW5nIHhzOnRva2VuIG9yIGEgc3VidHlwZSBvZiB4czp0b2tlbi4KLSAqIDxwPgotICogV2hlbiB0aGUge0BsaW5rICNzdHJpbmdWYWx1ZX0gaXMgb2J0YWluZWQgZnJvbSBhbiBYbWxUb2tlbiwgdGhlIG5vcm1hbGl6ZWQsCi0gKiB0cmltbWVkLCB3aGl0ZXNwYWNlIGNvbGxhcHNlZCB2YWx1ZSBpcyByZXR1cm5lZC4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8ge0BsaW5rIFN0cmluZ30uCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFRva2VuIGV4dGVuZHMgWG1sTm9ybWFsaXplZFN0cmluZwotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX3Rva2VuIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxUb2tlbn0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sVG9rZW59ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sVG9rZW59ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sVG9rZW59IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRva2VufSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7c3RyaW5nIHRvIGNvbGxhcHNlJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O3N0cmluZyB0byBjb2xsYXBzZSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRva2VuIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRva2VufSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVG9rZW59IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRva2VuIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVG9rZW59IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0KLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVG9rZW59IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVG9rZW59IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRva2VufSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVG9rZW59IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRva2VuIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxUb2tlblNvdXJjZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFRva2VuU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MTk5NDcuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFRva2VuU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwotCi1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgaG9sZGVyIG9mIFhNTCB0aGF0IGNhbiByZXR1cm4gYW4ge0BsaW5rIFhtbEN1cnNvcn0KLSAqIG9yIGNvcHkgaXRzZWxmIHRvIHZhcmlvdXMgbWVkaWEgc3VjaCBhcwotICoge0BsaW5rIFdyaXRlciBXcml0ZXJzfSBvciB7QGxpbmsgRmlsZSBGaWxlc30uCi0gKiBCb3RoIHtAbGluayBYbWxPYmplY3R9Ci0gKiAoYW5kIHRodXMgYWxsIFhNTCBCZWFucykgYW5kIHtAbGluayBYbWxDdXJzb3J9IGFyZQotICogWG1sVG9rZW5Tb3VyY2UgaW1wbGVtZW50YXRpb25zLgotICogCi0gKiBAc2VlIFhtbE9iamVjdAotICogQHNlZSBYbWxDdXJzb3IKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sVG9rZW5Tb3VyY2UKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzeW5jaHJvbml6YXRpb24gb2JqZWN0IGZvciB0aGUgZG9jdW1lbnQuICBJZiBjb25jdXJyZW50Ci0gICAgICogbXVsdGl0aHJlYWRlZCBhY2Nlc3MgdG8gYSBkb2N1bWVudCBpcyByZXF1aXJlZCwgdGhlIGFjY2VzcyBzaG91bGQgc2hvdWxkCi0gICAgICogYmUgcHJvdGVjdGVkIGJ5IHN5bmNocm9uaXppbmcgb24gdGhpcyBtb25pdG9yKCkgb2JqZWN0LiAgVGhlcmUgaXMgb25lCi0gICAgICogbW9uaXRvciBwZXIgWE1MIGRvY3VtZW50IHRyZWUuCi0gICAgICovCi0gICAgT2JqZWN0IG1vbml0b3IoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBYbWxEb2N1bWVudFByb3BlcnRpZXMgb2JqZWN0IGZvciB0aGUgZG9jdW1lbnQgdGhpcyB0b2tlbgotICAgICAqIHNvdXJjZSBpcyBhc3NvY2lhdGVkIHdpdGguCi0gICAgICovCi0gICAgWG1sRG9jdW1lbnRQcm9wZXJ0aWVzIGRvY3VtZW50UHJvcGVydGllcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBYTUwgY3Vyc29yLgotICAgICAqCi0gICAgICogQSBjdXJzb3IgcHJvdmlkZXMgcmFuZG9tIGFjY2VzcyB0byBhbGwgdGhlIHRva2VucyBpbiB0aGUgWE1MCi0gICAgICogZGF0YSwgcGx1cyB0aGUgYWJpbGl0eSB0byBleHRyYWN0IHN0cm9uZ2x5LXR5cGVkIFhtbE9iamVjdHMKLSAgICAgKiBmb3IgdGhlIGRhdGEuIElmIHRoZSBkYXRhIGlzIG5vdCByZWFkLW9ubHksIHRoZSBYTUwgY3Vyc29yCi0gICAgICogYWxzbyBhbGxvd3MgbW9kaWZpY2F0aW9ucyB0byB0aGUgZGF0YS4KLSAgICAgKgotICAgICAqIFVzaW5nIGEgY3Vyc29yIGZvciB0aGUgZmlyc3QgdGltZSB0eXBpY2FsbHkgZm9yY2VzIHRoZSBYTUwKLSAgICAgKiBkb2N1bWVudCBpbnRvIG1lbW9yeS4KLSAgICAgKi8KLSAgICBYbWxDdXJzb3IgbmV3Q3Vyc29yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IFhtbElucHV0U3RyZWFtLgotICAgICAqCi0gICAgICogVGhlIHN0cmVhbSBzdGFydHMgYXQgdGhlIGN1cnJlbnQgYmVnaW4tdGFnIG9yIGJlZ2luLWRvY3VtZW50Ci0gICAgICogcG9zaXRpb24gYW5kIGVuZHMgYXQgdGhlIG1hdGNoaW5nIGVuZC10YWcgb3IgZW5kLWRvY3VtZW50LgotICAgICAqCi0gICAgICogVGhpcyBpcyBhIGZhaWwtZmFzdCBzdHJlYW0sIHNvIGlmIHRoZSB1bmRlcmx5aW5nIGRhdGEgaXMgY2hhbmdlZAotICAgICAqIHdoaWxlIHRoZSBzdHJlYW0gaXMgYmVpbmcgcmVhZCwgdGhlIHN0cmVhbSB0aHJvd3MgYQotICAgICAqIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24uCi0gICAgICoKLSAgICAgKiBUaHJvd3MgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBYbWxUb2tlblNvdXJjZSBpcyBub3QKLSAgICAgKiBwb3NpdGlvbmVkIGF0IGJlZ2luLXRhZyBvciBiZWdpbi1kb2N1bWVudCAoZS5nLiwgaWYgaXQgaXMgYXQKLSAgICAgKiBhbiBhdHRyaWJ1dGUpLgotICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MwotICAgICAqLwotICAgIFhNTElucHV0U3RyZWFtIG5ld1hNTElucHV0U3RyZWFtKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBzdGFuZGFyZCBYTUwgdGV4dC4KLSAgICAgKgotICAgICAqIFRoZSB0ZXh0IHJldHVybmVkIHJlcHJlc2VudHMgdGhlIGRvY3VtZW50IGNvbnRlbnRzIHN0YXJ0aW5nIGF0Ci0gICAgICogdGhlIGN1cnJlbnQgYmVnaW4tdGFnIG9yIGJlZ2luLWRvY3VtZW50IGFuZCBlbmRpbmcgYXQgdGhlIG1hdGNoaW5nCi0gICAgICogZW5kLXRhZyBvciBlbmQtZG9jdW1lbnQuIFRoaXMgaXMgc2FtZSBjb250ZW50IGFzIG5ld1JlYWRlciwgYnV0Ci0gICAgICogaXQgaXMgcmV0dXJuZWQgYXMgYSBzaW5nbGUgc3RyaW5nLgotICAgICAqCi0gICAgICogVGhyb3dzIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgWG1sVG9rZW5Tb3VyY2UgaXMgbm90Ci0gICAgICogcG9zaXRpb25lZCBhdCBiZWdpbi10YWcgb3IgYmVnaW4tZG9jdW1lbnQgKGUuZy4sIGlmIGl0IGlzIGF0Ci0gICAgICogYW4gYXR0cmlidXRlKS4KLSAgICAgKi8KLSAgICBTdHJpbmcgeG1sVGV4dCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBzdHJlYW0gY29udGFpbmluZyBzdGFuZGFyZCBYTUwgdGV4dCwgZW5jb2RlZAotICAgICAqIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gZW5jb2RpbmcuCi0gICAgICoKLSAgICAgKiBUaGUgYnl0ZSBzdHJlYW0gY29udGFpbnMgY29udGVudHMgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQKLSAgICAgKiBiZWdpbi10YWcgb3IgYmVnaW4tZG9jdW1lbnQgYW5kIGVuZGluZyBhdCB0aGUgbWF0Y2hpbmcKLSAgICAgKiBlbmQtdGFnIG9yIGVuZC1kb2N1bWVudC4gIFRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgaXMgdXNlZAotICAgICAqIGFuZCBhbHNvIGVtaXR0ZWQgaW4gYSBQSSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIGEgZmFpbC1mYXN0IHN0cmVhbSwgc28gaWYgdGhlIHVuZGVybHlpbmcgZGF0YSBpcyBjaGFuZ2VkCi0gICAgICogd2hpbGUgdGhlIHN0cmVhbSBpcyBiZWluZyByZWFkLCB0aGUgc3RyZWFtIHRocm93cyBhCi0gICAgICogQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIFRocm93cyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIFhtbFRva2VuU291cmNlIGlzIG5vdAotICAgICAqIHBvc2l0aW9uZWQgYXQgYmVnaW4tdGFnIG9yIGJlZ2luLWRvY3VtZW50IChlLmcuLCBpZiBpdCBpcyBhdAotICAgICAqIGFuIGF0dHJpYnV0ZSkuCi0gICAgICovCi0gICAgSW5wdXRTdHJlYW0gbmV3SW5wdXRTdHJlYW0oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgY2hhcmFjdGVyIHJlYWRlciBjb250YWluaW5nIFhNTCB0ZXh0LgotICAgICAqCi0gICAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSByZWFkZXIgcmVwcmVzZW50cyB0aGUgZG9jdW1lbnQgY29udGVudHMKLSAgICAgKiBzdGFydGluZyBhdCB0aGUgY3VycmVudCBiZWdpbi10YWcgb3IgYmVnaW4tZG9jdW1lbnQgYW5kIGVuZGluZyBhdAotICAgICAqIHRoZSBtYXRjaGluZyBlbmQtdGFnIG9yIGVuZC1kb2N1bWVudC4gIE5vIGVuY29kaW5nIGFubm90YXRpb24KLSAgICAgKiB3aWxsIGJlIG1hZGUgaW4gdGhlIHRleHQgaXRzZWxmLgotICAgICAqCi0gICAgICogVGhpcyBpcyBhIGZhaWwtZmFzdCByZWFkZXIsIHNvIGlmIHRoZSB1bmRlcmx5aW5nIGRhdGEgaXMgY2hhbmdlZAotICAgICAqIHdoaWxlIHRoZSByZWFkZXIgaXMgYmVpbmcgcmVhZCwgdGhlIHJlYWRlciB0aHJvd3MgYQotICAgICAqIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24uCi0gICAgICoKLSAgICAgKiBUaHJvd3MgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBYbWxUb2tlblNvdXJjZSBpcyBub3QKLSAgICAgKiBwb3NpdGlvbmVkIGF0IGJlZ2luLXRhZyBvciBiZWdpbi1kb2N1bWVudCAoZS5nLiwgaWYgaXQgaXMgYXQKLSAgICAgKiBhbiBhdHRyaWJ1dGUpLgotICAgICAqLwotICAgIFJlYWRlciBuZXdSZWFkZXIoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgVzNDIERPTSBOb2RlIGNvbnRhaW5pbmcgdGhlIFhNTAotICAgICAqIHJlcHJlc2VudGVkIGJ5IHRoaXMgc291cmNlLiAgVGhpcyBpcyBhIGNvcHkgb2YgdGhlIFhNTCwgaXQgaXMKLSAgICAgKiBub3QgYSBsaXZlIHdpdGggdGhlIHVuZGVybHlpbmcgc3RvcmUgb2YgdGhpcyB0b2tlbiBzb3VyY2UuCi0gICAgICogSWYgdGhpcyBpcyB0aGUgZG9jdW1lbnQgbm9kZSwgdGhlbiBhIERvY3VtZW50IGlzIHJldHVybmVkLCBlbHNlCi0gICAgICogYSBEb2N1bWVudEZyYWdtZW50IGlzIHJldHVybmVkLgotICAgICAqLwotICAgIE5vZGUgbmV3RG9tTm9kZSgpOwotCi0vLyAgICAvKioKLS8vICAgICAqIFJldHVybnMgYSBXM0MgRE9NIE5vZGUgY29udGFpbmluZyB0aGUgWE1MIHJlcHJlc2VudGVkIGJ5IHRoaXMgc291cmNlLgotLy8gICAgICogVGhpcyBpcyBhIGxpdmUgRE9NIG5vZGUsIG5vdCBhIGNvcHkuICBBbnkgY2hhbmdlcyBtYWRlIHRocm91Z2ggdGhpcyBub2RlCi0vLyAgICAgKiBhcmUgaW1tZWRpYXRlbHkgcmVmbGVjdGVkIGluIHRoZSBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b2tlbgotLy8gICAgICogc291cmNlLiAgRGVwZW5kaW5nIG9uIHRoZSBraW5kIG9mIHRva2VuIHRoaXMgWG1sVG9rZW5Tb3VyY2UgcmVwcmVzZW50cywKLS8vICAgICAqIGFuIGFwcHJvcHJpYXRlIG5vZGUgd2lsbCBiZSByZXR1cm5lZC4KLS8vICAgICAqLwotLy8gICAgTm9kZSBnZXREb21Ob2RlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gU0FYIGNvbnRlbnQgYW5kCi0gICAgICogbGV4aWNhbCBoYW5kbGVycy4KLSAgICAgKi8KLSAgICB2b2lkIHNhdmUgKCBDb250ZW50SGFuZGxlciBjaCwgTGV4aWNhbEhhbmRsZXIgbGggKSB0aHJvd3MgU0FYRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgWE1MIHJlcHJlc2VudGVkIGJ5IHRoaXMgc291cmNlIHRvIHRoZSBnaXZlbiBGaWxlLgotICAgICAqLwotICAgIHZvaWQgc2F2ZSAoIEZpbGUgZmlsZSApIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KLSAgICAgKi8KLSAgICB2b2lkIHNhdmUgKCBPdXRwdXRTdHJlYW0gb3MgKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gd3JpdGVyLgotICAgICAqLwotICAgIHZvaWQgc2F2ZSAoIFdyaXRlciB3ICkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogPHA+SnVzdCBsaWtlIG5ld1hNTElucHV0U3RyZWFtKCkgYnV0IHdpdGggYW55IG9mIGEgbnVtYmVyIG9mIG9wdGlvbnMuIFVzZSB0aGUgCi0gICAgICogPGVtPm9wdGlvbnM8L2VtPiBwYXJhbWV0ZXIgdG8gc3BlY2lmeSB0aGUgZm9sbG93aW5nOjwvcD4KLSAgICAgKiAKLSAgICAgKiA8dGFibGU+Ci0gICAgICogPHRyPjx0aD5UbyBzcGVjaWZ5IHRoaXM8L3RoPjx0aD5Vc2UgdGhpcyBtZXRob2Q8L3RoPjwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+VGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2Ugd2hlbiBjb252ZXJ0aW5nIHRoZSBjaGFyYWN0ZXIKLSAgICAgKiAgZGF0YSBpbiB0aGUgWE1MIHRvIGJ5dGVzcy48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0Q2hhcmFjdGVyRW5jb2Rpbmd9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDx0cj4KLSAgICAgKiAgPHRkPlByZWZpeC10by1uYW1lc3BhY2UgbWFwcGluZ3MgdGhhdCBzaG91bGQgYmUgYXNzdW1lZAotICAgICAqICB3aGVuIHNhdmluZyB0aGlzIFhNTC4gVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgcmVzdWx0aW5nCi0gICAgICogIFhNTCB3aWxsIGJlIHBhcnQgb2YgYSBsYXJnZXIgWE1MIGRvY3VtZW50LCBlbnN1cmluZyB0aGF0IHRoaXMgCi0gICAgICogIGlubmVyIGRvY3VtZW50IHdpbGwgdGFrZSBhZHZhbnRhZ2Ugb2YgbmFtZXNwYWNlcyBkZWZpbmVkIGluIAotICAgICAqICB0aGUgb3V0ZXIgZG9jdW1lbnQuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVJbXBsaWNpdE5hbWVzcGFjZXN9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDx0cj4KLSAgICAgKiAgPHRkPlN1Z2dlc3RlZCBuYW1lc3BhY2UgcHJlZml4ZXMgdG8gdXNlIHdoZW4gc2F2aW5nLiBVc2VkIG9ubHkKLSAgICAgKiAgd2hlbiBhIG5hbWVzcGFjZSBhdHRyaWJ1dGUgbmVlZHMgdG8gYmUgc3ludGhlc2l6ZWQuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVTdWdnZXN0ZWRQcmVmaXhlc308L3RkPgotICAgICAqIDwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+VGhhdCBuYW1lc3BhY2UgYXR0cmlidXRlcyBzaG91bGQgb2NjdXIgZmlyc3QgaW4gZWxlbWVudHMgd2hlbgotICAgICAqIHRoZSBYTUwgaXMgc2F2ZWQuIEJ5IGRlZmF1bHQsIHRoZXkgb2NjdXIgbGFzdC48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0U2F2ZU5hbWVzcGFjZXNGaXJzdH08L3RkPgotICAgICAqIDwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+VGhlIFhNTCBzaG91bGQgYmUgcHJldHR5IHByaW50ZWQgd2hlbiBzYXZlZC4gTm90ZSB0aGF0IHRoaXMgCi0gICAgICogIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGRlYnVnZ2luZy48L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0U2F2ZVByZXR0eVByaW50fTwvdGQ+Ci0gICAgICogPC90cj4KLSAgICAgKiA8dHI+Ci0gICAgICogIDx0ZD5UaGUgbnVtYmVyIG9mIHNwYWNlcyB0byB1c2Ugd2hlbiBpbmRlbnRpbmcgZm9yIHByZXR0eSBwcmludGluZy4gCi0gICAgICogIFRoZSBkZWZhdWx0IGlzIDIuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVQcmV0dHlQcmludEluZGVudH08L3RkPgotICAgICAqIDwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+VGhlIGFkZGl0aW9uYWwgbnVtYmVyIG9mIHNwYWNlcyBpbmRlbnRlZCBmcm9tIHRoZSBsZWZ0Ci0gICAgICogIGZvciBwcmV0dHkgcHJpbnRlZCBYTUwuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVQcmV0dHlQcmludE9mZnNldH08L3RkPgotICAgICAqIDwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+VG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBuYW1lc3BhY2UgYXR0cmlidXRlcyBnZW5lcmF0ZWQgZm9yIHRoZSAKLSAgICAgKiAgc2F2ZWQgWE1MLiBOb3RlIHRoYXQgdGhpcyBjYW4gcmVkdWNlIHBlcmZvcm1hbmNlIHNpZ25pZmljYW50bHkuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVBZ2dyZXNpdmVOYW1lc3BhY2VzfTwvdGQ+Ci0gICAgICogPC90cj4KLSAgICAgKiA8dHI+Ci0gICAgICogIDx0ZD5UbyByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIHNhdmVkIGRvY3VtZW50Ci0gICAgICogIGJ5IGFsbG93aW5nIHRoZSB1c2Ugb2YgdGhlIGRlZmF1bHQgbmFtZXNwYWNlLiBOb3RlIHRoYXQgdGhpcyBjYW4gCi0gICAgICogIHBvdGVudGlhbGx5IGNoYW5nZSB0aGUgc2VtYW50aWMgbWVhbmluZyBvZiB0aGUgWE1MIGlmIHVucHJlZml4ZWQgUU5hbWVzIGFyZSAKLSAgICAgKiAgcHJlc2VudCBhcyB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlIG9yIGVsZW1lbnQuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFVzZURlZmF1bHROYW1lc3BhY2V9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDx0cj4KLSAgICAgKiAgPHRkPlRvIGZpbHRlciBvdXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgc3BlY2lmaWVkIHRhcmdldCBuYW1lLjwvdGQ+Ci0gICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRTYXZlRmlsdGVyUHJvY2luc3R9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDx0cj4KLSAgICAgKiAgPHRkPkNoYW5nZSB0aGUgUU5hbWUgb2YgdGhlIHN5bnRoZXNpemVkIHJvb3QgZWxlbWVudCB3aGVuIHNhdmluZy4gVGhpcyAKLSAgICAgKiAgcmVwbGFjZXMgInhtbC1mcmFnbWVudCIgd2l0aCAiZnJhZ21lbnQiIGluIHRoZSBuYW1lc3BhY2UgCi0gICAgICogIGh0dHA6Ly93d3cub3BlbnVyaS5vcmcvZnJhZ21lbnQ8L3RkPgotICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0U2F2ZVVzZU9wZW5GcmFnfTwvdGQ+Ci0gICAgICogPC90cj4KLSAgICAgKiA8dHI+Ci0gICAgICogIDx0ZD5TYXZpbmcgc2hvdWxkIGJlZ2luIG9uIHRoZSBlbGVtZW50J3MgY29udGVudHMuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVJbm5lcn08L3RkPgotICAgICAqIDwvdHI+Ci0gICAgICogPHRyPgotICAgICAqICA8dGQ+U2F2aW5nIHNob3VsZCBiZWdpbiBvbiB0aGUgZWxlbWVudCwgcmF0aGVyIHRoYW4gaXRzIGNvbnRlbnRzLjwvdGQ+Ci0gICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRTYXZlT3V0ZXJ9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDx0cj4KLSAgICAgKiAgPHRkPlRvIHJlbmFtZSB0aGUgZG9jdW1lbnQgZWxlbWVudCwgb3IgdG8gc3BlY2lmeSB0aGUgZG9jdW1lbnQgZWxlbWVudAotICAgICAqICBmb3IgdGhpcyBYTUwuPC90ZD4KLSAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVTeW50aGV0aWNEb2N1bWVudEVsZW1lbnR9PC90ZD4KLSAgICAgKiA8L3RyPgotICAgICAqIDwvdGFibGU+Ci0gICAgICogCi0gICAgICogQHNlZSBYbWxPcHRpb25zCi0gICAgICogCi0gICAgICogQHBhcmFtIG9wdGlvbnMgQW55IG9mIHRoZSBkZXNjcmliZWQgb3B0aW9ucy4KLSAgICAgKiBAcmV0dXJuIEEgbmV3IHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczCi0gICAgICovCi0gICAgWE1MSW5wdXRTdHJlYW0gbmV3WE1MSW5wdXRTdHJlYW0oWG1sT3B0aW9ucyBvcHRpb25zKTsKLQotICAgIC8qKgotICAgICAqIEp1c3QgbGlrZSB4bWxUZXh0KCkgYnV0IHdpdGggb3B0aW9ucy4KLSAgICAgKiBPcHRpb25zIG1hcCBtYXkgYmUgbnVsbC4KLSAgICAgKiBAc2VlIFhtbE9wdGlvbnMKLSAgICAgKi8KLSAgICBTdHJpbmcgeG1sVGV4dChYbWxPcHRpb25zIG9wdGlvbnMpOwotICAgIAotICAgIC8qKgotICAgICAqCi0gICAgICogSnVzdCBsaWtlIG5ld0lucHV0U3RyZWFtKFN0cmluZyBlbmNvZGluZykgYnV0IHdpdGggb3B0aW9ucy4KLSAgICAgKiBPcHRpb25zIG1hcCBtYXkgYmUgbnVsbC4KLSAgICAgKiBAc2VlIFhtbE9wdGlvbnMKLSAgICAgKi8KLSAgICBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbShYbWxPcHRpb25zIG9wdGlvbnMpOwotICAgIAotICAgIC8qKgotICAgICAqIEp1c3QgbGlrZSBuZXdSZWFkZXIoKSBidXQgd2l0aCBvcHRpb25zLgotICAgICAqIE9wdGlvbnMgbWFwIG1heSBiZSBudWxsLgotICAgICAqIEBzZWUgWG1sT3B0aW9ucwotICAgICAqLwotICAgIFJlYWRlciBuZXdSZWFkZXIoWG1sT3B0aW9ucyBvcHRpb25zKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBKdXN0IGxpa2UgbmV3RG9tTm9kZSgpIGJ1dCB3aXRoIG9wdGlvbnMuCi0gICAgICogT3B0aW9ucyBtYXAgbWF5IGJlIG51bGwuCi0gICAgICogQHNlZSBYbWxPcHRpb25zCi0gICAgICovCi0KLSAgICBOb2RlIG5ld0RvbU5vZGUoWG1sT3B0aW9ucyBvcHRpb25zKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gU0FYIGNvbnRlbnQgYW5kCi0gICAgICogbGV4aWNhbCBoYW5kbGVycy4KLSAgICAgKi8KLSAgICB2b2lkIHNhdmUgKCBDb250ZW50SGFuZGxlciBjaCwgTGV4aWNhbEhhbmRsZXIgbGgsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBTQVhFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBYTUwgcmVwcmVzZW50ZWQgYnkgdGhpcyBzb3VyY2UgdG8gdGhlIGdpdmVuIEZpbGUuCi0gICAgICovCi0gICAgdm9pZCBzYXZlICggRmlsZSBmaWxlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBYTUwgcmVwcmVzZW50ZWQgYnkgdGhpcyBzb3VyY2UgdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uCi0gICAgICovCi0gICAgdm9pZCBzYXZlICggT3V0cHV0U3RyZWFtIG9zLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gd3JpdGVyLgotICAgICAqLwotICAgIHZvaWQgc2F2ZSAoIFdyaXRlciB3LCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgSU9FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRCeXRlLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRCeXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YmZkZTUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkQnl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZEJ5dGUiPnhzOnVuc2lnbmVkQnl0ZTwvYT4gdHlwZS4KLSAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiPnhzOmRlY2ltYWw8L2E+LgotICogPHA+Ci0gKiBWZXJpZmllZCB0byBiZSBpbiB0aGUgcmFuZ2UgMC4uMjU1IHdoZW4gdmFsaWRhdGluZy4KLSAqIDxwPgotICogQXMgc3VnZ2VzdGVkIGJ5IEpBWEIsIGNvbnZlcnRpYmxlIHRvIEphdmEgc2hvcnQuCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFVuc2lnbmVkQnl0ZSBleHRlbmRzIFhtbFVuc2lnbmVkU2hvcnQKLXsKLSAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV91bnNpZ25lZEJ5dGUiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgc2hvcnQgKi8KLSAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnRWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBzaG9ydCAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNob3J0VmFsdWUoc2hvcnQgcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBzaG9ydAotICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRTaG9ydFZhbHVlfQotICAgICAqKi8KLSAgICBwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHNob3J0Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldFNob3J0VmFsdWV9Ci0gICAgICoqLwotICAgIHB1YmxpYyB2b2lkIHNldChzaG9ydCBzKTsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKLSAgICAgKiBvZiB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkQnl0ZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkQnl0ZSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkQnl0ZSBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkSW50LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRJbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVkMzkzYi4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRJbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKLSAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRJbnQiPnhzOnVuc2lnbmVkSW50PC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCI+eHM6ZGVjaW1hbDwvYT4uCi0gKiA8cD4KLSAqIFZlcmlmaWVkIHRvIGJlIGluIHRoZSByYW5nZSAwLi40Mjk0OTY3Mjk1IHdoZW4gdmFsaWRhdGluZy4KLSAqIDxwPgotICogQ29udmVydGlibGUgdG8gSmF2YSBsb25nLgotICovIAotcHVibGljIGludGVyZmFjZSBYbWxVbnNpZ25lZEludCBleHRlbmRzIFhtbFVuc2lnbmVkTG9uZwotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX3Vuc2lnbmVkSW50Iik7Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIGxvbmcgKi8KLSAgICBsb25nIGdldExvbmdWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBsb25nICovCi0gICAgdm9pZCBzZXRMb25nVmFsdWUobG9uZyB2KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIGxvbmcKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0TG9uZ1ZhbHVlfQotICAgICAqKi8KLSAgICBsb25nIGxvbmdWYWx1ZSgpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGxvbmcKLSAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0TG9uZ1ZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChsb25nIHYpOwotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxVbnNpZ25lZEludH0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sVW5zaWduZWRJbnR9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sVW5zaWduZWRJbnR9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sVW5zaWduZWRJbnR9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2NyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRJbnR9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjM0NTY3Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRJbnR9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEludH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEludH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEludH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEludH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRJbnR9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEludH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBwYXJzZSh3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkTG9uZy5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkTG9uZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDBhZjk3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxVbnNpZ25lZExvbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCi0gKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Vuc2lnbmVkTG9uZyI+eHM6dW5zaWduZWRMb25nPC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCI+eHM6ZGVjaW1hbDwvYT4uCi0gKiA8cD4KLSAqIFZlcmlmaWVkIHRvIGJlIGluIHRoZSByYW5nZSAwLi4yPHN1cGVyPjY0PC9zdXBlcj4tMSB3aGVuIHZhbGlkYXRpbmcuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBCaWdJbnRlZ2VyfS4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgWG1sVW5zaWduZWRMb25nIGV4dGVuZHMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyCi17Ci0gICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfdW5zaWduZWRMb25nIik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcwotICAgICAqIG9mIHtAbGluayBYbWxVbnNpZ25lZExvbmd9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gdmFsdWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgbmV3VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjM0NTY3ODkmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2Nzg5Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQotCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0od2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRTaG9ydC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkU2hvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBkOGMxZS4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRTaG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQotICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZFNob3J0Ij54czp1bnNpZ25lZFNob3J0PC9hPiB0eXBlLgotICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCI+eHM6ZGVjaW1hbDwvYT4uCi0gKiA8cD4KLSAqIFZlcmlmaWVkIHRvIGJlIGluIHRoZSByYW5nZSAwLi42NTUzNSB3aGVuIHZhbGlkYXRpbmcuCi0gKiA8cD4KLSAqIENvbnZlcnRpYmxlIHRvIGEgSmF2YSBpbnQuCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFVuc2lnbmVkU2hvcnQgZXh0ZW5kcyBYbWxVbnNpZ25lZEludAotewotICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX3Vuc2lnbmVkU2hvcnQiKTsKLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGFuIGludCAqLwotICAgIGludCBnZXRJbnRWYWx1ZSgpOwotICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYW4gaW50ICovCi0gICAgdm9pZCBzZXRJbnRWYWx1ZShpbnQgdik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYW4gaW50Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEludFZhbHVlfQotICAgICAqKi8KLSAgICBpbnQgaW50VmFsdWUoKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYW4gaW50Ci0gICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEludFZhbHVlfQotICAgICAqKi8KLSAgICB2b2lkIHNldChpbnQgdik7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCi0gICAgICogb2Yge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9IHZhbHVlICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDUmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZFNob3J0IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDUmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZFNob3J0IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZFNob3J0IHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KLQotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZFNob3J0IHBhcnNlKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgcGFyc2Uod2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL3BhY2thZ2UuaHRtbCBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNzZhODUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+Ci0KLVByb3ZpZGVzIGNsYXNzZXMgZm9yIFhNTCBCZWFucyBzY2hlbWEsIGluZm9zZXQsIHhwYXRoLCBhbmQgeHF1ZXJ5IGhhbmRsaW5nLgotCi08cD4KLVRoZSBYTUwgQmVhbnMgQVBJIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgWE1MIEJlYW5zIDxlbT5zY2hlbWEgY29tcGlsZXI8L2VtPi4KLVRoZSBzY2hlbWEgY29tcGlsZXIgcHJvZHVjZXMgWE1MIEJlYW4gY2xhc3NlcyB0aGF0IGV4dGVuZCBhbmQgaW50ZXJhY3QKLXdpdGggdGhlIGJhc2ljIFhNTCBCZWFuIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgaW4gdGhpcyBwYWNrYWdlLiAgSXQgaXMKLWFsc28gcG9zc2libGUgdG8gdXNlIFhNTCBCZWFucyB3aXRob3V0IHRoZSBzY2hlbWEgY29tcGlsZXIgdG8gbWFuaXB1bGF0ZQotYW5kIHZhbGlkYXRlIFhNTCBpbiBhIGxhdGUtYm91bmQgd2F5ICh3aXRoIG5vIHR5cGVzLCBvciB3aXRoCi1ydW50aW1lLWxvYWRlZCB0eXBlcyBvbmx5KS4KLQotPHA+Ci1UaGlzIHBhY2thZ2UgY29udGFpbnM6Ci08b2w+Ci08bGk+QWxsIHRoZSBidWlsdC1pbiBYTUwgQmVhbiBjbGFzc2VzIAotc3VjaCBhcyB7QGxpbmsgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3R9LCB7QGxpbmsgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlfSwgYW5kCi17QGxpbmsgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnR9Ci0ob25lIGZvciBlYWNoIG9mIHRoZSAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYnVpbHQtaW4tZGF0YXR5cGVzIj40NiBidWlsdC1pbiBYTUwgU2NoZW1hIHR5cGVzPC9hPikuCi08bGk+U3VwcG9ydCBmb3IgZnVsbCBYTUwgaW5mb3NldCwgWFBhdGgsIGFuZCBYUXVlcnkKLSh2aWEge0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yfSwge0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0I3NlbGVjdFBhdGh9IGFuZCByZWxhdGVkIG1ldGhvZHMpLgotPGxpPlN1cHBvcnQgZm9yIGNvbXB1dGF0aW9uIHVzaW5nIFhNTCBTY2hlbWEgZGF0YSB0eXBlcyAodmlhIGRhdGF0eXBlCi1jbGFzc2VzIHN1Y2ggYXMge0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuR0R1cmF0aW9ufSkuCi08bGk+U3VwcG9ydCBmb3Igd29ya2luZyB3aXRoIFhNTCBTY2hlbWEgdHlwZSBtZXRhZGF0YSBpdHNlbGYKLSh2aWEge0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZX0sIHtAbGluayBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW19LCBhbmQgcmVsYXRlZCBjbGFzc2VzKS4KLTwvb2w+Ci0KLTxwPgotVGhlIHBsYWNlIHRvIGJlZ2luIHdoZW4gd29ya2luZyB3aXRoIHRoZSBYTUwgQmVhbnMgQVBJIGlzIHRoZSBmb2xsb3dpbmcKLWZ1bmRhbWVudGFsIGNsYXNzZXM6Ci0KLTxvbD4KLTxsaT57QGxpbmsgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3R9IGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgWE1MIEJlYW5zLgotPGxpPntAbGluayBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdC5GYWN0b3J5fSBpcyB1c2VkIHRvIGxvYWQgYW5kIGNyZWF0ZSBYTUwgQmVhbiBpbnN0YW5jZXMuCi1FYWNoIFhNTCBCZWFuIGNsYXNzIGhhcyBpdHMgb3duIG5lc3RlZCBmYWN0b3J5IGNsYXNzLgotPGxpPntAbGluayBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcn0gaXMgYW4gZWZmaWNpZW50IHRyZWV3YWxraW5nIEFQSSBmb3IgdGhlIGZ1bGwgWE1MIGluZm9zZXQuCi08bGk+e0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZX0gaXMgdGhlIHR5cGUgbWV0YWRhdGEgaW50ZXJmYWNlIGZvciBYTUwgU2NoZW1hIHR5cGVzCi08bGk+e0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnN9IHByb3ZpZGVzIGEgY29sbGVjdGlvbiBvZiB1dGlsaXR5IGZ1bmN0aW9ucy4KLTwvb2w+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzY2hlbWEvc2NoZW1hL1hNTC54c2QgYi92MS9zcmMveG1sc2NoZW1hL3NjaGVtYS9YTUwueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjhhZGQ5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxzY2hlbWEvc2NoZW1hL1hNTC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhRE9DVFlQRSB4czpzY2hlbWEgUFVCTElDICItLy9XM0MvL0RURCBYTUxTQ0hFTUEgMjAwMTAyLy9FTiIgIlhNTFNjaGVtYS5kdGQiID4KLTx4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sOmxhbmc9ImVuIj4KLQotIDx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIFNlZSBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UuaHRtbCBhbmQKLSAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbmFtZXNwYWNlLgotICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gPC94czphbm5vdGF0aW9uPgotCi0gPHhzOmFubm90YXRpb24+Ci0gIDx4czpkb2N1bWVudGF0aW9uPlRoaXMgc2NoZW1hIGRlZmluZXMgYXR0cmlidXRlcyBhbmQgYW4gYXR0cmlidXRlIGdyb3VwCi0gICAgICAgIHN1aXRhYmxlIGZvciB1c2UgYnkKLSAgICAgICAgc2NoZW1hcyB3aXNoaW5nIHRvIGFsbG93IHhtbDpiYXNlLCB4bWw6bGFuZyBvciB4bWw6c3BhY2UgYXR0cmlidXRlcwotICAgICAgICBvbiBlbGVtZW50cyB0aGV5IGRlZmluZS4KLQotICAgICAgICBUbyBlbmFibGUgdGhpcywgc3VjaCBhIHNjaGVtYSBtdXN0IGltcG9ydCB0aGlzIHNjaGVtYQotICAgICAgICBmb3IgdGhlIFhNTCBuYW1lc3BhY2UsIGUuZy4gYXMgZm9sbG93czoKLSAgICAgICAgJmx0O3NjaGVtYSAuIC4gLj4KLSAgICAgICAgIC4gLiAuCi0gICAgICAgICAmbHQ7aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkIi8+Ci0KLSAgICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcwotICAgICAgICBvciB0aGUgZ3JvdXAgZGVmaW5lZCBiZWxvdyB3aWxsIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LCBlLmcuCi0KLSAgICAgICAgJmx0O3R5cGUgLiAuIC4+Ci0gICAgICAgICAuIC4gLgotICAgICAgICAgJmx0O2F0dHJpYnV0ZUdyb3VwIHJlZj0ieG1sOnNwZWNpYWxBdHRycyIvPgotIAotICAgICAgICAgd2lsbCBkZWZpbmUgYSB0eXBlIHdoaWNoIHdpbGwgc2NoZW1hLXZhbGlkYXRlIGFuIGluc3RhbmNlCi0gICAgICAgICBlbGVtZW50IHdpdGggYW55IG9mIHRob3NlIGF0dHJpYnV0ZXM8L3hzOmRvY3VtZW50YXRpb24+Ci0gPC94czphbm5vdGF0aW9uPgotCi0gPHhzOmFubm90YXRpb24+Ci0gIDx4czpkb2N1bWVudGF0aW9uPkluIGtlZXBpbmcgd2l0aCB0aGUgWE1MIFNjaGVtYSBXRydzIHN0YW5kYXJkIHZlcnNpb25pbmcKLSAgIHBvbGljeSwgdGhpcyBzY2hlbWEgZG9jdW1lbnQgd2lsbCBwZXJzaXN0IGF0Ci0gICBodHRwOi8vd3d3LnczLm9yZy8yMDAxLzAzL3htbC54c2QuCi0gICBBdCB0aGUgZGF0ZSBvZiBpc3N1ZSBpdCBjYW4gYWxzbyBiZSBmb3VuZCBhdAotICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkLgotICAgVGhlIHNjaGVtYSBkb2N1bWVudCBhdCB0aGF0IFVSSSBtYXkgaG93ZXZlciBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwKLSAgIGluIG9yZGVyIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhNTCBTY2hlbWEKLSAgIGl0c2VsZi4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGUgWE1MIFNjaGVtYSBuYW1lc3BhY2UgY2hhbmdlcywgdGhlIHZlcnNpb24KLSAgIG9mIHRoaXMgZG9jdW1lbnQgYXQKLSAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCB3aWxsIGNoYW5nZQotICAgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0Ci0gICBodHRwOi8vd3d3LnczLm9yZy8yMDAxLzAzL3htbC54c2Qgd2lsbCBub3QgY2hhbmdlLgotICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gPC94czphbm5vdGF0aW9uPgotCi0gPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4czpsYW5ndWFnZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+SW4gZHVlIGNvdXJzZSwgd2Ugc2hvdWxkIGluc3RhbGwgdGhlIHJlbGV2YW50IElTTyAyLSBhbmQgMy1sZXR0ZXIKLSAgICAgICAgIGNvZGVzIGFzIHRoZSBlbnVtZXJhdGVkIHBvc3NpYmxlIHZhbHVlcyAuIC4gLjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6YXR0cmlidXRlPgotCi0gPHhzOmF0dHJpYnV0ZSBuYW1lPSJzcGFjZSIgZGVmYXVsdD0icHJlc2VydmUiPgotICA8eHM6c2ltcGxlVHlwZT4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOQ05hbWUiPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGVmYXVsdCIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJlc2VydmUiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSA8L3hzOmF0dHJpYnV0ZT4KLQotIDx4czphdHRyaWJ1dGUgbmFtZT0iYmFzZSIgdHlwZT0ieHM6YW55VVJJIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj5TZWUgaHR0cDovL3d3dy53My5vcmcvVFIveG1sYmFzZS8gZm9yCi0gICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGF0dHJpYnV0ZS48L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmF0dHJpYnV0ZT4KLQotIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJzcGVjaWFsQXR0cnMiPgotICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOmJhc2UiLz4KLSAgPHhzOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+Ci0gIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6c3BhY2UiLz4KLSA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvQ3Vyc29yLmphdmEgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0N1cnNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWFkMzNhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvQ3Vyc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YTUxDaGFyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uR2xvYmFsTG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU2F2ZXIuWG1sSW5wdXRTdHJlYW1JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5BdHRyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5CZWdpbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQ29tbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQ3Vyc29yR29vYmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5Hb29iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5LlByb2NpbnN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5YbWxuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5DaGFuZ2VTdGFtcDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEb2N1bWVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxSdW50aW1lRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDdXJzb3IgaW1wbGVtZW50cyBYbWxDdXJzb3IsIENoYW5nZUxpc3RlbmVyCi17Ci0gICAgQ3Vyc29yICggUm9vdCByLCBTcGxheSBzICkgICAgICAgIHsgYXNzZXJ0IHMgIT0gbnVsbDsgX2dvb2JlciA9IG5ldyBDdXJzb3JHb29iZXIoIHIgKTsgc2V0KCBzICk7IH0KLSAgICBDdXJzb3IgKCBSb290IHIsIFNwbGF5IHMsIGludCBwICkgeyBhc3NlcnQgcyAhPSBudWxsOyBfZ29vYmVyID0gbmV3IEN1cnNvckdvb2JlciggciApOyBzZXQoIHMsIHAgKTsgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUgKCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgcHVibGljIE9iamVjdCBtb25pdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRSb290KCk7Ci0gICAgfQotCi0gICAgUm9vdCAgZ2V0Um9vdCAoICkgeyByZXR1cm4gX2dvb2Jlci5nZXRSb290KCk7IH0KLQotICAgIFNwbGF5IGdldFNwbGF5ICggKSB7IHJldHVybiBfZ29vYmVyLmdldFNwbGF5KCk7IH0KLSAgICBpbnQgICBnZXRQb3MgICAoICkgeyByZXR1cm4gX2dvb2Jlci5nZXRQb3MoKTsgfQotICAgIAotICAgIHZvaWQgc2V0ICggU3BsYXkgcywgaW50IHAgKSB7IF9nb29iZXIuc2V0KCBzLCBwICk7IH0KLSAgICB2b2lkIHNldCAoIFNwbGF5IHMgICAgICAgICkgeyBfZ29vYmVyLnNldCggcywgMCApOyB9Ci0gICAgdm9pZCBzZXQgKCBpbnQgcCAgICAgICAgICApIHsgX2dvb2Jlci5zZXQoIHAgKTsgfQotICAgIHZvaWQgc2V0ICggR29vYmVyIGcgICAgICAgKSB7IF9nb29iZXIuc2V0KCBnICk7IH0KLQotICAgIGludCBnZXRQb3N0Q2NoICggKQotICAgIHsKLSAgICAgICAgaW50IHAgPSBnZXRQb3MoKTsKLQotICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgIAotICAgICAgICBpbnQgcGEgPSBzLmdldFBvc0FmdGVyKCk7Ci0KLSAgICAgICAgYXNzZXJ0IHAgPj0gcGEgfHwgcy5pc0xlYWYoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwID49IHBhID8gcy5nZXRDY2hBZnRlcigpIC0gcCArIHBhIDogcy5nZXRQb3NMZWFmRW5kKCkgLSBwOwotICAgIH0KLSAgICAKLSAgICBpbnQgZ2V0UHJlQ2NoICggKQotICAgIHsKLSAgICAgICAgLy8gVE9ETyAtIHF1aWNrIGFuZCBkaXJ0eSBpbXBsLCBpbXByb3ZlCi0KLSAgICAgICAgU3BsYXkgc09yaWcgPSBnZXRTcGxheSgpOwotICAgICAgICBpbnQgICBwT3JpZyA9IGdldFBvcygpOwotCi0gICAgICAgIGludCBuID0gdG9QcmV2Q2hhciggLTEgKTsKLQotICAgICAgICBzZXQoIHNPcmlnLCBwT3JpZyApOwotCi0gICAgICAgIHJldHVybiBuOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY2hlY2tEaXNwb3NlZCAoICkKLSAgICB7Ci0gICAgICAgIGNoZWNrRGlzcG9zZWQoIHRoaXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0Rpc3Bvc2VkICggQ3Vyc29yIGMgKQotICAgIHsKLSAgICAgICAgaWYgKGMuaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIkN1cnNvciBoYXMgYmVlbiBkaXNwb3NlZCIgKTsKLSAgICB9Ci0gICAgCi0gICAgYm9vbGVhbiBpc0Rpc3Bvc2VkICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFNwbGF5KCkgPT0gbnVsbDsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIFhtbEN1cnNvciBNZXRob2RzCi0gICAgLy8KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbGVhclNlbGVjdGlvbnMoKTsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAoX3N0YWNrICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIF9zdGFjay5kaXNwb3NlKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgc2V0KCAoU3BsYXkpIG51bGwgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgZ2V0T2JqZWN0ICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgIGlmICghcy5pc1R5cGVhYmxlKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgICAgICAgICBUeXBlIHQgPSBzLmdldFR5cGUoIHIgKTsKLSAgICAKLSAgICAgICAgICAgIGFzc2VydCB0ICE9IG51bGw7Ci0gICAgCi0gICAgICAgICAgICBYbWxPYmplY3QgcmVzdWx0ID0gdC5nZXRYbWxPYmplY3QoKTsKLSAgICAgICAgICAgIGFzc2VydCByZXN1bHQgIT0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gdG9DdXJzb3IgKCBYbWxDdXJzb3IgbW92ZVRvICkKLSAgICB7Ci0gICAgICAgIGlmIChtb3ZlVG8gPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJJbnZhbGlkIGRlc3RpbmF0aW9uIGN1cnNvciIgKTsKLQotICAgICAgICBpZiAobW9uaXRvcigpID09IG1vdmVUby5tb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRvQ3Vyc29ySW1wbCggbW92ZVRvICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGFjcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW92ZVRvLm1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9DdXJzb3JJbXBsKCBtb3ZlVG8gKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYWNxdWlyZWQpCi0gICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiB0b0N1cnNvckltcGwgKCBYbWxDdXJzb3IgbW92ZVRvICkKLSAgICB7Ci0gICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgCi0gICAgICAgIEN1cnNvciBjID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmIChtb3ZlVG8gaW5zdGFuY2VvZiBDdXJzb3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGMgPSAoQ3Vyc29yKSBtb3ZlVG87Ci0KLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoIGMgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGMuZ2V0Um9vdCgpICE9IGdldFJvb3QoKSkKLSAgICAgICAgICAgICAgICBjID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBzZXQoIGMuX2dvb2JlciApOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgWG1sRG9jdW1lbnRQcm9wZXJ0aWVzIGRvY3VtZW50UHJvcGVydGllcyAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiBnZXRSb290KCkuZG9jdW1lbnRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFhtbEN1cnNvciBuZXdDdXJzb3IgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEN1cnNvciggZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHRvQm9va21hcmsgKCBYbWxCb29rbWFyayBibSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChibSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIGlmICghKGJtLl9jdXJyZW50TWFyayBpbnN0YW5jZW9mIEFubm90YXRpb24pKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIEFubm90YXRpb24gYSA9IChBbm5vdGF0aW9uKSBibS5fY3VycmVudE1hcms7Ci0gICAgCi0gICAgICAgICAgICBpZiAoYS5nZXRSb290KCkgIT0gZ2V0Um9vdCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIGFzc2VydCBhLmdldFNwbGF5KCkgIT0gbnVsbDsKLSAgICAKLSAgICAgICAgICAgIHNldCggYSApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFhtbEJvb2ttYXJrIHRvTmV4dEJvb2ttYXJrICggT2JqZWN0IGtleSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzT3JpZyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBpbnQgICBwT3JpZyA9IGdldFBvcygpOwotICAgIAotICAgICAgICAgICAgVG9rZW5UeXBlIHR0ID0gY3VycmVudFRva2VuVHlwZSgpOwotICAgIAotICAgICAgICAgICAgLy8gQWR2YW5jZSB0aGUgY3Vyc29yIHBhc3QgdGhlIGN1cnJlbnQgc3BvdCBieSB0aGUgbWluaW11biBhbW91bnQKLSAgICAKLSAgICAgICAgICAgIGlmICh0dC5pc1RleHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0b05leHRDaGFyKCAxICk7Ci0gICAgICAgICAgICAgICAgdHQgPSBjdXJyZW50VG9rZW5UeXBlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgodHQgPSB0b05leHRUb2tlbigpKS5pc05vbmUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZXQoIHNPcmlnLCBwT3JpZyApOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYbWxCb29rbWFyayBibSA9IGdldEJvb2ttYXJrKCBrZXkgKTsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAoYm0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJtOwotICAgIAotICAgICAgICAgICAgICAgIGludCBwb3N0Q2NoOwotICAgIAotICAgICAgICAgICAgICAgIGlmICh0dC5pc1RleHQoKSAmJiAocG9zdENjaCA9IGdldFBvc3RDY2goKSkgPiAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgZCA9IHBvc3RDY2g7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIEdvb2JlciBnID0gcy5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IHMubmV4dEdvb2JlciggZyApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxCb29rbWFyayBtYXJrOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcuaXNBbm5vdGF0aW9uKCkgJiYgKGRpc3QgPSBnLmdldFBvcygpIC0gcCkgPiAxICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgPCBkICYmIChtYXJrID0gZy5nZXRCb29rbWFyaygpKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrLmdldEtleSgpLmVxdWFscygga2V5ICkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm0gPSBtYXJrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkaXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXQoIHMsIHAgKyBkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCh0dCA9IHRvTmV4dFRva2VuKCkpLmlzTm9uZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0KCBzT3JpZywgcE9yaWcgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEJvb2ttYXJrIHRvUHJldkJvb2ttYXJrICggT2JqZWN0IGtleSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzT3JpZyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBpbnQgICBwT3JpZyA9IGdldFBvcygpOwotICAgIAotICAgICAgICAgICAgVG9rZW5UeXBlIHR0ID0gcHJldlRva2VuVHlwZSgpOwotICAgIAotICAgICAgICAgICAgLy8gUmV0cmVhdCB0aGUgY3Vyc29yIHBhc3QgdGhlIGN1cnJlbnQgc3BvdCBieSB0aGUgbWluaW11biBhbW91bnQKLSAgICAKLSAgICAgICAgICAgIGlmICh0dC5pc1RleHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0b1ByZXZDaGFyKCAxICk7Ci0gICAgICAgICAgICAgICAgdHQgPSBwcmV2VG9rZW5UeXBlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0b1ByZXZUb2tlbigpLmlzTm9uZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNldCggc09yaWcsIHBPcmlnICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdHQgPSBwcmV2VG9rZW5UeXBlKCk7Ci0gICAgCi0gICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbEJvb2ttYXJrIGJtID0gZ2V0Qm9va21hcmsoIGtleSApOwotICAgIAotICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm07Ci0gICAgCi0gICAgICAgICAgICAgICAgaW50IHByZUNjaDsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAodHQuaXNUZXh0KCkgJiYgKHByZUNjaCA9IGdldFByZUNjaCgpKSA+IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTcGxheSBzOwotICAgICAgICAgICAgICAgICAgICBpbnQgICBwOwotICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGdldFNwbGF5KCkucHJldk5vbkF0dHJTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHMuZ2V0RW5kUG9zKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBnZXRQb3MoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaW50IGQgPSBwcmVDY2g7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIEdvb2JlciBnID0gcy5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IHMubmV4dEdvb2JlciggZyApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxCb29rbWFyayBtYXJrOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcuaXNBbm5vdGF0aW9uKCkgJiYgKGRpc3QgPSBwIC0gZy5nZXRQb3MoKSkgPiAxICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgPCBkICYmIChtYXJrID0gZy5nZXRCb29rbWFyaygpKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrLmdldEtleSgpLmVxdWFscygga2V5ICkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm0gPSBtYXJrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkaXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXQoIHMsIHAgLSBkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHR0LmlzVGV4dCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG9QcmV2Q2hhciggLTEgKTsKLSAgICAgICAgICAgICAgICAgICAgdHQgPSBwcmV2VG9rZW5UeXBlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRvUHJldlRva2VuKCkuaXNOb25lKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZXQoIHNPcmlnLCBwT3JpZyApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB0dCA9IHByZXZUb2tlblR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVG9rZW5UeXBlIGN1cnJlbnRUb2tlblR5cGUgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBnZXRTcGxheSgpLmdldFRva2VuVHlwZSggZ2V0UG9zKCkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0ZG9jICAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzU3RhcnRkb2MoKTsgfQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5kZG9jICAgICggKSB7IHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCkuaXNFbmRkb2MoKTsgfQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnQgICAgICggKSB7IHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCkuaXNTdGFydCgpOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaXNFbmQgICAgICAgKCApIHsgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKS5pc0VuZCgpOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaXNUZXh0ICAgICAgKCApIHsgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKS5pc1RleHQoKTsgfQotICAgIHB1YmxpYyBib29sZWFuIGlzQXR0ciAgICAgICggKSB7IHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCkuaXNBdHRyKCk7IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZSAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzTmFtZXNwYWNlKCk7IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbW1lbnQgICAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzQ29tbWVudCgpOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaXNQcm9jaW5zdCAgKCApIHsgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKS5pc1Byb2NpbnN0KCk7IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lciAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzQ29udGFpbmVyKCk7IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaCAgICAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzRmluaXNoKCk7IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FueUF0dHIgICAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzQW55QXR0cigpOyB9Ci0gICAgCi0gICAgcHVibGljIFRva2VuVHlwZSBwcmV2VG9rZW5UeXBlICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgLy8gVE9ETyAtIHF1aWNrIGFuZCBkaXJ0eSBpbXBsZW1lbnRhdGlvbiwgaW1wcm92ZQotICAgIAotICAgICAgICAgICAgU3BsYXkgc09yaWcgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcE9yaWcgPSBnZXRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIFRva2VuVHlwZSB0dDsKLSAgICAKLSAgICAgICAgICAgIGlmICh0b1ByZXZDaGFyKCAxICkgPT0gMSkKLSAgICAgICAgICAgICAgICB0dCA9IFRva2VuVHlwZS5URVhUOwotICAgICAgICAgICAgZWxzZSBpZiAoISh0dCA9IHRvUHJldlRva2VuKCkpLmlzTm9uZSgpKQotICAgICAgICAgICAgICAgIHR0ID0gY3VycmVudFRva2VuVHlwZSgpOwotICAgIAotICAgICAgICAgICAgc2V0KCBzT3JpZywgcE9yaWcgKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiB0dDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVG9rZW5UeXBlIHRvTmV4dFRva2VuICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTcGxheSBvcyA9IGdldFNwbGF5KCk7IC8vIE9yaWduYWwgc3BsYXkKLSAgICAgICAgICAgIFNwbGF5IHMgPSBvczsKLSAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChwID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNSb290KCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUb2tlblR5cGUuTk9ORTsKLSAgICAKLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIExvb2sgc2VlIGlmIHRoZXJlIGlzIGFuIGF0dHIgd2Ugc2hvdWxkIHZpc2l0IGJlZm9yZSB2aXNpdGluZwotICAgICAgICAgICAgICAgIC8vIGFueSBmb2xsb3dpbmcgY29udGVudCBpbiB0aGlzIGNvbnRhaW5lci4KLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTcGxheSB0ID0gcy5uZXh0U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldCggdCwgMCApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSdyZSBnb2luZyBpbnRvIHRoZSBjb250ZW50IG9mIHRoaXMgY29udGFpbmVyLiAgRmx1c2gKLSAgICAgICAgICAgICAgICAgICAgLy8gb3V0IGFueSBjYWNoZWQgdHlwZSB2YWx1ZS4KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgcy5lbnN1cmVDb250ZW50VmFsaWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHMuZ2V0TWF4UG9zKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICBwID0gMTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgcCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBwID4gMDsKLSAgICAgICAgICAgICAgICBhc3NlcnQgIXMuaXNSb290KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHAgPj0gcy5nZXRQb3NBZnRlcigpICYmIHMuZ2V0Q2NoQWZ0ZXIoKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgcCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzTGVhZigpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcCA8IHMuZ2V0UG9zQWZ0ZXIoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHAgIT0gcy5nZXRQb3NMZWFmRW5kKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBwID0gcy5nZXRQb3NMZWFmRW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMuZ2V0Q2NoQWZ0ZXIoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBwID0gcy5nZXRQb3NBZnRlcigpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLm5leHRTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSWYgd2UgYXJlIHRyYW5zaXRpb25pbmcgZnJvbSBhbiBhdHRyIHRvIGEgbm9uIGF0dHIsIHNlZSBpZiB0aGVyZQotICAgICAgICAgICAgLy8gaXMgY29udGVudCBpbiBhIERPQyBvciBCRUdJTiB3aGljaCBuZWVkcyB0byBiZSB2aXNpdGVkIGFmdGVyCi0gICAgICAgICAgICAvLyB0aGUgYXR0cmlidXRlcy4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBBbHNvLCBpZiB3ZSBhcmUgdHJhbnNpdGlvbmluZyBmcm9tIGFuIGF0dHIgY29udGFpbmVyIChCRUdJTiBvcgotICAgICAgICAgICAgLy8gRE9DKSB0byBhbiBhdHRyLCB3aGVyZSB0aGUgYXR0ciBjb250YWluZXIgaGFzIGludGVyaW9yIGNvbnRlbnQsCi0gICAgICAgICAgICAvLyB3ZSBoYXZlIGFscmVhZHkgdmlzaXRlZCB0aGUgYXR0cnMgYW5kIG11c3Qgc2tpcCB0aGVtIG5vdy4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBBbHNvLCBpZiB3ZSBhcmUgdHJhbnNpdGlvbmluZyBmcm9tIHBvcyAwIHRvIHBvcyAxIG9uIGFuIGF0dHIKLSAgICAgICAgICAgIC8vIGNvbnRhaW5lciwgd2UgbmVlZCB0byB2aXNpdCBhbnkgYXR0cmlidXRlcyBiZWZvcmUgdmlzaXRpbmcgdGhlCi0gICAgICAgICAgICAvLyBpbnRlcmlvciBjb250ZW50IG9mIHRoZSBhdHRyIGNvbnRhaW5lci4KLSAgICAgICAgICAgIC8vCi0gICAgCi0gICAgICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghcy5pc0F0dHIoKSAmJiBvcy5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNwbGF5IHQgPSBvcy5wcmV2Tm9uQXR0clNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydCB0LmlzQ29udGFpbmVyKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5hdmlnYXRpbmcgdG8gdGhlIGNvbnRlbnQgb2YgYSBjb250YWluZXIuICBGbHVzaAotICAgICAgICAgICAgICAgICAgICAvLyBvdXQgYW55IGNhY2hlZCB0eXBlIHZhbHVlLgotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdC5lbnN1cmVDb250ZW50VmFsaWQoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuZ2V0TWF4UG9zKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHAgPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNBdHRyKCkgJiYgIW9zLmlzQXR0cigpICYmIG9zLmdldE1heFBvcygpID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBvcy5pc0NvbnRhaW5lcigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICBzID0gcy5uZXh0Tm9uQXR0clNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgc2V0KCBzLCBwICk7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFRva2VuVHlwZSB0b1ByZXZUb2tlbiAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIAotICAgIC8vIFRPRE8gLSBUaGlzIGNvZGUgaXMgbm90IGFzIGNvbXBhY3QgYXMgaXQgY2FuIGJlLCB0aGVyZSBpcyBzb21lIHJlZHVuZGFuY3kKLSAgICAvLyAtLSByZXRoaW5rIGl0IGxhdGVyIC4uLgotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBpbnQgICBwID0gZ2V0UG9zKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAocCA9PSAxICYmIHMuaXNJbnZhbGlkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNMZWFmKCk7Ci0gICAgICAgICAgICAgICAgcCArPSBzLmVuc3VyZUNvbnRlbnRWYWxpZCgpOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKHAgPT0gMSAmJiBzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3BsYXkgdCA9IHMubmV4dFNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHQuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzID0gdDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIHQgPSB0Lm5leHRTcGxheSgpIDsgdC5pc0F0dHIoKSA7IHQgPSB0Lm5leHRTcGxheSgpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHMgPSB0OwotICAgIAotICAgICAgICAgICAgICAgICAgICBzZXQoIHMsIDAgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKHAgPT0gMCAmJiAhcy5pc0F0dHIoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc0RvYygpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW5UeXBlLk5PTkU7Ci0gICAgCi0gICAgICAgICAgICAgICAgU3BsYXkgdCA9IHMucHJldlNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHQuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0ID0gdC5wcmV2Tm9uQXR0clNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydCB0LmlzQ29udGFpbmVyKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGlmICh0LmlzRG9jKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0LmVuc3VyZUNvbnRlbnRWYWxpZCgpOwotICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAodC5nZXRNYXhQb3MoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZ2V0Q2NoQWZ0ZXIoKSA+IDAgPyB0LmdldFBvc0FmdGVyKCkgOiB0LmdldE1heFBvcygpICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKHMuaXNBdHRyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHAgPT0gMDsKLSAgICAKLSAgICAgICAgICAgICAgICBTcGxheSB0ID0gcy5wcmV2U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAoIXQuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgdC5pc0NvbnRhaW5lcigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICBzZXQoIHQsIDAgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzRG9jKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUb2tlblR5cGUuTk9ORTsKLSAgICAKLSAgICAgICAgICAgICAgICBzID0gcy5wcmV2U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAocy5pc0RvYygpKQotICAgICAgICAgICAgICAgICAgICBzLmVuc3VyZUNvbnRlbnRWYWxpZCgpOwotICAgIAotICAgICAgICAgICAgICAgIHAgPSBzLmdldENjaEFmdGVyKCkgPiAwID8gcy5nZXRQb3NBZnRlcigpIDogcy5nZXRNYXhQb3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcCA+IDA7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0ICFzLmlzUm9vdCgpOwotICAgIAotICAgICAgICAgICAgICAgIGludCBwb3NBZnRlciA9IHMuZ2V0UG9zQWZ0ZXIoKTsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAocCA+PSBwb3NBZnRlcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENjaEFmdGVyKCkgPiAwOwotICAgICAgICAgICAgICAgICAgICBwID0gcG9zQWZ0ZXIgLSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc1ZhbGlkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzTGVhZigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcCA9IHAgPiAxICYmIHAgPT0gcG9zQWZ0ZXIgLSAxID8gMSA6IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgc2V0KCBzLCBwICk7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0Q2hhcnMgKCBTdHJpbmcgdGV4dCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzRG9jKCkgfHwgcy5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIkludmFsaWQgbG9jYXRpb24gZm9yIHRleHQiICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgcyA9IHMucHJldk5vbkF0dHJTcGxheSgpOwotICAgICAgICAgICAgICAgIHAgPSBzLmdldEVuZFBvcygpOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgICAgICAgICBpbnQgY2NoID0gdGV4dC5sZW5ndGgoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChjY2ggPiAwKQotICAgICAgICAgICAgICAgIHMuaW5zZXJ0Q2hhcnMoIHAsIGdldFJvb3QoKSwgdGV4dCwgMCwgY2NoICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlTG9jYWxOYW1lICggUU5hbWUgbmFtZSApCi0gICAgewotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIlFOYW1lIGlzIG51bGwiICk7Ci0gICAgICAgIAotICAgICAgICB2YWxpZGF0ZUxvY2FsTmFtZSggbmFtZS5nZXRMb2NhbFBhcnQoKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVMb2NhbE5hbWUgKCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIk5hbWUgaXMgbnVsbCIgKTsKLQotICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIk5hbWUgaXMgZW1wdHkiICk7Ci0KLSAgICAgICAgaWYgKCFYTUxDaGFyLmlzVmFsaWROQ05hbWUoIG5hbWUgKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJOYW1lIGlzIG5vdCB2YWxpZCIgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlUHJlZml4ICggU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJQcmVmaXggaXMgbnVsbCIgKTsKLQotICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIlByZWZpeCBpcyBlbXB0eSIgKTsKLQotICAgICAgICBpZiAoU3BsYXkuYmVnaW5zV2l0aFhtbCggbmFtZSApKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIlByZWZpeCBiZWdpbnMgd2l0aCAneG1sJyIgKTsKLQotICAgICAgICBpZiAoIVhNTENoYXIuaXNWYWxpZE5DTmFtZSggbmFtZSApKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIlByZWZpeCBpcyBub3QgdmFsaWQiICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluc2VydEF0dHJpYnV0ZSAoIFFOYW1lIG5hbWUsIFN0cmluZyB2YWx1ZSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpbnNlcnQoIG5ldyBBdHRyKCBuYW1lICksIHZhbHVlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRBdHRyaWJ1dGUgKCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBpbnNlcnRBdHRyaWJ1dGVXaXRoVmFsdWUoIG5hbWUsIG51bGwsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRBdHRyaWJ1dGUgKCBTdHJpbmcgbmFtZSwgU3RyaW5nIHVyaSApCi0gICAgewotICAgICAgICBpbnNlcnRBdHRyaWJ1dGVXaXRoVmFsdWUoIG5hbWUsIHVyaSwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluc2VydEF0dHJpYnV0ZVdpdGhWYWx1ZSAoIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUgKQotICAgIHsKLSAgICAgICAgaW5zZXJ0QXR0cmlidXRlV2l0aFZhbHVlKCBuYW1lLCBudWxsLCB2YWx1ZSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluc2VydEF0dHJpYnV0ZVdpdGhWYWx1ZSAoCi0gICAgICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgdXJpLCBTdHJpbmcgdmFsdWUgKQotICAgIHsKLSAgICAgICAgdmFsaWRhdGVMb2NhbE5hbWUoIG5hbWUgKTsKLQotICAgICAgICBpbnNlcnRBdHRyaWJ1dGUoIG5ldyBRTmFtZSggdXJpLCBuYW1lICksIHZhbHVlICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0QXR0cmlidXRlICggUU5hbWUgbmFtZSApCi0gICAgewotICAgICAgICB2YWxpZGF0ZUxvY2FsTmFtZSggbmFtZSApOwotCi0gICAgICAgIGluc2VydEF0dHJpYnV0ZSggbmFtZSwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluc2VydEF0dHJpYnV0ZVdpdGhWYWx1ZSAoIFFOYW1lIG5hbWUsIFN0cmluZyB2YWx1ZSApCi0gICAgewotICAgICAgICB2YWxpZGF0ZUxvY2FsTmFtZSggbmFtZSApOwotCi0gICAgICAgIGluc2VydEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnROYW1lc3BhY2UgKCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBwcmVmaXggPSAiIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKHByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVQcmVmaXgoIHByZWZpeCApOwotICAgIAotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9ICIiOwotICAgIAotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5sZW5ndGgoKSA9PSAwICYmIHByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBtYXAgYSBwcmVmaXggdG8gbm8gbmFtZXNwYWNlIiApOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaW5zZXJ0KCBuZXcgWG1sbnMoIG5ldyBRTmFtZSggbmFtZXNwYWNlLCBwcmVmaXggKSApLCBudWxsICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRDb21tZW50ICggU3RyaW5nIHZhbHVlICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGluc2VydCggbmV3IENvbW1lbnQoKSwgdmFsdWUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluc2VydFByb2NJbnN0ICggU3RyaW5nIHRhcmdldCwgU3RyaW5nIHZhbHVlICkKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlUHJlZml4KCB0YXJnZXQgKTsgLy8gdXNlZCBiZWN1YXNlICI8P3htbC4uLj8+IGlzIGRpc2FsbG93ZWQKLSAgICAKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaW5zZXJ0KCBuZXcgUHJvY2luc3QoIHRhcmdldCApLCB2YWx1ZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0RWxlbWVudCAoIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIGluc2VydEVsZW1lbnRXaXRoVGV4dCggbmFtZSwgbnVsbCwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluc2VydEVsZW1lbnRXaXRoVGV4dCAoIFN0cmluZyBuYW1lLCBTdHJpbmcgdGV4dCApCi0gICAgewotICAgICAgICBpbnNlcnRFbGVtZW50V2l0aFRleHQoIG5hbWUsIG51bGwsIHRleHQgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRFbGVtZW50ICggU3RyaW5nIG5hbWUsIFN0cmluZyB1cmkgKQotICAgIHsKLSAgICAgICAgaW5zZXJ0RWxlbWVudFdpdGhUZXh0KCBuYW1lLCB1cmksIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0RWxlbWVudCAoIFFOYW1lIG5hbWUgKQotICAgIHsKLSAgICAgICAgaW5zZXJ0RWxlbWVudFdpdGhUZXh0KCBuYW1lLCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGJlZ2luRWxlbWVudCAoIFFOYW1lIG5hbWUgKQotICAgIHsKLSAgICAgICAgaW5zZXJ0RWxlbWVudCggbmFtZSApOwotICAgICAgICB0b1ByZXZUb2tlbigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBiZWdpbkVsZW1lbnQgKCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBpbnNlcnRFbGVtZW50KCBuYW1lICk7Ci0gICAgICAgIHRvUHJldlRva2VuKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGJlZ2luRWxlbWVudCAoIFN0cmluZyBuYW1lLCBTdHJpbmcgdXJpICkKLSAgICB7Ci0gICAgICAgIGluc2VydEVsZW1lbnQoIG5hbWUsIHVyaSApOwotICAgICAgICB0b1ByZXZUb2tlbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluc2VydEVsZW1lbnRXaXRoVGV4dCAoIFFOYW1lIG5hbWUsIFN0cmluZyB0ZXh0ICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIHZhbGlkYXRlTG9jYWxOYW1lKCBuYW1lLmdldExvY2FsUGFydCgpICk7Ci0gICAgCi0gICAgICAgICAgICBCZWdpbiBiID0gbmV3IEJlZ2luKCBuYW1lLCBudWxsICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGIudG9nZ2xlSXNMZWFmKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGluc2VydCggYiwgdGV4dCApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGluc2VydEVsZW1lbnRXaXRoVGV4dCAoIFN0cmluZyBuYW1lLCBTdHJpbmcgdXJpLCBTdHJpbmcgdGV4dCApCi0gICAgewotICAgICAgICBpbnNlcnRFbGVtZW50V2l0aFRleHQoIG5ldyBRTmFtZSggdXJpLCBuYW1lICksIHRleHQgKTsKLSAgICB9Ci0KLSAgICB2b2lkIGluc2VydCAoIFNwbGF5IHNJbnNlcnQsIFN0cmluZyB2YWx1ZSApCi0gICAgewotICAgICAgICBhc3NlcnQgIWlzRGlzcG9zZWQoKTsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHNJbnNlcnQuZ2V0Um9vdFNsb3coKSA9PSBudWxsOwotICAgICAgICBhc3NlcnQgc0luc2VydC5nZXRDY2goKSA9PSAwOwotCi0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgc0luc2VydC5hZGp1c3RDY2goIHZhbHVlLmxlbmd0aCgpICk7Ci0KLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKLQotICAgICAgICBzSW5zZXJ0LmNoZWNrSW5zZXJ0aW9uVmFsaWRpdHkoIDAsIHMsIHAsIGZhbHNlICk7Ci0KLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICBzLmluc2VydCggZ2V0Um9vdCgpLCBwLCBzSW5zZXJ0LCB2YWx1ZSwgMCwgdmFsdWUubGVuZ3RoKCksIHRydWUgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcy5pbnNlcnQoIGdldFJvb3QoKSwgcCwgc0luc2VydCwgbnVsbCwgMCwgMCwgdHJ1ZSApOwotCi0gICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dFZhbHVlICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPiAwIHx8IHMuaXNGaW5pc2goKSB8fCBzLmlzWG1sbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgZ2V0IHRleHQgdmFsdWUsIGN1cnJlbnQgdG9rZW4gY2FuIGhhdmUgbm8gdGV4dCB2YWx1ZSIgKTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHJldHVybiBnZXRTcGxheSgpLmdldFRleHQoIGdldFJvb3QoKSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0VmFsdWUgKCBjaGFyW10gYnVmLCBpbnQgb2ZmLCBpbnQgY2NoICkKLSAgICB7Ci0vLyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLS8vICAgIAotLy8gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLS8vICAgIAotLy8gICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPiAwIHx8IHMuaXNGaW5pc2goKSB8fCBzLmlzWG1sbnMoKSkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLS8vICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgZ2V0IHRleHQgdmFsdWUsIGN1cnJlbnQgdG9rZW4gY2FuIGhhdmUgbm8gdGV4dCB2YWx1ZSIgKTsKLS8vICAgICAgICAgICAgfQotLy8gICAgCi0vLyAgICAgICAgICAgIHJldHVybiBnZXRTcGxheSgpLmdldFRleHQoIGdldFJvb3QoKSApOwotLy8gICAgICAgIH0KLQotICAgICAgICAvLyBIYWNrIGltcGwgZm9yIG5vdwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHMgPSBnZXRUZXh0VmFsdWUoKTsKLQotICAgICAgICBpbnQgbiA9IHMubGVuZ3RoKCk7Ci0KLSAgICAgICAgaWYgKG4gPiBjY2gpCi0gICAgICAgICAgICBuID0gY2NoOwotCi0gICAgICAgIGlmIChuIDw9IDApCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBzLmdldENoYXJzKCAwLCBuLCBidWYsIG9mZiApOwotCi0gICAgICAgIHJldHVybiBuOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0VmFsdWUgKCBTdHJpbmcgdGV4dCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChwID4gMCB8fCBzLmlzWG1sbnMoKSB8fCBzLmlzRmluaXNoKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkNhbid0IHNldCB0ZXh0IHZhbHVlLCBjdXJyZW50IHRva2VuIGNhbiBoYXZlIG5vIHRleHQgdmFsdWUiICk7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgCi0gICAgICAgICAgICBzLnNldFRleHQoIGdldFJvb3QoKSwgdGV4dCwgMCwgdGV4dCA9PSBudWxsID8gMCA6IHRleHQubGVuZ3RoKCkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRleHRWYWx1ZSAoIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBsZW4gKQotICAgIHsKLSAgICAgICAgc2V0VGV4dFZhbHVlKCBTdHJpbmcuY29weVZhbHVlT2YoIGJ1Ziwgb2ZmLCBsZW4gKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJzICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaW50IGNjaCA9IC0xOwotICAgIAotICAgICAgICAgICAgaW50IHBvc3RDY2ggPSBnZXRQb3N0Q2NoKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoY2NoIDwgMCB8fCBjY2ggPiBwb3N0Q2NoKQotICAgICAgICAgICAgICAgIGNjaCA9IHBvc3RDY2g7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBnZXRSb290KCkuX3RleHQuZmV0Y2goCi0gICAgICAgICAgICAgICAgICAgIGdldFNwbGF5KCkuZ2V0Q3BGb3JQb3MoIGdldFJvb3QoKSwgZ2V0UG9zKCkgKSwgY2NoICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENoYXJzICggY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGNjaCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpbnQgcG9zdENjaCA9IGdldFBvc3RDY2goKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChjY2ggPCAwIHx8IGNjaCA+IHBvc3RDY2gpCi0gICAgICAgICAgICAgICAgY2NoID0gcG9zdENjaDsKLSAgICAKLSAgICAgICAgICAgIGlmIChidWYgPT0gbnVsbCB8fCBvZmYgPj0gYnVmLmxlbmd0aCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICAgICAgICAgIGlmIChidWYubGVuZ3RoIC0gb2ZmIDwgY2NoKQotICAgICAgICAgICAgICAgIGNjaCA9IGJ1Zi5sZW5ndGggLSBvZmY7Ci0gICAgCi0gICAgICAgICAgICBnZXRSb290KCkuX3RleHQuZmV0Y2goCi0gICAgICAgICAgICAgICAgYnVmLCBvZmYsIGdldFNwbGF5KCkuZ2V0Q3BGb3JQb3MoIGdldFJvb3QoKSwgZ2V0UG9zKCkgKSwgY2NoICk7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gY2NoOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Qm9va21hcmsgKCBYbWxCb29rbWFyayBhbm5vdGF0aW9uICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgIAotICAgICAgICAgICAgY2xlYXJCb29rbWFyayggYW5ub3RhdGlvbi5nZXRLZXkoKSApOwotICAgIAotICAgICAgICAgICAgQW5ub3RhdGlvbiBhID0gbmV3IEFubm90YXRpb24oIGdldFJvb3QoKSwgYW5ub3RhdGlvbiApOwotICAgIAotICAgICAgICAgICAgaWYgKGEuX2tleSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJBbm5vdGF0aW9uIGtleSBpcyBudWxsIiApOwotICAgIAotICAgICAgICAgICAgYS5zZXQoIF9nb29iZXIgKTsKLSAgICAgICAgICAgIGFubm90YXRpb24uX2N1cnJlbnRNYXJrID0gYTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBYbWxCb29rbWFyayBnZXRCb29rbWFyayAoIE9iamVjdCBrZXkgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBpbnQgICBwID0gZ2V0UG9zKCk7Ci0gICAgCi0gICAgICAgICAgICBmb3IgKCBHb29iZXIgZyA9IHMuZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7IGcgPSBzLm5leHRHb29iZXIoIGcgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGcuZ2V0S2luZCgpID09IFNwbGF5LkFOTk9UQVRJT04gJiYgZy5nZXRQb3MoKSA9PSBwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhID0gKEFubm90YXRpb24pIGc7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIFhtbEJvb2ttYXJrIHhhID0gYS5nZXRYbWxCb29rbWFyaygpOwotICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoeGEgIT0gbnVsbCAmJiBhLl9rZXkuZXF1YWxzKCBrZXkgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4YTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyQm9va21hcmsgKCBPYmplY3Qga2V5ICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGZvciAoIEdvb2JlciBnID0gcy5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IHMubmV4dEdvb2JlciggZyApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZy5nZXRLaW5kKCkgPT0gU3BsYXkuQU5OT1RBVElPTiAmJiBnLmdldFBvcygpID09IHApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGEgPSAoQW5ub3RhdGlvbikgZzsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgWG1sQm9va21hcmsgeGEgPSBhLmdldFhtbEJvb2ttYXJrKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGlmICh4YSAhPSBudWxsICYmIGEuX2tleS5lcXVhbHMoIGtleSApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnLnNldCggbnVsbCwgMCApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2V0QWxsQm9va21hcmtSZWZzICggQ29sbGVjdGlvbiBsaXN0VG9GaWxsICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChsaXN0VG9GaWxsID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBpbnQgICBwID0gZ2V0UG9zKCk7Ci0gICAgCi0gICAgICAgICAgICBmb3IgKCBHb29iZXIgZyA9IHMuZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7IGcgPSBzLm5leHRHb29iZXIoIGcgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGcuZ2V0S2luZCgpID09IFNwbGF5LkFOTk9UQVRJT04gJiYgZy5nZXRQb3MoKSA9PSBwKQotICAgICAgICAgICAgICAgICAgICBsaXN0VG9GaWxsLmFkZCggKChBbm5vdGF0aW9uKSBnKS5nZXRYbWxCb29rbWFyaygpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0VG9rZW4gKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBhc3NlcnQgIWdldFNwbGF5KCkuaXNSb290KCkgfHwgZ2V0UG9zKCkgPT0gMDsKLSAgICAgICAgICAgIHJldHVybiAhZ2V0U3BsYXkoKS5pc1Jvb3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZUb2tlbiAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLQotICAgICAgICAgICAgcmV0dXJuICFnZXRTcGxheSgpLmlzRG9jKCkgfHwgZ2V0UG9zKCkgPiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPiAwKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICBzd2l0Y2ggKCBzLmdldEtpbmQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNwbGF5LkJFR0lOIDoKLSAgICAgICAgICAgIGNhc2UgU3BsYXkuQVRUUiA6Ci0gICAgICAgICAgICBjYXNlIFNwbGF5LlBST0NJTlNUIDoKLSAgICAgICAgICAgICAgICByZXR1cm4gcy5nZXROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUgKCBRTmFtZSBuYW1lICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIk5hbWUgaXMgbnVsbCIgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDAgfHwgIShzLmlzQmVnaW4oKSB8fCBzLmlzQXR0cigpIHx8IHMuaXNQcm9jaW5zdCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IHNldCBuYW1lIGhlcmU6ICIgKyBjdXJyZW50VG9rZW5UeXBlKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIGlmIChzLmlzUHJvY2luc3QoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVByZWZpeCggbmFtZS5nZXRMb2NhbFBhcnQoKSApOwotICAgIAotICAgICAgICAgICAgICAgIGlmIChuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9jaW5zdCBuYW1lIG11c3QgaGF2ZSBubyBVUkkiICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocy5pc1htbG5zKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUuZ2V0TG9jYWxQYXJ0KCkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVByZWZpeCggbmFtZS5nZXRMb2NhbFBhcnQoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHZhbGlkYXRlTG9jYWxOYW1lKCBuYW1lLmdldExvY2FsUGFydCgpICk7Ci0gICAgCi0gICAgICAgICAgICBzLnNldE5hbWUoIGdldFJvb3QoKSwgbmFtZSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgdG9OZXh0Q2hhciAoIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBpbnQgICBwID0gZ2V0UG9zKCk7Ci0gICAgCi0gICAgICAgICAgICBpbnQgbWF4Q2NoID0gZ2V0UG9zdENjaCgpOwotICAgIAotICAgICAgICAgICAgaWYgKG1heENjaCA9PSAwIHx8IGNjaCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgIAotICAgICAgICAgICAgaWYgKGNjaCA8IDAgfHwgY2NoID4gbWF4Q2NoKQotICAgICAgICAgICAgICAgIGNjaCA9IG1heENjaDsKLSAgICAKLSAgICAgICAgICAgIGFzc2VydCBwICsgY2NoIDw9IHMuZ2V0RW5kUG9zKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAocCArIGNjaCA9PSBzLmdldEVuZFBvcygpKQotICAgICAgICAgICAgICAgIHRvTmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc2V0KCBwICsgY2NoICk7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gY2NoOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCB0b1ByZXZDaGFyICggaW50IGNjaCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHNUZXh0ID0gczsgIC8vIFRoZSBzcGxheSBhbmQgcG9zIHdoZXJlIHRoZSB0ZXh0IGV4aXN0cwotICAgICAgICAgICAgaW50ICAgcFRleHQgPSBwOwotICAgICAgICAgICAgaW50ICAgbWF4Q2NoID0gMDsgLy8gTWF4IGNoYXJzIHRvIG1vdmUgb3ZlcgotICAgIAotICAgICAgICAgICAgaWYgKHAgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIXMuaXNEb2MoKSAmJiAhcy5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNUZXh0ID0gcy5wcmV2Tm9uQXR0clNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIHBUZXh0ID0gc1RleHQuZ2V0RW5kUG9zKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1heENjaCA9IHNUZXh0LmdldENjaEFmdGVyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocy5pc0xlYWYoKSAmJiBwIDw9IHMuZ2V0UG9zTGVhZkVuZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBkQ2NoID0gcy5lbnN1cmVDb250ZW50VmFsaWQoKTsKLSAgICAgICAgICAgICAgICBwICs9IGRDY2g7Ci0gICAgICAgICAgICAgICAgcFRleHQgPSBwOwotICAgICAgICAgICAgICAgIG1heENjaCA9IHAgLSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1heENjaCA9IHAgLSBzLmdldFBvc0FmdGVyKCk7Ci0gICAgCi0gICAgICAgICAgICBhc3NlcnQgcFRleHQgPD0gc1RleHQuZ2V0RW5kUG9zKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAobWF4Q2NoID09IDAgfHwgY2NoID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgICAgICAgICBpZiAoY2NoIDwgMCB8fCBjY2ggPiBtYXhDY2gpCi0gICAgICAgICAgICAgICAgY2NoID0gbWF4Q2NoOwotICAgIAotICAgICAgICAgICAgc2V0KCBzVGV4dCwgcFRleHQgLSBjY2ggKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiBjY2g7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0b0VuZERvYyAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIHNldCggZ2V0Um9vdCgpLCAwICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0b1N0YXJ0RG9jICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgc2V0KCBnZXRSb290KCkuX2RvYywgMCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFRva2VuVHlwZSB0b0ZpcnN0Q29udGVudFRva2VuICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPiAwIHx8ICFzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRva2VuVHlwZS5OT05FOwotICAgIAotICAgICAgICAgICAgcy5lbnN1cmVDb250ZW50VmFsaWQoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChzLmdldENjaCgpID4gMCB8fCBzLmlzTGVhZigpKQotICAgICAgICAgICAgICAgIHNldCggMSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNldCggcy5uZXh0Tm9uQXR0clNwbGF5KCksIDAgKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVG9rZW5UeXBlIHRvRW5kVG9rZW4gKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDAgfHwgIXMuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW5UeXBlLk5PTkU7Ci0gICAgCi0gICAgICAgICAgICBpZiAocy5pc0xlYWYoKSkKLSAgICAgICAgICAgICAgICBzZXQoIHMuZ2V0UG9zTGVhZkVuZCgpICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc2V0KCBzLmdldEZpbmlzaFNwbGF5KCkgKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB0b1BhcmVudCAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOwotICAgIAotICAgICAgICAgICAgaWYgKHAgPT0gMCAmJiBzLmlzRG9jKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgICAgICAgICAgc2V0KCBzLmdldENvbnRhaW5lciggcCApLCAwICk7Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHRvTmV4dFNpYmxpbmcgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChwID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNEb2MoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgICAgICAgICAgICAgIGlmIChzLmlzQmVnaW4oKSkKLSAgICAgICAgICAgICAgICAgICAgcyA9IHMuZ2V0RmluaXNoU3BsYXkoKS5uZXh0U3BsYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc0xlYWYoKSAmJiBwIDw9IHMuZ2V0UG9zTGVhZkVuZCgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICAgICAgcyA9IHMubmV4dFNwbGF5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBmb3IgKCA7ICFzLmlzQmVnaW4oKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc0ZpbmlzaCgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBzZXQoIHMsIDAgKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdG9OZXh0U2libGluZyAoIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0b05leHRTaWJsaW5nKCBuZXcgUU5hbWUoIG5hbWUgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHRvTmV4dFNpYmxpbmcgKCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICByZXR1cm4gdG9OZXh0U2libGluZyggbmV3IFFOYW1lKCBuYW1lc3BhY2UsIG5hbWUgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHRvTmV4dFNpYmxpbmcgKCBRTmFtZSBuYW1lICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3BsYXkgc09yaWdpbmFsID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGludCAgIHBPcmlnaW5hbCA9IGdldFBvcygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghdG9OZXh0U2libGluZygpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAoZ2V0TmFtZSgpLmVxdWFscyggbmFtZSApKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgc2V0KCBzT3JpZ2luYWwsIHBPcmlnaW5hbCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gdG9QcmV2U2libGluZyAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOwotICAgIAotICAgICAgICAgICAgaWYgKHAgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc0RvYygpIHx8IHMuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgICAgICBzID0gcy5wcmV2U3BsYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcCA+IDA7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHMuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzLmlzTGVhZigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocCA8PSBzLmdldFBvc0xlYWZFbmQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXQoIDAgKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzRW5kKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzID0gcy5nZXRDb250YWluZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIGlmIChzLmlzTGVhZigpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAocy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICAgICAgcyA9IHMucHJldlNwbGF5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBzZXQoIHMsIDAgKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTcGxheSBnZXRTdGFydCAoICkKLSAgICB7Ci0gICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLQotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSB8fCBnZXRQb3MoKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoKCk7Ci0KLSAgICAgICAgICAgIGlmICh0b05leHRTaWJsaW5nKCkpCi0gICAgICAgICAgICAgICAgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcyA9IG51bGw7Ci0KLSAgICAgICAgICAgIHBvcCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdG9GaXJzdENoaWxkICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRvQ2hpbGQoIChRTmFtZSkgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHRvQ2hpbGQgKCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICByZXR1cm4gdG9DaGlsZCggbmV3IFFOYW1lKCBuYW1lICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB0b0NoaWxkICggU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRvQ2hpbGQoIG5ldyBRTmFtZSggbmFtZXNwYWNlLCBuYW1lICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB0b0NoaWxkICggUU5hbWUgbmFtZSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0Um9vdCgpLmZpbmROdGhCZWdpbiggZ2V0U3RhcnQoKSwgbmFtZSwgbnVsbCwgMCApOwotICAgIAotICAgICAgICAgICAgaWYgKHMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICBzZXQoIHMsIDAgKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdG9DaGlsZCAoIGludCBuICkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0b0NoaWxkKCBudWxsLCBuICk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdG9DaGlsZCAoIFFOYW1lIG5hbWUsIGludCBuICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRSb290KCkuZmluZE50aEJlZ2luKCBnZXRTdGFydCgpLCBuYW1lLCBudWxsLCBuICk7Ci0gICAgCi0gICAgICAgICAgICBpZiAocyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIHNldCggcywgMCApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB0b0xhc3RDaGlsZCAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHNPcmlnaW5hbCA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBpbnQgICBwT3JpZ2luYWwgPSBnZXRQb3MoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFzT3JpZ2luYWwuaXNDb250YWluZXIoKSB8fCBwT3JpZ2luYWwgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIXRvTmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKCF0b0VuZFRva2VuKCkuaXNOb25lKCkgJiYgdG9QcmV2U2libGluZygpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIAotICAgICAgICAgICAgc2V0KCBzT3JpZ2luYWwsIHBPcmlnaW5hbCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB0b0ZpcnN0QXR0cmlidXRlICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgU3BsYXkgc09yaWdpbmFsID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgIGludCAgIHBPcmlnaW5hbCA9IGdldFBvcygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIXNPcmlnaW5hbC5pc0NvbnRhaW5lcigpIHx8IHBPcmlnaW5hbCAhPSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBzT3JpZ2luYWwubmV4dFNwbGF5KCkgOyBzLmlzQXR0cigpIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0KCBzLCAwICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHNldCggc09yaWdpbmFsLCBwT3JpZ2luYWwgKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHRvTGFzdEF0dHJpYnV0ZSAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHNPcmlnaW5hbCA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBpbnQgICBwT3JpZ2luYWwgPSBnZXRQb3MoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFzT3JpZ2luYWwuaXNDb250YWluZXIoKSB8fCBwT3JpZ2luYWwgIT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBsYXN0Tm9ybWFsQXR0ciA9IG51bGw7Ci0gICAgCi0gICAgICAgICAgICBmb3IgKCBTcGxheSBzID0gc09yaWdpbmFsLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc05vcm1hbEF0dHIoKSkKLSAgICAgICAgICAgICAgICAgICAgbGFzdE5vcm1hbEF0dHIgPSBzOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKGxhc3ROb3JtYWxBdHRyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2V0KCBsYXN0Tm9ybWFsQXR0ciwgMCApOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgc2V0KCBzT3JpZ2luYWwsIHBPcmlnaW5hbCApOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdG9OZXh0QXR0cmlidXRlICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoIXMuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgICAgICAgICAgZm9yICggcyA9IHMubmV4dFNwbGF5KCkgOyBzLmlzQXR0cigpIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0KCBzLCAwICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHRvUHJldkF0dHJpYnV0ZSAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgIAotICAgICAgICAgICAgaWYgKCFzLmlzQXR0cigpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIGZvciAoIHMgPSBzLnByZXZTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLnByZXZTcGxheSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc05vcm1hbEF0dHIoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNldCggcywgMCApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVRleHQgKCBRTmFtZSBhdHRyTmFtZSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoYXR0ck5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiQXR0ciBuYW1lIGlzIG51bGwiICk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPiAwKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCkuZ2V0QXR0ciggYXR0ck5hbWUgKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiBzID09IG51bGwgPyBudWxsIDogcy5nZXRUZXh0KCBnZXRSb290KCkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNldEF0dHJpYnV0ZVRleHQgKCBRTmFtZSBhdHRyTmFtZSwgU3RyaW5nIHZhbHVlICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChhdHRyTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJBdHRyIG5hbWUgaXMgbnVsbCIgKTsKLSAgICAKLSAgICAgICAgICAgIHZhbGlkYXRlTG9jYWxOYW1lKCBhdHRyTmFtZS5nZXRMb2NhbFBhcnQoKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPiAwKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgIAotICAgICAgICAgICAgaWYgKCFzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKLSAgICAKLSAgICAgICAgICAgIHMgPSBnZXRTcGxheSgpLmdldEF0dHIoIGF0dHJOYW1lICk7Ci0gICAgCi0gICAgICAgICAgICBpZiAocyA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbEN1cnNvciBjID0gbmV3Q3Vyc29yKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnNlcnQgdGhlIG5ldyBhdHRyIGF0IHRoZSBlbmQKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoIGMuaXNBbnlBdHRyKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGMuaW5zZXJ0QXR0cmlidXRlV2l0aFZhbHVlKCBhdHRyTmFtZSwgdmFsdWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYy5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHMuc2V0VGV4dCggZ2V0Um9vdCgpLCB2YWx1ZSwgMCwgdmFsdWUubGVuZ3RoKCkgKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQXR0cmlidXRlICggUU5hbWUgYXR0ck5hbWUgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKGF0dHJOYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkF0dHIgbmFtZSBpcyBudWxsIiApOwotICAgIAotICAgICAgICAgICAgaWYgKGdldFBvcygpID4gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICBib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKS5nZXRBdHRyKCBhdHRyTmFtZSApOwotICAgIAotICAgICAgICAgICAgICAgIGlmIChzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHMucmVtb3ZlKCBnZXRSb290KCksIHRydWUgKTsKLSAgICAKLSAgICAgICAgICAgICAgICByZW1vdmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHJldHVybiByZW1vdmVkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCByZW1vdmVDaGFycyAoIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaW50IHBvc3RDY2ggPSBnZXRQb3N0Q2NoKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAocG9zdENjaCA9PSAwIHx8IGNjaCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgIAotICAgICAgICAgICAgaWYgKGNjaCA8IDAgfHwgY2NoID4gcG9zdENjaCkKLSAgICAgICAgICAgICAgICBjY2ggPSBwb3N0Q2NoOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIGdldFNwbGF5KCkucmVtb3ZlQ2hhcnMoIGdldFJvb3QoKSwgZ2V0UG9zKCksIGNjaCApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgbW92ZUNoYXJzICggaW50IGNjaCwgWG1sQ3Vyc29yIGRzdCApCi0gICAgewotICAgICAgICBpZiAoZHN0ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiRGVzdGluYXRpb24gaXMgbnVsbCIgKTsKLSAgICAgICAgICAgIAotICAgICAgICBpZiAobW9uaXRvcigpID09IGRzdC5tb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1vdmVDaGFyc0ltcGwoIGNjaCwgZHN0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGFjcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZHN0Lm1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW92ZUNoYXJzSW1wbCggY2NoLCBkc3QgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYWNxdWlyZWQpCi0gICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IG1vdmVDaGFyc0ltcGwgKCBpbnQgY2NoLCBYbWxDdXJzb3IgZHN0ICkKLSAgICB7Ci0gICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLQotICAgICAgICBpZiAoZHN0ID09IG51bGwgfHwgIShkc3QgaW5zdGFuY2VvZiBDdXJzb3IpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkludmFsaWQgZGVzdGluYXRpb24gY3Vyc29yIiApOwotCi0gICAgICAgIEN1cnNvciBjRHN0ID0gKEN1cnNvcikgZHN0OwotCi0gICAgICAgIGNoZWNrRGlzcG9zZWQoIGNEc3QgKTsKLQotICAgICAgICBSb290ICByRHN0ID0gY0RzdC5nZXRSb290KCk7Ci0gICAgICAgIFNwbGF5IHNEc3QgPSBjRHN0LmdldFNwbGF5KCk7Ci0gICAgICAgIGludCAgIHBEc3QgPSBjRHN0LmdldFBvcygpOwotCi0gICAgICAgIGlmIChwRHN0ID09IDAgJiYgKHNEc3QuaXNEb2MoKSB8fCBzRHN0LmlzQXR0cigpKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJJbnZhbGlkIGRlc3RpbmF0aW9uIiApOwotCi0gICAgICAgIHJldHVybgotICAgICAgICAgICAgZ2V0U3BsYXkoKS5tb3ZlQ2hhcnMoCi0gICAgICAgICAgICAgICAgZ2V0Um9vdCgpLCBnZXRQb3MoKSwgY2NoLCByRHN0LCBzRHN0LCBwRHN0LCBmYWxzZSApOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgY29weUNoYXJzICggaW50IGNjaCwgWG1sQ3Vyc29yIGRzdCApCi0gICAgewotICAgICAgICBpZiAoZHN0ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiRGVzdGluYXRpb24gaXMgbnVsbCIgKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChkc3QubW9uaXRvcigpID09IG1vbml0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29weUNoYXJzSW1wbCggY2NoLCBkc3QgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEdsb2JhbExvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChkc3QubW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3B5Q2hhcnNJbXBsKCBjY2gsIGRzdCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChhY3F1aXJlZCkKLSAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgY29weUNoYXJzSW1wbCAoIGludCBjY2gsIFhtbEN1cnNvciBkc3QgKQotICAgIHsKLSAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotCi0gICAgICAgIGlmIChkc3QgPT0gbnVsbCB8fCAhKGRzdCBpbnN0YW5jZW9mIEN1cnNvcikpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiSW52YWxpZCBkZXN0aW5hdGlvbiBjdXJzb3IiICk7Ci0KLSAgICAgICAgQ3Vyc29yIGNEc3QgPSAoQ3Vyc29yKSBkc3Q7Ci0KLSAgICAgICAgY2hlY2tEaXNwb3NlZCggY0RzdCApOwotCi0gICAgICAgIFJvb3QgIHJEc3QgPSBjRHN0LmdldFJvb3QoKTsKLSAgICAgICAgU3BsYXkgc0RzdCA9IGNEc3QuZ2V0U3BsYXkoKTsKLSAgICAgICAgaW50ICAgcERzdCA9IGNEc3QuZ2V0UG9zKCk7Ci0KLSAgICAgICAgaWYgKHBEc3QgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNEc3QuaXNEb2MoKSB8fCBzRHN0LmlzQXR0cigpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJJbnZhbGlkIGRlc3RpbmF0aW9uIiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzRHN0ID0gc0RzdC5wcmV2Tm9uQXR0clNwbGF5KCk7Ci0gICAgICAgICAgICBwRHN0ID0gc0RzdC5nZXRFbmRQb3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybgotICAgICAgICAgICAgZ2V0U3BsYXkoKS5jb3B5Q2hhcnMoIGdldFJvb3QoKSwgZ2V0UG9zKCksIGNjaCwgckRzdCwgc0RzdCwgcERzdCApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgbmFtZXNwYWNlRm9yUHJlZml4ICggU3RyaW5nIHByZWZpeCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDAgfHwgIXMuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiTm90IG9uIGEgY29udGFpbmVyIiApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIHMubmFtZXNwYWNlRm9yUHJlZml4KCBwcmVmaXggKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcHJlZml4Rm9yTmFtZXNwYWNlICggU3RyaW5nIG5zICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChucyA9PSBudWxsIHx8IG5zLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIk11c3Qgc3BlY2lmeSBhIG5hbWVzcGFjZSIgKTsKLSAgICAKLSAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgIAotICAgICAgICAgICAgaWYgKGdldFBvcygpID4gMCB8fCAhcy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJOb3Qgb24gYSBjb250YWluZXIiICk7Ci0gICAgCi0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcy5wcmVmaXhGb3JOYW1lc3BhY2UoIGdldFJvb3QoKSwgbnMsIG51bGwsIHRydWUpOwotCi0gICAgICAgICAgICBhc3NlcnQgcmVzdWx0ICE9IG51bGw7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZXRBbGxOYW1lc3BhY2VzICggTWFwIGFkZFRvVGhpcyApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDAgfHwgIXMuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiTm90IG9uIGEgY29udGFpbmVyIiApOwotICAgIAotICAgICAgICAgICAgLy8gRG8gdGhpcyB3aXRoIGN1cnNvciBmb3Igbm93Li4uCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFhtbEN1cnNvciBjID0gbmV3Q3Vyc29yKCk7Ci0gICAgCi0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBjLmlzQ29udGFpbmVyKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgUU5hbWUgY05hbWUgPSBjLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoICFjLnRvTmV4dFRva2VuKCkuaXNOb25lKCkgJiYgYy5pc0FueUF0dHIoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoYy5pc05hbWVzcGFjZSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpICAgID0gYy5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBIZXJlIEkgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcHBpbmcgd2hpY2ggaXMgbm90IGVtcHR5IG9uIGEgbm9uIHJvb3QgY29udGFpbmVyIHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBpbiBhIG5hbWVzcGFjZS4gIFRoaXMgdGhpcyBjYXNlLCBJIGRvIG5vdCB3YW50IHRvIGFkZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBtYXBwaW5nIGJlY2F1c2UgaXQgY291bGQgbm90IGJlIHBlcnNpc3RlZCBvdXQgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2F5LgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID09IDAgJiYgdXJpLmxlbmd0aCgpID4gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjTmFtZSAhPSBudWxsICYmIGNOYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpPjApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFkZFRvVGhpcy5jb250YWluc0tleSggcHJlZml4ICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9UaGlzLnB1dCggcHJlZml4LCB1cmkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICBjLnRvUGFyZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoIGMudG9QYXJlbnQoKSApOwotICAgIAotICAgICAgICAgICAgYy5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuczoKLSAgICAgKgotICAgICAqICAgLTEgaXMgdGhpcyBpcyBsZWZ0IG9mIHRoYXQKLSAgICAgKiAgICAwIGlzIHRoaXMgaXMgbGVmdCBpcyBhdCBzYW1lIHBvc2l0aW9uIGFzIHRoYXQKLSAgICAgKiAgICAxIGlzIHRoaXMgaXMgcmlnaHQgb2YgdGhhdAotICAgICAqLwotCi0gICAgcHVibGljIGludCBjb21wYXJlUG9zaXRpb24gKCBYbWxDdXJzb3IgeHRoYXQgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoeHRoYXQgPT0gbnVsbCB8fCAhKHh0aGF0IGluc3RhbmNlb2YgQ3Vyc29yKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiSW52YWxpZCB0aGF0IGN1cnNvciIgKTsKLSAgICAKLSAgICAgICAgICAgIEN1cnNvciB0aGF0ID0gKEN1cnNvcikgeHRoYXQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChyICE9IHRoYXQuZ2V0Um9vdCgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJDdXJzb3JzIG5vdCBpbiBzYW1lIGRvY3VtZW50IiApOwotICAgIAotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCggdGhhdCApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgZ2V0U3BsYXkoKS5jb21wYXJlKCByLCBnZXRQb3MoKSwgdGhhdC5nZXRTcGxheSgpLCB0aGF0LmdldFBvcygpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNMZWZ0T2YgKCBYbWxDdXJzb3IgdGhhdCApCi0gICAgewotICAgICAgICByZXR1cm4gY29tcGFyZVBvc2l0aW9uKCB0aGF0ICkgPCAwOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F0U2FtZVBvc2l0aW9uQXMgKCBYbWxDdXJzb3IgdGhhdCApCi0gICAgewotICAgICAgICByZXR1cm4gY29tcGFyZVBvc2l0aW9uKCB0aGF0ICkgPT0gMDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNSaWdodE9mICggWG1sQ3Vyc29yIHRoYXQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBhcmVQb3NpdGlvbiggdGhhdCApID4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gbmV3SW5wdXRTdHJlYW0gKCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBuZXcgU2F2ZXIuSW5wdXRTdHJlYW1TYXZlcigKLSAgICAgICAgICAgICAgICAgICAgZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSwgb3B0aW9ucyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbSAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXdJbnB1dFN0cmVhbSggbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyBSZWFkZXIgbmV3UmVhZGVyICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ld1JlYWRlciggbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUmVhZGVyIG5ld1JlYWRlciAoIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZXIuVGV4dFJlYWRlciggZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSwgb3B0aW9ucyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBYTUxJbnB1dFN0cmVhbSBuZXdYTUxJbnB1dFN0cmVhbSAoIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIG5ldyBYbWxJbnB1dFN0cmVhbUltcGwoIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSwgZ2V0UG9zKCksIG9wdGlvbnMgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgWE1MSW5wdXRTdHJlYW0gbmV3WE1MSW5wdXRTdHJlYW0gKCApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3WE1MSW5wdXRTdHJlYW0oIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWG1sT3B0aW9ucyBfdG9TdHJpbmdPcHRpb25zID0KLSAgICAgICAgYnVpbGRQcmV0dHlPcHRpb25zKCk7Ci0KLSAgICBzdGF0aWMgZmluYWwgWG1sT3B0aW9ucyBidWlsZFByZXR0eU9wdGlvbnMgKCApCi0gICAgewotICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5TQVZFX1BSRVRUWV9QUklOVCApOwotICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5TQVZFX0FHR1JFU1NJVkVfTkFNRVNQQUNFUyApOwotICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5TQVZFX1VTRV9ERUZBVUxUX05BTUVTUEFDRSApOwotICAgICAgICByZXR1cm4gb3B0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICggICkKLSAgICB7Ci0gICAgICAgIHJldHVybiB4bWxUZXh0KCBfdG9TdHJpbmdPcHRpb25zICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgeG1sVGV4dCAoICApCi0gICAgewotICAgICAgICByZXR1cm4geG1sVGV4dCggbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHhtbFRleHQgKCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgU2F2ZXIuVGV4dFNhdmVyIHNhdmVyOwotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNhdmVyID0gbmV3IFNhdmVyLlRleHRTYXZlcigKLSAgICAgICAgICAgICAgICAgICAgZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSwgb3B0aW9ucywgbnVsbCApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYXZlci5zYXZlVG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgQ2hhbmdlU3RhbXBJbXBsIGltcGxlbWVudHMgQ2hhbmdlU3RhbXAKLSAgICB7Ci0gICAgICAgIENoYW5nZVN0YW1wSW1wbCAoIFJvb3QgciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9yb290ID0gcjsKLSAgICAgICAgICAgIF92ZXJzaW9uU3RhbXAgPSBfcm9vdC5nZXRWZXJzaW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGFuZ2VkICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3ZlcnNpb25TdGFtcCAhPSBfcm9vdC5nZXRWZXJzaW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGZpbmFsIFJvb3QgX3Jvb3Q7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgbG9uZyBfdmVyc2lvblN0YW1wOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQ2hhbmdlU3RhbXAgZ2V0RG9jQ2hhbmdlU3RhbXAgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGFuZ2VTdGFtcEltcGwoIGdldFJvb3QoKSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZVhtbCAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICBpbnQgICBwID0gZ2V0UG9zKCk7Ci0gICAgCi0gICAgICAgICAgICBhc3NlcnQgcCA8IHMuZ2V0RW5kUG9zKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAocCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNMZWFmKCkgJiYgcCA9PSBzLmdldFBvc0xlYWZFbmQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgICAgICAgICAgICAgIGludCBjY2hSZW1vdmUgPSByZW1vdmVDaGFycyggZ2V0UG9zdENjaCgpICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgYXNzZXJ0IGNjaFJlbW92ZSA+IDA7Ci0gICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzLmlzRG9jKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCByZW1vdmUgYSB3aG9sZSBkb2N1bWVudC4iICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzLmlzRmluaXNoKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgICAgICAgICAgcy5yZW1vdmUoIGdldFJvb3QoKSwgdHJ1ZSApOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gbW92ZVhtbCAoIFhtbEN1cnNvciBkc3QgKQotICAgIHsKLSAgICAgICAgaWYgKGRzdCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkRlc3RpbmF0aW9uIGlzIG51bGwiICk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZHN0Lm1vbml0b3IoKSA9PSBtb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1vdmVYbWxJbXBsKCBkc3QgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEdsb2JhbExvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChkc3QubW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb3ZlWG1sSW1wbCAoIGRzdCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChhY3F1aXJlZCkKLSAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIG1vdmVYbWxJbXBsICAoIFhtbEN1cnNvciBkc3QgKQotICAgIHsKLSAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGRzdCA9PSBudWxsIHx8ICEoZHN0IGluc3RhbmNlb2YgQ3Vyc29yKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgbW92ZSB0byBhIGZvcmVpZ24gZG9jdW1lbnQiICk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICBDdXJzb3IgY0RzdCA9IChDdXJzb3IpIGRzdDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGNoZWNrRGlzcG9zZWQoIGNEc3QgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFJvb3QgIHJEc3QgPSBjRHN0LmdldFJvb3QoKTsKLSAgICAgICAgU3BsYXkgc0RzdCA9IGNEc3QuZ2V0U3BsYXkoKTsKLSAgICAgICAgaW50ICAgcERzdCA9IGNEc3QuZ2V0UG9zKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgUm9vdCAgclNyYyA9IGdldFJvb3QoKTsKLSAgICAgICAgU3BsYXkgc1NyYyA9IGdldFNwbGF5KCk7Ci0gICAgICAgIGludCAgIHBTcmMgPSBnZXRQb3MoKTsKLSAgICAgICAgICAgIAotICAgICAgICBpZiAoc1NyYy5jaGVja0luc2VydGlvblZhbGlkaXR5KCBwU3JjLCBzRHN0LCBwRHN0LCB0cnVlICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIHNTcmMubW92ZUNoYXJzKAotICAgICAgICAgICAgICAgICAgICByU3JjLCBwU3JjLCBnZXRQb3N0Q2NoKCksIHJEc3QsIHNEc3QsIHBEc3QsIGZhbHNlICkgPiAwOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBhc3NlcnQgcFNyYyA9PSAwOwotICAgICAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIGZvciBhIG1vdmVtZW50IG9mIHN0dWZmIGludG8gaXRzZWxmISAgVGhpcyBjYXNlIGlzIGJhc2ljYWxseQotICAgICAgICAvLyBhIG5vLW9wCi0gICAgICAgICAgICAKLSAgICAgICAgaWYgKHJTcmMgPT0gckRzdCAmJiBzRHN0LmJldHdlZW4oIHJEc3QsIHBEc3QsIHNTcmMgKSkKLSAgICAgICAgewotLy8gVE9ETyAtIEkgbWlnaHQgaGF2ZSB0byBvcnBoYW4gdHlwZXMgaW4gdGhlIHJhbmdlIGhlcmUgLi4uLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHBTcmMgPT0gMDsKLSAgICAgICAgICAgIAotICAgICAgICBzU3JjLm1vdmUoIHJTcmMsIGNEc3QuZ2V0Um9vdCgpLCBjRHN0LmdldFNwbGF5KCksIGNEc3QuZ2V0UG9zKCksIHRydWUgKTsKLSAgICAgICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gY29weVhtbCAoIFhtbEN1cnNvciBkc3QgKQotICAgIHsKLSAgICAgICAgaWYgKGRzdCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkRlc3RpbmF0aW9uIGlzIG51bGwiICk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZHN0Lm1vbml0b3IoKSA9PSBtb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvcHlYbWxJbXBsKCBkc3QgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEdsb2JhbExvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChkc3QubW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3B5WG1sSW1wbCggZHN0ICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGFjcXVpcmVkKQotICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gY29weVhtbEltcGwgKCBYbWxDdXJzb3IgZHN0ICkKLSAgICB7Ci0gICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChkc3QgPT0gbnVsbCB8fCAhKGRzdCBpbnN0YW5jZW9mIEN1cnNvcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkNhbid0IGNvcHkgdG8gYSBmb3JlaWduIGRvY3VtZW50IiApOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgQ3Vyc29yIGNEc3QgPSAoQ3Vyc29yKSBkc3Q7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBjaGVja0Rpc3Bvc2VkKCBjRHN0ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgU3BsYXkgc0RzdCA9IGNEc3QuZ2V0U3BsYXkoKTsKLSAgICAgICAgaW50ICAgcERzdCA9IGNEc3QuZ2V0UG9zKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOwotICAgICAgICAgICAgCi0gICAgICAgIGlmIChzLmNoZWNrSW5zZXJ0aW9uVmFsaWRpdHkoIHAsIHNEc3QsIHBEc3QsIHRydWUgKSkKLSAgICAgICAgICAgIHJldHVybiBjb3B5Q2hhcnNJbXBsKCBnZXRQb3N0Q2NoKCksIGRzdCApID4gMDsKLSAgICAgICAgICAgIAotICAgICAgICBhc3NlcnQgcCA9PSAwOwotICAgICAgICAgICAgCi0gICAgICAgIC8vIE5lZWQgdG8gbWFrZSBhIHNwbGF5IGNvcHkgYmVmb3JlIGdldHRpbmcgdGhlIHRleHQgYmVjYXVzZSB0aGUgY29weQotICAgICAgICAvLyB3aWxsIHZhbGlkYXRlIGludmFsaWQgY29udGVudHMvdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0gICAgICAgIFJvb3QgckRzdCA9IGNEc3QuZ2V0Um9vdCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU3BsYXkgY29weSA9IHMuY29weVNwbGF5KCk7Ci0KLSAgICAgICAgT2JqZWN0IHR4dCA9IHIuX3RleHQ7Ci0gICAgICAgIGludCBjcCA9IHIuZ2V0Q3AoIHMgKTsKLSAgICAgICAgaW50IGNjaCA9IGNvcHkuZ2V0Q2NoTGVmdCgpICsgY29weS5nZXRDY2goKTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBSZW1vdmUgdGV4dCBhZnRlciB3aGljaCBtaWdodCBiZSBiZXR3ZWVuIGxlYWYgdmFsdWUgYW5kIGZpcnN0IGF0dHIgdmFsdWUKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIGlmIChzLmlzTGVhZigpICYmIHMuZ2V0Q2NoQWZ0ZXIoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjY2hWYWx1ZSA9IHMuZ2V0Q2NoVmFsdWUoKTsKLSAgICAgICAgICAgIGludCBjY2hBZnRlciA9IHMuZ2V0Q2NoQWZ0ZXIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNjaFZhbHVlID09IDApCi0gICAgICAgICAgICAgICAgY3AgKz0gY2NoQWZ0ZXI7Ci0gICAgICAgICAgICBlbHNlIGlmIChzLm5leHRTcGxheSgpLmlzQXR0cigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhciBbIGNjaCBdOwotICAgICAgICAgICAgICAgIHIuX3RleHQuZmV0Y2goIGJ1ZiwgMCwgY3AsIGNjaFZhbHVlICk7Ci0gICAgICAgICAgICAgICAgci5fdGV4dC5mZXRjaCggYnVmLCBjY2hWYWx1ZSwgY3AgKyBjY2hWYWx1ZSArIGNjaEFmdGVyLCBjY2ggLSBjY2hWYWx1ZSApOwotCi0gICAgICAgICAgICAgICAgdHh0ID0gYnVmOwotICAgICAgICAgICAgICAgIGNwID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIHNEc3QuaW5zZXJ0KCByRHN0LCBwRHN0LCBjb3B5LCB0eHQsIGNwLCBjY2gsIHRydWUgKTsKLSAgICAgICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlWG1sQ29udGVudHMgKCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFRPRE8gLSBzaG91bGQgaW1wbGVtZW50IHRoaXMgd2l0aCBpbnRlcm5hbHMKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFpc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIFRva2VuVHlwZSB0dCA9IHRvRmlyc3RDb250ZW50VG9rZW4oKTsKLSAgICAgICAgICAgIGFzc2VydCAhdHQuaXNOb25lKCk7Ci0gICAgCi0gICAgICAgICAgICBib29sZWFuIHJlbW92ZWQgPSAhaXNGaW5pc2goKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCAhaXNGaW5pc2goKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSByZW1vdmVYbWwoKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRvUGFyZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gcmVtb3ZlZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWlucyAoIFhtbEN1cnNvciBkc3QgKQotICAgIHsKLSAgICAgICAgaWYgKGlzSW5TYW1lRG9jdW1lbnQoIGRzdCApKQotICAgICAgICB7Ci0gICAgICAgICAgICBkc3QucHVzaCgpOwotCi0gICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChkc3QuaXNBdFNhbWVQb3NpdGlvbkFzKCB0aGlzICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkc3QucG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghZHN0LnRvUGFyZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkc3QucG9wKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIG1vdmVYbWxDb250ZW50cyAoIFhtbEN1cnNvciBkc3QgKQotICAgIHsKLSAgICAgICAgaWYgKGRzdCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkRlc3RpbmF0aW9uIGlzIG51bGwiICk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZHN0Lm1vbml0b3IoKSA9PSBtb25pdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1vdmVYbWxDb250ZW50c0ltcGwoIGRzdCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBhY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgR2xvYmFsTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRzdC5tb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vdmVYbWxDb250ZW50c0ltcGwoIGRzdCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChhY3F1aXJlZCkKLSAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIG1vdmVYbWxDb250ZW50c0ltcGwgKCBYbWxDdXJzb3IgZHN0ICkKLSAgICB7Ci0gICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmICghaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgZHN0IGlzIGluIHNyYyEgIEluIHRoaXMgY2FzZSwgdGhlcmUgaXMgbm90aGluZyB0bwotICAgICAgICAvLyBkby4KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChjb250YWlucyggZHN0ICkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgVG9rZW5UeXBlIHR0ID0gdG9GaXJzdENvbnRlbnRUb2tlbigpOwotICAgICAgICBhc3NlcnQgIXR0LmlzTm9uZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBtb3ZlZCA9ICFpc0ZpbmlzaCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghbW92ZVhtbEltcGwoIGRzdCApKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgd2hpbGUgKCAhaXNGaW5pc2goKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBiID0gbW92ZVhtbEltcGwoIGRzdCApOwotICAgICAgICAgICAgICAgIGFzc2VydCBiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgdG9QYXJlbnQoKTsKLSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiBtb3ZlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb3B5WG1sQ29udGVudHMgKCBYbWxDdXJzb3IgZHN0ICkKLSAgICB7Ci0gICAgICAgIGlmIChkc3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJEZXN0aW5hdGlvbiBpcyBudWxsIiApOwotICAgICAgICAKLSAgICAgICAgaWYgKGRzdC5tb25pdG9yKCkgPT0gbW9uaXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb3B5WG1sQ29udGVudHNJbXBsKCBkc3QgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gYWNxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEdsb2JhbExvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChkc3QubW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3B5WG1sQ29udGVudHNJbXBsKCBkc3QgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYWNxdWlyZWQpCi0gICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBjb3B5WG1sQ29udGVudHNJbXBsICggWG1sQ3Vyc29yIGRzdCApCi0gICAgewotICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoIWlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGRzdCBpcyBpbiBzcmMhICBJbiB0aGlzIGNhc2UsIGNvcHkgdGhlIHNyYyB0byBhIG5ldwotICAgICAgICAvLyBkb2N1bWVudCBhbmQgdGhlbiBtb3ZlIHRoZSBjb3BpZWQgY29udGVudHMgdG8gdGhlIGRlc3RpbmF0aW9uLgotICAgICAgICAgICAgCi0gICAgICAgIGlmIChjb250YWlucyggZHN0ICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEN1cnNvciBjVG1wID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdDdXJzb3IoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY1RtcC50b05leHRUb2tlbigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIWNvcHlYbWxDb250ZW50c0ltcGwoIGNUbXAgKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjVG1wLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNUbXAudG9TdGFydERvYygpOwotICAgICAgICAgICAgKChDdXJzb3IpY1RtcCkubW92ZVhtbENvbnRlbnRzSW1wbCggZHN0ICk7Ci0gICAgICAgICAgICBjVG1wLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgVG9rZW5UeXBlIHR0ID0gdG9GaXJzdENvbnRlbnRUb2tlbigpOwotICAgICAgICBhc3NlcnQgIXR0LmlzTm9uZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBjb3BpZWQgPSAhaXNGaW5pc2goKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWNvcHlYbWxJbXBsKCBkc3QgKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzU3RhcnQoKSkKLSAgICAgICAgICAgICAgICAgICAgdG9FbmRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRvTmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGlzRmluaXNoKCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBiID0gY29weVhtbEltcGwoIGRzdCApOwotICAgICAgICAgICAgICAgIGFzc2VydCBiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgdG9QYXJlbnQoKTsKLSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiBjb3BpZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJblNhbWVEb2N1bWVudCAoIFhtbEN1cnNvciB4dGhhdCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAoeHRoYXQgPT0gbnVsbCB8fCAhKHh0aGF0IGluc3RhbmNlb2YgQ3Vyc29yKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICBDdXJzb3IgdGhhdCA9IChDdXJzb3IpIHh0aGF0OwotICAgIAotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCggdGhhdCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gZ2V0Um9vdCgpID09IHRoYXQuZ2V0Um9vdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHVzaCAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKF9zdGFjayA9PSBudWxsKQotICAgICAgICAgICAgICAgIF9zdGFjayA9IG5ldyBTZWxlY3Rpb25zKCk7Ci0gICAgCi0gICAgICAgICAgICBfc3RhY2suYWRkKCBnZXRSb290KCksIGdldFNwbGF5KCksIGdldFBvcygpICk7Ci0gICAgCi0gICAgICAgICAgICBnZXRSb290KCkucmVnaXN0ZXJGb3JDaGFuZ2UoIHRoaXMgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHBvcCAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKF9zdGFjayA9PSBudWxsIHx8IF9zdGFjay5zaXplKCkgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICBfc3RhY2suc2V0Q3Vyc29yKCB0aGlzLCBfc3RhY2suc2l6ZSgpIC0gMSApOwotICAgIAotICAgICAgICAgICAgX3N0YWNrLnBvcCgpOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRTZWxlY3Rpb25Db3VudCAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIF9zZWxlY3Rpb25zID09IG51bGwgPyAwIDogX3NlbGVjdGlvbnMuc2l6ZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHRvU2VsZWN0aW9uICggaW50IGkgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKF9zZWxlY3Rpb25zICE9IG51bGwgJiYgaSA+PSAwICYmIF9zZWxlY3Rpb25zLnNldEN1cnNvciggdGhpcywgaSApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jdXJyZW50U2VsZWN0aW9uID0gaTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0U2VsZWN0aW9uICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgcHVzaCgpOwotICAgICAgICAgICAgaW50IGN1cnJlbnRTZWxlY3Rpb24gPSBfY3VycmVudFNlbGVjdGlvbjsKLSAgICAKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0b05leHRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3AoKTsKLSAgICAgICAgICAgICAgICBfY3VycmVudFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gdG9OZXh0U2VsZWN0aW9uICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgIAotICAgICAgICAgICAgaWYgKF9zZWxlY3Rpb25zID09IG51bGwgfHwgX2N1cnJlbnRTZWxlY3Rpb24gPCAtMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgICAgICAgICBpbnQgbmV4dFNlbGVjdGlvbiA9IF9jdXJyZW50U2VsZWN0aW9uICsgMTsKLSAgICAKLSAgICAgICAgICAgIGlmICghX3NlbGVjdGlvbnMuc2V0Q3Vyc29yKCB0aGlzLCBuZXh0U2VsZWN0aW9uICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2N1cnJlbnRTZWxlY3Rpb24gPSAtMjsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBfY3VycmVudFNlbGVjdGlvbiA9IG5leHRTZWxlY3Rpb247Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyU2VsZWN0aW9ucyAoICApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChfc2VsZWN0aW9ucyAhPSBudWxsKQotICAgICAgICAgICAgICAgIF9zZWxlY3Rpb25zLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgX2N1cnJlbnRTZWxlY3Rpb24gPSAtMjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFRvU2VsZWN0aW9uICggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoX3NlbGVjdGlvbnMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBfc2VsZWN0aW9ucyA9IFBhdGgubmV3U2VsZWN0aW9ucygpOwotICAgIAotICAgICAgICAgICAgLy8gRm9yY2UgYW55IHNlbGVjdGlvbiBlbmdpbmUgdG8gc2VhcmNoIGFsbC4uLgotICAgICAgICAgICAgX3NlbGVjdGlvbnMuc2l6ZSgpOwotICAgIAotICAgICAgICAgICAgX3NlbGVjdGlvbnMuYWRkKCBnZXRSb290KCksIGdldFNwbGF5KCksIGdldFBvcygpICk7Ci0gICAgCi0gICAgICAgICAgICBnZXRSb290KCkucmVnaXN0ZXJGb3JDaGFuZ2UoIHRoaXMgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjaGFuZ2VOb3RpZmljYXRpb24gKCApCi0gICAgewotICAgICAgICBpZiAoX3NlbGVjdGlvbnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3NlbGVjdGlvbnMuc2l6ZSgpOyAgLy8gRm9yY2UgYSBmdWxsIHNlbGVjdGlvbgotICAgICAgICAgICAgX3NlbGVjdGlvbnMuY3Vyc2lmeSggZ2V0Um9vdCgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX3N0YWNrICE9IG51bGwpCi0gICAgICAgICAgICBfc3RhY2suY3Vyc2lmeSggZ2V0Um9vdCgpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNlbGVjdFBhdGggKCBTdHJpbmcgcGF0aCwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChfc2VsZWN0aW9ucyA9PSBudWxsKQotICAgICAgICAgICAgICAgIF9zZWxlY3Rpb25zID0gUGF0aC5uZXdTZWxlY3Rpb25zKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgX3NlbGVjdGlvbnMuZGlzcG9zZSgpOwotICAgIAotICAgICAgICAgICAgX3NlbGVjdGlvbnMuaW5pdCggCi0gICAgICAgICAgICAgICAgUGF0aC5zZWxlY3QoIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSwgZ2V0UG9zKCksIHBhdGgsIG9wdGlvbnMgKSApOwotICAgIAotICAgICAgICAgICAgcHVzaCgpOwotICAgIAotICAgICAgICAgICAgaWYgKF9zZWxlY3Rpb25zLnNldEN1cnNvciggdGhpcywgMCApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldFJvb3QoKS5yZWdpc3RlckZvckNoYW5nZSggdGhpcyApOwotICAgICAgICAgICAgICAgIF9jdXJyZW50U2VsZWN0aW9uID0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgX2N1cnJlbnRTZWxlY3Rpb24gPSAtMjsKLSAgICAKLSAgICAgICAgICAgIHBvcCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNlbGVjdFBhdGggKCBTdHJpbmcgcGF0aCApCi0gICAgewotICAgICAgICBzZWxlY3RQYXRoKCBwYXRoLCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBYbWxDdXJzb3IgZXhlY1F1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKLSAgICAKLSAgICAgICAgICAgIHJldHVybiBQYXRoLnF1ZXJ5KCB0aGlzLCBxdWVyeUV4cHIsIG9wdGlvbnMgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgWG1sQ3Vyc29yIGV4ZWNRdWVyeSAoIFN0cmluZyBxdWVyeSApCi0gICAgewotICAgICAgICByZXR1cm4gZXhlY1F1ZXJ5KCBxdWVyeSwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIG5ld0RvbU5vZGUgKCApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3RG9tTm9kZSggbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTm9kZSBuZXdEb21Ob2RlICggWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBTYXZlci5Eb21TYXZlciBzYXZlcjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc2F2ZXIgPSBuZXcgU2F2ZXIuRG9tU2F2ZXIoCi0gICAgICAgICAgICAgICAgICAgIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSwgZ2V0UG9zKCksICFpc0ZyYWdtZW50KCksIG9wdGlvbnMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHNhdmVyLmV4cG9ydERvbSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pCi0gICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0ZyYWdtZW50KCkKLSAgICB7Ci0gICAgICAgIGlmICghIGlzU3RhcnRkb2MoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGJvb2xlYW4gc2VlbkVsZW1lbnQgPSBmYWxzZTsKLQotICAgICAgICBYbWxDdXJzb3IgYyA9IG5ld0N1cnNvcigpOwotICAgICAgICBpbnQgdG9rZW4gPSBjLnRvTmV4dFRva2VuKCkuaW50VmFsdWUoKTsKLQotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBMT09QOgotICAgICAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU1dJVENIOgotICAgICAgICAgICAgICAgIHN3aXRjaCAodG9rZW4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5JTlRfU1RBUlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VlbkVsZW1lbnQpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VlbkVsZW1lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBjLnRvRW5kVG9rZW4oKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgU1dJVENIOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLklOVF9URVhUOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgU3BsYXkuaXNXaGl0ZVNwYWNlKGMuZ2V0Q2hhcnMoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGMudG9OZXh0VG9rZW4oKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgU1dJVENIOwotCi0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuSU5UX05PTkU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLklOVF9FTkRET0M6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBMT09QOwotCi0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuSU5UX0FUVFI6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLklOVF9OQU1FU1BBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5JTlRfRU5EOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5JTlRfQ09NTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuSU5UX1BST0NJTlNUOgotICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBjLnRvTmV4dFRva2VuKCkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIFNXSVRDSDsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5JTlRfU1RBUlRET0M6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBMT09QOwotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIGMuZGlzcG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICEgc2VlbkVsZW1lbnQ7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlICggQ29udGVudEhhbmRsZXIgY2gsIExleGljYWxIYW5kbGVyIGxoICkKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc2F2ZSggY2gsIGxoLCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNhdmUgKCBGaWxlIGZpbGUgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHNhdmUoIGZpbGUsIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2F2ZSAoIE91dHB1dFN0cmVhbSBvcyApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc2F2ZSggb3MsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlICggV3JpdGVyIHcgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHNhdmUoIHcsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlICggQ29udGVudEhhbmRsZXIgY2gsIExleGljYWxIYW5kbGVyIGxoLCBYbWxPcHRpb25zIG9wdGlvbnMpCi0gICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIHRvZG86IGRvbid0IGhvbGQgdGhlIG1vbml0b3IgYWxsIHRoaXMgbG9uZy4KLSAgICAgICAgLy8gSWRlYWxseSwgd2UnZCByZWxlYXNlIHRoZSBtb25pdG9yIGVhY2ggdGltZSB3ZSdyZSBhYm91dCB0byBjYWxsIHRoZQotICAgICAgICAvLyBjaCBvciBsaCBvYmplY3RzLiAgSG93ZXZlciwgdGhlIHNhdmVyIGNvZGUgaXNuJ3QgX3F1aXRlXyBzdHJ1Y3R1cmUKLSAgICAgICAgLy8ganVzdCByaWdodCB0byBkbyB0aGF0LiAgU28gaW5zdGVhZCwgdGhlIGN1cnJlbnQgdmVyc2lvbiB3aWxsIGhvbGQKLSAgICAgICAgLy8gdGhlIG1vbml0b3IgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZW50aXJlIFNBWCBzYXZlLgotICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG5ldyBTYXZlci5TYXhTYXZlciggZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSwgb3B0aW9ucywgY2gsIGxoICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2F2ZSAoIEZpbGUgZmlsZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggZmlsZSApOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzYXZlKCBvcywgb3B0aW9ucyApOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgb3MuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzYXZlICggT3V0cHV0U3RyZWFtIG9zLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIG5vdGUgdGhhdCB3ZSBkbyBub3QgaG9sZCB0aGUgbW9uaXRvciBmb3IgdGhlIGR1cmF0aW9uIG9mIGEgc2F2ZS4KLSAgICAgICAgLy8gSW5zdGVhZCwgYSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZQotICAgICAgICAvLyBkb2N1bWVudCBpcyBtb2RpZmllZCB3aGlsZSB0aGUgc2F2ZSBpcyBpbiBwcm9ncmVzcy4gSWYgdGhlIHVzZXIKLSAgICAgICAgLy8gd2lzaGVzIHRvIHByb3RlY3QgYWdhaW5zdCB0aGlzLCBoZSBjYW4gc3luY2hyb25pemUgb24gdGhlIG1vbml0b3IKLSAgICAgICAgLy8gaGltc2VsZi4KLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXdJbnB1dFN0cmVhbSggb3B0aW9ucyApOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsgODE5MiBdOwotCi0gICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBuID0gaXMucmVhZCggYnl0ZXMgKTsKLQotICAgICAgICAgICAgICAgIGlmIChuIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBvcy53cml0ZSggYnl0ZXMsIDAsIG4gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2F2ZSAoIFdyaXRlciB3LCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlYWRlciByID0gbmV3UmVhZGVyKCBvcHRpb25zICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWyA4MTkyIF07Ci0KLSAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IG4gPSByLnJlYWQoIGNoYXJzICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobiA8IDApCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgdy53cml0ZSggY2hhcnMsIDAsIG4gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHIuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZSAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBfZ29vYmVyLmdldFJvb3QoKS52YWxpZGF0ZSgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkdW1wICggKSB7IF9nb29iZXIuZ2V0Um9vdCgpLmR1bXAoKTsgfQotICAgIHB1YmxpYyB2b2lkIGR1bXAgKCBib29sZWFuIHZlcmJvc2UgKSB7IF9nb29iZXIuZ2V0Um9vdCgpLmR1bXAoIHZlcmJvc2UgKTsgfQotCi0gICAgaW50ZXJmYWNlIFBhdGhFbmdpbmUKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gbmV4dCAoIFNlbGVjdGlvbnMgc2VsZWN0aW9ucyApOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBTZWxlY3Rpb25zCi0gICAgewotICAgICAgICB2b2lkIGluaXQgKCBQYXRoRW5naW5lIHBhdGhFbmdpbmUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkaXNwb3NlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF9wYXRoRW5naW5lID0gcGF0aEVuZ2luZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBhZGQgKCBSb290IHIsIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGQoIHIsIHMsIDAgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBhZGQgKCBSb290IHIsIFNwbGF5IHMsIGludCBwICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Um9vdFNsb3coKSA9PSByOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoX2N1cnNvcnMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDdXJzb3JHb29iZXIgZyA9IG5ldyBDdXJzb3JHb29iZXIoIHIgKTsKLQotICAgICAgICAgICAgICAgIGcuc2V0KCBzLCBwICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgX2N1cnNvcnMuYWRkKCBnICk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChfc3BsYXlzID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IF9jb3VudCA9PSAwOwotICAgICAgICAgICAgICAgIF9zcGxheXMgPSBuZXcgU3BsYXkgWyAxNiBdOwotICAgICAgICAgICAgICAgIF9wb3NpdGlvbnMgPSBuZXcgaW50IFsgMTYgXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKF9jb3VudCA9PSBfc3BsYXlzLmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTcGxheVtdIG5ld1NwbGF5cyA9IG5ldyBTcGxheSBbIF9jb3VudCAqIDIgXTsKLSAgICAgICAgICAgICAgICBpbnRbXSAgIG5ld1Bvc2l0aW9ucyA9IG5ldyBpbnQgWyBfY291bnQgKiAyIF07Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX3NwbGF5cywgMCwgbmV3U3BsYXlzLCAwLCBfY291bnQgKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfcG9zaXRpb25zLCAwLCBuZXdQb3NpdGlvbnMsIDAsIF9jb3VudCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIF9zcGxheXMgPSBuZXdTcGxheXM7Ci0gICAgICAgICAgICAgICAgX3Bvc2l0aW9ucyA9IG5ld1Bvc2l0aW9uczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgX3NwbGF5c1sgX2NvdW50IF0gPSBzOwotICAgICAgICAgICAgX3Bvc2l0aW9uc1sgX2NvdW50IF0gPSBwOwotCi0gICAgICAgICAgICBfY291bnQrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcG9wICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgc2l6ZSgpID4gMDsKLQotICAgICAgICAgICAgaWYgKF9jdXJzb3JzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGkgPSBfY3Vyc29ycy5zaXplKCkgLSAxOwotICAgICAgICAgICAgICAgICgoQ3Vyc29yR29vYmVyKSBfY3Vyc29ycy5nZXQoIGkgKSkuc2V0KCBudWxsLCAwICk7Ci0gICAgICAgICAgICAgICAgX2N1cnNvcnMucmVtb3ZlKCBpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgX2NvdW50LS07Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGN1cnNpZnkgKCBSb290IHIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2N1cnNvcnMgIT0gbnVsbCB8fCBfY291bnQgPD0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIF9jdXJzb3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgX2NvdW50IDsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDdXJzb3JHb29iZXIgZyA9IG5ldyBDdXJzb3JHb29iZXIoIHIgKTsKLQotICAgICAgICAgICAgICAgIGcuc2V0KCBfc3BsYXlzWyBpIF0sIF9wb3NpdGlvbnNbIGkgXSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIF9jdXJzb3JzLmFkZCggZyApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBfY291bnQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHNpemUgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfcGF0aEVuZ2luZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlICggX3BhdGhFbmdpbmUubmV4dCggdGhpcyApICkKLSAgICAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgICAgICAgICAgX3BhdGhFbmdpbmUgPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gY3VycmVudFNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBjdXJyZW50U2l6ZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9jdXJzb3JzICE9IG51bGwgPyBfY3Vyc29ycy5zaXplKCkgOiBfY291bnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHNldEN1cnNvciAoIEN1cnNvciBjLCBpbnQgaSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBpID49IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlICggX3BhdGhFbmdpbmUgIT0gbnVsbCAmJiBjdXJyZW50U2l6ZSgpIDw9IGkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghX3BhdGhFbmdpbmUubmV4dCggdGhpcyApKQotICAgICAgICAgICAgICAgICAgICBfcGF0aEVuZ2luZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpID49IGN1cnJlbnRTaXplKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoX2N1cnNvcnMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgaSA8IF9jdXJzb3JzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBjLnNldCggKEN1cnNvckdvb2JlcikgX2N1cnNvcnMuZ2V0KCBpICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgaSA8IF9jb3VudDsKLSAgICAgICAgICAgICAgICBjLnNldCggX3NwbGF5c1sgaSBdLCBfcG9zaXRpb25zWyBpIF0gKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGRpc3Bvc2UgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfY3Vyc29ycyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfY3Vyc29ycy5zaXplKCkgOyBpKysgKQotICAgICAgICAgICAgICAgICAgICAoKEN1cnNvckdvb2JlcikgX2N1cnNvcnMuZ2V0KCBpICkpLnNldCggbnVsbCwgMCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIF9jdXJzb3JzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgX2N1cnNvcnMgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBfY291bnQgPSAwOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVE9ETyAtIGNhY2hlIHVudXNlZCBTZWxlY2l0b24gb2JqZWN0cyBmb3IgbGF0ZXIgcmV1c2UKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3BsYXlbXSBfc3BsYXlzOwotICAgICAgICBwcml2YXRlIGludFtdICAgX3Bvc2l0aW9uczsKLSAgICAgICAgcHJpdmF0ZSBpbnQgICAgIF9jb3VudDsKLQotICAgICAgICBwcml2YXRlIEFycmF5TGlzdCBfY3Vyc29yczsKLQotICAgICAgICBwcml2YXRlIFBhdGhFbmdpbmUgX3BhdGhFbmdpbmU7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgZmluYWwgQ3Vyc29yR29vYmVyIF9nb29iZXI7Ci0KLSAgICBwcml2YXRlIFNlbGVjdGlvbnMgX3N0YWNrOwotICAgIAotICAgIHByaXZhdGUgU2VsZWN0aW9ucyBfc2VsZWN0aW9uczsKLSAgICBwcml2YXRlIGludCAgICAgICAgX2N1cnJlbnRTZWxlY3Rpb247Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0dvb2JlcnMuamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvR29vYmVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGUzZjNjLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvR29vYmVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuR29vYmVyOwotCi1wdWJsaWMgY2xhc3MgR29vYmVycwotewotICAgIEdvb2JlciBfZ29vYmVyczsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvUGF0aC5qYXZhIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9QYXRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNTI3OWIuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9QYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5DdXJzb3JHb29iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLkN1cnNvci5TZWxlY3Rpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5DdXJzb3IuUGF0aEVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YUGF0aDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlR5cGVTdG9yZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgcHJlY29tcGlsZWQgcGF0aCBleHByZXNzaW9uCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFBhdGgKLXsKLSAgICBzdGF0aWMgU2VsZWN0aW9ucyBuZXdTZWxlY3Rpb25zICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb25zKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIFBhdGhFbmdpbmUgc2VsZWN0ICgKLSAgICAgICAgUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgU3RyaW5nIHBhdGhFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgUGF0aCBwYXRoID0gZ2V0UGF0aCggcGF0aEV4cHIsIG9wdGlvbnMgKTsKLSAgICAgICAgcmV0dXJuIChwYXRoID09IG51bGwpID8gbnVsbCA6IHBhdGguZXhlY3V0ZSggciwgcywgcCwgb3B0aW9ucyApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF91c2VYcXJsRm9yWHBhdGggPSAidXNlIHhxcmwgZm9yIHhwYXRoIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF91c2VYYmVhbkZvclhwYXRoID0gInVzZSB4YmVhbiBmb3IgeHBhdGgiOwotCi0gICAgcHVibGljIHN0YXRpYyBQYXRoIGdldFBhdGggKCBTdHJpbmcgcGF0aEV4cHIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFBhdGgoIHBhdGhFeHByLCBmYWxzZSwgbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFBhdGggZ2V0UGF0aCAoIFN0cmluZyBwYXRoRXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgZ2V0UGF0aCgKLSAgICAgICAgICAgICAgICBwYXRoRXhwciwKLSAgICAgICAgICAgICAgICBYbWxPcHRpb25zLm1hc2tOdWxsKCBvcHRpb25zICkuaGFzT3B0aW9uKCBfdXNlWHFybEZvclhwYXRoICksCi0gICAgICAgICAgICAgICAgb3B0aW9ucyApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUGF0aCBnZXRQYXRoICggU3RyaW5nIHBhdGhFeHByLCBib29sZWFuIHhxcmwsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBPYmplY3QgcGF0aCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBzeW5jaHJvbml6ZWQgKCBfeGJlYW5QYXRoQ2FjaGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXhxcmwpCi0gICAgICAgICAgICAgICAgcGF0aCA9IF94YmVhblBhdGhDYWNoZS5nZXQoIHBhdGhFeHByICk7Ci0KLSAgICAgICAgICAgIGlmIChwYXRoID09IG51bGwpCi0gICAgICAgICAgICAgICAgcGF0aCA9IF94cXJsUGF0aENhY2hlLmdldCggcGF0aEV4cHIgKTsKLQotICAgICAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aFN0ciA9IGdldENvbXBpbGVkUGF0aCggcGF0aEV4cHIsIHhxcmwsIG9wdGlvbnMgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYXRoID0KLSAgICAgICAgICAgICAgICAgICAgKHBhdGhTdHIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRQYXRoKCBwYXRoRXhwciwgeHFybCwgb3B0aW9ucyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChQYXRoKSBwYXRoOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21waWxlZFBhdGggKCBTdHJpbmcgcGF0aEV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0Q29tcGlsZWRQYXRoKCBwYXRoRXhwciwgZmFsc2UsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q3VycmVudE5vZGVWYXIgKCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnROb2RlVmFyID0gInRoaXMiOwotCi0gICAgICAgIG9wdGlvbnMgPSBYbWxPcHRpb25zLm1hc2tOdWxsKCBvcHRpb25zICk7Ci0gICAgICAgIAotICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuWFFVRVJZX0NVUlJFTlRfTk9ERV9WQVIgKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudE5vZGVWYXIgPSAoU3RyaW5nKSBvcHRpb25zLmdldCggWG1sT3B0aW9ucy5YUVVFUllfQ1VSUkVOVF9OT0RFX1ZBUiApOwotCi0gICAgICAgICAgICBpZiAoY3VycmVudE5vZGVWYXIuc3RhcnRzV2l0aCggIiQiICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJPbWl0IHRoZSAnJCcgcHJlZml4IGZvciB0aGUgY3VycmVudCBub2RlIHZhcmlhYmxlIiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlVmFyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21waWxlZFBhdGggKCBTdHJpbmcgcGF0aEV4cHIsIGJvb2xlYW4geHFybCwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIFBhdGggcGF0aCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBvcHRpb25zID0gWG1sT3B0aW9ucy5tYXNrTnVsbCggb3B0aW9ucyApOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGN1cnJlbnROb2RlVmFyID0gZ2V0Q3VycmVudE5vZGVWYXIoIG9wdGlvbnMgKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKCBfeGJlYW5QYXRoQ2FjaGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgKHhxcmwgfD0gb3B0aW9ucy5oYXNPcHRpb24oIF91c2VYcXJsRm9yWHBhdGggKSkgfHwgdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKCF4cXJsIHx8IG9wdGlvbnMuaGFzT3B0aW9uKCBfdXNlWGJlYW5Gb3JYcGF0aCApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBhdGggPSAoUGF0aCkgX3hiZWFuUGF0aENhY2hlLmdldCggcGF0aEV4cHIgKTsKLQotICAgICAgICAgICAgICAgIGlmIChwYXRoID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwYXRoID0gWGJlYW5QYXRoSW1wbC5jcmVhdGUoIHBhdGhFeHByLCBjdXJyZW50Tm9kZVZhciApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBfeGJlYW5QYXRoQ2FjaGUucHV0KCBwYXRoLmdldFBhdGhFeHByKCksIHBhdGggKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYXRoID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0ICEgb3B0aW9ucy5oYXNPcHRpb24oIF91c2VYYmVhbkZvclhwYXRoICk7Ci0KLSAgICAgICAgICAgICAgICBwYXRoID0gKFBhdGgpIF94cXJsUGF0aENhY2hlLmdldCggcGF0aEV4cHIgKTsKLQotICAgICAgICAgICAgICAgIGlmIChwYXRoID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwYXRoID0gWHFybFBhdGhJbXBsLmNyZWF0ZSggcGF0aEV4cHIsIGN1cnJlbnROb2RlVmFyICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIF94cXJsUGF0aENhY2hlLnB1dCggcGF0aC5nZXRQYXRoRXhwcigpLCBwYXRoICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBhdGggPT0gbnVsbCA/IG51bGwgOiBwYXRoLmdldFBhdGhFeHByKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludGVyZmFjZSBRdWVyeQotICAgIHsKLSAgICAgICAgUGF0aEVuZ2luZSAgZXhlY3V0ZVBhdGggICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zICk7Ci0gICAgICAgIFhtbEN1cnNvciAgIGV4ZWN1dGVRdWVyeSAoIEN1cnNvciBjLCBYbWxPcHRpb25zIG9wdGlvbnMgKTsKLSAgICAgICAgWG1sT2JqZWN0W10gZXhlY3V0ZVF1ZXJ5ICggVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKTsKLSAgICAgICAgU3RyaW5nICAgICAgZ2V0UXVlcnlFeHByICggKTsKLSAgICB9Ci0KLS8vICAgIHB1YmxpYyBzdGF0aWMgUXVlcnkgZ2V0UXVlcnkgKCBTdHJpbmcgcXVlcnlFeHByICkKLS8vICAgIHsKLS8vICAgICAgICByZXR1cm4gZ2V0UXVlcnkoIHF1ZXJ5RXhwciwgbnVsbCApOwotLy8gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgUXVlcnkgZ2V0UXVlcnkgKCBTdHJpbmcgcXVlcnlFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgT2JqZWN0IHF1ZXJ5ID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHN5bmNocm9uaXplZCAoIF94cXJsUXVlcnlDYWNoZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHF1ZXJ5ID0gX3hxcmxRdWVyeUNhY2hlLmdldCggcXVlcnlFeHByICk7Ci0KLSAgICAgICAgICAgIGlmIChxdWVyeSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBxdWVyeVN0ciA9IGdldENvbXBpbGVkUXVlcnkoIHF1ZXJ5RXhwciwgb3B0aW9ucyApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHF1ZXJ5ID0KLSAgICAgICAgICAgICAgICAgICAgKHF1ZXJ5U3RyID09IG51bGwpID8gbnVsbCA6IGdldFF1ZXJ5KCBxdWVyeUV4cHIsIG9wdGlvbnMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoUXVlcnkpIHF1ZXJ5OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21waWxlZFF1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIFF1ZXJ5IHF1ZXJ5ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnROb2RlVmFyID0gZ2V0Q3VycmVudE5vZGVWYXIoIG9wdGlvbnMgKTsKLSAgICAgICAgCi0gICAgICAgIHN5bmNocm9uaXplZCAoIF94cXJsUXVlcnlDYWNoZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHF1ZXJ5ID0gKFF1ZXJ5KSBfeHFybFF1ZXJ5Q2FjaGUuZ2V0KCBxdWVyeUV4cHIgKTsKLQotICAgICAgICAgICAgaWYgKHF1ZXJ5ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcXVlcnkgPSBYcXJsRGVsZWdhdGUuY29tcGlsZVF1ZXJ5KCBxdWVyeUV4cHIsIGN1cnJlbnROb2RlVmFyICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgX3hxcmxRdWVyeUNhY2hlLnB1dCggcXVlcnkuZ2V0UXVlcnlFeHByKCksIHF1ZXJ5ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcXVlcnkgPT0gbnVsbCA/IG51bGwgOiBxdWVyeS5nZXRRdWVyeUV4cHIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFhtbEN1cnNvciBxdWVyeSAoCi0gICAgICAgIEN1cnNvciBjLCBTdHJpbmcgcXVlcnlFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgUXVlcnkgcXVlcnkgPSBnZXRRdWVyeSggcXVlcnlFeHByLCBvcHRpb25zICk7Ci0gICAgICAgIHJldHVybiAocXVlcnkgPT0gbnVsbCkgPyBudWxsIDogcXVlcnkuZXhlY3V0ZVF1ZXJ5KCBjLCBvcHRpb25zICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3RbXSBxdWVyeSAoCi0gICAgICAgIFR5cGUgdHlwZSwgU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIFF1ZXJ5IHF1ZXJ5ID0gZ2V0UXVlcnkoIHF1ZXJ5RXhwciwgb3B0aW9ucyApOwotICAgICAgICByZXR1cm4gKHF1ZXJ5ID09IG51bGwpID8gbnVsbCA6IHF1ZXJ5LmV4ZWN1dGVRdWVyeSggdHlwZSwgb3B0aW9ucyApOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBQYXRoRW5naW5lIGV4ZWN1dGUgKAotICAgICAgICBSb290IHIsIFNwbGF5IHMsIGludCBwLCBYbWxPcHRpb25zIG9wdGlvbnMgKTsKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UGF0aEV4cHIgKCApOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgWHFybFBhdGhJbXBsIGV4dGVuZHMgUGF0aAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBYcXJsUGF0aEltcGwgKCBTdHJpbmcgcGF0aEV4cHIsIFF1ZXJ5IGNvbXBpbGVkUGF0aCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYXRoRXhwciA9IHBhdGhFeHByOwotICAgICAgICAgICAgX2NvbXBpbGVkUGF0aCA9IGNvbXBpbGVkUGF0aDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIF9wYXRoRXhwcjsKLSAgICAgICAgcHJpdmF0ZSBRdWVyeSAgX2NvbXBpbGVkUGF0aDsKLQotICAgICAgICBzdGF0aWMgUGF0aCBjcmVhdGUgKCBTdHJpbmcgcGF0aEV4cHIsIFN0cmluZyBjdXJyZW50Tm9kZVZhciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgWHFybFBhdGhJbXBsKAotICAgICAgICAgICAgICAgIHBhdGhFeHByLAotICAgICAgICAgICAgICAgIFhxcmxEZWxlZ2F0ZS5jb21waWxlUGF0aCggcGF0aEV4cHIsIGN1cnJlbnROb2RlVmFyICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBQYXRoRW5naW5lIGV4ZWN1dGUgKAotICAgICAgICAgICAgUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9jb21waWxlZFBhdGguZXhlY3V0ZVBhdGgoIHIsIHMsIHAsIG9wdGlvbnMgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXRoRXhwciAoICkgeyByZXR1cm4gX3BhdGhFeHByOyB9Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBYYmVhblBhdGhJbXBsIGV4dGVuZHMgUGF0aAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBYYmVhblBhdGhJbXBsICgKLSAgICAgICAgICAgIFhQYXRoIHhwYXRoLCBTdHJpbmcgcGF0aEV4cHIsIFN0cmluZyBjdXJyZW50Tm9kZVZhciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYXRoRXhwciA9IHBhdGhFeHByOwotICAgICAgICAgICAgX3hwYXRoID0geHBhdGg7Ci0gICAgICAgICAgICBfY3VycmVudE5vZGVWYXIgPSBjdXJyZW50Tm9kZVZhcjsKLSAgICAgICAgfQotCi0vLyAgICAgICAgICAgIHRyeQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudE5vZGVWYXIgPSAidGhpcyI7Ci0vLyAgICAgICAgICAgICAgICAKLS8vICAgICAgICAgICAgICAgIGlmIChYbWxPcHRpb25zLlhRVUVSWV9DVVJSRU5UX05PREVfVkFSLmhhcyggb3B0aW9ucyApKQotLy8gICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlVmFyID0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgIiQiICsgWG1sT3B0aW9ucy5YUVVFUllfQ1VSUkVOVF9OT0RFX1ZBUi5nZXQoIG9wdGlvbnMgKTsKLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlVmFyLnN0YXJ0c1dpdGgoICIkJCIgKSkKLS8vICAgICAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPbWl0IHRoZSAnJHAnIHJlZml4IGZvciB0aGUgY3VycmVudCAiICsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGUgdmFyaWFibGUiICk7Ci0vLyAgICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBQYXRoIGNyZWF0ZSAoIFN0cmluZyBwYXRoRXhwciwgU3RyaW5nIGN1cnJlbnROb2RlVmFyICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFjdXJyZW50Tm9kZVZhci5zdGFydHNXaXRoKCAiJCIgKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgIG5ldyBYYmVhblBhdGhJbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgWFBhdGguY29tcGlsZVhQYXRoKCBwYXRoRXhwciwgY3VycmVudE5vZGVWYXIgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhFeHByLCBjdXJyZW50Tm9kZVZhciApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBYUGF0aC5YUGF0aENvbXBpbGVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhdGhFeHByICggKSB7IHJldHVybiBfcGF0aEV4cHI7IH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBQYXRoRW5naW5lIGV4ZWN1dGUgKAotICAgICAgICAgICAgUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhlIGJ1aWx0aW4gWFBhdGggZW5naW5lIHdvcmtzIG9ubHkgb24gY29udGFpbmVycy4gIERlbGVnYXRlIHRvCi0gICAgICAgICAgICAvLyB4cXJsIG90aGVyd2lzZS4gIEFsc28sIGlmIHRoZSBwYXRoIGhhZCBhIC8vLiBhdCB0aGUgZW5kLCB0aGUKLSAgICAgICAgICAgIC8vIHNpbXBsZSB4cGF0aCBlbmdpbmUgY2FuJ3QgZG8gdGhlIGdlbmVyYXRlIGNhc2UsIGl0IG9ubHkgaGFuZGxlcwotICAgICAgICAgICAgLy8gYXR0cnMgYW5kIGVsZW1lbnRzLgotCi0gICAgICAgICAgICBpZiAocCAhPSAwIHx8ICFzLmlzQ29udGFpbmVyKCkgfHwgX3hwYXRoLnNhd0RlZXBEb3QoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgeGJlYW4gcGF0aCBjb21waWxlciBjb3VsZCBjb3VsZCBoYW5kbGUgdGhlIHBhdGgsIHRoZW4KLSAgICAgICAgICAgICAgICAvLyB0aGUgeHFybCBjb21waWxlciBiZXR0ZXIgYmUgYWJsZSB0byEKLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXRoKCBfcGF0aEV4cHIsIHRydWUsIG51bGwgKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCByLCBzLCBwLCBvcHRpb25zICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoICggVGhyb3dhYmxlIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJDYW4ndCBjb21waWxlIHBhdGgiLCBlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmV3IFhCZWFuUGF0aEVuZ2luZSggX3hwYXRoLCByLCBzICk7Ci0gICAgICAgIH0KLQotLy8gVE9ETyAtIGJlY2F1c2UgdGhpcyB4cGF0aCBlbmdpbmUgZG9lcyBub3QgdXNlIGEgc2F2ZXIsIGFueSBhdHRyaWJ1dGVzIGluIHRoZQotLy8gcGF0aCB3aGljaCByZWZlciB0byBuYW1lc2FwY2UgYXR0cmlidXRlcyB3aWxsIHJlcXVpcmUgdXMgdG8gcnVuIHRoZSBYUVJMCi0vLyBwYXRoIGVuZ2luZSB3aGljaCBpcyBiYXNlZCBvbiB0aGUgc2F2ZXIuCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgWEJlYW5QYXRoRW5naW5lCi0gICAgICAgICAgICBleHRlbmRzIFhQYXRoLkV4ZWN1dGlvbkNvbnRleHQgaW1wbGVtZW50cyBQYXRoRW5naW5lCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhCZWFuUGF0aEVuZ2luZSAoIFhQYXRoIHhwYXRoLCBSb290IHIsIFNwbGF5IHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgICAgICAgICBfcm9vdCA9IHI7Ci0gICAgICAgICAgICAgICAgX2N1cnIgPSBfdG9wID0gczsKLSAgICAgICAgICAgICAgICBfdmVyc2lvbiA9IHIuZ2V0VmVyc2lvbigpOwotCi0gICAgICAgICAgICAgICAgaW5pdCggeHBhdGggKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gbmV4dCAoIFNlbGVjdGlvbnMgc2VsZWN0aW9ucyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGluaXRpYWxTaXplID0gc2VsZWN0aW9ucy5jdXJyZW50U2l6ZSgpOwotCi0gICAgICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfcm9vdC5nZXRWZXJzaW9uKCkgIT0gX3ZlcnNpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiRG9jdW1lbnQgY2hhbmdlZCIgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoX2N1cnIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCBzZWxlY3Rpb25zICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGluaXRpYWxTaXplIDwgc2VsZWN0aW9ucy5jdXJyZW50U2l6ZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIFNwbGF5IGRvQXR0cnMgKCBpbnQgcmV0LCBTcGxheSBzLCBTZWxlY3Rpb25zIHNlbGVjdGlvbnMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgocmV0ICYgQVRUUlMpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yICggcyA9IF9jdXJyLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7Ci0gICAgICAgICAgICAgICAgICAgICAgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMuaXNOb3JtYWxBdHRyKCkgJiYgYXR0ciggcy5nZXROYW1lKCkgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbnMuYWRkKCBfcm9vdCwgcyApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgYWR2YW5jZSAoIFNlbGVjdGlvbnMgc2VsZWN0aW9ucyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9jdXJyID09IF90b3ApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gc3RhcnQoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCAmIEhJVCkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbnMuYWRkKCBfcm9vdCwgX2N1cnIgKTsKLQotICAgICAgICAgICAgICAgICAgICBTcGxheSBzID0gZG9BdHRycyggcmV0LCBfY3Vyciwgc2VsZWN0aW9ucyApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgocmV0ICYgREVTQ0VORCkgPT0gMCB8fCBfY3Vyci5pc0xlYWYoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jdXJyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgX2N1cnIgPSBzID09IG51bGwgPyBfY3Vyci5uZXh0Tm9uQXR0clNwbGF5KCkgOiBzOwotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9jdXJyLmlzRmluaXNoKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY3Vyci5nZXRDb250YWluZXIoKSA9PSBfdG9wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jdXJyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY3VyciA9IF9jdXJyLm5leHRTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoX2N1cnIuaXNCZWdpbigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gZWxlbWVudCggX2N1cnIuZ2V0TmFtZSgpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ICYgSElUKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbnMuYWRkKCBfcm9vdCwgX2N1cnIgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgU3BsYXkgcyA9IGRvQXR0cnMoIHJldCwgX2N1cnIsIHNlbGVjdGlvbnMgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9jdXJyLmlzTGVhZigpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jdXJyID0gcyA9PSBudWxsID8gX2N1cnIubmV4dE5vbkF0dHJTcGxheSgpIDogczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChyZXQgJiBERVNDRU5EKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jdXJyID0gKChTcGxheS5Db250YWluZXIpIF9jdXJyKS5nZXRGaW5pc2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY3VyciA9IHMgPT0gbnVsbCA/IF9jdXJyLm5leHROb25BdHRyU3BsYXkoKSA6IHM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIF9jdXJyID0gX2N1cnIubmV4dFNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIFJvb3QgIF9yb290OwotICAgICAgICAgICAgcHJpdmF0ZSBsb25nICBfdmVyc2lvbjsKLSAgICAgICAgICAgIHByaXZhdGUgU3BsYXkgX3RvcDsKLSAgICAgICAgICAgIHByaXZhdGUgU3BsYXkgX2N1cnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBfcGF0aEV4cHI7Ci0gICAgICAgIHByaXZhdGUgWFBhdGggIF94cGF0aDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX2N1cnJlbnROb2RlVmFyOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXAgX3hxcmxQYXRoQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXAgX3hiZWFuUGF0aENhY2hlID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIF94cXJsUXVlcnlDYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1Jvb3QuamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvUm9vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjU4YjA5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvUm9vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2MCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uRW5jb2RpbmdNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhNTE5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5LkZpbmlzaDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLk5hbWVzcGFjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxTdG9yZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlR5cGVTdG9yZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZUNhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yLlhtbEJvb2ttYXJrOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRG9jdW1lbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxMaW5lTnVtYmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTYXhIYW5kbGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5BdHRyaWJ1dGU7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5BdHRyaWJ1dGVJdGVyYXRvcjsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5Mb2NhdGlvbjsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlNwYWNlOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uU3RhcnREb2N1bWVudDsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlN0YXJ0RWxlbWVudDsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTEV2ZW50OwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxOYW1lOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGZpbmFsIGNsYXNzIFJvb3QgZXh0ZW5kcyBGaW5pc2ggaW1wbGVtZW50cyBYbWxTdG9yZQotewotICAgIHB1YmxpYyBSb290ICggU2NoZW1hVHlwZUxvYWRlciBzdGwsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBST09UICk7Ci0KLSAgICAgICAgYXNzZXJ0IHN0bCAhPSBudWxsOwotCi0gICAgICAgIF9zY2hlbWFUeXBlU3lzdGVtID0gc3RsOwotCi0gICAgICAgIF9sZWZ0T25seSA9IHRydWU7Ci0KLSAgICAgICAgX3Byb3BzID0gbmV3IERvY1Byb3BzKCk7Ci0KLSAgICAgICAgX2RvYyA9IG5ldyBEb2MoIHRoaXMsIG51bGwgKTsKLQotICAgICAgICBfbGVmdFNwbGF5ID0gX2RvYzsKLSAgICAgICAgX2RvYy5fcGFyZW50U3BsYXkgPSB0aGlzOwotICAgICAgICBhZGp1c3RDZG9jQmVnaW5MZWZ0KCBfZG9jLmdldENkb2NCZWdpbigpICk7Ci0KLSAgICAgICAgX3RleHQgPSBuZXcgVGV4dCgpOwotCi0gICAgICAgIFNjaGVtYVR5cGUgc1R5cGUgPSBudWxsOwotCi0gICAgICAgIG9wdGlvbnMgPSBYbWxPcHRpb25zLm1hc2tOdWxsKCBvcHRpb25zICk7Ci0gICAgICAgIAotICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuRE9DVU1FTlRfVFlQRSApKQotICAgICAgICAgICAgc1R5cGUgPSAoU2NoZW1hVHlwZSkgb3B0aW9ucy5nZXQoIFhtbE9wdGlvbnMuRE9DVU1FTlRfVFlQRSApOwotCi0gICAgICAgIGlmIChzVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgc1R5cGUgPSB0eXBlOwotCi0gICAgICAgIGlmIChzVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgc1R5cGUgPSBYbWxPYmplY3QudHlwZTsKLQotICAgICAgICBfdmFsaWRhdGVPblNldCA9IG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlZBTElEQVRFX09OX1NFVCApOwotCi0gICAgICAgIF9mYWN0b3J5ID0gKFR5cGVTdG9yZUZhY3RvcnkpIG9wdGlvbnMuZ2V0KCBUeXBlU3RvcmVGYWN0b3J5LktFWSApOwotCi0gICAgICAgIF9kb2Muc2V0VHlwZSggdGhpcywgc1R5cGUgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFhtbFN0b3JlIG5ld1N0b3JlICggU2NoZW1hVHlwZUxvYWRlciBzdGwsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgUm9vdCggc3RsLCB0eXBlLCBvcHRpb25zICk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbERvY3VtZW50UHJvcGVydGllcyBkb2N1bWVudFByb3BlcnRpZXMgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3Byb3BzOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxDdXJzb3IgY3JlYXRlQ3Vyc29yICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlKCk7Ci0gICAgICAgIHJldHVybiBuZXcgQ3Vyc29yKCB0aGlzLCBfZG9jICk7Ci0gICAgfQotCi0gICAgQ29udGFpbmVyIGdldENvbnRhaW5lciAoICkgeyByZXR1cm4gX2RvYzsgfQotCi0gICAgYm9vbGVhbiB2YWxpZGF0ZU9uU2V0ICggKSB7IHJldHVybiBfdmFsaWRhdGVPblNldDsgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBnZXRPYmplY3QgKCApCi0gICAgewotICAgICAgICBUeXBlIHQgPSBfZG9jLnBlZWtUeXBlKCk7Ci0KLSAgICAgICAgcmV0dXJuIHQgPT0gbnVsbCA/IG51bGwgOiB0LmdldFhtbE9iamVjdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFUeXBlTG9hZGVyIGdldFNjaGVtYVR5cGVMb2FkZXIgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3NjaGVtYVR5cGVTeXN0ZW07Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc0VtcHR5ICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9sZWZ0U3BsYXkgPT0gX2RvYyAmJiBfZG9jLl9yaWdodFNwbGF5ID09IG51bGwgJiYgX2RvYy5pc1ZhbGlkKCk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc0xlZnRPbmx5ICggKSB7IHJldHVybiBfbGVmdE9ubHk7IH0KLQotICAgIHZvaWQgZW5zdXJlRW1wdHkgKCApCi0gICAgewotICAgICAgICBpZiAoIWlzRW1wdHkoKSkKLSAgICAgICAgICAgIF9kb2MucmVtb3ZlQ29udGVudCggdGhpcywgdHJ1ZSApOwotCi0gICAgICAgIGFzc2VydCBpc0VtcHR5KCk7Ci0gICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOwotICAgICAgICBhc3NlcnQgX2xlZnRPbmx5OwotICAgICAgICBhc3NlcnQgZ2V0Q2NoTGVmdCgpID09IDA7Ci0gICAgICAgIGFzc2VydCBfdGV4dC5sZW5ndGgoKSA9PSAwOwotICAgICAgICBhc3NlcnQgZ2V0Q2RvY0JlZ2luTGVmdCgpID09IDE7Ci0gICAgICAgIGFzc2VydCBfZG9jICE9IG51bGwgJiYgX2xlZnRTcGxheSA9PSBfZG9jOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlQ2NoICggU3BsYXkgcywgaW50IGRlbHRhQ2NoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCAhcy5pc1Jvb3QoKTsKLQotICAgICAgICBpZiAoZGVsdGFDY2ggIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcy5zcGxheSggdGhpcywgdGhpcyApOwotCi0gICAgICAgICAgICBzLmFkanVzdENjaCggZGVsdGFDY2ggKTsKLSAgICAgICAgICAgIGFkanVzdENjaExlZnQoIGRlbHRhQ2NoICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgZ2V0Q3AgKCBTcGxheSBzICkKLSAgICB7Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIEEgbGVmdCBvbmx5IHRyZWUgaGFzIHRoZSBuaWNlIHByb3BlcnR5IHRoYXQgX2NjaExlZnQgaXMKLSAgICAgICAgLy8gYWxzbyB0aGUgY3AhCi0gICAgICAgIC8vCi0KLSAgICAgICAgaWYgKCFfbGVmdE9ubHkgJiYgcyAhPSB0aGlzKQotICAgICAgICAgICAgcy5zcGxheSggdGhpcywgdGhpcyApOwotCi0gICAgICAgIHJldHVybiBzLmdldENjaExlZnQoKTsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0RG9jQmVnaW5JbmRleCAoIFNwbGF5IHMgKQotICAgIHsKLSAgICAgICAgLy8KLSAgICAgICAgLy8gQSBsZWZ0IG9ubHkgdHJlZSBoYXMgdGhlIG5pY2UgcHJvcGVydHkgdGhhdCBjZG9jQmVnaW5MZWZ0IGlzCi0gICAgICAgIC8vIGFsc28gdGhlIHBvcyEKLSAgICAgICAgLy8KLQotICAgICAgICBpZiAoIV9sZWZ0T25seSkKLSAgICAgICAgICAgIHMuc3BsYXkoIHRoaXMsIHRoaXMgKTsKLQotICAgICAgICByZXR1cm4gcy5nZXRDZG9jQmVnaW5MZWZ0KCk7Ci0gICAgfQotICAgIAotICAgIEJlZ2luIGZpbmROdGhCZWdpbiAoIFNwbGF5IHBhcmVudCwgUU5hbWUgbmFtZSwgUU5hbWVTZXQgc2V0LCBpbnQgbiApCi0gICAgewotICAgICAgICAvLyBvbmx5IG9uZSBvZiAoc2V0IG9yIG5hbWUpIGlzIG5vdCBudWxsCi0gICAgICAgIC8vIG9yIGJvdGggYXJlIG51bGwgZm9yIGEgd2lsZGNhcmQKLSAgICAgICAgYXNzZXJ0ICggbmFtZSA9PSBudWxsIHx8IHNldCA9PSBudWxsICk7Ci0gICAgICAgIGFzc2VydCBuID49IDA7Ci0KLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsIHx8IHBhcmVudC5pc0xlYWYoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGludCBkYSA9IF9udGhDYWNoZV9BLmRpc3RhbmNlKCBwYXJlbnQsIG5hbWUsIHNldCwgbiApOwotICAgICAgICBpbnQgZGIgPSBfbnRoQ2FjaGVfQi5kaXN0YW5jZSggcGFyZW50LCBuYW1lLCBzZXQsIG4gKTsKLQotICAgICAgICBCZWdpbiBiID0KLSAgICAgICAgICAgIGRhIDw9IGRiCi0gICAgICAgICAgICAgICAgPyBfbnRoQ2FjaGVfQS5mZXRjaCggcGFyZW50LCBuYW1lLCBzZXQsIG4gKQotICAgICAgICAgICAgICAgIDogX250aENhY2hlX0IuZmV0Y2goIHBhcmVudCwgbmFtZSwgc2V0LCBuICk7Ci0KLSAgICAgICAgaWYgKGRhID09IGRiKQotICAgICAgICB7Ci0gICAgICAgICAgICBudGhDYWNoZSB0ZW1wID0gX250aENhY2hlX0E7Ci0gICAgICAgICAgICBfbnRoQ2FjaGVfQSA9IF9udGhDYWNoZV9COwotICAgICAgICAgICAgX250aENhY2hlX0IgPSB0ZW1wOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotCi0gICAgaW50IGNvdW50ICggQ29udGFpbmVyIHBhcmVudCwgUU5hbWUgbmFtZSwgUU5hbWVTZXQgc2V0ICkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHMgPSBmaW5kTnRoQmVnaW4oIHBhcmVudCwgbmFtZSwgc2V0LCAwICk7Ci0KLSAgICAgICAgaWYgKHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGludCBuID0gMDsKLQotICAgICAgICBmb3IgKCA7IDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocy5pc0ZpbmlzaCgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBpZiAoIXMuaXNCZWdpbigpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBpZiAoc2V0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgbisrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzZXQuY29udGFpbnMocy5nZXROYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICBuKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHMgPSBzLmdldEZpbmlzaFNwbGF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdXAgc3Ryb25nIHR5cGUgaW5mb3JtYXRpb24gYmFzZWQgb24gdGhpcyBzY2hlbWEgdHlwZSBzeXN0ZW0uCi0gICAgICovCi0KLSAgICBwcml2YXRlIGJvb2xlYW4gbmFtZXNwYWNlc1NhbWUgKCBRTmFtZSBuMSwgUU5hbWUgbjIgKQotICAgIHsKLSAgICAgICAgaWYgKG4xID09IG4yKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgaWYgKG4xID09IG51bGwgfHwgbjIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAobjEuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbjIuZ2V0TmFtZXNwYWNlVVJJKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBpZiAobjEuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCB8fCBuMi5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiBuMS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoIG4yLmdldE5hbWVzcGFjZVVSSSgpICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE5hbWVzcGFjZSAoIFN0cmluZ0J1ZmZlciBzYiwgUU5hbWUgbmFtZSApCi0gICAgewotICAgICAgICBpZiAobmFtZS5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsKQotICAgICAgICAgICAgc2IuYXBwZW5kKCAiPG5vIG5hbWVzcGFjZT4iICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCAiXCIiICk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCggIlwiIiApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgWG1sT2JqZWN0IGF1dG9UeXBlZERvY3VtZW50ICgKLSAgICAgICAgU2NoZW1hVHlwZSBmYWN0b3J5VHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgICAgIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIFRoZSB0eXBlIGluIHRoZSBvcHRpb25zIGhhcyBoaWdoZXN0IHByZWNpZGVuY2UgYmVjYXVzZSBpdCBpcwotICAgICAgICAvLyBzdXBwbGllZCBieSB0aGUgdXNlci4KLSAgICAgICAgCi0gICAgICAgIFNjaGVtYVR5cGUgb3ZlcnJpZGVUeXBlID0KLSAgICAgICAgICAgIChTY2hlbWFUeXBlKSBYbWxPcHRpb25zLnNhZmVHZXQoIG9wdGlvbnMsIFhtbE9wdGlvbnMuRE9DVU1FTlRfVFlQRSApOwotCi0gICAgICAgIC8vIHByZWNlZGVuY2UgaXMgZ2l2ZW4gdG8gdGhlIG92ZXJyaWRlIGFib3ZlIGFsbAotICAgICAgICAKLSAgICAgICAgU2NoZW1hVHlwZSB0aGVUeXBlID0gb3ZlcnJpZGVUeXBlOwotCi0gICAgICAgIC8vIERvY3VtZW50IGFuZCBhdHRyaWJ1dGUgdHlwZXMgaGF2ZSBubyBuYW1lCi0gICAgICAgIAotICAgICAgICBpZiAodGhlVHlwZSA9PSBudWxsICYmCi0gICAgICAgICAgICAgICAgKGZhY3RvcnlUeXBlID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgKCFmYWN0b3J5VHlwZS5pc0RvY3VtZW50VHlwZSgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhZmFjdG9yeVR5cGUuaXNBdHRyaWJ1dGVUeXBlKCkpKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gaW5mZXIgdHlwZSBmcm9tIHhzaTp0eXBlCi0gICAgICAgICAgICBRTmFtZSB0eXBlTmFtZSA9IF9kb2MuZ2V0WHNpVHlwZU5hbWUoIHRoaXMgKTsKLQotICAgICAgICAgICAgU2NoZW1hVHlwZSBzbmlmZmVkVHlwZSA9Ci0gICAgICAgICAgICAgICAgdHlwZU5hbWUgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgOiBfc2NoZW1hVHlwZVN5c3RlbS5maW5kVHlwZSggdHlwZU5hbWUgKTsKLQotICAgICAgICAgICAgaWYgKGZhY3RvcnlUeXBlID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgZmFjdG9yeVR5cGUuaXNBc3NpZ25hYmxlRnJvbSggc25pZmZlZFR5cGUgKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGVUeXBlID0gc25pZmZlZFR5cGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0b2RvOgotICAgICAgICAvLyB1c2UgdGhlIGZvbGxvd2luZyB3aGVuIGltcGxlbWVudGluZyBzdWJzdCBncm91cHM6Ci0gICAgICAgIC8vICAgICBmYWN0b3J5VHlwZSA9PSBudWxsIHx8IGV4cGVjdGVkVHlwZS5pc0RvY3VtZW50VHlwZSgpCi0KLSAgICAgICAgaWYgKGZhY3RvcnlUeXBlID09IG51bGwgfHwgZmFjdG9yeVR5cGUuaXNEb2N1bWVudFR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRoZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBpbmZlciB0eXBlIGJhc2VkIG9uIHJvb3QgZWx0Ci0KLSAgICAgICAgICAgICAgICBRTmFtZSBkb2NFbGVtTmFtZSA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBYbWxDdXJzb3IgYyA9IGNyZWF0ZUN1cnNvcigpOwotCi0gICAgICAgICAgICAgICAgaWYgKGMudG9GaXJzdENoaWxkKCkgJiYgIWMudG9OZXh0U2libGluZygpKQotICAgICAgICAgICAgICAgICAgICBkb2NFbGVtTmFtZSA9IGMuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgYy5kaXNwb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZG9jRWxlbU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSA9IF9zY2hlbWFUeXBlU3lzdGVtLmZpbmREb2N1bWVudFR5cGUoIGRvY0VsZW1OYW1lICk7Ci0KLSAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgZWx0IGluaGVyaXRhbmNlIHdoZW4gaW1wbGVtZW50aW5nIHN1YnN0IGdyb3VwcwotICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5VHlwZSAhPSBudWxsICYmIHRoZVR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIGZhY3RvcnlFbGVtTmFtZSA9IGZhY3RvcnlUeXBlLmdldERvY3VtZW50RWxlbWVudE5hbWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIWZhY3RvcnlFbGVtTmFtZS5lcXVhbHMoZG9jRWxlbU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhZmFjdG9yeVR5cGUuaXNWYWxpZFN1YnN0aXR1dGlvbihkb2NFbGVtTmFtZSkpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxFeGNlcHRpb24oIkVsZW1lbnQgIiArIFFOYW1lSGVscGVyLnByZXR0eShkb2NFbGVtTmFtZSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgbm90IGEgdmFsaWQgIiArIFFOYW1lSGVscGVyLnByZXR0eShmYWN0b3J5RWxlbU5hbWUpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvY3VtZW50IG9yIGEgdmFsaWQgc3Vic3RpdHV0aW9uLiIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodGhlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGluZmVyIHR5cGUgYmFzZWQgb24gcm9vdCBhdHRyCi0KLSAgICAgICAgICAgICAgICBRTmFtZSBhdHRyTmFtZSA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBYbWxDdXJzb3IgYyA9IGNyZWF0ZUN1cnNvcigpOwotCi0gICAgICAgICAgICAgICAgaWYgKGMudG9GaXJzdEF0dHJpYnV0ZSgpICYmICFjLnRvTmV4dEF0dHJpYnV0ZSgpKQotICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZSA9IGMuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgYy5kaXNwb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYXR0ck5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSA9IF9zY2hlbWFUeXBlU3lzdGVtLmZpbmRBdHRyaWJ1dGVUeXBlKCBhdHRyTmFtZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc25pZmZpbmcgZG9lc24ndCBzYXkgYW55dGhpbmc6IGFzc3VtZSB0aGUgZXhwZWN0ZWQgdHlwZQotICAgICAgICBpZiAodGhlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgdGhlVHlwZSA9IGZhY3RvcnlUeXBlOwotCi0gICAgICAgIC8vIFN0aWxsIG5vdGhpbmc6IHRoZSBubyB0eXBlLgotICAgICAgICBpZiAodGhlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgdGhlVHlwZSA9IFhtbEJlYW5zLk5PX1RZUEU7Ci0KLSAgICAgICAgLy8gYXNzaWduIHR5cGUKLSAgICAgICAgX2RvYy5zZXRUeXBlKCB0aGlzLCB0aGVUeXBlICk7Ci0KLSAgICAgICAgLy8gdG9kbzogSGF2ZSBhIHNpbWlsYXIgYXR0cmlidXRlIHR5cGUgY2hlY2sKLSAgICAgICAgaWYgKGZhY3RvcnlUeXBlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0aGVUeXBlLmlzRG9jdW1lbnRUeXBlKCkpCi0gICAgICAgICAgICAgICAgdmVyaWZ5RG9jdW1lbnRUeXBlKCB0aGVUeXBlLmdldERvY3VtZW50RWxlbWVudE5hbWUoKSApOwotICAgICAgICAgICAgZWxzZSBpZiAodGhlVHlwZS5pc0F0dHJpYnV0ZVR5cGUoKSkKLSAgICAgICAgICAgICAgICB2ZXJpZnlBdHRyaWJ1dGVUeXBlKCB0aGVUeXBlLmdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIElmIGEgdHlwZSB3YXMgcGFzc2VkIGluLCB1c3VhbGx5IGZyb20gZ2VuZXJhdGVkIGNvZGUgd2hpY2ggbmVlZHMgdGhlCi0gICAgICAgIC8vIHR5cGUgdG8gYmUgc29tZXRoaW5nIHNwZWNpZmljIGJlY2F1c2Ugb2YgYSBwZW5kaW5nIGNhc3QsIHRoZW4gY2hlY2sKLSAgICAgICAgLy8gdGhlIHJlc3VsdGluZyB0eXBlIGFuZCB0aHJvdyBhIG5pY2UgZXhjZXB0aW9uLgotICAgICAgICAvLwotCi0gICAgICAgIGlmIChmYWN0b3J5VHlwZSAhPSBudWxsICYmICFmYWN0b3J5VHlwZS5pc0Fzc2lnbmFibGVGcm9tKHRoZVR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGYWN0b3J5IHR5cGUgPSAiICsgZmFjdG9yeVR5cGUpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGUgdHlwZSA9ICIgKyB0aGVUeXBlKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYmFzZXR5cGUgb2YgdGhlIHR5cGUgPSAiICsgdGhlVHlwZS5nZXRCYXNlVHlwZSgpKTsKLSAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAgICAgbmV3IFhtbEV4Y2VwdGlvbiggIlhNTCBvYmplY3QgaXMgbm90IG9mIHR5cGUgIiArIGZhY3RvcnlUeXBlICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZ2V0T2JqZWN0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeURvY3VtZW50VHlwZSAoIFFOYW1lIGRvY0VsZW1OYW1lICkKLSAgICAgICAgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBjcmVhdGVDdXJzb3IoKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKCFjLnRvRmlyc3RDaGlsZCgpIHx8IGMudG9OZXh0U2libGluZygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiVGhlIGRvY3VtZW50IGlzIG5vdCBhICIgKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIFFOYW1lSGVscGVyLnByZXR0eSggZG9jRWxlbU5hbWUgKSApOwotCi0gICAgICAgICAgICAgICAgaWYgKGMuY3VycmVudFRva2VuVHlwZSgpLmlzU3RhcnRkb2MoKSkKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiOiBubyBkb2N1bWVudCBlbGVtZW50IiApOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiOiBtdWx0aXBsZSBkb2N1bWVudCBlbGVtZW50cyIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gYy5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKCBkb2NFbGVtTmFtZSApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiVGhlIGRvY3VtZW50IGlzIG5vdCBhICIgKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBRTmFtZUhlbHBlci5wcmV0dHkoIGRvY0VsZW1OYW1lICkgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZG9jRWxlbU5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCBuYW1lLmdldExvY2FsUGFydCgpICkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogZG9jdW1lbnQgZWxlbWVudCBuYW1lc3BhY2UgbWlzbWF0Y2ggIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiZXhwZWN0ZWQgIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkTmFtZXNwYWNlKCBzYiwgZG9jRWxlbU5hbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIiBnb3QgIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkTmFtZXNwYWNlKHNiLCAgbmFtZSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVzcGFjZXNTYW1lKCBkb2NFbGVtTmFtZSwgbmFtZSApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICI6IGRvY3VtZW50IGVsZW1lbnQgbG9jYWwgbmFtZSBtaXNtYXRjaCAiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICJleHBlY3RlZCAiICsgZG9jRWxlbU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIiBnb3QgIiArIG5hbWUuZ2V0TG9jYWxQYXJ0KCkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogZG9jdW1lbnQgZWxlbWVudCBtaXNtYXRjaCAiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICJnb3QgIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBRTmFtZUhlbHBlci5wcmV0dHkoIG5hbWUgKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2IgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYbWxFcnJvciBlcnIgPSBYbWxFcnJvci5mb3JDdXJzb3Ioc2IudG9TdHJpbmcoKSwgYy5uZXdDdXJzb3IoKSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbEV4Y2VwdGlvbiggZXJyLnRvU3RyaW5nKCksIG51bGwsIGVyciApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgYy5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5QXR0cmlidXRlVHlwZSAoIFFOYW1lIGF0dHJOYW1lICkKLSAgICAgICAgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBjcmVhdGVDdXJzb3IoKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKCFjLnRvRmlyc3RBdHRyaWJ1dGUoKSB8fCBjLnRvTmV4dEF0dHJpYnV0ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiVGhlIGRvY3VtZW50IGlzIG5vdCBhICIgKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIFFOYW1lSGVscGVyLnByZXR0eSggYXR0ck5hbWUgKSApOwotCi0gICAgICAgICAgICAgICAgaWYgKGMuY3VycmVudFRva2VuVHlwZSgpLmlzU3RhcnRkb2MoKSkKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiOiBubyBhdHRyaWJ1dGVzIiApOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiOiBtdWx0aXBsZSBhdHRyaWJ1dGVzIiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBjLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgIGlmICghbmFtZS5lcXVhbHMoIGF0dHJOYW1lICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICJUaGUgZG9jdW1lbnQgaXMgbm90IGEgIiApOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIFFOYW1lSGVscGVyLnByZXR0eSggYXR0ck5hbWUgKSApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyTmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoIG5hbWUuZ2V0TG9jYWxQYXJ0KCkgKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiOiBhdHRyaWJ1dGUgbmFtZXNwYWNlIG1pc21hdGNoICIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggImV4cGVjdGVkICIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZE5hbWVzcGFjZSggc2IsIGF0dHJOYW1lICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICIgZ290ICIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZE5hbWVzcGFjZShzYiwgIG5hbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lc3BhY2VzU2FtZSggYXR0ck5hbWUsIG5hbWUgKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiOiBhdHRyaWJ1dGUgbG9jYWwgbmFtZSBtaXNtYXRjaCAiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICJleHBlY3RlZCAiICsgYXR0ck5hbWUuZ2V0TG9jYWxQYXJ0KCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIiBnb3QgIiArIG5hbWUuZ2V0TG9jYWxQYXJ0KCkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogYXR0cmlidXRlIGVsZW1lbnQgbWlzbWF0Y2ggIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiZ290ICIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggUU5hbWVIZWxwZXIucHJldHR5KCBuYW1lICkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNiICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sRXJyb3IgZXJyID0gWG1sRXJyb3IuZm9yQ3Vyc29yKHNiLnRvU3RyaW5nKCksIGMubmV3Q3Vyc29yKCkpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxFeGNlcHRpb24oIGVyci50b1N0cmluZygpLCBudWxsLCBlcnIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGMuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBwcml2YXRlIHN0YXRpYyBUaHJlYWRMb2NhbCB0bF9TYXhMb2FkZXJzID0KLSAgICAgICAgbmV3IFRocmVhZExvY2FsKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBpbml0aWFsVmFsdWUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNheExvYWRlciBzbCA9IFBpY2NvbG9TYXhMb2FkZXIubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgICAgIGlmIChzbCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBzbCA9IERlZmF1bHRTYXhMb2FkZXIubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgICAgIGlmIChzbCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIkNhbid0IGZpbmQgYW4gWE1MIHBhcnNlciIgKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBzbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIFNheExvYWRlciBnZXRTYXhMb2FkZXIgKCApCi0gICAgewotICAgICAgICByZXR1cm4gKFNheExvYWRlcikgdGxfU2F4TG9hZGVycy5nZXQoKTsKLSAgICB9Ci0gICAgCi0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQaWNjb2xvU2F4TG9hZGVyIGV4dGVuZHMgU2F4TG9hZGVyCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFNheExvYWRlciBuZXdJbnN0YW5jZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgcGMgPSBDbGFzcy5mb3JOYW1lKCAiY29tLmJsdWVjYXN0LnhtbC5QaWNjb2xvIiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFhNTFJlYWRlciB4ciA9IChYTUxSZWFkZXIpIHBjLm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgICAgICAgICBNZXRob2QgbV9nZXRFbmNvZGluZyAgICAgPSBwYy5nZXRNZXRob2QoICJnZXRFbmNvZGluZyIsIG51bGwgKTsKLSAgICAgICAgICAgICAgICBNZXRob2QgbV9nZXRWZXJzaW9uICAgICAgPSBwYy5nZXRNZXRob2QoICJnZXRWZXJzaW9uIiwgbnVsbCApOwotICAgICAgICAgICAgICAgIE1ldGhvZCBtX2dldFN0YXJ0TG9jYXRvciA9IHBjLmdldE1ldGhvZCggImdldFN0YXJ0TG9jYXRvciIsIG51bGwgKTsKLQotICAgICAgICAgICAgICAgIExvY2F0b3Igc3RhcnRMb2NhdG9yID0KLSAgICAgICAgICAgICAgICAgICAgKExvY2F0b3IpIG1fZ2V0U3RhcnRMb2NhdG9yLmludm9rZSggeHIsIG51bGwgKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGljY29sb1NheExvYWRlciggeHIsIHN0YXJ0TG9jYXRvciwgbV9nZXRFbmNvZGluZywgbV9nZXRWZXJzaW9uICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCksIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcG9zdExvYWQgKCBSb290IHIgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByLl9wcm9wcy5zZXRFbmNvZGluZyggKFN0cmluZykgX21fZ2V0RW5jb2RpbmcuaW52b2tlKCBfeHIsIG51bGwgKSApOwotICAgICAgICAgICAgICAgIHIuX3Byb3BzLnNldFZlcnNpb24gKCAoU3RyaW5nKSBfbV9nZXRWZXJzaW9uIC5pbnZva2UoIF94ciwgbnVsbCApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCksIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBQaWNjb2xvU2F4TG9hZGVyICgKLSAgICAgICAgICAgIFhNTFJlYWRlciB4ciwgTG9jYXRvciBzdGFydExvY2F0b3IsIE1ldGhvZCBtX2dldEVuY29kaW5nLCBNZXRob2QgbV9nZXRWZXJzaW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIHhyLCBzdGFydExvY2F0b3IgKTsKLQotICAgICAgICAgICAgX21fZ2V0RW5jb2RpbmcgPSBtX2dldEVuY29kaW5nOwotICAgICAgICAgICAgX21fZ2V0VmVyc2lvbiA9IG1fZ2V0VmVyc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgTWV0aG9kIF9tX2dldEVuY29kaW5nOwotICAgICAgICBwcml2YXRlIE1ldGhvZCBfbV9nZXRWZXJzaW9uOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWZhdWx0U2F4TG9hZGVyIGV4dGVuZHMgU2F4TG9hZGVyCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFNheExvYWRlciBuZXdJbnN0YW5jZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0U2F4TG9hZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1NBWFBhcnNlcigpLmdldFhNTFJlYWRlcigpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFRocm93YWJsZSBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCksIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgRGVmYXVsdFNheExvYWRlciAoIFhNTFJlYWRlciB4ciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCB4ciwgbnVsbCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2F4TG9hZGVyCi0gICAgICAgIGltcGxlbWVudHMgQ29udGVudEhhbmRsZXIsIExleGljYWxIYW5kbGVyLCBFcnJvckhhbmRsZXIsIEVudGl0eVJlc29sdmVyCi0gICAgewotICAgICAgICBwcm90ZWN0ZWQgU2F4TG9hZGVyICggWE1MUmVhZGVyIHhyLCBMb2NhdG9yIHN0YXJ0TG9jYXRvciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF94ciA9IHhyOwotICAgICAgICAgICAgX3N0YXJ0TG9jYXRvciA9IHN0YXJ0TG9jYXRvcjsKLQotICAgICAgICAgICAgaWYgKHhyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4ci5zZXRGZWF0dXJlKCAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsIHRydWUgKTsKLSAgICAgICAgICAgICAgICAgICAgeHIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiwgdHJ1ZSApOwotICAgICAgICAgICAgICAgICAgICB4ci5zZXRGZWF0dXJlKCAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iLCBmYWxzZSApOwotCi0KLSAgICAgICAgICAgICAgICAgICAgeHIuc2V0UHJvcGVydHkoICJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLCB0aGlzICk7Ci0gICAgICAgICAgICAgICAgICAgIHhyLnNldENvbnRlbnRIYW5kbGVyKCB0aGlzICk7Ci0gICAgICAgICAgICAgICAgICAgIHhyLnNldEVycm9ySGFuZGxlciggdGhpcyApOwotICAgICAgICAgICAgICAgICAgICB4ci5zZXRFbnRpdHlSZXNvbHZlciggdGhpcyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoIFRocm93YWJsZSBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHNldENvbnRleHQgKCBMb2FkQ29udGV4dCBjb250ZXh0LCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfY29udGV4dCA9IGNvbnRleHQ7Ci0KLSAgICAgICAgICAgIF93YW50TGluZU51bWJlcnMgPQotICAgICAgICAgICAgICAgIFhtbE9wdGlvbnMubWFza051bGwoCi0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgKS5oYXNPcHRpb24oIFhtbE9wdGlvbnMuTE9BRF9MSU5FX05VTUJFUlMgKSAmJgotICAgICAgICAgICAgICAgICAgICBfc3RhcnRMb2NhdG9yICE9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwb3N0TG9hZCAoIFJvb3QgciApCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGxvYWQgKCBSb290IHIsIElucHV0U291cmNlIGlucHV0U291cmNlLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgTG9hZENvbnRleHQgY29udGV4dCA9IG5ldyBMb2FkQ29udGV4dCggciwgb3B0aW9ucyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzZXRDb250ZXh0KCBjb250ZXh0LCBvcHRpb25zICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCByLmRpc2FibGVTdG9yZVZhbGlkYXRpb24oKTsKLQotICAgICAgICAgICAgICAgIF94ci5wYXJzZSggaW5wdXRTb3VyY2UgKTsKLQotICAgICAgICAgICAgICAgIHBvc3RMb2FkKCByICk7Ci0KLS8vICAgICAgICAgICAgICAgIC8vIFBpY2NvbG8gc3BlY2lmaWMgYWNjZXNzIHRvIGVuY29kaW5nIGFuZCB2ZXJzaW9uCi0vLyAgICAgICAgICAgICAgICBfcHJvcHMuc2V0RW5jb2RpbmcoIHBpY2NvbG8uZ2V0RW5jb2RpbmcoKSApOwotLy8gICAgICAgICAgICAgICAgX3Byb3BzLnNldFZlcnNpb24oIHBpY2NvbG8uZ2V0VmVyc2lvbigpICk7Ci0KLSAgICAgICAgICAgICAgICBjb250ZXh0LmZpbmlzaCgpOwotCi0gICAgICAgICAgICAgICAgci5hc3NvY2lhdGVTb3VyY2VOYW1lKCBvcHRpb25zICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFhtbFJ1bnRpbWVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5hYm9ydCgpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggU0FYUGFyc2VFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5hYm9ydCgpOwotCi0gICAgICAgICAgICAgICAgWG1sRXJyb3IgZXJyID0KLSAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3IuZm9yTG9jYXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIFhtbE9wdGlvbnMuc2FmZUdldCggb3B0aW9ucywgWG1sT3B0aW9ucy5ET0NVTUVOVF9TT1VSQ0VfTkFNRSApLAotICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRMaW5lTnVtYmVyKCksIGUuZ2V0Q29sdW1uTnVtYmVyKCksIC0xICk7Ci0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sRXhjZXB0aW9uKCBlcnIudG9TdHJpbmcoKSwgZSwgZXJyICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFNBWEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmFib3J0KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgWG1sRXJyb3IgZXJyID0gWG1sRXJyb3IuZm9yTWVzc2FnZSggZS5nZXRNZXNzYWdlKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sRXhjZXB0aW9uKCBlcnIudG9TdHJpbmcoKSwgZSwgZXJyICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFJ1bnRpbWVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5hYm9ydCgpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHIuZW5hYmxlU3RvcmVWYWxpZGF0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTYXggQ29udGVudEhhbmRsZXIKLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50ICggKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZERvY3VtZW50ICggKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFNldCBjb250ZXh0IHRvIG51bGwKLSAgICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgdGhlIGhhbmRsZXIgKHdoaWNoIGlzIGhlbGQgaW4gVExTIGZyb20ga2VlcGluZwotICAgICAgICAgICAgLy8gdGhlIGVudGlyZSBkb2N1bWVudCBpbiBtZW1vcnkKLSAgICAgICAgICAgIF9jb250ZXh0ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudCAoCi0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLAotICAgICAgICAgICAgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHMgKQotICAgICAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGxvY2FsTmFtZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgIGxvY2FsTmFtZSA9IHFOYW1lOwotCi0gICAgICAgICAgICAvLyBPdXQgY3VycmVudCBwYXJzZXIgKFBpY2NvbG8pIGRvZXMgbm90IGVycm9yIHdoZW4gYQotICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGlzIHVzZWQgYW5kIG5vdCBkZWZpbmVkLiAgQ2hlY2sgZm9yIHRoZXNlIGhlcmUKLQotICAgICAgICAgICAgaWYgKHFOYW1lLmluZGV4T2YoICc6JyApID49IDAgJiYgbmFtZXNwYWNlVVJJLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sRXJyb3IgZXJyID0KLSAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3IuZm9yTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJVc2Ugb2YgdW5kZWZpbmVkIG5hbWVzcGFjZSBwcmVmaXg6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFOYW1lLnN1YnN0cmluZyggMCwgcU5hbWUuaW5kZXhPZiggJzonICkgKSk7Ci0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbiggZXJyLnRvU3RyaW5nKCksIG51bGwsIGVyciApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBfY29udGV4dC5iZWdpbiggbG9jYWxOYW1lLCBuYW1lc3BhY2VVUkkgKTsKLQotICAgICAgICAgICAgLy8gQlVHQlVHIC0gZG8gbW9yZSBvZiB0aGUgZm9sbG93aW5nIHRvIGdldCBsaW5lIG51bWJlciBmb3IKLSAgICAgICAgICAgIC8vIGFzIG1hbnkgcGFydHMgb2YgdGhlIFhNTCBhcyB3ZSBjYW4KLSAgICAgICAgICAgIGlmIChfd2FudExpbmVOdW1iZXJzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jb250ZXh0LmxpbmVOdW1iZXJBbm5vdGF0aW9uKAotICAgICAgICAgICAgICAgICAgICBfc3RhcnRMb2NhdG9yLmdldExpbmVOdW1iZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgX3N0YXJ0TG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgLTEgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yICggaW50IGkgPSAwLCBsZW4gPSBhdHRzLmdldExlbmd0aCgpIDsgaSA8IGxlbiA7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFxbiA9IGF0dHMuZ2V0UU5hbWUoIGkgKTsKLQotICAgICAgICAgICAgICAgIGlmIChhcW4uZXF1YWxzKCAieG1sbnMiICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfY29udGV4dC54bWxucyggIiIsIGF0dHMuZ2V0VmFsdWUoIGkgKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChhcW4uc3RhcnRzV2l0aCggInhtbG5zOiIgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBhcW4uc3Vic3RyaW5nKCA2ICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvciBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvck1lc3NhZ2UoICJQcmVmaXggbm90IHNwZWNpZmllZCIsIFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKCBlcnIudG9TdHJpbmcoKSwgbnVsbCwgZXJyICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gYXR0cy5nZXRWYWx1ZSggaSApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh1cmkubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3IgZXJyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvci5mb3JNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJlZml4IGNhbid0IGJlIG1hcHBlZCB0byBubyBuYW1lc3BhY2U6ICIgKyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKCBlcnIudG9TdHJpbmcoKSwgbnVsbCwgZXJyICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBfY29udGV4dC54bWxucyggcHJlZml4LCB1cmkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJVcmkgPSBhdHRzLmdldFVSSSggaSApOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0ckxvY2FsID0gYXR0cy5nZXRMb2NhbE5hbWUoIGkgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ckxvY2FsLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyTG9jYWwgPSBhcW47Ci0KLS8vIGdpdmVuIHRoZSBkb2MgPGEgeDp5PSd6Jy8+LCBwaWNjb2xvIHdpbGwgcmVwb3J0IHRoZSB1cmkgb2YgdGhlIHkKLS8vIGF0dHJpYnV0ZSBhcyAneCchICBCYWQgUGljY29sby4gIFRodXMsIEkgY2FuJ3QgcGVyZm9ybSB0aGUgdW5kZWZpbmVkCi0vLyBwcmVmaXggY2hlY2sgaGVyZS4KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgaWYgKGFxbi5pbmRleE9mKCAnOicgKSA+PSAwICYmIGF0dHJVcmkubGVuZ3RoKCkgPT0gMCkKLS8vICAgICAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ3Vyc29yWG1sRXJyb3IoCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZSBvZiB1bmRlZmluZWQgbmFtZXNwYWNlIHByZWZpeDogIiArCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFxbi5zdWJzdHJpbmcoIDAsIGFxbi5pbmRleE9mKCAnOicgKSApLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgKTsKLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbigKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIudG9TdHJpbmcoKSwgbnVsbCwgZXJyICk7Ci0vLyAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LmF0dHIoIGF0dHJMb2NhbCwgYXR0clVyaSwgYXR0cy5nZXRWYWx1ZSggaSApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudCAoCi0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUgKQotICAgICAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgX2NvbnRleHQuZW5kKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyAoIGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoICkKLQotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBfY29udGV4dC50ZXh0KCBjaCwgc3RhcnQsIGxlbmd0aCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZSAoIGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoICkKLSAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgX2NvbnRleHQudGV4dCggY2gsIHN0YXJ0LCBsZW5ndGggKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbW1lbnQgKCBjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCApCi0gICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jb250ZXh0LmNvbW1lbnQoIGNoLCBzdGFydCwgbGVuZ3RoICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gKCBTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSApCi0gICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jb250ZXh0LnByb2NpbnN0KCB0YXJnZXQsIGRhdGEgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RFREICggU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkICkKLSAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgX2NvbnRleHQuZG9jdHlwZSggbmFtZSwgcHVibGljSWQsIHN5c3RlbUlkICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBlbmREVEQgKCApIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRXJyb3IgSGFuZGxpbmcKLSAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvciAoIFNBWFBhcnNlRXhjZXB0aW9uIGUgKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBlcnJvciAoIFNBWFBhcnNlRXhjZXB0aW9uIGUgKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEVycm9yIGVyciA9Ci0gICAgICAgICAgICAgICAgWG1sRXJyb3IuZm9yTWVzc2FnZSggIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SICk7Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKCBlcnIudG9TdHJpbmcoKSwgbnVsbCwgZXJyICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nICggU0FYUGFyc2VFeGNlcHRpb24gZSApIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhyb3cgYXdheSB3YXJpbmdzIGZvciBub3cKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVudGl0eSBSZXNvbHZlcgotICAgICAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eSggU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInB1YmxpYyBpZCA9ICIgKyBwdWJsaWNJZCk7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInN5c3RlbSBpZCA9ICIgKyBzeXN0ZW1JZCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTb3VyY2UoIG5ldyBTdHJpbmdSZWFkZXIoICIiICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvciAoIExvY2F0b3IgbG9jYXRvciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9sb2NhdG9yID0gbG9jYXRvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZyAoIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkgKQotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYmVnaW5zV2l0aFhtbCggcHJlZml4ICkgJiYKLSAgICAgICAgICAgICAgICAhICggInhtbCIuZXF1YWxzKCBwcmVmaXggKSAmJiBfeG1sMTk5OFVyaS5lcXVhbHMoIHVyaSApICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sRXJyb3IgZXJyID0KLSAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3IuZm9yTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJQcmVmaXggY2FuJ3QgYmVnaW4gd2l0aCBYTUw6ICIgKyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvci5TRVZFUklUWV9FUlJPUiApOwotCi0gICAgICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICAgICAgICAgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIudG9TdHJpbmcoKSwgbnVsbCwgZXJyICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZ25vcmVkCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZFByZWZpeE1hcHBpbmcgKCBTdHJpbmcgcHJlZml4ICkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7fQotICAgICAgICBwdWJsaWMgdm9pZCBza2lwcGVkRW50aXR5ICggU3RyaW5nIG5hbWUgKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHt9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q0RBVEEgKCApIHRocm93cyBTQVhFeGNlcHRpb24geyB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIGVuZENEQVRBICggKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsgfQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVudGl0eSAoIFN0cmluZyBuYW1lICkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7IH0KLSAgICAgICAgcHVibGljIHZvaWQgZW5kRW50aXR5ICggU3RyaW5nIG5hbWUgKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsgfQotCi0gICAgICAgIHByb3RlY3RlZCBYTUxSZWFkZXIgX3hyOwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBMb2NhdG9yICAgICBfbG9jYXRvcjsKLSAgICAgICAgcHJpdmF0ZSBMb2FkQ29udGV4dCBfY29udGV4dDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgICBfd2FudExpbmVOdW1iZXJzOwotICAgICAgICBwcml2YXRlIExvY2F0b3IgICAgIF9zdGFydExvY2F0b3I7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgcHVibGljIFhtbE9iamVjdCBsb2FkWG1sICggSW5wdXRTdHJlYW0gaW4sIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBlbmNvZGluZ092ZXJyaWRlID0KLSAgICAgICAgICAgIChTdHJpbmcpIFhtbE9wdGlvbnMuc2FmZUdldCggb3B0aW9ucywgWG1sT3B0aW9ucy5DSEFSQUNURVJfRU5DT0RJTkcgKTsKLQotICAgICAgICBpZiAoZW5jb2RpbmdPdmVycmlkZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgamF2YUVuY29kaW5nID0gRW5jb2RpbmdNYXAuZ2V0SUFOQTJKYXZhTWFwcGluZyggZW5jb2RpbmdPdmVycmlkZSApOwotCi0gICAgICAgICAgICBpZiAoamF2YUVuY29kaW5nID09IG51bGwpCi0gICAgICAgICAgICAgICAgamF2YUVuY29kaW5nID0gZW5jb2RpbmdPdmVycmlkZTsKLQotICAgICAgICAgICAgcmV0dXJuIGxvYWRYbWwoIG5ldyBJbnB1dFN0cmVhbVJlYWRlciggaW4sIGphdmFFbmNvZGluZyApLCB0eXBlLCBvcHRpb25zICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbG9hZFhtbCggbmV3IElucHV0U291cmNlKCBpbiApLCB0eXBlLCBvcHRpb25zICk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBsb2FkWG1sICggUmVhZGVyIHIsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBsb2FkWG1sKCBuZXcgSW5wdXRTb3VyY2UoIHIgKSwgdHlwZSwgb3B0aW9ucyApOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxPYmplY3QgbG9hZFhtbCAoIElucHV0U291cmNlIGlzLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpcy5zZXRTeXN0ZW1JZCggImZpbGU6Ly8iICk7Ci0KLSAgICAgICAgZ2V0U2F4TG9hZGVyKCkubG9hZCggdGhpcywgaXMsIG9wdGlvbnMgKTsKLQotICAgICAgICByZXR1cm4gYXV0b1R5cGVkRG9jdW1lbnQoIHR5cGUsIG9wdGlvbnMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFhtbE9iamVjdCBsb2FkWG1sICggU3RyaW5nIHMsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVhZGVyIHIgPSBuZXcgU3RyaW5nUmVhZGVyKCBzICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBsb2FkWG1sKCByLCB0eXBlLCBvcHRpb25zICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOiAiU3RyaW5nUmVhZGVyIHNob3VsZCBub3QgdGhyb3cgSU9FeGNlcHRpb24iOwotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbEV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCksIGUgKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSB7IHIuY2xvc2UoKTsgfSBjYXRjaCAoIElPRXhjZXB0aW9uIGUgKSB7IH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NvY2lhdGVTb3VyY2VOYW1lICggWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBzb3VyY2VOYW1lID0KLSAgICAgICAgICAgIChTdHJpbmcpIFhtbE9wdGlvbnMuc2FmZUdldCgKLSAgICAgICAgICAgICAgICBvcHRpb25zLCBYbWxPcHRpb25zLkRPQ1VNRU5UX1NPVVJDRV9OQU1FICk7Ci0KLSAgICAgICAgaWYgKHNvdXJjZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIF9wcm9wcy5zZXRTb3VyY2VOYW1lKCBzb3VyY2VOYW1lICk7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBYbWxTYXhIYW5kbGVyIGlzIHJldHVybmVkIHRvIGEgdXNlciBzbyB0aGF0IHVzZXIgbWF5IG9idGFpbiB0aGUgY29udGVudAotICAgIC8vIGFuZCBsZXhpY2FsIGhhbmRsZXJzIHRvIHB1c2ggY29udGVudCBhbmQgdGhlbiBnZXQgdGhlIFhtbE9iamVjdCBhdCB0aGUKLSAgICAvLyBlbmQgb2YgdGhlIHBhcnNlIHB1c2guCi0gICAgLy8KLQotICAgIHByaXZhdGUgY2xhc3MgWG1sU2F4SGFuZGxlckltcGwgZXh0ZW5kcyBTYXhMb2FkZXIgaW1wbGVtZW50cyBYbWxTYXhIYW5kbGVyCi0gICAgewotICAgICAgICBYbWxTYXhIYW5kbGVySW1wbCAoIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIG51bGwsIG51bGwgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0IGlzRW1wdHkoKTsKLQotICAgICAgICAgICAgX29wdGlvbnMgPSBvcHRpb25zOwotICAgICAgICAgICAgX3R5cGUgPSB0eXBlOwotCi0gICAgICAgICAgICBfY29udGV4dCA9IG5ldyBMb2FkQ29udGV4dCggUm9vdC50aGlzLCBvcHRpb25zICk7Ci0KLSAgICAgICAgICAgIHNldENvbnRleHQoIF9jb250ZXh0LCBvcHRpb25zICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29udGVudEhhbmRsZXIgZ2V0Q29udGVudEhhbmRsZXIgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfY29udGV4dCA9PSBudWxsID8gbnVsbCA6IHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGV4aWNhbEhhbmRsZXIgZ2V0TGV4aWNhbEhhbmRsZXIgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfY29udGV4dCA9PSBudWxsID8gbnVsbCA6IHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgWG1sT2JqZWN0IGdldE9iamVjdCAoICkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2NvbnRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgX2NvbnRleHQuZmluaXNoKCk7Ci0KLSAgICAgICAgICAgIF9jb250ZXh0ID0gbnVsbDsKLQotICAgICAgICAgICAgUm9vdC50aGlzLmFzc29jaWF0ZVNvdXJjZU5hbWUoIF9vcHRpb25zICk7Ci0KLSAgICAgICAgICAgIHJldHVybiBSb290LnRoaXMuYXV0b1R5cGVkRG9jdW1lbnQoIF90eXBlLCBfb3B0aW9ucyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBMb2FkQ29udGV4dCBfY29udGV4dDsKLSAgICAgICAgcHJpdmF0ZSBTY2hlbWFUeXBlICBfdHlwZTsKLSAgICAgICAgcHJpdmF0ZSBYbWxPcHRpb25zICBfb3B0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sU2F4SGFuZGxlciBuZXdTYXhIYW5kbGVyICggU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYbWxTYXhIYW5kbGVySW1wbCggdHlwZSwgb3B0aW9ucyApOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgcHJpdmF0ZSB2b2lkIG5ld1BhcnNlU2F4ICggSW5wdXRTb3VyY2UgaW4sIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgewotICAgICAgICBMb2FkQ29udGV4dCBjb250ZXh0ID0gbmV3IExvYWRDb250ZXh0KCB0aGlzLCBvcHRpb25zICk7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBIZWxwZXIgb2JqZWN0IGZvciBjcmVhdGluZyBkb2N1bWVudHMgaW4gYSAibG9hZCIga2luZGEgd2F5Ci0gICAgLy8KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBMb2FkQ29udGV4dAotICAgIHsKLSAgICAgICAgTG9hZENvbnRleHQgKCBSb290IHJvb3QsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCByb290ICE9IG51bGw7Ci0KLSAgICAgICAgICAgIF9vcHRpb25zID0gb3B0aW9ucyA9IFhtbE9wdGlvbnMubWFza051bGwoIG9wdGlvbnMgKTsKLQotICAgICAgICAgICAgX3FuYW1lQ2FjaGUgPSBYbWxCZWFucy5nZXRRTmFtZUNhY2hlKCk7Ci0KLSAgICAgICAgICAgIGlmIChvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5MT0FEX1JFUExBQ0VfRE9DVU1FTlRfRUxFTUVOVCApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSAoUU5hbWUpIG9wdGlvbnMuZ2V0KCBYbWxPcHRpb25zLkxPQURfUkVQTEFDRV9ET0NVTUVOVF9FTEVNRU5UICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmIG5hbWUuZ2V0TG9jYWxQYXJ0KCkubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMb2FkIFJlcGxhY2UgRG9jdW1lbnQgRWxlbWVudDogSW52YWxpZCBuYW1lLCBsb2NhbCBwYXJ0IGVtcHR5IiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBfZGlzY2FyZERvY0VsZW0gPSB0cnVlOwotICAgICAgICAgICAgICAgIF9yZXBsYWNlRG9jRWxlbSA9IG5hbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9zdHJpcFdoaXRlc3BhY2UgPSBvcHRpb25zLmhhc09wdGlvbihYbWxPcHRpb25zLkxPQURfU1RSSVBfV0hJVEVTUEFDRSk7Ci0gICAgICAgICAgICBfc3RyaXBDb21tZW50cyA9IG9wdGlvbnMuaGFzT3B0aW9uKFhtbE9wdGlvbnMuTE9BRF9TVFJJUF9DT01NRU5UUyk7Ci0gICAgICAgICAgICBfc3RyaXBQcm9jaW5zdHMgPSBvcHRpb25zLmhhc09wdGlvbihYbWxPcHRpb25zLkxPQURfU1RSSVBfUFJPQ0lOU1RTKTsKLQotICAgICAgICAgICAgX3N1YnN0aXR1dGVOYW1lc3BhY2VzID0KLSAgICAgICAgICAgICAgICAoTWFwKSBvcHRpb25zLmdldChYbWxPcHRpb25zLkxPQURfU1VCU1RJVFVURV9OQU1FU1BBQ0VTKTsKLQotICAgICAgICAgICAgX2FkZGl0aW9uYWxOYW1lc3BhY2VzID0KLSAgICAgICAgICAgICAgICAoTWFwKSBvcHRpb25zLmdldChYbWxPcHRpb25zLkxPQURfQURESVRJT05BTF9OQU1FU1BBQ0VTKTsKLQotICAgICAgICAgICAgX3Jvb3QgPSByb290OwotICAgICAgICAgICAgX3Jvb3QuZW5zdXJlRW1wdHkoKTsKLQotICAgICAgICAgICAgX2xhc3ROb25BdHRyID0gX3Jvb3QuX2RvYzsKLSAgICAgICAgICAgIF9sYXN0U3BsYXkgPSBfcm9vdC5fZG9jOwotICAgICAgICAgICAgX2xhc3RQb3MgPSAwOwotCi0gICAgICAgICAgICBfZnJvbnRpZXIgPSBfcm9vdC5fZG9jOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBSb290IGdldFJvb3QgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfcm9vdDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGdldENwICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBfcm9vdC5pc0xlZnRPbmx5KCk7Ci0gICAgICAgICAgICBhc3NlcnQgZHYgPiAwIHx8IHMuZ2V0Q3BTbG93KCkgPT0gcy5nZXRDY2hMZWZ0KCk7Ci0gICAgICAgICAgICByZXR1cm4gcy5nZXRDY2hMZWZ0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWRqdXN0Q2NoICggU3BsYXkgcywgaW50IGRlbHRhICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IF9yb290LmlzTGVmdE9ubHkoKTsKLQotICAgICAgICAgICAgcy5hZGp1c3RDY2goIGRlbHRhICk7Ci0KLSAgICAgICAgICAgIC8vIFRoZXJlIG1heSBiZSBhdHRycyBhZnRlciB0aGlzIHNwbGF5IHdoaWNoIG5lZWQgdGhlaXIgY2NoTGVmdCdzCi0gICAgICAgICAgICAvLyB0byBiZSB1cGRhdGVkLiAgVG8gYXZvaWQgc3BsYXlpbmcsIHVwZGF0ZSB0aGVtIGJ5IGhhbmQuCi0KLSAgICAgICAgICAgIGZvciAoIHMgPSBzLm5leHRTcGxheSgpIDsgcyAhPSBudWxsIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzQXR0cigpIHx8IHMuaXNSb290KCk7Ci0gICAgICAgICAgICAgICAgcy5hZGp1c3RDY2hMZWZ0KCBkZWx0YSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluc2VydCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgIV9maW5pc2hlZDsKLSAgICAgICAgICAgIGFzc2VydCBzLmdldENjaCgpID09IDA7Ci0KLSAgICAgICAgICAgIF9yb290Lmluc2VydFNwbGF5KCBzLCBfcm9vdC5fbGVmdFNwbGF5ICk7Ci0KLSAgICAgICAgICAgIF9sYXN0U3BsYXkgPSBzOwotICAgICAgICAgICAgX2xhc3RQb3MgPSAwOwotCi0gICAgICAgICAgICBpZiAoIXMuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgX2xhc3ROb25BdHRyID0gczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbnNlcnQgKCBTcGxheSBzLCBjaGFyW10gYnVmLCBpbnQgb2ZmLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFfZmluaXNoZWQ7Ci0gICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2goKSA9PSAwOwotICAgICAgICAgICAgaW5zZXJ0KCBzICk7Ci0gICAgICAgICAgICBfcm9vdC5fdGV4dC5pbnNlcnQoIGdldENwKCBzICksIGJ1Ziwgb2ZmLCBjY2ggKTsKLSAgICAgICAgICAgIGFkanVzdENjaCggcywgY2NoICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaW5zZXJ0ICggU3BsYXkgcywgU3RyaW5nIHRleHQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgIV9maW5pc2hlZDsKLSAgICAgICAgICAgIGFzc2VydCBzLmdldENjaCgpID09IDA7Ci0gICAgICAgICAgICBpbnNlcnQoIHMgKTsKLSAgICAgICAgICAgIF9yb290Ll90ZXh0Lmluc2VydCggZ2V0Q3AoIHMgKSwgdGV4dCApOwotICAgICAgICAgICAgYWRqdXN0Q2NoKCBzLCB0ZXh0Lmxlbmd0aCgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc3RyaXBMZWFkaW5nV2hpdGVzcGFjZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNjaEFmdGVyID0gX2xhc3ROb25BdHRyLmdldENjaEFmdGVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChjY2hBZnRlciA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGNjaCA9IGNjaEFmdGVyOwotCi0gICAgICAgICAgICAgICAgaW50IGNwQWZ0ZXIgPQotICAgICAgICAgICAgICAgICAgICBfbGFzdE5vbkF0dHIuZ2V0Q3BGb3JQb3MoCi0gICAgICAgICAgICAgICAgICAgICAgICBfcm9vdCwgX2xhc3ROb25BdHRyLmdldFBvc0FmdGVyKCkgKTsKLQotICAgICAgICAgICAgICAgIGludCBvZmYgPSBfcm9vdC5fdGV4dC51bk9ic2N1cmUoIGNwQWZ0ZXIsIGNjaCApOwotCi0gICAgICAgICAgICAgICAgZm9yICggOyBjY2ggPiAwIDsgY2NoLS0gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1doaXRlU3BhY2UoIF9yb290Ll90ZXh0Ll9idWZbIG9mZiArIGNjaCAtIDEgXSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQgZGVsdGEgPSBjY2ggLSBjY2hBZnRlcjsKLQotICAgICAgICAgICAgICAgIGlmIChkZWx0YSA8IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfcm9vdC5fdGV4dC5yZW1vdmUoIGNwQWZ0ZXIgKyBjY2hBZnRlciArIGRlbHRhLCAtIGRlbHRhICk7Ci0gICAgICAgICAgICAgICAgICAgIF9sYXN0Tm9uQXR0ci5hZGp1c3RDY2hBZnRlciggZGVsdGEgKTsKLSAgICAgICAgICAgICAgICAgICAgYWRqdXN0Q2NoKCBfbGFzdE5vbkF0dHIsIGRlbHRhICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhYm9ydCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhlIHNoaXQgbXVzdCBoYXZlIGhpdCB0aGUgZmFuIC4uLgotCi0gICAgICAgICAgICAvLyBDbG9zZSBhbGwgZWxlbWVudHMKLQotICAgICAgICAgICAgd2hpbGUgKCBfZnJvbnRpZXIgIT0gX3Jvb3QuX2RvYyApCi0gICAgICAgICAgICAgICAgZW5kKCk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmlzaCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBYbWxFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBmaW5pc2ggKCApIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9zdHJpcFdoaXRlc3BhY2UpCi0gICAgICAgICAgICAgICAgc3RyaXBMZWFkaW5nV2hpdGVzcGFjZSgpOwotCi0gICAgICAgICAgICAvLyBUT0RPOiBkZWFsIHdpdGggdW50ZXJtaW5hdGVkIGJlZ2lucyBoZXJlCi0KLSAgICAgICAgICAgIGlmIChfZnJvbnRpZXIgIT0gX3Jvb3QuX2RvYykKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sRXhjZXB0aW9uKCAiRG9jdW1lbnQgbm90IGVuZGVkIiApOwotCi0gICAgICAgICAgICBhc3NlcnQgX3Jvb3QuX2xlZnRPbmx5OwotCi0gICAgICAgICAgICBfZmluaXNoZWQgPSB0cnVlOwotCi0gICAgICAgICAgICBfbGFzdFNwbGF5ID0gX3Jvb3Q7Ci0gICAgICAgICAgICBfbGFzdFBvcyA9IDA7Ci0KLSAgICAgICAgICAgIGlmIChfb3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5MT0FEX1RSSU1fVEVYVF9CVUZGRVIpKQotICAgICAgICAgICAgICAgIF9yb290Ll90ZXh0LnRyaW0oKTsKLQotICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhZGRpdGlvbmFsIG5hbWVzcGFjZXMsIGFkZCB0aGVtIG5vdywgbWFraW5nIHN1cmUgd2UKLSAgICAgICAgICAgIC8vIGRvbmUgb3ZlciByaWRlIGV4aXNpdG5nIG9uZXMuCi0KLSAgICAgICAgICAgIGlmIChfYWRkaXRpb25hbE5hbWVzcGFjZXMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTcGxheSBzID0gX3Jvb3QuX2RvYzsKLQotICAgICAgICAgICAgICAgIHdoaWxlICggIXMuaXNSb290KCkgJiYgIXMuaXNCZWdpbigpICkKLSAgICAgICAgICAgICAgICAgICAgcyA9IHMubmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocy5pc0JlZ2luKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IgaSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBfYWRkaXRpb25hbE5hbWVzcGFjZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGkuaGFzTmV4dCgpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGkubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc3VhbGx5LCB0aGlzIGlzIHRoZSBwcmVkZWZpbmVkIHhtbCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCAieG1sIiApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBfYWRkaXRpb25hbE5hbWVzcGFjZXMuZ2V0KCBwcmVmaXggKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMubmFtZXNwYWNlRm9yUHJlZml4KCBwcmVmaXggKSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yb290Lmluc2VydFNpbmdsZVNwbGF5U2Fuc1NwbGF5SW5MZWZ0T25seVRyZWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYbWxucyggbmV3IFFOYW1lKCBuYW1lc3BhY2UsIHByZWZpeCApICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBhYm92ZSBpbnNlcnQgc2hvdWxkIG5vdCBzcGxheSB0aGUgdHJlZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBfcm9vdC5pc0xlZnRPbmx5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZvciBtb3N0IG9mIGxvYWRpbmcsIEkgZG9uJ3QgaW52YWxpZGF0ZSB0aGUgZG9jdW1lbnQKLSAgICAgICAgICAgIC8vIHZlcnNpb24gYmVjYXVzZSBub3RoaW5nIHNob3VsZCBiZSBzZW5zaXRpdmUgdG8gaXQgd2hpbGUKLSAgICAgICAgICAgIC8vIGxvYWRpbmcuICBXaGVuIGZpbmlzaGVkIGxvYWRpbmcsIGJ1bXAgaXQuCi0KLSAgICAgICAgICAgIF9yb290LmludmFsaWRhdGVWZXJzaW9uKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydCBfcm9vdC5pc0xlZnRPbmx5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFFOYW1lIGNoZWNrTmFtZSAoIFN0cmluZyBsb2NhbCwgU3RyaW5nIHVyaSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfc3Vic3RpdHV0ZU5hbWVzcGFjZXMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3Vic3RpdHV0ZVVyaSA9Ci0gICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIF9zdWJzdGl0dXRlTmFtZXNwYWNlcy5nZXQoIHVyaSApOwotCi0gICAgICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGVVcmkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9xbmFtZUNhY2hlLmdldE5hbWUoIHN1YnN0aXR1dGVVcmksIGxvY2FsICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBfcW5hbWVDYWNoZS5nZXROYW1lKCB1cmksIGxvY2FsICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFFOYW1lIGNoZWNrTmFtZSAoIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3N1YnN0aXR1dGVOYW1lc3BhY2VzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN1YnN0aXR1dGVVcmkgPQotICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgX3N1YnN0aXR1dGVOYW1lc3BhY2VzLmdldCggbmFtZS5nZXROYW1lc3BhY2VVUkkoKSApOwotCi0gICAgICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGVVcmkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgX3FuYW1lQ2FjaGUuZ2V0TmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdGl0dXRlVXJpLCBuYW1lLmdldExvY2FsUGFydCgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgUU5hbWUgY2hlY2tOYW1lQXR0ciAoIFN0cmluZyBsb2NhbCwgU3RyaW5nIHVyaSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfc3Vic3RpdHV0ZU5hbWVzcGFjZXMgIT0gbnVsbCAmJiB1cmkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBzdWJzdGl0dXRlVXJpID0KLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgX3N1YnN0aXR1dGVOYW1lc3BhY2VzLmdldCggdXJpICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3Vic3RpdHV0ZVVyaSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3FuYW1lQ2FjaGUuZ2V0TmFtZSggc3Vic3RpdHV0ZVVyaSwgbG9jYWwgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIF9xbmFtZUNhY2hlLmdldE5hbWUoIHVyaSwgbG9jYWwgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgUU5hbWUgY2hlY2tOYW1lQXR0ciAoIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3N1YnN0aXR1dGVOYW1lc3BhY2VzICE9IG51bGwgJiYgbmFtZS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBzdWJzdGl0dXRlVXJpID0KLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZykKLSAgICAgICAgICAgICAgICAgICAgICAgIF9zdWJzdGl0dXRlTmFtZXNwYWNlcy5nZXQoIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKTsKLQotICAgICAgICAgICAgICAgIGlmIChzdWJzdGl0dXRlVXJpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIF9xbmFtZUNhY2hlLmdldE5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RpdHV0ZVVyaSwgbmFtZS5nZXRMb2NhbFBhcnQoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGRvY3R5cGUgKCBTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcm9vdC5fcHJvcHMuc2V0RG9jdHlwZU5hbWUoIG5hbWUgKTsKLSAgICAgICAgICAgIF9yb290Ll9wcm9wcy5zZXREb2N0eXBlUHVibGljSWQoIHB1YmxpY0lEICk7Ci0gICAgICAgICAgICBfcm9vdC5fcHJvcHMuc2V0RG9jdHlwZVN5c3RlbUlkKCBzeXN0ZW1JRCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluc2VydEJlZ2luICggUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfc3RyaXBXaGl0ZXNwYWNlKQotICAgICAgICAgICAgICAgIHN0cmlwTGVhZGluZ1doaXRlc3BhY2UoKTsKLQotICAgICAgICAgICAgaWYgKF9mcm9udGllci5pc0RvYygpICYmICFfZG9jRWxlbURpc2NhcmRlZCAmJgotICAgICAgICAgICAgICAgICAgICAoX2Rpc2NhcmREb2NFbGVtIHx8IGlzWG1sRnJhZ21lbnQoIG5hbWUgKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2RvY0VsZW1EaXNjYXJkZWQgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgaWYgKF9yZXBsYWNlRG9jRWxlbSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICBuYW1lID0gX3JlcGxhY2VEb2NFbGVtOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnNlcnQoIF9mcm9udGllciA9IG5ldyBCZWdpbiggbmFtZSwgX2Zyb250aWVyICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYmVnaW4gKCBTdHJpbmcgbG9jYWwsIFN0cmluZyB1cmkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnNlcnRCZWdpbiggY2hlY2tOYW1lKCBsb2NhbCwgdXJpICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYmVnaW4gKCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgaW5zZXJ0QmVnaW4oIGNoZWNrTmFtZSggbmFtZSApICk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGVuZCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9zdHJpcFdoaXRlc3BhY2UpCi0gICAgICAgICAgICAgICAgc3RyaXBMZWFkaW5nV2hpdGVzcGFjZSgpOwotCi0gICAgICAgICAgICBpZiAoX2Zyb250aWVyLmlzRG9jKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFfZG9jRWxlbURpc2NhcmRlZCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIlRvbyBtYW55IGVuZCBlbGVtZW50cyIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgIV9maW5pc2hlZDsKLSAgICAgICAgICAgICAgICBhc3NlcnQgX2Zyb250aWVyLmlzQmVnaW4oKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQgIV9mcm9udGllci5pc0xlYWYoKTsKLQotICAgICAgICAgICAgICAgIGlmIChfbGFzdE5vbkF0dHIgPT0gX2Zyb250aWVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2xhc3RTcGxheSA9IF9mcm9udGllcjsKLSAgICAgICAgICAgICAgICAgICAgX2xhc3RQb3MgPSAxICsgX2Zyb250aWVyLmdldENjaCgpOwotICAgICAgICAgICAgICAgICAgICBfZnJvbnRpZXIudG9nZ2xlSXNMZWFmKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjY2ggPSBfZnJvbnRpZXIuZ2V0Q2NoQWZ0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgX2Zyb250aWVyLmFkanVzdENjaEFmdGVyKCAtIGNjaCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBCZWdpbiBiID0gKEJlZ2luKSBfZnJvbnRpZXI7Ci0gICAgICAgICAgICAgICAgICAgIEVuZCBlID0gbmV3IEVuZCggYiApOwotICAgICAgICAgICAgICAgICAgICBiLl9lbmQgPSBlOwotICAgICAgICAgICAgICAgICAgICBpbnNlcnQoIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBfZnJvbnRpZXIgPSBfZnJvbnRpZXIuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGF0dHIgKCBRTmFtZSBuYW1lLCBjaGFyW10gYnVmLCBpbnQgb2ZmLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgaW5zZXJ0KCBuZXcgQXR0ciggY2hlY2tOYW1lQXR0ciggbmFtZSApICksIGJ1Ziwgb2ZmLCBjY2ggKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYXR0ciAoIFFOYW1lIG5hbWUsIFN0cmluZyB2YWx1ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluc2VydCggbmV3IEF0dHIoIGNoZWNrTmFtZUF0dHIoIG5hbWUgKSApLCB2YWx1ZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhdHRyICggU3RyaW5nIGxvY2FsLCBTdHJpbmcgdXJpLCBTdHJpbmcgdmFsdWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnNlcnQoIG5ldyBBdHRyKCBjaGVja05hbWVBdHRyKCBsb2NhbCwgdXJpICkgKSwgdmFsdWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBkaXNjYXJkWG1sbnMgKCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgX2RvY0VsZW1EaXNjYXJkZWQgJiYgX2Zyb250aWVyLmlzRG9jKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgbmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoIF9vcGVuRnJhZ1VyaSApOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB4bWxucyAoIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gY2hlY2tOYW1lKCBwcmVmaXgsIHVyaSApOwotCi0gICAgICAgICAgICBpZiAoIWRpc2NhcmRYbWxucyggbmFtZSApKQotICAgICAgICAgICAgICAgIGluc2VydCggbmV3IFhtbG5zKCBuYW1lICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgeG1sbnMgKCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgbmFtZSA9IGNoZWNrTmFtZSggbmFtZSApOwotCi0gICAgICAgICAgICBpZiAoIWRpc2NhcmRYbWxucyggbmFtZSApKQotICAgICAgICAgICAgICAgIGluc2VydCggbmV3IFhtbG5zKCBuYW1lICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY29tbWVudCAoIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIV9zdHJpcENvbW1lbnRzKQotICAgICAgICAgICAgICAgIGluc2VydCggbmV3IENvbW1lbnQoKSwgYnVmLCBvZmYsIGNjaCApOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBjb21tZW50ICggU3RyaW5nIHZhbHVlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFfc3RyaXBDb21tZW50cykKLSAgICAgICAgICAgICAgICBpbnNlcnQoIG5ldyBDb21tZW50KCksIHZhbHVlICk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHByb2NpbnN0ICggU3RyaW5nIHRhcmdldCwgY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghX3N0cmlwUHJvY2luc3RzKQotICAgICAgICAgICAgICAgIGluc2VydCggbmV3IFByb2NpbnN0KCB0YXJnZXQgKSwgYnVmLCBvZmYsIGNjaCApOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBwcm9jaW5zdCAoIFN0cmluZyB0YXJnZXQsIFN0cmluZyB2YWx1ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghX3N0cmlwUHJvY2luc3RzKQotICAgICAgICAgICAgICAgIGluc2VydCggbmV3IFByb2NpbnN0KCB0YXJnZXQgKSwgdmFsdWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIHJldHVybnMgdGhlIGNwIHdoZXJlIG5ldyB0ZXh0IHNob3VsZCBnby4KLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgcHJlVGV4dCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFfZmluaXNoZWQ7Ci0KLSAgICAgICAgICAgIHJldHVybiBnZXRDcCggX2xhc3ROb25BdHRyICkgKyBfbGFzdE5vbkF0dHIuZ2V0Q2NoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBOZXcgdGV4dCBoYXMgYmVlbiBwbGFjZWQsIGFkanVzdC4uLgotICAgICAgICAvLwotCi0gICAgICAgIHZvaWQgcG9zdFRleHQgKCBpbnQgY3AsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3N0cmlwV2hpdGVzcGFjZSAmJiBfbGFzdE5vbkF0dHIuZ2V0Q2NoQWZ0ZXIoKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBvZmYgPSBfcm9vdC5fdGV4dC51bk9ic2N1cmUoIGNwLCBjY2ggKTsKLQotICAgICAgICAgICAgICAgIGludCBpID0gMDsKLQotICAgICAgICAgICAgICAgIHdoaWxlICggaSA8IGNjaCAmJiBpc1doaXRlU3BhY2UoIF9yb290Ll90ZXh0Ll9idWZbIG9mZiArIGkgXSApICkKLSAgICAgICAgICAgICAgICAgICAgaSsrOwotCi0gICAgICAgICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3Jvb3QuX3RleHQucmVtb3ZlKCBjcCwgaSApOwotICAgICAgICAgICAgICAgICAgICBjY2ggLT0gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjY2ggPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9sYXN0U3BsYXkgPSBfbGFzdE5vbkF0dHI7Ci0gICAgICAgICAgICAgICAgX2xhc3RQb3MgPSBfbGFzdE5vbkF0dHIuZ2V0RW5kUG9zKCk7Ci0gICAgICAgICAgICAgICAgX2xhc3ROb25BdHRyLmFkanVzdENjaEFmdGVyKCBjY2ggKTsKLQotICAgICAgICAgICAgICAgIGFkanVzdENjaCggX2xhc3ROb25BdHRyLCBjY2ggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdGV4dCAoIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgIV9maW5pc2hlZDsKLQotICAgICAgICAgICAgaW50IHN0YXJ0ID0gb2ZmOwotICAgICAgICAgICAgaW50IGVuZCA9IG9mZiArIGNjaDsKLQotICAgICAgICAgICAgaWYgKF9zdHJpcFdoaXRlc3BhY2UgJiYgX2xhc3ROb25BdHRyLmdldENjaEFmdGVyKCkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoIHN0YXJ0IDwgZW5kICYmIGlzV2hpdGVTcGFjZSggYnVmWyBzdGFydCBdICkgKQotICAgICAgICAgICAgICAgICAgICBzdGFydCsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY2NoVGV4dCA9IGVuZCAtIHN0YXJ0OwotCi0gICAgICAgICAgICBpZiAoY2NoVGV4dCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2xhc3RTcGxheSA9IF9sYXN0Tm9uQXR0cjsKLSAgICAgICAgICAgICAgICBfbGFzdFBvcyA9IF9sYXN0Tm9uQXR0ci5nZXRFbmRQb3MoKTsKLQotICAgICAgICAgICAgICAgIF9yb290Ll90ZXh0Lmluc2VydCgKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q3AoIF9sYXN0Tm9uQXR0ciApICsgX2xhc3ROb25BdHRyLmdldENjaCgpLAotICAgICAgICAgICAgICAgICAgICBidWYsIHN0YXJ0LCBjY2hUZXh0ICk7Ci0KLSAgICAgICAgICAgICAgICBfbGFzdE5vbkF0dHIuYWRqdXN0Q2NoQWZ0ZXIoIGNjaFRleHQgKTsKLSAgICAgICAgICAgICAgICBhZGp1c3RDY2goIF9sYXN0Tm9uQXR0ciwgY2NoVGV4dCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB0ZXh0ICggU3RyaW5nIHRleHQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgIV9maW5pc2hlZDsKLQotICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgICAgIGludCBlbmQgPSB0ZXh0Lmxlbmd0aCgpOwotCi0gICAgICAgICAgICBpZiAoX3N0cmlwV2hpdGVzcGFjZSAmJiBfbGFzdE5vbkF0dHIuZ2V0Q2NoQWZ0ZXIoKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlICggc3RhcnQgPCBlbmQgJiYgaXNXaGl0ZVNwYWNlKCB0ZXh0LmNoYXJBdCggc3RhcnQgKSApICkKLSAgICAgICAgICAgICAgICAgICAgc3RhcnQrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGNjaFRleHQgPSBlbmQgLSBzdGFydDsKLQotICAgICAgICAgICAgaWYgKGNjaFRleHQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9sYXN0U3BsYXkgPSBfbGFzdE5vbkF0dHI7Ci0gICAgICAgICAgICAgICAgX2xhc3RQb3MgPSBfbGFzdE5vbkF0dHIuZ2V0RW5kUG9zKCk7Ci0KLSAgICAgICAgICAgICAgICBfcm9vdC5fdGV4dC5pbnNlcnQoCi0gICAgICAgICAgICAgICAgICAgIGdldENwKCBfbGFzdE5vbkF0dHIgKSArIF9sYXN0Tm9uQXR0ci5nZXRDY2goKSwKLSAgICAgICAgICAgICAgICAgICAgdGV4dCwgc3RhcnQsIGNjaFRleHQgKTsKLQotICAgICAgICAgICAgICAgIF9sYXN0Tm9uQXR0ci5hZGp1c3RDY2hBZnRlciggY2NoVGV4dCApOwotICAgICAgICAgICAgICAgIGFkanVzdENjaCggX2xhc3ROb25BdHRyLCBjY2hUZXh0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbm5vdGF0ZXMgdGhlIGxhc3QgdGhpbmcgaW5zZXJ0ZWQKLSAgICAgICAgdm9pZCBhbm5vdGF0ZSAoIFhtbEJvb2ttYXJrIHhtbEJvb2ttYXJrICkKLSAgICAgICAgewotICAgICAgICAgICAgbmV3IEFubm90YXRpb24oIF9yb290LCB4bWxCb29rbWFyayApLgotICAgICAgICAgICAgICAgIHNldCggX2xhc3RTcGxheSwgX2xhc3RQb3MgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgbGluZU51bWJlckFubm90YXRpb24gKCBpbnQgbGluZSwgaW50IGNvbHVtbiwgaW50IG9mZnNldCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFubm90YXRlKCBuZXcgWG1sTGluZU51bWJlciggbGluZSwgY29sdW1uLCBvZmZzZXQgKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBsaW5lTnVtYmVyQW5ub3RhdGlvbiAoIFhNTEV2ZW50IHhlICkKLSAgICAgICAgewotICAgICAgICAgICAgTG9jYXRpb24gbG9jID0geGUuZ2V0TG9jYXRpb24oKTsKLQotICAgICAgICAgICAgaWYgKGxvYyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpbmVOdW1iZXJBbm5vdGF0aW9uKAotICAgICAgICAgICAgICAgICAgICBsb2MuZ2V0TGluZU51bWJlcigpLCBsb2MuZ2V0Q29sdW1uTnVtYmVyKCksIC0xICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGphdmVsaW5Bbm5vdGF0aW9uICggWG1sQ3Vyc29yLlhtbEJvb2ttYXJrIGphICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGphICE9IG51bGwpCi0gICAgICAgICAgICAgICBhbm5vdGF0ZSggamEgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgUm9vdCAgICAgICBfcm9vdDsKLSAgICAgICAgcHJpdmF0ZSBTcGxheSAgICAgIF9sYXN0Tm9uQXR0cjsKLSAgICAgICAgcHJpdmF0ZSBDb250YWluZXIgIF9mcm9udGllcjsKLSAgICAgICAgcHJpdmF0ZSBTcGxheSAgICAgIF9sYXN0U3BsYXk7Ci0gICAgICAgIHByaXZhdGUgaW50ICAgICAgICBfbGFzdFBvczsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgIF9maW5pc2hlZDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgIF9kaXNjYXJkRG9jRWxlbTsKLSAgICAgICAgcHJpdmF0ZSBRTmFtZSAgICAgIF9yZXBsYWNlRG9jRWxlbTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgIF9zdHJpcFdoaXRlc3BhY2U7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiAgICBfc3RyaXBDb21tZW50czsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgIF9zdHJpcFByb2NpbnN0czsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgIF9kb2NFbGVtRGlzY2FyZGVkOwotICAgICAgICBwcml2YXRlIE1hcCAgICAgICAgX3N1YnN0aXR1dGVOYW1lc3BhY2VzOwotICAgICAgICBwcml2YXRlIE1hcCAgICAgICAgX2FkZGl0aW9uYWxOYW1lc3BhY2VzOwotICAgICAgICBwcml2YXRlIFFOYW1lQ2FjaGUgX3FuYW1lQ2FjaGU7Ci0gICAgICAgIHByaXZhdGUgWG1sT3B0aW9ucyBfb3B0aW9uczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZE5vZGVDaGlsZHJlbiAoIE5vZGUgbiwgTG9hZENvbnRleHQgY29udGV4dCApCi0gICAgewotICAgICAgICBmb3IgKCBOb2RlIGMgPSBuLmdldEZpcnN0Q2hpbGQoKSA7IGMgIT0gbnVsbCA7IGMgPSBjLmdldE5leHRTaWJsaW5nKCkgKQotICAgICAgICAgICAgbG9hZE5vZGUoIGMsIGNvbnRleHQgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZE5vZGUgKCBOb2RlIG4sIExvYWRDb250ZXh0IGNvbnRleHQgKQotICAgIHsKLSAgICAgICAgc3dpdGNoICggbi5nZXROb2RlVHlwZSgpICkKLSAgICAgICAgewotICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfTk9ERSA6Ci0gICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFIDoKLSAgICAgICAgY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGxvYWROb2RlQ2hpbGRyZW4oIG4sIGNvbnRleHQgKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRleHQuYmVnaW4oIG4uZ2V0TG9jYWxOYW1lKCksIG4uZ2V0TmFtZXNwYWNlVVJJKCkgKTsKLQotICAgICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJzID0gbi5nZXRBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKSA7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTm9kZSBhID0gYXR0cnMuaXRlbSggaSApOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGEuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsID0gYS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhLmdldE5vZGVWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsICYmIHVyaS5lcXVhbHMoIF94bWxuc1VyaSApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsLmVxdWFscyggInhtbG5zIiApKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC54bWxucyggIiIsIHZhbHVlICk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQueG1sbnMoIGxvY2FsLCB2YWx1ZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmF0dHIoIGxvY2FsLCB1cmksIHZhbHVlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb2FkTm9kZUNoaWxkcmVuKCBuLCBjb250ZXh0ICk7Ci0KLSAgICAgICAgICAgIGNvbnRleHQuZW5kKCk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTm9kZS5URVhUX05PREUgOgotICAgICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC50ZXh0KCBuLmdldE5vZGVWYWx1ZSgpICk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5jb21tZW50KCBuLmdldE5vZGVWYWx1ZSgpICk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5wcm9jaW5zdCggbi5nZXROb2RlTmFtZSgpLCBuLmdldE5vZGVWYWx1ZSgpICk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDoKLSAgICAgICAgY2FzZSBOb2RlLkVOVElUWV9OT0RFIDoKLSAgICAgICAgY2FzZSBOb2RlLk5PVEFUSU9OX05PREUgOgotICAgICAgICBjYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOgotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIlVuZXhwZWN0ZWQgbm9kZSIgKTsKLSAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdCBsb2FkWG1sICggTm9kZSBub2RlLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHRocm93cyBYbWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIExvYWRDb250ZXh0IGNvbnRleHQgPSBuZXcgTG9hZENvbnRleHQoIHRoaXMsIG9wdGlvbnMgKTsKLQotICAgICAgICBsb2FkTm9kZSggbm9kZSwgY29udGV4dCApOwotCi0gICAgICAgIGFzc29jaWF0ZVNvdXJjZU5hbWUoIG9wdGlvbnMgKTsKLQotICAgICAgICByZXR1cm4gYXV0b1R5cGVkRG9jdW1lbnQoIHR5cGUsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sT2JqZWN0IGxvYWRYbWwgKAotICAgICAgICBYTUxJbnB1dFN0cmVhbSB4aXMsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbG9hZFhtbElucHV0U3RyZWFtKCB4aXMsIG9wdGlvbnMgKTsKLQotICAgICAgICByZXR1cm4gYXV0b1R5cGVkRG9jdW1lbnQoIHR5cGUsIG9wdGlvbnMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2FkWG1sSW5wdXRTdHJlYW0gKCBYTUxJbnB1dFN0cmVhbSB4aXMsIFhtbE9wdGlvbnMgb3B0aW9ucyApCi0gICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgb3B0aW9ucyA9IFhtbE9wdGlvbnMubWFza051bGwoIG9wdGlvbnMgKTsKLQotICAgICAgICBYTUxFdmVudCB4ID0geGlzLnBlZWsoKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh4ICE9IG51bGwgJiYgeC5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuU1RBUlRfRUxFTUVOVCkKLSAgICAgICAgewotICAgICAgICAgICAgTWFwIG5zTWFwID0gKChTdGFydEVsZW1lbnQpIHgpLmdldE5hbWVzcGFjZU1hcCgpOwotCi0gICAgICAgICAgICBpZiAobnNNYXAgIT0gbnVsbCAmJiBuc01hcC5zaXplKCkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VzLnB1dEFsbCggbnNNYXAgKTsKLQotICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucyggb3B0aW9ucyApOwotCi0gICAgICAgICAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuTE9BRF9BRERJVElPTkFMX05BTUVTUEFDRVMsIG5hbWVzcGFjZXMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExvYWRDb250ZXh0IGNvbnRleHQgPSBuZXcgTG9hZENvbnRleHQoIHRoaXMsIG9wdGlvbnMgKTsKLQotICAgICAgICBib29sZWFuIGxpbmVOdW1zID0gb3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuTE9BRF9MSU5FX05VTUJFUlMgKTsKLQotICAgICAgICBldmVudHM6Ci0gICAgICAgIGZvciAoIFhNTEV2ZW50IHhlID0geGlzLm5leHQoKSA7IHhlICE9IG51bGwgOyB4ZSA9IHhpcy5uZXh0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCB4ZS5nZXRUeXBlKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5TVEFSVF9ET0NVTUVOVCA6Ci0gICAgICAgICAgICAgICAgLy8gQlVHQlVHIChlcmljdmFzKSAxMjI1OCAtIEZJWEVEIGJlbG93Ci0gICAgICAgICAgICAgICAgU3RhcnREb2N1bWVudCBkb2MgPSAoU3RhcnREb2N1bWVudCkgeGU7Ci0KLS8vICAgICAgICAgICAgICAgIGNvbnRleHQuZG9jdHlwZSgKLS8vICAgICAgICAgICAgICAgICAgICBkb2MuZ2V0bmFtZSgpLmdldExvY2FsTmFtZSgpLAotLy8gICAgICAgICAgICAgICAgICAgICIiLCBkb2MuZ2V0UHVibGljSWQoKQotCi0gICAgICAgICAgICAgICAgX3Byb3BzLnNldERvY3R5cGVTeXN0ZW1JZCggZG9jLmdldFN5c3RlbUlkKCkgKTsKLS8vICAgICAgICAgICAgICAgIF9wdWJsaWNJRCA9IGRvYy5nZXRQdWJsaWNJZCgpOwotICAgICAgICAgICAgICAgIF9wcm9wcy5zZXRFbmNvZGluZyggZG9jLmdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCkgKTsKLSAgICAgICAgICAgICAgICBfcHJvcHMuc2V0VmVyc2lvbiggZG9jLmdldFZlcnNpb24oKSApOwotICAgICAgICAgICAgICAgIF9zdGFuZEFsb25lID0gZG9jLmlzU3RhbmRhbG9uZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxpbmVOdW1zKQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxpbmVOdW1iZXJBbm5vdGF0aW9uKCB4ZSApOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuRU5EX0RPQ1VNRU5UIDoKLSAgICAgICAgICAgICAgICBpZiAobGluZU51bXMpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQubGluZU51bWJlckFubm90YXRpb24oIHhlICk7Ci0KLSAgICAgICAgICAgICAgICBicmVhayBldmVudHM7Ci0KLSAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuTlVMTF9FTEVNRU5UIDoKLSAgICAgICAgICAgICAgICBpZiAoIXhpcy5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrIGV2ZW50czsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5TVEFSVF9FTEVNRU5UIDoKLSAgICAgICAgICAgICAgICBjb250ZXh0LmJlZ2luKCBYTUxOYW1lSGVscGVyLmdldFFOYW1lKCB4ZS5nZXROYW1lKCkgKSApOwotCi0gICAgICAgICAgICAgICAgaWYgKGxpbmVOdW1zKQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxpbmVOdW1iZXJBbm5vdGF0aW9uKCB4ZSApOwotCi0gICAgICAgICAgICAgICAgZm9yICggQXR0cmlidXRlSXRlcmF0b3IgYWkgPSAoKFN0YXJ0RWxlbWVudCkgeGUpLmdldEF0dHJpYnV0ZXMoKQotICAgICAgICAgICAgICAgICAgICAgIDsgYWkuaGFzTmV4dCgpIDsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIGF0dHIgPSBhaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5hdHRyKAotICAgICAgICAgICAgICAgICAgICAgICAgWE1MTmFtZUhlbHBlci5nZXRRTmFtZSggYXR0ci5nZXROYW1lKCkgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZ2V0VmFsdWUoKSApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoIEF0dHJpYnV0ZUl0ZXJhdG9yIGFpID0gKChTdGFydEVsZW1lbnQpIHhlKS5nZXROYW1lc3BhY2VzKCkKLSAgICAgICAgICAgICAgICAgICAgICA7IGFpLmhhc05leHQoKSA7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gYWkubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgICAgIFhNTE5hbWUgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWwgPSBuYW1lLmdldExvY2FsTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmdldFByZWZpeCgpID09IG51bGwgJiYgbG9jYWwuZXF1YWxzKCAieG1sbnMiICkpCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCA9ICIiOwotCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQueG1sbnMoIGxvY2FsLCBhdHRyLmdldFZhbHVlKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5FTkRfRUxFTUVOVCA6Ci0gICAgICAgICAgICAgICAgY29udGV4dC5lbmQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChsaW5lTnVtcykKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5saW5lTnVtYmVyQW5ub3RhdGlvbiggeGUgKTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFhNTEV2ZW50LlNQQUNFIDoKLSAgICAgICAgICAgICAgICBpZiAoKChTcGFjZSkgeGUpLmlnbm9yYWJsZSgpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaAotCi0gICAgICAgICAgICBjYXNlIFhNTEV2ZW50LkNIQVJBQ1RFUl9EQVRBIDoKLSAgICAgICAgICAgICAgICBDaGFyYWN0ZXJEYXRhIGNkID0gKENoYXJhY3RlckRhdGEpIHhlOwotCi0gICAgICAgICAgICAgICAgaWYgKGNkLmhhc0NvbnRlbnQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQudGV4dCggY2QuZ2V0Q29udGVudCgpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVOdW1zKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5saW5lTnVtYmVyQW5ub3RhdGlvbiggeGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5DT01NRU5UIDoKLSAgICAgICAgICAgICAgICB3ZWJsb2dpYy54bWwuc3RyZWFtLkNvbW1lbnQgY29tbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICh3ZWJsb2dpYy54bWwuc3RyZWFtLkNvbW1lbnQpIHhlOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQuaGFzQ29udGVudCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jb21tZW50KCBjb21tZW50LmdldENvbnRlbnQoKSApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lTnVtcykKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQubGluZU51bWJlckFubm90YXRpb24oIHhlICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuUFJPQ0VTU0lOR19JTlNUUlVDVElPTiA6Ci0gICAgICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHByb2NJbnN0ciA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIHhlOwotCi0gICAgICAgICAgICAgICAgY29udGV4dC5wcm9jaW5zdCggcHJvY0luc3RyLmdldFRhcmdldCgpLCBwcm9jSW5zdHIuZ2V0RGF0YSgpICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobGluZU51bXMpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQubGluZU51bWJlckFubm90YXRpb24oIHhlICk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLy8gVGhlc2UgYXJlIGlnbm9yZWQKLSAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuRU5USVRZX1JFRkVSRU5DRSA6Ci0gICAgICAgICAgICBjYXNlIFhNTEV2ZW50LlNUQVJUX1BSRUZJWF9NQVBQSU5HIDoKLSAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuRU5EX1BSRUZJWF9NQVBQSU5HIDoKLSAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuQ0hBTkdFX1BSRUZJWF9NQVBQSU5HIDoKLSAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuWE1MX0VWRU5UIDoKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJVbmhhbmRsZWQgeG1sIGV2ZW50IHR5cGU6ICIgKyB4ZS5nZXRUeXBlQXNTdHJpbmcoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY29udGV4dC5maW5pc2goKTsKLQotICAgICAgICBhc3NvY2lhdGVTb3VyY2VOYW1lKCBvcHRpb25zICk7Ci0KLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlKCk7Ci0gICAgICAgIGFzc2VydCBpc0xlZnRPbmx5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGR1bXAgKCBYbWxPYmplY3QgeCApCi0gICAgewotICAgICAgICBkdW1wKCB4LCBTeXN0ZW0ub3V0ICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGR1bXAgKCBYbWxPYmplY3QgeCwgUHJpbnRTdHJlYW0gcHMgKQotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIHhjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgUm9vdCByID0gKChDdXJzb3IpIHhjKS5nZXRSb290KCk7Ci0gICAgICAgIHIuZHVtcCggcHMsIG51bGwsICgoQ3Vyc29yKSB4YykuZ2V0U3BsYXkoKSwgZmFsc2UgKTsKLSAgICAgICAgeGMuZGlzcG9zZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wICggWG1sQ3Vyc29yIHhjICkKLSAgICB7Ci0gICAgICAgIGR1bXAoIHhjLCBTeXN0ZW0ub3V0ICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGR1bXAgKCBYbWxDdXJzb3IgeGMsIFByaW50U3RyZWFtIHBzICkKLSAgICB7Ci0gICAgICAgIFJvb3QgciA9ICgoQ3Vyc29yKSB4YykuZ2V0Um9vdCgpOwotICAgICAgICByLmR1bXAoIHBzLCBudWxsLCAoKEN1cnNvcikgeGMpLmdldFNwbGF5KCksIGZhbHNlICk7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBwcml2YXRlIHZvaWQgZHVtcFRleHQgKCBQcmludFN0cmVhbSBwcywgaW50IGNwLCBpbnQgY2NoLCBTcGxheSBzLCBpbnQgcCApCi0gICAgewotICAgICAgICBpZiAoY3AgPj0gMCAmJiBjcCArIGNjaCA8PSBfdGV4dC5sZW5ndGgoKSkKLSAgICAgICAgICAgIGR1bXBTdHJpbmcoIHBzLCBfdGV4dC5mZXRjaCggY3AsIGNjaCApLCBzLCBwICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBzLnByaW50KCAiW3N0cmluZzogY3A9IiArIGNwICsgIiwgY2NoPSIgKyBjY2ggKyAiIF0iICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGR1bXBUZXh0ICggUHJpbnRTdHJlYW0gcHMsIGludCBjcCwgaW50IGNjaCApCi0gICAgewotICAgICAgICBpZiAoY3AgPj0gMCAmJiBjcCArIGNjaCA8PSBfdGV4dC5sZW5ndGgoKSkKLSAgICAgICAgICAgIGR1bXBTdHJpbmcoIHBzLCBfdGV4dC5mZXRjaCggY3AsIGNjaCApLCBudWxsLCAwICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBzLnByaW50KCAiW3N0cmluZzogY3A9IiArIGNwICsgIiwgY2NoPSIgKyBjY2ggKyAiIF0iICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGR1bXBTdHJpbmcgKCBQcmludFN0cmVhbSBwcywgU3RyaW5nIHMgKQotICAgIHsKLSAgICAgICAgZHVtcFN0cmluZyggcHMsIHMsIG51bGwsIDAgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZHVtcEdvb2JlcnNJbmxpbmUgKCBQcmludFN0cmVhbSBwcywgU3BsYXkgcywgaW50IHAgKQotICAgIHsKLSAgICAgICAgZm9yICggR29vYmVyIGcgPSBzLmZpcnN0R29vYmVyKCkgOyBnICE9IG51bGwgOwotICAgICAgICAgICAgICBnID0gcy5uZXh0R29vYmVyKCBnICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZy5nZXRLaW5kKCkgPT0gQ1VSU09SICYmIGcuZ2V0UG9zKCkgPT0gcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDdXJzb3JHb29iZXIgY2cgPSAoQ3Vyc29yR29vYmVyKSBnOwotCi0gICAgICAgICAgICAgICAgcHMucHJpbnQoICJbIiArICgoQ3Vyc29yR29vYmVyKSBnKS5nZXREZWJ1Z0lkKCkgKyAiXSIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkdW1wU3RyaW5nICggUHJpbnRTdHJlYW0gcHMsIFN0cmluZyBzdHIsIFNwbGF5IHMsIGludCBwICkKLSAgICB7Ci0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBzdHIubGVuZ3RoKCkgOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocyAhPSBudWxsKQotICAgICAgICAgICAgICAgIGR1bXBHb29iZXJzSW5saW5lKCBwcywgcywgaSArIHAgKTsKLQotICAgICAgICAgICAgaWYgKGkgPT0gMzYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnQoICIuLi4iICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNoYXIgY2ggPSBzdHIuY2hhckF0KCBpICk7Ci0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nKQotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiXFxuIiApOwotICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1xyJykKLSAgICAgICAgICAgICAgICBwcy5wcmludCggIlxcciIgKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICdcdCcpCi0gICAgICAgICAgICAgICAgcHMucHJpbnQoICJcXHQiICk7Ci0gICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnXCInKQotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiXFxcIiIgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwcy5wcmludCggY2ggKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkdW1wR29vYmVycyAoIFByaW50U3RyZWFtIHBzLCBHb29iZXIgZyApCi0gICAgewotICAgICAgICBpZiAoZyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChnLmdldEtpbmQoKSA9PSBBR0dSRUdBVEUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBzLnByaW50KCAiIHsiICk7Ci0gICAgICAgICAgICBkdW1wR29vYmVycyggcHMsIGcuX2dvb2JlcnMgKTsKLSAgICAgICAgICAgIHBzLnByaW50KCAifSIgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwcy5wcmludCggIiAtICIgKyBnLmdldEtpbmROYW1lKCkgKyAiIHBvczogIiArIGcuZ2V0UG9zKCkgKTsKLQotICAgICAgICBpZiAoZy5nZXRLaW5kKCkgPT0gQ1VSU09SKQotICAgICAgICAgICAgcHMucHJpbnQoICIgaWQ6ICIgKyAoKEN1cnNvckdvb2JlcikgZykuZ2V0RGVidWdJZCgpICk7Ci0KLSAgICAgICAgaWYgKGcuX25leHQgIT0gZy5fcGFyZW50Ll9nb29iZXJzKQotICAgICAgICAgICAgZHVtcEdvb2JlcnMoIHBzLCBnLl9uZXh0ICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGR1bXBTcGxheVRyZWUoIFNwbGF5IHMsIFByaW50U3RyZWFtIHBzICkKLSAgICB7Ci0gICAgICAgIGlmIChzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKHMuX3JpZ2h0U3BsYXkgIT0gbnVsbCkKLSAgICAgICAgICAgIGR1bXBTcGxheVRyZWUoIHMuX3JpZ2h0U3BsYXksIHBzICk7Ci0KLSAgICAgICAgZm9yICggU3BsYXkgdCA9IHMuX3BhcmVudFNwbGF5IDsgdCAhPSBudWxsIDsgdCA9IHQuX3BhcmVudFNwbGF5ICkKLSAgICAgICAgICAgIHBzLnByaW50KCAiICAiICk7Ci0KLSAgICAgICAgcHMucHJpbnQoICJbIiArIHMuZ2V0RGVidWdJZCgpICk7Ci0gICAgICAgIHBzLnByaW50KCAiIGM6IiArIHMuZ2V0Q2NoTGVmdCgpICsgIigiICsgcy5nZXRDY2goKSArICIpIik7Ci0gICAgICAgIHBzLnByaW50KCAiIGI6IiArIHMuZ2V0Q2RvY0JlZ2luTGVmdCgpICsgIigiICsgcy5nZXRDZG9jQmVnaW4oKSArICIpIik7Ci0KLSAgICAgICAgaWYgKHMuX3BhcmVudFNwbGF5ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBzLnByaW50KCAiIHA6IiArIHMuX3BhcmVudFNwbGF5LmdldERlYnVnSWQoKSApOwotICAgICAgICAgICAgcHMucHJpbnQoIHMuX3BhcmVudFNwbGF5Ll9sZWZ0U3BsYXkgPT0gcyA/ICJMIiA6ICJSIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHMucHJpbnRsbiggIl0iICk7Ci0KLSAgICAgICAgaWYgKHMuX2xlZnRTcGxheSAhPSBudWxsKQotICAgICAgICAgICAgZHVtcFNwbGF5VHJlZSggcy5fbGVmdFNwbGF5LCBwcyApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wICggWG1sQ3Vyc29yIGMsIGJvb2xlYW4gdmVyYm9zZSApCi0gICAgewotICAgICAgICAoKEN1cnNvcikgYykuZHVtcCggdmVyYm9zZSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGR1bXAgKCApCi0gICAgewotICAgICAgICBkdW1wKCBTeXN0ZW0ub3V0LCBudWxsLCB0aGlzLCBmYWxzZSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGR1bXAgKCBib29sZWFuIHZlcmJvc2UgKQotICAgIHsKLSAgICAgICAgZHVtcCggU3lzdGVtLm91dCwgbnVsbCwgdGhpcywgdmVyYm9zZSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGR1bXAgKCBQcmludFN0cmVhbSBwcyApCi0gICAgewotICAgICAgICBkdW1wKCBwcywgbnVsbCwgdGhpcywgZmFsc2UgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkdW1wICggUHJpbnRTdHJlYW0gcHMsIFN0cmluZyBtc2csIE9iamVjdCBzcmMsIGJvb2xlYW4gdmVyYm9zZSApCi0gICAgewotICAgICAgICAvLyBVbmRlciBJbnRlbGxpSiwgaWYgeW91IGNhbGwgYSBmdW5jdGlvbiBmcm9tIHRoZSBleHByZXNzaW9uCi0gICAgICAgIC8vIGV2YWx1YXRvciBhbmQgaXQgcHJvZHVjZXMgdG9vIG11Y2ggb3V0cHV0LCBJbnRlbGxpSiB3aWxsIG5vdAotICAgICAgICAvLyBzaG93IHlvdSB0aGUgb3V0cHV0IG9mIHRoZSBmdW5jdGlvbi4gIFNvLCBJIGR1bXAgdG8gYSBmaWxlCi0gICAgICAgIC8vIGhlcmUgYXMgd2VsbCBhbmQgdGhlIGdpdmVuIHByaW50IHN0cmVhbSEKLQotICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZSggImM6XFwiICk7Ci0KLSAgICAgICAgaWYgKGYuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGYgPSBuZXcgRmlsZSggZiwgInhiZWFuLmRtcCIgKTsKLQotICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLSAgICAgICAgICAgIFByaW50U3RyZWFtIHBzMiA9IG51bGw7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oIGYgKTsKLSAgICAgICAgICAgICAgICBwczIgPSBuZXcgUHJpbnRTdHJlYW0oIG9zICk7Ci0KLSAgICAgICAgICAgICAgICBkb0R1bXAoIHBzMiwgbXNnLCBzcmMsIHZlcmJvc2UgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggVGhyb3dhYmxlIHQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwczIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBzMi5wcmludGxuKCAiRXhjZXB0aW9uIGR1cmluZyBkdW1wLiIgKTsKLSAgICAgICAgICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoIHBzMiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG9zICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsgb3MuY2xvc2UoKTsgfSBjYXRjaCAoIEV4Y2VwdGlvbiBlICkgeyB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZG9EdW1wKCBwcywgbXNnLCBzcmMsIHZlcmJvc2UgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFRocm93YWJsZSB0ICkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiRXhjZXB0aW9uIGR1cmluZyBkdW1wLiIgKTsKLSAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCBTeXN0ZW0ub3V0ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgRHVtcE5zTWFuYWdlciBpbXBsZW1lbnRzIE5hbWVzcGFjZU1hbmFnZXIKLSAgICB7Ci0gICAgICAgIER1bXBOc01hbmFnZXIgKCBQcmludFN0cmVhbSBwcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucHMgPSBwczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZmluZF9wcmVmaXhfZm9yX25zdXJpICggU3RyaW5nIHVyaSwgU3RyaW5nIHN1Z2dlc3Rpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gImRlYnVnX3ByZWZpeF8iICsgaSsrOwotCi0gICAgICAgICAgICBwcy5wcmludCggIiBbZmluZF9wcmVmaXhfZm9yX25zdXJpOiAiICk7Ci0gICAgICAgICAgICBwcy5wcmludCggIlwiIiArIHVyaSArICJcIiAoIiArIHN1Z2dlc3Rpb24gKyAiKSAtPiAiICsgcHJlZml4ICk7Ci0gICAgICAgICAgICBwcy5wcmludCggIl0iICk7Ci0KLSAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZUZvclByZWZpeCAoIFN0cmluZyBwcmVmaXggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4LmVxdWFscyggInhtbCIgKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gX3htbDE5OThVcmk7Ci0KLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSAiZGVidWdfbnNfIiArIGkrKzsKLQotICAgICAgICAgICAgcHMucHJpbnQoICIgW2xvb2t1cF9uc3VyaV9mb3JfcHJlZml4OiAiICk7Ci0gICAgICAgICAgICBwcy5wcmludCggcHJlZml4ICsgIiAtPiBcIiIgKyB1cmkgKyAiXCIiICk7Ci0gICAgICAgICAgICBwcy5wcmludCggIl0iICk7Ci0KLSAgICAgICAgICAgIHJldHVybiB1cmk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcmludFN0cmVhbSBwczsKLQotICAgICAgICBwcml2YXRlIGludCBpID0gMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb0R1bXAgKAotICAgICAgICBQcmludFN0cmVhbSBwcywgU3RyaW5nIG1zZywgT2JqZWN0IHNyYywgYm9vbGVhbiB2ZXJib3NlICkKLSAgICB7Ci0gICAgICAgIGlmICghX2Fzc2VydEVuYWJsZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBzLnByaW50bG4oICJObyBkdW1wIHByb2R1Y2VkIChhc3NlcnQgbmVlZHMgdG8gYmUgZW5hYmxlZCkiICk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBOYW1lc3BhY2VNYW5hZ2VyIG5zbSA9IG5ldyBEdW1wTnNNYW5hZ2VyKCBwcyApOwotCi0gICAgICAgIGlmIChtc2cgIT0gbnVsbCkKLSAgICAgICAgICAgIHBzLnByaW50bG4oIG1zZyApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwcy5wcmludGxuKCAiRHVtcDoiICk7Ci0KLSAgICAgICAgaWYgKHNyYyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3JjIGluc3RhbmNlb2YgQ3Vyc29yKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBzLnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICIgIGZyb20gY3Vyc29yICIgKyAoKEN1cnNvckdvb2JlcikoKEN1cnNvcikgc3JjKS5fZ29vYmVyKS5nZXREZWJ1Z0lkKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHNyYyBpbnN0YW5jZW9mIFNwbGF5KQotICAgICAgICAgICAgICAgIHBzLnByaW50bG4oICIgIGZyb20gc3BsYXkgIiArICgoU3BsYXkpIHNyYykuZ2V0RGVidWdJZCgpICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcHMucHJpbnRsbiggIiAgZnJvbSBzcmMgIiArIHNyYyApOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGRlcHRoID0gMDsKLQotICAgICAgICBmb3IgKCBTcGxheSBzID0gX2RvYyA7IHMgIT0gbnVsbCA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGtpbmQgPSBzLmdldEtpbmQoKTsKLQotICAgICAgICAgICAgU3RyaW5nIGlkcyA9ICIiICsgcy5nZXREZWJ1Z0lkKCk7Ci0gICAgICAgICAgICBpZHMgPSAiICAgICAgICAiLnN1YnN0cmluZyggMCwgNiAtIGlkcy5sZW5ndGgoKSApICsgaWRzOwotICAgICAgICAgICAgcHMucHJpbnQoIGlkcyArICI6ICIgKTsKLQotICAgICAgICAgICAgaWYgKGtpbmQgPT0gRU5EKQotICAgICAgICAgICAgICAgIGRlcHRoLS07Ci0KLSAgICAgICAgICAgIGlmICghcy5pc1Jvb3QoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgZGVwdGggOyBpKysgKQotICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIiAgIiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkdW1wR29vYmVyc0lubGluZSggcHMsIHMsIDAgKTsKLQotICAgICAgICAgICAgc3dpdGNoICgga2luZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIERPQyA6Ci0gICAgICAgICAgICAgICAgcHMucHJpbnQoICJET0MiICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgQkVHSU4gOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJlZ2luIGIgPSAoQmVnaW4pIHM7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWIuaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgICAgIGRlcHRoKys7Ci0KLSAgICAgICAgICAgICAgICBwcy5wcmludCggIjwiICk7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnQoIHMuZ2V0TmFtZSgpLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICBwcy5wcmludCggIj4iICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYi5pc0xlYWYoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiLmdldENjaFZhbHVlKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIlwiIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFRleHQoIHBzLCBzLmdldENwU2xvdygpLCBiLmdldENjaFZhbHVlKCksIHMsIDEgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiXCIiICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkdW1wR29vYmVyc0lubGluZSggcHMsIHMsIHMuZ2V0UG9zTGVhZkVuZCgpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICI8LyIgKTsKLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoIHMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiLz4iICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgQVRUUiA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICIjeG1sbnM6IiApOwotICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggcy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKTsKLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICI9XCIiICk7Ci0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCBzLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSApOwotICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIlwiIiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIkAiICk7Ci0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCBzLmdldE5hbWUoKSApOwotICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIj1cIiIgKTsKLSAgICAgICAgICAgICAgICAgICAgZHVtcFRleHQoIHBzLCBzLmdldENwU2xvdygpLCBzLmdldENjaFZhbHVlKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICJcIiIgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBFTkQgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVuZCBlcyA9IChFbmQpIHM7Ci0gICAgICAgICAgICAgICAgQmVnaW4gYiA9IGVzLl9iZWdpbjsKLQotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiPC8iICk7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnQoIGIuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpICk7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnQoICIvPiIgKTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIENPTU1FTlQgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzLmlzRnJhZ21lbnQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiRlJBRyIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICI8IS0tIiApOwotICAgICAgICAgICAgICAgICAgICBkdW1wVGV4dCggcHMsIHMuZ2V0Q3BTbG93KCksIHMuZ2V0Q2NoVmFsdWUoKSApOwotICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIi0tPiIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgUFJPQ0lOU1QgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiPD8iICk7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnQoIHMuZ2V0TG9jYWwoKSApOwotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiICIgKTsKLSAgICAgICAgICAgICAgICBkdW1wVGV4dCggcHMsIHMuZ2V0Q3BTbG93KCksIHMuZ2V0Q2NoVmFsdWUoKSApOwotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiPz4iICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgUk9PVCA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnQoICJST09UIiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiVW5rbm93biBzcGxheSBraW5kIiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocy5nZXRDY2hBZnRlcigpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcy5wcmludCggIlwiIiApOwotCi0gICAgICAgICAgICAgICAgZHVtcFRleHQoCi0gICAgICAgICAgICAgICAgICAgIHBzLCBzLmdldENwU2xvdygpICsgcy5nZXRDY2hWYWx1ZSgpLCBzLmdldENjaEFmdGVyKCksCi0gICAgICAgICAgICAgICAgICAgIHMsIHMuZ2V0UG9zQWZ0ZXIoKSApOwotCi0gICAgICAgICAgICAgICAgcHMucHJpbnQoICJcIiIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZHVtcEdvb2JlcnNJbmxpbmUoIHBzLCBzLCBzLmdldEVuZFBvcygpICk7Ci0KLSAgICAgICAgICAgIGlmIChzLmlzSW52YWxpZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHMucGVla1R5cGUoKS5idWlsZF90ZXh0KCBuc20gKTsKLQotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiIFtpbnZhbGlkOiIgKTsKLSAgICAgICAgICAgICAgICBwcy5wcmludCggIlwiIiApOwotICAgICAgICAgICAgICAgIGR1bXBTdHJpbmcoIHBzLCB2YWx1ZSApOwotICAgICAgICAgICAgICAgIHBzLnByaW50KCAiXCIiICk7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnQoICJdIiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkdW1wR29vYmVycyggcHMsIHMuX2dvb2JlcnMgKTsKLQotICAgICAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICgga2luZCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgQkVHSU4gOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQmVnaW4gYiA9IChCZWdpbikgczsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYi5nZXRGaW5pc2goKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIiBbZW5kOiAiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggYi5nZXRGaW5pc2goKS5nZXREZWJ1Z0lkKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiXSIgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChiLmdldENvbnRhaW5lcigpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBzLnByaW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgW2NvbnRhaW5lcjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuZ2V0Q29udGFpbmVyKCkuZ2V0RGVidWdJZCgpICsgIl0iICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEVORCA6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFbmQgZXMgPSAoRW5kKSBzOwotICAgICAgICAgICAgICAgICAgICBCZWdpbiBiID0gZXMuX2JlZ2luOwotCi0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiIFtiZWdpbjogIiArIGIuZ2V0RGVidWdJZCgpICsgIl0iICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHMucHJpbnRsbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHMucHJpbnRsbigpOwotCi0gICAgICAgIGlmIChnZXRDY2hMZWZ0KCkgPiBfdGV4dC5sZW5ndGgoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcHMucHJpbnRsbigKLSAgICAgICAgICAgICAgICAiVGV4dCBidWZmZXIgaGFzIHRvbyBmZXcgY2hhcmFjdGVycyAoIiArCi0gICAgICAgICAgICAgICAgICAgIChnZXRDY2hMZWZ0KCkgLSBfdGV4dC5sZW5ndGgoKSkgKyAiKSIgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChnZXRDY2hMZWZ0KCkgPCBfdGV4dC5sZW5ndGgoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcHMucHJpbnRsbigKLSAgICAgICAgICAgICAgICAiVGV4dCBidWZmZXIgaGFzIHRvbyBtYW55IGNoYXJhY3RlcnMgKCIgKwotICAgICAgICAgICAgICAgICAgICAoX3RleHQubGVuZ3RoKCkgLSBnZXRDY2hMZWZ0KCkpICsgIik6ICIgKTsKLQotICAgICAgICAgICAgZHVtcFN0cmluZygKLSAgICAgICAgICAgICAgICBwcywKLSAgICAgICAgICAgICAgICBfdGV4dC5mZXRjaCggZ2V0Q2NoTGVmdCgpLCBfdGV4dC5sZW5ndGgoKSAtIGdldENjaExlZnQoKSApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgewotICAgICAgICAgICAgcHMucHJpbnRsbiggIlNwbGF5IHRyZWU6IiApOwotCi0gICAgICAgICAgICBwcy5wcmludGxuKCAiICBpc0xlZnRPbmx5OiAiICsgX2xlZnRPbmx5ICk7Ci0gICAgICAgICAgICBwcy5wcmludGxuKCAiICB2ZXJzaW9uOiAiICsgZ2V0VmVyc2lvbigpICk7Ci0gICAgICAgICAgICBwcy5wcmludGxuKCAiICBmaXJzdDogIiArIF9kb2MuZ2V0RGVidWdJZCgpICk7Ci0KLSAgICAgICAgICAgIHBzLnByaW50bG4oKTsKLSAgICAgICAgICAgIGR1bXBTcGxheVRyZWUoIHRoaXMsIHBzICk7Ci0gICAgICAgICAgICBwcy5wcmludGxuKCk7Ci0gICAgICAgICAgICBwcy5wcmludGxuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcy5wcmludGxuKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0IGEgc3BsYXkgKG9yIHNwbGF5cykgaW50byB0aGUgdHJlZS4gIFRoaXMgaXMgYSBsb3cgbGV2ZWwKLSAgICAgKiBvcGVyYXRpb24sIGFuZCBvcGVyYXRlcyBvbmx5IG9uIHRoZSBzcGxheSBhc3BlY3Qgb2YgdGhlIHRyZWUuCi0gICAgICogQW55IGludmFsaWRhdGlvbiBtYWludGVuYW5jZSBtdXN0IGJlIGhhbmRsZWQgYnkgY2FsbGVycy4KLSAgICAgKi8KLQotICAgIHZvaWQgaW5zZXJ0U3BsYXkgKCBTcGxheSBzLCBTcGxheSBhICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBzICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCAhcy5pc1Jvb3QoKTsKLSAgICAgICAgYXNzZXJ0IGEgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHZhbGlkYXRlU3BsYXlUcmVlKCk7Ci0gICAgICAgIGFzc2VydCAhYS5pc1Jvb3QoKTsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGEuZ2V0Um9vdFNsb3coKSA9PSB0aGlzOwotICAgICAgICBhc3NlcnQgcy5fcGFyZW50U3BsYXkgPT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IHMuX3JpZ2h0U3BsYXkgPT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IHMuX2xlZnRTcGxheSAhPSBudWxsIHx8IHMuZ2V0Q2NoTGVmdCgpID09IDA7Ci0gICAgICAgIGFzc2VydCBzLl9sZWZ0U3BsYXkgIT0gbnVsbCB8fCBzLmdldENkb2NCZWdpbkxlZnQoKSA9PSAwOwotCi0gICAgICAgIGludCBjY2ggPSBzLmdldENjaCgpOwotICAgICAgICBpbnQgY2JlZ2luID0gcy5nZXRDZG9jQmVnaW4oKTsKLQotICAgICAgICBpZiAocy5fbGVmdFNwbGF5ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNjaCArPSBzLmdldENjaExlZnQoKTsKLSAgICAgICAgICAgIGNiZWdpbiArPSBzLmdldENkb2NCZWdpbkxlZnQoKTsKLSAgICAgICAgICAgIF9sZWZ0T25seSA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF9sZWZ0T25seSAmJiBhID09IF9sZWZ0U3BsYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHMuX2xlZnRTcGxheSA9IF9sZWZ0U3BsYXk7Ci0gICAgICAgICAgICBzLl9wYXJlbnRTcGxheSA9IHRoaXM7Ci0KLSAgICAgICAgICAgIGFzc2VydCBzLmdldENjaExlZnQoKSA9PSAwOwotICAgICAgICAgICAgcy5hZGp1c3RDY2hMZWZ0KAotICAgICAgICAgICAgICAgIF9sZWZ0U3BsYXkuZ2V0Q2NoTGVmdCgpICsgX2xlZnRTcGxheS5nZXRDY2goKSApOwotCi0gICAgICAgICAgICBhc3NlcnQgcy5nZXRDZG9jQmVnaW5MZWZ0KCkgPT0gMDsKLSAgICAgICAgICAgIHMuYWRqdXN0Q2RvY0JlZ2luTGVmdCgKLSAgICAgICAgICAgICAgICBfbGVmdFNwbGF5LmdldENkb2NCZWdpbkxlZnQoKSArIF9sZWZ0U3BsYXkuZ2V0Q2RvY0JlZ2luKCkgKTsKLQotICAgICAgICAgICAgX2xlZnRTcGxheS5fcGFyZW50U3BsYXkgPSBzOwotICAgICAgICAgICAgX2xlZnRTcGxheSA9IHM7Ci0KLSAgICAgICAgICAgIGFkanVzdENjaExlZnQoIGNjaCApOwotICAgICAgICAgICAgYWRqdXN0Q2RvY0JlZ2luTGVmdCggY2JlZ2luICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoX2xlZnRPbmx5ICYmIGNjaCA9PSAwICYmIGNiZWdpbiA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSWYgdGhlIHNwbGF5IHRvIGluc2VydCBoYXMgbm8gY2NoIG9yIGNiZWdpbiwgdGhlbiB3aGVuCi0gICAgICAgICAgICAvLyB0aGUgdHJlZSBpcyBsZWZ0IG9ubHkgY2hpbGRyZW4sIEkgbmVlZCBub3Qgc3BsYXkuCi0gICAgICAgICAgICAvLwotCi0gICAgICAgICAgICBzLl9wYXJlbnRTcGxheSA9IGEuX3BhcmVudFNwbGF5OwotICAgICAgICAgICAgcy5fbGVmdFNwbGF5ID0gYTsKLSAgICAgICAgICAgIGEuX3BhcmVudFNwbGF5ID0gczsKLSAgICAgICAgICAgIHMuX3BhcmVudFNwbGF5Ll9sZWZ0U3BsYXkgPSBzOwotCi0gICAgICAgICAgICBzLmFkanVzdENjaExlZnQoIGEuZ2V0Q2NoTGVmdCgpICsgYS5nZXRDY2goKSApOwotCi0gICAgICAgICAgICBzLmFkanVzdENkb2NCZWdpbkxlZnQoCi0gICAgICAgICAgICAgICAgYS5nZXRDZG9jQmVnaW5MZWZ0KCkgKyBhLmdldENkb2NCZWdpbigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBTcGxheSBwOwotCi0gICAgICAgICAgICBpZiAoYS5fcmlnaHRTcGxheSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIChwID0gYSkuX3JpZ2h0U3BsYXkgPSBzOwotICAgICAgICAgICAgICAgIF9sZWZ0T25seSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoIHAgPSBhLl9yaWdodFNwbGF5IDsgcC5fbGVmdFNwbGF5ICE9IG51bGwgOyApCi0gICAgICAgICAgICAgICAgICAgIHAgPSBwLl9sZWZ0U3BsYXk7Ci0KLSAgICAgICAgICAgICAgICBwLl9sZWZ0U3BsYXkgPSBzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzLl9wYXJlbnRTcGxheSA9IHA7Ci0KLSAgICAgICAgICAgIGZvciAoIHAgPSBzIDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3BsYXkgdCA9IHAuX3BhcmVudFNwbGF5OwotCi0gICAgICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBpZiAodC5fbGVmdFNwbGF5ID09IHApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0LmFkanVzdENjaExlZnQoIGNjaCApOwotICAgICAgICAgICAgICAgICAgICB0LmFkanVzdENkb2NCZWdpbkxlZnQoIGNiZWdpbiApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHAgPSB0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzLnNwbGF5KCB0aGlzLCB0aGlzICk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgdmFsaWRhdGVTcGxheVRyZWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWFsIGluc2VydCB0byBpbnNlcnQgYSBzaW5nbGUgc3BsYXkgaW50byBhIGxlZnRvbmx5IHRyZWUgd2l0aG91dAotICAgICAqIGNhdXNpbmcgdGhlIHRyZWUgdG8gZ28gbm9uIGxlZnQgb25seS4gIEJlY2F1c2UgdGhpcyBkb2VzIG5vdCBzcGxheSwKLSAgICAgKiBkb2luZyB0aGlzIHRvbyBtYW55IHRpbWVzIGNhbiBiZSB2ZXJ5IGluZWZmaWNpZW50LgotICAgICAqLwotICAgIAotICAgIHZvaWQgaW5zZXJ0U2luZ2xlU3BsYXlTYW5zU3BsYXlJbkxlZnRPbmx5VHJlZSAoIFNwbGF5IHMsIFNwbGF5IGEgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IF9sZWZ0T25seTsKLSAgICAgICAgYXNzZXJ0IHMuX3JpZ2h0U3BsYXkgPT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IHMuX2xlZnRTcGxheSA9PSBudWxsOwotCi0gICAgICAgIHMuX2xlZnRTcGxheSA9IGE7Ci0gICAgICAgIHMuX3BhcmVudFNwbGF5ID0gYS5fcGFyZW50U3BsYXk7Ci0gICAgICAgIGEuX3BhcmVudFNwbGF5Ll9sZWZ0U3BsYXkgPSBzOwotICAgICAgICBhLl9wYXJlbnRTcGxheSA9IHM7Ci0KLSAgICAgICAgcy5hZGp1c3RDY2hMZWZ0KCBhLmdldENjaExlZnQoKSArIGEuZ2V0Q2NoKCkgKTsKLSAgICAgICAgcy5hZGp1c3RDZG9jQmVnaW5MZWZ0KCBhLmdldENkb2NCZWdpbkxlZnQoKSArIGEuZ2V0Q2RvY0JlZ2luKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGludCBjY2ggPSBzLmdldENjaCgpOwotICAgICAgICBpbnQgY2JlZ2luID0gcy5nZXRDZG9jQmVnaW4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIFNwbGF5IHAgPSBzLl9wYXJlbnRTcGxheSA7IHAgIT0gbnVsbCA7IHAgPSBwLl9wYXJlbnRTcGxheSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHAuYWRqdXN0Q2NoTGVmdCggY2NoICk7Ci0gICAgICAgICAgICBwLmFkanVzdENkb2NCZWdpbkxlZnQoIGNiZWdpbiApOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAgICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIFsgZmlyc3QsIGxhc3QgKSBzcGxheXMgZnJvbSB0b3RhbCBzZXF1ZW5jZToKLSAgICAgKgotICAgICAqICAgICBBIC0gZmlyc3QgLSBCIC0geCAtIGxhc3QgLSBDCi0gICAgICoKLSAgICAgKiB3aGVyZSBmaXJzdCwgbGFzdCBhbmQgeCBhcmUgaW5kaXZpZHVhbCBzcGxheXMgYW5kIEEsIEIgYW5kIEMgYXJlCi0gICAgICogbXVsdGlwbGUsIGludGVydmVuaW5nIHNwbGF5cy4gIFJldHVybiB0aGUgcmVzdWx0IHdpdGggeCBhdCB0aGUgdG9wCi0gICAgICogYW5kIGZpcnN0IGhpcyBsZWZ0IGNoaWxkLiAgVGhpcyBhbGxvd3MgeCB0byBoYXZlIHRoZSBzcGxheQotICAgICAqIGNoYXJhY3RlcmlzdGljcyBmb3IgdGhlIHdob2xlIHJlbW92ZWQgdHJlZS4KLSAgICAgKi8KLQotICAgIFNwbGF5IHJlbW92ZVNwbGF5cyAoIFNwbGF5IGZpcnN0LCBTcGxheSBsYXN0ICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCB2YWxpZGF0ZVNwbGF5VHJlZSgpOwotICAgICAgICBhc3NlcnQgZmlyc3QgIT0gbGFzdDs7Ci0gICAgICAgIGFzc2VydCAhZmlyc3QuaXNSb290KCk7Ci0gICAgICAgIGFzc2VydCAhZmlyc3QuaXNEb2MoKTsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGZpcnN0LmdldFJvb3RTbG93KCkgPT0gdGhpczsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGxhc3QuZ2V0Um9vdFNsb3coKSA9PSB0aGlzOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZmlyc3QuY29tcGFyZVNsb3coIGxhc3QgKSA9PSAtMTsKLSAgICAgICAgYXNzZXJ0ICFsYXN0LmlzUm9vdCgpIHx8IGxhc3QgPT0gdGhpczsKLQotICAgICAgICBTcGxheSB4ID0gbGFzdC5wcmV2U3BsYXkoKTsKLQotICAgICAgICBpZiAoeCA9PSBmaXJzdCkKLSAgICAgICAgICAgIHJldHVybiB4LnJlbW92ZVNwbGF5KCB0aGlzICk7Ci0KLSAgICAgICAgLy8gTWFrZSB0aGUgZG9nIGxlZyEKLQotICAgICAgICBpZiAobGFzdCAhPSB0aGlzKQotICAgICAgICAgICAgbGFzdC5zcGxheSggdGhpcywgdGhpcyApOwotCi0gICAgICAgIHguc3BsYXkoIHRoaXMsIGxhc3QgKTsKLSAgICAgICAgZmlyc3Quc3BsYXkoIHRoaXMsIHggKTsKLQotICAgICAgICBhc3NlcnQgdGhpcyA9PSBsYXN0IHx8IHRoaXMuX2xlZnRTcGxheSA9PSBsYXN0OwotICAgICAgICBhc3NlcnQgbGFzdC5fbGVmdFNwbGF5ID09IHg7Ci0gICAgICAgIGFzc2VydCB4Ll9sZWZ0U3BsYXkgPT0gZmlyc3Q7Ci0gICAgICAgIGFzc2VydCB4Ll9yaWdodFNwbGF5ID09IG51bGw7Ci0gICAgICAgIGFzc2VydCBmaXJzdC5fbGVmdFNwbGF5ICE9IG51bGw7Ci0KLSAgICAgICAgaW50IGZpcnN0Q2NoTGVmdCA9IGZpcnN0LmdldENjaExlZnQoKTsKLSAgICAgICAgaW50IGZpcnN0Q2JlZ2luTGVmdCA9IGZpcnN0LmdldENkb2NCZWdpbkxlZnQoKTsKLQotICAgICAgICBpbnQgZGVsdGFDY2hMZWZ0ID0gZmlyc3RDY2hMZWZ0IC0gbGFzdC5nZXRDY2hMZWZ0KCk7Ci0gICAgICAgIGludCBkZWx0YUNiZWdpbkxlZnQgPSBmaXJzdENiZWdpbkxlZnQgLSBsYXN0LmdldENkb2NCZWdpbkxlZnQoKTsKLQotICAgICAgICBsYXN0LmFkanVzdENjaExlZnQoIGRlbHRhQ2NoTGVmdCApOwotICAgICAgICBsYXN0LmFkanVzdENkb2NCZWdpbkxlZnQoIGRlbHRhQ2JlZ2luTGVmdCApOwotCi0gICAgICAgIGlmIChsYXN0ICE9IHRoaXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkanVzdENjaExlZnQoIGRlbHRhQ2NoTGVmdCApOwotICAgICAgICAgICAgYWRqdXN0Q2RvY0JlZ2luTGVmdCggZGVsdGFDYmVnaW5MZWZ0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICB4LmFkanVzdENjaExlZnQoIC0gZmlyc3RDY2hMZWZ0ICk7Ci0gICAgICAgIHguYWRqdXN0Q2RvY0JlZ2luTGVmdCggLSBmaXJzdENiZWdpbkxlZnQgKTsKLQotICAgICAgICBmaXJzdC5hZGp1c3RDY2hMZWZ0KCAtIGZpcnN0Q2NoTGVmdCApOwotICAgICAgICBmaXJzdC5hZGp1c3RDZG9jQmVnaW5MZWZ0KCAtIGZpcnN0Q2JlZ2luTGVmdCApOwotCi0gICAgICAgIGFzc2VydCBmaXJzdC5nZXRDY2hMZWZ0KCkgPT0gMDsKLSAgICAgICAgYXNzZXJ0IGZpcnN0LmdldENkb2NCZWdpbkxlZnQoKSA9PSAwOwotCi0gICAgICAgIGFzc2VydCB4LmdldENjaExlZnQoKSArIGRlbHRhQ2NoTGVmdCArIHguZ2V0Q2NoKCkgPT0gMDsKLSAgICAgICAgYXNzZXJ0IHguZ2V0Q2RvY0JlZ2luTGVmdCgpICsgZGVsdGFDYmVnaW5MZWZ0ICsgeC5nZXRDZG9jQmVnaW4oKSA9PSAwOwotCi0gICAgICAgIGZpcnN0Ll9sZWZ0U3BsYXkuX3BhcmVudFNwbGF5ID0gbGFzdDsKLSAgICAgICAgbGFzdC5fbGVmdFNwbGF5ID0gZmlyc3QuX2xlZnRTcGxheTsKLSAgICAgICAgeC5fcGFyZW50U3BsYXkgPSBudWxsOwotCi0gICAgICAgIGZpcnN0Ll9sZWZ0U3BsYXkgPSBudWxsOwotICAgICAgICBmaXJzdC5fcGFyZW50U3BsYXkgPSBudWxsOwotCi0gICAgICAgIGFzc2VydCB2YWxpZGF0ZVNwbGF5VHJlZSgpOwotCi0gICAgICAgIHJldHVybiB4OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzYWJsZVN0b3JlVmFsaWRhdGlvbiAoICkKLSAgICAgICAgeyBkdisrOyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBlbmFibGVTdG9yZVZhbGlkYXRpb24gICggKQotICAgICAgICB7IGR2LS07IHJldHVybiB0cnVlOyB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBkdjsKLQotICAgIHsKLSAgICAgICAgaWYgKCEidHJ1ZSIuZXF1YWxzKCBTeXN0ZW0uZ2V0UHJvcGVydHkoICJ0cmVlYXNzZXJ0cyIgKSkpCi0gICAgICAgICAgICBkaXNhYmxlU3RvcmVWYWxpZGF0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUgKCApCi0gICAgewotICAgICAgICBpZiAoZHYgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZG9WYWxpZGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggUnVudGltZUV4Y2VwdGlvbiBydGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJEb2N1bWVudCBpbnZhbGlkOiAiICsgcnRlLmdldE1lc3NhZ2UoKSApOwotICAgICAgICAgICAgcnRlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZHVtcCggdHJ1ZSApOwotICAgICAgICAgICAgdGhyb3cgcnRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBSZWN1cnNpdmUgZGVzY2VudCB2YWxpZGF0aW9uIG9mIHRoZSBjb250ZW50IG9mIHRoZSBkb2N1bWVudAotICAgIC8vCi0gICAgLy8gR3JhbW1lciBmb3IgdmFsaWQgY29udGVudCBvZiBhIGRvY3VtZW50Ci0gICAgLy8KLSAgICAvLyA8ZG9jPiAgICAgICAgOjo9IERPQyA8YXR0cmlidXRlcz4gPGNvbnRlbnQ+IFJPT1QKLSAgICAvLyA8YXR0cmlidXRlcz4gOjo9ICggQVRUUiApKgotICAgIC8vIDxjb250ZW50PiAgICA6Oj0gKCAoIENPTU1FTlQgfCBQUk9DSU5TVCB8IDxlbGVtZW50PikgKSoKLSAgICAvLyA8ZWxlbWVudD4gICAgOjo9ICggTEVBRiAgPGF0dHJpYnV0ZXM+ICkgfAotICAgIC8vICAgICAgICAgICAgICAgICAgICAoIEJFR0lOIDxhdHRyaWJ1dGVzPiA8Y29udGVudD4gRU5EICkKLSAgICAvLwotCi0gICAgcHJpdmF0ZSBTcGxheSB2YWxpZGF0ZUF0dHJpYnV0ZXMgKCBTcGxheSBzICkKLSAgICB7Ci0gICAgICAgIHdoaWxlICggcy5nZXRLaW5kKCkgPT0gQVRUUiApCi0gICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKLQotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNwbGF5IHZhbGlkYXRlQ29udGVudCAoIFNwbGF5IHMgKQotICAgIHsKLSAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGsgPSBzLmdldEtpbmQoKTsKLQotICAgICAgICAgICAgaWYgKGsgPT0gQ09NTUVOVCB8fCBrID09IFBST0NJTlNUKQotICAgICAgICAgICAgICAgIHMgPSBzLm5leHRTcGxheSgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNwbGF5IHEgPSBzOwotICAgICAgICAgICAgICAgIHMgPSB2YWxpZGF0ZUVsZW1lbnQoIHMgKTsKLQotICAgICAgICAgICAgICAgIGlmIChxID09IHMpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTcGxheSB2YWxpZGF0ZUVsZW1lbnQgKCBTcGxheSBzICkKLSAgICB7Ci0gICAgICAgIGlmIChzLmdldEtpbmQoKSA9PSBCRUdJTikKLSAgICAgICAgewotICAgICAgICAgICAgU3BsYXkgYiA9IHM7Ci0KLSAgICAgICAgICAgIHMgPSB2YWxpZGF0ZUF0dHJpYnV0ZXMoIHMubmV4dFNwbGF5KCkgKTsKLQotICAgICAgICAgICAgaWYgKCFiLmlzTGVhZigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHMgPSB2YWxpZGF0ZUNvbnRlbnQoIHMgKTsKLQotICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzRW5kKCk6ICJNaXNzaW5nIEVORCwgc3BsYXk6ICIgKyBzLmdldERlYnVnSWQoKTsKLQotICAgICAgICAgICAgICAgIHMgPSBzLm5leHRTcGxheSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlRG9jICggKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IF9kb2MubmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgcyA9IHZhbGlkYXRlQXR0cmlidXRlcyggcyApOwotCi0gICAgICAgIHMgPSB2YWxpZGF0ZUNvbnRlbnQoIHMgKTsKLQotICAgICAgICBhc3NlcnQgcy5pc1Jvb3QoKTogIkV4cGVjdGVkIHJvb3QiOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFZhbGlkYXRlQ29udGV4dAotICAgIHsKLSAgICAgICAgaW50IF9udW1TcGxheVR5cGVzOwotICAgICAgICBpbnQgX2NJbnZhbGlkYXRhYmxlVHlwZXM7Ci0gICAgICAgIGludCBfY0VsZW1PcmRlclNlbnNpdGl2ZVR5cGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUdvb2JlciAoIEdvb2JlciBnLCBTcGxheSBzLCBWYWxpZGF0ZUNvbnRleHQgY29udGV4dCApCi0gICAgewotICAgICAgICBpZiAoZyBpbnN0YW5jZW9mIFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBnLmdldEtpbmQoKSA9PSBUWVBFOwotICAgICAgICAgICAgYXNzZXJ0IHMuaXNUeXBlYWJsZSgpOwotCi0gICAgICAgICAgICBjb250ZXh0Ll9udW1TcGxheVR5cGVzKys7Ci0KLSAgICAgICAgICAgIFR5cGUgdHlwZSA9IChUeXBlKSBnOwotCi0gICAgICAgICAgICBpZiAodHlwZS51c2VzX2ludmFsaWRhdGVfdmFsdWUoKSkKLSAgICAgICAgICAgICAgICBjb250ZXh0Ll9jSW52YWxpZGF0YWJsZVR5cGVzKys7Ci0KLSAgICAgICAgICAgIGlmICh0eXBlLmlzX2NoaWxkX2VsZW1lbnRfb3JkZXJfc2Vuc2l0aXZlKCkpCi0gICAgICAgICAgICAgICAgY29udGV4dC5fY0VsZW1PcmRlclNlbnNpdGl2ZVR5cGVzKys7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgZy5nZXRLaW5kKCkgIT0gVFlQRTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCBnLmdldFNwbGF5KCkgPT0gczsKLSAgICAgICAgYXNzZXJ0IGcuZ2V0Um9vdCgpID09IHRoaXM7Ci0gICAgICAgIGFzc2VydCBnLmdldFBvcygpID49IDA7Ci0gICAgICAgIGFzc2VydCBnLmdldFBvcygpIDw9IHMuZ2V0TWF4UG9zKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGRvVmFsaWRhdGUgKCApCi0gICAgewotICAgICAgICBhc3NlcnQgdmFsaWRhdGVEb2MoKTsKLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlU3BsYXlUcmVlKCk7Ci0gICAgICAgIGFzc2VydCBnZXRDY2hMZWZ0KCkgPT0gX3RleHQubGVuZ3RoKCk7Ci0KLSAgICAgICAgdmFsaWRhdGVDaGFuZ2VMaXN0ZW5lclN0YXRlKCk7Ci0KLS8vIFRPRE86IFZhbGlkYXRlIHRoYXQgaXMgdGhlIHJvb3QgdHlwZSBpcyBudWxsLCB0aGVyZSBhcmUgbm8gdHlwZXMgaW4KLS8vIHRyZWUgYXQgYWxsCi0KLS8vIFRPRE86IENoZWNrIHRoZSBpbnZhcmllbnQgdGhhdCBpZiB0aGVyZSBpcyBhIFR5cGUgYW55d2hlcmUKLS8vIGluIHRoZSBkb2N1bWVudCwgdGhhdCB0aGVyZSBpcyBhbiBleGlzdGluZyBjaGFpbiBvZiB0eXBlcwotLy8gYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3QgYW5kIGlzX29rX2VsZW1lbnRfdXNlciBvciBpc19va19hdHRyaWJ1dGVfdXNlciwKLS8vIGRlcGVuZGluZyBvbiB0aGUgY2FzZSwgcmV0dXJucyBvay4KLQotICAgICAgICBWYWxpZGF0ZUNvbnRleHQgY29udGV4dCA9IG5ldyBWYWxpZGF0ZUNvbnRleHQoKTsKLQotICAgICAgICBDb250YWluZXIgcmVjZW50Q29udGFpbmVyID0gbnVsbDsKLQotICAgICAgICBmb3IgKCBTcGxheSBzID0gX2RvYyA7IHMgIT0gbnVsbCA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHMuaXNSb290KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2NoQWZ0ZXIoKSA9PSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocy5pc0JlZ2luKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQmVnaW4gYiA9IChCZWdpbikgczsKLQotICAgICAgICAgICAgICAgIGFzc2VydCBiLmdldE5hbWUoKSAhPSBudWxsOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0Ci0gICAgICAgICAgICAgICAgICAgIGIuZ2V0RmluaXNoKCkgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgYi5nZXRGaW5pc2goKS5nZXRDb250YWluZXIoKSA9PSBiOwotCi0gICAgICAgICAgICAgICAgaWYgKGIuaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgYi5nZXRGaW5pc2goKSA9PSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgYi5nZXRGaW5pc2goKSAhPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgYi5nZXRGaW5pc2goKS5nZXRDb250YWluZXIoKSA9PSBiOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgYi5nZXRDY2hWYWx1ZSgpID09IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocy5pc0F0dHIoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXROYW1lKCkgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2hBZnRlcigpID09IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzLmlzUHJvY2luc3QoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPT0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHMuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRDb250YWluZXIoKSA9PSByZWNlbnRDb250YWluZXI7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXMuaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgICAgIHJlY2VudENvbnRhaW5lciA9IChDb250YWluZXIpIHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzLmlzRmluaXNoKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q29udGFpbmVyKCkgPT0gcmVjZW50Q29udGFpbmVyOwotICAgICAgICAgICAgICAgIHJlY2VudENvbnRhaW5lciA9IHJlY2VudENvbnRhaW5lci5nZXRDb250YWluZXIoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29udGV4dC5fbnVtU3BsYXlUeXBlcyA9IDA7Ci0KLSAgICAgICAgICAgIGZvciAoIEdvb2JlciBnID0gcy5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsKLSAgICAgICAgICAgICAgICAgIGcgPSBzLm5leHRHb29iZXIoIGcgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVHb29iZXIoIGcsIHMsIGNvbnRleHQgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlzSW52YWxpZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzVHlwZWFibGUoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5wZWVrVHlwZSgpICE9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgY29udGV4dC5fbnVtU3BsYXlUeXBlcyA9PSAxOwotCi0gICAgICAgICAgICAgICAgaWYgKHMuaXNEb2MoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENjaEFmdGVyKCkgPT0gMDsKLSAgICAgICAgICAgICAgICAgICAgU3BsYXkgbiA9IHMubmV4dE5vbkF0dHJTcGxheSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBuLmlzUm9vdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzLmlzQmVnaW4oKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzTGVhZigpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2hWYWx1ZSgpID09IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2hWYWx1ZSgpID09IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBjb250ZXh0Ll9udW1TcGxheVR5cGVzIDw9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgY29udGV4dC5fY0ludmFsaWRhdGFibGVUeXBlcyA9PSBfY0ludmFsaWRhdGFibGVUeXBlczsKLSAgICAgICAgYXNzZXJ0IGNvbnRleHQuX2NFbGVtT3JkZXJTZW5zaXRpdmVUeXBlcyA9PV9jRWxlbU9yZGVyU2Vuc2l0aXZlVHlwZXM7Ci0KLSAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgaW5kaWNlcwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGJvb2xlYW4gdmFsaWRhdGVTcGxheVRyZWUgKCApCi0gICAgewotICAgICAgICBpZiAoZHYgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZG9WYWxpZGF0ZVNwbGF5VHJlZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggUnVudGltZUV4Y2VwdGlvbiBydGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJTcGxheSB0cmVlIGludmFsaWQ6ICIgKyBydGUgKTsKLQotICAgICAgICAgICAgZHVtcCggdHJ1ZSApOwotCi0gICAgICAgICAgICB0aHJvdyBydGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZVN0YXRzIGV4dGVuZHMgSGFzaE1hcAotICAgIHsKLSAgICAgICAgaW50IGdldENjaCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U3RhdHMoIHMgKS5fY2NoOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhZGp1c3RDY2ggKCBTcGxheSBzLCBpbnQgY2NoRGVsdGEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdGF0cyBzdGF0cyA9IGdldFN0YXRzKCBzICk7Ci0gICAgICAgICAgICBzdGF0cy5fY2NoICs9IGNjaERlbHRhOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldENiZWdpbiAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U3RhdHMoIHMgKS5fY2JlZ2luOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhZGp1c3RDYmVnaW4gKCBTcGxheSBzLCBpbnQgY2JlZ2luRGVsdGEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdGF0cyBzdGF0cyA9IGdldFN0YXRzKCBzICk7Ci0gICAgICAgICAgICBzdGF0cy5fY2JlZ2luICs9IGNiZWdpbkRlbHRhOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdGF0cyBnZXRTdGF0cyAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdGF0cyBzdGF0cyA9IChTdGF0cykgZ2V0KCBzICk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0cyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHB1dCggcywgc3RhdHMgPSBuZXcgU3RhdHMoKSApOwotCi0gICAgICAgICAgICByZXR1cm4gc3RhdHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdGF0cwotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IF9jY2g7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IF9jYmVnaW47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sZWFuIGRvVmFsaWRhdGVTcGxheVRyZWUgKCApCi0gICAgewotICAgICAgICBhc3NlcnRBc3NlcnRFbmFibGVkKCk7Ci0KLSAgICAgICAgVmFsaWRhdGVTdGF0cyBzdGF0cyA9IG5ldyBWYWxpZGF0ZVN0YXRzKCk7Ci0KLSAgICAgICAgYXNzZXJ0IF9wYXJlbnRTcGxheSA9PSBudWxsOwotICAgICAgICBhc3NlcnQgX3JpZ2h0U3BsYXkgID09IG51bGw7Ci0gICAgICAgIGFzc2VydCBfZG9jLl9sZWZ0U3BsYXkgPT0gbnVsbDsKLQotICAgICAgICBTcGxheSBzID0gdGhpczsKLQotICAgICAgICBpZiAocy5fbGVmdFNwbGF5ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHMgPSBzLl9sZWZ0U3BsYXk7Ci0KLSAgICAgICAgICAgIHdoaWxlICggcyAhPSBudWxsICYmIHMuX2xlZnRTcGxheSAhPSBudWxsICkKLSAgICAgICAgICAgICAgICBzID0gcy5fbGVmdFNwbGF5OwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IHMgPT0gX2RvYzsKLQotICAgICAgICBsb29wOgotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocy5fbGVmdFNwbGF5ID09IG51bGwgJiYgcy5fcmlnaHRTcGxheSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRzLmFkanVzdENjaCggcywgcy5nZXRDY2goKSApOwotICAgICAgICAgICAgICAgIHN0YXRzLmFkanVzdENiZWdpbiggcywgcy5nZXRDZG9jQmVnaW4oKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocy5fcmlnaHRTcGxheSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoIHMgPSBzLl9yaWdodFNwbGF5IDsgcy5fbGVmdFNwbGF5ICE9IG51bGwgOyApCi0gICAgICAgICAgICAgICAgICAgIHMgPSBzLl9sZWZ0U3BsYXk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNwbGF5IHAgPSBzLl9wYXJlbnRTcGxheTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocC5fcmlnaHRTcGxheSA9PSBudWxsIHx8IHAuX3JpZ2h0U3BsYXkgPT0gcykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLmFkanVzdENjaCggcywgcy5nZXRDY2goKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMuYWRqdXN0Q2JlZ2luKCBzLCBzLmdldENkb2NCZWdpbigpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLl9sZWZ0U3BsYXkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5hZGp1c3RDY2goIHMsIHN0YXRzLmdldENjaCggcy5fbGVmdFNwbGF5ICkgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLmFkanVzdENiZWdpbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgc3RhdHMuZ2V0Q2JlZ2luKCBzLl9sZWZ0U3BsYXkgKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5fcmlnaHRTcGxheSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLmFkanVzdENjaCggcywgc3RhdHMuZ2V0Q2NoKCBzLl9yaWdodFNwbGF5ICkgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLmFkanVzdENiZWdpbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgc3RhdHMuZ2V0Q2JlZ2luKCBzLl9yaWdodFNwbGF5ICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBwLl9sZWZ0U3BsYXkgPT0gczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBwLl9yaWdodFNwbGF5ICE9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBwLl9yaWdodFNwbGF5OwotCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIHMuX2xlZnRTcGxheSAhPSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5fbGVmdFNwbGF5OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIHMgPSBfZG9jIDsgcyAhPSBudWxsIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgIV9sZWZ0T25seSB8fCBzLl9yaWdodFNwbGF5ID09IG51bGw6ICIiICsgcy5nZXREZWJ1Z0lkKCk7Ci0gICAgICAgICAgICBhc3NlcnQgcy5fbGVmdFNwbGF5ICA9PSBudWxsIHx8IHMuX2xlZnRTcGxheSAuX3BhcmVudFNwbGF5ID09IHM7Ci0gICAgICAgICAgICBhc3NlcnQgcy5fcmlnaHRTcGxheSA9PSBudWxsIHx8IHMuX3JpZ2h0U3BsYXkuX3BhcmVudFNwbGF5ID09IHM7Ci0KLSAgICAgICAgICAgIGlmIChzLl9sZWZ0U3BsYXkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2hMZWZ0KCkgPT0gMDsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRDZG9jQmVnaW5MZWZ0KCkgPT0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQKLSAgICAgICAgICAgICAgICAgICAgcy5nZXRDY2hMZWZ0KCkgPT0gc3RhdHMuZ2V0Q2NoKCBzLl9sZWZ0U3BsYXkgKToKLSAgICAgICAgICAgICAgICAgICAgICAgICIiICsgcy5nZXREZWJ1Z0lkKCk7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRDZG9jQmVnaW5MZWZ0KCkgPT0gc3RhdHMuZ2V0Q2JlZ2luKCBzLl9sZWZ0U3BsYXkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgaW50ZXJmYWNlIENoYW5nZUxpc3RlbmVyCi0gICAgewotICAgICAgICB2b2lkIGNoYW5nZU5vdGlmaWNhdGlvbiAoICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2hhbmdlQ2xpZW50Ci0gICAgewotICAgICAgICBDaGFuZ2VMaXN0ZW5lciBfbGlzdGVuZXI7Ci0gICAgICAgIENoYW5nZUNsaWVudCAgIF9uZXh0OwotICAgIH0KLQotICAgIGxvbmcgZ2V0VmVyc2lvbiAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfX3ZlcnNpb247Ci0gICAgfQotCi0gICAgdm9pZCBpbnZhbGlkYXRlVmVyc2lvbiAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBfY2hhbmdlQ2xpZW50cyA9PSBudWxsOwotCi0gICAgICAgIF9fdmVyc2lvbisrOwotCi0gICAgICAgIGFzc2VydCAoX2RlYnVnQ2hhbmdlVmVyc2lvbiA9IF9fdmVyc2lvbikgPT0gMCB8fCB0cnVlOwotICAgIH0KLQotICAgIC8vIFVzZSB0aGlzICpvbmx5KiBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCi0gICAgdm9pZCByZXN0b3JlVmVyc2lvbiAoIGxvbmcgb2xkVmVyc2lvbiApCi0gICAgewotICAgICAgICBhc3NlcnQgX192ZXJzaW9uID49IG9sZFZlcnNpb247Ci0gICAgICAgIF9fdmVyc2lvbiA9IG9sZFZlcnNpb247Ci0gICAgICAgIGFzc2VydCAoX2RlYnVnQ2hhbmdlVmVyc2lvbiA9IF9fdmVyc2lvbikgPT0gMCB8fCB0cnVlOwotICAgIH0KLQotICAgIGJvb2xlYW4gdmFsaWRhdGVDaGFuZ2VTdGFydGVkICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IF9jaGFuZ2VDbGllbnRzID09IG51bGw7Ci0gICAgICAgIHJldHVybiBfY2hhbmdlQ2xpZW50cyA9PSBudWxsOwotICAgIH0KLQotICAgIGJvb2xlYW4gdmFsaWRhdGVDaGFuZ2VMaXN0ZW5lclN0YXRlICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IF9kZWJ1Z0NoYW5nZVZlcnNpb24gPT0gX192ZXJzaW9uOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlZ2lzdGVyRm9yQ2hhbmdlICggQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlQ2hhbmdlTGlzdGVuZXJTdGF0ZSgpOwotCi0gICAgICAgIC8vIFNlZSBpZiB0aGlzIGxpc3RlbmVyIGlzIHRoZSBmaXJzdCBvbmUgb24gdGhlIGxpc3QuICBFYXN5IGJ1dCBub3QKLSAgICAgICAgLy8gdG90YWxseSBjb21wbGV0ZSAgb3B0aW1pemF0aW9uCi0KLSAgICAgICAgaWYgKF9jaGFuZ2VDbGllbnRzICE9IG51bGwgJiYgX2NoYW5nZUNsaWVudHMuX2xpc3RlbmVyID09IGxpc3RlbmVyKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIENoYW5nZUNsaWVudCBjbGllbnQgPSBuZXcgQ2hhbmdlQ2xpZW50KCk7Ci0KLSAgICAgICAgY2xpZW50Ll9uZXh0ID0gX2NoYW5nZUNsaWVudHM7Ci0gICAgICAgIGNsaWVudC5fbGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICAgICAgX2NoYW5nZUNsaWVudHMgPSBjbGllbnQ7Ci0gICAgfQotCi0gICAgdm9pZCBzdGFydENoYW5nZSAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCB2YWxpZGF0ZUNoYW5nZUxpc3RlbmVyU3RhdGUoKTsKLQotICAgICAgICBsb25nIGN1cnJlbnRWZXJzaW9uID0gMDsKLQotICAgICAgICBhc3NlcnQgKGN1cnJlbnRWZXJzaW9uID0gX192ZXJzaW9uKSA9PSAwIHx8IHRydWU7Ci0KLSAgICAgICAgd2hpbGUgKCBfY2hhbmdlQ2xpZW50cyAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgX2NoYW5nZUNsaWVudHMuX2xpc3RlbmVyLmNoYW5nZU5vdGlmaWNhdGlvbigpOwotICAgICAgICAgICAgX2NoYW5nZUNsaWVudHMgPSBfY2hhbmdlQ2xpZW50cy5fbmV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCBjdXJyZW50VmVyc2lvbiA9PSBfX3ZlcnNpb247Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBEb2N1bWVudCBwcm9wZXJ0aWVzCi0gICAgLy8KLQotICAgIHN0YXRpYyBjbGFzcyBEb2NQcm9wcwotICAgICAgICBleHRlbmRzIFhtbERvY3VtZW50UHJvcGVydGllcwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBIYXNoTWFwIF9tYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgcHV0ICggT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9tYXAucHV0KCBrZXksIHZhbHVlICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldCAoIE9iamVjdCBrZXkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX21hcC5nZXQoIGtleSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCByZW1vdmUgKCBPYmplY3Qga2V5ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9tYXAucmVtb3ZlKCBrZXkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsYXNzIG50aENhY2hlCi0gICAgewotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbmFtZXNTYW1lICggUU5hbWUgcGF0dGVybiwgUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwYXR0ZXJuID09IG51bGwgfHwgcGF0dGVybi5lcXVhbHMoIG5hbWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzZXRzU2FtZSAoIFFOYW1lU2V0IHBhdHRlcm5TZXQsIFFOYW1lU2V0IHNldCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gdmFsdWUgZXF1YWxpdHkgaXMgcHJvYmFibHkgdG9vIGV4cGVuc2l2ZS4gU2luY2UgdGhlIHVzZSBjYXNlCi0gICAgICAgICAgICAvLyBpbnZvbHZlcyBRTmFtZVNldHMgdGhhdCBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciwgd2UKLSAgICAgICAgICAgIC8vIGNhbiB1c2UgaWRlbnRpdHkgY29tcGFyaXNvbi4KLSAgICAgICAgICAgIHJldHVybiBwYXR0ZXJuU2V0ICE9IG51bGwgJiYgcGF0dGVyblNldCA9PSBzZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbmFtZUhpdChRTmFtZSBuYW1lUGF0dGVybiwgIFFOYW1lU2V0IHNldFBhdHRlcm4sIFFOYW1lIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzZXRQYXR0ZXJuID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVzU2FtZShuYW1lUGF0dGVybiwgbmFtZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNldFBhdHRlcm4uY29udGFpbnMobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2FjaGVTYW1lIChRTmFtZSBuYW1lUGF0dGVybiwgIFFOYW1lU2V0IHNldFBhdHRlcm4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzZXRQYXR0ZXJuID09IG51bGwgPyBuYW1lc1NhbWUobmFtZVBhdHRlcm4sIF9uYW1lKSA6Ci0gICAgICAgICAgICAgICAgc2V0c1NhbWUoc2V0UGF0dGVybiwgX3NldCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZGlzdGFuY2UgKCBTcGxheSBwYXJlbnQsIFFOYW1lIG5hbWUsIFFOYW1lU2V0IHNldCwgaW50IG4gKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgbiA+PSAwOwotCi0gICAgICAgICAgICBpZiAoX3ZlcnNpb24gIT0gUm9vdC50aGlzLmdldFZlcnNpb24oKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUUgLSAxOwotCi0gICAgICAgICAgICBpZiAocGFyZW50ICE9IF9wYXJlbnQgfHwgIWNhY2hlU2FtZShuYW1lLCBzZXQpKQotICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKLQotICAgICAgICAgICAgcmV0dXJuIG4gPiBfbiA/IG4gLSBfbiA6IF9uIC0gbjsKLSAgICAgICAgfQotCi0gICAgICAgIEJlZ2luIGZldGNoICggU3BsYXkgcGFyZW50LCBRTmFtZSBuYW1lLCBRTmFtZVNldCBzZXQsIGludCBuICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IG4gPj0gMDsKLQotICAgICAgICAgICAgaWYgKF92ZXJzaW9uICE9IFJvb3QudGhpcy5nZXRWZXJzaW9uKCkgfHwgX3BhcmVudCAhPSBwYXJlbnQgfHwKLSAgICAgICAgICAgICAgICAgICEgY2FjaGVTYW1lKG5hbWUsIHNldCkgfHwgbiA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF92ZXJzaW9uID0gUm9vdC50aGlzLmdldFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICBfcGFyZW50ID0gcGFyZW50OwotICAgICAgICAgICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICAgICAgICAgICAgICBfY2hpbGQgPSBudWxsOwotICAgICAgICAgICAgICAgIF9uID0gLTE7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXBhcmVudC5pc0xlYWYoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvb3A6Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBwYXJlbnQubmV4dFNwbGF5KCkgOyA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICggcy5nZXRLaW5kKCkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFTkQgIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUk9PVCA6IGJyZWFrIGxvb3A7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkVHSU4gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lSGl0KCBuYW1lLCBzZXQsIHMuZ2V0TmFtZSgpICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2hpbGQgPSBzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMuZ2V0RmluaXNoU3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKF9uIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgaWYgKG4gPiBfbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoIG4gPiBfbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IgKCBTcGxheSBzID0gX2NoaWxkLmdldEZpbmlzaFNwbGF5KCkubmV4dFNwbGF5KCkgOyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuaXNGaW5pc2goKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuaXNCZWdpbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lSGl0KCBuYW1lLCBzZXQsIHMuZ2V0TmFtZSgpICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2hpbGQgPSBzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5nZXRGaW5pc2hTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobiA8IF9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlICggbiA8IF9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNwbGF5IHMgPSBfY2hpbGQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMucHJldlNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmlzTGVhZigpIHx8IHMuaXNFbmQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5pc0VuZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5nZXRDb250YWluZXIoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lSGl0KCBuYW1lLCBzZXQsIHMuZ2V0TmFtZSgpICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2hpbGQgPSBzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbi0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAoQmVnaW4pIF9jaGlsZDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgbG9uZyAgICAgX3ZlcnNpb247Ci0gICAgICAgIHByaXZhdGUgU3BsYXkgICAgX3BhcmVudDsKLSAgICAgICAgcHJpdmF0ZSBRTmFtZSAgICBfbmFtZTsKLSAgICAgICAgcHJpdmF0ZSBRTmFtZVNldCBfc2V0OwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBTcGxheSBfY2hpbGQ7Ci0gICAgICAgIHByaXZhdGUgaW50ICAgX247Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBEYSBmaWVsZHMuICBEYSBCZWFycy4gIERpdGthIGlzIEdvZC4KLSAgICAvLwotCi0gICAgYm9vbGVhbiBfbGVmdE9ubHk7Ci0gICAgRG9jICAgICBfZG9jOwotICAgIFRleHQgICAgX3RleHQ7Ci0gICAgYm9vbGVhbiBfdmFsaWRhdGVPblNldDsKLQotICAgIC8vCi0gICAgLy8gRG9jdW1lbnQgdmVyc2lvbi4gIFRoZXNlIG51bWJlcnMgZ2V0IGluY3JlbWVudGVkIHdoZW4gdGhlIGRvY3VtZW50Ci0gICAgLy8gY2hhbmdlcyBpbiBhIHZhcmlldHkgb2Ygd2F5cy4KLSAgICAvLwotCi0gICAgcHJpdmF0ZSBsb25nIF9fdmVyc2lvbiA9IDE7Ci0gICAgcHJpdmF0ZSBsb25nIF9kZWJ1Z0NoYW5nZVZlcnNpb24gPSAxOyAvLyBEZWJ1ZyBvbmx5Ci0KLSAgICBwcml2YXRlIENoYW5nZUNsaWVudCBfY2hhbmdlQ2xpZW50czsKLQotICAgIERvY1Byb3BzIF9wcm9wczsKLQotICAgIC8vCi0gICAgLy8gWG1sSW5wdXRTdHJlYW0KLSAgICAvLwotCi0gICAgYm9vbGVhbiBfc3RhbmRBbG9uZTsKLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgZmluYWwgU2NoZW1hVHlwZUxvYWRlciBfc2NoZW1hVHlwZVN5c3RlbTsKLQotICAgIGludCBfY0ludmFsaWRhdGFibGVUeXBlczsKLSAgICBpbnQgX2NFbGVtT3JkZXJTZW5zaXRpdmVUeXBlczsKLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgbnRoQ2FjaGUgX250aENhY2hlX0EgPSBuZXcgbnRoQ2FjaGUoKTsKLSAgICBudGhDYWNoZSBfbnRoQ2FjaGVfQiA9IG5ldyBudGhDYWNoZSgpOwotICAgIFR5cGVTdG9yZUZhY3RvcnkgX2ZhY3Rvcnk7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1NhdmVyLmphdmEgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1NhdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MWJkMzYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9TYXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc3NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uQ2hhcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5FbmNvZGluZ01hcDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLkdlbmVyaWNYbWxJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRvckxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXZlbnRCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sTmFtZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5YbWxuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLk5hbWVzcGFjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uQXR0cmlidXRlOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uQXR0cmlidXRlSXRlcmF0b3I7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5DaGFuZ2VQcmVmaXhNYXBwaW5nOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uQ2hhcmFjdGVyRGF0YTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLkNvbW1lbnQ7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5FbmREb2N1bWVudDsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLkVuZEVsZW1lbnQ7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5FbmRQcmVmaXhNYXBwaW5nOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uTG9jYXRpb247Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5TdGFydERvY3VtZW50OwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uU3RhcnRFbGVtZW50OwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uU3RhcnRQcmVmaXhNYXBwaW5nOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MRXZlbnQ7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxOYW1lOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2F2ZXIgaW1wbGVtZW50cyBOYW1lc3BhY2VNYW5hZ2VyCi17Ci0gICAgLy8KLSAgICAvLwotICAgIC8vCi0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbW9uaXRvcigpCi0gICAgewotICAgICAgICByZXR1cm4gX3Jvb3Q7Ci0gICAgfQotCi0gICAgU2F2ZXIgKCBSb290IHIsIFNwbGF5IHMsIGludCBwLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHMuZ2V0Um9vdFNsb3coKSA9PSByOwotCi0gICAgICAgIC8vIElucHV0IHMgYW5kIHAgbXVzdCBiZSBub3JtYWxpemVkIGFscmVhZHkKLSAgICAgICAgYXNzZXJ0IHAgPCBzLmdldEVuZFBvcygpOwotCi0gICAgICAgIF9yb290ID0gcjsKLSAgICAgICAgX3RvcCA9IF9zcGxheSA9IHM7Ci0gICAgICAgIF9wb3MgPSBwOwotICAgICAgICBfdmVyc2lvbiA9IHIuZ2V0VmVyc2lvbigpOwotICAgICAgICBfc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIF9hdHRycyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIF9hdHRyTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBfZmlyc3RQdXNoID0gdHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIF9uZXdMaW5lID0gU3lzdGVtLmdldFByb3BlcnR5KCAibGluZS5zZXBhcmF0b3IiICk7Ci0KLSAgICAgICAgaWYgKF9uZXdMaW5lID09IG51bGwpCi0gICAgICAgICAgICBfbmV3TGluZSA9ICJcbiI7Ci0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgc3RhdGUgb2YgdGhlIG5hbWVzcGFjZXMKLSAgICAgICAgX25hbWVzcGFjZVN0YWNrID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBfdXJpTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgX3ByZWZpeE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgLy8gU3RvcHMgdGhlIHN5bnRoZXNpcyBvZiB0aGlzIG5hbXNwYWNlIGFuZCBtYWtlIGZvciBiZXR0ZXIKLSAgICAgICAgLy8gcm91bmR0cmlwcGluZyAKLSAgICAgICAgYWRkTWFwcGluZyggInhtbCIsIFNwbGF5Ll94bWwxOTk4VXJpICk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIGltcGxpY2l0IG5hbWVzcGFjZXMKLSAgICAgICAgCi0gICAgICAgIG9wdGlvbnMgPSBYbWxPcHRpb25zLm1hc2tOdWxsKCBvcHRpb25zICk7Ci0KLSAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfSU1QTElDSVRfTkFNRVNQQUNFUyApKQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXAgbSA9IChNYXApIG9wdGlvbnMuZ2V0KCBYbWxPcHRpb25zLlNBVkVfSU1QTElDSVRfTkFNRVNQQUNFUyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKCBJdGVyYXRvciBpID0gbS5rZXlTZXQoKS5pdGVyYXRvcigpIDsgaS5oYXNOZXh0KCkgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcoIHByZWZpeCwgKFN0cmluZykgbS5nZXQoIHByZWZpeCApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuU0FWRV9TVUdHRVNURURfUFJFRklYRVMgKSkKLSAgICAgICAgICAgIF9zdWdnZXN0ZWRQcmVmaXhlcyA9IChNYXApIG9wdGlvbnMuZ2V0KCBYbWxPcHRpb25zLlNBVkVfU1VHR0VTVEVEX1BSRUZJWEVTKTsKLSAgICAgICAgCi0gICAgICAgIC8vIElmIHRoZSBkZWZhdWx0IHByZWZpeCBoYXMgbm90IGJlZW4gbWFwcGVkLCBkbyBzbyBub3cKLSAgICAgICAgCi0gICAgICAgIGlmIChnZXROYW1lc3BhY2VGb3JQcmVmaXgoICIiICkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX2luaXRpYWxEZWZhdWx0VXJpID0gbmV3IFN0cmluZyggIiIgKTsKLSAgICAgICAgICAgIGFkZE1hcHBpbmcoICIiLCBfaW5pdGlhbERlZmF1bHRVcmkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9zYXZlTmFtZXNwYWNlc0ZpcnN0ID0gb3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuU0FWRV9OQU1FU1BBQ0VTX0ZJUlNUICk7Ci0KLSAgICAgICAgaWYgKF9wcmV0dHlQcmludCA9IG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfUFJFVFRZX1BSSU5UICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wcmV0dHlJbmRlbnQgPSAyOwotCi0gICAgICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuU0FWRV9QUkVUVFlfUFJJTlRfSU5ERU5UICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3ByZXR0eUluZGVudCA9Ci0gICAgICAgICAgICAgICAgICAgICgoSW50ZWdlcikgb3B0aW9ucy5nZXQoIFhtbE9wdGlvbnMuU0FWRV9QUkVUVFlfUFJJTlRfSU5ERU5UICkpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX1BSRVRUWV9QUklOVF9PRkZTRVQgKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcHJldHR5T2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgKChJbnRlZ2VyKSBvcHRpb25zLmdldCggWG1sT3B0aW9ucy5TQVZFX1BSRVRUWV9QUklOVF9PRkZTRVQgKSkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX0FHR1JFU1NJVkVfTkFNRVNQQUNFUyApICYmCi0gICAgICAgICAgICAgICAgISh0aGlzIGluc3RhbmNlb2YgU3ludGhOYW1lc3BhY2VTYXZlcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5bnRoTmFtZXNwYWNlU2F2ZXIgc2F2ZXIgPQotICAgICAgICAgICAgICAgIG5ldyBTeW50aE5hbWVzcGFjZVNhdmVyKCByLCBzLCBwLCBvcHRpb25zICk7Ci0KLSAgICAgICAgICAgIHdoaWxlICggc2F2ZXIucHJvY2VzcygpICkKLSAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgICAgIGlmICghc2F2ZXIuX3N5bnRoTmFtZXNwYWNlcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgX3ByZUNvbXB1dGVkTmFtZXNwYWNlcyA9IHNhdmVyLl9zeW50aE5hbWVzcGFjZXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIF91c2VEZWZhdWx0TmFtZXNwYWNlID0KLSAgICAgICAgICAgIG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfVVNFX0RFRkFVTFRfTkFNRVNQQUNFICk7Ci0KLSAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfRklMVEVSX1BST0NJTlNUICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9maWx0ZXJQcm9jaW5zdCA9Ci0gICAgICAgICAgICAgICAgKFN0cmluZykgb3B0aW9ucy5nZXQoIFhtbE9wdGlvbnMuU0FWRV9GSUxURVJfUFJPQ0lOU1QgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX1VTRV9PUEVOX0ZSQUdNRU5UICkpCi0gICAgICAgICAgICBfZnJhZ21lbnQgPSBTcGxheS5fb3BlbnVyaUZyYWdtZW50OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBfZnJhZ21lbnQgPSBTcGxheS5feG1sRnJhZ21lbnQ7Ci0KLSAgICAgICAgLy8gT3V0ZXIgb3ZlcnJpZGVzIGlubmVyCi0gICAgICAgIAotICAgICAgICBfaW5uZXIgPQotICAgICAgICAgICAgb3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuU0FWRV9JTk5FUiApICYmCi0gICAgICAgICAgICAgICAgIW9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfT1VURVIgKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChfaW5uZXIgJiYgIV90b3AuaXNEb2MoKSkKLSAgICAgICAgICAgIF9zeW50aEVsZW0gPSBfZnJhZ21lbnQ7Ci0gICAgICAgIAotICAgICAgICBlbHNlIGlmIChvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX1NZTlRIRVRJQ19ET0NVTUVOVF9FTEVNRU5UICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9mcmFnbWVudCA9IF9zeW50aEVsZW0gPQotICAgICAgICAgICAgICAgIChRTmFtZSkgb3B0aW9ucy5nZXQoIFhtbE9wdGlvbnMuU0FWRV9TWU5USEVUSUNfRE9DVU1FTlRfRUxFTUVOVCApOwotCi0gICAgICAgICAgICBpZiAoX3N5bnRoRWxlbSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJOdWxsIHN5bnRoZXRpYyBlbGVtZW50IiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBfcHJlUHJvY2VzcyA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2hlY2tWZXJzaW9uICggKQotICAgIHsKLSAgICAgICAgaWYgKF92ZXJzaW9uICE9IF9yb290LmdldFZlcnNpb24oKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCAiRG9jdW1lbnQgY2hhbmdlZCBkdXJpbmcgc2F2ZSIgKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgUm9vdCBnZXRSb290ICggKSB7IHJldHVybiBfcm9vdDsgfQotICAgIHByb3RlY3RlZCBmaW5hbCBNYXAgIGdldFVyaU1hcCAoICkgeyByZXR1cm4gX3VyaU1hcDsgfQotICAgIHByb3RlY3RlZCBmaW5hbCBNYXAgIGdldFByZWZpeE1hcCAoICkgeyByZXR1cm4gX3ByZWZpeE1hcDsgfQotCi0gICAgLy8gZW1pdENvbnRhaW5lciB3aWxsIHByb2Nlc3MgbGVhZiBjb250ZW50cyBhbmQgdGhlIHRleHQgYWZ0ZXIgYQotICAgIC8vIHN0YXJ0LiAgQWxsIG90aGVyIHRleHQgaXMgcHJvY2Vzc2VkIHdpdGggZW1pdFRleHRBZnRlci4KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVtaXRYbWxuc0ZyYWdtZW50ICggU3BsYXkgcyApOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVtaXRBdHRyRnJhZ21lbnQgKCBTcGxheSBzICk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW1pdFRleHRGcmFnbWVudCAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW1pdENvbW1lbnRGcmFnbWVudCAoIFNwbGF5IHMgKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbWl0UHJvY2luc3RGcmFnbWVudCAoIFNwbGF5IHMgKTsKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVtaXREb2NUeXBlKAotICAgICAgICBTdHJpbmcgZG9jdHlwZU5hbWUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEICk7Ci0gICAgCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW1pdENvbW1lbnQgKCBTcGxheSBzICk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW1pdFRleHRBZnRlciAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW1pdEVuZCAoIFNwbGF5IHMsIFFOYW1lIG5hbWUgKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbWl0UHJvY2luc3QgKCBTcGxheSBzICk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW1pdENvbnRhaW5lciAoIENvbnRhaW5lciBjLCBRTmFtZSBuYW1lICk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiBhIHN5bnRoZXRpYyBwcmVmaXggaXMgY3JlYXRlZC4KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzeW50aGV0aWNOYW1lc3BhY2UgKAotICAgICAgICBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpLCBib29sZWFuIGNvbnNpZGVyQ3JlYXRpbmdEZWZhdWx0ICkgeyB9Ci0KLSAgICAvKgotICAgICAqIEl0IGlzIHZpdGFsIHRoYXQgdGhlIHNhdmVyIGRvZXMgbm90IG1vZGlmeSB0aGUgdHJlZSBpbiB0aGUgcHJvY2VzcyBvZgotICAgICAqIHNhdmluZy4gIFNvLCB3aGVuIHRoZXJlIGlzIGludmFsaWQgY29udGVudCBvciBhdHRyIHZhbHVlcyB3aGljaCBuZWVkCi0gICAgICogbmV3IG5hbWVzcGFjZS9wcmVmaXggbWFwcGluZ3MsIEkgY29tcHV0ZSB0aGUgY29udGVudC92YWx1ZXMgYnkgcGFzc2luZwotICAgICAqIHRoZSBOYW1lc3BhY2VNYW5hZ2VyIGltcGxlbWVudGVkIGJ5IHRoZSBzYXZlciB3aGljaCBjYW4gY29ucyB1cCBtYXBwaW5ncwotICAgICAqIGp1c3QgZm9yIHRoZSBwdXJwb3NlcyBvZiBzYXZpbmcgd2l0aG91dCBtb2RpZnlpbmcgdGhlIHRyZWUgYnkgYWRkaW5nCi0gICAgICogWG1sbnMgc3BsYXlzLgotICAgICAqCi0gICAgICogVGh1cywgSSBtdXN0IG5vdCwgYXMgYSBieXByb2R1Y3Qgb2Ygc2F2aW5nLCB2YWxpZGF0ZSBhbnkgY29udGVudC92YWx1ZXMKLSAgICAgKiBpbnRvIHRoZSB0cmVlIHdoaWNoIGNhbGwgYmFjayBmb3IgbmFtZXNwYWNlIG1hcHBpbmdzIHdoaWNoIG5lZWQgdG8gYmUKLSAgICAgKiBjcmVhdGVkLgotICAgICAqCi0gICAgICogQWxzbywgSSBuZWVkIHRvIGNvbXB1dGUgdGhlIHZhbGlkIHRleHQgKGlmIGEgc3BsYXkgaXMgaW52YWxpZCkgYmVmb3JlCi0gICAgICogSSBoYXZlIGNsb3NlZCB0aGUgYXR0cmlidXRlIGxpc3Qgb2YgdGhlIGVuY2xvc2luZyBjb250YWluZXIgYmVjYXVzZQotICAgICAqIEkgd2lsbCBoYXZlIHRvIHBlcnNpc3Qgb3V0IHRoZXNlIHRlbXBvcmFyeSBtZXBwaW5ncyBiZWZvcmUgdGhleSBhcmUKLSAgICAgKiByZWZlcmVuY2VkIGJ5IHRoZSB2YWx1ZXMgd2hpY2ggbmVlZCB0aGVtLgotICAgICAqLwotCi0gICAgZmluYWwgU3RyaW5nIHRleHQgKCApCi0gICAgewotICAgICAgICBhc3NlcnQgX3RleHQgIT0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBfdGV4dC50b1N0cmluZygpOwotICAgIH0KLQotICAgIGZpbmFsIGJvb2xlYW4gbm9UZXh0ICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IF90ZXh0ICE9IG51bGwgfHwgX3NiLmxlbmd0aCgpID09IDA7Ci0gICAgICAgIGFzc2VydCBfdGV4dCA9PSBudWxsIHx8IF90ZXh0ID09IF9zYjsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBfdGV4dCA9PSBudWxsOwotICAgIH0KLQotICAgIGZpbmFsIHZvaWQgY2xlYXJUZXh0ICggKQotICAgIHsKLSAgICAgICAgX3RleHQgPSBudWxsOwotICAgICAgICBfc2IuZGVsZXRlKCAwLCBfc2IubGVuZ3RoKCkgKTsKLSAgICB9Ci0KLSAgICBmaW5hbCBzdGF0aWMgdm9pZCBzcGFjZXMgKCBTdHJpbmdCdWZmZXIgc2IsIGludCBvZmZzZXQsIGludCBjb3VudCApCi0gICAgewotICAgICAgICB3aGlsZSAoIGNvdW50LS0gPiAwICkKLSAgICAgICAgICAgIHNiLmluc2VydCggb2Zmc2V0LCAnICcgKTsKLSAgICB9Ci0KLSAgICBmaW5hbCBzdGF0aWMgdm9pZCB0cmltICggU3RyaW5nQnVmZmVyIHNiICkKLSAgICB7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIGZvciAoIGkgPSAwIDsgaSA8IHNiLmxlbmd0aCgpIDsgaSsrICkKLSAgICAgICAgICAgIGlmICghU3BsYXkuaXNXaGl0ZVNwYWNlKCBzYi5jaGFyQXQoIGkgKSApKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHNiLmRlbGV0ZSggMCwgaSApOwotCi0gICAgICAgIGZvciAoIGkgPSBzYi5sZW5ndGgoKSA7IGkgPiAwIDsgaS0tICkKLSAgICAgICAgICAgIGlmICghU3BsYXkuaXNXaGl0ZVNwYWNlKCBzYi5jaGFyQXQoIGkgLSAxICkgKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICBzYi5kZWxldGUoIGksIHNiLmxlbmd0aCgpICk7Ci0gICAgfQotCi0gICAgLy8gQ2FsbCBwcm9jZXNzIHVudGlsIGl0IHJldHVybnMgZmFsc2UgdG8gc2F2ZSBldmVyeXRoaW5nLgotCi0gICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2VzcyAoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAKLSAgICAgICAgICAgIGlmIChfcHJlUHJvY2VzcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcHJlUHJvY2VzcyA9IGZhbHNlOwotICAgIAotICAgICAgICAgICAgICAgIFNwbGF5IHMgPSBfc3BsYXk7Ci0gICAgICAgICAgICAgICAgaW50ICAgcCA9IF9wb3M7Ci0gICAgCi0gICAgICAgICAgICAgICAgX3NwbGF5ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBfcG9zID0gMDsKLSAgICAKLSAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgcG9zaXRpb24gcmlnaHQgYmVmb3JlIGVuZCB0b2tlbi4gIEVmZmVjdGl2ZWx5IHRoZXJlCi0gICAgICAgICAgICAgICAgLy8gaXMgbm90aGluZyB0byBzYXZlIGhlcmUsIHNvIHNhdmUgb3V0IHRoZSBlbXB0eSBmcmFnbWVudC4KLSAgICAKLSAgICAgICAgICAgICAgICBpZiAoKHAgPT0gMCAmJiBzLmlzRmluaXNoKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgKHMuaXNMZWFmKCkgJiYgcCA9PSBzLmdldFBvc0xlYWZFbmQoKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgX3NwbGF5ID09IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NUZXh0RnJhZ21lbnQoIG51bGwsIDAsIDAgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIC8vIEhlcmUsIGlmIHAgPiAwLCB0aGVuIHdlJ3JlIHNhdmluZyBzb21lIHRleHQKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAocCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgIXMuaXNMZWFmKCkgfHwgcCAhPSBzLmdldFBvc0xlYWZFbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1RleHRGcmFnbWVudCggcywgcCwgcy5nZXRQb3N0Q2NoKCBwICkgKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IF9zcGxheSA9PSBudWxsOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKF9pbm5lciAmJiAocy5pc0F0dHIoKSB8fCBzLmlzQ29tbWVudCgpIHx8IHMuaXNQcm9jaW5zdCgpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NUZXh0RnJhZ21lbnQoIHMsIDAsIHMuZ2V0Q2NoVmFsdWUoKSApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1htbG5zRnJhZ21lbnQoIHMgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChzLmlzQXR0cigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0F0dHJGcmFnbWVudCggcyApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHMuaXNDb21tZW50KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWVudEZyYWdtZW50KCBzICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocy5pc1Byb2NpbnN0KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoX2ZpbHRlclByb2NpbnN0ICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcy5nZXRMb2NhbCgpLmVxdWFscyggX2ZpbHRlclByb2NpbnN0ICkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NUZXh0RnJhZ21lbnQoIG51bGwsIDAsIDAgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQcm9jaW5zdEZyYWdtZW50KCBzICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOwotICAgIAotICAgICAgICAgICAgICAgIF9zcGxheSA9IHM7Ci0gICAgICAgICAgICAgICAgX2VuZFNwbGF5ID0gcy5pc0NvbnRhaW5lcigpID8gcy5nZXRGaW5pc2hTcGxheSgpIDogczsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIC8vIEkgbmVlZCB0byBicmVhayB0aGUgcHJvY2Vzc2luZyBvZiBhIHNwbGF5IGludG8gdHdvIHBhcnRzLiAgVGhlCi0gICAgICAgICAgICAvLyBmaXJzdCBwYXJ0IGlzIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBzcGxheSBhbmQgdGhlIHNlY29uZCBwYXJ0IGlzCi0gICAgICAgICAgICAvLyB0aGUgcG9zdCBwcm9jZXNzaW5nIG9mIHRoZSBzcGxheS4gIEluIHBhcnRpY3VsYXIsIHRoZSBwb3N0Ci0gICAgICAgICAgICAvLyBwcm9jZXNzaW5nLCBhbW9uZyBvdGhlciB0aGluZ3MsIHBvcHMgdGhlIG1hcHBpbmcgc3RhY2suICBUaGlzCi0gICAgICAgICAgICAvLyBpcyBkb25lIHNvIHN0dWZmICdzYXZlZCcgZHVyaW5nIHRoZSBmaXJzdCBwYXJ0ICh0aGUgcHJlLXByb2Nlc3MpCi0gICAgICAgICAgICAvLyBjYW4gdXNlIHRoZSBtYXBwaW5nIHN0YWNrLiAgV2hlbiB0aGUgbmV4dCBwcm9jZXNzIGNvbWVzIGFyb3VuZCwKLSAgICAgICAgICAgIC8vIHRoZSBtYXBwaW5nIHN0YWNrIHdpbGwgdGhlbiBiZSB1cGRhdGVkLgotICAgIAotICAgICAgICAgICAgaWYgKF9wb3N0UG9wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvcE1hcHBpbmdzKCk7Ci0gICAgICAgICAgICAgICAgX3Bvc3RQb3AgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIGlmIChfcG9zdFByb2Nlc3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IF9zcGxheSAhPSBudWxsOwotICAgIAotICAgICAgICAgICAgICAgIGJvb2xlYW4gZW1pdHRlZCA9IGZhbHNlOwotICAgIAotICAgICAgICAgICAgICAgIGlmIChfc3BsYXkgPT0gX2VuZFNwbGF5KQotICAgICAgICAgICAgICAgICAgICBfc3BsYXkgPSBudWxsOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNwbGF5IHMgPSBfc3BsYXk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIF9zcGxheSA9IF9zcGxheS5uZXh0Tm9uQXR0clNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChfc2tpcENvbnRhaW5lckZpbmlzaCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNCZWdpbigpICYmICFzLmlzTGVhZigpICYmIHMuZ2V0Q2NoQWZ0ZXIoKSA9PTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgX3NwbGF5LmlzRmluaXNoKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBfc3BsYXkgPSBfc3BsYXkgPT0gX2VuZFNwbGF5ID8gbnVsbCA6IF9zcGxheS5uZXh0U3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoX3NraXBDb250YWluZXJGaW5pc2ggfHwgcy5pc0xlYWYoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0ICFfcG9zdFBvcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9wb3N0UG9wID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoIXMuaXNEb2MoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG5vVGV4dCgpOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNjaEFmdGVyID0gcy5nZXRDY2hBZnRlcigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9wcmV0dHlQcmludCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGV4dCA9IF9zYjsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2NoQWZ0ZXIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmdldENwRm9yUG9zKCByLCBzLmdldFBvc0FmdGVyKCkgKSwgY2NoQWZ0ZXIgKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpbSggX3RleHQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyIHN0b3AgPSAoQ29udGFpbmVyKSBfdG9wOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RvcC5pc0RvYygpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wID0gc3RvcC5nZXRDb250YWluZXIoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250YWluZXIgYyA9IHMuZ2V0Q29udGFpbmVyKCBzLmdldFBvc0FmdGVyKCkgKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RleHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyIHAgPSBjOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCA7IHAgIT0gc3RvcCA7IHAgPSBwLmdldENvbnRhaW5lcigpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcyggX3RleHQsIDAsIF9wcmV0dHlJbmRlbnQgKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9wcmV0dHlJbmRlbnQgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RleHQuaW5zZXJ0KCAwLCBfbmV3TGluZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VzKCBfdGV4dCwgMSwgX3ByZXR0eU9mZnNldCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfcHJldHR5SW5kZW50ID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGV4dC5hcHBlbmQoIF9uZXdMaW5lICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcyggX3RleHQsIF90ZXh0Lmxlbmd0aCgpLCBfcHJldHR5T2Zmc2V0ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lciBwID0gYzsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5uZXh0Tm9uQXR0clNwbGF5KCkuaXNFbmQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHAuZ2V0Q29udGFpbmVyKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggOyBwICE9IG51bGwgJiYgcCAhPSBzdG9wOyBwID0gcC5nZXRDb250YWluZXIoKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcyggX3RleHQsIF90ZXh0Lmxlbmd0aCgpLCBfcHJldHR5SW5kZW50ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RleHQgPT0gbnVsbCA/IGNjaEFmdGVyID4gMCA6IF90ZXh0Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0VGV4dEFmdGVyKCBzLCBzLmdldFBvc0FmdGVyKCksIGNjaEFmdGVyICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdHRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICBfcG9zdFByb2Nlc3MgPSBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgSSBvbmx5IHJldHVybiBmYWxzZSBpZiB0aGVyZSBpcyAqcmVhbGx5KiBub3RoaW5nIG1vcmUKLSAgICAgICAgICAgICAgICAvLyB0byBwcm9jZXNzCi0gICAgCi0gICAgICAgICAgICAgICAgaWYgKGVtaXR0ZWQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIAotICAgICAgICAgICAgICAgIGlmIChfcG9zdFBvcCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBvcE1hcHBpbmdzKCk7Ci0gICAgICAgICAgICAgICAgICAgIF9wb3N0UG9wID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKF9zcGxheSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIGlmIChfdmVyc2lvbiAhPSBnZXRSb290KCkuZ2V0VmVyc2lvbigpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJEb2N1bWVudCBjaGFuZ2VkIiApOwotICAgIAotICAgICAgICAgICAgX3NraXBDb250YWluZXJGaW5pc2ggPSBmYWxzZTsKLSAgICAKLSAgICAgICAgICAgIHN3aXRjaCAoIF9zcGxheS5nZXRLaW5kKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTcGxheS5ET0MgOgotICAgICAgICAgICAgY2FzZSBTcGxheS5CRUdJTiA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRhaW5lciggKENvbnRhaW5lcikgX3NwbGF5ICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNwbGF5LlJPT1QgOgotICAgICAgICAgICAgY2FzZSBTcGxheS5FTkQgIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRW5kKCBfc3BsYXkgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU3BsYXkuQ09NTUVOVCA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdENvbW1lbnQoIF9zcGxheSApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTcGxheS5QUk9DSU5TVCA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9maWx0ZXJQcm9jaW5zdCA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhX3NwbGF5LmdldExvY2FsKCkuZXF1YWxzKCBfZmlsdGVyUHJvY2luc3QgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXRQcm9jaW5zdCggX3NwbGF5ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTcGxheS5BVFRSIDoKLSAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTogIlVuZXhwZWN0ZWQgc3BsYXkga2luZCAiICsgX3NwbGF5LmdldEtpbmQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBfcG9zdFByb2Nlc3MgPSB0cnVlOwotICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgcHJvY2Vzc0NvbnRhaW5lciAoIENvbnRhaW5lciBjICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBjLmlzRG9jKCkgfHwgYy5pc0JlZ2luKCk7Ci0KLSAgICAgICAgUU5hbWUgbmFtZSA9Ci0gICAgICAgICAgICBfc3ludGhFbGVtICE9IG51bGwgJiYgYyA9PSBfdG9wCi0gICAgICAgICAgICAgICAgPyBfc3ludGhFbGVtCi0gICAgICAgICAgICAgICAgOiBjLmlzQmVnaW4oKSA/IGMuZ2V0TmFtZSgpIDogbnVsbDsKLQotICAgICAgICBTdHJpbmcgbmFtZVVyaSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhIGRvY3R5cGUgdG8gc2F2ZSBvdXQKLQotICAgICAgICBpZiAoYy5pc0RvYygpICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHN5c3RlbUlkID0gX3Jvb3QuX3Byb3BzLmdldERvY3R5cGVTeXN0ZW1JZCgpOwotICAgICAgICAgICAgU3RyaW5nIGRvY1R5cGVOYW1lID0gX3Jvb3QuX3Byb3BzLmdldERvY3R5cGVOYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzeXN0ZW1JZCAhPSBudWxsIHx8IGRvY1R5cGVOYW1lICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGRvY1R5cGVOYW1lID09IG51bGwgJiYgbmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBkb2NUeXBlTmFtZSA9IG5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZG9jVHlwZU5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbEN1cnNvciB4YyA9IF9yb290LmNyZWF0ZUN1cnNvcigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHhjLnRvRmlyc3RDaGlsZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgZG9jVHlwZU5hbWUgPSB4Yy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4Yy5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGRvY1R5cGVOYW1lID09IG51bGwgJiYgX2ZyYWdtZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGRvY1R5cGVOYW1lID0gX2ZyYWdtZW50LmdldExvY2FsUGFydCgpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHB1YmxpY0lkID0gX3Jvb3QuX3Byb3BzLmdldERvY3R5cGVQdWJsaWNJZCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGVtaXREb2NUeXBlKCBkb2NUeXBlTmFtZSwgcHVibGljSWQsIHN5c3RlbUlkICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgYSBuZXcgZW50cnkgdG8gdGhlIGZyb250aWVyLiAgSWYgdGhpcyBlbGVtZW50IGhhcyBhIG5hbWUKLSAgICAgICAgLy8gd2hpY2ggaGFzIG5vIG5hbWVzcGFjZSwgdGhlbiB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHB1c2hpbmcKLSAgICAgICAgLy8gdGhlIG1hcHBpbmdzIGNhdXNlcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgdG8gYmUgZW1wdHkKLQotICAgICAgICBib29sZWFuIGVuc3VyZURlZmF1bHRFbXB0eSA9IG5hbWUgIT0gbnVsbCAmJiBuYW1lVXJpLmxlbmd0aCgpID09IDA7Ci0KLSAgICAgICAgcHVzaE1hcHBpbmdzKCBjLCBlbnN1cmVEZWZhdWx0RW1wdHkgKTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBUaGVyZSBhcmUgZm91ciB0aGluZ3Mgd2hpY2ggdXNlIG1hcHBpbmdzOgotICAgICAgICAvLwotICAgICAgICAvLyAgIDEpIFRoZSBlbGVtZW50IG5hbWUKLSAgICAgICAgLy8gICAyKSBUaGUgZWxlbWVudCB2YWx1ZSAocW5hbWUgYmFzZWQpCi0gICAgICAgIC8vICAgMykgQXR0cmlidXRlIG5hbWVzCi0gICAgICAgIC8vICAgNCkgVGhlIGF0dHJpYnV0ZSB2YWx1ZXMgKHFuYW1lIGJhc2VkKQotICAgICAgICAvLwotCi0gICAgICAgIC8vIDEpIFRoZSBlbGVtZW50IG5hbWUgKG5vdCBmb3Igc3RhcnRzKQotCi0gICAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICAgICAgICBlbnN1cmVNYXBwaW5nKCBuYW1lVXJpLCBudWxsLCAhZW5zdXJlRGVmYXVsdEVtcHR5LCBmYWxzZSApOwotCi0gICAgICAgIGFzc2VydCBub1RleHQoKTsKLQotICAgICAgICBpZiAoYy5pc0ludmFsaWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gMikgVGhlIGVsZW1lbnQgdmFsdWUKLSAgICAgICAgICAgIF90ZXh0ID0gX3NiLmFwcGVuZCggYy5wZWVrVHlwZSgpLmJ1aWxkX3RleHQoIHRoaXMgKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgX2F0dHJzLmNsZWFyKCk7Ci0gICAgICAgIF9hdHRyTmFtZXMuY2xlYXIoKTsKLQotICAgICAgICBmb3IgKCBTcGxheSBzID0gYy5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpICYmCi0gICAgICAgICAgICAgICAgICAgIChfd2FudER1cEF0dHJzIHx8ICFfYXR0ck5hbWVzLmNvbnRhaW5zKCBzLmdldE5hbWUoKSApKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfYXR0ck5hbWVzLmFkZCggcy5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyAzKSBBdHRyaWJ1dGUgbmFtZQotICAgICAgICAgICAgICAgIGVuc3VyZU1hcHBpbmcoIHMuZ2V0VXJpKCksIG51bGwsIGZhbHNlLCB0cnVlICk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgaW52YWxpZFZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocy5pc0ludmFsaWQoKSkKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlID0gcy5wZWVrVHlwZSgpLmJ1aWxkX3RleHQoIHRoaXMgKTsgLy8gIzQKLQotICAgICAgICAgICAgICAgIF9hdHRycy5wdXQoIHMsIGludmFsaWRWYWx1ZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZW1pdENvbnRhaW5lciBoYW5kbGVzIHRleHQgb25seSBmb3IgbGVhdmVzIGFuZCBzdGFydHMKLQotICAgICAgICBpZiAoX3ByZXR0eVByaW50ICYmIChjLmlzRG9jKCkgfHwgYy5pc0xlYWYoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfdGV4dCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLQotICAgICAgICAgICAgICAgIHIuX3RleHQuZmV0Y2goCi0gICAgICAgICAgICAgICAgICAgIF90ZXh0ID0gX3NiLAotICAgICAgICAgICAgICAgICAgICByLmdldENwKCBjICksCi0gICAgICAgICAgICAgICAgICAgIGMuaXNMZWFmKCkgPyBjLmdldENjaFZhbHVlKCkgOiBjLmdldENjaCgpICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyaW0oIF90ZXh0ICk7Ci0KLSAgICAgICAgICAgIGlmIChjLmlzRG9jKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3BhY2VzKCBfdGV4dCwgMCwgX3ByZXR0eU9mZnNldCApOwotCi0gICAgICAgICAgICAgICAgaWYgKF90ZXh0Lmxlbmd0aCgpID4gX3ByZXR0eU9mZnNldCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfcHJldHR5SW5kZW50ID49IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF90ZXh0Lmluc2VydCggMCwgX25ld0xpbmUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcyggX3RleHQsIDEsIF9wcmV0dHlPZmZzZXQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIF90ZXh0LmFwcGVuZCggX25ld0xpbmUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcyggX3RleHQsIF90ZXh0Lmxlbmd0aCgpLCBfcHJldHR5T2Zmc2V0ICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkZXJpdmVkIHNhdmVycyBtYXkgd2FudCB0byB0ZXN0IHRoZSBzdHVmZiBiZWluZyBzdG9yZWQgdG8KLSAgICAgICAgLy8gc2VlIGlmIGlzIHdlbGwgZm9ybWVkIG9yIG5vdCBpbiBvcmRlciB0byBzYXZlIG91dCBhCi0gICAgICAgIC8vIGZyYWdtZW50LiAgRG8gdGhpcyBoZXJlIHdoZW4gZW1pdHRpbmcgdGhlIGZpcnN0IGNvbnRhaW5lciBpZgotICAgICAgICAvLyB0aGF0IGNvbnRhaW5lciBpcyB0aGUgcm9vdCAoaWYgbm90IHRoZSByb290LCB0aGVuIHdlIGFyZQotICAgICAgICAvLyB3ZWxsIGZvcm1lZCkKLQotICAgICAgICBpZiAoX3dhbnRGcmFnVGVzdCAmJiBuYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoX3RleHQgIT0gbnVsbCAmJiAhU3BsYXkuaXNXaGl0ZVNwYWNlKCBfdGV4dCApKSB8fAotICAgICAgICAgICAgICAgICAgIWMuaXNBZnRlcldoaXRlU3BhY2UoIGdldFJvb3QoKSApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9uZWVkc0ZyYWcgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCAhYy5pc0xlYWYoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTcGxheSBzID0gYy5uZXh0U3BsYXkoKTsKLQotICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBsZWFmIGFueXdheXMgLS0gc29tZXRpbWVzIGl0IGhhcHBlbnMhCi0gICAgICAgICAgICAgICAgaWYgKGMuaXNMZWFmKCkgfHwgcy5pc0F0dHIoKSB8fCBoYXNNYXBwaW5ncygpKQotICAgICAgICAgICAgICAgICAgICBfbmVlZHNGcmFnID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNhd0JlZ2luID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIFNwbGF5IGNFbmQgPSBjLmdldEZpbmlzaFNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yICggOyBzICE9IGNFbmQgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmlzQmVnaW4oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2F3QmVnaW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbmVlZHNGcmFnID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F3QmVnaW4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLmdldEZpbmlzaFNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcy5pc0FmdGVyV2hpdGVTcGFjZSggZ2V0Um9vdCgpICkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX25lZWRzRnJhZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoIXNhd0JlZ2luKQotICAgICAgICAgICAgICAgICAgICAgICAgX25lZWRzRnJhZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgSSBhbSBkb2luZyBhZ2dyZXNzaXZlIG5hbWVzcGFjZXMgYW5kIHdlJ3JlIGVtaXR0aW5nIGEKLSAgICAgICAgLy8gY29udGFpbmVyIHdoaWNoIGNhbiBjb250YWluIGNvbnRlbnQsIGFkZCB0aGUgbmFtZXNwYWNlcwotICAgICAgICAvLyB3ZSd2ZSBjb21wdXRlZC4gIEJhc2ljYWxseSwgSSdtIG1ha2luZyBzdXJlIHRoZSBwcmUtY29tcHV0ZWQKLSAgICAgICAgLy8gbmFtZXNwYWNlcyBhcmUgbWFwcGVkIG9uIHRoZSBmaXJzdCBjb250YWluZXIgd2hpY2ggaGFzIGEgbmFtZS4KLQotICAgICAgICBpZiAoX3ByZUNvbXB1dGVkTmFtZXNwYWNlcyAhPSBudWxsICYmIChuYW1lICE9IG51bGwgfHwgX25lZWRzRnJhZykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIEl0ZXJhdG9yIGkgPSBfcHJlQ29tcHV0ZWROYW1lc3BhY2VzLmtleVNldCgpLml0ZXJhdG9yKCkgOyBpLmhhc05leHQoKSA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZW5zdXJlTWFwcGluZygKLSAgICAgICAgICAgICAgICAgICAgdXJpLCBudWxsLAotICAgICAgICAgICAgICAgICAgICBfcHJlQ29tcHV0ZWROYW1lc3BhY2VzLmdldCggdXJpICkgIT0gbnVsbCAmJiAhZW5zdXJlRGVmYXVsdEVtcHR5LCBmYWxzZSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCBzbyB3ZSBkbyB0aGlzIG9uY2UgYXQgdGhlIHRvcAotICAgICAgICAgICAgX3ByZUNvbXB1dGVkTmFtZXNwYWNlcyA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX3dhbnRGcmFnVGVzdCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gU2VlIGlmIEkgbmVlZCB0byBnZW4gYSBmcmFnbWVudCBmb3IgdGhlIGRvY3VtZW50Ci0KLSAgICAgICAgICAgIGFzc2VydCBuYW1lICE9IG51bGwgfHwgKGMuaXNEb2MoKSAmJiBfc3ludGhFbGVtID09IG51bGwpOwotCi0gICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfbmVlZHNGcmFnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IF9mcmFnbWVudDsKLSAgICAgICAgICAgICAgICAgICAgZW5zdXJlRnJhZ21lbnROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgX2RvY0VsZW0gPSBuYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGMuaXNEb2MoKSkKLSAgICAgICAgICAgICAgICBfZG9jRWxlbSA9IG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBlbWl0Q29udGFpbmVyKCBjLCBuYW1lICk7Ci0KLSAgICAgICAgY2xlYXJUZXh0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NFbmQgKCBTcGxheSBzICkKLSAgICB7Ci0gICAgICAgIENvbnRhaW5lciBjID0gcy5nZXRDb250YWluZXIoKTsKLSAgICAgICAgCi0gICAgICAgIFFOYW1lIG5hbWUgPQotICAgICAgICAgICAgX3N5bnRoRWxlbSAhPSBudWxsICYmIGMgPT0gX3RvcAotICAgICAgICAgICAgICAgID8gX3N5bnRoRWxlbQotICAgICAgICAgICAgICAgIDogYy5pc0JlZ2luKCkgPyBjLmdldE5hbWUoKSA6IG51bGw7Ci0gICAgICAgIAotICAgICAgICBpZiAoX3dhbnRGcmFnVGVzdCAmJiBuYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNSb290ID0gcy5pc1Jvb3QoKTsKLQotICAgICAgICAgICAgaWYgKCFpc1Jvb3QgfHwgX2RvY0VsZW0gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gCi0gICAgICAgICAgICAgICAgICAgIGlzUm9vdAotICAgICAgICAgICAgICAgICAgICAgICAgPyBfZG9jRWxlbQotICAgICAgICAgICAgICAgICAgICAgICAgOiAocy5pc0VuZCgpID8gcy5nZXRDb250YWluZXIoKSA6IHMgKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBlbWl0RW5kKCBfc3BsYXksIG5hbWUgKTsKLQotICAgICAgICBhc3NlcnQgIV9wb3N0UG9wOwotCi0gICAgICAgIF9wb3N0UG9wID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgcHVzaEZyYWdtZW50TWFwcGluZ3MgKCBTcGxheSBzICkKLSAgICB7Ci0gICAgICAgIC8vIG1hc2sgdGhlIGluaXRpYWwgZnJhbWUgdG8gaGlkZSBkZWZhdWx0IG1hcHBpbmdzCi0gICAgICAgIAotICAgICAgICBwdXNoTWFwcGluZ3MoCi0gICAgICAgICAgICBzID09IG51bGwgPyBudWxsIDogcy5nZXRDb250YWluZXIoKSwKLSAgICAgICAgICAgIF9mcmFnbWVudC5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwICk7Ci0gICAgICAgIAotICAgICAgICBlbnN1cmVGcmFnbWVudE5hbWVzcGFjZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgdm9pZCBwcm9jZXNzWG1sbnNGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgIHsKLSAgICAgICAgLy8gU2F2aW5nIGEgZGVmYXVsdCB4bWxucyBtYXBwaW5nIGlzIGRhbmdlcm91cywganVzdCBzcGl0IG91dCBlbXB0eQotICAgICAgICAvLyB0ZXh0Ci0gICAgICAgIAotICAgICAgICBpZiAocy5nZXRMb2NhbCgpLmxlbmd0aCgpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGcmFnbWVudE1hcHBpbmdzKCBudWxsICk7Ci0gICAgICAgICAgICBfdGV4dCA9IF9zYjsKLSAgICAgICAgICAgIGVtaXRUZXh0RnJhZ21lbnQoIHMsIDAsIDAgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGcmFnbWVudE1hcHBpbmdzKCBudWxsICk7Ci0gICAgICAgICAgICBlbnN1cmVNYXBwaW5nKCBzLmdldFVyaSgpLCBzLmdldExvY2FsKCksIGZhbHNlLCB0cnVlICk7Ci0gICAgICAgICAgICBlbWl0WG1sbnNGcmFnbWVudCggcyApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHByb2Nlc3NDb21tZW50RnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICB7Ci0gICAgICAgIHB1c2hGcmFnbWVudE1hcHBpbmdzKCBudWxsICk7Ci0gICAgICAgIGVtaXRDb21tZW50RnJhZ21lbnQoIHMgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgcHJvY2Vzc1Byb2NpbnN0RnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICB7Ci0gICAgICAgIHB1c2hGcmFnbWVudE1hcHBpbmdzKCBudWxsICk7Ci0gICAgICAgIGVtaXRQcm9jaW5zdEZyYWdtZW50KCBzICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgaXMgY2FsbGVkIG9ubHkgd2hlbiBhIHNpbmdsZSBhdHRyIGlzIGJlaW5nIHNhdmVkLiAgSXQgaXMgbm90IGNhbGxlZAotICAgICAqIGFzIGEgY29uc2VxdWVuY2Ugb2Ygc2F2aW5nIG91dCBhIGNvbnRhaW5lci4KLSAgICAgKi8KLQotICAgIHByaXZhdGUgZmluYWwgdm9pZCBwcm9jZXNzQXR0ckZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgewotICAgICAgICBhc3NlcnQgcy5pc05vcm1hbEF0dHIoKTsKLQotICAgICAgICBwdXNoRnJhZ21lbnRNYXBwaW5ncyggcyApOwotCi0gICAgICAgIGVuc3VyZU1hcHBpbmcoIHMuZ2V0VXJpKCksIG51bGwsIGZhbHNlLCB0cnVlICk7Ci0KLSAgICAgICAgYXNzZXJ0IG5vVGV4dCgpOwotCi0gICAgICAgIGlmIChzLmlzSW52YWxpZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPIC0gcGFzcyBTdHJpbmdCdWZmZXIgdG8gYnVpbGRUZXh0IHRvIHNhdmUgb2JqZWN0IGNyZWF0aW9uCi0gICAgICAgICAgICBfdGV4dCA9IF9zYi5hcHBlbmQoIHMucGVla1R5cGUoKS5idWlsZF90ZXh0KCB0aGlzICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVtaXRBdHRyRnJhZ21lbnQoIHMgKTsKLQotICAgICAgICBjbGVhclRleHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIGNhbGxlZCBvbmx5IHdoZW4gYSBzaW5nbGUgY2h1bmsgb2YgdGV4dCBpcyB0byBiZSBzYXZlZC4KLSAgICAgKiBJdCBpcyBub3QgY2FsbGVkIGFzIGEgY29uc2VxdWVuY2Ugb2Ygc2F2aW5nIG91dCBhIGNvbnRhaW5lci4KLSAgICAgKi8KLQotICAgIHByaXZhdGUgZmluYWwgdm9pZCBwcm9jZXNzVGV4dEZyYWdtZW50ICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgLy8gT25seSBuZWVkIHRvIHNhdmUgYW5jZXN0b3IgbmFtZXNwYWNlIG1hcHBpbmdzIGlmIHRoZXJlIGNvdWxkIGJlIGEKLSAgICAgICAgLy8gcW5hbWUgaGVyZS4gIElmIHRoZSB0ZXh0IGlzIG9mIGxlbmd0aCAwLCB0aGVuIHRoZXJlIGlzIG5vIHFuYW1lLgotCi0gICAgICAgIFNwbGF5IGMgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKChfdGV4dCAhPSBudWxsICYmIF90ZXh0Lmxlbmd0aCgpID4gMCkgfHwgKHMgIT0gbnVsbCAmJiBjY2ggPiAwKSkKLSAgICAgICAgICAgIGMgPSBzLmdldENvbnRhaW5lciggcCApOwotICAgICAgICAKLSAgICAgICAgcHVzaEZyYWdtZW50TWFwcGluZ3MoIGMgKTsKLQotICAgICAgICBlbWl0VGV4dEZyYWdtZW50KCBzLCBwLCBjY2ggKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIExheW91dCBvZiBuYW1lc3BhY2Ugc3RhY2s6Ci0gICAgLy8KLSAgICAvLyAgICBVUkkgVW5kbwotICAgIC8vICAgIFVSSSBSZW5hbWUKLSAgICAvLyAgICBQcmVmaXggVW5kbwotICAgIC8vICAgIE1hcHBpbmcKLSAgICAvLwotCi0gICAgYm9vbGVhbiBoYXNNYXBwaW5ncyAoICkKLSAgICB7Ci0gICAgICAgIGludCBpID0gX25hbWVzcGFjZVN0YWNrLnNpemUoKTsKLQotICAgICAgICByZXR1cm4gaSA+IDAgJiYgX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDEgKSAhPSBudWxsOwotICAgIH0KLQotICAgIHZvaWQgaXRlcmF0ZU1hcHBpbmdzICggKQotICAgIHsKLSAgICAgICAgX2N1cnJlbnRNYXBwaW5nID0gX25hbWVzcGFjZVN0YWNrLnNpemUoKTsKLQotICAgICAgICB3aGlsZSAoIF9jdXJyZW50TWFwcGluZyA+IDAgJiYKLSAgICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5nZXQoIF9jdXJyZW50TWFwcGluZyAtIDEgKSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgX2N1cnJlbnRNYXBwaW5nIC09IDg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sZWFuIGhhc01hcHBpbmcgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX2N1cnJlbnRNYXBwaW5nIDwgX25hbWVzcGFjZVN0YWNrLnNpemUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIG5leHRNYXBwaW5nICggKQotICAgIHsKLSAgICAgICAgX2N1cnJlbnRNYXBwaW5nICs9IDg7Ci0gICAgfQotCi0gICAgU3RyaW5nIG1hcHBpbmdQcmVmaXggKCApCi0gICAgewotICAgICAgICBhc3NlcnQgaGFzTWFwcGluZygpOwotICAgICAgICByZXR1cm4gKFN0cmluZykgX25hbWVzcGFjZVN0YWNrLmdldCggX2N1cnJlbnRNYXBwaW5nICsgNiApOwotICAgIH0KLQotICAgIFN0cmluZyBtYXBwaW5nVXJpICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGhhc01hcHBpbmcoKTsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIF9uYW1lc3BhY2VTdGFjay5nZXQoIF9jdXJyZW50TWFwcGluZyArIDcgKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgbWFwcGluZ1ByZXZQcmVmaXhVcmkgKCApCi0gICAgewotICAgICAgICBhc3NlcnQgaGFzTWFwcGluZygpOwotICAgICAgICByZXR1cm4gKFN0cmluZykgX25hbWVzcGFjZVN0YWNrLmdldCggX2N1cnJlbnRNYXBwaW5nICsgNSApOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHB1c2hNYXBwaW5ncyAoIENvbnRhaW5lciBjLCBib29sZWFuIGVuc3VyZURlZmF1bHRFbXB0eSApCi0gICAgewotICAgICAgICBfbmFtZXNwYWNlU3RhY2suYWRkKCBudWxsICk7Ci0KLSAgICAgICAgZm9yICggOyBjICE9IG51bGwgOyBjID0gYy5nZXRDb250YWluZXIoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5hbWVzcGFjZXM6Ci0gICAgICAgICAgICBmb3IgKCBTcGxheSBzID0gYy5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sbnMgeCA9IChYbWxucykgczsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHguZ2V0TG9jYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHguZ2V0VXJpKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVuc3VyZURlZmF1bHRFbXB0eSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeC5sZW5ndGgoKSA9PSAwICYmIHVyaS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBwcmVmaXggaXMgbm90IGFscmVhZHkgbWFwcGVkIGluCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZnJhbWUKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKCBpdGVyYXRlTWFwcGluZ3MoKSA7IGhhc01hcHBpbmcoKSA7IG5leHRNYXBwaW5nKCkgKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBpbmdQcmVmaXgoKS5lcXVhbHMoIHByZWZpeCApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG5hbWVzcGFjZXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgYWRkTWFwcGluZyggcHJlZml4LCB1cmkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFB1c2ggYWxsIGFuY2VzdG9ycyB0aGUgZmlyc3QgdGltZQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIV9maXJzdFB1c2gpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZW5zdXJlRGVmYXVsdEVtcHR5KQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFVyaSA9IChTdHJpbmcpIF9wcmVmaXhNYXAuZ2V0KCAiIiApOwotCi0gICAgICAgICAgICAvLyBJIG1hcCB0aGUgZGVmYXVsdCB0byAiIiBhdCB0aGUgdmVyeSBiZWdpbm5pbmcKLSAgICAgICAgICAgIGFzc2VydCBkZWZhdWx0VXJpICE9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChkZWZhdWx0VXJpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKCAiIiwgIiIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9maXJzdFB1c2ggPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgZHVtcE1hcHBpbmdzICggKQotICAgIHsKLSAgICAgICAgZm9yICggaW50IGkgPSBfbmFtZXNwYWNlU3RhY2suc2l6ZSgpIDsgaSA+IDAgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gMSApID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiLS0tLS0tLS0tLS0tLS0tLSIgKTsKLSAgICAgICAgICAgICAgICBpLS07Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoICJNYXBwaW5nOiAiICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gMiApICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCAiIC0+ICIgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSAxICkgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCAiUHJlZml4IFVuZG86ICIgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSA0ICkgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoICIgLT4gIiApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCggX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDMgKSApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoICJVcmkgUmVuYW1lOiAiICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gNSApICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCAiIC0+ICIgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSA2ICkgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCAiVXJpVW5kbzogIiApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCggX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDcgKSApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCggIiAtPiAiICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gOCApICk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0KLSAgICAgICAgICAgIGkgLT0gODsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgdm9pZCBhZGRNYXBwaW5nICggU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSApCi0gICAgewotICAgICAgICBhc3NlcnQgdXJpICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCBwcmVmaXggIT0gbnVsbDsKLQotICAgICAgICAvLyBJZiB0aGUgcHJlZml4IGJlaW5nIG1hcHBlZCBoZXJlIGlzIGFscmVhZHkgbWFwcGVkIHRvIGEgdXJpLAotICAgICAgICAvLyB0aGF0IHVyaSB3aWxsIGVpdGhlciBnbyBvdXQgb2Ygc2NvcGUgb3IgYmUgbWFwcGVkIHRvIGFub3RoZXIKLSAgICAgICAgLy8gcHJlZml4LgotCi0gICAgICAgIFN0cmluZyByZW5hbWVVcmkgPSAoU3RyaW5nKSBfcHJlZml4TWFwLmdldCggcHJlZml4ICk7Ci0gICAgICAgIFN0cmluZyByZW5hbWVQcmVmaXggPSBudWxsOwotCi0gICAgICAgIGlmIChyZW5hbWVVcmkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gU2VlIGlmIHRoaXMgcHJlZml4IGlzIGFscmVhZHkgbWFwcGVkIHRvIHRoaXMgdXJpLiAgSWYKLSAgICAgICAgICAgIC8vIHNvLCB0aGVuIGFkZCB0byB0aGUgc3RhY2ssIGJ1dCB0aGVyZSBpcyBub3RoaW5nIHRvIHJlbmFtZQotICAgICAgICAKLSAgICAgICAgICAgIGlmIChyZW5hbWVVcmkuZXF1YWxzKCB1cmkgKSkKLSAgICAgICAgICAgICAgICByZW5hbWVVcmkgPSBudWxsOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBpID0gX25hbWVzcGFjZVN0YWNrLnNpemUoKTsKLQotICAgICAgICAgICAgICAgIHdoaWxlICggaSA+IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSAxICkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDcgKS5lcXVhbHMoIHJlbmFtZVVyaSApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVQcmVmaXggPSAoU3RyaW5nKSBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gOCApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVuYW1lUHJlZml4ID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFyZW5hbWVQcmVmaXguZXF1YWxzKCBwcmVmaXggKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGkgLT0gODsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgaSA+IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBfbmFtZXNwYWNlU3RhY2suYWRkKCBfdXJpTWFwLmdldCggdXJpICkgKTsKLSAgICAgICAgX25hbWVzcGFjZVN0YWNrLmFkZCggdXJpICk7Ci0KLSAgICAgICAgaWYgKHJlbmFtZVVyaSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBfbmFtZXNwYWNlU3RhY2suYWRkKCBfdXJpTWFwLmdldCggcmVuYW1lVXJpICkgKTsKLSAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5hZGQoIHJlbmFtZVVyaSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgX25hbWVzcGFjZVN0YWNrLmFkZCggbnVsbCApOwotICAgICAgICAgICAgX25hbWVzcGFjZVN0YWNrLmFkZCggbnVsbCApOwotICAgICAgICB9Ci0KLSAgICAgICAgX25hbWVzcGFjZVN0YWNrLmFkZCggcHJlZml4ICk7Ci0gICAgICAgIF9uYW1lc3BhY2VTdGFjay5hZGQoIF9wcmVmaXhNYXAuZ2V0KCBwcmVmaXggKSApOwotCi0gICAgICAgIF9uYW1lc3BhY2VTdGFjay5hZGQoIHByZWZpeCApOwotICAgICAgICBfbmFtZXNwYWNlU3RhY2suYWRkKCB1cmkgKTsKLQotICAgICAgICBfdXJpTWFwLnB1dCggdXJpLCBwcmVmaXggKTsKLSAgICAgICAgX3ByZWZpeE1hcC5wdXQoIHByZWZpeCwgdXJpICk7Ci0KLSAgICAgICAgaWYgKHJlbmFtZVVyaSAhPSBudWxsKQotICAgICAgICAgICAgX3VyaU1hcC5wdXQoIHJlbmFtZVVyaSwgcmVuYW1lUHJlZml4ICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHBvcE1hcHBpbmdzICggKQotICAgIHsKLSAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGkgPSBfbmFtZXNwYWNlU3RhY2suc2l6ZSgpOwotCi0gICAgICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBpZiAoX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDEgKSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5yZW1vdmUoIGkgLSAxICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdCBvbGRVcmkgPSBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gNyApOyAKLSAgICAgICAgICAgIE9iamVjdCBvbGRQcmVmaXggPSBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gOCApOyAKLQotICAgICAgICAgICAgaWYgKG9sZFByZWZpeCA9PSBudWxsKSAKLSAgICAgICAgICAgICAgICBfdXJpTWFwLnJlbW92ZSggb2xkVXJpICk7IAotICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICBfdXJpTWFwLnB1dCggb2xkVXJpLCBvbGRQcmVmaXggKTsgCi0KLSAgICAgICAgICAgIG9sZFByZWZpeCA9IF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSA0ICk7IAotICAgICAgICAgICAgb2xkVXJpID0gX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDMgKTsgCi0KLSAgICAgICAgICAgIGlmIChvbGRVcmkgPT0gbnVsbCkgCi0gICAgICAgICAgICAgICAgX3ByZWZpeE1hcC5yZW1vdmUoIG9sZFByZWZpeCApOyAKLSAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgICAgX3ByZWZpeE1hcC5wdXQoIG9sZFByZWZpeCwgb2xkVXJpICk7IAotCi0gICAgICAgICAgICBTdHJpbmcgdXJpID0gKFN0cmluZykgX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDUgKTsKLQotICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsKQotICAgICAgICAgICAgICAgIF91cmlNYXAucHV0KCB1cmksIF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSA2ICkgKTsKLQotICAgICAgICAgICAgLy8gSGFoYWhhaGFoYWhhIC0tIDotKAotICAgICAgICAgICAgX25hbWVzcGFjZVN0YWNrLnJlbW92ZSggaSAtIDEgKTsKLSAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5yZW1vdmUoIGkgLSAyICk7Ci0gICAgICAgICAgICBfbmFtZXNwYWNlU3RhY2sucmVtb3ZlKCBpIC0gMyApOwotICAgICAgICAgICAgX25hbWVzcGFjZVN0YWNrLnJlbW92ZSggaSAtIDQgKTsKLSAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5yZW1vdmUoIGkgLSA1ICk7Ci0gICAgICAgICAgICBfbmFtZXNwYWNlU3RhY2sucmVtb3ZlKCBpIC0gNiApOwotICAgICAgICAgICAgX25hbWVzcGFjZVN0YWNrLnJlbW92ZSggaSAtIDcgKTsKLSAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5yZW1vdmUoIGkgLSA4ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldFVyaU1hcHBpbmcgKCBTdHJpbmcgdXJpICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBfdXJpTWFwLmdldCggdXJpICkgIT0gbnVsbDsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIF91cmlNYXAuZ2V0KCB1cmkgKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiB0cnlQcmVmaXggKCBTdHJpbmcgcHJlZml4ICkKLSAgICB7Ci0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCB8fCBTcGxheS5iZWdpbnNXaXRoWG1sKCBwcmVmaXggKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBTdHJpbmcgZXhpc3RpbmdVcmkgPSAoU3RyaW5nKSBfcHJlZml4TWFwLmdldCggcHJlZml4ICk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHByZWZpeCBpcyBjdXJyZW50bHkgbWFwcGVkLCB0aGVuIHRyeSBhbm90aGVyIHByZWZpeC4gIEEKLSAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGlzIHRoYXQgb2YgdHJ5aW5nIHRvIG1hcCB0aGUgZGVmYXVsdCBwcmVmaXggKCIiKS4KLSAgICAgICAgLy8gSGVyZSwgdGhlcmUgYWx3YXlzIGV4aXN0cyBhIGRlZmF1bHQgbWFwcGluZy4gIElmIHRoaXMgaXMgdGhlCi0gICAgICAgIC8vIG1hcHBpbmcgd2UgZm91bmQsIHRoZW4gcmVtYXAgaXQgYW55d2F5cy4gSSB1c2UgIT0gdG8gY29tcGFyZQotICAgICAgICAvLyBzdHJpbmdzIGJlY2F1c2UgSSB3YW50IHRvIHRlc3QgZm9yIHRoZSBzcGVjaWZpYyBpbml0aWFsIGRlZmF1bHQKLSAgICAgICAgLy8gdXJpIEkgYWRkZWQgd2hlbiBJIGluaXRpYWxpemVkIHRoZSBzYXZlci4KLQotICAgICAgICBpZiAoZXhpc3RpbmdVcmkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAocHJlZml4Lmxlbmd0aCgpID4gMCB8fCBleGlzdGluZ1VyaSAhPSBfaW5pdGlhbERlZmF1bHRVcmkpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGVuc3VyZU1hcHBpbmcgKAotICAgICAgICBTdHJpbmcgdXJpLCBTdHJpbmcgY2FuZGlkYXRlUHJlZml4LAotICAgICAgICBib29sZWFuIGNvbnNpZGVyQ3JlYXRpbmdEZWZhdWx0LCBib29sZWFuIG11c3RIYXZlUHJlZml4ICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCB1cmkgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IGNhbmRpZGF0ZVByZWZpeCA9PSBudWxsIHx8IGNhbmRpZGF0ZVByZWZpeC5sZW5ndGgoKSA+IDA7Ci0KLSAgICAgICAgLy8gQ2FuIGJlIGNhbGxlZCBmb3Igbm8tbmFtZXNwYWNlZCB0aGluZ3MKLQotICAgICAgICBpZiAodXJpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgX3VyaU1hcC5nZXQoIHVyaSApOwotCi0gICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiAocHJlZml4Lmxlbmd0aCgpID4gMCB8fCAhbXVzdEhhdmVQcmVmaXgpKQotICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLQotICAgICAgICAvLwotICAgICAgICAvLyBJIHRyeSBwcmVmaXhlcyBmcm9tIGEgbnVtYmVyIG9mIHBsYWNlcywgaW4gb3JkZXI6Ci0gICAgICAgIC8vCi0gICAgICAgIC8vICAxKSBXaGF0IHdhcyBwYXNzZWQgaW4KLSAgICAgICAgLy8gIDIpIFRoZSBvcHRpb25hbCBzdWdnZXN0aW9ucyAoZm9yIHVyaSdzKQotICAgICAgICAvLyAgMykgVGhlIGRlZmF1bHQgbWFwcGluZyBpcyBhbGxvd2VkCi0gICAgICAgIC8vICA0KSBucyMrKwotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgaWYgKGNhbmRpZGF0ZVByZWZpeCA9PSBudWxsIHx8ICF0cnlQcmVmaXgoIGNhbmRpZGF0ZVByZWZpeCApKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3N1Z2dlc3RlZFByZWZpeGVzICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgX3N1Z2dlc3RlZFByZWZpeGVzLmNvbnRhaW5zS2V5KCB1cmkgKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5UHJlZml4KCAoU3RyaW5nKSBfc3VnZ2VzdGVkUHJlZml4ZXMuZ2V0KCB1cmkgKSApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhbmRpZGF0ZVByZWZpeCA9IChTdHJpbmcpIF9zdWdnZXN0ZWRQcmVmaXhlcy5nZXQoIHVyaSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY29uc2lkZXJDcmVhdGluZ0RlZmF1bHQgJiYgX3VzZURlZmF1bHROYW1lc3BhY2UgJiYgdHJ5UHJlZml4KCAiIiApKQotICAgICAgICAgICAgICAgIGNhbmRpZGF0ZVByZWZpeCA9ICIiOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlUHJlZml4ID0gUU5hbWVIZWxwZXIuc3VnZ2VzdFByZWZpeCggdXJpICk7Ci0gICAgICAgICAgICAgICAgY2FuZGlkYXRlUHJlZml4ID0gYmFzZVByZWZpeDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDEgOyA7IGkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAodHJ5UHJlZml4KCBjYW5kaWRhdGVQcmVmaXggKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlUHJlZml4ID0gYmFzZVByZWZpeCArIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IGNhbmRpZGF0ZVByZWZpeCAhPSBudWxsOwotCi0gICAgICAgIHN5bnRoZXRpY05hbWVzcGFjZSggY2FuZGlkYXRlUHJlZml4LCB1cmksIGNvbnNpZGVyQ3JlYXRpbmdEZWZhdWx0ICk7Ci0KLSAgICAgICAgYWRkTWFwcGluZyggY2FuZGlkYXRlUHJlZml4LCB1cmkgKTsKLQotICAgICAgICByZXR1cm4gY2FuZGlkYXRlUHJlZml4OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZmluZF9wcmVmaXhfZm9yX25zdXJpICggU3RyaW5nIHVyaSwgU3RyaW5nIHByZWZpeCApCi0gICAgewotICAgICAgICBhc3NlcnQgdXJpICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCBwcmVmaXggPT0gbnVsbCB8fCBwcmVmaXgubGVuZ3RoKCkgPiAwOwotCi0gICAgICAgIGJvb2xlYW4gZW1wdHlVcmkgPSB1cmkubGVuZ3RoKCkgPT0gMDsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBlbnN1cmVNYXBwaW5nKCB1cmksIHByZWZpeCwgZW1wdHlVcmksICFlbXB0eVVyaSApOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZXNwYWNlRm9yUHJlZml4ICggU3RyaW5nIHByZWZpeCApCi0gICAgewotICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4LmVxdWFscyggInhtbCIgKSkKLSAgICAgICAgICAgIHJldHVybiBTcGxheS5feG1sMTk5OFVyaTsKLQotICAgICAgICByZXR1cm4gKFN0cmluZykgX3ByZWZpeE1hcC5nZXQoIHByZWZpeCApOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZW5zdXJlRnJhZ21lbnROYW1lc3BhY2UgKCApCi0gICAgewotICAgICAgICBpZiAoX2ZyYWdtZW50LmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZW5zdXJlTWFwcGluZyggX2ZyYWdtZW50LmdldE5hbWVzcGFjZVVSSSgpLCAiZnJhZyIsIGZhbHNlLCBmYWxzZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgU2F2ZXIgd2hpY2ggcmVjb3JkcyBzeW50aGV0aWMgbmFtZXNwYWNlcwotICAgICAqLwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBTeW50aE5hbWVzcGFjZVNhdmVyIGV4dGVuZHMgU2F2ZXIKLSAgICB7Ci0gICAgICAgIExpbmtlZEhhc2hNYXAgX3N5bnRoTmFtZXNwYWNlcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIAotICAgICAgICBTeW50aE5hbWVzcGFjZVNhdmVyICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIHIsIHMsIHAsIG9wdGlvbnMgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgc3ludGhldGljTmFtZXNwYWNlICgKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIGJvb2xlYW4gY29uc2lkZXJDcmVhdGluZ0RlZmF1bHQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfc3ludGhOYW1lc3BhY2VzLnB1dCggdXJpLCBjb25zaWRlckNyZWF0aW5nRGVmYXVsdCA/ICJ1c2VEZWZhdWx0IiA6IG51bGwgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFhtbG5zRnJhZ21lbnQgKCBTcGxheSBzICkgeyB9Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRBdHRyRnJhZ21lbnQgKCBTcGxheSBzICkgeyB9Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0RnJhZ21lbnQgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApIHsgfQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29tbWVudEZyYWdtZW50ICggU3BsYXkgcyApIHsgfQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0UHJvY2luc3RGcmFnbWVudCAoIFNwbGF5IHMgKSB7IH0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbW1lbnQgKCBTcGxheSBzICkgeyB9Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0QWZ0ZXIgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApIHsgfQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RW5kICggU3BsYXkgcywgUU5hbWUgbmFtZSApIHsgfQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0UHJvY2luc3QgKCBTcGxheSBzICkgeyB9Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb250YWluZXIgKCBDb250YWluZXIgYywgUU5hbWUgbmFtZSApIHsgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdERvY1R5cGUoCi0gICAgICAgICAgICBTdHJpbmcgZG9jdHlwZU5hbWUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEICkgeyB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBTYXZlciB3aGljaCBnZW5lcmF0ZXMgY2hhcmFjdGVycy4KLSAgICAgKi8KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXh0U2F2ZXIgZXh0ZW5kcyBTYXZlcgotICAgIHsKLSAgICAgICAgVGV4dFNhdmVyICgKLSAgICAgICAgICAgIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIFhtbE9wdGlvbnMgb3B0aW9ucywgU3RyaW5nIGVuY29kaW5nICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIHIsIHMsIHAsIG9wdGlvbnMgKTsKLQotICAgICAgICAgICAgX3dhbnRGcmFnVGVzdCA9IHRydWU7Ci0KLSAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gci5fcHJvcHMuZ2V0VmVyc2lvbigpOwotCi0gICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9ICIxLjAiOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGVtaXQoICI8P3htbCB2ZXJzaW9uPVwiIiApOwotICAgICAgICAgICAgICAgIGVtaXQoIHZlcnNpb24gKTsKLSAgICAgICAgICAgICAgICBlbWl0KCAiXCIgZW5jb2Rpbmc9XCIiICsgZW5jb2RpbmcgKyAiXCI/PiIgKyBfbmV3TGluZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbnRhaW5lciAoIENvbnRhaW5lciBjLCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGMuaXNCZWdpbigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXRDb250YWluZXJIZWxwZXIoIGMsIG5hbWUsIG51bGwsIG51bGwsIGZhbHNlICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYy5pc0xlYWYoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjY2ggPSBfdGV4dCA9PSBudWxsID8gYy5nZXRDY2hWYWx1ZSgpIDogX3RleHQubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNjaCA+IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoICc+JyApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KCBnZXRSb290KCkuZ2V0Q3AoIGMgKSwgY2NoICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdCggX3RleHQgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpemVDb250ZW50KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoICI8LyIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXROYW1lKCBuYW1lICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdCggJy8nICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCAhYy5pc0xlYWYoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYy5nZXRDY2hBZnRlcigpID09IDAgJiYgYy5uZXh0Tm9uQXR0clNwbGF5KCkuaXNFbmQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdCggJy8nICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfc2tpcENvbnRhaW5lckZpbmlzaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbWl0KCAnPicgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgYy5pc0RvYygpOwotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZW1pdENvbnRhaW5lckhlbHBlciggYywgbmFtZSwgbnVsbCwgbnVsbCwgdHJ1ZSApOwotCi0gICAgICAgICAgICAgICAgaWYgKF90ZXh0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGVtaXQoIGdldFJvb3QoKS5nZXRDcCggYyApLCBjLmdldENjaCgpICk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBlbWl0KCBfdGV4dCApOwotCi0gICAgICAgICAgICAgICAgZW50aXRpemVDb250ZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW1pdEF0dHJIZWxwZXIgKCBTcGxheSBzLCBTdHJpbmcgaW52YWxpZFZhbHVlICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IHMuaXNOb3JtYWxBdHRyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGVtaXQoICcgJyApOwotICAgICAgICAgICAgZW1pdE5hbWUoIHMuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICBlbWl0KCAiPVwiIiApOwotCi0gICAgICAgICAgICBpZiAoaW52YWxpZFZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZW1pdCggaW52YWxpZFZhbHVlICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZW1pdCggZ2V0Um9vdCgpLmdldENwKCBzICksIHMuZ2V0Q2NoKCkgKTsKLQotICAgICAgICAgICAgZW50aXRpemVBdHRyVmFsdWUoKTsKLQotICAgICAgICAgICAgZW1pdCggJyInICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW1pdE5hbWVzcGFjZXNIZWxwZXIgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIGl0ZXJhdGVNYXBwaW5ncygpIDsgaGFzTWFwcGluZygpIDsgbmV4dE1hcHBpbmcoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdCggJyAnICk7Ci0gICAgICAgICAgICAgICAgZW1pdFhtbG5zKCBtYXBwaW5nUHJlZml4KCksIG1hcHBpbmdVcmkoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbWl0Q29udGFpbmVySGVscGVyICgKLSAgICAgICAgICAgIENvbnRhaW5lciBjLCBRTmFtZSBuYW1lLAotICAgICAgICAgICAgU3BsYXkgZXh0cmFBdHRyLCBTdHJpbmdCdWZmZXIgZXh0cmFBdHRyVGV4dCwKLSAgICAgICAgICAgIGJvb2xlYW4gY2xvc2UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsOwotCi0gICAgICAgICAgICBlbWl0KCAnPCcgKTsKLSAgICAgICAgICAgIGVtaXROYW1lKCBuYW1lICk7Ci0KLSAgICAgICAgICAgIGlmIChfc2F2ZU5hbWVzcGFjZXNGaXJzdCkKLSAgICAgICAgICAgICAgICBlbWl0TmFtZXNwYWNlc0hlbHBlcigpOwotCi0gICAgICAgICAgICBpZiAoYyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoIEl0ZXJhdG9yIGkgPSBfYXR0cnMua2V5U2V0KCkuaXRlcmF0b3IoKSA7IGkuaGFzTmV4dCgpIDsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3BsYXkgcyA9IChTcGxheSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXRBdHRySGVscGVyKCBzLCAoU3RyaW5nKSBfYXR0cnMuZ2V0KCBzICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChleHRyYUF0dHIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0QXR0ckhlbHBlcigKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyLAotICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJUZXh0ID09IG51bGwgPyBudWxsIDogZXh0cmFBdHRyVGV4dC50b1N0cmluZygpICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghX3NhdmVOYW1lc3BhY2VzRmlyc3QpCi0gICAgICAgICAgICAgICAgZW1pdE5hbWVzcGFjZXNIZWxwZXIoKTsKLQotICAgICAgICAgICAgaWYgKGNsb3NlKQotICAgICAgICAgICAgICAgIGVtaXQoICc+JyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHQgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXQoIHMuZ2V0Q3BGb3JQb3MoIGdldFJvb3QoKSwgcCApLCBjY2ggKTsKLSAgICAgICAgICAgIGVudGl0aXplQ29udGVudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHRBZnRlciAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF90ZXh0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgZW1pdFRleHQoIHMsIHAsIGNjaCApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXQoIF90ZXh0ICk7Ci0gICAgICAgICAgICAgICAgZW50aXRpemVDb250ZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0VGV4dEZyYWdtZW50ICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBudWxsLCBfZnJhZ21lbnQsIG51bGwsIG51bGwsIGZhbHNlICk7Ci0KLSAgICAgICAgICAgIGlmIChfdGV4dCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfdGV4dC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbWl0KCAiPiIgKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCggX3RleHQgKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdEVuZEhlbHBlciggX2ZyYWdtZW50ICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNjaCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbWl0KCAiPiIgKTsKLSAgICAgICAgICAgICAgICAgICAgZW1pdFRleHQoIHMsIHAsIGNjaCApOwotICAgICAgICAgICAgICAgICAgICBlbWl0RW5kSGVscGVyKCBfZnJhZ21lbnQgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZW1pdCggIi8+IiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEF0dHJGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBudWxsLCBfZnJhZ21lbnQsIHMsIF90ZXh0LCBmYWxzZSApOwotICAgICAgICAgICAgZW1pdCggIi8+IiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFhtbG5zRnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdENvbnRhaW5lckhlbHBlciggbnVsbCwgX2ZyYWdtZW50LCBudWxsLCBudWxsLCBmYWxzZSApOwotICAgICAgICAgICAgZW1pdCggIi8+IiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbW1lbnRGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBudWxsLCBfZnJhZ21lbnQsIG51bGwsIG51bGwsIHRydWUgKTsKLSAgICAgICAgICAgIGVtaXRDb21tZW50KCBzICk7Ci0gICAgICAgICAgICBlbWl0RW5kSGVscGVyKCBfZnJhZ21lbnQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRQcm9jaW5zdEZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRDb250YWluZXJIZWxwZXIoIG51bGwsIF9mcmFnbWVudCwgbnVsbCwgbnVsbCwgdHJ1ZSApOwotICAgICAgICAgICAgZW1pdFByb2NpbnN0KCBzICk7Ci0gICAgICAgICAgICBlbWl0RW5kSGVscGVyKCBfZnJhZ21lbnQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRYbWxucyAoIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcHJlZml4ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgdXJpICE9IG51bGw7Ci0KLSAgICAgICAgICAgIGVtaXQoICJ4bWxucyIgKTsKLQotICAgICAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdCggIjoiICk7Ci0gICAgICAgICAgICAgICAgZW1pdCggcHJlZml4ICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVtaXQoICI9XCIiICk7Ci0KLSAgICAgICAgICAgIC8vIFRPRE8gLSBtdXN0IGVuY29kZSB1cmkgcHJvcGVybHkKLQotICAgICAgICAgICAgZW1pdCggdXJpICk7Ci0gICAgICAgICAgICBlbnRpdGl6ZUF0dHJWYWx1ZSgpOwotCi0gICAgICAgICAgICBlbWl0KCAnIicgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRFbmRIZWxwZXIgKCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdCggIjwvIiApOwotICAgICAgICAgICAgZW1pdE5hbWUoIG5hbWUgKTsKLSAgICAgICAgICAgIGVtaXQoICc+JyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEVuZCAoIFNwbGF5IHMsIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGVtaXRFbmRIZWxwZXIoIG5hbWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbWl0TGl0ZXJhbCAoIFN0cmluZyBsaXRlcmFsICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGxpdGVyYWwuaW5kZXhPZiggIlwiIiApIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0KCAiXCIiICk7Ci0gICAgICAgICAgICAgICAgZW1pdCggbGl0ZXJhbCApOwotICAgICAgICAgICAgICAgIGVtaXQoICJcIiIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0KCAiJyIgKTsKLSAgICAgICAgICAgICAgICBlbWl0KCBsaXRlcmFsICk7Ci0gICAgICAgICAgICAgICAgZW1pdCggIiciICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RG9jVHlwZSgKLSAgICAgICAgICAgIFN0cmluZyBkb2N0eXBlTmFtZSwgU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgZG9jdHlwZU5hbWUgIT0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZW1pdCggIjwhRE9DVFlQRSAiICk7Ci0gICAgICAgICAgICBlbWl0KCBkb2N0eXBlTmFtZSApOwotCi0gICAgICAgICAgICBpZiAocHVibGljSUQgPT0gbnVsbCAmJiBzeXN0ZW1JRCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXQoICIgU1lTVEVNICIgKTsKLSAgICAgICAgICAgICAgICBlbWl0TGl0ZXJhbCggc3lzdGVtSUQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHB1YmxpY0lEICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdCggIiBQVUJMSUMgIiApOwotICAgICAgICAgICAgICAgIGVtaXRMaXRlcmFsKCBwdWJsaWNJRCApOwotICAgICAgICAgICAgICAgIGVtaXQoICIgIiApOwotICAgICAgICAgICAgICAgIGVtaXRMaXRlcmFsKCBzeXN0ZW1JRCApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbWl0KCAiPiIgKyBfbmV3TGluZSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29tbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcy5pc0NvbW1lbnQoKTsKLSAgICAgICAgICAgIGVtaXQoICI8IS0tIiApOwotICAgICAgICAgICAgZW1pdCggZ2V0Um9vdCgpLmdldENwKCBzICksIHMuZ2V0Q2NoVmFsdWUoKSApOwotICAgICAgICAgICAgZW50aXRpemVDb21tZW50KCk7Ci0gICAgICAgICAgICBlbWl0KCAiLS0+IiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFByb2NpbnN0ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBzLmlzUHJvY2luc3QoKTsKLSAgICAgICAgICAgIGVtaXQoICI8PyIgKTsKLSAgICAgICAgICAgIC8vIFRPRE8gLSBlbmNvZGluZyBpc3N1ZXMgaGVyZT8KLSAgICAgICAgICAgIGVtaXQoIHMuZ2V0TG9jYWwoKSApOwotCi0gICAgICAgICAgICBpZiAocy5nZXRDY2hWYWx1ZSgpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbWl0KCAiICIgKTsKLSAgICAgICAgICAgICAgICBlbWl0KCBnZXRSb290KCkuZ2V0Q3AoIHMgKSwgcy5nZXRDY2hWYWx1ZSgpICk7Ci0gICAgICAgICAgICAgICAgZW50aXRpemVQcm9jaW5zdCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbWl0KCAiPz4iICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRW5zdXJlIHRoYXQgdGhlcmUgYXJlIGF0IGxlYXN0IGNjaCBjaGFycyBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlci4KLSAgICAgICAgICogUmV0dXJuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYXZhaWxhYmxlLiAgSWYgbGVzcyB0aGFuIGNjaCwKLSAgICAgICAgICogdGhlbiB0aGF0J3MgYWxsIHdoaWNoIHdpbGwgZXZlciBiZWNvbWUgYXZhaWxhYmxlLgotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIGludCBlbnN1cmUgKCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gRXZlbiBpZiB3ZSdyZSBhc2tlZCB0byBlbnN1cmUgbm90aGluZywgc3RpbGwgdHJ5IHRvIGVuc3VyZQotICAgICAgICAgICAgLy8gYXRsZWFzdCBvbmUgY2hhcmFjdGVyIHNvIHdlIGNhbiBkZXRlcm1pbmUgaWYgd2UncmUgYXQgdGhlCi0gICAgICAgICAgICAvLyBlbmQgb2YgdGhlIHN0cmVhbS4KLQotICAgICAgICAgICAgaWYgKGNjaCA8PSAwKQotICAgICAgICAgICAgICAgIGNjaCA9IDE7Ci0KLSAgICAgICAgICAgIGludCBhdmFpbGFibGUgPSBnZXRBdmFpbGFibGUoKTsKLQotICAgICAgICAgICAgZm9yICggOyBhdmFpbGFibGUgPCBjY2ggOyBhdmFpbGFibGUgPSBnZXRBdmFpbGFibGUoKSApCi0gICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzKCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBhc3NlcnQgYXZhaWxhYmxlID09IGdldEF2YWlsYWJsZSgpOwotCi0gICAgICAgICAgICBpZiAoYXZhaWxhYmxlID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAgIHJldHVybiBhdmFpbGFibGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW1pdE5hbWUgKCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbDsKLQotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydCB1cmkgIT0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKHVyaS5sZW5ndGgoKSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRVcmlNYXBwaW5nKCB1cmkgKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdCggcHJlZml4ICk7Ci0gICAgICAgICAgICAgICAgICAgIGVtaXQoICI6IiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXNzZXJ0IG5hbWUuZ2V0TG9jYWxQYXJ0KCkubGVuZ3RoKCkgPiAwOwotCi0gICAgICAgICAgICBlbWl0KCBuYW1lLmdldExvY2FsUGFydCgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcHJlRW1pdCAoIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgY2NoID49IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF9sYXN0RW1pdENjaCA9IGNjaDsKLQotICAgICAgICAgICAgaWYgKGNjaCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBpZiAoX2ZyZWUgPCBjY2gpCi0gICAgICAgICAgICAgICAgcmVzaXplKCBjY2gsIC0xICk7Ci0KLSAgICAgICAgICAgIGFzc2VydCBjY2ggPD0gX2ZyZWU7Ci0KLSAgICAgICAgICAgIGludCB1c2VkID0gZ2V0QXZhaWxhYmxlKCk7Ci0KLSAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBhYm91dCB0byBlbWl0IGFuZCB0aGVyZSBpcyBub3RpbmcgaW4gdGhlIGJ1ZmZlciwgcmVzZXQKLSAgICAgICAgICAgIC8vIHRoZSBidWZmZXIgdG8gYmUgYXQgdGhlIGJlZ2lubmluZyBzbyBhcyB0byBub3QgZ3JvdyBpdCBhbnltb3JlCi0gICAgICAgICAgICAvLyB0aGFuIG5lZWRlZC4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHVzZWQgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgX2luID09IF9vdXQ7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID09IF9idWYubGVuZ3RoOwotICAgICAgICAgICAgICAgIF9pbiA9IF9vdXQgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBfbGFzdEVtaXRJbiA9IF9pbjsKLQotICAgICAgICAgICAgX2ZyZWUgLT0gY2NoOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPj0gMDsKLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXQgKCBTdHJpbmcgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjY2ggPSBzID09IG51bGwgPyAwIDogcy5sZW5ndGgoKTsKLQotICAgICAgICAgICAgaWYgKHByZUVtaXQoIGNjaCApKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaW50IGNodW5rOwotCi0gICAgICAgICAgICBpZiAoX2luIDw9IF9vdXQgfHwgY2NoIDwgKGNodW5rID0gX2J1Zi5sZW5ndGggLSBfaW4pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHMuZ2V0Q2hhcnMoIDAsIGNjaCwgX2J1ZiwgX2luICk7Ci0gICAgICAgICAgICAgICAgX2luICs9IGNjaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzLmdldENoYXJzKCAwLCBjaHVuaywgX2J1ZiwgX2luICk7Ci0gICAgICAgICAgICAgICAgcy5nZXRDaGFycyggY2h1bmssIGNjaCwgX2J1ZiwgMCApOwotICAgICAgICAgICAgICAgIF9pbiA9IChfaW4gKyBjY2gpICUgX2J1Zi5sZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW1pdCAoIFN0cmluZ0J1ZmZlciBzYiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjY2ggPSBzYiA9PSBudWxsID8gMCA6IHNiLmxlbmd0aCgpOwotCi0gICAgICAgICAgICBpZiAocHJlRW1pdCggY2NoICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpbnQgY2h1bms7Ci0KLSAgICAgICAgICAgIGlmIChfaW4gPD0gX291dCB8fCBjY2ggPCAoY2h1bmsgPSBfYnVmLmxlbmd0aCAtIF9pbikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuZ2V0Q2hhcnMoIDAsIGNjaCwgX2J1ZiwgX2luICk7Ci0gICAgICAgICAgICAgICAgX2luICs9IGNjaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5nZXRDaGFycyggMCwgY2h1bmssIF9idWYsIF9pbiApOwotICAgICAgICAgICAgICAgIHNiLmdldENoYXJzKCBjaHVuaywgY2NoLCBfYnVmLCAwICk7Ci0gICAgICAgICAgICAgICAgX2luID0gKF9pbiArIGNjaCkgJSBfYnVmLmxlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbWl0ICggaW50IGNwLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdCgKLSAgICAgICAgICAgICAgICBnZXRSb290KCkuX3RleHQuX2J1ZiwKLSAgICAgICAgICAgICAgICBnZXRSb290KCkuX3RleHQudW5PYnNjdXJlKCBjcCwgY2NoICksCi0gICAgICAgICAgICAgICAgY2NoICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW1pdCAoIGNoYXIgY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmVFbWl0KCAxICk7Ci0KLSAgICAgICAgICAgIF9idWZbIF9pbiBdID0gY2g7Ci0KLSAgICAgICAgICAgIF9pbiA9IChfaW4gKyAxKSAlIF9idWYubGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXQgKCBjaGFyW10gYnVmLCBpbnQgb2ZmLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGNjaCA+PSAwOwotCi0gICAgICAgICAgICBpZiAocHJlRW1pdCggY2NoICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpbnQgY2h1bms7Ci0KLSAgICAgICAgICAgIGlmIChfaW4gPD0gX291dCB8fCBjY2ggPCAoY2h1bmsgPSBfYnVmLmxlbmd0aCAtIF9pbikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggYnVmLCBvZmYsIF9idWYsIF9pbiwgY2NoICk7Ci0gICAgICAgICAgICAgICAgX2luICs9IGNjaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBidWYsIG9mZiwgX2J1ZiwgX2luLCBjaHVuayApOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIGJ1Ziwgb2ZmICsgY2h1bmssIF9idWYsIDAsIGNjaCAtIGNodW5rICk7Ci0gICAgICAgICAgICAgICAgX2luID0gKF9pbiArIGNjaCkgJSBfYnVmLmxlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbnRpdGl6ZUNvbnRlbnQgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbGFzdEVtaXRDY2ggPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGludCBpID0gX2xhc3RFbWl0SW47Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbiA9IF9idWYubGVuZ3RoOwotCi0gICAgICAgICAgICBib29sZWFuIGhhc091dE9mUmFuZ2UgPSBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIGZvciAoIGludCBjY2ggPSBfbGFzdEVtaXRDY2ggOyBjY2ggPiAwIDsgY2NoLS0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBfYnVmWyBpIF07Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJzwnIHx8IGNoID09ICcmJykKLSAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0JhZENoYXIoIGNoICkpCi0gICAgICAgICAgICAgICAgICAgIGhhc091dE9mUmFuZ2UgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgaWYgKCsraSA9PSBuKQotICAgICAgICAgICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNvdW50ID09IDAgJiYgIWhhc091dE9mUmFuZ2UpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpID0gX2xhc3RFbWl0SW47Ci0KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBIZXVyaXN0aWMgZm9yIGtub3dpbmcgd2hlbiB0byBzYXZlIG91dCBzdHVmZiBhcyBhIENEQVRBLgotICAgICAgICAgICAgLy8KLQotICAgICAgICAgICAgaWYgKF9sYXN0RW1pdENjaCA+IDMyICYmIGNvdW50ID4gNSAmJgotICAgICAgICAgICAgICAgICAgY291bnQgKiAxMDAgLyBfbGFzdEVtaXRDY2ggPiAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gbGFzdFdhc0JyYWNrZXQgPSBfYnVmWyBpIF0gPT0gJ10nOwotCi0gICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIGksICI8IVtDREFUQVsiICsgX2J1ZlsgaSBdICk7Ci0KLSAgICAgICAgICAgICAgICBib29sZWFuIHNlY29uZFRvTGFzdFdhc0JyYWNrZXQgPSBsYXN0V2FzQnJhY2tldDsKLQotICAgICAgICAgICAgICAgIGxhc3RXYXNCcmFja2V0ID0gX2J1ZlsgaSBdID09ICddJzsKLQotICAgICAgICAgICAgICAgIGlmICgrK2kgPT0gbikKLSAgICAgICAgICAgICAgICAgICAgaSA9IDA7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgY2NoID0gX2xhc3RFbWl0Q2NoIDsgY2NoID4gMCA7IGNjaC0tICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBfYnVmWyBpIF07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICc+JyAmJiBzZWNvbmRUb0xhc3RXYXNCcmFja2V0ICYmIGxhc3RXYXNCcmFja2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIGksICImZ3Q7IiApOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0JhZENoYXIoIGNoICkpCi0gICAgICAgICAgICAgICAgICAgICAgICBpID0gcmVwbGFjZSggaSwgIj8iICk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLQotICAgICAgICAgICAgICAgICAgICBzZWNvbmRUb0xhc3RXYXNCcmFja2V0ID0gbGFzdFdhc0JyYWNrZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RXYXNCcmFja2V0ID0gY2ggPT0gJ10nOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpID09IG4pCi0gICAgICAgICAgICAgICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbWl0KCAiXV0+IiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoIGludCBjY2ggPSBfbGFzdEVtaXRDY2ggOyBjY2ggPiAwIDsgY2NoLS0gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IF9idWZbIGkgXTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJzwnKQotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIGksICImbHQ7IiApOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnJicpCi0gICAgICAgICAgICAgICAgICAgICAgICBpID0gcmVwbGFjZSggaSwgIiZhbXA7IiApOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0JhZENoYXIoIGNoICkpCi0gICAgICAgICAgICAgICAgICAgICAgICBpID0gcmVwbGFjZSggaSwgIj8iICk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBuKQotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVudGl0aXplQXR0clZhbHVlICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2xhc3RFbWl0Q2NoID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpbnQgaSA9IF9sYXN0RW1pdEluOwotICAgICAgICAgICAgZmluYWwgaW50IG4gPSBfYnVmLmxlbmd0aDsKLQotICAgICAgICAgICAgZm9yICggaW50IGNjaCA9IF9sYXN0RW1pdENjaCA7IGNjaCA+IDAgOyBjY2gtLSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBjaCA9IF9idWZbIGkgXTsKLQotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPCcpCi0gICAgICAgICAgICAgICAgICAgIGkgPSByZXBsYWNlKCBpLCAiJmx0OyIgKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnJicpCi0gICAgICAgICAgICAgICAgICAgIGkgPSByZXBsYWNlKCBpLCAiJmFtcDsiICk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJyInKQotICAgICAgICAgICAgICAgICAgICBpID0gcmVwbGFjZSggaSwgIiZxdW90OyIgKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLQotICAgICAgICAgICAgICAgIGlmIChpID09IG4pCi0gICAgICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVudGl0aXplQ29tbWVudCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9sYXN0RW1pdENjaCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaW50IGkgPSBfbGFzdEVtaXRJbjsKLSAgICAgICAgICAgIGZpbmFsIGludCBuID0gX2J1Zi5sZW5ndGg7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gbGFzdFdhc0Rhc2ggPSBmYWxzZTsKLQotICAgICAgICAgICAgZm9yICggaW50IGNjaCA9IF9sYXN0RW1pdENjaCA7IGNjaCA+IDAgOyBjY2gtLSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBjaCA9IF9idWZbIGkgXTsKLQotICAgICAgICAgICAgICAgIGlmIChpc0JhZENoYXIoIGNoICkpCi0gICAgICAgICAgICAgICAgICAgIGkgPSByZXBsYWNlKCBpLCAiPyIgKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnLScpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFdhc0Rhc2gpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgIi0tIiB3aXRoICItICIgdG8gbWFrZSB3ZWxsIGZvcm1lZAotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIGksICIgIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFdhc0Rhc2ggPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXYXNEYXNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsYXN0V2FzRGFzaCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGkgPT0gbikKLSAgICAgICAgICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEJlY2F1c2UgSSBoYXZlIG9ubHkgcmVwbGFjZWQgY2hhcnMgd2l0aCBzaW5nbGUgY2hhcnMsCi0gICAgICAgICAgICAvLyBfbGFzdEVtaXRJbiB3aWxsIHN0aWxsIGJlIG9rCi0KLSAgICAgICAgICAgIGlmIChfYnVmWyBfbGFzdEVtaXRJbiArIF9sYXN0RW1pdENjaCAtIDEgXSA9PSAnLScpCi0gICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIF9sYXN0RW1pdEluICsgX2xhc3RFbWl0Q2NoIC0gMSwgIiAiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW50aXRpemVQcm9jaW5zdCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9sYXN0RW1pdENjaCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaW50IGkgPSBfbGFzdEVtaXRJbjsKLSAgICAgICAgICAgIGZpbmFsIGludCBuID0gX2J1Zi5sZW5ndGg7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gbGFzdFdhc1F1ZXN0aW9uID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGZvciAoIGludCBjY2ggPSBfbGFzdEVtaXRDY2ggOyBjY2ggPiAwIDsgY2NoLS0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBfYnVmWyBpIF07Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNCYWRDaGFyKCBjaCApKQotICAgICAgICAgICAgICAgICAgICBpID0gcmVwbGFjZSggaSwgIj8iICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJz4nKQotICAgICAgICAgICAgICAgIHsKLSAgICAvLyBUT0RPIC0gSGFkIHRvIGNvbnZlcnQgdG8gYSBzcGFjZSBoZXJlIC4uLiBpbXBsZXMgbm90IHdlbGwgZm9ybWVkIFhNTAotICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFdhc1F1ZXN0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIGksICIgIiApOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0KLSAgICAgICAgICAgICAgICAgICAgbGFzdFdhc1F1ZXN0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RXYXNRdWVzdGlvbiA9IGNoID09ICc/JzsKLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpID09IG4pCi0gICAgICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGVzdCBpZiBhIGNoYXJhY3RlciBpcyB2YWxpZCBpbiB4bWwgY2hhcmFjdGVyIGNvbnRlbnQuIFNlZQotICAgICAgICAgKiBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sI05ULUNoYXIKLSAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNCYWRDaGFyICggY2hhciBjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAhICgKLSAgICAgICAgICAgICAgICAoY2ggPj0gMHgyMCAmJiBjaCA8PSAweEQ3RkYgKSB8fAotICAgICAgICAgICAgICAgIChjaCA+PSAweEUwMDAgJiYgY2ggPD0gMHhGRkZEKSB8fAotICAgICAgICAgICAgICAgIChjaCA+PSAweDEwMDAwICYmIGNoIDw9IDB4MTBGRkZGKSB8fAotICAgICAgICAgICAgICAgIChjaCA9PSAweDkpIHx8IChjaCA9PSAweEEpIHx8IChjaCA9PSAweEQpCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IHJlcGxhY2UgKCBpbnQgaSwgU3RyaW5nIHJlcGxhY2VtZW50ICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IHJlcGxhY2VtZW50Lmxlbmd0aCgpID4gMDsKLQotICAgICAgICAgICAgaW50IGRDY2ggPSByZXBsYWNlbWVudC5sZW5ndGgoKSAtIDE7Ci0KLSAgICAgICAgICAgIGlmIChkQ2NoID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2J1ZlsgaSBdID0gcmVwbGFjZW1lbnQuY2hhckF0KCAwICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGkgKyAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPj0gMDsKLQotICAgICAgICAgICAgaWYgKGRDY2ggPiBfZnJlZSkKLSAgICAgICAgICAgICAgICBpID0gcmVzaXplKCBkQ2NoLCBpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydCBfZnJlZSA+PSAwOwotCi0gICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPj0gZENjaDsKLSAgICAgICAgICAgIGFzc2VydCBnZXRBdmFpbGFibGUoKSA+IDA7Ci0KLSAgICAgICAgICAgIGlmIChfb3V0ID4gX2luICYmIGkgPj0gX291dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCBfb3V0LCBfYnVmLCBfb3V0IC0gZENjaCwgaSAtIF9vdXQgKTsKLSAgICAgICAgICAgICAgICBfb3V0IC09IGRDY2g7Ci0gICAgICAgICAgICAgICAgaSAtPSBkQ2NoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBpIDwgX2luOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIGksIF9idWYsIGkgKyBkQ2NoLCBfaW4gLSBpICk7Ci0gICAgICAgICAgICAgICAgX2luICs9IGRDY2g7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlcGxhY2VtZW50LmdldENoYXJzKCAwLCBkQ2NoICsgMSwgX2J1ZiwgaSApOwotCi0gICAgICAgICAgICBfZnJlZSAtPSBkQ2NoOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPj0gMDsKLQotICAgICAgICAgICAgcmV0dXJuIGkgKyBkQ2NoICsgMTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRBdmFpbGFibGUgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfYnVmID09IG51bGwgPyAwIDogX2J1Zi5sZW5ndGggLSBfZnJlZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHJvb20gZm9yIGNjaCBjaGFycyBpbiB0aGUgYnVmZmVyCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgaW50IHJlc2l6ZSAoIGludCBjY2gsIGludCBpICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID49IDA7Ci0gICAgICAgICAgICBhc3NlcnQgY2NoID4gMDsKLSAgICAgICAgICAgIGFzc2VydCBjY2ggPiBfZnJlZTsKLQotICAgICAgICAgICAgaW50IG5ld0xlbiA9IF9idWYgPT0gbnVsbCA/IF9pbml0aWFsQnVmU2l6ZSA6IF9idWYubGVuZ3RoICogMjsKLSAgICAgICAgICAgIGludCB1c2VkID0gZ2V0QXZhaWxhYmxlKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlICggbmV3TGVuIC0gdXNlZCA8IGNjaCApCi0gICAgICAgICAgICAgICAgbmV3TGVuICo9IDI7Ci0KLSAgICAgICAgICAgIGNoYXJbXSBuZXdCdWYgPSBuZXcgY2hhciBbIG5ld0xlbiBdOwotCi0gICAgICAgICAgICBpZiAodXNlZCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9pbiA+IF9vdXQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgaSA9PSAtMSB8fCAoaSA+PSBfb3V0ICYmIGkgPCBfaW4pOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCBfb3V0LCBuZXdCdWYsIDAsIHVzZWQgKTsKLSAgICAgICAgICAgICAgICAgICAgaSAtPSBfb3V0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgaSA9PSAtMSB8fCAoaSA+PSBfb3V0IHx8IGkgPCBfaW4pOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCBfb3V0LCBuZXdCdWYsIDAsIHVzZWQgLSBfaW4gKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgMCwgbmV3QnVmLCB1c2VkIC0gX2luLCBfaW4gKTsKLSAgICAgICAgICAgICAgICAgICAgaSA9IGkgPj0gX291dCA/IGkgLSBfb3V0IDogaSArIF9vdXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIF9vdXQgPSAwOwotICAgICAgICAgICAgICAgIF9pbiA9IHVzZWQ7Ci0gICAgICAgICAgICAgICAgX2ZyZWUgKz0gbmV3QnVmLmxlbmd0aCAtIF9idWYubGVuZ3RoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9mcmVlICs9IG5ld0J1Zi5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IF9pbiA9PSAwICYmIF9vdXQgPT0gMDsKLSAgICAgICAgICAgICAgICBhc3NlcnQgaSA9PSAtMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgX2J1ZiA9IG5ld0J1ZjsKLQotICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID49IDA7Ci0KLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCByZWFkICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZW5zdXJlKCAxICkgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgICAgIGFzc2VydCBnZXRBdmFpbGFibGUoKSA+IDA7Ci0KLSAgICAgICAgICAgIGludCBjaCA9IF9idWZbIF9vdXQgXTsKLQotICAgICAgICAgICAgX291dCA9IChfb3V0ICsgMSkgJSBfYnVmLmxlbmd0aDsKLSAgICAgICAgICAgIF9mcmVlKys7Ci0KLSAgICAgICAgICAgIHJldHVybiBjaDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZCAoIGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGVuZCBvZiBzdHJlYW0gZXZlbiBpZiB0aGVyZSBpcyBubyB3YXkgdG8gcmV0dXJuCi0gICAgICAgICAgICAvLyBjaGFyYWN0ZXJzIGJlY2F1c2UgdGhlIFJlYWRlciBkb2Mgc2F5cyB0byByZXR1cm4gLTEgYXQgZW5kIG9mCi0gICAgICAgICAgICAvLyBzdHJlYW0uCi0KLSAgICAgICAgICAgIGludCBuOwotCi0gICAgICAgICAgICBpZiAoKG4gPSBlbnN1cmUoIGxlbiApKSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgICAgaWYgKGNidWYgPT0gbnVsbCB8fCBsZW4gPD0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgaWYgKG4gPCBsZW4pCi0gICAgICAgICAgICAgICAgbGVuID0gbjsKLQotICAgICAgICAgICAgaWYgKF9vdXQgPCBfaW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX291dCwgY2J1Ziwgb2ZmLCBsZW4gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgY2h1bmsgPSBfYnVmLmxlbmd0aCAtIF9vdXQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2h1bmsgPj0gbGVuKQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCBfb3V0LCBjYnVmLCBvZmYsIGxlbiApOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIF9vdXQsIGNidWYsIG9mZiwgY2h1bmsgKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgMCwgY2J1Ziwgb2ZmICsgY2h1bmssIGxlbiAtIGNodW5rICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBfb3V0ID0gKF9vdXQgKyBsZW4pICUgX2J1Zi5sZW5ndGg7Ci0gICAgICAgICAgICBfZnJlZSArPSBsZW47Ci0KLSAgICAgICAgICAgIGFzc2VydCBfZnJlZSA+PSAwOwotCi0gICAgICAgICAgICByZXR1cm4gbGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCB3cml0ZSAoIFdyaXRlciB3cml0ZXIsIGludCBjY2hNaW4gKQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoIGdldEF2YWlsYWJsZSgpIDwgY2NoTWluKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghcHJvY2VzcygpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGNoYXJzQXZhaWxhYmxlID0gZ2V0QXZhaWxhYmxlKCk7Ci0KLSAgICAgICAgICAgIGlmIChjaGFyc0F2YWlsYWJsZSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSSBkb24ndCB3YW50IHRvIGRlYWwgd2l0aCB0aGUgY2lyY3VsYXIgY2FzZXMKLQotICAgICAgICAgICAgICAgIGFzc2VydCBfb3V0ID09IDA7Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSggX2J1ZiwgMCwgY2hhcnNBdmFpbGFibGUgKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoICggSU9FeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIF9mcmVlICs9IGNoYXJzQXZhaWxhYmxlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGFzc2VydCBfZnJlZSA+PSAwOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIF9pbiA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBjaGFyc0F2YWlsYWJsZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBFbnN1cmUgYWxsIHRleHQgYW5kIHJldHVybiBpdCBhcyBhIHN0cmluZy4KLSAgICAgICAgICovCi0KLSAgICAgICAgcHVibGljIFN0cmluZyBzYXZlVG9TdHJpbmcgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIGdvbm5hIGJ1aWxkIGEgc3RyaW5nLiAgSW5zdGVhZCBvZiB1c2luZyBTdHJpbmdCdWZmZXIsIG1heQotICAgICAgICAgICAgLy8gYXMgd2VsbCB1c2UgbXkgYnVmZmVyIGhlcmUuICBGaWxsIHRoZSB3aG9sZSBzdWNrZXIgdXAgYW5kCi0gICAgICAgICAgICAvLyBjcmVhdGUgYSBTdHJpbmchCi0KLSAgICAgICAgICAgIHdoaWxlICggcHJvY2VzcygpICkKLSAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgICAgIGFzc2VydCBfb3V0ID09IDA7Ci0KLSAgICAgICAgICAgIGludCBhdmFpbGFibGUgPSBnZXRBdmFpbGFibGUoKTsKLQotICAgICAgICAgICAgcmV0dXJuIGF2YWlsYWJsZSA9PSAwID8gIiIgOiBuZXcgU3RyaW5nKCBfYnVmLCBfb3V0LCBhdmFpbGFibGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfaW5pdGlhbEJ1ZlNpemUgPSA0MDk2OwotCi0gICAgICAgIHByaXZhdGUgaW50IF9sYXN0RW1pdEluOwotICAgICAgICBwcml2YXRlIGludCBfbGFzdEVtaXRDY2g7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgICAgX2ZyZWU7Ci0gICAgICAgIHByaXZhdGUgaW50ICAgIF9pbjsKLSAgICAgICAgcHJpdmF0ZSBpbnQgICAgX291dDsKLSAgICAgICAgcHJpdmF0ZSBjaGFyW10gX2J1ZjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIFJlYWRlciB3aGljaCBleHBvc2VzIHRoZSB0ZXh0IG9mIGEgcGFydCBvZiB0aGUgdHJlZS4KLSAgICAgKi8KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXh0UmVhZGVyIGV4dGVuZHMgUmVhZGVyCi0gICAgewotICAgICAgICBUZXh0UmVhZGVyICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgX3RleHRTYXZlciA9IG5ldyBUZXh0U2F2ZXIoIHIsIHMsIHAsIG9wdGlvbnMsIG51bGwgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlICggKSB0aHJvd3MgSU9FeGNlcHRpb24geyB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVhZHkgKCApIHRocm93cyBJT0V4Y2VwdGlvbiB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICAgICAgcHVibGljIGludCByZWFkICggKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF90ZXh0U2F2ZXIucmVhZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCByZWFkICggY2hhcltdIGNidWYgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF90ZXh0U2F2ZXIucmVhZCggY2J1ZiwgMCwgY2J1ZiA9PSBudWxsID8gMCA6IGNidWYubGVuZ3RoICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHJlYWQgKCBjaGFyW10gY2J1ZiwgaW50IG9mZiwgaW50IGxlbiApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3RleHRTYXZlci5yZWFkKCBjYnVmLCBvZmYsIGxlbiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBUZXh0U2F2ZXIgX3RleHRTYXZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIElucHV0U3RyZWFtU2F2ZXIgZXh0ZW5kcyBJbnB1dFN0cmVhbQotICAgIHsKLSAgICAgICAgSW5wdXRTdHJlYW1TYXZlciAoCi0gICAgICAgICAgICBSb290IHIsIFNwbGF5IHMsIGludCBwLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBvcHRpb25zID0gWG1sT3B0aW9ucy5tYXNrTnVsbChvcHRpb25zKTsKLSAgICAgICAgICAgIF9ieXRlQnVmZmVyID0gbmV3IE91dHB1dFN0cmVhbUltcGwoKTsKLQotICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHIuX3Byb3BzLmdldEVuY29kaW5nKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbmNvZGluZyA9Ci0gICAgICAgICAgICAgICAgICAgIEVuY29kaW5nTWFwLmdldElBTkEySmF2YU1hcHBpbmcoIHIuX3Byb3BzLmdldEVuY29kaW5nKCkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKFhtbE9wdGlvbnMuQ0hBUkFDVEVSX0VOQ09ESU5HKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbmNvZGluZyA9Ci0gICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG9wdGlvbnMuZ2V0KFhtbE9wdGlvbnMuQ0hBUkFDVEVSX0VOQ09ESU5HKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGlhbmFFbmNvZGluZyA9Ci0gICAgICAgICAgICAgICAgICAgIEVuY29kaW5nTWFwLmdldEphdmEySUFOQU1hcHBpbmcoIGVuY29kaW5nICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaWFuYUVuY29kaW5nICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gaWFuYUVuY29kaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBlbmNvZGluZyA9IEVuY29kaW5nTWFwLmdldEphdmEySUFOQU1hcHBpbmcoICJVVEY4IiApOwotCi0gICAgICAgICAgICBTdHJpbmcgamF2YUVuY29kaW5nID0gRW5jb2RpbmdNYXAuZ2V0SUFOQTJKYXZhTWFwcGluZyggZW5jb2RpbmcgKTsKLQotICAgICAgICAgICAgaWYgKGphdmFFbmNvZGluZyA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBlbmNvZGluZzogIiArIGVuY29kaW5nICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jb252ZXJ0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKCBfYnl0ZUJ1ZmZlciwgamF2YUVuY29kaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBfdGV4dFNhdmVyID0gbmV3IFRleHRTYXZlciggciwgcywgcCwgb3B0aW9ucywgZW5jb2RpbmcgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9ieXRlQnVmZmVyLnJlYWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZCAoIGJ5dGVbXSBiYnVmLCBpbnQgb2ZmLCBpbnQgbGVuICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9ieXRlQnVmZmVyLnJlYWQgKCBiYnVmLCBvZmYsIGxlbiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZW5zdXJlICggaW50IGNieXRlICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gRXZlbiBpZiB3ZSdyZSBhc2tlZCB0byBlbnN1cmUgbm90aGluZywgc3RpbGwgdHJ5IHRvIGVuc3VyZQotICAgICAgICAgICAgLy8gYXRsZWFzdCBvbmUgYnl0ZSBzbyB3ZSBjYW4gZGV0ZXJtaW5lIGlmIHdlJ3JlIGF0IHRoZQotICAgICAgICAgICAgLy8gZW5kIG9mIHRoZSBzdHJlYW0uCi0KLSAgICAgICAgICAgIGlmIChjYnl0ZSA8PSAwKQotICAgICAgICAgICAgICAgIGNieXRlID0gMTsKLQotICAgICAgICAgICAgaW50IGJ5dGVzQXZhaWxhYmxlID0gX2J5dGVCdWZmZXIuZ2V0QXZhaWxhYmxlKCk7Ci0KLSAgICAgICAgICAgIGZvciAoIDsgYnl0ZXNBdmFpbGFibGUgPCBjYnl0ZSA7Ci0gICAgICAgICAgICAgICAgICBieXRlc0F2YWlsYWJsZSA9IF9ieXRlQnVmZmVyLmdldEF2YWlsYWJsZSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3RleHRTYXZlci53cml0ZSggX2NvbnZlcnRlciwgMjA0OCApIDwgMjA0OCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ5dGVzQXZhaWxhYmxlID0gX2J5dGVCdWZmZXIuZ2V0QXZhaWxhYmxlKCk7Ci0KLSAgICAgICAgICAgIGlmIChieXRlc0F2YWlsYWJsZSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgICByZXR1cm4gYnl0ZXNBdmFpbGFibGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE91dHB1dFN0cmVhbUltcGwgZXh0ZW5kcyBPdXRwdXRTdHJlYW0KLSAgICAgICAgewotICAgICAgICAgICAgaW50IHJlYWQgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKElucHV0U3RyZWFtU2F2ZXIudGhpcy5lbnN1cmUoIDEgKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgZ2V0QXZhaWxhYmxlKCkgPiAwOwotCi0gICAgICAgICAgICAgICAgaW50IGJpdGUgPSBfYnVmWyBfb3V0IF07Ci0KLSAgICAgICAgICAgICAgICBfb3V0ID0gKF9vdXQgKyAxKSAlIF9idWYubGVuZ3RoOwotICAgICAgICAgICAgICAgIF9mcmVlKys7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gYml0ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHJlYWQgKCBieXRlW10gYmJ1ZiwgaW50IG9mZiwgaW50IGxlbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGVuZCBvZiBzdHJlYW0gZXZlbiBpZiB0aGVyZSBpcyBubyB3YXkgdG8gcmV0dXJuCi0gICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVycyBiZWNhdXNlIHRoZSBSZWFkZXIgZG9jIHNheXMgdG8gcmV0dXJuIC0xIGF0IGVuZCBvZgotICAgICAgICAgICAgICAgIC8vIHN0cmVhbS4KLQotICAgICAgICAgICAgICAgIGludCBuOwotCi0gICAgICAgICAgICAgICAgaWYgKChuID0gZW5zdXJlKCBsZW4gKSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgICAgICAgaWYgKGJidWYgPT0gbnVsbCB8fCBsZW4gPD0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAgICAgICBpZiAobiA8IGxlbikKLSAgICAgICAgICAgICAgICAgICAgbGVuID0gbjsKLQotICAgICAgICAgICAgICAgIGlmIChfb3V0IDwgX2luKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX291dCwgYmJ1Ziwgb2ZmLCBsZW4gKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNodW5rID0gX2J1Zi5sZW5ndGggLSBfb3V0OwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaHVuayA+PSBsZW4pCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCBfb3V0LCBiYnVmLCBvZmYsIGxlbiApOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIF9vdXQsIGJidWYsIG9mZiwgY2h1bmsgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnVmLCAwLCBiYnVmLCBvZmYgKyBjaHVuaywgbGVuIC0gY2h1bmsgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIF9vdXQgPSAoX291dCArIGxlbikgJSBfYnVmLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBfZnJlZSArPSBsZW47Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbGVuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgZ2V0QXZhaWxhYmxlICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfYnVmID09IG51bGwgPyAwIDogX2J1Zi5sZW5ndGggLSBfZnJlZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUgKCBpbnQgYml0ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9mcmVlID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJlc2l6ZSggMSApOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID4gMDsKLQotICAgICAgICAgICAgICAgIF9idWZbIF9pbiBdID0gKGJ5dGUpIGJpdGU7Ci0KLSAgICAgICAgICAgICAgICBfaW4gPSAoX2luICsgMSkgJSBfYnVmLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBfZnJlZS0tOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZSAoIGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBjYnl0ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGNieXRlID49IDA7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2J5dGUgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICAgICAgaWYgKF9mcmVlIDwgY2J5dGUpCi0gICAgICAgICAgICAgICAgICAgIHJlc2l6ZSggY2J5dGUgKTsKLQotICAgICAgICAgICAgICAgIGlmIChfaW4gPT0gX291dCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBnZXRBdmFpbGFibGUoKSA9PSAwOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPT0gX2J1Zi5sZW5ndGggLSBnZXRBdmFpbGFibGUoKTsKLSAgICAgICAgICAgICAgICAgICAgX2luID0gX291dCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IGNodW5rOwotCi0gICAgICAgICAgICAgICAgaWYgKF9pbiA8PSBfb3V0IHx8IGNieXRlIDwgKGNodW5rID0gX2J1Zi5sZW5ndGggLSBfaW4pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggYnVmLCBvZmYsIF9idWYsIF9pbiwgY2J5dGUgKTsKLSAgICAgICAgICAgICAgICAgICAgX2luICs9IGNieXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBidWYsIG9mZiwgX2J1ZiwgX2luLCBjaHVuayApOwotCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBidWYsIG9mZiArIGNodW5rLCBfYnVmLCAwLCBjYnl0ZSAtIGNodW5rICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgX2luID0gKF9pbiArIGNieXRlKSAlIF9idWYubGVuZ3RoOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIF9mcmVlIC09IGNieXRlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2b2lkIHJlc2l6ZSAoIGludCBjYnl0ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGNieXRlID4gX2ZyZWU7Ci0KLSAgICAgICAgICAgICAgICBpbnQgbmV3TGVuID0gX2J1ZiA9PSBudWxsID8gX2luaXRpYWxCdWZTaXplIDogX2J1Zi5sZW5ndGggKiAyOwotICAgICAgICAgICAgICAgIGludCB1c2VkID0gZ2V0QXZhaWxhYmxlKCk7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIG5ld0xlbiAtIHVzZWQgPCBjYnl0ZSApCi0gICAgICAgICAgICAgICAgICAgIG5ld0xlbiAqPSAyOwotCi0gICAgICAgICAgICAgICAgYnl0ZVtdIG5ld0J1ZiA9IG5ldyBieXRlIFsgbmV3TGVuIF07Ci0KLSAgICAgICAgICAgICAgICBpZiAodXNlZCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoX291dCA9PSBfaW4pCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCAwLCBuZXdCdWYsIDAsIHVzZWQgKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoX2luID4gX291dCkKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIF9vdXQsIG5ld0J1ZiwgMCwgdXNlZCApOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2J1ZiwgX291dCwgbmV3QnVmLCAwLCB1c2VkIC0gX2luICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2J1ZiwgMCwgbmV3QnVmLCB1c2VkIC0gX2luLCBfaW4gKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIF9vdXQgPSAwOwotICAgICAgICAgICAgICAgICAgICBfaW4gPSB1c2VkOwotICAgICAgICAgICAgICAgICAgICBfZnJlZSArPSBuZXdCdWYubGVuZ3RoIC0gX2J1Zi5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9mcmVlICs9IG5ld0J1Zi5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBfaW4gPT0gMCAmJiBfb3V0ID09IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgX2J1ZiA9IG5ld0J1ZjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9pbml0aWFsQnVmU2l6ZSA9IDQwOTY7Ci0KLSAgICAgICAgICAgIGludCAgICBfZnJlZTsKLSAgICAgICAgICAgIGludCAgICBfaW47Ci0gICAgICAgICAgICBpbnQgICAgX291dDsKLSAgICAgICAgICAgIGJ5dGVbXSBfYnVmOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW1JbXBsICAgX2J5dGVCdWZmZXI7Ci0gICAgICAgIHByaXZhdGUgVGV4dFNhdmVyICAgICAgICAgIF90ZXh0U2F2ZXI7Ci0gICAgICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtV3JpdGVyIF9jb252ZXJ0ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBYbWxJbnB1dFN0cmVhbVNhdmVyIGV4dGVuZHMgU2F2ZXIKLSAgICB7Ci0gICAgICAgIFhtbElucHV0U3RyZWFtU2F2ZXIgKCBSb290IHIsIFNwbGF5IHMsIGludCBwLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlciggciwgcywgcCwgb3B0aW9ucyApOwotICAgICAgICB9Ci0KLSAgICAgICAgWE1MRXZlbnQgZGVxdWV1ZSAoICkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX291dCA9PSBudWxsICYmICFwcm9jZXNzKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChfb3V0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIFhtbEV2ZW50SW1wbCBlID0gX291dDsKLQotICAgICAgICAgICAgaWYgKChfb3V0ID0gX291dC5fbmV4dCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBfaW4gPSBudWxsOwotCi0gICAgICAgICAgICByZXR1cm4gZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbnF1ZXVlICggWG1sRXZlbnRJbXBsIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgZS5fbmV4dCA9PSBudWxsOwotCi0gICAgICAgICAgICBpZiAoX2luID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IF9vdXQgPT0gbnVsbDsKLSAgICAgICAgICAgICAgICBfb3V0ID0gX2luID0gZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfaW4uX25leHQgPSBlOwotICAgICAgICAgICAgICAgIF9pbiA9IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLwotICAgICAgICAvLwotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRYbWxuc0ZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJDYW4ndCBzdHJlYW0gYW4gYXR0cmlidXRlIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHQgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBjY2ggPiAwOwotICAgICAgICAgICAgZW5xdWV1ZSggbmV3IENoYXJhY3RlckRhdGFJbXBsKCBnZXRSb290KCksIHMsIHAsIG51bGwgKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHRGcmFnbWVudCAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQlVHQlVHIC0gdGhlcmUgY291bGQgYmUgbmFtZXNwYWNlcyBwdXNoZWQgZm9yIHRoaXMgdGV4dCwgbm90Ci0gICAgICAgICAgICAvLyBzdXJlIGhvdyB0byBjb21tdW5pY2F0ZSB0aG9zZSwgaG93ZXZlcgotCi0gICAgICAgICAgICBpZiAoX3RleHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3RleHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICBlbWl0VGV4dCggcywgcCwgY2NoICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocyAhPSBudWxsICYmIGNjaCA+IDApCi0gICAgICAgICAgICAgICAgZW1pdFRleHQoIHMsIHAsIGNjaCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHRBZnRlciAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF90ZXh0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgZW1pdFRleHQoIHMsIHAsIGNjaCApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVucXVldWUoIG5ldyBDaGFyYWN0ZXJEYXRhSW1wbCggZ2V0Um9vdCgpLCBzLCAtMSwgdGV4dCgpICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRFbmRQcmVmaXhNYXBwaW5ncyAoICkKLSAgICAgICAgewotICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOwotCi0gICAgICAgICAgICBmb3IgKCBpdGVyYXRlTWFwcGluZ3MoKSA7IGhhc01hcHBpbmcoKSA7IG5leHRNYXBwaW5nKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmV2UHJlZml4VXJpID0gbWFwcGluZ1ByZXZQcmVmaXhVcmkoKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmV2UHJlZml4VXJpID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGVucXVldWUoIG5ldyBFbmRQcmVmaXhNYXBwaW5nSW1wbCggciwgbWFwcGluZ1ByZWZpeCgpICkgKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENoYW5nZVByZWZpeE1hcHBpbmdJbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIG1hcHBpbmdQcmVmaXgoKSwgbWFwcGluZ1VyaSgpLCBwcmV2UHJlZml4VXJpICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RW5kICggU3BsYXkgcywgUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLQotICAgICAgICAgICAgaWYgKHMuaXNSb290KCkpCi0gICAgICAgICAgICAgICAgZW5xdWV1ZSggbmV3IEVuZERvY3VtZW50SW1wbCggciwgcyApICk7Ci0gICAgICAgICAgICBlbHNlIGlmIChzLmlzRW5kKCkpCi0gICAgICAgICAgICAgICAgZW5xdWV1ZSggbmV3IEVuZEVsZW1lbnRJbXBsKCByLCBzLCBuYW1lLCBnZXRVcmlNYXAoKSApICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNMZWFmKCk7Ci0gICAgICAgICAgICAgICAgZW5xdWV1ZSggbmV3IEVuZEVsZW1lbnRJbXBsKCByLCBzLCBuYW1lLCBnZXRVcmlNYXAoKSApICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVtaXRFbmRQcmVmaXhNYXBwaW5ncygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbW1lbnRGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0Q29tbWVudCggcyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFByb2NpbnN0RnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdFByb2NpbnN0KCBzICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RG9jVHlwZSgKLSAgICAgICAgICAgIFN0cmluZyBkb2N0eXBlTmFtZSwgU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb21tZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVucXVldWUoIG5ldyBDb21tZW50SW1wbCggZ2V0Um9vdCgpLCBzICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRQcm9jaW5zdCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnF1ZXVlKCBuZXcgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCggZ2V0Um9vdCgpLCBzICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRBdHRyRnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIkNhbid0IHN0cmVhbSBhbiBhdHRyaWJ1dGUiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29udGFpbmVyICggQ29udGFpbmVyIGMsIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0KLSAgICAgICAgICAgIGZvciAoIGl0ZXJhdGVNYXBwaW5ncygpIDsgaGFzTWFwcGluZygpIDsgbmV4dE1hcHBpbmcoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW5xdWV1ZSgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXJ0UHJlZml4TWFwcGluZ0ltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICByLCBtYXBwaW5nUHJlZml4KCksIG1hcHBpbmdVcmkoKSApICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjLmlzRG9jKCkpCi0gICAgICAgICAgICAgICAgZW5xdWV1ZSggbmV3IFN0YXJ0RG9jdW1lbnRJbXBsKCByLCBjICkgKTsKLQotICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbnF1ZXVlKAotICAgICAgICAgICAgICAgICAgICBuZXcgU3RhcnRFbGVtZW50SW1wbCggciwgYywgbmFtZSwgdGhpcyApICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjLmlzRG9jKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGMuaXNEb2MoKTsKLQotICAgICAgICAgICAgICAgIGlmIChfdGV4dCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF90ZXh0Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVucXVldWUoIG5ldyBDaGFyYWN0ZXJEYXRhSW1wbCggciwgYywgLTEsIHRleHQoKSApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMuZ2V0Q2NoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlKCBuZXcgQ2hhcmFjdGVyRGF0YUltcGwoIHIsIGMsIDEsIG51bGwgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYy5pc0xlYWYoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3RleHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfdGV4dC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlKCBuZXcgQ2hhcmFjdGVyRGF0YUltcGwoIHIsIGMsIC0xLCB0ZXh0KCkgKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMuZ2V0Q2NoVmFsdWUoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIGVucXVldWUoIG5ldyBDaGFyYWN0ZXJEYXRhSW1wbCggciwgYywgMSwgbnVsbCApICk7Ci0KLSAgICAgICAgICAgICAgICBlbnF1ZXVlKCBuZXcgRW5kRWxlbWVudEltcGwoIHIsIGMsIG5hbWUsIGdldFVyaU1hcCgpICkgKTsKLQotICAgICAgICAgICAgICAgIGVtaXRFbmRQcmVmaXhNYXBwaW5ncygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICAvLwotICAgICAgICAvLwotICAgICAgICAvLwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIFhNTE5hbWUgY29tcHV0ZU5hbWUgKCBRTmFtZSBuLCBNYXAgdXJpTWFwICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG4uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgIGlmICh1cmkubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICB1cmkgPSBudWxsOwotCi0gICAgICAgICAgICBhc3NlcnQgbi5nZXRMb2NhbFBhcnQoKS5sZW5ndGgoKSA+IDA7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXNzZXJ0IG1heSBmaXJlIGlmIHNvbWVvbmUgY29tcHV0ZXMgYSBuYW1lCi0gICAgICAgICAgICAvLyBvZiBhbiBlbGVtZW50L2F0dHIgdG9vIGxhdGUgKGFmdGVyIG90aGVyIGV2ZW50cyBoYXZlIGJlZW4KLSAgICAgICAgICAgIC8vIGVucXVldWVkIGFuZCB0aGUgdXJpIG1hcCBoYXMgYmVlbiB1cGRhdGVkLiAgSSBjaGVjayBsYXRlcgotICAgICAgICAgICAgLy8gdG8gbWFrZSBzdXJlIHdlIGRvbid0IGNyYXNoLCBob3dldmVyLgotCi0gICAgICAgICAgICBhc3NlcnQgdXJpID09IG51bGwgfHwgdXJpTWFwLmNvbnRhaW5zS2V5KCB1cmkgKSA6ICJQcm9ibGVtIHVyaSAiICsgdXJpOwotCi0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByZWZpeCA9IChTdHJpbmcpIHVyaU1hcC5nZXQoIHVyaSApOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5hbWVJbXBsKCB1cmksIG4uZ2V0TG9jYWxQYXJ0KCksIHByZWZpeCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgWG1sRXZlbnRJbXBsIGV4dGVuZHMgWG1sRXZlbnRCYXNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbW9uaXRvcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9yb290OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBYbWxFdmVudEltcGwgKCBpbnQgdHlwZSwgUm9vdCByLCBTcGxheSBzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlciggdHlwZSApOwotICAgICAgICAgICAgICAgIF9yb290ID0gcjsKLSAgICAgICAgICAgICAgICBfc3BsYXkgPSBzOwotICAgICAgICAgICAgICAgIF92ZXJzaW9uID0gX3Jvb3QuZ2V0VmVyc2lvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgWE1MTmFtZSBnZXROYW1lICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFhNTE5hbWUgZ2V0U2NoZW1hVHlwZSAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIk5ZSSIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05hbWUgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGZpbmFsIExvY2F0aW9uIGdldExvY2F0aW9uICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBwZXJoYXBzIEkgY2FuIHNhdmUgYSBsb2NhdGlvbiBnb29iZXIgc29tZXRpbWVzPwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGNoZWNrVmVyc2lvbiAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3ZlcnNpb24gIT0gX3Jvb3QuZ2V0VmVyc2lvbigpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiggIkRvY3VtZW50IGNoYW5nZWQiICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByb3RlY3RlZCBmaW5hbCBSb290IGdldFJvb3QgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9yb290OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm90ZWN0ZWQgZmluYWwgU3BsYXkgZ2V0U3BsYXkgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9zcGxheTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBSb290ICBfcm9vdDsKLSAgICAgICAgICAgIHByaXZhdGUgU3BsYXkgX3NwbGF5OwotICAgICAgICAgICAgcHJpdmF0ZSBsb25nICBfdmVyc2lvbjsKLQotICAgICAgICAgICAgWG1sRXZlbnRJbXBsIF9uZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhcnREb2N1bWVudEltcGwKLSAgICAgICAgICAgIGV4dGVuZHMgWG1sRXZlbnRJbXBsIGltcGxlbWVudHMgU3RhcnREb2N1bWVudAotICAgICAgICB7Ci0gICAgICAgICAgICBTdGFydERvY3VtZW50SW1wbCAoIFJvb3QgciwgU3BsYXkgcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIoIFhNTEV2ZW50LlNUQVJUX0RPQ1VNRU5ULCByLCBzICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFJvb3QoKS5fcHJvcHMuZ2V0RG9jdHlwZVN5c3RlbUlkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRSb290KCkuX3Byb3BzLmdldEVuY29kaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YW5kYWxvbmUgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFJvb3QoKS5fc3RhbmRBbG9uZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbiAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Um9vdCgpLl9wcm9wcy5nZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhcnRFbGVtZW50SW1wbAotICAgICAgICAgICAgZXh0ZW5kcyBYbWxFdmVudEltcGwgaW1wbGVtZW50cyBTdGFydEVsZW1lbnQKLSAgICAgICAgewotICAgICAgICAgICAgU3RhcnRFbGVtZW50SW1wbCAoIFJvb3QgciwgU3BsYXkgcywgUU5hbWUgbmFtZSwgU2F2ZXIgc2F2ZXIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyKCBYTUxFdmVudC5TVEFSVF9FTEVNRU5ULCByLCBzICk7Ci0KLSAgICAgICAgICAgICAgICBfbmFtZSA9IGNvbXB1dGVOYW1lKCBuYW1lLCBzYXZlci5nZXRVcmlNYXAoKSApOwotCi0gICAgICAgICAgICAgICAgX3ByZWZpeE1hcCA9IHNhdmVyLmdldFByZWZpeE1hcCgpOwotCi0gICAgICAgICAgICAgICAgQXR0cmlidXRlSW1wbCBsYXN0QXR0ciA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBJdGVyYXRvciBpID0gc2F2ZXIuX2F0dHJzLmtleVNldCgpLml0ZXJhdG9yKCkgOwotICAgICAgICAgICAgICAgICAgICAgIGkuaGFzTmV4dCgpIDsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3BsYXkgYSA9IChTcGxheSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJbXBsIGF0dHIgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vcm1hbEF0dHJpYnV0ZUltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgciwgYSwgKFN0cmluZykgc2F2ZXIuX2F0dHJzLmdldCggYSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVyLmdldFVyaU1hcCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoX2F0dHJpYnV0ZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVzID0gYXR0cjsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEF0dHIuX25leHQgPSBhdHRyOwotCi0gICAgICAgICAgICAgICAgICAgIGxhc3RBdHRyID0gYXR0cjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsYXN0QXR0ciA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBzYXZlci5pdGVyYXRlTWFwcGluZ3MoKSA7Ci0gICAgICAgICAgICAgICAgICAgICAgc2F2ZXIuaGFzTWFwcGluZygpIDsgc2F2ZXIubmV4dE1hcHBpbmcoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJbXBsIGF0dHIgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhtbG5zQXR0cmlidXRlSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByLCBzYXZlci5tYXBwaW5nUHJlZml4KCksIHNhdmVyLm1hcHBpbmdVcmkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlci5nZXRVcmlNYXAoKSApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChfbmFtZXNwYWNlcyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgX25hbWVzcGFjZXMgPSBhdHRyOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0QXR0ci5fbmV4dCA9IGF0dHI7Ci0KLSAgICAgICAgICAgICAgICAgICAgbGFzdEF0dHIgPSBhdHRyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmFtZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgWE1MTmFtZSBnZXROYW1lICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfbmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBBdHRyaWJ1dGVJdGVyYXRvciBnZXRBdHRyaWJ1dGVzICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZUl0ZXJhdG9ySW1wbCggZ2V0Um9vdCgpLCBfYXR0cmlidXRlcywgbnVsbCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIEF0dHJpYnV0ZUl0ZXJhdG9yIGdldE5hbWVzcGFjZXMgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlSXRlcmF0b3JJbXBsKCBnZXRSb290KCksIG51bGwsIF9uYW1lc3BhY2VzICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgQXR0cmlidXRlSXRlcmF0b3IgZ2V0QXR0cmlidXRlc0FuZE5hbWVzcGFjZXMgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlSXRlcmF0b3JJbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJvb3QoKSwgX2F0dHJpYnV0ZXMsIF9uYW1lc3BhY2VzICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgQXR0cmlidXRlIGdldEF0dHJpYnV0ZUJ5TmFtZSAoIFhNTE5hbWUgeG1sTmFtZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgZm9yICggQXR0cmlidXRlSW1wbCBhID0gX2F0dHJpYnV0ZXMgOyBhICE9IG51bGwgOyBhID0gYS5fbmV4dCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4bWxOYW1lLmVxdWFscyggYS5nZXROYW1lKCkgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVXJpICggU3RyaW5nIHByZWZpeCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBfcHJlZml4TWFwLmdldCggcHJlZml4ID09IG51bGwgPyAiIiA6IHByZWZpeCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE1hcCBnZXROYW1lc3BhY2VNYXAgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9wcmVmaXhNYXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBdHRyaWJ1dGVJdGVyYXRvckltcGwKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEF0dHJpYnV0ZUl0ZXJhdG9yCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBtb25pdG9yKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfcm9vdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQXR0cmlidXRlSXRlcmF0b3JJbXBsICgKLSAgICAgICAgICAgICAgICAgICAgUm9vdCByLCBBdHRyaWJ1dGVJbXBsIGF0dHJpYnV0ZXMsIEF0dHJpYnV0ZUltcGwgbmFtZXNwYWNlcyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfcm9vdCA9IHI7Ci0gICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uID0gci5nZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLSAgICAgICAgICAgICAgICAgICAgX25hbWVzcGFjZXMgPSBuYW1lc3BhY2VzOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBBdHRyaWJ1dGUgbmV4dCAoICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUltcGwgYXR0ciA9IG51bGw7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2F0dHJpYnV0ZXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyID0gX2F0dHJpYnV0ZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZXMgPSBhdHRyLl9uZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoX25hbWVzcGFjZXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyID0gX25hbWVzcGFjZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX25hbWVzcGFjZXMgPSBhdHRyLl9uZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0ICggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9hdHRyaWJ1dGVzICE9IG51bGwgfHwgX25hbWVzcGFjZXMgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBBdHRyaWJ1dGUgcGVlayAoICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYXR0cmlidXRlcyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYXR0cmlidXRlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9uYW1lc3BhY2VzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9uYW1lc3BhY2VzOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBza2lwICggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9hdHRyaWJ1dGVzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZXMgPSBfYXR0cmlidXRlcy5fbmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9uYW1lc3BhY2VzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX25hbWVzcGFjZXMgPSBfbmFtZXNwYWNlcy5fbmV4dDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHByaXZhdGUgZmluYWwgdm9pZCBjaGVja1ZlcnNpb24gKCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoX3ZlcnNpb24gIT0gX3Jvb3QuZ2V0VmVyc2lvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIkRvY3VtZW50IGNoYW5nZWQiICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSBSb290ICAgICAgICAgIF9yb290OwotICAgICAgICAgICAgICAgIHByaXZhdGUgbG9uZyAgICAgICAgICBfdmVyc2lvbjsKLSAgICAgICAgICAgICAgICBwcml2YXRlIEF0dHJpYnV0ZUltcGwgX2F0dHJpYnV0ZXM7Ci0gICAgICAgICAgICAgICAgcHJpdmF0ZSBBdHRyaWJ1dGVJbXBsIF9uYW1lc3BhY2VzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBdHRyaWJ1dGVJbXBsIGltcGxlbWVudHMgQXR0cmlidXRlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBtb25pdG9yKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfcm9vdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQXR0cmlidXRlSW1wbCAoIFJvb3QgciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfcm9vdCA9IHI7Ci0gICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uID0gci5nZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIFhNTE5hbWUgZ2V0TmFtZSAoICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSAoICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAvLyBUT0RPIC0gTWFrZSBzdXJlIHRocm93aW5nIGF3YXkgdGhpcyBEVEQgaW5mbyBpcyBvay4KLSAgICAvLyBJcyB0aGVyZSBzY2hlbWEgaW5mbyB3aGljaCBjYW4gcmV0dXJuIG1vcmUgdXNlZnVsIGluZm8/Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNEQVRBIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBYTUxOYW1lIGdldFNjaGVtYVR5cGUgKCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgLy8gVE9ETyAtIENhbiBJIHJldHVybiBzb21ldGhpbmcgcmVhc29uYWJsZSBoZXJlPwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBjaGVja1ZlcnNpb24gKCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoX3ZlcnNpb24gIT0gX3Jvb3QuZ2V0VmVyc2lvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIkRvY3VtZW50IGNoYW5nZWQiICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQXR0cmlidXRlSW1wbCBfbmV4dDsKLQotICAgICAgICAgICAgICAgIHByb3RlY3RlZCBYTUxOYW1lIF9uYW1lOwotCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIFJvb3QgIF9yb290OwotICAgICAgICAgICAgICAgIHByaXZhdGUgbG9uZyAgX3ZlcnNpb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFhtbG5zQXR0cmlidXRlSW1wbCBleHRlbmRzIEF0dHJpYnV0ZUltcGwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYbWxuc0F0dHJpYnV0ZUltcGwgKAotICAgICAgICAgICAgICAgICAgICBSb290IHIsIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIE1hcCB1cmlNYXAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIoIHIgKTsKLQotICAgICAgICAgICAgICAgICAgICBfdXJpID0gdXJpOwotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbDsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCA9ICJ4bWxucyI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCA9IHByZWZpeDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICJ4bWxucyI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBfbmFtZSA9IG5ldyBYbWxOYW1lSW1wbCggbnVsbCwgbG9jYWwsIHByZWZpeCApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUgKCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3VyaTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIF91cmk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5vcm1hbEF0dHJpYnV0ZUltcGwgZXh0ZW5kcyBBdHRyaWJ1dGVJbXBsCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTm9ybWFsQXR0cmlidXRlSW1wbCAoCi0gICAgICAgICAgICAgICAgICAgIFJvb3QgciwgU3BsYXkgcywgU3RyaW5nIHZhbHVlLCBNYXAgdXJpTWFwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN1cGVyKCByICk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzTm9ybWFsQXR0cigpOwotICAgICAgICAgICAgICAgICAgICBfc3BsYXkgPSBzOwotICAgICAgICAgICAgICAgICAgICBfdmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgX25hbWUgPSBjb21wdXRlTmFtZSggcy5nZXROYW1lKCksIHVyaU1hcCApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUgKCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZhbHVlICE9IG51bGwgPyBfdmFsdWUgOiBfc3BsYXkuZ2V0VGV4dCggX3Jvb3QgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIF92YWx1ZTsgLy8gSWYgaW52YWxpZCBpbiB0aGUgc3RvcmUKLSAgICAgICAgICAgICAgICBwcml2YXRlIFNwbGF5IF9zcGxheTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBYTUxOYW1lIF9uYW1lOwotICAgICAgICAgICAgcHJpdmF0ZSBNYXAgICAgIF9wcmVmaXhNYXA7Ci0KLSAgICAgICAgICAgIHByaXZhdGUgQXR0cmlidXRlSW1wbCBfYXR0cmlidXRlczsKLSAgICAgICAgICAgIHByaXZhdGUgQXR0cmlidXRlSW1wbCBfbmFtZXNwYWNlczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YXJ0UHJlZml4TWFwcGluZ0ltcGwKLSAgICAgICAgICAgIGV4dGVuZHMgWG1sRXZlbnRJbXBsIGltcGxlbWVudHMgU3RhcnRQcmVmaXhNYXBwaW5nCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0YXJ0UHJlZml4TWFwcGluZ0ltcGwgKCBSb290IHIsIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyKCBYTUxFdmVudC5TVEFSVF9QUkVGSVhfTUFQUElORywgciwgbnVsbCApOwotCi0gICAgICAgICAgICAgICAgX3ByZWZpeCA9IHByZWZpeDsKLSAgICAgICAgICAgICAgICBfdXJpID0gdXJpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVyaSAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3VyaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4ICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfcHJlZml4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX3ByZWZpeCwgX3VyaTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENoYW5nZVByZWZpeE1hcHBpbmdJbXBsCi0gICAgICAgICAgICBleHRlbmRzIFhtbEV2ZW50SW1wbCBpbXBsZW1lbnRzIENoYW5nZVByZWZpeE1hcHBpbmcKLSAgICAgICAgewotICAgICAgICAgICAgQ2hhbmdlUHJlZml4TWFwcGluZ0ltcGwgKAotICAgICAgICAgICAgICAgIFJvb3QgciwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIG9sZFVyaSwgU3RyaW5nIG5ld1VyaSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIoIFhNTEV2ZW50LkNIQU5HRV9QUkVGSVhfTUFQUElORywgciwgbnVsbCApOwotCi0gICAgICAgICAgICAgICAgX29sZFVyaSA9IG9sZFVyaTsKLSAgICAgICAgICAgICAgICBfbmV3VXJpID0gbmV3VXJpOwotICAgICAgICAgICAgICAgIF9wcmVmaXggPSBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2xkTmFtZXNwYWNlVXJpICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfb2xkVXJpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXROZXdOYW1lc3BhY2VVcmkgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9uZXdVcmk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ByZWZpeDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIF9vbGRVcmksIF9uZXdVcmksIF9wcmVmaXg7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbmRQcmVmaXhNYXBwaW5nSW1wbAotICAgICAgICAgICAgZXh0ZW5kcyBYbWxFdmVudEltcGwgaW1wbGVtZW50cyBFbmRQcmVmaXhNYXBwaW5nCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVuZFByZWZpeE1hcHBpbmdJbXBsICggUm9vdCByLCBTdHJpbmcgcHJlZml4ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlciggWE1MRXZlbnQuRU5EX1BSRUZJWF9NQVBQSU5HLCByLCBudWxsICk7Ci0gICAgICAgICAgICAgICAgX3ByZWZpeCA9IHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXggKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9wcmVmaXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIFN0cmluZyBfcHJlZml4OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2hhcmFjdGVyRGF0YUltcGwKLSAgICAgICAgICAgIGV4dGVuZHMgWG1sRXZlbnRJbXBsIGltcGxlbWVudHMgQ2hhcmFjdGVyRGF0YQotICAgICAgICB7Ci0gICAgICAgICAgICBDaGFyYWN0ZXJEYXRhSW1wbCAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIFN0cmluZyBjaGFyRGF0YSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIoIFhNTEV2ZW50LkNIQVJBQ1RFUl9EQVRBLCByLCBzICk7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgcCA+IDAgfHwgKGNoYXJEYXRhICE9IG51bGwgJiYgY2hhckRhdGEubGVuZ3RoKCkgPiAwKTsKLQotICAgICAgICAgICAgICAgIF9wb3MgPSBwOwotICAgICAgICAgICAgICAgIF9jaGFyRGF0YSA9IGNoYXJEYXRhOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnQgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChfcG9zID09IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jaGFyRGF0YTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOwotICAgIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgIHIuX3RleHQuZmV0Y2goCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5nZXRDcEZvclBvcyggciwgX3BvcyApLCBzLmdldFBvc3RDY2goIF9wb3MgKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ29udGVudCAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgaW50ICAgIF9wb3M7Ci0gICAgICAgICAgICBwcml2YXRlIFN0cmluZyBfY2hhckRhdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbmRFbGVtZW50SW1wbAotICAgICAgICAgICAgZXh0ZW5kcyBYbWxFdmVudEltcGwgaW1wbGVtZW50cyBFbmRFbGVtZW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEVuZEVsZW1lbnRJbXBsICggUm9vdCByLCBTcGxheSBzLCBRTmFtZSBuYW1lLCBNYXAgdXJpTWFwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlciggWE1MRXZlbnQuRU5EX0VMRU1FTlQsIHIsIHMgKTsKLQotICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzTGVhZigpIHx8IHMuaXNFbmQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocy5pc0VuZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBuYW1lID0gcy5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgX25hbWUgPSBjb21wdXRlTmFtZSggbmFtZSwgdXJpTWFwICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05hbWUgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgWE1MTmFtZSBnZXROYW1lICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfbmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgWE1MTmFtZSBfbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVuZERvY3VtZW50SW1wbAotICAgICAgICAgICAgZXh0ZW5kcyBYbWxFdmVudEltcGwgaW1wbGVtZW50cyBFbmREb2N1bWVudAotICAgICAgICB7Ci0gICAgICAgICAgICBFbmREb2N1bWVudEltcGwgKCBSb290IHIsIFNwbGF5IHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyKCBYTUxFdmVudC5FTkRfRE9DVU1FTlQsIHIsIHMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbW1lbnRJbXBsCi0gICAgICAgICAgICBleHRlbmRzIFhtbEV2ZW50SW1wbCBpbXBsZW1lbnRzIENvbW1lbnQKLSAgICAgICAgewotICAgICAgICAgICAgQ29tbWVudEltcGwgKCBSb290IHIsIFNwbGF5IHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyKCBYTUxFdmVudC5DT01NRU5ULCByLCBzICk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNDb21tZW50KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudCAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuZ2V0Q2NoKCkgPT0gMCA/IG51bGwgOiBzLmdldFRleHQoIGdldFJvb3QoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ29udGVudCAoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U3BsYXkoKS5nZXRDY2goKSA+IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbAotICAgICAgICAgICAgZXh0ZW5kcyBYbWxFdmVudEltcGwgaW1wbGVtZW50cyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KLSAgICAgICAgewotICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCAoIFJvb3QgciwgU3BsYXkgcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIoIFhNTEV2ZW50LlBST0NFU1NJTkdfSU5TVFJVQ1RJT04sIHIsIHMgKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc1Byb2NpbnN0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0ICggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRTcGxheSgpLmdldExvY2FsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERhdGEgKCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmdldENjaCgpID09IDAgPyBudWxsIDogcy5nZXRUZXh0KCBnZXRSb290KCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFhtbEV2ZW50SW1wbCBfaW4sIF9vdXQ7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIFhtbElucHV0U3RyZWFtSW1wbCBleHRlbmRzIEdlbmVyaWNYbWxJbnB1dFN0cmVhbQotICAgIHsKLSAgICAgICAgWG1sSW5wdXRTdHJlYW1JbXBsICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgX3htbElucHV0U3RyZWFtU2F2ZXIgPQotICAgICAgICAgICAgICAgIG5ldyBYbWxJbnB1dFN0cmVhbVNhdmVyKCByLCBzLCBwLCBvcHRpb25zICk7Ci0KLSAgICAgICAgICAgIC8vIE1ha2UgdGhlIHNhdmVyIGdyaW5kIGF3YXkganVzdCBhIGJpdCB0byB0aHJvdyBhbnkgZXhjZXB0aW9ucwotICAgICAgICAgICAgLy8gcmVsYXRlZCB0byB0aGUgaW5hYmlsaXR5IHRvIGNyZWF0ZSBhIHN0cmVhbSBvbiB0aGlzIHhtbAotICAgICAgICAgICAgCi0gICAgICAgICAgICBfeG1sSW5wdXRTdHJlYW1TYXZlci5wcm9jZXNzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgWE1MRXZlbnQgbmV4dEV2ZW50ICggKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfeG1sSW5wdXRTdHJlYW1TYXZlci5kZXF1ZXVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFhtbElucHV0U3RyZWFtU2F2ZXIgX3htbElucHV0U3RyZWFtU2F2ZXI7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgVmFsaWRhdG9yU2F2ZXIKLSAgICAgICAgZXh0ZW5kcyBTYXZlciBpbXBsZW1lbnRzIFZhbGlkYXRvckxpc3RlbmVyLkV2ZW50Ci0gICAgewotICAgICAgICBWYWxpZGF0b3JTYXZlciAoCi0gICAgICAgICAgICBSb290IHIsIFNwbGF5IHMsIGludCBwLAotICAgICAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zLCBWYWxpZGF0b3JMaXN0ZW5lciB2RXZlbnRTaW5rICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIHIsIHMsIHAsIG9wdGlvbnMgKTsKLQotICAgICAgICAgICAgX3dhbnREdXBBdHRycyA9IHRydWU7Ci0KLSAgICAgICAgICAgIGFzc2VydCBwID09IDA7Ci0KLSAgICAgICAgICAgIF9zdGFydFNwbGF5ID0gczsKLSAgICAgICAgICAgIF92RXZlbnRTaW5rID0gdkV2ZW50U2luazsKLQotICAgICAgICAgICAgd2hpbGUgKCBwcm9jZXNzKCkgKQotICAgICAgICAgICAgICAgIDsgIC8vIEVtcHR5Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0WG1sbnNGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0VGV4dEZyYWdtZW50ICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29tbWVudEZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRQcm9jaW5zdEZyYWdtZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0QWZ0ZXIgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfdGV4dCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBjY2ggPiAwOwotICAgICAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCwgcywgcCwgbnVsbCwgcywgcCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCwgcywgcCwgbnVsbCwgdGV4dCgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RW5kICggU3BsYXkgcywgUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuRU5ELCBzLCAwICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RG9jVHlwZSgKLSAgICAgICAgICAgIFN0cmluZyBkb2N0eXBlTmFtZSwgU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb21tZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzLmdldENjaEFmdGVyKCkgPiAwKQotICAgICAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCwgcywgMCwgbnVsbCwgcywgMSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFByb2NpbnN0ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzLmdldENjaEFmdGVyKCkgPiAwKQotICAgICAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCwgcywgMCwgbnVsbCwgcywgMSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEF0dHJGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLkJFR0lOLCBzLCAwLCBudWxsICk7Ci0KLSAgICAgICAgICAgIGlmIChfdGV4dCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfdGV4dC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCwgcywgMCwgbnVsbCwgdGV4dCgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzLmdldENjaCgpID4gMCkKLSAgICAgICAgICAgICAgICBlbWl0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLlRFWFQsIHMsIDAsIG51bGwsIHMsIDAgKTsKLQotICAgICAgICAgICAgZW1pdEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5FTkQsIHMsIDAgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb250YWluZXIgKCBDb250YWluZXIgYywgUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBfeHNpTm9Mb2MgPT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBfeHNpTG9jID09IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgX3hzaVR5cGUgPT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBfeHNpTmlsID09IG51bGw7Ci0KLSAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBjLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc1hzaUF0dHIoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbCA9IHMuZ2V0TG9jYWwoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWwuZXF1YWxzKCAidHlwZSIgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIF94c2lUeXBlID0gczsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobG9jYWwuZXF1YWxzKCAibmlsIiApKQotICAgICAgICAgICAgICAgICAgICAgICAgX3hzaU5pbCA9IHM7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvY2FsLmVxdWFscyggInNjaGVtYUxvY2F0aW9uIiApKQotICAgICAgICAgICAgICAgICAgICAgICAgX3hzaUxvYyA9IHM7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvY2FsLmVxdWFscyggIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iICkpCi0gICAgICAgICAgICAgICAgICAgICAgICBfeHNpTm9Mb2MgPSBzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZW1pdEV2ZW50KAotICAgICAgICAgICAgICAgIFZhbGlkYXRvckxpc3RlbmVyLkJFR0lOLCBjLCAwLAotICAgICAgICAgICAgICAgIGMgPT0gX3N0YXJ0U3BsYXkgPyBudWxsIDogbmFtZSApOwotCi0gICAgICAgICAgICBfeHNpTm9Mb2MgPSBfeHNpTG9jID0gX3hzaVR5cGUgPSBfeHNpTmlsID0gbnVsbDsKLQotICAgICAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IF9hdHRycy5rZXlTZXQoKS5pdGVyYXRvcigpIDsgaS5oYXNOZXh0KCkgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3BsYXkgcyA9IChTcGxheSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHMuaXNYc2lBdHRyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWwgPSBzLmdldExvY2FsKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsLmVxdWFscyggInR5cGUiICkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLmVxdWFscyggIm5pbCIgKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwuZXF1YWxzKCAic2NoZW1hTG9jYXRpb24iICkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLmVxdWFscyggIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iICkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGludmFsaWRBdHRyVmFsdWUgPSAoU3RyaW5nKSBfYXR0cnMuZ2V0KCBzICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaW52YWxpZEF0dHJWYWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yTGlzdGVuZXIuQVRUUiwgcywgMCwgcy5nZXROYW1lKCksIHMsIDAgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yTGlzdGVuZXIuQVRUUiwgcywgMCwgcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkQXR0clZhbHVlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbWl0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLkVOREFUVFJTLCBjLCAwICk7Ci0KLSAgICAgICAgICAgIGlmIChjLmlzRG9jKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGMuaXNEb2MoKTsKLQotICAgICAgICAgICAgICAgIGlmIChfdGV4dCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF90ZXh0Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCwgYywgMSwgbnVsbCwgdGV4dCgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMuZ2V0Q2NoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICBlbWl0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLlRFWFQsIGMsIDEsIG51bGwsIGMsIDEgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGMuaXNMZWFmKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGNjaCA9IF90ZXh0ICE9IG51bGwgPyBfdGV4dC5sZW5ndGgoKSA6IGMuZ2V0Q2NoVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChjY2ggPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF90ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFdmVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JMaXN0ZW5lci5URVhULCBjLCAxLCBudWxsLCB0ZXh0KCkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFdmVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JMaXN0ZW5lci5URVhULCBjLCAxLCBudWxsLCBjLCAxICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbWl0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLkVORCwgYywgYy5nZXRQb3NMZWFmRW5kKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRFdmVudCAoIGludCBraW5kLCBTcGxheSBzTG9jLCBpbnQgcExvYyApCi0gICAgICAgICAgICB7IGVtaXRFdmVudCgga2luZCwgc0xvYywgcExvYywgbnVsbCwgbnVsbCwgMCwgbnVsbCApOyB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEV2ZW50ICggaW50IGtpbmQsIFNwbGF5IHNMb2MsIGludCBwTG9jLCBRTmFtZSBuYW1lICkKLSAgICAgICAgICAgIHsgZW1pdEV2ZW50KCBraW5kLCBzTG9jLCBwTG9jLCBuYW1lLCBudWxsLCAwLCBudWxsICk7IH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RXZlbnQgKAotICAgICAgICAgICAgaW50IGtpbmQsIFNwbGF5IHNMb2MsIGludCBwTG9jLCBRTmFtZSBuYW1lLCBTdHJpbmcgdGV4dCApCi0gICAgICAgICAgICAgICAgeyBlbWl0RXZlbnQgKCBraW5kLCBzTG9jLCBwTG9jLCBuYW1lLCBudWxsLCAwLCB0ZXh0ICk7IH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RXZlbnQgKAotICAgICAgICAgICAgaW50IGtpbmQsIFNwbGF5IHNMb2MsIGludCBwTG9jLCBRTmFtZSBuYW1lLCBTcGxheSBzVGV4dCwgaW50IHBUZXh0ICkKLSAgICAgICAgICAgICAgICB7IGVtaXRFdmVudCAoIGtpbmQsIHNMb2MsIHBMb2MsIG5hbWUsIHNUZXh0LCBwVGV4dCwgbnVsbCApOyB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEV2ZW50ICgKLSAgICAgICAgICAgIGludCBraW5kLCBTcGxheSBzTG9jLCBpbnQgcExvYywgUU5hbWUgbmFtZSwKLSAgICAgICAgICAgIFNwbGF5IHNUZXh0LCBpbnQgcFRleHQsIFN0cmluZyB0ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGtpbmQgPT0gVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCAmJiBfZW1pdHRlZFRleHQpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBib29sZWFuIGhhc1RleHQgPSB0ZXh0ICE9IG51bGwgfHwgc1RleHQgIT0gbnVsbDsKLQotICAgICAgICAgICAgYXNzZXJ0Ci0gICAgICAgICAgICAgICAgIWhhc1RleHQgfHwKLSAgICAgICAgICAgICAgICAgICAgKGtpbmQgPT0gVmFsaWRhdG9yTGlzdGVuZXIuQVRUUiB8fAotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9PSBWYWxpZGF0b3JMaXN0ZW5lci5URVhUKTsKLQotICAgICAgICAgICAgYXNzZXJ0IGtpbmQgIT0gVmFsaWRhdG9yTGlzdGVuZXIuQVRUUiB8fCBoYXNUZXh0OwotICAgICAgICAgICAgYXNzZXJ0IGtpbmQgIT0gVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCB8fCBoYXNUZXh0OwotCi0gICAgICAgICAgICBhc3NlcnQga2luZCAhPSBWYWxpZGF0b3JMaXN0ZW5lci5BVFRSIHx8IG5hbWUgIT0gbnVsbDsKLQotICAgICAgICAgICAgX25hbWUgPSBuYW1lOwotICAgICAgICAgICAgX3NUZXh0ID0gc1RleHQ7Ci0gICAgICAgICAgICBfcFRleHQgPSBwVGV4dDsKLSAgICAgICAgICAgIF9ldmVudFRleHQgPSB0ZXh0OwotICAgICAgICAgICAgX2hhc1RleHQgPSBoYXNUZXh0OwotICAgICAgICAgICAgX3NMb2MgPSBzTG9jOwotICAgICAgICAgICAgX3BMb2MgPSBwTG9jOwotCi0gICAgICAgICAgICBfdkV2ZW50U2luay5uZXh0RXZlbnQoIGtpbmQsIHRoaXMgKTsKLQotICAgICAgICAgICAgX2VtaXR0ZWRUZXh0ID0ga2luZCA9PSBWYWxpZGF0b3JMaXN0ZW5lci5URVhUOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8KLSAgICAgICAgLy8KLQotICAgICAgICBwdWJsaWMgWG1sQ3Vyc29yIGdldExvY2F0aW9uQXNDdXJzb3IgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBDdXJzb3IoIGdldFJvb3QoKSwgX3NMb2MsIF9wTG9jICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRYc2lUeXBlICggQ2hhcnMgY2hhcnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3hzaVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIHNldENoYXJzKCBjaGFycywgUFJFU0VSVkUsIG51bGwsIF94c2lUeXBlLCAwICk7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0WHNpTmlsICggQ2hhcnMgY2hhcnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3hzaU5pbCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotCi0gICAgICAgICAgICBzZXRDaGFycyggY2hhcnMsIFBSRVNFUlZFLCBudWxsLCBfeHNpTmlsLCAwICk7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0WHNpTG9jICggQ2hhcnMgY2hhcnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3hzaUxvYyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgc2V0Q2hhcnMoIGNoYXJzLCBQUkVTRVJWRSwgbnVsbCwgX3hzaUxvYywgMCApOwotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGdldFhzaU5vTG9jICggQ2hhcnMgY2hhcnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3hzaU5vTG9jID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBzZXRDaGFycyggY2hhcnMsIFBSRVNFUlZFLCBudWxsLCBfeHNpTm9Mb2MsIDAgKTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9uYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldENoYXJzICgKLSAgICAgICAgICAgIENoYXJzIGNoYXJzLCBpbnQgd3NyLCBTdHJpbmcgc3RyaW5nLCBTcGxheSBzVGV4dCwgaW50IHBUZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IHN0cmluZyAhPSBudWxsIHx8IHNUZXh0ICE9IG51bGw7Ci0KLSAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwotCi0gICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0KLSAgICAgICAgICAgIGNoYXJzLmJ1ZmZlciA9IG51bGw7Ci0gICAgICAgICAgICBjaGFycy5zdHJpbmcgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoc3RyaW5nICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhcnMuc3RyaW5nID0gc3RyaW5nOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocFRleHQgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGFycy5idWZmZXIgPSByLl90ZXh0Ll9idWY7Ci0gICAgICAgICAgICAgICAgY2hhcnMubGVuZ3RoID0gc1RleHQuZ2V0Q2NoKCk7Ci0KLSAgICAgICAgICAgICAgICBjaGFycy5vZmZzZXQgPQotICAgICAgICAgICAgICAgICAgICByLl90ZXh0LnVuT2JzY3VyZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHIuZ2V0Q3AoIHNUZXh0ICksIGNoYXJzLmxlbmd0aCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocFRleHQgPT0gMSAmJiBzVGV4dC5pc0xlYWYoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGFycy5idWZmZXIgPSByLl90ZXh0Ll9idWY7Ci0gICAgICAgICAgICAgICAgY2hhcnMubGVuZ3RoID0gc1RleHQuZ2V0Q2NoVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIGNoYXJzLm9mZnNldCA9Ci0gICAgICAgICAgICAgICAgICAgIHIuX3RleHQudW5PYnNjdXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgci5nZXRDcCggc1RleHQgKSwgY2hhcnMubGVuZ3RoICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHBUZXh0ID09IHNUZXh0LmdldFBvc0FmdGVyKCk7Ci0KLSAgICAgICAgICAgICAgICBib29sZWFuIG1vcmVUZXh0ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBTcGxheSB0ID0gc1RleHQubmV4dE5vbkF0dHJTcGxheSgpIDsgOwotICAgICAgICAgICAgICAgICAgICAgIHQgPSB0Lm5leHRTcGxheSgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdC5pc0NvbW1lbnQoKSAmJiAhdC5pc1Byb2NpbnN0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBpZiAodC5nZXRDY2hBZnRlcigpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9yZVRleHQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIW1vcmVUZXh0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhcnMuYnVmZmVyID0gci5fdGV4dC5fYnVmOwotICAgICAgICAgICAgICAgICAgICBjaGFycy5sZW5ndGggPSBzVGV4dC5nZXRDY2hBZnRlcigpOwotCi0gICAgICAgICAgICAgICAgICAgIGNoYXJzLm9mZnNldCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICByLl90ZXh0LnVuT2JzY3VyZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzVGV4dC5nZXRDcEZvclBvcyggciwgcFRleHQgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFycy5sZW5ndGggKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgICAgICAgICAgICAgIGludCBjY2ggPSBzVGV4dC5nZXRDY2hBZnRlcigpOwotCi0gICAgICAgICAgICAgICAgICAgIGludCBvZmYgPQotICAgICAgICAgICAgICAgICAgICAgICAgci5fdGV4dC51bk9ic2N1cmUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc1RleHQuZ2V0Q3BGb3JQb3MoIHIsIHBUZXh0ICksIGNjaCApOwotCi0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggci5fdGV4dC5fYnVmLCBvZmYsIGNjaCApOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIFNwbGF5IHQgPSBzVGV4dC5uZXh0Tm9uQXR0clNwbGF5KCkgOyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0Lm5leHRTcGxheSgpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0LmlzQ29tbWVudCgpICYmICF0LmlzUHJvY2luc3QoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuZ2V0Q2NoQWZ0ZXIoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NoID0gdC5nZXRDY2hBZnRlcigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5fdGV4dC51bk9ic2N1cmUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmdldENwRm9yUG9zKCByLCAxICksIGNjaCApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCByLl90ZXh0Ll9idWYsIG9mZiwgY2NoICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjaGFycy5sZW5ndGggPSBzYi5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhcnMuYnVmZmVyID0gbmV3IGNoYXIgWyBjaGFycy5sZW5ndGggXTsKLSAgICAgICAgICAgICAgICAgICAgY2hhcnMub2Zmc2V0ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBzYi5nZXRDaGFycyggMCwgY2hhcnMubGVuZ3RoLCBjaGFycy5idWZmZXIsIDAgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh3c3IgIT0gUFJFU0VSVkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAtIHRoaXMgaXMgcXVpY2ssIGRpcnR5IGFuZCB2ZXJ5IGluZWZmaWNpZW50Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgIG1ha2UgaXQgZmFzdGVyIQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHN0ciA9IGNoYXJzLmFzU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IC0xLCBuU3BhY2VzID0gMCwgY2NoID0gc3RyLmxlbmd0aCgpOwotCi0gICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IGNjaCA7IGkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gc3RyLmNoYXJBdCggaSApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nIHx8IGNoID09ICdccicgfHwgY2ggPT0gJ1x0JykKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gJyAnOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh3c3IgPT0gQ09MTEFQU0UpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnICcpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TcGFjZXMrKzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoblNwYWNlcyA+IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgblNwYWNlcyA9IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIDsgblNwYWNlcyA+IDAgOyBuU3BhY2VzLS0gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggJyAnICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggY2ggKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjaGFycy5zdHJpbmcgPSBzYi50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGNoYXJzLmJ1ZmZlciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBnZXRUZXh0ICggQ2hhcnMgY2hhcnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRUZXh0KCBjaGFycywgUFJFU0VSVkUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGdldFRleHQgKCBDaGFycyBjaGFycywgaW50IHdzciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghX2hhc1RleHQpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJObyB0ZXh0IGZvciB0aGlzIGV2ZW50Iik7Ci0KLSAgICAgICAgICAgIHNldENoYXJzKCBjaGFycywgd3NyLCBfZXZlbnRUZXh0LCBfc1RleHQsIF9wVGV4dCApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETyAtIHJhdGhlciBleHBlbnNpdmUgdG8gbWFrZSBDaGFycyBhbmQgZ2V0VGV4dCBhbmQgZ2V0Ci0gICAgICAgIC8vIFN0cmluZwotICAgICAgICBwdWJsaWMgYm9vbGVhbiB0ZXh0SXNXaGl0ZXNwYWNlICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBDaGFycyBjaGFycyA9IG5ldyBDaGFycygpOwotICAgICAgICAgICAgZ2V0VGV4dCggY2hhcnMgKTsKLSAgICAgICAgICAgIFN0cmluZyBzID0gY2hhcnMuYXNTdHJpbmcoKTsKLQotICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IHMubGVuZ3RoKCkgOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoIHMuY2hhckF0KCBpICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnICc6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBWYWxpZGF0b3JMaXN0ZW5lciBfdkV2ZW50U2luazsKLSAgICAgICAgcHJpdmF0ZSBTcGxheSAgICAgICAgICAgICBfc3RhcnRTcGxheTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBfZW1pdHRlZFRleHQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBRTmFtZSAgIF9uYW1lOwotICAgICAgICBwcml2YXRlIFNwbGF5ICAgX3hzaVR5cGU7Ci0gICAgICAgIHByaXZhdGUgU3BsYXkgICBfeHNpTmlsOwotICAgICAgICBwcml2YXRlIFNwbGF5ICAgX3hzaUxvYzsKLSAgICAgICAgcHJpdmF0ZSBTcGxheSAgIF94c2lOb0xvYzsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgIF9ldmVudFRleHQ7Ci0gICAgICAgIHByaXZhdGUgU3BsYXkgICBfc1RleHQ7Ci0gICAgICAgIHByaXZhdGUgaW50ICAgICBfcFRleHQ7Ci0gICAgICAgIHByaXZhdGUgU3BsYXkgICBfc0xvYzsKLSAgICAgICAgcHJpdmF0ZSBpbnQgICAgIF9wTG9jOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gX2hhc1RleHQ7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLwotICAgIC8vCi0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgU2F4U2F2ZXIgZXh0ZW5kcyBTYXZlcgotICAgIHsKLSAgICAgICAgU2F4U2F2ZXIgKAotICAgICAgICAgICAgUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zLAotICAgICAgICAgICAgQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIsIExleGljYWxIYW5kbGVyIGxleGljYWxoYW5kbGVyICkKLSAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCByLCBzLCBwLCBvcHRpb25zICk7Ci0KLSAgICAgICAgICAgIF9hdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF93YW50RnJhZ1Rlc3QgPSB0cnVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBfY29udGVudEhhbmRsZXIgPSBjb250ZW50SGFuZGxlcjsKLSAgICAgICAgICAgIF9sZXhpY2FsaGFuZGxlciA9IGxleGljYWxoYW5kbGVyOwotCi0vLyAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5zZXREb2N1bWVudExvY2F0b3IoIGhobW1tbSAgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCBwcm9jZXNzKCkgKQotICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFNhdmVyU0FYRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IGUuX3NheEV4Y2VwdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLmVuZERvY3VtZW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGNsYXNzIFNhdmVyU0FYRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBTYXZlclNBWEV4Y2VwdGlvbiAoIFNBWEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfc2F4RXhjZXB0aW9uID0gZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgU0FYRXhjZXB0aW9uIF9zYXhFeGNlcHRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdGhyb3dTYXhFeGNlcHRpb24gKCBTQVhFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTYXZlclNBWEV4Y2VwdGlvbiggZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbnRhaW5lciAoIENvbnRhaW5lciBjLCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGMuaXNCZWdpbigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVtaXRDb250YWluZXJIZWxwZXIoIGMsIG5hbWUsIG51bGwsIG51bGwgKTsKLQotICAgICAgICAgICAgICAgIGlmIChjLmlzTGVhZigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNjaCA9IF90ZXh0ID09IG51bGwgPyBjLmdldENjaFZhbHVlKCkgOiBfdGV4dC5sZW5ndGgoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2NoID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90ZXh0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYXJhY3RlcnMoIGMsIDAsIGNjaCApOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFyYWN0ZXJzKCBfdGV4dCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBlbWl0RW5kRWxlbWVudCggYy5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGMuaXNEb2MoKTsKLQotICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGVtaXRDb250YWluZXJIZWxwZXIoIGMsIG5hbWUsIG51bGwsIG51bGwgKTsKLQotICAgICAgICAgICAgICAgIGlmIChfdGV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhcmFjdGVycyggYywgMCwgYy5nZXRDY2goKSApOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZW1pdENoYXJhY3RlcnMoIF90ZXh0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW1pdEF0dHJIZWxwZXIgKCBTcGxheSBzLCBTdHJpbmcgdmFsdWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcy5pc05vcm1hbEF0dHIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGxvY2FsID0gcy5nZXRMb2NhbCgpOwotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHMuZ2V0VXJpKCk7Ci0KLSAgICAgICAgICAgIF9hdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICBzLmdldFVyaSgpLCBzLmdldExvY2FsKCksCi0gICAgICAgICAgICAgICAgZ2V0UHJlZml4ZWROYW1lKCBzLmdldE5hbWUoKSApLAotICAgICAgICAgICAgICAgICJDREFUQSIsCi0gICAgICAgICAgICAgICAgdmFsdWUgPT0gbnVsbCA/IHMuZ2V0VGV4dCggZ2V0Um9vdCgpICkgOiB2YWx1ZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZE5hbWVzcGFjZUF0dHIgKCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLnN0YXJ0UHJlZml4TWFwcGluZyggcHJlZml4LCB1cmkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggU0FYRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93U2F4RXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICBfYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoICIiLCAiIiwgInhtbG5zIiwgIkNEQVRBIiwgdXJpICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2F0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAiIiwgIiIsICJ4bWxuczoiICsgcHJlZml4LCAiQ0RBVEEiLCB1cmkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXROYW1lc3BhY2VzSGVscGVyICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBpdGVyYXRlTWFwcGluZ3MoKSA7IGhhc01hcHBpbmcoKSA7IG5leHRNYXBwaW5nKCkgKQotICAgICAgICAgICAgICAgIGFkZE5hbWVzcGFjZUF0dHIoIG1hcHBpbmdQcmVmaXgoKSwgbWFwcGluZ1VyaSgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW1pdENvbnRhaW5lckhlbHBlciAoCi0gICAgICAgICAgICBDb250YWluZXIgYywgUU5hbWUgbmFtZSwKLSAgICAgICAgICAgIFNwbGF5IGV4dHJhQXR0ciwgU3RyaW5nQnVmZmVyIGV4dHJhQXR0clRleHQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBfYXR0cmlidXRlcy5jbGVhcigpOwotCi0gICAgICAgICAgICBpZiAoX3NhdmVOYW1lc3BhY2VzRmlyc3QpCi0gICAgICAgICAgICAgICAgZW1pdE5hbWVzcGFjZXNIZWxwZXIoKTsKLQotICAgICAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IF9hdHRycy5rZXlTZXQoKS5pdGVyYXRvcigpIDsgaS5oYXNOZXh0KCkgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3BsYXkgcyA9IChTcGxheSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgZW1pdEF0dHJIZWxwZXIoIHMsIChTdHJpbmcpIF9hdHRycy5nZXQoIHMgKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZXh0cmFBdHRyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW1pdEF0dHJIZWxwZXIoCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyVGV4dCA9PSBudWxsID8gbnVsbCA6IGV4dHJhQXR0clRleHQudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIV9zYXZlTmFtZXNwYWNlc0ZpcnN0KQotICAgICAgICAgICAgICAgIGVtaXROYW1lc3BhY2VzSGVscGVyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGVtaXRFbGVtZW50KCBuYW1lLCBnZXRQcmVmaXhlZE5hbWUoIG5hbWUgKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXRDaGFyYWN0ZXJzICggY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5jaGFyYWN0ZXJzKCBidWYsIG9mZiwgY2NoICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFNBWEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvd1NheEV4Y2VwdGlvbiggZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgZW1pdENoYXJhY3RlcnMgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtaXRDaGFyYWN0ZXJzKCBzLmdldENwRm9yUG9zKCBnZXRSb290KCksIHAgKSwgY2NoICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbWl0Q2hhcmFjdGVycyAoIGludCBjcCwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjY2ggPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGVtaXRDaGFyYWN0ZXJzKAotICAgICAgICAgICAgICAgIGdldFJvb3QoKS5fdGV4dC5fYnVmLCBnZXRSb290KCkuX3RleHQudW5PYnNjdXJlKCBjcCwgY2NoICksCi0gICAgICAgICAgICAgICAgY2NoICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbWl0Q2hhcmFjdGVycyAoIFN0cmluZ0J1ZmZlciBzYiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBzYi50b1N0cmluZygpOyAvLyBJbmVmZmljaWVudCwgdXNlIGEgc2hhcmVkIGNoYXJbXQotICAgICAgICAgICAgCi0gICAgICAgICAgICBlbWl0Q2hhcmFjdGVycyggdGV4dC50b0NoYXJBcnJheSgpLCAwLCB0ZXh0Lmxlbmd0aCgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbWl0RW5kRWxlbWVudCAoIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuZW5kRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbmFtZS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0UHJlZml4ZWROYW1lKCBuYW1lICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggU0FYRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93U2F4RXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoIGl0ZXJhdGVNYXBwaW5ncygpIDsgaGFzTWFwcGluZygpIDsgbmV4dE1hcHBpbmcoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuZW5kUHJlZml4TWFwcGluZyggbWFwcGluZ1ByZWZpeCgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoICggU0FYRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dTYXhFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbmROYW1lc3BhY2VzICggKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgX2F0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCkgOyBpICsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBxbiA9IF9hdHRyaWJ1dGVzLmdldFFOYW1lKCBpICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoIXFuLnN0YXJ0c1dpdGgoICJ4bWxucyIgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgICAgIGludCBqID0gcW4uaW5kZXhPZiggJzonICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGogPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLmVuZFByZWZpeE1hcHBpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcW4uc3Vic3RyaW5nKCBqICsgMSApICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLmVuZFByZWZpeE1hcHBpbmcoICIiICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBTQVhFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3dTYXhFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRQcmVmaXhlZE5hbWUgKCBRTmFtZSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5zID0gbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIFN0cmluZyBscCA9IG5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0KLSAgICAgICAgICAgIGlmIChucy5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBscDsKLQotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IGdldFVyaU1hcHBpbmcoIG5zICk7Ci0KLSAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbHA7Ci0KLSAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyAiOiIgKyBscDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbWl0RWxlbWVudCAoIFFOYW1lIG5hbWUsIFN0cmluZyBwcmVmaXhlZE5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuc3RhcnRFbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICBnZXRQcmVmaXhlZE5hbWUoIG5hbWUgKSwgX2F0dHJpYnV0ZXMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggU0FYRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93U2F4RXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RW5kICggU3BsYXkgcywgUU5hbWUgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZW1pdEVuZEVsZW1lbnQoIG5hbWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0QWZ0ZXIgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfdGV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgIGVtaXRDaGFyYWN0ZXJzKCBzLCBwLCBjY2ggKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlbWl0Q2hhcmFjdGVycyggX3RleHQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXREb2NUeXBlKAotICAgICAgICAgICAgU3RyaW5nIGRvY3R5cGVOYW1lLCBTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbGV4aWNhbGhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9sZXhpY2FsaGFuZGxlci5zdGFydERURCggZG9jdHlwZU5hbWUsIHB1YmxpY0lELCBzeXN0ZW1JRCApOwotICAgICAgICAgICAgICAgICAgICBfbGV4aWNhbGhhbmRsZXIuZW5kRFREKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoICggU0FYRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dTYXhFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb21tZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbGV4aWNhbGhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgY3AgPSBnZXRSb290KCkuZ2V0Q3AoIHMgKTsKLSAgICAgICAgICAgICAgICBpbnQgY2NoID0gcy5nZXRDY2hWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfbGV4aWNhbGhhbmRsZXIuY29tbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFJvb3QoKS5fdGV4dC5fYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Um9vdCgpLl90ZXh0LnVuT2JzY3VyZSggY3AsIGNjaCApLAotICAgICAgICAgICAgICAgICAgICAgICAgY2NoICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoICggU0FYRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dTYXhFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0UHJvY2luc3QgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLnByb2Nlc3NpbmdJbnN0cnVjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcy5nZXRMb2NhbCgpLCBzLmdldFRleHQoIGdldFJvb3QoKSApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIFNBWEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvd1NheEV4Y2VwdGlvbiggZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHRGcmFnbWVudCAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdENvbnRhaW5lckhlbHBlciggbnVsbCwgX2ZyYWdtZW50LCBudWxsLCBudWxsICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChfdGV4dCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfdGV4dC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIGVtaXRDaGFyYWN0ZXJzKCBfdGV4dCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocyAhPSBudWxsICYmIGNjaCA+IDApCi0gICAgICAgICAgICAgICAgZW1pdENoYXJhY3RlcnMoIHMsIHAsIGNjaCApOwotCi0gICAgICAgICAgICBlbWl0RW5kRWxlbWVudCggX2ZyYWdtZW50ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0WG1sbnNGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBudWxsLCBfZnJhZ21lbnQsIG51bGwsIG51bGwgKTsKLSAgICAgICAgICAgIGVtaXRFbmRFbGVtZW50KCBfZnJhZ21lbnQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRBdHRyRnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgZW1pdENvbnRhaW5lckhlbHBlciggbnVsbCwgX2ZyYWdtZW50LCBzLCBfdGV4dCApOwotICAgICAgICAgICAgZW1pdEVuZEVsZW1lbnQoIF9mcmFnbWVudCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbW1lbnRGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBudWxsLCBfZnJhZ21lbnQsIG51bGwsIG51bGwgKTsKLSAgICAgICAgICAgIGVtaXRDb21tZW50KCBzICk7Ci0gICAgICAgICAgICBlbWl0RW5kRWxlbWVudCggX2ZyYWdtZW50ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0UHJvY2luc3RGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBudWxsLCBfZnJhZ21lbnQsIG51bGwsIG51bGwgKTsKLSAgICAgICAgICAgIGVtaXRQcm9jaW5zdCggcyApOwotICAgICAgICAgICAgZW1pdEVuZEVsZW1lbnQoIF9mcmFnbWVudCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEF0dHJpYnV0ZXNJbXBsIF9hdHRyaWJ1dGVzOwotCi0gICAgICAgIHByaXZhdGUgU0FYRXhjZXB0aW9uIF9zYXhFeGNlcHRpb247Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIENvbnRlbnRIYW5kbGVyIF9jb250ZW50SGFuZGxlcjsKLSAgICAgICAgcHJpdmF0ZSBMZXhpY2FsSGFuZGxlciBfbGV4aWNhbGhhbmRsZXI7Ci0gICAgfQotCi0gICAgICAgICAgICAKLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBEb21TYXZlciBleHRlbmRzIFNhdmVyCi0gICAgewotICAgICAgICBEb21TYXZlciAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIGJvb2xlYW4gY3JlYXRlRG9jLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlciggciwgcywgcCwgb3B0aW9ucyApOwotICAgICAgICAgICAgX2NyZWF0ZURvYyA9IGNyZWF0ZURvYzsKLSAgICAgICAgfQotCi0gICAgICAgIE5vZGUgZXhwb3J0RG9tICggKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPIC0gYWRkIGFuIG9wdGlvbnMgd2hpY2ggc3BlY2lmaWVzIGEgRG9jdW1lbnQgd2l0aCB3aGljaAotICAgICAgICAgICAgLy8gdG8gY3JlYXRlIHRoZSBmcmFnbWVudAotCi0gICAgICAgICAgICBfZG9jID0KLSAgICAgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkuCi0gICAgICAgICAgICAgICAgICAgIG5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0KLSAgICAgICAgICAgIE5vZGUgcmVzdWx0OwotCi0gICAgICAgICAgICBpZiAoX2NyZWF0ZURvYykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBfY3VycmVudE5vZGUgPSBfZG9jOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERvY3VtZW50RnJhZ21lbnQgZnJhZyA9IF9kb2MuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9jdXJyZW50Tm9kZSA9IGZyYWc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdoaWxlICggcHJvY2VzcygpICkKLSAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29udGFpbmVyICggQ29udGFpbmVyIGMsIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0KLSAgICAgICAgICAgIGlmIChjLmlzRG9jKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGhhc01hcHBpbmdzKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVzcGFjZSBhdHRyaWJ1dGUgbm90IGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IiApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBjLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgbm90IGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgaWYgKF90ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoX3RleHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYy5nZXRDY2goKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHRleHQgPSByLl90ZXh0LmZldGNoKCAwLCBjLmdldENjaCgpICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsICYmIF9jdXJyZW50Tm9kZSAhPSBfZG9jKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2N1cnJlbnROb2RlLmluc2VydEJlZm9yZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIF9kb2MuY3JlYXRlVGV4dE5vZGUoIHRleHQgKSwgbnVsbCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgYy5pc0JlZ2luKCk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcW5hbWUgPSBjLmdldExvY2FsKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYy5nZXRVcmkoKS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZ2V0VXJpTWFwcGluZyggYy5nZXRVcmkoKSApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUgPSBwcmVmaXggKyAiOiIgKyBxbmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGUgPSBfZG9jLmNyZWF0ZUVsZW1lbnROUyggYy5nZXRVcmkoKSwgcW5hbWUgKTsKLQotICAgICAgICAgICAgICAgIF9jdXJyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGUsIG51bGwgKTsKLQotICAgICAgICAgICAgICAgIGZvciAoIGl0ZXJhdGVNYXBwaW5ncygpIDsgaGFzTWFwcGluZygpIDsgbmV4dE1hcHBpbmcoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gbWFwcGluZ1ByZWZpeCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lID0gInhtbG5zIjsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUgPSAieG1sbnM6IiArIHByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBlLnNldEF0dHJpYnV0ZU5TKCBTcGxheS5feG1sbnNVcmksIHFuYW1lLCBtYXBwaW5nVXJpKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBJdGVyYXRvciBpID0gX2F0dHJzLmtleVNldCgpLml0ZXJhdG9yKCkgOyBpLmhhc05leHQoKSA7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNwbGF5IHMgPSAoU3BsYXkpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcW5hbWUgPSBzLmdldExvY2FsKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHMuZ2V0VXJpKCkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZ2V0VXJpTWFwcGluZyggcy5nZXRVcmkoKSApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZSA9IHByZWZpeCArICI6IiArIHFuYW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGludmFsaWRBdHRyVmFsdWUgPSAoU3RyaW5nKSBfYXR0cnMuZ2V0KCBzICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGVOUygKLSAgICAgICAgICAgICAgICAgICAgICAgIHMuZ2V0VXJpKCksIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZEF0dHJWYWx1ZSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzLmdldFRleHQoIHIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW52YWxpZEF0dHJWYWx1ZSApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChjLmlzTGVhZigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChfdGV4dCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RleHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYy5nZXRDY2hWYWx1ZSgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5fdGV4dC5mZXRjaCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5nZXRDcEZvclBvcyggciwgMSApLCBjLmdldENjaFZhbHVlKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwgJiYgX2N1cnJlbnROb2RlICE9IF9kb2MpCi0gICAgICAgICAgICAgICAgICAgICAgICBlLmluc2VydEJlZm9yZSggX2RvYy5jcmVhdGVUZXh0Tm9kZSggdGV4dCApLCBudWxsICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9jdXJyZW50Tm9kZSA9IGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEVuZCAoIFNwbGF5IHMsIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBfY3VycmVudE5vZGUgPSBfY3VycmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHRBZnRlciAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGNjaCA+IDA7Ci0KLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLQotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoX3RleHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3RleHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2NoID4gMCkKLSAgICAgICAgICAgICAgICB0ZXh0ID0gci5fdGV4dC5mZXRjaCggcy5nZXRDcEZvclBvcyggciwgcCApLCBjY2ggKTsKLQotICAgICAgICAgICAgaWYgKF9jdXJyZW50Tm9kZSAhPSBfZG9jKQotICAgICAgICAgICAgICAgIF9jdXJyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIF9kb2MuY3JlYXRlVGV4dE5vZGUoIHRleHQgKSwgbnVsbCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdERvY1R5cGUoCi0gICAgICAgICAgICBTdHJpbmcgZG9jdHlwZU5hbWUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb21tZW50ICggU3BsYXkgcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLQotICAgICAgICAgICAgX2N1cnJlbnROb2RlLmluc2VydEJlZm9yZSgKLSAgICAgICAgICAgICAgICBfZG9jLmNyZWF0ZUNvbW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIHIuX3RleHQuZmV0Y2goCi0gICAgICAgICAgICAgICAgICAgICAgICBzLmdldENwRm9yUG9zKCByLCAwICksIHMuZ2V0Q2NoVmFsdWUoKSApICksIG51bGwgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRQcm9jaW5zdCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0KLSAgICAgICAgICAgIF9jdXJyZW50Tm9kZS5pbnNlcnRCZWZvcmUoCi0gICAgICAgICAgICAgICAgX2RvYy5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oCi0gICAgICAgICAgICAgICAgICAgIHMuZ2V0TG9jYWwoKSwKLSAgICAgICAgICAgICAgICAgICAgci5fdGV4dC5mZXRjaCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHMuZ2V0Q3BGb3JQb3MoIHIsIDAgKSwgcy5nZXRDY2hWYWx1ZSgpICkgKSwgbnVsbCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFhtbG5zRnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSBhIG5vZGUgZm9yIGEgbmFtZXNwYWNlIGF0dHJpYnV0ZSIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRBdHRyRnJhZ21lbnQgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSBhIG5vZGUgZm9yIGEgYXR0cmlidXRlIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHRGcmFnbWVudCAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQlVHQlVHIC0gdGhlcmUgY291bGQgYmUgbmFtZXNwYWNlcyBwdXNoZWQgZm9yIHRoaXMgdGV4dCwgYnV0IG5vdAotICAgICAgICAgICAgLy8gc3VyZSBob3cgdG8gcmVwcmVzZW50IHRoZW0gaGVyZS4uLi4gIEkgc2hvdWxkIHJlYWxseSBwdXQgdGhlCi0gICAgICAgICAgICAvLyBmcmFnbWVudCBsb2dpYyBpbiB0aGUgYmFzZSBzYXZlciBhbmQgaGF2ZSB0aGUgYmFzZSBzYXZlcgotICAgICAgICAgICAgLy8gc3ludGhlc2l6ZSB3ZWxsIGZvcm1lZCBvdXRwdXQuLi4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0KLSAgICAgICAgICAgICAgICBfY3VycmVudE5vZGUuaW5zZXJ0QmVmb3JlKAotICAgICAgICAgICAgICAgICAgICBfZG9jLmNyZWF0ZVRleHROb2RlKAotICAgICAgICAgICAgICAgICAgICBfdGV4dCAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICA/IF90ZXh0LnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogcyAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByLl90ZXh0LmZldGNoKCBzLmdldENwRm9yUG9zKCByLCBwICksIGNjaCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiIgKSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbW1lbnRGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0KLSAgICAgICAgICAgIF9jdXJyZW50Tm9kZS5pbnNlcnRCZWZvcmUoCi0gICAgICAgICAgICAgICAgX2RvYy5jcmVhdGVDb21tZW50KAotICAgICAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKAotICAgICAgICAgICAgICAgICAgICAgICAgcy5nZXRDcEZvclBvcyggciwgMCApLCBzLmdldENjaFZhbHVlKCkgKSApLCBudWxsICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0UHJvY2luc3RGcmFnbWVudCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0KLSAgICAgICAgICAgIF9jdXJyZW50Tm9kZS5pbnNlcnRCZWZvcmUoCi0gICAgICAgICAgICAgICAgX2RvYy5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oCi0gICAgICAgICAgICAgICAgICAgIHMuZ2V0TG9jYWwoKSwKLSAgICAgICAgICAgICAgICAgICAgci5fdGV4dC5mZXRjaCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHMuZ2V0Q3BGb3JQb3MoIHIsIDAgKSwgcy5nZXRDY2hWYWx1ZSgpICkgKSwgbnVsbCApOwotICAgICAgICB9Ci0KLSAgICAgICAgRG9jdW1lbnQgX2RvYzsKLSAgICAgICAgTm9kZSAgICAgX2N1cnJlbnROb2RlOwotICAgICAgICBib29sZWFuICBfY3JlYXRlRG9jOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciAgX3RleHQ7Ci0gICAgcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciAgX3NiOwotICAgIHByb3RlY3RlZCBib29sZWFuICAgICAgIF9za2lwQ29udGFpbmVyRmluaXNoOwotICAgIHByb3RlY3RlZCBMaW5rZWRIYXNoTWFwIF9hdHRyczsKLSAgICAKLSAgICBwcml2YXRlIEhhc2hTZXQgX2F0dHJOYW1lczsKLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfaW5uZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSb290ICAgIF9yb290OwotICAgIHByaXZhdGUgZmluYWwgU3BsYXkgICBfdG9wOwotICAgIHByaXZhdGUgZmluYWwgbG9uZyAgICBfdmVyc2lvbjsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIF93YW50RHVwQXR0cnM7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX3dhbnRGcmFnVGVzdDsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfbmVlZHNGcmFnOwotICAgIHByb3RlY3RlZCBRTmFtZSAgIF9mcmFnbWVudDsKLSAgICBwcm90ZWN0ZWQgUU5hbWUgICBfZG9jRWxlbTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgUU5hbWUgX3N5bnRoRWxlbTsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIF9zYXZlTmFtZXNwYWNlc0ZpcnN0OwotICAgIHByb3RlY3RlZCBib29sZWFuIF91c2VEZWZhdWx0TmFtZXNwYWNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIF9wcmV0dHlQcmludDsKLSAgICBwcml2YXRlIGludCAgICAgX3ByZXR0eUluZGVudDsKLSAgICBwcml2YXRlIGludCAgICAgX3ByZXR0eU9mZnNldDsKLQotICAgIHByaXZhdGUgU3BsYXkgICBfc3BsYXk7Ci0gICAgcHJpdmF0ZSBpbnQgICAgIF9wb3M7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9wcmVQcm9jZXNzOwotICAgIHByaXZhdGUgYm9vbGVhbiBfcG9zdFByb2Nlc3M7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9wb3N0UG9wOwotICAgIHByaXZhdGUgU3BsYXkgICBfZW5kU3BsYXk7Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdCBfbmFtZXNwYWNlU3RhY2s7Ci0gICAgcHJpdmF0ZSBpbnQgICAgICAgX2N1cnJlbnRNYXBwaW5nOwotICAgIHByaXZhdGUgSGFzaE1hcCAgIF91cmlNYXA7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwICAgX3ByZWZpeE1hcDsKLSAgICBwcml2YXRlIGJvb2xlYW4gICBfZmlyc3RQdXNoOwotICAgIHByaXZhdGUgU3RyaW5nICAgIF9pbml0aWFsRGVmYXVsdFVyaTsKLSAgICAKLSAgICBwcml2YXRlIEhhc2hNYXAgX3ByZUNvbXB1dGVkTmFtZXNwYWNlczsKLSAgICBwcml2YXRlIFN0cmluZyAgX2ZpbHRlclByb2NpbnN0OwotICAgIHByaXZhdGUgTWFwICAgICBfc3VnZ2VzdGVkUHJlZml4ZXM7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nICBfbmV3TGluZTsKLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvU3BsYXkuamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvU3BsYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNiM2RlOC4uMDAwMDAwMAotLS0gYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1NwbGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjQ1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmVVc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yLlRva2VuVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5YbWxCb29rbWFyazsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5YbWxNYXJrOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3BsYXkgZXh0ZW5kcyBHb29iZXJzCi17Ci0gICAgLy8KLSAgICAvLyBDYW4ndCBjaGFuZ2UgdGhlIGtpbmQgb2YgYSBiYXNlIHRva2VuCi0gICAgLy8KLQotICAgIFNwbGF5ICggaW50IGtpbmQsIGJvb2xlYW4gaXMgKQotICAgIHsKLSAgICAgICAgX2JpdHMgPSBraW5kOwotCi0gICAgICAgIGlmIChpcykKLSAgICAgICAgICAgIF9iaXRzICs9IDB4ODsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIFNwbGF5IGtpbmRzCi0gICAgLy8KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgRE9DICAgICAgPSAgMDsgLy8gRE9DIG11c3QgYmUgMAotICAgIHN0YXRpYyBmaW5hbCBpbnQgQkVHSU4gICAgPSAgMTsgLy8gQkVHSU4gbXVzdCBiZSAxCi0gICAgc3RhdGljIGZpbmFsIGludCBBVFRSICAgICA9ICAyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVCAgPSAgMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IFBST0NJTlNUID0gIDQ7Ci0gICAgc3RhdGljIGZpbmFsIGludCBST09UICAgICA9ICA1OyAvLyBST09UIG11c3QgYmUgc2Vjb25kIHRvIGxhc3QKLSAgICBzdGF0aWMgZmluYWwgaW50IEVORCAgICAgID0gIDY7IC8vIEVORCBtdXN0IGJlIGxhc3QKLQotICAgIC8vCi0gICAgLy8KLSAgICAvLwotCi0gICAgZmluYWwgaW50IGdldEtpbmQgKCApIHsgcmV0dXJuIF9iaXRzICYgMHg3OyB9Ci0KLSAgICBmaW5hbCBib29sZWFuIGlzRG9jICAgICAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gRE9DOyAgICAgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzUm9vdCAgICAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gUk9PVDsgICAgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzQmVnaW4gICAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gQkVHSU47ICAgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzRW5kICAgICAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gRU5EOyAgICAgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzQXR0ciAgICAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gQVRUUjsgICAgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzQ29tbWVudCAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gQ09NTUVOVDsgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzUHJvY2luc3QgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPT0gUFJPQ0lOU1Q7IH0KLSAgICBmaW5hbCBib29sZWFuIGlzQ29udGFpbmVyICggKSB7IHJldHVybiBnZXRLaW5kKCkgPD0gQkVHSU47ICAgIH0KLSAgICBmaW5hbCBib29sZWFuIGlzRmluaXNoICAgICggKSB7IHJldHVybiBnZXRLaW5kKCkgPj0gUk9PVDsgICAgIH0KLQotICAgIGZpbmFsIGludCBnZXRDY2ggICAgICAgICAgICggKSB7IHJldHVybiBfY2NoOyAgICAgICAgICAgICAgfQotCi0gICAgZmluYWwgaW50IGdldENkb2NCZWdpbiAgICAgKCApIHsgcmV0dXJuIDE7ICAgICAgICAgICAgICAgICB9Ci0gICAgZmluYWwgaW50IGdldENjaExlZnQgICAgICAgKCApIHsgcmV0dXJuIF9jY2hMZWZ0OyAgICAgICAgICB9Ci0gICAgZmluYWwgaW50IGdldENkb2NCZWdpbkxlZnQgKCApIHsgcmV0dXJuIF9iaXRzID4+IDU7ICAgICAgICB9Ci0gICAgZmluYWwgaW50IGdldENjaEFmdGVyICAgICAgKCApIHsgcmV0dXJuIF9jY2hBZnRlcjsgICAgICAgICB9Ci0gICAgZmluYWwgaW50IGdldENjaFZhbHVlICAgICAgKCApIHsgcmV0dXJuIF9jY2ggLSBfY2NoQWZ0ZXI7ICB9Ci0KLSAgICBRTmFtZSAgZ2V0TmFtZSAgKCApIHsgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOyB9Ci0gICAgU3RyaW5nIGdldFVyaSAgICggKSB7IHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsgfQotICAgIFN0cmluZyBnZXRMb2NhbCAoICkgeyB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7IH0KLQotICAgIC8vIEZvdXJ0aCBiaXQgaW4gX2JpdHMgaGFzIHNldmVyYWwgbWVhbmluZ3MsIGRlcGVuZGluZyBvbiBzcGxheSBraW5kCi0KLSAgICBmaW5hbCBib29sZWFuIGlzTm9ybWFsQXR0ciAoICkgeyByZXR1cm4gKF9iaXRzICYgMHhGKSA9PSAoMHgwICsgQVRUUik7IH0KLSAgICBmaW5hbCBib29sZWFuIGlzWG1sbnMgICAgICAoICkgeyByZXR1cm4gKF9iaXRzICYgMHhGKSA9PSAoMHg4ICsgQVRUUik7IH0KLSAgICBmaW5hbCBib29sZWFuIGlzTGVhZiAgICAgICAoICkgeyByZXR1cm4gKF9iaXRzICYgMHhGKSA9PSAoMHg4ICsgQkVHSU4pOyB9Ci0gICAgZmluYWwgYm9vbGVhbiBpc0ZyYWdtZW50ICAgKCApIHsgcmV0dXJuIChfYml0cyAmIDB4RikgPT0gKDB4OCArIENPTU1FTlQpOyB9Ci0gICAgZmluYWwgYm9vbGVhbiBpc1hzaUF0dHIgICAgKCApIHsgcmV0dXJuIGlzTm9ybWFsQXR0cigpICYmIGdldFVyaSgpLmVxdWFscyggX3hzaSApOyB9Ci0gICAgZmluYWwgYm9vbGVhbiBpc1hzaU5pbCAgICAgKCApIHsgcmV0dXJuIGlzTm9ybWFsQXR0cigpICYmIGdldE5hbWUoKS5lcXVhbHMoX3hzaU5pbCApOyB9Ci0gICAgZmluYWwgYm9vbGVhbiBpc1hzaVR5cGUgICAgKCApIHsgcmV0dXJuIGlzTm9ybWFsQXR0cigpICYmIGdldE5hbWUoKS5lcXVhbHMoIF94c2lUeXBlICk7IH0KLSAgICBmaW5hbCBib29sZWFuIGlzVHlwZWFibGUgICAoICkgeyByZXR1cm4gaXNDb250YWluZXIoKSB8fCBpc05vcm1hbEF0dHIoKTsgfQotCi0gICAgZmluYWwgdm9pZCB0b2dnbGVJc0xlYWYgKCApCi0gICAgewotICAgICAgICBhc3NlcnQgaXNCZWdpbigpOwotICAgICAgICBfYml0cyBePSAweDg7Ci0gICAgfQotCi0gICAgZmluYWwgYm9vbGVhbiBpc1ZhbGlkICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0ICgoX2JpdHMgJiAweDEwKSA9PSAwKSB8fCBpc1R5cGVhYmxlKCk7Ci0gICAgICAgIHJldHVybiAoX2JpdHMgJiAweDEwKSA9PSAwOwotICAgIH0KLQotICAgIGZpbmFsIGJvb2xlYW4gaXNJbnZhbGlkICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0ICgoX2JpdHMgJiAweDEwKSA9PSAwKSB8fCBpc1R5cGVhYmxlKCk7Ci0gICAgICAgIHJldHVybiAoX2JpdHMgJiAweDEwKSAhPSAwOwotICAgIH0KLQotICAgIGZpbmFsIHZvaWQgdG9nZ2xlSXNJbnZhbGlkICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzVHlwZWFibGUoKTsKLSAgICAgICAgX2JpdHMgXj0gMHgxMDsKLSAgICB9Ci0KLSAgICBmaW5hbCB2b2lkIGFkanVzdENjaCAoIGludCBkZWx0YSApCi0gICAgewotICAgICAgICBfY2NoICs9IGRlbHRhOwotICAgICAgICBhc3NlcnQgX2NjaCA+PSAwOwotICAgIH0KLQotICAgIGZpbmFsIHZvaWQgYWRqdXN0Q2NoQWZ0ZXIgKCBpbnQgZGVsdGEgKQotICAgIHsKLSAgICAgICAgX2NjaEFmdGVyICs9IGRlbHRhOwotICAgICAgICBhc3NlcnQgX2NjaEFmdGVyID49IDA7Ci0gICAgfQotCi0gICAgZmluYWwgdm9pZCBhZGp1c3RDY2hMZWZ0ICggaW50IGRlbHRhICkKLSAgICB7Ci0gICAgICAgIF9jY2hMZWZ0ICs9IGRlbHRhOwotICAgICAgICBhc3NlcnQgX2NjaExlZnQgPj0gMDsKLSAgICB9Ci0KLSAgICBmaW5hbCB2b2lkIGFkanVzdENkb2NCZWdpbkxlZnQgKCBpbnQgZCApCi0gICAgewotICAgICAgICBfYml0cyArPSBkICogMzI7Ci0gICAgICAgIGFzc2VydCBnZXRDZG9jQmVnaW5MZWZ0KCkgPj0gMDsKLSAgICB9Ci0KLSAgICBmaW5hbCBTcGxheSBnZXRGaW5pc2hTcGxheSAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc0NvbnRhaW5lcigpOwotICAgICAgICByZXR1cm4gaXNMZWFmKCkgPyB0aGlzIDogKChDb250YWluZXIpIHRoaXMpLmdldEZpbmlzaCgpOwotICAgIH0KLQotICAgIGZpbmFsIGludCBnZXRQb3NBZnRlciAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRFbmRQb3MoKSAtIGdldENjaEFmdGVyKCk7Ci0gICAgfQotCi0gICAgZmluYWwgaW50IGdldFBvc0xlYWZFbmQgKCApCi0gICAgewotICAgICAgICBhc3NlcnQgaXNMZWFmKCk7Ci0gICAgICAgIHJldHVybiAxICsgZ2V0Q2NoVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBmaW5hbCBpbnQgZ2V0Q3BGb3JQb3MgKCBSb290IHIsIGludCBwICkKLSAgICB7Ci0gICAgICAgIGludCBjcCA9IHIuZ2V0Q3AoIHRoaXMgKTsKLQotICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGNwOwotCi0gICAgICAgIHJldHVybgotICAgICAgICAgICAgaXNMZWFmKCkKLSAgICAgICAgICAgICAgICA/IHAgLSAocCA8PSBnZXRQb3NMZWFmRW5kKCkgPyAxIDogMikgKyBjcAotICAgICAgICAgICAgICAgIDogcCAtIDEgKyBnZXRDY2hWYWx1ZSgpICsgY3A7Ci0gICAgfQotCi0gICAgZmluYWwgaW50IGdldFBvc3RDY2ggKCBpbnQgcCApCi0gICAgewotICAgICAgICBhc3NlcnQgcCA+PSAwICYmIHAgPD0gZ2V0RW5kUG9zKCk7Ci0KLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBpc0xlYWYoKSAmJiBwIDw9IGdldFBvc0xlYWZFbmQoKQotICAgICAgICAgICAgICAgID8gZ2V0UG9zTGVhZkVuZCgpIC0gcAotICAgICAgICAgICAgICAgIDogZ2V0RW5kUG9zKCkgLSBwOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgX3hzaSA9Ci0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIF9zY2hlbWEgPQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBfb3BlbkZyYWdVcmkgPQotICAgICAgICAiaHR0cDovL3d3dy5vcGVudXJpLm9yZy9mcmFnbWVudCI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIF94bWwxOTk4VXJpID0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIF94bWxuc1VyaSA9Ci0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyI7Ci0KLSAgICBzdGF0aWMgZmluYWwgUU5hbWUgX3hzaU5pbCAgPSBuZXcgUU5hbWUoIF94c2ksICJuaWwiICk7Ci0gICAgc3RhdGljIGZpbmFsIFFOYW1lIF94c2lUeXBlID0gbmV3IFFOYW1lKCBfeHNpLCAidHlwZSIgKTsKLSAgICBzdGF0aWMgZmluYWwgUU5hbWUgX29wZW51cmlGcmFnbWVudCA9IG5ldyBRTmFtZSggX29wZW5GcmFnVXJpLCAiZnJhZ21lbnQiICk7Ci0gICAgc3RhdGljIGZpbmFsIFFOYW1lIF94bWxGcmFnbWVudCA9IG5ldyBRTmFtZSggIiIsICJ4bWwtZnJhZ21lbnQiICk7Ci0KLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1htbEZyYWdtZW50ICggUU5hbWUgbmFtZSApCi0gICAgewotICAgICAgICByZXR1cm4gX29wZW51cmlGcmFnbWVudC5lcXVhbHMoIG5hbWUgKSB8fCBfeG1sRnJhZ21lbnQuZXF1YWxzKCBuYW1lICk7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gYmVnaW5zV2l0aFhtbCAoIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIGlmIChuYW1lLmxlbmd0aCgpIDwgMykKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBjaGFyIGNoOwotCi0gICAgICAgIGlmICgoKGNoID0gbmFtZS5jaGFyQXQoIDAgKSkgPT0gJ3gnIHx8IGNoID09ICdYJykgJiYKLSAgICAgICAgICAgICAgICAoKGNoID0gbmFtZS5jaGFyQXQoIDEgKSkgPT0gJ20nIHx8IGNoID09ICdNJykgJiYKLSAgICAgICAgICAgICAgICAoKGNoID0gbmFtZS5jaGFyQXQoIDIgKSkgPT0gJ2wnIHx8IGNoID09ICdMJykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcmV0dXJucyB0aGUgcG9zIG9mIHRoZSB2ZXJ5IGVuZCBvZiB0aGUgc3BsYXkuICBUaGlzIGlzIG5vdAotICAgICAqIGdlbmVyYWxseSBhIHZhbGlkIHBvc2l0aW9uIHRvIGV4aXN0IGJlY2F1c2UgaW4gdGhlc2UgY2FzZXMsIEkKLSAgICAgKiBmb3JjZSB0aGUgcG9zaXRpb24gdG8gYmUgMCBvbiB0aGUgbmV4dCBzcGxheS4KLSAgICAgKi8KLQotICAgIGZpbmFsIGludCBnZXRFbmRQb3MgKCApCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TWF4UG9zKCkgKyAxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcmV0dXJucyB0aGUgbGFyZ2VzdCBwb3MgcG9zc2libGUgd2l0aG91dCBhY3R1YWxseSBiZWluZyBhdAotICAgICAqIHRoZSBlbmQgb2YgdGhlIHNwbGF5LgotICAgICAqLwotCi0gICAgZmluYWwgaW50IGdldE1heFBvcyAoICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoIGdldEtpbmQoKSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBBVFRSICAgICA6Ci0gICAgICAgIGNhc2UgUk9PVCAgICAgOiByZXR1cm4gMDsKLSAgICAgICAgY2FzZSBCRUdJTiAgICA6IHJldHVybiAoaXNMZWFmKCkgPyAxIDogMCkgKyBnZXRDY2goKTsKLSAgICAgICAgY2FzZSBET0MgICAgICA6Ci0gICAgICAgIGNhc2UgQ09NTUVOVCAgOgotICAgICAgICBjYXNlIFBST0NJTlNUIDoKLSAgICAgICAgY2FzZSBFTkQgICAgICA6IHJldHVybiBnZXRDY2hBZnRlcigpOwotCi0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOiAiVW5leHBlY3RlZCBzcGxheSBraW5kICIgK2dldEtpbmQoKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNXaGl0ZVNwYWNlICggY2hhciBjaCApCi0gICAgewotICAgICAgICBzd2l0Y2ggKCBjaCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgJyAnOgotICAgICAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1doaXRlU3BhY2UgKCBTdHJpbmcgcyApCi0gICAgewotICAgICAgICBpbnQgbCA9IHMubGVuZ3RoKCk7Ci0KLSAgICAgICAgd2hpbGUgKCBsLS0gPiAwKQotICAgICAgICAgICAgaWYgKCFpc1doaXRlU3BhY2UoIHMuY2hhckF0KCBsICkpKQotICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzV2hpdGVTcGFjZSAoIFN0cmluZ0J1ZmZlciBzYiApCi0gICAgewotICAgICAgICBpbnQgbCA9IHNiLmxlbmd0aCgpOwotCi0gICAgICAgIHdoaWxlICggbC0tID4gMCkKLSAgICAgICAgICAgIGlmICghaXNXaGl0ZVNwYWNlKCBzYi5jaGFyQXQoIGwgKSkpCi0gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgZmluYWwgYm9vbGVhbiBpc0FmdGVyV2hpdGVTcGFjZSAoIFJvb3QgciApCi0gICAgewotICAgICAgICBpbnQgY2NoQWZ0ZXIgPSBnZXRDY2hBZnRlcigpOwotCi0gICAgICAgIGlmIChjY2hBZnRlciA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgaW50IG9mZiA9Ci0gICAgICAgICAgICByLl90ZXh0LnVuT2JzY3VyZSgKLSAgICAgICAgICAgICAgICByLmdldENwKCB0aGlzICkgKyBnZXRDY2goKSAtIGNjaEFmdGVyLCBjY2hBZnRlciApOwotCi0gICAgICAgIHdoaWxlICggY2NoQWZ0ZXItLSA+IDAgKQotICAgICAgICAgICAgaWYgKCFpc1doaXRlU3BhY2UoIHIuX3RleHQuX2J1Zlsgb2ZmICsgY2NoQWZ0ZXIgXSApKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBmaW5hbCB2b2lkIHNldE5hbWUgKCBSb290IHIsIFFOYW1lIG5ld05hbWUgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzQmVnaW4oKSB8fCBpc0F0dHIoKSB8fCBpc1Byb2NpbnN0KCk7Ci0KLSAgICAgICAgLy8gQlVHQlVHIC0gZGVhbCB3aXRoIHhzaTpuaWwgaGVyZSB0b28KLQotICAgICAgICBRTmFtZSBvbGROYW1lID0gZ2V0TmFtZSgpOwotCi0gICAgICAgIGlmICghbmV3TmFtZS5lcXVhbHMoIG9sZE5hbWUgKSkKLSAgICAgICAgewotICAgICAgICAgICAgci5zdGFydENoYW5nZSgpOwotCi0gICAgICAgICAgICAoKFFOYW1lU3BsYXkpIHRoaXMpLmNoYW5nZU5hbWUoIG5ld05hbWUgKTsKLQotICAgICAgICAgICAgaWYgKCFpc1Byb2NpbnN0KCkgJiYgIWlzWG1sbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgaXNBdHRyKCkgfHwgaXNCZWdpbigpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzQmVnaW4oKSkKLSAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdFR5cGVzKCByICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoX3hzaVR5cGUuZXF1YWxzKCBvbGROYW1lICkgfHwgX3hzaVR5cGUuZXF1YWxzKCBuZXdOYW1lICkpCi0gICAgICAgICAgICAgICAgICAgIGdldENvbnRhaW5lcigpLmRpc2Nvbm5lY3RUeXBlcyggciApOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKF94c2lOaWwuZXF1YWxzKCBvbGROYW1lICkgfHwgX3hzaU5pbC5lcXVhbHMoIG5ld05hbWUgKSkKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkuaW52YWxpZGF0ZU5pbCgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdFR5cGVzKCByICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHIuaW52YWxpZGF0ZVZlcnNpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgaXMgYW4gaW52YWxpZCBsZWFmLCB0aGVuIHJlZnJlc2ggaXQncyB2YWx1ZSBhbmQgcmV0dXJuIHRoZQotICAgICAqIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFkZGVkLgotICAgICAqLwotCi0gICAgZmluYWwgaW50IGVuc3VyZUNvbnRlbnRWYWxpZCAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc0NvbnRhaW5lcigpOwotCi0gICAgICAgIGlmIChpc1ZhbGlkKCkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBUeXBlIHQgPSBwZWVrVHlwZSgpOwotCi0gICAgICAgIHJldHVybiB0LnZhbGlkYXRlQ29udGVudCggdGhpcywgdCApOwotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBFbnN1cmUgdGhhdCB0aGUgdmFsdWUgKEFUVFIsIENPTU1FTlQgYW5kIFBST0NJTlNUKSBpcyB2YWxpZC4gIFJlYWxseQotICAgICAgKiBvbmx5IGRvZXMgYW55dGhpbmcgZm9yIGF0dHJzLgotICAgICAgKi8KLQotICAgIGZpbmFsIHZvaWQgZW5zdXJlVmFsdWVWYWxpZCAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc05vcm1hbEF0dHIoKTsKLQotICAgICAgICBpZiAoaXNJbnZhbGlkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGUgdCA9IHBlZWtUeXBlKCk7Ci0gICAgICAgICAgICB0LnZhbGlkYXRlVmFsdWUoIHRoaXMsIHQgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIGEgcG9zaXRpb24gaW4gdGhpcyBzcGxheSwgcmV0dXJuIHRoZSBUb2tlblR5cGUgYXNzb2NpYXRlZCB3aXRoCi0gICAgICogdGhlIGNvbnRlbnQgdG8gdGhlIGxlZnQgb2YgdGhlIHBvc2l0aW9uLgotICAgICAqLwotCi0gICAgZmluYWwgVG9rZW5UeXBlIGdldFRva2VuVHlwZSAoIGludCBwICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBwID49IDAgJiYgcCA8PSBnZXRNYXhQb3MoKTsKLQotICAgICAgICAvLyBObyBuZWVkIHRvIHJldmFsaWRhdGUgdGV4dCB2YWx1ZSBoZXJlIGJlY2F1c2UgdGhlcmUgY2FuIGJlIG5vIHBvcwotICAgICAgICAvLyB3aGljaCBjb3VsZCBleGlzdHMgd2hlbiB0aGlzIHNwbGF5IGlzIGludmFsaWQgd2hpY2ggY291bGQgYmUgb24KLSAgICAgICAgLy8gdGV4dC4KLQotICAgICAgICAvLyBGaXJzdCwgc2VlIGlmIHdlJ3JlIGluL2F0IHRoZSB0ZXh0IGFmdGVyIHRoZSBzcGxheQotCi0gICAgICAgIGlmIChwID49IGdldFBvc0FmdGVyKCkpCi0gICAgICAgICAgICByZXR1cm4gVG9rZW5UeXBlLlRFWFQ7Ci0KLSAgICAgICAgc3dpdGNoICggZ2V0S2luZCgpICkKLSAgICAgICAgewotICAgICAgICBjYXNlIEFUVFIgOgotICAgICAgICAgICAgcmV0dXJuIGlzWG1sbnMoKSA/IFRva2VuVHlwZS5OQU1FU1BBQ0UgOiBUb2tlblR5cGUuQVRUUjsKLQotICAgICAgICBjYXNlIEJFR0lOIDoKLSAgICAgICAgICAgIGlmIChwID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRva2VuVHlwZS5TVEFSVDsKLQotICAgICAgICAgICAgYXNzZXJ0IGlzTGVhZigpOwotCi0gICAgICAgICAgICByZXR1cm4gcCA9PSBnZXRQb3NMZWFmRW5kKCkgPyBUb2tlblR5cGUuRU5EIDogVG9rZW5UeXBlLlRFWFQ7Ci0KLSAgICAgICAgY2FzZSBST09UICAgICA6IHJldHVybiBUb2tlblR5cGUuRU5ERE9DOwotICAgICAgICBjYXNlIERPQyAgICAgIDogcmV0dXJuIFRva2VuVHlwZS5TVEFSVERPQzsKLSAgICAgICAgY2FzZSBDT01NRU5UICA6IHJldHVybiBUb2tlblR5cGUuQ09NTUVOVDsKLSAgICAgICAgY2FzZSBQUk9DSU5TVCA6IHJldHVybiBUb2tlblR5cGUuUFJPQ0lOU1Q7Ci0gICAgICAgIGNhc2UgRU5EICAgICAgOiByZXR1cm4gVG9rZW5UeXBlLkVORDsKLQotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIGFzc2VydCBmYWxzZTogIlVuZXhwZWN0ZWQgc3BsYXkga2luZCAiICsgZ2V0S2luZCgpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYXVzZSB0aGlzIHNwbGF5IHRvIGJlY29tZSBhIGxlYWYuICBUaGlzIGRvZXMgbm90IGxvZ2ljYWxseQotICAgICAqIGFsdGVyIHRoZSBkb2N1bWVudCwgYnV0IGRvZXMgYWx0ZXIgdGhlIHBoeXNpY2FsIHNwbGF5IHRyZWUgd2hpY2gKLSAgICAgKiBkZW1hbmRzIHRoYXQgSSBpc3N1ZSBhIGNoYW5nZSBub3RpY2UuCi0gICAgICovCi0KLSAgICBmaW5hbCB2b2lkIGZvbGlhdGUgKCBSb290IHIgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzQmVnaW4oKTsKLSAgICAgICAgYXNzZXJ0ICFpc0xlYWYoKTsKLQotICAgICAgICBCZWdpbiBiID0gKEJlZ2luKSB0aGlzOwotICAgICAgICBTcGxheSBlID0gYi5nZXRGaW5pc2goKTsKLQotICAgICAgICBhc3NlcnQgYi5uZXh0Tm9uQXR0clNwbGF5KCkgPT0gZTsKLSAgICAgICAgYXNzZXJ0IGIuX2VuZCA9PSBlOwotICAgICAgICBhc3NlcnQgZS5pc0VuZCgpOwotICAgICAgICBhc3NlcnQgIWIuaXNMZWFmKCk7Ci0KLSAgICAgICAgLy8gQ2FsbGVyIG11c3QgaW5pdGlhdGUgY2hhbmdlCi0gICAgICAgIGFzc2VydCByLnZhbGlkYXRlQ2hhbmdlU3RhcnRlZCgpOwotCi0gICAgICAgIGludCBjY2hCZWZvcmUgPSBnZXRDY2goKTsKLQotICAgICAgICBlLnNhdmVUZXh0QWZ0ZXIoIHIgKTsKLQotICAgICAgICBiLl9lbmQgPSBudWxsOwotICAgICAgICBiLnRvZ2dsZUlzTGVhZigpOwotCi0gICAgICAgIGIuYWRqdXN0Q2NoQWZ0ZXIoIC0gY2NoQmVmb3JlICk7Ci0KLSAgICAgICAgLy8gTW92ZSB0aGUgZ29vYmVycyBmcm9tIHRoZSBlbmQgdG8gdGhlIGJlZ2luCi0KLSAgICAgICAgR29vYmVyIG5leHRHb29iZXI7Ci0gICAgICAgIGZvciAoIEdvb2JlciBnID0gZS5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IG5leHRHb29iZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXh0R29vYmVyID0gZS5uZXh0R29vYmVyKCBnICk7Ci0KLSAgICAgICAgICAgIGFzc2VydCBnLmdldFBvcygpID09IDA7Ci0gICAgICAgICAgICBnLnNldCggdGhpcywgY2NoQmVmb3JlICsgMSApOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICggR29vYmVyIGcgPSBmaXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IG5leHRHb29iZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXh0R29vYmVyID0gbmV4dEdvb2JlciggZyApOwotCi0gICAgICAgICAgICBpbnQgZ3AgPSBnLmdldFBvcygpOwotCi0gICAgICAgICAgICBpZiAoZ3AgPiBjY2hCZWZvcmUgKyAxKQotICAgICAgICAgICAgICAgIGcuc2V0KCB0aGlzLCBncCArIDEgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGUucmVtb3ZlU3BsYXkoIHIgKTsKLSAgICB9Ci0KLSAgICBmaW5hbCB2b2lkIGRlZm9saWF0ZSAoIFJvb3QgciApCi0gICAgewotICAgICAgICBhc3NlcnQgaXNMZWFmKCk7Ci0KLSAgICAgICAgLy8gQ2FsbGVyIG11c3QgaW5pdGlhdGUgY2hhbmdlCi0gICAgICAgIGFzc2VydCByLnZhbGlkYXRlQ2hhbmdlU3RhcnRlZCgpOwotCi0gICAgICAgIC8vIENhbGxlciBtdXN0IGVuc3VyZSBsZWFmIGlzIHZhbGlkCi0gICAgICAgIGFzc2VydCBpc1ZhbGlkKCk7Ci0KLSAgICAgICAgQmVnaW4gYiA9IChCZWdpbikgdGhpczsKLQotICAgICAgICBpbnQgcG9zTGVhZkVuZCA9IGdldFBvc0xlYWZFbmQoKTsKLSAgICAgICAgaW50IGNjaEFmdGVyID0gZ2V0Q2NoQWZ0ZXIoKTsKLSAgICAgICAgaW50IGNjaFZhbHVlID0gZ2V0Q2NoVmFsdWUoKTsKLQotICAgICAgICBTcGxheSBhID0gdGhpczsKLQotICAgICAgICBpbnQgY2NoQXR0ciA9IDA7Ci0KLSAgICAgICAgZm9yICggU3BsYXkgdCA9IG5leHRTcGxheSgpIDsgdC5pc0F0dHIoKSA7IHQgPSB0Lm5leHRTcGxheSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2NoQXR0ciArPSB0LmdldENjaCgpOwotICAgICAgICAgICAgYSA9IHQ7Ci0gICAgICAgIH0KLQotICAgICAgICByLmluc2VydFNwbGF5KCBiLl9lbmQgPSBuZXcgRW5kKCAoQmVnaW4pIHRoaXMgKSwgYSApOwotCi0gICAgICAgIGIudG9nZ2xlSXNMZWFmKCk7Ci0KLSAgICAgICAgYi5hZGp1c3RDY2hBZnRlciggY2NoVmFsdWUgLSBjY2hBZnRlciApOwotICAgICAgICBiLl9lbmQuYWRqdXN0Q2NoQWZ0ZXIoIGNjaEFmdGVyICk7Ci0KLSAgICAgICAgci51cGRhdGVDY2goIGIsIC0gY2NoQWZ0ZXIgKTsKLSAgICAgICAgci51cGRhdGVDY2goIGIuX2VuZCwgY2NoQWZ0ZXIgKTsKLQotICAgICAgICBpZiAoY2NoQXR0ciA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjcCA9IHIuZ2V0Q3AoIGIgKTsKLQotICAgICAgICAgICAgci5fdGV4dC5tb3ZlKAotICAgICAgICAgICAgICAgIGNwICsgY2NoVmFsdWUgKyBjY2hBZnRlciArIGNjaEF0dHIsCi0gICAgICAgICAgICAgICAgci5fdGV4dCwgY3AgKyBjY2hWYWx1ZSwgY2NoQWZ0ZXIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIEdvb2JlciBuZXh0R29vYmVyOwotICAgICAgICBmb3IgKCBHb29iZXIgZyA9IGZpcnN0R29vYmVyKCkgOyBnICE9IG51bGwgOyBnID0gbmV4dEdvb2JlciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5leHRHb29iZXIgPSBuZXh0R29vYmVyKCBnICk7Ci0KLSAgICAgICAgICAgIGludCBncCA9IGcuZ2V0UG9zKCk7Ci0KLSAgICAgICAgICAgIGlmIChncCA+PSBwb3NMZWFmRW5kKQotICAgICAgICAgICAgICAgIGcuc2V0KCBiLl9lbmQsIGdwIC0gcG9zTGVhZkVuZCApOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSB0ZXh0IGFmdGVyICp0aGlzKiBzcGxheS4KLSAgICAgKiBObyB2YWxpZGF0aW9uIGlzIGRvbmUsIGNhbGxlciBtdXN0IGRvIHRoYXQKLSAgICAgKi8KLQotICAgIHByaXZhdGUgZmluYWwgdm9pZCByZW1vdmVUZXh0QWZ0ZXIgKCBSb290IHIgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHIgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGdldFJvb3RTbG93KCkgPT0gcjsKLSAgICAgICAgYXNzZXJ0ICFpc1Jvb3QoKSAmJiAhaXNBdHRyKCk7Ci0KLSAgICAgICAgLy8gQ2FsbGVyIG11c3QgaW5pdGlhdGUgY2hhbmdlCi0gICAgICAgIGFzc2VydCByLnZhbGlkYXRlQ2hhbmdlU3RhcnRlZCgpOwotCi0gICAgICAgIGludCBjY2hUZXh0QWZ0ZXIgPSBnZXRDY2hBZnRlcigpOwotCi0gICAgICAgIGlmIChjY2hUZXh0QWZ0ZXIgPT0gMCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpbnQgY3BUZXh0QWZ0ZXIgPSByLmdldENwKCB0aGlzICkgKyBnZXRDY2goKSAtIGNjaFRleHRBZnRlcjsKLSAgICAgICAgaW50IHBvc1RleHRBZnRlciA9IGdldFBvc0FmdGVyKCk7Ci0KLSAgICAgICAgYWRqdXN0Q2NoQWZ0ZXIoIC0gY2NoVGV4dEFmdGVyICk7Ci0KLSAgICAgICAgci51cGRhdGVDY2goIHRoaXMsIC0gY2NoVGV4dEFmdGVyICk7Ci0KLSAgICAgICAgci5fdGV4dC5yZW1vdmUoIGNwVGV4dEFmdGVyLCBjY2hUZXh0QWZ0ZXIgKTsKLQotICAgICAgICBHb29iZXIgbmV4dEdvb2JlcjsKLSAgICAgICAgZm9yICggR29vYmVyIGcgPSBmaXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IG5leHRHb29iZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXh0R29vYmVyID0gbmV4dEdvb2JlciggZyApOwotCi0gICAgICAgICAgICBpbnQgayA9IGcuZ2V0S2luZCgpOwotCi0gICAgICAgICAgICBpZiAoZy5nZXRQb3MoKSA+PSBwb3NUZXh0QWZ0ZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGsgPT0gQU5OT1RBVElPTikKLSAgICAgICAgICAgICAgICAgICAgZy5kaXNjb25uZWN0KCByICk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoayA9PSBDVVJTT1IpCi0gICAgICAgICAgICAgICAgICAgIGcuc2V0KCBuZXh0U3BsYXkoKSwgMCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhbnNmZXJzIHRoZSB0ZXh0IGFmdGVyIHRoaXMgIm5vZGUiIHRvIGJlIGFmdGVyIHRoZSAibm9kZSIgYmVmb3JlIGl0LgotICAgICAqIE5vIHR5cGUgaW52YWxpZGF0aW9uIGlzIGRvbmUgaGVyZS4gIE5vIGNoZWNraW5nIGZvciBpc0ludmFsaWQgaXMgbmVlZGVkCi0gICAgICogZWl0aGVyLiAgTm8gdmFsaWRhdGlvbiBpcyBkb25lLCBjYWxsZXIgbXVzdCBkbyB0aGF0LgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgc2F2ZVRleHRBZnRlciAoIFJvb3QgciApCi0gICAgewotICAgICAgICBhc3NlcnQgciAhPSBudWxsOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSByOwotCi0gICAgICAgIC8vIENhbGxlciBtdXN0IGluaXRpYXRlIGNoYW5nZQotICAgICAgICBhc3NlcnQgci52YWxpZGF0ZUNoYW5nZVN0YXJ0ZWQoKTsKLQotICAgICAgICBTcGxheSBlbmRUZXh0ID0gdGhpczsKLQotICAgICAgICBpZiAoaXNCZWdpbigpICYmICFpc0xlYWYoKSkKLSAgICAgICAgICAgIGVuZFRleHQgPSBnZXRGaW5pc2hTcGxheSgpOwotCi0gICAgICAgIGludCBjY2hFbmRUZXh0ID0gZW5kVGV4dC5nZXRDY2hBZnRlcigpOwotCi0gICAgICAgIGlmIChjY2hFbmRUZXh0ID09IDApCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBhc3NlcnQgIWlzUm9vdCgpICYmICFpc0RvYygpICYmICFpc0F0dHIoKTsKLQotICAgICAgICBTcGxheSBnZXRzVGV4dCA9IHByZXZOb25BdHRyU3BsYXkoKTsKLSAgICAgICAgaW50IGdldHNUZXh0TGFzdFBvcyA9IGdldHNUZXh0LmdldEVuZFBvcygpOwotCi0gICAgICAgIGludCBjcEdldHNUZXh0ID0gci5nZXRDcCggZ2V0c1RleHQgKSArIGdldHNUZXh0LmdldENjaCgpOwotICAgICAgICBpbnQgY3BFbmRUZXh0ID0gci5nZXRDcCggZW5kVGV4dCApICsgZW5kVGV4dC5nZXRDY2goKSAtIGNjaEVuZFRleHQ7Ci0KLSAgICAgICAgZ2V0c1RleHQuYWRqdXN0Q2NoQWZ0ZXIoIGNjaEVuZFRleHQgKTsKLSAgICAgICAgZW5kVGV4dC5hZGp1c3RDY2hBZnRlciggLSBjY2hFbmRUZXh0ICk7Ci0KLSAgICAgICAgci51cGRhdGVDY2goIGdldHNUZXh0LCBjY2hFbmRUZXh0ICk7Ci0gICAgICAgIHIudXBkYXRlQ2NoKCBlbmRUZXh0LCAtIGNjaEVuZFRleHQgKTsKLQotICAgICAgICBhc3NlcnQgY3BHZXRzVGV4dCA8PSBjcEVuZFRleHQ7Ci0KLSAgICAgICAgaWYgKGNwR2V0c1RleHQgIT0gY3BFbmRUZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICByLl90ZXh0Lmluc2VydCggY3BHZXRzVGV4dCwgci5fdGV4dCwgY3BFbmRUZXh0LCBjY2hFbmRUZXh0ICk7Ci0gICAgICAgICAgICByLl90ZXh0LnJlbW92ZSggY3BFbmRUZXh0ICsgY2NoRW5kVGV4dCwgY2NoRW5kVGV4dCApOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHBvc0VuZFRleHQgPSBlbmRUZXh0LmdldFBvc0FmdGVyKCk7Ci0KLSAgICAgICAgR29vYmVyIG5leHRHb29iZXI7Ci0gICAgICAgIGZvciAoIEdvb2JlciBnID0gZW5kVGV4dC5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IG5leHRHb29iZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXh0R29vYmVyID0gZW5kVGV4dC5uZXh0R29vYmVyKCBnICk7Ci0KLSAgICAgICAgICAgIGludCBncCA9IGcuZ2V0UG9zKCk7Ci0KLSAgICAgICAgICAgIGlmIChncCA+PSBwb3NFbmRUZXh0KQotICAgICAgICAgICAgICAgIGcuc2V0KCBnZXRzVGV4dCwgZ2V0c1RleHRMYXN0UG9zICsgZ3AgLSBwb3NFbmRUZXh0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKLQotICAgICAgICByZXR1cm4gY2NoRW5kVGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGlzIHNwbGF5LCBhbGwgb2YgaXRzIGNvbnRlbnQgYW5kIGF0dHJpYnV0ZXMuICBJZiBubyBkZXN0aW5hdGlvbgotICAgICAqIGlzIHByb3ZpZGVkLCB0aGVuIG9ubHkgYSByZW1vdmFsIGlzIHBlcmZvcm1lZC4KLSAgICAgKi8KLQotICAgIGZpbmFsIHZvaWQgbW92ZSAoCi0gICAgICAgIFJvb3QgciwgUm9vdCByRHN0LCBTcGxheSBzRHN0LCBpbnQgcERzdCwgYm9vbGVhbiBpbnZhbGlkYXRlICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCByICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBnZXRSb290U2xvdygpID09IHI7Ci0gICAgICAgIGFzc2VydCAhaXNEb2MoKSAmJiAhaXNGaW5pc2goKTsKLQotICAgICAgICBhc3NlcnQgckRzdCA9PSBudWxsIHx8IChyICE9IHJEc3QgfHwgIXNEc3QuYmV0d2VlbiggciwgcERzdCwgdGhpcyApICk7Ci0gICAgICAgIGFzc2VydCByRHN0ID09IG51bGwgfHwgc0RzdCAhPSBudWxsOwotICAgICAgICBhc3NlcnQgckRzdCA9PSBudWxsIHx8IFJvb3QuZHYgPiAwIHx8IHNEc3QuZ2V0Um9vdFNsb3coKSA9PSByRHN0OwotICAgICAgICBhc3NlcnQgckRzdCA9PSBudWxsIHx8IHBEc3QgPj0gMCAmJiBwRHN0IDwgc0RzdC5nZXRFbmRQb3MoKTsKLQotICAgICAgICBhc3NlcnQKLSAgICAgICAgICAgIHJEc3QgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICh0cnVlIHx8IGNoZWNrSW5zZXJ0aW9uVmFsaWRpdHkoIDAsIHNEc3QsIHBEc3QsIGZhbHNlICkpOwotCi0gICAgICAgIHIuc3RhcnRDaGFuZ2UoKTsKLQotICAgICAgICBpZiAockRzdCAhPSBudWxsKQotICAgICAgICAgICAgckRzdC5zdGFydENoYW5nZSgpOwotCi0gICAgICAgIC8vIFRoZSB0ZXh0IGFmdGVyIHRoZSBsb2dpY2FsIGVudGl0eSB0byBtb3ZlL3JlbW92ZSBpcyBub3QgcGFydCBvZgotICAgICAgICAvLyB0aGlzIG9wZXJhdGlvbi4gIFRyYW5zZmVyIGl0IHRvIGEgcHJldmlvdXMgc3BsYXkuICBObyBuZWVkIHRvCi0gICAgICAgIC8vIGZyZXQgYWJvdXQgaW52YWxpZGl0eSBoZXJlLCBiZWNhdXNlIGl0J3MgdGV4dCAqYWZ0ZXIqLgotCi0gICAgICAgIGludCBjY2hTYXZlZCA9IHNhdmVUZXh0QWZ0ZXIoIHIgKTsKLQotICAgICAgICAvLyBJZiBhbnkgdGV4dCB3YXMgc2F2ZWQsIEkgbmVlZCB0byBtb3ZlIHRoZSBjdXJzb3JzIGF0IHRoZSBiZWdpbm5pbmcKLSAgICAgICAgLy8gb2YgdGhpcyBzcGxheSB0byB3aGVyZSB0aGUgdGV4dCB3YXMgc2F2ZWQuICBJIGRvIHRoaXMgYmVjYXVzZSB0aGlzCi0gICAgICAgIC8vIGNvbnRlbnQgaXMgZ29pbmcgYXdheSBhbmQgY3Vyc29ycyBuZWVkIHRvIGNvbGxhcHNlIHRvIHRoZSByaWdodAotICAgICAgICAvLyBsb2NhdGlvbiB3aGljaCwgaW4gdGhpcyBjYXNlLCBpcyBiZWZvcmUgdGhlIGFmdGVyIHRleHQuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE5vIG5lZWQgdG8gZGVhbCB3aXRoIGdvb2JlcnMgb3RoZXIgdGhhbiBjdXJzb3IgYmVjYXVzZSBhbm5vdGF0aW9ucwotICAgICAgICAvLyBhbmQgdHlwZXMgd2lsbCBiZSBkZWFsdCB3aXRoIGFwcHJvcHJpYXRlbHkgbGF0ZXIuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEFsc28sIHVwZGF0ZSB0aGUgdGFyZ2V0IGlmIGl0IHdhcyBpbiB0aGUgbW92ZWQgdGV4dCEKLSAgICAgICAgLy8KLSAgICAgICAgLy8gVE9ETyAtIGlmIG1vdmluZyB4c2k6dHlwZSBvciB4c2k6bmlsIG11c3QgZG8gc3R1ZmYKLQotICAgICAgICBpZiAoY2NoU2F2ZWQgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTcGxheSBnb3RUZXh0ID0gcHJldk5vbkF0dHJTcGxheSgpOwotCi0gICAgICAgICAgICBHb29iZXIgbmV4dEdvb2JlcjsKLSAgICAgICAgICAgIGZvciAoIEdvb2JlciBnID0gZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7IGcgPSBuZXh0R29vYmVyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXh0R29vYmVyID0gbmV4dEdvb2JlciggZyApOwotCi0gICAgICAgICAgICAgICAgaWYgKGcuZ2V0S2luZCgpID09IENVUlNPUikKLSAgICAgICAgICAgICAgICAgICAgZy5zZXQoIGdvdFRleHQsIGdvdFRleHQuZ2V0RW5kUG9zKCkgLSBjY2hTYXZlZCApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAockRzdCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNwbGF5IGhhZFRleHQgPQotICAgICAgICAgICAgICAgICAgICBpc0JlZ2luKCkgJiYgIWlzTGVhZigpID8gZ2V0RmluaXNoU3BsYXkoKSA6IHRoaXM7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc0RzdCA9PSBoYWRUZXh0ICYmIHBEc3QgPj0gaGFkVGV4dC5nZXRFbmRQb3MoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNEc3QgPSBnb3RUZXh0OwotCi0gICAgICAgICAgICAgICAgICAgIHBEc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgZ290VGV4dC5nZXRFbmRQb3MoKSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNjaFNhdmVkIC0gKHBEc3QgLSBoYWRUZXh0LmdldEVuZFBvcygpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IHNEc3QgIT0gdGhpczsKLQotICAgICAgICAvLyBDb21wdXRlIHRoZSBzcGxheSwgdXAgdG8gd2hpY2gsIEkgd2lsbCByZW1vdmUKLQotICAgICAgICBTcGxheSBsYXN0ID0KLSAgICAgICAgICAgIGlzQmVnaW4oKSA/IGdldEZpbmlzaFNwbGF5KCkubmV4dE5vbkF0dHJTcGxheSgpIDogbmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8KLSAgICAgICAgLy8KLQotICAgICAgICBDb250YWluZXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7Ci0KLSAgICAgICAgaW50IGNwID0gci5nZXRDcCggdGhpcyApOwotICAgICAgICBpbnQgY2NoID0gMDsKLQotICAgICAgICBmb3IgKCBTcGxheSBzID0gdGhpcyA7IHMgIT0gbGFzdCA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gSSdtIGdvaW5nIHRvIGJsb3cgYXdheSB0aGUgVHlwZXMgaGVyZSwgbWFrZSBzdXJlIEkgaGF2ZQotICAgICAgICAgICAgLy8gYWxsIHRoZSB0ZXh0LgotCi0gICAgICAgICAgICBpZiAocy5pc0ludmFsaWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0xlYWYoKSB8fCBzLmlzTm9ybWFsQXR0cigpOwotCi0gICAgICAgICAgICAgICAgaWYgKHMuaXNOb3JtYWxBdHRyKCkpCi0gICAgICAgICAgICAgICAgICAgIHMuZW5zdXJlVmFsdWVWYWxpZCgpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgICAgIHMuZW5zdXJlQ29udGVudFZhbGlkKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNjaCArPSBzLmdldENjaCgpOwotCi0gICAgICAgICAgICBHb29iZXIgbmV4dEdvb2JlcjsKLSAgICAgICAgICAgIGZvciAoIEdvb2JlciBnID0gcy5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IG5leHRHb29iZXIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5leHRHb29iZXIgPSBzLm5leHRHb29iZXIoIGcgKTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAoIGcuZ2V0S2luZCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWVBFIDoKLSAgICAgICAgICAgICAgICAgICAgZy5kaXNjb25uZWN0KCByICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBBTk5PVEFUSU9OIDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJEc3QgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGcuZGlzY29ubmVjdCggciApOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBnLnNldCggckRzdCApOyAvLyBQb3RlbnRpYWwgbW92ZSB0byBhIG5ldyB0cmVlCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBDVVJTT1IgOgotICAgICAgICAgICAgICAgICAgICBnLnNldCggbGFzdCwgMCApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZW1vdmUgdGhlIHNwbGF5cyBhbmQgdGhlIHRleHQuICBVbmZvcnR1bmF0ZWx5LCBJIG5lZWQgdG8gcmVtb3ZlCi0gICAgICAgIC8vIHRoZSB0ZXh0IGhlcmUuICBJIGNhbid0IHRoaW5rIG9mIGEgd2F5IHRvIGtlZXAgdGhlIHRyZWUgdmFsaWQgYW5kCi0gICAgICAgIC8vIGhhdmUgdGhlIHRleHQgbW92ZWQgaW4gb25lIGNvcHkgLi4uLiBDYW4geW91PwotCi0gICAgICAgIFNwbGF5IHNSZW1vdmVkID0gci5yZW1vdmVTcGxheXMoIHRoaXMsIGxhc3QgKTsKLQotICAgICAgICBTcGxheSBmaXJzdCA9Ci0gICAgICAgICAgICBzUmVtb3ZlZC5fbGVmdFNwbGF5ID09IG51bGwgPyBzUmVtb3ZlZCA6IHNSZW1vdmVkLl9sZWZ0U3BsYXk7Ci0KLSAgICAgICAgaWYgKGZpcnN0LmlzQmVnaW4oKSkKLSAgICAgICAgICAgICgoQmVnaW4pIGZpcnN0KS5fY29udGFpbmVyID0gbnVsbDsKLQotICAgICAgICBjaGFyW10gdGV4dFJlbW92ZWQgPSByRHN0ID09IG51bGwgfHwgY2NoID09IDAgPyBudWxsIDogbmV3IGNoYXIgWyBjY2ggXTsKLQotICAgICAgICByLl90ZXh0LnJlbW92ZSggY3AsIGNjaCwgdGV4dFJlbW92ZWQsIDAgKTsKLQotICAgICAgICByLmludmFsaWRhdGVWZXJzaW9uKCk7Ci0KLSAgICAgICAgaWYgKHJEc3QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc0RzdC5pbnNlcnQoCi0gICAgICAgICAgICAgICAgckRzdCwgcERzdCwgc1JlbW92ZWQsIHRleHRSZW1vdmVkLCAwLCBjY2gsIGludmFsaWRhdGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbnZhbGlkYXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlIHBhcmVudFR5cGUgPSBjb250YWluZXIucGVla1R5cGUoKTsKLQotICAgICAgICAgICAgaWYgKHBhcmVudFR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNCZWdpbigpKQotICAgICAgICAgICAgICAgICAgICBwYXJlbnRUeXBlLmludmFsaWRhdGVFbGVtZW50KCBjb250YWluZXIsIGxhc3QgKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0F0dHIoKSAmJiBpc1hzaU5pbCgpKQotICAgICAgICAgICAgICAgICAgICBwYXJlbnRUeXBlLmludmFsaWRhdGVOaWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCByLnZhbGlkYXRlKCk7Ci0gICAgICAgIGFzc2VydCByRHN0ID09IG51bGwgfHwgckRzdC52YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhpcyBzcGxheSwgYWxsIG9mIGl0cyBjb250ZW50IGFuZCBhdHRyaWJ1dGVzLgotICAgICAqLwotCi0gICAgZmluYWwgdm9pZCByZW1vdmUgKCBSb290IHIsIGJvb2xlYW4gaW52YWxpZGF0ZSApCi0gICAgewotICAgICAgICBtb3ZlKCByLCBudWxsLCBudWxsLCAwLCBpbnZhbGlkYXRlICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNvbXBsYWluICggU3RyaW5nIG1zZyApCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCBtc2cgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayB0byBpZiB0aGUgaW5zZXJ0aW9uIG9mIGEgIm5vZGUiIGludG8gdGhlIGRlc3RpbmF0aW9uIGlzIGFsbG93ZWQuCi0gICAgICogVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHNvdXJjZSBpcyBhIHNpbmdsZSBwaWVjZSBvZiBjb250ZW50cyAobGlrZSBhIG5vZGUpLgotICAgICAqIEZyYWdtZW50cyBhcmUgc3RyaW5ncyBvZiBjb250ZW50LCBub3QgY29udGFpbmVkLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgKiB2YWxpZGF0ZWQgYnkgdGhpcyBmdW5jdGlvbi4KLSAgICAgKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3JjIHRvIGNvcHkgaXMgY2hhcmFjdGVycyAocG90ZW50aWFsbHkgMCBjaGFycyB0b28pCi0gICAgICovCi0KLSAgICBmaW5hbCBib29sZWFuIGNoZWNrSW5zZXJ0aW9uVmFsaWRpdHkgKAotICAgICAgICBpbnQgcCwgU3BsYXkgc0RzdCwgaW50IHBEc3QsIGJvb2xlYW4gZW5kT2sgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHAgPj0gMDsKLSAgICAgICAgYXNzZXJ0IHAgPCBnZXRFbmRQb3MoKTsKLSAgICAgICAgYXNzZXJ0IHBEc3QgPj0gMDsKLSAgICAgICAgYXNzZXJ0IHBEc3QgPCBzRHN0LmdldEVuZFBvcygpOwotCi0gICAgICAgIGJvb2xlYW4gc3JjQ2hhcnMgPSBmYWxzZTsKLQotICAgICAgICBpZiAocCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghZW5kT2sgJiYgaXNMZWFmKCkgJiYgcCA9PSBnZXRQb3NMZWFmRW5kKCkpCi0gICAgICAgICAgICAgICAgY29tcGxhaW4oICJDYW4ndCBtb3ZlL2NvcHkvaW5zZXJ0IGFuIGVuZCB0b2tlbi4iICk7Ci0KLSAgICAgICAgICAgIHNyY0NoYXJzID0gdHJ1ZTsKLQotICAgICAgICAgICAgLy8gdmFsaWQgdGV4dCB0YXJnZXQgd2lsbCBiZSB0ZXN0ZWQgZm9yIGZ1cnRoZXIgZG93bgotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzRG9jKCkpCi0gICAgICAgICAgICAgICAgY29tcGxhaW4oICJDYW4ndCBtb3ZlL2NvcHkvaW5zZXJ0IGEgd2hvbGUgZG9jdW1lbnQuIiApOwotCi0gICAgICAgICAgICBpZiAoaXNGaW5pc2goKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWVuZE9rKQotICAgICAgICAgICAgICAgICAgICBjb21wbGFpbiggIkNhbid0IG1vdmUvY29weS9pbnNlcnQgYW4gZW5kIHRva2VuLiIgKTsKLQotICAgICAgICAgICAgICAgIHNyY0NoYXJzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGlzRnJhZ21lbnQoKSkKLSAgICAgICAgICAgICAgICBzcmNDaGFycyA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocERzdCA9PSAwICYmIHNEc3QuaXNEb2MoKSkKLSAgICAgICAgICAgIGNvbXBsYWluKCAiQ2FuJ3QgaW5zZXJ0IGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIGRvY3VtZW50LiIgKTsKLQotICAgICAgICBpZiAocCA+IDAgJiYgc0RzdC5pc0F0dHIoKSkKLSAgICAgICAgICAgIGNvbXBsYWluKCAiQ2FuJ3QgaW5zZXJ0IHRleHQgYmVmb3JlIGFuIGF0dHJpYnV0ZS4iICk7Ci0KLSAgICAgICAgaWYgKGlzQXR0cigpICYmIHBEc3QgPiAwICYmICghc0RzdC5pc0NvbnRhaW5lcigpIHx8IHBEc3QgIT0gMSkpCi0gICAgICAgICAgICBjb21wbGFpbiggIkNhbid0IGluc2VydCBhbiBhdHRyaWJ1dGUgaW4gdGV4dC4iICk7Ci0KLSAgICAgICAgaWYgKHAgPD0gMCAmJiBwRHN0IDw9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc0F0dHIoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzT2sgPSBzRHN0LmlzQXR0cigpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFpc09rKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3BsYXkgdCA9IHNEc3QucHJldk5vbkF0dHJTcGxheSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh0LmlzQ29udGFpbmVyKCkgJiYgdC5nZXRDY2hBZnRlcigpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBpc09rID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWlzT2spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb21wbGFpbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW4gb25seSBtb3ZlL2NvcHkvaW5zZXJ0IGF0dHJpYnV0ZSBhZnRlciBhbm90aGVyICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlIG9yIHN0YXJ0IHRva2VuLiIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzRHN0LmlzQXR0cigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbXBsYWluKAotICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgbW92ZS9jb3B5L2luc2VydCBhIG5vbi1hdHRyaWJ1dGUgYmVmb3JlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImFuIGF0dHJpYnV0ZS4iICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3JjQ2hhcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0IGluIHRoaXMgc3BsYXkgYXQgcG9zaXRpb24gcCB3aG9zZSByb290IGlzIHIgdGhlIHNwbGF5cyByb290SW5zZXJ0Ci0gICAgICogd2l0aCB0ZXh0IHR4dCBhdCBvZmZzZXQgY3BUeHQgYW5kIGxlbmd0aCBjY2hUeHQKLSAgICAgKi8KLQotICAgIGZpbmFsIHZvaWQgaW5zZXJ0ICgKLSAgICAgICAgUm9vdCByLCBpbnQgcCwgU3BsYXkgcm9vdEluc2VydCwKLSAgICAgICAgT2JqZWN0IHR4dCwgaW50IG9mZlR4dCwgaW50IGNjaFR4dCwKLSAgICAgICAgYm9vbGVhbiBpbnZhbGlkYXRlICkKLSAgICB7Ci0vLyBCVUdCVUcgLSB3aGF0IGlzIGEgbmV3IHhzaXR5cGUgYXR0ciBpcyBpbnNlcnRlZD8gLS0gbXVzdCBkaXNjb25uZWN0IHR5cGVzCi0KLSAgICAgICAgYXNzZXJ0IHAgPCBnZXRFbmRQb3MoKTsKLSAgICAgICAgYXNzZXJ0IGNjaFR4dCA+PSAwOwotICAgICAgICBhc3NlcnQgcm9vdEluc2VydCAhPSBudWxsOwotICAgICAgICBhc3NlcnQgcm9vdEluc2VydC5fcGFyZW50U3BsYXkgPT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IHJvb3RJbnNlcnQuZ2V0Q2NoTGVmdCgpICsgcm9vdEluc2VydC5nZXRDY2goKSA9PSBjY2hUeHQ7Ci0KLSAgICAgICAgLy8gV2UgYXJlIGluc2VydGluZyBhIHRyZWUgaGVyZS4gIEdldCB0aGUgZmlyc3Qgc3BsYXkgaW4gdGhlIHRyZWUKLSAgICAgICAgLy8gSXQgbXVzdCBlaXRoZXIgYmUgYXQgdGhlIHJvb3Qgb3IganVzdCB0byB0aGUgbGVmdCBvZiB0aGUgcm9vdC4KLSAgICAgICAgLy8gVGhpcyBpcyB0aGUgImNsYXNzaWMiIGRvZyBsZWcgcGF0dGVybiBJIHVzZSB0byBwYXNzIHNwbGF5IHRyZWVzLgotCi0gICAgICAgIGFzc2VydAotICAgICAgICAgICAgcm9vdEluc2VydC5fbGVmdFNwbGF5ID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICByb290SW5zZXJ0Ll9sZWZ0U3BsYXkuX2xlZnRTcGxheSA9PSBudWxsOwotCi0gICAgICAgIHIuc3RhcnRDaGFuZ2UoKTsKLQotICAgICAgICBTcGxheSBzSW5zZXJ0ID0KLSAgICAgICAgICAgIHJvb3RJbnNlcnQuX2xlZnRTcGxheSA9PSBudWxsID8gcm9vdEluc2VydCA6IHJvb3RJbnNlcnQuX2xlZnRTcGxheTsKLQotICAgICAgICBhc3NlcnQgIXNJbnNlcnQuaXNEb2MoKSAmJiAhc0luc2VydC5pc0ZpbmlzaCgpOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSByOwotCi0gICAgICAgIC8vIFdoZW4gdGhpcyBtZW1iZXIgaXMgY2FsbGVkLCB3ZSBiZXR0ZXIgYmUgYWJsZSB0byBkbyB0aGUgaW5zZXJ0LgotCi0gICAgICAgIGFzc2VydCB0cnVlIHx8IHNJbnNlcnQuY2hlY2tJbnNlcnRpb25WYWxpZGl0eSggMCwgdGhpcywgcCwgZmFsc2UgKTsKLQotICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGZyYWdtZW50LCB0aGVyZSBiZXR0ZXIgYmUgdGV4dCBpbiBpdAotCi0gICAgICAgIGFzc2VydCAhc0luc2VydC5pc0ZyYWdtZW50KCkgfHwgc0luc2VydC5nZXRDY2goKSA+IDA7Ci0KLSAgICAgICAgLy8KLQotICAgICAgICBTcGxheSBzID0gdGhpczsKLQotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgc0luc2VydC5nZXRSb290U2xvdygpID09IG51bGw7Ci0KLSAgICAgICAgU3BsYXkgc09yaWcgPSBudWxsOwotICAgICAgICBpbnQgICBwT3JpZyA9IDA7Ci0gICAgICAgIGludCAgIGNjaEJ5cGFzc2VkID0gMDsKLQotICAgICAgICAvLyBQcmVwYXJlIGZvciBpbnNlcnRpbmcgaW50byB0aGUgbWlkZGxlIG9mIGEgc3BsYXkKLQotICAgICAgICBpZiAocCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBwbGU7Ci0KLSAgICAgICAgICAgIGlmIChzLmlzTGVhZigpICYmIHAgPD0gKHBsZSA9IHMuZ2V0UG9zTGVhZkVuZCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc0ludmFsaWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBwbGUgPT0gMTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHAgPT0gMTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgY2NoVmFsaWQgPSBzLmVuc3VyZUNvbnRlbnRWYWxpZCgpOwotCi0gICAgICAgICAgICAgICAgICAgIHAgKz0gY2NoVmFsaWQ7Ci0gICAgICAgICAgICAgICAgICAgIHBsZSArPSBjY2hWYWxpZDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRGaW5pc2hTcGxheSgpID09IHM7Ci0KLSAgICAgICAgICAgICAgICBkZWZvbGlhdGUoIHIgKTsKLQotICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldEZpbmlzaFNwbGF5KCkgIT0gczsKLQotICAgICAgICAgICAgICAgIGlmIChwID09IHBsZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHMgPSBnZXRGaW5pc2hTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICBwID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzLmluc2VydCggciwgcCwgcm9vdEluc2VydCwgdHh0LCBvZmZUeHQsIGNjaFR4dCwgaW52YWxpZGF0ZSApOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBZb3UgY2FuIGNvcHkgYW4gYXR0ciB0byBhIGRzdCB3aGVyZSBpdCBpcyB0aGUgZmlyc3QgYXR0ciwgb3IKLSAgICAgICAgICAgIC8vIGFmdGVyIGFsbCBwcmUtZXhpc2l0bmcgYXR0cnMuICBUaGlzIHRoZXNlIGNhc2VzLCBwID09IDEgb24KLSAgICAgICAgICAgIC8vIHRoZSBiZWdpbi4gIEluIHRoaXMgY2FzZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBtb3ZlIHRleHQgbGF0ZXIuCi0KLSAgICAgICAgICAgIGFzc2VydCAhc0luc2VydC5pc0F0dHIoKSB8fCAocCA9PSAxICYmIHMuaXNDb250YWluZXIoKSk7Ci0KLSAgICAgICAgICAgIHNPcmlnID0gczsKLSAgICAgICAgICAgIHBPcmlnID0gcDsKLSAgICAgICAgICAgIGNjaEJ5cGFzc2VkID0gZ2V0RW5kUG9zKCkgLSBwOwotCi0gICAgICAgICAgICBzID0gcy5uZXh0Tm9uQXR0clNwbGF5KCk7Ci0gICAgICAgICAgICBwID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCBwID09IDA7Ci0gICAgICAgIGFzc2VydCAhcy5pc0RvYygpOwotCi0gICAgICAgIC8vIEdldCB0aGUgY29udGFpbmVyIHJlY2VpdmluZyBhbGwgb2YgdGhpcwotCi0gICAgICAgIENvbnRhaW5lciBjID0gcy5nZXRDb250YWluZXIoKTsKLQotICAgICAgICAvLyBSdW4gb3ZlciB0aGUgdG9wIGxldmVsIGNvbnRlbnQsIHBhcmVudGluZyBhbnkgQkVHSU5TLiAgQWxzbywKLSAgICAgICAgLy8gY2hhcmFjdGVyaXplIHRoZSBjb250ZW50IGJlaW5nIGluc2VydGVkIGZvciBmdXR1cmUgaW52YWxpZGF0aW9uLgotICAgICAgICAvLyBPbmx5IGZyYWdtZW50cyB3aWxsIGhhdmUgbXVsdGlwbGUgdG9wIGxldmVsIGJlZ2lucy4KLQotICAgICAgICBib29sZWFuIGluc2VydGluZ0VsZW1lbnRzID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gaW5zZXJ0aW5nVGV4dCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGluc2VydGluZ05pbEF0dHIgPSBmYWxzZTsKLSAgICAgICAgU3BsYXkgICBpbnNlcnRpbmdGcmFnbWVudCA9IG51bGw7Ci0KLSAgICAgICAgZm9yICggU3BsYXkgdCA9IHNJbnNlcnQgOyB0ICE9IG51bGwgOyB0ID0gdC5uZXh0U3BsYXkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0LmlzQmVnaW4oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnNlcnRpbmdFbGVtZW50cyA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICBCZWdpbiBiID0gKEJlZ2luKSB0OwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0IGIuX2NvbnRhaW5lciA9PSBudWxsOwotCi0gICAgICAgICAgICAgICAgYi5fY29udGFpbmVyID0gYzsKLQotICAgICAgICAgICAgICAgIHQgPSB0LmdldEZpbmlzaFNwbGF5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0LmlzRnJhZ21lbnQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgaW5zZXJ0aW5nRnJhZ21lbnQgPT0gbnVsbDsKLSAgICAgICAgICAgICAgICBpbnNlcnRpbmdGcmFnbWVudCA9IHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0LmlzWHNpTmlsKCkpCi0gICAgICAgICAgICAgICAgaW5zZXJ0aW5nTmlsQXR0ciA9IHRydWU7Ci0KLSAgICAgICAgICAgIGlmICh0LmdldENjaEFmdGVyKCkgPiAwKQotICAgICAgICAgICAgICAgIGluc2VydGluZ1RleHQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93LCBpbnNlcnQgdGhlIHRleHQgKGlmIGFueSkKLQotICAgICAgICByLl90ZXh0Lmluc2VydCggci5nZXRDcCggcyApLCB0eHQsIG9mZlR4dCwgY2NoVHh0ICk7Ci0KLSAgICAgICAgLy8gSW5zZXJ0IHRoZSB0cmVlCi0KLSAgICAgICAgci5pbnNlcnRTcGxheSggcm9vdEluc2VydCwgcy5wcmV2U3BsYXkoKSApOwotCi0gICAgICAgIC8vIElmIHRoZSBmaXJzdCBzcGxheSB0byBpc25lcnQgd2FzIGEgZnJhZ21lbnQsIHJlbW92ZSBpdCwgbGVhdmluZwotICAgICAgICAvLyB0aGUgdGV4dCBpdCBjYXJyaWVkIGluIHRoZSB0cmVlLiAgRG9uJ3QgcGVyZm9ybSBpbnZhbGlkYXRpb24uCi0KLSAgICAgICAgaWYgKGluc2VydGluZ0ZyYWdtZW50ICE9IG51bGwpCi0gICAgICAgICAgICBpbnNlcnRpbmdGcmFnbWVudC5yZW1vdmUoIHIsIGZhbHNlICk7Ci0KLSAgICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgcGFyZW50IGlmIHJlcXVlc3RlZAotCi0gICAgICAgIGlmIChpbnZhbGlkYXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlIGNUeXBlID0gYy5wZWVrVHlwZSgpOwotCi0gICAgICAgICAgICBpZiAoY1R5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW5nRWxlbWVudHMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjVHlwZS5pbnZhbGlkYXRlRWxlbWVudCggYywgcyApOwotICAgICAgICAgICAgICAgICAgICBpbnNlcnRpbmdUZXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW5nVGV4dCkKLSAgICAgICAgICAgICAgICAgICAgY1R5cGUuaW52YWxpZGF0ZVRleHQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpbmdOaWxBdHRyKQotICAgICAgICAgICAgICAgICAgICBjVHlwZS5pbnZhbGlkYXRlTmlsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGVyZSBpcyBwb3N0IHRleHQgdG8gbW92ZSwgbW92ZSBpdCB0byB0aGUgZW5kIG9mIHRoZSBzdHVmZgotICAgICAgICAvLyBpbnNlcnRlZC4gIERvbid0IGRvIHRoaXMgaXMgaWYgYW4gYXR0ciB3YXMgaW5zZXJ0ZWQgYmVjYXVzZSBpbiB0aGlzCi0gICAgICAgIC8vIGNhc2UsIHRoZSBhdHRyIGlzIGxvZ2ljYWxseSBhZnRlciB0aGUgdGV4dCB0byBiZSBtb3ZlZCBhbnl3YXlzLgotCi0gICAgICAgIGlmIChzT3JpZyAhPSBudWxsICYmICFzSW5zZXJ0LmlzQXR0cigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY2NoTW92ZWQgPSBzT3JpZy5tb3ZlQ2hhcnMoIHIsIHBPcmlnLCAtMSwgciwgcywgMCwgdHJ1ZSApOwotICAgICAgICAgICAgYXNzZXJ0IGNjaE1vdmVkID4gMDsKLSAgICAgICAgICAgIGFzc2VydCBjY2hNb3ZlZCA9PSBjY2hCeXBhc3NlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJ1aWxkIGEgbGVhZiBpZiBwb3NzaWJsZQotCi0gICAgICAgIGlmIChzLmlzRW5kKCkgJiYgcy5nZXRDb250YWluZXIoKS5uZXh0Tm9uQXR0clNwbGF5KCkgPT0gcykKLSAgICAgICAgICAgIHMuZ2V0Q29udGFpbmVyKCkuZm9saWF0ZSggciApOwotCi0gICAgICAgIHIuaW52YWxpZGF0ZVZlcnNpb24oKTsKLQotICAgICAgICBhc3NlcnQgci52YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcGxhY2VzIHRoZSBjb250ZW50cyBvZiB0aGlzIChhdHRyaWJ1dGVzIGFzIHdlbGwpIHdpdGggYSBjb3B5IG9mIHRoZQotICAgICAqIGNvbnRlbnRzIG9mIHNTcmMuICBJZiBwcmVzZXJ2ZVR5cGUgaXMgdHJ1ZSwgdGhlbiB0aGUgeHNpOnR5cGUgYXR0cgotICAgICAqIG9mIHRoZSBzb3VyY2UgaXMgbm90IGNvcGllZCwgYW5kIHRoZSB4c2k6dHlwZSBvZiB0aGUgdGFyZ2V0ICh0aGlzKQotICAgICAqIGlzIG5vdCBhbHRlcmVkLgotICAgICAqLwotCi0gICAgZmluYWwgdm9pZCByZXBsYWNlQ29udGVudHMgKAotICAgICAgICBSb290IHIsIFNwbGF5IHNTcmMsIFJvb3QgclNyYywKLSAgICAgICAgYm9vbGVhbiBwcmVzZXJ2ZVR5cGUsIGJvb2xlYW4gcHJlc2VydmVOYW1lc3BhY2VzICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCAhaXNGaW5pc2goKSAmJiAhc1NyYy5pc0ZpbmlzaCgpOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSByOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgc1NyYy5nZXRSb290U2xvdygpID09IHJTcmM7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHNyYyBhbmQgZHN0IGFyZSB0aGUgc2FtZSBzcGxheSwgdGhlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCi0KLSAgICAgICAgaWYgKHRoaXMgPT0gc1NyYykKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvLyBJZiB3ZSBhcmUgdG8gcHJlc2VydmUgbmFtZXNwYWNlIG1hcHBpbmdzLCBtYWtlIGEgY29weSBvZiB0aGUKLSAgICAgICAgLy8gbmFtc3BhY2VzIGluIHNjb3BlIGhlcmUKLQotICAgICAgICBNYXAgc291cmNlTmFtZXNwYWNlcyA9Ci0gICAgICAgICAgICBwcmVzZXJ2ZU5hbWVzcGFjZXMgPyBzU3JjLmxvb2t1cEFsbFByZWZpeE1hcHBpbmdzKCkgOiBudWxsOwotCi0gICAgICAgIC8vIElmIHRoZSBkZXN0aW5hdGlvbiBpcyBhIHNpbXBsZSBjb250YWluZXIgb2YgdGV4dCwgdGhlbiB0aGUgY29udGVudAotICAgICAgICAvLyBtb2RlbCBpcyBsaW1pdGVkIHRvIHRleHQuICBIYW5kbGUgdGhpcyBzcGVjaWFsbHkuCi0KLSAgICAgICAgaWYgKGlzQXR0cigpIHx8IGlzQ29tbWVudCgpIHx8IGlzUHJvY2luc3QoKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETyAtIERvIHRoaXMgd2l0aG91dCBjcmVhdGluZyBhIHN0cmluZz8KLSAgICAgICAgICAgIFN0cmluZyBzdHIgPSBzU3JjLmdldFRleHQoIHJTcmMgKTsKLSAgICAgICAgICAgIHNldFRleHQoIHIsIHN0ciwgMCwgc3RyLmxlbmd0aCgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBObyBuZWVkIHRvIHN0YXJ0Q2hhbmdlKCkgaGVyZSwgZmNucyBJIGNhbGwgd2lsbCBkbyBpdCBmb3IgbWUKLQotICAgICAgICAgICAgYXNzZXJ0IGlzQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgICAgIC8vIE1ha2UgY29weSBvZiBzb3VyY2UKLQotICAgICAgICAgICAgQ29weUNvbnRleHQgY29weUNvbnRleHQgPSBzU3JjLmNvcHlTcGxheUNvbnRlbnRzKCByU3JjICk7Ci0KLSAgICAgICAgICAgIC8vIElmIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhlIHhzaTp0eXBlIGF0dHJpYnV0ZSwgdGhlbiBmZXRjaCBpdC4KLSAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUsIHRoZSBmaXJzdCBvbmUgd2lucy4KLQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldFhzaVR5cGUgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAocHJlc2VydmVUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBuZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocy5pc1hzaVR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0WHNpVHlwZSA9IHMuZ2V0VGV4dCggciApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEJlY2F1c2UgSSBoYXZlIHJlbW92ZWQgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgdGFyZ2V0LCBJIGNhbgotICAgICAgICAgICAgLy8gaW5zZXJ0IGZyYWdtZW50IG9yIG5vZGUuCi0KLSAgICAgICAgICAgIHJlbW92ZUNvbnRlbnQoIHIsIHRydWUgKTsKLQotICAgICAgICAgICAgYXNzZXJ0IGlzTGVhZigpIHx8IGdldEZpbmlzaFNwbGF5KCkgPT0gbmV4dFNwbGF5KCk7Ci0gICAgICAgICAgICBhc3NlcnQgZ2V0Q2NoVmFsdWUoKSA9PSAwOwotCi0gICAgICAgICAgICBTcGxheSBjb3B5ID0gY29weUNvbnRleHQuZ2V0VHJlZSgpOwotCi0gICAgICAgICAgICBpZiAoY29weSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY29tcHV0ZSBhIG5vcm1hbGl6ZWQgc3BsYXkvcG9zIHRvIGluc2VydCBhdC4gIE9ubHkKLSAgICAgICAgICAgICAgICAvLyB0d28gY2FzZXMsIGVpdGhlciB3ZSdyZSBpbnNlcnRpbmcgaW4gYSBsZWFmIG9yIGEKLSAgICAgICAgICAgICAgICAvLyBjb250YWluZXIvZmluaXNoIHBhaXIuCi0KLSAgICAgICAgICAgICAgICBTcGxheSBpbnNlcnRTcGxheSA9IHRoaXM7Ci0gICAgICAgICAgICAgICAgaW50IGluc2VydFBvcyA9IDE7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWlzTGVhZigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW5zZXJ0U3BsYXkgPSBuZXh0U3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UG9zID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjaGFyW10gdGV4dENvcHkgPSBjb3B5Q29udGV4dC5nZXRUZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBpbnNlcnRTcGxheS5pbnNlcnQoCi0gICAgICAgICAgICAgICAgICAgIHIsIGluc2VydFBvcywgY29weSwKLSAgICAgICAgICAgICAgICAgICAgdGV4dENvcHksIDAsIHRleHRDb3B5ID09IG51bGwgPyAwIDogdGV4dENvcHkubGVuZ3RoLCB0cnVlICk7Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3csIGdvIHRob3J1Z2ggYWxsIHRoZSBhdHRycywgcmVtb3ZpbmcgdHlwZXMgYW5kIHBsYWNlIHRoZQotICAgICAgICAgICAgICAgIC8vIG9yaWdpbmFsIGJhY2sgaW4uCi0KLSAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVUeXBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3BsYXkgbmV4dCA9IG5leHRTcGxheSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBuZXh0IDsgcy5pc0F0dHIoKSA7IHMgPSBuZXh0ICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHMubmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmlzWHNpVHlwZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucmVtb3ZlKCByLCB0cnVlICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0WHNpVHlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdHRyIGEgPSBuZXcgQXR0ciggX3hzaVR5cGUgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNjaFR5cGUgPSB0YXJnZXRYc2lUeXBlLmxlbmd0aCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBhLmFkanVzdENjaCggY2NoVHlwZSApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0RW5kUG9zKCkgPiAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydCggciwgMSwgYSwgdGFyZ2V0WHNpVHlwZSwgMCwgY2NoVHlwZSwgdHJ1ZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHROb25BdHRyU3BsYXkoKS5pbnNlcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIDAsIGEsIHRhcmdldFhzaVR5cGUsIDAsIGNjaFR5cGUsIHRydWUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzb3VyY2VOYW1lc3BhY2VzICE9IG51bGwpCi0gICAgICAgICAgICBhcHBseU5hbWVzcGFjZXMoIHIsIHNvdXJjZU5hbWVzcGFjZXMgKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgQ29weUNvbnRleHQKLSAgICB7Ci0gICAgICAgIHZvaWQgY29weVRleHQgKCBjaGFyW10gdGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF90ZXh0ID0gdGV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY29weVNwbGF5ICggU3BsYXkgcywgYm9vbGVhbiBjb3B5VGV4dEFmdGVyICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFzLmlzRG9jKCkgJiYgIXMuaXNSb290KCk7Ci0KLSAgICAgICAgICAgIFNwbGF5IHQ7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoIHMuZ2V0S2luZCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgQkVHSU4gOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHMuZW5zdXJlQ29udGVudFZhbGlkKCk7Ci0KLSAgICAgICAgICAgICAgICB0ID0gX2Zyb250aWVyID0gbmV3IEJlZ2luKCBzLmdldE5hbWUoKSwgX2Zyb250aWVyICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocy5pc0xlYWYoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHQudG9nZ2xlSXNMZWFmKCk7Ci0gICAgICAgICAgICAgICAgICAgIF9mcm9udGllciA9IF9mcm9udGllci5nZXRDb250YWluZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQVRUUiA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpKQotICAgICAgICAgICAgICAgICAgICB0ID0gbmV3IFhtbG5zKCBzLmdldE5hbWUoKSApOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHMuZW5zdXJlVmFsdWVWYWxpZCgpOwotICAgICAgICAgICAgICAgICAgICB0ID0gbmV3IEF0dHIoIHMuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBDT01NRU5UIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ID0gbmV3IENvbW1lbnQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUFJPQ0lOU1QgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHQgPSBuZXcgUHJvY2luc3QoIHMuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEVORCA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQmVnaW4gYiA9IChCZWdpbikgX2Zyb250aWVyOwotICAgICAgICAgICAgICAgIHQgPSBiLl9lbmQgPSBuZXcgRW5kKCBiICk7Ci0gICAgICAgICAgICAgICAgX2Zyb250aWVyID0gX2Zyb250aWVyLmdldENvbnRhaW5lcigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnQgcy5pc1ZhbGlkKCk7Ci0KLSAgICAgICAgICAgIGludCBjY2ggPSBzLmdldENjaFZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGlmIChjb3B5VGV4dEFmdGVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBjY2hBZnRlciA9IHMuZ2V0Q2NoQWZ0ZXIoKTsKLSAgICAgICAgICAgICAgICBjY2ggKz0gY2NoQWZ0ZXI7Ci0gICAgICAgICAgICAgICAgdC5hZGp1c3RDY2hBZnRlciggY2NoQWZ0ZXIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNjaCA+IDApCi0gICAgICAgICAgICAgICAgdC5hZGp1c3RDY2goIGNjaCApOwotCi0gICAgICAgICAgICBjb3B5KCB0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTWF5IGJlIGNhbGxlZCBvbmNlIGJlZm9yZSBhbnkgb3RoZXIgY29weQotICAgICAgICAgKi8KLQotICAgICAgICB2b2lkIGNvcHlGcmFnbWVudCAoIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgY2NoID4gMDsKLQotICAgICAgICAgICAgU3BsYXkgcyA9IG5ldyBGcmFnbWVudCgpOwotCi0gICAgICAgICAgICBzLmFkanVzdENjaEFmdGVyKCBjY2ggKTsKLSAgICAgICAgICAgIHMuYWRqdXN0Q2NoKCBjY2ggKTsKLQotICAgICAgICAgICAgY29weSggcyApOwotICAgICAgICB9Ci0KLSAgICAgICAgU3BsYXkgZ2V0VHJlZSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IF9mcm9udGllciA9PSBudWxsOwotCi0gICAgICAgICAgICBpZiAoX2xhc3QgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgaWYgKF9maXJzdCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9sYXN0LmFkanVzdENjaExlZnQoIF9maXJzdC5nZXRDY2hMZWZ0KCkgKyBfZmlyc3QuZ2V0Q2NoKCkgKTsKLQotICAgICAgICAgICAgICAgIF9sYXN0LmFkanVzdENkb2NCZWdpbkxlZnQoCi0gICAgICAgICAgICAgICAgICAgIF9maXJzdC5nZXRDZG9jQmVnaW5MZWZ0KCkgKyBfZmlyc3QuZ2V0Q2RvY0JlZ2luKCkgKTsKLQotICAgICAgICAgICAgICAgIF9sYXN0Ll9sZWZ0U3BsYXkgPSBfZmlyc3Q7Ci0gICAgICAgICAgICAgICAgX2ZpcnN0Ll9wYXJlbnRTcGxheSA9IF9sYXN0OwotCi0gICAgICAgICAgICAgICAgaWYgKF90YWlsICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfbGFzdC5hZGp1c3RDY2hMZWZ0KCBfdGFpbC5nZXRDY2hMZWZ0KCkgKyBfdGFpbC5nZXRDY2goKSApOwotCi0gICAgICAgICAgICAgICAgICAgIF9sYXN0LmFkanVzdENkb2NCZWdpbkxlZnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBfdGFpbC5nZXRDZG9jQmVnaW5MZWZ0KCkgKyBfdGFpbC5nZXRDZG9jQmVnaW4oKSApOwotCi0gICAgICAgICAgICAgICAgICAgIF9maXJzdC5fcmlnaHRTcGxheSA9IF90YWlsOwotICAgICAgICAgICAgICAgICAgICBfdGFpbC5fcGFyZW50U3BsYXkgPSBfZmlyc3Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gX2xhc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBjaGFyW10gZ2V0VGV4dCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF90ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNvcHkgKCBTcGxheSBzICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEhlcmUgSSBtYWtlIHN1cmUgdGhhdCB0aGUgc3RydWN0dXJlIG9mIHRoZSBzcGxheSB0cmVlIHJldHVybmVkCi0gICAgICAgICAgICAvLyBieSB0aGUgY29weSBpcyBzdWNoIHRoYXQgdGhlIGxhc3Qgc3BsYXkgY29waWVkIGlzIGF0IHRoZSByb290LAotICAgICAgICAgICAgLy8gdGhlIGZpcnN0IHNwbGF5IGNvcGllZCBpcyB0aGUgbGVmdCBjaGlsZCBvZiB0aGUgbGFzdCBjb3BpZWQsCi0gICAgICAgICAgICAvLyB0aGUgc2Vjb25kIHRvIGxhc3Qgc3BsYXkgY29waWVkIGlzIHRoZSByaWdodCBjaGlsZCBvZiB0aGUgZmlyc3QsCi0gICAgICAgICAgICAvLyBhbmQgdGhlIHRoaXJkIHRocm91Z2ggdGhlIHNlY29uZCB0byBsYXN0IGFyZSBhIGxlZnQgb25seSBsaXN0Ci0gICAgICAgICAgICAvLyBvZmYgb2YgdGhlIGxlZnQgY2hpbGQgb2YgdGhlIHNlY29uZCEKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBZb3UgbWF5IGJlIGFza2luZyB5b3VyIHNlbGYsICJTZWxmLCB3aHkgYWxsIHRoaXMgbWFkbmVzcz8iCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gU2V2ZXJhbCByZWFzb25zLiAgRmlyc3QsIGJ5IG1ha2luZyB0aGUgZmlyc3QgaGFuZyBvZmYgdGhlCi0gICAgICAgICAgICAvLyBsZWZ0IGNoaWxkIG9mIHRoZSBsYXN0IGFuZCBoYXZlIHRoZSByaWdodCBjaGlsZCBvZiBsYXN0IGJlIG51bGwsCi0gICAgICAgICAgICAvLyB0aGUgcm9vdCB3aWxsIGhhdmUgdGhlIHRvdGFsIHNwbGF5IHN0YXRpc3RpY3MgZm9yIHRoZSB3aG9sZQotICAgICAgICAgICAgLy8gdHJlZS4gIFNlY29uZCwgeW91IGhhdmUgcXVpY2sgYWNjZXNzIHRvIHRoZSBmaXJzdCBzcGxheSBjb3BpZWQuCi0gICAgICAgICAgICAvLyBUaGlyZCwgYnVpbGRpbmcgdGhlIHRoaXJkIHRocm91Z2ggdGhlIHNlY29uZCB0byBsYXN0IGRvCi0gICAgICAgICAgICAvLyBub3QgcmVxdWlyZSB3YWxraW5nIHRvIHVwZGF0ZSBzdGF0aWN0aWNzLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFVsdGltYXRlbHksIEkgZG8gdGhpcyB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGZvcm1hdCBvZiB0aGUKLSAgICAgICAgICAgIC8vIHRyZWUgd2hlbiBhIHJhbmdlIG9mIHNwbGF5cyBhcmUgcmVtb3ZlZCBmcm9tIGEgdHJlZS4gIFRvIGF2b2lkCi0gICAgICAgICAgICAvLyBhbiBhZGRpdGlvbmFsIHNwbGF5LCB0aGUgcmVtb3ZhbCBvZiBhIHN1YiB0cmVlIGlzIHNoYXBlZCBsaWtlCi0gICAgICAgICAgICAvLyB0aGlzLgotICAgICAgICAgICAgLy8KLQotICAgICAgICAgICAgaWYgKF9sYXN0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9maXJzdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBfZmlyc3QgPSBfbGFzdDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChfdGFpbCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBfdGFpbCA9IF9sYXN0OwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9sYXN0LmFkanVzdENjaExlZnQoIF90YWlsLmdldENjaExlZnQoKSArIF90YWlsLmdldENjaCgpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgX2xhc3QuYWRqdXN0Q2RvY0JlZ2luTGVmdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIF90YWlsLmdldENkb2NCZWdpbkxlZnQoKSArIF90YWlsLmdldENkb2NCZWdpbigpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgX2xhc3QuX2xlZnRTcGxheSA9IF90YWlsOwotICAgICAgICAgICAgICAgICAgICBfdGFpbC5fcGFyZW50U3BsYXkgPSBfbGFzdDsKLSAgICAgICAgICAgICAgICAgICAgX3RhaWwgPSBfbGFzdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9sYXN0ID0gczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgY2hhcltdICAgIF90ZXh0OwotICAgICAgICBwcml2YXRlIFNwbGF5ICAgICBfZmlyc3Q7Ci0gICAgICAgIHByaXZhdGUgU3BsYXkgICAgIF90YWlsOwotICAgICAgICBwcml2YXRlIFNwbGF5ICAgICBfbGFzdDsKLSAgICAgICAgcHJpdmF0ZSBDb250YWluZXIgX2Zyb250aWVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgY29udGVudHMgb2YgdGhpcyBzcGxheSAoZGVlcGx5KS4KLSAgICAgKiBUaGlzIHdpbGwgdXBkYXRlIGFueSBpbnZhbGlkIGNvbnRlbnQuCi0gICAgICoKLSAgICAgKiBCZWNhdXNlIHRoaXMgY2FuIHJldHVybiBvbmx5IHRleHQsIGlmIHRoZXJlIGlzIHRleHQgYXQgdGhlIGJlZ2lubmluZwotICAgICAqIG9mIHRoZSBjb250ZW50cywgSSB3aWxsIGNyZWF0ZSBhIEZSQUcgYXMgdGhlIGZpcnN0IHNwbGF5IChhZnRlciBhbnkKLSAgICAgKiBhdHRyaWJ1dGVzKS4KLSAgICAgKi8KLQotICAgIGZpbmFsIENvcHlDb250ZXh0IGNvcHlTcGxheUNvbnRlbnRzICggUm9vdCByICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCAhaXNGaW5pc2goKSAmJiAhaXNYbWxucygpOwotCi0gICAgICAgIGlmIChpc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgZW5zdXJlQ29udGVudFZhbGlkKCk7Ci0gICAgICAgIGVsc2UgaWYgKGlzTm9ybWFsQXR0cigpKQotICAgICAgICAgICAgZW5zdXJlVmFsdWVWYWxpZCgpOwotCi0gICAgICAgIENvcHlDb250ZXh0IGNvcHlDb250ZXh0ID0gbmV3IENvcHlDb250ZXh0KCk7Ci0KLSAgICAgICAgaWYgKGlzQ29udGFpbmVyKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjY2hBdHRycyA9IDA7Ci0KLSAgICAgICAgICAgIFNwbGF5IHQgPSBuZXh0U3BsYXkoKSwgcyA9IHQ7Ci0KLSAgICAgICAgICAgIGZvciAoIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3B5Q29udGV4dC5jb3B5U3BsYXkoIHMsIGZhbHNlICk7Ci0gICAgICAgICAgICAgICAgY2NoQXR0cnMgKz0gcy5nZXRDY2goKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGNjaFZhbHVlID0gaXNMZWFmKCkgPyBnZXRDY2hWYWx1ZSgpIDogZ2V0Q2NoQWZ0ZXIoKTsKLQotICAgICAgICAgICAgaWYgKGNjaFZhbHVlID4gMCkKLSAgICAgICAgICAgICAgICBjb3B5Q29udGV4dC5jb3B5RnJhZ21lbnQoIGNjaFZhbHVlICk7Ci0KLSAgICAgICAgICAgIGludCBjY2hDb250ZW50cyA9IDA7Ci0KLSAgICAgICAgICAgIGlmICghaXNMZWFmKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3BsYXkgZmluaXNoID0gZ2V0RmluaXNoU3BsYXkoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoIFNwbGF5IHUgPSBzIDsgdSAhPSBmaW5pc2ggOyB1ID0gdS5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb3B5Q29udGV4dC5jb3B5U3BsYXkoIHUsIHRydWUgKTsKLSAgICAgICAgICAgICAgICAgICAgY2NoQ29udGVudHMgKz0gdS5nZXRDY2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBjY2hBbGwgPSBjY2hBdHRycyArIGNjaFZhbHVlICsgY2NoQ29udGVudHM7Ci0KLSAgICAgICAgICAgIGlmIChjY2hBbGwgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0ID0gbmV3IGNoYXIgWyBjY2hBbGwgXTsKLQotICAgICAgICAgICAgICAgIGludCBjcCA9IHIuZ2V0Q3AoIHRoaXMgKTsKLSAgICAgICAgICAgICAgICBpbnQgY2NoID0gZ2V0Q2NoKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2NoQXR0cnMgPiAwKQotICAgICAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKCB0ZXh0LCAwLCBjcCArIGNjaCwgY2NoQXR0cnMgKTsKLQotICAgICAgICAgICAgICAgIGlmIChjY2hWYWx1ZSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHIuX3RleHQuZmV0Y2goIHRleHQsIGNjaEF0dHJzLCBjcCwgY2NoVmFsdWUgKTsKLQotICAgICAgICAgICAgICAgIGlmIChjY2hDb250ZW50cyA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKAotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwgY2NoQXR0cnMgKyBjY2hWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwICsgY2NoICsgY2NoQXR0cnMsIGNjaENvbnRlbnRzICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29weUNvbnRleHQuY29weVRleHQoIHRleHQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBpc05vcm1hbEF0dHIoKSB8fCBpc0NvbW1lbnQoKSB8fCBpc1Byb2NpbnN0KCk7Ci0KLSAgICAgICAgICAgIGludCBjY2hWYWx1ZSA9IGdldENjaFZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGlmIChjY2hWYWx1ZSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29weUNvbnRleHQuY29weUZyYWdtZW50KCBjY2hWYWx1ZSApOwotCi0gICAgICAgICAgICAgICAgY2hhcltdIHRleHQgPSBuZXcgY2hhciBbIGNjaFZhbHVlIF07Ci0KLSAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKCB0ZXh0LCAwLCByLmdldENwKCB0aGlzICksIGNjaFZhbHVlICk7Ci0KLSAgICAgICAgICAgICAgICBjb3B5Q29udGV4dC5jb3B5VGV4dCggdGV4dCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvcHlDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcGllcyB0aGlzIHNwbGF5IChkZWVwbHkpLiAgQWxzbyBjb3BpZXMgYXR0cmlidXRlcyBhZnRlciBhIGJlZ2luCi0gICAgICogVGhpcyB3aWxsIHVwZGF0ZSBhbnkgaW52YWxpZCBjb250ZW50LgotICAgICAqLwotCi0gICAgZmluYWwgU3BsYXkgY29weVNwbGF5ICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0ICFpc0RvYygpICYmICFpc0ZpbmlzaCgpOwotCi0gICAgICAgIC8vIENvbXB1dGUgc3BsYXkgdG8gc3RvcCBhdCAoZG9lcyBub3QgZ2V0IGNvcGllZCkuICBBbHNvIGNvbXB1dGUKLSAgICAgICAgLy8gYSBzcGxheSwgdG8gYmUgY29waWVkLCB3aGljaCBzaG91bGQgbm90IGhhdmUgaXQncyB0ZXh0IGFmdGVyIGNvcGllZC4KLQotICAgICAgICBTcGxheSBzdG9wSGVyZSwgbm9UZXh0QWZ0ZXI7Ci0KLSAgICAgICAgaWYgKGlzQmVnaW4oKSkKLSAgICAgICAgewotICAgICAgICAgICAgbm9UZXh0QWZ0ZXIgPSBnZXRGaW5pc2hTcGxheSgpOwotICAgICAgICAgICAgc3RvcEhlcmUgPSBub1RleHRBZnRlci5uZXh0Tm9uQXR0clNwbGF5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBub1RleHRBZnRlciA9IG51bGw7Ci0gICAgICAgICAgICBzdG9wSGVyZSA9IG5leHRTcGxheSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWFrZSB0aGUgY29weQotCi0gICAgICAgIENvcHlDb250ZXh0IGNvcHlDb250ZXh0ID0gbmV3IENvcHlDb250ZXh0KCk7Ci0KLSAgICAgICAgZm9yICggU3BsYXkgbmV4dCwgcyA9IHRoaXMgOyBzICE9IHN0b3BIZXJlIDsgcyA9IG5leHQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXh0ID0gcy5uZXh0U3BsYXkoKTsKLQotICAgICAgICAgICAgY29weUNvbnRleHQuY29weVNwbGF5KCBzLCBzICE9IG5vVGV4dEFmdGVyICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29weUNvbnRleHQuZ2V0VHJlZSgpOwotICAgIH0KLQotICAgIGZpbmFsIHZvaWQgcmVtb3ZlQXR0cmlidXRlcyAoIFJvb3QgciApCi0gICAgewotICAgICAgICBhc3NlcnQgaXNDb250YWluZXIoKTsKLQotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTcGxheSBzID0gbmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgICAgIGlmICghcy5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgcy5yZW1vdmUoIHIsIHRydWUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIGNvbnRlbnQgZnJvbSBzcGxheS4KLSAgICAgKiBCZWdpbiB3aWxsIGJlIGEgbGVhZiB1cG9uIGV4aXQuCi0gICAgICovCi0KLSAgICBmaW5hbCB2b2lkIHJlbW92ZUNvbnRlbnQgKCBSb290IHIsIGJvb2xlYW4gcmVtb3ZlQXR0cnMgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGdldFJvb3RTbG93KCkgPT0gcjsKLQotICAgICAgICByLnN0YXJ0Q2hhbmdlKCk7Ci0KLSAgICAgICAgaWYgKGlzSW52YWxpZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0b2dnbGVJc0ludmFsaWQoKTsKLQotICAgICAgICAgICAgci5pbnZhbGlkYXRlVmVyc2lvbigpOwotCi0gICAgICAgICAgICBpZiAoaXNDb250YWluZXIoKSAmJiByZW1vdmVBdHRycykKLSAgICAgICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGVzKCByICk7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoIGdldEtpbmQoKSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBET0MgOgotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCRUdJTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc0xlYWYoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZW1vdmVDaGFycyggciwgMSwgZ2V0Q2NoVmFsdWUoKSApOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlbW92ZUF0dHJzKQotICAgICAgICAgICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGVzKCByICk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBBVFRSIDoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzWG1sbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U6ICJVbmV4cGVjdGVkIGtpbmQgZm9yIHJlbW92ZUNvbnRlbnQiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBGYWxsIHRocm91Z2gKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgQ09NTUVOVCAgOgotICAgICAgICBjYXNlIFBST0NJTlNUIDoKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNjaFZhbHVlID0gZ2V0Q2NoVmFsdWUoKTsKLQotICAgICAgICAgICAgaWYgKGNjaFZhbHVlID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICByLl90ZXh0LnJlbW92ZSggci5nZXRDcCggdGhpcyApLCBjY2hWYWx1ZSApOwotCi0gICAgICAgICAgICByLnVwZGF0ZUNjaCggdGhpcywgLSBjY2hWYWx1ZSApOwotCi0gICAgICAgICAgICBpZiAoZ2V0S2luZCgpID09IEFUVFIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZVRleHQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChpc1hzaVR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkuZGlzY29ubmVjdFR5cGVzKCByICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHIuaW52YWxpZGF0ZVZlcnNpb24oKTsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBhc3NlcnQgZmFsc2U6ICJVbmV4cGVjdGVkIGtpbmQgZm9yIHJlbW92ZUNvbnRlbnQiOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IGlzRG9jKCkgfHwgKGlzQmVnaW4oKSAmJiAhaXNMZWFmKCkpOwotCi0gICAgICAgIFNwbGF5IHMgPSBuZXh0Tm9uQXR0clNwbGF5KCk7Ci0KLSAgICAgICAgaWYgKHMuaXNSb290KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBpc0RvYygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgdGhlIHNwbGF5cy4gIEluaGliaXQgaW52YWxpZGF0aW9uIG9uIGVhY2ggcmVtb3ZlIHRvCi0gICAgICAgICAgICAvLyBwcmV2ZW50IGEgZmxvb2Qgb2YgaW52YWxpZGF0aW9ucyB0byB0aGUgcGFyZW50IHR5cGUgKGlmIHRoZXJlKS4KLSAgICAgICAgICAgIC8vCi0KLSAgICAgICAgICAgIFNwbGF5IG5leHQ7Ci0gICAgICAgICAgICBmb3IgKCBzID0gbmV4dE5vbkF0dHJTcGxheSgpIDsgIXMuaXNGaW5pc2goKSA7IHMgPSBuZXh0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgIXMuaXNBdHRyKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocy5pc0xlYWYoKSkKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHMubmV4dE5vbkF0dHJTcGxheSgpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNCZWdpbigpKQotICAgICAgICAgICAgICAgICAgICBuZXh0ID0gcy5nZXRGaW5pc2hTcGxheSgpLm5leHRTcGxheSgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHMubmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICBzLnJlbW92ZSggciwgZmFsc2UgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEhhdmUgdG8gcmVtb3ZlIHRoZSB0ZXh0IGFmdGVyIHRoaXMgaGVyZSBiZWNhdXNlIHRoZSBhYm92ZQotICAgICAgICAgICAgLy8gcmVtb3ZlcyBjb3VsZCBoYXZlIHN1dWZmbGVkIHRleHQgdG8gYWZ0ZXIgdGhpcy4KLSAgICAgICAgICAgIC8vCi0KLSAgICAgICAgICAgIGFzc2VydCAhaXNMZWFmKCk7Ci0KLSAgICAgICAgICAgIGlmIChnZXRDY2hBZnRlcigpID4gMCkKLSAgICAgICAgICAgICAgICByZW1vdmVUZXh0QWZ0ZXIoIHIgKTsKLQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFRyaWNreSBjb2RlLiAgTWVyZ2UgdGhlIEVORCBhbmQgdGhlIEJFR0lOIHRvIGZvcm0gYSBsZWFmLgotICAgICAgICAgICAgLy8KLQotICAgICAgICAgICAgaWYgKGlzQmVnaW4oKSkKLSAgICAgICAgICAgICAgICBmb2xpYXRlKCByICk7Ci0KLSAgICAgICAgICAgIGludmFsaWRhdGVUZXh0KCk7Ci0KLSAgICAgICAgICAgIHIuaW52YWxpZGF0ZVZlcnNpb24oKTsKLSAgICAgICAgfQotCi0vLyBUT0RPIC0gaWYgcmVtb3ZpbmcgdGV4dCBmcm9tIHhzaTp0eXBlIG9yIG5pbCBtdXN0IGRvIHN0dWZmCi0vLyBUT0RPIC0gaWYgcmVtb3ZpbmcgdGV4dCBmcm9tIHhzaTp0eXBlIG9yIG5pbCBtdXN0IGRvIHN0dWZmCi0vLyBUT0RPIC0gaWYgcmVtb3ZpbmcgdGV4dCBmcm9tIHhzaTp0eXBlIG9yIG5pbCBtdXN0IGRvIHN0dWZmCi0vLyBUT0RPIC0gaWYgcmVtb3ZpbmcgdGV4dCBmcm9tIHhzaTp0eXBlIG9yIG5pbCBtdXN0IGRvIHN0dWZmCi0vLyBUT0RPIC0gaWYgcmVtb3ZpbmcgdGV4dCBmcm9tIHhzaTp0eXBlIG9yIG5pbCBtdXN0IGRvIHN0dWZmCi0KLQotLy8gVE9ETyAtIGlmIHJlbW92aW5nIGF0dHJpYnV0ZSB4c2k6dHlwZSBvciB4c2k6bmlsLCBtdXN0IGRvIHN0dWlmZgotLy8gVE9ETyAtIGlmIHJlbW92aW5nIGF0dHJpYnV0ZSB4c2k6dHlwZSBvciB4c2k6bmlsLCBtdXN0IGRvIHN0dWlmZgotLy8gVE9ETyAtIGlmIHJlbW92aW5nIGF0dHJpYnV0ZSB4c2k6dHlwZSBvciB4c2k6bmlsLCBtdXN0IGRvIHN0dWlmZgotLy8gVE9ETyAtIGlmIHJlbW92aW5nIGF0dHJpYnV0ZSB4c2k6dHlwZSBvciB4c2k6bmlsLCBtdXN0IGRvIHN0dWlmZgotLy8gVE9ETyAtIGlmIHJlbW92aW5nIGF0dHJpYnV0ZSB4c2k6dHlwZSBvciB4c2k6bmlsLCBtdXN0IGRvIHN0dWlmZgotCi0gICAgICAgIGlmIChyZW1vdmVBdHRycykKLSAgICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZXMoIHIgKTsKLQotICAgICAgICAvLyBJZiB0aGUgdHJlZSBiZWNhbWUgZW1wdHksIHJlc2V0IF9sZWZ0T25seQotCi0gICAgICAgIGlmIChyLl9sZWZ0U3BsYXkgPT0gci5fZG9jICYmIHIuX2RvYy5fcmlnaHRTcGxheSA9PSBudWxsKQotICAgICAgICAgICAgci5fbGVmdE9ubHkgPSB0cnVlOwotCi0gICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIGZpbmFsIGludCBjb3B5Q2hhcnMgKAotICAgICAgICBSb290IHIsIGludCBwLCBpbnQgY2NoLCBSb290IHJEc3QsIFNwbGF5IHNEc3QsIGludCBwRHN0ICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBwRHN0ID4gMCAmJiBwRHN0IDw9IHNEc3QuZ2V0RW5kUG9zKCk7Ci0KLSAgICAgICAgaW50IHBvc3RDY2ggPSBnZXRQb3N0Q2NoKCBwICk7Ci0KLSAgICAgICAgaWYgKHAgPT0gMCB8fCBjY2ggPT0gMCB8fCBwb3N0Q2NoID09IDApCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBpZiAoY2NoIDwgMCB8fCBjY2ggPiBwb3N0Q2NoKQotICAgICAgICAgICAgY2NoID0gcG9zdENjaDsKLQotICAgICAgICBhc3NlcnQgY2NoID4gMDsKLQotLy8gVE9ETyAtIHVzZXMgc3RyaW5nIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggc291cmNlIGFuZCBkZXN0IGZyb20gc2FtZSBidWZmZXIKLS8vICAgICAgICByZXdyaXRlIHRvIG5vdCBjcmVhdGUgc3RyaW5nIG9iamVjdAotCi0gICAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyIFsgY2NoIF07Ci0KLSAgICAgICAgci5fdGV4dC5mZXRjaCggY2hhcnMsIDAsIGdldENwRm9yUG9zKCByLCBwICksIGNjaCApOwotCi0gICAgICAgIHNEc3QuaW5zZXJ0Q2hhcnMoIHBEc3QsIHJEc3QsIGNoYXJzLCAwLCBjY2ggKTsKLQotICAgICAgICByZXR1cm4gY2NoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1vdmUgY2NoIGNoYXJzIGZyb20gcG9zIHAgb24gdGhpcyBzcGxheSB0byBwb3MgcERzdCBvbiBzRHN0LgotICAgICAqIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gY2FuIGJlIGRpZmZlcmVudCBkb2N1bWVudHMuICBOb3JtYWxseSBjdXJzb3JzCi0gICAgICogc3RheSBwdXQgd2hlbiB0aGVpciBjaGFyIGlzIG1vdmVkLCBidXQgbW92ZUN1cnNvcnMgY2FuIGNhdXNlIGN1cnNvcnMKLSAgICAgKiB0b21vdmUgd2l0aCB0aGUgY2hhcnMgKHVzZWQgaW50ZXJuYWxseSkuCi0gICAgICovCi0KLSAgICBmaW5hbCBpbnQgbW92ZUNoYXJzICgKLSAgICAgICAgUm9vdCByLCBpbnQgcCwgaW50IGNjaCwgUm9vdCByRHN0LCBTcGxheSBzRHN0LCBpbnQgcERzdCwKLSAgICAgICAgYm9vbGVhbiBtb3ZlQ3Vyc29ycyApCi0gICAgewotICAgICAgICBpZiAocCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgaW50IHBvc3RDY2ggPSBnZXRQb3N0Q2NoKCBwICk7Ci0KLSAgICAgICAgaWYgKGNjaCA9PSAwIHx8IHBvc3RDY2ggPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGlmIChjY2ggPCAwIHx8IGNjaCA+IHBvc3RDY2gpCi0gICAgICAgICAgICBjY2ggPSBwb3N0Q2NoOwotCi0gICAgICAgIHIuc3RhcnRDaGFuZ2UoKTsKLSAgICAgICAgckRzdC5zdGFydENoYW5nZSgpOwotCi0gICAgICAgIGFzc2VydCBjY2ggPiAwOwotCi0gICAgICAgIC8vIEkgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGUgaW52YWxpZGl0eSBvZiB0aGUgc291cmNlIGJlY2F1c2UgdGhlCi0gICAgICAgIC8vIG9ubHkgaW52YWxpZCB0ZXh0IEkgd291bGQgaGF2ZSB0byBkZWFsIHdpdGggaXMgdGhhdCBpbiBhIGxlYWYsIGFuZAotICAgICAgICAvLyBJZiB0aGUgc291cmNlIGlzIGluIGEgbGVhZiBoZXJlLCB0aGVuIGl0IG11c3QgYmUgcG9zaXRpb25lZCBhdCB0aGUKLSAgICAgICAgLy8gZW5kICgxKSB3aGljaCBpcyBub3Qgc2Vuc2l0aXZlIHRvIHRoZSBpbnZhbGlkaXR5LgotICAgICAgICAvLwotICAgICAgICAvLyBIb3dldmVyLCBJIG11Y2ggY2hlY2sgdGhlIGRlc3RpbmF0aW9uIGZvciB2YWxpZGl0eSBiZWNhdXNlIEkgbWF5Ci0gICAgICAgIC8vIGJlIGFwcGVuZGluZyB0ZXh0IHRvIGFuIGV4aXN0aW5nIHZhbHVlLgotCi0gICAgICAgIGlmIChzRHN0LmlzQ29udGFpbmVyKCkgJiYgcERzdCA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY2NoVmFsaWQgPSBzRHN0LmVuc3VyZUNvbnRlbnRWYWxpZCgpOwotCi0gICAgICAgICAgICBwRHN0ICs9IGNjaFZhbGlkOwotCi0gICAgICAgICAgICBpZiAoc0RzdCA9PSB0aGlzICYmIHAgPT0gMSkKLSAgICAgICAgICAgICAgICBwICs9IGNjaFZhbGlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLQotICAgICAgICBpZiAocERzdCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBzRHN0ID0gc0RzdC5wcmV2Tm9uQXR0clNwbGF5KCk7Ci0gICAgICAgICAgICBwRHN0ID0gc0RzdC5nZXRFbmRQb3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSBkZXN0aW5hdGlvbiBpZiBpbiB0aGUgcmFuZ2Ugb2YgdGhlIHNvdXJjZSwgdGhlbiB0aGlzIGlzCi0gICAgICAgIC8vIGVmZmVjdGl2ZWx5IGEgbm8tb3AuCi0KLS8vIFRPRE8gLSBQcm9iYWJseSBzaG91bGQgZGlzY29ubmVjdCBUeXBlcyBpbiB0aGUgcmFuZ2UKLQotICAgICAgICBpZiAoc0RzdCA9PSB0aGlzICYmIHBEc3QgPj0gcCAmJiBwRHN0IDw9IHAgKyBjY2gpCi0gICAgICAgICAgICByZXR1cm4gY2NoOwotCi0gICAgICAgIGFzc2VydCBwRHN0ID4gMDsKLQotICAgICAgICBDb250YWluZXIgY0RzdCA9IHNEc3QuZ2V0Q29udGFpbmVyKCBwRHN0ICk7Ci0gICAgICAgIENvbnRhaW5lciBjID0gZ2V0Q29udGFpbmVyKCBwICk7Ci0KLSAgICAgICAgLy8gTW92ZSB0aGUgdGV4dAotCi0gICAgICAgIHJEc3QuX3RleHQubW92ZSgKLSAgICAgICAgICAgIHNEc3QuZ2V0Q3BGb3JQb3MoIHJEc3QsIHBEc3QgKSwgci5fdGV4dCwgZ2V0Q3BGb3JQb3MoIHIsIHAgKSwgY2NoICk7Ci0KLSAgICAgICAgLy8gUGVyZm9ybSB0aGUgImluc2VydGlvbiIgZmlyc3QKLQotICAgICAgICBpZiAoIXNEc3QuaXNMZWFmKCkgfHwgcERzdCA+IHNEc3QuZ2V0UG9zTGVhZkVuZCgpKQotICAgICAgICAgICAgc0RzdC5hZGp1c3RDY2hBZnRlciggY2NoICk7Ci0KLSAgICAgICAgckRzdC51cGRhdGVDY2goIHNEc3QsIGNjaCApOwotCi0gICAgICAgIGZvciAoIEdvb2JlciBnID0gc0RzdC5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsKLSAgICAgICAgICAgICAgZyA9IHNEc3QubmV4dEdvb2JlciggZyApICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGdwID0gZy5nZXRQb3MoKTsKLQotICAgICAgICAgICAgaWYgKGdwID49IHBEc3QpCi0gICAgICAgICAgICAgICAgZy5zZXQoIGdwICsgY2NoICk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgc0RzdCAhPSB0aGlzIHx8IHBEc3QgPCBwIHx8IHBEc3QgPiBwICsgY2NoOwotCi0gICAgICAgIGlmIChzRHN0ID09IHRoaXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBwRHN0U2F2ZSA9IHBEc3Q7Ci0KLSAgICAgICAgICAgIGlmIChwRHN0ID4gcCArIGNjaCkKLSAgICAgICAgICAgICAgICBwRHN0IC09IGNjaDsKLQotICAgICAgICAgICAgaWYgKHAgPj0gcERzdFNhdmUpCi0gICAgICAgICAgICAgICAgcCArPSBjY2g7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGVuIHBlcmZvcm0gdGhlICJyZW1vdmFsIgotCi0gICAgICAgIGlmICghaXNMZWFmKCkgfHwgcCA+IGdldFBvc0xlYWZFbmQoKSkKLSAgICAgICAgICAgIGFkanVzdENjaEFmdGVyKCAtIGNjaCApOwotCi0gICAgICAgIHIudXBkYXRlQ2NoKCB0aGlzLCAtIGNjaCApOwotCi0gICAgICAgIEdvb2JlciBuZXh0R29vYmVyOwotICAgICAgICBmb3IgKCBHb29iZXIgZyA9IGZpcnN0R29vYmVyKCkgOyBnICE9IG51bGwgOyBnID0gbmV4dEdvb2JlciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5leHRHb29iZXIgPSBuZXh0R29vYmVyKCBnICk7Ci0KLSAgICAgICAgICAgIGludCBncCA9IGcuZ2V0UG9zKCk7Ci0KLSAgICAgICAgICAgIGlmIChncCA+PSBwICsgY2NoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGcuc2V0KCBncCAtIGNjaCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZ3AgPj0gcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1vdmVDdXJzb3JzICYmIGcuZ2V0S2luZCgpID09IENVUlNPUikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwID09IGdldEVuZFBvcygpKQotICAgICAgICAgICAgICAgICAgICAgICAgZy5zZXQoIG5leHRTcGxheSgpLCAwICk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGcuc2V0KCBwICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZy5zZXQoIHJEc3QsIHNEc3QsIHBEc3QgKyBncCAtIHAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNEc3QuaW52YWxpZGF0ZVRleHQoKTsKLSAgICAgICAgYy5pbnZhbGlkYXRlVGV4dCgpOwotCi0gICAgICAgIHIuaW52YWxpZGF0ZVZlcnNpb24oKTsKLSAgICAgICAgckRzdC5pbnZhbGlkYXRlVmVyc2lvbigpOwotCi0gICAgICAgIHJldHVybiBjY2g7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGNjaCBjaGFycyBzdGFydGluZyBhdCBwb3NpdGlvbiBwIG9uIHRoaXMgc3BsYXkuCi0gICAgICovCi0KLSAgICBmaW5hbCBpbnQgcmVtb3ZlQ2hhcnMgKCBSb290IHIsIGludCBwLCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIGludCBtYXhQb3MgPSBnZXRNYXhQb3MoKTsKLQotICAgICAgICBhc3NlcnQgcCA+IDAgJiYgcCA8PSBtYXhQb3M7Ci0KLSAgICAgICAgaWYgKHAgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIHIuc3RhcnRDaGFuZ2UoKTsKLQotLy8gVE9ETyAtIG1lcmdlIHRoZSB0d28gZm9sbG93aW5nIGNodW5rcyBvZiBjb2RlPz8/Pz8/Ci0KLSAgICAgICAgaWYgKGlzTGVhZigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgcGxlID0gZ2V0UG9zTGVhZkVuZCgpOwotCi0gICAgICAgICAgICBpZiAocCA8PSBwbGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNjaCA8IDAgfHwgcGxlIC0gcCA8IGNjaCkKLSAgICAgICAgICAgICAgICAgICAgY2NoID0gcGxlIC0gcDsKLQotICAgICAgICAgICAgICAgIGlmIChjY2ggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAgICAgICByLl90ZXh0LnJlbW92ZSggci5nZXRDcCggdGhpcyApICsgcCAtIDEsIGNjaCApOwotCi0gICAgICAgICAgICAgICAgci51cGRhdGVDY2goIHRoaXMsIC0gY2NoICk7Ci0KLSAgICAgICAgICAgICAgICBHb29iZXIgbmV4dEdvb2JlcjsKLQotICAgICAgICAgICAgICAgIGZvciAoIEdvb2JlciBnID0gZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7IGcgPSBuZXh0R29vYmVyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRHb29iZXIgPSBuZXh0R29vYmVyKCBnICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IGsgPSBnLmdldEtpbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGdwID0gZy5nZXRQb3MoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZ3AgPj0gcCArIGNjaCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGcuc2V0KCBncCAtIGNjaCApOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChncCA+PSBwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA9PSBDVVJTT1IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5zZXQoIHAgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgayA9PSBBTk5PVEFUSU9OOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuZGlzY29ubmVjdCggciApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZVRleHQoKTsKLQotICAgICAgICAgICAgICAgIHIuaW52YWxpZGF0ZVZlcnNpb24oKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBjY2g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgcG9zQWZ0ZXIgPSBnZXRQb3NBZnRlcigpOwotCi0gICAgICAgIGFzc2VydCBwID49IHBvc0FmdGVyOwotCi0gICAgICAgIGludCBtYXhDY2ggPSBtYXhQb3MgLSBwICsgMTsKLQotICAgICAgICBhc3NlcnQgbWF4Q2NoID49IDA7Ci0KLSAgICAgICAgaWYgKGNjaCA8IDAgfHwgY2NoID4gbWF4Q2NoKQotICAgICAgICAgICAgY2NoID0gbWF4Q2NoOwotCi0gICAgICAgIGlmIChjY2ggPD0gMCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIENvbnRhaW5lciBjID0gZ2V0Q29udGFpbmVyKCBwICk7Ci0KLSAgICAgICAgci5fdGV4dC5yZW1vdmUoIGdldENwRm9yUG9zKCByLCBwICksIGNjaCApOwotCi0gICAgICAgIGFkanVzdENjaEFmdGVyKCAtIGNjaCApOwotCi0gICAgICAgIHIudXBkYXRlQ2NoKCB0aGlzLCAtIGNjaCApOwotCi0gICAgICAgIEdvb2JlciBuZXh0R29vYmVyOwotICAgICAgICBmb3IgKCBHb29iZXIgZyA9IGZpcnN0R29vYmVyKCkgOyBnICE9IG51bGwgOyBnID0gbmV4dEdvb2JlciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5leHRHb29iZXIgPSBuZXh0R29vYmVyKCBnICk7Ci0KLSAgICAgICAgICAgIGludCBrID0gZy5nZXRLaW5kKCk7Ci0gICAgICAgICAgICBpbnQgZ3AgPSBnLmdldFBvcygpOwotCi0gICAgICAgICAgICBpZiAoZ3AgPj0gcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoayA9PSBDVVJTT1IpCi0gICAgICAgICAgICAgICAgICAgIGcuc2V0KCBuZXh0Tm9uQXR0clNwbGF5KCksIDAgKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGcuZGlzY29ubmVjdCggciApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYy5pbnZhbGlkYXRlVGV4dCgpOwotCi0gICAgICAgIHIuaW52YWxpZGF0ZVZlcnNpb24oKTsKLQotICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKLQotICAgICAgICByZXR1cm4gY2NoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydCB0ZXh0IGEgcG9zaXRpb24gcCBpbiB0aGlzIHNwbGF5Ci0gICAgICovCi0KLSAgICBmaW5hbCB2b2lkIGluc2VydENoYXJzICggaW50IHAsIFJvb3QgciwgT2JqZWN0IHR4dCwgaW50IG9mZiwgaW50IGNjaCApCi0gICAgewotICAgICAgICBhc3NlcnQgcCA+IDAgJiYgcCA8PSBnZXRFbmRQb3MoKTsKLQotICAgICAgICBpZiAoY2NoID09IDApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgci5zdGFydENoYW5nZSgpOwotCi0gICAgICAgIENvbnRhaW5lciBjb250YWluZXIgPSBnZXRDb250YWluZXIoIHAgKTsKLQotICAgICAgICBpZiAoaXNDb250YWluZXIoKSAmJiBwID09IDEpCi0gICAgICAgICAgICBwICs9IGVuc3VyZUNvbnRlbnRWYWxpZCgpOwotCi0gICAgICAgIHIuX3RleHQuaW5zZXJ0KCBnZXRDcEZvclBvcyggciwgcCApLCB0eHQsIG9mZiwgY2NoICk7Ci0KLSAgICAgICAgaWYgKHAgPj0gZ2V0UG9zQWZ0ZXIoKSkKLSAgICAgICAgICAgIGFkanVzdENjaEFmdGVyKCBjY2ggKTsKLQotICAgICAgICByLnVwZGF0ZUNjaCggdGhpcywgY2NoICk7Ci0KLSAgICAgICAgZm9yICggR29vYmVyIGcgPSBmaXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IG5leHRHb29iZXIoIGcgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBncCA9IGcuZ2V0UG9zKCk7Ci0KLSAgICAgICAgICAgIGlmIChncCA+PSBwKQotICAgICAgICAgICAgICAgIGcuc2V0KCBncCArIGNjaCApOwotICAgICAgICB9Ci0KLSAgICAgICAgY29udGFpbmVyLmludmFsaWRhdGVUZXh0KCk7Ci0KLSAgICAgICAgci5pbnZhbGlkYXRlVmVyc2lvbigpOwotCi0gICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFSVF9TVEFURSA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNQQUNFX1NFRU5fU1RBVEUgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1NQQUNFX1NUQVRFID0gMjsKLQotICAgIHB1YmxpYyBmaW5hbCBpbnQgc2NydWJUZXh0KAotICAgICAgICBUZXh0IHRleHQsIGludCB3cywgaW50IGNwLCBpbnQgY2NoLCBTdHJpbmdCdWZmZXIgc2IsIGludCBzdGF0ZSApCi0gICAgewotICAgICAgICBhc3NlcnQgdGV4dCAhPSBudWxsOwotCi0gICAgICAgIGlmICh0ZXh0Ll9idWYgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGNjaCA9PSAwOwotICAgICAgICAgICAgYXNzZXJ0IGNwID09IDA7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2NoID09IDApCi0gICAgICAgICAgICByZXR1cm4gc3RhdGU7Ci0KLSAgICAgICAgYm9vbGVhbiByZXBsYWNlID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gY29sbGFwc2UgPSBmYWxzZTsKLQotICAgICAgICBzd2l0Y2ggKCB3cyApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBUeXBlU3RvcmUuV1NfVU5TUEVDSUZJRUQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUeXBlU3RvcmUuV1NfUFJFU0VSVkUgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUeXBlU3RvcmUuV1NfUkVQTEFDRSAgICAgOiAgICAgICAgICAgIHJlcGxhY2UgPSB0cnVlOyBicmVhazsKLSAgICAgICAgY2FzZSBUeXBlU3RvcmUuV1NfQ09MTEFQU0UgICAgOiBjb2xsYXBzZSA9IHJlcGxhY2UgPSB0cnVlOyBicmVhazsKLQotCQlkZWZhdWx0IDogYXNzZXJ0IGZhbHNlOiAiVW5rbm93biB3aGl0ZSBzcGFjZSBydWxlICIgK3dzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFyZXBsYWNlICYmICFjb2xsYXBzZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGV4dC5mZXRjaChzYiwgY3AsIGNjaCk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgb2ZmID0gdGV4dC51bk9ic2N1cmUoIGNwLCBjY2ggKTsKLSAgICAgICAgaW50IHN0YXJ0cHQgPSAwOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBjY2ggOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gdGV4dC5fYnVmWyBvZmYgKyBpIF07Ci0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnICcgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInIHx8IGNoID09ICdcdCcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKHRleHQuX2J1Ziwgb2ZmICsgc3RhcnRwdCwgaSAtIHN0YXJ0cHQpOwotICAgICAgICAgICAgICAgIHN0YXJ0cHQgPSBpICsgMTsKLQotICAgICAgICAgICAgICAgIGlmIChjb2xsYXBzZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBOT1NQQUNFX1NUQVRFKQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTUEFDRV9TRUVOX1NUQVRFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTUEFDRV9TRUVOX1NUQVRFKQotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICcgJyApOwotCi0gICAgICAgICAgICAgICAgc3RhdGUgPSBOT1NQQUNFX1NUQVRFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2IuYXBwZW5kKCB0ZXh0Ll9idWYsIG9mZiArIHN0YXJ0cHQsIGNjaCAtIHN0YXJ0cHQgKTsKLQotICAgICAgICByZXR1cm4gc3RhdGU7Ci0gICAgfQotCi0gICAgZmluYWwgU3RyaW5nIGdldFRleHQgKCBSb290IHIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFRleHQoIHIsIFR5cGVTdG9yZS5XU19QUkVTRVJWRSApOwotICAgIH0KLQotLy8gICAgZmluYWwgaW50IGdldFRleHQgKCBSb290IHIsIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBsZW4gKQotLy8gICAgewotLy8gICAgICAgIGlmIChsZW4gPD0gMCkKLS8vICAgICAgICAgICAgcmV0dXJuIDA7Ci0vLwotLy8gICAgICAgIGlmIChpc0ludmFsaWQoKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICAgIGlmIChpc05vcm1hbEF0dHIoKSkKLS8vICAgICAgICAgICAgICAgIGVuc3VyZVZhbHVlVmFsaWQoKTsKLS8vICAgICAgICAgICAgZWxzZSBpZiAoaXNMZWFmKCkpCi0vLyAgICAgICAgICAgICAgICBlbnN1cmVDb250ZW50VmFsaWQoKTsKLS8vICAgICAgICB9Ci0vLwotLy8gICAgICAgIGludCBjcCA9IHIuZ2V0Q3AoIHRoaXMgKTsKLS8vCi0vLyAgICAgICAgaWYgKGlzTm9ybWFsQXR0cigpIHx8IGlzQ29tbWVudCgpIHx8IGlzUHJvY2luc3QoKSB8fCBpc0xlYWYoKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICAgIGludCBjY2ggPSBnZXRDY2hWYWx1ZSgpOwotLy8KLS8vICAgICAgICAgICAgaWYgKGNjaCA9PSAwKQotLy8gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0vLwotLy8gICAgICAgICAgICBpZiAoY2NoID4gbGVuKQotLy8gICAgICAgICAgICAgICAgY2NoID0gbGVuOwotLy8KLS8vICAgICAgICAgICAgci5fdGV4dC5mZXRjaCggYnVmLCBvZmYsIHBvcywgY2NoICk7Ci0vLwotLy8gICAgICAgICAgICByZXR1cm4gY2NoOwotLy8gICAgICAgIH0KLS8vCi0vLyAgICAgICAgaWYgKCFpc0NvbnRhaW5lcigpKQotLy8gICAgICAgICAgICByZXR1cm4gMDsKLS8vCi0vLyAgICAgICAgaW50IG9yaWdpbmFsTGVuID0gbGVuOwotLy8gICAgICAgIFNwbGF5IGxhc3QgPSBnZXRGaW5pc2hTcGxheSgpOwotLy8KLS8vICAgICAgICBmb3IgKCBTcGxheSBzID0gdGhpcyA7IGxlbiA+IDAgJiYgcyAhPSBsYXN0IDsgcyA9IHMubmV4dFNwbGF5KCkgKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgICAgaW50IHNyY0NwLCBzcmNDY2g7Ci0vLwotLy8gICAgICAgICAgICBpZiAocy5pc0JlZ2luKCkpCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIGlmIChzLmlzSW52YWxpZCgpKQotLy8gICAgICAgICAgICAgICAgICAgIHMuZW5zdXJlQ29udGVudFZhbGlkKCk7Ci0vLwotLy8gICAgICAgICAgICAgICAgc3JjQ3AgPSBjcDsKLS8vICAgICAgICAgICAgICAgIHNyY0NjaCA9IHMuZ2V0Q2NoKCk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgZWxzZQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAvLyBJdCdzIG9rIGZvciBhbiBhdHRyIHRvIGJlIGludmFsaWQgaGVyZSwgZ2V0cyB0ZXh0IGFmdGVyCi0vLwotLy8gICAgICAgICAgICAgICAgc3JjQ3AgPSBjcCArIHMuZ2V0Q2NoVmFsdWUoKTsKLS8vICAgICAgICAgICAgICAgIHNyY0NjaCA9IHMuZ2V0Q2NoQWZ0ZXIoKTsKLS8vICAgICAgICAgICAgfQotLy8KLS8vICAgICAgICAgICAgaWYgKHNyY0NjaCA+IDApCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIGlmIChzcmNDY2ggPiBsZW4pCi0vLyAgICAgICAgICAgICAgICAgICAgc3JjQ2NoID0gbGVuOwotLy8KLS8vICAgICAgICAgICAgICAgIGludCBzcmNPZmYgPSByLl90ZXh0LnVuT2JzY3VyZSggc3JjQ3AsIHNyY0NjaCApOwotLy8KLS8vICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheUNvcHkoIHIuX3RleHQuX2J1Ziwgc3JjT2ZmLCBidWYsIG9mZiwgc3JjQ2NoICk7Ci0vLwotLy8gICAgICAgICAgICAgICAgbGVuIC09IHNyY0NjaDsKLS8vICAgICAgICAgICAgICAgIG9mZiArPSBzcmNDY2g7Ci0vLyAgICAgICAgICAgIH0KLS8vCi0vLyAgICAgICAgICAgIGNwICs9IHMuZ2V0Q2NoKCk7Ci0vLyAgICAgICAgfQotLy8KLS8vICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLS8vICAgIH0KLQotICAgIGZpbmFsIFN0cmluZyBnZXRUZXh0ICggUm9vdCByLCBpbnQgd3MgKQotICAgIHsKLSAgICAgICAgaWYgKGlzSW52YWxpZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaXNOb3JtYWxBdHRyKCkpCi0gICAgICAgICAgICAgICAgZW5zdXJlVmFsdWVWYWxpZCgpOwotICAgICAgICAgICAgZWxzZSBpZiAoaXNMZWFmKCkpCi0gICAgICAgICAgICAgICAgZW5zdXJlQ29udGVudFZhbGlkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgY3AgPSByLmdldENwKCB0aGlzICk7Ci0KLSAgICAgICAgaWYgKGlzTm9ybWFsQXR0cigpIHx8IGlzQ29tbWVudCgpIHx8IGlzUHJvY2luc3QoKSB8fCBpc0xlYWYoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNjaCA9IGdldENjaFZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGlmIChjY2ggPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgICAgICAgIGlmICh3cyA9PSBUeXBlU3RvcmUuV1NfUFJFU0VSVkUgfHwgd3MgPT0gVHlwZVN0b3JlLldTX1VOU1BFQ0lGSUVEKQotICAgICAgICAgICAgICAgIHJldHVybiByLl90ZXh0LmZldGNoKCBjcCwgY2NoICk7Ci0KLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgc2NydWJUZXh0KCByLl90ZXh0LCB3cywgY3AsIGdldENjaFZhbHVlKCksIHNiLCBTVEFSVF9TVEFURSApOwotCi0gICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFNwbGF5IGxhc3QgPSBnZXRGaW5pc2hTcGxheSgpOwotCi0gICAgICAgIGludCBzY3J1YlN0YXRlID0gU1RBUlRfU1RBVEU7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIGZvciAoIFNwbGF5IHMgPSB0aGlzIDsgcyAhPSBsYXN0IDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocy5pc0JlZ2luKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNJbnZhbGlkKCkpCi0gICAgICAgICAgICAgICAgICAgIHMuZW5zdXJlQ29udGVudFZhbGlkKCk7Ci0KLSAgICAgICAgICAgICAgICBzY3J1YlN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgc2NydWJUZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgci5fdGV4dCwgd3MsIGNwLCBzLmdldENjaCgpLCBzYiwgc2NydWJTdGF0ZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEl0J3Mgb2sgZm9yIGFuIGF0dHIgdG8gYmUgaW52YWxpZCBoZXJlLCBnZXRzIHRleHQgYWZ0ZXIKLQotICAgICAgICAgICAgICAgIGludCBjY2hBZnRlciA9IHMuZ2V0Q2NoQWZ0ZXIoKTsKLQotICAgICAgICAgICAgICAgIGlmIChjY2hBZnRlciA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzY3J1YlN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNjcnViVGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByLl90ZXh0LCB3cywgY3AgKyBzLmdldENjaFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NoQWZ0ZXIsIHNiLCBzY3J1YlN0YXRlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjcCArPSBzLmdldENjaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBhdHRyIHNwbGF5IGZvciBhIGdpdmVuIGNvbnRhaW5lciwgbnVsbCBvdGhlcndpc2UuCi0gICAgICovCi0KLSAgICBTcGxheSBnZXRBdHRyICggUU5hbWUgbmFtZSApCi0gICAgewotICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsOwotCi0gICAgICAgIGlmICghaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGZvciAoIFNwbGF5IHMgPSBuZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpICYmIHMuZ2V0TmFtZSgpLmVxdWFscyggbmFtZSApKQotICAgICAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRYc2lOaWwgKCBSb290IHIsIGJvb2xlYW4gbmlsICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc0NvbnRhaW5lcigpOwotCi0gICAgICAgIGlmIChnZXRYc2lOaWwoIHIgKSA9PSBuaWwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgc2V0QXR0ciggciwgX3hzaU5pbCwgInRydWUiICk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBnZXRYc2lOaWwgKCBSb290IHIgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgU3BsYXkgczsKLQotICAgICAgICBmb3IgKCBzID0gbmV4dFNwbGF5KCkgOyBzLmlzQXR0cigpIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocy5pc1hzaU5pbCgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzLmlzQXR0cigpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IHMuZ2V0VGV4dCggciwgVHlwZVN0b3JlLldTX0NPTExBUFNFICk7Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlLmVxdWFscyggInRydWUiICkgfHx2YWx1ZS5lcXVhbHMoICIxIiApOwotICAgIH0KLQotICAgIFFOYW1lIGdldFhzaVR5cGVOYW1lICggUm9vdCByICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc0NvbnRhaW5lcigpOwotCi0gICAgICAgIFNwbGF5IHM7Ci0KLSAgICAgICAgZm9yICggcyA9IG5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHMuaXNYc2lUeXBlKCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXMuaXNBdHRyKCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBhc3NlcnQgcy5pc1hzaVR5cGUoKTsKLQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBzLmdldFRleHQoIHIsIFR5cGVTdG9yZS5XU19DT0xMQVBTRSApOwotCi0vLyBUT0RPIC0gdW5vYnNjdXJlIHRoZSB1bmRlcmx5aW5nIHRleHQgYW5kIHVzZSBpdCBkaXJlY3RseQotLy8gVE9ETyAtIHNob3VsZCBJIG1ha2Ugc3VyZSB0aGUgcHJlZml4IGlzIHdxZWxsIGZvcm1lZD8gaWUuIGp1c3QgdGV4dAotCi0gICAgICAgIFN0cmluZyBwcmVmaXgsIGxvY2FsbmFtZTsKLQotICAgICAgICBpbnQgZmlyc3Rjb2xvbiA9IHZhbHVlLmluZGV4T2YoICc6JyApOwotCi0gICAgICAgIGlmIChmaXJzdGNvbG9uID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZWZpeCA9IHZhbHVlLnN1YnN0cmluZyggMCwgZmlyc3Rjb2xvbiApOwotICAgICAgICAgICAgbG9jYWxuYW1lID0gdmFsdWUuc3Vic3RyaW5nKCBmaXJzdGNvbG9uICsgMSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICBsb2NhbG5hbWUgPSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB1cmkgPSBuYW1lc3BhY2VGb3JQcmVmaXgoIHByZWZpeCApOwotCi0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBubyBwcmVmaXggZGVmaW5pdGlvbiBmb3VuZCAtIHRoYXQncyBpbGxlZ2FsCi0KLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSggdXJpLCBsb2NhbG5hbWUgKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFhzaVR5cGUgKCBSb290IHIsIFFOYW1lIHR5cGVOYW1lICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc0NvbnRhaW5lcigpOwotCi0gICAgICAgIGlmICh0eXBlTmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZW1vdmVBdHRyKCByLCBfeHNpVHlwZSApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gdHlwZU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0KLSAgICAgICAgU3RyaW5nIG5zID0gdHlwZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHByZWZpeEZvck5hbWVzcGFjZSggciwgbnMsIG51bGwsIHRydWUpOwotCi0gICAgICAgIGFzc2VydCBwcmVmaXggIT0gbnVsbCA6ICJDYW5ub3QgZXN0YWJsaXNoIHByZWZpeCBmb3IgIiArIG5zOwotCi0gICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgdmFsdWUgPSBwcmVmaXggKyAiOiIgKyB2YWx1ZTsKLQotICAgICAgICBib29sZWFuIHNldCA9IGZhbHNlOwotCi0gICAgICAgIHNldEF0dHIoIHIsIF94c2lUeXBlLCB2YWx1ZSApOwotICAgIH0KLQotICAgIHZvaWQgcmVtb3ZlQXR0ciAoIFJvb3QgciwgUU5hbWUgYXR0ck5hbWUgKQotICAgIHsKLSAgICAgICAgU3BsYXkgbmV4dDsKLSAgICAgICAgZm9yICggU3BsYXkgcyA9IG5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBuZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgbmV4dCA9IHMubmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgICAgIGlmIChzLmdldE5hbWUoKS5lcXVhbHMoIGF0dHJOYW1lICkpCi0gICAgICAgICAgICAgICAgcy5yZW1vdmUoIHIsIHRydWUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2V0QXR0ciAoIFJvb3QgciwgUU5hbWUgYXR0ck5hbWUsIFN0cmluZyB2YWx1ZSApCi0gICAgewotICAgICAgICBhc3NlcnQgaXNDb250YWluZXIoKTsKLSAgICAgICAgYXNzZXJ0IGF0dHJOYW1lICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCB2YWx1ZSAhPSBudWxsOwotCi0gICAgICAgIGJvb2xlYW4gc2V0ID0gZmFsc2U7Ci0KLSAgICAgICAgU3BsYXkgbmV4dDsKLSAgICAgICAgZm9yICggU3BsYXkgcyA9IG5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBuZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgbmV4dCA9IHMubmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgICAgIGlmIChzLmdldE5hbWUoKS5lcXVhbHMoIGF0dHJOYW1lICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHNldCkKLSAgICAgICAgICAgICAgICAgICAgcy5yZW1vdmUoIHIsIHRydWUgKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzLnNldFRleHQoIHIsIHZhbHVlLCAwLCB2YWx1ZS5sZW5ndGgoKSApOwotICAgICAgICAgICAgICAgICAgICBzZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICBTcGxheSBzSW5zZXJ0ID0gdGhpczsKLSAgICAgICAgICAgIGludCAgIHBJbnNlcnQgPSAxOwotCi0gICAgICAgICAgICBpZiAoIWlzTGVhZigpICYmIGdldENjaCgpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc0luc2VydCA9IG5leHRTcGxheSgpOwotICAgICAgICAgICAgICAgIHBJbnNlcnQgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY2NoVmFsdWUgPSB2YWx1ZS5sZW5ndGgoKTsKLQotICAgICAgICAgICAgQXR0ciBhdHRyID0gbmV3IEF0dHIoIGF0dHJOYW1lICk7Ci0gICAgICAgICAgICBhdHRyLmFkanVzdENjaCggY2NoVmFsdWUgKTsKLQotICAgICAgICAgICAgc0luc2VydC5pbnNlcnQoIHIsIHBJbnNlcnQsIGF0dHIsIHZhbHVlLCAwLCBjY2hWYWx1ZSwgZmFsc2UgKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29udGVudC92YWx1ZSBvZiB0aGlzIHNwbGF5IHRvIHRoZSBnaXZlbiB0ZXh0LgotICAgICAqLwotCi0gICAgZmluYWwgdm9pZCBzZXRUZXh0ICggUm9vdCByLCBPYmplY3QgdHh0LCBpbnQgb2ZmLCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIHJlbW92ZUNvbnRlbnQoIHIsIGZhbHNlICk7Ci0KLSAgICAgICAgaWYgKHR4dCA9PSBudWxsIHx8IGNjaCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHN3aXRjaCAoIGdldEtpbmQoKSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBET0MgOgotICAgICAgICBjYXNlIEJFR0lOIDoKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFpc0JlZ2luKCkgfHwgaXNMZWFmKCk7Ci0gICAgICAgICAgICBpbnNlcnRDaGFycyggMSwgciwgdHh0LCBvZmYsIGNjaCApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBBVFRSIDoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzWG1sbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U6ICJVbmV4cGVjdGVkIGtpbmQgZm9yIHNldFRleHQiOwotICAgICAgICAgICAgfQotLy8gVE9ETyAtIGlmIHNldHRpbmcgdGV4dCBvZiB4c2k6dHlwZSBvciB4c2k6bmlsIG11c3QgZG8gc3R1ZmYKLS8vIFRPRE8gLSBpZiBzZXR0aW5nIHRleHQgb2YgeHNpOnR5cGUgb3IgeHNpOm5pbCBtdXN0IGRvIHN0dWZmCi0vLyBUT0RPIC0gaWYgc2V0dGluZyB0ZXh0IG9mIHhzaTp0eXBlIG9yIHhzaTpuaWwgbXVzdCBkbyBzdHVmZgotLy8gVE9ETyAtIGlmIHNldHRpbmcgdGV4dCBvZiB4c2k6dHlwZSBvciB4c2k6bmlsIG11c3QgZG8gc3R1ZmYKLQotICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCi0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDT01NRU5UICA6Ci0gICAgICAgIGNhc2UgUFJPQ0lOU1QgOgotICAgICAgICB7Ci0gICAgICAgICAgICByLnN0YXJ0Q2hhbmdlKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydCBnZXRDY2hWYWx1ZSgpID09IDA7Ci0KLSAgICAgICAgICAgIHIuX3RleHQuaW5zZXJ0KCByLmdldENwKCB0aGlzICksIHR4dCwgb2ZmLCBjY2ggKTsKLSAgICAgICAgICAgIHIudXBkYXRlQ2NoKCB0aGlzLCBjY2ggKTsKLQotICAgICAgICAgICAgaWYgKGdldEtpbmQoKSA9PSBBVFRSKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludmFsaWRhdGVUZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNYc2lUeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgIGdldENvbnRhaW5lcigpLmRpc2Nvbm5lY3RUeXBlcyggciApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByLmludmFsaWRhdGVWZXJzaW9uKCk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOiAiVW5leHBlY3RlZCBraW5kIGZvciBzZXRUZXh0IjsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIGZpbmFsIE1hcCBsb29rdXBBbGxQcmVmaXhNYXBwaW5ncyAoICkKLSAgICB7Ci0gICAgICAgIE1hcCBtYXBwaW5ncyA9IG51bGw7Ci0KLSAgICAgICAgU3BsYXkgY29udGFpbmVyID0gdGhpcy5pc0NvbnRhaW5lcigpID8gdGhpcyA6IGdldENvbnRhaW5lcigpOwotCi0gICAgICAgIGZvciAoIDsgY29udGFpbmVyICE9IG51bGwgOyBjb250YWluZXIgPSBjb250YWluZXIuZ2V0Q29udGFpbmVyKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBTcGxheSBzID0gY29udGFpbmVyLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7Ci0gICAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBpbmdzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5ncyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hcHBpbmdzLmNvbnRhaW5zS2V5KCBzLmdldExvY2FsKCkgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzLnB1dCggcy5nZXRMb2NhbCgpLCBzLmdldFVyaSgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIGZpbmFsIHZvaWQgYXBwbHlOYW1lc3BhY2VzICggUm9vdCByLCBNYXAgbmFtZXNwYWNlcyApCi0gICAgewotICAgICAgICBpZiAobmFtZXNwYWNlcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFNwbGF5IGNvbnRhaW5lciA9IHRoaXMuaXNDb250YWluZXIoKSA/IHRoaXMgOiBnZXRDb250YWluZXIoKTsKLQotICAgICAgICBuYW1lc3BhY2VfbG9vcDoKLSAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IG5hbWVzcGFjZXMua2V5U2V0KCkuaXRlcmF0b3IoKSA7IGkuaGFzTmV4dCgpIDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vIFVzdWFsbHksIHRoaXMgaXMgdGhlIHByZWRlZmluZWQgeG1sIG5hbWVzcGFjZQotICAgICAgICAgICAgaWYgKHByZWZpeC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoICJ4bWwiICkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAoU3RyaW5nKSBuYW1lc3BhY2VzLmdldCggcHJlZml4ICk7Ci0KLSAgICAgICAgICAgIFNwbGF5IGNhbmRpZGF0ZSA9IGNvbnRhaW5lcjsKLQotICAgICAgICAgICAgY2FuZGlkYXRlX2xvb3A6Ci0gICAgICAgICAgICBmb3IgKCBTcGxheSBjID0gY29udGFpbmVyLmdldENvbnRhaW5lcigpIDsgYyAhPSBudWxsICYmICFjLmlzRG9jKCkgOwotICAgICAgICAgICAgICAgICAgYyA9IGMuZ2V0Q29udGFpbmVyKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBjLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzLmlzWG1sbnMoKSAmJiBwcmVmaXguZXF1YWxzKCBzLmdldExvY2FsKCkgKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIHMuZ2V0VXJpKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgbmFtZXNwYWNlX2xvb3A7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGNhbmRpZGF0ZV9sb29wOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gYzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBuZXcgbmFtZXNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIGF0dHIgbGlzdCBhZnRlcgotICAgICAgICAgICAgLy8gbWFrZWluZyBzdXJlIGFsbCBwcmV2aW91cyBtYXBwaW5ncyBhcmUgZ29uZQotICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoIG5hbWVzcGFjZSwgcHJlZml4ICk7Ci0KLSAgICAgICAgICAgIHJlbW92ZUF0dHIoIHIsIHFuYW1lICk7Ci0KLSAgICAgICAgICAgIGNhbmRpZGF0ZS5uZXh0Tm9uQXR0clNwbGF5KCkuaW5zZXJ0KAotICAgICAgICAgICAgICAgIHIsIDAsIG5ldyBYbWxucyggcW5hbWUgKSwgbnVsbCwgMCwgMCwgZmFsc2UgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByZWZpeCBhc3NvY2lhdGVkIHdpdGggdGhpcyBhdHRyL2VsZW1lbnQuCi0gICAgICovCi0gICAgZmluYWwgU3RyaW5nIGdldFByZWZpeCAoIFJvb3QgciApCi0gICAgewotICAgICAgICBhc3NlcnQgaXNCZWdpbigpIHx8IGlzQXR0cigpOwotCi0gICAgICAgIGlmIChpc1htbG5zKCkpCi0gICAgICAgICAgICByZXR1cm4gInhtbG5zIjsKLQotICAgICAgICAvLyBUT0RPIC0gaGF2ZSBhIHByZWZpeCBnb29iZXIgdG8gb3ZlcnJpZGUgdGhlIG1hcHBpbmcgb24gdGhlIGZyb250aWVyLgotICAgICAgICAvLyBQYXJzZXIgd2lsbCBhZGQgdGhpcyB3aGVuIHRoZSBuYXR1cmFsIHByZWZpeCBpcyBub3QgdGhlIHJlYWwgcHJlZml4LgotCi0gICAgICAgIFNwbGF5IGMgPSBpc0JlZ2luKCkgPyB0aGlzIDogZ2V0Q29udGFpbmVyKCk7Ci0KLSAgICAgICAgLy8gc3BlY2lhbCBjYXNlCi0gICAgICAgIFN0cmluZyBucyA9IGdldFVyaSgpOwotCi0gICAgICAgIC8vIGxhc3QgYXJndW1lbnQgaXMgZmFsc2UsIHdoaWNoIG1lYW5zLCBkb24ndCBtb2RpZnkgdGhlIHRyZWUKLSAgICAgICAgcmV0dXJuIHByZWZpeEZvck5hbWVzcGFjZSggciwgbnMsIG51bGwsIGZhbHNlICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYSBwcmVmaXgsIHJldHVybnMgdGhlIG5hbWVzcGFjZSBjb3JyZXNwb25kaW5nIHRvCi0gICAgICogdGhlIHByZWZpeCBhdCB0aGlzIGxvY2F0aW9uLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIG1hcHBpbmcKLSAgICAgKiBmb3IgdGhpcyBwcmVmaXguCi0gICAgICogPHA+Ci0gICAgICogcHJlZml4PSIiIGluZGljYXRlcyB0aGUgYWJzZW5jZSBvZiBhIHByZWZpeC4gIEEgcmV0dXJuIHZhbHVlCi0gICAgICogb2YgIiIgaW5kaWNhdGVzIHRoZSBuby1uYW1lc3BhY2UsIGFuZCBzaG91bGQgbm90IGJlIGNvbmZ1c2VkCi0gICAgICogd2l0aCBhIHJldHVybiB2YWx1ZSBvZiBudWxsLCB3aGljaCBpbmRpY2F0ZXMgYW4gaWxsZWdhbAotICAgICAqIHN0YXRlLCB3aGVyZSB0aGVyZSBpcyBubyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gcHJlZml4LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJjZXB0cyB0aGUgYnVpbHQtaW4gcHJlZml4ZXMgInhtbCIgYW5kCi0gICAgICogInhtbG5zIiBhbmQgcmV0dXJucyB0aGVpciB3ZWxsLWtub3duIG5hbWVzcGFjZSBVUklzLgotICAgICAqCi0gICAgICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4IHRvIGxvb2sgdXAuCi0gICAgICogQHJldHVybiBUaGUgbWFwcGVkIG5hbWVzcGFjZSBVUkkgKCIiIGlmIG5vLW5hbWVzcGFjZSksIG9yIG51bGwgaWYgbm8gbWFwcGluZy4KLSAgICAgKi8KLSAgICBmaW5hbCBTdHJpbmcgbmFtZXNwYWNlRm9yUHJlZml4ICggU3RyaW5nIHByZWZpeCApCi0gICAgewotICAgICAgICAvLyBudWxsIHNhbWUgYXMgIiIsIG1lYW5zIGxvb2sgdXAgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkKLSAgICAgICAgICAgIHByZWZpeCA9ICIiOwotCi0gICAgICAgIC8vIGhhbmRsZSBidWlsdC1pbiBwcmVmaXhlcwotICAgICAgICBpZiAoInhtbCIuZXF1YWxzKHByZWZpeCkpCi0gICAgICAgICAgICByZXR1cm4gX3htbDE5OThVcmk7Ci0gICAgICAgIGlmICgieG1sbnMiLmVxdWFscyhwcmVmaXgpKQotICAgICAgICAgICAgcmV0dXJuIF94bWxuc1VyaTsKLQotICAgICAgICBhc3NlcnQgaXNDb250YWluZXIoKTsKLQotICAgICAgICAvLyBmaW5kIGFuIHhtbG5zIGRlY2wKLSAgICAgICAgZm9yICggQ29udGFpbmVyIGMgPSAoQ29udGFpbmVyKSB0aGlzIDsgYyAhPSBudWxsIDsgYyA9IGMuZ2V0Q29udGFpbmVyKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBjLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5pc1htbG5zKCkgJiYgcHJlZml4LmVxdWFscyggcy5nZXRMb2NhbCgpICkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmdldFVyaSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm8geG1sbnMgZGVjbD8gIG5vIHByb2JsZW0gZm9yIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgICAgLy8gbm8gbmFtZXNwYWNlIGRlZm4gZm91bmQ6IHJldHVybiBudWxsCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJlZml4IHRvIHVzZSBmb3IgYSBnaXZlbiBuYW1lc3BhY2UgVVJJLiAgQ2FuIGVpdGhlcgotICAgICAqIGJlIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSB0cmVlIHRvIGVuc3VyZSBzdWNoIGEgbWFwcGluZyAoaWYgcgotICAgICAqIGlzIG5vbi1udWxsKSwgb3IgY2FuIGJlIHRvbGQgdG8gcmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8KLSAgICAgKiBleGlzdGluZyBtYXBwaW5nIChpZiByIGlzIG51bGwpLgotICAgICAqIDxwPgotICAgICAqIEZvciB0aGUgY2FzZSB3aGVyZSB0aGUgdHJlZSBtYXkgYmUgbW9kaWZpZWQsIGEgc3VnZ2VzdGVkIHByZWZpeAotICAgICAqIGNhbiBiZSBzdXBwbGllZC4gIFRoZSBzdWdnZXN0aW9uIG1heSBiZSBpZ25vcmVkIGZvciBhbnkgcmVhc29uLAotICAgICAqIGZvciBleGFtcGxlLCBpZiB0aGUgcHJlZml4IGlzIGFscmVhZHkgaW4tdXNlLgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgInhtbCIgYW5kICJ4bWxucyIgZm9yIHRoZSB3ZWxsLWtub3duIG5hbWVzcGFjZSBVUklzCi0gICAgICogY29ycmVzcG9uZGluZyB0byB0aG9zZSBidWlsdC1pbiBwcmVmaXhlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSByICAgICAgIHNob3VsZCBiZSBudWxsIGlmIHlvdSBkb24ndCB3YW50IHRvIG1vZGlmeSB0aGUgdHJlZS4KLSAgICAgKiAgICAgICAgICAgICAgICBpZiBhIHByZWZpeCBjYW4ndCBiZSBmb3VuZCwgbnVsbCB3aWxsIGJlIHJldHVybmVkCi0gICAgICogICAgICAgICAgICAgICAgcmF0aGVyIHRoYW4gaW50cm9kdWNpbmcgYW4geG1sbnMuCi0gICAgICogQHBhcmFtIG5zICAgICAgdGhlIG5hbWVzcGFjZSB0byBsb29rIGZvciBvciBpbnRyb2R1Y2UgYSBtYXBwaW5nIGZvci4KLSAgICAgKiAgICAgICAgICAgICAgICBjYXJlZnVsIHdpdGggIiIsIGJlY2F1c2UgaXQgbWF5IGhhdmUgbm9ubG9jYWwgZWZmZWN0cwotICAgICAqICAgICAgICAgICAgICAgIGlmIHNvbWVib2R5IGhhcyBvdmVycmlkZGVuIHRoZSBkZWZhdWx0IG5hbWVzcGFjZS4KLSAgICAgKiBAcGFyYW0gc3VnZ2VzdGlvbiAgYSBzdWdnZXN0ZWQgcHJlZml4IHRvIHRyeSBmaXJzdDsgbWF5IGJlIG51bGwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY3JlYXRlSWZNaXNzaW5nIHRydWUgKG5vcm1hbGx5IGl0J3MgdHJ1ZSkgaWYgeW91IHdhbnQgdG8gY3JlYXRlCi0gICAgICogICAgICAgICAgICAgICAgYW4geG1sbnMgZGVjbGFyYXRpb24gd2hlbiBvbmUgZG9lc24ndCBhbHJlYWR5IGV4aXN0IGZvcgotICAgICAqICAgICAgICAgICAgICAgIHlvdXIgcmVxdWVzdGVkIFVSSS4gIElmIHlvdSBkb24ndCB3YW50IHRvIG1vZGlmeSB0aGUgdHJlZSwKLSAgICAgKiAgICAgICAgICAgICAgICBwYXNzIGZhbHNlLgotICAgICAqLwotICAgIGZpbmFsIFN0cmluZyBwcmVmaXhGb3JOYW1lc3BhY2UgKCAgUm9vdCByLCBTdHJpbmcgbnMsIFN0cmluZyBzdWdnZXN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjcmVhdGVJZk1pc3NpbmcgKQotICAgIHsKLSAgICAgICAgLy8gbnVsbCBzYW1lIGFzIGVtcHR5IHN0cmluZywgbWVhbnMgbm8tbmFtZXNwYWNlCi0gICAgICAgIGlmIChucyA9PSBudWxsKQotICAgICAgICAgICAgbnMgPSAiIjsKLQotICAgICAgICAvLyBzcGVjaWFsIGNhc2VzCi0gICAgICAgIGlmIChfeG1sMTk5OFVyaS5lcXVhbHMoIG5zICkpCi0gICAgICAgICAgICByZXR1cm4gInhtbCI7Ci0gICAgICAgIGlmIChfeG1sbnNVcmkuZXF1YWxzKCBucyApKQotICAgICAgICAgICAgcmV0dXJuICJ4bWxucyI7Ci0KLSAgICAgICAgYXNzZXJ0IGlzQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgQ29udGFpbmVyIGM7Ci0gICAgICAgIFNwbGF5IHM7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBpcyBucyBpcyBub3Qgc3BlY2lmaWVkIChubyBuYW1lc3BhY2UpCi0gICAgICAgIC8vCi0KLSAgICAgICAgaWYgKG5zLmxlbmd0aCgpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvb3A6Ci0gICAgICAgICAgICBmb3IgKCBjID0gKENvbnRhaW5lcikgdGhpcyA7IGMgIT0gbnVsbCA7IGMgPSBjLmdldENvbnRhaW5lcigpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKCBzID0gYy5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocy5pc1htbG5zKCkgJiYgcy5nZXRMb2NhbCgpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmdldFVyaSgpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuZ2V0TG9jYWwoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG92ZXJyaWRkZW4gZGVmYXVsdCBuYW1lc3BhY2UgaW4gc2NvcGUsCi0gICAgICAgICAgICAvLyByZXR1cm4gIiIgLSB0aGUgZGVmYXVsdCBkZWZhdWx0IG5hbWVzcGFjZSBpcyB0aGUgbm8tbmFtZXBzYWNlLgotICAgICAgICAgICAgLy8KLQotICAgICAgICAgICAgaWYgKCBjID09IG51bGwgKQotICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIElmIHdlIGZvdW5kIGEgcHJvYmxlbWF0aWMgZGVmYXVsdCBuYW1lc3BhY2UgYnV0IGNhbm5vdCBtb2RpZnkKLSAgICAgICAgICAgIC8vIHRoZSB0cmVlLCByZXR1cm4gbnVsbCAtIG5vIHByZWZpeCBhdmFpbGFibGUuCi0gICAgICAgICAgICAvLwotCi0gICAgICAgICAgICBpZiAoICFjcmVhdGVJZk1pc3NpbmcgKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBkZWZhdWx0IG5hbWVzcGFjZSB3aGljaCBtYXBzIHRvIGEgJ3JlYWwnIG5hbWVzcGFjZSwKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGRlZmF1bHQgbmFtZXNwYWNlIG9uIHRoaXMgY29udGFpbmVyIHdoaWNoIGlzICIiLiAgVGhpcwotICAgICAgICAgICAgLy8gY2FuIHNjcmV3IGF0dHJpYnV0ZXMgYW5kIHN1Y2gsIGJ1dCwgb2ggd2VsbC4KLSAgICAgICAgICAgIC8vCi0KLSAgICAgICAgICAgIGZvciAoIHMgPSBuZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpICYmIHMuZ2V0TG9jYWwoKS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcy5zZXROYW1lKCByLCBuZXcgUU5hbWUoICIiLCAiIiApICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmdldExvY2FsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB0aGlzIGlzIGFuIHhtbG5zPSIiIGRlY2xhcmF0aW9uCi0KLSAgICAgICAgICAgIEF0dHIgYSA9IG5ldyBYbWxucyggbmV3IFFOYW1lKCAiIiwgIiIgKSApOwotCi0gICAgICAgICAgICByLnN0YXJ0Q2hhbmdlKCk7Ci0KLSAgICAgICAgICAgIHIuaW5zZXJ0U3BsYXkoIGEsIHRoaXMgKTsKLQotICAgICAgICAgICAgci5pbnZhbGlkYXRlVmVyc2lvbigpOwotCi0gICAgICAgICAgICByZXR1cm4gYS5nZXRMb2NhbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gdGhlIG9yZGluYXJ5IG5vdC1hLW5vLW5hbWVzcGFjZSBjYXNlCi0gICAgICAgIC8vCi0KLSAgICAgICAgYXNzZXJ0IG5zICE9IG51bGwgJiYgbnMubGVuZ3RoKCkgPiAwOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIGxvb2sgZm9yIGFuIGV4aXN0aW5nIHByZWZpeCBmb3IgdGhlIHJlcXVlc3RlZCBVUkkKLSAgICAgICAgLy8KLQotICAgICAgICBmb3IgKCBjID0gKENvbnRhaW5lcikgdGhpcyA7IGMgIT0gbnVsbCA7IGMgPSBjLmdldENvbnRhaW5lcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluZHhtbG5zOiBmb3IgKCBzID0gYy5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpICYmIHMuZ2V0VXJpKCkuZXF1YWxzKCBucyApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHMuZ2V0TG9jYWwoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBub3cgY2hlY2sgdG8gdmVyaWZ5IHRoYXQgdGhlIHByZWZpeCBpc24ndCBtYXNrZWQKLSAgICAgICAgICAgICAgICAgICAgZm9yICggQ29udGFpbmVyIGMyID0gKENvbnRhaW5lcikgdGhpcyA7IGMyICE9IGMgOyBjMiA9IGMyLmdldENvbnRhaW5lcigpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggU3BsYXkgczIgPSBjMi5uZXh0U3BsYXkoKSA7IHMyLmlzQXR0cigpIDsgczIgPSBzMi5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMyLmlzWG1sbnMoKSAmJiBzMi5nZXRMb2NhbCgpLmVxdWFscyhyZXN1bHQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBmaW5keG1sbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBub3QgbWFza2VkOiBPSy4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBXZSBjb3VsZCBub3QgZmluZCBhbiBleGlzdGluZyBwcmVmaXggaW4tc2NvcGUgdGhhdCB3b3Jrcy4KLSAgICAgICAgLy8gSWYgIWNyZWF0ZUlmTWlzc2luZywgZG9uJ3QgbW9kaWZ5IHRoZSB0cmVlIC0gcmV0dXJuIG51bGwgaW5zdGVhZC4KLSAgICAgICAgLy8KLQotICAgICAgICBpZiAoIWNyZWF0ZUlmTWlzc2luZykKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFdlIG11c3QgYWRkIGFuIHhtbG5zOnNvbWV0aGluZz0idXJpIiwgc28gd2UgbXVzdCBwaWNrIGEgcHJlZml4LgotICAgICAgICAvLyBXZSB3aWxsIHVzZSB0aGUgc3VnZ2VzdGlvbiBpZiBpdCdzIG5vdCBhbHJlYWR5IGluIHNjb3BlIGFuZCBpZgotICAgICAgICAvLyBpdCdzIG5vdCB0aGUgZW1wdHkgc3RyaW5nIG9yIGFuIGlsbGVnYWwgcHJlZml4LgotICAgICAgICAvLwotCi0gICAgICAgIGlmIChzdWdnZXN0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uLmxlbmd0aCgpID09IDAgfHwgc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoICJ4bWwiICkpCi0gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IG51bGw7IC8vIGJhZCBzdWdnZXN0aW9uCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggYyA9IChDb250YWluZXIpIHRoaXMgOyBjICE9IG51bGwgOyBjID0gYy5nZXRDb250YWluZXIoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IgKCBzID0gYy5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmlzWG1sbnMoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmdldExvY2FsKCkuZXF1YWxzKCBzdWdnZXN0aW9uICkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBJZiBubyBzdWdnZXN0aW9uLCBjb21lIHVwIHdpdGggYSBzYWZlIHByZWZpeCB0byB1c2UKLSAgICAgICAgLy8KLQotICAgICAgICBpZiAoc3VnZ2VzdGlvbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgYmFzZSA9IFFOYW1lSGVscGVyLnN1Z2dlc3RQcmVmaXgobnMpOwotICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IGJhc2U7Ci0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDEgOyA7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9vcDoKLSAgICAgICAgICAgICAgICBmb3IgKCBjID0gKENvbnRhaW5lcikgdGhpcyA7IGMgIT0gbnVsbCA7IGMgPSBjLmdldENvbnRhaW5lcigpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoIHMgPSBjLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmdldExvY2FsKCkuZXF1YWxzKCBzdWdnZXN0aW9uICkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IGJhc2UgKyBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQ29udGFpbmVyIHRhcmdldCA9IG51bGw7Ci0gICAgICAgIENvbnRhaW5lciBsYXN0Q29udGFpbmVyID0gbnVsbDsKLQotICAgICAgICBmb3IgKCBjID0gKENvbnRhaW5lcikgdGhpcyA7IGMgIT0gbnVsbCA7IGMgPSBjLmdldENvbnRhaW5lcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgbGFzdENvbnRhaW5lciA9IGM7Ci0KLSAgICAgICAgICAgIGlmIChjLmlzQmVnaW4oKSkKLSAgICAgICAgICAgICAgICB0YXJnZXQgPSBjOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgdGFyZ2V0ID0gbGFzdENvbnRhaW5lcjsKLQotICAgICAgICBBdHRyIGEgPSBuZXcgWG1sbnMoIG5ldyBRTmFtZSggbnMsIHN1Z2dlc3Rpb24gKSApOwotCi0gICAgICAgIHIuc3RhcnRDaGFuZ2UoKTsKLQotICAgICAgICByLmluc2VydFNwbGF5KCBhLCB0YXJnZXQgKTsKLQotICAgICAgICByLmludmFsaWRhdGVWZXJzaW9uKCk7Ci0KLSAgICAgICAgcmV0dXJuIGEuZ2V0TG9jYWwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb250YWluZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZW50IGF0IHBvcyBpbiB0aGlzCi0gICAgICogc3BsYXkuCi0gICAgICovCi0KLSAgICBmaW5hbCBDb250YWluZXIgZ2V0Q29udGFpbmVyICggaW50IHAgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHAgPj0gMCAmJiBwIDw9IGdldEVuZFBvcygpOwotICAgICAgICBhc3NlcnQgcCA+IDAgfHwgIWlzRG9jKCk7Ci0KLSAgICAgICAgaWYgKHAgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBnZXRDb250YWluZXIoKTsKLQotICAgICAgICBpZiAoaXNMZWFmKCkpCi0gICAgICAgICAgICByZXR1cm4gcCA8IGdldFBvc0FmdGVyKCkgPyAoQ29udGFpbmVyKSB0aGlzIDogZ2V0Q29udGFpbmVyKCk7Ci0KLSAgICAgICAgaWYgKGlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICByZXR1cm4gKENvbnRhaW5lcikgdGhpczsKLQotICAgICAgICBpZiAoaXNGaW5pc2goKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKTsKLQotICAgICAgICByZXR1cm4gZ2V0Q29udGFpbmVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc3BsYXkgd2hpY2ggY29udGFpbnMgdGhpcyBzcGxheS4KLSAgICAgKi8KLQotICAgIGFic3RyYWN0IENvbnRhaW5lciBnZXRDb250YWluZXIgKCApOwotCi0gICAgLyoqCi0gICAgICogSGVscGVyIGZjbiB0byBsb2NhdGUgdGhlIGNvbnRhaW5lciB0aGlzIHNwbGF5IGlzIGNvbnRhaW5lciBpbi4KLSAgICAgKiBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkgaW1wbGVtZW50YXRpb25zIG9mIGdldENvbnRhaW5lciBpbgotICAgICAqIGNhc2VzIHdoZXJlIHRoZSBjb250YWluZXIgaXMgbm90IG9idmlvdXNseSBjb21wdXRhYmxlLgotICAgICAqLwotCi0gICAgQ29udGFpbmVyIGZpbmRDb250YWluZXIgKCApCi0gICAgewotICAgICAgICBhc3NlcnQgIWlzQ29udGFpbmVyKCk7Ci0gICAgICAgIGFzc2VydCAhaXNGaW5pc2goKTsKLQotICAgICAgICBTcGxheSBzID0gbmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgd2hpbGUgKCAhcy5pc0ZpbmlzaCgpICYmICFzLmlzQmVnaW4oKSApCi0gICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKLQotICAgICAgICByZXR1cm4gcy5nZXRDb250YWluZXIoKTsKLSAgICB9Ci0KLSAgICBmaW5hbCB2b2lkIGludmFsaWRhdGVUZXh0ICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzVmFsaWQoKTsKLQotICAgICAgICBUeXBlIHQgPSBwZWVrVHlwZSgpOwotCi0gICAgICAgIGlmICh0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBpc1R5cGVhYmxlKCk7Ci0KLSAgICAgICAgICAgIHQuaW52YWxpZGF0ZVRleHQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZpbmFsIHZvaWQgaW52YWxpZGF0ZU5pbCAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc1R5cGVhYmxlKCk7Ci0KLSAgICAgICAgaWYgKCFpc0F0dHIoKSkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZSB0ID0gcGVla1R5cGUoKTsKLQotICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0LmludmFsaWRhdGVOaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGRpc2Nvbm5lY3RUeXBlcyAoIFJvb3QgciApCi0gICAgewotICAgICAgICBkaXNjb25uZWN0VHlwZXMoIHIsIGZhbHNlICk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGRpc2Nvbm5lY3RUeXBlcyAoIFJvb3QgciwgYm9vbGVhbiBkaXNjb25uZWN0RG9jICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc1R5cGVhYmxlKCk7Ci0KLSAgICAgICAgU3BsYXkgbGFzdCA9IGlzQXR0cigpID8gdGhpcyA6IGdldEZpbmlzaFNwbGF5KCk7Ci0KLSAgICAgICAgU3BsYXkgcyA9IHRoaXM7Ci0KLSAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZSB0ID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKHMuaXNOb3JtYWxBdHRyKCkgfHwgcy5pc0xlYWYoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ID0gcy5wZWVrVHlwZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocy5pc0ZpbmlzaCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnRhaW5lciBjID0gcy5nZXRDb250YWluZXIoKTsKLQotICAgICAgICAgICAgICAgIGlmICghYy5pc0RvYygpIHx8IGRpc2Nvbm5lY3REb2MpCi0gICAgICAgICAgICAgICAgICAgIHQgPSBjLnBlZWtUeXBlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3BsYXkgdSA9IHQuZ2V0U3BsYXkoKTsKLQotICAgICAgICAgICAgICAgIGlmICh1LmlzSW52YWxpZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHUuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0LnZhbGlkYXRlVmFsdWUoIHUsIHQgKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmluaXNoIHNwbGF5IG1pZ2h0IGdldCB3aGFja2VkCi0gICAgICAgICAgICAgICAgICAgICAgICBTcGxheSBmID0gdS5nZXRGaW5pc2hTcGxheSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB0LnZhbGlkYXRlQ29udGVudCggdSwgdCApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZiA9PSBsYXN0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBmOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdC5kaXNjb25uZWN0KCByICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzID09IGxhc3QpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGlmIChzLmlzQ29udGFpbmVyKCkgJiYgIXMuaXNMZWFmKCkgJiYgcy5wZWVrVHlwZSgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgcyA9IHMuZ2V0RmluaXNoU3BsYXkoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHR5cGUgb2Ygb2YgdGhpcwotICAgICAqLwotCi0gICAgZmluYWwgdm9pZCBzZXRUeXBlICggUm9vdCByLCBTY2hlbWFUeXBlIHNUeXBlICkKLSAgICB7Ci0gICAgICAgIHNldFR5cGUoIHIsIHNUeXBlLCB0cnVlICk7Ci0gICAgfQotICAgIAotICAgIGZpbmFsIHZvaWQgc2V0VHlwZSAoIFJvb3QgciwgU2NoZW1hVHlwZSBzVHlwZSwgYm9vbGVhbiBjb21wbGFpbiApCi0gICAgewotICAgICAgICBhc3NlcnQgaXNUeXBlYWJsZSgpOwotICAgICAgICBhc3NlcnQgc1R5cGUgIT0gbnVsbDsKLQotICAgICAgICAvLwotICAgICAgICAvLyBJcyB0aGUgY3VycmVudCB0eXBlIGFscmVhZHkgdGhpcyB0eXBlPwotICAgICAgICAvLwotCi0gICAgICAgIFR5cGUgdCA9IHBlZWtUeXBlKCk7Ci0KLSAgICAgICAgaWYgKHQgIT0gbnVsbCAmJiB0LmdldF9zY2hlbWFfdHlwZSgpID09IHNUeXBlKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIENhbiBhbHdheXMgc2V0IGFuIGFyYml0cmFyeSB0eXBlIGF0IHRoZSBkb2MgbGV2ZWwKLSAgICAgICAgLy8KLQotICAgICAgICBpZiAoaXNEb2MoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZGlzY29ubmVjdFR5cGVzKCByLCB0cnVlICk7Ci0KLSAgICAgICAgICAgIGFzc2VydCBwZWVrVHlwZSgpID09IG51bGw7Ci0KLSAgICAgICAgICAgIG5ldyBUeXBlKCByLCBzVHlwZSwgdGhpcyApOwotCi0gICAgICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gR290dGEgZ2V0IHRoZSBwYXJlbnQgdHlwZSB0byBkbyBhbnl0aGluZyBmdXJ0aGVyLiAgSWYgaXQKLSAgICAgICAgLy8gY2FuJ3QgYmUgZm91bmQsIHRoZW4gYmFyZgotICAgICAgICAvLwotCi0gICAgICAgIFR5cGUgcGFyZW50VHlwZSA9IGdldENvbnRhaW5lcigpLmdldFR5cGUoIHIgKTsKLQotICAgICAgICBhc3NlcnQgcGFyZW50VHlwZSAhPSBudWxsOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFlvdSBjYW4gc2V0IHRoZSBhdHRyaWJ1dGUgdHlwZSwgYXMgbG9uZyBhcyBpdCBpcyB0aGUgbmF0dXJhbAotICAgICAgICAvLyB0eXBlLiAgQXR0cmlidXRlcyBjYW5ub3QgaGF2ZSB4c2k6dHlwZQotICAgICAgICAvLwotCi0gICAgICAgIGlmIChpc0F0dHIoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBhcmVudFR5cGUuZ2V0X2F0dHJpYnV0ZV90eXBlKCBnZXROYW1lKCkgKSAhPSBzVHlwZSAmJiBjb21wbGFpbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgc2V0IHR5cGUgb2YgYXR0cmlidXRlIHRvICIgKyBzVHlwZS50b1N0cmluZygpICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCBpc0JlZ2luKCk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gTm93LCBmb3IgaW50ZXJpb3IgdHlwZXMsIEkgaGF2ZSB0byBkZWFsIHdpdGggeHNpOnR5cGUgYW5kCi0gICAgICAgIC8vIHdoZXRoZXIgb3Igbm90IHRoZSB0eXBlIGlzIGFsbG93ZWQgYXQgdGhpcyBwb2ludC4KLSAgICAgICAgLy8KLQotICAgICAgICAvLyBGaXJzdCBjaGVjayB0byBzZWUgaWYgdGhpcyB0eXBlIGNhbiBiZSBoZXJlIHNhbnMgeHNpOnR5cGUuCi0gICAgICAgIC8vIElmIHNvLCBtYWtlIHN1cmUgdGhlcmUgaXMgbm8geHNpOnR5cGUKLQotICAgICAgICBpZiAocGFyZW50VHlwZS5nZXRfZWxlbWVudF90eXBlKCBnZXROYW1lKCksIG51bGwgKSA9PSBzVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgc2V0WHNpVHlwZSggciwgbnVsbCApOwotCi0gICAgICAgICAgICBkaXNjb25uZWN0VHlwZXMoIHIgKTsKLQotICAgICAgICAgICAgYXNzZXJ0IHZhbGlkYXRlKCk7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSBkZXNpcmVkIHR5cGUgaGFzIG5vIG5hbWUsIHRoZW4gaXQgY2Fubm90IGJlCi0gICAgICAgIC8vIHJlZmVyZW5jZWQgdmlhIHhzaTp0eXBlCi0KLSAgICAgICAgUU5hbWUgdHlwZU5hbWUgPSBzVHlwZS5nZXROYW1lKCk7Ci0KLSAgICAgICAgaWYgKHR5cGVOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb21wbGFpbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgc2V0IHR5cGUgb2YgZWxlbWVudCwgdHlwZSBpcyB1bi1uYW1lZCIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmVudFR5cGUuZ2V0X2VsZW1lbnRfdHlwZSggZ2V0TmFtZSgpLCB0eXBlTmFtZSApICE9IHNUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcGxhaW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkNhbid0IHNldCB0eXBlIG9mIGVsZW1lbnQsIGludmFsaWQgdHlwZSIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0WHNpVHlwZSggciwgdHlwZU5hbWUgKTsKLQotICAgICAgICBkaXNjb25uZWN0VHlwZXMoIHIgKTsKLQotICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3BsYXkuICBJdCBkb2VzIG5vdCBhdHRlbXB0IHRvIGNyZWF0ZQotICAgICAqIG9uZSBhbmQgd2lsbCByZXR1cm4gbnVsbCBpcyBub24gZXhpc3RzLgotICAgICAqLwotCi0gICAgZmluYWwgVHlwZSBwZWVrVHlwZSAoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBpc1R5cGVhYmxlKCk7Ci0KLSAgICAgICAgVHlwZSB0eXBlID0gbnVsbDsKLQotICAgICAgICBpZiAoX2dvb2JlcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggR29vYmVyIGcgPSBmaXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IG5leHRHb29iZXIoIGcgKSApCi0gICAgICAgICAgICAgICAgaWYgKGcuZ2V0S2luZCgpID09IFRZUEUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoVHlwZSkgZzsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCB0eXBlICE9IG51bGwgfHwgaXNWYWxpZCgpOwotCi0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgVHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzcGxheS4gIElmIG5vbiBleGlzdHMsIGl0IGF0dGVtcHRzCi0gICAgICogdG8gY3JlYXRlIG9uZS4gIFJldHVybnMgbnVsbCBpZiBvbmUgY291bGQgbm90IGJlIGNyZWF0ZWQuCi0gICAgICovCi0KLSAgICBmaW5hbCBUeXBlIGdldFR5cGUgKCBSb290IHIgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzVHlwZWFibGUoKTsKLQotICAgICAgICBUeXBlIHR5cGUgPSBwZWVrVHlwZSgpOwotCi0gICAgICAgIGlmICghaXNEb2MoKSAmJiB0eXBlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGUgcGFyZW50VHlwZSA9IGdldENvbnRhaW5lcigpLmdldFR5cGUoIHIgKTsKLQotICAgICAgICAgICAgYXNzZXJ0IHBhcmVudFR5cGUgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gRGVmZW5zaXZlCi0gICAgICAgICAgICBpZiAocGFyZW50VHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBUeXBlU3RvcmVVc2VyIG5ld1VzZXI7Ci0KLSAgICAgICAgICAgIGlmIChpc0JlZ2luKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3VXNlciA9Ci0gICAgICAgICAgICAgICAgICAgIHBhcmVudFR5cGUuY3JlYXRlX2VsZW1lbnRfdXNlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE5hbWUoKSwgZ2V0WHNpVHlwZU5hbWUoIHIgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBpc05vcm1hbEF0dHIoKTsKLQotICAgICAgICAgICAgICAgIG5ld1VzZXIgPSBwYXJlbnRUeXBlLmNyZWF0ZV9hdHRyaWJ1dGVfdXNlciggZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydCBuZXdVc2VyICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIERlZmVuc2l2ZQotICAgICAgICAgICAgaWYgKG5ld1VzZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgdHlwZSA9IG5ldyBUeXBlKCByLCBuZXdVc2VyLCB0aGlzICk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgdHlwZSAhPSBudWxsOwotCi0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElzIHRoaXMgaW5zaWRlIG9mIHRoZSBjb250ZW50IG9mIHNSYW5nZT8gIERvZXMgYW4gaW5jbHVzaXZlIGNoZWNrLgotICAgICAqLwotCi0gICAgZmluYWwgYm9vbGVhbiBiZXR3ZWVuICggUm9vdCByLCBpbnQgcFRoaXMsIFNwbGF5IHNSYW5nZSApCi0gICAgewotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSByOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSBzUmFuZ2UuZ2V0Um9vdFNsb3coKTsKLQotICAgICAgICBpZiAoc1JhbmdlLmlzRG9jKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBpZiAoY29tcGFyZSggciwgcFRoaXMsIHNSYW5nZSwgMCApIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBTcGxheSBzRW5kOwotICAgICAgICBpbnQgICBwRW5kOwotCi0gICAgICAgIGFzc2VydCAhc1JhbmdlLmlzRG9jKCk7Ci0KLSAgICAgICAgaWYgKHNSYW5nZS5pc0xlYWYoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc0VuZCA9IHNSYW5nZTsKLSAgICAgICAgICAgIHBFbmQgPSBzUmFuZ2UuZ2V0UG9zTGVhZkVuZCgpICsgMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzUmFuZ2UuaXNCZWdpbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzRW5kID0gc1JhbmdlLmdldEZpbmlzaFNwbGF5KCk7Ci0gICAgICAgICAgICBwRW5kID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNFbmQgPSBzUmFuZ2UubmV4dFNwbGF5KCk7Ci0gICAgICAgICAgICBwRW5kID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb21wYXJlKCByLCBwVGhpcywgc0VuZCwgcEVuZCApIDw9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZSB0d28gcG9zaXRpb25zLiAgQXR0cmlidXRlcyBhcmUgYSBiaXRjaC4KLSAgICAgKi8KLQotICAgIGZpbmFsIGludCBjb21wYXJlICggUm9vdCByLCBpbnQgcFRoaXMsIFNwbGF5IHNUaGF0LCBpbnQgcFRoYXQgKQotICAgIHsKLSAgICAgICAgU3BsYXkgc1RoaXMgPSB0aGlzOwotCi0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBzVGhpcy5nZXRSb290U2xvdygpID09IHI7Ci0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBzVGhhdC5nZXRSb290U2xvdygpID09IHI7Ci0gICAgICAgIGFzc2VydCBwVGhpcyA+PSAwICYmIHBUaGlzIDw9IHNUaGlzLmdldEVuZFBvcygpOwotICAgICAgICBhc3NlcnQgcFRoYXQgPj0gMCAmJiBwVGhhdCA8PSBzVGhhdC5nZXRFbmRQb3MoKTsKLQotICAgICAgICAvLyBOb3JtYWxpemUgcG9zaXRpb25zCi0KLSAgICAgICAgaWYgKHBUaGlzID09IHNUaGlzLmdldEVuZFBvcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc1RoaXMuaXNBdHRyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKChzVGhpcyA9IHNUaGlzLm5leHRTcGxheSgpKS5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICAgICAgcFRoaXMgPSAwOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNUaGlzID0gc1RoaXMucHJldk5vbkF0dHJTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICBwVGhpcyA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNUaGlzID0gc1RoaXMubmV4dE5vbkF0dHJTcGxheSgpOwotICAgICAgICAgICAgICAgIHBUaGlzID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwVGhhdCA9PSBzVGhhdC5nZXRFbmRQb3MoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNUaGF0LmlzQXR0cigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgoc1RoYXQgPSBzVGhhdC5uZXh0U3BsYXkoKSkuaXNBdHRyKCkpCi0gICAgICAgICAgICAgICAgICAgIHBUaGF0ID0gMDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzVGhhdCA9IHNUaGF0LnByZXZOb25BdHRyU3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgcFRoYXQgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzVGhhdCA9IHNUaGF0Lm5leHROb25BdHRyU3BsYXkoKTsKLSAgICAgICAgICAgICAgICBwVGhhdCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgcFRoaXMgPCBzVGhpcy5nZXRFbmRQb3MoKTsKLSAgICAgICAgYXNzZXJ0IHBUaGF0IDwgc1RoYXQuZ2V0RW5kUG9zKCk7Ci0KLSAgICAgICAgaWYgKHNUaGlzID09IHNUaGF0KQotICAgICAgICAgICAgcmV0dXJuIHBUaGlzIDwgcFRoYXQgPyAtMSA6IHBUaGlzID4gcFRoYXQgPyAxIDogMDsKLQotICAgICAgICAvLwotCi0gICAgICAgIGlmIChzVGhpcy5pc0F0dHIoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNUaGF0LmlzQXR0cigpKQotICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlKCByLCBzVGhhdCApOwotCi0gICAgICAgICAgICBpZiAoc1RoaXMucHJldk5vbkF0dHJTcGxheSgpICE9IHNUaGF0KQotICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlKCByLCBzVGhhdCApOwotCi0gICAgICAgICAgICByZXR1cm4gcFRoYXQgPT0gMCA/IDEgOiAtMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzVGhhdC5pc0F0dHIoKSkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFzVGhpcy5pc0F0dHIoKTsKLQotICAgICAgICAgICAgaWYgKHNUaGF0LnByZXZOb25BdHRyU3BsYXkoKSAhPSBzVGhpcykKLSAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZSggciwgc1RoYXQgKTsKLQotICAgICAgICAgICAgcmV0dXJuIHBUaGlzID09IDAgPyAtMSA6IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29tcGFyZSggciwgc1RoYXQgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNvbXBhcmUgKCBSb290IHIsIFNwbGF5IHNUaGF0ICkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHNUaGlzID0gdGhpczsKLQotICAgICAgICBpZiAoc1RoaXMgPT0gc1RoYXQpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBpZiAoci5pc0xlZnRPbmx5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzVGhpcy5nZXRDY2hMZWZ0KCkgPCBzVGhhdC5nZXRDY2hMZWZ0KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgICBpZiAoc1RoaXMuZ2V0Q2NoTGVmdCgpID4gc1RoYXQuZ2V0Q2NoTGVmdCgpKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgICAgICBpZiAoc1RoaXMuZ2V0Q2RvY0JlZ2luTGVmdCgpIDwgc1RoYXQuZ2V0Q2RvY0JlZ2luTGVmdCgpKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgICAgaWYgKHNUaGlzLmdldENkb2NCZWdpbkxlZnQoKSA+IHNUaGF0LmdldENkb2NCZWdpbkxlZnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLQotICAgICAgICAgICAgd2hpbGUgKCBzVGhpcyAhPSByICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzVGhpcyA9IHNUaGlzLm5leHRTcGxheSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHNUaGlzID09IHNUaGF0KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc1RoaXMuZ2V0Q2NoKCkgPiAwIHx8IHNUaGlzLmdldENkb2NCZWdpbigpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNUaGF0LmlzUm9vdCgpKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgIGlmIChzVGhpcy5pc1Jvb3QoKSkKLSAgICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgIHNUaGlzLnNwbGF5KCByLCByICk7Ci0gICAgICAgIHNUaGF0LnNwbGF5KCByLCBzVGhpcyApOwotCi0gICAgICAgIGFzc2VydCBzVGhpcy5fbGVmdFNwbGF5ID09IHNUaGF0IHx8IHNUaGlzLl9yaWdodFNwbGF5ID09IHNUaGF0OwotCi0gICAgICAgIHJldHVybiBzVGhpcy5fbGVmdFNwbGF5ID09IHNUaGF0ID8gMSA6IC0xOwotICAgIH0KLQotICAgIGZpbmFsIFNwbGF5IG5leHROb25BdHRyU3BsYXkgKCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gbmV4dFNwbGF5KCk7Ci0KLSAgICAgICAgd2hpbGUgKCBzICE9IG51bGwgJiYgcy5pc0F0dHIoKSApCi0gICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKLQotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBmaW5hbCBTcGxheSBwcmV2Tm9uQXR0clNwbGF5ICggKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IHByZXZTcGxheSgpOwotCi0gICAgICAgIHdoaWxlICggcyAhPSBudWxsICYmIHMuaXNBdHRyKCkgKQotICAgICAgICAgICAgcyA9IHMucHJldlNwbGF5KCk7Ci0KLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgZmluYWwgU3BsYXkgbmV4dFNwbGF5ICggKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IHRoaXM7Ci0gICAgICAgIFNwbGF5IHIgPSBzLl9yaWdodFNwbGF5OwotCi0gICAgICAgIGlmIChyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIFNwbGF5IGwgPSBzID0gciA7IChsID0gbC5fbGVmdFNwbGF5KSAhPSBudWxsIDsgKQotICAgICAgICAgICAgICAgIHMgPSBsOwotCi0gICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIFNwbGF5IHAgPSBzLl9wYXJlbnRTcGxheSA7IDsgcCA9IChzID0gcCkuX3BhcmVudFNwbGF5ICkKLSAgICAgICAgICAgIGlmIChwID09IG51bGwgfHwgcC5fbGVmdFNwbGF5ID09IHMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQotCi0gICAgZmluYWwgU3BsYXkgcHJldlNwbGF5ICggKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IHRoaXM7Ci0gICAgICAgIFNwbGF5IGwgPSBzLl9sZWZ0U3BsYXk7Ci0KLSAgICAgICAgaWYgKGwgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggU3BsYXkgciA9IHMgPSBsIDsgKHIgPSByLl9yaWdodFNwbGF5KSAhPSBudWxsIDsgKQotICAgICAgICAgICAgICAgIHMgPSByOwotCi0gICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIFNwbGF5IHAgPSBzLl9wYXJlbnRTcGxheSA7IDsgcCA9IChzID0gcCkuX3BhcmVudFNwbGF5ICkKLSAgICAgICAgICAgIGlmIChwID09IG51bGwgfHwgcC5fcmlnaHRTcGxheSA9PSBzKQotICAgICAgICAgICAgICAgIHJldHVybiBwOwotICAgIH0KLQotICAgIGZpbmFsIHZvaWQgcm90YXRlUmlnaHQgKCApCi0gICAgewotICAgICAgICBhc3NlcnQgX3BhcmVudFNwbGF5Ll9sZWZ0U3BsYXkgPT0gdGhpczsKLQotICAgICAgICBTcGxheSBwID0gX3BhcmVudFNwbGF5OwotICAgICAgICBTcGxheSBnID0gcC5fcGFyZW50U3BsYXk7Ci0KLSAgICAgICAgYXNzZXJ0IHAgIT0gbnVsbDsKLQotICAgICAgICBwLl9sZWZ0U3BsYXkgPSBfcmlnaHRTcGxheTsKLQotICAgICAgICBpZiAoX3JpZ2h0U3BsYXkgIT0gbnVsbCkKLSAgICAgICAgICAgIF9yaWdodFNwbGF5Ll9wYXJlbnRTcGxheSA9IHA7Ci0KLSAgICAgICAgX3JpZ2h0U3BsYXkgPSBwOwotICAgICAgICBwLl9wYXJlbnRTcGxheSA9IHRoaXM7Ci0gICAgICAgIF9wYXJlbnRTcGxheSA9IGc7Ci0KLSAgICAgICAgaWYgKGcgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGcuX2xlZnRTcGxheSA9PSBwKQotICAgICAgICAgICAgICAgIGcuX2xlZnRTcGxheSA9IHRoaXM7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZy5fcmlnaHRTcGxheSA9IHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwLmFkanVzdENjaExlZnQoIC0gZ2V0Q2NoTGVmdCgpIC0gZ2V0Q2NoKCkgKTsKLSAgICAgICAgcC5hZGp1c3RDZG9jQmVnaW5MZWZ0KCAtIGdldENkb2NCZWdpbkxlZnQoKSAtIGdldENkb2NCZWdpbigpICk7Ci0gICAgfQotCi0gICAgZmluYWwgdm9pZCByb3RhdGVMZWZ0ICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IF9wYXJlbnRTcGxheS5fcmlnaHRTcGxheSA9PSB0aGlzOwotCi0gICAgICAgIFNwbGF5IHAgPSBfcGFyZW50U3BsYXk7Ci0gICAgICAgIFNwbGF5IGcgPSBwLl9wYXJlbnRTcGxheTsKLQotICAgICAgICBhc3NlcnQgcCAhPSBudWxsOwotCi0gICAgICAgIHAuX3JpZ2h0U3BsYXkgPSBfbGVmdFNwbGF5OwotCi0gICAgICAgIGlmIChfbGVmdFNwbGF5ICE9IG51bGwpCi0gICAgICAgICAgICBfbGVmdFNwbGF5Ll9wYXJlbnRTcGxheSA9IHA7Ci0KLSAgICAgICAgX2xlZnRTcGxheSA9IHA7Ci0gICAgICAgIHAuX3BhcmVudFNwbGF5ID0gdGhpczsKLSAgICAgICAgX3BhcmVudFNwbGF5ID0gZzsKLQotICAgICAgICBpZiAoZyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZy5fbGVmdFNwbGF5ID09IHApCi0gICAgICAgICAgICAgICAgZy5fbGVmdFNwbGF5ID0gdGhpczsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBnLl9yaWdodFNwbGF5ID0gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIGFkanVzdENjaExlZnQoIHAuZ2V0Q2NoTGVmdCgpICsgcC5nZXRDY2goKSApOwotICAgICAgICBhZGp1c3RDZG9jQmVnaW5MZWZ0KCBwLmdldENkb2NCZWdpbkxlZnQoKSArIHAuZ2V0Q2RvY0JlZ2luKCkgKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIFNwbGF5IHRoaXMgc28gdGhhdCBpdCdzIHBhcmVudCBpcyBwU3RvcC4KLSAgICAvLwotICAgIC8vIFRoaXMgdmVyc2lvbiBvZiBzcGxheSBpcyBjYXBhYmxlIG9mIHNwbGF5aW5nIHRoaXMgdG8gdGhlIHRvcC4gIFRoZXJlCi0gICAgLy8gYXJlIHR3byBjYXNlcy4gIE9uZSBpcyB0aGVyZSByIGlzIHRoaXMgYW5kIHRoaXMgaXMgc3BsYXllZCB0byBiZQotICAgIC8vIHRoZSBsZWZ0IGNoaWxkIG9mIHIuICBUaGUgb3RoZXIgY2FzZSBpcyB3aGVyZSByIGlzIG51bGwuICBJbiB0aGlzIGNhc2UKLSAgICAvLyB0aGUgdHJlZSB0aGlzIGlzIGluIGlzIGRldGFjaGVkIGZyb20gdGhlIG1haW4gZG9jdW1lbnQsIGFuZCB0aGlzIHdpbGwgYmUKLSAgICAvLyBzcGxheWVkIHRvIHRoZSB0b3Agb2YgdGhhdCBzdWJ0cmVlIHN1Y2ggdGhhdCBpdCdzIHBhcmVudCB3aWxsIGJlIG51bGwuCi0gICAgLy8KLQotICAgIGZpbmFsIHZvaWQgc3BsYXkgKCBSb290IHIsIFNwbGF5IHBTdG9wICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBwU3RvcCAhPSBudWxsOwotICAgICAgICBhc3NlcnQgdGhpcyAhPSBwU3RvcDsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHIgPT0gbnVsbCB8fCBnZXRSb290U2xvdygpID09IHI7Ci0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCByID09IG51bGwgfHwgcFN0b3AuZ2V0Um9vdFNsb3coKSA9PSByOwotICAgICAgICBhc3NlcnQgciA9PSBudWxsIHx8IHIudmFsaWRhdGVTcGxheVRyZWUoKTsKLSAgICAgICAgYXNzZXJ0ICFpc1Jvb3QoKTsKLQotICAgICAgICBib29sZWFuIHJvdGF0ZWQgPSBmYWxzZTsKLQotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgX3BhcmVudFNwbGF5ICE9IG51bGw7Ci0KLSAgICAgICAgICAgIFNwbGF5IHAgPSBfcGFyZW50U3BsYXk7Ci0KLSAgICAgICAgICAgIGFzc2VydCBwICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBjaGlsZCBvZiB0aGUgc3RvcHBlciwgdGhlbiB3ZSBhcmUgZG9uZQotCi0gICAgICAgICAgICBpZiAocCA9PSBwU3RvcCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgU3BsYXkgZyA9IHAuX3BhcmVudFNwbGF5OwotCi0gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGNoaWxkIG9mIHJvb3QsIHRoZW4gc2ltcGxlIHJvdGF0ZQotCi0gICAgICAgICAgICByb3RhdGVkID0gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKGcgPT0gcFN0b3ApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHAuX2xlZnRTcGxheSA9PSB0aGlzKQotICAgICAgICAgICAgICAgICAgICByb3RhdGVSaWdodCgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcm90YXRlTGVmdCgpOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZhbmN5IHNwbGF5cwotCi0gICAgICAgICAgICBpZiAoZy5fbGVmdFNwbGF5ID09IHApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHAuX2xlZnRTcGxheSA9PSB0aGlzKQotICAgICAgICAgICAgICAgICAgICBwLnJvdGF0ZVJpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByb3RhdGVMZWZ0KCk7Ci0KLSAgICAgICAgICAgICAgICByb3RhdGVSaWdodCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwLl9yaWdodFNwbGF5ID09IHRoaXMpCi0gICAgICAgICAgICAgICAgICAgIHAucm90YXRlTGVmdCgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcm90YXRlUmlnaHQoKTsKLQotICAgICAgICAgICAgICAgIHJvdGF0ZUxlZnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyb3RhdGVkICYmIHIgIT0gbnVsbCkKLSAgICAgICAgICAgIHIuX2xlZnRPbmx5ID0gZmFsc2U7Ci0KLSAgICAgICAgYXNzZXJ0IHIgPT0gbnVsbCB8fCByLnZhbGlkYXRlU3BsYXlUcmVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoaXMgc3BsYXkgd2hlcmUgcm9vdCBpcyB0aGUgc3BsYXkgcm9vdCBvZiB0aGUgdHJlZSB0aGlzIHNwbGF5LgotICAgICAqIFRoaXMgbWF5IGJlIGEgUk9PVCBzcGxheQotICAgICAqLwotCi0gICAgZmluYWwgU3BsYXkgcmVtb3ZlU3BsYXkgKCBTcGxheSByICkKLSAgICB7Ci0gICAgICAgIFJvb3Qgcm9vdCA9IHIuaXNSb290KCkgPyAoUm9vdCkgciA6IG51bGw7Ci0KLSAgICAgICAgYXNzZXJ0IHIuX3BhcmVudFNwbGF5ID09IG51bGw7Ci0gICAgICAgIGFzc2VydCByb290ID09IG51bGwgfHwgcm9vdC52YWxpZGF0ZVNwbGF5VHJlZSgpOwotICAgICAgICBhc3NlcnQgIWlzUm9vdCgpOwotICAgICAgICBhc3NlcnQgIWlzRG9jKCk7Ci0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBnZXRTcGxheVJvb3RTbG93KCkgPT0gcjsKLQotICAgICAgICAvLyBJZiB0aGUgc3BsYXkgdG8gYmUgcmVtb3ZlZCBoYXMgbm8gY2NoIG9yIGNiZWdpbiwgdGhlbiB3aGVuIHRoZQotICAgICAgICAvLyB0cmVlIGlzIGxlZnQgb25seSBjaGlsZHJlbiwgd2UgbmVlZCBub3Qgc3BsYXkuCi0KLSAgICAgICAgaW50IGNjaCA9IGdldENjaCgpOwotICAgICAgICBpbnQgY2JlZ2luID0gZ2V0Q2RvY0JlZ2luKCk7Ci0KLSAgICAgICAgaWYgKHJvb3QgIT0gbnVsbCAmJiByb290Ll9sZWZ0T25seSAmJiBjY2ggPT0gMCAmJiBjYmVnaW4gPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IF9yaWdodFNwbGF5ID09IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgX3BhcmVudFNwbGF5ICE9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmICgoX3BhcmVudFNwbGF5Ll9sZWZ0U3BsYXkgPSBfbGVmdFNwbGF5KSAhPSBudWxsKQotICAgICAgICAgICAgICAgIF9sZWZ0U3BsYXkuX3BhcmVudFNwbGF5ID0gX3BhcmVudFNwbGF5OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc3BsYXkoIHJvb3QsIHIgKTsKLQotICAgICAgICAgICAgaWYgKF9sZWZ0U3BsYXkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByLmFkanVzdENjaExlZnQoIC0gY2NoICk7Ci0gICAgICAgICAgICAgICAgci5hZGp1c3RDZG9jQmVnaW5MZWZ0KCAtIGNiZWdpbiApOwotCi0gICAgICAgICAgICAgICAgaWYgKChyLl9sZWZ0U3BsYXkgPSBfcmlnaHRTcGxheSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgX3JpZ2h0U3BsYXkuX3BhcmVudFNwbGF5ID0gcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTcGxheSBwID0gcHJldlNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICBwLnNwbGF5KCByb290LCB0aGlzICk7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgcC5fcmlnaHRTcGxheSA9PSBudWxsOwotCi0gICAgICAgICAgICAgICAgci5fbGVmdFNwbGF5ID0gcDsKLSAgICAgICAgICAgICAgICBwLl9wYXJlbnRTcGxheSA9IHI7Ci0gICAgICAgICAgICAgICAgci5hZGp1c3RDY2hMZWZ0KCAtIGNjaCApOwotICAgICAgICAgICAgICAgIHIuYWRqdXN0Q2RvY0JlZ2luTGVmdCggLSBjYmVnaW4gKTsKLSAgICAgICAgICAgICAgICBwLl9yaWdodFNwbGF5ID0gX3JpZ2h0U3BsYXk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocC5fcmlnaHRTcGxheSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBwLl9yaWdodFNwbGF5Ll9wYXJlbnRTcGxheSA9IHA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBfbGVmdFNwbGF5ID0gX3JpZ2h0U3BsYXkgPSBfcGFyZW50U3BsYXkgPSBudWxsOwotICAgICAgICBhZGp1c3RDY2hMZWZ0KCAtIGdldENjaExlZnQoKSApOwotICAgICAgICBhZGp1c3RDZG9jQmVnaW5MZWZ0KCAtIGdldENkb2NCZWdpbkxlZnQoKSApOwotCi0gICAgICAgIGFzc2VydCByb290ID09IG51bGwgfHwgcm9vdC52YWxpZGF0ZVNwbGF5VHJlZSgpOwotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gVGhlIFpvbyAobW9yZSBsaWtlIGEgcGV0dGluZyB6b28gbm93KQotICAgIC8vCi0KLSAgICBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUU5hbWVTcGxheSBleHRlbmRzIFNwbGF5Ci0gICAgewotICAgICAgICBRTmFtZVNwbGF5ICggaW50IGtpbmQsIGJvb2xlYW4gaXMsIFFOYW1lIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcigga2luZCwgaXMgKTsKLSAgICAgICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFFOYW1lIGdldE5hbWUgKCApIHsgcmV0dXJuIF9uYW1lOyB9Ci0gICAgICAgIGZpbmFsIHZvaWQgIGNoYW5nZU5hbWUgKCBRTmFtZSBuYW1lICkgeyBfbmFtZSA9IG5hbWU7IH0KLQotICAgICAgICBmaW5hbCBTdHJpbmcgZ2V0VXJpICAgKCApIHsgcmV0dXJuIF9uYW1lLmdldE5hbWVzcGFjZVVSSSgpOyB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyBnZXRMb2NhbCAoICkgeyByZXR1cm4gX25hbWUuZ2V0TG9jYWxQYXJ0KCk7ICAgIH0KLQotICAgICAgICBwcml2YXRlIFFOYW1lIF9uYW1lOwotICAgIH0KLQotICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDb250YWluZXIgZXh0ZW5kcyBRTmFtZVNwbGF5Ci0gICAgewotICAgICAgICBDb250YWluZXIgKCBpbnQga2luZCwgYm9vbGVhbiBpcywgUU5hbWUgbmFtZSApCi0gICAgICAgICAgICB7IHN1cGVyKCBraW5kLCBpcywgbmFtZSApOyB9Ci0KLSAgICAgICAgYWJzdHJhY3QgRmluaXNoIGdldEZpbmlzaCAoICk7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIERvYyBleHRlbmRzIENvbnRhaW5lcgotICAgIHsKLSAgICAgICAgRG9jICggUm9vdCByLCBRTmFtZSBuYW1lICkKLSAgICAgICAgICAgIHsgc3VwZXIoIERPQywgZmFsc2UsIG5hbWUgKTsgX3Jvb3QgPSByOyB9Ci0KLSAgICAgICAgQ29udGFpbmVyIGdldENvbnRhaW5lciAoICkgeyByZXR1cm4gbnVsbDsgfQotICAgICAgICBGaW5pc2ggICAgZ2V0RmluaXNoICggKSB7IHJldHVybiBfcm9vdDsgfQotCi0gICAgICAgIFJvb3QgX3Jvb3Q7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIEJlZ2luIGV4dGVuZHMgQ29udGFpbmVyCi0gICAgewotICAgICAgICBCZWdpbiAoIFFOYW1lIG5hbWUsIENvbnRhaW5lciBjb250YWluZXIgKQotICAgICAgICAgICAgeyBzdXBlciggQkVHSU4sIGZhbHNlLCBuYW1lICk7IF9jb250YWluZXIgPSBjb250YWluZXI7IH0KLQotICAgICAgICBmaW5hbCBDb250YWluZXIgZ2V0Q29udGFpbmVyICggKSB7IHJldHVybiBfY29udGFpbmVyOyB9Ci0gICAgICAgIGZpbmFsIEZpbmlzaCAgICBnZXRGaW5pc2ggICAgKCApIHsgcmV0dXJuIF9lbmQ7IH0KLQotICAgICAgICBFbmQgICAgICAgICBfZW5kOwotICAgICAgICBDb250YWluZXIgICBfY29udGFpbmVyOwotICAgIH0KLQotICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGaW5pc2ggZXh0ZW5kcyBTcGxheQotICAgIHsKLSAgICAgICAgRmluaXNoICggaW50IGtpbmQgKSB7IHN1cGVyKCBraW5kLCBmYWxzZSApOyB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIEVuZCBleHRlbmRzIEZpbmlzaAotICAgIHsKLSAgICAgICAgRW5kICggQmVnaW4gYmVnaW4gKSB7IHN1cGVyKCBFTkQgKTsgX2JlZ2luID0gYmVnaW47IH0KLQotICAgICAgICBDb250YWluZXIgZ2V0Q29udGFpbmVyICggKSB7IHJldHVybiBfYmVnaW47IH0KLQotICAgICAgICBmaW5hbCBCZWdpbiBfYmVnaW47Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIENvbW1lbnQgZXh0ZW5kcyBTcGxheQotICAgIHsKLSAgICAgICAgQ29tbWVudCAoICkgeyBzdXBlciggQ09NTUVOVCwgZmFsc2UgKTsgfQotCi0gICAgICAgIENvbnRhaW5lciBnZXRDb250YWluZXIgKCApIHsgcmV0dXJuIGZpbmRDb250YWluZXIoKTsgfQotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBGcmFnbWVudCBleHRlbmRzIFNwbGF5Ci0gICAgewotICAgICAgICBGcmFnbWVudCAoICkgeyBzdXBlciggQ09NTUVOVCwgdHJ1ZSApOyB9Ci0KLSAgICAgICAgQ29udGFpbmVyIGdldENvbnRhaW5lciAoICkgeyByZXR1cm4gbnVsbDsgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBBdHRyIGV4dGVuZHMgUU5hbWVTcGxheQotICAgIHsKLSAgICAgICAgQXR0ciAoIFFOYW1lIG5hbWUgKSB7IHN1cGVyKCBBVFRSLCBmYWxzZSwgbmFtZSApOyB9Ci0KLSAgICAgICAgQXR0ciAoIFFOYW1lIG5hbWUsIGJvb2xlYW4gaXNYbWxucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCBBVFRSLCB0cnVlLCBuYW1lICk7Ci0gICAgICAgICAgICBhc3NlcnQgaXNYbWxuczsKLSAgICAgICAgfQotCi0gICAgICAgIENvbnRhaW5lciBnZXRDb250YWluZXIgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBwcmV2U3BsYXkoKSA7IDsgcyA9IHMucHJldlNwbGF5KCkgKQotICAgICAgICAgICAgICAgIGlmICghcy5pc0F0dHIoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChDb250YWluZXIpIHM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgWG1sbnMgZXh0ZW5kcyBBdHRyCi0gICAgewotICAgICAgICBYbWxucyAoIFFOYW1lIG5hbWUgKSB7IHN1cGVyKCBuYW1lLCB0cnVlICk7IH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgUHJvY2luc3QgZXh0ZW5kcyBRTmFtZVNwbGF5Ci0gICAgewotICAgICAgICBQcm9jaW5zdCAoIFFOYW1lIHRhcmdldCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCBQUk9DSU5TVCwgZmFsc2UsIHRhcmdldCApOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvY2luc3QgKCBTdHJpbmcgdGFyZ2V0ICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIFBST0NJTlNULCBmYWxzZSwgbmV3IFFOYW1lKCAiIiwgdGFyZ2V0ICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbnRhaW5lciBnZXRDb250YWluZXIgKCApIHsgcmV0dXJuIGZpbmRDb250YWluZXIoKTsgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV2ZXJ5IHNwbGF5IHBvaW50cyB0byBhIGNvbGxlY3Rpb24gb2YgZ29vYmVycy4gIEdvb2JlcnMgY2FuIGJlCi0gICAgICogYWdncmVnYXRlZCBpbnRvIGdyb3VwcyB3aGljaCBzaGFyZSB0aGUgc2FtZSBzdGF0ZSAoa2luZCBhbmQgcG9zaXRpb24pLgotICAgICAqLwotCi0gICAgc3RhdGljIGZpbmFsIGludCBDVVJTT1IgICAgID0gMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRZUEUgICAgICAgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQU5OT1RBVElPTiA9IDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBBR0dSRUdBVEUgID0gMzsKLQotICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBHb29iZXIgZXh0ZW5kcyBHb29iZXJzCi0gICAgewotICAgICAgICBHb29iZXIgKCBSb290IHIsIGludCBraW5kICkKLSAgICAgICAgewotICAgICAgICAgICAgX3Jvb3QgPSByOwotICAgICAgICAgICAgX3N0YXRlID0ga2luZDsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCAgIGdldEtpbmQgICggKSB7IHJldHVybiBfc3RhdGUgJiA3OyAgfQotICAgICAgICBmaW5hbCBSb290ICBnZXRSb290ICAoICkgeyByZXR1cm4gX3Jvb3Q7ICAgICAgIH0KLSAgICAgICAgZmluYWwgU3BsYXkgZ2V0U3BsYXkgKCApIHsgcmV0dXJuIF9zcGxheTsgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCAgIGdldFBvcyAgICggKSB7IHJldHVybiBfc3RhdGUgPj4gMzsgfQotICAgICAgICBmaW5hbCBpbnQgICBnZXRTdGF0ZSAoICkgeyByZXR1cm4gX3N0YXRlOyAgICAgIH0KLQotICAgICAgICBmaW5hbCBib29sZWFuIGlzQW5ub3RhdGlvbiAoICkgeyByZXR1cm4gZ2V0S2luZCgpID09IEFOTk9UQVRJT047IH0KLQotICAgICAgICBmaW5hbCB2b2lkIHNldCAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcyAhPSBudWxsOwotICAgICAgICAgICAgZG9TZXQoIHIsIHMsIHAgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgdm9pZCBkb1NldCAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcyAhPSBudWxsIHx8IHAgPT0gMDsKLSAgICAgICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBzID09IG51bGwgfHwgciA9PSBzLmdldFJvb3RTbG93KCk7Ci0gICAgICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgX3NwbGF5ID09IG51bGwgfHwgX3Jvb3QgPT0gX3NwbGF5LmdldFJvb3RTbG93KCk7Ci0vLyAgICAgICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBfcm9vdCA9PSByIHx8IF9zcGxheS5nZXRSb290U2xvdygpICE9IHMuZ2V0Um9vdFNsb3coKTsKLQotICAgICAgICAgICAgX3Jvb3QgPSByOwotCi0gICAgICAgICAgICBpZiAoX3NwbGF5ICE9IHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9zcGxheSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZW1vdmUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGFwcGVuZCggcyApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnQgcCA+PSAwOwotICAgICAgICAgICAgYXNzZXJ0IF9zcGxheSA9PSBudWxsIHx8IHAgPD0gX3NwbGF5LmdldE1heFBvcygpOwotICAgICAgICAgICAgX3N0YXRlID0gcCAqIDggKyAoX3N0YXRlICYgNyk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCB2b2lkIHNldCAoIFJvb3QgciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCByICE9IG51bGw7Ci0gICAgICAgICAgICBfcm9vdCA9IHI7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCB2b2lkIHNldCAoIFNwbGF5IHMsIGludCBwICkgeyBkb1NldCggZ2V0Um9vdCgpLCBzLCAgICAgICAgICBwICk7IH0KLSAgICAgICAgZmluYWwgdm9pZCBzZXQgKCAgICAgICAgICBpbnQgcCApIHsgZG9TZXQoIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSwgcCApOyB9Ci0KLSAgICAgICAgZmluYWwgdm9pZCBzZXQgKCBHb29iZXIgZyApCi0gICAgICAgICAgICB7IGRvU2V0KCBnLmdldFJvb3QoKSwgZy5nZXRTcGxheSgpLCBnLmdldFBvcygpICk7IH0KLQotICAgICAgICB2b2lkIGRpc2Nvbm5lY3QgKCBSb290IHIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb1NldCggciwgbnVsbCwgMCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGFwcGVuZCAoIFNwbGF5IHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcyAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHMuZ2V0Um9vdFNsb3coKSA9PSBfcm9vdDsKLSAgICAgICAgICAgIGFzc2VydCBfc3BsYXkgPT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBfcGFyZW50ID09IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgX25leHQgPT0gbnVsbCAmJiBfcHJldiA9PSBudWxsOwotCi0gICAgICAgICAgICBpZiAocy5fZ29vYmVycyA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHMuX2dvb2JlcnMgPSB0aGlzOwotICAgICAgICAgICAgICAgIF9uZXh0ID0gX3ByZXYgPSB0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9uZXh0ID0gcy5fZ29vYmVyczsKLSAgICAgICAgICAgICAgICBfcHJldiA9IF9uZXh0Ll9wcmV2OwotICAgICAgICAgICAgICAgIF9uZXh0Ll9wcmV2ID0gdGhpczsKLSAgICAgICAgICAgICAgICBfcHJldi5fbmV4dCA9IHRoaXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9zcGxheSA9IHM7Ci0gICAgICAgICAgICBfcGFyZW50ID0gczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgdm9pZCByZW1vdmUgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBfc3BsYXkgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBfZ29vYmVycyA9PSBudWxsOwotCi0gICAgICAgICAgICBpZiAoX25leHQgPT0gdGhpcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgX3BhcmVudC5fZ29vYmVycyA9PSB0aGlzOwotCi0gICAgICAgICAgICAgICAgX3BhcmVudC5fZ29vYmVycyA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiBwYXJlbnQgaXMgYW4gYWdncmVnYXRlIGdvb2JlciwgcmVtb3ZlIGl0IHRvbwotCi0gICAgICAgICAgICAgICAgaWYgKF9wYXJlbnQgIT0gX3NwbGF5KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgR29vYmVyIGcgPSAoR29vYmVyKSBfcGFyZW50OwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZy5nZXRLaW5kKCkgPT0gQUdHUkVHQVRFOwotICAgICAgICAgICAgICAgICAgICBnLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcHJldi5fbmV4dCA9IF9uZXh0OwotICAgICAgICAgICAgICAgIF9uZXh0Ll9wcmV2ID0gX3ByZXY7Ci0KLSAgICAgICAgICAgICAgICBpZiAoX3BhcmVudC5fZ29vYmVycyA9PSB0aGlzKQotICAgICAgICAgICAgICAgICAgICBfcGFyZW50Ll9nb29iZXJzID0gX25leHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9uZXh0ID0gX3ByZXYgPSBudWxsOwotCi0gICAgICAgICAgICBfcGFyZW50ID0gbnVsbDsKLSAgICAgICAgICAgIF9zcGxheSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxCb29rbWFyayBnZXRCb29rbWFyayAoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgZ2V0S2luZCgpID09IEFOTk9UQVRJT04KLSAgICAgICAgICAgICAgICAgICAgPyAoKEFubm90YXRpb24pIHRoaXMpLmdldFhtbEJvb2ttYXJrKCkKLSAgICAgICAgICAgICAgICAgICAgOiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGdldEtpbmROYW1lICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCBnZXRLaW5kKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBDVVJTT1IgICAgIDogcmV0dXJuICJDVVJTT1IiOwotICAgICAgICAgICAgY2FzZSBUWVBFICAgICAgIDogcmV0dXJuICJUWVBFIjsKLSAgICAgICAgICAgIGNhc2UgQU5OT1RBVElPTiA6IHJldHVybiAiQU5OT1RBVElPTiI7Ci0gICAgICAgICAgICBkZWZhdWx0ICAgICAgICAgOiByZXR1cm4gIjx1bmtub3cgZ29vYmVyIGtpbmQ+IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgUm9vdCBfcm9vdDsKLQotICAgICAgICBwcml2YXRlIFNwbGF5IF9zcGxheTsKLQotICAgICAgICBwcml2YXRlIGludCBfc3RhdGU7ICAvLyBwb3MgYW5kIGtpbmQKLQotICAgICAgICBHb29iZXIgIF9uZXh0OwotICAgICAgICBHb29iZXIgIF9wcmV2OwotICAgICAgICBHb29iZXJzIF9wYXJlbnQ7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIEN1cnNvckdvb2JlciBleHRlbmRzIEdvb2JlcgotICAgIHsKLSAgICAgICAgQ3Vyc29yR29vYmVyICggUm9vdCByICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIHIsIENVUlNPUiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcCBjcmVhdGVEZWJ1Z0lkTWFwICggKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBDcmVlcHkgd2F5IHRvIGRpc2NvdmVyIGlzIGFzc2VydCBpcyBlbmFibGVkLgotICAgICAgICAgICAgSGFzaE1hcCBtYXAgPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IChtYXAgPSBuZXcgSGFzaE1hcCgpKSAhPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIG1hcDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0RGVidWdJZCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9kZWJ1Z0lkcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgICAgc3luY2hyb25pemVkICggX2RlYnVnSWRzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIV9kZWJ1Z0lkcy5jb250YWluc0tleSggdGhpcyApKQotICAgICAgICAgICAgICAgICAgICBfZGVidWdJZHMucHV0KCB0aGlzLCBuZXcgSW50ZWdlciggX25leHREZWJ1Z0lkKysgKSApOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuICgoSW50ZWdlcikgX2RlYnVnSWRzLmdldCggdGhpcyApKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcCBfZGVidWdJZHMgPSBjcmVhdGVEZWJ1Z0lkTWFwKCk7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGludCAgIF9uZXh0RGVidWdJZCA9IDE7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIEFubm90YXRpb24gZXh0ZW5kcyBHb29iZXIgaW1wbGVtZW50cyBYbWxNYXJrCi0gICAgewotICAgICAgICBwdWJsaWMgT2JqZWN0IG1vbml0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Um9vdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQW5ub3RhdGlvbiAoIFJvb3QgciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCByLCBBTk5PVEFUSU9OICk7Ci0gICAgICAgIH0KLQotICAgICAgICBBbm5vdGF0aW9uICggUm9vdCByLCBYbWxCb29rbWFyayBhICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcyggciApOwotCi0gICAgICAgICAgICBpZiAoYS5fcmVmID09IG51bGwpCi0gICAgICAgICAgICAgICAgX2Fubm90YXRpb24gPSBhOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIF9yZWYgPSBhLl9yZWY7Ci0KLSAgICAgICAgICAgIF9rZXkgPSBhLmdldEtleSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRLZXkgKCBPYmplY3Qga2V5ICkKLSAgICAgICAgewotICAgICAgICAgICAgX2tleSA9IGtleTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNhbGxlZCB2aWEgYm9va21hcmsgKHB1YmxpYyB2aWEgWG1sTWFyaykKLSAgICAgICAgcHVibGljIGZpbmFsIFhtbEN1cnNvciBjcmVhdGVDdXJzb3IgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChnZXRTcGxheSgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRpbmcgdG8gY3JlYXRlIGEgY3Vyc29yIG9uIGEgYm9va21hcmsgdGhhdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFzIGJlZW4gY2xlYXJlZCBvciByZXBsYWNlZC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEN1cnNvciggZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFhtbEJvb2ttYXJrIGdldFhtbEJvb2ttYXJrICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2Fubm90YXRpb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gX2Fubm90YXRpb247Ci0KLSAgICAgICAgICAgIGlmIChfcmVmICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChYbWxCb29rbWFyaykgX3JlZi5nZXQoKTsKLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGRpc2Nvbm5lY3QgKCBSb290IHIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlci5kaXNjb25uZWN0KCByICk7Ci0KLSAgICAgICAgICAgIFhtbEJvb2ttYXJrIHhhID0gZ2V0WG1sQm9va21hcmsoKTsKLQotICAgICAgICAgICAgaWYgKHhhICE9IG51bGwpCi0gICAgICAgICAgICAgICAgeGEuX2N1cnJlbnRNYXJrID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFhtbEJvb2ttYXJrIF9hbm5vdGF0aW9uOwotICAgICAgICBSZWZlcmVuY2UgICAgIF9yZWY7Ci0KLSAgICAgICAgT2JqZWN0IF9rZXk7Ci0gICAgfQotCi0gICAgZmluYWwgR29vYmVyIGZpcnN0R29vYmVyICggKQotICAgIHsKLSAgICAgICAgaWYgKF9nb29iZXJzID09IG51bGwgfHwgX2dvb2JlcnMuZ2V0S2luZCgpICE9IEFHR1JFR0FURSkKLSAgICAgICAgICAgIHJldHVybiBfZ29vYmVyczsKLQotICAgICAgICBhc3NlcnQgX2dvb2JlcnMuX2dvb2JlcnMgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IF9nb29iZXJzLl9nb29iZXJzLmdldEtpbmQoKSAhPSBBR0dSRUdBVEU7Ci0KLSAgICAgICAgcmV0dXJuIF9nb29iZXJzLl9nb29iZXJzOwotICAgIH0KLQotICAgIGZpbmFsIEdvb2JlciBuZXh0R29vYmVyICggR29vYmVyIGcgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGcgIT0gbnVsbDsKLQotICAgICAgICBpZiAoKGcgPSBnLl9uZXh0KSAhPSBnLl9wYXJlbnQuX2dvb2JlcnMpCi0gICAgICAgICAgICByZXR1cm4gZzsKLQotICAgICAgICByZXR1cm4gZy5fcGFyZW50ID09IGcuX3NwbGF5ID8gbnVsbCA6IG5leHRHb29iZXIoIChHb29iZXIpIGcuX3BhcmVudCApOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIF9hc3NlcnRFbmFibGVkID0gZ2V0QXNzZXJ0RW5hYmxlZCgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBnZXRBc3NlcnRFbmFibGVkICggKQotICAgIHsKLSAgICAgICAgLy8gQ3JlZXB5IHdheSB0byBkaXNjb3ZlciBpcyBhc3NlcnQgaXMgZW5hYmxlZC4KLSAgICAgICAgYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0gICAgICAgIGFzc2VydCAoZW5hYmxlZCA9IHRydWUpIHx8IHRydWU7Ci0gICAgICAgIHJldHVybiBlbmFibGVkOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGFzc2VydEFzc2VydEVuYWJsZWQgKCApCi0gICAgewotICAgICAgICBpZiAoIV9hc3NlcnRFbmFibGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgIG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQXNzZXJ0IG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIHRoaXMgb3BlcmF0aW9uIiApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQXNzb2NpYXRlIGlkJ3Mgd2l0aCBzcGxheXMgd2hlbiBhc3NlcnRzIGFyZSBlbmFibGVkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwIF9kZWJ1Z0lkcyA9Ci0gICAgICAgIF9hc3NlcnRFbmFibGVkID8gbmV3IEhhc2hNYXAoKSA6IG51bGw7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgX25leHREZWJ1Z0lkID0gMTsKLQotICAgIHB1YmxpYyBpbnQgZ2V0RGVidWdJZCAoICkKLSAgICB7Ci0gICAgICAgIGlmIChfZGVidWdJZHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKCBfZGVidWdJZHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIV9kZWJ1Z0lkcy5jb250YWluc0tleSggdGhpcyApKQotICAgICAgICAgICAgICAgIF9kZWJ1Z0lkcy5wdXQoIHRoaXMsIG5ldyBJbnRlZ2VyKCBfbmV4dERlYnVnSWQrKyApICk7Ci0KLSAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIF9kZWJ1Z0lkcy5nZXQoIHRoaXMgKSkuaW50VmFsdWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZHVtcCAoICkgeyBnZXRSb290U2xvdygpLmR1bXAoKTsgfQotICAgIHZvaWQgZHVtcCAoIGJvb2xlYW4gdmVyYm9zZSApIHsgZ2V0Um9vdFNsb3coKS5kdW1wKCB2ZXJib3NlICk7IH0KLQotICAgIHB1YmxpYyBTcGxheSBnZXRTcGxheVJvb3RTbG93ICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0QXNzZXJ0RW5hYmxlZCgpOwotCi0gICAgICAgIFNwbGF5IHMgPSB0aGlzOwotCi0gICAgICAgIHdoaWxlICggcy5fcGFyZW50U3BsYXkgIT0gbnVsbCApCi0gICAgICAgICAgICBzID0gcy5fcGFyZW50U3BsYXk7Ci0KLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgcHVibGljIFJvb3QgZ2V0Um9vdFNsb3cgKCApCi0gICAgewotICAgICAgICBhc3NlcnRBc3NlcnRFbmFibGVkKCk7Ci0KLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5Um9vdFNsb3coKTsKLQotICAgICAgICByZXR1cm4gcy5pc1Jvb3QoKSA/IChSb290KSBzIDogbnVsbDsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0Q3BTbG93ICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0QXNzZXJ0RW5hYmxlZCgpOwotCi0gICAgICAgIGludCBjY2ggPSAwOwotCi0gICAgICAgIGZvciAoIFNwbGF5IHMgPSB0aGlzIDsgKHMgPSBzLnByZXZTcGxheSgpKSAhPSBudWxsIDsgKQotICAgICAgICAgICAgY2NoICs9IHMuZ2V0Q2NoKCk7Ci0KLSAgICAgICAgcmV0dXJuIGNjaDsKLSAgICB9Ci0KLSAgICBpbnQgY29tcGFyZVNsb3cgKCBTcGxheSBzVGhhdCApCi0gICAgewotICAgICAgICBhc3NlcnRBc3NlcnRFbmFibGVkKCk7Ci0KLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGdldFJvb3RTbG93KCkgPT0gc1RoYXQuZ2V0Um9vdFNsb3coKTsKLQotICAgICAgICBpZiAodGhpcyA9PSBzVGhhdCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGZvciAoIFNwbGF5IHMgPSB0aGlzIDsgcyAhPSBudWxsIDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICAgICAgaWYgKHMgPT0gc1RoYXQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgIGZvciAoIFNwbGF5IHMgPSB0aGlzIDsgcyAhPSBudWxsIDsgcyA9IHMucHJldlNwbGF5KCkgKQotICAgICAgICAgICAgaWYgKHMgPT0gc1RoYXQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgICAgYXNzZXJ0IGZhbHNlOiAiWWlrZXMhIjsKLQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBib29sZWFuIHZhbGlkYXRlICggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0QXNzZXJ0RW5hYmxlZCgpOwotCi0gICAgICAgIHJldHVybiBnZXRSb290U2xvdygpLnZhbGlkYXRlKCk7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBEb2N1bWVudCBzcGxheSB0cmVlIG1lbWJlcnMKLSAgICAvLwotCi0gICAgU3BsYXkgX2xlZnRTcGxheTsKLSAgICBTcGxheSBfcmlnaHRTcGxheTsKLSAgICBTcGxheSBfcGFyZW50U3BsYXk7Ci0KLSAgICBwcml2YXRlIGludCBfYml0czsgLy8gMjc6IGNEb2NiZWdpbkxlZnQsIDE6IGludmFsaWQsIDE6IG11bHRpLCAzOiBraW5kCi0gICAgcHJpdmF0ZSBpbnQgX2NjaDsKLSAgICBwcml2YXRlIGludCBfY2NoQWZ0ZXI7Ci0gICAgcHJpdmF0ZSBpbnQgX2NjaExlZnQ7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1RleHQuamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTVlMWM5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOwotCi0vL2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdC5Xcml0ZUNvbnRleHQ7Ci0vL2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdC5SZWFkQ29udGV4dDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVGV4dAotewotICAgIGNoYXJbXSBfYnVmOwotICAgIGludCAgICBfZ2FwOyAgICAvLyBXaGVyZSB0aGUgZ2FwIHN0YXJ0cwotICAgIGludCAgICBfZ2FwTGVuOyAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBnYXAKLQotICAgIGludCBsZW5ndGggKCApCi0gICAgewotICAgICAgICByZXR1cm4gYnVmTGVuKCkgLSBfZ2FwTGVuOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGJ1ZkxlbiAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYnVmID09IG51bGwgPyAwIDogX2J1Zi5sZW5ndGg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHkgKCBjaGFyW10gbmV3QnVmICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBfYnVmICE9IG51bGwgJiYgbmV3QnVmLmxlbmd0aCA+PSBsZW5ndGgoKTsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIDAsIG5ld0J1ZiwgMCwgX2dhcCApOwotCi0gICAgICAgIGludCBsZW5BZnRlckdhcCA9IF9idWYubGVuZ3RoIC0gX2dhcCAtIF9nYXBMZW47Ci0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKLSAgICAgICAgICAgIF9idWYsIF9nYXAgKyBfZ2FwTGVuLAotICAgICAgICAgICAgbmV3QnVmLCBuZXdCdWYubGVuZ3RoIC0gKGxlbkFmdGVyR2FwKSwgbGVuQWZ0ZXJHYXAgKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlc2l6ZSAoIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGNjaCA+IF9nYXBMZW47Ci0gICAgICAgIAotICAgICAgICBpbnQgbmV3U2l6ZSA9IGxlbmd0aCgpICsgY2NoOwotICAgICAgICBpbnQgbmV3TGVuID0gX2J1ZiA9PSBudWxsID8gMTAyNCA6IF9idWYubGVuZ3RoICogMjsKLQotICAgICAgICB3aGlsZSAoIG5ld0xlbiA8IG5ld1NpemUgKQotICAgICAgICAgICAgbmV3TGVuICo9IDI7Ci0KLSAgICAgICAgY2hhcltdIG5ld0J1ZiA9IG5ldyBjaGFyIFsgbmV3TGVuIF07Ci0KLSAgICAgICAgaWYgKF9idWYgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgY29weSggbmV3QnVmICk7Ci0gICAgICAgICAgICBfZ2FwTGVuICs9IG5ld0J1Zi5sZW5ndGggLSBfYnVmLmxlbmd0aDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBfZ2FwTGVuICs9IG5ld0J1Zi5sZW5ndGg7Ci0KLSAgICAgICAgX2J1ZiA9IG5ld0J1ZjsKLSAgICB9Ci0KLSAgICB2b2lkIHRyaW0gKCApCi0gICAgewotICAgICAgICBpZiAoX2J1ZiAhPSBudWxsICYmIF9nYXBMZW4gIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgY2hhcltdIG5ld0J1ZiA9IG5ldyBjaGFyIFsgbGVuZ3RoKCkgXTsKLQotICAgICAgICAgICAgY29weSggbmV3QnVmICk7Ci0KLSAgICAgICAgICAgIF9idWYgPSBuZXdCdWY7Ci0gICAgICAgICAgICBfZ2FwID0gMDsKLSAgICAgICAgICAgIF9nYXBMZW4gPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBtb3ZlICggaW50IHBvcywgVGV4dCBzcmMsIGludCBzcmNQb3MsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgaW5zZXJ0KCBwb3MsIHNyYywgc3JjUG9zLCBjY2ggKTsKLQotICAgICAgICBpZiAoc3JjID09IHRoaXMgJiYgc3JjUG9zID49IHBvcykKLSAgICAgICAgICAgIHNyY1BvcyArPSBjY2g7Ci0KLSAgICAgICAgc3JjLnJlbW92ZSggc3JjUG9zLCBjY2ggKTsKLSAgICB9Ci0KLSAgICB2b2lkIGluc2VydCAoIGludCBwb3MsIE9iamVjdCB0eHQsIGludCBvZmYsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgaWYgKHR4dCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodHh0IGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgICAgIGluc2VydCggcG9zLCAoU3RyaW5nKSB0eHQsIG9mZiwgY2NoICk7Ci0gICAgICAgICAgICBlbHNlIGlmICh0eHQgaW5zdGFuY2VvZiBUZXh0KQotICAgICAgICAgICAgICAgIGluc2VydCggcG9zLCAoVGV4dCkgdHh0LCBvZmYsIGNjaCApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCB0eHQgaW5zdGFuY2VvZiBjaGFyW107Ci0gICAgICAgICAgICAgICAgaW5zZXJ0KCBwb3MsIChjaGFyW10pIHR4dCwgb2ZmLCBjY2ggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICB2b2lkIGluc2VydCAoIGludCBwb3MsIFRleHQgc3JjLCBpbnQgc3JjUG9zLCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIFRoaXMgY2FuIGRlYWwgd2l0aCBjb3B5aW5nIGZyb20gaXRzZWxmCi0gICAgICAgIC8vCi0KLSAgICAgICAgaWYgKGNjaCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjY2ggPiBfZ2FwTGVuKQotICAgICAgICAgICAgICAgIHJlc2l6ZSggY2NoICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1vdmVHYXAoIHBvcyApOwotCi0gICAgICAgICAgICBpZiAoc3JjUG9zICsgY2NoIDwgc3JjLl9nYXApCi0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggc3JjLl9idWYsIHNyY1BvcywgX2J1ZiwgX2dhcCwgY2NoICk7Ci0gICAgICAgICAgICBlbHNlIGlmIChzcmNQb3MgPj0gc3JjLl9nYXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKLSAgICAgICAgICAgICAgICAgICAgc3JjLl9idWYsIHNyY1BvcyArIHNyYy5fZ2FwTGVuLCBfYnVmLCBfZ2FwLCBjY2ggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgbGVmdExlbiA9IHNyYy5fZ2FwIC0gc3JjUG9zOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggc3JjLl9idWYsIHNyY1BvcywgX2J1ZiwgX2dhcCwgbGVmdExlbiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKLSAgICAgICAgICAgICAgICAgICAgc3JjLl9idWYsIHNyYy5fZ2FwICsgc3JjLl9nYXBMZW4sCi0gICAgICAgICAgICAgICAgICAgIF9idWYsIF9nYXAgKyBsZWZ0TGVuLCBjY2ggLSBsZWZ0TGVuICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9nYXAgKz0gY2NoOwotICAgICAgICAgICAgX2dhcExlbiAtPSBjY2g7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCBpbnNlcnQgKCBpbnQgcG9zLCBjaGFyW10gY2hhcnMsIGludCBvZmYsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGNoYXJzICE9IF9idWY7Ci0gICAgICAgIGFzc2VydCBwb3MgPj0gMCAmJiBwb3MgPD0gbGVuZ3RoKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2NoID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNjaCA+IF9nYXBMZW4pCi0gICAgICAgICAgICAgICAgcmVzaXplKCBjY2ggKTsKLQotICAgICAgICAgICAgbW92ZUdhcCggcG9zICk7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIGNoYXJzLCBvZmYsIF9idWYsIF9nYXAsIGNjaCApOwotCi0gICAgICAgICAgICBfZ2FwICs9IGNjaDsKLSAgICAgICAgICAgIF9nYXBMZW4gLT0gY2NoOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBpbnNlcnQgKCBpbnQgcG9zLCBTdHJpbmcgcyApCi0gICAgewotICAgICAgICBpbnNlcnQoIHBvcywgcywgMCwgcy5sZW5ndGgoKSApOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGluc2VydCAoIGludCBwb3MsIFN0cmluZyBzLCBpbnQgb2ZmLCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBwb3MgPj0gMCAmJiBwb3MgPD0gbGVuZ3RoKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2NoID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IG9mZiA+PSAwICYmIG9mZiA8IHMubGVuZ3RoKCk7Ci0gICAgICAgICAgICBhc3NlcnQgY2NoIDw9IHMubGVuZ3RoKCkgLSBvZmY7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjY2ggPiBfZ2FwTGVuKQotICAgICAgICAgICAgICAgIHJlc2l6ZSggY2NoICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1vdmVHYXAoIHBvcyApOwotCi0gICAgICAgICAgICBzLmdldENoYXJzKCBvZmYsIG9mZiArIGNjaCwgX2J1ZiwgX2dhcCApOwotCi0gICAgICAgICAgICBfZ2FwICs9IGNjaDsKLSAgICAgICAgICAgIF9nYXBMZW4gLT0gY2NoOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCByZW1vdmUgKCBpbnQgcG9zLCBpbnQgY2NoICkKLSAgICB7Ci0gICAgICAgIHJlbW92ZSggcG9zLCBjY2gsIG51bGwsIDAgKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCByZW1vdmUgKCBpbnQgcG9zLCBpbnQgY2NoLCBjaGFyW10gcmV0QnVmLCBpbnQgb2ZmICkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBwb3MgPj0gMCAmJiBwb3MgKyBjY2ggPD0gbGVuZ3RoKCk7Ci0KLSAgICAgICAgbW92ZUdhcCggcG9zICk7Ci0KLSAgICAgICAgYXNzZXJ0IHJldEJ1ZiA9PSBudWxsIHx8IHJldEJ1Zi5sZW5ndGggLSBvZmYgPj0gY2NoOwotCi0gICAgICAgIGlmIChjY2ggPiAwICYmIHJldEJ1ZiAhPSBudWxsKQotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX2dhcCArIF9nYXBMZW4sIHJldEJ1Ziwgb2ZmLCBjY2ggKTsKLSAgICAgICAgCi0gICAgICAgIF9nYXBMZW4gKz0gY2NoOwotICAgIH0KLQotICAgIHZvaWQgbW92ZUdhcCggaW50IHBvcyApCi0gICAgewotICAgICAgICBpZiAocG9zIDwgX2dhcCkKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIHBvcywgX2J1ZiwgcG9zICsgX2dhcExlbiwgX2dhcCAtIHBvcyApOwotICAgICAgICBlbHNlIGlmIChwb3MgPiBfZ2FwKQotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX2dhcCArIF9nYXBMZW4sIF9idWYsIF9nYXAsIHBvcyAtIF9nYXApOwotCi0gICAgICAgIF9nYXAgPSBwb3M7Ci0gICAgfQotCi0gICAgaW50IHVuT2JzY3VyZSAoIGludCBwb3MsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGNjaCA+PSAwOwotICAgICAgICBhc3NlcnQgcG9zID49IDAgJiYgcG9zICsgY2NoIDw9IGxlbmd0aCgpOwotCi0gICAgICAgIGlmIChjY2ggPiAwICYmIChwb3MgPCBfZ2FwICYmIHBvcyArIGNjaCA+IF9nYXApKQotICAgICAgICAgICAgbW92ZUdhcCggcG9zICsgY2NoICk7Ci0KLSAgICAgICAgcmV0dXJuIHBvcyA8IF9nYXAgPyBwb3MgOiBwb3MgKyBfZ2FwTGVuOwotICAgIH0KLQotICAgIHZvaWQgZmV0Y2ggKCBTdHJpbmdCdWZmZXIgc2IsIGludCBwb3MsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHBvcyA+PSAwICYmIHBvcyArIGNjaCA8PSBsZW5ndGgoKTsKLQotICAgICAgICBpZiAoY2NoID09IDApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKHBvcyArIGNjaCA8PSBfZ2FwKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIF9idWYsIHBvcywgY2NoICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocG9zID49IF9nYXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBfYnVmLCBwb3MgKyBfZ2FwTGVuLCBjY2ggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIF9idWYsIHBvcywgX2dhcCAtIHBvcyApOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggX2J1ZiwgX2dhcCArIF9nYXBMZW4sIGNjaCAtIF9nYXAgKyBwb3MgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIFN0cmluZyBmZXRjaCAoIGludCBwb3MsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHBvcyA+PSAwICYmIHBvcyArIGNjaCA8PSBsZW5ndGgoKTsKLQotICAgICAgICBpZiAoY2NoID09IDApCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgICAgaWYgKHBvcyArIGNjaCA8PSBfZ2FwKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIF9idWYsIHBvcywgY2NoICk7Ci0KLSAgICAgICAgaWYgKHBvcyA+PSBfZ2FwKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIF9idWYsIHBvcyArIF9nYXBMZW4sIGNjaCApOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBzYi5hcHBlbmQoIF9idWYsIHBvcywgX2dhcCAtIHBvcyApOwotICAgICAgICBzYi5hcHBlbmQoIF9idWYsIF9nYXAgKyBfZ2FwTGVuLCBjY2ggLSBfZ2FwICsgcG9zICk7Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgdm9pZCBmZXRjaCAoIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBwb3MsIGludCBjY2ggKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IG9mZiA+PSAwOwotICAgICAgICBhc3NlcnQgcG9zID49IDAgJiYgcG9zICsgY2NoIDw9IGxlbmd0aCgpOwotICAgICAgICBhc3NlcnQgYnVmLmxlbmd0aCAtIG9mZiA+PSBjY2g7Ci0KLSAgICAgICAgaWYgKGNjaCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgaWYgKHBvcyArIGNjaCA8PSBfZ2FwKQotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgcG9zLCBidWYsIG9mZiwgY2NoICk7Ci0gICAgICAgIGVsc2UgaWYgKHBvcyA+PSBfZ2FwKQotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgcG9zICsgX2dhcExlbiwgYnVmLCBvZmYsIGNjaCApOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjaHVuayA9IF9nYXAgLSBwb3M7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIHBvcywgYnVmLCBvZmYsIGNodW5rICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoCi0gICAgICAgICAgICAgICAgX2J1ZiwgX2dhcCArIF9nYXBMZW4sIGJ1Ziwgb2ZmICsgY2h1bmssIGNjaCAtIGNodW5rICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZldGNoKCAwLCBsZW5ndGgoKSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvVHlwZS5qYXZhIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MTlkOGYuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDgwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0b3JMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQXR0cjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQmVnaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5LkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQ29weUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5Lkdvb2JlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLk5hbWVzcGFjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmVVc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuVHlwZVN0b3JlVXNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmVWaXNpdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBUeXBlIGV4dGVuZHMgR29vYmVyIGltcGxlbWVudHMgVHlwZVN0b3JlCi17Ci0gICAgVHlwZSAoIFJvb3QgciwgU2NoZW1hVHlwZSBzVHlwZSwgU3BsYXkgcyApCi0gICAgewotICAgICAgICB0aGlzKCByLCAoKFR5cGVTdG9yZVVzZXJGYWN0b3J5KSBzVHlwZSkuY3JlYXRlVHlwZVN0b3JlVXNlcigpLCBzICk7Ci0gICAgfQotICAgIAotICAgIFR5cGUgKCBSb290IHIsIFR5cGVTdG9yZVVzZXIgdXNlciwgU3BsYXkgcyApCi0gICAgewotICAgICAgICBzdXBlciggciwgU3BsYXkuVFlQRSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHMucGVla1R5cGUoKSA9PSBudWxsOwotICAgICAgICBhc3NlcnQgdXNlciAhPSBudWxsOwotICAgICAgICBhc3NlcnQgcy5pc1R5cGVhYmxlKCk7Ci0gICAgICAgIAotICAgICAgICBfdXNlciA9IHVzZXI7Ci0gICAgICAgIAotICAgICAgICBzZXQoIHMsIDAgKTsKLQotICAgICAgICBpZiAodXNlci51c2VzX2ludmFsaWRhdGVfdmFsdWUoKSkKLSAgICAgICAgICAgIHIuX2NJbnZhbGlkYXRhYmxlVHlwZXMrKzsKLQotICAgICAgICBpZiAodXNlci5pc19jaGlsZF9lbGVtZW50X29yZGVyX3NlbnNpdGl2ZSgpKQotICAgICAgICAgICAgci5fY0VsZW1PcmRlclNlbnNpdGl2ZVR5cGVzKys7Ci0gICAgICAgIAotICAgICAgICB1c2VyLmF0dGFjaF9zdG9yZSggdGhpcyApOwotICAgIH0KLQotICAgIHZvaWQgZGlzY29ubmVjdCAoIFJvb3QgciApCi0gICAgewotICAgICAgICBzdXBlci5kaXNjb25uZWN0KCByICk7Ci0gICAgICAgIAotICAgICAgICBpZiAoX3VzZXIudXNlc19pbnZhbGlkYXRlX3ZhbHVlKCkpCi0gICAgICAgICAgICByLl9jSW52YWxpZGF0YWJsZVR5cGVzLS07Ci0KLSAgICAgICAgaWYgKF91c2VyLmlzX2NoaWxkX2VsZW1lbnRfb3JkZXJfc2Vuc2l0aXZlKCkpCi0gICAgICAgICAgICByLl9jRWxlbU9yZGVyU2Vuc2l0aXZlVHlwZXMtLTsKLSAgICAgICAgCi0gICAgICAgIF91c2VyLmRpc2Nvbm5lY3Rfc3RvcmUoKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLQotICAgIFNjaGVtYVR5cGUgZ2V0X3NjaGVtYV90eXBlICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF91c2VyLmdldF9zY2hlbWFfdHlwZSgpOwotICAgIH0KLSAgICAKLSAgICBTY2hlbWFUeXBlIGdldF9lbGVtZW50X3R5cGUgKCBRTmFtZSBlbHROYW1lLCBRTmFtZSB4c2lUeXBlICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdXNlci5nZXRfZWxlbWVudF90eXBlKCBlbHROYW1lLCB4c2lUeXBlICk7Ci0gICAgfQotICAgIAotICAgIFNjaGVtYVR5cGUgZ2V0X2F0dHJpYnV0ZV90eXBlICggUU5hbWUgYXR0ck5hbWUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF91c2VyLmdldF9hdHRyaWJ1dGVfdHlwZSggYXR0ck5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgVHlwZVN0b3JlVXNlciBjcmVhdGVfZWxlbWVudF91c2VyICggUU5hbWUgZWx0TmFtZSwgUU5hbWUgeHNpVHlwZSApCi0gICAgewotICAgICAgICBUeXBlU3RvcmVVc2VyIHJldCA9IG51bGw7Ci0gICAgICAgIGlmIChnZXRSb290KCkuX2ZhY3RvcnkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldCA9IGdldFJvb3QoKS5fZmFjdG9yeS5jcmVhdGVFbGVtZW50VXNlcihnZXRfc2NoZW1hX3R5cGUoKSwgZWx0TmFtZSwgeHNpVHlwZSk7Ci0KLSAgICAgICAgaWYgKHJldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0ID0gX3VzZXIuY3JlYXRlX2VsZW1lbnRfdXNlciggZWx0TmFtZSwgeHNpVHlwZSApOwotCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgICAgICAgICAgCi0gICAgVHlwZVN0b3JlVXNlciBjcmVhdGVfYXR0cmlidXRlX3VzZXIoIFFOYW1lIGF0dHJOYW1lICkKLSAgICB7Ci0gICAgICAgIFR5cGVTdG9yZVVzZXIgcmV0ID0gbnVsbDsKLQotICAgICAgICBpZiAoZ2V0Um9vdCgpLl9mYWN0b3J5ICE9IG51bGwpCi0gICAgICAgICAgICByZXQgPSBnZXRSb290KCkuX2ZhY3RvcnkuY3JlYXRlQXR0cmlidXRlVXNlcihnZXRfc2NoZW1hX3R5cGUoKSwgIGF0dHJOYW1lKTsKLQotICAgICAgICBpZiAocmV0ID09IG51bGwpCi0gICAgICAgICAgICByZXQgPSBfdXNlci5jcmVhdGVfYXR0cmlidXRlX3VzZXIoIGF0dHJOYW1lICk7Ci0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBYbWxPYmplY3QgZ2V0WG1sT2JqZWN0ICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChYbWxPYmplY3QpIF91c2VyOwotICAgIH0KLQotICAgIGJvb2xlYW4gdXNlc19pbnZhbGlkYXRlX3ZhbHVlICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF91c2VyLnVzZXNfaW52YWxpZGF0ZV92YWx1ZSgpOwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNfY2hpbGRfZWxlbWVudF9vcmRlcl9zZW5zaXRpdmUgKCApCi0gICAgewotICAgICAgICByZXR1cm4gX3VzZXIuaXNfY2hpbGRfZWxlbWVudF9vcmRlcl9zZW5zaXRpdmUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGludmFsaWRhdGVUZXh0ICggKQotICAgIHsKLSAgICAgICAgaWYgKF9pbmhpYml0VXNlckludmFsaWRhdGUgPT0gMCkKLSAgICAgICAgICAgIF91c2VyLmludmFsaWRhdGVfdmFsdWUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGludmFsaWRhdGVOaWwgKCApCi0gICAgewotICAgICAgICBpZiAoX2luaGliaXRVc2VySW52YWxpZGF0ZSA9PSAwKQotICAgICAgICAgICAgX3VzZXIuaW52YWxpZGF0ZV9uaWx2YWx1ZSgpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGludmFsaWRhdGVFbGVtZW50ICggQ29udGFpbmVyIGNvbnRhaW5lciwgU3BsYXkgcyApCi0gICAgewotICAgICAgICBhc3NlcnQgcy5nZXRDb250YWluZXIoKSA9PSBjb250YWluZXI7Ci0gICAgICAgIAotICAgICAgICBpZiAoX2luaGliaXRVc2VySW52YWxpZGF0ZSA+IDApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgVHlwZSBjb250YWluZXJUeXBlID0gY29udGFpbmVyLnBlZWtUeXBlKCk7Ci0KLSAgICAgICAgaWYgKGNvbnRhaW5lclR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAoIWNvbnRhaW5lclR5cGUuaXNfY2hpbGRfZWxlbWVudF9vcmRlcl9zZW5zaXRpdmUoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBjb250YWluZXJUeXBlLl91c2VyLmludmFsaWRhdGVfdmFsdWUoKTsKLQotICAgICAgICBmb3IgKCA7IDsgcyA9IHMubmV4dFNwbGF5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocy5pc0ZpbmlzaCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENvbnRhaW5lcigpID09IGNvbnRhaW5lcjsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzLmlzQmVnaW4oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUeXBlIGNoaWxkVHlwZSA9IHMucGVla1R5cGUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChjaGlsZFR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRUeXBlLl91c2VyLmludmFsaWRhdGVfZWxlbWVudF9vcmRlcigpOwotCi0gICAgICAgICAgICAgICAgcyA9IHMuZ2V0RmluaXNoU3BsYXkoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTdHJpbmcgYnVpbGRfdGV4dCAoIE5hbWVzcGFjZU1hbmFnZXIgbnNtICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdXNlci5idWlsZF90ZXh0KCBuc20gKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGJ1aWxkX25pbCAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdXNlci5idWlsZF9uaWwoKTsKLSAgICB9Ci0gICAgCi0gICAgaW50IHZhbGlkYXRlQ29udGVudCAoIFNwbGF5IHMsIE5hbWVzcGFjZU1hbmFnZXIgbnNtICkKLSAgICB7Ci0gICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBzLmlzSW52YWxpZCgpOwotICAgICAgICBhc3NlcnQgcy5pc0xlYWYoKSB8fCBzLmlzRG9jKCk7Ci0KLSAgICAgICAgU3RyaW5nIHRleHQgPSBidWlsZF90ZXh0KCBuc20gKTsKLQotICAgICAgICBhc3NlcnQgdGV4dCAhPSBudWxsOwotCi0gICAgICAgIF9pbmhpYml0VXNlckludmFsaWRhdGUrKzsKLQotICAgICAgICAvLyBWYWxpZGF0aW5nIGRvZXMgbm90IGxvZ2ljYWxseSBjaGFuZ2UgdGhlIGRvYwotICAgICAgICBsb25nIG9sZFZlcnNpb24gPSByLmdldFZlcnNpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHMudG9nZ2xlSXNJbnZhbGlkKCk7IC8vIFByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbgotICAgICAgICAKLSAgICAgICAgcy5pbnNlcnRDaGFycyggMSwgciwgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSApOwotCi0gICAgICAgIHIucmVzdG9yZVZlcnNpb24oIG9sZFZlcnNpb24gKTsKLSAgICAgICAgCi0gICAgICAgIF9pbmhpYml0VXNlckludmFsaWRhdGUtLTsKLQotICAgICAgICByZXR1cm4gdGV4dC5sZW5ndGgoKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB2YWxpZGF0ZVZhbHVlICggU3BsYXkgcywgTmFtZXNwYWNlTWFuYWdlciBuc20gKQotICAgIHsKLSAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHMuaXNJbnZhbGlkKCk7Ci0gICAgICAgIGFzc2VydCBzLmlzTm9ybWFsQXR0cigpOwotCi0gICAgICAgIFN0cmluZyB0ZXh0ID0gYnVpbGRfdGV4dCggbnNtICk7Ci0KLSAgICAgICAgYXNzZXJ0IHRleHQgIT0gbnVsbDsKLQotICAgICAgICAvLyBWYWxpZGF0aW5nIGRvZXMgbm90IGxvZ2ljYWxseSBjaGFuZ2UgdGhlIGRvYwotICAgICAgICBsb25nIG9sZFZlcnNpb24gPSByLmdldFZlcnNpb24oKTsKLSAgICAgICAgCi0gICAgICAgIF9pbmhpYml0VXNlckludmFsaWRhdGUrKzsKLSAgICAgICAgCi0gICAgICAgIHMudG9nZ2xlSXNJbnZhbGlkKCk7IC8vIFByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbgotICAgICAgICAKLSAgICAgICAgcy5zZXRUZXh0KCByLCB0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpICk7Ci0gICAgICAgIAotICAgICAgICByLnJlc3RvcmVWZXJzaW9uKCBvbGRWZXJzaW9uICk7Ci0gICAgICAgIAotICAgICAgICBfaW5oaWJpdFVzZXJJbnZhbGlkYXRlLS07Ci0gICAgfQotCi0gICAgUU5hbWVTZXQgZ2V0X2VsZW1lbnRfZW5kaW5nX2RlbGltaXRlcnMoIFFOYW1lIHFuYW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdXNlci5nZXRfZWxlbWVudF9lbmRpbmdfZGVsaW1pdGVycyggcW5hbWUgKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vCi0gICAgLy8KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc19hdHRyaWJ1dGUgKCApCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0U3BsYXkoKS5pc0F0dHIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZV9vbl9zZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFJvb3QoKS52YWxpZGF0ZU9uU2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEN1cnNvciBuZXdfY3Vyc29yICggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDdXJzb3IoIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlICggVmFsaWRhdG9yTGlzdGVuZXIgdkV2ZW50U2luayApCi0gICAgewotICAgICAgICBuZXcgU2F2ZXIuVmFsaWRhdG9yU2F2ZXIoIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSwgMCwgbnVsbCwgdkV2ZW50U2luayApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2NoZW1hVHlwZUxvYWRlciBnZXRfc2NoZW1hdHlwZWxvYWRlciAoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRSb290KCkuZ2V0U2NoZW1hVHlwZUxvYWRlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUU5hbWUgZ2V0X3hzaV90eXBlICggKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0KLSAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKSB8fCBzLmlzTm9ybWFsQXR0cigpOwotCi0gICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIHMuZ2V0WHNpVHlwZU5hbWUoIGdldFJvb3QoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBjaGFuZ2VfdHlwZSAoIFNjaGVtYVR5cGUgc1R5cGUgKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0KLSAgICAgICAgcy5zZXRUeXBlKCBnZXRSb290KCksIHNUeXBlLCBmYWxzZSApOwotCi0gICAgICAgIFR5cGUgdCA9IHMuZ2V0VHlwZSggZ2V0Um9vdCgpICk7Ci0KLSAgICAgICAgYXNzZXJ0IHQgIT0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0Ll91c2VyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlX3RleHQgKCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBhc3NlcnQgcy5pc1R5cGVhYmxlKCk7Ci0KLSAgICAgICAgaWYgKHMuaXNJbnZhbGlkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBfaW5oaWJpdFVzZXJJbnZhbGlkYXRlKys7Ci0KLSAgICAgICAgcy5yZW1vdmVDb250ZW50KCBnZXRSb290KCksIGZhbHNlICk7Ci0KLSAgICAgICAgcy50b2dnbGVJc0ludmFsaWQoKTsKLSAgICAgICAgYXNzZXJ0IHMuaXNJbnZhbGlkKCk7Ci0gICAgICAgIAotICAgICAgICBfaW5oaWJpdFVzZXJJbnZhbGlkYXRlLS07Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZmV0Y2hfdGV4dCAoIGludCB3aGl0ZXNwYWNlUnVsZSApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBhc3NlcnQgIXMuaXNJbnZhbGlkKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAocy5pc0ludmFsaWQoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiQ2FuJ3QgZmV0Y2ggdGV4dCB3aGVuIGludmFsaWQiICk7Ci0KLSAgICAgICAgcmV0dXJuIHMuZ2V0VGV4dCggZ2V0Um9vdCgpLCB3aGl0ZXNwYWNlUnVsZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzdG9yZV90ZXh0ICggU3RyaW5nIHRleHQgKQotICAgIHsKLSAgICAgICAgX2luaGliaXRVc2VySW52YWxpZGF0ZSsrOwotICAgICAgICBnZXRTcGxheSgpLnNldFRleHQoIGdldFJvb3QoKSwgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSApOwotICAgICAgICBfaW5oaWJpdFVzZXJJbnZhbGlkYXRlLS07Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgY29tcHV0ZV9mbGFncyAoICkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHMuaXNUeXBlYWJsZSgpOwotCi0gICAgICAgIGlmIChzLmlzRG9jKCkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBDb250YWluZXIgcGFyZW50Q29udGFpbmVyID0gcy5nZXRDb250YWluZXIoKTsKLQotICAgICAgICBUeXBlIHBhcmVudFR5cGUgPSBwYXJlbnRDb250YWluZXIuZ2V0VHlwZSggZ2V0Um9vdCgpICk7Ci0KLSAgICAgICAgYXNzZXJ0IHBhcmVudFR5cGUgIT0gbnVsbDsKLQotICAgICAgICBUeXBlU3RvcmVVc2VyIHBhcmVudFVzZXIgPSBwYXJlbnRUeXBlLl91c2VyOwotCi0gICAgICAgIGlmIChzLmlzQXR0cigpKQotICAgICAgICAgICAgcmV0dXJuIHBhcmVudFVzZXIuZ2V0X2F0dHJpYnV0ZWZsYWdzKCBzLmdldE5hbWUoKSApOwotCi0gICAgICAgIGludCBmID0gcGFyZW50VXNlci5nZXRfZWxlbWVudGZsYWdzKCBzLmdldE5hbWUoKSApOwotCi0gICAgICAgIGlmIChmICE9IC0xKQotICAgICAgICAgICAgcmV0dXJuIGY7Ci0KLSAgICAgICAgVHlwZVN0b3JlVmlzaXRvciB2aXNpdG9yID0gcGFyZW50VXNlci5uZXdfdmlzaXRvcigpOwotCi0gICAgICAgIGlmICh2aXNpdG9yID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBhc3NlcnQgIXBhcmVudENvbnRhaW5lci5pc0xlYWYoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIFNwbGF5IHQgPSBwYXJlbnRDb250YWluZXIubmV4dFNwbGF5KCkgOyA7IHQgPSB0Lm5leHRTcGxheSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICggdC5nZXRLaW5kKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTcGxheS5FTkQgOgotICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTcGxheS5CRUdJTiA6Ci0gICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdCggdC5nZXROYW1lKCkgKTsKLQotICAgICAgICAgICAgICAgIGlmICh0ID09IHMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLmdldF9lbGVtZW50ZmxhZ3MoKTsKLQotICAgICAgICAgICAgICAgIHQgPSB0LmdldEZpbmlzaFNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFGaWVsZCBnZXRfc2NoZW1hX2ZpZWxkICggKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgcy5pc1R5cGVhYmxlKCk7Ci0KLSAgICAgICAgaWYgKHMuaXNEb2MoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAKLSAgICAgICAgQ29udGFpbmVyIHBhcmVudENvbnRhaW5lciA9IHMuZ2V0Q29udGFpbmVyKCk7Ci0KLSAgICAgICAgVHlwZVN0b3JlVXNlciBwYXJlbnRVc2VyID0gcGFyZW50Q29udGFpbmVyLmdldFR5cGUoIGdldFJvb3QoKSApLl91c2VyOwotICAgICAgICAKLSAgICAgICAgaWYgKHMuaXNBdHRyKCkpCi0gICAgICAgICAgICByZXR1cm4gcGFyZW50VXNlci5nZXRfYXR0cmlidXRlX2ZpZWxkKCBzLmdldE5hbWUoKSApOwotCi0gICAgICAgIGFzc2VydCBzLmlzQmVnaW4oKTsKLQotICAgICAgICBhc3NlcnQgIXBhcmVudENvbnRhaW5lci5pc0xlYWYoKTsKLSAgICAgICAgCi0gICAgICAgIFR5cGVTdG9yZVZpc2l0b3IgdmlzaXRvciA9IHBhcmVudFVzZXIubmV3X3Zpc2l0b3IoKTsKLQotICAgICAgICBpZiAodmlzaXRvciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgZm9yICggU3BsYXkgdCA9IHBhcmVudENvbnRhaW5lci5uZXh0U3BsYXkoKSA7IDsgdCA9IHQubmV4dFNwbGF5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCB0LmdldEtpbmQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNwbGF5LkVORCA6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNwbGF5LkJFR0lOIDoKLSAgICAgICAgICAgICAgICB2aXNpdG9yLnZpc2l0KCB0LmdldE5hbWUoKSApOwotCi0gICAgICAgICAgICAgICAgaWYgKHQgPT0gcykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3IuZ2V0X3NjaGVtYV9maWVsZCgpOwotCi0gICAgICAgICAgICAgICAgdCA9IHQuZ2V0RmluaXNoU3BsYXkoKTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgY291bnRfZWxlbWVudHMgKCBRTmFtZSBuYW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRSb290KCkuY291bnQoIChDb250YWluZXIpIGdldFNwbGF5KCksIG5hbWUsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGNvdW50X2VsZW1lbnRzKFFOYW1lU2V0IG5hbWVzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFJvb3QoKS5jb3VudCgoQ29udGFpbmVyKWdldFNwbGF5KCksICBudWxsLCBuYW1lcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGZpbmRfZWxlbWVudF91c2VyICggUU5hbWUgbmFtZSwgaW50IGkgKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0KLSAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghcy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIEJlZ2luIG50aEJlZ2luID0gZ2V0Um9vdCgpLmZpbmROdGhCZWdpbiggcywgbmFtZSwgbnVsbCwgaSApOwotCi0gICAgICAgIGlmIChudGhCZWdpbiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgVHlwZSB0ID0gbnRoQmVnaW4uZ2V0VHlwZSggZ2V0Um9vdCgpICk7Ci0KLSAgICAgICAgYXNzZXJ0IHQgIT0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0Ll91c2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGZpbmRfZWxlbWVudF91c2VyICggUU5hbWVTZXQgbmFtZXMsIGludCBpICkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOwotCi0gICAgICAgIEJlZ2luIG50aEJlZ2luID0gZ2V0Um9vdCgpLmZpbmROdGhCZWdpbihzLCAgbnVsbCwgbmFtZXMsIGkpOwotICAgICAgICBpZiAobnRoQmVnaW4gPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgVHlwZSB0ID0gbnRoQmVnaW4uZ2V0VHlwZShnZXRSb290KCkpOwotICAgICAgICBhc3NlcnQgdCAhPSBudWxsOwotCi0gICAgICAgIHJldHVybiB0Ll91c2VyOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZmluZEFsbEVsZW1lbnRUeXBlcyAoIFFOYW1lIG5hbWUsIFFOYW1lU2V0IHNldCwgTGlzdCBmaWxsTWVVcCApCi0gICAgewotICAgICAgICBhc3NlcnQgZ2V0U3BsYXkoKS5pc0NvbnRhaW5lcigpOwotCi0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIGlmIChzLmlzTGVhZigpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGxvb3A6Ci0gICAgICAgIGZvciAoIHMgPSBzLm5leHRTcGxheSgpIDsgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoIHMuZ2V0S2luZCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU3BsYXkuRU5EICA6Ci0gICAgICAgICAgICBjYXNlIFNwbGF5LlJPT1QgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7Ci0gICAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgU3BsYXkuQkVHSU4gOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzZXQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzLmdldE5hbWUoKS5lcXVhbHMoIG5hbWUgKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSB0eXBlID0gcy5nZXRUeXBlKCBnZXRSb290KCkgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHR5cGUgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxsTWVVcC5hZGQoIHR5cGUgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2V0LmNvbnRhaW5zKHMuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSB0eXBlID0gcy5nZXRUeXBlKGdldFJvb3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgdHlwZSAhPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgZmlsbE1lVXAuYWRkKHR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcyA9IHMuZ2V0RmluaXNoU3BsYXkoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbmRfYWxsX2VsZW1lbnRfdXNlcnMgKCBRTmFtZSBuYW1lLCBMaXN0IGZpbGxNZVVwICkKLSAgICB7Ci0gICAgICAgIGludCBpID0gZmlsbE1lVXAuc2l6ZSgpOwotICAgICAgICAKLSAgICAgICAgZmluZEFsbEVsZW1lbnRUeXBlcyggbmFtZSwgbnVsbCwgZmlsbE1lVXAgKTsKLQotICAgICAgICBmb3IgKCBpbnQgaiA9IGkgOyBqIDwgZmlsbE1lVXAuc2l6ZSgpIDsgaisrICkKLSAgICAgICAgICAgIGZpbGxNZVVwLnNldCggaiwgKChUeXBlKSBmaWxsTWVVcC5nZXQoIGogKSkuX3VzZXIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaW5kX2FsbF9lbGVtZW50X3VzZXJzIChRTmFtZVNldCBuYW1lcywgTGlzdCBmaWxsTWVVcCkKLSAgICB7Ci0gICAgICAgIGludCBpID0gZmlsbE1lVXAuc2l6ZSgpOwotICAgICAgICBmaW5kQWxsRWxlbWVudFR5cGVzKG51bGwsIG5hbWVzLCBmaWxsTWVVcCk7Ci0KLSAgICAgICAgZm9yICggaW50IGogPSBpIDsgaiA8IGZpbGxNZVVwLnNpemUoKSA7IGorKyApCi0gICAgICAgICAgICBmaWxsTWVVcC5zZXQoIGosICgoVHlwZSkgZmlsbE1lVXAuZ2V0KCBqICkpLl91c2VyICk7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVTdG9yZVVzZXIgZmluZF9hdHRyaWJ1dGVfdXNlciAoIFFOYW1lIG5hbWUgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IGdldFNwbGF5KCkuaXNDb250YWluZXIoKTsKLQotICAgICAgICBTcGxheSBhID0gZ2V0U3BsYXkoKS5nZXRBdHRyKCBuYW1lICk7Ci0KLSAgICAgICAgaWYgKGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFR5cGUgdCA9IGEuZ2V0VHlwZSggZ2V0Um9vdCgpICk7Ci0KLSAgICAgICAgYXNzZXJ0IHQgIT0gbnVsbDsKLQotICAgICAgICByZXR1cm4gdC5fdXNlcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBjb21wdXRlX2RlZmF1bHRfdGV4dCAoICkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHMuaXNUeXBlYWJsZSgpOwotCi0gICAgICAgIGlmIChzLmlzRG9jKCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBDb250YWluZXIgcGFyZW50Q29udGFpbmVyID0gcy5nZXRDb250YWluZXIoKTsKLQotICAgICAgICBUeXBlIHBhcmVudFR5cGUgPSBwYXJlbnRDb250YWluZXIuZ2V0VHlwZSggZ2V0Um9vdCgpICk7Ci0KLSAgICAgICAgYXNzZXJ0IHBhcmVudFR5cGUgIT0gbnVsbDsKLQotICAgICAgICBUeXBlU3RvcmVVc2VyIHBhcmVudFVzZXIgPSBwYXJlbnRUeXBlLl91c2VyOwotCi0gICAgICAgIGlmIChzLmlzQXR0cigpKQotICAgICAgICAgICAgcmV0dXJuIHBhcmVudFVzZXIuZ2V0X2RlZmF1bHRfYXR0cmlidXRlX3RleHQoIHMuZ2V0TmFtZSgpICk7Ci0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHBhcmVudFVzZXIuZ2V0X2RlZmF1bHRfZWxlbWVudF90ZXh0KCBzLmdldE5hbWUoKSApOwotCi0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAgICAgVHlwZVN0b3JlVmlzaXRvciB2aXNpdG9yID0gcGFyZW50VXNlci5uZXdfdmlzaXRvcigpOwotCi0gICAgICAgIGlmICh2aXNpdG9yID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBhc3NlcnQgIXBhcmVudENvbnRhaW5lci5pc0xlYWYoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIFNwbGF5IHQgPSBwYXJlbnRDb250YWluZXIubmV4dFNwbGF5KCkgOyA7IHQgPSB0Lm5leHRTcGxheSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICggdC5nZXRLaW5kKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTcGxheS5FTkQgOgotICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTcGxheS5CRUdJTiA6Ci0gICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdCggdC5nZXROYW1lKCkgKTsKLQotICAgICAgICAgICAgICAgIGlmICh0ID09IHMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLmdldF9kZWZhdWx0X3RleHQoKTsKLQotICAgICAgICAgICAgICAgIHQgPSB0LmdldEZpbmlzaFNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZV9uaWwgKCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBhc3NlcnQgcy5pc1R5cGVhYmxlKCk7Ci0KLSAgICAgICAgaWYgKCFzLmlzQXR0cigpKQotICAgICAgICAgICAgcy5zZXRYc2lOaWwoIGdldFJvb3QoKSwgYnVpbGRfbmlsKCkgKTsKLSAgICB9Ci0gICAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5kX25pbCAoICkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIGFzc2VydCBzLmlzVHlwZWFibGUoKTsKLSAgCi0gICAgICAgIHJldHVybiBzLmlzQXR0cigpID8gZmFsc2UgOiBzLmdldFhzaU5pbCggZ2V0Um9vdCgpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZmluZF9wcmVmaXhfZm9yX25zdXJpICgKLSAgICAgICAgU3RyaW5nIG5zdXJpLCBTdHJpbmcgc3VnZ2VzdGVkX3ByZWZpeCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBpZiAocy5pc0F0dHIoKSkKLSAgICAgICAgICAgIHMgPSBzLmdldENvbnRhaW5lcigpOwotCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzLnByZWZpeEZvck5hbWVzcGFjZSggZ2V0Um9vdCgpLCBuc3VyaSwgc3VnZ2VzdGVkX3ByZWZpeCwgdHJ1ZSk7Ci0KLSAgICAgICAgYXNzZXJ0IHJlc3VsdCAhPSBudWxsOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlRm9yUHJlZml4ICggU3RyaW5nIHByZWZpeCApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBpZiAocy5pc0F0dHIoKSkKLSAgICAgICAgICAgIHMgPSBzLmdldENvbnRhaW5lcigpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHMubmFtZXNwYWNlRm9yUHJlZml4KCBwcmVmaXggKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBpbnNlcnRfZWxlbWVudF91c2VyICggUU5hbWUgbmFtZSwgaW50IGkgKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0KLSAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghcy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIGlmIChpIDwgMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOwotICAgICAgICBDb250YWluZXIgYyA9IChDb250YWluZXIpIHM7Ci0KLSAgICAgICAgQmVnaW4gbnRoQmVnaW4gPSByLmZpbmROdGhCZWdpbiggYywgbmFtZSwgbnVsbCwgaSApOwotCi0gICAgICAgIGlmIChudGhCZWdpbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSA+IHIuY291bnQoIGMsIG5hbWUsIG51bGwgKSArIDEpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgcmV0dXJuIGFkZF9lbGVtZW50X3VzZXIoIG5hbWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpbnNlcnRFbGVtZW50KCBuYW1lLCBudGhCZWdpbiwgMCApOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGluc2VydF9lbGVtZW50X3VzZXIoUU5hbWVTZXQgc2V0LCBRTmFtZSBuYW1lLCBpbnQgaSkKLSAgICB7Ci0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgaWYgKCFzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgaWYgKGkgPCAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKLSAgICAgICAgQ29udGFpbmVyIGMgPSAoU3BsYXkuQ29udGFpbmVyKSBzOwotCi0gICAgICAgIEJlZ2luIG50aEJlZ2luID0gci5maW5kTnRoQmVnaW4oYywgbnVsbCwgc2V0LCBpKTsKLQotICAgICAgICBpZiAobnRoQmVnaW4gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPiByLmNvdW50KGMsIG51bGwsIHNldCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgcmV0dXJuIGFkZF9lbGVtZW50X3VzZXIobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaW5zZXJ0RWxlbWVudChuYW1lLCBudGhCZWdpbiwgMCk7Ci0gICAgfQotICAgIAotLy8gVE9ETyAtIGNvbnNvbGlkYXRlIG5hbWVzLCB0aGlzIGZjbiBpcyB2ZXJ5IGV4cGVuc2l2ZSBpbiBjcmVhdGluZyBuYW1lcwotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGFkZF9lbGVtZW50X3VzZXIgKCBRTmFtZSBxbmFtZSApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgU3BsYXkgY2FuZGlkYXRlU3BsYXk7Ci0gICAgICAgIGludCBjYW5kaWRhdGVQb3M7Ci0gICAgICAgICAgICAKLSAgICAgICAgaWYgKHMuaXNMZWFmKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhbmRpZGF0ZVNwbGF5ID0gczsKLSAgICAgICAgICAgIGNhbmRpZGF0ZVBvcyA9IHMuZ2V0UG9zTGVhZkVuZCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgY2FuZGlkYXRlU3BsYXkgPSBzLmdldEZpbmlzaFNwbGF5KCk7Ci0gICAgICAgICAgICBjYW5kaWRhdGVQb3MgPSAwOwotCi0gICAgICAgICAgICBRTmFtZVNldCBlbmRTZXQgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBsb29wOgotICAgICAgICAgICAgZm9yICggU3BsYXkgdCA9IGNhbmRpZGF0ZVNwbGF5IDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHQgPSB0LnByZXZTcGxheSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT0gcykKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAodC5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuaXNFbmQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFzc2VydCB0LmlzQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodC5nZXROYW1lKCkuZXF1YWxzKCBxbmFtZSApKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGlmIChlbmRTZXQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZW5kU2V0ID0gZ2V0X2VsZW1lbnRfZW5kaW5nX2RlbGltaXRlcnMoIHFuYW1lICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZW5kU2V0LmNvbnRhaW5zKCB0LmdldE5hbWUoKSApKQotICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVTcGxheSA9IHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBpbnNlcnRFbGVtZW50KCBxbmFtZSwgY2FuZGlkYXRlU3BsYXksIGNhbmRpZGF0ZVBvcyApOwotICAgIH0KLQotICAgIHByaXZhdGUgVHlwZVN0b3JlVXNlciBpbnNlcnRFbGVtZW50ICggUU5hbWUgbmFtZSwgU3BsYXkgcywgaW50IHAgKQotICAgIHsKLSAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOwotICAgICAgICAKLSAgICAgICAgQmVnaW4gYiA9IG5ldyBCZWdpbiggbmFtZSwgbnVsbCApOwotICAgICAgICBiLnRvZ2dsZUlzTGVhZigpOwotICAgICAgICAKLSAgICAgICAgcy5pbnNlcnQoIHIsIHAsIGIsIG51bGwsIDAsIDAsIHRydWUgKTsKLSAgICAgICAgCi0gICAgICAgIFR5cGUgdCA9IGIuZ2V0VHlwZSggciApOwotCi0gICAgICAgIGFzc2VydCB0ICE9IG51bGw7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdC5fdXNlcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlX2VsZW1lbnQgKCBRTmFtZSBxbmFtZSwgaW50IGkgKQotICAgIHsKLSAgICAgICAgaWYgKGkgPCAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQotICAgICAgICBpZiAocy5pc0xlYWYoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgQmVnaW4gYiA9IGdldFJvb3QoKS5maW5kTnRoQmVnaW4oIHMsIHFuYW1lLCBudWxsLCBpICk7Ci0KLSAgICAgICAgaWYgKGIgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgYi5yZW1vdmUoIGdldFJvb3QoKSwgdHJ1ZSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZV9lbGVtZW50KFFOYW1lU2V0IG5hbWVzLCBpbnQgaSkKLSAgICB7Ci0gICAgICAgIGlmIChpIDwgMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0KLSAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKLQotICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQotICAgICAgICBpZiAocy5pc0xlYWYoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgQmVnaW4gYiA9IGdldFJvb3QoKS5maW5kTnRoQmVnaW4ocywgbnVsbCwgbmFtZXMsIGkpOwotCi0gICAgICAgIGlmIChiID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCi0gICAgICAgIGIucmVtb3ZlKGdldFJvb3QoKSwgdHJ1ZSk7Ci0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFR5cGVTdG9yZVVzZXIgYWRkX2F0dHJpYnV0ZV91c2VyICggUU5hbWUgcW5hbWUgKQotICAgIHsKLSAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7Ci0KLSAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghcy5pc0NvbnRhaW5lcigpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIFNwbGF5IGEgPSBzLmdldEF0dHIoIHFuYW1lICk7Ci0KLSAgICAgICAgaWYgKGEgIT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICBzLm5leHRTcGxheSgpLmluc2VydCgKLSAgICAgICAgICAgIGdldFJvb3QoKSwgMCwgYSA9IG5ldyBBdHRyKCBxbmFtZSApLCBudWxsLCAwLCAwLCB0cnVlICk7Ci0gICAgICAgIAotICAgICAgICBUeXBlIHQgPSBhLmdldFR5cGUoIGdldFJvb3QoKSApOwotCi0gICAgICAgIGFzc2VydCB0ICE9IG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIHQuX3VzZXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZV9hdHRyaWJ1dGUgKCBRTmFtZSBxbmFtZSApCi0gICAgewotICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKLQotICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFzLmlzQ29udGFpbmVyKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgU3BsYXkgYSA9IHMuZ2V0QXR0ciggcW5hbWUgKTsKLQotICAgICAgICBpZiAoYSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIGEucmVtb3ZlKCBnZXRSb290KCksIHRydWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFR5cGVTdG9yZVVzZXIgY29weV9jb250ZW50c19mcm9tICggVHlwZVN0b3JlIHNvdXJjZSApCi0gICAgewotICAgICAgICBhc3NlcnQgc291cmNlIGluc3RhbmNlb2YgVHlwZTsKLQotICAgICAgICBUeXBlIHNvdXJjZVR5cGUgPSAoVHlwZSkgc291cmNlOwotCi0gICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIHMucmVwbGFjZUNvbnRlbnRzKCBnZXRSb290KCksIHNvdXJjZVR5cGUuZ2V0U3BsYXkoKSwgc291cmNlVHlwZS5nZXRSb290KCksIHRydWUsIHRydWUgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzLmdldFR5cGUoIGdldFJvb3QoKSApLl91c2VyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFycmF5X3NldHRlciAoIFhtbE9iamVjdFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1lbnROYW1lICkKLSAgICB7Ci0gICAgICAgIC8vIFRPRE8gLSB0aGlzIGlzIHRoZSBxdWljayBhbmQgZGlydHkgaW1wbGVtZW50YXRpb24sIG1ha2UgdGhpcyBmYXN0ZXIKLSAgICAgICAgCi0gICAgICAgIGludCBtID0gc291cmNlcy5sZW5ndGg7Ci0KLSAgICAgICAgQXJyYXlMaXN0IGNvcGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQXJyYXlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBtIDsgaSsrICkKLSAgICAgICAgewotLy8gVE9ETyAtIGRlYWwgd2l0aCBudWxsIHNvdXJjZXNbIGkgXSBoZXJlIC0tIHdoYXQgdG8gZG8/Ci0KLSAgICAgICAgICAgIGlmIChzb3VyY2VzWyBpIF0gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiQXJyYXkgZWxlbWVudCBudWxsIiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBlbHNlIGlmIChzb3VyY2VzWyBpIF0uaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3BpZXMuYWRkKCBudWxsICk7Ci0gICAgICAgICAgICAgICAgdHlwZXMuYWRkKCBudWxsICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVHlwZSB0eXBlID0gKFR5cGUpICgoVHlwZVN0b3JlVXNlcikgc291cmNlc1sgaSBdKS5nZXRfc3RvcmUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjb3BpZXMuYWRkKCB0eXBlLmdldFNwbGF5KCkuY29weVNwbGF5Q29udGVudHMoIHR5cGUuZ2V0Um9vdCgpKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHlwZXMuYWRkKCBzb3VyY2VzWyBpIF0uc2NoZW1hVHlwZSgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbiA9IGNvdW50X2VsZW1lbnRzKCBlbGVtZW50TmFtZSApOwotCi0gICAgICAgIGZvciAoIDsgbiA+IG0gOyBuLS0gKQotICAgICAgICAgICAgcmVtb3ZlX2VsZW1lbnQoIGVsZW1lbnROYW1lLCBtICk7Ci0KLSAgICAgICAgZm9yICggOyBtID4gbiA7IG4rKyApCi0gICAgICAgICAgICBhZGRfZWxlbWVudF91c2VyKCBlbGVtZW50TmFtZSApOwotCi0gICAgICAgIGFzc2VydCBtID09IG47Ci0gICAgICAgIAotICAgICAgICBBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICBmaW5kQWxsRWxlbWVudFR5cGVzKCBlbGVtZW50TmFtZSwgbnVsbCwgZWxlbWVudHMgKTsKLQotICAgICAgICBSb290IHIgPSBnZXRSb290KCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgZWxlbWVudHMuc2l6ZSgpID09IG47Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlIHR5cGUgPSAoVHlwZSkgZWxlbWVudHMuZ2V0KCBpICk7Ci0KLSAgICAgICAgICAgIGlmIChzb3VyY2VzWyBpIF0uaXNJbW11dGFibGUoKSkKLSAgICAgICAgICAgICAgICB0eXBlLmdldFhtbE9iamVjdCgpLnNldCggc291cmNlc1sgaSBdICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3BsYXkgcyA9IHR5cGUuZ2V0U3BsYXkoKTsKLQotICAgICAgICAgICAgICAgIGFzc2VydCByID09IHR5cGUuZ2V0Um9vdCgpOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzLnJlbW92ZUNvbnRlbnQoIHIsIHRydWUgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBDb3B5Q29udGV4dCBjb3B5Q29udGV4dCA9IChDb3B5Q29udGV4dCkgY29waWVzLmdldCggaSApOwotCi0gICAgICAgICAgICAgICAgU3BsYXkgY29weVRyZWUgPSBjb3B5Q29udGV4dC5nZXRUcmVlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29weVRyZWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0Q29weSA9IGNvcHlDb250ZXh0LmdldFRleHQoKTsKLQotICAgICAgICAgICAgICAgICAgICBzLmluc2VydCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHIsIDEsIGNvcHlUcmVlLCB0ZXh0Q29weSwgMCwgdGV4dENvcHkgPT0gbnVsbCA/IDAgOiB0ZXh0Q29weS5sZW5ndGgsIHRydWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0eXBlLmNoYW5nZV90eXBlKCAoU2NoZW1hVHlwZSkgdHlwZXMuZ2V0KCBpICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdF9lbGVtZW50cyAoIFR5cGVTdG9yZVZpc2l0b3IgdmlzaXRvciApCi0gICAgewotICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotCi0gICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQotICAgICAgICBpZiAocy5pc0xlYWYoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIHMgPSBzLm5leHRTcGxheSgpIDsgOyBzID0gcy5uZXh0U3BsYXkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoIHMuZ2V0S2luZCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU3BsYXkuRU5EIDoKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTcGxheS5CRUdJTiA6Ci0gICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdCggcy5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICBzID0gcy5nZXRGaW5pc2hTcGxheSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhtbE9iamVjdFtdIGV4ZWNfcXVlcnkgKCBTdHJpbmcgcXVlcnlFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQotICAgICAgICB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gUGF0aC5xdWVyeSggdGhpcywgcXVlcnlFeHByLCBvcHRpb25zICk7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8KLSAgICAvLwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1vbml0b3Igb2JqZWN0LCB1c2VkIGZvciBzeW5jaHJvbml6aW5nIGFjY2VzcyB0byB0aGUgZG9jLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0X3Jvb3Rfb2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRSb290KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBUeXBlU3RvcmVVc2VyIF91c2VyOwotICAgIHByaXZhdGUgaW50IF9pbmhpYml0VXNlckludmFsaWRhdGU7Ci19CmRpZmYgLS1naXQgYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1htbE9iamVjdExpc3QuamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvWG1sT2JqZWN0TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzcxYjVhLi4wMDAwMDAwCi0tLSBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvWG1sT2JqZWN0TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOwotCi0vLyBCVUdCVUc6ICoqKlRMTCoqKiBXaHkgaXNuJ3QgdGhpcyBleHBvc2VkIGluIG9yZy5hcGFjaGUueG1sYmVhbnM/Pz8/Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gcmVwcmVzZW50IGxpc3RzIG9mIFhtbE9iamVjdCBpbnN0YW5jZXMgcmV0dXJuZWQKLSAqIGZyb20gYSBxdWVyeS4gVXNlZCBhbHNvIGFzIGEgY29udmVuaWVudCB0eXBlZCB3YXkgb2YgY29sbGVjdGluZwotICogWG1sT2JqZWN0IGluc3RhbmNlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxPYmplY3RMaXN0IHsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBYbWxPYmplY3QgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWwgdGhlIFhtbE9iamVjdCBpbnN0YW5jZSB0byBhZGQgdG8gdGhlIGxpc3QKLSAgICAgKi8KLSAgICB2b2lkIGFkZChYbWxPYmplY3QgeG1sKTsKLQotICAgIC8qKgotICAgICAqIEFwcGVuZHMgdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgbGlzdCB0byB0aGlzIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sTGlzdCB0aGUgbGlzdCB3aGljaCBpcyB0byBiZSBhcHBlbmRlZCB0byB0aGlzIGxpc3QuCi0gICAgICovCi0gICAgdm9pZCBhZGRBbGwoWG1sT2JqZWN0TGlzdCB4bWxMaXN0KTsKLQotICAgIC8qKgotICAgICAqIEFwcGVuZHMgYW4gYXJyYXkgb2YgWG1sT2JqZWN0IGluc3RhbmNlcyB0byB0aGlzIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sQXJyYXkgdGhlIGFycmF5IHdoaWNoIGlzIHRvIGJlIGFwcGVuZGVkIHRvIHRoaXMgbGlzdC4KLSAgICAgKi8KLSAgICB2b2lkIGFkZEFsbChYbWxPYmplY3RbXSB4bWxBcnJheSk7Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgb3V0IHRoZSBjb250ZW50cyBvZiB0aGlzIGxpc3QuIEFmdGVyIHRoaXMgb3BlcmF0aW9uLAotICAgICAqIHtAbGluayAjaXNFbXB0eSgpIGlzRW1wdHkoKX0gd2lsbCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0gICAgICovCi0gICAgdm9pZCBjbGVhcigpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgWG1sT2JqZWN0IGF0IGEgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoZSBsaXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24KLSAgICAgKiBAcmV0dXJuIHRoZSBYbWxPYmplY3QgYXQgdGhlIHBvc2l0aW9uIGluIHRoaXMgbGlzdC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZgotICAgICAqICAgICAgICAgPGNvZGU+KGluZGV4IDwgMCkgfHwgKGluZGV4ID49IHNpemUoKSk8L2NvZGU+Ci0gICAgICovCi0gICAgWG1sT2JqZWN0IGdldChpbnQgaW5kZXgpOwotCi0gICAgLyoqCi0gICAgICogVGVzdHMgaWYgdGhpcyBYbWxMaXN0IGlzIGVtcHR5LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KLSAgICAgKiA8Y29kZT57QGxpbmsgI3NpemUoKSBzaXplKCl9ID09IDA8L2NvZGU+LgotICAgICAqCi0gICAgICogQHJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBsaXN0IGlzIGVtcHR5LgotICAgICAqLwotICAgIGJvb2xlYW4gaXNFbXB0eSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBJdGVyYXRvciBvdmVyIGFsbCB0aGUgWG1sT2JqZWN0IGluc3RhbmNlcyBjb250YWluZWQgaW4gdGhpcwotICAgICAqIGxpc3QuIFRoaXMgaXRlcmF0b3Igd2lsbCB0aHJvdyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpbgotICAgICAqIHJlc3BvbnNlIHRvIGl0cyByZW1vdmUgbWV0aG9kLgotICAgICAqCi0gICAgICogQHJldHVybiBJdGVyYXRvciBvdmVyIHRoZSBjb250ZW50cyBvZiB0aGlzIGxpc3QKLSAgICAgKi8KLSAgICBJdGVyYXRvciBpdGVyYXRvcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIFhtbE9iamVjdCBpbnN0YW5jZXMgY29udGFpbmVkIGluIHRoaXMgbGlzdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gaW50IHNpemUgb2YgdGhlIGxpc3QuCi0gICAgICovCi0gICAgaW50IHNpemUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgWG1sTGlzdCBpbiBhIG5ld2x5IGNyZWF0ZWQgYXJyYXkgb2YKLSAgICAgKiBYbWxPYmplY3RzLgotICAgICAqCi0gICAgICogQHJldHVybiBhcnJheSBvZiBYbWxPYmplY3QgaW5zdGFuY2VzIHdoaWNoIGlzIGEgY29weSBvZiB0aGUgY29udGVudHMgb2YKLSAgICAgKiAgICAgICAgIHRoZSBsaXN0LgotICAgICAqLwotICAgIFhtbE9iamVjdFtdIHRvQXJyYXkoKTsKLQotCi0KLSAgICAvKioKLSAgICAgKiBTdGF0aWMgZmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlcyBvZiBYbWxPYmplY3RMaXN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0gICAgewotICAgICAgICAvLyB0aGUgY2xhc3MgdG8gaW5zdGFudGlhdGUKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgQ0xBU1M7Ci0gICAgICAgIHN0YXRpYyB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENMQVNTID0gQ2xhc3MuZm9yTmFtZSgiY29tLmJlYS53bGkudmFyaWFibGVzLlhtbE9iamVjdExpc3RJbXBsIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UgPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBYbWxPYmplY3RMaXN0SW1wbC4iKTsKLSAgICAgICAgICAgICAgICBpc2UuaW5pdENhdXNlKHQpOwotICAgICAgICAgICAgICAgIHRocm93IGlzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIGNyZWF0ZXMgYSBuZXcgZW1wdHkgWG1sT2JqZWN0TGlzdCBpbnN0YW5jZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBhIG5ldyBlbXB0eSBYbWxPYmplY3RMaXN0IGluc3RhbmNlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdExpc3QgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiAoWG1sT2JqZWN0TGlzdClDTEFTUy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGllKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIGNyZWF0ZXMgYSBuZXcgWG1sT2JqZWN0TGlzdCBpbnN0YW5jZSwgZmlsbGVkIHdpdGggdGhlIGVsZW1lbnRzCi0gICAgICAgICAqIG9mIHRoZSBnaXZlbiBsaXN0Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gYSBuZXcgWG1sT2JqZWN0TGlzdCBpbnN0YW5jZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0TGlzdCBuZXdJbnN0YW5jZShYbWxPYmplY3RMaXN0IGxpc3QpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0TGlzdCBuZXdMaXN0ID0gKFhtbE9iamVjdExpc3QpQ0xBU1MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICBuZXdMaXN0LmFkZEFsbChsaXN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3TGlzdDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBjcmVhdGVzIGEgbmV3IFhtbE9iamVjdExpc3QgaW5zdGFuY2UgZ2l2ZW4gYW4gYXJyYXkgb2YgWG1sT2JqZWN0cy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBhIG5ldyBYbWxPYmplY3RMaXN0IGluc3RhbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3RMaXN0IG5ld0luc3RhbmNlKFhtbE9iamVjdFtdIHhtbE9iamVjdHMpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0TGlzdCBuZXdMaXN0ID0gKFhtbE9iamVjdExpc3QpIENMQVNTLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgbmV3TGlzdC5hZGRBbGwoeG1sT2JqZWN0cyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ld0xpc3Q7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9YcXJsRGVsZWdhdGUuamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvWHFybERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZjczMDUuLjAwMDAwMDAKLS0tIGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9YcXJsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotcHVibGljIGZpbmFsIGNsYXNzIFhxcmxEZWxlZ2F0ZSAKLXsKLSAgICBwcml2YXRlIFhxcmxEZWxlZ2F0ZSAoICkKLSAgICB7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgY2hlY2sgKCBPYmplY3QgbyApCi0gICAgewotICAgICAgICBpZiAobyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgIG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlRoaXMgb3BlcmF0aW9uIHJlcXVpcmVzIHhxcmwuamFyIiApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFBhdGguUXVlcnkgY29tcGlsZVBhdGggKCBTdHJpbmcgcGF0aCwgU3RyaW5nIGN1cnJlbnROb2RlVmFyICkKLSAgICB7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgKFBhdGguUXVlcnkpCi0gICAgICAgICAgICAgICAgaW52b2tlKCBfY29tcGlsZVBhdGgsIG5ldyBPYmplY3RbXSB7IHBhdGgsIGN1cnJlbnROb2RlVmFyIH0gKTsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIFBhdGguUXVlcnkgY29tcGlsZVF1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciwgU3RyaW5nIGN1cnJlbnROb2RlVmFyICkKLSAgICB7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgKFBhdGguUXVlcnkpCi0gICAgICAgICAgICAgICAgaW52b2tlKAotICAgICAgICAgICAgICAgICAgICBfY29tcGlsZVF1ZXJ5LCBuZXcgT2JqZWN0W10geyBxdWVyeUV4cHIsIGN1cnJlbnROb2RlVmFyLCBuZXcgQm9vbGVhbih0cnVlKSB9ICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGhyb3dSdW50aW1lRXhjZXB0aW9uICggVGhyb3dhYmxlIGUgKQotICAgIHsKLSAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGU7Ci0gICAgICAgIAotICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0gICAgICAgIAotICAgICAgICBSdW50aW1lRXhjZXB0aW9uIHJ0ZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBjYXVzZS5nZXRNZXNzYWdlKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHJ0ZS5pbml0Q2F1c2UoIGNhdXNlICk7Ci0KLSAgICAgICAgdGhyb3cgcnRlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBpbnZva2UgKCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBwYXJhbXMgKQotICAgIHsKLSAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgIG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlRoaXMgb3BlcmF0aW9uIHJlcXVpcmVzIHhxcmwuamFyIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKCBudWxsLCBwYXJhbXMgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFRocm93YWJsZSBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3dSdW50aW1lRXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBVbnJlYWNoYWJsZQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gTG9vc2UgY291cGxpbmcgZnVuY3Rpb25hbGl0eSB3aXRoIHhxcmwuamFyCi0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRob2QgX2NvbXBpbGVQYXRoOwotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBfY29tcGlsZVF1ZXJ5OwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBib29sZWFuIGhhc1hxcmw7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSggIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5YcXJsSW1wbCIgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaGFzWHFybCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBoYXNYcXJsID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFzWHFybCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgeHFybEltcGwgPQotICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlhxcmxJbXBsIiApOwotCi0gICAgICAgICAgICAgICAgX2NvbXBpbGVQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgeHFybEltcGwuZ2V0RGVjbGFyZWRNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICAiY29tcGlsZVBhdGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcyB9ICk7Ci0KLSAgICAgICAgICAgICAgICBfY29tcGlsZVF1ZXJ5ID0KLSAgICAgICAgICAgICAgICAgICAgeHFybEltcGwuZ2V0RGVjbGFyZWRNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICAiY29tcGlsZVF1ZXJ5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIEJvb2xlYW4uY2xhc3MgfSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3NyYy94c2RzY2hlbWEvc2NoZW1hL1hNTFNjaGVtYS54c2QgYi92MS9zcmMveHNkc2NoZW1hL3NjaGVtYS9YTUxTY2hlbWEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWYyMWE3Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy94c2RzY2hlbWEvc2NoZW1hL1hNTFNjaGVtYS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyNTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFhNTCBTY2hlbWEgc2NoZW1hIGZvciBYTUwgU2NoZW1hczogUGFydCAxOiBTdHJ1Y3R1cmVzIC0tPgotPCEtLSBOb3RlIHRoaXMgc2NoZW1hIGlzIE5PVCB0aGUgbm9ybWF0aXZlIHN0cnVjdHVyZXMgc2NoZW1hLiAtLT4KLQotPCEtLSBUaGUgcHJvc2UgY29weSBpbiB0aGUgc3RydWN0dXJlcyBSRUMgaXMgdGhlIG5vcm1hdGl2ZSAtLT4KLQotPCEtLSB2ZXJzaW9uICh3aGljaCBzaG91bGRuJ3QgZGlmZmVyIGZyb20gdGhpcyBvbmUgZXhjZXB0IGZvciAtLT4KLQotPCEtLSB0aGlzIGNvbW1lbnQgYW5kIGVudGl0eSBleHBhbnNpb25zLCBidXQganVzdCBpbiBjYXNlIC0tPgotCi08IURPQ1RZUEUgeHM6c2NoZW1hIFBVQkxJQyAiLS8vVzNDLy9EVEQgWE1MU0NIRU1BIDIwMDEwMi8vRU4iICJYTUxTY2hlbWEuZHRkIiBbCi0KLTwhLS0gcHJvdmlkZSBJRCB0eXBlIGluZm9ybWF0aW9uIGV2ZW4gZm9yIHBhcnNlcnMgd2hpY2ggb25seSByZWFkIHRoZQotICAgICBpbnRlcm5hbCBzdWJzZXQgLS0+Ci08IUFUVExJU1QgeHM6c2NoZW1hICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6Y29tcGxleFR5cGUgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6Y29tcGxleENvbnRlbnQgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6c2ltcGxlQ29udGVudCAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6ZXh0ZW5zaW9uICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6ZWxlbWVudCAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6Z3JvdXAgICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+IAotPCFBVFRMSVNUIHhzOmFsbCAgICAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmNob2ljZSAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOnNlcXVlbmNlICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmFueSAgICAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmFueUF0dHJpYnV0ZSAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmF0dHJpYnV0ZSAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmF0dHJpYnV0ZUdyb3VwICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOnVuaXF1ZSAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmtleSAgICAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmtleXJlZiAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOnNlbGVjdG9yICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmZpZWxkICAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmluY2x1ZGUgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmltcG9ydCAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOnJlZGVmaW5lICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOm5vdGF0aW9uICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCEtLQotICAgICBrZWVwIHRoaXMgc2NoZW1hIFhNTDEuMCBEVEQgdmFsaWQKLSAgLS0+Ci0gICAgICAgIDwhRU5USVRZICUgc2NoZW1hQXR0cnMgJ3htbG5zOmhmcCBDREFUQSAjSU1QTElFRCc+Ci0KLSAgICAgICAgPCFFTEVNRU5UIGhmcDpoYXNGYWNldCBFTVBUWT4KLSAgICAgICAgPCFBVFRMSVNUIGhmcDpoYXNGYWNldAotICAgICAgICAgICAgICAgIG5hbWUgTk1UT0tFTiAjUkVRVUlSRUQ+Ci0KLSAgICAgICAgPCFFTEVNRU5UIGhmcDpoYXNQcm9wZXJ0eSBFTVBUWT4KLSAgICAgICAgPCFBVFRMSVNUIGhmcDpoYXNQcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWUgTk1UT0tFTiAjUkVRVUlSRUQKLSAgICAgICAgICAgICAgICB2YWx1ZSBDREFUQSAjUkVRVUlSRUQ+Ci08IS0tCi0gICAgICAgIE1ha2Ugc3VyZSB0aGF0IHByb2Nlc3NvcnMgdGhhdCBkbyBub3QgcmVhZCB0aGUgZXh0ZXJuYWwKLSAgICAgICAgc3Vic2V0IHdpbGwga25vdyBhYm91dCB0aGUgdmFyaW91cyBJRHMgd2UgZGVjbGFyZQotICAtLT4KLSAgICAgICAgPCFBVFRMSVNUIHhzOnNpbXBsZVR5cGUgaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czptYXhFeGNsdXNpdmUgaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czptaW5FeGNsdXNpdmUgaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czptYXhJbmNsdXNpdmUgaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czptaW5JbmNsdXNpdmUgaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czp0b3RhbERpZ2l0cyBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOmZyYWN0aW9uRGlnaXRzIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6bGVuZ3RoIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6bWluTGVuZ3RoIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6bWF4TGVuZ3RoIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6ZW51bWVyYXRpb24gaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czpwYXR0ZXJuIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6YXBwaW5mbyBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOmRvY3VtZW50YXRpb24gaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czpsaXN0IGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6dW5pb24gaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIF0+Ci08eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGJsb2NrRGVmYXVsdD0iI2FsbCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHZlcnNpb249IjEuMCIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWw6bGFuZz0iRU4iIHhtbG5zOmhmcD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaGFzRmFjZXRBbmRQcm9wZXJ0eSI+Ci0gPHhzOmFubm90YXRpb24+Ci0gIDx4czpkb2N1bWVudGF0aW9uPgotICAgIFBhcnQgMSB2ZXJzaW9uOiBJZDogWE1MU2NoZW1hLnhzZCx2IDEuNTMgMjAwMy8wMi8yNCAxNzo0MDowNyBodCBFeHAgCi0gICAgUGFydCAyIHZlcnNpb246IElkOiBkYXRhdHlwZXMueHNkLHYgMS42MCAyMDAzLzA0LzA1IDExOjAyOjMwIGh0IEV4cCAKLSAgPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotCi0gPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC9Hcm91cC8yMDAyLzA5L3htbHNjaGVtYS0xL3N0cnVjdHVyZXMtd2l0aC1lcnJhdGEuaHRtbCI+Ci0gICBUaGUgc2NoZW1hIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBkb2N1bWVudCBpcyBub3JtYXRpdmUsCi0gICB3aXRoIHJlc3BlY3QgdG8gdGhlIHN5bnRhY3RpYyBjb25zdHJhaW50cyBpdCBleHByZXNzZXMgaW4gdGhlCi0gICBYTUwgU2NoZW1hIGxhbmd1YWdlLiAgVGhlIGRvY3VtZW50YXRpb24gKHdpdGhpbiAmbHQ7ZG9jdW1lbnRhdGlvbj4gZWxlbWVudHMpCi0gICBiZWxvdywgaXMgbm90IG5vcm1hdGl2ZSwgYnV0IHJhdGhlciBoaWdobGlnaHRzIGltcG9ydGFudCBhc3BlY3RzIG9mCi0gICB0aGUgVzNDIFJlY29tbWVuZGF0aW9uIG9mIHdoaWNoIHRoaXMgaXMgYSBwYXJ0PC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBUaGUgc2ltcGxlVHlwZSBlbGVtZW50IGFuZCBhbGwgb2YgaXRzIG1lbWJlcnMgYXJlIGRlZmluZWQKLSAgICAgIHRvd2FyZHMgdGhlIGVuZCBvZiB0aGlzIHNjaGVtYSBkb2N1bWVudDwveHM6ZG9jdW1lbnRhdGlvbj4KLSA8L3hzOmFubm90YXRpb24+Ci0KLSA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICBHZXQgYWNjZXNzIHRvIHRoZSB4bWw6IGF0dHJpYnV0ZSBncm91cHMgZm9yIHhtbDpsYW5nCi0gICAgICAgYXMgZGVjbGFyZWQgb24gJ3NjaGVtYScgYW5kICdkb2N1bWVudGF0aW9uJyBiZWxvdwotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gPC94czppbXBvcnQ+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ib3BlbkF0dHJzIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICBUaGlzIHR5cGUgaXMgZXh0ZW5kZWQgYnkgYWxtb3N0IGFsbCBzY2hlbWEgdHlwZXMKLSAgICAgICB0byBhbGxvdyBhdHRyaWJ1dGVzIGZyb20gb3RoZXIgbmFtZXNwYWNlcyB0byBiZQotICAgICAgIGFkZGVkIHRvIHVzZXIgc2NoZW1hcy4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgPC94czphbm5vdGF0aW9uPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VHlwZSI+Ci0gICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYW5ub3RhdGVkIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICBUaGlzIHR5cGUgaXMgZXh0ZW5kZWQgYnkgYWxsIHR5cGVzIHdoaWNoIGFsbG93IGFubm90YXRpb24KLSAgICAgICBvdGhlciB0aGFuICZsdDtzY2hlbWEmZ3Q7IGl0c2VsZgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6b3BlbkF0dHJzIj4KLSAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4KLSAgICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Z3JvdXAgbmFtZT0ic2NoZW1hVG9wIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIFRoaXMgZ3JvdXAgaXMgZm9yIHRoZQotICAgZWxlbWVudHMgd2hpY2ggb2NjdXIgZnJlZWx5IGF0IHRoZSB0b3AgbGV2ZWwgb2Ygc2NoZW1hcy4KLSAgIEFsbCBvZiB0aGVpciB0eXBlcyBhcmUgYmFzZWQgb24gdGhlICJhbm5vdGF0ZWQiIHR5cGUgYnkgZXh0ZW5zaW9uLjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y2hvaWNlPgotICAgPHhzOmdyb3VwIHJlZj0ieHM6cmVkZWZpbmFibGUiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6ZWxlbWVudCIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphdHRyaWJ1dGUiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6bm90YXRpb24iLz4KLSAgPC94czpjaG9pY2U+Ci0gPC94czpncm91cD4KLSAKLSA8eHM6Z3JvdXAgbmFtZT0icmVkZWZpbmFibGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgVGhpcyBncm91cCBpcyBmb3IgdGhlCi0gICBlbGVtZW50cyB3aGljaCBjYW4gc2VsZi1yZWRlZmluZSAoc2VlICZsdDtyZWRlZmluZT4gYmVsb3cpLjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y2hvaWNlPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzaW1wbGVUeXBlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmNvbXBsZXhUeXBlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmdyb3VwIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmF0dHJpYnV0ZUdyb3VwIi8+Ci0gIDwveHM6Y2hvaWNlPgotIDwveHM6Z3JvdXA+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJmb3JtQ2hvaWNlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJxdWFsaWZpZWQiLz4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idW5xdWFsaWZpZWQiLz4KLSAgPC94czpyZXN0cmljdGlvbj4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkZWZhdWx0RGVyaXZhdGlvbkNvbnRyb2wiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZGVyaXZhdGlvbkNvbnRyb2wiPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbnNpb24iLz4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVzdHJpY3Rpb24iLz4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGlzdCIvPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmlvbiIvPgotICA8L3hzOnJlc3RyaWN0aW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImRlZmF1bHREZXJpdmF0aW9uU2V0Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICNhbGwgb3IgKHBvc3NpYmx5IGVtcHR5KSBzdWJzZXQgb2Yge2V4dGVuc2lvbiwgcmVzdHJpY3Rpb24sIGxpc3QsIHVuaW9ufTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24+Ci0gICA8eHM6c2ltcGxlVHlwZT4gICAgCi0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjYWxsIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSAgIDx4czpzaW1wbGVUeXBlPgotICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpkZWZhdWx0RGVyaXZhdGlvbkNvbnRyb2wiLz4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJyZWR1Y2VkRGVyaXZhdGlvbkNvbnRyb2wiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZGVyaXZhdGlvbkNvbnRyb2wiPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbnNpb24iLz4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVzdHJpY3Rpb24iLz4KLSAgPC94czpyZXN0cmljdGlvbj4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkZXJpdmF0aW9uU2V0Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICNhbGwgb3IgKHBvc3NpYmx5IGVtcHR5KSBzdWJzZXQgb2Yge2V4dGVuc2lvbiwgcmVzdHJpY3Rpb259PC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czp1bmlvbj4KLSAgIDx4czpzaW1wbGVUeXBlPiAgICAKLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiNhbGwiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOnJlZHVjZWREZXJpdmF0aW9uQ29udHJvbCIvPgotICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9InNjaGVtYSIgaWQ9InNjaGVtYSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtc2NoZW1hIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6b3BlbkF0dHJzIj4KLSAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmluY2x1ZGUiLz4KLSAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmltcG9ydCIvPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6cmVkZWZpbmUiLz4KLSAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iLz4KLSAgICAgIDwveHM6Y2hvaWNlPgotICAgICAgPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgIDx4czpncm91cCByZWY9InhzOnNjaGVtYVRvcCIvPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzOm5vcm1hbGl6ZWRTdHJpbmciLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaW5hbERlZmF1bHQiIHR5cGU9InhzOmRlZmF1bHREZXJpdmF0aW9uU2V0IiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJibG9ja0RlZmF1bHQiIHR5cGU9InhzOmJsb2NrU2V0IiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGVGb3JtRGVmYXVsdCIgdHlwZT0ieHM6Zm9ybUNob2ljZSIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0idW5xdWFsaWZpZWQiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbGVtZW50Rm9ybURlZmF1bHQiIHR5cGU9InhzOmZvcm1DaG9pY2UiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9InVucXVhbGlmaWVkIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6a2V5IG5hbWU9ImVsZW1lbnQiPgotICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ4czplbGVtZW50Ii8+Ci0gICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+Ci0gIDwveHM6a2V5PgotCi0gIDx4czprZXkgbmFtZT0iYXR0cmlidXRlIj4KLSAgIDx4czpzZWxlY3RvciB4cGF0aD0ieHM6YXR0cmlidXRlIi8+Ci0gICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+Ci0gIDwveHM6a2V5PgotCi0gIDx4czprZXkgbmFtZT0idHlwZSI+Ci0gICA8eHM6c2VsZWN0b3IgeHBhdGg9InhzOmNvbXBsZXhUeXBlfHhzOnNpbXBsZVR5cGUiLz4KLSAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiLz4KLSAgPC94czprZXk+Ci0gCi0gIDx4czprZXkgbmFtZT0iZ3JvdXAiPgotICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ4czpncm91cCIvPgotICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIvPgotICA8L3hzOmtleT4KLSAKLSAgPHhzOmtleSBuYW1lPSJhdHRyaWJ1dGVHcm91cCI+Ci0gICA8eHM6c2VsZWN0b3IgeHBhdGg9InhzOmF0dHJpYnV0ZUdyb3VwIi8+Ci0gICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+Ci0gIDwveHM6a2V5PgotIAotICA8eHM6a2V5IG5hbWU9Im5vdGF0aW9uIj4KLSAgIDx4czpzZWxlY3RvciB4cGF0aD0ieHM6bm90YXRpb24iLz4KLSAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiLz4KLSAgPC94czprZXk+Ci0KLSAgPHhzOmtleSBuYW1lPSJpZGVudGl0eUNvbnN0cmFpbnQiPgotICAgPHhzOnNlbGVjdG9yIHhwYXRoPSIuLy94czprZXl8Li8veHM6dW5pcXVlfC4vL3hzOmtleXJlZiIvPgotICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIvPgotICA8L3hzOmtleT4KLQotIDwveHM6ZWxlbWVudD4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImFsbE5OSSI+Ci0gIDx4czphbm5vdGF0aW9uPjx4czpkb2N1bWVudGF0aW9uPgotICAgZm9yIG1heE9jY3VyczwveHM6ZG9jdW1lbnRhdGlvbj48L3hzOmFubm90YXRpb24+Ci0gIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAgIDx4czpzaW1wbGVUeXBlPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJvY2N1cnMiPgotICA8eHM6YW5ub3RhdGlvbj48eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIGZvciBhbGwgcGFydGljbGVzPC94czpkb2N1bWVudGF0aW9uPjwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHR5cGU9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iMSIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdHlwZT0ieHM6YWxsTk5JIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIi8+Ci0gPC94czphdHRyaWJ1dGVHcm91cD4KLQotIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJkZWZSZWYiPgotICA8eHM6YW5ub3RhdGlvbj48eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIGZvciBlbGVtZW50LCBncm91cCBhbmQgYXR0cmlidXRlR3JvdXAsCi0gICB3aGljaCBib3RoIGRlZmluZSBhbmQgcmVmZXJlbmNlPC94czpkb2N1bWVudGF0aW9uPjwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHR5cGU9InhzOlFOYW1lIi8+Ci0gPC94czphdHRyaWJ1dGVHcm91cD4KLQotIDx4czpncm91cCBuYW1lPSJ0eXBlRGVmUGFydGljbGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICdjb21wbGV4VHlwZScgdXNlcyB0aGlzPC94czpkb2N1bWVudGF0aW9uPjwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNob2ljZT4KLSAgIDx4czplbGVtZW50IG5hbWU9Imdyb3VwIiB0eXBlPSJ4czpncm91cFJlZiIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbGwiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Y2hvaWNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOnNlcXVlbmNlIi8+Ci0gIDwveHM6Y2hvaWNlPgotIDwveHM6Z3JvdXA+Ci0gCi0gCi0KLSA8eHM6Z3JvdXAgbmFtZT0ibmVzdGVkUGFydGljbGUiPgotICA8eHM6Y2hvaWNlPgotICAgPHhzOmVsZW1lbnQgbmFtZT0iZWxlbWVudCIgdHlwZT0ieHM6bG9jYWxFbGVtZW50Ii8+Ci0gICA8eHM6ZWxlbWVudCBuYW1lPSJncm91cCIgdHlwZT0ieHM6Z3JvdXBSZWYiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Y2hvaWNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOnNlcXVlbmNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmFueSIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotIAotIDx4czpncm91cCBuYW1lPSJwYXJ0aWNsZSI+Ci0gIDx4czpjaG9pY2U+Ci0gICA8eHM6ZWxlbWVudCBuYW1lPSJlbGVtZW50IiB0eXBlPSJ4czpsb2NhbEVsZW1lbnQiLz4KLSAgIDx4czplbGVtZW50IG5hbWU9Imdyb3VwIiB0eXBlPSJ4czpncm91cFJlZiIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbGwiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Y2hvaWNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOnNlcXVlbmNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmFueSIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ieHM6ZGVmUmVmIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpRTmFtZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJvcHRpb25hbCI+Ci0gICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJvaGliaXRlZCIvPgotICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ib3B0aW9uYWwiLz4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlcXVpcmVkIi8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0IiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpeGVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZvcm0iIHR5cGU9InhzOmZvcm1DaG9pY2UiLz4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRvcExldmVsQXR0cmlidXRlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmF0dHJpYnV0ZSI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZm9ybSIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Z3JvdXAgbmFtZT0iYXR0ckRlY2xzIj4KLSAgPHhzOnNlcXVlbmNlPgotICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiIHR5cGU9InhzOmF0dHJpYnV0ZSIvPgotICAgIDx4czplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZUdyb3VwIiB0eXBlPSJ4czphdHRyaWJ1dGVHcm91cFJlZiIvPgotICAgPC94czpjaG9pY2U+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmFueUF0dHJpYnV0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gIDwveHM6c2VxdWVuY2U+Ci0gPC94czpncm91cD4KLQotIDx4czplbGVtZW50IG5hbWU9ImFueUF0dHJpYnV0ZSIgdHlwZT0ieHM6d2lsZGNhcmQiIGlkPSJhbnlBdHRyaWJ1dGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtYW55QXR0cmlidXRlIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6Z3JvdXAgbmFtZT0iY29tcGxleFR5cGVNb2RlbCI+Ci0gIDx4czpjaG9pY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOnNpbXBsZUNvbnRlbnQiLz4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6Y29tcGxleENvbnRlbnQiLz4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBUaGlzIGJyYW5jaCBpcyBzaG9ydCBmb3IKLSAgICZsdDtjb21wbGV4Q29udGVudD4KLSAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlUeXBlIj4KLSAgIC4uLgotICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAgICZsdDsvY29tcGxleENvbnRlbnQ+PC94czpkb2N1bWVudGF0aW9uPgotICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czp0eXBlRGVmUGFydGljbGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpjaG9pY2U+Ci0gPC94czpncm91cD4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJjb21wbGV4VHlwZSIgYWJzdHJhY3Q9InRydWUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOmdyb3VwIHJlZj0ieHM6Y29tcGxleFR5cGVNb2RlbCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIj4KLSAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIFdpbGwgYmUgcmVzdHJpY3RlZCB0byByZXF1aXJlZCBvciBmb3JiaWRkZW48L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1peGVkIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJmYWxzZSI+Ci0gICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBOb3QgYWxsb3dlZCBpZiBzaW1wbGVDb250ZW50IGNoaWxkIGlzIGNob3Nlbi4KLSAgICAgIE1heSBiZSBvdmVycmlkZW4gYnkgc2V0dGluZyBvbiBjb21wbGV4Q29udGVudCBjaGlsZC48L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDwveHM6YXR0cmlidXRlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWJzdHJhY3QiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9ImZhbHNlIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaW5hbCIgdHlwZT0ieHM6ZGVyaXZhdGlvblNldCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmxvY2siIHR5cGU9InhzOmRlcml2YXRpb25TZXQiLz4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRvcExldmVsQ29tcGxleFR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Y29tcGxleFR5cGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6Y29tcGxleFR5cGVNb2RlbCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxDb21wbGV4VHlwZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpjb21wbGV4VHlwZSI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpjb21wbGV4VHlwZU1vZGVsIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWJzdHJhY3QiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmluYWwiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmxvY2siIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJyZXN0cmljdGlvblR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4czp0eXBlRGVmUGFydGljbGUiLz4KLSAgICAgIDx4czpncm91cCByZWY9InhzOnNpbXBsZVJlc3RyaWN0aW9uTW9kZWwiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJiYXNlIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+ICAgICAgIAotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iY29tcGxleFJlc3RyaWN0aW9uVHlwZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpyZXN0cmljdGlvblR5cGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGhpcyBjaG9pY2UgaXMgYWRkZWQgc2ltcGx5IHRvCi0gICAgICAgICAgICAgICAgICAgbWFrZSB0aGlzIGEgdmFsaWQgcmVzdHJpY3Rpb24gcGVyIHRoZSBSRUM8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4czp0eXBlRGVmUGFydGljbGUiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PiAgICAgICAKLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImV4dGVuc2lvblR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czp0eXBlRGVmUGFydGljbGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmFzZSIgdHlwZT0ieHM6UU5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PiAgICAgICAKLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iY29tcGxleENvbnRlbnQiIGlkPSJjb21wbGV4Q29udGVudCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1jb21wbGV4Q29udGVudCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgIDx4czpjaG9pY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXN0cmljdGlvbiIgdHlwZT0ieHM6Y29tcGxleFJlc3RyaWN0aW9uVHlwZSIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJ4czpleHRlbnNpb25UeXBlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPiAgICAgCi0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWl4ZWQiIHR5cGU9InhzOmJvb2xlYW4iPgotICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgT3ZlcnJpZGVzIGFueSBzZXR0aW5nIG9uIGNvbXBsZXhUeXBlIHBhcmVudC48L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaW1wbGVSZXN0cmljdGlvblR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6cmVzdHJpY3Rpb25UeXBlIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlRoaXMgY2hvaWNlIGlzIGFkZGVkIHNpbXBseSB0bwotICAgICAgICAgICAgICAgICAgIG1ha2UgdGhpcyBhIHZhbGlkIHJlc3RyaWN0aW9uIHBlciB0aGUgUkVDPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6c2ltcGxlUmVzdHJpY3Rpb25Nb2RlbCIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YXR0ckRlY2xzIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaW1wbGVFeHRlbnNpb25UeXBlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmV4dGVuc2lvblR5cGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIE5vIHR5cGVEZWZQYXJ0aWNsZSBncm91cCByZWZlcmVuY2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YXR0ckRlY2xzIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9InNpbXBsZUNvbnRlbnQiIGlkPSJzaW1wbGVDb250ZW50Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXNpbXBsZUNvbnRlbnQiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6Y2hvaWNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmVzdHJpY3Rpb24iIHR5cGU9InhzOnNpbXBsZVJlc3RyaWN0aW9uVHlwZSIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJ4czpzaW1wbGVFeHRlbnNpb25UeXBlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0gCi0gPHhzOmVsZW1lbnQgbmFtZT0iY29tcGxleFR5cGUiIHR5cGU9InhzOnRvcExldmVsQ29tcGxleFR5cGUiIGlkPSJjb21wbGV4VHlwZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1jb21wbGV4VHlwZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYmxvY2tTZXQiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAjYWxsIG9yIChwb3NzaWJseSBlbXB0eSkgc3Vic2V0IG9mIHtzdWJzdGl0dXRpb24sIGV4dGVuc2lvbiwKLSAgICByZXN0cmljdGlvbn08L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6dW5pb24+Ci0gICAgPHhzOnNpbXBsZVR5cGU+ICAgIAotICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjYWxsIi8+Ci0gICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICA8eHM6bGlzdD4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpkZXJpdmF0aW9uQ29udHJvbCI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5zaW9uIi8+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVzdHJpY3Rpb24iLz4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzdWJzdGl0dXRpb24iLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmxpc3Q+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgPC94czp1bmlvbj4gIAotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudCIgYWJzdHJhY3Q9InRydWUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgVGhlIGVsZW1lbnQgZWxlbWVudCBjYW4gYmUgdXNlZCBlaXRoZXIKLSAgIGF0IHRoZSB0b3AgbGV2ZWwgdG8gZGVmaW5lIGFuIGVsZW1lbnQtdHlwZSBiaW5kaW5nIGdsb2JhbGx5LAotICAgb3Igd2l0aGluIGEgY29udGVudCBtb2RlbCB0byBlaXRoZXIgcmVmZXJlbmNlIGEgZ2xvYmFsbHktZGVmaW5lZAotICAgZWxlbWVudCBvciB0eXBlIG9yIGRlY2xhcmUgYW4gZWxlbWVudC10eXBlIGJpbmRpbmcgbG9jYWxseS4KLSAgIFRoZSByZWYgZm9ybSBpcyBub3QgYWxsb3dlZCBhdCB0aGUgdG9wIGxldmVsLjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InNpbXBsZVR5cGUiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY29tcGxleFR5cGUiIHR5cGU9InhzOmxvY2FsQ29tcGxleFR5cGUiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmlkZW50aXR5Q29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ieHM6ZGVmUmVmIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpRTmFtZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3Vic3RpdHV0aW9uR3JvdXAiIHR5cGU9InhzOlFOYW1lIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ieHM6b2NjdXJzIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0IiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpeGVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5pbGxhYmxlIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJmYWxzZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWJzdHJhY3QiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9ImZhbHNlIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaW5hbCIgdHlwZT0ieHM6ZGVyaXZhdGlvblNldCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmxvY2siIHR5cGU9InhzOmJsb2NrU2V0Ii8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmb3JtIiB0eXBlPSJ4czpmb3JtQ2hvaWNlIi8+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0b3BMZXZlbEVsZW1lbnQiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZWxlbWVudCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImNvbXBsZXhUeXBlIiB0eXBlPSJ4czpsb2NhbENvbXBsZXhUeXBlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czppZGVudGl0eUNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZvcm0iIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxFbGVtZW50Ij4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmVsZW1lbnQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb21wbGV4VHlwZSIgdHlwZT0ieHM6bG9jYWxDb21wbGV4VHlwZSIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6aWRlbnRpdHlDb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN1YnN0aXR1dGlvbkdyb3VwIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpbmFsIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFic3RyYWN0IiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImVsZW1lbnQiIHR5cGU9InhzOnRvcExldmVsRWxlbWVudCIgaWQ9ImVsZW1lbnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtZWxlbWVudCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9Imdyb3VwIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBncm91cCB0eXBlIGZvciBleHBsaWNpdCBncm91cHMsIG5hbWVkIHRvcC1sZXZlbCBncm91cHMgYW5kCi0gICBncm91cCByZWZlcmVuY2VzPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ4czpwYXJ0aWNsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOmRlZlJlZiIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOm9jY3VycyIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0icmVhbEdyb3VwIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmdyb3VwIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbGwiLz4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6Y2hvaWNlIi8+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOnNlcXVlbmNlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWRHcm91cCI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpyZWFsR3JvdXAiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSI+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhbGwiPgotICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFsbCI+Ci0gICAgICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YWxsTW9kZWwiLz4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1pbk9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHVzZT0icHJvaGliaXRlZCIvPgotICAgICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgPC94czplbGVtZW50PgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlIiB0eXBlPSJ4czpzaW1wbGVFeHBsaWNpdEdyb3VwIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZSIgdHlwZT0ieHM6c2ltcGxlRXhwbGljaXRHcm91cCIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ3JvdXBSZWYiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6cmVhbEdyb3VwIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6UU5hbWUiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImV4cGxpY2l0R3JvdXAiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgZ3JvdXAgdHlwZSBmb3IgdGhlIHRocmVlIGtpbmRzIG9mIGdyb3VwPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpncm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpuZXN0ZWRQYXJ0aWNsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNpbXBsZUV4cGxpY2l0R3JvdXAiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZXhwbGljaXRHcm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpuZXN0ZWRQYXJ0aWNsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4T2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Z3JvdXAgbmFtZT0iYWxsTW9kZWwiPgotICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGhpcyBjaG9pY2Ugd2l0aCBtaW4vbWF4IGlzIGhlcmUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXZvaWQgYSBwYmxtIHdpdGggdGhlIEVsdDpBbGwvQ2hvaWNlL1NlcQotICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aWNsZSBkZXJpdmF0aW9uIGNvbnN0cmFpbnQ8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgIDx4czplbGVtZW50IG5hbWU9ImVsZW1lbnQiIHR5cGU9InhzOmVsZW1lbnRJbkFsbCIvPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgIDwveHM6c2VxdWVuY2U+Ci0gPC94czpncm91cD4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudEluQWxsIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPnJlc3RyaWN0ZWQgbWF4L21pbjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bG9jYWxFbGVtZW50Ij4KLSAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiLz4KLSAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb21wbGV4VHlwZSIgdHlwZT0ieHM6bG9jYWxDb21wbGV4VHlwZSIvPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4czppZGVudGl0eUNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMCIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFsbE5OSSI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMCIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+ICAgIAotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhbGwiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBPbmx5IGVsZW1lbnRzIGFsbG93ZWQgaW5zaWRlPC94czpkb2N1bWVudGF0aW9uPgotICAgPC94czphbm5vdGF0aW9uPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpleHBsaWNpdEdyb3VwIj4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YWxsTW9kZWwiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMCIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFsbE5OSSI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPgotICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgIDwveHM6YXR0cmlidXRlPgotICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImFsbCIgaWQ9ImFsbCIgdHlwZT0ieHM6YWxsIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWFsbCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlIiB0eXBlPSJ4czpleHBsaWNpdEdyb3VwIiBpZD0iY2hvaWNlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWNob2ljZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UiIHR5cGU9InhzOmV4cGxpY2l0R3JvdXAiIGlkPSJzZXF1ZW5jZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1zZXF1ZW5jZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iZ3JvdXAiIHR5cGU9InhzOm5hbWVkR3JvdXAiIGlkPSJncm91cCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1ncm91cCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9IndpbGRjYXJkIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpuYW1lc3BhY2VMaXN0IiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIjI2FueSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHJvY2Vzc0NvbnRlbnRzIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJzdHJpY3QiPgotICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InNraXAiLz4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImxheCIvPgotICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaWN0Ii8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iYW55IiBpZD0iYW55Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWFueSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOndpbGRjYXJkIj4KLSAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ieHM6b2NjdXJzIi8+Ci0gICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgc2ltcGxlIHR5cGUgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgJ25hbWVzcGFjZScgYXR0ciBvZgotICAgJ2FueScgYW5kICdhbnlBdHRyaWJ1dGUnPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBWYWx1ZSBpcwotICAgICAgICAgICAgICAjI2FueSAgICAgIC0gLSBhbnkgbm9uLWNvbmZsaWN0aW5nIFdGWE1ML2F0dHJpYnV0ZSBhdCBhbGwKLQotICAgICAgICAgICAgICAjI290aGVyICAgIC0gLSBhbnkgbm9uLWNvbmZsaWN0aW5nIFdGWE1ML2F0dHJpYnV0ZSBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugb3RoZXIgdGhhbiB0YXJnZXROUwotCi0gICAgICAgICAgICAgICMjbG9jYWwgICAgLSAtIGFueSB1bnF1YWxpZmllZCBub24tY29uZmxpY3RpbmcgV0ZYTUwvYXR0cmlidXRlIAotCi0gICAgICAgICAgICAgIG9uZSBvciAgICAgLSAtIGFueSBub24tY29uZmxpY3RpbmcgV0ZYTUwvYXR0cmlidXRlIGZyb20KLSAgICAgICAgICAgICAgbW9yZSBVUkkgICAgICAgIHRoZSBsaXN0ZWQgbmFtZXNwYWNlcwotICAgICAgICAgICAgICByZWZlcmVuY2VzCi0gICAgICAgICAgICAgIChzcGFjZSBzZXBhcmF0ZWQpCi0KLSAgICAjI3RhcmdldE5hbWVzcGFjZSBvciAjI2xvY2FsIG1heSBhcHBlYXIgaW4gdGhlIGFib3ZlIGxpc3QsIHRvCi0gICAgICAgIHJlZmVyIHRvIHRoZSB0YXJnZXROYW1lc3BhY2Ugb2YgdGhlIGVuY2xvc2luZwotICAgICAgICBzY2hlbWEgb3IgYW4gYWJzZW50IHRhcmdldE5hbWVzcGFjZSByZXNwZWN0aXZlbHk8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9Im5hbWVzcGFjZUxpc3QiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjYW55Ii8+Ci0gICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iIyNvdGhlciIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6bGlzdD4KLSAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzOmFueVVSSSI+Ci0gICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjbG9jYWwiLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzOnVuaW9uPgotICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czpsaXN0PgotICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgdHlwZT0ieHM6dG9wTGV2ZWxBdHRyaWJ1dGUiIGlkPSJhdHRyaWJ1dGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtYXR0cmlidXRlIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlR3JvdXAiIGFic3RyYWN0PSJ0cnVlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOmRlZlJlZiIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWRBdHRyaWJ1dGVHcm91cCI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphdHRyaWJ1dGVHcm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZUdyb3VwUmVmIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmF0dHJpYnV0ZUdyb3VwIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6UU5hbWUiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlR3JvdXAiIHR5cGU9InhzOm5hbWVkQXR0cmlidXRlR3JvdXAiIGlkPSJhdHRyaWJ1dGVHcm91cCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hdHRyaWJ1dGVHcm91cCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZSIgaWQ9ImluY2x1ZGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtaW5jbHVkZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hTG9jYXRpb24iIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJyZWRlZmluZSIgaWQ9InJlZGVmaW5lIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXJlZGVmaW5lIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6b3BlbkF0dHJzIj4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIvPgotICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6cmVkZWZpbmFibGUiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hTG9jYXRpb24iIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJpbXBvcnQiIGlkPSJpbXBvcnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtaW1wb3J0Ii8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjaGVtYUxvY2F0aW9uIiB0eXBlPSJ4czphbnlVUkkiLz4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0ic2VsZWN0b3IiIGlkPSJzZWxlY3RvciI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1zZWxlY3RvciIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhwYXRoIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5BIHN1YnNldCBvZiBYUGF0aCBleHByZXNzaW9ucyBmb3IgdXNlCi1pbiBzZWxlY3RvcnM8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDx4czpkb2N1bWVudGF0aW9uPkEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYwotdXNlPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlRoZSBmb2xsb3dpbmcgcGF0dGVybiBpcyBpbnRlbmRlZCB0byBhbGxvdyBYUGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMgcGVyIHRoZSBmb2xsb3dpbmcgRUJORjoKLSAgICAgICAgICBTZWxlY3RvciAgICA6Oj0gICAgUGF0aCAoICd8JyBQYXRoICkqICAKLSAgICAgICAgICBQYXRoICAgIDo6PSAgICAoJy4vLycpPyBTdGVwICggJy8nIFN0ZXAgKSogIAotICAgICAgICAgIFN0ZXAgICAgOjo9ICAgICcuJyB8IE5hbWVUZXN0ICAKLSAgICAgICAgICBOYW1lVGVzdCAgICA6Oj0gICAgUU5hbWUgfCAnKicgfCBOQ05hbWUgJzonICcqJyAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZDo6IGlzIGFsc28gYWxsb3dlZAotICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwhLS0gVFNIIG1vZGlmaWVkIHRvIGFsbG93IHdoaXRlIHNwYWNlIC0tPgotICAgICAgICA8eHM6cGF0dGVybgotICAgICAgICAgICAgdmFsdWU9IihcLlxzKi8vXHMqKT8oKChjaGlsZFxzKjo6XHMqKT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKShccyovXHMqKCgoY2hpbGRccyo6OlxzKik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLikpKihccypcfFxzKihcLlxzKi8vXHMqKT8oKChjaGlsZFxzKjo6XHMqKT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKShccyovXHMqKCgoY2hpbGRccyo6OlxzKik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLikpKikqIj4KLSAgICAgICAgPC94czpwYXR0ZXJuPgotICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgIDwveHM6YXR0cmlidXRlPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJmaWVsZCIgaWQ9ImZpZWxkIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWZpZWxkIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieHBhdGgiIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czpkb2N1bWVudGF0aW9uPkEgc3Vic2V0IG9mIFhQYXRoIGV4cHJlc3Npb25zIGZvciB1c2UKLWluIGZpZWxkczwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+QSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljCi11c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGhlIGZvbGxvd2luZyBwYXR0ZXJuIGlzIGludGVuZGVkIHRvIGFsbG93IFhQYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucyBwZXIgdGhlIHNhbWUgRUJORiBhcyBmb3Igc2VsZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBmb2xsb3dpbmcgY2hhbmdlOgotICAgICAgICAgIFBhdGggICAgOjo9ICAgICgnLi8vJyk/ICggU3RlcCAnLycgKSogKCBTdGVwIHwgJ0AnIE5hbWVUZXN0ICkgCi0gICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPCEtLSBUU0ggbW9kaWZpZWQgdG8gYWxsb3cgd2hpdGUgc3BhY2UgLS0+Ci0gICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSIoXC5ccyovL1xzKik/KCgoKGNoaWxkXHMqOjpccyopPygoXGlcYyo6KT8oXGlcYyp8XCopKSl8XC4pXHMqL1xzKikqKCgoKGNoaWxkXHMqOjpccyopPygoXGlcYyo6KT8oXGlcYyp8XCopKSl8XC4pfCgoYXR0cmlidXRlXHMqOjpccyp8QFxzKikoKFxpXGMqOik/KFxpXGMqfFwqKSkpKShccypcfFxzKihccypcLi8vXHMqKT8oKCgoY2hpbGRccyo6OlxzKik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLikvKSooKCgoY2hpbGRccyo6OlxzKik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLil8KChhdHRyaWJ1dGVccyo6OlxzKnxAXHMqKSgoXGlcYyo6KT8oXGlcYyp8XCopKSkpKSoiPgotICAgICAgICA8L3hzOnBhdHRlcm4+Ci0gICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgPC94czphdHRyaWJ1dGU+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJrZXliYXNlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzZWxlY3RvciIvPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmZpZWxkIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpncm91cCBuYW1lPSJpZGVudGl0eUNvbnN0cmFpbnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPlRoZSB0aHJlZSBraW5kcyBvZiBpZGVudGl0eSBjb25zdHJhaW50cywgYWxsIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgIHR5cGUgb2Ygb3IgZGVyaXZlZCBmcm9tICdrZXliYXNlJy4KLSAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y2hvaWNlPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czp1bmlxdWUiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6a2V5Ii8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmtleXJlZiIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0idW5pcXVlIiB0eXBlPSJ4czprZXliYXNlIiBpZD0idW5pcXVlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXVuaXF1ZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotIDx4czplbGVtZW50IG5hbWU9ImtleSIgdHlwZT0ieHM6a2V5YmFzZSIgaWQ9ImtleSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1rZXkiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLSA8eHM6ZWxlbWVudCBuYW1lPSJrZXlyZWYiIGlkPSJrZXlyZWYiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQta2V5cmVmIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6a2V5YmFzZSI+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmZXIiIHR5cGU9InhzOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9Im5vdGF0aW9uIiBpZD0ibm90YXRpb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtbm90YXRpb24iLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InB1YmxpYyIgdHlwZT0ieHM6cHVibGljIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3lzdGVtIiB0eXBlPSJ4czphbnlVUkkiLz4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0icHVibGljIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgcHVibGljIGlkZW50aWZpZXIsIHBlciBJU08gODg3OTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iLz4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJhcHBpbmZvIiBpZD0iYXBwaW5mbyI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hcHBpbmZvIi8+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotICAgIDx4czpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzb3VyY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJkb2N1bWVudGF0aW9uIiBpZD0iZG9jdW1lbnRhdGlvbiI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1kb2N1bWVudGF0aW9uIi8+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotICAgIDx4czpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzb3VyY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiBpZD0iYW5ub3RhdGlvbiI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hbm5vdGF0aW9uIi8+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm9wZW5BdHRycyI+Ci0gICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YXBwaW5mbyIvPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6ZG9jdW1lbnRhdGlvbiIvPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgotICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBub3RhdGlvbnMgZm9yIHVzZSB3aXRoaW4gWE1MIFNjaGVtYSBzY2hlbWFzPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czpub3RhdGlvbiBuYW1lPSJYTUxTY2hlbWFTdHJ1Y3R1cmVzIiBwdWJsaWM9InN0cnVjdHVyZXMiIHN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOC9YTUxTY2hlbWEueHNkIi8+Ci0gPHhzOm5vdGF0aW9uIG5hbWU9IlhNTCIgcHVibGljPSJSRUMteG1sLTE5OTgwMjEwIiBzeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLXhtbC0xOTk4MDIxMCIvPgotICAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYW55VHlwZSIgbWl4ZWQ9InRydWUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgTm90IHRoZSByZWFsIHVyVHlwZSwgYnV0IGFzIGNsb3NlIGFuIGFwcHJveGltYXRpb24gYXMgd2UgY2FuCi0gICBnZXQgaW4gdGhlIFhNTCByZXByZXNlbnRhdGlvbjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6c2VxdWVuY2U+Ci0gICA8eHM6YW55IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gIDwveHM6c2VxdWVuY2U+Ci0gIDx4czphbnlBdHRyaWJ1dGUgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgRmlyc3QgdGhlIGJ1aWx0LWluIHByaW1pdGl2ZSBkYXRhdHlwZXMuICBUaGVzZSBkZWZpbml0aW9ucyBhcmUgZm9yCi0gICAgICBpbmZvcm1hdGlvbiBvbmx5LCB0aGUgcmVhbCBidWlsdC1pbiBkZWZpbml0aW9ucyBhcmUgbWFnaWMuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotCi0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBGb3IgZWFjaCBidWlsdC1pbiBkYXRhdHlwZSBpbiB0aGlzIHNjaGVtYSAoYm90aCBwcmltaXRpdmUgYW5kCi0gICAgICBkZXJpdmVkKSBjYW4gYmUgdW5pcXVlbHkgYWRkcmVzc2VkIHZpYSBhIFVSSSBjb25zdHJ1Y3RlZAotICAgICAgYXMgZm9sbG93czoKLSAgICAgICAgMSkgdGhlIGJhc2UgVVJJIGlzIHRoZSBVUkkgb2YgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlCi0gICAgICAgIDIpIHRoZSBmcmFnbWVudCBpZGVudGlmaWVyIGlzIHRoZSBuYW1lIG9mIHRoZSBkYXRhdHlwZQotCi0gICAgICBGb3IgZXhhbXBsZSwgdG8gYWRkcmVzcyB0aGUgaW50IGRhdGF0eXBlLCB0aGUgVVJJIGlzOgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludAotCi0gICAgICBBZGRpdGlvbmFsbHksIGVhY2ggZmFjZXQgZGVmaW5pdGlvbiBlbGVtZW50IGNhbiBiZSB1bmlxdWVseQotICAgICAgYWRkcmVzc2VkIHZpYSBhIFVSSSBjb25zdHJ1Y3RlZCBhcyBmb2xsb3dzOgotICAgICAgICAxKSB0aGUgYmFzZSBVUkkgaXMgdGhlIFVSSSBvZiB0aGUgWE1MIFNjaGVtYSBuYW1lc3BhY2UKLSAgICAgICAgMikgdGhlIGZyYWdtZW50IGlkZW50aWZpZXIgaXMgdGhlIG5hbWUgb2YgdGhlIGZhY2V0Ci0KLSAgICAgIEZvciBleGFtcGxlLCB0byBhZGRyZXNzIHRoZSBtYXhJbmNsdXNpdmUgZmFjZXQsIHRoZSBVUkkgaXM6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbWF4SW5jbHVzaXZlCi0KLSAgICAgIEFkZGl0aW9uYWxseSwgZWFjaCBmYWNldCB1c2FnZSBpbiBhIGJ1aWx0LWluIGRhdGF0eXBlIGRlZmluaXRpb24KLSAgICAgIGNhbiBiZSB1bmlxdWVseSBhZGRyZXNzZWQgdmlhIGEgVVJJIGNvbnN0cnVjdGVkIGFzIGZvbGxvd3M6Ci0gICAgICAgIDEpIHRoZSBiYXNlIFVSSSBpcyB0aGUgVVJJIG9mIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZQotICAgICAgICAyKSB0aGUgZnJhZ21lbnQgaWRlbnRpZmllciBpcyB0aGUgbmFtZSBvZiB0aGUgZGF0YXR5cGUsIGZvbGxvd2VkCi0gICAgICAgICAgIGJ5IGEgcGVyaW9kICgiLiIpIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIHRoZSBmYWNldAotCi0gICAgICBGb3IgZXhhbXBsZSwgdG8gYWRkcmVzcyB0aGUgdXNhZ2Ugb2YgdGhlIG1heEluY2x1c2l2ZSBmYWNldCBpbgotICAgICAgdGhlIGRlZmluaXRpb24gb2YgaW50LCB0aGUgVVJJIGlzOgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludC5tYXhJbmNsdXNpdmUKLQotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InN0cmluZyIgaWQ9InN0cmluZyI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jc3RyaW5nIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJwcmVzZXJ2ZSIgaWQ9InN0cmluZy5wcmVzZXJ2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJib29sZWFuIiBpZD0iYm9vbGVhbiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IiB2YWx1ZT0iZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNib29sZWFuIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJib29sZWFuLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZmxvYXQiIGlkPSJmbG9hdCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InRvdGFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIgdmFsdWU9ImZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNmbG9hdCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZmxvYXQud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkb3VibGUiIGlkPSJkb3VibGUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJ0b3RhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiIHZhbHVlPSJmaW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZG91YmxlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZG91YmxlLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZGVjaW1hbCIgaWQ9ImRlY2ltYWwiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0idG90YWxEaWdpdHMiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJmcmFjdGlvbkRpZ2l0cyIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0idG90YWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJkZWNpbWFsLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotCi0gICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkdXJhdGlvbiIgaWQ9ImR1cmF0aW9uIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2R1cmF0aW9uIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZHVyYXRpb24ud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkYXRlVGltZSIgaWQ9ImRhdGVUaW1lIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkYXRlVGltZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImRhdGVUaW1lLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idGltZSIgaWQ9InRpbWUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3RpbWUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJ0aW1lLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZGF0ZSIgaWQ9ImRhdGUiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImRhdGUud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJnWWVhck1vbnRoIiBpZD0iZ1llYXJNb250aCI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnWWVhck1vbnRoIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZ1llYXJNb250aC53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImdZZWFyIiBpZD0iZ1llYXIiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dZZWFyIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZ1llYXIud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImdNb250aERheSIgaWQ9ImdNb250aERheSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ01vbnRoRGF5Ii8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgZml4ZWQ9InRydWUiCi0gICAgICAgICAgICAgICAgaWQ9ImdNb250aERheS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImdEYXkiIGlkPSJnRGF5Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ0RheSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBpZD0iZ0RheS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0iZ01vbnRoIiBpZD0iZ01vbnRoIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ01vbnRoIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICAgICAgICAgIGlkPSJnTW9udGgud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iaGV4QmluYXJ5IiBpZD0iaGV4QmluYXJ5Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNiaW5hcnkiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImhleEJpbmFyeS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImJhc2U2NEJpbmFyeSIgaWQ9ImJhc2U2NEJpbmFyeSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNiYXNlNjRCaW5hcnkiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImJhc2U2NEJpbmFyeS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYW55VVJJIiBpZD0iYW55VVJJIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNhbnlVUkkiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJhbnlVUkkud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iUU5hbWUiIGlkPSJRTmFtZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNRTmFtZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9IlFOYW1lLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgIDx4czpzaW1wbGVUeXBlIG5hbWU9Ik5PVEFUSU9OIiBpZD0iTk9UQVRJT04iPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk9UQVRJT04iLz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgICBOT1RBVElPTiBjYW5ub3QgYmUgdXNlZCBkaXJlY3RseSBpbiBhIHNjaGVtYTsgcmF0aGVyIGEgdHlwZQotICAgICAgICBtdXN0IGJlIGRlcml2ZWQgZnJvbSBpdCBieSBzcGVjaWZ5aW5nIGF0IGxlYXN0IG9uZSBlbnVtZXJhdGlvbgotICAgICAgICBmYWNldCB3aG9zZSB2YWx1ZSBpcyB0aGUgbmFtZSBvZiBhIE5PVEFUSU9OIGRlY2xhcmVkIGluIHRoZQotICAgICAgICBzY2hlbWEuCi0gICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iTk9UQVRJT04ud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIE5vdyB0aGUgZGVyaXZlZCBwcmltaXRpdmUgdHlwZXMKLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJub3JtYWxpemVkU3RyaW5nIiBpZD0ibm9ybWFsaXplZFN0cmluZyI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNub3JtYWxpemVkU3RyaW5nIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9InJlcGxhY2UiCi0gICAgICAgIGlkPSJub3JtYWxpemVkU3RyaW5nLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idG9rZW4iIGlkPSJ0b2tlbiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN0b2tlbiIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9ybWFsaXplZFN0cmluZyI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiIGlkPSJ0b2tlbi53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Imxhbmd1YWdlIiBpZD0ibGFuZ3VhZ2UiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbGFuZ3VhZ2UiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgIDx4czpwYXR0ZXJuCi0gICAgICAgIHZhbHVlPSJbYS16QS1aXXsxLDh9KC1bYS16QS1aMC05XXsxLDh9KSoiCi0gICAgICAgICAgICAgICAgaWQ9Imxhbmd1YWdlLnBhdHRlcm4iPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCNOVC1MYW5ndWFnZUlEIj4KLSAgICAgICAgICAgIHBhdHRlcm4gc3BlY2lmaWVzIHRoZSBjb250ZW50IG9mIHNlY3Rpb24gMi4xMiBvZiBYTUwgMS4wZTIKLSAgICAgICAgICAgIGFuZCBSRkMgMzA2NiAoUmV2aXNlZCB2ZXJzaW9uIG9mIFJGQyAxNzY2KS4KLSAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDwveHM6cGF0dGVybj4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iSURSRUZTIiBpZD0iSURSRUZTIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0lEUkVGUyIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOklEUkVGIi8+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czptaW5MZW5ndGggdmFsdWU9IjEiIGlkPSJJRFJFRlMubWluTGVuZ3RoIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9IkVOVElUSUVTIiBpZD0iRU5USVRJRVMiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluTGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4TGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jRU5USVRJRVMiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpFTlRJVFkiLz4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOm1pbkxlbmd0aCB2YWx1ZT0iMSIgaWQ9IkVOVElUSUVTLm1pbkxlbmd0aCIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJOTVRPS0VOIiBpZD0iTk1UT0tFTiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOTVRPS0VOIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iXGMrIiBpZD0iTk1UT0tFTi5wYXR0ZXJuIj4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwjTlQtTm10b2tlbiI+Ci0gICAgICAgICAgICBwYXR0ZXJuIG1hdGNoZXMgcHJvZHVjdGlvbiA3IGZyb20gdGhlIFhNTCBzcGVjCi0gICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8L3hzOnBhdHRlcm4+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Ik5NVE9LRU5TIiBpZD0iTk1UT0tFTlMiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluTGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4TGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk1UT0tFTlMiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpOTVRPS0VOIi8+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czptaW5MZW5ndGggdmFsdWU9IjEiIGlkPSJOTVRPS0VOUy5taW5MZW5ndGgiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTmFtZSIgaWQ9Ik5hbWUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTmFtZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IlxpXGMqIiBpZD0iTmFtZS5wYXR0ZXJuIj4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCNOVC1OYW1lIj4KLSAgICAgICAgICAgIHBhdHRlcm4gbWF0Y2hlcyBwcm9kdWN0aW9uIDUgZnJvbSB0aGUgWE1MIHNwZWMKLSAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDwveHM6cGF0dGVybj4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTkNOYW1lIiBpZD0iTkNOYW1lIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05DTmFtZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TmFtZSI+Ci0gICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iW1xpLVs6XV1bXGMtWzpdXSoiIGlkPSJOQ05hbWUucGF0dGVybiI+Ci0gICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sLW5hbWVzLyNOVC1OQ05hbWUiPgotICAgICAgICAgICAgcGF0dGVybiBtYXRjaGVzIHByb2R1Y3Rpb24gNCBmcm9tIHRoZSBOYW1lc3BhY2VzIGluIFhNTCBzcGVjCi0gICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8L3hzOnBhdHRlcm4+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJJRCIgaWQ9IklEIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0lEIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOQ05hbWUiLz4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iSURSRUYiIGlkPSJJRFJFRiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNJRFJFRiIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIi8+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgIDx4czpzaW1wbGVUeXBlIG5hbWU9IkVOVElUWSIgaWQ9IkVOVElUWSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNFTlRJVFkiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5DTmFtZSIvPgotICAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImludGVnZXIiIGlkPSJpbnRlZ2VyIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2ludGVnZXIiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmRlY2ltYWwiPgotICAgICAgPHhzOmZyYWN0aW9uRGlnaXRzIHZhbHVlPSIwIiBmaXhlZD0idHJ1ZSIgaWQ9ImludGVnZXIuZnJhY3Rpb25EaWdpdHMiLz4KLSAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJbXC0rXT9bMC05XSsiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ibm9uUG9zaXRpdmVJbnRlZ2VyIiBpZD0ibm9uUG9zaXRpdmVJbnRlZ2VyIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25vblBvc2l0aXZlSW50ZWdlciIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aW50ZWdlciI+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIwIiBpZD0ibm9uUG9zaXRpdmVJbnRlZ2VyLm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJuZWdhdGl2ZUludGVnZXIiIGlkPSJuZWdhdGl2ZUludGVnZXIiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbmVnYXRpdmVJbnRlZ2VyIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpub25Qb3NpdGl2ZUludGVnZXIiPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iLTEiIGlkPSJuZWdhdGl2ZUludGVnZXIubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImxvbmciIGlkPSJsb25nIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiIHZhbHVlPSJmaW5pdGUiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2xvbmciLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludGVnZXIiPgotICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iLTkyMjMzNzIwMzY4NTQ3NzU4MDgiIGlkPSJsb25nLm1pbkluY2x1c2l2ZSIvPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iOTIyMzM3MjAzNjg1NDc3NTgwNyIgaWQ9ImxvbmcubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImludCIgaWQ9ImludCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNpbnQiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmxvbmciPgotICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iLTIxNDc0ODM2NDgiIGlkPSJpbnQubWluSW5jbHVzaXZlIi8+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIyMTQ3NDgzNjQ3IiBpZD0iaW50Lm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJzaG9ydCIgaWQ9InNob3J0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Nob3J0Ii8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnQiPgotICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iLTMyNzY4IiBpZD0ic2hvcnQubWluSW5jbHVzaXZlIi8+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIzMjc2NyIgaWQ9InNob3J0Lm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJieXRlIiBpZD0iYnl0ZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNieXRlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzaG9ydCI+Ci0gICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSItMTI4IiBpZD0iYnl0ZS5taW5JbmNsdXNpdmUiLz4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjEyNyIgaWQ9ImJ5dGUubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Im5vbk5lZ2F0aXZlSW50ZWdlciIgaWQ9Im5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNub25OZWdhdGl2ZUludGVnZXIiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludGVnZXIiPgotICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iMCIgaWQ9Im5vbk5lZ2F0aXZlSW50ZWdlci5taW5JbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idW5zaWduZWRMb25nIiBpZD0idW5zaWduZWRMb25nIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiIHZhbHVlPSJmaW5pdGUiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Vuc2lnbmVkTG9uZyIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjE4NDQ2NzQ0MDczNzA5NTUxNjE1IgotICAgICAgICBpZD0idW5zaWduZWRMb25nLm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ1bnNpZ25lZEludCIgaWQ9InVuc2lnbmVkSW50Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Vuc2lnbmVkSW50Ii8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp1bnNpZ25lZExvbmciPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iNDI5NDk2NzI5NSIKLSAgICAgICAgaWQ9InVuc2lnbmVkSW50Lm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ1bnNpZ25lZFNob3J0IiBpZD0idW5zaWduZWRTaG9ydCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZFNob3J0Ii8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp1bnNpZ25lZEludCI+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSI2NTUzNSIKLSAgICAgICAgaWQ9InVuc2lnbmVkU2hvcnQubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InVuc2lnbmVkQnl0ZSIgaWQ9InVuc2lnbmVkQnl0ZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZEJ5dGUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnVuc2lnbmVkU2hvcnQiPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMjU1IiBpZD0idW5zaWduZWRCeXRlLm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJwb3NpdGl2ZUludGVnZXIiIGlkPSJwb3NpdGl2ZUludGVnZXIiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jcG9zaXRpdmVJbnRlZ2VyIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiPgotICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iMSIgaWQ9InBvc2l0aXZlSW50ZWdlci5taW5JbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkZXJpdmF0aW9uQ29udHJvbCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBBIHV0aWxpdHkgdHlwZSwgbm90IGZvciBwdWJsaWMgdXNlPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3Vic3RpdHV0aW9uIi8+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuc2lvbiIvPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZXN0cmljdGlvbiIvPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJsaXN0Ii8+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVuaW9uIi8+Ci0gIDwveHM6cmVzdHJpY3Rpb24+Ci0gPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOmdyb3VwIG5hbWU9InNpbXBsZURlcml2YXRpb24iPgotICA8eHM6Y2hvaWNlPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6cmVzdHJpY3Rpb24iLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOmxpc3QiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOnVuaW9uIi8+Ci0gIDwveHM6Y2hvaWNlPgotIDwveHM6Z3JvdXA+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJzaW1wbGVEZXJpdmF0aW9uU2V0Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICNhbGwgb3IgKHBvc3NpYmx5IGVtcHR5KSBzdWJzZXQgb2Yge3Jlc3RyaWN0aW9uLCB1bmlvbiwgbGlzdH0KLSAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiNhbGwiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmRlcml2YXRpb25Db250cm9sIj4KLSAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJsaXN0Ii8+Ci0gICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idW5pb24iLz4KLSAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZXN0cmljdGlvbiIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDwveHM6dW5pb24+Ci0gPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaW1wbGVUeXBlIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpzaW1wbGVEZXJpdmF0aW9uIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmluYWwiIHR5cGU9InhzOnNpbXBsZURlcml2YXRpb25TZXQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiPgotICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIENhbiBiZSByZXN0cmljdGVkIHRvIHJlcXVpcmVkIG9yIGZvcmJpZGRlbgotICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0b3BMZXZlbFNpbXBsZVR5cGUiPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6c2ltcGxlRGVyaXZhdGlvbiIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiCi0gICAgICAgICAgICAgdHlwZT0ieHM6TkNOYW1lIj4KLSAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICBSZXF1aXJlZCBhdCB0aGUgdG9wIGxldmVsCi0gICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxTaW1wbGVUeXBlIj4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4czpncm91cCByZWY9InhzOnNpbXBsZURlcml2YXRpb24iLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InByb2hpYml0ZWQiPgotICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIEZvcmJpZGRlbiB3aGVuIG5lc3RlZAotICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmluYWwiIHVzZT0icHJvaGliaXRlZCIvPgotICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InNpbXBsZVR5cGUiIHR5cGU9InhzOnRvcExldmVsU2ltcGxlVHlwZSIgaWQ9InNpbXBsZVR5cGUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1zaW1wbGVUeXBlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmdyb3VwIG5hbWU9ImZhY2V0cyI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICBXZSBzaG91bGQgdXNlIGEgc3Vic3RpdHV0aW9uIGdyb3VwIGZvciBmYWNldHMsIGJ1dAotICAgICAgIHRoYXQncyBydWxlZCBvdXQgYmVjYXVzZSBpdCB3b3VsZCBhbGxvdyB1c2VycyB0bwotICAgICAgIGFkZCB0aGVpciBvd24sIHdoaWNoIHdlJ3JlIG5vdCByZWFkeSBmb3IgeWV0LgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpjaG9pY2U+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czptaW5FeGNsdXNpdmUiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOm1pbkluY2x1c2l2ZSIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6bWF4RXhjbHVzaXZlIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czptYXhJbmNsdXNpdmUiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOnRvdGFsRGlnaXRzIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpmcmFjdGlvbkRpZ2l0cyIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6bGVuZ3RoIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czptaW5MZW5ndGgiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOm1heExlbmd0aCIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6ZW51bWVyYXRpb24iLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOndoaXRlU3BhY2UiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOnBhdHRlcm4iLz4KLSAgIDwveHM6Y2hvaWNlPgotICA8L3hzOmdyb3VwPgotCi0gIDx4czpncm91cCBuYW1lPSJzaW1wbGVSZXN0cmljdGlvbk1vZGVsIj4KLSAgIDx4czpzZXF1ZW5jZT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgIDx4czpncm91cCByZWY9InhzOmZhY2V0cyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpncm91cD4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJyZXN0cmljdGlvbiIgaWQ9InJlc3RyaWN0aW9uIj4KLSAgIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1yZXN0cmljdGlvbiI+Ci0gICAgICAgICAgYmFzZSBhdHRyaWJ1dGUgYW5kIHNpbXBsZVR5cGUgY2hpbGQgYXJlIG11dHVhbGx5Ci0gICAgICAgICAgZXhjbHVzaXZlLCBidXQgb25lIG9yIG90aGVyIGlzIHJlcXVpcmVkCi0gICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6c2ltcGxlUmVzdHJpY3Rpb25Nb2RlbCIvPgotICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJiYXNlIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czplbGVtZW50IG5hbWU9Imxpc3QiIGlkPSJsaXN0Ij4KLSAgIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1saXN0Ij4KLSAgICAgICAgICBpdGVtVHlwZSBhdHRyaWJ1dGUgYW5kIHNpbXBsZVR5cGUgY2hpbGQgYXJlIG11dHVhbGx5Ci0gICAgICAgICAgZXhjbHVzaXZlLCBidXQgb25lIG9yIG90aGVyIGlzIHJlcXVpcmVkCi0gICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InNpbXBsZVR5cGUiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaXRlbVR5cGUiIHR5cGU9InhzOlFOYW1lIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idW5pb24iIGlkPSJ1bmlvbiI+Ci0gICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtdW5pb24iPgotICAgICAgICAgIG1lbWJlclR5cGVzIGF0dHJpYnV0ZSBtdXN0IGJlIG5vbi1lbXB0eSBvciB0aGVyZSBtdXN0IGJlCi0gICAgICAgICAgYXQgbGVhc3Qgb25lIHNpbXBsZVR5cGUgY2hpbGQKLSAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWVtYmVyVHlwZXMiIHVzZT0ib3B0aW9uYWwiPgotICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpRTmFtZSIvPgotICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJmYWNldCI+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZml4ZWQiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiCi0gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibm9GaXhlZEZhY2V0Ij4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmZhY2V0Ij4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpeGVkIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJtaW5FeGNsdXNpdmUiIGlkPSJtaW5FeGNsdXNpdmUiIHR5cGU9InhzOmZhY2V0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbWluRXhjbHVzaXZlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0gIDx4czplbGVtZW50IG5hbWU9Im1pbkluY2x1c2l2ZSIgaWQ9Im1pbkluY2x1c2l2ZSIgdHlwZT0ieHM6ZmFjZXQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1taW5JbmNsdXNpdmUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJtYXhFeGNsdXNpdmUiIGlkPSJtYXhFeGNsdXNpdmUiIHR5cGU9InhzOmZhY2V0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbWF4RXhjbHVzaXZlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0gIDx4czplbGVtZW50IG5hbWU9Im1heEluY2x1c2l2ZSIgaWQ9Im1heEluY2x1c2l2ZSIgdHlwZT0ieHM6ZmFjZXQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibnVtRmFjZXQiPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpmYWNldCI+Ci0gICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InRvdGFsRGlnaXRzIiBpZD0idG90YWxEaWdpdHMiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC10b3RhbERpZ2l0cyIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpudW1GYWNldCI+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnBvc2l0aXZlSW50ZWdlciIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZnJhY3Rpb25EaWdpdHMiIGlkPSJmcmFjdGlvbkRpZ2l0cyIgdHlwZT0ieHM6bnVtRmFjZXQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1mcmFjdGlvbkRpZ2l0cyIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czplbGVtZW50IG5hbWU9Imxlbmd0aCIgaWQ9Imxlbmd0aCIgdHlwZT0ieHM6bnVtRmFjZXQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1sZW5ndGgiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibWluTGVuZ3RoIiBpZD0ibWluTGVuZ3RoIiB0eXBlPSJ4czpudW1GYWNldCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LW1pbkxlbmd0aCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotICA8eHM6ZWxlbWVudCBuYW1lPSJtYXhMZW5ndGgiIGlkPSJtYXhMZW5ndGgiIHR5cGU9InhzOm51bUZhY2V0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbWF4TGVuZ3RoIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZW51bWVyYXRpb24iIGlkPSJlbnVtZXJhdGlvbiIgdHlwZT0ieHM6bm9GaXhlZEZhY2V0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtZW51bWVyYXRpb24iLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ3aGl0ZVNwYWNlIiBpZD0id2hpdGVTcGFjZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LXdoaXRlU3BhY2UiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZmFjZXQiPgotICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0gICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwcmVzZXJ2ZSIvPgotICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVwbGFjZSIvPgotICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY29sbGFwc2UiLz4KLSAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0icGF0dGVybiIgaWQ9InBhdHRlcm4iPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1wYXR0ZXJuIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vRml4ZWRGYWNldCI+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS9zcmMvemlwY29tcGFyZS96aXBjb21wYXJlL1ppcENvbXBhcmUuamF2YSBiL3YxL3NyYy96aXBjb21wYXJlL3ppcGNvbXBhcmUvWmlwQ29tcGFyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTZmYTk5Li4wMDAwMDAwCi0tLSBhL3YxL3NyYy96aXBjb21wYXJlL3ppcGNvbXBhcmUvWmlwQ29tcGFyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgemlwY29tcGFyZTsKLQotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFppcENvbXBhcmUKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICAgIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IHppcGNvbXBhcmUgW2ZpbGUxXSBbZmlsZTJdIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIFppcEZpbGUgZmlsZTE7Ci0gICAgICAgIHRyeSB7IGZpbGUxID0gbmV3IFppcEZpbGUoYXJnc1swXSk7IH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3Qgb3BlbiB6aXAgZmlsZSAiICsgYXJnc1swXSArICI6ICIgKyBlKTsgU3lzdGVtLmV4aXQoMSk7IHJldHVybjsgfQotCi0gICAgICAgIFppcEZpbGUgZmlsZTI7Ci0gICAgICAgIHRyeSB7IGZpbGUyID0gbmV3IFppcEZpbGUoYXJnc1sxXSk7IH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3Qgb3BlbiB6aXAgZmlsZSAiICsgYXJnc1swXSArICI6ICIgKyBlKTsgU3lzdGVtLmV4aXQoMSk7IHJldHVybjsgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29tcGFyaW5nICIgKyBhcmdzWzBdICsgIiB3aXRoICIgKyBhcmdzWzFdICsgIjoiKTsKLQotICAgICAgICBTZXQgc2V0MSA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGZpbGUxLmVudHJpZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKQotICAgICAgICAgICAgc2V0MS5hZGQoKChaaXBFbnRyeSllLm5leHRFbGVtZW50KCkpLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgU2V0IHNldDIgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBmaWxlMi5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7ICkKLSAgICAgICAgICAgIHNldDIuYWRkKCgoWmlwRW50cnkpZS5uZXh0RWxlbWVudCgpKS5nZXROYW1lKCkpOwotCi0gICAgICAgIGludCBlcnJjb3VudCA9IDA7Ci0gICAgICAgIGludCBmaWxlY291bnQgPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZXQxLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghc2V0Mi5jb250YWlucyhuYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSArICIgbm90IGZvdW5kIGluICIgKyBhcmdzWzFdKTsKLSAgICAgICAgICAgICAgICBlcnJjb3VudCArPSAxOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2V0Mi5yZW1vdmUobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1zRXF1YWwoZmlsZTEuZ2V0SW5wdXRTdHJlYW0oZmlsZTEuZ2V0RW50cnkobmFtZSkpLCBmaWxlMi5nZXRJbnB1dFN0cmVhbShmaWxlMi5nZXRFbnRyeShuYW1lKSkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5hbWUgKyAiIGRvZXMgbm90IG1hdGNoIik7Ci0gICAgICAgICAgICAgICAgICAgIGVycmNvdW50ICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSArICI6IElPIEVycm9yICIgKyBlKTsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIGVycmNvdW50ICs9IDE7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaWxlY291bnQgKz0gMTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZXQyLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuYW1lICsgIiBub3QgZm91bmQgaW4gIiArIGFyZ3NbMF0pOwotICAgICAgICAgICAgZXJyY291bnQgKz0gMTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmlsZWNvdW50ICsgIiBlbnRyaWVzIG1hdGNoZWQiKTsKLSAgICAgICAgaWYgKGVycmNvdW50ID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGVycmNvdW50ICsgIiBlbnRyaWVzIGRpZCBub3QgbWF0Y2giKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIHN0cmVhbXNFcXVhbChJbnB1dFN0cmVhbSBzdHJlYW0xLCBJbnB1dFN0cmVhbSBzdHJlYW0yKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJ5dGVbXSBidWYxID0gbmV3IGJ5dGVbNDA5Nl07Ci0gICAgICAgIGJ5dGVbXSBidWYyID0gbmV3IGJ5dGVbNDA5Nl07Ci0gICAgICAgIGJvb2xlYW4gZG9uZTEgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBkb25lMiA9IGZhbHNlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgIHdoaWxlICghZG9uZTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBvZmYxID0gMDsKLSAgICAgICAgICAgIGludCBvZmYyID0gMDsKLQotICAgICAgICAgICAgd2hpbGUgKG9mZjEgPCBidWYxLmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBzdHJlYW0xLnJlYWQoYnVmMSwgb2ZmMSwgYnVmMS5sZW5ndGggLSBvZmYxKTsKLSAgICAgICAgICAgICAgICBpZiAoY291bnQgPCAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZG9uZTEgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2ZmMSArPSBjb3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChvZmYyIDwgYnVmMi5sZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gc3RyZWFtMi5yZWFkKGJ1ZjIsIG9mZjIsIGJ1ZjIubGVuZ3RoIC0gb2ZmMik7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRvbmUyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9mZjIgKz0gY291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2ZmMSAhPSBvZmYyIHx8IGRvbmUxICE9IGRvbmUyKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2ZmMTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChidWYxW2ldICE9IGJ1ZjJbaV0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsgc3RyZWFtMS5jbG9zZSgpOyBzdHJlYW0yLmNsb3NlKCk7IH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL2VudW10ZXN0L3JlcG9ydDEueG1sIGIvdjEvdGVzdC9jYXNlcy9lbnVtdGVzdC9yZXBvcnQxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyNjhjYi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL2VudW10ZXN0L3JlcG9ydDEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08c3RhdHVzcmVwb3J0IHhtbG5zPSJodHRwOi8vb3BlbnVyaS5vcmcvZW51bXRlc3QiPgotICA8c3RhdHVzIG5hbWU9ImZpcnN0IiB0YXJnZXQ9ImFsbCI+YWxsPC9zdGF0dXM+Ci0gIDxzdGF0dXMgbmFtZT0ic2Vjb25kIiB0YXJnZXQ9ImFsbCI+ZmV3PC9zdGF0dXM+Ci0gIDxzdGF0dXMgbmFtZT0idGhpcmQiIHRhcmdldD0ibm9uZSI+bW9zdDwvc3RhdHVzPgotICA8c3RhdHVzIG5hbWU9ImZpcnN0IiB0YXJnZXQ9Im5vbmUiPm5vbmU8L3N0YXR1cz4KLTwvc3RhdHVzcmVwb3J0PgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9uYW1ld29ybGQvd29ybGQxLnhtbCBiL3YxL3Rlc3QvY2FzZXMvbmFtZXdvcmxkL3dvcmxkMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MjU2MWYuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9uYW1ld29ybGQvd29ybGQxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTxudzpuYW1ld29ybGQgeG1sbnM6bnc9Imh0dHA6Ly9vcGVudXJpLm9yZy9uYW1ld29ybGQiCi0gICAgICAgICAgICAgIHhtbG5zOmZvbz0iaHR0cDovL2Zvby5jb20vIgotICAgICAgICAgICAgICB4bWxuczpiYXI9Imh0dHA6Ly9iYXIuY29tLyI+Ci0KLSAgPG53OmlzbGFuZCB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9mb28uY29tLyI+Ci0gICAgPG53OmxvY2F0aW9uIG5hbWU9ImZvb2NpdHkiPgotICAgICAgPG53OnJlZmVyZW5jZSB0bz0iYmFyOmJhcmNpdHkiLz4KLSAgICAgIDxudzpyZWZlcmVuY2UgdG89ImZvbzpmb290b3duIi8+Ci0gICAgICA8bnc6cmVmZXJlbmNlIHRvPSJiYXI6YmFydmlsbGFnZSIvPgotICAgIDwvbnc6bG9jYXRpb24+Ci0gICAgPG53OmxvY2F0aW9uIG5hbWU9ImZvb3Rvd24iPgotICAgICAgPG53OnJlZmVyZW5jZSB0bz0iYmFyOmJhcnRvd24iLz4KLSAgICAgIDxudzpyZWZlcmVuY2UgdG89ImZvbzpmb292aWxsYWdlIi8+Ci0gICAgPC9udzpsb2NhdGlvbj4KLSAgICA8bnc6bG9jYXRpb24gbmFtZT0iZm9vdmlsbGFnZSI+Ci0gICAgICA8bnc6cmVmZXJlbmNlIHRvPSJiYXI6YmFydmlsbGFnZSIvPgotICAgIDwvbnc6bG9jYXRpb24+Ci0gIDwvbnc6aXNsYW5kPgotCi0gIDxudzppc2xhbmQgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYmFyLmNvbS8iPgotICAgIDxudzpsb2NhdGlvbiBuYW1lPSJiYXJjaXR5Ij4KLSAgICAgIDxudzpyZWZlcmVuY2UgdG89ImZvbzpmb29jaXR5Ii8+Ci0gICAgICA8bnc6cmVmZXJlbmNlIHRvPSJiYXI6YmFydG93biIvPgotICAgICAgPG53OnJlZmVyZW5jZSB0bz0iZm9vOmZvb3ZpbGxhZ2UiLz4KLSAgICA8L253OmxvY2F0aW9uPgotICAgIDxudzpsb2NhdGlvbiBuYW1lPSJiYXJ0b3duIj4KLSAgICAgIDxudzpyZWZlcmVuY2UgdG89ImZvbzpmb290b3duIi8+Ci0gICAgICA8bnc6cmVmZXJlbmNlIHRvPSJiYXI6YmFydmlsbGFnZSIvPgotICAgIDwvbnc6bG9jYXRpb24+Ci0gICAgPG53OmxvY2F0aW9uIG5hbWU9ImJhcnZpbGxhZ2UiPgotICAgICAgPG53OnJlZmVyZW5jZSB0bz0iZm9vOmZvb3ZpbGxhZ2UiLz4KLSAgICA8L253OmxvY2F0aW9uPgotICA8L253OmlzbGFuZD4KLTwvbnc6bmFtZXdvcmxkPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL1htbFNpZ25hdHVyZS9zaWduYXR1cmUtZXhhbXBsZS1kc2EueG1sIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3NpZ25hdHVyZS1leGFtcGxlLWRzYS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZWM0OTcuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3NpZ25hdHVyZS1leGFtcGxlLWRzYS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPFNpZ25hdHVyZSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+Ci0gIDxTaWduZWRJbmZvPgotICAgIDxDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiIC8+Ci0gICAgPFNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNkc2Etc2hhMSIgLz4KLSAgICA8UmVmZXJlbmNlIFVSST0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQiPgotICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgotICAgICAgPERpZ2VzdFZhbHVlPjYwTnZadnRkVEIrN1VubExwL0gyNHA3aDRicz08L0RpZ2VzdFZhbHVlPgotICAgIDwvUmVmZXJlbmNlPgotICA8L1NpZ25lZEluZm8+Ci0gIDxTaWduYXR1cmVWYWx1ZT4KLSAgICBxVUFERE1IWmt5ZWJ2UmRMcys2RHY3UnZnTUxSbFVhREI0UTl5bjlYb0pBNzlhMjg4MmZmVGc9PQotICA8L1NpZ25hdHVyZVZhbHVlPgotICA8S2V5SW5mbz4KLSAgICA8S2V5VmFsdWU+Ci0gICAgICA8RFNBS2V5VmFsdWU+Ci0gICAgICAgIDxQPgotICAgICAgICAgIDJpWTN3MDYyc0RCMy9ESWxMV09lRzkrNFVwbURaMGR5cVJrOWRMbE5RNnFhWEk3dE9yamRJaG02bi9lT3c0NUEKLSAgICAgICAgICBRdHVZU3A2c3BDdDljUWNOQkFqMjJLdnlndmZKSUlYWDlzU1FydWdmR3FpZmVTdlkzVlg1U2Qxait6ME1TWi9uCi0gICAgICAgICAgNWpOdDg4dWgyQzExU0FxWDZuclhUWS8xUndrb1dSTjIzU1loT2xhRzBoVT0KLSAgICAgICAgPC9QPgotICAgICAgICA8UT4KLSAgICAgICAgICA5QjV5cExZOXBNT210eENlVERIZ3dkTkZlR3M9Ci0gICAgICAgIDwvUT4KLSAgICAgICAgPEc+Ci0gICAgICAgICAgTXVHQWxxZUIxYXgrdnlPMitPc3ViamhsN3BIeEx1NDdSSUgrL001MkRqRVNBOUtNU3J3enNZeDh5TlIyV29vQgotICAgICAgICAgIHlyRTB0NmZ1MFZuY0s3VUs4b2xPNHQ3d3B2Mno0QUZRUFJWQ0tGd28wcWduNWFLSWtJQ0dNbHJSeTgxYXZiMjcKLSAgICAgICAgICB3R2NXb3RoeDNpUFBNdEZYdG9EcUswSkl0YUk5Ujh6YzFtc0ZoTTFHS01ZPQotICAgICAgICA8L0c+Ci0gICAgICAgIDxZPgotICAgICAgICAgIGN0QThZR3hydG5nZy96S1Z2cUVPZWZud21WaUZ6dGNuUEJZUGxKc3ZoNnlLSTRpRG02OGZucDRNaTNScko2YloKLSAgICAgICAgICBBeWdGclVJUUx4TGpWK09KdGdKQUV0bzB4QXMrTWVodXExRGtTRkVwUDNvRHpDVE9zck9pUzFEd1FlNG9JYjd6Ci0gICAgICAgICAgVmsvOWw3YVB0Sk1IVzBMVmxNZHdaTkZOTkpvcU1jVDJaZkNQcmZ2WXZRMD0KLSAgICAgICAgPC9ZPgotICAgICAgPC9EU0FLZXlWYWx1ZT4KLSAgICA8L0tleVZhbHVlPgotICAgIDxYNTA5RGF0YT4KLSAgICAgIDxYNTA5U3ViamVjdE5hbWU+Ci0gICAgICAgIENOPU1lcmxpbiBIdWdoZXMsTz1CYWx0aW1vcmUgVGVjaG5vbG9naWVzXCwgTHRkLixTVD1EdWJsaW4sQz1JRQotICAgICAgPC9YNTA5U3ViamVjdE5hbWU+Ci0gICAgICA8WDUwOUlzc3VlclNlcmlhbD4KLSAgICAgICAgPFg1MDlJc3N1ZXJOYW1lPgotICAgICAgICAgIENOPVRlc3QgRFNBIENBLE89QmFsdGltb3JlIFRlY2hub2xvZ2llc1wsIEx0ZC4sU1Q9RHVibGluLEM9SUUKLSAgICAgICAgPC9YNTA5SXNzdWVyTmFtZT4KLSAgICAgICAgPFg1MDlTZXJpYWxOdW1iZXI+OTcwODQ5OTM2PC9YNTA5U2VyaWFsTnVtYmVyPgotICAgICAgPC9YNTA5SXNzdWVyU2VyaWFsPgotICAgICAgPFg1MDlDZXJ0aWZpY2F0ZT4KLSAgICAgICAgTUlJRE56Q0NBdldnQXdJQkFnSUVPZDMra0RBSkJnY3Foa2pPT0FRRE1Gc3hDekFKQmdOVkJBWVRBa2xGTVE4dwotICAgICAgICBEUVlEVlFRSUV3WkVkV0pzYVc0eEpUQWpCZ05WQkFvVEhFSmhiSFJwYlc5eVpTQlVaV05vYm05c2IyZHBaWE1zCi0gICAgICAgIElFeDBaQzR4RkRBU0JnTlZCQU1UQzFSbGMzUWdSRk5CSUVOQk1CNFhEVEF3TVRBd05qRTJNekl4TlZvWERUQXgKLSAgICAgICAgTVRBd05qRTJNekl4TkZvd1hURUxNQWtHQTFVRUJoTUNTVVV4RHpBTkJnTlZCQWdUQmtSMVlteHBiakVsTUNNRwotICAgICAgICBBMVVFQ2hNY1FtRnNkR2x0YjNKbElGUmxZMmh1YjJ4dloybGxjeXdnVEhSa0xqRVdNQlFHQTFVRUF4TU5UV1Z5Ci0gICAgICAgIGJHbHVJRWgxWjJobGN6Q0NBYll3Z2dFckJnY3Foa2pPT0FRQk1JSUJIZ0tCZ1FEYUpqZkRUcmF3TUhmOE1pVXQKLSAgICAgICAgWTU0YjM3aFNtWU5uUjNLcEdUMTB1VTFEcXBwY2p1MDZ1TjBpR2JxZjk0N0Rqa0JDMjVoS25xeWtLMzF4QncwRQotICAgICAgICBDUGJZcS9LQzk4a2doZGYyeEpDdTZCOGFxSjk1SzlqZFZmbEozV1A3UFF4Sm4rZm1NMjN6eTZIWUxYVklDcGZxCi0gICAgICAgIGV0ZE5qL1ZIQ1NoWkUzYmRKaUU2Vm9iU0ZRSVZBUFFlY3FTMlBhVERwcmNRbmt3eDRNSFRSWGhyQW9HQU11R0EKLSAgICAgICAgbHFlQjFheCt2eU8yK09zdWJqaGw3cEh4THU0N1JJSCsvTTUyRGpFU0E5S01Tcnd6c1l4OHlOUjJXb29CeXJFMAotICAgICAgICB0NmZ1MFZuY0s3VUs4b2xPNHQ3d3B2Mno0QUZRUFJWQ0tGd28wcWduNWFLSWtJQ0dNbHJSeTgxYXZiMjd3R2NXCi0gICAgICAgIG90aHgzaVBQTXRGWHRvRHFLMEpJdGFJOVI4emMxbXNGaE0xR0tNWURnWVFBQW9HQWN0QThZR3hydG5nZy96S1YKLSAgICAgICAgdnFFT2VmbndtVmlGenRjblBCWVBsSnN2aDZ5S0k0aURtNjhmbnA0TWkzUnJKNmJaQXlnRnJVSVFMeExqVitPSgotICAgICAgICB0Z0pBRXRvMHhBcytNZWh1cTFEa1NGRXBQM29EekNUT3NyT2lTMUR3UWU0b0liN3pWay85bDdhUHRKTUhXMExWCi0gICAgICAgIGxNZHdaTkZOTkpvcU1jVDJaZkNQcmZ2WXZRMmpSekJGTUI0R0ExVWRFUVFYTUJXQkUyMWxjbXhwYmtCaVlXeDAKLSAgICAgICAgYVcxdmNtVXVhV1V3RGdZRFZSMFBBUUgvQkFRREFnZUFNQk1HQTFVZEl3UU1NQXFBQ0VKWlFHMEt3UmJQTUFrRwotICAgICAgICBCeXFHU000NEJBTURNUUF3TGdJVkFLNHNrV0VGWWdyZ2dhSkE4dllBd1NqZzEyK0tBaFVBd0hUbzd3ZDR0RU53Ci0gICAgICAgIDlMQUtQa2xRLzc0ZkgxOD0KLSAgICAgIDwvWDUwOUNlcnRpZmljYXRlPgotICAgIDwvWDUwOURhdGE+Ci0gIDwvS2V5SW5mbz4KLTwvU2lnbmF0dXJlPgotCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9YbWxTaWduYXR1cmUvc2lnbmF0dXJlLWV4YW1wbGUtcnNhLnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL1htbFNpZ25hdHVyZS9zaWduYXR1cmUtZXhhbXBsZS1yc2EueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTg0NDU5Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL1htbFNpZ25hdHVyZS9zaWduYXR1cmUtZXhhbXBsZS1yc2EueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgotICA8U2lnbmVkSW5mbz4KLSAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPgotICAgIDxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiIC8+Ci0gICAgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0Ij4KLSAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KLSAgICAgIDxEaWdlc3RWYWx1ZT42ME52WnZ0ZFRCKzdVbmxMcC9IMjRwN2g0YnM9PC9EaWdlc3RWYWx1ZT4KLSAgICA8L1JlZmVyZW5jZT4KLSAgPC9TaWduZWRJbmZvPgotICA8U2lnbmF0dXJlVmFsdWU+Ci0gICAganVTNVJoSjg4NHFvRlI4ZmxWWGQvcmJyU0RWR240MENhcGdCN3FlUWlUK3JyME5la0VRNkJIaFVBOGRUMytCQwotICAgIFRCVVFJMGRCamxtbDlsd3pFTlh2UzgzelJFQ2p6WGJNUlRVdFZaaVBaRzJwcUtQbkwyWVUzQTk2NDVVQ2pUWFUKLSAgICAramdGdW12N2s3OGhpZUFHRHpOY2krUFE5S1JtbS8vaWNUN0phWXp0Z3Q0PQotICA8L1NpZ25hdHVyZVZhbHVlPgotICA8S2V5SW5mbz4KLSAgICA8S2V5VmFsdWU+Ci0gICAgICA8UlNBS2V5VmFsdWU+Ci0gICAgICAgIDxNb2R1bHVzPgotICAgICAgICAgIHVDaXVrcGdPYU9tcnExZlBVVEgzQ0FYeHVGbVBqc21TNGpuVEt4cnYwdzFKS2NYdEoyTTNha2FWMWQva2FydkoKLSAgICAgICAgICBsbWVhbzIwak55OXIrL3ZLd2liak03N0YrM2JJa2VNRUdtQUlVbkZjaUprUitpaE83YjRjVHVZbkVpOHhIdHU0Ci0gICAgICAgICAgaU1uNkdPREJvRXpxRlFZZGQ4cDR2clpCc3ZzNDRuVHJTOHF5eWhiYTY0OD0KLSAgICAgICAgPC9Nb2R1bHVzPgotICAgICAgICA8RXhwb25lbnQ+Ci0gICAgICAgICAgQVFBQgotICAgICAgICA8L0V4cG9uZW50PgotICAgICAgPC9SU0FLZXlWYWx1ZT4KLSAgICA8L0tleVZhbHVlPgotICAgIDxYNTA5RGF0YT4KLSAgICAgIDxYNTA5U3ViamVjdE5hbWU+Ci0gICAgICAgIENOPU1lcmxpbiBIdWdoZXMsTz1CYWx0aW1vcmUgVGVjaG5vbG9naWVzXCwgTHRkLixTVD1EdWJsaW4sQz1JRQotICAgICAgPC9YNTA5U3ViamVjdE5hbWU+Ci0gICAgICA8WDUwOUlzc3VlclNlcmlhbD4KLSAgICAgICAgPFg1MDlJc3N1ZXJOYW1lPgotICAgICAgICAgIENOPVRlc3QgUlNBIENBLE89QmFsdGltb3JlIFRlY2hub2xvZ2llc1wsIEx0ZC4sU1Q9RHVibGluLEM9SUUKLSAgICAgICAgPC9YNTA5SXNzdWVyTmFtZT4KLSAgICAgICAgPFg1MDlTZXJpYWxOdW1iZXI+OTcwODQ5OTI4PC9YNTA5U2VyaWFsTnVtYmVyPgotICAgICAgPC9YNTA5SXNzdWVyU2VyaWFsPgotICAgICAgPFg1MDlDZXJ0aWZpY2F0ZT4KLSAgICAgICAgTUlJQ2VEQ0NBZUdnQXdJQkFnSUVPZDMraURBTkJna3Foa2lHOXcwQkFRUUZBREJiTVFzd0NRWURWUVFHRXdKSgotICAgICAgICBSVEVQTUEwR0ExVUVDQk1HUkhWaWJHbHVNU1V3SXdZRFZRUUtFeHhDWVd4MGFXMXZjbVVnVkdWamFHNXZiRzluCi0gICAgICAgIGFXVnpMQ0JNZEdRdU1SUXdFZ1lEVlFRREV3dFVaWE4wSUZKVFFTQkRRVEFlRncwd01ERXdNRFl4TmpNeU1EZGEKLSAgICAgICAgRncwd01URXdNRFl4TmpNeU1EUmFNRjB4Q3pBSkJnTlZCQVlUQWtsRk1ROHdEUVlEVlFRSUV3WkVkV0pzYVc0eAotICAgICAgICBKVEFqQmdOVkJBb1RIRUpoYkhScGJXOXlaU0JVWldOb2JtOXNiMmRwWlhNc0lFeDBaQzR4RmpBVUJnTlZCQU1UCi0gICAgICAgIERVMWxjbXhwYmlCSWRXZG9aWE13Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQUxnb3JwS1kKLSAgICAgICAgRG1qcHE2dFh6MUV4OXdnRjhiaFpqNDdKa3VJNTB5c2E3OU1OU1NuRjdTZGpOMnBHbGRYZjVHcTd5WlpubXFOdAotICAgICAgICBJemN2YS92N3lzSW00ek8reGZ0MnlKSGpCQnBnQ0ZKeFhJaVpFZm9vVHUyK0hFN21KeEl2TVI3YnVJakoraGpnCi0gICAgICAgIHdhQk02aFVHSFhmS2VMNjJRYkw3T09KMDYwdktzc29XMnV1UEFnTUJBQUdqUnpCRk1CNEdBMVVkRVFRWE1CV0IKLSAgICAgICAgRTIxbGNteHBia0JpWVd4MGFXMXZjbVV1YVdVd0RnWURWUjBQQVFIL0JBUURBZ2VBTUJNR0ExVWRJd1FNTUFxQQotICAgICAgICBDRW5nclpJVmd1MDNNQTBHQ1NxR1NJYjNEUUVCQkFVQUE0R0JBSEp1NEpWcS9XblhLMm9xcWZMV3FlczV2SE90Ci0gICAgICAgIGZYL1poQ2pGeURNaHpzbEk4YW02MmdaZWR3WjlJSVpJd2xOUk12RURRQjJ6ZHMvZUVCbklBUVBsL3lSTENMT2YKLSAgICAgICAgWm5iQThQWHJiRlA1aWdzM3FRV1NjQlVqWlZqaWs3NDhIVTJzVVZaT2E5MGMwbUpsMnZKcy9Sd3lMVzcvdUNBZgotICAgICAgICBDL0kvazl4R3I3Zm5lb0lXCi0gICAgICA8L1g1MDlDZXJ0aWZpY2F0ZT4KLSAgICA8L1g1MDlEYXRhPgotICA8L0tleUluZm8+Ci08L1NpZ25hdHVyZT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3NpZ25hdHVyZS1leGFtcGxlLnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL1htbFNpZ25hdHVyZS9zaWduYXR1cmUtZXhhbXBsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YTY5OTQuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3NpZ25hdHVyZS1leGFtcGxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCFET0NUWVBFIFNpZ25hdHVyZSBTWVNURU0gInhtbGRzaWctY29yZS1zY2hlbWEuZHRkIiBbCi08IUVOVElUWSBkc2lnICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KLSAgIDwhRU5USVRZICUgU2lnbmF0dXJlUHJvcGVydHkuQU5ZICd8IHRzOnRpbWVzdGFtcCc+Ci0gICA8IUVMRU1FTlQgdHM6dGltZXN0YW1wICgjUENEQVRBKT4KLSAgIDwhQVRUTElTVCB0czp0aW1lc3RhbXAKLSAgICAgICAgICAgICB4bWxuczp0cwlDREFUQQkjRklYRUQgICAnaHR0cDovL3d3dy5leGFtcGxlLm9yZy9yZmMvcmZjeHh4eC50eHQnPgotICAgPCFBVFRMSVNUIFNpZ25hdHVyZQotICAgICAgICAgICAgIHhtbG5zOnhzaSAgQ0RBVEEgI0ZJWEVEICAgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJwotICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbglDREFUQQkjUkVRVUlSRUQ+Ci1dPgotPFNpZ25hdHVyZSBJZD0iTXlGaXJzdFNpZ25hdHVyZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiCi0gICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjCi0gICB4bWxkc2lnLWNvcmUtc2NoZW1hLnhzZCI+Ci0gIDxTaWduZWRJbmZvPiAKLQkgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1dELXhtbC1jMTRuLTIwMDAwNzEwIj4KLQkgPC9DYW5vbmljYWxpemF0aW9uTWV0aG9kPgotCSA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2RzYSI+Ci0JIDwvU2lnbmF0dXJlTWV0aG9kPgotCSA8UmVmZXJlbmNlIFVSST0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQvIj4gCi0JCTxUcmFuc2Zvcm1zPiAKLQkJICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2Jhc2U2NCIvPgotCQkgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjbnVsbCIvPgotCQk8L1RyYW5zZm9ybXM+IAotCQk8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiPiAKLQkJPC9EaWdlc3RNZXRob2Q+Ci0JCTxEaWdlc3RWYWx1ZT5qNmx3eDNydkVQTzB2S3RNdXA0TmJlVnU4bms9PC9EaWdlc3RWYWx1ZT4gCi0JIDwvUmVmZXJlbmNlPiAKLQkgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwtbmFtZXMvIj4gCi0JCTxUcmFuc2Zvcm1zPiAKLQkJICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2Jhc2U2NCIvPiAKLQkJPC9UcmFuc2Zvcm1zPiAKLQkJPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIj4gCi0JCTwvRGlnZXN0TWV0aG9kPgotCQk8RGlnZXN0VmFsdWU+VXJYTERMQkl0YTZza29WNS9BOFEzOEdFdzQ0PTwvRGlnZXN0VmFsdWU+IAotCSA8L1JlZmVyZW5jZT4gCSAKLSAgPC9TaWduZWRJbmZvPiAKLSAgPFNpZ25hdHVyZVZhbHVlPk1DMENGRnJWTHRSbGtNYzNEYW9uNEJxcW5raENPbEVhQWhVQWs4cEgxaVJOSytxMUkrc2lzRFR6MlRGRUFMRT08L1NpZ25hdHVyZVZhbHVlPiAKLSAgPEtleUluZm8+Ci0gICAgPEtleVZhbHVlPgotICAgICAgPERTQUtleVZhbHVlPgotICAgICAgICA8UD4uLi48L1A+PFE+Li4uPC9RPjxHPi4uLjwvRz48WT4uLi48L1k+Ci0gICAgICA8L0RTQUtleVZhbHVlPiAKLSAgICA8L0tleVZhbHVlPiAKLSAgPC9LZXlJbmZvPgotICA8T2JqZWN0PgotICAgICA8U2lnbmF0dXJlUHJvcGVydGllcz4KLSAgICAgICAgPFNpZ25hdHVyZVByb3BlcnR5IFRhcmdldD0iI015Rmlyc3RTaWduYXR1cmUiPgotICAgICAgICAgIDx0czp0aW1lc3RhbXAgeG1sbnM6dHM9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvcmZjL3JmY3h4eHgudHh0Ij4KLSAgICAgICAgICAgdGhpcyBpcyBhIHRlc3Qgb2YgdGhlIG1peGVkIGNvbnRlbnQgbW9kZWw8L3RzOnRpbWVzdGFtcD4KLSAgICAgICAgPC9TaWduYXR1cmVQcm9wZXJ0eT4KLSAgICAgIDwvU2lnbmF0dXJlUHJvcGVydGllcz4KLSAgPC9PYmplY3Q+Ci08L1NpZ25hdHVyZT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL1htbFNpZ25hdHVyZS94a21zLTEuMC53c2RsIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3hrbXMtMS4wLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MDg3YWQuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3hrbXMtMS4wLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2ODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotDQotPGRlZmluaXRpb25zIG5hbWU9IlhNTEtleU1hbmFnZW1lbnQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0geG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9YTUxTY2hlbWEiDQotIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iDQotIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iDQotIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIA0KLSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyINCi0geG1sbnM6eGttcz0iaHR0cDovL3d3dy54a21zLm9yZy9zY2hlbWEveGttcy0yMDAxLTAxLTIwIg0KLSB4bWxuczp0bnM9Imh0dHA6Ly93d3cueGttcy5vcmcvc2NoZW1hL3hrbXMtMjAwMS0wMS0yMCINCi0gdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnhrbXMub3JnL3NjaGVtYS94a21zLTIwMDEtMDEtMjAiPg0KLQ0KLSAgPHR5cGVzPg0KLQ0KLTxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiDQotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiDQotICAgICAgICB2ZXJzaW9uPSIwLjEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4gDQotDQotPCEtLSBCYXNpYyBUeXBlcyBEZWZpbmVkIGZvciBTaWduYXR1cmVzIC0tPg0KLQ0KLTxzaW1wbGVUeXBlIG5hbWU9IkNyeXB0b0JpbmFyeSI+DQotICA8cmVzdHJpY3Rpb24gYmFzZT0iYmFzZTY0QmluYXJ5Ij4NCi0gIDwvcmVzdHJpY3Rpb24+DQotPC9zaW1wbGVUeXBlPg0KLQ0KLTwhLS0gU3RhcnQgU2lnbmF0dXJlIC0tPg0KLQ0KLTxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZSIgdHlwZT0iZHM6U2lnbmF0dXJlVHlwZSIvPg0KLTxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVUeXBlIj4NCi0gIDxzZXF1ZW5jZT4gDQotICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmVkSW5mbyIvPiANCi0gICAgPGVsZW1lbnQgcmVmPSJkczpTaWduYXR1cmVWYWx1ZSIvPiANCi0gICAgPGVsZW1lbnQgcmVmPSJkczpLZXlJbmZvIiBtaW5PY2N1cnM9IjAiLz4gDQotICAgIDxlbGVtZW50IHJlZj0iZHM6T2JqZWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+IA0KLSAgPC9zZXF1ZW5jZT4gIA0KLSAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4NCi08L2NvbXBsZXhUeXBlPg0KLQ0KLSAgPGVsZW1lbnQgbmFtZT0iU2lnbmF0dXJlVmFsdWUiIHR5cGU9ImRzOlNpZ25hdHVyZVZhbHVlVHlwZSIvPiANCi0gIDxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVWYWx1ZVR5cGUiPg0KLSAgICA8c2ltcGxlQ29udGVudD4NCi0gICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImJhc2U2NEJpbmFyeSI+DQotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPg0KLSAgICAgIDwvZXh0ZW5zaW9uPg0KLSAgICA8L3NpbXBsZUNvbnRlbnQ+DQotICA8L2NvbXBsZXhUeXBlPg0KLQ0KLTwhLS0gU3RhcnQgU2lnbmVkSW5mbyAtLT4NCi0NCi08ZWxlbWVudCBuYW1lPSJTaWduZWRJbmZvIiB0eXBlPSJkczpTaWduZWRJbmZvVHlwZSIvPg0KLTxjb21wbGV4VHlwZSBuYW1lPSJTaWduZWRJbmZvVHlwZSI+DQotICA8c2VxdWVuY2U+IA0KLSAgICA8ZWxlbWVudCByZWY9ImRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QiLz4gDQotICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmF0dXJlTWV0aG9kIi8+IA0KLSAgICA8ZWxlbWVudCByZWY9ImRzOlJlZmVyZW5jZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gDQotICA8L3NlcXVlbmNlPiAgDQotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiANCi08L2NvbXBsZXhUeXBlPg0KLQ0KLSAgPGVsZW1lbnQgbmFtZT0iQ2Fub25pY2FsaXphdGlvbk1ldGhvZCIgdHlwZT0iZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUiLz4gDQotICA8Y29tcGxleFR5cGUgbmFtZT0iQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUiIG1peGVkPSJ0cnVlIj4NCi0gICAgPHNlcXVlbmNlPg0KLSAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI2FueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgIDwhLS0gKDAsdW5ib3VuZGVkKSBlbGVtZW50cyBmcm9tICgxLDEpIG5hbWVzcGFjZSAtLT4NCi0gICAgPC9zZXF1ZW5jZT4NCi0gICAgPGF0dHJpYnV0ZSBuYW1lPSJBbGdvcml0aG0iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPiANCi0gIDwvY29tcGxleFR5cGU+DQotDQotICA8ZWxlbWVudCBuYW1lPSJTaWduYXR1cmVNZXRob2QiIHR5cGU9ImRzOlNpZ25hdHVyZU1ldGhvZFR5cGUiLz4NCi0gIDxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVNZXRob2RUeXBlIiBtaXhlZD0idHJ1ZSI+DQotICAgIDxzZXF1ZW5jZT4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJITUFDT3V0cHV0TGVuZ3RoIiBtaW5PY2N1cnM9IjAiIHR5cGU9ImRzOkhNQUNPdXRwdXRMZW5ndGhUeXBlIi8+DQotICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICA8IS0tICgwLHVuYm91bmRlZCkgZWxlbWVudHMgZnJvbSAoMSwxKSBleHRlcm5hbCBuYW1lc3BhY2UgLS0+DQotICAgIDwvc2VxdWVuY2U+DQotICAgIDxhdHRyaWJ1dGUgbmFtZT0iQWxnb3JpdGhtIiB0eXBlPSJhbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4gDQotICA8L2NvbXBsZXhUeXBlPg0KLQ0KLTwhLS0gU3RhcnQgUmVmZXJlbmNlIC0tPg0KLQ0KLTxlbGVtZW50IG5hbWU9IlJlZmVyZW5jZSIgdHlwZT0iZHM6UmVmZXJlbmNlVHlwZSIvPg0KLTxjb21wbGV4VHlwZSBuYW1lPSJSZWZlcmVuY2VUeXBlIj4NCi0gIDxzZXF1ZW5jZT4gDQotICAgIDxlbGVtZW50IHJlZj0iZHM6VHJhbnNmb3JtcyIgbWluT2NjdXJzPSIwIi8+IA0KLSAgICA8ZWxlbWVudCByZWY9ImRzOkRpZ2VzdE1ldGhvZCIvPiANCi0gICAgPGVsZW1lbnQgcmVmPSJkczpEaWdlc3RWYWx1ZSIvPiANCi0gIDwvc2VxdWVuY2U+DQotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiANCi0gIDxhdHRyaWJ1dGUgbmFtZT0iVVJJIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4gDQotICA8YXR0cmlidXRlIG5hbWU9IlR5cGUiIHR5cGU9ImFueVVSSSIgdXNlPSJvcHRpb25hbCIvPiANCi08L2NvbXBsZXhUeXBlPg0KLQ0KLSAgPGVsZW1lbnQgbmFtZT0iVHJhbnNmb3JtcyIgdHlwZT0iZHM6VHJhbnNmb3Jtc1R5cGUiLz4NCi0gIDxjb21wbGV4VHlwZSBuYW1lPSJUcmFuc2Zvcm1zVHlwZSI+DQotICAgIDxzZXF1ZW5jZT4NCi0gICAgICA8ZWxlbWVudCByZWY9ImRzOlRyYW5zZm9ybSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gIA0KLSAgICA8L3NlcXVlbmNlPg0KLSAgPC9jb21wbGV4VHlwZT4NCi0NCi0gIDxlbGVtZW50IG5hbWU9IlRyYW5zZm9ybSIgdHlwZT0iZHM6VHJhbnNmb3JtVHlwZSIvPg0KLSAgPGNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zZm9ybVR5cGUiIG1peGVkPSJ0cnVlIj4NCi0gICAgPGNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4gDQotICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+DQotICAgICAgPCEtLSAoMSwxKSBlbGVtZW50cyBmcm9tICgwLHVuYm91bmRlZCkgbmFtZXNwYWNlcyAtLT4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJYUGF0aCIgdHlwZT0ic3RyaW5nIi8+IA0KLSAgICA8L2Nob2ljZT4NCi0gICAgPGF0dHJpYnV0ZSBuYW1lPSJBbGdvcml0aG0iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPiANCi0gIDwvY29tcGxleFR5cGU+DQotDQotPCEtLSBFbmQgUmVmZXJlbmNlIC0tPg0KLQ0KLTxlbGVtZW50IG5hbWU9IkRpZ2VzdE1ldGhvZCIgdHlwZT0iZHM6RGlnZXN0TWV0aG9kVHlwZSIvPg0KLTxjb21wbGV4VHlwZSBuYW1lPSJEaWdlc3RNZXRob2RUeXBlIiBtaXhlZD0idHJ1ZSI+IA0KLSAgPHNlcXVlbmNlPg0KLSAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gIDwvc2VxdWVuY2U+ICAgIA0KLSAgPGF0dHJpYnV0ZSBuYW1lPSJBbGdvcml0aG0iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPiANCi08L2NvbXBsZXhUeXBlPg0KLQ0KLTxlbGVtZW50IG5hbWU9IkRpZ2VzdFZhbHVlIiB0eXBlPSJkczpEaWdlc3RWYWx1ZVR5cGUiLz4NCi08c2ltcGxlVHlwZSBuYW1lPSJEaWdlc3RWYWx1ZVR5cGUiPg0KLSAgPHJlc3RyaWN0aW9uIGJhc2U9ImJhc2U2NEJpbmFyeSIvPg0KLTwvc2ltcGxlVHlwZT4NCi0NCi08IS0tIEVuZCBTaWduZWRJbmZvIC0tPg0KLQ0KLTwhLS0gU3RhcnQgS2V5SW5mbyAtLT4NCi0NCi08ZWxlbWVudCBuYW1lPSJLZXlJbmZvIiB0eXBlPSJkczpLZXlJbmZvVHlwZSIvPiANCi0NCi08Y29tcGxleFR5cGUgbmFtZT0iS2V5SW5mb1R5cGUiIG1peGVkPSJ0cnVlIj4NCi0gIDxzZXF1ZW5jZT4NCi08IS0tICAgIDxlbGVtZW50IHJlZj0iZHM6S2V5TmFtZSIvPiAgICAgLS0+DQotICAgIDxlbGVtZW50IHJlZj0iZHM6S2V5TmFtZSIvPg0KLSAgICA8ZWxlbWVudCByZWY9ImRzOktleVZhbHVlIi8+IA0KLSAgICA8ZWxlbWVudCByZWY9ImRzOlJldHJpZXZhbE1ldGhvZCIvPiANCi0gICAgPGVsZW1lbnQgcmVmPSJkczpYNTA5RGF0YSIvPiANCi0gICAgPGVsZW1lbnQgcmVmPSJkczpQR1BEYXRhIi8+IA0KLSAgICA8ZWxlbWVudCByZWY9ImRzOlNQS0lEYXRhIi8+DQotICAgIDxlbGVtZW50IHJlZj0iZHM6TWdtdERhdGEiLz4NCi0gICAgPGFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIi8+ICANCi0gICAgPCEtLSAoMSwxKSBlbGVtZW50cyBmcm9tICgwLHVuYm91bmRlZCkgbmFtZXNwYWNlcyAtLT4NCi0gIDwvc2VxdWVuY2U+DQotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiANCi08L2NvbXBsZXhUeXBlPg0KLQ0KLSAgPGVsZW1lbnQgbmFtZT0iS2V5TmFtZSIgdHlwZT0ic3RyaW5nIi8+DQotICA8ZWxlbWVudCBuYW1lPSJNZ210RGF0YSIgdHlwZT0ic3RyaW5nIi8+DQotDQotICA8ZWxlbWVudCBuYW1lPSJLZXlWYWx1ZSIgdHlwZT0iZHM6S2V5VmFsdWVUeXBlIi8+IA0KLSAgPGNvbXBsZXhUeXBlIG5hbWU9IktleVZhbHVlVHlwZSIgbWl4ZWQ9InRydWUiPg0KLSAgIDxjaG9pY2U+DQotICAgICA8ZWxlbWVudCByZWY9ImRzOkRTQUtleVZhbHVlIi8+DQotICAgICA8ZWxlbWVudCByZWY9ImRzOlJTQUtleVZhbHVlIi8+DQotICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4NCi0gICA8L2Nob2ljZT4NCi0gIDwvY29tcGxleFR5cGU+DQotDQotICA8ZWxlbWVudCBuYW1lPSJSZXRyaWV2YWxNZXRob2QiIHR5cGU9ImRzOlJldHJpZXZhbE1ldGhvZFR5cGUiLz4gDQotICA8Y29tcGxleFR5cGUgbmFtZT0iUmV0cmlldmFsTWV0aG9kVHlwZSI+DQotICAgIDxzZXF1ZW5jZT4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJUcmFuc2Zvcm1zIiB0eXBlPSJkczpUcmFuc2Zvcm1zVHlwZSIgbWluT2NjdXJzPSIwIi8+IA0KLSAgICA8L3NlcXVlbmNlPiAgDQotICAgIDxhdHRyaWJ1dGUgbmFtZT0iVVJJIiB0eXBlPSJhbnlVUkkiLz4NCi0gICAgPGF0dHJpYnV0ZSBuYW1lPSJUeXBlIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4NCi0gIDwvY29tcGxleFR5cGU+DQotDQotPCEtLSBTdGFydCBYNTA5RGF0YSAtLT4NCi0NCi08ZWxlbWVudCBuYW1lPSJYNTA5RGF0YSIgdHlwZT0iZHM6WDUwOURhdGFUeXBlIi8+IA0KLTxjb21wbGV4VHlwZSBuYW1lPSJYNTA5RGF0YVR5cGUiPg0KLSAgPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCi0gICAgPGNob2ljZT4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJYNTA5SXNzdWVyU2VyaWFsIiB0eXBlPSJkczpYNTA5SXNzdWVyU2VyaWFsVHlwZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlTS0kiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlTdWJqZWN0TmFtZSIgdHlwZT0ic3RyaW5nIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOUNlcnRpZmljYXRlIiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJYNTA5Q1JMIiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4NCi0gICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4NCi0gICAgPC9jaG9pY2U+DQotICA8L3NlcXVlbmNlPg0KLTwvY29tcGxleFR5cGU+DQotDQotPGNvbXBsZXhUeXBlIG5hbWU9Ilg1MDlJc3N1ZXJTZXJpYWxUeXBlIj4gDQotICA8c2VxdWVuY2U+IA0KLSAgICA8ZWxlbWVudCBuYW1lPSJYNTA5SXNzdWVyTmFtZSIgdHlwZT0ic3RyaW5nIi8+IA0KLSAgICA8ZWxlbWVudCBuYW1lPSJYNTA5U2VyaWFsTnVtYmVyIiB0eXBlPSJpbnRlZ2VyIi8+IA0KLSAgPC9zZXF1ZW5jZT4NCi08L2NvbXBsZXhUeXBlPg0KLQ0KLTwhLS0gRW5kIFg1MDlEYXRhIC0tPg0KLQ0KLTwhLS0gQmVnaW4gUEdQRGF0YSAtLT4NCi0NCi08ZWxlbWVudCBuYW1lPSJQR1BEYXRhIiB0eXBlPSJkczpQR1BEYXRhVHlwZSIvPiANCi08Y29tcGxleFR5cGUgbmFtZT0iUEdQRGF0YVR5cGUiPiANCi0gIDxjaG9pY2U+DQotICAgIDxzZXF1ZW5jZT4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJQR1BLZXlJRCIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+IA0KLSAgICAgIDxlbGVtZW50IG5hbWU9IlBHUEtleVBhY2tldCIgdHlwZT0iYmFzZTY0QmluYXJ5IiBtaW5PY2N1cnM9IjAiLz4gDQotICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiDQotICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgIDwvc2VxdWVuY2U+DQotICA8L2Nob2ljZT4NCi08L2NvbXBsZXhUeXBlPg0KLQ0KLTwhLS0gRW5kIFBHUERhdGEgLS0+DQotDQotPCEtLSBCZWdpbiBTUEtJRGF0YSAtLT4NCi0NCi08ZWxlbWVudCBuYW1lPSJTUEtJRGF0YSIgdHlwZT0iZHM6U1BLSURhdGFUeXBlIi8+IA0KLTxjb21wbGV4VHlwZSBuYW1lPSJTUEtJRGF0YVR5cGUiPg0KLSAgPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCi0gICAgPGVsZW1lbnQgbmFtZT0iU1BLSVNleHAiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPg0KLSAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIvPg0KLSAgPC9zZXF1ZW5jZT4NCi08L2NvbXBsZXhUeXBlPiANCi0NCi08IS0tIEVuZCBTUEtJRGF0YSAtLT4NCi0NCi08IS0tIEVuZCBLZXlJbmZvIC0tPg0KLQ0KLTwhLS0gU3RhcnQgT2JqZWN0IChNYW5pZmVzdCwgU2lnbmF0dXJlUHJvcGVydHkpIC0tPg0KLQ0KLTxlbGVtZW50IG5hbWU9Ik9iamVjdCIgdHlwZT0iZHM6T2JqZWN0VHlwZSIvPiANCi08Y29tcGxleFR5cGUgbmFtZT0iT2JqZWN0VHlwZSIgbWl4ZWQ9InRydWUiPg0KLSAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPg0KLSAgICA8YW55IG5hbWVzcGFjZT0iIyNhbnkiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+DQotICA8L3NlcXVlbmNlPg0KLSAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4gDQotICA8YXR0cmlidXRlIG5hbWU9Ik1pbWVUeXBlIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4gPCEtLSBhZGQgYSBncmVwIGZhY2V0IC0tPg0KLSAgPGF0dHJpYnV0ZSBuYW1lPSJFbmNvZGluZyIgdHlwZT0iYW55VVJJIiB1c2U9Im9wdGlvbmFsIi8+IA0KLTwvY29tcGxleFR5cGU+DQotDQotPGVsZW1lbnQgbmFtZT0iTWFuaWZlc3QiIHR5cGU9ImRzOk1hbmlmZXN0VHlwZSIvPiANCi08Y29tcGxleFR5cGUgbmFtZT0iTWFuaWZlc3RUeXBlIj4NCi0gIDxzZXF1ZW5jZT4NCi0gICAgPGVsZW1lbnQgcmVmPSJkczpSZWZlcmVuY2UiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+IA0KLSAgPC9zZXF1ZW5jZT4NCi0gIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+IA0KLTwvY29tcGxleFR5cGU+DQotDQotPGVsZW1lbnQgbmFtZT0iU2lnbmF0dXJlUHJvcGVydGllcyIgdHlwZT0iZHM6U2lnbmF0dXJlUHJvcGVydGllc1R5cGUiLz4gDQotPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25hdHVyZVByb3BlcnRpZXNUeXBlIj4NCi0gIDxzZXF1ZW5jZT4NCi0gICAgPGVsZW1lbnQgcmVmPSJkczpTaWduYXR1cmVQcm9wZXJ0eSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gDQotICA8L3NlcXVlbmNlPg0KLSAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4gDQotPC9jb21wbGV4VHlwZT4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJTaWduYXR1cmVQcm9wZXJ0eSIgdHlwZT0iZHM6U2lnbmF0dXJlUHJvcGVydHlUeXBlIi8+IA0KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVQcm9wZXJ0eVR5cGUiIG1peGVkPSJ0cnVlIj4NCi0gICAgIDxjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPg0KLSAgICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4NCi0gICAgICAgPCEtLSAoMSwxKSBlbGVtZW50cyBmcm9tICgxLHVuYm91bmRlZCkgbmFtZXNwYWNlcyAtLT4NCi0gICAgIDwvY2hvaWNlPg0KLSAgICAgPGF0dHJpYnV0ZSBuYW1lPSJUYXJnZXQiIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPiANCi0gICAgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+IA0KLSAgIDwvY29tcGxleFR5cGU+DQotDQotPCEtLSBFbmQgT2JqZWN0IChNYW5pZmVzdCwgU2lnbmF0dXJlUHJvcGVydHkpIC0tPg0KLQ0KLTwhLS0gU3RhcnQgQWxnb3JpdGhtIFBhcmFtZXRlcnMgLS0+DQotDQotPHNpbXBsZVR5cGUgbmFtZT0iSE1BQ091dHB1dExlbmd0aFR5cGUiPg0KLSAgPHJlc3RyaWN0aW9uIGJhc2U9ImludGVnZXIiLz4NCi08L3NpbXBsZVR5cGU+DQotDQotPCEtLSBTdGFydCBLZXlWYWx1ZSBFbGVtZW50LXR5cGVzIC0tPg0KLQ0KLTxlbGVtZW50IG5hbWU9IkRTQUtleVZhbHVlIiB0eXBlPSJkczpEU0FLZXlWYWx1ZVR5cGUiLz4NCi08Y29tcGxleFR5cGUgbmFtZT0iRFNBS2V5VmFsdWVUeXBlIj4NCi0gIDxzZXF1ZW5jZT4NCi0gICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCI+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iUCIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iUSIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+DQotICAgIDwvc2VxdWVuY2U+DQotICAgIDxlbGVtZW50IG5hbWU9IkoiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIgbWluT2NjdXJzPSIwIi8+DQotICAgIDxlbGVtZW50IG5hbWU9IkciIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIgbWluT2NjdXJzPSIwIi8+DQotICAgIDxlbGVtZW50IG5hbWU9IlkiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPg0KLSAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIj4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJTZWVkIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJQZ2VuQ291bnRlciIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+DQotICAgIDwvc2VxdWVuY2U+DQotICA8L3NlcXVlbmNlPg0KLTwvY29tcGxleFR5cGU+DQotDQotDQotPGVsZW1lbnQgbmFtZT0iUlNBS2V5VmFsdWUiIHR5cGU9ImRzOlJTQUtleVZhbHVlVHlwZSIvPg0KLTxjb21wbGV4VHlwZSBuYW1lPSJSU0FLZXlWYWx1ZVR5cGUiPg0KLSAgPHNlcXVlbmNlPg0KLSAgICA8ZWxlbWVudCBuYW1lPSJNb2R1bHVzIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4gDQotICAgIDxlbGVtZW50IG5hbWU9IkV4cG9uZW50IiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4gDQotICA8L3NlcXVlbmNlPg0KLTwvY29tcGxleFR5cGU+IA0KLQ0KLTwhLS0gRW5kIEtleVZhbHVlIEVsZW1lbnQtdHlwZXMgLS0+DQotDQotPCEtLSBFbmQgU2lnbmF0dXJlIC0tPg0KLQ0KLTwvc2NoZW1hPg0KLQ0KLTxzY2hlbWEgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiDQotIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy54a21zLm9yZy9zY2hlbWEveGttcy0yMDAxLTAxLTIwIg0KLSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLSA8aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIvPg0KLSAgIDxlbGVtZW50IG5hbWU9IlJlY292ZXIiIHR5cGU9InhrbXM6UmVjb3ZlclR5cGUiLz4NCi0gICA8ZWxlbWVudCBuYW1lPSJSZXZva2UiIHR5cGU9InhrbXM6UmV2b2tlVHlwZSIvPg0KLSAgIDxlbGVtZW50IG5hbWU9IkxvY2F0ZSIgdHlwZT0ieGttczpMb2NhdGVUeXBlIi8+DQotICAgPGVsZW1lbnQgbmFtZT0iUmVnaXN0ZXIiIHR5cGU9InhrbXM6UmVnaXN0ZXJUeXBlIi8+DQotICAgPGVsZW1lbnQgbmFtZT0iVmFsaWRhdGUiIHR5cGU9InhrbXM6VmFsaWRhdGVUeXBlIi8+DQotICAgPGVsZW1lbnQgbmFtZT0iUmVnaXN0ZXJSZXN1bHQiIHR5cGU9InhrbXM6UmVnaXN0ZXJSZXN1bHRUeXBlIi8+DQotICAgPGVsZW1lbnQgbmFtZT0iUmVjb3ZlclJlc3VsdCIgdHlwZT0ieGttczpSZWNvdmVyUmVzdWx0VHlwZSIvPg0KLSAgIDxlbGVtZW50IG5hbWU9IlJldm9rZVJlc3VsdCIgdHlwZT0ieGttczpSZXZva2VSZXN1bHRUeXBlIi8+DQotICAgPGVsZW1lbnQgbmFtZT0iTG9jYXRlUmVzdWx0IiB0eXBlPSJ4a21zOkxvY2F0ZVJlc3VsdFR5cGUiLz4NCi0gICA8ZWxlbWVudCBuYW1lPSJWYWxpZGF0ZVJlc3VsdCIgdHlwZT0ieGttczpWYWxpZGF0ZVJlc3VsdFR5cGUiLz4NCi0gICA8Y29tcGxleFR5cGUgbmFtZT0iTG9jYXRlVHlwZSI+DQotICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNhY3Rpb25JRCIgdHlwZT0ic3RyaW5nIi8+DQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUXVlcnkiIHR5cGU9InhrbXM6S2V5SW5mb1R5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlc3BvbmQiIHR5cGU9InhrbXM6UmVzcG9uZFR5cGUiLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkxvY2F0ZVJlc3VsdFR5cGUiPg0KLSAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zYWN0aW9uSUQiIHR5cGU9InN0cmluZyIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlc3VsdCIgdHlwZT0ieGttczpSZXN1bHRDb2RlVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQW5zd2VyIiB0eXBlPSJ4a21zOkxvY2F0ZVJlc3VsdEFuc3dlclR5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVycm9ySW5mbyIgdHlwZT0ieGttczpFcnJvckluZm9UeXBlIi8+DQotICAgICAgICAgPGVsZW1lbnQgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiIHJlZj0iZHM6U2lnbmF0dXJlIi8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlZhbGlkYXRlVHlwZSI+DQotICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IlF1ZXJ5IiB0eXBlPSJ4a21zOktleUJpbmRpbmdUeXBlIi8+DQotICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXNwb25kIiB0eXBlPSJ4a21zOlJlc3BvbmRUeXBlIi8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICA8L2NvbXBsZXhUeXBlPg0KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJWYWxpZGF0ZVJlc3VsdFR5cGUiPg0KLSAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJSZXN1bHQiIHR5cGU9InhrbXM6UmVzdWx0Q29kZVR5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFuc3dlciIgdHlwZT0ieGttczpWYWxpZGF0ZVJlc3VsdEFuc3dlclR5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVycm9ySW5mbyIgdHlwZT0ieGttczpFcnJvckluZm9UeXBlIi8+DQotICAgICAgICAgPGVsZW1lbnQgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiIHJlZj0iZHM6U2lnbmF0dXJlIi8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlZhbGlkYXRlUmVzdWx0QW5zd2VyVHlwZSI+DQotICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IktleUJpbmRpbmciIHR5cGU9InhrbXM6S2V5QmluZGluZ1R5cGUiLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlJlZ2lzdGVyVHlwZSI+DQotICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IlByb3RvdHlwZSIgdHlwZT0ieGttczpLZXlCaW5kaW5nVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IkF1dGhJbmZvIiB0eXBlPSJ4a21zOkF1dGhJbmZvVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlc3BvbmQiIHR5cGU9InhrbXM6UmVzcG9uZFR5cGUiLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlJlZ2lzdGVyUmVzdWx0VHlwZSI+DQotICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlc3VsdCIgdHlwZT0ieGttczpSZXN1bHRDb2RlVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQW5zd2VyIiB0eXBlPSJ4a21zOlJlZ2lzdGVyUmVzdWx0QW5zd2VyVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJpdmF0ZSIgdHlwZT0ieGttczpQcml2YXRlVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXJyb3JJbmZvIiB0eXBlPSJ4a21zOkVycm9ySW5mb1R5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCIgcmVmPSJkczpTaWduYXR1cmUiLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+DQotICAgPC9jb21wbGV4VHlwZT4NCi0gICA8Y29tcGxleFR5cGUgbmFtZT0iUmVnaXN0ZXJSZXN1bHRBbnN3ZXJUeXBlIj4NCi0gICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iS2V5QmluZGluZyIgdHlwZT0ieGttczpLZXlCaW5kaW5nVHlwZSIvPg0KLSAgICAgIDwvc2VxdWVuY2U+DQotICAgPC9jb21wbGV4VHlwZT4NCi0gICA8Y29tcGxleFR5cGUgbmFtZT0iUmVjb3ZlclR5cGUiPg0KLSAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCByZWY9InhrbXM6UmVnaXN0ZXIiLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlJlY292ZXJSZXN1bHRUeXBlIj4NCi0gICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgPGVsZW1lbnQgcmVmPSJ4a21zOlJlZ2lzdGVyUmVzdWx0Ii8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICA8L2NvbXBsZXhUeXBlPg0KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJSZXZva2VUeXBlIj4NCi0gICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgPGVsZW1lbnQgcmVmPSJ4a21zOlJlZ2lzdGVyIi8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICA8L2NvbXBsZXhUeXBlPg0KLQ0KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJQcml2YXRlVHlwZSI+DQotICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDxhbnkgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAgDQotCSAgICAgIG1pbk9jY3Vycz0iMCIgbmFtZXNwYWNlPSIjI2FueSIvPg0KLSAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgPGFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjYW55IiBwcm9jZXNzQ29udGVudHM9ImxheCIvPg0KLSAgIDwvY29tcGxleFR5cGU+DQotDQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlJldm9rZVJlc3VsdFR5cGUiPg0KLSAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCByZWY9InhrbXM6UmVnaXN0ZXJSZXN1bHQiLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkVycm9ySW5mb1R5cGUiPg0KLSAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJFcnJvckRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciLz4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVycm9yQWN0b3IiIHR5cGU9InN0cmluZyIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXJyb3JEZXRhaWwiIHR5cGU9InhrbXM6RXJyb3JEZXRhaWxUeXBlIi8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICA8YXR0cmlidXRlIG5hbWU9ImVycm9yQ29kZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+DQotICAgPC9jb21wbGV4VHlwZT4NCi0gICA8Y29tcGxleFR5cGUgbmFtZT0iRXJyb3JEZXRhaWxUeXBlIj4NCi0gICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ic3RyaWN0Ii8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICA8YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJzdHJpY3QiLz4NCi0gICA8L2NvbXBsZXhUeXBlPg0KLSAgIDxzaW1wbGVUeXBlIG5hbWU9IkVycm9yQ29kZVR5cGUiPg0KLSAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPg0KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpZW50Ii8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2ZXIiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkNsaWVudC5NYWxmb3JtZWRLZXlOYW1lUGFzc2VkIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJDbGllbnQuSW52YWxpZFBhc3NQaHJhc2VBdXRoIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSIqIi8+DQotICAgICAgPC9yZXN0cmljdGlvbj4NCi0gICA8L3NpbXBsZVR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IktleUJpbmRpbmdUeXBlIj4NCi0gICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc2FjdGlvbklEIiB0eXBlPSJzdHJpbmciLz4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJTdGF0dXMiIHR5cGU9InhrbXM6QXNzZXJ0aW9uU3RhdHVzVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IktleUlEIiB0eXBlPSJzdHJpbmciLz4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iZHM6S2V5SW5mbyIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFzc1BocmFzZSIgdHlwZT0ic3RyaW5nIi8+DQotICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcm9jZXNzSW5mbyIgdHlwZT0ieGttczpQcm9jZXNzSW5mb1R5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlZhbGlkaXR5SW50ZXJ2YWwiIHR5cGU9InhrbXM6VmFsaWRpdHlJbnRlcnZhbFR5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJLZXlVc2FnZSIgdHlwZT0ieGttczpLZXlVc2FnZVR5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByaXZhdGUiIHR5cGU9InhrbXM6UHJpdmF0ZVR5cGUiLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+DQotICAgPC9jb21wbGV4VHlwZT4NCi0gICA8Y29tcGxleFR5cGUgbmFtZT0iS2V5SW5mb1R5cGUiPg0KLSAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCByZWY9ImRzOktleUluZm8iLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlJlc3BvbmRUeXBlIj4NCi0gICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgPGVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0ic3RyaW5nIiB0eXBlPSJ4a21zOlJlc3BvbmRFbnVtIi8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICA8L2NvbXBsZXhUeXBlPg0KLSAgIDxzaW1wbGVUeXBlIG5hbWU9IlJlc3BvbmRFbnVtIj4NCi0gICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IktleU5hbWUiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IktleVZhbHVlIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJYNTA5Q2VydCIvPg0KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iWDUwOUNoYWluIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJYNTA5Q1JMIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJPQ1NQIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJSZXRyaWV2YWxNZXRob2QiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Ik1nbXREYXRhIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJQR1BEYXRhIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJQR1BXZWIiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlNQS0lEYXRhIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZSIvPg0KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZSIvPg0KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRpdHlJbnRlcnZhbCIvPg0KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iS2V5VXNhZ2UiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1cyIvPg0KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmVkUmVzdWx0Ii8+DQotICAgICAgPC9yZXN0cmljdGlvbj4NCi0gICA8L3NpbXBsZVR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkxvY2F0ZVJlc3VsdEFuc3dlclR5cGUiPg0KLSAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiByZWY9ImRzOktleUluZm8iLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPHNpbXBsZVR5cGUgbmFtZT0iUmVzdWx0Q29kZVR5cGUiPg0KLSAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPg0KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iU3VjY2VzcyIvPg0KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTm9NYXRjaCIvPg0KLSAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTm90Rm91bmQiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkluY29tcGxldGUiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkZhaWx1cmUiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlJlZnVzZWQiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlBlbmRpbmciLz4NCi0gICAgICA8L3Jlc3RyaWN0aW9uPg0KLSAgIDwvc2ltcGxlVHlwZT4NCi0gICA8c2ltcGxlVHlwZSBuYW1lPSJBc3NlcnRpb25TdGF0dXNUeXBlIj4NCi0gICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlZhbGlkIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJbnZhbGlkIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJbmRldGVybWluYXRlIi8+DQotICAgICAgPC9yZXN0cmljdGlvbj4NCi0gICA8L3NpbXBsZVR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NJbmZvVHlwZSI+DQotICAgICAgPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPg0KLSAgICAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIi8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICA8L2NvbXBsZXhUeXBlPg0KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJWYWxpZGl0eUludGVydmFsVHlwZSI+DQotICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTm90QmVmb3JlIiB0eXBlPSJ0aW1lSW5zdGFudCIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTm90QWZ0ZXIiIHR5cGU9InRpbWVJbnN0YW50Ii8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICA8L2NvbXBsZXhUeXBlPg0KLSAgIDxzaW1wbGVUeXBlIG5hbWU9IktleVVzYWdlVHlwZSI+DQotICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJFbmNyeXB0aW9uIi8+DQotICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJTaWduYXR1cmUiLz4NCi0gICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2hhbmdlIi8+DQotICAgICAgPC9yZXN0cmljdGlvbj4NCi0gICA8L3NpbXBsZVR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkF1dGhJbmZvVHlwZSI+DQotICAgICAgPGNob2ljZT4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJBdXRoVXNlckluZm8iIHR5cGU9InhrbXM6QXV0aFVzZXJJbmZvVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9IkF1dGhTZXJ2ZXJJbmZvIiB0eXBlPSJ4a21zOkF1dGhTZXJ2ZXJJbmZvVHlwZSIvPg0KLSAgICAgIDwvY2hvaWNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlByb29mT2ZQb3NzZXNzaW9uVHlwZSI+DQotICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJkczpTaWduYXR1cmUiLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IktleUJpbmRpbmdBdXRoVHlwZSI+DQotICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJkczpTaWduYXR1cmUiLz4NCi0gICAgICA8L3NlcXVlbmNlPg0KLSAgIDwvY29tcGxleFR5cGU+DQotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkF1dGhVc2VySW5mb1R5cGUiPg0KLSAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByb29mT2ZQb3NzZXNzaW9uIiB0eXBlPSJ4a21zOlByb29mT2ZQb3NzZXNzaW9uVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iS2V5QmluZGluZ0F1dGgiIHR5cGU9InhrbXM6S2V5QmluZGluZ0F1dGhUeXBlIi8+DQotICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXNzUGhyYXNlQXV0aCIgdHlwZT0ic3RyaW5nIi8+DQotICAgICAgPC9zZXF1ZW5jZT4NCi0gICA8L2NvbXBsZXhUeXBlPg0KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBdXRoU2VydmVySW5mb1R5cGUiPg0KLSAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IktleUJpbmRpbmdBdXRoIiB0eXBlPSJ4a21zOktleUJpbmRpbmdBdXRoVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFzc1BocmFzZUF1dGgiIHR5cGU9InN0cmluZyIvPg0KLSAgICAgIDwvc2VxdWVuY2U+DQotICAgPC9jb21wbGV4VHlwZT4NCi08L3NjaGVtYT4NCi0gIDwvdHlwZXM+DQotDQotICA8bWVzc2FnZSBuYW1lPSJSZWdpc3RlciI+DQotICAgIDxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InhrbXM6UmVnaXN0ZXIiLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9IlJlZ2lzdGVyUmVzdWx0Ij4NCi0gICAgPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0ieGttczpSZWdpc3RlclJlc3VsdCIvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iVmFsaWRhdGUiPg0KLSAgICA8cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ4a21zOlZhbGlkYXRlIi8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJWYWxpZGF0ZVJlc3VsdCI+DQotICAgIDxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InhrbXM6VmFsaWRhdGVSZXN1bHQiLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9IkxvY2F0ZSI+DQotICAgIDxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InhrbXM6TG9jYXRlIi8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJMb2NhdGVSZXN1bHQiPg0KLSAgICA8cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ4a21zOkxvY2F0ZVJlc3VsdCIvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPHBvcnRUeXBlIG5hbWU9IktleVNlcnZpY2VQb3J0VHlwZSI+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iUmVnaXN0ZXIiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6UmVnaXN0ZXIiLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpSZWdpc3RlclJlc3VsdCIvPg0KLQk8ZmF1bHQgbWVzc2FnZT0idG5zOlJlZ2lzdGVyUmVzdWx0Ii8+DQotICAgIDwvb3BlcmF0aW9uPg0KLQ0KLSAgICA8b3BlcmF0aW9uIG5hbWU9IlZhbGlkYXRlIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOlZhbGlkYXRlIi8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6VmFsaWRhdGVSZXN1bHQiLz4NCi0JPGZhdWx0IG1lc3NhZ2U9InRuczpWYWxpZGF0ZVJlc3VsdCIvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJMb2NhdGUiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6TG9jYXRlIi8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6TG9jYXRlUmVzdWx0Ii8+DQotCTxmYXVsdCBtZXNzYWdlPSJ0bnM6TG9jYXRlUmVzdWx0Ii8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgPC9wb3J0VHlwZT4NCi0NCi0gIDxiaW5kaW5nIG5hbWU9IktleVNlcnZpY2VTb2FwQmluZGluZyIgdHlwZT0idG5zOktleVNlcnZpY2VQb3J0VHlwZSI+DQotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPg0KLQ0KLSAgICA8b3BlcmF0aW9uIG5hbWU9IlJlZ2lzdGVyIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy54a21zLm9yZy9zY2hlbWEveGttcy0yMDAxLTAxLTIwI1JlZ2lzdGVyIiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOlJlZ2lzdGVyIj4NCi0gICAgICAgIDxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6UmVnaXN0ZXJSZXN1bHQiPg0KLSAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLQ0KLSAgICA8b3BlcmF0aW9uIG5hbWU9IlZhbGlkYXRlIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy54a21zLm9yZy9zY2hlbWEveGttcy0yMDAxLTAxLTIwI1ZhbGlkYXRlIiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOlZhbGlkYXRlIj4NCi0gICAgICAgIDxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6VmFsaWRhdGVSZXN1bHQiPg0KLSAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLQ0KLSAgICA8b3BlcmF0aW9uIG5hbWU9IkxvY2F0ZSI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly93d3cueGttcy5vcmcvc2NoZW1hL3hrbXMtMjAwMS0wMS0yMCNMb2NhdGUiIHN0eWxlPSJkb2N1bWVudCIvPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6TG9jYXRlIj4NCi0gICAgICAgIDxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6TG9jYXRlUmVzdWx0Ij4NCi0gICAgICAgIDxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gIDwvYmluZGluZz4NCi0NCi0gIDxiaW5kaW5nIG5hbWU9IktleVNlcnZpY2VIdHRwUG9zdEJpbmRpbmciIHR5cGU9InRuczpLZXlTZXJ2aWNlUG9ydFR5cGUiPg0KLSAgICA8aHR0cDpiaW5kaW5nIHZlcmI9IlBPU1QiLz4NCi0NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJSZWdpc3RlciI+DQotICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJ4a21zL0FjY2VwdG9yLm5hbm8iLz4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOlJlZ2lzdGVyIj4NCi0gICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydHM9ImJvZHkiIHR5cGU9InRleHQveG1sIi8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpSZWdpc3RlclJlc3VsdCI+DQotICAgICAgICA8bWltZTpjb250ZW50IHBhcnRzPSJib2R5IiB0eXBlPSJ0ZXh0L3htbCIvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJWYWxpZGF0ZSI+DQotICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJ4a21zL0FjY2VwdG9yLm5hbm8iLz4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOlZhbGlkYXRlIj4NCi0gICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydHM9ImJvZHkiIHR5cGU9InRleHQveG1sIi8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpWYWxpZGF0ZVJlc3VsdCI+DQotICAgICAgICA8bWltZTpjb250ZW50IHBhcnRzPSJib2R5IiB0eXBlPSJ0ZXh0L3htbCIvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJMb2NhdGUiPg0KLSAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0ieGttcy9BY2NlcHRvci5uYW5vIi8+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpMb2NhdGUiPg0KLSAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0cz0iYm9keSIgdHlwZT0idGV4dC94bWwiLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOkxvY2F0ZVJlc3VsdCI+DQotICAgICAgICA8bWltZTpjb250ZW50IHBhcnRzPSJib2R5IiB0eXBlPSJ0ZXh0L3htbCIvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gIDwvYmluZGluZz4NCi0NCi0gIDxzZXJ2aWNlIG5hbWU9IlhNTEtleU1hbmFnZW1lbnRTZXJ2aWNlIj4NCi0JPGRvY3VtZW50YXRpb24+VmVyaXNpZ24ncyBYTUwgS2V5IE1hbmFnZW1lbnQgU2VydmljZSAoWEtNUyk8L2RvY3VtZW50YXRpb24+DQotDQotICAgIDxwb3J0IG5hbWU9IktleVNlcnZpY2VTb2FwUG9ydCIgYmluZGluZz0idG5zOktleVNlcnZpY2VTb2FwQmluZGluZyI+DQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3hrbXMudmVyaXNpZ24uY29tL3hrbXMvQWNjZXB0b3IubmFubyIvPg0KLSAgICA8L3BvcnQ+DQotDQotICAgIDxwb3J0IG5hbWU9IktleVNlcnZpY2VIdHRwUG9zdFBvcnQiIGJpbmRpbmc9InRuczpLZXlTZXJ2aWNlSHR0cFBvc3RCaW5kaW5nIj4NCi0gICAgICA8aHR0cDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8veGttcy52ZXJpc2lnbi5jb20vIi8+DQotICAgIDwvcG9ydD4NCi0gIDwvc2VydmljZT4NCi0NCi0gIDxzZXJ2aWNlIG5hbWU9IlBpbG90WE1MS2V5TWFuYWdlbWVudFNlcnZpY2UiPg0KLQk8ZG9jdW1lbnRhdGlvbj5WZXJpc2lnbidzIFBpbG90IFhNTCBLZXkgTWFuYWdlbWVudCBTZXJ2aWNlIChYS01TKTwvZG9jdW1lbnRhdGlvbj4NCi0NCi0gICAgPHBvcnQgbmFtZT0iS2V5U2VydmljZVNvYXBQb3J0IiBiaW5kaW5nPSJ0bnM6S2V5U2VydmljZVNvYXBCaW5kaW5nIj4NCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vcGlsb3QteGttcy52ZXJpc2lnbi5jb20veGttcy9BY2NlcHRvci5uYW5vIi8+DQotICAgIDwvcG9ydD4NCi0NCi0gICAgPHBvcnQgbmFtZT0iS2V5U2VydmljZUh0dHBQb3N0UG9ydCIgYmluZGluZz0idG5zOktleVNlcnZpY2VIdHRwUG9zdEJpbmRpbmciPg0KLSAgICAgIDxodHRwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9waWxvdC14a21zLnZlcmlzaWduLmNvbS8iLz4NCi0gICAgPC9wb3J0Pg0KLSAgPC9zZXJ2aWNlPg0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3htbGRzaWctY29yZS1zY2hlbWEueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3htbGRzaWctY29yZS1zY2hlbWEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2Q3MmNmLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL1htbFNpZ25hdHVyZS94bWxkc2lnLWNvcmUtc2NoZW1hLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCFET0NUWVBFIHNjaGVtYQotICBQVUJMSUMgIi0vL1czQy8vRFREIFhNTFNjaGVtYSAyMDAxMDIvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEuZHRkIgotIFsKLSAgIDwhQVRUTElTVCBzY2hlbWEgCi0gICAgIHhtbG5zOmRzIENEQVRBICNGSVhFRCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+Ci0gICA8IUVOVElUWSBkc2lnICdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjJz4KLSAgIDwhRU5USVRZICUgcCAnJz4KLSAgIDwhRU5USVRZICUgcyAnJz4KLSAgXT4KLQotPCEtLSBTY2hlbWEgZm9yIFhNTCBTaWduYXR1cmVzCi0gICAgaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIwotICAgICRSZXZpc2lvbjogMS4xICQgb24gJERhdGU6IDIwMDMvMDkvMTUgMTg6MjA6MzkgJCBieSAkQXV0aG9yOiBlcmljdmFzICQKLQotICAgIENvcHlyaWdodCAyMDAxIFRoZSBJbnRlcm5ldCBTb2NpZXR5IGFuZCBXM0MgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlCi0gICAgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbgotICAgIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvCi0KLSAgICBUaGlzIGRvY3VtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBXM0MgU29mdHdhcmUgTGljZW5zZSBbMV0gYXMgZGVzY3JpYmVkCi0gICAgaW4gdGhlIEZBUSBbMl0uCi0KLSAgICBbMV0gaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAKLSAgICBbMl0gaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9JUFItRkFRLTIwMDAwNjIwLmh0bWwjRFRECi0tLT4KLQotCi08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIKLSAgICAgICAgdmVyc2lvbj0iMC4xIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+IAotCi08IS0tIEJhc2ljIFR5cGVzIERlZmluZWQgZm9yIFNpZ25hdHVyZXMgLS0+Ci0KLTxzaW1wbGVUeXBlIG5hbWU9IkNyeXB0b0JpbmFyeSI+Ci0gIDxyZXN0cmljdGlvbiBiYXNlPSJiYXNlNjRCaW5hcnkiPgotICA8L3Jlc3RyaWN0aW9uPgotPC9zaW1wbGVUeXBlPgotCi08IS0tIFN0YXJ0IFNpZ25hdHVyZSAtLT4KLQotPGVsZW1lbnQgbmFtZT0iU2lnbmF0dXJlIiB0eXBlPSJkczpTaWduYXR1cmVUeXBlIi8+Ci08Y29tcGxleFR5cGUgbmFtZT0iU2lnbmF0dXJlVHlwZSI+Ci0gIDxzZXF1ZW5jZT4gCi0gICAgPGVsZW1lbnQgcmVmPSJkczpTaWduZWRJbmZvIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmF0dXJlVmFsdWUiLz4gCi0gICAgPGVsZW1lbnQgcmVmPSJkczpLZXlJbmZvIiBtaW5PY2N1cnM9IjAiLz4gCi0gICAgPGVsZW1lbnQgcmVmPSJkczpPYmplY3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gCi0gIDwvc2VxdWVuY2U+ICAKLSAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4KLTwvY29tcGxleFR5cGU+Ci0KLSAgPGVsZW1lbnQgbmFtZT0iU2lnbmF0dXJlVmFsdWUiIHR5cGU9ImRzOlNpZ25hdHVyZVZhbHVlVHlwZSIvPiAKLSAgPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25hdHVyZVZhbHVlVHlwZSI+Ci0gICAgPHNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImJhc2U2NEJpbmFyeSI+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICA8L2V4dGVuc2lvbj4KLSAgICA8L3NpbXBsZUNvbnRlbnQ+Ci0gIDwvY29tcGxleFR5cGU+Ci0KLTwhLS0gU3RhcnQgU2lnbmVkSW5mbyAtLT4KLQotPGVsZW1lbnQgbmFtZT0iU2lnbmVkSW5mbyIgdHlwZT0iZHM6U2lnbmVkSW5mb1R5cGUiLz4KLTxjb21wbGV4VHlwZSBuYW1lPSJTaWduZWRJbmZvVHlwZSI+Ci0gIDxzZXF1ZW5jZT4gCi0gICAgPGVsZW1lbnQgcmVmPSJkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmF0dXJlTWV0aG9kIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6UmVmZXJlbmNlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAKLSAgPC9zZXF1ZW5jZT4gIAotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKLTwvY29tcGxleFR5cGU+Ci0KLSAgPGVsZW1lbnQgbmFtZT0iQ2Fub25pY2FsaXphdGlvbk1ldGhvZCIgdHlwZT0iZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUiLz4gCi0gIDxjb21wbGV4VHlwZSBuYW1lPSJDYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZSIgbWl4ZWQ9InRydWUiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI2FueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPCEtLSAoMCx1bmJvdW5kZWQpIGVsZW1lbnRzIGZyb20gKDEsMSkgbmFtZXNwYWNlIC0tPgotICAgIDwvc2VxdWVuY2U+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJBbGdvcml0aG0iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPiAKLSAgPC9jb21wbGV4VHlwZT4KLQotICA8ZWxlbWVudCBuYW1lPSJTaWduYXR1cmVNZXRob2QiIHR5cGU9ImRzOlNpZ25hdHVyZU1ldGhvZFR5cGUiLz4KLSAgPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25hdHVyZU1ldGhvZFR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJITUFDT3V0cHV0TGVuZ3RoIiBtaW5PY2N1cnM9IjAiIHR5cGU9ImRzOkhNQUNPdXRwdXRMZW5ndGhUeXBlIi8+Ci0gICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPCEtLSAoMCx1bmJvdW5kZWQpIGVsZW1lbnRzIGZyb20gKDEsMSkgZXh0ZXJuYWwgbmFtZXNwYWNlIC0tPgotICAgIDwvc2VxdWVuY2U+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJBbGdvcml0aG0iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPiAKLSAgPC9jb21wbGV4VHlwZT4KLQotPCEtLSBTdGFydCBSZWZlcmVuY2UgLS0+Ci0KLTxlbGVtZW50IG5hbWU9IlJlZmVyZW5jZSIgdHlwZT0iZHM6UmVmZXJlbmNlVHlwZSIvPgotPGNvbXBsZXhUeXBlIG5hbWU9IlJlZmVyZW5jZVR5cGUiPgotICA8c2VxdWVuY2U+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6VHJhbnNmb3JtcyIgbWluT2NjdXJzPSIwIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6RGlnZXN0TWV0aG9kIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6RGlnZXN0VmFsdWUiLz4gCi0gIDwvc2VxdWVuY2U+Ci0gIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+IAotICA8YXR0cmlidXRlIG5hbWU9IlVSSSIgdHlwZT0iYW55VVJJIiB1c2U9Im9wdGlvbmFsIi8+IAotICA8YXR0cmlidXRlIG5hbWU9IlR5cGUiIHR5cGU9ImFueVVSSSIgdXNlPSJvcHRpb25hbCIvPiAKLTwvY29tcGxleFR5cGU+Ci0KLSAgPGVsZW1lbnQgbmFtZT0iVHJhbnNmb3JtcyIgdHlwZT0iZHM6VHJhbnNmb3Jtc1R5cGUiLz4KLSAgPGNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zZm9ybXNUeXBlIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCByZWY9ImRzOlRyYW5zZm9ybSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gIAotICAgIDwvc2VxdWVuY2U+Ci0gIDwvY29tcGxleFR5cGU+Ci0KLSAgPGVsZW1lbnQgbmFtZT0iVHJhbnNmb3JtIiB0eXBlPSJkczpUcmFuc2Zvcm1UeXBlIi8+Ci0gIDxjb21wbGV4VHlwZSBuYW1lPSJUcmFuc2Zvcm1UeXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICAgPGNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4gCi0gICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgIDwhLS0gKDEsMSkgZWxlbWVudHMgZnJvbSAoMCx1bmJvdW5kZWQpIG5hbWVzcGFjZXMgLS0+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJYUGF0aCIgdHlwZT0ic3RyaW5nIi8+IAotICAgIDwvY2hvaWNlPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iQWxnb3JpdGhtIiB0eXBlPSJhbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4gCi0gIDwvY29tcGxleFR5cGU+Ci0KLTwhLS0gRW5kIFJlZmVyZW5jZSAtLT4KLQotPGVsZW1lbnQgbmFtZT0iRGlnZXN0TWV0aG9kIiB0eXBlPSJkczpEaWdlc3RNZXRob2RUeXBlIi8+Ci08Y29tcGxleFR5cGUgbmFtZT0iRGlnZXN0TWV0aG9kVHlwZSIgbWl4ZWQ9InRydWUiPiAKLSAgPHNlcXVlbmNlPgotICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICA8L3NlcXVlbmNlPiAgICAKLSAgPGF0dHJpYnV0ZSBuYW1lPSJBbGdvcml0aG0iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPiAKLTwvY29tcGxleFR5cGU+Ci0KLTxlbGVtZW50IG5hbWU9IkRpZ2VzdFZhbHVlIiB0eXBlPSJkczpEaWdlc3RWYWx1ZVR5cGUiLz4KLTxzaW1wbGVUeXBlIG5hbWU9IkRpZ2VzdFZhbHVlVHlwZSI+Ci0gIDxyZXN0cmljdGlvbiBiYXNlPSJiYXNlNjRCaW5hcnkiLz4KLTwvc2ltcGxlVHlwZT4KLQotPCEtLSBFbmQgU2lnbmVkSW5mbyAtLT4KLQotPCEtLSBTdGFydCBLZXlJbmZvIC0tPgotCi08ZWxlbWVudCBuYW1lPSJLZXlJbmZvIiB0eXBlPSJkczpLZXlJbmZvVHlwZSIvPiAKLTxjb21wbGV4VHlwZSBuYW1lPSJLZXlJbmZvVHlwZSIgbWl4ZWQ9InRydWUiPgotICA8Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4gICAgIAotICAgIDxlbGVtZW50IHJlZj0iZHM6S2V5TmFtZSIvPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOktleVZhbHVlIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6UmV0cmlldmFsTWV0aG9kIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6WDUwOURhdGEiLz4gCi0gICAgPGVsZW1lbnQgcmVmPSJkczpQR1BEYXRhIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6U1BLSURhdGEiLz4KLSAgICA8ZWxlbWVudCByZWY9ImRzOk1nbXREYXRhIi8+Ci0gICAgPGFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIi8+Ci0gICAgPCEtLSAoMSwxKSBlbGVtZW50cyBmcm9tICgwLHVuYm91bmRlZCkgbmFtZXNwYWNlcyAtLT4KLSAgPC9jaG9pY2U+Ci0gIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+IAotPC9jb21wbGV4VHlwZT4KLQotICA8ZWxlbWVudCBuYW1lPSJLZXlOYW1lIiB0eXBlPSJzdHJpbmciLz4KLSAgPGVsZW1lbnQgbmFtZT0iTWdtdERhdGEiIHR5cGU9InN0cmluZyIvPgotCi0gIDxlbGVtZW50IG5hbWU9IktleVZhbHVlIiB0eXBlPSJkczpLZXlWYWx1ZVR5cGUiLz4gCi0gIDxjb21wbGV4VHlwZSBuYW1lPSJLZXlWYWx1ZVR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgIDxjaG9pY2U+Ci0gICAgIDxlbGVtZW50IHJlZj0iZHM6RFNBS2V5VmFsdWUiLz4KLSAgICAgPGVsZW1lbnQgcmVmPSJkczpSU0FLZXlWYWx1ZSIvPgotICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwvY2hvaWNlPgotICA8L2NvbXBsZXhUeXBlPgotCi0gIDxlbGVtZW50IG5hbWU9IlJldHJpZXZhbE1ldGhvZCIgdHlwZT0iZHM6UmV0cmlldmFsTWV0aG9kVHlwZSIvPiAKLSAgPGNvbXBsZXhUeXBlIG5hbWU9IlJldHJpZXZhbE1ldGhvZFR5cGUiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IHJlZj0iZHM6VHJhbnNmb3JtcyIgbWluT2NjdXJzPSIwIi8+IAotICAgIDwvc2VxdWVuY2U+ICAKLSAgICA8YXR0cmlidXRlIG5hbWU9IlVSSSIgdHlwZT0iYW55VVJJIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJUeXBlIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4KLSAgPC9jb21wbGV4VHlwZT4KLQotPCEtLSBTdGFydCBYNTA5RGF0YSAtLT4KLQotPGVsZW1lbnQgbmFtZT0iWDUwOURhdGEiIHR5cGU9ImRzOlg1MDlEYXRhVHlwZSIvPiAKLTxjb21wbGV4VHlwZSBuYW1lPSJYNTA5RGF0YVR5cGUiPgotICA8c2VxdWVuY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgIDxjaG9pY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJYNTA5SXNzdWVyU2VyaWFsIiB0eXBlPSJkczpYNTA5SXNzdWVyU2VyaWFsVHlwZSIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOVNLSSIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJYNTA5U3ViamVjdE5hbWUiIHR5cGU9InN0cmluZyIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOUNlcnRpZmljYXRlIiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlDUkwiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPgotICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgPC9jaG9pY2U+Ci0gIDwvc2VxdWVuY2U+Ci08L2NvbXBsZXhUeXBlPgotCi08Y29tcGxleFR5cGUgbmFtZT0iWDUwOUlzc3VlclNlcmlhbFR5cGUiPiAKLSAgPHNlcXVlbmNlPiAKLSAgICA8ZWxlbWVudCBuYW1lPSJYNTA5SXNzdWVyTmFtZSIgdHlwZT0ic3RyaW5nIi8+IAotICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlTZXJpYWxOdW1iZXIiIHR5cGU9ImludGVnZXIiLz4gCi0gIDwvc2VxdWVuY2U+Ci08L2NvbXBsZXhUeXBlPgotCi08IS0tIEVuZCBYNTA5RGF0YSAtLT4KLQotPCEtLSBCZWdpbiBQR1BEYXRhIC0tPgotCi08ZWxlbWVudCBuYW1lPSJQR1BEYXRhIiB0eXBlPSJkczpQR1BEYXRhVHlwZSIvPiAKLTxjb21wbGV4VHlwZSBuYW1lPSJQR1BEYXRhVHlwZSI+IAotICA8Y2hvaWNlPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9IlBHUEtleUlEIiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4gCi0gICAgICA8ZWxlbWVudCBuYW1lPSJQR1BLZXlQYWNrZXQiIHR5cGU9ImJhc2U2NEJpbmFyeSIgbWluT2NjdXJzPSIwIi8+IAotICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCi0gICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3NlcXVlbmNlPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9IlBHUEtleVBhY2tldCIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+IAotICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCi0gICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3NlcXVlbmNlPgotICA8L2Nob2ljZT4KLTwvY29tcGxleFR5cGU+Ci0KLTwhLS0gRW5kIFBHUERhdGEgLS0+Ci0KLTwhLS0gQmVnaW4gU1BLSURhdGEgLS0+Ci0KLTxlbGVtZW50IG5hbWU9IlNQS0lEYXRhIiB0eXBlPSJkczpTUEtJRGF0YVR5cGUiLz4gCi08Y29tcGxleFR5cGUgbmFtZT0iU1BLSURhdGFUeXBlIj4KLSAgPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICA8ZWxlbWVudCBuYW1lPSJTUEtJU2V4cCIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+Ci0gICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiLz4KLSAgPC9zZXF1ZW5jZT4KLTwvY29tcGxleFR5cGU+IAotCi08IS0tIEVuZCBTUEtJRGF0YSAtLT4KLQotPCEtLSBFbmQgS2V5SW5mbyAtLT4KLQotPCEtLSBTdGFydCBPYmplY3QgKE1hbmlmZXN0LCBTaWduYXR1cmVQcm9wZXJ0eSkgLS0+Ci0KLTxlbGVtZW50IG5hbWU9Ik9iamVjdCIgdHlwZT0iZHM6T2JqZWN0VHlwZSIvPiAKLTxjb21wbGV4VHlwZSBuYW1lPSJPYmplY3RUeXBlIiBtaXhlZD0idHJ1ZSI+Ci0gIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICA8YW55IG5hbWVzcGFjZT0iIyNhbnkiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gIDwvc2VxdWVuY2U+Ci0gIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+IAotICA8YXR0cmlidXRlIG5hbWU9Ik1pbWVUeXBlIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4gPCEtLSBhZGQgYSBncmVwIGZhY2V0IC0tPgotICA8YXR0cmlidXRlIG5hbWU9IkVuY29kaW5nIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4gCi08L2NvbXBsZXhUeXBlPgotCi08ZWxlbWVudCBuYW1lPSJNYW5pZmVzdCIgdHlwZT0iZHM6TWFuaWZlc3RUeXBlIi8+IAotPGNvbXBsZXhUeXBlIG5hbWU9Ik1hbmlmZXN0VHlwZSI+Ci0gIDxzZXF1ZW5jZT4KLSAgICA8ZWxlbWVudCByZWY9ImRzOlJlZmVyZW5jZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gCi0gIDwvc2VxdWVuY2U+Ci0gIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+IAotPC9jb21wbGV4VHlwZT4KLQotPGVsZW1lbnQgbmFtZT0iU2lnbmF0dXJlUHJvcGVydGllcyIgdHlwZT0iZHM6U2lnbmF0dXJlUHJvcGVydGllc1R5cGUiLz4gCi08Y29tcGxleFR5cGUgbmFtZT0iU2lnbmF0dXJlUHJvcGVydGllc1R5cGUiPgotICA8c2VxdWVuY2U+Ci0gICAgPGVsZW1lbnQgcmVmPSJkczpTaWduYXR1cmVQcm9wZXJ0eSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gCi0gIDwvc2VxdWVuY2U+Ci0gIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+IAotPC9jb21wbGV4VHlwZT4KLQotICAgPGVsZW1lbnQgbmFtZT0iU2lnbmF0dXJlUHJvcGVydHkiIHR5cGU9ImRzOlNpZ25hdHVyZVByb3BlcnR5VHlwZSIvPiAKLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVQcm9wZXJ0eVR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICAgPGNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgICAgPCEtLSAoMSwxKSBlbGVtZW50cyBmcm9tICgxLHVuYm91bmRlZCkgbmFtZXNwYWNlcyAtLT4KLSAgICAgPC9jaG9pY2U+Ci0gICAgIDxhdHRyaWJ1dGUgbmFtZT0iVGFyZ2V0IiB0eXBlPSJhbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4gCi0gICAgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+IAotICAgPC9jb21wbGV4VHlwZT4KLQotPCEtLSBFbmQgT2JqZWN0IChNYW5pZmVzdCwgU2lnbmF0dXJlUHJvcGVydHkpIC0tPgotCi08IS0tIFN0YXJ0IEFsZ29yaXRobSBQYXJhbWV0ZXJzIC0tPgotCi08c2ltcGxlVHlwZSBuYW1lPSJITUFDT3V0cHV0TGVuZ3RoVHlwZSI+Ci0gIDxyZXN0cmljdGlvbiBiYXNlPSJpbnRlZ2VyIi8+Ci08L3NpbXBsZVR5cGU+Ci0KLTwhLS0gU3RhcnQgS2V5VmFsdWUgRWxlbWVudC10eXBlcyAtLT4KLQotPGVsZW1lbnQgbmFtZT0iRFNBS2V5VmFsdWUiIHR5cGU9ImRzOkRTQUtleVZhbHVlVHlwZSIvPgotPGNvbXBsZXhUeXBlIG5hbWU9IkRTQUtleVZhbHVlVHlwZSI+Ci0gIDxzZXF1ZW5jZT4KLSAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgIDxlbGVtZW50IG5hbWU9IlAiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iUSIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJHIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiIG1pbk9jY3Vycz0iMCIvPgotICAgIDxlbGVtZW50IG5hbWU9IlkiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPgotICAgIDxlbGVtZW50IG5hbWU9IkoiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJTZWVkIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9IlBnZW5Db3VudGVyIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4KLSAgICA8L3NlcXVlbmNlPgotICA8L3NlcXVlbmNlPgotPC9jb21wbGV4VHlwZT4KLQotPGVsZW1lbnQgbmFtZT0iUlNBS2V5VmFsdWUiIHR5cGU9ImRzOlJTQUtleVZhbHVlVHlwZSIvPgotPGNvbXBsZXhUeXBlIG5hbWU9IlJTQUtleVZhbHVlVHlwZSI+Ci0gIDxzZXF1ZW5jZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJNb2R1bHVzIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4gCi0gICAgPGVsZW1lbnQgbmFtZT0iRXhwb25lbnQiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPiAKLSAgPC9zZXF1ZW5jZT4KLTwvY29tcGxleFR5cGU+IAotCi08IS0tIEVuZCBLZXlWYWx1ZSBFbGVtZW50LXR5cGVzIC0tPgotCi08IS0tIEVuZCBTaWduYXR1cmUgLS0+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYW5udWl0eS9hbm51aXR5bmV0LnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FubnVpdHkvYW5udWl0eW5ldC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhM2ZiZDQuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYW5udWl0eS9hbm51aXR5bmV0LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS1Qcm9wcmlldGFyeSAmIENvbmZpZGVudGlhbCB0byBBbm51aXR5TmV0LCBJbmMuIEFsbCB1c2Ugb2YgQW5udWl0eU5ldCBtYXRlcmlhbCBpcyBzdWJqZWN0IHRvIGFuZCByZXN0cmljdGVkIGJ5IGEgQ29uZmlkZW50aWFsaXR5IEFncmVlbWVudCBvciBvdGhlciBhZ3JlZW1lbnQuLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5hbm51aXR5bmV0LmNvbS9uYW1lc3BhY2UvcHJvZmlsZXMiIAoteG1sbnM6cHI9Imh0dHA6Ly93d3cuYW5udWl0eW5ldC5jb20vbmFtZXNwYWNlL3Byb2ZpbGVzIiAKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCTxlbGVtZW50IG5hbWU9IkVOVkVMT1BFIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj5UaGUgdHJhbnNtaXNzaW9uIGVudmVsb3BlIHRoYXQgZW5jb21wYXNlcyBhbGwgdHJhbnNhY3Rpb25zIGluY2x1ZGVkIGluIHRoZSBmaWxlLiAgVGhpcyBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBmaWxlLjwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleFR5cGU+Ci0JCQk8c2VxdWVuY2U+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iSEVBREVSIj4KLQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgRU5WRUxPUEUgaGVhZGVyLiAgQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhcnRpZXMgaW52b2x2ZWQgaW4gdGhlIHRyYW5zbWlzc2lvbiwgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZS48L2RvY3VtZW50YXRpb24+Ci0JCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IlNFTkRJTkdfUEFSVFlfSUQiIHR5cGU9InN0cmluZyI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIGlkZW50aWZpZXIgZm9yIHRoZSBzZW5kaW5nIHBhcnR5LiBUaGUgSUQgaXMgYW4gYWdyZWVkIHVwb24gc3RhbmRhcmQgYmV0d2VlbiB0aGUgdHdvIHBhcnRpZXMuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJSRUNFSVZJTkdfUEFSVFlfSUQiIHR5cGU9InN0cmluZyI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIGlkZW50aWZpZXIgZm9yIHRoZSByZWNlaXZpbmcgcGFydHkuICBUaGUgSUQgaXMgYW4gYWdyZWVkIHVwb24gc3RhbmRhcmQgYmV0d2VlbiB0aGUgdHdvIHBhcnRpZXMuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OX0NPVU5UIiB0eXBlPSJpbnRlZ2VyIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBleHBlY3RlZCBpbiB0aGUgZmlsZS4gVG8gYmUgdXNlZCB0byBjb25maXJtIHRoYXQgdGhlIGZpbGUgaXMgY29tcGxldGUgYXMgdGhlIHNlbmRpbmcgcGFydHkgdW5kZXJzdGFuZHMgaXQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IlRFU1QiIHR5cGU9ImJvb2xlYW4iIGRlZmF1bHQ9IjAiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+T3B0aW9uYWwgZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBmaWxlIGlzIGEgdGVzdCBmaWxlLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJPC9lbGVtZW50PgotCQkJCTxlbGVtZW50IHJlZj0icHI6VFJBTlNBQ1RJT04iIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3NlcXVlbmNlPgotCQk8L2NvbXBsZXhUeXBlPgotCTwvZWxlbWVudD4KLQk8ZWxlbWVudCBuYW1lPSJUUkFOU0FDVElPTiI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+VGhlIHJvb3QgZWxlbWVudCBvZiBhIHRyYW5zYWN0aW9uLiAgQ29udGFpbnMgYWxsIGRhdGEgYW5kIG1ldGFkYXRhIHJlZ2FyZGluZyBhIHRyYW5zYWN0aW9uLiAgVGhlIFNDSEVNQV9WRVJTSU9OIHNob3VsZCBiZSBzZXQgZm9yIGFsbCB0cmFuc2FjdGlvbnMgdG8gZW5zdXJlIGNvbXBsaWFuY2UgYW1vbmdzdCBhbGwgcGFydGllcy48L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhUeXBlPgotCQkJPHNlcXVlbmNlPgotCQkJCTxlbGVtZW50IG5hbWU9IkhFQURFUiI+Ci0JCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIGhlYWRlciBkZW5vdGVzIGhhbmRsaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRhIHBhY2thZ2Uocykgc3RvcmVkIGluIHRoZSByZXF1ZXN0IG9yIHJlc3BvbnNlIGVsZW1lbnRzLiAgVGhlIGluZm9ybWF0aW9uIGRlc2NyaWJlcyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBkYXRhIHBhY2thZ2UsIGFzIHdlbGwgYXMgcm91dGluZyBhbmQgcGFydGllcyBpbnZvbHZlZCB3aXRoIHRoZSBwYWNrYWdlLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iRUZGRUNUSVZFX0RBVEUiIHR5cGU9ImRhdGUiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+RGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgaW52b2tlZCBhbmQgdGhlIGRhdGEgcHJvY2Vzc2VkLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJBU19PRl9EQVRFVElNRSIgdHlwZT0iZGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+RGF0ZSBhbmQgdGltZSB0aGUgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IkFDVElWSVRZIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cuYW5udWl0bmV0LmNvbS9kb2N1bWVudGF0aW9uL3Byb2ZpbGVzIj5BREQgLT4gQWRkIHRvIHRoZSBDb2xsZWN0aW9ucyBpbmNsdWRlZC4gVXNlcyB0aGUgcHJpbWFyeSBrZXlzIGZvciB0aGUgQ29sbGVjdGlvbnMgaW52b2x2ZWQuIElmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhZGQgYSBDb2xsZWN0aW9uIHVzaW5nIHByaW1hcnkga2V5cyBhbHJlYWR5IGluIHVzZSwgIGFuIGVycm9yIGlzIHJldHVybmVkLiB8IE1PRElGWSAtPiBSZXBsYWNlcyBtZW1iZXJzIG9mIHRoZSBDb2xsZWN0aW9ucyBpbmNsdWRlZC4gVXNlcyB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSBDb2xsZWN0aW9uLiBJZiBhIG5ldyBwcmltYXJ5IGtleSB2YWx1ZSBpcyBpbmNsdWRlZCB0aGVuIGEgbmV3IG1lbWJlciBpcyBhZGRlZCB0byB0aGUgQ29sbGVjdGlvbi4gfCBERUxFVEUgLT4gRGVsZXRlIG1lbWJlcnMgb2YgdGhlIENvbGxlY3Rpb25zIGluY2x1ZGVkLiAgVXNlcyB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSBDb2xsZWN0aW9uLiBJZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gZGVsZXRlIGEgbWVtYmVyIHdoZXJlIHRoZSBwcmltYXJ5IGtleSBpcyBub3QgaW4gdGhlIENvbGxlY3Rpb24sIHRoZW4gYW4gZXJyb3IgaXMgcmV0dXJuZWQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCTxzaW1wbGVUeXBlPgotCQkJCQkJCQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJBREQiLz4KLQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9Ik1PRElGWSIvPgotCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iREVMRVRFIi8+Ci0JCQkJCQkJCQk8L3Jlc3RyaWN0aW9uPgotCQkJCQkJCQk8L3NpbXBsZVR5cGU+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OX0lEIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VHJhbnNhY3Rpb25fSUQgY2FwdHVyZXMgdGhlIGV4dGVybmFsIFRyYW5zYWN0aW9uIElEIGZvciBlYWNoIHBhcnR5IHRoYXQgaGFuZGxlcyB0aGUgdHJhbnNhY3Rpb24uPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQQVJUWV9JRCIgdHlwZT0ic3RyaW5nIi8+Ci0JCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iVFJBTlNBQ1RJT05fSUQiIHR5cGU9InN0cmluZyIvPgotCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iUk9VVElORyI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+Q29udGFpbnMgdGhlIHJvdXRpbmcgJ21hcCcgb2Ygd2hpY2ggcGFydGllcyBuZWVkIHRvIHRha2UgcGFydCBpbiB0aGUgdHJhbnNhY3Rpb24gYW5kIHRoZSBvcmRlciB0aGVpciBpbnRlcmFjdGlvbiBvY2N1cnMuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJTVEVQIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+RGVzY3JpYmVzIGVhY2ggc3RlcCBvZiB0aGUgcm91dGluZyBtYXAuICBNYW55IHRyYW5zYWN0aW9ucyB3aWxsIG9ubHkgaW5jbHVkZSBvbmUgcmVjb3JkIGluIHRoaXMgbm9kZSwgd2l0aCBhbiBvcmRlciBvZiAxLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQkJCQkJCQkJCQkJPGV4dGVuc2lvbiBiYXNlPSJwcjpTVEVQVHlwZSI+Ci0JCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9Ik9SREVSIiB0eXBlPSJpbnRlZ2VyIi8+Ci0JCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJPC9leHRlbnNpb24+Ci0JCQkJCQkJCQkJCQk8L2NvbXBsZXhDb250ZW50PgotCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IlJPVVRJTkdfSElTVE9SWSI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+UHJvdmlkZXMgYSByb3V0aW5nIGxvZywgd2hpY2ggc3RvcmVzIGEgcmVjb3JkIGZvciBlYWNoIHBhcnR5IHRoYXQgaGFuZGxlcyB0aGUgdHJhbnNhY3Rpb24uPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJTVEVQIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+U3RvcmVzIGEgcmVjb3JkIGZvciBlYWNoIHBhcnR5IGludGVyYWN0aW9uIG9uIHRoZSB0cmFuc2FjdGlvbi4gIEVhY2ggcGFydHkgc2hvdWxkIHN0b3JlIHRoZWlyIHNlbmQgb3IgcmVjZWl2ZSBkYXRlIGFuZCB0aW1lLCBvbmNlIHRoZXkgcmVjZWl2ZSB0aGUgcGFja2V0LiAgIFRoaXMgaGlzdG9yeSBjYW4gYmUgcmVjb25jaWxlZCBhZ2FpbnN0IHRoZSBwbGFubmVkIHJvdXRpbmcgc3RlcHMgdG8gZW5zdXJlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHdvcmtmbG93IHdhcyBzdWNjZXNzZnVsLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQkJCQkJCQkJCQkJPGV4dGVuc2lvbiBiYXNlPSJwcjpTVEVQVHlwZSI+Ci0JCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlNFTkRfREFURVRJTUUiIHR5cGU9ImRhdGVUaW1lIi8+Ci0JCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJSRUNFSVZFX0RBVEVUSU1FIiB0eXBlPSJkYXRlVGltZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJPC9leHRlbnNpb24+Ci0JCQkJCQkJCQkJCQk8L2NvbXBsZXhDb250ZW50PgotCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OX1RZUEUiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSB0eXBlIG9mIHRyYW5zYWN0aW9uIHRoYXQgdGhpcyByZXByZXNlbnRzLiAgRm9yIGV4YW1wbGUsIGEgUHJvZHVjdCBEZWZpbml0aW9uLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQk8c2ltcGxlVHlwZT4KLQkJCQkJCQkJCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iQlVTSU5FU1NfVU5JVF9ERUZJTklUSU9OIi8+Ci0JCQkJCQkJCQk8L3Jlc3RyaWN0aW9uPgotCQkJCQkJCQk8L3NpbXBsZVR5cGU+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iUkVRVUVTVCI+Ci0JCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIFJFUVVFU1QgZWxlbWVudCBjb250YWlucyB0aGUgZGF0YSBuZWNjZXNzYXJ5IGZvciB0aGUgcmVxdWVzdC4gIFRoaXMgZGF0YSBjb21lcyBmcm9tIHRoZSBzZW5kaW5nIHBhcnR5IHRvIGJlIGFuYWx5emVkIGFuZCB1c2VkIGJ5IHRoZSByZWNlaXZpbmcgcGFydHkuPC9kb2N1bWVudGF0aW9uPgotCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQk8ZWxlbWVudCByZWY9InByOkJVU0lORVNTX1VOSVRTIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCQk8ZWxlbWVudCByZWY9InByOlVTRVJTIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCQk8ZWxlbWVudCByZWY9InByOlVTRVJfUk9MRVMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6QUNDT1VOVFMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6Q09OVEFDVFMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6QlVTSU5FU1NfVU5JVF9BVkFJTEFCSUxJVFkiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6T1BFUkFUSU5HX1BST0ZJTEVTIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCQk8ZWxlbWVudCByZWY9InByOlRSQU5TQUNUSU9OX1JPVVRJTkdTIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCQk8ZWxlbWVudCByZWY9InByOlVTRVJfVE9fQlVTSU5FU1NfVU5JVF9NQVBQSU5HUyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpCVVNJTkVTU19VTklUX1JFTEFUSU9OU0hJUFMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6QlVTSU5FU1NfVU5JVF9PUEVSQVRJTkdfUFJPRklMRV9MSU5LUyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8L3NlcXVlbmNlPgotCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCTwvZWxlbWVudD4KLQkJCTwvc2VxdWVuY2U+Ci0JCQk8YXR0cmlidXRlIG5hbWU9IlNDSEVNQV9WRVJTSU9OIiB1c2U9InJlcXVpcmVkIj4KLQkJCQk8c2ltcGxlVHlwZT4KLQkJCQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlBBUlRORVJfWE1MX0lOVEVSRkFDRV9WMS4xMCIvPgotCQkJCQk8L3Jlc3RyaWN0aW9uPgotCQkJCTwvc2ltcGxlVHlwZT4KLQkJCTwvYXR0cmlidXRlPgotCQk8L2NvbXBsZXhUeXBlPgotCTwvZWxlbWVudD4KLQk8ZWxlbWVudCBuYW1lPSJJRFMiPgotCQk8Y29tcGxleFR5cGU+Ci0JCQk8c2VxdWVuY2U+Ci0JCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwvc2VxdWVuY2U+Ci0JCTwvY29tcGxleFR5cGU+Ci0JPC9lbGVtZW50PgotCTxlbGVtZW50IG5hbWU9IklEIiB0eXBlPSJwcjpJRFR5cGUiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPldoZW4gdXNlZCBpbiBhbiBJRFMgY29sbGVjdGlvbiB0aGlzIGlzIHRoZSBJRCBieSB3aGljaCB0aGUgSURTIGNvbGxlY3Rpb24ncyBwYXJlbnQgZGF0YSBlbGVtZW50IGlzIHJlZmVyZW5jZWQgKGxpbmtlZCkuICBXaGVuIHVzZWQgYXMgYSBzdWJlbGVtZW50IG9mICpfTElOSyBlbGVtZW50IHRoaXMgcmVwcmVzZW50cyB0aGUgSUQgb2YgdGhlIHJlZmVyZW5jZWQgZGF0YSBlbGVtZW50LiAgV2hlbiB1c2VkIGFzIGEgc3ViZWxlbWVudCBvZiAqX0xJTksgZWxlbWVudCB0aGlzIHJlcHJlc2VudHMgdGhlIElEIG9mIHRoZSByZWZlcmVuY2VkIGRhdGEgZWxlbWVudC48L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQk8L2VsZW1lbnQ+Ci0JPGVsZW1lbnQgbmFtZT0iQlVTSU5FU1NfVU5JVFMiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBidXNpbmVzcyB1bml0IHdpdGhpbiB0aGUgZGlzdHJpYnV0b3IuICBUaGlzIG1pZ2h0IGJlIGEgdW5pdCB0aGF0IGNvbnRhaW5zIHVzZXJzLCBzdWNoIGFzIGEgZmlybSwgb3IgYSBncm91cCB0aGF0IGNvbnRhaW5zIG90aGVyIGJ1c2luZXNzIHVuaXRzLiAgKENvbW1vbmx5IHVzZWQgZm9yIHJlcG9ydGluZyBwdXJwb3Nlcyk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhUeXBlPgotCQkJPHNlcXVlbmNlPgotCQkJCTxlbGVtZW50IG5hbWU9IkJVU0lORVNTX1VOSVQiIHR5cGU9InByOkJVU0lORVNTX1VOSVRUeXBlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC9zZXF1ZW5jZT4KLQkJPC9jb21wbGV4VHlwZT4KLQk8L2VsZW1lbnQ+Ci0JPGVsZW1lbnQgbmFtZT0iVVNFUlMiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gb2YgdXNlcnMgdGhhdCB3aWxsIGJlIHVzaW5nIHRoZSBzeXN0ZW0uPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4VHlwZT4KLQkJCTxzZXF1ZW5jZT4KLQkJCQk8ZWxlbWVudCBuYW1lPSJVU0VSIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQk8ZWxlbWVudCByZWY9InByOklEUyIvPgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IkFDVElWRSIgdHlwZT0iYm9vbGVhbiIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5GbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHVzZXIgYWNjb3VudCBpcyBhY3RpdmUgb3Igbm90LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJUSU4iIHR5cGU9InN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5Vc2VyJ3MgVElOIG9yIFNTTjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJVU0VSX0xPR09OX0lEIiB0eXBlPSJzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIHVzZXIncyBsb2dvbiBpZC4gIFNob3VsZCBpbmNsdWRlIGxldHRlcnMgYW5kIGF0IGxlYXN0IG9uZSBudW1iZXIuICAoaS5lLiB1c2VyNik8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iUEFTU1dPUkQiIHR5cGU9InN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgdXNlcidzIGxvZ29uIHBhc3N3b3JkLiAgIFBhc3N3b3JkcyBzaG91bGQgYmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBpbmNsdWRlIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOiBsZXR0ZXIsIG51bWJlciBhbmQgcHVuY3R1YXRpb24gKGkuZS4gNHBhJCR3b3JkKTwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJMQVNUX05BTUUiIHR5cGU9InN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgVXNlcidzIExhc3QgTmFtZTwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJGSVJTVF9OQU1FIiB0eXBlPSJzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIFVzZXIncyBGaXJzdCBOYW1lPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9Ik1JRERMRV9JTklUSUFMIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBVc2VyJ3MgbWlkZGxlIGluaXRpYWw8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJPHNpbXBsZVR5cGU+Ci0JCQkJCQkJCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCQkJCQkJCQk8bWluTGVuZ3RoIHZhbHVlPSIwIi8+Ci0JCQkJCQkJCQkJPG1heExlbmd0aCB2YWx1ZT0iMSIvPgotCQkJCQkJCQkJPC9yZXN0cmljdGlvbj4KLQkJCQkJCQkJPC9zaW1wbGVUeXBlPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJTQUxVVEFUSU9OX0NEIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBzYWx1dGF0aW9uIG9mIHRoZSB1c2VyLiAgU2hvdWxkIG5vdCBpbmNsdWRlIGFueSBwdW5jdHVhdGlvbi48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJPHNpbXBsZVR5cGU+Ci0JCQkJCQkJCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9Ik1yIi8+Ci0JCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJNcnMiLz4KLQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9Ik1zIi8+Ci0JCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJNaXNzIi8+Ci0JCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJEciIvPgotCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iUmV2Ii8+Ci0JCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJBdHR5Ii8+Ci0JCQkJCQkJCQk8L3Jlc3RyaWN0aW9uPgotCQkJCQkJCQk8L3NpbXBsZVR5cGU+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IlNVRkZJWF9DRCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5OYW1lIHN1ZmZpeCBvZiB0aGUgdXNlci4gIFNob3VsZCBub3QgaW5jbHVkZSBhbnkgcHVuY3R1YXRpb24uPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCTxzaW1wbGVUeXBlPgotCQkJCQkJCQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJKciIvPgotCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iU3IiLz4KLQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IklJIi8+Ci0JCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJJSUkiLz4KLQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IklWIi8+Ci0JCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJNRCIvPgotCQkJCQkJCQkJPC9yZXN0cmljdGlvbj4KLQkJCQkJCQkJPC9zaW1wbGVUeXBlPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJFTUFJTCIgdHlwZT0ic3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBlbWFpbCBhZGRyZXNzIG9mIHRoZSB1c2VyLiAgU2hvdWxkIGJlIGluIEludGVybmV0IGVtYWlsIGZvcm1hdDogbWFpbGJveEBkb21haW4uY29tPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBIT05FX05VTUJFUiIgdHlwZT0ic3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBwaG9uZSBudW1iZXIgb2YgdGhlIHVzZXIuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IkxJQ0VOU0VTIiB0eXBlPSJwcjpMSUNFTlNFU1R5cGUiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIHVzZXIncyBsaWNlbnNlcywgYnkgdHlwZSBhbmQgc3RhdGUuICA8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iQVBQT0lOVE1FTlRTIiB0eXBlPSJwcjpBUFBPSU5UTUVOVFNUeXBlIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBVc2VyJ3MgYXBwb2ludG1lbnQgcmlnaHRzLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJPC9lbGVtZW50PgotCQkJPC9zZXF1ZW5jZT4KLQkJPC9jb21wbGV4VHlwZT4KLQk8L2VsZW1lbnQ+Ci0JPGVsZW1lbnQgbmFtZT0iVVNFUl9ST0xFUyI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgcm9sZXMgYXZhaWxhYmxlIHRvIGEgdXNlci48L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhUeXBlPgotCQkJPHNlcXVlbmNlPgotCQkJCTxlbGVtZW50IG5hbWU9IlVTRVJfUk9MRSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRFMiLz4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJERVNDUklQVElPTiIgdHlwZT0ic3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPkRlc2NyaXB0aW9uIG9mIHVzZXIgcm9sZS48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQk8L3NlcXVlbmNlPgotCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCTwvZWxlbWVudD4KLQkJCTwvc2VxdWVuY2U+Ci0JCTwvY29tcGxleFR5cGU+Ci0JPC9lbGVtZW50PgotCTxlbGVtZW50IG5hbWU9IlVTRVJfVE9fQlVTSU5FU1NfVU5JVF9NQVBQSU5HUyI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgdXNlciwgcm9sZSwgYnVzaW5lc3MgdW5pdCBsaW5rYWdlcy4gQXQgdGhlIGN1cnJlbnQgdGltZSBBbm51aXR5TmV0IG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgcm9sZSBhbmQgYnVzaW5lc3MgdW5pdCBwZXIgdXNlci4gSWYgb25lIHdhbnRzIHRvIGFzc2lnbiBtdWx0aXBsZSByb2xlcyBhbmQvb3IgYnVzaW5lc3MgdW5pdHMgdG8gYW4gaW5kaXZpZHVhbCwgdGhlbiB0aGlzIGluZGl2aWR1YWwgaGFzIHRvIGFwcGVhciB0d2ljZSBpbiB0aGUgVVNFUlMgY29sbGVjdGlvbiB3aXRoIGRpZmZlcmVudCBsb2dpbnMuPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4VHlwZT4KLQkJCTxzZXF1ZW5jZT4KLQkJCQk8ZWxlbWVudCBuYW1lPSJVU0VSX1RPX0JVU0lORVNTX1VOSVRfTUFQUElORyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iQlVTSU5FU1NfVU5JVF9MSU5LIiB0eXBlPSJwcjpMSU5LVHlwZSI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIGJ1c2luZXNzIHVuaXQgdGhlIHVzZXIgd2lsbCByZXBvcnQgdG8uPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IlVTRVJfTElOSyIgdHlwZT0icHI6TElOS1R5cGUiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBJRCBvZiB0aGUgdXNlciB0aGF0IGlzIGJlaW5nIG1hcHBlZCB0byB0aGUgYnVzaW5lc3MgdW5pdC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iVVNFUl9ST0xFX0xJTksiIHR5cGU9InByOkxJTktUeXBlIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgVXNlciBSb2xlIG9mIHRoZSB1c2VyLCBhcyB0aGV5IGFyZSBtYXBwZWQgdG8gdGhlIGJ1c2luZXNzIHVuaXQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQk8L3NlcXVlbmNlPgotCQk8L2NvbXBsZXhUeXBlPgotCTwvZWxlbWVudD4KLQk8ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUX0FWQUlMQUJJTElUWSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdoaWNoIHByb2R1Y3RzLCByaWRlcnMsIHBsYW5zLCBzZXJ2aWNlIHByb2dyYW1zLCBhbmQgZnVuZHMgYXJlIGF2YWlsYWJsZSB0byBhIGJ1c2luZXNzIHVuaXQuPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4VHlwZT4KLQkJCTxzZXF1ZW5jZT4KLQkJCQk8ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUX0xJTktTIj4KLQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IkJVU0lORVNTX1VOSVRfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IkFWQUlMQUJJTElUWSIgdHlwZT0icHI6QVZBSUxBQklMSVRZVHlwZSI+Ci0JCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+RWFjaCBjaGlsZCBlbGVtZW50IGlzIHVzZWQgYXMgYSBwYXNzIGZpbHRlci4gVGhhdCBpcywgYSBwYXJ0aWN1bGFyIHByb2R1Y3QsIHBsYW4sIHJpZGVyLCBzZXJ2aWNlIHByb2dyYW0sIGZ1bmQgY29tYmluYXRpb24gaXMgYXZhaWxhYmxlIHRvIGEgcGFydGljdWxhciBCdXNpbmVzcyBVbml0IGluIGEgcGFydGljdWxhciBzdGF0ZSBpZiB0aGlzIGNvbWJpbmF0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgRGlzdHJpYnV0b3IgRGVmaW5pdGlvbiB4bWwgYW5kIHRoZSBQcm9kdWN0IERlZmluaXRpb24geG1sIGFzIHdlbGwgYXMgYmVpbmcgYXZhaWxhYmxlIGluIGVhY2ggb2YgdGhlIGNoaWxkcmVuIGVsZW1lbnRzIG9mIHRoaXMgZWxlbWVudC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJPC9lbGVtZW50PgotCQkJPC9zZXF1ZW5jZT4KLQkJPC9jb21wbGV4VHlwZT4KLQk8L2VsZW1lbnQ+Ci0JPGVsZW1lbnQgbmFtZT0iT1BUSU9OQUxJVFkiIGRlZmF1bHQ9Ik9QVElPTkFMIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj5JcyB0aGlzIGEgcmVxdWlyZWQgb3Igb3B0aW9uYWwgPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxzaW1wbGVUeXBlPgotCQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJSRVFVSVJFRCIvPgotCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU9OQUwiLz4KLQkJCTwvcmVzdHJpY3Rpb24+Ci0JCTwvc2ltcGxlVHlwZT4KLQk8L2VsZW1lbnQ+Ci0JPGVsZW1lbnQgbmFtZT0iVFJBTlNBQ1RJT05fUk9VVElOR1MiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHBvc3NpYmxlIHRyYW5zYWN0aW9uIHJvdXRpbmcgbWV0aG9kcyB0byBiZSB1c2VkIGJ5IHRoZSBidXNpbmVzcyB1bml0cy4gIEVhY2ggdHJhbnNhY3Rpb24gcm91dGluZyBjYW4gaW5jbHVkZSBwYXJhbWV0ZXJzIHRoYXQgbmVlZCB0byBiZSBmaWxsZWQgb3V0IGZvciB0aGF0IHJvdXRpbmcgdHlwZS4gVGhpcyBlbGVtZW50IGFsc28gZXhpc3RzIGluIHRoZSBEaXN0cmlidXRvciBEZWZpbml0aW9uIHhtbCB3aGljaCBpcyB0aGUgcHJlZmVycmVkIHNvdXJjZSBvZiB0aGlzIGluZm9ybWF0aW9uLjwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleFR5cGU+Ci0JCQk8c2VxdWVuY2U+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iVFJBTlNBQ1RJT05fUk9VVElORyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQk8Y2hvaWNlPgotCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SURTIi8+Ci0JCQkJCQkJCTxlbGVtZW50IG5hbWU9Ik5BTUUiIHR5cGU9InN0cmluZyI+Ci0JCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGlzIHRyYW5zYWN0aW9uIHJvdXRpbmcuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCTxlbGVtZW50IG5hbWU9IkZPUk1BVCI+Ci0JCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5Gb3JtYXRzIGluIHdoaWNoIHRyYW5zYWN0aW9uIHJlcXVlc3RzIG1heSBiZSByZWNpZXZlZDwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxzaW1wbGVUeXBlPgotCQkJCQkJCQkJCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IkFOU0kiLz4KLQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJOU0NDIi8+Ci0JCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iQU5OVUlUWU5FVF9QUk9GSUxFX1YxLjAiLz4KLQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJYTUxJRkUiLz4KLQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJUWE1MSUZFIi8+Ci0JCQkJCQkJCQkJPC9yZXN0cmljdGlvbj4KLQkJCQkJCQkJCTwvc2ltcGxlVHlwZT4KLQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQQVJBTUVURVJTIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+QSBjb2xsZWN0aW9uIG9mIHBhcmFtZXRlcnMgYW5kIHZhbHVlcyB0aGF0IGFyZSBuZWNjZXNzYXJ5IGZvciB0aGUgdHJhbnNhY3Rpb24gcm91dGluZy4gIEZvciBpbnN0YW5jZSwgYW4gTlNDQyByb3V0aW5nIHdvdWxkIHJlcXVpcmUgYSBOU0NDIElELiAgSW4gdGhpcyBzY29wZSwgdGhlIGRpc3RyaWJ1dG9yIGRlZmluZXMgdGhlIHBvc3NpYmxlIHBhcmFtZXRlcnMgZm9yIGVhY2ggcm91dGluZyB0eXBlLCBhbmQgd2lsbCBmaWxsIGluIHRoZSB2YWx1ZXMgaW4gdGhlIHNpbWlsYXIgc3RydWN0dXJlIHdpdGhpbiB0aGUgT1BFUkFUSU5HX1BST0ZJTEVTIGVsZW1lbnQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iUEFSQU1FVEVSIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJOQU1FIiB0eXBlPSJzdHJpbmciPgotCQkJCQkJCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlcjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJPC9jaG9pY2U+Ci0JCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJPC9lbGVtZW50PgotCQkJPC9zZXF1ZW5jZT4KLQkJPC9jb21wbGV4VHlwZT4KLQk8L2VsZW1lbnQ+Ci0JPGVsZW1lbnQgbmFtZT0iQlVTSU5FU1NfVU5JVF9PUEVSQVRJTkdfUFJPRklMRV9MSU5LUyI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+TGlua3MgdGhlIGRlZmluZWQgb3BlcmF0aW5nIHByb2ZpbGVzIHRvIHRoZSBidXNpbmVzcyB1bml0cyB0aGV5IGFwcGx5IHRvLjwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleFR5cGU+Ci0JCQk8c2VxdWVuY2U+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iQlVTSU5FU1NfVU5JVF9MSU5LUyI+Ci0JCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTktTIj4KLQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9Ik9QRVJBVElOR19QUk9GSUxFX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iT1BFUkFUSU5HX1BST0ZJTEVfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZXNlIG9wZXJhdGluZyBwcm9maWxlcyBtdXN0IGJlIHJlc3RyaWN0aW9ucyBvZiB0aGUgb3BlcmF0aW5nIHByb2ZpbGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNhbWUgcHJvZHVjdCBpbiB0aGUgRGlzdHJpYnV0b3IgRGVmaW5pdGlvbiB4bWwuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOklEIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQk8L3NlcXVlbmNlPgotCQk8L2NvbXBsZXhUeXBlPgotCTwvZWxlbWVudD4KLQk8ZWxlbWVudCBuYW1lPSJPUEVSQVRJTkdfUFJPRklMRVMiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzZXQgb2YgcG9zc2libGUgY29tbWlzc2lvbiBvcHRpb25zLCB0cmFuc2FjdGlvbiB0eXBlcywgYW5kIG1vbmV5IGZvcm1zIGF2YWlsYWJsZSB0byB0aGUgYnVzaW5lc3MgdW5pdC4gQWxzbywgdGhlIG5ldHRpbmcgb3B0aW9uIGFuZCB0cmFuc2FjdGlvbiByb3V0aW5nIHRoYXQgdGhlIGZvciBlYWNoIHRyYW5zYWN0aW9uIHR5cGUuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleFR5cGU+Ci0JCQk8c2VxdWVuY2U+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iT1BFUkFUSU5HX1BST0ZJTEUiIHR5cGU9InByOk9QRVJBVElOR19QUk9GSUxFVHlwZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwvc2VxdWVuY2U+Ci0JCTwvY29tcGxleFR5cGU+Ci0JPC9lbGVtZW50PgotCTxlbGVtZW50IG5hbWU9IkNPTlRBQ1RTIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj5Db250YWN0IGluZm9ybWF0aW9uLjwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleFR5cGU+Ci0JCQk8c2VxdWVuY2U+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iQ09OVEFDVCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRFMiLz4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJOQU1FIiB0eXBlPSJzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+Q29udGFjdCBuYW1lLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQSE9ORV9OVU1CRVIiIHR5cGU9InN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5Db250YWN0IHBob25lIG51bWJlci48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iRU1BSUwiIHR5cGU9InN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5Db250YWN0IGUtbWFpbCBhZGRyZXNzLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJPC9lbGVtZW50PgotCQkJPC9zZXF1ZW5jZT4KLQkJPC9jb21wbGV4VHlwZT4KLQk8L2VsZW1lbnQ+Ci0JPGVsZW1lbnQgbmFtZT0iQlVTSU5FU1NfVU5JVF9SRUxBVElPTlNISVBTIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSByZXBvcnRpbmcgaGllcmFyY2h5LiBBbm51aXR5TmV0IG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgaGllcmFyY2h5IC0tIHRoYXQgaXMsIGVhY2ggYnVzaW5lc3MgdW5pdCBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBwYXJlbnQuPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4VHlwZT4KLQkJCTxzZXF1ZW5jZT4KLQkJCQk8ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUX1JFTEFUSU9OU0hJUCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iUEFSRU5UX0JVU0lORVNTX1VOSVRfTElOSyIgdHlwZT0icHI6TElOS1R5cGUiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPkxpbmsgdG8gdGhlICBidXNpbmVzcyB1bml0IHRoYXQgd2lsbCBob2xkIHRoZSBjaGlsZCBidXNpbmVzcyB1bml0LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJDSElMRF9CVVNJTkVTU19VTklUX0xJTksiIHR5cGU9InByOkxJTktUeXBlIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgbGluayB0byB0aGUgYnVzaW5lc3MgdW5pdCB0aGF0IHJlc2lkZXMgd2l0aGluIHRoZSBwYXJlbnQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQk8L3NlcXVlbmNlPgotCQk8L2NvbXBsZXhUeXBlPgotCTwvZWxlbWVudD4KLQk8ZWxlbWVudCBuYW1lPSJBQ0NPVU5UUyI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+QWNjb3VudHMgdG8gYmUgcmVwb3J0ZWQgb24uPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4VHlwZT4KLQkJCTxzZXF1ZW5jZT4KLQkJCQk8ZWxlbWVudCBuYW1lPSJBQ0NPVU5UIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQk8ZWxlbWVudCByZWY9InByOklEUyIvPgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IkFDQ09VTlRfTkFNRSIgdHlwZT0ic3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJPV05FUl9OQU1FIiB0eXBlPSJzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIG93bmVyIG9mIHRoZSBhY2NvdW50PC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IkFCQV9OVU1CRVIiIHR5cGU9InN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgQUJBIG51bWJlciBmb3IgdGhlIGFjY291bnQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IkFDQ09VTlRfTlVNQkVSIiB0eXBlPSJzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIGFjY291bnQgbnVtYmVyLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQVVJQT1NFIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSB1c2FnZSBvZiB0aGUgYWNjb3VudC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJPHNpbXBsZVR5cGU+Ci0JCQkJCQkJCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlBSRU1JVU0gQ09MTEVDVElPTiIvPgotCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iQ09NTUlTU0lPTiBSRUNJRVBUUyIvPgotCQkJCQkJCQkJPC9yZXN0cmljdGlvbj4KLQkJCQkJCQkJPC9zaW1wbGVUeXBlPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJPC9lbGVtZW50PgotCQkJPC9zZXF1ZW5jZT4KLQkJPC9jb21wbGV4VHlwZT4KLQk8L2VsZW1lbnQ+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkxJTktUeXBlIj4KLQkJPHNlcXVlbmNlPgotCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQk8L3NlcXVlbmNlPgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlNURVBUeXBlIj4KLQkJPHNlcXVlbmNlPgotCQkJPGVsZW1lbnQgbmFtZT0iUkVDRUlWSU5HX1BBUlRZX0lEIiB0eXBlPSJzdHJpbmciLz4KLQkJCTxlbGVtZW50IG5hbWU9IlNFTkRJTkdfUEFSVFlfSUQiIHR5cGU9InN0cmluZyIvPgotCQk8L3NlcXVlbmNlPgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IklEVHlwZSI+Ci0JCTxzaW1wbGVDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJzdHJpbmciPgotCQkJCTxhdHRyaWJ1dGUgbmFtZT0iUEFSVFlfTElOS19JRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9zaW1wbGVDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlNUQVRFU1R5cGUiPgotCQk8c2VxdWVuY2U+Ci0JCQk8ZWxlbWVudCBuYW1lPSJFWENFUFRJT04iIHR5cGU9ImJvb2xlYW4iIGRlZmF1bHQ9IjAiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPklmIHRoZSBleGNlcHRpb24gZmxhZyBpcyBvbiwgdGhlbiB0aGUgc3RhdGUgbGlzdCBpbmNsdWRlcyBhbGwgc3RhdGVzLCBFWENFUFQgdGhlIGFzc29jaWF0ZWQgKGxpc3QpIG9mIHN0YXRlKHMpIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQk8ZWxlbWVudCBuYW1lPSJTVEFURSIgdHlwZT0icHI6U1RBVEVUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+RGV0YWlscyBvZiBTdGF0ZSBhbmQgU3RhdGUgYXBwcm92YWwgZm9yIHNlbGxpbmcgYSBwcm9kdWN0IGluIGEgc3BlY2lmaWMgc3RhdGU8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQkJPC9lbGVtZW50PgotCQk8L3NlcXVlbmNlPgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlNUQVRFVHlwZSI+Ci0JCTxzZXF1ZW5jZT4KLQkJCTxlbGVtZW50IG5hbWU9IkNPREUiPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj5Ud28gZGlnaXQgc3RhdGUgY29kZTwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJPHNpbXBsZVR5cGU+Ci0JCQkJCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJCQkJPGxlbmd0aCB2YWx1ZT0iMiIvPgotCQkJCQk8L3Jlc3RyaWN0aW9uPgotCQkJCTwvc2ltcGxlVHlwZT4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG5hbWU9IkJFR0lOX0RBVEUiIHR5cGU9ImRhdGUiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPkRhdGUgc3RhdGUgYXBwcm92YWwgYmVjb21lIGVmZmVjdGl2ZTwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQk8ZWxlbWVudCBuYW1lPSJFTkRfREFURSIgdHlwZT0iZGF0ZSIgbWluT2NjdXJzPSIwIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+RGF0ZSBzdGF0ZSBhcHByb3ZhbCBleHBpcmVzPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG5hbWU9IlRFUk1fREFURSIgdHlwZT0iZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iTElDRU5TRVNUeXBlIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj5WYXJpYWJsZSBzYWxlcyBjYW4gb25seSBiZSBtYWRlIHdoZW4gdGhlIHJlcCBvciBmaXJtIGlzIGJvdGggRklYRUQgYW5kIFZBUklBQkxFIGxpY2Vuc2VkIGluIHRoZSBzdGF0ZS48L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHNlcXVlbmNlPgotCQkJPGVsZW1lbnQgbmFtZT0iTElDRU5TRSIgbWF4T2NjdXJzPSIyIj4KLQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCTxlbGVtZW50IG5hbWU9IlRZUEUiPgotCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgbGljZW5zZSBpcyBmb3IgZml4ZWQgb3IgdmFyaWFibGUgYW5udWl0aWVzLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPHNpbXBsZVR5cGU+Ci0JCQkJCQkJCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJGSVhFRCIvPgotCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJWQVJJQUJMRSIvPgotCQkJCQkJCQk8L3Jlc3RyaWN0aW9uPgotCQkJCQkJCTwvc2ltcGxlVHlwZT4KLQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCTxlbGVtZW50IG5hbWU9IlNUQVRFUyIgdHlwZT0icHI6U1RBVEVTVHlwZSIvPgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQVBQT0lOVE1FTlRTVHlwZSI+Ci0JCTxzZXF1ZW5jZT4KLQkJCTxlbGVtZW50IG5hbWU9IkFQUE9JTlRNRU5UIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJPGNvbXBsZXhUeXBlPgotCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJTVEFUVVMiPgotCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgc3RhdHVzIG9mIHRoaXMgYXBwb2ludG1lbnQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQk8c2ltcGxlVHlwZT4KLQkJCQkJCQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlBFTkRJTkciLz4KLQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iQVBQT0lOVEVEIi8+Ci0JCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlRFUk1JTkFURUQiLz4KLQkJCQkJCQkJPC9yZXN0cmljdGlvbj4KLQkJCQkJCQk8L3NpbXBsZVR5cGU+Ci0JCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJORVdfQlVTSU5FU1MiIHR5cGU9ImJvb2xlYW4iPgotCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5GbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgYXBwb2ludG1lbnQgaW5jbHVkZXMgTmV3IEJ1c2luZXNzIHRyYW5zYWN0aW9ucy48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJPGVsZW1lbnQgbmFtZT0iQ09NTUlTU0lPTlMiIHR5cGU9ImJvb2xlYW4iPgotCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5GbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgYXBwb2ludG1lbnQgaW5jbHVkZXMgQ29tbWlzaW9ucy48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJPGVsZW1lbnQgbmFtZT0iV1JJVElOR19DT01QQU5ZIj4KLQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJPGRvY3VtZW50YXRpb24+V3JpdGluZyBjb21wYW55IGFuZCBsaW5lcyBvZiBidXNpbmVzcy48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iTElORVNfT0ZfQlVTSU5FU1MiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJMSU5FX09GX0JVU0lORVNTIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQkJPHNpbXBsZVR5cGU+Ci0JCQkJCQkJCQkJCQkJCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJJTkRJVklEVUFMX0xJRkUiLz4KLQkJCQkJCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iVkFSSUFCTEVfQU5OVUlUSUVTIi8+Ci0JCQkJCQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IkZJWEVEX0FOTlVJVElFUyIvPgotCQkJCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJHUk9VUF9MSUZFIi8+Ci0JCQkJCQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlZBUklBQkxFX0xJRkUiLz4KLQkJCQkJCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iQUxMIi8+Ci0JCQkJCQkJCQkJCQkJCTwvcmVzdHJpY3Rpb24+Ci0JCQkJCQkJCQkJCQkJPC9zaW1wbGVUeXBlPgotCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCTxlbGVtZW50IG5hbWU9IlNUQVRFUyIgdHlwZT0icHI6U1RBVEVTVHlwZSIvPgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQlVTSU5FU1NfVU5JVFR5cGUiPgotCQk8Y2hvaWNlPgotCQkJPHNlcXVlbmNlPgotCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQk8ZWxlbWVudCBuYW1lPSJBQ1RJVkUiIHR5cGU9ImJvb2xlYW4iIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJPGRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJ1c2luZXNzIHVuaXQgaXMgYWN0aXZlIG9yIG5vdC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQk8L3NlcXVlbmNlPgotCQkJPHNlcXVlbmNlPgotCQkJCTxlbGVtZW50IHJlZj0icHI6SURTIi8+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iQUNUSVZFIiB0eXBlPSJib29sZWFuIj4KLQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQk8ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgYnVzaW5lc3MgdW5pdCBpcyBhY3RpdmUgb3Igbm90LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCTwvZWxlbWVudD4KLQkJCQk8ZWxlbWVudCBuYW1lPSJOQU1FIiB0eXBlPSJzdHJpbmciPgotCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBidXNpbmVzcyB1bml0LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCTwvZWxlbWVudD4KLQkJCQk8ZWxlbWVudCBuYW1lPSJDTEFTUyIgdHlwZT0ic3RyaW5nIj4KLQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQk8ZG9jdW1lbnRhdGlvbj5MZXZlbCBpbiB0aGUgcmVwb3J0aW5nIGhpZXJhcmNoeS4gQ29tbW9uIHZhbHVlcyBhcmUgQnJhbmNoLCBSZWdpb24sIERpc3RyaWJ1dG9yLCBGaWVsZCBPZmZpY2UsIGV0Yy48L2RvY3VtZW50YXRpb24+Ci0JCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iVElOIiB0eXBlPSJzdHJpbmciPgotCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSB0YXggaWRlbnRpZmljYXRpb24gbnVtYmVyPC9kb2N1bWVudGF0aW9uPgotCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJPC9lbGVtZW50PgotCQkJCTxlbGVtZW50IG5hbWU9IkFDQ09VTlRfTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJBQ0NPVU5UX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iQ09OVEFDVF9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQk8ZG9jdW1lbnRhdGlvbj5MaW5rcyB0byB0aGUgRGlzdHJpYnV0b3IgY29udGFjdHMgZm9yIHRoZSBCdXNpbmVzcyBVbml0IGluIHRoZSBjYXNlIG9mIHF1ZXN0aW9ucyBvciBwcm9ibGVtcy48L2RvY3VtZW50YXRpb24+Ci0JCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCTxlbGVtZW50IG5hbWU9IkNPTlRBQ1RfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlJFU1BPTlNJQklMSVRZIiB0eXBlPSJzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBwdXJwb3NlIGZvciB3aGljaCB0aGUgY29udGFjdCBzaG91bGQgYmUgdXNlZC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJPC9lbGVtZW50PgotCQkJPC9zZXF1ZW5jZT4KLQkJPC9jaG9pY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iT1BFUkFUSU5HX1BST0ZJTEVUeXBlIj4KLQkJPHNlcXVlbmNlPgotCQkJPGVsZW1lbnQgcmVmPSJwcjpJRFMiLz4KLQkJCTxlbGVtZW50IG5hbWU9Ik5FVFRJTkdfT1BUSU9OIiB0eXBlPSJib29sZWFuIiBtaW5PY2N1cnM9IjAiPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgbmV0dGluZyBvcHRpb24gdG8gYmUgdXNlZC48L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQkJPC9lbGVtZW50PgotCQkJPGVsZW1lbnQgbmFtZT0iQ09NTUlTU0lPTl9PUFRJT05fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPkxpbmtzIGF2YWlsYWJsZSBjb21taXNzaW9uIG9wdGlvbnMgdG8gdGhlIHByb2ZpbGUuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJPGNvbXBsZXhUeXBlPgotCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJDT01NSVNTSU9OX09QVElPTl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCTxkb2N1bWVudGF0aW9uPkNvbW1pc3Npb24gb3B0aW9ucyBhdmFpbGFibGU8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCTwvc2VxdWVuY2U+Ci0JCQkJPC9jb21wbGV4VHlwZT4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OX1RZUEVTIiBtaW5PY2N1cnM9IjAiPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIHRyYW5zYWN0aW9uIHR5cGVzIGFuZCBtb25leSBmb3JtcyBhbGxvd2VkIGluIHRoaXMgcHJvZmlsZS48L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0iVFJBTlNBQ1RJT05fVFlQRSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iVFlQRSI+Ci0JCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSB0eXBlcyBvZiB0cmFuc2FjdGlvbiBiZWluZyBhbGxvd2VkLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJPHNpbXBsZVR5cGU+Ci0JCQkJCQkJCQkJCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJBUFBMSUNBVElPTiIvPgotCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJJTklUSUFMX1BSRU1JVU0iLz4KLQkJCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iU1VCU0VRVUVOVF9QUkVNSVVNIi8+Ci0JCQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlNDSEVEVUxFRF9BQ0hfUFJPR1JBTSIvPgotCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJXSVRIRFJBV0FMIi8+Ci0JCQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlNVUlJFTkRFUiIvPgotCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJUUkFOU0ZFUiIvPgotCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJSRUJBTEFOQ0UiLz4KLQkJCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iU1lTVEVNQVRJQ19XSVRIRFJBV0FMX1BST0dSQU0iLz4KLQkJCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iTVJEX1BST0dSQU0iLz4KLQkJCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iTVJEIi8+Ci0JCQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlNDSEVEVUxFRF9SRUJBTEFOQ0VfUFJPR1JBTSIvPgotCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJEQ0EiLz4KLQkJCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iRENBX1BST0dSQU0iLz4KLQkJCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iU1lTVEVNQVRJQ19XSVRIRFJBV0FMX1BST0dSQU0iLz4KLQkJCQkJCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iUkVORVdBTCIvPgotCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJBTk5VSVRJWkFUSU9OIi8+Ci0JCQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlBBWU9VVCIvPgotCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJERUFUSF9DTEFJTV9QRU5ESU5HIi8+Ci0JCQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IkRFQVRIX0NMQUlNIi8+Ci0JCQkJCQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlNZU1RFTUFUSUNfV0lUSERSQVdBTCIvPgotCQkJCQkJCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJTQ0hFRFVMRURfQUNIIi8+Ci0JCQkJCQkJCQkJCTwvcmVzdHJpY3Rpb24+Ci0JCQkJCQkJCQkJPC9zaW1wbGVUeXBlPgotCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iTU9ORVlfRk9STVMiIHR5cGU9InByOk1PTkVZX0ZPUk1TVHlwZSIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhlIHBvc3NpYmxlIG1vbmV5IHNvdXJjZXMgKGZvcm1zKSBhcHByb3ZlZCBmb3IgdHJhbnNmZXJzIG9yIHRyYW5zYWN0aW9ucyBpbnRvIHRoaXMgcHJvZHVjdC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCTwvc2VxdWVuY2U+Ci0JCQkJPC9jb21wbGV4VHlwZT4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OX1JPVVRJTkdfTElOSyIgbWluT2NjdXJzPSIwIj4KLQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCTxlbGVtZW50IG5hbWU9IlBBUkFNRVRFUlMiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBjb2xsZWN0aW9uIG9mIGZpbGxlZCBpbiBwYXJhbWV0ZXJzIGZvciB0aGlzIHRyYW5zYWN0aW9uIHJvdXRpbmcuICBGb3IgZXhhbXBsZSwgdGhpcyB3b3VsZCBzcGVjaWZ5IHRoZSBOU0NDIG51bWJlciwgZm9yIGEgTlNDQyB0cmFuc2FjdGlvbiByb3V0aW5nLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQQVJBTUVURVIiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9Ik5BTUUiIHR5cGU9InN0cmluZyI+Ci0JCQkJCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuICBTaG91bGQgbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBhcyBkZWZpbmVkIGluIHRoZSBUUkFOU0FDVElPTl9ST1VUSU5HIHN0cnVjdHVyZS48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iVkFMVUUiIHR5cGU9ImFueVNpbXBsZVR5cGUiPgotCQkJCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGUgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIgZm9yIHRoZSBwcm9maWxlLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJPC9lbGVtZW50PgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iTU9ORVlfRk9STVNUeXBlIj4KLQkJPHNlcXVlbmNlPgotCQkJPGVsZW1lbnQgbmFtZT0iTU9ORVlfRk9STSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJPHNpbXBsZUNvbnRlbnQ+Ci0JCQkJCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IkRJUkVDVCIvPgotCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iRVhDSEFOR0UiLz4KLQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IkRJUkVDVF9ST0xMT1ZFUiIvPgotCQkJCQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iUk9MTE9WRVIiLz4KLQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlRSQU5TRkVSIi8+Ci0JCQkJCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJST1RIX0NPTlZFUlNJT04iLz4KLQkJCQkJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlRBWF9ZRUFSIi8+Ci0JCQkJCQk8L3Jlc3RyaWN0aW9uPgotCQkJCQk8L3NpbXBsZUNvbnRlbnQ+Ci0JCQkJPC9jb21wbGV4VHlwZT4KLQkJCTwvZWxlbWVudD4KLQkJPC9zZXF1ZW5jZT4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJBVkFJTEFCSUxJVFlUeXBlIj4KLQkJPHNlcXVlbmNlPgotCQkJPGVsZW1lbnQgbmFtZT0iUFJPRFVDVFMiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPlByb2R1Y3QgYXZhaWxhYmlsaXR5IGJ5IHN0YXRlLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJPGNvbXBsZXhUeXBlPgotCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTktTIj4KLQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBSRVFVRVNUL1BST0RVQ1RTL1BST0RVQ1QgZWxlbWVudC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iU1RBVEVTIiB0eXBlPSJwcjpTVEFURVNUeXBlIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5TdGF0ZXMgaW4gd2hpY2ggdGhpcyBwcm9kdWN0IGlzIGF2YWlsYWJsZSBmb3Igc2FsZTwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJPC9lbGVtZW50PgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQk8ZWxlbWVudCBuYW1lPSJQUk9EVUNUU19QTEFOUyIgbWluT2NjdXJzPSIwIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+UGxhbiBhdmFpbGFiaWxpdHkgZm9yIHByb2R1Y3RzIGJ5IHN0YXRlLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJPGNvbXBsZXhUeXBlPgotCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTktTIj4KLQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBSRVFVRVNUL1BST0RVQ1RTL1BST0RVQ1QgZWxlbWVudC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iUExBTl9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBMQU5fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBSRVFVRVNUL1BMQU5TL1BMQU4uPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlNUQVRFUyIgdHlwZT0icHI6U1RBVEVTVHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJPC9lbGVtZW50PgotCQkJPGNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCTxlbGVtZW50IG5hbWU9IlBST0RVQ1RTX1JJREVSUyI+Ci0JCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJPGRvY3VtZW50YXRpb24+QSBjYXJyaWVyIG1heSB1c2UgZWl0aGVyIHRoZSBQUk9EVUNUU19SSURFUlMgb3IgdGhlIFBST0RVQ1RTX1BMQU5TX1JJREVSUyBlbGVtZW50cywgYnV0IG5vdCBib3RoLjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LUyI+Ci0JCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBSRVFVRVNUL1BST0RVQ1RTL1BST0RVQ1QgZWxlbWVudC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJSSURFUl9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlJJREVSX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBSRVFVRVNUL1JJREVSUy9SSURFUi48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJDT05GSUdVUkFUSU9OX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQkJCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iQ09ORklHVVJBVElPTl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhpcyByZWZlcmVuY2VzIGEgUklERVJTL1JJREVSL0NPTkZJR1VSQVRJT05TL0NPTkZJR1VSQVRJT04gZWxlbWVudC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJTVEFURVMiIHR5cGU9InByOlNUQVRFU1R5cGUiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOk9QVElPTkFMSVRZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iUFJPRFVDVFNfUExBTlNfUklERVJTIj4KLQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQk8ZG9jdW1lbnRhdGlvbj5BIGNhcnJpZXIgbWF5IHVzZSBlaXRoZXIgdGhlIFBST0RVQ1RTX1JJREVSUyBvciB0aGUgUFJPRFVDVFNfUExBTlNfUklERVJTIGVsZW1lbnRzLCBidXQgbm90IGJvdGguPC9kb2N1bWVudGF0aW9uPgotCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTktTIj4KLQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoaXMgcmVmZXJlbmNlcyBhIFJFUVVFU1QvUFJPRFVDVFMvUFJPRFVDVCBlbGVtZW50LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBMQU5fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+UGxhbnMgZm9yIHdoaWNoIChsaXN0KSBvZiByaWRlcihzKSBpcyBhdmFpbGFibGU8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBMQU5fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoaXMgcmVmZXJlbmNlcyBhIFJFUVVFU1QvUExBTlMvUExBTi48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJSSURFUl9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlJJREVSX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBSRVFVRVNUL1JJREVSUy9SSURFUi48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJDT05GSUdVUkFUSU9OX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iQ09ORklHVVJBVElPTl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhpcyByZWZlcmVuY2VzIGEgUklERVJTL1JJREVSL0NPTkZJR1VSQVRJT05TL0NPTkZJR1VSQVRJT04gZWxlbWVudC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJTVEFURVMiIHR5cGU9InByOlNUQVRFU1R5cGUiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOk9QVElPTkFMSVRZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJPC9lbGVtZW50PgotCQkJPC9jaG9pY2U+Ci0JCQk8Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iUFJPRFVDVFNfU0VSVklDRV9QUk9HUkFNUyI+Ci0JCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJPGRvY3VtZW50YXRpb24+QSBjYXJyaWVyIG1heSB1c2UgZWl0aGVyIHRoZSBQUk9EVUNUU19TRVJWSUNFX1BST0dSQU1TIG9yIHRoZSBQUk9EVUNUU19QTEFOU19TRVJWSUNFX1BST0dSQU1TIGVsZW1lbnRzLCBidXQgbm90IGJvdGguPC9kb2N1bWVudGF0aW9uPgotCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTktTIj4KLQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoaXMgcmVmZXJlbmNlcyBhIFJFUVVFU1QvUFJPRFVDVFMvUFJPRFVDVCBlbGVtZW50LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlNFUlZJQ0VfUFJPR1JBTV9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlNFUlZJQ0VfUFJPR1JBTV9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhpcyByZWZlcmVuY2VzIGEgUkVRVUVTVC9TRVJWSUNFX1BST0dSQU1TL1NFUlZJQ0VfUFJPR1JBTSBlbGVtZW50LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9Ik9QVElPTl9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9Ik9QVElPTl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGRvY3VtZW50YXRpb24+VGhpcyByZWZlcmVuY2VzIGEgU0VSVklDRV9QUk9HUkFNUy9TRVJWSUNFX1BST0dSQU0vT1BUSU9OUy9PUFRJT04gZWxlbWVudC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iQ09ORklHVVJBVElPTl9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IkNPTkZJR1VSQVRJT05fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoaXMgcmVmZXJlbmNlcyBhIFNFUlZJQ0VfUFJPR1JBTVMvU0VSVklDRV9QUk9HUkFNL0NPTkZJR1VSQVRJT05TL0NPTkZJR1VSQVRJT04gZWxlbWVudC48L2RvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IHJlZj0icHI6SUQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJTVEFURVMiIHR5cGU9InByOlNUQVRFU1R5cGUiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOk9QVElPTkFMSVRZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iUFJPRFVDVFNfUExBTlNfU0VSVklDRV9QUk9HUkFNUyI+Ci0JCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJPGRvY3VtZW50YXRpb24+QSBjYXJyaWVyIG1heSB1c2UgZWl0aGVyIHRoZSBQUk9EVUNUU19TRVJWSUNFX1BST0dSQU1TIG9yIHRoZSBQUk9EVUNUU19QTEFOU19TRVJWSUNFX1BST0dSQU1TIGVsZW1lbnRzLCBidXQgbm90IGJvdGguPC9kb2N1bWVudGF0aW9uPgotCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTktTIj4KLQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoaXMgcmVmZXJlbmNlcyBhIFJFUVVFU1QvUFJPRFVDVFMvUFJPRFVDVCBlbGVtZW50LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpJRCIvPgotCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IlBMQU5fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJQTEFOX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBSRVFVRVNUL1BMQU5TL1BMQU4uPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOklEIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iU0VSVklDRV9QUk9HUkFNX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQkJCQkJCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iU0VSVklDRV9QUk9HUkFNX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBSRVFVRVNUL1NFUlZJQ0VfUFJPR1JBTVMvU0VSVklDRV9QUk9HUkFNIGVsZW1lbnQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOklEIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iT1BUSU9OX19MSU5LUyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9Ik9QVElPTl9fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoaXMgcmVmZXJlbmNlcyBhIFNFUlZJQ0VfUFJPR1JBTVMvU0VSVklDRV9QUk9HUkFNL09QVElPTlMvT1BUSU9OIGVsZW1lbnQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOklEIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxlbGVtZW50IG5hbWU9IkNPTkZJR1VSQVRJT05fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJDT05GSUdVUkFUSU9OX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBTRVJWSUNFX1BST0dSQU1TL1NFUlZJQ0VfUFJPR1JBTS9DT05GSUdVUkFUSU9OUy9DT05GSUdVUkFUSU9OIGVsZW1lbnQuPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOklEIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iU1RBVEVTIiB0eXBlPSJwcjpTVEFURVNUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPGVsZW1lbnQgcmVmPSJwcjpPUFRJT05BTElUWSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQk8L3NlcXVlbmNlPgotCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCTwvZWxlbWVudD4KLQkJCTwvY2hvaWNlPgotCQkJPGVsZW1lbnQgbmFtZT0iUFJPRFVDVFNfSU5WRVNUTUVOVF9PUFRJT05TIiBtaW5PY2N1cnM9IjAiPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj5JbnZlc3RtZW50IE9wdGlvbiBhdmFpbGFiaWxpdHkgZm9yIHByb2R1Y3RzIGJ5IHN0YXRlPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCTxlbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOS1MiPgotCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJCQkJCTxkb2N1bWVudGF0aW9uPlRoaXMgcmVmZXJlbmNlcyBhIFJFUVVFU1QvUFJPRFVDVFMvUFJPRFVDVCBlbGVtZW50LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOklEIi8+Ci0JCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJJTlZFU1RNRU5UX09QVElPTlNfTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJJTlZFU1RNRU5UX09QVElPTlNfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj5UaGlzIHJlZmVyZW5jZXMgYSBhbiBJTlZFU1RNRU5UX09QVElPTiBlbGVtZW50LjwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCQkJCQkJCQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCByZWY9InByOklEIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJTVEFURVMiIHR5cGU9InByOlNUQVRFU1R5cGUiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCQkJCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCTwvZWxlbWVudD4KLQkJCQkJCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJCTwvY29tcGxleFR5cGU+Ci0JCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCTwvc2VxdWVuY2U+Ci0JCQkJPC9jb21wbGV4VHlwZT4KLQkJCTwvZWxlbWVudD4KLQkJPC9zZXF1ZW5jZT4KLQk8L2NvbXBsZXhUeXBlPgotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hbm51aXR5L2FubnVpdHluZXQueHNkY29uZmlnIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYW5udWl0eS9hbm51aXR5bmV0LnhzZGNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI1NmE1Zi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hbm51aXR5L2FubnVpdHluZXQueHNkY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLTx4Yjpjb25maWcgeG1sbnM6eGI9Imh0dHA6Ly93d3cuYmVhLmNvbS8yMDAyLzA5L3hiZWFuL2NvbmZpZyIKLSAgICAgICAgICAgeG1sbnM6YW49Imh0dHA6Ly93d3cuYW5udWl0eW5ldC5jb20vbmFtZXNwYWNlL3Byb2ZpbGVzIj4KLQotICA8eGI6bmFtZXNwYWNlIHVyaT0iaHR0cDovL3d3dy5hbm51aXR5bmV0LmNvbS9uYW1lc3BhY2UvcHJvZmlsZXMiPgotICAgIDx4YjpwYWNrYWdlPmNvbS5hbm51aXR5bmV0PC94YjpwYWNrYWdlPgotICA8L3hiOm5hbWVzcGFjZT4KLQotICA8eGI6cW5hbWUgbmFtZT0iYW46QUJBX05VTUJFUiIgamF2YW5hbWU9IkFiYU51bWJlciIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46QUNDT1VOVCIgamF2YW5hbWU9IkFjY291bnQiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkFDQ09VTlRTIiBqYXZhbmFtZT0iQWNjb3VudHMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkFDQ09VTlRfTElOSyIgamF2YW5hbWU9IkFjY291bnRMIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpBQ0NPVU5UX0xJTktTIiBqYXZhbmFtZT0iQWNjb3VudExzIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpBQ0NPVU5UX05BTUUiIGphdmFuYW1lPSJBY2NvdW50TmFtZSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46QUNDT1VOVF9OVU1CRVIiIGphdmFuYW1lPSJBY2NvdW50TnVtYmVyIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpBQ1RJVkUiIGphdmFuYW1lPSJBY3RpdmUiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkFDVElWSVRZIiBqYXZhbmFtZT0iQWN0aXZpdHkiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkFQUE9JTlRNRU5UIiBqYXZhbmFtZT0iQXBwdCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46QVBQT0lOVE1FTlRTIiBqYXZhbmFtZT0iQXBwdHMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkFQUE9JTlRNRU5UU1R5cGUiIGphdmFuYW1lPSJBcHB0c1QiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkFTX09GX0RBVEVUSU1FIiBqYXZhbmFtZT0iQXNPZkRhdGV0aW1lIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpBVkFJTEFCSUxJVFkiIGphdmFuYW1lPSJBdmFpbCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46QVZBSUxBQklMSVRZVHlwZSIgamF2YW5hbWU9IkF2YWlsVCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46QkVHSU5fREFURSIgamF2YW5hbWU9IkJlZ2luRGF0ZSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46QlVTSU5FU1NfVU5JVCIgamF2YW5hbWU9IkJVIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpCVVNJTkVTU19VTklUUyIgamF2YW5hbWU9IkJVcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46QlVTSU5FU1NfVU5JVFR5cGUiIGphdmFuYW1lPSJCVVQiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkJVU0lORVNTX1VOSVRfQVZBSUxBQklMSVRZIiBqYXZhbmFtZT0iQlVBdmFpbCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46QlVTSU5FU1NfVU5JVF9MSU5LIiBqYXZhbmFtZT0iQlVMIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpCVVNJTkVTU19VTklUX0xJTktTIiBqYXZhbmFtZT0iQlVMcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46QlVTSU5FU1NfVU5JVF9PUEVSQVRJTkdfUFJPRklMRV9MSU5LUyIgamF2YW5hbWU9IkJVT3BlcmF0aW5nUHJvZmlsZUxzIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpCVVNJTkVTU19VTklUX1JFTEFUSU9OU0hJUCIgamF2YW5hbWU9IkJVUmVsYXRpb25zaGlwIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpCVVNJTkVTU19VTklUX1JFTEFUSU9OU0hJUFMiIGphdmFuYW1lPSJCVVJlbGF0aW9uc2hpcHMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkNISUxEX0JVU0lORVNTX1VOSVRfTElOSyIgamF2YW5hbWU9IkNoaWxkQlVMIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpDTEFTUyIgamF2YW5hbWU9IkNsYXNzIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpDT0RFIiBqYXZhbmFtZT0iQ29kZSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46Q09NTUlTU0lPTlMiIGphdmFuYW1lPSJDb21taXNpb25zIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpDT01NSVNTSU9OX09QVElPTl9MSU5LIiBqYXZhbmFtZT0iQ29tbWlzaW9uT3B0TCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46Q09NTUlTU0lPTl9PUFRJT05fTElOS1MiIGphdmFuYW1lPSJDb21taXNpb25PcHRMcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46Q09ORklHVVJBVElPTl9MSU5LIiBqYXZhbmFtZT0iQ2ZnTCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46Q09ORklHVVJBVElPTl9MSU5LUyIgamF2YW5hbWU9IkNmZ0xzIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpDT05UQUNUIiBqYXZhbmFtZT0iQ29udGFjdCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46Q09OVEFDVFMiIGphdmFuYW1lPSJDb250YWN0cyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46Q09OVEFDVF9MSU5LIiBqYXZhbmFtZT0iQ29udGFjdEwiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkNPTlRBQ1RfTElOS1MiIGphdmFuYW1lPSJDb250YWN0THMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkRFU0NSSVBUSU9OIiBqYXZhbmFtZT0iRGVzY3JpcHRpb24iLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkVGRkVDVElWRV9EQVRFIiBqYXZhbmFtZT0iRWZmZWN0aXZlRGF0ZSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46RU1BSUwiIGphdmFuYW1lPSJFbWFpbCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46RU5EX0RBVEUiIGphdmFuYW1lPSJFbmREYXRlIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpFTlZFTE9QRSIgamF2YW5hbWU9IkVudmVsb3BlIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpFWENFUFRJT04iIGphdmFuYW1lPSJFeGNlcHRpb24iLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkZJUlNUX05BTUUiIGphdmFuYW1lPSJGaXJzdE5hbWUiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkZPUk1BVCIgamF2YW5hbWU9IkZvcm1hdCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46SEVBREVSIiBqYXZhbmFtZT0iSGVhZGVyIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpJRCIgamF2YW5hbWU9IklEIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpJRFMiIGphdmFuYW1lPSJJRHMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOklEVHlwZSIgamF2YW5hbWU9IklEVCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46SU5WRVNUTUVOVF9PUFRJT05TX0xJTksiIGphdmFuYW1lPSJJbnZPcHRzTCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46SU5WRVNUTUVOVF9PUFRJT05TX0xJTktTIiBqYXZhbmFtZT0iSW52T3B0c0xzIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpMQVNUX05BTUUiIGphdmFuYW1lPSJMYXN0TmFtZSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46TElDRU5TRSIgamF2YW5hbWU9IkxpY2Vuc2UiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkxJQ0VOU0VTIiBqYXZhbmFtZT0iTGljZW5zZXMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkxJQ0VOU0VTVHlwZSIgamF2YW5hbWU9IkxpY2Vuc2VzVCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46TElORVNfT0ZfQlVTSU5FU1MiIGphdmFuYW1lPSJMaW5lc09mQnVzaW5lc3MiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOkxJTkVfT0ZfQlVTSU5FU1MiIGphdmFuYW1lPSJMaW5lT2ZCdXNpbmVzcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46TElOS1R5cGUiIGphdmFuYW1lPSJMVCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46TUlERExFX0lOSVRJQUwiIGphdmFuYW1lPSJNaWRkbGVJbml0aWFsIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpNT05FWV9GT1JNIiBqYXZhbmFtZT0iTW9uZXlGb3JtIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpNT05FWV9GT1JNUyIgamF2YW5hbWU9Ik1vbmV5Rm9ybXMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOk1PTkVZX0ZPUk1TVHlwZSIgamF2YW5hbWU9Ik1vbmV5Rm9ybXNUIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpOQU1FIiBqYXZhbmFtZT0iTmFtZSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46TkVUVElOR19PUFRJT04iIGphdmFuYW1lPSJOZXR0aW5nT3B0Ii8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpORVdfQlVTSU5FU1MiIGphdmFuYW1lPSJOZXdCdXNpbmVzcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46T1BFUkFUSU5HX1BST0ZJTEUiIGphdmFuYW1lPSJPcGVyYXRpbmdQcm9maWxlIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpPUEVSQVRJTkdfUFJPRklMRVMiIGphdmFuYW1lPSJPcGVyYXRpbmdQcm9maWxlcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46T1BFUkFUSU5HX1BST0ZJTEVUeXBlIiBqYXZhbmFtZT0iT3BlcmF0aW5nUHJvZmlsZVQiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOk9QRVJBVElOR19QUk9GSUxFX0xJTksiIGphdmFuYW1lPSJPcGVyYXRpbmdQcm9maWxlTCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46T1BFUkFUSU5HX1BST0ZJTEVfTElOS1MiIGphdmFuYW1lPSJPcGVyYXRpbmdQcm9maWxlTHMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOk9QVElPTkFMSVRZIiBqYXZhbmFtZT0iT3B0aW9uYWxpdHkiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOk9QVElPTl9MSU5LIiBqYXZhbmFtZT0iT3B0TCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46T1BUSU9OX0xJTktTIiBqYXZhbmFtZT0iT3B0THMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOk9QVElPTl9fTElOSyIgamF2YW5hbWU9Ik9wdEwiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOk9QVElPTl9fTElOS1MiIGphdmFuYW1lPSJPcHRMcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46T1JERVIiIGphdmFuYW1lPSJPcmRlciIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46T1dORVJfTkFNRSIgamF2YW5hbWU9Ik93bmVyTmFtZSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UEFSQU1FVEVSIiBqYXZhbmFtZT0iUGFyYW0iLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlBBUkFNRVRFUlMiIGphdmFuYW1lPSJQYXJhbXMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlBBUkVOVF9CVVNJTkVTU19VTklUX0xJTksiIGphdmFuYW1lPSJQYXJlbnRCVUwiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlBBUlRZX0lEIiBqYXZhbmFtZT0iUGFydElEIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpQQVJUWV9MSU5LX0lEIiBqYXZhbmFtZT0iUGFydHlMSUQiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlBBU1NXT1JEIiBqYXZhbmFtZT0iUGFzc3dvcmQiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlBIT05FX05VTUJFUiIgamF2YW5hbWU9IlBob25lTnVtYmVyIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpQTEFOX0xJTksiIGphdmFuYW1lPSJQbGFuTCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UExBTl9MSU5LUyIgamF2YW5hbWU9IlBsYW5McyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UFJPRFVDVFMiIGphdmFuYW1lPSJQcm9kdWN0cyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UFJPRFVDVFNfSU5WRVNUTUVOVF9PUFRJT05TIiBqYXZhbmFtZT0iUHJvZEludk9wdHMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlBST0RVQ1RTX1BMQU5TIiBqYXZhbmFtZT0iUHJvZFBsYW5zIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpQUk9EVUNUU19QTEFOU19SSURFUlMiIGphdmFuYW1lPSJQcm9kUGxhbnNSaWRlcnMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlBST0RVQ1RTX1BMQU5TX1NFUlZJQ0VfUFJPR1JBTVMiIGphdmFuYW1lPSJQcm9kUGxhbnNTdmNQcm9ncyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UFJPRFVDVFNfUklERVJTIiBqYXZhbmFtZT0iUHJvZFJpZGVycyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UFJPRFVDVFNfU0VSVklDRV9QUk9HUkFNUyIgamF2YW5hbWU9IlByb2RTdmNQcm9ncyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UFJPRFVDVF9MSU5LIiBqYXZhbmFtZT0iUHJvZEwiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlBST0RVQ1RfTElOS1MiIGphdmFuYW1lPSJQcm9kTHMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlBVUlBPU0UiIGphdmFuYW1lPSJQdXJwb3NlIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpSRUNFSVZFX0RBVEVUSU1FIiBqYXZhbmFtZT0iUmVjZWl2ZURhdGV0aW1lIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpSRUNFSVZJTkdfUEFSVFlfSUQiIGphdmFuYW1lPSJSZWNlaXZpbmdQYXJ0eUlEIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpSRVFVRVNUIiBqYXZhbmFtZT0iUmVxdWVzdCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UkVTUE9OU0lCSUxJVFkiIGphdmFuYW1lPSJSZXNwb25zaWJpbGl0eSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UklERVJfTElOSyIgamF2YW5hbWU9IlJpZGVyTCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46UklERVJfTElOS1MiIGphdmFuYW1lPSJSaWRlckxzIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpST1VUSU5HIiBqYXZhbmFtZT0iUm91dGluZyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46Uk9VVElOR19ISVNUT1JZIiBqYXZhbmFtZT0iUm91dGluZ0hpc3RvcnkiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlNBTFVUQVRJT05fQ0QiIGphdmFuYW1lPSJTYWx1dGF0aW9uQ0QiLz4KLSAgPHhiOnFuYW1lIG5hbWU9IlNDSEVNQV9WRVJTSU9OIiBqYXZhbmFtZT0iU2NoZW1hVmVyc2lvbiIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46U0VORElOR19QQVJUWV9JRCIgamF2YW5hbWU9IlNlbmRpbmdQYXJ0eUlEIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpTRU5EX0RBVEVUSU1FIiBqYXZhbmFtZT0iU2VuZERhdGV0aW1lIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpTRVJWSUNFX1BST0dSQU1fTElOSyIgamF2YW5hbWU9IlN2Y1Byb2dMIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpTRVJWSUNFX1BST0dSQU1fTElOS1MiIGphdmFuYW1lPSJTdmNQcm9nTHMiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlNUQVRFIiBqYXZhbmFtZT0iU3RhdGUiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlNUQVRFUyIgamF2YW5hbWU9IlN0YXRlcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46U1RBVEVTVHlwZSIgamF2YW5hbWU9IlN0YXRlc1QiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlNUQVRFVHlwZSIgamF2YW5hbWU9IlN0YXRlVCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46U1RBVFVTIiBqYXZhbmFtZT0iU3RhdHVzIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpTVEVQIiBqYXZhbmFtZT0iU3RlcCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46U1RFUFR5cGUiIGphdmFuYW1lPSJTdGVwVCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46U1VGRklYX0NEIiBqYXZhbmFtZT0iU3VmZml4Q0QiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlRFUk1fREFURSIgamF2YW5hbWU9IlRlcm1EYXRlIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpURVNUIiBqYXZhbmFtZT0iVGVzdCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46VElOIiBqYXZhbmFtZT0iVElOIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpUUkFOU0FDVElPTiIgamF2YW5hbWU9IlR4biIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46VFJBTlNBQ1RJT05fQ09VTlQiIGphdmFuYW1lPSJUeG5Db3VudCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46VFJBTlNBQ1RJT05fSUQiIGphdmFuYW1lPSJUeG5JZCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46VFJBTlNBQ1RJT05fUk9VVElORyIgamF2YW5hbWU9IlR4blJvdXRpbmciLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlRSQU5TQUNUSU9OX1JPVVRJTkdTIiBqYXZhbmFtZT0iVHhuUm91dGluZ3MiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlRSQU5TQUNUSU9OX1JPVVRJTkdfTElOSyIgamF2YW5hbWU9IlR4blJvdXRpbmdMIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpUUkFOU0FDVElPTl9UWVBFIiBqYXZhbmFtZT0iVHhuVHlwZSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46VFJBTlNBQ1RJT05fVFlQRVMiIGphdmFuYW1lPSJUeG5UeXBlcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46VFlQRSIgamF2YW5hbWU9IlR5cGUiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlVTRVIiIGphdmFuYW1lPSJVc2VyIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpVU0VSUyIgamF2YW5hbWU9IlVzZXJzIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpVU0VSX0xJTksiIGphdmFuYW1lPSJVc2VyTCIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46VVNFUl9MT0dPTl9JRCIgamF2YW5hbWU9IlVzZXJMb2dvbklEIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpVU0VSX1JPTEUiIGphdmFuYW1lPSJVc2VyUm9sZSIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46VVNFUl9ST0xFUyIgamF2YW5hbWU9IlVzZXJSb2xlcyIvPgotICA8eGI6cW5hbWUgbmFtZT0iYW46VVNFUl9ST0xFX0xJTksiIGphdmFuYW1lPSJVc2VyUm9sZUwiLz4KLSAgPHhiOnFuYW1lIG5hbWU9ImFuOlVTRVJfVE9fQlVTSU5FU1NfVU5JVF9NQVBQSU5HIiBqYXZhbmFtZT0iVXNlclRvQlVNYXBwaW5nIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpVU0VSX1RPX0JVU0lORVNTX1VOSVRfTUFQUElOR1MiIGphdmFuYW1lPSJVc2VyVG9CVU1BcHBpbmdzIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpWQUxVRSIgamF2YW5hbWU9IlZhbHVlIi8+Ci0gIDx4YjpxbmFtZSBuYW1lPSJhbjpXUklUSU5HX0NPTVBBTlkiIGphdmFuYW1lPSJXcml0aW5nQ29tcGFueSIvPgotCi08L3hiOmNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0FkZF9BY2N0U2llYmVsNy54bWwgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0FkZF9BY2N0U2llYmVsNy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OWEyZDIuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9BZGRfQWNjdFNpZWJlbDcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gZWRpdGVkIHdpdGggWE1MIFNweSB2NC40IFUgKGh0dHA6Ly93d3cueG1sc3B5LmNvbSkgYnkgQm9yaXMgUG9ydG5veSAoSW5mb3JtYXRpb24gQnVpbGRlcnMgSW5jLikgLS0+Ci08P1NpZWJlbC1Qcm9wZXJ0eS1TZXQgRXNjYXBlTmFtZXM9ImZhbHNlIj8+Ci08U2llYmVsTWVzc2FnZSBNZXNzYWdlSWQ9IjEtTiIgSW50T2JqZWN0Rm9ybWF0PSJTaWViZWwgSGllcmFyY2hpY2FsIiBNZXNzYWdlVHlwZT0iSW50ZWdyYXRpb24gT2JqZWN0IiBJbnRPYmplY3ROYW1lPSJTYW1wbGUgQWNjb3VudCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IkY6XEFkYXB0ZXJzXHNpZWJlbFxBZGRfQWNjdFNpZWJlbDdfMS54c2QiPgotCTxMaXN0T2ZTYW1wbGVBY2NvdW50PgotCQk8QWNjb3VudD4KLQkJCTxDdWx0dXJlLz4KLQkJCTxDdXJyZW5jeUNvZGU+VVNEPC9DdXJyZW5jeUNvZGU+Ci0JCQk8RGVzY3JpcHRpb24vPgotCQkJPERpdmlzaW9uLz4KLQkJCTxIb21lUGFnZS8+Ci0JCQk8SW50ZWdyYXRpb25JZC8+Ci0JCQk8TGluZW9mQnVzaW5lc3MvPgotCQkJPExvY2F0aW9uLz4KLQkJCTxOYW1lPkJlYSBEZW1vPC9OYW1lPgotCQkJPFByb2plY3ROYW1lLz4KLQkJCTxUeXBlPkNvbW1lcmNpYWw8L1R5cGU+Ci0JCQk8TGlzdE9mQWNjb3VudF9Pcmdhbml6YXRpb24+Ci0JCQkJPEFjY291bnRfT3JnYW5pemF0aW9uIElzUHJpbWFyeU1WRz0iWSI+Ci0JCQkJCTxJbnRlZ3JhdGlvbklkLz4KLQkJCQkJPE9yZ2FuaXphdGlvbj5EZWZhdWx0IE9yZ2FuaXphdGlvbjwvT3JnYW5pemF0aW9uPgotCQkJCTwvQWNjb3VudF9Pcmdhbml6YXRpb24+Ci0JCQk8L0xpc3RPZkFjY291bnRfT3JnYW5pemF0aW9uPgotCQkJPExpc3RPZkFjY291bnRBdHRhY2htZW50Lz4KLQkJCTxMaXN0T2ZCdXNpbmVzc0FkZHJlc3M+Ci0JCQkJPEJ1c2luZXNzQWRkcmVzcz4KLQkJCQkJPEFkZHJlc3NOYW1lPk5ZPC9BZGRyZXNzTmFtZT4KLQkJCQkJPENpdHk+Tlk8L0NpdHk+Ci0JCQkJCTxDb3VudHJ5PlVTQTwvQ291bnRyeT4KLQkJCQkJPEZheE51bWJlcj45ODc2NTQzMjExPC9GYXhOdW1iZXI+Ci0JCQkJCTxJbnRlZ3JhdGlvbklkLz4KLQkJCQkJPFBob25lTnVtYmVyPjEyMzQ1Njc4OTA8L1Bob25lTnVtYmVyPgotCQkJCQk8UG9zdGFsQ29kZT4wNzMwMTwvUG9zdGFsQ29kZT4KLQkJCQkJPFByb3ZpbmNlLz4KLQkJCQkJPFN0YXRlPk5ZPC9TdGF0ZT4KLQkJCQkJPFN0cmVldEFkZHJlc3M+MiBNYWRpc2lvbiBTcXVhcmU8L1N0cmVldEFkZHJlc3M+Ci0JCQkJPC9CdXNpbmVzc0FkZHJlc3M+Ci0JCQk8L0xpc3RPZkJ1c2luZXNzQWRkcmVzcz4KLQkJCTxMaXN0T2ZDb250YWN0Lz4KLQkJPC9BY2NvdW50PgotCTwvTGlzdE9mU2FtcGxlQWNjb3VudD4KLTwvU2llYmVsTWVzc2FnZT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvQWRkX0FjY3RTaWViZWw3LnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvQWRkX0FjY3RTaWViZWw3LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyNTY5YS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0FkZF9BY2N0U2llYmVsNy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS1XM0MgU2NoZW1hIGdlbmVyYXRlZCBieSBYTUwgU3B5IHY0LjQgVSAoaHR0cDovL3d3dy54bWxzcHkuY29tKS0tPgotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCQkKLQk8eHNkOmVsZW1lbnQgbmFtZT0iU2llYmVsTWVzc2FnZSI+Ci0JICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLQkJCSAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlNhbXBsZUFjY291bnQiIHR5cGU9Ikxpc3RPZlNhbXBsZUFjY291bnRfdHlwZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHNkOnNlcXVlbmNlPiAgCi0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJNZXNzYWdlSWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Ik1lc3NhZ2VUeXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJJbnRPYmplY3ROYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBmaXhlZD0iU2FtcGxlIEFjY291bnQiLz4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9IkludE9iamVjdEZvcm1hdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4JCi0JPC94c2Q6ZWxlbWVudD4KLQkKLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlNhbXBsZUFjY291bnRfdHlwZSI+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBY2NvdW50IiB0eXBlPSJBY2NvdW50X3R5cGUiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQkKLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjY291bnRfdHlwZSI+Ci0JCSA8eHNkOnNlcXVlbmNlPgotCQkJCTwhLS14c2Q6ZWxlbWVudCBuYW1lPSJTeXN0ZW0iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvLS0+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkN1bHR1cmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDdXJyZW5jeUNvZGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkRpdmlzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSG9tZVBhZ2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlZ3JhdGlvbklkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTGluZW9mQnVzaW5lc3MiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMb2NhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCi0JCQkJPHhzZDplbGVtZW50IG5hbWU9Ik5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9qZWN0TmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlR5cGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZBY2NvdW50X09yZ2FuaXphdGlvbiIgdHlwZT0iTGlzdE9mQWNjb3VudF9Pcmdhbml6YXRpb25fdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCi0JCQkJPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkFjY291bnRBdHRhY2htZW50IiB0eXBlPSJMaXN0T2ZBY2NvdW50QXR0YWNobWVudF90eXBlIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8IS0teHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQWNjb3VudEF0dGFjaG1lbnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvLS0+Ci0JCQkJCi0JCQkJPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkJ1c2luZXNzQWRkcmVzcyIgdHlwZT0iTGlzdE9mQnVzaW5lc3NBZGRyZXNzX3R5cGUiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb250YWN0IiB0eXBlPSJMaXN0T2ZDb250YWN0X3R5cGUiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwhLS14c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb250YWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLy0tPgotCQkJCQotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTdWJBY2NvdW50IiB0eXBlPSJMaXN0T2ZTdWJBY2NvdW50X3R5cGUiIG1pbk9jY3Vycz0iMCIvPgotCQkgIDwveHNkOnNlcXVlbmNlPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWFyY2hzcGVjIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZBY2NvdW50X09yZ2FuaXphdGlvbl90eXBlIj4KLQkgIAk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBY2NvdW50X09yZ2FuaXphdGlvbiIgdHlwZT0iQWNjb3VudF9Pcmdhbml6YXRpb25fdHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JICA8L3hzZDpjb21wbGV4VHlwZT4KLQkgIAotCSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZBY2NvdW50QXR0YWNobWVudF90eXBlIj4KLQkJICA8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBY2NvdW50QXR0YWNobWVudCIgdHlwZT0iQWNjb3VudEF0dGFjaG1lbnRfdHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkgIDwveHNkOnNlcXVlbmNlPgotCSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0JICAKLQkgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQnVzaW5lc3NBZGRyZXNzX3R5cGUiPgotCQkgIDx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkJ1c2luZXNzQWRkcmVzcyIgdHlwZT0iQnVzaW5lc3NBZGRyZXNzX3R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJICA8L3hzZDpzZXF1ZW5jZT4KLQkgIDwveHNkOmNvbXBsZXhUeXBlPgotCQotCSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZDb250YWN0X3R5cGUiPgotCSAgCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3QiIHR5cGU9IkNvbnRhY3RfdHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZDb250YWN0X0J1c2luZXNzQWRkcmVzc190eXBlIj4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3RfQnVzaW5lc3NBZGRyZXNzIiB0eXBlPSJDb250YWN0X0J1c2luZXNzQWRkcmVzc190eXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkgIDwveHNkOmNvbXBsZXhUeXBlPgotCQotCSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZTdWJBY2NvdW50X3R5cGUiPgotCQkgPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViQWNjb3VudCIgdHlwZT0iU3ViQWNjb3VudF90eXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCSA8L3hzZDpzZXF1ZW5jZT4KLQkgIDwveHNkOmNvbXBsZXhUeXBlPgotCQotCSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY2NvdW50QXR0YWNobWVudF90eXBlIiA+Ci0JCSAgPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWNjbnRGaWxlRXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWNjbnRGaWxlTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbW1lbnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50SWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkgIDwveHNkOnNlcXVlbmNlPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWFyY2hzcGVjIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCQotCQotCSA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjY291bnRfT3JnYW5pemF0aW9uX3R5cGUiPgotCQkgPHhzZDpzZXF1ZW5jZT4KLQkJCSA8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZWdyYXRpb25JZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkgPHhzZDplbGVtZW50IG5hbWU9Ik9yZ2FuaXphdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCSA8L3hzZDpzZXF1ZW5jZT4KLQkJIDx4c2Q6YXR0cmlidXRlIG5hbWU9IklzUHJpbWFyeU1WRyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCSA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWFyY2hzcGVjIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JIDwveHNkOmNvbXBsZXhUeXBlPgotCi0JCi0JIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQnVzaW5lc3NBZGRyZXNzX3R5cGUiPgotCQkgPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkcmVzc05hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ291bnRyeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkZheE51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVncmF0aW9uSWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQaG9uZU51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3RhbENvZGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm92aW5jZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3RyZWV0QWRkcmVzcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VhcmNoc3BlYyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCQotCi0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250YWN0X3R5cGUiPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDZWxsdWxhclBob25lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29tbWVudDIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJGaXJzdE5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJIb21lUGhvbmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlZ3JhdGlvbklkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSm9iVGl0bGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMYXN0TmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1pZGRsZU5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcmdhbml6YXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJzb25hbENvbnRhY3QiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb250YWN0X0J1c2luZXNzQWRkcmVzcyIgdHlwZT0iTGlzdE9mQ29udGFjdF9CdXNpbmVzc0FkZHJlc3NfdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VhcmNoc3BlYyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCQotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGFjdF9CdXNpbmVzc0FkZHJlc3NfdHlwZSI+Ci0JCSA8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ291bnRyeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3RhbENvZGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlN0cmVldEFkZHJlc3MiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdHJlZXRBZGRyZXNzMiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZHJlc3NOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZWdyYXRpb25JZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9IklzUHJpbWFyeU1WRyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWFyY2hzcGVjIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCQotCSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdWJBY2NvdW50X3R5cGUiPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDcmVhdGVkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVXBkYXRlZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbmZsaWN0SWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNb2RJZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkFjY291bnRTdGF0dXMyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWxpYXMyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXNzaWdubWVudEFyZWFDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXNzaWdubWVudENvdW50cnlDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ1NOMiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbXBldGl0b3IiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDdXJyZW5jeUNvZGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkRpdmlzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR3JvdXBUeXBlQ29kZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVybmFsT3JnRmxhZyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkxvY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTG9jYXRpb25MZXZlbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1haW5GYXhOdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYWluUGhvbmVOdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGFyZW50QWNjb3VudERpdmlzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGFyZW50QWNjb3VudElkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGFyZW50QWNjb3VudExvY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGFyZW50QWNjb3VudExvY2F0aW9uTGV2ZWwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJlbnRBY2NvdW50TmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlBhcmVudEFjY291bnRSZWdpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0eU5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0eVR5cGVDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGFydHlVSWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmltYXJ5SW5kdXN0cnlJZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlByaW1hcnlPcmdhbml6YXRpb25JZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlByaW1hcnlQb3NpdGlvbklkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJpbWFyeVNlcnZpY2VBZ3JlZW1lbnRJZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlByaW1hcnlTeW5vbnltSWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWdpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTLVNJbnN0YW5jZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlMtU0luc3RhbmNlSWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTLVNLZXlJZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlR5cGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNlYXJjaHNwZWMiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgCTwveHNkOmNvbXBsZXhUeXBlPgotCi0JCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0RCTVMxX0FkZEN1c3RvbWVyX3JlcXVlc3QueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9EQk1TMV9BZGRDdXN0b21lcl9yZXF1ZXN0LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2NWU0Yy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0RCTVMxX0FkZEN1c3RvbWVyX3JlcXVlc3QueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCi0KLSAgPHhzZDplbGVtZW50IG5hbWU9IklucHV0Ij4KLSAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkZJUlNUTkFNRSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTEFTVE5BTUUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkRPQiIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9EQk1TMV9BZGRDdXN0b21lcl9yZXNwb25zZS54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0RCTVMxX0FkZEN1c3RvbWVyX3Jlc3BvbnNlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiNzhkYS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0RCTVMxX0FkZEN1c3RvbWVyX3Jlc3BvbnNlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCi0KLSAgPHhzZDplbGVtZW50IG5hbWU9IlJvd3NBZmZlY3RlZCIgdHlwZT0ieHNkOmludCIvPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0RCTVMxX0dldEFsbEN1c3RvbWVyc19yZXNwb25zZS54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0RCTVMxX0dldEFsbEN1c3RvbWVyc19yZXNwb25zZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOTVhNGUuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9EQk1TMV9HZXRBbGxDdXN0b21lcnNfcmVzcG9uc2UueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCi0KLSAgPHhzZDplbGVtZW50IG5hbWU9IlJvd3MiPgotICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUm93IiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFERFJFU1MxIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBRERSRVNTMiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQUREUkVTUzMiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNJVFkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNPVU5UUlkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkRPQiIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFTUFJTCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRkFYIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJGSVJTVE5BTUUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkxBU1ROQU1FIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNSURETEVOQU1FIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQSE9ORSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUE9TVEFMQ09ERSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvSElQQUEyNzAueG1sIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9ISVBBQTI3MC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYmY4NmQuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9ISVBBQTI3MC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgSElQQUEyNzA+Ci08SElQQUEyNzA+Ci0gIDxJU0E+Ci0gICAgPF8wMV9BdXRob3JpemF0aW9uX0luZm9ybWF0aW9uX1F1YWxpZmllcl8+MDA8L18wMV9BdXRob3JpemF0aW9uX0luZm9ybWF0aW9uX1F1YWxpZmllcl8+Ci0gICAgPF8wMl9BdXRob3JpemF0aW9uX0luZm9ybWF0aW9uXz4xMjM0NTY3ODkwPC9fMDJfQXV0aG9yaXphdGlvbl9JbmZvcm1hdGlvbl8+Ci0gICAgPF8wM19TZWN1cml0eV9JbmZvcm1hdGlvbl9RdWFsaWZpZXJfPjAwPC9fMDNfU2VjdXJpdHlfSW5mb3JtYXRpb25fUXVhbGlmaWVyXz4KLSAgICA8XzA0X1NlY3VyaXR5X0luZm9ybWF0aW9uXz4xMjM0NTY3ODkwPC9fMDRfU2VjdXJpdHlfSW5mb3JtYXRpb25fPgotICAgIDxfMDVfSW50ZXJjaGFuZ2VfSURfUXVhbGlmaWVyXz5aWjwvXzA1X0ludGVyY2hhbmdlX0lEX1F1YWxpZmllcl8+Ci0gICAgPF8wNl9JbnRlcmNoYW5nZV9TZW5kZXJfSURfPlNVQk1JVFRFUlMgSUQxMjwvXzA2X0ludGVyY2hhbmdlX1NlbmRlcl9JRF8+Ci0gICAgPF8wN19JbnRlcmNoYW5nZV9JRF9RdWFsaWZpZXJfPlpaPC9fMDdfSW50ZXJjaGFuZ2VfSURfUXVhbGlmaWVyXz4KLSAgICA8XzA4X0ludGVyY2hhbmdlX1JlY2VpdmVyX0lEXz5SRUNFSVZFUlMgSUQxMjM8L18wOF9JbnRlcmNoYW5nZV9SZWNlaXZlcl9JRF8+Ci0gICAgPF8wOV9JbnRlcmNoYW5nZV9EYXRlXz4wMTAxMjI8L18wOV9JbnRlcmNoYW5nZV9EYXRlXz4KLSAgICA8XzEwX0ludGVyY2hhbmdlX1RpbWVfPjEyNTM8L18xMF9JbnRlcmNoYW5nZV9UaW1lXz4KLSAgICA8XzExX1JlcGV0aXRpb25fU2VwYXJhdG9yXz5VPC9fMTFfUmVwZXRpdGlvbl9TZXBhcmF0b3JfPgotICAgIDxfMTJfSW50ZXJjaGFuZ2VfQ29udHJvbF9WZXJzaW9uX051bWJlcl8+MDA0MDE8L18xMl9JbnRlcmNoYW5nZV9Db250cm9sX1ZlcnNpb25fTnVtYmVyXz4KLSAgICA8XzEzX0ludGVyY2hhbmdlX0NvbnRyb2xfTnVtYmVyXz4wMDAwMDA5MDU8L18xM19JbnRlcmNoYW5nZV9Db250cm9sX051bWJlcl8+Ci0gICAgPF8xNF9BY2tub3dsZWRnZW1lbnRfUmVxdWVzdGVkXz4xPC9fMTRfQWNrbm93bGVkZ2VtZW50X1JlcXVlc3RlZF8+Ci0gICAgPF8xNV9Vc2FnZV9JbmRpY2F0b3JfPlQ8L18xNV9Vc2FnZV9JbmRpY2F0b3JfPgotICAgIDxfMTZfQ29tcG9uZW50X0VsZW1lbnRfU2VwYXJhdG9yXz46PC9fMTZfQ29tcG9uZW50X0VsZW1lbnRfU2VwYXJhdG9yXz4KLSAgPC9JU0E+Ci0gIDxHUz4KLSAgICA8XzAxX0Z1bmN0aW9uYWxfSWRlbnRpZmllcl9Db2RlXz5IUzwvXzAxX0Z1bmN0aW9uYWxfSWRlbnRpZmllcl9Db2RlXz4KLSAgICA8XzAyX0FwcGxpY2F0aW9uX1NlbmRlcnNfQ29kZV8+U2VuZGVySUQ8L18wMl9BcHBsaWNhdGlvbl9TZW5kZXJzX0NvZGVfPgotICAgIDxfMDNfQXBwbGljYXRpb25fUmVjZWl2ZXJzX0NvZGVfPlJlY2VpdmVySUQ8L18wM19BcHBsaWNhdGlvbl9SZWNlaXZlcnNfQ29kZV8+Ci0gICAgPF8wNF9EYXRlXz4yMDAxMDEyMjwvXzA0X0RhdGVfPgotICAgIDxfMDVfVGltZV8+MTMxMDwvXzA1X1RpbWVfPgotICAgIDxfMDZfR3JvdXBfQ29udHJvbF9OdW1iZXJfPjE8L18wNl9Hcm91cF9Db250cm9sX051bWJlcl8+Ci0gICAgPF8wN19SZXNwb25zaWJsZV9BZ2VuY3lfQ29kZV8+WDwvXzA3X1Jlc3BvbnNpYmxlX0FnZW5jeV9Db2RlXz4KLSAgICA8XzA4X1ZlcnNpb25fX1JlbGVhc2VfX0luZHVzdHJ5X0lkZW50aWZpZXJfQ29kZV8+MDA0MDEwWDA5MjwvXzA4X1ZlcnNpb25fX1JlbGVhc2VfX0luZHVzdHJ5X0lkZW50aWZpZXJfQ29kZV8+Ci0gIDwvR1M+Ci0gIDxfMjcwPgotICAgIDxTVD4KLSAgICAgIDxfMDFfVHJhbnNhY3Rpb25fU2V0X0lkZW50aWZpZXJfQ29kZV8+MjcwPC9fMDFfVHJhbnNhY3Rpb25fU2V0X0lkZW50aWZpZXJfQ29kZV8+Ci0gICAgICA8XzAyX1RyYW5zYWN0aW9uX1NldF9Db250cm9sX051bWJlcl8+MTIzNDwvXzAyX1RyYW5zYWN0aW9uX1NldF9Db250cm9sX051bWJlcl8+Ci0gICAgPC9TVD4KLSAgICA8QkhUPgotICAgICAgPF8wMV9IaWVyYXJjaGljYWxfU3RydWN0dXJlX0NvZGVfPjAwMjI8L18wMV9IaWVyYXJjaGljYWxfU3RydWN0dXJlX0NvZGVfPgotICAgICAgPF8wMl9UcmFuc2FjdGlvbl9TZXRfUHVycG9zZV9Db2RlXz4xMzwvXzAyX1RyYW5zYWN0aW9uX1NldF9QdXJwb3NlX0NvZGVfPgotICAgICAgPF8wM19SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fPjEwMDAxMjM0PC9fMDNfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz4KLSAgICAgIDxfMDRfRGF0ZV8+MTk5OTA1MDE8L18wNF9EYXRlXz4KLSAgICAgIDxfMDVfVGltZV8+MTMxOTwvXzA1X1RpbWVfPgotICAgICAgPF8wNl9UcmFuc2FjdGlvbl9UeXBlX0NvZGVfLz4KLSAgICA8L0JIVD4KLSAgICA8XzIwMDBBPgotICAgICAgPEhMPgotICAgICAgICA8XzAxX0hpZXJhcmNoaWNhbF9JRF9OdW1iZXJfPjE8L18wMV9IaWVyYXJjaGljYWxfSURfTnVtYmVyXz4KLSAgICAgICAgPF8wMl9IaWVyYXJjaGljYWxfUGFyZW50X0lEX051bWJlcl8vPgotICAgICAgICA8XzAzX0hpZXJhcmNoaWNhbF9MZXZlbF9Db2RlXz4yMDwvXzAzX0hpZXJhcmNoaWNhbF9MZXZlbF9Db2RlXz4KLSAgICAgICAgPF8wNF9IaWVyYXJjaGljYWxfQ2hpbGRfQ29kZV8+MTwvXzA0X0hpZXJhcmNoaWNhbF9DaGlsZF9Db2RlXz4KLSAgICAgIDwvSEw+Ci0gICAgICA8XzIxMDBBPgotICAgICAgICA8Tk0xPgotICAgICAgICAgIDxfMDFfRW50aXR5X0lkZW50aWZpZXJfQ29kZV8+UFI8L18wMV9FbnRpdHlfSWRlbnRpZmllcl9Db2RlXz4KLSAgICAgICAgICA8XzAyX0VudGl0eV9UeXBlX1F1YWxpZmllcl8+MjwvXzAyX0VudGl0eV9UeXBlX1F1YWxpZmllcl8+Ci0gICAgICAgICAgPF8wM19OYW1lX0xhc3Rfb3JfT3JnYW5pemF0aW9uX05hbWVfPkFCQ0NPTVBBTlk8L18wM19OYW1lX0xhc3Rfb3JfT3JnYW5pemF0aW9uX05hbWVfPgotICAgICAgICAgIDxfMDRfTmFtZV9GaXJzdF8vPgotICAgICAgICAgIDxfMDVfTmFtZV9NaWRkbGVfLz4KLSAgICAgICAgICA8XzA2X05hbWVfUHJlZml4Xy8+Ci0gICAgICAgICAgPF8wN19OYW1lX1N1ZmZpeF8vPgotICAgICAgICAgIDxfMDhfSWRlbnRpZmljYXRpb25fQ29kZV9RdWFsaWZpZXJfPlBJPC9fMDhfSWRlbnRpZmljYXRpb25fQ29kZV9RdWFsaWZpZXJfPgotICAgICAgICAgIDxfMDlfSWRlbnRpZmljYXRpb25fQ29kZV8+ODQyNjEwMDAxPC9fMDlfSWRlbnRpZmljYXRpb25fQ29kZV8+Ci0gICAgICAgIDwvTk0xPgotICAgICAgPC9fMjEwMEE+Ci0gICAgICA8XzIwMDBCPgotICAgICAgICA8SEw+Ci0gICAgICAgICAgPF8wMV9IaWVyYXJjaGljYWxfSURfTnVtYmVyXz4yPC9fMDFfSGllcmFyY2hpY2FsX0lEX051bWJlcl8+Ci0gICAgICAgICAgPF8wMl9IaWVyYXJjaGljYWxfUGFyZW50X0lEX051bWJlcl8+MTwvXzAyX0hpZXJhcmNoaWNhbF9QYXJlbnRfSURfTnVtYmVyXz4KLSAgICAgICAgICA8XzAzX0hpZXJhcmNoaWNhbF9MZXZlbF9Db2RlXz4yMTwvXzAzX0hpZXJhcmNoaWNhbF9MZXZlbF9Db2RlXz4KLSAgICAgICAgICA8XzA0X0hpZXJhcmNoaWNhbF9DaGlsZF9Db2RlXz4xPC9fMDRfSGllcmFyY2hpY2FsX0NoaWxkX0NvZGVfPgotICAgICAgICA8L0hMPgotICAgICAgICA8XzIxMDBCPgotICAgICAgICAgIDxOTTE+Ci0gICAgICAgICAgICA8XzAxX0VudGl0eV9JZGVudGlmaWVyX0NvZGVfPjFQPC9fMDFfRW50aXR5X0lkZW50aWZpZXJfQ29kZV8+Ci0gICAgICAgICAgICA8XzAyX0VudGl0eV9UeXBlX1F1YWxpZmllcl8+MTwvXzAyX0VudGl0eV9UeXBlX1F1YWxpZmllcl8+Ci0gICAgICAgICAgICA8XzAzX05hbWVfTGFzdF9vcl9Pcmdhbml6YXRpb25fTmFtZV8+Sk9ORVM8L18wM19OYW1lX0xhc3Rfb3JfT3JnYW5pemF0aW9uX05hbWVfPgotICAgICAgICAgICAgPF8wNF9OYW1lX0ZpcnN0Xz5NQVJDVVM8L18wNF9OYW1lX0ZpcnN0Xz4KLSAgICAgICAgICAgIDxfMDVfTmFtZV9NaWRkbGVfLz4KLSAgICAgICAgICAgIDxfMDZfTmFtZV9QcmVmaXhfLz4KLSAgICAgICAgICAgIDxfMDdfTmFtZV9TdWZmaXhfLz4KLSAgICAgICAgICAgIDxfMDhfSWRlbnRpZmljYXRpb25fQ29kZV9RdWFsaWZpZXJfPlNWPC9fMDhfSWRlbnRpZmljYXRpb25fQ29kZV9RdWFsaWZpZXJfPgotICAgICAgICAgICAgPF8wOV9JZGVudGlmaWNhdGlvbl9Db2RlXz4wMjAyMDM0PC9fMDlfSWRlbnRpZmljYXRpb25fQ29kZV8+Ci0gICAgICAgICAgPC9OTTE+Ci0gICAgICAgICAgPFJFRj4KLSAgICAgICAgICAgIDxfMDFfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uX1F1YWxpZmllcl8+TjU8L18wMV9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fUXVhbGlmaWVyXz4KLSAgICAgICAgICAgIDxfMDJfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz4xMjk8L18wMl9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fPgotICAgICAgICAgICAgPF8wM19EZXNjcmlwdGlvbl8vPgotICAgICAgICAgIDwvUkVGPgotICAgICAgICAgIDxOMz4KLSAgICAgICAgICAgIDxfMDFfQWRkcmVzc19JbmZvcm1hdGlvbl8+NTUgSElHSCBTVFJFRVQ8L18wMV9BZGRyZXNzX0luZm9ybWF0aW9uXz4KLSAgICAgICAgICAgIDxfMDJfQWRkcmVzc19JbmZvcm1hdGlvbl8vPgotICAgICAgICAgIDwvTjM+Ci0gICAgICAgICAgPE40PgotICAgICAgICAgICAgPF8wMV9DaXR5X05hbWVfPlNFQVRUTEU8L18wMV9DaXR5X05hbWVfPgotICAgICAgICAgICAgPF8wMl9TdGF0ZV9vcl9Qcm92aW5jZV9Db2RlXz5XQTwvXzAyX1N0YXRlX29yX1Byb3ZpbmNlX0NvZGVfPgotICAgICAgICAgICAgPF8wM19Qb3N0YWxfQ29kZV8+OTgxMjM8L18wM19Qb3N0YWxfQ29kZV8+Ci0gICAgICAgICAgICA8XzA0X0NvdW50cnlfQ29kZV8vPgotICAgICAgICAgIDwvTjQ+Ci0gICAgICAgICAgPFBFUj4KLSAgICAgICAgICAgIDxfMDFfQ29udGFjdF9GdW5jdGlvbl9Db2RlXz5JQzwvXzAxX0NvbnRhY3RfRnVuY3Rpb25fQ29kZV8+Ci0gICAgICAgICAgICA8XzAyX05hbWVfPk1BUllNVVJQSFk8L18wMl9OYW1lXz4KLSAgICAgICAgICAgIDxfMDNfQ29tbXVuaWNhdGlvbl9OdW1iZXJfUXVhbGlmaWVyXz5URTwvXzAzX0NvbW11bmljYXRpb25fTnVtYmVyX1F1YWxpZmllcl8+Ci0gICAgICAgICAgICA8XzA0X0NvbW11bmljYXRpb25fTnVtYmVyXz4yMDY1NTUxMjEyPC9fMDRfQ29tbXVuaWNhdGlvbl9OdW1iZXJfPgotICAgICAgICAgICAgPF8wNV9Db21tdW5pY2F0aW9uX051bWJlcl9RdWFsaWZpZXJfPkVYPC9fMDVfQ29tbXVuaWNhdGlvbl9OdW1iZXJfUXVhbGlmaWVyXz4KLSAgICAgICAgICAgIDxfMDZfQ29tbXVuaWNhdGlvbl9OdW1iZXJfPjM2OTQ8L18wNl9Db21tdW5pY2F0aW9uX051bWJlcl8+Ci0gICAgICAgICAgICA8XzA3X0NvbW11bmljYXRpb25fTnVtYmVyX1F1YWxpZmllcl8+Rlg8L18wN19Db21tdW5pY2F0aW9uX051bWJlcl9RdWFsaWZpZXJfPgotICAgICAgICAgICAgPF8wOF9Db21tdW5pY2F0aW9uX051bWJlcl8+MjA2NTU1MTIxNDwvXzA4X0NvbW11bmljYXRpb25fTnVtYmVyXz4KLSAgICAgICAgICA8L1BFUj4KLSAgICAgICAgPC9fMjEwMEI+Ci0gICAgICAgIDxfMjAwMEM+Ci0gICAgICAgICAgPEhMPgotICAgICAgICAgICAgPF8wMV9IaWVyYXJjaGljYWxfSURfTnVtYmVyXz4zPC9fMDFfSGllcmFyY2hpY2FsX0lEX051bWJlcl8+Ci0gICAgICAgICAgICA8XzAyX0hpZXJhcmNoaWNhbF9QYXJlbnRfSURfTnVtYmVyXz4yPC9fMDJfSGllcmFyY2hpY2FsX1BhcmVudF9JRF9OdW1iZXJfPgotICAgICAgICAgICAgPF8wM19IaWVyYXJjaGljYWxfTGV2ZWxfQ29kZV8+MjI8L18wM19IaWVyYXJjaGljYWxfTGV2ZWxfQ29kZV8+Ci0gICAgICAgICAgICA8XzA0X0hpZXJhcmNoaWNhbF9DaGlsZF9Db2RlXz4xPC9fMDRfSGllcmFyY2hpY2FsX0NoaWxkX0NvZGVfPgotICAgICAgICAgIDwvSEw+Ci0gICAgICAgICAgPFRSTj4KLSAgICAgICAgICAgIDxfMDFfVHJhY2VfVHlwZV9Db2RlXz4xPC9fMDFfVHJhY2VfVHlwZV9Db2RlXz4KLSAgICAgICAgICAgIDxfMDJfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz45MzE3NS0wMTI1NDc8L18wMl9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fPgotICAgICAgICAgICAgPF8wM19PcmlnaW5hdGluZ19Db21wYW55X0lkZW50aWZpZXJfPjk4NzcyODEyMzQ8L18wM19PcmlnaW5hdGluZ19Db21wYW55X0lkZW50aWZpZXJfPgotICAgICAgICAgICAgPF8wNF9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fLz4KLSAgICAgICAgICA8L1RSTj4KLSAgICAgICAgICA8XzIxMDBDPgotICAgICAgICAgICAgPE5NMT4KLSAgICAgICAgICAgICAgPF8wMV9FbnRpdHlfSWRlbnRpZmllcl9Db2RlXz5JTDwvXzAxX0VudGl0eV9JZGVudGlmaWVyX0NvZGVfPgotICAgICAgICAgICAgICA8XzAyX0VudGl0eV9UeXBlX1F1YWxpZmllcl8+MTwvXzAyX0VudGl0eV9UeXBlX1F1YWxpZmllcl8+Ci0gICAgICAgICAgICAgIDxfMDNfTmFtZV9MYXN0X29yX09yZ2FuaXphdGlvbl9OYW1lXz5TTUlUSDwvXzAzX05hbWVfTGFzdF9vcl9Pcmdhbml6YXRpb25fTmFtZV8+Ci0gICAgICAgICAgICAgIDxfMDRfTmFtZV9GaXJzdF8+Uk9CRVJUPC9fMDRfTmFtZV9GaXJzdF8+Ci0gICAgICAgICAgICAgIDxfMDVfTmFtZV9NaWRkbGVfPkI8L18wNV9OYW1lX01pZGRsZV8+Ci0gICAgICAgICAgICAgIDxfMDZfTmFtZV9QcmVmaXhfLz4KLSAgICAgICAgICAgICAgPF8wN19OYW1lX1N1ZmZpeF8vPgotICAgICAgICAgICAgICA8XzA4X0lkZW50aWZpY2F0aW9uX0NvZGVfUXVhbGlmaWVyXz5NSTwvXzA4X0lkZW50aWZpY2F0aW9uX0NvZGVfUXVhbGlmaWVyXz4KLSAgICAgICAgICAgICAgPF8wOV9JZGVudGlmaWNhdGlvbl9Db2RlXz4xMTEyMjMzMzMwMTwvXzA5X0lkZW50aWZpY2F0aW9uX0NvZGVfPgotICAgICAgICAgICAgPC9OTTE+Ci0gICAgICAgICAgICA8UkVGPgotICAgICAgICAgICAgICA8XzAxX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl9RdWFsaWZpZXJfPjFMPC9fMDFfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uX1F1YWxpZmllcl8+Ci0gICAgICAgICAgICAgIDxfMDJfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz41OTkxMTk8L18wMl9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fPgotICAgICAgICAgICAgPC9SRUY+Ci0gICAgICAgICAgICA8TjM+Ci0gICAgICAgICAgICAgIDxfMDFfQWRkcmVzc19JbmZvcm1hdGlvbl8+MjkgRlJFTU9OVCBTVDwvXzAxX0FkZHJlc3NfSW5mb3JtYXRpb25fPgotICAgICAgICAgICAgICA8XzAyX0FkZHJlc3NfSW5mb3JtYXRpb25fPkFQVCMgMTwvXzAyX0FkZHJlc3NfSW5mb3JtYXRpb25fPgotICAgICAgICAgICAgPC9OMz4KLSAgICAgICAgICAgIDxOND4KLSAgICAgICAgICAgICAgPF8wMV9DaXR5X05hbWVfPlBFQUNFPC9fMDFfQ2l0eV9OYW1lXz4KLSAgICAgICAgICAgICAgPF8wMl9TdGF0ZV9vcl9Qcm92aW5jZV9Db2RlXz5OWTwvXzAyX1N0YXRlX29yX1Byb3ZpbmNlX0NvZGVfPgotICAgICAgICAgICAgICA8XzAzX1Bvc3RhbF9Db2RlXz4xMDAyMzwvXzAzX1Bvc3RhbF9Db2RlXz4KLSAgICAgICAgICAgICAgPF8wNF9Db3VudHJ5X0NvZGVfLz4KLSAgICAgICAgICAgIDwvTjQ+Ci0gICAgICAgICAgICA8RE1HPgotICAgICAgICAgICAgICA8XzAxX0RhdGVfVGltZV9QZXJpb2RfRm9ybWF0X1F1YWxpZmllcl8+RDg8L18wMV9EYXRlX1RpbWVfUGVyaW9kX0Zvcm1hdF9RdWFsaWZpZXJfPgotICAgICAgICAgICAgICA8XzAyX0RhdGVfVGltZV9QZXJpb2RfPjE5NDMwNTE5PC9fMDJfRGF0ZV9UaW1lX1BlcmlvZF8+Ci0gICAgICAgICAgICAgIDxfMDNfR2VuZGVyX0NvZGVfPk08L18wM19HZW5kZXJfQ29kZV8+Ci0gICAgICAgICAgICA8L0RNRz4KLSAgICAgICAgICA8L18yMTAwQz4KLSAgICAgICAgICA8XzIwMDBEPgotICAgICAgICAgICAgPEhMPgotICAgICAgICAgICAgICA8XzAxX0hpZXJhcmNoaWNhbF9JRF9OdW1iZXJfPjQ8L18wMV9IaWVyYXJjaGljYWxfSURfTnVtYmVyXz4KLSAgICAgICAgICAgICAgPF8wMl9IaWVyYXJjaGljYWxfUGFyZW50X0lEX051bWJlcl8+MzwvXzAyX0hpZXJhcmNoaWNhbF9QYXJlbnRfSURfTnVtYmVyXz4KLSAgICAgICAgICAgICAgPF8wM19IaWVyYXJjaGljYWxfTGV2ZWxfQ29kZV8+MjM8L18wM19IaWVyYXJjaGljYWxfTGV2ZWxfQ29kZV8+Ci0gICAgICAgICAgICAgIDxfMDRfSGllcmFyY2hpY2FsX0NoaWxkX0NvZGVfPjA8L18wNF9IaWVyYXJjaGljYWxfQ2hpbGRfQ29kZV8+Ci0gICAgICAgICAgICA8L0hMPgotICAgICAgICAgICAgPFRSTj4KLSAgICAgICAgICAgICAgPF8wMV9UcmFjZV9UeXBlX0NvZGVfPjE8L18wMV9UcmFjZV9UeXBlX0NvZGVfPgotICAgICAgICAgICAgICA8XzAyX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl8+OTMxNzUtMDEyNTQ3PC9fMDJfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz4KLSAgICAgICAgICAgICAgPF8wM19PcmlnaW5hdGluZ19Db21wYW55X0lkZW50aWZpZXJfPjk4NzcyODEyMzQ8L18wM19PcmlnaW5hdGluZ19Db21wYW55X0lkZW50aWZpZXJfPgotICAgICAgICAgICAgICA8XzA0X1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl8+UkFESU9MT0dZPC9fMDRfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz4KLSAgICAgICAgICAgIDwvVFJOPgotICAgICAgICAgICAgPF8yMTAwRD4KLSAgICAgICAgICAgICAgPE5NMT4KLSAgICAgICAgICAgICAgICA8XzAxX0VudGl0eV9JZGVudGlmaWVyX0NvZGVfPjAzPC9fMDFfRW50aXR5X0lkZW50aWZpZXJfQ29kZV8+Ci0gICAgICAgICAgICAgICAgPF8wMl9FbnRpdHlfVHlwZV9RdWFsaWZpZXJfPjE8L18wMl9FbnRpdHlfVHlwZV9RdWFsaWZpZXJfPgotICAgICAgICAgICAgICAgIDxfMDNfTmFtZV9MYXN0X29yX09yZ2FuaXphdGlvbl9OYW1lXz5TTUlUSDwvXzAzX05hbWVfTGFzdF9vcl9Pcmdhbml6YXRpb25fTmFtZV8+Ci0gICAgICAgICAgICAgICAgPF8wNF9OYW1lX0ZpcnN0Xz5NQVJZTE9VPC9fMDRfTmFtZV9GaXJzdF8+Ci0gICAgICAgICAgICAgICAgPF8wNV9OYW1lX01pZGRsZV8vPgotICAgICAgICAgICAgICAgIDxfMDZfTmFtZV9QcmVmaXhfLz4KLSAgICAgICAgICAgICAgICA8XzA3X05hbWVfU3VmZml4Xy8+Ci0gICAgICAgICAgICAgIDwvTk0xPgotICAgICAgICAgICAgICA8UkVGPgotICAgICAgICAgICAgICAgIDxfMDFfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uX1F1YWxpZmllcl8+U1k8L18wMV9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fUXVhbGlmaWVyXz4KLSAgICAgICAgICAgICAgICA8XzAyX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl8+MDAzMjIxMjM0PC9fMDJfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz4KLSAgICAgICAgICAgICAgPC9SRUY+Ci0gICAgICAgICAgICAgIDxOMz4KLSAgICAgICAgICAgICAgICA8XzAxX0FkZHJlc3NfSW5mb3JtYXRpb25fPjI5IEZSRU1PTlQgU1Q8L18wMV9BZGRyZXNzX0luZm9ybWF0aW9uXz4KLSAgICAgICAgICAgICAgICA8XzAyX0FkZHJlc3NfSW5mb3JtYXRpb25fPkFQVCMgMTwvXzAyX0FkZHJlc3NfSW5mb3JtYXRpb25fPgotICAgICAgICAgICAgICA8L04zPgotICAgICAgICAgICAgICA8TjQ+Ci0gICAgICAgICAgICAgICAgPF8wMV9DaXR5X05hbWVfPlBFQUNFPC9fMDFfQ2l0eV9OYW1lXz4KLSAgICAgICAgICAgICAgICA8XzAyX1N0YXRlX29yX1Byb3ZpbmNlX0NvZGVfPk5ZPC9fMDJfU3RhdGVfb3JfUHJvdmluY2VfQ29kZV8+Ci0gICAgICAgICAgICAgICAgPF8wM19Qb3N0YWxfQ29kZV8+MTAwMjM8L18wM19Qb3N0YWxfQ29kZV8+Ci0gICAgICAgICAgICAgICAgPF8wNF9Db3VudHJ5X0NvZGVfLz4KLSAgICAgICAgICAgICAgPC9OND4KLSAgICAgICAgICAgICAgPERNRz4KLSAgICAgICAgICAgICAgICA8XzAxX0RhdGVfVGltZV9QZXJpb2RfRm9ybWF0X1F1YWxpZmllcl8+RDg8L18wMV9EYXRlX1RpbWVfUGVyaW9kX0Zvcm1hdF9RdWFsaWZpZXJfPgotICAgICAgICAgICAgICAgIDxfMDJfRGF0ZV9UaW1lX1BlcmlvZF8+MTk3ODEwMTQ8L18wMl9EYXRlX1RpbWVfUGVyaW9kXz4KLSAgICAgICAgICAgICAgICA8XzAzX0dlbmRlcl9Db2RlXz5GPC9fMDNfR2VuZGVyX0NvZGVfPgotICAgICAgICAgICAgICA8L0RNRz4KLSAgICAgICAgICAgICAgPElOUz4KLSAgICAgICAgICAgICAgICA8XzAxX1llc19Ob19Db25kaXRpb25fb3JfUmVzcG9uc2VfQ29kZV8+TjwvXzAxX1llc19Ob19Db25kaXRpb25fb3JfUmVzcG9uc2VfQ29kZV8+Ci0gICAgICAgICAgICAgICAgPF8wMl9JbmRpdmlkdWFsX1JlbGF0aW9uc2hpcF9Db2RlXz4xOTwvXzAyX0luZGl2aWR1YWxfUmVsYXRpb25zaGlwX0NvZGVfPgotICAgICAgICAgICAgICAgIDxfMDNfTWFpbnRlbmFuY2VfVHlwZV9Db2RlXy8+Ci0gICAgICAgICAgICAgICAgPF8wNF9NYWludGVuYW5jZV9SZWFzb25fQ29kZV8vPgotICAgICAgICAgICAgICAgIDxfMDVfQmVuZWZpdF9TdGF0dXNfQ29kZV8vPgotICAgICAgICAgICAgICAgIDxfMDZfTWVkaWNhcmVfU3RhdHVzX0NvZGVfLz4KLSAgICAgICAgICAgICAgICA8XzA3X0NvbnNvbGlkYXRlZF9PbW5pYnVzX0J1ZGdldF9SZWNvbmNpbGlhdGlvbl9BY3RfX0NPQlJBX19RdWFsaWZ5aW5nX0V2ZW50X0NvZGVfLz4KLSAgICAgICAgICAgICAgICA8XzA4X0VtcGxveW1lbnRfU3RhdHVzX0NvZGVfLz4KLSAgICAgICAgICAgICAgICA8XzA5X1N0dWRlbnRfU3RhdHVzX0NvZGVfLz4KLSAgICAgICAgICAgICAgICA8XzEwX1llc19Ob19Db25kaXRpb25fb3JfUmVzcG9uc2VfQ29kZV8vPgotICAgICAgICAgICAgICAgIDxfMTFfRGF0ZV9UaW1lX1BlcmlvZF9Gb3JtYXRfUXVhbGlmaWVyXy8+Ci0gICAgICAgICAgICAgICAgPF8xMl9EYXRlX1RpbWVfUGVyaW9kXy8+Ci0gICAgICAgICAgICAgICAgPF8xM19Db25maWRlbnRpYWxpdHlfQ29kZV8vPgotICAgICAgICAgICAgICAgIDxfMTRfQ2l0eV9OYW1lXy8+Ci0gICAgICAgICAgICAgICAgPF8xNV9TdGF0ZV9vcl9Qcm92aW5jZV9Db2RlXy8+Ci0gICAgICAgICAgICAgICAgPF8xNl9Db3VudHJ5X0NvZGVfLz4KLSAgICAgICAgICAgICAgICA8XzE3X051bWJlcl8vPgotICAgICAgICAgICAgICA8L0lOUz4KLSAgICAgICAgICAgICAgPERUUD4KLSAgICAgICAgICAgICAgICA8XzAxX0RhdGVfVGltZV9RdWFsaWZpZXJfPjQ3MjwvXzAxX0RhdGVfVGltZV9RdWFsaWZpZXJfPgotICAgICAgICAgICAgICAgIDxfMDJfRGF0ZV9UaW1lX1BlcmlvZF9Gb3JtYXRfUXVhbGlmaWVyXz5EODwvXzAyX0RhdGVfVGltZV9QZXJpb2RfRm9ybWF0X1F1YWxpZmllcl8+Ci0gICAgICAgICAgICAgICAgPF8wM19EYXRlX1RpbWVfUGVyaW9kXz4xOTk5MDUwMTwvXzAzX0RhdGVfVGltZV9QZXJpb2RfPgotICAgICAgICAgICAgICA8L0RUUD4KLSAgICAgICAgICAgICAgPF8yMTEwRD4KLSAgICAgICAgICAgICAgICA8RVE+Ci0gICAgICAgICAgICAgICAgICA8XzAxX1NlcnZpY2VfVHlwZV9Db2RlXz44MTwvXzAxX1NlcnZpY2VfVHlwZV9Db2RlXz4KLSAgICAgICAgICAgICAgICAgIDxfMDJfQ29tcG9zaXRlX01lZGljYWxfUHJvY2VkdXJlX0lkZW50aWZpZXJfLz4KLSAgICAgICAgICAgICAgICAgIDxfMDNfQ292ZXJhZ2VfTGV2ZWxfQ29kZV8+RkFNPC9fMDNfQ292ZXJhZ2VfTGV2ZWxfQ29kZV8+Ci0gICAgICAgICAgICAgICAgICA8XzA0X0luc3VyYW5jZV9UeXBlX0NvZGVfLz4KLSAgICAgICAgICAgICAgICA8L0VRPgotICAgICAgICAgICAgICA8L18yMTEwRD4KLSAgICAgICAgICAgIDwvXzIxMDBEPgotICAgICAgICAgIDwvXzIwMDBEPgotICAgICAgICA8L18yMDAwQz4KLSAgICAgIDwvXzIwMDBCPgotICAgIDwvXzIwMDBBPgotICAgIDxTRT4KLSAgICAgIDxfMDFfTnVtYmVyX29mX0luY2x1ZGVkX1NlZ21lbnRzXz4yODwvXzAxX051bWJlcl9vZl9JbmNsdWRlZF9TZWdtZW50c18+Ci0gICAgICA8XzAyX1RyYW5zYWN0aW9uX1NldF9Db250cm9sX051bWJlcl8+MTIzNDwvXzAyX1RyYW5zYWN0aW9uX1NldF9Db250cm9sX051bWJlcl8+Ci0gICAgPC9TRT4KLSAgPC9fMjcwPgotICA8R0U+Ci0gICAgPF8wMV9OdW1iZXJfb2ZfVHJhbnNhY3Rpb25fU2V0c19JbmNsdWRlZF8+MTwvXzAxX051bWJlcl9vZl9UcmFuc2FjdGlvbl9TZXRzX0luY2x1ZGVkXz4KLSAgICA8XzAyX0dyb3VwX0NvbnRyb2xfTnVtYmVyXz4xPC9fMDJfR3JvdXBfQ29udHJvbF9OdW1iZXJfPgotICA8L0dFPgotICA8SUVBPgotICAgIDxfMDFfTnVtYmVyX29mX0luY2x1ZGVkX0Z1bmN0aW9uYWxfR3JvdXBzXz4xPC9fMDFfTnVtYmVyX29mX0luY2x1ZGVkX0Z1bmN0aW9uYWxfR3JvdXBzXz4KLSAgICA8XzAyX0ludGVyY2hhbmdlX0NvbnRyb2xfTnVtYmVyXz4wMDAwMDA5MDU8L18wMl9JbnRlcmNoYW5nZV9Db250cm9sX051bWJlcl8+Ci0gIDwvSUVBPgotPC9ISVBBQTI3MD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0hJUEFBMjcwLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvSElQQUEyNzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWMyZDNiLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvSElQQUEyNzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLQotPHhzZDpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJETUdUeXBlIj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfRGF0ZV9UaW1lX1BlcmlvZF9Gb3JtYXRfUXVhbGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9EYXRlX1RpbWVfUGVyaW9kXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wM19HZW5kZXJfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJPC94c2Q6c2VxdWVuY2U+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEVFBUeXBlIj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfRGF0ZV9UaW1lX1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfRGF0ZV9UaW1lX1BlcmlvZF9Gb3JtYXRfUXVhbGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wM19EYXRlX1RpbWVfUGVyaW9kXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVRVHlwZSI+Ci0JCTx4c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX1NlcnZpY2VfVHlwZV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9Db21wb3NpdGVfTWVkaWNhbF9Qcm9jZWR1cmVfSWRlbnRpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDNfQ292ZXJhZ2VfTGV2ZWxfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDRfSW5zdXJhbmNlX1R5cGVfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJPC94c2Q6c2VxdWVuY2U+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkdFIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9OdW1iZXJfb2ZfVHJhbnNhY3Rpb25fU2V0c19JbmNsdWRlZF8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX0dyb3VwX0NvbnRyb2xfTnVtYmVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkdTIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9GdW5jdGlvbmFsX0lkZW50aWZpZXJfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX0FwcGxpY2F0aW9uX1NlbmRlcnNfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAzX0FwcGxpY2F0aW9uX1JlY2VpdmVyc19Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9Il8wNF9EYXRlXyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9Il8wNV9UaW1lXyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDZfR3JvdXBfQ29udHJvbF9OdW1iZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wN19SZXNwb25zaWJsZV9BZ2VuY3lfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA4X1ZlcnNpb25fX1JlbGVhc2VfX0luZHVzdHJ5X0lkZW50aWZpZXJfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJISVBBQTI3MCI+Ci0JCTx4c2Q6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJJU0EiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJHUyIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9Il8yNzAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJHRSIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IklFQSIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJITFR5cGUiPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9IaWVyYXJjaGljYWxfSURfTnVtYmVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9IaWVyYXJjaGljYWxfUGFyZW50X0lEX051bWJlcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDNfSGllcmFyY2hpY2FsX0xldmVsX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA0X0hpZXJhcmNoaWNhbF9DaGlsZF9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iSUVBIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9OdW1iZXJfb2ZfSW5jbHVkZWRfRnVuY3Rpb25hbF9Hcm91cHNfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9JbnRlcmNoYW5nZV9Db250cm9sX051bWJlcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSUlJVHlwZSI+Ci0JCTx4c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX0NvZGVfTGlzdF9RdWFsaWZpZXJfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfSW5kdXN0cnlfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJPC94c2Q6c2VxdWVuY2U+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJTlNUeXBlIj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfWWVzX05vX0NvbmRpdGlvbl9vcl9SZXNwb25zZV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9JbmRpdmlkdWFsX1JlbGF0aW9uc2hpcF9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wM19NYWludGVuYW5jZV9UeXBlX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA0X01haW50ZW5hbmNlX1JlYXNvbl9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNV9CZW5lZml0X1N0YXR1c19Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNl9NZWRpY2FyZV9TdGF0dXNfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDdfQ29uc29saWRhdGVkX09tbmlidXNfQnVkZ2V0X1JlY29uY2lsaWF0aW9uX0FjdF9fQ09CUkFfX1F1YWxpZnlpbmdfRXZlbnRfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDhfRW1wbG95bWVudF9TdGF0dXNfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDlfU3R1ZGVudF9TdGF0dXNfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMTBfWWVzX05vX0NvbmRpdGlvbl9vcl9SZXNwb25zZV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xMV9EYXRlX1RpbWVfUGVyaW9kX0Zvcm1hdF9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzEyX0RhdGVfVGltZV9QZXJpb2RfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzEzX0NvbmZpZGVudGlhbGl0eV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xNF9DaXR5X05hbWVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzE1X1N0YXRlX29yX1Byb3ZpbmNlX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzE2X0NvdW50cnlfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMTdfTnVtYmVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iSVNBIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9BdXRob3JpemF0aW9uX0luZm9ybWF0aW9uX1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX0F1dGhvcml6YXRpb25fSW5mb3JtYXRpb25fIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wM19TZWN1cml0eV9JbmZvcm1hdGlvbl9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNF9TZWN1cml0eV9JbmZvcm1hdGlvbl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA1X0ludGVyY2hhbmdlX0lEX1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA2X0ludGVyY2hhbmdlX1NlbmRlcl9JRF8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA3X0ludGVyY2hhbmdlX0lEX1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA4X0ludGVyY2hhbmdlX1JlY2VpdmVyX0lEXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDlfSW50ZXJjaGFuZ2VfRGF0ZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzEwX0ludGVyY2hhbmdlX1RpbWVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xMV9SZXBldGl0aW9uX1NlcGFyYXRvcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzEyX0ludGVyY2hhbmdlX0NvbnRyb2xfVmVyc2lvbl9OdW1iZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xM19JbnRlcmNoYW5nZV9Db250cm9sX051bWJlcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzE0X0Fja25vd2xlZGdlbWVudF9SZXF1ZXN0ZWRfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xNV9Vc2FnZV9JbmRpY2F0b3JfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xNl9Db21wb25lbnRfRWxlbWVudF9TZXBhcmF0b3JfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik4zVHlwZSI+Ci0JCTx4c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX0FkZHJlc3NfSW5mb3JtYXRpb25fIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX0FkZHJlc3NfSW5mb3JtYXRpb25fIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwveHNkOnNlcXVlbmNlPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTjRUeXBlIj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfQ2l0eV9OYW1lXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9TdGF0ZV9vcl9Qcm92aW5jZV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wM19Qb3N0YWxfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDRfQ291bnRyeV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik5NMVR5cGUiPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9FbnRpdHlfSWRlbnRpZmllcl9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9FbnRpdHlfVHlwZV9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAzX05hbWVfTGFzdF9vcl9Pcmdhbml6YXRpb25fTmFtZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDRfTmFtZV9GaXJzdF8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDVfTmFtZV9NaWRkbGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA2X05hbWVfUHJlZml4XyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wN19OYW1lX1N1ZmZpeF8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDhfSWRlbnRpZmljYXRpb25fQ29kZV9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA5X0lkZW50aWZpY2F0aW9uX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwveHNkOnNlcXVlbmNlPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUFJWVHlwZSI+Ci0JCTx4c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX1Byb3ZpZGVyX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgcmVmPSJfMDNfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJFRlR5cGUiPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fUXVhbGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzZDplbGVtZW50IHJlZj0iXzAyX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDNfRGVzY3JpcHRpb25fIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwveHNkOnNlcXVlbmNlPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVFJOVHlwZSI+Ci0JCTx4c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX1RyYWNlX1R5cGVfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCByZWY9Il8wMl9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAzX09yaWdpbmF0aW5nX0NvbXBhbnlfSWRlbnRpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDRfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl8iIHR5cGU9InhzZDpzdHJpbmciLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX1RyYW5zYWN0aW9uX1NldF9Db250cm9sX051bWJlcl8iIHR5cGU9InhzZDpzdHJpbmciLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAzX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl8iIHR5cGU9InhzZDpzdHJpbmciLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA0X0RhdGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9Il8wNV9UaW1lXyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMjcwIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlNUIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9UcmFuc2FjdGlvbl9TZXRfSWRlbnRpZmllcl9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9Il8wMl9UcmFuc2FjdGlvbl9TZXRfQ29udHJvbF9OdW1iZXJfIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQkhUIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9IaWVyYXJjaGljYWxfU3RydWN0dXJlX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9UcmFuc2FjdGlvbl9TZXRfUHVycG9zZV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9Il8wM19SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iXzA0X0RhdGVfIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iXzA1X1RpbWVfIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNl9UcmFuc2FjdGlvbl9UeXBlX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzIwMDBBIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkhMIiB0eXBlPSJITFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzIxMDBBIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik5NMSIgdHlwZT0iTk0xVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8yMDAwQiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJITCIgdHlwZT0iSExUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8yMTAwQiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJOTTEiIHR5cGU9Ik5NMVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUkVGIiB0eXBlPSJSRUZUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik4zIiB0eXBlPSJOM1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTjQiIHR5cGU9Ik40VHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQRVIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX0NvbnRhY3RfRnVuY3Rpb25fQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX05hbWVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wM19Db21tdW5pY2F0aW9uX051bWJlcl9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNF9Db21tdW5pY2F0aW9uX051bWJlcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA1X0NvbW11bmljYXRpb25fTnVtYmVyX1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA2X0NvbW11bmljYXRpb25fTnVtYmVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDdfQ29tbXVuaWNhdGlvbl9OdW1iZXJfUXVhbGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDhfQ29tbXVuaWNhdGlvbl9OdW1iZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUFJWIiB0eXBlPSJQUlZUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzIwMDBDIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkhMIiB0eXBlPSJITFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVFJOIiB0eXBlPSJUUk5UeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8yMTAwQyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJOTTEiIHR5cGU9Ik5NMVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUkVGIiB0eXBlPSJSRUZUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik4zIiB0eXBlPSJOM1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTjQiIHR5cGU9Ik40VHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQUlYiIHR5cGU9IlBSVlR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRE1HIiB0eXBlPSJETUdUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IklOUyIgdHlwZT0iSU5TVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEVFAiIHR5cGU9IkRUUFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzIxMTBDIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVRIiB0eXBlPSJFUVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQU1UIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9BbW91bnRfUXVhbGlmaWVyX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9Nb25ldGFyeV9BbW91bnRfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSUlJIiB0eXBlPSJJSUlUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJFRiIgdHlwZT0iUkVGVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEVFAiIHR5cGU9IkRUUFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8yMDAwRCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJITCIgdHlwZT0iSExUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRSTiIgdHlwZT0iVFJOVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMjEwMEQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTk0xIiB0eXBlPSJOTTFUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJFRiIgdHlwZT0iUkVGVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJOMyIgdHlwZT0iTjNUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik40IiB0eXBlPSJONFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUFJWIiB0eXBlPSJQUlZUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRNRyIgdHlwZT0iRE1HVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJTlMiIHR5cGU9IklOU1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRFRQIiB0eXBlPSJEVFBUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8yMTEwRCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFUSIgdHlwZT0iRVFUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IklJSSIgdHlwZT0iSUlJVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSRUYiIHR5cGU9IlJFRlR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRFRQIiB0eXBlPSJEVFBUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlNFIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9OdW1iZXJfb2ZfSW5jbHVkZWRfU2VnbWVudHNfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iXzAyX1RyYW5zYWN0aW9uX1NldF9Db250cm9sX051bWJlcl8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQk8L3hzZDplbGVtZW50PgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0hlYWRlcnMueG1sIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9IZWFkZXJzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxNzg3OC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0hlYWRlcnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08d29ya2Jvb2s+Ci0gICAgPFNoZWV0MT4KLSAgICAgICAgPHJvdz4KLSAgICAgICAgICAgIDxjb2wxPkZJUlNUIE5BTUU8L2NvbDE+Ci0gICAgICAgICAgICA8Y29sMj5MQVNUIE5BTUU8L2NvbDI+Ci0gICAgICAgICAgICA8Y29sMz5USVRMRTwvY29sMz4KLSAgICAgICAgICAgIDxjb2w0PkFERFJFU1M8L2NvbDQ+Ci0gICAgICAgICAgICA8Y29sNT5DSVRZPC9jb2w1PgotICAgICAgICAgICAgPGNvbDY+U1RBVEU8L2NvbDY+Ci0gICAgICAgICAgICA8Y29sNz5DT1VOVFJZPC9jb2w3PgotICAgICAgICA8L3Jvdz4KLSAgICAgICAgPHJvdz4KLSAgICAgICAgICAgIDxjb2wxPlBhdWw8L2NvbDE+Ci0gICAgICAgICAgICA8Y29sMj5GZWFyb248L2NvbDI+Ci0gICAgICAgICAgICA8Y29sMz5NcjwvY29sMz4KLSAgICAgICAgICAgIDxjb2w0PjIgUGVubiBQbGF6YTwvY29sND4KLSAgICAgICAgICAgIDxjb2w1Pk5ldyBZb3JrPC9jb2w1PgotICAgICAgICAgICAgPGNvbDY+TmV3IFlvcms8L2NvbDY+Ci0gICAgICAgICAgICA8Y29sNz5VU0E8L2NvbDc+Ci0gICAgICAgIDwvcm93PgotICAgICAgICA8cm93PgotICAgICAgICAgICAgPGNvbDE+SmVmZjwvY29sMT4KLSAgICAgICAgICAgIDxjb2wyPlBhb2xldHRpPC9jb2wyPgotICAgICAgICAgICAgPGNvbDM+U2lyPC9jb2wzPgotICAgICAgICAgICAgPGNvbDQ+MiBQZW5uIFBsYXphPC9jb2w0PgotICAgICAgICAgICAgPGNvbDU+TmV3IFlvcms8L2NvbDU+Ci0gICAgICAgICAgICA8Y29sNj5OZXcgWW9yazwvY29sNj4KLSAgICAgICAgICAgIDxjb2w3PlVTQTwvY29sNz4KLSAgICAgICAgPC9yb3c+Ci0gICAgICAgIDxyb3c+Ci0gICAgICAgICAgICA8Y29sMT5Kb25hdGhvbjwvY29sMT4KLSAgICAgICAgICAgIDxjb2wyPlBsYXR0PC9jb2wyPgotICAgICAgICAgICAgPGNvbDM+TG9yZDwvY29sMz4KLSAgICAgICAgICAgIDxjb2w0PldlbWJsZXkgUG9pbnQsIEhhcnJvdyBSb2FkPC9jb2w0PgotICAgICAgICAgICAgPGNvbDU+TG9uZG9uPC9jb2w1PgotICAgICAgICAgICAgPGNvbDY+TUlERFg8L2NvbDY+Ci0gICAgICAgICAgICA8Y29sNz5VSzwvY29sNz4KLSAgICAgICAgPC9yb3c+Ci0gICAgICAgIDxyb3c+Ci0gICAgICAgICAgICA8Y29sMT5FaWxlZW48L2NvbDE+Ci0gICAgICAgICAgICA8Y29sMj5BbmRlcnNvbjwvY29sMj4KLSAgICAgICAgICAgIDxjb2wzPk1yczwvY29sMz4KLSAgICAgICAgICAgIDxjb2w0PkJlbGxlIFBsYWluPC9jb2w0PgotICAgICAgICAgICAgPGNvbDU+TWF5cGVuPC9jb2w1PgotICAgICAgICAgICAgPGNvbDY+Q2xhcmVuZG9uPC9jb2w2PgotICAgICAgICAgICAgPGNvbDc+SmFtYWljYTwvY29sNz4KLSAgICAgICAgPC9yb3c+Ci0gICAgPC9TaGVldDE+Ci08L3dvcmtib29rPgotCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0hlYWRlcnMueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9IZWFkZXJzLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFiNGRkZS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0hlYWRlcnMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS1XM0MgU2NoZW1hIGdlbmVyYXRlZCBieSBYTUwgU3B5IHY0LjMgVSAoaHR0cDovL3d3dy54bWxzcHkuY29tKS0tPgotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJTaGVldDEiPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJyb3ciIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iY29sMSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb2wyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImNvbDMiPgotCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvcmQiLz4KLQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNciIvPgotCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ycyIvPgotCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpciIvPgotCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJVExFIi8+Ci0JCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJPC94c2Q6c2ltcGxlVHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb2w0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImNvbDUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iY29sNiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb2w3Ij4KLQkJPHhzZDpzaW1wbGVUeXBlPgotCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT1VOVFJZIi8+Ci0JCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSmFtYWljYSIvPgotCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVLIi8+Ci0JCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNBIi8+Ci0JCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJPC94c2Q6c2ltcGxlVHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJyb3ciPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJjb2wxIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iY29sMiIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9ImNvbDMiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJjb2w0Ii8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iY29sNSIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9ImNvbDYiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJjb2w3Ii8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0id29ya2Jvb2siPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJTaGVldDEiLz4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9SRkNfQ1VTVE9NRVJfR0VULnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvUkZDX0NVU1RPTUVSX0dFVC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZWNjODIuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9SRkNfQ1VTVE9NRVJfR0VULnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZG9jOlJGQ19DVVNUT01FUl9HRVQgeG1sbnM6ZG9jPSJ1cm46c2FwLWNvbTpkb2N1bWVudDpzYXA6YnVzaW5lc3M6cmZjIj4KLTxLVU5OUj4qPC9LVU5OUj4KLTxOQU1FMT5BKjwvTkFNRTE+Ci08Q1VTVE9NRVJfVD4KLTxpdGVtPgotPEtVTk5SPjwvS1VOTlI+Ci08QU5SRUQ+PC9BTlJFRD4KLTxOQU1FMT48L05BTUUxPgotPFBGQUNIPjwvUEZBQ0g+Ci08U1RSQVM+PC9TVFJBUz4KLTxQU1RMWj48L1BTVExaPgotPE9SVDAxPjwvT1JUMDE+Ci08VEVMRjE+PC9URUxGMT4KLTxURUxGWD48L1RFTEZYPgotPC9pdGVtPgotPC9DVVNUT01FUl9UPgotPC9kb2M6UkZDX0NVU1RPTUVSX0dFVD4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvUkZDX0NVU1RPTUVSX0dFVC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L1JGQ19DVVNUT01FUl9HRVQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2FjYzJiLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvUkZDX0NVU1RPTUVSX0dFVC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOmRvYz0idXJuOnNhcC1jb206ZG9jdW1lbnQKLTpzYXA6YnVzaW5lc3M6cmZjIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJ1cm46c2FwLWNvbTpkb2N1bWVudDpzYXA6Ci1idXNpbmVzczpyZmMiPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJSRkNLTkExIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IktVTk5SIj4KLSAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz4KLSAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQU5SRUQiPgotICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNSIvPgotICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOQU1FMSI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+Ci0gICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBGQUNIIj4KLSAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz4KLSAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RSQVMiPgotICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPgotICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQU1RMWiI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+Ci0gICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9SVDAxIj4KLSAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz4KLSAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVEVMRjEiPgotICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNiIvPgotICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJURUxGWCI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDptYXhMZW5ndGggdmFsdWU9IjMxIi8+Ci0gICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iUkZDX0NVU1RPTUVSX0dFVCI+Ci0gICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgIDx4c2Q6YWxsPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iS1VOTlIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+Ci0gICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTkFNRTEiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+Ci0gICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ1VTVE9NRVJfVCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Iml0ZW0iIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJkb2M6QlJGQ0tOQTEiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDphbGw+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLTwveHNkOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L2V2ZW50X0RFQk1BUzAxLnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvZXZlbnRfREVCTUFTMDEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTI0ZjlmLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvZXZlbnRfREVCTUFTMDEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PjxERUJNQVMwMT48SURPQyBCRUdJTj0iMSI+PEVESV9EQzQwIFNFR01FTlQ9IjEiPjxUQUJOQU0+RURJX0RDNDA8L1RBQk5BTT48TUFORFQ+ODAwPC9NQU5EVD48RE9DTlVNPjAwMDAwMDAwMDAyMzI5MDQ8L0RPQ05VTT48RE9DUkVMPjQwQjwvRE9DUkVMPjxTVEFUVVM+MzA8L1NUQVRVUz48RElSRUNUPjE8L0RJUkVDVD48T1VUTU9EPjI8L09VVE1PRD48RVhQUlNTLz48VEVTVC8+PElET0NUWVA+REVCTUFTMDE8L0lET0NUWVA+PENJTVRZUC8+PE1FU1RZUD5ERUJNQVM8L01FU1RZUD48TUVTQ09ELz48TUVTRkNULz48U1RELz48U1REVlJTLz48U1RETUVTLz48U05EUE9SPlNBUEk0QjwvU05EUE9SPjxTTkRQUlQ+TFM8L1NORFBSVD48U05EUEZDLz48U05EUFJOPkk0Ql9DTEk4MDA8L1NORFBSTj48U05EU0FELz48U05ETEFELz48UkNWUE9SPkEwMDAwMDAwMzE8L1JDVlBPUj48UkNWUFJUPkxTPC9SQ1ZQUlQ+PFJDVlBGQy8+PFJDVlBSTj5OT05fSlhBPC9SQ1ZQUk4+PFJDVlNBRC8+PFJDVkxBRC8+PENSRURBVD4yMDAyMDcyMjwvQ1JFREFUPjxDUkVUSU0+MTgyOTM5PC9DUkVUSU0+PFJFRklOVC8+PFJFRkdSUC8+PFJFRk1FUy8+PEFSQ0tFWS8+PFNFUklBTD4yMDAyMDcyMjE4MjkzOTwvU0VSSUFMPgotICAgICAgPC9FRElfREM0MD48RTFLTkExTSBTRUdNRU5UPSIxIj48TVNHRk4+MDA1PC9NU0dGTj48S1VOTlI+MDAwMDAwMDEwMDwvS1VOTlI+PEFOUkVELz48QVVGU0QvPjxCQUhORS8+PEJBSE5TPkT8c3NlbGRvcmYgSEJGPC9CQUhOUz48QkJCTlI+MDAwMDAwMDwvQkJCTlI+PEJCU05SPjAwMDAwPC9CQlNOUj48QkVHUlUvPjxCUlNDSC8+PEJVQktaPjA8L0JVQktaPjxEQVRMVC8+PEZBS1NELz48RklTS04vPjxLTlJaQS8+PEtPTlpTLz48S1RPS0Q+MDAwMTwvS1RPS0Q+PEtVS0xBLz48TEFORDE+REU8L0xBTkQxPjxMSUZOUi8+PExJRlNELz48TE9DQ08vPjxMT0VWTS8+PE5BTUUxPklCSSBRdWFsaXR5IEFzc3VyYW5jZTwvTkFNRTE+PE5BTUUyLz48TkFNRTMvPjxOQU1FNC8+PE5JRUxTLz48T1JUMDE+TmV3IFlvcms8L09SVDAxPjxPUlQwMi8+PFBGQUNILz48UFNUTDIvPjxQU1RMWj4xMDEyMTwvUFNUTFo+PFJFR0lPPjA1PC9SRUdJTz48Q09VTkMvPjxDSVRZQy8+PFJQTUtSLz48U09SVEw+QU08L1NPUlRMPjxTUEVSUi8+PFNQUkFTPkQ8L1NQUkFTPjxTVENEMS8+PFNUQ0QyLz48U1RLWkEvPjxTVEtaVS8+PFNUUkFTPjIgUGVubnN5bHZhbmlhIFBsYXphPC9TVFJBUz48VEVMQlgvPjxURUxGMT4yMTItNzM2LTQ0MzM8L1RFTEYxPjxURUxGMi8+PFRFTEZYPjIxMi03MzYtNDQzNDwvVEVMRlg+PFRFTFRYLz48VEVMWDEvPjxMWk9ORT5EMDAwMDQwMDAwPC9MWk9ORT48WFpFTVAvPjxWQlVORC8+PFNUQ0VHPkRFLTEyMzQ1Njc5PC9TVENFRz48R0ZPUk0vPjxCUkFOMS8+PEJSQU4yLz48QlJBTjMvPjxCUkFONC8+PEJSQU41Lz48VU1KQUg+MDAwMDwvVU1KQUg+PFVXQUVSLz48Sk1aQUg+MDAwMDAwPC9KTVpBSD48Sk1KQUg+MDAwMDwvSk1KQUg+PEtBVFIxLz48S0FUUjIvPjxLQVRSMy8+PEtBVFI0Lz48S0FUUjUvPjxLQVRSNi8+PEtBVFI3Lz48S0FUUjgvPjxLQVRSOS8+PEtBVFIxMC8+PFNUS1pOLz48VU1TQTE+MDwvVU1TQTE+PFRYSkNELz48UEVSSVYvPjxLVE9DRC8+PFBGT1JULz48RFRBTVMvPjxEVEFXUy8+PEhaVU9SPjAwPC9IWlVPUj48Q0lWVkU+WDwvQ0lWVkU+PE1JTFZFLz48U1BSQVNfSVNPPkRFPC9TUFJBU19JU08+PEZJVFlQLz48U1RDRFQvPjxTVENEMy8+PFNUQ0Q0Lz48WElDTVMvPjxYWElQSS8+PFhTVUJULz48Q0ZPUEMvPjxUWExXMS8+PFRYTFcyLz48Q0NDMDEvPjxDQ0MwMi8+PENDQzAzLz48Q0NDMDQvPjxDQVNTRC8+PEtES0cxLz48S0RLRzIvPjxLREtHMy8+PEtES0c0Lz48S0RLRzUvPjxFMUtOQjFNIFNFR01FTlQ9IjEiPjxNU0dGTj4wMDU8L01TR0ZOPjxCVUtSUz5HTDEwMDA8L0JVS1JTPjxTUEVSUi8+PExPRVZNLz48WlVBV0E+MDAyPC9aVUFXQT48QlVTQUIvPjxBS09OVD4wMDAwMTQwMDAwPC9BS09OVD48QkVHUlUvPjxLTlJaRS8+PEtOUlpCLz48WkFNSU0vPjxaQU1JVi8+PFpBTUlSLz48WkFNSUIvPjxaQU1JTy8+PFpXRUxTLz48WFZFUlIvPjxaQUhMUy8+PFpURVJNPlpCMDE8L1pURVJNPjxXQUtPTi8+PFZaU0taLz48WklORFQ+MDAwMDAwMDA8L1pJTkRUPjxaSU5SVD4wMDwvWklOUlQ+PEVJS1RPPjAwMDAwMDAxMDA8L0VJS1RPPjxaU0FCRS8+PEtWRVJNLz48RkRHUlY+RTI8L0ZER1JWPjxWUkJLWi8+PFZMSUJCPjA8L1ZMSUJCPjxWUlNaTD4wPC9WUlNaTD48VlJTUFI+MDwvVlJTUFI+PFZSU05SLz48VkVSRFQ+MDAwMDAwMDA8L1ZFUkRUPjxQRVJLWi8+PFhERVpWLz48WEFVU1ovPjxXRUJUUj4wPC9XRUJUUj48UkVNSVQvPjxEQVRMWj4wMDAwMDAwMDwvREFUTFo+PFhaVkVSPlg8L1haVkVSPjxUT0dSVS8+PEtVTFRHPjA8L0tVTFRHPjxIQktJRC8+PFhQT1JFLz48QkxOS1ovPjxBTFRLTi8+PFpHUlVQLz48VVJMSUQvPjxNR1JVUC8+PExPQ0tCLz48VVpBV0UvPjxFS1ZCRC8+PFNSRUdMLz48WEVESVAvPjxGUkdSUC8+PFZSU0RHLz48VExGWFMvPjxQRVJOUj4wMDAwMDAwMDwvUEVSTlI+PElOVEFELz48R1VaVEUvPjxHUklDRC8+PEdSSURULz48RTFLTkI1TSBTRUdNRU5UPSIxIj48TVNHRk4+MDA1PC9NU0dGTj48TUFCRVIvPjxNQUhOQT4wMDAxPC9NQUhOQT48TUFOU1AvPjxNQURBVD4wMDAwMDAwMDwvTUFEQVQ+PE1BSE5TPjA8L01BSE5TPjxLTlJNQS8+PEdNVkRUPjAwMDAwMDAwPC9HTVZEVD48QlVTQUIvPjwvRTFLTkI1TT48L0UxS05CMU0+PC9FMUtOQTFNPjwvSURPQz48L0RFQk1BUzAxPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvZXZlbnRfREVCTUFTMDEueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9ldmVudF9ERUJNQVMwMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NTg5ZDUuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9ldmVudF9ERUJNQVMwMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPjx4c2Q6ZWxlbWVudCBuYW1lPSJERUJNQVMwMSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJJRE9DIj48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9IkVESV9EQzQwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJUQUJOQU0iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNQU5EVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRE9DTlVNIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRE9DUkVMIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTVEFUVVMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRJUkVDVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iT1VUTU9EIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFWFBSU1MiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRFU1QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IklET0NUWVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDSU1UWVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNRVNUWVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNRVNDT0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1FU0ZDVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1REIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTVERWUlMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNURE1FUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU05EUE9SIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU05EUFJUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTTkRQRkMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNORFBSTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNORFNBRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNORExBRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNzAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJDVlBPUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJDVlBSVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUkNWUEZDIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJSQ1ZQUk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJSQ1ZTQUQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJSQ1ZMQUQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjcwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDUkVEQVQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRhdGUiLz48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNSRVRJTSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dGltZSIvPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUkVGSU5UIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUkVGR1JQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUkVGTUVTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQVJDS0VZIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI3MCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU0VSSUFMIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJTRUdNRU5UIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRTFLTkExTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iTVNHRk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktVTk5SIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQU5SRUQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBVUZTRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQkFITkUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjI1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCQUhOUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMjUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJCQk5SIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI3Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCQlNOUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQkVHUlUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJSU0NIIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCVUJLWiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iREFUTFQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJGQUtTRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRklTS04iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLTlJaQSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktPTlpTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1RPS0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktVS0xBIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMQU5EMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTElGTlIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMSUZTRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTE9DQ08iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMT0VWTSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTkFNRTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJOQU1FMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik5BTUUzIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTkFNRTQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJOSUVMUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iT1JUMDEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJPUlQwMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBGQUNIIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUFNUTDIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQU1RMWiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJFR0lPIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDT1VOQyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ0lUWUMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJQTUtSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTT1JUTCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNQRVJSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTUFJBUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1RDRDEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTVENEMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNUS1pBIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTVEtaVSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1RSQVMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJURUxCWCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRFTEYxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVEVMRjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJURUxGWCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRFTFRYIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVEVMWDEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMWk9ORSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlhaRU1QIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWQlVORCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1RDRUciIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJHRk9STSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQlJBTjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCUkFOMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJSQU4zIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQlJBTjQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCUkFONSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlVNSkFIIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJVV0FFUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iSk1aQUgiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkpNSkFIIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLQVRSMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0FUUjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktBVFIzIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLQVRSNCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0FUUjUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktBVFI2IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLQVRSNyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0FUUjgiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktBVFI5IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLQVRSMTAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNUS1pOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJVTVNBMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRYSkNEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEVSSVYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktUT0NEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQRk9SVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRUQU1TIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJEVEFXUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iSFpVT1IiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNJVlZFIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNSUxWRSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1BSQVNfSVNPIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJGSVRZUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1RDRFQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNUQ0QzIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1RDRDQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJYSUNNUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWFhJUEkiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlhTVUJUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDRk9QQyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVFhMVzEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRYTFcyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDQ0MwMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ0NDMDIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNDQzAzIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDQ0MwNCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ0FTU0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktES0cxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLREtHMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0RLRzMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktES0c0IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLREtHNSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRTFLTlZWTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9Ijk5OTkiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iTVNHRk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZLT1JHIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWVFdFRyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1BBUlQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJFR1JVIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMT0VWTSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVkVSU0ciIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFVRlNEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLQUxLUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0RHUlAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJaSVJLIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLT05EQSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUExUWVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFXQUhSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJJTkNPMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iSU5DTzIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMSUZTRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQVVUTEYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFOVExGIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLWlRMRiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1pBWlUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNIU1BMIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMUFJJTyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRUlLVE8iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWU0JFRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRkFLU0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1STktaIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQRVJGSyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEVSUkwiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IldBRVJTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLVEdSRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWlRFUk0iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZXRVJLIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWS0dSUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVktCVVIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZTT1JUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1ZHUjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktWR1IyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLVkdSMyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1ZHUjQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktWR1I1IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCT0tSRSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1VSU1QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBSRlJFIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLTEFCQyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0FCU1MiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktLQkVSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDQVNTRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUkRPRkYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkUxS05WUE0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI5OTk5Ij48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9Ik1TR0ZOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJWVyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1VOTjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJERUZQQSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS05SRUYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IlNFR01FTlQiIHVzZT0icmVxdWlyZWQiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmF0dHJpYnV0ZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFMUtOVkRNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iOTk5OSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJNU0dGTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRE9DVFAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNQUkFTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJET0FOWiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRE9WRVIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik5BQ0hBIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTUFJBU19JU08iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iU0VHTUVOVCIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkUxS05WSU0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI5OTk5Ij48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9Ik1TR0ZOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBTEFORCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVEFUWVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRBWEtEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IlNFR01FTlQiIHVzZT0icmVxdWlyZWQiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmF0dHJpYnV0ZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFMUtOVkxNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iOTk5OSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJNU0dGTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQUxBTkQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRBVFlQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMSUNOUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRBVEFCIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJEQVRCSSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQkVMSUMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iU0VHTUVOVCIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iU0VHTUVOVCIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkUxS05CMU0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI5OTk5Ij48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9Ik1TR0ZOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCVUtSUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1BFUlIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkxPRVZNIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJaVUFXQSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQlVTQUIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFLT05UIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQkVHUlUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktOUlpFIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS05SWkIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJaQU1JTSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWkFNSVYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlpBTUlSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJaQU1JQiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWkFNSU8iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlpXRUxTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWFZFUlIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlpBSExTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJaVEVSTSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iV0FLT04iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZaU0taIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJaSU5EVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWklOUlQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkVJS1RPIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWlNBQkUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLVkVSTSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkZER1JWIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVlJCS1oiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZMSUJCIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVlJTWkwiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZSU1BSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWUlNOUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZFUkRUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQRVJLWiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWERFWlYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlhBVVNaIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJXRUJUUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJFTUlUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iREFUTFoiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlhaVkVSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJUT0dSVSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1VMVEciIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkhCS0lEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJYUE9SRSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQkxOS1oiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFMVEtOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWkdSVVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlVSTElEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNR1JVUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTE9DS0IiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjciLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlVaQVdFIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFS1ZCRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNSRUdMIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJYRURJUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRlJHUlAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZSU0RHIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJUTEZYUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBFUk5SIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJJTlRBRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTMwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJHVVpURSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iR1JJQ0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkdSSURUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFMUtOQjVNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iOTk5OSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJNU0dGTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUFCRVIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1BSE5BIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNQU5TUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUFEQVQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1BSE5TIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLTlJNQSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkdNVkRUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCVVNBQiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJTRUdNRU5UIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJTRUdNRU5UIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRTFLTkJLTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9Ijk5OTkiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iTVNHRk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJBTktTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCQU5LTCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJBTktOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQktPTlQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJWVFlQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJYRVpFUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQktSRUYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCQU5LQSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNjAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNUUkFTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iT1JUMDEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTV0lGVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJHUlVQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJYUEdSTyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQk5LTFoiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQU0tUTyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJSTkNIIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0MCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUFJPVloiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktPSU5IIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJTRUdNRU5UIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRTFLTlZBTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9Ijk5OTkiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iTVNHRk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFCTEFEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS05GQUsiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IldBTklEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNT0FCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTU9CSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1PQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNT0JJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRElBQjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRJQkkxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJESUFCMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRElCSTIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1JQUIxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNSUJJMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUlBQjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1JQkkyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJET0FCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRE9CSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRPQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJET0JJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRlJBQjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkZSQkkxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJGUkFCMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRlJCSTIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNBQUIxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTQUJJMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU0FBQjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNBQkkyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTT0FCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU09CSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNPQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTT0JJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iREVGQUIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iU0VHTUVOVCIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkUxS05WS00iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI5OTk5Ij48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9Ik1TR0ZOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJOUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik5BTUVWIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTkFNRTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBQlRQQSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFCVE5SIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJVRVBBUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRFTEYxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQU5SRUQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQUZLVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFSVk8iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBVklQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJHRSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFSTEEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkdCREFUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWUlROUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJSWVRIIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBS1ZFUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTk1BSUwiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBUkFVIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0MCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFSSDEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBUkgyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJIMyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFSSDQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBUkg1IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNT0FCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTU9CSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1PQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNT0JJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRElBQjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRJQkkxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJESUFCMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRElCSTIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1JQUIxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNSUJJMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUlBQjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1JQkkyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJET0FCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRE9CSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRPQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJET0JJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRlJBQjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkZSQkkxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJGUkFCMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRlJCSTIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNBQUIxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTQUJJMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU0FBQjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNBQkkyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTT0FCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU09CSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNPQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTT0JJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFLTjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBS04yIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQUtOMyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFLTjQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBS041IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTT1JUTCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkZBTVNUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTUE5BTSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRJVEVMX0FQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJTRUdNRU5UIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRTFLTktBTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iTVNHRk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktMSU1HIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0xJTUUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJXQUVSUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRExBVVMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iU0VHTUVOVCIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkUxS05LS00iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI5OTk5Ij48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9Ik1TR0ZOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLS0JFUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0xJTUsiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLTktMSSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNUTFBDIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJEVFJFViIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ1JCTEIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNCR1JQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJOWFRSViIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1JBVVMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjExIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQVlEQiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iREJSQVQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJFVkRCIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJHUlVQUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU0JEQVQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktER1JQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJEQlBBWSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iREJSVEciIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRCRUtSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iREJXQUUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRCTU9OIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IlNFR01FTlQiIHVzZT0icmVxdWlyZWQiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmF0dHJpYnV0ZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IlNFR01FTlQiIHVzZT0icmVxdWlyZWQiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmF0dHJpYnV0ZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IkJFR0lOIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9jeWNsb25lL0N5Y2xvbmVPcmdhbml6YXRpb25Qcm9maWxlLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2N5Y2xvbmUvQ3ljbG9uZU9yZ2FuaXphdGlvblByb2ZpbGUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTMxNGMwLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2N5Y2xvbmUvQ3ljbG9uZU9yZ2FuaXphdGlvblByb2ZpbGUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNzM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuY3ljbG9uZWNvbW1lcmNlLmNvbS9TY2hlbWFzLzIwMDEvMDgvY29wIiB4bWxucz0iaHR0cDovL3d3dy5jeWNsb25lY29tbWVyY2UuY29tL1NjaGVtYXMvMjAwMS8wOC9jb3AiIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIj4KLQk8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxkc2lnLWNvcmUveG1sZHNpZy1jb3JlLXNjaGVtYS54c2QiLz4KLQk8eHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIHNjaGVtYSByZXByZXNlbnRzIG9yZ2FuaXphdGlvbiBkZXRhaWxzIHJlcXVpcmVkIGZvciB0cmFkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQk8IS0tR2VuZXJhbCBkZWZpbml0aW9ucyB1c2VkIHdpdGhpbiB0aGUgcmVzdCBvZiB0aGUgc2NoZW1hLi0tPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21tZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZnJlZWZvcm0gdGV4dCBmaWVsZCB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgYW4gZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4c2Q6bGFuZ3VhZ2UiIGRlZmF1bHQ9ImVuIi8+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSWRlbnRpZmllciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBpZCBmb3IgYW4gZWxlbWVudC4gIENhbid0IHVzZSB4c2Q6SUQgYmVjYXVzZSBpdCB3b24ndCBhbGxvdyB0aGVtIHRvIGJlZ2luIHdpdGggYSBudW1iZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSWRlbnRpZmllclJlZiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBJZGVudGlmaWVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iSWRlbnRpZmllciIvPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ik9yZ2FuaXphdGlvbklkIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXJ2ZXIncyB1bmlxdWUgaW50ZXJuYWwgaWRlbnRpZmllciBmb3IgYW4gb3JnYW5pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iSWRlbnRpZmllciI+Ci0JCQk8eHNkOm1pbkxlbmd0aCB2YWx1ZT0iMSIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDb21tdW5pdHlJZCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2VydmVyJ3MgdW5pcXVlIGludGVybmFsIGlkZW50aWZpZXIgZm9yIGEgY29tbXVuaXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iSWRlbnRpZmllciI+Ci0JCQk8eHNkOm1pbkxlbmd0aCB2YWx1ZT0iMSIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21tdW5pdHkiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbW11bml0eU5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCcm9rZXJJZCIgdHlwZT0iT3JnYW5pemF0aW9uSWQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb21tdW5pdHlJZCIgdHlwZT0iQ29tbXVuaXR5SWQiIHVzZT0icmVxdWlyZWQiLz4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8IS0tVGhlIGZvbGxvd2luZyBkZWZpbmVzIHN0dWZmIGZvciB0aGUgQWRtaW5pc3RyYXRpdmUgSW5mb3JtYXRpb24tLT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iT3JnYW5pemF0aW9uTmFtZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgb3JnYW5pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iUGVyc29uTmFtZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiBhIHBlcnNvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBob25lIiBtaXhlZD0idHJ1ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHBob25lIG51bWJlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkVtYWlsIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGVtYWlsIGFkZHJlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmZvcm1hdGlvbiBhYm91dCBhIHBlcnNvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDb21tZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iUGVyc29uTmFtZSIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUaXRsZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlcGFydG1lbnQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFbWFpbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FbWFpbCBhZGRyZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iRW1haWwiPgotCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQkJCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJCQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGhvbmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlBob25lIi8+Ci0JCQkJCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBvc3RhbEFkZHJlc3MiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb250YWN0SWQiIHR5cGU9IklkZW50aWZpZXIiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdHMiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Q29sbGVjdGlvbiBvZiBDb250YWN0IGFuZCBDb250YWN0UmVmcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDb250YWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGFsQWRkcmVzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qb3N0YWwgbWFpbGluZyBhZGRyZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkNvbW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3RyZWV0IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzdHJlZXQgYWRkcmVzcy4gIFRoaXMgbWF5IHJlc29sdmUgdG8gd2hhdCBtYXkgYmUgaW50ZXJwcmV0ZWQgYXMgbXVsdGlwbGUgbGluZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q2l0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlN0YXRlcHJvdiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0YXRlIG9yIHByb3ZpbmNlIGRlcGVuZGluZyBvbiB0aGUgY291bnRyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3RhbENvZGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UG9zdGFsIG9yIHppcCBjb2RlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ291bnRyeSIgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iVVMiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q291bnRyeSBjb2RlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJSb3V0aW5nSWRUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0eXBlIG9mIHJvdXRpbmcgaWRlbnRpZmllciwgbGlrZSBEVU5TLCBFREksIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRElGQUNUIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEVU5TIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlJvdXRpbmdJZCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBpZGVudGlmaWVyIHN1Y2ggYXMgRFVOUyBvciBFREkgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSBhIGNvbXBhbnkgZm9yIHRyYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2ltcGxlQ29udGVudD4KLQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0iUm91dGluZ0lkVHlwZSIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkNlcnRpZmljYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZm9ybWF0aW9uIGFib3V0IGEgY2VydGlmaWNhdGUuIFRoZSBpbml0aWFsIHZlcnNpb24gb2YgZWFjaCBJbnRlcmNoYW5nZSBwcm9kdWN0IG9ubHkgc3VwcG9ydCB0aGUgZHM6S2V5SW5mby9kczpYNTA5RGF0YSBzZWN0aW9uIGluY2x1ZGluZyBkczpYNTA5SXNzdWVyU2VyaWFsIGFuZCBYNTA5Q2VydGlmaWNhdGUuICBBbnkgb3RoZXIgZWxlbWVudHMgdXNlZCB3aWxsIGJlIGlnbm9yZWQsIGFuZCBpZiBvbmUgb2YgdGhlIHR3byBzdXBwb3J0ZWQgZWxlbWVudHMgaXMgbm90IGluY2x1ZGVkIHRoZSBjZXJ0aWZpY2F0ZSB3aWxsIGJlIGNvbnNpZGVyZWQgaW52YWxpZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJkczpLZXlJbmZvIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNlcnRJZCIgdHlwZT0iSWRlbnRpZmllciIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJDZXJ0aWZpY2F0ZXRSZWYiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZlcmVuY2UgdG8gYSBDZXJ0aWZpY2F0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2VydElkIiB0eXBlPSJJZGVudGlmaWVyUmVmIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkNlcnRpZmljYXRlcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db2xsZWN0aW9uIG9mIENlcnRpZmljYXRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVmZXJyZWRFbmNyeXB0aW9uQ2VydElkIiB0eXBlPSJJZGVudGlmaWVyUmVmIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkFkbWluaXN0cmF0aXZlSW5mbyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmZvcm1hdGlvbiBkZXNjcmliaW5nIGFuIG9yZ2FuaXphdGlvbiB1c2VmdWwgdG8gaHVtYW5zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ik9yZ2FuaXphdGlvbk5hbWUiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQb3N0YWxBZGRyZXNzIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDb250YWN0cyIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8IS0tVGhlIGZvbGxvd2luZyBkZWZpbmVzIHN0dWZmIGZvciBUcmFuc3BvcnRzLS0+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlVzZXJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlVzZXJuYW1lIHVzZWQgdG8gYWNjZXNzIGEgcmVzb3VyY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYXNzd29yZCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5QYXNzd29yZCB1c2VkIHRvIGFjY2VzcyBhIHNlY3VyZSByZXNvdWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImVuY3J5cHRlZCIgdHlwZT0ieHNkOmJvb2xlYW4iIHVzZT0icmVxdWlyZWQiLz4KLQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJJUEFkZHJlc3MiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+SW50ZXJuZXQgUHJvdG9jYWwgYWRkcmVzcywgZXg6ICAxMi4zNC41Ni43ODwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQk8eHNkOnBhdHRlcm4gdmFsdWU9IigoWzAtMV0/WzAtOV0/WzAtOV18MlswLTRdWzAtOV18MjVbMC05XSl7M30oLlswLTFdP1swLTldP1swLTldfDJbMC00XVswLTldfDI1WzAtNV0pKSI+Ci0JCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBtZXNzIGp1c3QgcmVzdHJpY3RzIHRoZSB2YWx1ZSB0byBzdGFuZGFyZCBJUCBhZGRyZXNzZXMgd2hlcmUgZWFjaCBvZiBmb3VyIG9jdGV0cyBjYW4gaGF2ZSB2YWx1ZXMgMC0yNTUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJPC94c2Q6cGF0dGVybj4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRE5TQWRkcmVzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Eb21haW4gTmFtZSBTZXJ2ZXIgYWRkcmVzcywgZXg6IHd3dy5jeWNsb25lY29tbWVyY2UuY29tPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU29ja2V0U2VjdXJpdHlUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFVVEhFTlRJQ0FURUQgb3IgQU5PTllNT1VTPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVEhFTlRJQ0FURUQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFOT05ZTU9VUyIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJIb3N0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgaG9zdCBhZGRyZXNzLCBlaXRoZXIgaW4gRE5TIG9yIElQLCBmb3IgYSBzZXJ2ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpzaW1wbGVUeXBlPgotCQkJPHhzZDp1bmlvbiBtZW1iZXJUeXBlcz0iRE5TQWRkcmVzcyBJUEFkZHJlc3MiLz4KLQkJPC94c2Q6c2ltcGxlVHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlNvY2tldCBwb3J0IG51bWJlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDppbnRlZ2VyIj4KLQkJCQk8eHNkOm1pbkluY2x1c2l2ZSB2YWx1ZT0iMSIvPgotCQkJCTx4c2Q6bWF4SW5jbHVzaXZlIHZhbHVlPSI2NTAwMCIvPgotCQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JCTwveHNkOnNpbXBsZVR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGlyZWN0b3J5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZGlyZWN0b3J5IG9uIGEgZmlsZSBzeXN0ZW0gb3Igc2VydmVyIHN1Y2ggYXMgRlRQLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkpNU0NvbnN1bWVyVHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgSk1TLCBlaXRoZXIgYSBRdWV1ZSBvciBUb3BpYy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUVVFVUUiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRPUElDIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkZpcmV3YWxsQXV0aGVudGljYXRpb25UeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVpdGhlciBTL0tleSBvciBDbGVhclRleHQ8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0tFWSIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0xFQVJURVhUIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkZpcmV3YWxsIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNwb3J0IHNlcnZlcidzIGZpcmV3YWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ikhvc3QiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQb3J0Ii8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkF1dGhlbnRpY2F0aW9uIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgUy9LZXkgb3IgQ2xlYXIgdGV4dCBhdXRoZW50aWNhdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJVc2VybmFtZSIvPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBhc3N3b3JkIi8+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9IkZpcmV3YWxsQXV0aGVudGljYXRpb25UeXBlIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iU29ja2V0U2VjdXJpdHkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VHlwZSBvZiBTU0wgc2VjdXJpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkNlcnRpZmljYXRldFJlZiIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9IlNvY2tldFNlY3VyaXR5VHlwZSIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNwb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkJhc2UgZGVmaW5pdGlvbiBmb3IgYSB0cmFkaW5nIHRyYW5zcG9ydCBzZXJ2ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCByZWY9IkNvbW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTY2hlZHVsZXMiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29sbGVjdGlvbiBvZiBzY2hlZHVsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZWR1bGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlBlcmlvZCBvZiB0aW1lIGluY2x1ZGluZyBhIHN0YXJ0IGFuZCBzdG9wIHRpbWUgcmVwcmVzZW50aW5nIHRoZSBwZXJpb2Qgb2YgdGltZSB0aGUgdHJhbnNwb3J0IGlzIGF2YWlsYWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RhcnRUaW1lIiB0eXBlPSJ4c2Q6dGltZSIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdG9wVGltZSIgdHlwZT0ieHNkOnRpbWUiIHVzZT0icmVxdWlyZWQiLz4KLQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQkJPC94c2Q6c2VxdWVuY2U+Ci0JCTx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zcG9ydElkIiB0eXBlPSJJZGVudGlmaWVyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydFJlZiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhIFRyYW5zcG9ydCBkZWZpbmVkIGVsc2V3aGVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNwb3J0SWQiIHR5cGU9IklkZW50aWZpZXJSZWYiIHVzZT0icmVxdWlyZWQiLz4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0cyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db2xsZWN0aW9uIG9mIFRyYW5zcG9ydHMgZGVmaW50aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJGaWxlVHJhbnNwb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iRlRQVHJhbnNwb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iSFRUUFRyYW5zcG9ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkhUVFBUcmFuc3BvcnRfQ0kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJTTVRQVHJhbnNwb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iU01UUFRyYW5zcG9ydF9DSSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkpNU1RyYW5zcG9ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ik1RU2VyaWVzVHJhbnNwb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWZlcnJlZFRyYW5zcG9ydFJlZiIgdHlwZT0iSWRlbnRpZmllclJlZiIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJGaWxlVHJhbnNwb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkZpbGUgc3lzdGVtIHRyYW5zcG9ydCBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlRyYW5zcG9ydCI+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGlyZWN0b3J5Ij4KLQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGlyZWN0b3J5IG9uIHRoZSBmaWxlIHN5c3RlbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJCQkJCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iRGlyZWN0b3J5Ij4KLQkJCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc0xvY2FsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJCQkJCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJCQkJCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkZUUFRyYW5zcG9ydCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5GaWxlIFRyYW5zZmVyIFByb3RvY29sIHRyYW5zcG9ydCBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlRyYW5zcG9ydCI+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJIb3N0Ii8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQb3J0Ii8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJVc2VybmFtZSIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iUGFzc3dvcmQiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUZW1wRGlyIiB0eXBlPSJEaXJlY3RvcnkiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRpcmVjdG9yeSBvbiB0aGUgRlRQIHNlcnZlciB3aGVyZSBpbmNvbWluZyBkb2N1bWVudHMgYXJlIHRlbXBvcmFyaWx5IHN0b3JlZCBhcyB0aGV5IGFyZSB0cmFuc2ZlcnJlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBpY2t1cERpciIgdHlwZT0iRGlyZWN0b3J5Ij4KLQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EaXJlY3Rvcnkgd2hlcmUgdGhlIGRvY3VtZW50cyBhcmUgbW92ZWQgYWZ0ZXIgaGF2aW5nIGJlZW4gdHJhbnNmZXJyZWQgdG8gdGhlIFRlbXBEaXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc2ZlclR5cGUiIGRlZmF1bHQ9IkJJTkFSWSI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QklOQVJZIG9yIEFTQ0lJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTQ0lJIi8+Ci0JCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSU5BUlkiLz4KLQkJCQkJCQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JCQkJCQkJPC94c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTW9kZSIgZGVmYXVsdD0iUGFzc2l2ZSI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UG9ydCBvciBQYXNzaXZlLiAgUGFzc2l2ZSBtZWFucyB0aGUgRlRQIHNlcnZlciBzZWxlY3RzIHRoZSBkYXRhIHBvcnQgZm9yIHRoZSBGVFAgZGF0YSB0cmFuc2Zlci4gUG9ydCBtZWFucyB0aGUgRlRQIGNsaWVudCBzZWxlY3RzIHRoZSBkYXRhIHBvcnQgZm9yIHRoZSBGVFAgZGF0YSB0cmFuc2Zlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpzaW1wbGVUeXBlPgotCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydCIvPgotCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc2l2ZSIvPgotCQkJCQkJCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkZpcmV3YWxsIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlNvY2tldFNlY3VyaXR5IiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkhUVFBUcmFuc3BvcnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+SHlwZXJUZXh0IFRyYW5zZmVyIFByb3RvY29sIGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iVHJhbnNwb3J0Ij4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJVUkwiIHR5cGU9InhzZDphbnlVUkkiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlVzZXJuYW1lIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBhc3N3b3JkIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2QiIGRlZmF1bHQ9IlBPU1QiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVpdGhlciBQVVQgb3IgUE9TVCB0aGF0IHRoZSBjbGllbnQgc2hvdWxkIHVzZSB0byBwdXNoIGRvY3VlbW50cyB0byB0aGUgc2VydmVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVVQiLz4KLQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBPU1QiLz4KLQkJCQkJCQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JCQkJCQkJPC94c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRG91YmxlTWltZVdyYXBwZWQiIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U29tZSBzZXJ2ZXJzIHdpbGwgc3RyaXAgb2ZmIE1JTUUgd3JhcHBpbmcgb2YgYSBkb2N1bWVudCByZXF1aXJpbmcgdGhhdCB0aGUgZG9jdW1lbnQgYmUgTUlNRSB3cmFwcGVkIHR3aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJGaXJld2FsbCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJTb2NrZXRTZWN1cml0eSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJCTwveHNkOmNvbXBsZXhDb250ZW50PgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJIVFRQVHJhbnNwb3J0X0NJIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkN5Y2xvbmUgSW50ZXJjaGFuZ2UgRW50ZXJwcmlzZSdzIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgSFRUUC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJUcmFuc3BvcnQiPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlVSTCIgdHlwZT0ieHNkOmFueVVSSSIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iRmlyZXdhbGwiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iU29ja2V0U2VjdXJpdHkiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iU01UUFRyYW5zcG9ydCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TaW1wbGUgTWFpbCBUcmFuc3BvcnQgUHJvdG9jb2wgdHJhbnNwb3J0IGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iVHJhbnNwb3J0Ij4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ikhvc3QiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iUG9ydCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJVc2VybmFtZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQYXNzd29yZCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVjaXBpZW50IiB0eXBlPSJFbWFpbCI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RW1haWwgYWRkcmVzcyBvZiB0aGUgcmVjaXBpZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSXNDb21wbGlhbnQiIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIj4KLQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXQgdG8gZmFsc2UgZm9yIFNNVFAgaW1wbGVtZW50YXRpb25zIHRoYXQgZG8gbm90IGxlYXZlIHRoZSBNSU1FIHdyYXBwaW5nIGluIHRhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkZpcmV3YWxsIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlNvY2tldFNlY3VyaXR5IiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlNNVFBUcmFuc3BvcnRfQ0kiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Q3ljbG9uZSBJbnRlcmNoYW5nZSBFbnRlcnByaXNlJ3Mgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBTTVRQLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlRyYW5zcG9ydCI+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJIb3N0IiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBvcnQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlY2lwaWVudCIgdHlwZT0iRW1haWwiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVtYWlsIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iRmlyZXdhbGwiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iU29ja2V0U2VjdXJpdHkiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iSk1TVHJhbnNwb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkphdmEgTWVzc2FnZSBTZXJ2aWNlIChKTVMpIHRyYW5zcG9ydCBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlRyYW5zcG9ydCI+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJVc2VybmFtZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQYXNzd29yZCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29ubmVjdGlvbkZhY3RvcnkiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBjb25uZWN0aW9uIGZhY3RvcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25zdW1lciI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIFF1ZXVlIG9yIFRvcGljLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJCQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJKTVNDb25zdW1lclR5cGUiIGRlZmF1bHQ9IlFVRVVFIi8+Ci0JCQkJCQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQkJCQkJCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkpOREkiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkphdmEgTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlIGRlZmludGlvbiB0byBsb2NhdGUgdGhlIEpNUyBwcm92aWRlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMb2NhdGlvbiIgdHlwZT0ieHNkOmFueVVSSSI+Ci0JCQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIFVSSSBsb2NhdGlvbiBvZiB0aGUgSk1TIHNlcnZlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iVXNlcm5hbWUiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iUGFzc3dvcmQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRleHRGYWN0b3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgSk5ESSBjb250ZXh0IGZhY3RvcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTVFTZXJpZXNUcmFuc3BvcnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+SUJNJ3MgTVEgU2VyaWVzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iVHJhbnNwb3J0Ij4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ikhvc3QiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBvcnQiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlVzZXJuYW1lIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBhc3N3b3JkIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJRdWV1ZU1hbmFnZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJRdWV1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoYW5uZWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPCEtLVRoZSBmb2xsb3dpbmcgZGVmaW5lcyBidXNpbmVzcyBwcm90b2NvbCBpbmZvcm1hdGlvbiAtLT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJ1c2luZXNzUHJvdG9jb2wiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QmFzZSBkZWZpbml0aW9uIGZvciBhIGJ1c2luZXNzIHByb3RvY29sLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmVsZW1lbnQgcmVmPSJUcmFuc3BvcnRSZWYiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwveHNkOnNlcXVlbmNlPgotCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJidXNpbmVzc1Byb3RvY29sSWQiIHR5cGU9IklkZW50aWZpZXIiIHVzZT0icmVxdWlyZWQiLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iQnVzaW5lc3NQcm90b2NvbFJlZiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhIGJ1c2luZXNzIHByb3RvY29sIGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJ1c2luZXNzUHJvdG9jb2xJZCIgdHlwZT0iSWRlbnRpZmllclJlZiIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJCdXNpbmVzc1Byb3RvY29scyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db2xsZWN0aW9uIG9mIEJ1c2luZXNzIHByb3RvY29sIGRlZmluaXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmFsbD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQVMxUHJvdG9jb2wiIHR5cGU9IkJ1c2luZXNzUHJvdG9jb2wiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBUzJQcm90b2NvbCIgdHlwZT0iQnVzaW5lc3NQcm90b2NvbCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvc2V0dGFOZXRQcm90b2NvbCIgdHlwZT0iQnVzaW5lc3NQcm90b2NvbCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9ImViWE1MUHJvdG9jb2wiIHR5cGU9IkJ1c2luZXNzUHJvdG9jb2wiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94c2Q6YWxsPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTwhLS1UaGUgZm9sbG93aW5nIGRlZmluZXMgdGhlIHRvcC1sZXZlbCBPcmdhbml6YXRpb25EYXRhLS0+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik9yZ2FuaXphdGlvblByb2ZpbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QWxsIGluZm9ybWF0aW9uIG5lZWRlZCB0byB0cmFkZSB3aXRoIGFuIG9yZ2FuaXphdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDb21tZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iQWRtaW5pc3RyYXRpdmVJbmZvIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm91dGluZ0lkcyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbGxlY3Rpb24gb2YgUm91dGluZ0lkczwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlJvdXRpbmdJZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkJyb2tlcklkIiB0eXBlPSJPcmdhbml6YXRpb25JZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPldpdGhpbiB0aGlzIGNvbW11bml0eSwgdGhpcyBvcmdhbml6YXRpb24gdHJhZGVzIHRocm91Z2ggYSBicm9rZXIgKGh1YikuIFRoaXMgcmVmZXJlbmNlcyBhbm90aGVyIHByb2ZpbGUgd2l0aCB0aGlzIGlkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29tbXVuaXRpZXMiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db2xsZWN0aW9uIG9mIGNvbW11bml0aWVzIHRoZSB0cmFkaW5nIHByb2ZpbGUgaXMgYWN0aXZlbHkgYSBtZW1iZXIgb2YuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iQ29tbXVuaXR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJUcmFuc3BvcnRzIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDZXJ0aWZpY2F0ZXMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkJ1c2luZXNzUHJvdG9jb2xzIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9Ik9yZ2FuaXphdGlvbklkIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgT3JnYW5pemF0aW9uSWQgZXhpc3RzIGZvciB2YWxpZCBwcm9maWxlcyBleGlzdGluZyB3aXRoaW4gdGhlIHNlcnZlci4gIElmIGEgY2xpZW50IGlzIHNlbmRpbmcgYSBwcm9maWxlIGZvciBhbiBvcmdhbml6YXRpb24gdGhhdCBpcyBub3QgYWxyZWFkeSBpbiB0aGUgc2VydmVyJ3MgcmVwb3NpdG9yeSwgdGhpcyBpZCB3aWxsIG5vdCBiZSBwcmVzZW50IGFzIHRoZSBzZXJ2ZXIgd2lsbCBiZSBhc3NpZ25pbmcgb25lIGZvciBpdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9jeWNsb25lL0ludGVyY2hhbmdlUGFydG5lckNvbmZpZy54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9jeWNsb25lL0ludGVyY2hhbmdlUGFydG5lckNvbmZpZy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNDliMWQuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvY3ljbG9uZS9JbnRlcmNoYW5nZVBhcnRuZXJDb25maWcueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIGVkaXRlZCB3aXRoIFhNTCBTcHkgdjQuMyBVIChodHRwOi8vd3d3LnhtbHNweS5jb20pIGJ5IEJvYiBLcmllciAoQ3ljbG9uZSBDT21tZXJjZSwgSW5jLikgLS0+Ci08IS0tVzNDIFNjaGVtYSBnZW5lcmF0ZWQgYnkgWE1MIFNweSB2My41IE5UIChodHRwOi8vd3d3LnhtbHNweS5jb20pLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuY3ljbG9uZWNvbW1lcmNlLmNvbS9TY2hlbWFzLzIwMDEvMDkvaXBwIiB4bWxucz0iaHR0cDovL3d3dy5jeWNsb25lY29tbWVyY2UuY29tL1NjaGVtYXMvMjAwMS8wOS9pcHAiIHhtbG5zOmNvcD0iaHR0cDovL3d3dy5jeWNsb25lY29tbWVyY2UuY29tL1NjaGVtYXMvMjAwMS8wOC9jb3AiIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiPgotCTx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5jeWNsb25lY29tbWVyY2UuY29tL1NjaGVtYXMvMjAwMS8wOC9jb3AiIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmN5Y2xvbmVjb21tZXJjZS5jb20vU2NoZW1hcy8yMDAxLzA4L0N5Y2xvbmVPcmdhbml6YXRpb25Qcm9maWxlLnhzZCIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmNoYW5nZVBhcnRuZXJQcm9maWxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkN5Y2xvbmUgSW50ZXJjaGFuZ2UgcGFydG5lciBwcm9maWxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9ImNvcDpPcmdhbml6YXRpb25Qcm9maWxlIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2Vjb25kYXJ5SWRzIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2Vjb25kYXJ5SWQiIHR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJmYWxzZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iUHJlZmVyZW5jZXMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJGaXJld2FsbCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1pblNLZXlJdGVyYXRpb25Db3VudCI+Ci0JCQkJCQkJCTx4c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQkJCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmludCI+Ci0JCQkJCQkJCQkJPHhzZDptaW5JbmNsdXNpdmUgdmFsdWU9IjAiLz4KLQkJCQkJCQkJCQk8eHNkOm1heEluY2x1c2l2ZSB2YWx1ZT0iNjU1MzUiLz4KLQkJCQkJCQkJCTwveHNkOnJlc3RyaWN0aW9uPgotCQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2VjdXJpdHkiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TZWN1cml0eSBwYXJhbWV0ZXJzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEb2N1bWVudFNpZ25pbmciIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Qm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIGRvY3VtZW50cyByZWNlaXZlZCBieSB0aGlzIHBhcnRuZXIgc2hvdWxkIGJlIHNpZ25lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRvY3VtZW50QWNrbm93bGVkZ2VtZW50IiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RG9jdW1lbnQgYWNrbm93bGVkZ2VtZW50IGNvbmZpZ3VyYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcXVlc3RTaWduZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBkb2N1bWVudCBhY2tub3dsZWRnbWVudHMgc2hvdWxkIGJlIHNpZ25lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcXVlc3RTeW5jaHJvbm91cyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Qm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIGFja25vd2xlZGdlbWVudHMgc2hvdWxkIGJlIGltbWVkaWF0ZWx5IHJlY2VpdmVkLiAgUmVxdWlyZXMgYnVuZGxlZCBIVFRQKFMpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpib29sZWFuIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1lc3NhZ2VEaWdlc3QiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBkb2N1bWVudCBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aGltIHRvIHVzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNRDUiLz4KLQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSEExIi8+Ci0JCQkJCQkJCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJCQkJCQkJPC94c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEb2N1bWVudEVuY3J5cHRpb24iIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSB0eXBlIG9mIGRvY3VtZW50IGVuY3J5cHRpb24gYWxnb3JpdGhpbSB0byB1c2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCTx4c2Q6Y2hvaWNlPgotCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSQzJFbmNyeXB0aW9uIj4KLQkJCQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJDMiBFbmNyeXB0aW9uIGFsZ29yaXRoaW0uICBLZXkgbGVuZ3RoIGlzIHJlcXVpcmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJrZXlMZW5ndGgiIHVzZT0icmVxdWlyZWQiPgotCQkJCQkJCQkJCQkJCTx4c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQkJCQkJCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0JCQkJCQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MCIvPgotCQkJCQkJCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjQiLz4KLQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEyOCIvPgotCQkJCQkJCQkJCQkJCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJCQkJCQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJCQkJCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBUkNGb3VyRW5jcnlwdGlvbiI+Ci0JCQkJCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BUkNGb3VyIEVuY3J5cHRpb24gYWxnb3JpdGhpbS4gIEtleSBsZW5ndGggaXMgcmVxdWlyZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImtleUxlbmd0aCIgdXNlPSJyZXF1aXJlZCI+Ci0JCQkJCQkJCQkJCQkJPHhzZDpzaW1wbGVUeXBlPgotCQkJCQkJCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQwIi8+Ci0JCQkJCQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2NCIvPgotCQkJCQkJCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTI4Ii8+Ci0JCQkJCQkJCQkJCQkJCTwveHNkOnJlc3RyaWN0aW9uPgotCQkJCQkJCQkJCQkJCTwveHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRFU0VuY3J5cHRpb24iPgotCQkJCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+REVTIEVuY3J5cHRpb24gYWxnb3JpdGhpbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ia2V5TGVuZ3RoIiB0eXBlPSJ4c2Q6aW50IiB1c2U9Im9wdGlvbmFsIiBmaXhlZD0iNTYiLz4KLQkJCQkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVHJpcGxlREVTRW5jcnlwdGlvbiI+Ci0JCQkJCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UcmlwbGUgREVTIEVuY3J5cHRpb24gYWxnb3JpdGhpbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ia2V5TGVuZ3RoIiB0eXBlPSJ4c2Q6aW50IiB1c2U9Im9wdGlvbmFsIiBmaXhlZD0iMTY4Ii8+Ci0JCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmluYXJ5RGlyZWN0b3JpZXMiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBiaW5hcnkgY29tcGFuaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCaW5hcnlDb21wYW55IiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBiaW5hcnkgZGlyZWN0b3JpZXMgZm9yIGEgY29tcGFueS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmluYXJ5RGlyZWN0b3J5IiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBpbmJvdW5kIGFuZCBvdXRib3VuZCBiaW5hcnkgZGlyZWN0b3JpZXMgZm9yIGEgcGFydG5lci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFydG5lcklkIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbmJvdW5kUGF0aCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3V0Ym91bmRQYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbXBhbnlJZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Imdyb3VwIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlByZWZlcmVuY2VzIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlBhcnRuZXIgcHJvZmlsZSB0cmFuc3BvcnQgYW5kIGRvY3VtZW50IHNldHRpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTY2hlZHVsZSIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgc2NoZWR1bGUgdG8gdXNlIHdoZW4gc2VuZGluZyBkb2N1bWVudHMgdG8gdGhpcyBwYXJ0bmVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW5ib3VuZEZpbGVQcmVzZXJ2YXRpb24iIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgaW5ib3VuZCBmaWxlcyBzaG91bGQgYmUgcGVyc2lzdGVkIHdpdGggdGhlaXIgb3JpZ2luYWwgZmlsZSBuYW1lLiAgT3B0aW9uIGF0dHJpYnV0ZSBhbGxvd3MgZm9yIG92ZXJ3cml0aW5nIG9yIHNlcXVlbmNpbmcgZmlsZXMgd2l0aCBkdXBsaWNhdGUgZmlsZSBuYW1lcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkRvY3VtZW50T3B0aW9ucyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkdsb2JhbCBkb2N1bWVudCBjb25maWd1cmF0aW9uIG9wdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlamVjdER1cGxpY2F0ZUVESSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Qm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIEVESSBkb2N1bWVudCByZWNpZXZlZCB3aXRoIGR1cGxpY2F0ZSBjb250cm9sIElEcyBzaG91bGQgYmUgcmVqZWN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21wcmVzc2lvbiIgZGVmYXVsdD0iTk9ORSIgbmlsbGFibGU9ImZhbHNlIj4KLQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB0aGUgdHlwZSBvZiBjb21wcmVzc2lvbiBhbGdvcml0aGltIHRvIHVzZSAoTk9ORSwgR1pJUCBvciBaTElCKS4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpzaW1wbGVUeXBlPgotCQkJCQkJCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHWklQIi8+Ci0JCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWkxJQiIvPgotCQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLQkJCQkJCQkJCTwveHNkOnJlc3RyaWN0aW9uPgotCQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc2VuZEF0dGVtcHRzIj4KLQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkludGVnZXIgdmFsdWUgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgZG9jdW1lbnQgc2hvdWxkIGJlIHJlc2VudCBpZiBhbiBhY2tub3dsZWRtZW50IGhhcyBub3QgYmVlbiByZWNpZXZlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDppbnQiPgotCQkJCQkJCQkJCTx4c2Q6bWluSW5jbHVzaXZlIHZhbHVlPSIwIi8+Ci0JCQkJCQkJCQkJPHhzZDptYXhJbmNsdXNpdmUgdmFsdWU9IjYwIi8+Ci0JCQkJCQkJCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJCQkJCQkJPC94c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNlbmRJbnRlcnZhbCI+Ci0JCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbnRlZ2VyIHZhbHVlIGluZGljYXRpbmcgdGhlIGR1cmF0aW9uIChpbiBob3VycykgYmV0d2VlbiByZXNlbmQgYXR0ZXB0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDppbnQiPgotCQkJCQkJCQkJCTx4c2Q6bWluSW5jbHVzaXZlIHZhbHVlPSIxIi8+Ci0JCQkJCQkJCQkJPHhzZDptYXhJbmNsdXNpdmUgdmFsdWU9Ijk5OTkiLz4KLQkJCQkJCQkJCTwveHNkOnJlc3RyaWN0aW9uPgotCQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0UmV0cmllcyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgVHJhbnNwb3J0IHJldHJpZXMgb3B0aW9uIGFuZCBpbnRlcnZhbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZHVyYXRpb24iIHR5cGU9InhzZDppbnRlZ2VyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmYWxsb2ZmIiB0eXBlPSJ4c2Q6aW50ZWdlciIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQk8L3hzZDplbGVtZW50PgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCdXNpbmVzc1Byb3RvY29sIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkJhc2UgZGVmaW5pdGlvbiBmb3IgYSBidXNpbmVzcyBwcm90b2NvbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJPHhzZDplbGVtZW50IHJlZj0iVHJhbnNwb3J0UmVmIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYnVzaW5lc3NQcm90b2NvbElkIiB0eXBlPSJ4c2Q6SURSRUYiIHVzZT0icmVxdWlyZWQiLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0UmVmIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmZXJlbmNlIHRvIGEgVHJhbnNwb3J0IGRlZmluZWQgZWxzZXdoZXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2N5Y2xvbmUvVFBNLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2N5Y2xvbmUvVFBNLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyYWE1Yi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9jeWNsb25lL1RQTS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tCUNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCUFsbCByaWdodHMgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCVRISVMgSVMgVU5QVUJMSVNIRUQgUFJPUFJJRVRBUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCVNPVVJDRSBDT0RFIE9GIEJFQSBTeXN0ZW1zLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCVRoZSBjb3B5cmlnaHQgbm90aWNlIGFib3ZlIGRvZXMgbm90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCWV2aWRlbmNlIGFueSBhY3R1YWwgb3IgaW50ZW5kZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCXB1YmxpY2F0aW9uIG9mIHN1Y2ggc291cmNlIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAkSWQ6IFRQTS54c2QsdiAxLjEgMjAwMy8wOS8xNSAxODoyMDo0MCBlcmljdmFzIEV4cCAkIC0tPgotPHhzOnNjaGVtYQotICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuYmVhLmNvbS8yMDAzLzAzL3dsaS90cG0iCi0gIHhtbG5zPSJodHRwOi8vd3d3LmJlYS5jb20vMjAwMy8wMy93bGkvdHBtIgotICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIgotICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0JPHhzOmltcG9ydAotICAgIG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIKLSAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sZHNpZy1jb3JlL3htbGRzaWctY29yZS1zY2hlbWEueHNkIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0idHJhZGluZy1wYXJ0bmVyLW1hbmFnZW1lbnQiPgotCQk8eHM6YW5ub3RhdGlvbj4KLQkJCTx4czpkb2N1bWVudGF0aW9uPlRoaXMgaXMgdGhlIHJvb3QgZWxlbWVudCBpbiB0aGUgVFBNIHJlcG9zaXRvcnkuPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InRyYWRpbmctcGFydG5lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ic2VydmljZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZS10cmFja2luZy1kZWZhdWx0IiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1FVEFEQVRBIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFMTCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWN1cmUtYXVkaXQtbG9nZ2luZyIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0ZXN0LW1vZGUiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0idHJhZGluZy1wYXJ0bmVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0iYWRkcmVzcyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJleHRlbmRlZC1wcm9wZXJ0eS1zZXQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9ImNsaWVudC1jZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9InNlcnZlci1jZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4czplbGVtZW50IHJlZj0iZW5jcnlwdGlvbi1jZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9InNpZ25hdHVyZS1jZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHM6Y2hvaWNlPgotICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iZWJ4bWwtYmluZGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0icm9zZXR0YW5ldC1iaW5kaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ3ZWItc2VydmljZS1iaW5kaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6Y2hvaWNlPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibm90ZXMiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMT0NBTCIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRU1PVEUiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaXMtZGVmYXVsdCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJidXNpbmVzcy1pZC10eXBlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iYnVzaW5lc3MtaWQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbWFpbCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InBob25lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZmF4IiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idXNlcm5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbmRlZC1wcm9wZXJ0eS1zZXQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibm90ZXMiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InhtbC1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWF0dHJpYnV0ZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY2xpZW50LWNlcnRpZmljYXRlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0iZHM6S2V5SW5mbyIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzOmhleEJpbmFyeSIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJzZXJ2ZXItY2VydGlmaWNhdGUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJkczpLZXlJbmZvIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHM6aGV4QmluYXJ5IiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImVuY3J5cHRpb24tY2VydGlmaWNhdGUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJkczpLZXlJbmZvIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHM6aGV4QmluYXJ5IiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InNpZ25hdHVyZS1jZXJ0aWZpY2F0ZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9ImRzOktleUluZm8iIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4czpoZXhCaW5hcnkiIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZWJ4bWwtYmluZGluZyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InNpZ25hdHVyZS10cmFuc2Zvcm1zIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InRyYW5zcG9ydCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iYnVzaW5lc3MtcHJvdG9jb2wtbmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImJ1c2luZXNzLXByb3RvY29sLXZlcnNpb24iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpcy1kZWZhdWx0IiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImlzLXNpZ25hdHVyZS1yZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpcy1yZWNlaXB0LXNpZ25hdHVyZS1yZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzaWduYXR1cmUtY2VydGlmaWNhdGUtbmFtZSIgdHlwZT0icmVmZXJlbmNlIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRlbGl2ZXJ5LXNlbWFudGljcyIgdXNlPSJvcHRpb25hbCI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCZXN0RWZmb3J0Ii8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJFU1RFRkZPUlQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPbmNlQW5kT25seU9uY2UiLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT05DRUFORE9OTFlPTkNFIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQXRMZWFzdE9uY2UiLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQVRMRUFTVE9OQ0UiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBdE1vc3RPbmNlIi8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFUTU9TVE9OQ0UiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icmV0cmllcyIgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHJ5LWludGVydmFsIiB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icGVyc2lzdC1kdXJhdGlvbiIgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InNpZ25hdHVyZS10cmFuc2Zvcm1zIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ieHBhdGgiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJ4cGF0aCIvPgotCTx4czplbGVtZW50IG5hbWU9InJvc2V0dGFuZXQtYmluZGluZyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9ImZhaWx1cmUtcmVwb3J0LWFkbWluaXN0cmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0iZmFpbHVyZS1ub3RpZmllciIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJ0cmFuc3BvcnQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImJ1c2luZXNzLXByb3RvY29sLW5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJidXNpbmVzcy1wcm90b2NvbC12ZXJzaW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaXMtZGVmYXVsdCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbmNyeXB0aW9uLWNlcnRpZmljYXRlLW5hbWUiIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJjaXBoZXItYWxnb3JpdGhtIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJDNSIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJERVMiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVFJJUExFX0RFUyIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbmNyeXB0aW9uLWxldmVsIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBBWUxPQUQiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRU5USVJFX1BBWUxPQUQiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaXMtc2lnbmF0dXJlLXJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImlzLXJlY2VpcHQtc2lnbmF0dXJlLXJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InNpZ25hdHVyZS1jZXJ0aWZpY2F0ZS1uYW1lIiB0eXBlPSJyZWZlcmVuY2UiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icmV0cmllcyIgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHJ5LWludGVydmFsIiB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icHJvY2Vzcy10aW1lb3V0IiB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZmFpbHVyZS1yZXBvcnQtYWRtaW5pc3RyYXRvciI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idHJhZGluZy1wYXJ0bmVyLW5hbWUiIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJiaW5kaW5nLW5hbWUiIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJmYWlsdXJlLW5vdGlmaWVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0cmFkaW5nLXBhcnRuZXItbmFtZSIgdHlwZT0icmVmZXJlbmNlIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImJpbmRpbmctbmFtZSIgdHlwZT0icmVmZXJlbmNlIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IndlYi1zZXJ2aWNlLWJpbmRpbmciPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJ0cmFuc3BvcnQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InRyYW5zcG9ydCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9ImF1dGhlbnRpY2F0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwcm90b2NvbCIgdXNlPSJyZXF1aXJlZCI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaHR0cCIvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJIVFRQIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imh0dHBzIi8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkhUVFBTIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImptcyIvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJKTVMiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icHJvdG9jb2wtdmVyc2lvbiIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImVuZHBvaW50IiB0eXBlPSJ4czphbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYXV0aGVudGljYXRpb24iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImNsaWVudC1wYXJ0bmVyLW5hbWUiIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGllbnQtYXV0aGVudGljYXRpb24iIHVzZT0ib3B0aW9uYWwiPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQkFTSUMiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU1NMX0NFUlQiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idXNlcm5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHM6aGV4QmluYXJ5IiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImNsaWVudC1jZXJ0aWZpY2F0ZS1uYW1lIiB0eXBlPSJyZWZlcmVuY2UiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ic2VydmVyLWF1dGhlbnRpY2F0aW9uIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNTTF9DRVJUX01VVFVBTCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZXJ2ZXItY2VydGlmaWNhdGUtbmFtZSIgdHlwZT0icmVmZXJlbmNlIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InNlcnZpY2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJzZXJ2aWNlLXByb2ZpbGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InJvc2V0dGFuZXQtc2VydmljZS1kZWZhdWx0cyIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibm90ZXMiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZXJ2aWNlLXR5cGUiIHVzZT0ib3B0aW9uYWwiPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IldFQlNFUlZJQ0UiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPQ0VTUyIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTRVJWSUNFQ09OVFJPTCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJidXNpbmVzcy1wcm90b2NvbCIgdXNlPSJvcHRpb25hbCI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iV0VCU0VSVklDRSIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFQlhNTCIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJST1NFVFRBTkVUIi8+Ci0JCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQkJPC94czpzaW1wbGVUeXBlPgotCQkJPC94czphdHRyaWJ1dGU+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InNlcnZpY2UtcHJvZmlsZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibG9jYWwtdHJhZGluZy1wYXJ0bmVyIiB0eXBlPSJyZWZlcmVuY2UiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibG9jYWwtYmluZGluZyIgdHlwZT0icmVmZXJlbmNlIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsLXRyYWRpbmctcGFydG5lciIgdHlwZT0icmVmZXJlbmNlIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsLWJpbmRpbmciIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdGF0dXMiIHVzZT0ib3B0aW9uYWwiPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVOQUJMRUQiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRElTQUJMRUQiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZS10cmFja2luZyIgdXNlPSJvcHRpb25hbCI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJERUZBVUxUIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1FVEFEQVRBIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFMTCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJyb3NldHRhbmV0LXNlcnZpY2UtZGVmYXVsdHMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InNlcnZpY2UtY29udGVudC1zY2hlbWEiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UtZHRkLXZhbGlkYXRpb24iIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idmFsaWRhdGUtc2VydmljZS1jb250ZW50IiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRlLXNlcnZpY2UtaGVhZGVyIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czpzaW1wbGVUeXBlIG5hbWU9InJlZmVyZW5jZSI+Ci0JCTx4czphbm5vdGF0aW9uPgotCQkJPHhzOmRvY3VtZW50YXRpb24+UmVmZXJlbmNlIHRvIGFub3RoZXIgZWxlbWVudCBpbiB0aGUgVFBNIHJlcG9zaXRvcnkuPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLQk8L3hzOnNpbXBsZVR5cGU+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdC54bWwgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9keW5hbWljL2R5bnRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2YxNDMzLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTxkdDp3cmFwcGVkaW5zdGFuY2UgeG1sbnM6ZHQ9Imh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L2R5bnRlc3QiPgotICA8eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9xdWFudCI+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0icXVhbnRpdHkiIHR5cGU9InhzOmludCIvPgotICA8L3hzOnNjaGVtYT4KLSAgPHF0OnF1YW50aXR5IHhtbG5zOnF0PSJodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9xdWFudCI+Ci0gICAgNDIKLSAgPC9xdDpxdWFudGl0eT4KLTwvZHQ6d3JhcHBlZGluc3RhbmNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9keW5hbWljL2R5bnRlc3QueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2EzMDA3Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL3Rlc3QvZHludGVzdCIKLSAgYmxvY2tEZWZhdWx0PSIjYWxsIgotICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gIHhtbDpsYW5nPSJFTiI+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0id3JhcHBlZGluc3RhbmNlIj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6c2NoZW1hIi8+Ci0gICAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI2FueSIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi08L3hzOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvZHluYW1pYy9keW50ZXN0Mi54bWwgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9keW5hbWljL2R5bnRlc3QyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY2MmU0ZC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9keW5hbWljL2R5bnRlc3QyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGR0OndyYXBwZWR3aWxkY2FyZCB4bWxuczpkdD0iaHR0cDovL29wZW51cmkub3JnL3Rlc3QvZHludGVzdCI+Ci0gIDx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L3F1YW50Ij4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJxdWFudGl0eSIgdHlwZT0ieHM6aW50Ii8+Ci0gIDwveHM6c2NoZW1hPgotPC9kdDp3cmFwcGVkd2lsZGNhcmQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvZHluYW1pYy9keW50ZXN0Mi54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9keW5hbWljL2R5bnRlc3QyLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjNGUzNy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9keW5hbWljL2R5bnRlc3QyLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTx4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9keW50ZXN0IgotICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gIGJsb2NrRGVmYXVsdD0iI2FsbCIKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gIHZlcnNpb249IjEuMCIKLSAgeG1sOmxhbmc9IkVOIj4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ3cmFwcGVkd2lsZGNhcmQiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjYW55IiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLTwveHM6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9pbXMvSU1TX3htbC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9pbXMvSU1TX3htbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYjRkZGMuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvaW1zL0lNU194bWwueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gZmlsZW5hbWU9aW1zX3htbC54c2QgLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCI+Ci0JPCEtLSAyMDAxLTAyLTIyIGVkaXRlZCBieSBUaG9tYXMgV2Fzb24gSU1TIEdsb2JhbCBMZWFybmluZyBDb25zb3J0aXVtLCBJbmMuIC0tPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpkb2N1bWVudGF0aW9uPkluIG5hbWVzcGFjZS1hd2FyZSBYTUwgcHJvY2Vzc29ycywgdGhlICZxdW90O3htbCZxdW90OyBwcmVmaXggaXMgYm91bmQgdG8gdGhlIG5hbWVzcGFjZSBuYW1lIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8eHNkOmRvY3VtZW50YXRpb24+RG8gbm90IHJlZmVyZW5jZSB0aGlzIGZpbGUgaW4gWE1MIGluc3RhbmNlczwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4c2Q6bGFuZ3VhZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVmZXJzIHRvIHVuaXZlcnNhbCAgWE1MIDEuMCBsYW5nIGF0dHJpYnV0ZTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6YXR0cmlidXRlPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJhc2UiIHR5cGU9InhzZDphbnlVUkkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVmZXJzIHRvIFhNTCBCYXNlOiBodHRwOi8vd3d3LnczLm9yZy9UUi94bWxiYXNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDphdHRyaWJ1dGU+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGluayIgdHlwZT0ieHNkOmFueVVSSSIvPgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvaW1zL2ltc21kX3YxcDJwMi54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9pbXMvaW1zbWRfdjFwMnAyLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UyMWY3Yy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9pbXMvaW1zbWRfdjFwMnAyLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3Lmltc2dsb2JhbC5vcmcveHNkL2ltc21kX3YxcDIiIAotICAgICAgICAgICAgeG1sbnM6eD0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiAKLSAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCi0gICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy5pbXNnbG9iYWwub3JnL3hzZC9pbXNtZF92MXAyIiAKLSAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLSAgICAgICAgICAgIHZlcnNpb249IklNUyBNRCAxLjIuMyI+Ci0KLSAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiBzY2hlbWFMb2NhdGlvbj0iaW1zX3htbC54c2QiLz4gCi0gICAKLSAgIDwhLS0gKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gICA8IS0tICoqIENoYW5nZSBIaXN0b3J5ICoqIC0tPgotICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4yMDAxLTA0LTI2IFQuRC5XYXNvbi4gSU1TIG1ldGEtZGF0YSAxLjIgWE1MLVNjaGVtYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4yMDAxLTA2LTA3IFMuRS5UaHJvcHAuIENoYW5nZWQgdGhlIG11bHRpcGxpY2l0eSBvbiBhbGwgZWxlbWVudHMgdG8gbWF0Y2ggdGhlICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5GaW5hbCAxLjIgQmluZGluZyBTcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DaGFuZ2VkIGFsbCBlbGVtZW50cyB0aGF0IHVzZSB0aGUgbGFuZ3N0cmluZ1R5cGUgdG8gYSBtdWx0aXBsaWN5IG9mIDEgb3IgbW9yZSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DaGFuZ2VkIGNlbnRpdHkgaW4gdGhlIGNvbnRyaWJ1dGUgZWxlbWVudCB0byBoYXZlIGEgbXVsdGlwbGljaXR5IG9mIDAgb3IgbW9yZS4gICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DaGFuZ2VkIHRoZSByZXF1aXJlbWVudCBlbGVtZW50IHRvIGhhdmUgYSBtdWx0aXBsaWNpdHkgb2YgMCBvciBtb3JlLiAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4gMjAwMS0wNy0yNSBTY2hhd24gVGhyb3BwLiAgVXBkYXRlcyB0byBicmluZyB0aGUgWFNEIHVwIHRvIHNwZWVkIHdpdGggdGhlIFczQyAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4gWE1MIFNjaGVtYSBSZWNvbW1lbmRhdGlvbi4gIFRoZSBmb2xsb3dpbmcgY2hhbmdlcyB3ZXJlIG1hZGU6IENoYW5nZSB0aGUgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4gbmFtZXNwYWNlIHRvIHJlZmVyZW5jZSB0aGUgNS8yLzIwMDEgVzNDIFhNTCBTY2hlbWEgUmVjb21tZW5kYXRpb24sdGhlIGJhc2UgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4gdHlwZSBmb3IgdGhlIGR1cnRpbWVUeXBlLCBzaW1wbGVUeXBlLCB3YXMgY2hhbmdlZCBmcm9tIHRpbWVEdXJhdGlvbiB0byBkdXJhdGlvbi4gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4gCi0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+IEFueSBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zIHRoYXQgaGF2ZSB1c2U9ImRlZmF1bHQiIGhhZCB0byBjaGFuZ2UgdG8gdXNlPSJvcHRpb25hbCIgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+IC0gYXR0ci50eXBlLiAgQW55IGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMgdGhhdCBoYXZlIHZhbHVlID0ic29tZXZhbHVlIiBoYWQgdG8gY2hhbmdlIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+IHRvIGRlZmF1bHQgPSAic29tZXZhbHVlIiAtIGF0dHIudHlwZSAoVVJJKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+IDIwMDEtMDktMDQgU2NoYXduIFRocm9wcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+IENoYW5nZWQgdGhlIHRhcmdldE5hbWVzcGFjZSBhbmQgbmFtZXNwYWNlIG9mIHNjaGVtYSB0byByZWZsZWN0IHZlcnNpb24gY2hhbmdlICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+IDIwMDEtMTEtMDQgQ2hyaXMgTW9mZmF0dDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAxLiBDaGFuZ2VzIHRvIGVuYWJsZSB0aGUgc2NoZW1hIHRvIHdvcmsgd2l0aCBjb21tZXJjaWFsIFhNTCBUb29scyAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAgICBhLiBSZWZlciB0byB0aGUgeG1sIG5hbWVzcGFjZSB1c2luZyB0aGUgIngiIGFiYnJldmlhdGlvbiBpbnN0ZWFkIG9mICJ4bWwiICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAgICBiLiBSZW1vdmUgdW5lY2Vzc2FyeSBub24tZGV0ZXJtaW5pc3RpYyBjb25zdHJ1Y3RzIGZyb20gc2NoZW1hLiAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAgICAgICBpLmUuIGNoYW5nZSBvY2N1cnJlbmNlcyBvZiAiI2FueSIgdG8gIiNvdGhlciIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAyLiBSZXZlcnQgdG8gb3JpZ2luYWwgSU1TIE1EIHZlcnNpb24gMS4yIG5hbWVzcGFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAgICBpLmUuICJodHRwOi8vd3d3Lmltc2dsb2JhbC5vcmcveHNkL2ltc21kX3YxcDIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAgICBUaGlzIGNoYW5nZSBkb25lIHRvIHN1cHBvcnQgdGhlIGRlY2lzaW9uIHRvIG9ubHkgY2hhbmdlIHRoZSBYTUwgbmFtZXNwYWNlIHdpdGggIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAgICBtYWpvciByZXZpc2lvbnMgb2YgdGhlIHNwZWNpZmljYXRpb24gaWUuIHdoZXJlIHRoZSBpbmZvcm1hdGlvbiBtb2RlbCBvciBiaW5kaW5nIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAgICBjaGFuZ2VzIChhcyBvcHBvc2VkIHRvIGFkZHJlc3NpbmcgYnVncyBvciBvbWlzc2lvbnMpLiBBIHN0YWJsZSBuYW1lc3BhY2UgaXMgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAgICBuZWNlc3NhcnkgdG8gdGhlIGluY3JlYXNpbmcgbnVtYmVyIG9mIGltcGxlbWVudG9ycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAzLiBDaGFuZ2VkIG5hbWUgb2Ygc2NoZW1hIGZpbGUgdG8gImltc21kX3YxcDJwMi54c2QiIGFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+ICAgICB2ZXJzaW9uIGF0dHJpYnV0ZSB0byAiSU1TIE1EIDEuMi4zIiB0byByZWZsZWN0IG1pbm9yIHZlcnNpb24gY2hhbmdlICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgIDwhLS0gKiogQXR0cmlidXRlIERlY2xhcmF0aW9uICoqIC0tPgotICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgIDx4c2Q6YXR0cmlidXRlR3JvdXAgbmFtZT0iYXR0ci50eXBlIj4KLSAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IlVSSSI+Ci0gICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVJJIi8+Ci0gICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJURVhUIi8+Ci0gICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICA8L3hzZDphdHRyaWJ1dGVHcm91cD4KLQotICAgPHhzZDpncm91cCBuYW1lPSJncnAuYW55Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbnkgbmFtZXNwYWNlZCBlbGVtZW50IGZyb20gYW55IG5hbWVzcGFjZSBtYXkgYmUgdXNlZCBmb3IgYW4gJnF1b3Q7YW55JnF1b3Q7IGVsZW1lbnQuICBUaGUgbmFtZXNwYWNlIGZvciB0aGUgaW1wb3J0ZWQgZWxlbWVudCBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIGluc3RhbmNlLCBhbmQgdGhlIHNjaGVtYSBtdXN0IGJlIGltcG9ydGVkLiAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9InN0cmljdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpncm91cD4KLQotICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAgPCEtLSAqKiBFbGVtZW50IERlY2xhcmF0aW9uICoqIC0tPgotICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICA8eHNkOmVsZW1lbnQgbmFtZT0iYWdncmVnYXRpb25sZXZlbCIgdHlwZT0iYWdncmVnYXRpb25sZXZlbFR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJhbm5vdGF0aW9uVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2dlbnRyeSIgdHlwZT0iY2F0YWxvZ2VudHJ5VHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9ImNhdGFsb2dUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0iY2VudGl0eSIgdHlwZT0iY2VudGl0eVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzc2lmaWNhdGlvbiIgdHlwZT0iY2xhc3NpZmljYXRpb25UeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGV4dCIgdHlwZT0iY29udGV4dFR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250cmlidXRlIiB0eXBlPSJjb250cmlidXRlVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHlyaWdodGFuZG90aGVycmVzdHJpY3Rpb25zIiB0eXBlPSJjb3B5cmlnaHRhbmRvdGhlcnJlc3RyaWN0aW9uc1R5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3N0IiB0eXBlPSJjb3N0VHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdmVyYWdlIiB0eXBlPSJjb3ZlcmFnZVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRlIiB0eXBlPSJkYXRlVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGV0aW1lIiB0eXBlPSJkYXRldGltZVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0iZGVzY3JpcHRpb25UeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlmZmljdWx0eSIgdHlwZT0iZGlmZmljdWx0eVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlZHVjYXRpb25hbCIgdHlwZT0iZWR1Y2F0aW9uYWxUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50cnkiIHR5cGU9ImVudHJ5VHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcm1hdCIgdHlwZT0iZm9ybWF0VHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYWwiIHR5cGU9ImdlbmVyYWxUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0iaWRlbnRpZmllciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImludGVuZGVkZW5kdXNlcnJvbGUiIHR5cGU9ImludGVuZGVkZW5kdXNlcnJvbGVUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0iaW50ZXJhY3Rpdml0eWxldmVsIiB0eXBlPSJpbnRlcmFjdGl2aXR5bGV2ZWxUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0iaW50ZXJhY3Rpdml0eXR5cGUiIHR5cGU9ImludGVyYWN0aXZpdHl0eXBlVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImtleXdvcmQiIHR5cGU9ImtleXdvcmRUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0ia2luZCIgdHlwZT0ia2luZFR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsYW5nc3RyaW5nIiB0eXBlPSJsYW5nc3RyaW5nVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9Imxhbmd1YWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0ibGVhcm5pbmdyZXNvdXJjZXR5cGUiIHR5cGU9ImxlYXJuaW5ncmVzb3VyY2V0eXBlVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImxpZmVjeWNsZSIgdHlwZT0ibGlmZWN5Y2xlVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJsb2NhdGlvblR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb20iIHR5cGU9ImxvbVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXhpbXVtdmVyc2lvbiIgdHlwZT0ibWluaW11bXZlcnNpb25UeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0YWRhdGFzY2hlbWUiIHR5cGU9Im1ldGFkYXRhc2NoZW1lVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGFtZXRhZGF0YSIgdHlwZT0ibWV0YW1ldGFkYXRhVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbmltdW12ZXJzaW9uIiB0eXBlPSJtYXhpbXVtdmVyc2lvblR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJuYW1lVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9InB1cnBvc2UiIHR5cGU9InB1cnBvc2VUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0icmVsYXRpb24iIHR5cGU9InJlbGF0aW9uVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9InJlcXVpcmVtZW50IiB0eXBlPSJyZXF1aXJlbWVudFR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZSIgdHlwZT0icmVzb3VyY2VUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0icmlnaHRzIiB0eXBlPSJyaWdodHNUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZSIgdHlwZT0icm9sZVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZW1hbnRpY2RlbnNpdHkiIHR5cGU9InNlbWFudGljZGVuc2l0eVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzaXplIiB0eXBlPSJzaXplVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZSIgdHlwZT0ic291cmNlVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9InN0YXR1cyIgdHlwZT0ic3RhdHVzVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ic3RydWN0dXJlVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9InRheG9uIiB0eXBlPSJ0YXhvblR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXhvbnBhdGgiIHR5cGU9InRheG9ucGF0aFR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZWNobmljYWwiIHR5cGU9InRlY2huaWNhbFR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0aXRsZSIgdHlwZT0idGl0bGVUeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZSIgdHlwZT0idHlwZVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBpY2FsYWdlcmFuZ2UiIHR5cGU9InR5cGljYWxhZ2VyYW5nZVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBpY2FsbGVhcm5pbmd0aW1lIiB0eXBlPSJ0eXBpY2FsbGVhcm5pbmd0aW1lVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ2YWx1ZVR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzb24iIHR5cGU9InBlcnNvblR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2Y2FyZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24iIHR5cGU9InZlcnNpb25UeXBlIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFsbGF0aW9ucmVtYXJrcyIgdHlwZT0iaW5zdGFsbGF0aW9ucmVtYXJrc1R5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvdGhlcnBsYXRmb3JtcmVxdWlyZW1lbnRzIiB0eXBlPSJvdGhlcnBsYXRmb3JtcmVxdWlyZW1lbnRzVHlwZSIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJkdXJhdGlvblR5cGUiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0iaWRUeXBlIi8+Ci0KLSAgIDwhLS0gKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgIDwhLS0gKiogQ29tcGxleCBUeXBlcyAqKiAtLT4KLSAgIDwhLS0gKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhZ2dyZWdhdGlvbmxldmVsVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic291cmNlIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ2YWx1ZSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhbm5vdGF0aW9uVHlwZSIgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InBlcnNvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJncnAuYW55Ii8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhdGFsb2dlbnRyeVR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJjYXRhbG9nIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJlbnRyeSIvPgotICAgICAgICAgPHhzZDpncm91cCByZWY9ImdycC5hbnkiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2VudGl0eVR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InZjYXJkIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzaWZpY2F0aW9uVHlwZSIgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InB1cnBvc2UiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idGF4b25wYXRoIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJrZXl3b3JkIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmdyb3VwIHJlZj0iZ3JwLmFueSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250ZXh0VHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic291cmNlIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ2YWx1ZSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250cmlidXRlVHlwZSIgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InJvbGUiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImNlbnRpdHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDpncm91cCByZWY9ImdycC5hbnkiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29weXJpZ2h0YW5kb3RoZXJyZXN0cmljdGlvbnNUeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJzb3VyY2UiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InZhbHVlIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvc3RUeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJzb3VyY2UiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InZhbHVlIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvdmVyYWdlVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ibGFuZ3N0cmluZyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRlVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iZGF0ZXRpbWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iZGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZXNjcmlwdGlvblR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImxhbmdzdHJpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlmZmljdWx0eVR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InNvdXJjZSIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idmFsdWUiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZHVyYXRpb25UeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJkYXRldGltZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVkdWNhdGlvbmFsVHlwZSIgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImludGVyYWN0aXZpdHl0eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImxlYXJuaW5ncmVzb3VyY2V0eXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJpbnRlcmFjdGl2aXR5bGV2ZWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic2VtYW50aWNkZW5zaXR5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImludGVuZGVkZW5kdXNlcnJvbGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImNvbnRleHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InR5cGljYWxhZ2VyYW5nZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iZGlmZmljdWx0eSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ0eXBpY2FsbGVhcm5pbmd0aW1lIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Imxhbmd1YWdlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmdyb3VwIHJlZj0iZ3JwLmFueSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRyeVR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImxhbmdzdHJpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhbFR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJpZGVudGlmaWVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InRpdGxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImNhdGFsb2dlbnRyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ibGFuZ3VhZ2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJrZXl3b3JkIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJjb3ZlcmFnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic3RydWN0dXJlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImFnZ3JlZ2F0aW9ubGV2ZWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDpncm91cCByZWY9ImdycC5hbnkiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zdGFsbGF0aW9ucmVtYXJrc1R5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImxhbmdzdHJpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZW5kZWRlbmR1c2Vycm9sZVR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InNvdXJjZSIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idmFsdWUiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJhY3Rpdml0eWxldmVsVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic291cmNlIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ2YWx1ZSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnRlcmFjdGl2aXR5dHlwZVR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InNvdXJjZSIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idmFsdWUiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ia2V5d29yZFR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImxhbmdzdHJpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ia2luZFR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InNvdXJjZSIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idmFsdWUiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibGFuZ3N0cmluZ1R5cGUiPgotICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSByZWY9Ing6bGFuZyIvPgotICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxlYXJuaW5ncmVzb3VyY2V0eXBlVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic291cmNlIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ2YWx1ZSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaWZlY3ljbGVUeXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idmVyc2lvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJzdGF0dXMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iY29udHJpYnV0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPHhzZDpncm91cCByZWY9ImdycC5hbnkiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYXRpb25UeXBlIj4KLSAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGVHcm91cCByZWY9ImF0dHIudHlwZSIvPgotICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvbVR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImdlbmVyYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ibGlmZWN5Y2xlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Im1ldGFtZXRhZGF0YSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ0ZWNobmljYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iZWR1Y2F0aW9uYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0icmlnaHRzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InJlbGF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJhbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJjbGFzc2lmaWNhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRhbWV0YWRhdGFUeXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iaWRlbnRpZmllciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJjYXRhbG9nZW50cnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImNvbnRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Im1ldGFkYXRhc2NoZW1lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJsYW5ndWFnZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmdyb3VwIHJlZj0iZ3JwLmFueSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic291cmNlIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ2YWx1ZSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvdGhlcnBsYXRmb3JtcmVxdWlyZW1lbnRzVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ibGFuZ3N0cmluZyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzb25UeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ2Y2FyZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwdXJwb3NlVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic291cmNlIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ2YWx1ZSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvblR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJraW5kIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InJlc291cmNlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJncnAuYW55Ii8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlcXVpcmVtZW50VHlwZSIgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ibmFtZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJtaW5pbXVtdmVyc2lvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJtYXhpbXVtdmVyc2lvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICA8eHNkOmdyb3VwIHJlZj0iZ3JwLmFueSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXNvdXJjZVR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJpZGVudGlmaWVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImNhdGFsb2dlbnRyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPHhzZDpncm91cCByZWY9ImdycC5hbnkiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmlnaHRzVHlwZSIgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImNvc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iY29weXJpZ2h0YW5kb3RoZXJyZXN0cmljdGlvbnMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iZGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDpncm91cCByZWY9ImdycC5hbnkiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm9sZVR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InNvdXJjZSIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idmFsdWUiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VtYW50aWNkZW5zaXR5VHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic291cmNlIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ2YWx1ZSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzb3VyY2VUeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJsYW5nc3RyaW5nIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0YXR1c1R5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InNvdXJjZSIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idmFsdWUiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RyaW5nVHlwZSI+Ci0gICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIHJlZj0ieDpsYW5nIi8+Ci0gICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RydWN0dXJlVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic291cmNlIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ2YWx1ZSIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgIAotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YXhvbnBhdGhUeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJzb3VyY2UiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idGF4b24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRheG9uVHlwZSI+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iaWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iZW50cnkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0idGF4b24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRlY2huaWNhbFR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJmb3JtYXQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InNpemUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ibG9jYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InJlcXVpcmVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJpbnN0YWxsYXRpb25yZW1hcmtzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Im90aGVycGxhdGZvcm1yZXF1aXJlbWVudHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iZHVyYXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgPHhzZDpncm91cCByZWY9ImdycC5hbnkiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGl0bGVUeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJsYW5nc3RyaW5nIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGVUeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJzb3VyY2UiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InZhbHVlIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGljYWxhZ2VyYW5nZVR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImxhbmdzdHJpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwaWNhbGxlYXJuaW5ndGltZVR5cGUiPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImRhdGV0aW1lIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAKLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWVUeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJsYW5nc3RyaW5nIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb25UeXBlIj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJsYW5nc3RyaW5nIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgCi0gICA8IS0tICoqKioqKioqKioqKioqKioqKiAtLT4KLSAgIDwhLS0gKiogU2ltcGxlIFR5cGVzICoqIC0tPgotICAgPCEtLSAqKioqKioqKioqKioqKioqKiogLS0+Ci0gICAKLSAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmb3JtYXRUeXBlIj4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgIAotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InNpemVUeXBlIj4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmludCIvPgotICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgIAotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRhdGV0aW1lVHlwZSI+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAKLSAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpZFR5cGUiPgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gICA8L3hzZDpzaW1wbGVUeXBlPgotICAgCi0gICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibWV0YWRhdGFzY2hlbWVUeXBlIj4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgIAotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhdGFsb2dUeXBlIj4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgIAotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im1pbmltdW12ZXJzaW9uVHlwZSI+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAKLSAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtYXhpbXVtdmVyc2lvblR5cGUiPgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gICA8L3hzZDpzaW1wbGVUeXBlPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL1hNTC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL1hNTC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOGFkZDkuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvajJlZS9YTUwueHNkCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IURPQ1RZUEUgeHM6c2NoZW1hIFBVQkxJQyAiLS8vVzNDLy9EVEQgWE1MU0NIRU1BIDIwMDEwMi8vRU4iICJYTUxTY2hlbWEuZHRkIiA+Ci08eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbDpsYW5nPSJlbiI+Ci0KLSA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBTZWUgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwgYW5kCi0gICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5hbWVzcGFjZS4KLSAgPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj5UaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cAotICAgICAgICBzdWl0YWJsZSBmb3IgdXNlIGJ5Ci0gICAgICAgIHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyB4bWw6YmFzZSwgeG1sOmxhbmcgb3IgeG1sOnNwYWNlIGF0dHJpYnV0ZXMKLSAgICAgICAgb24gZWxlbWVudHMgdGhleSBkZWZpbmUuCi0KLSAgICAgICAgVG8gZW5hYmxlIHRoaXMsIHN1Y2ggYSBzY2hlbWEgbXVzdCBpbXBvcnQgdGhpcyBzY2hlbWEKLSAgICAgICAgZm9yIHRoZSBYTUwgbmFtZXNwYWNlLCBlLmcuIGFzIGZvbGxvd3M6Ci0gICAgICAgICZsdDtzY2hlbWEgLiAuIC4+Ci0gICAgICAgICAuIC4gLgotICAgICAgICAgJmx0O2ltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDMveG1sLnhzZCIvPgotCi0gICAgICAgIFN1YnNlcXVlbnRseSwgcXVhbGlmaWVkIHJlZmVyZW5jZSB0byBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMKLSAgICAgICAgb3IgdGhlIGdyb3VwIGRlZmluZWQgYmVsb3cgd2lsbCBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdCwgZS5nLgotCi0gICAgICAgICZsdDt0eXBlIC4gLiAuPgotICAgICAgICAgLiAuIC4KLSAgICAgICAgICZsdDthdHRyaWJ1dGVHcm91cCByZWY9InhtbDpzcGVjaWFsQXR0cnMiLz4KLSAKLSAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZQotICAgICAgICAgZWxlbWVudCB3aXRoIGFueSBvZiB0aG9zZSBhdHRyaWJ1dGVzPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj5JbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCi0gICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAotICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkLgotICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKLSAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4KLSAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCi0gICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwgU2NoZW1hCi0gICBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywgaWYgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlIGNoYW5nZXMsIHRoZSB2ZXJzaW9uCi0gICBvZiB0aGlzIGRvY3VtZW50IGF0Ci0gICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UKLSAgIGFjY29yZGluZ2x5OyB0aGUgdmVyc2lvbiBhdAotICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkIHdpbGwgbm90IGNoYW5nZS4KLSAgPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZyIgdHlwZT0ieHM6bGFuZ3VhZ2UiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPkluIGR1ZSBjb3Vyc2UsIHdlIHNob3VsZCBpbnN0YWxsIHRoZSByZWxldmFudCBJU08gMi0gYW5kIDMtbGV0dGVyCi0gICAgICAgICBjb2RlcyBhcyB0aGUgZW51bWVyYXRlZCBwb3NzaWJsZSB2YWx1ZXMgLiAuIC48L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmF0dHJpYnV0ZT4KLQotIDx4czphdHRyaWJ1dGUgbmFtZT0ic3BhY2UiIGRlZmF1bHQ9InByZXNlcnZlIj4KLSAgPHhzOnNpbXBsZVR5cGU+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIj4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlZmF1bHQiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByZXNlcnZlIi8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0gPC94czphdHRyaWJ1dGU+Ci0KLSA8eHM6YXR0cmlidXRlIG5hbWU9ImJhc2UiIHR5cGU9InhzOmFueVVSSSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+U2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbGJhc2UvIGZvcgotICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhdHRyaWJ1dGUuPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czphdHRyaWJ1dGU+Ci0KLSA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0ic3BlY2lhbEF0dHJzIj4KLSAgPHhzOmF0dHJpYnV0ZSByZWY9InhtbDpiYXNlIi8+Ci0gIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOnNwYWNlIi8+Ci0gPC94czphdHRyaWJ1dGVHcm91cD4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvajJlZS9hcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNGY4NC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMS40Ij4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLUAoIylhcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZHMJMS43IDA3LzA4LzAyCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1Db3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLVJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLXJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1yZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLVUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci1tYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLWNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgYXBwbGljYXRpb24gY2xpZW50IDEuNAotZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgQWxsIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50Ci1kZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQKLXNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2U6Ci0KLWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgIDxhcHBsaWNhdGlvbi1jbGllbnQgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2QiCi0gICAgIHZlcnNpb249IjEuNCI+Ci0KLSAgICAuLi4KLSAgICA8L2FwcGxpY2F0aW9uLWNsaWVudD4KLQotVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi10aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi1uYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi1odHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLWRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICBzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICBzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLTx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbi1jbGllbnQiIHR5cGU9ImoyZWU6YXBwbGljYXRpb24tY2xpZW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBhcHBsaWNhdGlvbi1jbGllbnQgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuCi0gICAgYXBwbGljYXRpb24gY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBhcHBsaWNhdGlvbgotICAgIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBFSkIgY29tcG9uZW50cwotICAgIGFuZCBleHRlcm5hbCByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGUgYXBwbGljYXRpb24KLSAgICBjbGllbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4KLSAgICBhcHBsaWNhdGlvbiBjbGllbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QKLSAgICBiZSB1bmlxdWUgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnYtZW50cnkiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotICAgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIGFwcGxpY2F0aW9uCi0gICAgY2xpZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotICAgIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuVGhlIG5hbWUKLSAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZgotICAgIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0gICAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQKLSAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLSAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZQotICAgIG5hbWUgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0gICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUKLSAgICBhcHBsaWNhdGlvbiBjbGllbnQgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUKLSAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZQotICAgIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi08L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwbGljYXRpb24tY2xpZW50VHlwZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVudi1lbnRyeVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVzb3VyY2UtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlLWVudi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWxsYmFjay1oYW5kbGVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNhbGxiYWNrLWhhbmRsZXIgZWxlbWVudCBuYW1lcyBhIGNsYXNzIHByb3ZpZGVkIGJ5Ci0gICAgICAgIHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBubyBhcmdzCi0gICAgICAgIGNvbnN0cnVjdG9yIGFuZCBtdXN0IGltcGxlbWVudCB0aGUKLSAgICAgICAgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXIKLSAgICAgICAgaW50ZXJmYWNlLiAgVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIGJ5IHRoZQotICAgICAgICBhcHBsaWNhdGlvbiBjbGllbnQgY29udGFpbmVyIGFuZCB1c2VkIGJ5IHRoZSBjb250YWluZXIKLSAgICAgICAgdG8gY29sbGVjdCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSB1c2VyLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRld2V5LXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIGZpeGVkPSIxLjQiCi0gICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgMS40LgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPC94c2Q6YXR0cmlidXRlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MzExM2IuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMS40Ij4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLUAoIylhcHBsaWNhdGlvbl8xXzQueHNkcwkxLjYgMDgvMDkvMDIKLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLUNvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotcmVzZXJ2ZWQuCi0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLXJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi1wYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi1saXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi1hZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1UaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi1kaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi1kaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLW1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi13cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLVRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi1KYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi1DdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi1NaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi1TdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBhcHBsaWNhdGlvbiAxLjQgZGVwbG95bWVudAotZGVzY3JpcHRvci4gIEFsbCBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QKLWluZGljYXRlIHRoYXQgdGhlIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2UKLQotaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCi1hbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci11c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0gICAgPGFwcGxpY2F0aW9uIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLSAgICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIgotICAgICB2ZXJzaW9uPSIxLjQiPgotCi0gICAgLi4uCi0gICAgPC9hcHBsaWNhdGlvbj4KLQotVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi10aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi1uYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi1odHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQotZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0gIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLTx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbiIgdHlwZT0iajJlZTphcHBsaWNhdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgYXBwbGljYXRpb24gZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgSjJFRQotICAgIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImNvbnRleHQtcm9vdC11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIGNvbnRleHQtcm9vdCBlbGVtZW50IGNvbnRlbnQgbXVzdCBiZSB1bmlxdWUKLSAgICBpbiB0aGUgZWFyLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1vZHVsZS9qMmVlOndlYiIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmNvbnRleHQtcm9vdCIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InNlY3VyaXR5LXJvbGUtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBzZWN1cml0eS1yb2xlLW5hbWUgZWxlbWVudCBjb250ZW50Ci0gICAgbXVzdCBiZSB1bmlxdWUgaW4gdGhlIGVhci4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpzZWN1cml0eS1yb2xlIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cm9sZS1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi08L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwbGljYXRpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGFwcGxpY2F0aW9uVHlwZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlCi1hcHBsaWNhdGlvbi4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTppY29uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1vZHVsZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bW9kdWxlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGhhdmUgb25lCi0gICAgICAgIG1vZHVsZSBlbGVtZW50IGZvciBlYWNoIEoyRUUgbW9kdWxlIGluIHRoZQotICAgICAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLiBBIG1vZHVsZSBlbGVtZW50IGlzIGRlZmluZWQKLSAgICAgICAgYnkgbW9kdWxlVHlwZSBkZWZpbml0aW9uLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgZml4ZWQ9IjEuNCIKLSAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyAxLjQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1vZHVsZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbW9kdWxlVHlwZSBkZWZpbmVzIGEgc2luZ2xlIEoyRUUgbW9kdWxlIGFuZCBjb250YWlucyBhCi1jb25uZWN0b3IsIGVqYiwgamF2YSwgb3Igd2ViIGVsZW1lbnQsIHdoaWNoIGluZGljYXRlcyB0aGUKLW1vZHVsZSB0eXBlIGFuZCBjb250YWlucyBhIHBhdGggdG8gdGhlIG1vZHVsZSBmaWxlLCBhbmQgYW4KLW9wdGlvbmFsIGFsdC1kZCBlbGVtZW50LCB3aGljaCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvCi10aGUgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdG9yIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgY29ubmVjdG9yIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYQotICAgICAgICAgICAgcmVzb3VyY2UgYWRhcHRlciBhcmNoaXZlIGZpbGUsIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgICAgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZWpiIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYW4gZWpiLWphciwKLSAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICBwYWNrYWdlLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF2YSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGphdmEgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIGphdmEKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUsIHJlbGF0aXZlIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6d2ViVHlwZSIvPgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbHQtZGQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFsdC1kZCBlbGVtZW50IHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlCi0gICAgICAgIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgICAgIGZpbGUgZm9yIGEgcGFydGljdWxhciBKMkVFIG1vZHVsZS4gIFRoZSBVUkkgbXVzdAotICAgICAgICBzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBkZXBsb3ltZW50Ci0gICAgICAgIGRlc2NyaXB0b3IgZmlsZSByZWxhdGl2ZSB0byB0aGUgYXBwbGljYXRpb24ncyByb290Ci0gICAgICAgIGRpcmVjdG9yeS4gSWYgYWx0LWRkIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBkZXBsb3llcgotICAgICAgICBtdXN0IHJlYWQgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmcm9tIHRoZSBkZWZhdWx0Ci0gICAgICAgIGxvY2F0aW9uIGFuZCBmaWxlIG5hbWUgcmVxdWlyZWQgYnkgdGhlIHJlc3BlY3RpdmUKLSAgICAgICAgY29tcG9uZW50IHNwZWNpZmljYXRpb24uCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYlR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgd2ViVHlwZSBkZWZpbmVzIHRoZSB3ZWItdXJpIGFuZCBjb250ZXh0LXJvb3Qgb2YKLWEgd2ViIGFwcGxpY2F0aW9uIG1vZHVsZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYi11cmkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHdlYi11cmkgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIHdlYgotICAgICAgICBhcHBsaWNhdGlvbiBmaWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZQotICAgICAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250ZXh0LXJvb3QiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNvbnRleHQtcm9vdCBlbGVtZW50IHNwZWNpZmllcyB0aGUgY29udGV4dCByb290Ci0gICAgICAgIG9mIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2oyZWUvY29ubmVjdG9yXzFfNS54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL2Nvbm5lY3Rvcl8xXzUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmU1NWJkLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2oyZWUvY29ubmVjdG9yXzFfNS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMS41Ij4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLUAoIyljb25uZWN0b3JfMV81LnhzZHMJMS4xNiAwNy8wNi8wMgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCi1Sb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCi1yZXNlcnZlZC4KLQotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLXBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLWxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLWFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi1VLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLVRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLWRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLXdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi1jb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLUphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLUN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLU1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLVN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIENvbm5lY3RvciAxLjUgZGVwbG95bWVudAotZGVzY3JpcHRvci4gIEFsbCBDb25uZWN0b3IgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0Ci1pbmRpY2F0ZSB0aGUgY29ubmVjdG9yIHJlc291cmNlIGFkYXB0ZXIgc2NoZW1hIGJ5IHVzaW5nIHRoZQotSjJFRSBuYW1lc3BhY2U6Ci0KLWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgIDxjb25uZWN0b3IgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotICAgICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9jb25uZWN0b3JfMV81LnhzZCIKLSAgICAgdmVyc2lvbj0iMS41Ij4KLSAgICAuLi4KLSAgICA8L2Nvbm5lY3Rvcj4KLQotVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi10aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi1uYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi1odHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2Nvbm5lY3Rvcl8xXzUueHNkCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLWRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICBzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICBzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLTx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0b3IiIHR5cGU9ImoyZWU6Y29ubmVjdG9yVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBjb25uZWN0b3IgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBlbGVtZW50IGluY2x1ZGVzCi1nZW5lcmFsIGluZm9ybWF0aW9uIC0gdmVuZG9yIG5hbWUsIHJlc291cmNlIGFkYXB0ZXIgdmVyc2lvbiwKLWljb24gLSBhYm91dCB0aGUgcmVzb3VyY2UgYWRhcHRlciBtb2R1bGUuIEl0IGFsc28gaW5jbHVkZXMKLWluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UKLWFkYXB0ZXIgbGlicmFyeSBhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgZWxlbWVudAotcmVzb3VyY2VhZGFwdGVyLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPC94c2Q6ZWxlbWVudD4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWN0aXZhdGlvbnNwZWNUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGFjdGl2YXRpb25zcGVjVHlwZSBzcGVjaWZpZXMgYW4gYWN0aXZhdGlvbgotc3BlY2lmaWNhdGlvbi4gIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseSBxdWFsaWZpZWQKLUphdmEgY2xhc3MgbmFtZSBvZiBhbiBhY3RpdmF0aW9uIHNwZWNpZmljYXRpb24gYW5kIGEgc2V0IG9mCi1yZXF1aXJlZCBjb25maWd1cmF0aW9uIHByb3BlcnR5IG5hbWVzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uc3BlYy1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IGFjdGl2YXRpb25zcGVjLWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkKLSAgICAgICAgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgYWN0aXZhdGlvbgotICAgICAgICBzcGVjaWZpY2F0aW9uIGNsYXNzLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZQotICAgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuQWN0aXZhdGlvblNwZWMgaW50ZXJmYWNlLiBUaGUKLSAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcyBpcyByZXF1aXJlZCB0byBiZSBhCi0gICAgICAgIEphdmFCZWFuLgotCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbnNwZWMtY2xhc3M+Y29tLndvbWJhdC5BY3RpdmF0aW9uU3BlY0ltcGwKLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbnNwZWMtY2xhc3M+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVxdWlyZWQtY29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWRtaW5vYmplY3RUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGFkbWlub2JqZWN0VHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYW4KLWFkbWluaXN0ZXJlZCBvYmplY3QuICBBZG1pbmlzdGVyZWQgb2JqZWN0cyBhcmUgc3BlY2lmaWMgdG8gYQotbWVzc2FnaW5nIHN0eWxlIG9yIG1lc3NhZ2UgcHJvdmlkZXIuICBUaGlzIGNvbnRhaW5zCi1pbmZvcm1hdGlvbiBvbiB0aGUgSmF2YSB0eXBlIG9mIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkKLWFuIGFkbWluaXN0ZXJlZCBvYmplY3QsIGl0cyBKYXZhIGNsYXNzIG5hbWUgYW5kIGl0cwotY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZG1pbm9iamVjdC1pbnRlcmZhY2UiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWxlbWVudCBhZG1pbm9iamVjdC1pbnRlcmZhY2Ugc3BlY2lmaWVzIHRoZQotICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSB0eXBlIG9mIHRoZQotICAgICAgICBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYW4gYWRtaW5pc3RlcmVkIG9iamVjdC4KLQotICAgICAgICAgRXhhbXBsZToKLSAgICAgICAgIDxhZG1pbm9iamVjdC1pbnRlcmZhY2U+amF2YXguam1zLkRlc3RpbmF0aW9uCi0gICAgICAgICA8L2FkbWlub2JqZWN0LWludGVyZmFjZT4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZG1pbm9iamVjdC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IGFkbWlub2JqZWN0LWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkKLSAgICAgICAgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0LgotCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICA8YWRtaW5vYmplY3QtY2xhc3M+Y29tLndvbWJhdC5EZXN0aW5hdGlvbkltcGwKLSAgICAgICAgICAgIDwvYWRtaW5vYmplY3QtY2xhc3M+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpjb25maWctcHJvcGVydHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdXRoZW50aWNhdGlvbi1tZWNoYW5pc21UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbVR5cGUgc3BlY2lmaWVzIGFuIGF1dGhlbnRpY2F0aW9uCi1tZWNoYW5pc20gc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLiBOb3RlIHRoYXQgdGhpcwotc3VwcG9ydCBpcyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgYW5kIG5vdCBmb3IgdGhlCi11bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIHNwZWNpZmllcwotYW55IHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgcmVxdWlyZW1lbnQgZm9yIHRoZSBzdXBwb3J0IG9mCi1zZWN1cml0eSBjb250cmFjdCBhbmQgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotCi1Ob3RlIHRoYXQgQmFzaWNQYXNzd29yZCBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwgaW50ZXJmYWNlLgotVGhlIEtlcmJ2NSBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLW9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbCBpbnRlcmZhY2Ugb3IgdGhlIGRlcHJlY2F0ZWQKLWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbCBpbnRlcmZhY2UuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUgc3BlY2lmaWVzCi0gICAgICAgIHR5cGUgb2YgYW4gYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotCi0gICAgICAgIFRoZSBleGFtcGxlIHZhbHVlcyBhcmU6Ci0KLSAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPkJhc2ljUGFzc3dvcmQKLSAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLQotICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+S2VyYnY1Ci0gICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0KLSAgICAgICAgQW55IGFkZGl0aW9uYWwgc2VjdXJpdHkgbWVjaGFuaXNtcyBhcmUgb3V0c2lkZSB0aGUKLSAgICAgICAgc2NvcGUgb2YgdGhlIENvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjcmVkZW50aWFsLWludGVyZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y3JlZGVudGlhbC1pbnRlcmZhY2VUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjb25maWctcHJvcGVydHktbmFtZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY29uZmlnLXByb3BlcnR5LW5hbWVUeXBlIGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLWNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0KLVRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIGRlZmluZXMgYSBzZXQgb2Ygd2VsbC1kZWZpbmVkCi1wcm9wZXJ0aWVzIGFsbCBvZiB0eXBlIGphdmEubGFuZy5TdHJpbmcuIFRoZXNlIGFyZSBhcwotZm9sbG93cy4KLQotICAgICBTZXJ2ZXJOYW1lCi0gICAgIFBvcnROdW1iZXIKLSAgICAgVXNlck5hbWUKLSAgICAgUGFzc3dvcmQKLSAgICAgQ29ubmVjdGlvblVSTAotCi1BIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgY2FuIGV4dGVuZCB0aGlzIHByb3BlcnR5IHNldCB0bwotaW5jbHVkZSBwcm9wZXJ0aWVzIHNwZWNpZmljIHRvIHRoZSByZXNvdXJjZSBhZGFwdGVyIGFuZCBpdHMKLXVuZGVybHlpbmcgRUlTLgotCi1Qb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZQotICAgICAgICBTZXJ2ZXJOYW1lCi0gICAgICAgIFBvcnROdW1iZXIKLSAgICAgICAgVXNlck5hbWUKLSAgICAgICAgUGFzc3dvcmQKLSAgICAgICAgQ29ubmVjdGlvblVSTAotCi1FeGFtcGxlOiA8Y29uZmlnLXByb3BlcnR5LW5hbWU+U2VydmVyTmFtZTwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjb25maWctcHJvcGVydHktdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY29uZmlnLXByb3BlcnR5LXR5cGVUeXBlIGNvbnRhaW5zIHRoZSBmdWxseQotcXVhbGlmaWVkIEphdmEgdHlwZSBvZiBhIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0KLVRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXM6Ci0gICBqYXZhLmxhbmcuQm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsCi0gICBqYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwgamF2YS5sYW5nLlNob3J0LAotICAgamF2YS5sYW5nLkxvbmcsIGphdmEubGFuZy5GbG9hdCwgamF2YS5sYW5nLkNoYXJhY3RlcgotCi1Vc2VkIGluOiBjb25maWctcHJvcGVydHkKLQotRXhhbXBsZToKLTxjb25maWctcHJvcGVydHktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jb25maWctcHJvcGVydHktdHlwZT4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Cb29sZWFuIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkludGVnZXIiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkRvdWJsZSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQnl0ZSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU2hvcnQiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkxvbmciLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkZsb2F0Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5DaGFyYWN0ZXIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25maWctcHJvcGVydHlUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhIHNpbmdsZQotY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB0aGF0IG1heSBiZSB1c2VkIGZvciBwcm92aWRpbmcKLWNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0KLVRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgbmFtZSwKLXR5cGUgYW5kIGFuIG9wdGlvbmFsIHZhbHVlIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5LiBJZgotdGhlIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgZG9lcyBub3Qgc3BlY2lmeSBhIHZhbHVlIHRoYW4KLXRoZSBkZXBsb3llciBpcyByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIGEgdmFsaWQgdmFsdWUgZm9yCi1hIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0KLUFueSBib3VuZHMgb3Igd2VsbC1kZWZpbmVkIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIHNob3VsZCBiZQotZGVzY3JpYmVkIGluIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50LgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5LW5hbWVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHktdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5LXR5cGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHktdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgY29uZmlnLXByb3BlcnR5LXZhbHVlIGNvbnRhaW5zIHRoZSB2YWx1ZQotICAgICAgICBvZiBhIGNvbmZpZ3VyYXRpb24gZW50cnkuIE5vdGUsIGl0IGlzIHBvc3NpYmxlIGZvciBhCi0gICAgICAgIHJlc291cmNlIGFkYXB0ZXIgZGVwbG95ZXIgdG8gb3ZlcnJpZGUgdGhpcwotICAgICAgICBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGR1cmluZyBkZXBsb3ltZW50LgotCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+V29tYmF0U2VydmVyPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0aW9uLWRlZmluaXRpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNvbm5lY3Rpb24tZGVmaW5pdGlvblR5cGUgZGVmaW5lcyBhIHNldCBvZiBjb25uZWN0aW9uCi1pbnRlcmZhY2VzIGFuZCBjbGFzc2VzIHBlcnRhaW5pbmcgdG8gYSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24KLXR5cGUuIFRoaXMgYWxzbyBpbmNsdWRlcyBjb25maWd1cmFibGUgcHJvcGVydGllcyBmb3IKLU1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZXMgdGhhdCBtYXkgYmUgcHJvZHVjZWQgb3V0Ci1vZiB0aGlzIHNldC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzIHNwZWNpZmllcwotICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdAotICAgICAgICBpbXBsZW1lbnRzIHRoZQotICAgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4KLSAgICAgICAgVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YgcmVzb3VyY2UKLSAgICAgICAgYWRhcHRlcidzIGltcGxlbWVudGF0aW9uIG9mIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUKLSAgICAgICAgc3BlY2lmaWVkIGNvbnRyYWN0cy4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgICAgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYSBKYXZhQmVhbi4KLQotICAgICAgICBFeGFtcGxlOgotICAgICAgICA8bWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotICAgICAgICAgICAgY29tLndvbWJhdC5NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlJbXBsCi0gICAgICAgIDwvbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIHNwZWNpZmllcwotICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5Ci0gICAgICAgIGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuCi0KLSAgICAgICAgRXhhbXBsZToKLSAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5jb20ud29tYmF0LkNvbm5lY3Rpb25GYWN0b3J5Ci0gICAgICAgIDwvY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPgotCi0gICAgICAgIE9SCi0KLSAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbkZhY3RvcnkKLSAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3Mgc3BlY2lmaWVzCi0gICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkKLSAgICAgICAgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIKLSAgICAgICAgc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLgotCi0gICAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Y29tLndvbWJhdC5Db25uZWN0aW9uRmFjdG9yeUltcGwKLSAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWludGVyZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjb25uZWN0aW9uLWludGVyZmFjZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgZnVsbHkKLSAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gaW50ZXJmYWNlIHN1cHBvcnRlZAotICAgICAgICBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLQotICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgICAgICA8Y29ubmVjdGlvbi1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2UuY2NpLkNvbm5lY3Rpb24KLSAgICAgICAgICAgIDwvY29ubmVjdGlvbi1pbnRlcmZhY2U+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24taW1wbC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjb25uZWN0aW9uLWltcGwtY2xhc3NUeXBlIHNwZWNpZmllcyB0aGUgZnVsbHkKLSAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gY2xhc3MgdGhhdAotICAgICAgICBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgQ29ubmVjdGlvbgotICAgICAgICBpbnRlcmZhY2UuICBJdCBpcyB1c2VkIGJ5IHRoZSBjb25uZWN0aW9uLWltcGwtY2xhc3MKLSAgICAgICAgZWxlbWVudHMuCi0KLSAgICAgICAgRXhhbXBsZToKLQotICAgICAgICAgICAgPGNvbm5lY3Rpb24taW1wbC1jbGFzcz5jb20ud29tYmF0LkNvbm5lY3Rpb25JbXBsCi0gICAgICAgICAgICA8L2Nvbm5lY3Rpb24taW1wbC1jbGFzcz4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbm5lY3RvclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY29ubmVjdG9yVHlwZSBkZWZpbmVzIGEgcmVzb3VyY2UgYWRhcHRlci4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVuZG9yLW5hbWUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWxlbWVudCB2ZW5kb3ItbmFtZSBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKLSAgICAgICAgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlciB2ZW5kb3IuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVpcy10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IGVpcy10eXBlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgICAgICB0eXBlIG9mIHRoZSBFSVMuIEZvciBleGFtcGxlLCB0aGUgdHlwZSBvZiBhbiBFSVMgY2FuCi0gICAgICAgIGJlIHByb2R1Y3QgbmFtZSBvZiBFSVMgaW5kZXBlbmRlbnQgb2YgYW55IHZlcnNpb24KLSAgICAgICAgaW5mby4KLQotICAgICAgICBUaGlzIGhlbHBzIGluIGlkZW50aWZ5aW5nIEVJUyBpbnN0YW5jZXMgdGhhdCBjYW4gYmUKLSAgICAgICAgdXNlZCB3aXRoIHRoaXMgcmVzb3VyY2UgYWRhcHRlci4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2VhZGFwdGVyLXZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgdmVyc2lvbiBzcGVjaWZpZXMgYSBzdHJpbmctYmFzZWQgdmVyc2lvbgotICAgICAgICBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBmcm9tIHRoZSByZXNvdXJjZSBhZGFwdGVyCi0gICAgICAgIHByb3ZpZGVyLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpY2Vuc2UiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmxpY2Vuc2VUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZWFkYXB0ZXIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlYWRhcHRlclR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgZXh0ZW5zaW9ucyBjYW4gYmUKLSAgICAgICAgc3BlY2lmaWVkIGJ5IHVzaW5nIHRoZSBkZXBsb3ltZW50LWV4dGVuc2lvbgotICAgICAgICBlbGVtZW50cy4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRld2V5LXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIGZpeGVkPSIxLjUiCi0gICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSB2ZXJzaW9uIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUKLSAgICBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gdGhhdCBpcwotICAgIHN1cHBvcnRlZCBieSB0aGlzIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgaW5mb3JtYXRpb24KLSAgICBlbmFibGVzIGRlcGxveWVyIHRvIGNvbmZpZ3VyZSB0aGUgcmVzb3VyY2UgYWRhcHRlciB0bwotICAgIHN1cHBvcnQgZGVwbG95bWVudCBhbmQgcnVudGltZSByZXF1aXJlbWVudHMgb2YgdGhlCi0gICAgY29ycmVzcG9uZGluZyBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iY3JlZGVudGlhbC1pbnRlcmZhY2VUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNyZWRlbnRpYWwtaW50ZXJmYWNlVHlwZSBzcGVjaWZpZXMgdGhlCi1pbnRlcmZhY2UgdGhhdCB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbgotc3VwcG9ydHMgZm9yIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUKLWNyZWRlbnRpYWxzLiBUaGlzIGVsZW1lbnQocykgdGhhdCB1c2UgdGhpcyB0eXBlLAotaS5lLiBjcmVkZW50aWFsLWludGVyZmFjZSwgIHNob3VsZCBiZSB1c2VkIGJ5Ci1hcHBsaWNhdGlvbiBzZXJ2ZXIgdG8gZmluZCBvdXQgdGhlIENyZWRlbnRpYWwKLWludGVyZmFjZSBpdCBzaG91bGQgdXNlIGFzIHBhcnQgb2YgdGhlIHNlY3VyaXR5Ci1jb250cmFjdC4KLQotVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6Ci0KLWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwKLW9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbAotamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbgotICAgICAgICAgICAgdmFsdWU9ImphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbgotICAgICAgICAgICAgdmFsdWU9Im9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uCi0gICAgICAgICAgICB2YWx1ZT0iamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgaW5ib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbgotYWJvdXQgYW4gaW5ib3VuZCByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGNvbnRhaW5zIGluZm9ybWF0aW9uCi1zcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIKLWxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlIG1lc3NhZ2VhZGFwdGVyIGVsZW1lbnQuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2VhZGFwdGVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlYWRhcHRlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlbGlzdGVuZXItdHlwZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG1lc3NhZ2VsaXN0ZW5lci10eXBlIGVsZW1lbnQgY29udGVudCBtdXN0IGJlCi0gICAgICAgIHVuaXF1ZSBpbiB0aGUgbWVzc2FnZWFkYXB0ZXIuIFNldmVyYWwgbWVzc2FnZWxpc3RlbmVycwotICAgICAgICBjYW4gbm90IHVzZSB0aGUgc2FtZSBtZXNzYWdlbGlzdGVuZXItdHlwZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1lc3NhZ2VsaXN0ZW5lciIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOm1lc3NhZ2VsaXN0ZW5lci10eXBlIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaWNlbnNlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBsaWNlbnNlVHlwZSBzcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlCi1yZXNvdXJjZSBhZGFwdGVyIG1vZHVsZS4gVGhpcyB0eXBlIHNwZWNpZmllcyB3aGV0aGVyIGEKLWxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhpcyByZXNvdXJjZSBhZGFwdGVyLAotYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBsaWNlbnNpbmcgdGVybXMKLShleGFtcGxlczogZHVyYXRpb24gb2YgbGljZW5zZSwgbnVtYmVyIG9mIGNvbm5lY3Rpb24KLXJlc3RyaWN0aW9ucykuIEl0IGlzIHVzZWQgYnkgdGhlIGxpY2Vuc2UgZWxlbWVudC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpY2Vuc2UtcmVxdWlyZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBlbGVtZW50IGxpY2Vuc2UtcmVxdWlyZWQgc3BlY2lmaWVzIHdoZXRoZXIgYQotICAgICAgICAgICAgbGljZW5zZSBpcyByZXF1aXJlZCB0byBkZXBsb3kgYW5kIHVzZSB0aGUKLSAgICAgICAgICAgIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZgotICAgICAgICAgICAgdGhlIGZvbGxvd2luZywgInRydWUiIG9yICJmYWxzZSIuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZWFkYXB0ZXJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi1tZXNzYWdpbmcgY2FwYWJpbGl0aWVzIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyLiBUaGlzCi1jb250YWlucyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCi1yZXNvdXJjZSBhZGFwdGVyIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlCi1tZXNzYWdlbGlzdGVuZXIgZWxlbWVudC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZWxpc3RlbmVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlbGlzdGVuZXJUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlbGlzdGVuZXJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2VsaXN0ZW5lclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGEKLXNwZWNpZmljIG1lc3NhZ2UgbGlzdGVuZXIgc3VwcG9ydGVkIGJ5IHRoZSBtZXNzYWdpbmcKLXJlc291cmNlIGFkYXB0ZXIuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBKYXZhIHR5cGUKLW9mIHRoZSBtZXNzYWdlIGxpc3RlbmVyIGludGVyZmFjZSBhbmQgYW4gYWN0aXZhdGlvbgotc3BlY2lmaWNhdGlvbi4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZWxpc3RlbmVyLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWxlbWVudCBtZXNzYWdlbGlzdGVuZXItdHlwZSBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0gICAgICAgIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIHR5cGUgb2YgYSBtZXNzYWdlCi0gICAgICAgIGxpc3RlbmVyIGludGVyZmFjZS4KLQotICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgICAgPG1lc3NhZ2VsaXN0ZW5lci10eXBlPmphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIKLSAgICAgICAgICA8L21lc3NhZ2VsaXN0ZW5lci10eXBlPgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb25zcGVjIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTphY3RpdmF0aW9uc3BlY1R5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG91dGJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0Ci1hbiBvdXRib3VuZCByZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHkKLXF1YWxpZmllZCBuYW1lcyBvZiBjbGFzc2VzL2ludGVyZmFjZXMgcmVxdWlyZWQgYXMgcGFydCBvZgotdGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGNvbnRyYWN0cyBmb3IKLWNvbm5lY3Rpb24gbWFuYWdlbWVudCwgbGV2ZWwgb2YgdHJhbnNhY3Rpb24gc3VwcG9ydAotcHJvdmlkZWQsIG9uZSBvciBtb3JlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgc3VwcG9ydGVkCi1hbmQgYWRkaXRpb25hbCByZXF1aXJlZCBzZWN1cml0eSBwZXJtaXNzaW9ucy4KLQotSWYgdGhlcmUgaXMgbm8gYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllZCBhcyBwYXJ0IG9mCi1yZXNvdXJjZSBhZGFwdGVyIGVsZW1lbnQgdGhlbiB0aGUgcmVzb3VyY2UgYWRhcHRlciBkb2VzIG5vdAotc3VwcG9ydCBhbnkgc3RhbmRhcmQgc2VjdXJpdHkgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBhcwotcGFydCBvZiBzZWN1cml0eSBjb250cmFjdC4gVGhlIGFwcGxpY2F0aW9uIHNlcnZlciBpZ25vcmVzCi10aGUgc2VjdXJpdHkgcGFydCBvZiB0aGUgc3lzdGVtIGNvbnRyYWN0cyBpbiB0aGlzIGNhc2UuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tZGVmaW5pdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y29ubmVjdGlvbi1kZWZpbml0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2FjdGlvbi1zdXBwb3J0IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0cmFuc2FjdGlvbi1zdXBwb3J0VHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTphdXRoZW50aWNhdGlvbi1tZWNoYW5pc21UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYXV0aGVudGljYXRpb24tc3VwcG9ydCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWxlbWVudCByZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQgc3BlY2lmaWVzCi0gICAgICAgIHdoZXRoZXIgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMKLSAgICAgICAgcmUtYXV0aGVudGljYXRpb24gb2YgZXhpc3RpbmcgTWFuYWdlZC0gQ29ubmVjdGlvbgotICAgICAgICBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoaXMgaW5mb3JtYXRpb24gaXMgZm9yIHRoZQotICAgICAgICByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIGFuZCBub3QgZm9yIHRoZQotICAgICAgICB1bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4gVGhpcyBlbGVtZW50IG11c3QgaGF2ZQotICAgICAgICBlaXRoZXIgYSAidHJ1ZSIgb3IgImZhbHNlIiB2YWx1ZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1wZXJtaXNzaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZWN1cml0eS1wZXJtaXNzaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXF1aXJlZC1jb25maWctcHJvcGVydHlUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotb2YgYSBzaW5nbGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB1c2VkIGZvciBzcGVjaWZ5aW5nIGEKLXJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgbmFtZS4gSXQgaXMgdXNlZAotYnkgcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5IGVsZW1lbnRzLgotCi1FeGFtcGxlOgotCi08cmVxdWlyZWQtY29uZmlnLXByb3BlcnR5PkRlc3RpbmF0aW9uPC9yZXF1aXJlZC1jb25maWctcHJvcGVydHk+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmNvbmZpZy1wcm9wZXJ0eS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlYWRhcHRlclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcmVzb3VyY2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi1yZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHkgcXVhbGlmaWVkCi1yZXNvdXJjZSBhZGFwdGVyIEphdmEgY2xhc3MgbmFtZSwgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLAotaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXNvdXJjZQotYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZQotb3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyIGFuZCBpbmJvdW5kLXJlc291cmNlYWRhcHRlcgotZWxlbWVudHMsIGFuZCBhbiBvcHRpb25hbCBzZXQgb2YgYWRtaW5pc3RlcmVkIG9iamVjdHMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlYWRhcHRlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlci1jbGFzcyBzcGVjaWZpZXMgdGhlCi0gICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMKLSAgICAgICAgdGhlIGphdmF4LnJlc291cmNlLnNwaS5SZXNvdXJjZUFkYXB0ZXIKLSAgICAgICAgaW50ZXJmYWNlLiBUaGlzIEphdmEgY2xhc3MgaXMgcHJvdmlkZWQgYXMgcGFydCBvZgotICAgICAgICByZXNvdXJjZSBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yCi0gICAgICAgIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgY29udHJhY3RzLiBUaGUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgb2YgdGhpcyBjbGFzcyBpcyByZXF1aXJlZCB0byBiZSBhIEphdmFCZWFuLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm91dGJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluYm91bmQtcmVzb3VyY2VhZGFwdGVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTppbmJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkbWlub2JqZWN0IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTphZG1pbm9iamVjdFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LXBlcm1pc3Npb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlY3VyaXR5LXBlcm1pc3Npb25UeXBlIHNwZWNpZmllcyBhIHNlY3VyaXR5Ci1wZXJtaXNzaW9uIHRoYXQgaXMgcmVxdWlyZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIgY29kZS4KLQotVGhlIHNlY3VyaXR5IHBlcm1pc3Npb24gbGlzdGVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLWFyZSBvbmVzIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIHJlcXVpcmVkIGJ5IHRoZQotZGVmYXVsdCBwZXJtaXNzaW9uIHNldCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbm5lY3Rvcgotc3BlY2lmaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGNhbiBtZW50aW9uIHNwZWNpZmljCi1yZWFzb24gdGhhdCByZXNvdXJjZSBhZGFwdGVyIHJlcXVpcmVzIGEgZ2l2ZW4gc2VjdXJpdHkKLXBlcm1pc3Npb24uCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcGVybWlzc2lvbi1zcGVjIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IHBlcm1pc3Npb24tc3BlYyBzcGVjaWZpZXMgYSBzZWN1cml0eQotICAgICAgICBwZXJtaXNzaW9uIGJhc2VkIG9uIHRoZSBTZWN1cml0eSBwb2xpY3kgZmlsZQotICAgICAgICBzeW50YXguIFJlZmVyIHRvIHRoZSBmb2xsb3dpbmcgVVJMIGZvciBTdW4ncwotICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcGVybWlzc2lvbgotICAgICAgICBzcGVjaWZpY2F0aW9uOgotCi0gICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuNC9kb2NzL2d1aWRlL3NlY3VyaXR5L1BvbGljeUZpbGVzLmh0bWwjRmlsZVN5bnRheAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0idHJhbnNhY3Rpb24tc3VwcG9ydFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgdHJhbnNhY3Rpb24tc3VwcG9ydFR5cGUgc3BlY2lmaWVzIHRoZSBsZXZlbCBvZgotdHJhbnNhY3Rpb24gc3VwcG9ydCBwcm92aWRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4gSXQgaXMKLXVzZWQgYnkgdHJhbnNhY3Rpb24tc3VwcG9ydCBlbGVtZW50cy4KLQotVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBOb1RyYW5zYWN0aW9uCi0gICAgTG9jYWxUcmFuc2FjdGlvbgotICAgIFhBVHJhbnNhY3Rpb24KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9UcmFuc2FjdGlvbiIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFRyYW5zYWN0aW9uIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhBVHJhbnNhY3Rpb24iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL2VqYi1qYXJfMl8xLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2oyZWUvZWpiLWphcl8yXzEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTZjMTJlLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2oyZWUvZWpiLWphcl8yXzEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjM4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjIuMSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci1AKCMpZWpiLWphcl8yXzEueHNkcwkxLjEwIDA3LzI0LzAyCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1Db3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLVJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLXJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1yZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLVUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci1tYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLWNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgRUpCIDIuMSBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yLiAgQWxsIEVKQiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUKLXRoZSBlamItamFyIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2U6Ci0KLWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgIDxlamItamFyIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLSAgICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvZWpiLWphcl8yXzEueHNkIgotICAgICB2ZXJzaW9uPSIyLjEiPgotICAgIC4uLgotICAgIDwvZWpiLWphcj4KLQotVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi10aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciB0aGUKLUoyRUUgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9lamItamFyXzJfMS54c2QKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQotZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0gIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotPHhzZDplbGVtZW50IG5hbWU9ImVqYi1qYXIiIHR5cGU9ImoyZWU6ZWpiLWphclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGlzIGlzIHRoZSByb290IG9mIHRoZSBlamItamFyIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6a2V5IG5hbWU9ImVqYi1uYW1lLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBlamItbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIGVudGVycHJpc2UKLSAgICBiZWFuLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnRlcnByaXNlLWJlYW5zLyoiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItbmFtZSIvPgotICAgIDwveHNkOmtleT4KLQotICAgIDx4c2Q6a2V5cmVmIG5hbWU9ImVqYi1uYW1lLXJlZmVyZW5jZXMiCi0gICAgICAgICAgICByZWZlcj0iajJlZTplamItbmFtZS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCi0gICAgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIG11c3QgYmUgdG8gYSBzcGVjaWZpYyBlamItbmFtZQotICAgIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBlbnRlcnByaXNlLWJlYW5zIGVsZW1lbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IKLSAgICAgICAgICAgIHhwYXRoPSIuLy9qMmVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZS9qMmVlOnJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSIvPgotICAgICAgICA8eHNkOmZpZWxkCi0gICAgICAgICAgICB4cGF0aD0iajJlZTplamItbmFtZSIvPgotICAgIDwveHNkOmtleXJlZj4KLQotICAgIDx4c2Q6a2V5IG5hbWU9InJvbGUtbmFtZS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBBIHJvbGUtbmFtZS1rZXkgaXMgc3BlY2lmaWVkIHRvIGFsbG93IHRoZSByZWZlcmVuY2VzCi0gICAgZnJvbSB0aGUgc2VjdXJpdHktcm9sZS1yZWZzLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudGVycHJpc2UtYmVhbnMvKi9qMmVlOnNlY3VyaXR5LXJvbGUiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyb2xlLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0KLSAgICA8eHNkOmtleXJlZiBuYW1lPSJyb2xlLW5hbWUtcmVmZXJlbmNlcyIKLSAgICAgICAgICAgIHJlZmVyPSJqMmVlOnJvbGUtbmFtZS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCi0gICAgc2VjdXJpdHktcm9sZS1yZWYgdG8gYSBzcGVjaWZpZWQgcm9sZS1uYW1lLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudGVycHJpc2UtYmVhbnMvKi9qMmVlOnNlY3VyaXR5LXJvbGUtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cm9sZS1saW5rIi8+Ci0gICAgPC94c2Q6a2V5cmVmPgotCi08L3hzZDplbGVtZW50PgotCi0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBuYW1lL3ZhbHVlCi1jb25maWd1cmF0aW9uIHByb3BlcnR5IHBhaXIgZm9yIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQotVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyCi1tZXNzYWdlLWRyaXZlbiBiZWFuIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBtZXNzYWdpbmcgdHlwZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktbmFtZSBlbGVtZW50IGNvbnRhaW5zCi0gICAgICAgIHRoZSBuYW1lIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgb2YKLSAgICAgICAgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCi0gICAgICAgIEZvciBKTVMgbWVzc2FnZS1kcml2ZW4gYmVhbnMsIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkKLSAgICAgICAgbmFtZXMgYXJlIHJlY29nbml6ZWQ6IGFja25vd2xlZGdlTW9kZSwKLSAgICAgICAgbWVzc2FnZVNlbGVjdG9yLCBkZXN0aW5hdGlvblR5cGUsIHN1YnNjcmlwdGlvbkR1cmFiaWxpdHkKLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LXZhbHVlIGVsZW1lbnQKLSAgICAgICAgY29udGFpbnMgdGhlIHZhbHVlIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgcHJvcGVydHkgb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWN0aXZhdGlvbi1jb25maWdUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGFjdGl2YXRpb24tY29uZmlnVHlwZSBkZWZpbmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotZXhwZWN0ZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuCi1pbiBpdHMgb3BlcmF0aW9uYWwgZW52aXJvbm1lbnQuIFRoaXMgbWF5IGluY2x1ZGUgaW5mb3JtYXRpb24KLWFib3V0IG1lc3NhZ2UgYWNrbm93bGVkZ2VtZW50LCBtZXNzYWdlIHNlbGVjdG9yLCBleHBlY3RlZAotZGVzdGluYXRpb24gdHlwZSwgZXRjLgotCi1UaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBleHByZXNzZWQgaW4gdGVybXMgb2YKLW5hbWUvdmFsdWUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgotCi1UaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXIKLW1lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTphY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhc3NlbWJseS1kZXNjcmlwdG9yVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBhc3NlbWJseS1kZXNjcmlwdG9yVHlwZSBkZWZpbmVzCi1hcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbi4KLQotVGhlIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uIGNvbnNpc3RzIG9mIHRoZQotZm9sbG93aW5nIHBhcnRzOiB0aGUgZGVmaW5pdGlvbiBvZiBzZWN1cml0eSByb2xlcywgdGhlCi1kZWZpbml0aW9uIG9mIG1ldGhvZCBwZXJtaXNzaW9ucywgdGhlIGRlZmluaXRpb24gb2YKLXRyYW5zYWN0aW9uIGF0dHJpYnV0ZXMgZm9yIGVudGVycHJpc2UgYmVhbnMgd2l0aAotY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gYW5kIGEgbGlzdCBvZgotbWV0aG9kcyB0byBiZSBleGNsdWRlZCBmcm9tIGJlaW5nIGludm9rZWQuCi0KLUFsbCB0aGUgcGFydHMgYXJlIG9wdGlvbmFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlCi1vbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4KLQotUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wZXJtaXNzaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXRob2QtcGVybWlzc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXRyYW5zYWN0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtbGlzdCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZXhjbHVkZS1saXN0VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXAtZmllbGRUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNtcC1maWVsZFR5cGUgZGVzY3JpYmVzIGEgY29udGFpbmVyLW1hbmFnZWQgZmllbGQuIFRoZQotY21wLWZpZWxkVHlwZSBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGQsCi1hbmQgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZC1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotICAgICAgICBjb250YWluZXIgbWFuYWdlZCBmaWVsZC4KLQotICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLSAgICAgICAgY21wLXZlcnNpb24gMi54IG11c3QgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZQotICAgICAgICBsZXR0ZXIuIFRoaXMgZmllbGQgaXMgYWNjZXNzZWQgYnkgbWV0aG9kcyB3aG9zZQotICAgICAgICBuYW1lcyBjb25zaXN0cyBvZiB0aGUgbmFtZSBvZiB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5Ci0gICAgICAgIGZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0IGxldHRlciBpcyB1cHBlcmNhc2VkLAotICAgICAgICBwcmVmaXhlZCBieSAiZ2V0IiBvciAic2V0Ii4KLQotICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLSAgICAgICAgY21wLXZlcnNpb24gMS54IG11c3QgZGVub3RlIGEgcHVibGljIGZpZWxkIG9mIHRoZQotICAgICAgICBlbnRlcnByaXNlIGJlYW4gY2xhc3Mgb3Igb25lIG9mIGl0cyBzdXBlcmNsYXNzZXMuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iY21wLXZlcnNpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNtcC12ZXJzaW9uVHlwZSBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgYW4gZW50aXR5IGJlYW4KLXdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuIEl0IGlzIHVzZWQgYnkKLWNtcC12ZXJzaW9uIGVsZW1lbnRzLgotCi1UaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLSAgICAxLngKLSAgICAyLngKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMS54Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIueCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjbXItZmllbGQtdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNsYXNzIG9mIGEKLWNvbGxlY3Rpb24tdmFsdWVkIGxvZ2ljYWwgcmVsYXRpb25zaGlwIGZpZWxkIGluIHRoZSBlbnRpdHkKLWJlYW4gY2xhc3MuIFRoZSB2YWx1ZSBvZiBhbiBlbGVtZW50IHVzaW5nIGNtci1maWVsZC10eXBlVHlwZQotbXVzdCBiZSBlaXRoZXI6IGphdmEudXRpbC5Db2xsZWN0aW9uIG9yIGphdmEudXRpbC5TZXQuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEudXRpbC5TZXQiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtci1maWVsZFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY21yLWZpZWxkVHlwZSBkZXNjcmliZXMgdGhlIGJlYW4gcHJvdmlkZXIncyB2aWV3IG9mCi1hIHJlbGF0aW9uc2hpcC4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZAotdGhlIG5hbWUgYW5kIHRoZSBjbGFzcyB0eXBlIG9mIGEgZmllbGQgaW4gdGhlIHNvdXJjZSBvZiBhCi1yb2xlIG9mIGEgcmVsYXRpb25zaGlwLiBUaGUgY21yLWZpZWxkLW5hbWUgZWxlbWVudAotY29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgdXNlZCBmb3IgdGhlIGdldCBhbmQgc2V0IGFjY2Vzc29yCi1tZXRob2RzIGZvciB0aGUgcmVsYXRpb25zaGlwLiBUaGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBpcwotdXNlZCBvbmx5IGZvciBjb2xsZWN0aW9uLXZhbHVlZCBjbXItZmllbGRzLiBJdCBzcGVjaWZpZXMgdGhlCi10eXBlIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgaXMgdXNlZC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXItZmllbGQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNtci1maWVsZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgbG9naWNhbCByZWxhdGlvbnNoaXAgZmllbGQgaW4gdGhlIGVudGl0eSBiZWFuCi0gICAgICAgIGNsYXNzLiBUaGUgbmFtZSBvZiB0aGUgY21yLWZpZWxkIG11c3QgYmVnaW4gd2l0aCBhCi0gICAgICAgIGxvd2VyY2FzZSBsZXR0ZXIuIFRoaXMgZmllbGQgaXMgYWNjZXNzZWQgYnkgbWV0aG9kcwotICAgICAgICB3aG9zZSBuYW1lcyBjb25zaXN0IG9mIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAotICAgICAgICBzcGVjaWZpZWQgYnkgY21yLWZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0Ci0gICAgICAgIGxldHRlciBpcyB1cHBlcmNhc2VkLCBwcmVmaXhlZCBieSAiZ2V0IiBvciAic2V0Ii4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21yLWZpZWxkLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmNtci1maWVsZC10eXBlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNvbnRhaW5lci10cmFuc2FjdGlvblR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyCi1tdXN0IG1hbmFnZSB0cmFuc2FjdGlvbiBzY29wZXMgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4ncwotbWV0aG9kIGludm9jYXRpb25zLiBJdCBkZWZpbmVzIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhCi1saXN0IG9mIG1ldGhvZCBlbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLiBUaGUKLXRyYW5zYWN0aW9uIGF0dHJpYnV0ZSBpcyB0byBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3BlY2lmaWVkCi1tZXRob2RzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFucy1hdHRyaWJ1dGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnRyYW5zLWF0dHJpYnV0ZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVqYi1jbGFzc1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWpiLWNsYXNzVHlwZSBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi1lbnRlcnByaXNlIGJlYW4ncyBjbGFzcy4gSXQgaXMgdXNlZCBieSBlamItY2xhc3MgZWxlbWVudHMuCi0KLUV4YW1wbGU6Ci0KLSAgICA8ZWpiLWNsYXNzPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2VCZWFuPC9lamItY2xhc3M+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1qYXJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVqYi1qYXJUeXBlIGRlZmluZXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgRUpCCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IuIEl0IGNvbnRhaW5zCi0KLSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBlamItamFyIGZpbGUKLSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotICAgIC0gYW4gb3B0aW9uYWwgaWNvbiB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UKLSAgICAgIGljb24gZmlsZSBuYW1lCi0gICAgLSBtYW5kYXRvcnkgc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgaW5jbHVkZWQKLSAgICAgIGVudGVycHJpc2UgYmVhbnMKLSAgICAtIGEgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcywKLSAgICAgIGlmIGFueQotICAgIC0gYW4gb3B0aW9uYWwgYXBwbGljYXRpb24tYXNzZW1ibHkgZGVzY3JpcHRvcgotICAgIC0gYW4gb3B0aW9uYWwgbmFtZSBvZiBhbiBlamItY2xpZW50LWphciBmaWxlIGZvciB0aGUKLSAgICAgIGVqYi1qYXIuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmljb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGVycHJpc2UtYmVhbnMiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVudGVycHJpc2UtYmVhbnNUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxhdGlvbnNoaXBzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZWxhdGlvbnNoaXBzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9InJlbGF0aW9uc2hpcC1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWpiLXJlbGF0aW9uLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICByZWxhdGlvbi4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0gICAgICAgIHJlbGF0aW9uc2hpcHMuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLXJlbGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWxhdGlvbi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc2VtYmx5LWRlc2NyaXB0b3IiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmFzc2VtYmx5LWRlc2NyaXB0b3JUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQKLSAgICAgICAgZGVzY3JpcHRvciBpcyBvcHRpb25hbCBmb3IgdGhlIGVqYi1qYXIgZmlsZQotICAgICAgICBwcm9kdWNlci4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWNsaWVudC1qYXIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG9wdGlvbmFsIGVqYi1jbGllbnQtamFyIGVsZW1lbnQgc3BlY2lmaWVzIGEgSkFSCi0gICAgICAgIGZpbGUgdGhhdCBjb250YWlucyB0aGUgY2xhc3MgZmlsZXMgbmVjZXNzYXJ5IGZvciBhCi0gICAgICAgIGNsaWVudCBwcm9ncmFtIHRvIGFjY2VzcyB0aGUKLSAgICAgICAgZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgZWpiLWphciBmaWxlLgotCi0gICAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICAgICAgIDxlamItY2xpZW50LWphcj5lbXBsb3llZV9zZXJ2aWNlX2NsaWVudC5qYXIKLSAgICAgICAgICAgIDwvZWpiLWNsaWVudC1qYXI+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgZml4ZWQ9IjIuMSIKLSAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIHZlcnNpb24gc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIHRoZQotICAgIEVKQiBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIGluc3RhbmNlIGRvY3VtZW50IG11c3QKLSAgICBjb21wbHkgd2l0aC4gVGhpcyBpbmZvcm1hdGlvbiBlbmFibGVzIGRlcGxveW1lbnQgdG9vbHMKLSAgICB0byB2YWxpZGF0ZSBhIHBhcnRpY3VsYXIgRUpCIERlcGxveW1lbnQKLSAgICBEZXNjcmlwdG9yIHdpdGggcmVzcGVjdCB0byBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIEVKQgotICAgIHNjaGVtYS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlamItbmFtZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWpiLW5hbWVUeXBlIHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncyBuYW1lLiBJdCBpcwotdXNlZCBieSBlamItbmFtZSBlbGVtZW50cy4gVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZQotZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIG5hbWUgdGhlIGVudGVycHJpc2UgYmVhbiBpbiB0aGUKLWVqYi1qYXIgZmlsZSdzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZQotdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgc2FtZQotZWpiLWphciBmaWxlLgotCi1UaGVyZSBpcyBubyBhcmNoaXRlY3RlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgdXNlZAotZWpiLW5hbWUgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgdGhlIEpOREkgbmFtZSB0aGF0Ci10aGUgRGVwbG95ZXIgd2lsbCBhc3NpZ24gdG8gdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUuCi0KLVRoZSBuYW1lIGZvciBhbiBlbnRpdHkgYmVhbiBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwKLXJ1bGVzIGZvciBhbiBOTVRPS0VOLgotCi1FeGFtcGxlOgotCi08ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgPHhzZDp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlbGF0aW9uVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBlamItcmVsYXRpb25UeXBlIGRlc2NyaWJlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3bwotZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuICBJdCBpcyB1c2VkCi1ieSBlamItcmVsYXRpb24gZWxlbWVudHMuIEl0IGNvbnRhaW5zIGEgZGVzY3JpcHRpb247IGFuCi1vcHRpb25hbCBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50OyBhbmQgZXhhY3RseSB0d28KLXJlbGF0aW9uc2hpcCByb2xlIGRlY2xhcmF0aW9ucywgZGVmaW5lZCBieSB0aGUKLWVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50cy4gVGhlIG5hbWUgb2YgdGhlCi1yZWxhdGlvbnNoaXAsIGlmIHNwZWNpZmllZCwgaXMgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphcgotZmlsZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb24tbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWxhdGlvbi1uYW1lIGVsZW1lbnQgcHJvdmlkZXMgYSB1bmlxdWUgbmFtZQotICAgICAgICB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZSBmb3IgYSByZWxhdGlvbnNoaXAuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSBkZXNjcmliZXMgYSByb2xlIHdpdGhpbiBhCi1yZWxhdGlvbnNoaXAuIFRoZXJlIGFyZSB0d28gcm9sZXMgaW4gZWFjaCByZWxhdGlvbnNoaXAuCi0KLVRoZSBlamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbjsgYW4gb3B0aW9uYWwgbmFtZSBmb3IgdGhlIHJlbGF0aW9uc2hpcCByb2xlOyBhCi1zcGVjaWZpY2F0aW9uIG9mIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJvbGU7IGFuIG9wdGlvbmFsCi1zcGVjaWZpY2F0aW9uIG9mIGNhc2NhZGUtZGVsZXRlIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByb2xlOwotdGhlIHJvbGUgc291cmNlOyBhbmQgYSBkZWNsYXJhdGlvbiBvZiB0aGUgY21yLWZpZWxkLCBpZiBhbnksCi1ieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGlzCi1hY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UuCi0KLVRoZSBtdWx0aXBsaWNpdHkgYW5kIHJvbGUtc291cmNlIGVsZW1lbnQgYXJlIG1hbmRhdG9yeS4KLQotVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGRlc2lnbmF0ZXMgYW4gZW50aXR5Ci1iZWFuIGJ5IG1lYW5zIG9mIGFuIGVqYi1uYW1lIGVsZW1lbnQuIEZvciBiaWRpcmVjdGlvbmFsCi1yZWxhdGlvbnNoaXBzLCBib3RoIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG11c3QgZGVjbGFyZSBhCi1yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB0aGF0IHNwZWNpZmllcyBhIGNtci1maWVsZAotaW4gdGVybXMgb2Ygd2hpY2ggdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZC4gVGhlIGxhY2sgb2YKLWEgY21yLWZpZWxkIGVsZW1lbnQgaW4gYW4gZWpiLXJlbGF0aW9uc2hpcC1yb2xlIHNwZWNpZmllcwotdGhhdCB0aGUgcmVsYXRpb25zaGlwIGlzIHVuaWRpcmVjdGlvbmFsIGluIG5hdmlnYWJpbGl0eSBhbmQKLXRoZSBlbnRpdHkgYmVhbiB0aGF0IHBhcnRpY2lwYXRlcyBpbiB0aGUgcmVsYXRpb25zaGlwIGlzCi0ibm90IGF3YXJlIiBvZiB0aGUgcmVsYXRpb25zaGlwLgotCi1FeGFtcGxlOgotCi08ZWpiLXJlbGF0aW9uPgotICAgIDxlamItcmVsYXRpb24tbmFtZT5Qcm9kdWN0LUxpbmVJdGVtPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cHJvZHVjdC1oYXMtbGluZWl0ZW1zCi0gICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgIDxlamItbmFtZT5Qcm9kdWN0RUpCPC9lamItbmFtZT4KLSAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotPC9lamItcmVsYXRpb24+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSBlbGVtZW50IGRlZmluZXMgYQotICAgICAgICBuYW1lIGZvciBhIHJvbGUgdGhhdCBpcyB1bmlxdWUgd2l0aGluIGFuCi0gICAgICAgIGVqYi1yZWxhdGlvbi4gRGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgY2FuIHVzZSB0aGUKLSAgICAgICAgc2FtZSBuYW1lIGZvciBhIHJvbGUuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im11bHRpcGxpY2l0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bXVsdGlwbGljaXR5VHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1kZWxldGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0LCB3aXRoaW4gYQotICAgICAgICBwYXJ0aWN1bGFyIHJlbGF0aW9uc2hpcCwgdGhlIGxpZmV0aW1lIG9mIG9uZSBvciBtb3JlCi0gICAgICAgIGVudGl0eSBiZWFucyBpcyBkZXBlbmRlbnQgdXBvbiB0aGUgbGlmZXRpbWUgb2YKLSAgICAgICAgYW5vdGhlciBlbnRpdHkgYmVhbi4gVGhlIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgY2FuCi0gICAgICAgIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUKLSAgICAgICAgZWxlbWVudCBjb250YWluZWQgaW4gYW4gZWpiLXJlbGF0aW9uIGVsZW1lbnQgaW4KLSAgICAgICAgd2hpY2ggdGhlIG90aGVyIGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotICAgICAgICBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21yLWZpZWxkIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpjbXItZmllbGRUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGVycHJpc2UtYmVhbnNUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVudGVycHJpc2UtYmVhbnNUeXBlIGRlY2xhcmVzIG9uZSBvciBtb3JlIGVudGVycHJpc2UKLWJlYW5zLiBFYWNoIGJlYW4gY2FuIGJlIGEgc2Vzc2lvbiwgZW50aXR5IG9yIG1lc3NhZ2UtZHJpdmVuCi1iZWFuLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlc3Npb24tYmVhblR5cGUiPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mCi0gICAgICAgIGFuIEVKQiByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluCi0gICAgICAgIHRoZSBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotICAgICAgICB0aGUgY29tcG9uZW50LgotCi0gICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItbG9jYWwtcmVmIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLSAgICAgICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLSAgICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0gICAgICAgIHdpdGhpbiB0aGUgY29tcG9uZW50LgotCi0gICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVmIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLSAgICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0gICAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgICAgICBjb21wb25lbnQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotICAgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLSAgICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0gICAgICAgIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLXJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0gICAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0gICAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0gICAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtcmVmIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJlcy1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLSAgICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudi1lbnRyeSIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZW50aXR5LWJlYW5UeXBlIj4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mCi0gICAgICAgIGFuIEVKQiByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluCi0gICAgICAgIHRoZSBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotICAgICAgICB0aGUgY29tcG9uZW50LgotCi0gICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItbG9jYWwtcmVmIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotICAgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0KLSAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktcmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotICAgICAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0gICAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotICAgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLSAgICAgICAgY29tcG9uZW50LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotICAgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLSAgICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0gICAgICAgIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLSAgICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLSAgICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLSAgICAgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlCi0gICAgICAgIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnYtZW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZW52LWVudHJ5LW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRyaXZlbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kcml2ZW4tYmVhblR5cGUiPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1lamItbG9jYWwtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZgotICAgICAgICBhbiBFSkIgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbgotICAgICAgICB0aGUgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLSAgICAgICAgdGhlIGNvbXBvbmVudC4KLQotICAgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgYmUgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLWxvY2FsLXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotICAgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0KLSAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLSAgICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0gICAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgICAgICBjb21wb25lbnQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLW1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotICAgICAgICBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLSAgICAgICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0gICAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgICAgICBjb21wb25lbnQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLSAgICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLSAgICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLSAgICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudi1lbnRyeSIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpjaG9pY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWJlYW5UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVudGl0eS1iZWFuVHlwZSBkZWNsYXJlcyBhbiBlbnRpdHkgYmVhbi4gVGhlIGRlY2xhcmF0aW9uCi1jb25zaXN0cyBvZjoKLQotICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotICAgICAgaWNvbiBmaWxlIG5hbWUKLSAgICAtIGEgdW5pcXVlIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbgotICAgICAgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBob21lCi0gICAgICBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueQotICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIGxvY2FsIGhvbWUgYW5kIGxvY2FsCi0gICAgICBpbnRlcmZhY2VzLCBpZiBhbnkKLSAgICAtIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgLSB0aGUgZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZSBtYW5hZ2VtZW50IHR5cGUKLSAgICAtIHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzIG5hbWUKLSAgICAtIGFuIGluZGljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVlbnRyYW5jeQotICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUKLSAgICAgIGVudGl0eSBiZWFuJ3MgY21wLXZlcnNpb24KLSAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MKLSAgICAgIGFic3RyYWN0IHNjaGVtYSBuYW1lCi0gICAgLSBhbiBvcHRpb25hbCBsaXN0IG9mIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcwotICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkKLSAgICAgIGZpZWxkCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50Ci0gICAgICBlbnRyaWVzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQgotICAgICAgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbAotICAgICAgRUpCIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViCi0gICAgICBzZXJ2aWNlIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlCi0gICAgICByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkKLSAgICAgIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0gICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0gICAgICByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UKLSAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIHNldCBvZiBxdWVyeSBkZWNsYXJhdGlvbnMKLSAgICAgIGZvciBmaW5kZXIgYW5kIHNlbGVjdCBtZXRob2RzIGZvciBhbiBlbnRpdHkKLSAgICAgIGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnguCi0gICAgLSBhbiBvcHRpb25hbCBzZXQgb2YgZGVwbG95bWVudC1leHRlbnNpb24KLSAgICAgIGRlY2xhcmF0aW9ucy4KLQotVGhlIG9wdGlvbmFsIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQKLWZvciBhbiBlbnRpdHkgYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlIGFuZAotY21wLXZlcnNpb24gMi54LgotCi1UaGUgb3B0aW9uYWwgcHJpbWtleS1maWVsZCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvcgotaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLgotCi1UaGUgb3B0aW9uYWwgY21wLXZlcnNpb24gZWxlbWVudCBtYXkgYmUgcHJlc2VudCBpbiB0aGUKLWRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLiBJZgotdGhlIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24KLWVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXRzIHZhbHVlIGRlZmF1bHRzIHRvIDIueC4KLQotVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZgotdGhlIGVudGl0eSBiZWFuIGNtcC12ZXJzaW9uIGlzIDEueC4KLQotVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZgotdGhlIGVudGl0eSBiZWFuIGhhcyBhIHJlbW90ZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlLgotCi1UaGUgb3B0aW9uYWwgbG9jYWwtaG9tZSBhbmQgbG9jYWwgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQKLWlmIHRoZSBlbnRpdHkgYmVhbiBoYXMgYSBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2UuCi0KLUVpdGhlciBib3RoIHRoZSBsb2NhbC1ob21lIGFuZCB0aGUgbG9jYWwgZWxlbWVudHMgb3IgYm90aAotdGhlIGhvbWUgYW5kIHRoZSByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQuCi0KLVRoZSBvcHRpb25hbCBxdWVyeSBlbGVtZW50cyBtdXN0IGJlIHByZXNlbnQgaWYgdGhlCi1wZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDIueCBhbmQKLXF1ZXJ5IG1ldGhvZHMgb3RoZXIgdGhhbiBmaW5kQnlQcmltYXJ5S2V5IGhhdmUgYmVlbiBkZWZpbmVkCi1mb3IgdGhlIGVudGl0eSBiZWFuLgotCi1UaGUgb3RoZXIgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlCi1zZW5zZSB0aGF0IHRoZXkgYXJlIG9taXR0ZWQgaWYgdGhlIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0KLWFyZSBlbXB0eS4KLQotQXQgbGVhc3Qgb25lIGNtcC1maWVsZCBlbGVtZW50IG11c3QgYmUgcHJlc2VudCBpbiB0aGUKLWRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZAotdGhlIGNtcC12ZXJzaW9uIGlzIDEueCwgYW5kIG5vbmUgbXVzdCBub3QgYmUgcHJlc2VudCBpZiB0aGUKLWVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQmVhbi4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1uYW1lVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaG9tZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aG9tZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVtb3RlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwtaG9tZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bG9jYWwtaG9tZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpsb2NhbFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLWNsYXNzVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGVyc2lzdGVuY2UtdHlwZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW0ta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHByaW0ta2V5LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlCi0gICAgICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCi0gICAgICAgIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MuCi0KLSAgICAgICAgSWYgdGhlIGRlZmluaXRpb24gb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIGlzCi0gICAgICAgIGRlZmVycmVkIHRvIGRlcGxveW1lbnQgdGltZSwgdGhlIHByaW0ta2V5LWNsYXNzCi0gICAgICAgIGVsZW1lbnQgc2hvdWxkIHNwZWNpZnkgamF2YS5sYW5nLk9iamVjdC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVlbnRyYW50IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSByZWVudHJhbnQgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhbiBlbnRpdHkKLSAgICAgICAgYmVhbiBpcyByZWVudHJhbnQgb3Igbm90LgotCi0gICAgICAgIFRoZSByZWVudHJhbnQgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvCi0gICAgICAgIGZvbGxvd2luZzogdHJ1ZSBvciBmYWxzZQotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXAtdmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y21wLXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhYnN0cmFjdC1zY2hlbWEtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6amF2YS1pZGVudGlmaWVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotICAgICAgICBvZiB0aGUgYWJzdHJhY3Qgc2NoZW1hIHR5cGUgb2YgYW4gZW50aXR5IGJlYW4gd2l0aAotICAgICAgICBjbXAtdmVyc2lvbiAyLnguIEl0IGlzIHVzZWQgaW4gRUpCIFFMIHF1ZXJpZXMuCi0KLSAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBmb3IgYW4gZW50aXR5Ci0gICAgICAgIGJlYW4gd2hvc2UgbG9jYWwgaW50ZXJmYWNlIGlzCi0gICAgICAgIGNvbS5hY21lLmNvbW1lcmNlLk9yZGVyIG1pZ2h0IGJlIE9yZGVyLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXAtZmllbGQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmNtcC1maWVsZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWtleS1maWVsZCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCi0gICAgICAgIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5IGZpZWxkIGZvciBhbiBlbnRpdHkgd2l0aAotICAgICAgICBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4KLQotICAgICAgICBUaGUgcHJpbWtleS1maWVsZCBtdXN0IGJlIG9uZSBvZiB0aGUgZmllbGRzIGRlY2xhcmVkCi0gICAgICAgIGluIHRoZSBjbXAtZmllbGQgZWxlbWVudCwgYW5kIHRoZSB0eXBlIG9mIHRoZSBmaWVsZAotICAgICAgICBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBwcmltYXJ5IGtleSB0eXBlLgotCi0gICAgICAgIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgbm90IHVzZWQgaWYgdGhlIHByaW1hcnkKLSAgICAgICAga2V5IG1hcHMgdG8gbXVsdGlwbGUgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0gICAgICAgIChpLmUuIHRoZSBrZXkgaXMgYSBjb21wb3VuZCBrZXkpLiBJbiB0aGlzIGNhc2UsIHRoZQotICAgICAgICBmaWVsZHMgb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLCBhbmQKLSAgICAgICAgdGhlaXIgbmFtZXMgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBmaWVsZCBuYW1lcyBvZgotICAgICAgICB0aGUgZW50aXR5IGJlYW4gY2xhc3MgdGhhdCBjb21wcmlzZSB0aGUga2V5LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVudi1lbnRyeVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1sb2NhbC1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1sb2NhbC1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlcnZpY2UtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VjdXJpdHktaWRlbnRpdHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXNvdXJjZS1lbnYtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnF1ZXJ5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXhjbHVkZS1saXN0VHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBleGNsdWRlLWxpc3RUeXBlIHNwZWNpZmllcyBvbmUgb3IgbW9yZSBtZXRob2RzIHdoaWNoCi10aGUgQXNzZW1ibGVyIG1hcmtzIHRvIGJlIHVuY2FsbGFibGUuCi0KLUlmIHRoZSBtZXRob2QgcGVybWlzc2lvbiByZWxhdGlvbiBjb250YWlucyBtZXRob2RzIHRoYXQgYXJlCi1pbiB0aGUgZXhjbHVkZSBsaXN0LCB0aGUgRGVwbG95ZXIgc2hvdWxkIGNvbnNpZGVyIHRob3NlCi1tZXRob2RzIHRvIGJlIHVuY2FsbGFibGUuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImphdmEtdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIGlzIGEgZ2VuZXJpYyB0eXBlIHRoYXQgZGVzaWduYXRlcyBhIEphdmEgcHJpbWl0aXZlCi10eXBlIG9yIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGludGVyZmFjZS90eXBlLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlteXHB7Wn1dKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZHJpdmVuLWJlYW5UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2UtZHJpdmVuIGVsZW1lbnQgZGVjbGFyZXMgYSBtZXNzYWdlLWRyaXZlbgotYmVhbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0gICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0gICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0gICAgICBpY29uIGZpbGUgbmFtZS4KLSAgICAtIGEgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuIGluCi0gICAgICB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgLSB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2luZwotICAgICAgdHlwZQotICAgIC0gdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLSAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZQotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotICAgICAgbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzCi0gICAgICBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudAotICAgICAgZW50cmllcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbCBFSkIKLSAgICAgIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViIHNlcnZpY2UKLSAgICAgIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eQotICAgICAgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzCi0gICAgICBtZXRob2RzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0gICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeQotICAgICAgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZQotICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgZGVwbG95bWVudCBleHRlbnNpb25zCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLWNsYXNzVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnaW5nLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UKLSAgICAgICAgbGlzdGVuZXIgaW50ZXJmYWNlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuLiBJZgotICAgICAgICB0aGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcwotICAgICAgICBhc3N1bWVkIHRvIGJlIGphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zYWN0aW9uLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnRyYW5zYWN0aW9uLXR5cGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbGluayIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmFjdGl2YXRpb24tY29uZmlnVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbnYtZW50cnlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbG9jYWwtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbG9jYWwtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZXJ2aWNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VjdXJpdHktaWRlbnRpdHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXNvdXJjZS1lbnYtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtZXRob2QtaW50ZlR5cGUiPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyBhIG1ldGhvZCBlbGVtZW50IHRvCi1kaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZAotc2lnbmF0dXJlIHRoYXQgYXJlIG11bHRpcGx5IGRlZmluZWQgYWNyb3NzIHRoZSBob21lIGFuZAotY29tcG9uZW50IGludGVyZmFjZXMgKGUuZywgaW4gYm90aCBhbiBlbnRlcnByaXNlIGJlYW4ncwotcmVtb3RlIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9yIGluIGJvdGggYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLWhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLCBldGMuKTsgdGhlIGNvbXBvbmVudCBhbmQgd2ViCi1zZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMsIGFuZCBzbyBvbi4KLQotVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIEhvbWUKLSAgICBSZW1vdGUKLSAgICBMb2NhbEhvbWUKLSAgICBMb2NhbAotICAgIFNlcnZpY2VFbmRwb2ludAotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lIi8+Ci0gICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3RlIi8+Ci0gICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxIb21lIi8+Ci0gICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWwiLz4KLSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRW5kcG9pbnQiLz4KLSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im1ldGhvZC1uYW1lVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtZXRob2QtbmFtZVR5cGUgY29udGFpbnMgYSBuYW1lIG9mIGFuIGVudGVycHJpc2UKLWJlYW4gbWV0aG9kIG9yIHRoZSBhc3RlcmlzayAoKikgY2hhcmFjdGVyLiBUaGUgYXN0ZXJpc2sgaXMKLXVzZWQgd2hlbiB0aGUgZWxlbWVudCBkZW5vdGVzIGFsbCB0aGUgbWV0aG9kcyBvZiBhbgotZW50ZXJwcmlzZSBiZWFuJ3MgY2xpZW50IHZpZXcgaW50ZXJmYWNlcy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtcGFyYW1zVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtZXRob2QtcGFyYW1zVHlwZSBkZWZpbmVzIGEgbGlzdCBvZiB0aGUKLWZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZXMgb2YgdGhlIG1ldGhvZCBwYXJhbWV0ZXJzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtcGFyYW0iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmphdmEtdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXRob2QtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIHByaW1pdGl2ZQotICAgICAgICBvciBhIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZSBvZiBhIG1ldGhvZAotICAgICAgICBwYXJhbWV0ZXIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtcGVybWlzc2lvblR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlIHNwZWNpZmllcyB0aGF0IG9uZSBvciBtb3JlCi1zZWN1cml0eSByb2xlcyBhcmUgYWxsb3dlZCB0byBpbnZva2Ugb25lIG9yIG1vcmUgZW50ZXJwcmlzZQotYmVhbiBtZXRob2RzLiBUaGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlIGNvbnNpc3RzIG9mIGFuCi1vcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIHNlY3VyaXR5IHJvbGUgbmFtZXMgb3IgYW4KLWluZGljYXRvciB0byBzdGF0ZSB0aGF0IHRoZSBtZXRob2QgaXMgdW5jaGVja2VkIGZvcgotYXV0aG9yaXphdGlvbiwgYW5kIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMuCi0KLVRoZSBzZWN1cml0eSByb2xlcyB1c2VkIGluIHRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUKLW11c3QgYmUgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cyBvZiB0aGUKLWRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHRoZSBtZXRob2RzIG11c3QgYmUgbWV0aG9kcwotZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSwgY29tcG9uZW50IGFuZC9vciB3ZWIKLXNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmNoZWNrZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbXB0eVR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgdW5jaGVja2VkIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgYSBtZXRob2QgaXMKLSAgICAgICAgICAgIG5vdCBjaGVja2VkIGZvciBhdXRob3JpemF0aW9uIGJ5IHRoZSBjb250YWluZXIKLSAgICAgICAgICAgIHByaW9yIHRvIGludm9jYXRpb24gb2YgdGhlIG1ldGhvZC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbWV0aG9kVHlwZSBpcyB1c2VkIHRvIGRlbm90ZSBhIG1ldGhvZCBvZiBhbiBlbnRlcnByaXNlCi1iZWFuJ3MgaG9tZSwgY29tcG9uZW50LCBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQKLWludGVyZmFjZSwgb3IsIGluIHRoZSBjYXNlIG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbiwgdGhlCi1iZWFuJ3MgbWVzc2FnZSBsaXN0ZW5lciBtZXRob2QsIG9yIGEgc2V0IG9mIHN1Y2gKLW1ldGhvZHMuIFRoZSBlamItbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZQotZW50ZXJwcmlzZSBiZWFucyBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yOyB0aGUKLW9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgYWxsb3dzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYQotbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIHRoYXQgaXMgbXVsdGlwbHkgZGVmaW5lZAotYWNyb3NzIHRoZSBob21lLCBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludAotaW50ZXJmYWNlczsgdGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtZXRob2QKLW5hbWU7IGFuZCB0aGUgb3B0aW9uYWwgbWV0aG9kLXBhcmFtcyBlbGVtZW50cyBpZGVudGlmeSBhCi1zaW5nbGUgbWV0aG9kIGFtb25nIG11bHRpcGxlIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkCi1tZXRob2QgbmFtZS4KLQotVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0eWxlcyBvZiB1c2luZyBtZXRob2RUeXBlIGVsZW1lbnQKLXdpdGhpbiBhIG1ldGhvZCBlbGVtZW50OgotCi0xLgotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotPC9tZXRob2Q+Ci0KLSAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlCi0gICBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSwgY29tcG9uZW50LCBhbmQvb3Igd2ViCi0gICBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMuCi0KLTIuCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLTwvbWV0aG9kPj4KLQotICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mCi0gICB0aGUgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCi0gICBtZXRob2RzIHdpdGggdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGUgZWxlbWVudCBvZgotICAgdGhpcyBzdHlsZSByZWZlcnMgdG8gYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQKLSAgIG5hbWUuCi0KLTMuCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLSAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS0xPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+UEFSQU0tMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAuLi4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS1uPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLSAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEKLSAgIHNldCBvZiBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBuYW1lLiBQQVJBTS0xIHRocm91Z2gKLSAgIFBBUkFNLW4gYXJlIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlcyBvZiB0aGUKLSAgIG1ldGhvZCdzIGlucHV0IHBhcmFtZXRlcnMgKGlmIHRoZSBtZXRob2QgaGFzIG5vIGlucHV0Ci0gICBhcmd1bWVudHMsIHRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQgY29udGFpbnMgbm8KLSAgIG1ldGhvZC1wYXJhbSBlbGVtZW50cykuIEFycmF5cyBhcmUgc3BlY2lmaWVkIGJ5IHRoZQotICAgYXJyYXkgZWxlbWVudCdzIHR5cGUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBhaXIgb2YKLSAgIHNxdWFyZSBicmFja2V0cyAoZS5nLiBpbnRbXVtdKS4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCi0gICBtZXRob2RzIHdpdGggdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGlzIHN0eWxlIHJlZmVycwotICAgdG8gYWxsIG9mIHRoZSBvdmVybG9hZGVkIG1ldGhvZHMuCi0KLUV4YW1wbGVzOgotCi1TdHlsZSAxOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlCi1tZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUsIGNvbXBvbmVudCwKLWFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzOgotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4KLTwvbWV0aG9kPgotCi1TdHlsZSAyOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlCi1jcmVhdGUgbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lCi1pbnRlcmZhY2UocykuCi0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci08L21ldGhvZD4KLQotU3R5bGUgMzogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gdGhlCi1jcmVhdGUoU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIExhc3ROYW1lKSBtZXRob2Qgb2YgdGhlCi1FbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlKHMpLgotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBhIFN0eWxlIDMgZWxlbWVudCB3aXRoCi1tb3JlIGNvbXBsZXggcGFyYW1ldGVyIHR5cGVzLiBUaGUgbWV0aG9kCi1mb29iYXIoY2hhciBzLCBpbnQgaSwgaW50W10gaWFyLCBteXBhY2thZ2UuTXlDbGFzcyBteWNsLAotbXlwYWNrYWdlLk15Q2xhc3NbXVtdIG15Y2xhYXIpIHdvdWxkIGJlIHNwZWNpZmllZCBhczoKLQotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLW5hbWU+Zm9vYmFyPC9tZXRob2QtbmFtZT4KLSAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5jaGFyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+aW50PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+aW50W108L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzczwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzW11bXTwvbWV0aG9kLXBhcmFtPgotICAgIDwvbWV0aG9kLXBhcmFtcz4KLTwvbWV0aG9kPgotCi1UaGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aGVuIGl0IGJlY29tZXMKLW5lY2Vzc2FyeSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBtZXRob2QgdGhhdCBpcyBtdWx0aXBseQotZGVmaW5lZCBhY3Jvc3MgdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUsIGNvbXBvbmVudCwgYW5kL29yCi13ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQKLXNpZ25hdHVyZS4KLQotRm9yIGV4YW1wbGUsIHRoZSBtZXRob2QgZWxlbWVudAotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLWNhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykKLW1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlIGZyb20gdGhlCi1jcmVhdGUoU3RyaW5nLCBTdHJpbmcpIG1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaG9tZQotaW50ZXJmYWNlLCB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLWFuZCB0aGUgY3JlYXRlIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQgaW4gdGhlIGxvY2FsIGhvbWUKLWludGVyZmFjZSB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0gICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICA8L21ldGhvZC1wYXJhbXM+Ci08L21ldGhvZD4KLQotVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2l0aCBhbGwgdGggcmVlIFN0eWxlcwotb2YgdGhlIG1ldGhvZCBlbGVtZW50IHVzYWdlLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwotbWV0aG9kIGVsZW1lbnQgZXhhbXBsZSBjb3VsZCBiZSB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUKLW1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgcmVtb3RlIGhvbWUgaW50ZXJmYWNlLgotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci08L21ldGhvZD4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1pbnRmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXRob2QtaW50ZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1ldGhvZC1uYW1lVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWV0aG9kLXBhcmFtc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtdWx0aXBsaWNpdHlUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG11bHRpcGxpY2l0eVR5cGUgZGVzY3JpYmVzIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlCi1yb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb24uCi0KLVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotICAgIE9uZQotICAgIE1hbnkKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnkiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcGVyc2lzdGVuY2UtdHlwZVR5cGUgc3BlY2lmaWVzIGFuIGVudGl0eSBiZWFuJ3MgcGVyc2lzdGVuY2UKLW1hbmFnZW1lbnQgdHlwZS4KLQotVGhlIHBlcnNpc3RlbmNlLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotICAgIEJlYW4KLSAgICBDb250YWluZXIKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbiIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LW1ldGhvZFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcXVlcnktbWV0aG9kIHNwZWNpZmllcyB0aGUgbWV0aG9kIGZvciBhIGZpbmRlciBvciBzZWxlY3QKLXF1ZXJ5LgotCi1UaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBmaW5kZXIgb3Igc2VsZWN0Ci1tZXRob2QgaW4gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0KLUVhY2ggbWV0aG9kLXBhcmFtIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBxdWVyeS1tZXRob2QgdXNpbmcgdGhlCi1tZXRob2QtcGFyYW1zIGVsZW1lbnQuCi0KLUl0IGlzIHVzZWQgYnkgdGhlIHF1ZXJ5LW1ldGhvZCBlbGVtZW50LgotCi1FeGFtcGxlOgotCi08cXVlcnk+Ci0gICAgPGRlc2NyaXB0aW9uPk1ldGhvZCBmaW5kcyBsYXJnZSBvcmRlcnM8L2Rlc2NyaXB0aW9uPgotICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgIDxtZXRob2QtbmFtZT5maW5kTGFyZ2VPcmRlcnM8L21ldGhvZC1uYW1lPgotICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgPGVqYi1xbD5TRUxFQ1QgT0JKRUNUKG8pIEZST00gT3JkZXIgbyBXSEVSRSBvLmFtb3VudCAmZ3Q7IDEwMDA8L2VqYi1xbD4KLTwvcXVlcnk+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXRob2QtbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wYXJhbXMiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1ldGhvZC1wYXJhbXNUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5VHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBxdWVyeVR5cGUgZGVmaW5lcyBhIGZpbmRlciBvciBzZWxlY3QKLXF1ZXJ5LiBJdCBjb250YWlucwotICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHF1ZXJ5Ci0gICAgLSB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmluZGVyIG9yIHNlbGVjdAotICAgICAgbWV0aG9kIGl0IGlzIHVzZWQgYnkKLSAgICAgICAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSByZXN1bHQgdHlwZQotICAgICAgICAgIG1hcHBpbmcsIGlmIHRoZSBxdWVyeSBpcyBmb3IgYSBzZWxlY3QgbWV0aG9kCi0gICAgICAgICAgYW5kIGVudGl0eSBvYmplY3RzIGFyZSByZXR1cm5lZC4KLSAgICAgICAgLSB0aGUgRUpCIFFMIHF1ZXJ5IHN0cmluZyB0aGF0IGRlZmluZXMgdGhlIHF1ZXJ5LgotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgZGVwbG95bWVudCBleHRlbnNpb25zCi0KLVF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMIG11c3QgdXNlIHRoZSBlamItcWwKLWVsZW1lbnQgdG8gc3BlY2lmeSB0aGUgcXVlcnkuIElmIGEgcXVlcnkgaXMgbm90IGV4cHJlc3NpYmxlCi1pbiBFSkIgUUwsIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBiZSB1c2VkIHRvCi1kZXNjcmliZSB0aGUgc2VtYW50aWNzIG9mIHRoZSBxdWVyeSBhbmQgdGhlIGVqYi1xbCBlbGVtZW50Ci1zaG91bGQgYmUgZW1wdHkuCi0KLVRoZSByZXN1bHQtdHlwZS1tYXBwaW5nIGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIEl0IGNhbiBvbmx5Ci1iZSBwcmVzZW50IGlmIHRoZSBxdWVyeS1tZXRob2Qgc3BlY2lmaWVzIGEgc2VsZWN0IG1ldGhvZAotdGhhdCByZXR1cm5zIGVudGl0eSBvYmplY3RzLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZQotcmVzdWx0LXR5cGUtbWFwcGluZyBlbGVtZW50IGlzICJMb2NhbCIuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktbWV0aG9kIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpxdWVyeS1tZXRob2RUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXN1bHQtdHlwZS1tYXBwaW5nIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXN1bHQtdHlwZS1tYXBwaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXFsIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUgZGVzaWduYXRlcyB0aGUgc291cmNlIG9mIGEKLXJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIEEKLXJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUgaXMgdXNlZCBieQotcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnRzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuCi1lbnRpdHkgYmVhbi4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwc1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcmVsYXRpb25zaGlwc1R5cGUgZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXBzIGluCi13aGljaCBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZQotcGFydGljaXBhdGUuIFRoZSByZWxhdGlvbnNoaXBzVHlwZSBjb250YWlucyBhbiBvcHRpb25hbAotZGVzY3JpcHRpb247IGFuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaAotc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1yZWxhdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0icm9sZS1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICByZWxhdGlvbnNoaXAgcm9sZS4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0gICAgICAgIGEgcmVsYXRpb25zaGlwLCBidXQgY2FuIGJlIHJldXNlZCBpbiBkaWZmZXJlbnQKLSAgICAgICAgcmVsYXRpb25zaGlwcy4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvcgotICAgICAgICAgICAgICAgIHhwYXRoPSIuLy9qMmVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkCi0gICAgICAgICAgICAgICAgeHBhdGg9Ii4iLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIGlzIHVzZWQgaW4gdGhlIHF1ZXJ5IGVsZW1lbnQgdG8KLXNwZWNpZnkgd2hldGhlciBhbiBhYnN0cmFjdCBzY2hlbWEgdHlwZSByZXR1cm5lZCBieSBhIHF1ZXJ5Ci1mb3IgYSBzZWxlY3QgbWV0aG9kIGlzIHRvIGJlIG1hcHBlZCB0byBhbiBFSkJMb2NhbE9iamVjdCBvcgotRUpCT2JqZWN0IHR5cGUuCi0KLVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgTG9jYWwKLSAgICBSZW1vdGUKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWwiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3RlIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1pZGVudGl0eVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgc2VjdXJpdHktaWRlbnRpdHlUeXBlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncwotc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLW1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgYmVhbiBvciB3aGV0aGVyIGEgc3BlY2lmaWMgcnVuLWFzCi1pZGVudGl0eSBpcyB0byBiZSB1c2VkLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZS1jYWxsZXItaWRlbnRpdHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbXB0eVR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgdXNlLWNhbGxlci1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB0aGF0Ci0gICAgICAgICAgICB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgYmUgdXNlZCBhcyB0aGUKLSAgICAgICAgICAgIHNlY3VyaXR5IGlkZW50aXR5IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZQotICAgICAgICAgICAgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kcy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJ1bi1hcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJ1bi1hc1R5cGUiLz4KLSAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtcmVmVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRISVMgSVMgQSBQTEFDRUhPTERFUiBUWVBFIHdoaWNoIHdpbGwKLWJlIFJFUExBQ0VELiBJdCB3aWxsIGJlIGRlZmluZWQgYmFzZWQgb24KLWRlZmluaXRpb24gdG8gYmUgc3VwcGxpZWQgYnkgSlNSMTA5LgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWJlYW5UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlc3Npb24tYmVhblR5cGUgZGVjbGFyZXMgYW4gc2Vzc2lvbiBiZWFuLiBUaGUKLWRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0gICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0gICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0gICAgICBpY29uIGZpbGUgbmFtZQotICAgIC0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4KLSAgICAgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0aW9uCi0gICAgLSB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSBob21lIGFuZAotICAgICAgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueQotICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBsb2NhbCBob21lIGFuZAotICAgICAgbG9jYWwgaW50ZXJmYWNlcywgaWYgYW55Ci0gICAgLSB0aGUgbmFtZSBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3Mgd2ViIHNlcnZpY2UgZW5kcG9pbnQKLSAgICAgIGludGVyZmFjZSwgaWYgYW55Ci0gICAgLSB0aGUgc2Vzc2lvbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyBzdGF0ZSBtYW5hZ2VtZW50IHR5cGUKLSAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLSAgICAgIGVudmlyb25tZW50IGVudHJpZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwKLSAgICAgIEVKQiByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYgotICAgICAgc2VydmljZSByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZQotICAgICAgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5Ci0gICAgICB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotICAgICAgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZQotICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gZGVwbG95bWVudCBleHRlbnNpb25zCi0KLVRoZSBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgIm9wdGlvbmFsIiBpbiB0aGUgc2Vuc2UKLXRoYXQgdGhleSBhcmUgb21pdHRlZCB3aGVuIGlmIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlCi1lbXB0eS4KLQotRWl0aGVyIGJvdGggdGhlIGxvY2FsLWhvbWUgYW5kIHRoZSBsb2NhbCBlbGVtZW50cyBvciBib3RoCi10aGUgaG9tZSBhbmQgdGhlIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlCi1zZXNzaW9uIGJlYW4uCi0KLVRoZSBzZXJ2aWNlLWVuZHBvaW50IGVsZW1lbnQgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGlmIHRoZQotYmVhbiBpcyBhIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4uCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmljb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhvbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmhvbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlbW90ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsLWhvbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmxvY2FsLWhvbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bG9jYWxUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHNlcnZpY2UtZW5kcG9pbnQgZWxlbWVudCBjb250YWlucyB0aGUKLSAgICAgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIHdlYgotICAgICAgICBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4gVGhlIHNlcnZpY2UtZW5kcG9pbnQKLSAgICAgICAgZWxlbWVudCBtYXkgb25seSBiZSBzcGVjaWZpZWQgZm9yIGEgc3RhdGVsZXNzCi0gICAgICAgIHNlc3Npb24gYmVhbi4gVGhlIHNwZWNpZmllZCBpbnRlcmZhY2UgbXVzdCBiZSBhCi0gICAgICAgIHZhbGlkIEpBWC1SUEMgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLWNsYXNzVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZXNzaW9uLXR5cGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0cmFuc2FjdGlvbi10eXBlVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbnYtZW50cnlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1sb2NhbC1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1sb2NhbC1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZXJ2aWNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGUtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VjdXJpdHktaWRlbnRpdHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVzb3VyY2UtZW52LXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InNlc3Npb24tdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgc2Vzc2lvbi10eXBlVHlwZSBkZXNjcmliZXMgd2hldGhlciB0aGUgc2Vzc2lvbiBiZWFuIGlzIGEKLXN0YXRlZnVsIHNlc3Npb24gb3Igc3RhdGVsZXNzIHNlc3Npb24uIEl0IGlzIHVzZWQgYnkKLXNlc3Npb24tdHlwZSBlbGVtZW50cy4KLQotVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0gICAgU3RhdGVmdWwKLSAgICBTdGF0ZWxlc3MKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVmdWwiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVsZXNzIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRyYW5zLWF0dHJpYnV0ZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgdHJhbnMtYXR0cmlidXRlVHlwZSBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdAotbWFuYWdlIHRoZSB0cmFuc2FjdGlvbiBib3VuZGFyaWVzIHdoZW4gZGVsZWdhdGluZyBhIG1ldGhvZAotaW52b2NhdGlvbiB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcyBtZXRob2QuCi0KLVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgTm90U3VwcG9ydGVkCi0gICAgU3VwcG9ydHMKLSAgICBSZXF1aXJlZAotICAgIFJlcXVpcmVzTmV3Ci0gICAgTWFuZGF0b3J5Ci0gICAgTmV2ZXIKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90U3VwcG9ydGVkIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBvcnRzIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVkIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVzTmV3Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmRhdG9yeSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXZlciIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSB0cmFuc2FjdGlvbi10eXBlVHlwZSBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLXRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZS4KLQotVGhlIHRyYW5zYWN0aW9uLXR5cGUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLSAgICBCZWFuCi0gICAgQ29udGFpbmVyCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlYW4iLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvajJlZS9qMmVlXzFfNC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL2oyZWVfMV80LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcxNDI3Mi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL2oyZWVfMV80LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0MDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS1HZW5lcmF0ZWQgYnkgVW1pdCBZYWxjaW5hbHAgTWFyY2ggMjAwMi0tPgotPHhzZDpzY2hlbWEKLSAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICB2ZXJzaW9uPSIxLjQiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotQCgjKWoyZWVfMV80LnhzZHMJMS4yMCAwMi8wNy8xMgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCi1Sb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCi1yZXNlcnZlZC4KLQotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLXBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLWxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLWFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi1VLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLVRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLWRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLXdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi1jb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLUphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLUN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLU1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLVN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB0aGF0IGFwcGVhciBpbiB0aGUgY29tbW9uCi1zaGFyZWFibGUgc2NoZW1hKHMpIG9mIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBzaG91bGQgYmUKLWludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY29udGV4dCB0aGV5IGFyZSBpbmNsdWRlZDoKLQotRGVwbG95bWVudCBDb21wb25lbnQgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgIGoyZWUgYXBwbGljYXRpb247Ci0gICAgYXBwbGljYXRpb24gY2xpZW50OwotICAgIHdlYiBhcHBsaWNhdGlvbjsKLSAgICBlbnRlcnByaXNlIGJlYW47Ci0gICAgcmVzb3VyY2UgYWRhcHRlcjsKLQotRGVwbG95bWVudCBGaWxlIG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICBlYXIgZmlsZTsKLSAgICB3YXIgZmlsZTsKLSAgICBqYXIgZmlsZTsKLSAgICByYXIgZmlsZTsKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZGVwbG95bWVudC1leHRlbnNpb25UeXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUKLWV4dGVuc2lvbnMgdG8gdGhlIHNwZWNpZmljIERlcGxveW1lbnQgQ29tcG9uZW50LgotCi1JdCBpcyB1c2VkIGJ5IGRlcGxveW1lbnQtZXh0ZW5zaW9uIGVsZW1lbnRzIHRvIGRlc2lnbmF0ZSBhbgotZXh0ZW5zaW9uIGJsb2NrIHRoYXQgaXMgdGFyZ2V0ZWQgdG8gYSBzcGVjaWZpYyBleHRlbnNpb24KLWRlc2lnbmF0ZWQgYnkgYSBzZXQgb2YgZXh0ZW5zaW9uIGVsZW1lbnRzIHRoYXQgYXJlIGRlY2xhcmVkCi1ieSBhIG5hbWVzcGFjZS4gVGhlIG5hbWVzcGFjZSBpZGVudGlmaWVzIHRoZSBleHRlbnNpb24gdG8KLXRoZSBkZXBsb3ltZW50IHRvb2wgdGhhdCBwcm9jZXNzZXMgdGhlIGV4dGVuc2lvbi4KLQotVGhlIG11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZSBpcyBwcm92aWRlZCBieSB0aGUgQXBwbGljYXRpb24KLUFzc2VtYmxlciB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBleHRlbnNpb24gZGVzY3JpYmVkIGlzIGFuCi1lc3NlbnRpYWwgZXh0ZW5zaW9uIHRoYXQgbXVzdCBleGlzdCBpbiB0aGUgY29udGFpbmVyLiBJZgotbXVzdFVuZGVyc3RhbmQgaXMgInRydWUiLCB0aGUgZGVwbG95bWVudCB0b29sIG11c3QgaW5kaWNhdGUKLWFuIGVycm9yIHdoZW4gcHJvY2Vzc2luZyBhIGRlcGxveW1lbnQtZXh0ZW5zaW9uIGVsZW1lbnQgd2l0aAotYSBuYW1lc3BhY2UgaXQgZG9lcyBub3QgdW5kZXJzdGFuZC4gIEV4dGVuc2lvbnMgdGhhdCBhcmUgbm90Ci1lc3NlbnRpYWwgYXJlIGRlY2xhcmVkIGJ5IGRlZmF1bHQgYXMgb3B0aW9uYWwgZXh0ZW5zaW9ucwotdGhhdCBuZWVkIG5vdCBiZSBwcm92aWRlZCBieSBhIGNvbnRhaW5lci4gIEFwcGxpY2F0aW9ucyB0aGF0Ci11c2Ugc3VjaCBleHRlbnNpb25zIGFyZSBwb3J0YWJsZSB0byBvdGhlciBjb250YWluZXJzIGJlY2F1c2UKLWRlcGxveW1lbnQgdG9vbHMgd2lsbCBpZ25vcmUgZXh0ZW5zaW9ucyB0aGF0IHRoZXkgZG9uJ3QKLXN1cHBvcnQuCi0KLVRoZSB0eXBlIG9mIHRoZSBleHRlbnNpb24tZWxlbWVudCBpcyBhYnN0cmFjdC4gVGhlcmVmb3JlLCBhCi1jb25jcmV0ZSB0eXBlIG11c3QgYmUgc3BlY2lmaWVkIGJ5IHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLXVzaW5nIHhzaTp0eXBlIGF0dHJpYnV0ZSBmb3IgZWFjaCBleHRlbnNpb24tZWxlbWVudC4KLQotVGhlIHZhbHVlIG9mIHRoZSBtdXN0VW5kZXJzdGFuZCBhdHRyaWJ1dGUgaXMgImZhbHNlIgotYnkgZGVmYXVsdC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24tZWxlbWVudCIKLSAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpleHRlbnNpYmxlVHlwZSIKLSAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIKLSAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDphbnlVUkkiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXN0VW5kZXJzdGFuZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlc2NyaXB0aW9uVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBkZXNjcmlwdGlvbiB0eXBlIGlzIHVzZWQgYnkgYSBkZXNjcmlwdGlvbiBlbGVtZW50IHRvCi1wcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZWxlbWVudHMKLXRoYXQgdXNlIHRoaXMgdHlwZSBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUKLURlcGxveW1lbnQgQ29tcG9uZW50J3MgRGVwbG95bWVudCBGaWxlIGZpbGUgcHJvZHVjZXIgd2FudHMKLXRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi1EZXBsb3ltZW50IEZpbGUgKGkuZS4sIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlCi10b29scyB1c2VkIGJ5IHN1Y2ggYSBEZXBsb3ltZW50IEZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5Ci10aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0Ci1jb250YWlucyB0aGUgZGVzY3JpcHRpb24uCi0KLVRoZSBsYW5nIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsYW5ndWFnZSB0aGF0IHRoZQotZGVzY3JpcHRpb24gaXMgcHJvdmlkZWQgaW4uIFRoZSBkZWZhdWx0IHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkZXdleS12ZXJzaW9uVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgdHlwZSBkZWZpbmVzIGEgZGV3ZXkgZGVjaW1hbCB3aGljaCBpcyB1c2VkCi10byBkZXNjcmliZSB2ZXJzaW9ucyBvZiBkb2N1bWVudHMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+Ci0gICAgICAgIDx4c2Q6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc3BsYXktbmFtZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZGlzcGxheS1uYW1lIHR5cGUgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQKLXRvIGJlIGRpc3BsYXllZCBieSB0b29scy4gSXQgaXMgdXNlZCBieSBkaXNwbGF5LW5hbWUKLWVsZW1lbnRzLiAgVGhlIGRpc3BsYXkgbmFtZSBuZWVkIG5vdCBiZSB1bmlxdWUuCi0KLUV4YW1wbGU6Ci0KLS4uLgotICAgPGRpc3BsYXktbmFtZSB4bWw6bGFuZz0iZW4iPkVtcGxveWVlIFNlbGYgU2VydmljZTwvZGlzcGxheS1uYW1lPgotCi1UaGUgdmFsdWUgb2YgdGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBpcyAiZW4iIChFbmdsaXNoKSBieSBkZWZhdWx0LgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+Ci0gICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iZWpiLWxpbmtUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVqYi1saW5rVHlwZSBpcyB1c2VkIGJ5IGVqYi1saW5rCi1lbGVtZW50cyBpbiB0aGUgZWpiLXJlZiBvciBlamItbG9jYWwtcmVmIGVsZW1lbnRzIHRvIHNwZWNpZnkKLXRoYXQgYW4gRUpCIHJlZmVyZW5jZSBpcyBsaW5rZWQgdG8gZW50ZXJwcmlzZSBiZWFuLgotCi1UaGUgdmFsdWUgb2YgdGhlIGVqYi1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgZWpiLW5hbWUgb2YgYW4KLWVudGVycHJpc2UgYmVhbiBpbiB0aGUgc2FtZSBlamItamFyIGZpbGUgb3IgaW4gYW5vdGhlciBlamItamFyCi1maWxlIGluIHRoZSBzYW1lIEoyRUUgYXBwbGljYXRpb24gdW5pdC4KLQotQWx0ZXJuYXRpdmVseSwgdGhlIG5hbWUgaW4gdGhlIGVqYi1saW5rIGVsZW1lbnQgbWF5IGJlIGNvbXBvc2VkIG9mIGEKLXBhdGggbmFtZSBzcGVjaWZ5aW5nIHRoZSBlamItamFyIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZQotYmVhbiB3aXRoIHRoZSBlamItbmFtZSBvZiB0aGUgdGFyZ2V0IGJlYW4gYXBwZW5kZWQgYW5kIHNlcGFyYXRlZCBmcm9tCi10aGUgcGF0aCBuYW1lIGJ5ICIjIi4gIFRoZSBwYXRoIG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIERlcGxveW1lbnQgRmlsZQotY29udGFpbmluZyBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0IGlzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4uCi1UaGlzIGFsbG93cyBtdWx0aXBsZSBlbnRlcnByaXNlIGJlYW5zIHdpdGggdGhlIHNhbWUgZWpiLW5hbWUgdG8gYmUKLXVuaXF1ZWx5IGlkZW50aWZpZWQuCi0KLUV4YW1wbGVzOgotCi0gICAgPGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC9lamItbGluaz4KLQotICAgIDxlamItbGluaz4uLi9wcm9kdWN0cy9wcm9kdWN0LmphciNQcm9kdWN0RUpCPC9lamItbGluaz4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItbG9jYWwtcmVmVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBlamItbG9jYWwtcmVmVHlwZSBpcyB1c2VkIGJ5IGVqYi1sb2NhbC1yZWYgZWxlbWVudHMgZm9yCi10aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwKLWhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAgICAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiB0aGUgRGVwbG95bWVudAotICAgICAgQ29tcG9uZW50IHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuCi0gICAgLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLSAgICAtIHRoZSBleHBlY3RlZCBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9mIHRoZQotICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLSAgICAtIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlCi0gICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLXJlZi1uYW1lVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVmLXR5cGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbC1ob21lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpsb2NhbC1ob21lVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmxvY2FsVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWxpbmsiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1saW5rVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iZWpiLXJlZi1uYW1lVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLXJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlCi1EZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLWphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLURlcGxveW1lbnQgQ29tcG9uZW50LgotCi1JdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLUV4YW1wbGU6Ci0KLTxlamItcmVmLW5hbWU+ZWpiL1BheXJvbGw8L2VqYi1yZWYtbmFtZT4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6am5kaS1uYW1lVHlwZSIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlamItcmVmLXR5cGVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVqYi1yZWYtdHlwZVR5cGUgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlCi1yZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KLQotVGhlIGVqYi1yZWYtdHlwZSBkZXNpZ25hdGVzIGEgdmFsdWUKLXRoYXQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIEVudGl0eQotICAgIFNlc3Npb24KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlc3Npb24iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWZUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVqYi1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLXJlZiBlbGVtZW50cyBmb3IgdGhlCi1kZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBob21lLiBUaGUKLWRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0gICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgIC0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mCi0gICAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlCi0gICAgICBiZWFuCi0gICAgLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLSAgICAtIHRoZSBleHBlY3RlZCBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyBvZiB0aGUgcmVmZXJlbmNlZAotICAgICAgZW50ZXJwcmlzZSBiZWFuCi0gICAgLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZQotICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1yZWYtbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLXJlZi10eXBlVHlwZSIvPgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJob21lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpob21lVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVtb3RlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZW1vdGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbGluayIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLWxpbmtUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1wdHlUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhpcyB0eXBlIGlzIHVzZWQgdG8gZGVzaWduYXRlIGFuIGVtcHR5Ci1lbGVtZW50IHdoZW4gdXNlZC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgdHlwZSBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBvZiB0aGUKLWVudmlyb25tZW50IGVudHJ5IHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQgYnkgdGhlCi1hcHBsaWNhdGlvbidzIGNvZGUuCi0KLVRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZToKLQotICAgIGphdmEubGFuZy5Cb29sZWFuCi0gICAgamF2YS5sYW5nLkJ5dGUKLSAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyCi0gICAgamF2YS5sYW5nLlN0cmluZwotICAgIGphdmEubGFuZy5TaG9ydAotICAgIGphdmEubGFuZy5JbnRlZ2VyCi0gICAgamF2YS5sYW5nLkxvbmcKLSAgICBqYXZhLmxhbmcuRmxvYXQKLSAgICBqYXZhLmxhbmcuRG91YmxlCi0KLUV4YW1wbGU6Ci0KLTxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Cb29sZWFuIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5CeXRlIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5DaGFyYWN0ZXIiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU2hvcnQiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkludGVnZXIiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkxvbmciLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkZsb2F0Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Eb3VibGUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudi1lbnRyeVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZW52LWVudHJ5VHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYW4gYXBwbGljYXRpb24ncwotZW52aXJvbm1lbnQgZW50cnkuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotZGVzY3JpcHRpb24sIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgYW5kIGFuCi1vcHRpb25hbCB2YWx1ZS4gIElmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCwgb25lIG11c3QgYmUKLXN1cHBsaWVkIGR1cmluZyBkZXBsb3ltZW50LgotCi1JdCBpcyB1c2VkIGJ5IGVudi1lbnRyeSBlbGVtZW50cy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6am5kaS1uYW1lVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lCi0gICAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52Ci0gICAgICAgIGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYQotICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudC4gVGhlIHVuaXF1ZW5lc3MKLSAgICAgICAgY29uc3RyYWludHMgbXVzdCBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgZGVjbGFyZWQKLSAgICAgICAgY29udGV4dC4KLQotICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgIDxlbnYtZW50cnktbmFtZT5taW5BbW91bnQ8L2Vudi1lbnRyeS1uYW1lPgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlIi8+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZW52LWVudHJ5LXZhbHVlIGRlc2lnbmF0ZXMgdGhlIHZhbHVlIG9mIGEKLSAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gVGhlIHZhbHVlCi0gICAgICAgIG11c3QgYmUgYSBTdHJpbmcgdGhhdCBpcyB2YWxpZCBmb3IgdGhlCi0gICAgICAgIGNvbnN0cnVjdG9yIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEKLSAgICAgICAgc2luZ2xlIFN0cmluZyBwYXJhbWV0ZXIsIG9yIGZvciBqYXZhLmxhbmcuQ2hhcmFjdGVyLAotICAgICAgICBhIHNpbmdsZSBjaGFyYWN0ZXIuCi0KLSAgICAgICAgRXhhbXBsZToKLQotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPjEwMC4wMDwvZW52LWVudHJ5LXZhbHVlPgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXh0ZW5zaWJsZVR5cGUiIGFic3RyYWN0PSJ0cnVlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGV4dGVuc2libGVUeXBlIGlzIGFuIGFic3RyYWN0IGJhc2UgdHlwZSB3aGljaCBpcyB1c2VkIHRvCi1kZWZpbmUgdGhlIHR5cGUgb2YgZXh0ZW5zaW9uLWVsZW1lbnRzLiBJbnN0YW5jZSBkb2N1bWVudHMKLW11c3Qgc3Vic3RpdHV0ZSBhIGtub3duIHR5cGUgdG8gZGVmaW5lIHRoZSBleHRlbnNpb24gYnkKLXVzaW5nIHhzaTp0eXBlIGF0dHJpYnV0ZSB0byBkZWZpbmUgdGhlIGFjdHVhbCB0eXBlIG9mCi1leHRlbnNpb24tZWxlbWVudHMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWxlbWVudHMgdGhhdCB1c2UgdGhpcyB0eXBlIGRlc2lnbmF0ZSB0aGUgbmFtZSBvZiBhCi1KYXZhIGNsYXNzIG9yIGludGVyZmFjZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImdlbmVyaWMtYm9vbGVhblR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIHR5cGUgZGVmaW5lcyBmb3VyIGRpZmZlcmVudCB2YWx1ZXMgd2hpY2ggY2FuIGRlc2lnbmF0ZQotYm9vbGVhbiB2YWx1ZXMuIFRoaXMgaW5jbHVkZXMgdmFsdWVzIHllcyBhbmQgbm8gd2hpY2ggYXJlCi1ub3QgZGVzaWduYXRlZCBieSB4c2Q6Ym9vbGVhbgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InllcyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJubyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJob21lVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBob21lVHlwZSBkZWZpbmVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZgotYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0KLUV4YW1wbGU6Ci0KLSAgICA8aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvaG9tZT4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWNvblR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgaWNvbiB0eXBlIGNvbnRhaW5zIHNtYWxsLWljb24gYW5kIGxhcmdlLWljb24gZWxlbWVudHMKLXRoYXQgc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGxhcmdlIEdJRiBvcgotSlBFRyBpY29uIGltYWdlcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYQotR1VJIHRvb2wuCi0KLVRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUKLWljb24gZmlsZSBuYW1lcyBhcmUgcHJvdmlkZWQgaW4uIEl0cyB2YWx1ZSBpcyAiZW4iIChFbmdsaXNoKQotYnkgZGVmYXVsdC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic21hbGwtaWNvbiIgdHlwZT0iajJlZTpwYXRoVHlwZSIKLSAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLSAgICAgICAgY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KSBpY29uIGltYWdlLiBUaGUgZmlsZQotICAgICAgICBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQKLSAgICAgICAgQ29tcG9uZW50J3MgRGVwbG95bWVudCBGaWxlLgotCi0gICAgICAgIFRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCi0gICAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCi0gICAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICAgPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGFyZ2UtaWNvbiIgdHlwZT0iajJlZTpwYXRoVHlwZSIKLSAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotICAgICAgICBjb250YWluaW5nIGEgbGFyZ2UKLSAgICAgICAgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZQotICAgICAgICBwYXRoIHdpdGhpbiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50Ci0gICAgICAgIEZpbGUuCi0KLSAgICAgICAgVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLSAgICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLSAgICAgICAgRXhhbXBsZToKLQotICAgICAgICA8bGFyZ2UtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24zMngzMi5qcGc8L2xhcmdlLWljb24+Ci0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImphdmEtaWRlbnRpZmllclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgamF2YS1pZGVudGlmaWVyVHlwZSBkZWZpbmVzIGEgSmF2YSBpZGVudGlmaWVyLgotVGhlIHVzZXJzIG9mIHRoaXMgdHlwZSBzaG91bGQgZnVydGhlciB2ZXJpZnkgdGhhdAotdGhlIGNvbnRlbnQgZG9lcyBub3QgY29udGFpbiBKYXZhIHJlc2VydmVkIGtleXdvcmRzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IigkfF98XHB7TH0pKFxwe0x9fFxwe05kfXxffCQpKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqbmRpLW5hbWVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGpuZGktbmFtZVR5cGUgdHlwZSBkZXNpZ25hdGVzIGEgSk5ESSBuYW1lIGluIHRoZQotRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi1qYXZhOmNvbXAvZW52IGNvbnRleHQuICBBIEpOREkgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlCi1EZXBsb3ltZW50IENvbXBvbmVudC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2FsLWhvbWVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGxvY2FsLWhvbWVUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZAotbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBob21lIGludGVyZmFjZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb2NhbFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbG9jYWxUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCi1lbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBpbnRlcmZhY2UuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIGlzIHVzZWQgdG8gbGluayBhIG1lc3NhZ2UKLWRlc3RpbmF0aW9uIHJlZmVyZW5jZSBvciBtZXNzYWdlLWRyaXZlbiBiZWFuIHRvIGEgbWVzc2FnZQotZGVzdGluYXRpb24uCi0KLVRoZSBBc3NlbWJsZXIgc2V0cyB0aGUgdmFsdWUgdG8gcmVmbGVjdCB0aGUgZmxvdyBvZiBtZXNzYWdlcwotYmV0d2VlbiBwcm9kdWNlcnMgYW5kIGNvbnN1bWVycyBpbiB0aGUgYXBwbGljYXRpb24uCi0KLVRoZSB2YWx1ZSBtdXN0IGJlIHRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgb2YgYSBtZXNzYWdlCi1kZXN0aW5hdGlvbiBpbiB0aGUgc2FtZSBEZXBsb3ltZW50IEZpbGUgb3IgaW4gYW5vdGhlcgotRGVwbG95bWVudCBGaWxlIGluIHRoZSBzYW1lIEoyRUUgYXBwbGljYXRpb24gdW5pdC4KLQotQWx0ZXJuYXRpdmVseSwgdGhlIHZhbHVlIG1heSBiZSBjb21wb3NlZCBvZiBhIHBhdGggbmFtZQotc3BlY2lmeWluZyBhIERlcGxveW1lbnQgRmlsZSBjb250YWluaW5nIHRoZSByZWZlcmVuY2VkCi1tZXNzYWdlIGRlc3RpbmF0aW9uIHdpdGggdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBvZiB0aGUKLWRlc3RpbmF0aW9uIGFwcGVuZGVkIGFuZCBzZXBhcmF0ZWQgZnJvbSB0aGUgcGF0aCBuYW1lIGJ5Ci0iIyIuIFRoZSBwYXRoIG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIERlcGxveW1lbnQgRmlsZQotY29udGFpbmluZyBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0IGlzIHJlZmVyZW5jaW5nIHRoZQotbWVzc2FnZSBkZXN0aW5hdGlvbi4gIFRoaXMgYWxsb3dzIG11bHRpcGxlIG1lc3NhZ2UKLWRlc3RpbmF0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgdG8gYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYSBtZXNzYWdlIGRlc3RpbmF0aW9uCi1hc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiBEZXBsb3ltZW50IENvbXBvbmVudCdzCi1lbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6Ci0KLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgICAgICAtIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lCi0gICAgICAgIC0gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gdHlwZQotICAgICAgICAtIGEgc3BlY2lmaWNhdGlvbiBhcyB0byB3aGV0aGVyIHRoZQotICAgICAgICAgIGRlc3RpbmF0aW9uIGlzIHVzZWQgZm9yCi0gICAgICAgICAgY29uc3VtaW5nIG9yIHByb2R1Y2luZyBtZXNzYWdlcywgb3IgYm90aAotICAgICAgICAtIGEgbGluayB0byB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbgotCi1FeGFtcGxlczoKLQotPG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmPgotICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZQotICAgICAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWU+Ci0gICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlCi0gICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPgotICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZT5Db25zdW1lcwotICAgICAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2U+Ci0gICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbms+Q29ycG9yYXRlU3RvY2tzCi0gICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rPgotPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZj4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6am5kaS1uYW1lVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzCi0gICAgICAgIHRoZSBuYW1lIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cwotICAgICAgICB2YWx1ZSBpcyB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCi0gICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQotICAgICAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlCi0gICAgICAgIHVuaXF1ZSB3aXRoaW4gYW4gZWpiLWphciAoZm9yIGVudGVycHJpc2UgYmVhbnMpIG9yIGEKLSAgICAgICAgRGVwbG95bWVudCBGaWxlIChmb3Igb3RoZXJzKS4KLSAgICAgICAgJSUlCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbGluayIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIHNwZWNpZmllcyB0aGUgdHlwZSBvZgotdGhlIGRlc3RpbmF0aW9uLiBUaGUgdHlwZSBpcyBzcGVjaWZpZWQgYnkgdGhlIEphdmEgaW50ZXJmYWNlCi1leHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVzdGluYXRpb24uCi0KLUV4YW1wbGU6Ci0KLSA8bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZQotIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIHNwZWNpZmllcyB0aGUgdXNlIG9mIHRoZQotbWVzc2FnZSBkZXN0aW5hdGlvbiBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS4gIFRoZSB2YWx1ZQotaW5kaWNhdGVzIHdoZXRoZXIgbWVzc2FnZXMgYXJlIGNvbnN1bWVkIGZyb20gdGhlIG1lc3NhZ2UKLWRlc3RpbmF0aW9uLCBwcm9kdWNlZCBmb3IgdGhlIGRlc3RpbmF0aW9uLCBvciBib3RoLiAgVGhlCi1Bc3NlbWJsZXIgbWFrZXMgdXNlIG9mIHRoaXMgaW5mb3JtYXRpb24gaW4gbGlua2luZyBwcm9kdWNlcnMKLW9mIGEgZGVzdGluYXRpb24gd2l0aCBpdHMgY29uc3VtZXJzLgotCi1UaGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2UgZWxlbWVudCBtdXN0IGJlCi1vbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICBDb25zdW1lcwotICAgIFByb2R1Y2VzCi0gICAgQ29uc3VtZXNQcm9kdWNlcwotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lcyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlcyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lc1Byb2R1Y2VzIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSBzcGVjaWZpZXMgYSBtZXNzYWdlCi1kZXN0aW5hdGlvbi4gVGhlIGxvZ2ljYWwgZGVzdGluYXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMKLWVsZW1lbnQgaXMgbWFwcGVkIHRvIGEgcGh5c2ljYWwgZGVzdGluYXRpb24gYnkgdGhlIERlcGxveWVyLgotCi1UaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiBlbGVtZW50IGNvbnRhaW5zOgotCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAgICAgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5LW5hbWUKLSAgICAgICAgLSBhbiBvcHRpb25hbCBpY29uCi0gICAgICAgIC0gYSBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWUgd2hpY2ggbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgICBhbW9uZyBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWVzIHdpdGhpbiB0aGUgc2FtZQotICAgICAgICAgIERlcGxveW1lbnQgRmlsZS4KLQotRXhhbXBsZToKLQotPG1lc3NhZ2UtZGVzdGluYXRpb24+Ci0gICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+Q29ycG9yYXRlU3RvY2tzCi0gICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPgotPC9tZXNzYWdlLWRlc3RpbmF0aW9uPgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGEKLSAgICAgICAgbmFtZSBmb3IgYSBtZXNzYWdlIGRlc3RpbmF0aW9uLiAgVGhpcyBuYW1lIG11c3QgYmUKLSAgICAgICAgdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiBtZXNzYWdlIGRlc3RpbmF0aW9ucwotICAgICAgICB3aXRoaW4gdGhlIERlcGxveW1lbnQgRmlsZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhcmFtLXZhbHVlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgdHlwZSBpcyBhIGdlbmVyYWwgdHlwZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlY2xhcmUKLXBhcmFtZXRlci92YWx1ZSBsaXN0cy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbS1uYW1lIgotICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0gICAgICAgIHBhcmFtZXRlci4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbS12YWx1ZSIKLSAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEKLSAgICAgICAgcGFyYW1ldGVyLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwYXRoVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBlbGVtZW50cyB0aGF0IHVzZSB0aGlzIHR5cGUgZGVzaWduYXRlIGVpdGhlciBhIHJlbGF0aXZlCi1wYXRoIG9yIGFuIGFic29sdXRlIHBhdGggc3RhcnRpbmcgd2l0aCBhICIvIi4KLQotSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLXNhbWUgRGVwbG95bWVudCBGaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi10aGUgRGVwbG95bWVudCBGaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLAotdGhvc2Ugc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZgotdGhlIERlcGxveW1lbnQgRmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzCi1hcmUgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi1uYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InJlbW90ZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lCi1vZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZS4KLQotRXhhbXBsZToKLQotICAgIDxyZW1vdGU+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZTwvcmVtb3RlPgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InJlcy1hdXRoVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSByZXMtYXV0aFR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50Ci1jb2RlIHNpZ25zIG9uIHByb2dyYW1tYXRpY2FsbHkgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIsIG9yCi13aGV0aGVyIHRoZSBDb250YWluZXIgd2lsbCBzaWduIG9uIHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyCi1vbiBiZWhhbGYgb2YgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50LiBJbiB0aGUgbGF0dGVyIGNhc2UsCi10aGUgQ29udGFpbmVyIHVzZXMgaW5mb3JtYXRpb24gdGhhdCBpcyBzdXBwbGllZCBieSB0aGUKLURlcGxveWVyLgotCi1UaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLSAgICBBcHBsaWNhdGlvbgotICAgIENvbnRhaW5lcgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbiIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0icmVzLXNoYXJpbmctc2NvcGVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHJlcy1zaGFyaW5nLXNjb3BlIHR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgY29ubmVjdGlvbnMKLW9idGFpbmVkIHRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbgotZmFjdG9yeSByZWZlcmVuY2UgY2FuIGJlIHNoYXJlZC4gVGhlIHZhbHVlLCBpZiBzcGVjaWZpZWQsCi1tdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotICAgIFNoYXJlYWJsZQotICAgIFVuc2hhcmVhYmxlCi0KLVRoZSBkZWZhdWx0IHZhbHVlIGlzIFNoYXJlYWJsZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVhYmxlIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc2hhcmVhYmxlIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSByZXNvdXJjZS1lbnYtcmVmVHlwZSBpcyB1c2VkIHRvIGRlZmluZQotcmVzb3VyY2UtZW52LXR5cGUgZWxlbWVudHMuICBJdCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEKLURlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QKLWFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi1lbnZpcm9ubWVudC4gIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUKLXJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZgotdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlIGV4cGVjdGVkIGJ5IHRoZQotRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4KLQotRXhhbXBsZToKLQotPHJlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZQotICAgIDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlCi0gICAgPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci08L3Jlc291cmNlLWVudi1yZWY+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpqbmRpLW5hbWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotICAgICAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0gICAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLSAgICAgICAgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkKLSAgICAgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0Ci0gICAgICAgIGJlIHVuaXF1ZSB3aXRoaW4gYSBEZXBsb3ltZW50IENvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlCi0gICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlLiAgSXQgaXMgdGhlCi0gICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBsYW5ndWFnZSBjbGFzcyBvcgotICAgICAgICBpbnRlcmZhY2UuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlLXJlZlR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcmVzb3VyY2UtcmVmVHlwZSBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEKLURlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLiBJdAotY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBtYW5hZ2VyCi1jb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIG5hbWUsIHRoZSBpbmRpY2F0aW9uIG9mIHRoZQotcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgdHlwZSBleHBlY3RlZCBieSB0aGUKLURlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUsIHRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uCi0oQXBwbGljYXRpb24gb3IgQ29udGFpbmVyKSwgYW5kIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YKLXRoZSBzaGFyZWFiaWxpdHkgb2YgY29ubmVjdGlvbnMgb2J0YWluZWQgZnJvbSB0aGUgcmVzb3VyY2UKLShTaGFyZWFibGUgb3IgVW5zaGFyZWFibGUpLgotCi1FeGFtcGxlOgotCi08cmVzb3VyY2UtcmVmPgotICAgIDxyZXMtcmVmLW5hbWU+amRiYy9FbXBsb3llZUFwcERCPC9yZXMtcmVmLW5hbWU+Ci0gICAgPHJlcy10eXBlPmphdmF4LnNxbC5EYXRhU291cmNlPC9yZXMtdHlwZT4KLSAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLTwvcmVzb3VyY2UtcmVmPgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1yZWYtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6am5kaS1uYW1lVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotICAgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuCi0gICAgICAgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0gICAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIERlcGxveW1lbnQgRmlsZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXMtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSByZXMtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YQotICAgICAgICBzb3VyY2UuIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgZnVsbHkgcXVhbGlmaWVkCi0gICAgICAgIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3IgaW50ZXJmYWNlCi0gICAgICAgIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkYXRhIHNvdXJjZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXMtYXV0aCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVzLWF1dGhUeXBlIi8+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1zaGFyaW5nLXNjb3BlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXMtc2hhcmluZy1zY29wZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InJvbGUtbmFtZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcm9sZS1uYW1lVHlwZSBkZXNpZ25hdGVzIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KLQotVGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhbiBOTVRPS0VOLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJ1bi1hc1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcnVuLWFzVHlwZSBzcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZQotdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiBhIGNvbXBvbmVudC4gSXQgY29udGFpbnMgYW4KLW9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cm9sZS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBzZWN1cml0eS1yb2xlLXJlZlR5cGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEKLXNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIGluIGEgY29tcG9uZW50J3Mgb3IgYQotRGVwbG95bWVudCBDb21wb25lbnQncyBjb2RlLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4KLW9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lIHVzZWQgaW4gdGhlCi1jb2RlLCBhbmQgYW4gb3B0aW9uYWwgbGluayB0byBhIHNlY3VyaXR5IHJvbGUuIElmIHRoZQotc2VjdXJpdHkgcm9sZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgRGVwbG95ZXIgbXVzdCBjaG9vc2UgYW4KLWFwcHJvcHJpYXRlIHNlY3VyaXR5IHJvbGUuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyb2xlLW5hbWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSByb2xlLW5hbWUgZWxlbWVudCBtdXN0IGJlIHRoZSBTdHJpbmcgdXNlZAotICAgICAgICBhcyB0aGUgcGFyYW1ldGVyIHRvIHRoZQotICAgICAgICBFSkJDb250ZXh0LmlzQ2FsbGVySW5Sb2xlKFN0cmluZyByb2xlTmFtZSkgbWV0aG9kIG9yIHRoZQotICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QuaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSBtZXRob2QuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1saW5rIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyb2xlLW5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJvbGUtbGluayBlbGVtZW50IGlzIGEgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZAotICAgICAgICBzZWN1cml0eSByb2xlLiBUaGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBjb250YWluCi0gICAgICAgIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUKLSAgICAgICAgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LXJvbGVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlY3VyaXR5LXJvbGVUeXBlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgc2VjdXJpdHkKLXJvbGUuIFRoZSBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZQotc2VjdXJpdHkgcm9sZSwgYW5kIHRoZSBzZWN1cml0eSByb2xlIG5hbWUuCi0KLUV4YW1wbGU6Ci0KLSAgICA8c2VjdXJpdHktcm9sZT4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoaXMgcm9sZSBpbmNsdWRlcyBhbGwgZW1wbG95ZWVzIHdobyBhcmUgYXV0aG9yaXplZAotICAgICAgICB0byBhY2Nlc3MgdGhlIGVtcGxveWVlIHNlcnZpY2UgYXBwbGljYXRpb24uCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8cm9sZS1uYW1lPmVtcGxveWVlPC9yb2xlLW5hbWU+Ci0gICAgPC9zZWN1cml0eS1yb2xlPgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InN0cmluZyI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgaXMgYSBzcGVjaWFsIHN0cmluZyBkYXRhdHlwZSB0aGF0IGlzIGRlZmluZWQgYnkgSjJFRSBhcwotYSBiYXNlIHR5cGUgZm9yIGRlZmluaW5nIGNvbGxhcHNlZCBzdHJpbmdzLiBXaGVuIHNjaGVtYXMKLXJlcXVpcmUgdHJhaWxpbmcvbGVhZGluZyBzcGFjZSBlbGltaW5hdGlvbiBhcyB3ZWxsIGFzCi1jb2xsYXBzaW5nIHRoZSBleGlzdGluZyB3aGl0ZXNwYWNlLCB0aGlzIGJhc2UgdHlwZSBtYXkgYmUKLXVzZWQuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0cnVlLWZhbHNlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgc2ltcGxlIHR5cGUgZGVzaWduYXRlcyBhIGJvb2xlYW4gd2l0aCBvbmx5IHR3bwotcGVybWlzc2libGUgdmFsdWVzCi0KLS0gdHJ1ZQotLSBmYWxzZQotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9Iih0cnVlfGZhbHNlKSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0idXJsLXBhdHRlcm5UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHVybC1wYXR0ZXJuVHlwZSBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlIG1hcHBpbmcuIEl0IG11c3QKLWZvbGxvdyB0aGUgcnVsZXMgc3BlY2lmaWVkIGluIFNlY3Rpb24gMTEuMiBvZiB0aGUgU2VydmxldCBBUEkKLVNwZWNpZmljYXRpb24uCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ3YXItcGF0aFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWxlbWVudHMgdGhhdCB1c2UgdGhpcyB0eXBlIGRlc2lnbmF0ZSBhIHBhdGggc3RhcnRpbmcKLXdpdGggYSAiLyIgYW5kIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIGEgV0FSCi1maWxlLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9Ii8uKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2oyZWUvanNwXzJfMC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL2pzcF8yXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWQ1NjY4Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2oyZWUvanNwXzJfMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICB2ZXJzaW9uPSIyLjAiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotQCgjKWpzcF8yXzAueHNkcwkxLjEwIDA4LzIwLzAyCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1Db3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLVJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLXJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1yZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLVUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci1tYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLWNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgSlNQIDIuMCBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLXR5cGVzLiAgVGhlIEpTUCAyLjAgc2NoZW1hIGNvbnRhaW5zIGFsbCB0aGUgc3BlY2lhbAotc3RydWN0dXJlcyBhbmQgZGF0YXR5cGVzIHRoYXQgYXJlIG5lY2Vzc2FyeSB0byB1c2UgSlNQIGZpbGVzCi1mcm9tIGEgd2ViIGFwcGxpY2F0aW9uLgotCi1UaGUgY29udGVudHMgb2YgdGhpcyBzY2hlbWEgaXMgdXNlZCBieSB0aGUgd2ViLWFwcF8yXzQueHNkCi1maWxlIHRvIGRlZmluZSBKU1Agc3BlY2lmaWMgY29udGVudC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQotZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0gIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpzcC1jb25maWdUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGpzcC1jb25maWdUeXBlIGlzIHVzZWQgdG8gcHJvdmlkZSBnbG9iYWwgY29uZmlndXJhdGlvbgotaW5mb3JtYXRpb24gZm9yIHRoZSBKU1AgZmlsZXMgaW4gYSB3ZWIgYXBwbGljYXRpb24uIEl0IGhhcwotdHdvIHN1YmVsZW1lbnRzLCB0YWdsaWIgYW5kIGpzcC1wcm9wZXJ0eS1ncm91cC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0YWdsaWJUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpzcC1wcm9wZXJ0eS1ncm91cCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6anNwLXByb3BlcnR5LWdyb3VwVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqc3AtZmlsZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUganNwLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbCBwYXRoIHRvIGEgSlNQIGZpbGUKLXdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGJlZ2lubmluZyB3aXRoIGEgYC8nLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpwYXRoVHlwZSIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLXByb3BlcnR5LWdyb3VwVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBqc3AtcHJvcGVydHktZ3JvdXBUeXBlIGlzIHVzZWQgdG8gZ3JvdXAgYSBudW1iZXIgb2YKLWZpbGVzIHNvIHRoZXkgY2FuIGJlIGdpdmVuIGdsb2JhbCBwcm9wZXJ0eSBpbmZvcm1hdGlvbi4KLUFsbCBmaWxlcyBzbyBkZXNjcmliZWQgYXJlIGRlZW1lZCB0byBiZSBKU1AgZmlsZXMuICBUaGUKLWZvbGxvd2luZyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgY2FuIGJlIGRlc2NyaWJlZDoKLQotICAgIC0gQ29udHJvbCBlbmFibGluZyBvZiBFTCBldmFsdWF0aW9uLgotICAgIC0gQ29udHJvbCBlbmFibGluZyBvZiBTY3JpcHRpbmcgZWxlbWVudHMuCi0gICAgLSBJbmRpY2F0ZSBwYWdlRW5jb2RpbmcgaW5mb3JtYXRpb24uCi0gICAgLSBJbmRpY2F0aW5nIHRoYXQgYSByZXNvdXJjZSBpcyBhIEpTUCBkb2N1bWVudAotICAgIC0gUHJlbHVkZSBhbmQgQ29kYSBhdXRvbWF0aWMgaW5jbHVkZXMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotCQkgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLQkJICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6dXJsLXBhdHRlcm5UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVsLWVuYWJsZWQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IHNldCB0aGUgaXNFTEVuYWJsZWQKLSAgICAgICAgcHJvcGVydHkgb2YgYSBncm91cCBvZiBKU1AgcGFnZXMuICBCeSBkZWZhdWx0LCB0aGUKLSAgICAgICAgRUwgZXZhbHVhdGlvbiBpcyBlbmFibGVkIGZvciBXZWIgQXBwbGljYXRpb25zIHVzaW5nCi0gICAgICAgIGEgU2VydmxldCAyLjQgb3IgZ3JlYXRlciB3ZWIueG1sLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWdlLWVuY29kaW5nIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgdmFsaWQgdmFsdWVzIG9mIHBhZ2UtZW5jb2RpbmcgYXJlIHRob3NlIG9mIHRoZQotICAgICAgICBwYWdlRW5jb2RpbmcgcGFnZSBkaXJlY3RpdmUuIEl0IGlzIGEKLSAgICAgICAgdHJhbnNsYXRpb24tdGltZSBlcnJvciB0byBkZWZpbmUgdGhlIHBhZ2VFbmNvZGluZwotICAgICAgICBvZiBhIEpTUCBwYWdlIHRocm91Z2ggb25lIHZhbHVlIGluIHRoZSBKU1AKLSAgICAgICAgY29uZmlndXJhdGlvbiBlbGVtZW50IGFuZCB0aGVuIGdpdmUgaXQgYSBkaWZmZXJlbnQKLSAgICAgICAgdmFsdWUgaW4gYSBwYWdlRW5jb2RpbmcgZGlyZWN0aXZlLCBidXQgaXQgaXMgbGVnYWwKLSAgICAgICAgdG8gZ2l2ZSBpdCB0aGUgc2FtZSB2YWx1ZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NyaXB0aW5nLWVuYWJsZWQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IHNldCB0aGUgaXNTY3JpcHRpbmdFbmFibGVkCi0gICAgICAgIHByb3BlcnR5IG9mIGEgZ3JvdXAgb2YgSlNQIHBhZ2VzLiAgQnkgZGVmYXVsdCwKLSAgICAgICAgc2NyaXB0aW5nIGlzIGVuYWJsZWQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iaXMteG1sIgotCQkgICAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiCi0JCSAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgSWYgdHJ1ZSwgZGVub3RlcyB0aGF0IHRoZSBncm91cCBvZiByZXNvdXJjZXMKLQl0aGF0IG1hdGNoIHRoZSBVUkwgcGF0dGVybiBhcmUgSlNQIGRvY3VtZW50cywKLQlhbmQgdGh1cyBtdXN0IGJlIGludGVycHJldGVkIGFzIFhNTCBkb2N1bWVudHMuCi0JSWYgZmFsc2UsIHRoZSByZXNvdXJjZXMgYXJlIGFzc3VtZWQgdG8gbm90Ci0JYmUgSlNQIGRvY3VtZW50cywgdW5sZXNzIHRoZXJlIGlzIGFub3RoZXIKLQlwcm9wZXJ0eSBncm91cCB0aGF0IGluZGljYXRlcyBvdGhlcndpc2UuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluY2x1ZGUtcHJlbHVkZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBpbmNsdWRlLXByZWx1ZGUgZWxlbWVudCBpcyBhIGNvbnRleHQtcmVsYXRpdmUKLSAgICAgICAgcGF0aCB0aGF0IG11c3QgY29ycmVzcG9uZCB0byBhbiBlbGVtZW50IGluIHRoZQotICAgICAgICBXZWIgQXBwbGljYXRpb24uICBXaGVuIHRoZSBlbGVtZW50IGlzIHByZXNlbnQsCi0gICAgICAgIHRoZSBnaXZlbiBwYXRoIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCAoYXMKLSAgICAgICAgaW4gYW4gaW5jbHVkZSBkaXJlY3RpdmUpIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaAotICAgICAgICBKU1AgcGFnZSBpbiB0aGlzIGpzcC1wcm9wZXJ0eS1ncm91cC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5jbHVkZS1jb2RhIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpwYXRoVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGluY2x1ZGUtY29kYSBlbGVtZW50IGlzIGEgY29udGV4dC1yZWxhdGl2ZQotICAgICAgICBwYXRoIHRoYXQgbXVzdCBjb3JyZXNwb25kIHRvIGFuIGVsZW1lbnQgaW4gdGhlCi0gICAgICAgIFdlYiBBcHBsaWNhdGlvbi4gIFdoZW4gdGhlIGVsZW1lbnQgaXMgcHJlc2VudCwKLSAgICAgICAgdGhlIGdpdmVuIHBhdGggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIChhcwotICAgICAgICBpbiBhbiBpbmNsdWRlIGRpcmVjdGl2ZSkgYXQgdGhlIGVuZCBvZiBlYWNoCi0gICAgICAgIEpTUCBwYWdlIGluIHRoaXMganNwLXByb3BlcnR5LWdyb3VwLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFnbGliVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLUEgdGFnbGliIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gb24gYSB0YWcKLWxpYnJhcnkgdGhhdCBpcyB1c2VkIGJ5IGEgSlNQIHBhZ2Ugd2l0aGluIHRoZSBXZWIKLUFwcGxpY2F0aW9uLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWItdXJpIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBBIHRhZ2xpYi11cmkgZWxlbWVudCBkZXNjcmliZXMgYSBVUkkgaWRlbnRpZnlpbmcgYQotICAgICAgICB0YWcgbGlicmFyeSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uICBUaGUgYm9keQotICAgICAgICBvZiB0aGUgdGFnbGliLXVyaSBlbGVtZW50IG1heSBiZSBlaXRoZXIgYW4KLSAgICAgICAgYWJzb2x1dGUgVVJJIHNwZWNpZmljYXRpb24sIG9yIGEgcmVsYXRpdmUgVVJJLgotICAgICAgICBUaGVyZSBzaG91bGQgYmUgbm8gZW50cmllcyBpbiB3ZWIueG1sIHdpdGggdGhlCi0gICAgICAgIHNhbWUgdGFnbGliLXVyaSB2YWx1ZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWItbG9jYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgdGhlIHRhZ2xpYi1sb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbgotICAgICAgICAoYXMgYSByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViCi0gICAgICAgIGFwcGxpY2F0aW9uKSB3aGVyZSB0byBmaW5kIHRoZSBUYWcgTGlicmFyeQotICAgICAgICBEZXNjcmlwdGlvbiBmaWxlIGZvciB0aGUgdGFnIGxpYnJhcnkuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9qMmVlL3dlYi1hcHBfMl80LnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2oyZWUvd2ViLWFwcF8yXzQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzhjMTU4Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2oyZWUvd2ViLWFwcF8yXzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjIuNCI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci1AKCMpd2ViLWFwcF8yXzQueHNkcwkxLjM0IDAyLzA4LzAxCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1Db3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLVJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLXJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1yZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLVUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci1tYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLWNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgU2VydmxldCAyLjQgZGVwbG95bWVudAotZGVzY3JpcHRvci4gIEFsbCBTZXJ2bGV0IGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdAotaW5kaWNhdGUgdGhlIHdlYiBhcHBsaWNhdGlvbiBzY2hlbWEgYnkgdXNpbmcgdGhlIEoyRUUKLW5hbWVzcGFjZToKLQotaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCi1hbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci11c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0gICAgPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iLi4uIgotICAgICB2ZXJzaW9uPSIyLjQiPgotICAgIC4uLgotICAgIDwvd2ViLWFwcD4KLQotVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi10aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi1uYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi1odHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZAotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLS0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLSAgc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAgc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0gIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLSAgc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLSAgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0gIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLTx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ianNwXzJfMC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotPHhzZDplbGVtZW50IG5hbWU9IndlYi1hcHAiIHR5cGU9ImoyZWU6d2ViLWFwcFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgd2ViLWFwcCBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBkZXBsb3ltZW50Ci0gICAgZGVzY3JpcHRvciBmb3IgYSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJzZXJ2bGV0LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBzZXJ2bGV0IGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZXJ2bGV0LgotICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnNlcnZsZXQiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpzZXJ2bGV0LW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmaWx0ZXItbmFtZS11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIGZpbHRlciBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsdGVyLgotICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmZpbHRlciIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmZpbHRlci1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0iZWpiLWxvY2FsLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgZWpiLWxvY2FsLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0gICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgd2ViCi0gICAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0gICAgdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItbG9jYWwtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0iZWpiLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0gICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgd2ViCi0gICAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0gICAgdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZgotICAgIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0gICAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gY29kZS4KLSAgICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudgotICAgIGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCi0gICAgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzIHRoZQotICAgIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUuCi0gICAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKLSAgICBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZQotICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0gICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLXJlZiIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJlcy1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHdlYgotICAgIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLSAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZQotICAgIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudi1lbnRyeSIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVudi1lbnRyeS1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6a2V5IG5hbWU9InJvbGUtbmFtZS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBBIHJvbGUtbmFtZS1rZXkgaXMgc3BlY2lmaWVkIHRvIGFsbG93IHRoZSByZWZlcmVuY2VzCi0gICAgZnJvbSB0aGUgc2VjdXJpdHktcm9sZS1yZWZzLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnNlY3VyaXR5LXJvbGUiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyb2xlLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0KLSAgICA8eHNkOmtleXJlZiBuYW1lPSJyb2xlLW5hbWUtcmVmZXJlbmNlcyIKLSAgICAgICAgICAgIHJlZmVyPSJqMmVlOnJvbGUtbmFtZS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCi0gICAgc2VjdXJpdHktcm9sZS1yZWYgdG8gYSBzcGVjaWZpZWQgcm9sZS1uYW1lLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnNlcnZsZXQvajJlZTpzZWN1cml0eS1yb2xlLXJlZiIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJvbGUtbGluayIvPgotICAgIDwveHNkOmtleXJlZj4KLQotPC94c2Q6ZWxlbWVudD4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXV0aC1jb25zdHJhaW50VHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBhdXRoLWNvbnN0cmFpbnRUeXBlIGluZGljYXRlcyB0aGUgdXNlciByb2xlcyB0aGF0Ci1zaG91bGQgYmUgcGVybWl0dGVkIGFjY2VzcyB0byB0aGlzIHJlc291cmNlCi1jb2xsZWN0aW9uLiBUaGUgcm9sZS1uYW1lIHVzZWQgaGVyZSBtdXN0IGVpdGhlciBjb3JyZXNwb25kCi10byB0aGUgcm9sZS1uYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cwotZGVmaW5lZCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIG9yIGJlIHRoZSBzcGVjaWFsbHkKLXJlc2VydmVkIHJvbGUtbmFtZSAiKiIgdGhhdCBpcyBhIGNvbXBhY3Qgc3ludGF4IGZvcgotaW5kaWNhdGluZyBhbGwgcm9sZXMgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gSWYgYm90aCAiKiIKLWFuZCByb2xlbmFtZXMgYXBwZWFyLCB0aGUgY29udGFpbmVyIGludGVycHJldHMgdGhpcyBhcyBhbGwKLXJvbGVzLiAgSWYgbm8gcm9sZXMgYXJlIGRlZmluZWQsIG5vIHVzZXIgaXMgYWxsb3dlZCBhY2Nlc3MKLXRvIHRoZSBwb3J0aW9uIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVzY3JpYmVkIGJ5IHRoZQotY29udGFpbmluZyBzZWN1cml0eS1jb25zdHJhaW50LiAgVGhlIGNvbnRhaW5lciBtYXRjaGVzCi1yb2xlIG5hbWVzIGNhc2Ugc2Vuc2l0aXZlbHkgd2hlbiBkZXRlcm1pbmluZyBhY2Nlc3MuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImF1dGgtbWV0aG9kVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBhdXRoLW1ldGhvZFR5cGUgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCi1tZWNoYW5pc20gZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24uIEFzIGEgcHJlcmVxdWlzaXRlIHRvCi1nYWluaW5nIGFjY2VzcyB0byBhbnkgd2ViIHJlc291cmNlcyB3aGljaCBhcmUgcHJvdGVjdGVkIGJ5Ci1hbiBhdXRob3JpemF0aW9uIGNvbnN0cmFpbnQsIGEgdXNlciBtdXN0IGhhdmUgYXV0aGVudGljYXRlZAotdXNpbmcgdGhlIGNvbmZpZ3VyZWQgbWVjaGFuaXNtLiBMZWdhbCB2YWx1ZXMgYXJlICJCQVNJQyIsCi0iRElHRVNUIiwgIkZPUk0iLCBvciAiQ0xJRU5ULUNFUlQiLgotCi1Vc2VkIGluOiBsb2dpbi1jb25maWcKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkFTSUMiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRElHRVNUIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZPUk0iLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0xJRU5ULUNFUlQiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzcGF0Y2hlclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZGlzcGF0Y2hlciBoYXMgdGhyZWUgbGVnYWwgdmFsdWVzLCBGT1JXQVJEIGFuZCBSRVFVRVNUCi1hbmQgSU5DTFVERS4gQSB2YWx1ZSBvZiBGT1JXQVJEIG1lYW5zIHRoZSBGaWx0ZXIKLXdpbGwgYmUgYXBwbGllZCB1bmRlciBSZXF1ZXN0RGlzcGF0Y2hlci5mb3J3YXJkKCkgY2FsbHMuCi1BIHZhbHVlIG9mIFJFUVVFU1QgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQKLXVuZGVyIG9yZGluYXJ5IGNsaWVudCBjYWxscyB0byB0aGUgcGF0aCBvciBzZXJ2bGV0LiBBIHZhbHVlIG9mCi1JTkNMVURFIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHVuZGVyCi1SZXF1ZXN0RGlzcGF0Y2hlci5pbmNsdWRlKCkgY2FsbHMuCi1UaGUgYWJzZW5jZSBvZiBhbnkgZGlzcGF0Y2hlciBlbGVtZW50cyBpbiBhCi1maWx0ZXItbWFwcGluZyBpbmRpY2F0ZXMgYSBkZWZhdWx0IG9mIGFwcGx5aW5nCi1maWx0ZXJzIG9ubHkgdW5kZXIgb3JkaW5hcnkgY2xpZW50IGNhbGxzIHRvIHRoZSBwYXRoIG9yIHNlcnZsZXQuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZPUldBUkQiLz4KLSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTkNMVURFIi8+Ci0gICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVRVUVTVCIvPgotCi0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVycm9yLWNvZGVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVycm9yLWNvZGUgY29udGFpbnMgYW4gSFRUUCBlcnJvciBjb2RlLCBleDogNDA0Ci0KLVVzZWQgaW46IGVycm9yLXBhZ2UKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InBvc2l0aXZlSW50ZWdlciIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXJyb3ItcGFnZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZXJyb3ItcGFnZVR5cGUgY29udGFpbnMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXJyb3IgY29kZQotb3IgZXhjZXB0aW9uIHR5cGUgdG8gdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbiB0aGUgd2ViCi1hcHBsaWNhdGlvbi4KLQotVXNlZCBpbjogd2ViLWFwcAotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDxjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlcnJvci1jb2RlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplcnJvci1jb2RlVHlwZSIvPgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24tdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBleGNlcHRpb24tdHlwZSBjb250YWlucyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotICAgICAgICBuYW1lIG9mIGEgSmF2YSBleGNlcHRpb24gdHlwZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L2Nob2ljZT4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZQotICAgICAgICByZXNvdXJjZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0gICAgICAgIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYXRpb24gbXVzdCBoYXZlCi0gICAgICAgIGEgbGVhZGluZyBgLycuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWx0ZXItbWFwcGluZ1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1EZWNsYXJhdGlvbiBvZiB0aGUgZmlsdGVyIG1hcHBpbmdzIGluIHRoaXMgd2ViCi1hcHBsaWNhdGlvbiBpcyBkb25lIGJ5IHVzaW5nIGZpbHRlci1tYXBwaW5nVHlwZS4KLVRoZSBjb250YWluZXIgdXNlcyB0aGUgZmlsdGVyLW1hcHBpbmcKLWRlY2xhcmF0aW9ucyB0byBkZWNpZGUgd2hpY2ggZmlsdGVycyB0byBhcHBseSB0byBhIHJlcXVlc3QsCi1hbmQgaW4gd2hhdCBvcmRlci4gVGhlIGNvbnRhaW5lciBtYXRjaGVzIHRoZSByZXF1ZXN0IFVSSSB0bwotYSBTZXJ2bGV0IGluIHRoZSBub3JtYWwgd2F5LiBUbyBkZXRlcm1pbmUgd2hpY2ggZmlsdGVycyB0bwotYXBwbHkgaXQgbWF0Y2hlcyBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgZWl0aGVyIG9uCi1zZXJ2bGV0LW5hbWUsIG9yIG9uIHVybC1wYXR0ZXJuIGZvciBlYWNoIGZpbHRlci1tYXBwaW5nCi1lbGVtZW50LCBkZXBlbmRpbmcgb24gd2hpY2ggc3R5bGUgaXMgdXNlZC4gVGhlIG9yZGVyIGluCi13aGljaCBmaWx0ZXJzIGFyZSBpbnZva2VkIGlzIHRoZSBvcmRlciBpbiB3aGljaAotZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIHRoYXQgbWF0Y2ggYSByZXF1ZXN0IFVSSSBmb3IgYQotc2VydmxldCBhcHBlYXIgaW4gdGhlIGxpc3Qgb2YgZmlsdGVyLW1hcHBpbmcgZWxlbWVudHMuVGhlCi1maWx0ZXItbmFtZSB2YWx1ZSBtdXN0IGJlIHRoZSB2YWx1ZSBvZiB0aGUgZmlsdGVyLW5hbWUKLXN1Yi1lbGVtZW50cyBvZiBvbmUgb2YgdGhlIGZpbHRlciBkZWNsYXJhdGlvbnMgaW4gdGhlCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1uYW1lIgotICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZpbHRlci1uYW1lVHlwZSIvPgotICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp1cmwtcGF0dGVyblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlcnZsZXQtbmFtZVR5cGUiLz4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkaXNwYXRjaGVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZpbHRlci1uYW1lVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGZpbHRlciBpcyBkZWNsYXJlCi1ieSB1c2luZyBmaWx0ZXItbmFtZVR5cGUuIFRoaXMgbmFtZSBpcyB1c2VkIHRvIG1hcCB0aGUKLWZpbHRlci4gIEVhY2ggZmlsdGVyIG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgd2ViCi1hcHBsaWNhdGlvbi4KLQotVXNlZCBpbjogZmlsdGVyLCBmaWx0ZXItbWFwcGluZwotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpbHRlclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZmlsdGVyVHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYSBmaWx0ZXIgaW4gdGhlIHdlYgotYXBwbGljYXRpb24uIFRoZSBmaWx0ZXIgaXMgbWFwcGVkIHRvIGVpdGhlciBhIHNlcnZsZXQgb3IgYQotVVJMIHBhdHRlcm4gaW4gdGhlIGZpbHRlci1tYXBwaW5nIGVsZW1lbnQsIHVzaW5nIHRoZQotZmlsdGVyLW5hbWUgdmFsdWUgdG8gcmVmZXJlbmNlLiBGaWx0ZXJzIGNhbiBhY2Nlc3MgdGhlCi1pbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yIGF0IHJ1bnRpbWUgdmlhIHRoZSBGaWx0ZXJDb25maWcgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTppY29uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXItbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZmlsdGVyLW5hbWVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZmlsdGVyLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtcGFyYW0iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhcmFtLXZhbHVlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzCi0gICAgICAgIGFuIGluaXRpYWxpemF0aW9uIHBhcmFtIG9mIGEgc2VydmxldCBmaWx0ZXIKLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZvcm0tbG9naW4tY29uZmlnVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBmb3JtLWxvZ2luLWNvbmZpZ1R5cGUgc3BlY2lmaWVzIHRoZSBsb2dpbiBhbmQgZXJyb3IKLXBhZ2VzIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW4gZm9ybSBiYXNlZCBsb2dpbi4gSWYgZm9ybSBiYXNlZAotYXV0aGVudGljYXRpb24gaXMgbm90IHVzZWQsIHRoZXNlIGVsZW1lbnRzIGFyZSBpZ25vcmVkLgotCi1Vc2VkIGluOiBsb2dpbi1jb25maWcKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JtLWxvZ2luLXBhZ2UiCi0gICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6d2FyLXBhdGhUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGZvcm0tbG9naW4tcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIgYXBwCi0gICAgICAgIHdoZXJlIHRoZSBwYWdlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2luIGNhbiBiZSBmb3VuZC4KLSAgICAgICAgVGhlIHBhdGggYmVnaW5zIHdpdGggYSBsZWFkaW5nIC8gYW5kIGlzCi0gICAgICAgIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBXQVIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9ybS1lcnJvci1wYWdlIgotICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOndhci1wYXRoVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBmb3JtLWVycm9yLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbgotICAgICAgICB0aGUgd2ViIGFwcCB3aGVyZSB0aGUgZXJyb3IgcGFnZSB0aGF0IGlzIGRpc3BsYXllZAotICAgICAgICB3aGVuIGxvZ2luIGlzIG5vdCBzdWNjZXNzZnVsIGNhbiBiZSBmb3VuZC4KLSAgICAgICAgVGhlIHBhdGggYmVnaW5zIHdpdGggYSBsZWFkaW5nIC8gYW5kIGlzIGludGVycHJldGVkCi0gICAgICAgIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBXQVIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iaHR0cC1tZXRob2RUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDpkb2N1bWVudGF0aW9uPgotVGhlIGh0dHAtbWV0aG9kIGNvbnRhaW5zIGFuIEhUVFAgbWV0aG9kIHJlY29nbml6ZWQgYnkgdGhlIHdlYi1hcHAsIGkuZS4KLShHRVQgfCBQT1NUIHwuLi4pLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRVQiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUE9TVCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVVQiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVMRVRFIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhFQUQiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU9OUyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUkFDRSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibGlzdGVuZXJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGxpc3RlbmVyVHlwZSBpbmRpY2F0ZXMgdGhlIGRlcGxveW1lbnQgcHJvcGVydGllcyBmb3IgYSB3ZWIKLWFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uCi0KLVVzZWQgaW46IHdlYi1hcHA6bGlzdGVuZXJUeXBlCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmljb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxpc3RlbmVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGxpc3RlbmVyLWNsYXNzIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGFzcyBpbiB0aGUKLSAgICAgICAgYXBwbGljYXRpb24gbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgd2ViCi0gICAgICAgIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uIFRoZSB2YWx1ZSBpcyB0aGUgZnVsbHkKLSAgICAgICAgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgbGlzdGVuZXIgY2xhc3MuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0VHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IGNvbnRhaW5zIG9uZSBvciBtb3JlCi1sb2NhbGUtZW5jb2RpbmctbWFwcGluZyhzKS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nIgotICAgICAgICB0eXBlPSJqMmVlOmxvY2FsZS1lbmNvZGluZy1tYXBwaW5nVHlwZSIKLSAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLTwveHNkOnNlcXVlbmNlPgotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZ1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmcgY29udGFpbnMgbG9jYWxlIG5hbWUgYW5kCi1lbmNvZGluZyBuYW1lLiBUaGUgbG9jYWxlIG5hbWUgbXVzdCBiZSBlaXRoZXIgIkxhbmd1YWdlLWNvZGUiLAotc3VjaCBhcyAiamEiLCBkZWZpbmVkIGJ5IElTTy02Mzkgb3IgIkxhbmd1YWdlLWNvZGVfQ291bnRyeS1jb2RlIiwKLXN1Y2ggYXMgImphX0pQIi4gICJDb3VudHJ5IGNvZGUiIGlzIGRlZmluZWQgYnkgSVNPLTMxNjYuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbGUiCi0gICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIi8+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9ImVuY29kaW5nIgotICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyIvPgotPC94c2Q6c2VxdWVuY2U+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2luLWNvbmZpZ1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbG9naW4tY29uZmlnVHlwZSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KLW1ldGhvZCB0aGF0IHNob3VsZCBiZSB1c2VkLCB0aGUgcmVhbG0gbmFtZSB0aGF0IHNob3VsZCBiZQotdXNlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbiwgYW5kIHRoZSBhdHRyaWJ1dGVzIHRoYXQgYXJlCi1uZWVkZWQgYnkgdGhlIGZvcm0gbG9naW4gbWVjaGFuaXNtLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF1dGgtbWV0aG9kIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTphdXRoLW1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWxtLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlYWxtIG5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHJlYWxtIG5hbWUgdG8KLSAgICAgICAgdXNlIGluIEhUVFAgQmFzaWMgYXV0aG9yaXphdGlvbi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9ybS1sb2dpbi1jb25maWciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZvcm0tbG9naW4tY29uZmlnVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1pbWUtbWFwcGluZ1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbWltZS1tYXBwaW5nVHlwZSBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGV4dGVuc2lvbgotYW5kIGEgbWltZSB0eXBlLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGV4dGVuc2lvbiBlbGVtZW50IGNvbnRhaW5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW4KLSAgICAgICAgZXh0ZW5zaW9uLiBleGFtcGxlOiAidHh0IgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtaW1lLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1pbWUtdHlwZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im1pbWUtdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbWltZS10eXBlVHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIGEgZGVmaW5lZCBtaW1lIHR5cGUuCi0KLUV4YW1wbGU6Ci0idGV4dC9wbGFpbiIKLQotVXNlZCBpbjogbWltZS1tYXBwaW5nCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iW1xwe0x9XC1ccHtOZH1dKy9bXHB7TH1cLVxwe05kfVwuXSsiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIGlzIHVzZWQgdG8gYXNzb2NpYXRlCi1zZWN1cml0eSBjb25zdHJhaW50cyB3aXRoIG9uZSBvciBtb3JlIHdlYiByZXNvdXJjZQotY29sbGVjdGlvbnMKLQotVXNlZCBpbjogd2ViLWFwcAotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLXJlc291cmNlLWNvbGxlY3Rpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdXRoLWNvbnN0cmFpbnQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmF1dGgtY29uc3RyYWludFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXItZGF0YS1jb25zdHJhaW50IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp1c2VyLWRhdGEtY29uc3RyYWludFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0LW1hcHBpbmdUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlcnZsZXQtbWFwcGluZ1R5cGUgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhCi1zZXJ2bGV0IGFuZCBhIHVybCBwYXR0ZXJuLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VydmxldC1uYW1lVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsLXBhdHRlcm4iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnVybC1wYXR0ZXJuVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0ic2VydmxldC1uYW1lVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBzZXJ2bGV0LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlCi1zZXJ2bGV0LiBFYWNoIHNlcnZsZXQgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWIKLWFwcGxpY2F0aW9uLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZsZXRUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlcnZsZXRUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhIHNlcnZsZXQuCi1JdCBjb250YWlucyB0aGUgZGVjbGFyYXRpdmUgZGF0YSBvZiBhCi1zZXJ2bGV0LiBJZiBhIGpzcC1maWxlIGlzIHNwZWNpZmllZCBhbmQgdGhlIGxvYWQtb24tc3RhcnR1cAotZWxlbWVudCBpcyBwcmVzZW50LCB0aGVuIHRoZSBKU1Agc2hvdWxkIGJlIHByZWNvbXBpbGVkIGFuZAotbG9hZGVkLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTppY29uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlcnZsZXQtbmFtZVR5cGUiLz4KLSAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBzZXJ2bGV0LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgc2VydmxldC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianNwLWZpbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpqc3AtZmlsZVR5cGUiLz4KLQotICAgICAgICA8L2Nob2ljZT4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGFyYW0tdmFsdWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9hZC1vbi1zdGFydHVwIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhpcwotICAgICAgICBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQgKGluc3RhbnRpYXRlZCBhbmQgaGF2ZQotICAgICAgICBpdHMgaW5pdCgpIGNhbGxlZCkgb24gdGhlIHN0YXJ0dXAgb2YgdGhlIHdlYgotICAgICAgICBhcHBsaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGNvbnRlbnRzIG9mIHRoZXNlCi0gICAgICAgIGVsZW1lbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG9yZGVyIGluCi0gICAgICAgIHdoaWNoIHRoZSBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQuIElmIHRoZSB2YWx1ZQotICAgICAgICBpcyBhIG5lZ2F0aXZlIGludGVnZXIsIG9yIHRoZSBlbGVtZW50IGlzIG5vdAotICAgICAgICBwcmVzZW50LCB0aGUgY29udGFpbmVyIGlzIGZyZWUgdG8gbG9hZCB0aGUgc2VydmxldAotICAgICAgICB3aGVuZXZlciBpdCBjaG9vc2VzLiBJZiB0aGUgdmFsdWUgaXMgYSBwb3NpdGl2ZQotICAgICAgICBpbnRlZ2VyIG9yIDAsIHRoZSBjb250YWluZXIgbXVzdCBsb2FkIGFuZAotICAgICAgICBpbml0aWFsaXplIHRoZSBzZXJ2bGV0IGFzIHRoZSBhcHBsaWNhdGlvbiBpcwotICAgICAgICBkZXBsb3llZC4gVGhlIGNvbnRhaW5lciBtdXN0IGd1YXJhbnRlZSB0aGF0Ci0gICAgICAgIHNlcnZsZXRzIG1hcmtlZCB3aXRoIGxvd2VyIGludGVnZXJzIGFyZSBsb2FkZWQKLSAgICAgICAgYmVmb3JlIHNlcnZsZXRzIG1hcmtlZCB3aXRoIGhpZ2hlciBpbnRlZ2Vycy4gVGhlCi0gICAgICAgIGNvbnRhaW5lciBtYXkgY2hvb3NlIHRoZSBvcmRlciBvZiBsb2FkaW5nIG9mCi0gICAgICAgIHNlcnZsZXRzIHdpdGggdGhlIHNhbWUgbG9hZC1vbi1zdGFydC11cCB2YWx1ZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icnVuLWFzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpydW4tYXNUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlLXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VjdXJpdHktcm9sZS1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbi1jb25maWdUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlc3Npb24tY29uZmlnVHlwZSBkZWZpbmVzIHRoZSBzZXNzaW9uIHBhcmFtZXRlcnMKLWZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLQotVXNlZCBpbjogd2ViLWFwcAotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLXRpbWVvdXQiCi0gICAgICAgICAgICAgICAgIHR5cGU9InhzZDpub25OZWdhdGl2ZUludGVnZXIiCi0gICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBzZXNzaW9uLXRpbWVvdXQgZWxlbWVudCBkZWZpbmVzIHRoZSBkZWZhdWx0Ci0gICAgICAgIHNlc3Npb24gdGltZW91dCBpbnRlcnZhbCBmb3IgYWxsIHNlc3Npb25zIGNyZWF0ZWQKLSAgICAgICAgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZSBzcGVjaWZpZWQgdGltZW91dAotICAgICAgICBtdXN0IGJlIGV4cHJlc3NlZCBpbiBhIHdob2xlIG51bWJlciBvZiBtaW51dGVzLgotICAgICAgICBJZiB0aGUgdGltZW91dCBpcyAwIG9yIGxlc3MsIHRoZSBjb250YWluZXIgZW5zdXJlcwotICAgICAgICB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2Ygc2Vzc2lvbnMgaXMgbmV2ZXIgdG8gdGltZQotICAgICAgICBvdXQuIElmIHRoaXMgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgY29udGFpbmVyCi0gICAgICAgIG11c3Qgc2V0IGl0cyBkZWZhdWx0IHRpbWVvdXQgcGVyaW9kLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSB0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSBzcGVjaWZpZXMgdGhhdCB0aGUgY29tbXVuaWNhdGlvbgotYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yCi1DT05GSURFTlRJQUwuIE5PTkUgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QKLXJlcXVpcmUgYW55IHRyYW5zcG9ydCBndWFyYW50ZWVzLiBBIHZhbHVlIG9mIElOVEVHUkFMIG1lYW5zCi10aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBkYXRhIHNlbnQgYmV0d2VlbiB0aGUKLWNsaWVudCBhbmQgc2VydmVyIGJlIHNlbnQgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbid0IGJlCi1jaGFuZ2VkIGluIHRyYW5zaXQuIENPTkZJREVOVElBTCBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbgotcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBiZSB0cmFuc21pdHRlZCBpbiBhIGZhc2hpb24gdGhhdAotcHJldmVudHMgb3RoZXIgZW50aXRpZXMgZnJvbSBvYnNlcnZpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZQotdHJhbnNtaXNzaW9uLiBJbiBtb3N0IGNhc2VzLCB0aGUgcHJlc2VuY2Ugb2YgdGhlIElOVEVHUkFMIG9yCi1DT05GSURFTlRJQUwgZmxhZyB3aWxsIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiBTU0wgaXMKLXJlcXVpcmVkLgotCi1Vc2VkIGluOiB1c2VyLWRhdGEtY29uc3RyYWludAotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVEVHUkFMIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPTkZJREVOVElBTCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idXNlci1kYXRhLWNvbnN0cmFpbnRUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHVzZXItZGF0YS1jb25zdHJhaW50VHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIGhvdwotZGF0YSBjb21tdW5pY2F0ZWQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBjb250YWluZXIgc2hvdWxkIGJlCi1wcm90ZWN0ZWQuCi0KLVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQtZ3VhcmFudGVlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0id2ViLWFwcC12ZXJzaW9uVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgdHlwZSBjb250YWlucyB0aGUgcmVjb2duaXplZCB2ZXJzaW9ucyBvZgotd2ViLWFwcGxpY2F0aW9uIHN1cHBvcnRlZC4gSXQgaXMgdXNlZCB0byBkZXNpZ25hdGUgdGhlCi12ZXJzaW9uIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLUV4YW1wbGU6Ci0KLTx3ZWItYXBwPgotICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KLS4uLgotPC93ZWItYXBwPgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyLjQiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYi1hcHBUeXBlIj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTppY29uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXN0cmlidXRhYmxlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRleHQtcGFyYW0iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhcmFtLXZhbHVlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgY29udGV4dC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbgotICAgICAgICBvZiBhIHdlYiBhcHBsaWNhdGlvbidzIHNlcnZsZXQgY29udGV4dAotICAgICAgICBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlciIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZmlsdGVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1tYXBwaW5nIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmaWx0ZXItbWFwcGluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdGVuZXIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmxpc3RlbmVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZXJ2bGV0VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW1hcHBpbmciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlcnZsZXQtbWFwcGluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi1jb25maWciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlc3Npb24tY29uZmlnVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWltZS1tYXBwaW5nIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptaW1lLW1hcHBpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlbGNvbWUtZmlsZS1saXN0IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp3ZWxjb21lLWZpbGUtbGlzdFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVycm9yLXBhZ2UiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVycm9yLXBhZ2VUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpzcC1jb25maWciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmpzcC1jb25maWdUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXNvdXJjZS1lbnYtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVzb3VyY2UtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1jb25zdHJhaW50IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZWN1cml0eS1jb25zdHJhaW50VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dpbi1jb25maWciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmxvZ2luLWNvbmZpZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZW52LWVudHJ5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbG9jYWwtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbG9jYWwtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6d2ViLWFwcC12ZXJzaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2ViLXJlc291cmNlLWNvbGxlY3Rpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgc3Vic2V0Ci1vZiB0aGUgcmVzb3VyY2VzIGFuZCBIVFRQIG1ldGhvZHMgb24gdGhvc2UgcmVzb3VyY2VzIHdpdGhpbgotYSB3ZWIgYXBwbGljYXRpb24gdG8gd2hpY2ggYSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMuIElmCi1ubyBIVFRQIG1ldGhvZHMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgc2VjdXJpdHkgY29uc3RyYWludAotYXBwbGllcyB0byBhbGwgSFRUUCBtZXRob2RzLgotCi1Vc2VkIGluOiBzZWN1cml0eS1jb25zdHJhaW50Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYi1yZXNvdXJjZS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgd2ViLXJlc291cmNlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcyB3ZWIKLSAgICAgICAgcmVzb3VyY2UgY29sbGVjdGlvbi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6dXJsLXBhdHRlcm5UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imh0dHAtbWV0aG9kIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpodHRwLW1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VsY29tZS1maWxlLWxpc3RUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHdlbGNvbWUtZmlsZS1saXN0IGNvbnRhaW5zIGFuIG9yZGVyZWQgbGlzdCBvZiB3ZWxjb21lCi1maWxlcyBlbGVtZW50cy4KLQotVXNlZCBpbjogd2ViLWFwcAotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWxjb21lLWZpbGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHdlbGNvbWUtZmlsZSBlbGVtZW50IGNvbnRhaW5zIGZpbGUgbmFtZSB0byB1c2UKLSAgICAgICAgYXMgYSBkZWZhdWx0IHdlbGNvbWUgZmlsZSwgc3VjaCBhcyBpbmRleC5odG1sCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvcHJpY2VxdW90ZS9QcmljZVF1b3RlLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3ByaWNlcXVvdGUvUHJpY2VRdW90ZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NzJmYmQuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvcHJpY2VxdW90ZS9QcmljZVF1b3RlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmljZS1xdW90ZSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InN0b2NrLXN5bWJvbCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJzdG9jay1wcmljZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotICAgIDwhLS0gWFhYU0pNIGNoYW5nZSBmb2xsb3dpbmcgdG8gdXNlIHJlZmluZWQgZGF0YXR5cGVzIC0tPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdG9jay1zeW1ib2wiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RvY2stcHJpY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvcmEvcmEueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvcmEvcmEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjlkMTI4Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3JhL3JhLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIHhtbG5zOm10PSJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0L3Jvd3NhZmZlY3RlZCIKLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL215dGVzdC9yb3dzYWZmZWN0ZWQiCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJyb3dzQWZmZWN0ZWQiIHR5cGU9InhzOmludCIvPgotCi08L3hzOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvczRzL1hNTC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9zNHMvWE1MLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY4YWRkOS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9zNHMvWE1MLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCFET0NUWVBFIHhzOnNjaGVtYSBQVUJMSUMgIi0vL1czQy8vRFREIFhNTFNDSEVNQSAyMDAxMDIvL0VOIiAiWE1MU2NoZW1hLmR0ZCIgPgotPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWw6bGFuZz0iZW4iPgotCi0gPHhzOmFubm90YXRpb24+Ci0gIDx4czpkb2N1bWVudGF0aW9uPgotICAgU2VlIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS5odG1sIGFuZAotICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBuYW1lc3BhY2UuCi0gIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSA8L3hzOmFubm90YXRpb24+Ci0KLSA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+VGhpcyBzY2hlbWEgZGVmaW5lcyBhdHRyaWJ1dGVzIGFuZCBhbiBhdHRyaWJ1dGUgZ3JvdXAKLSAgICAgICAgc3VpdGFibGUgZm9yIHVzZSBieQotICAgICAgICBzY2hlbWFzIHdpc2hpbmcgdG8gYWxsb3cgeG1sOmJhc2UsIHhtbDpsYW5nIG9yIHhtbDpzcGFjZSBhdHRyaWJ1dGVzCi0gICAgICAgIG9uIGVsZW1lbnRzIHRoZXkgZGVmaW5lLgotCi0gICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hCi0gICAgICAgIGZvciB0aGUgWE1MIG5hbWVzcGFjZSwgZS5nLiBhcyBmb2xsb3dzOgotICAgICAgICAmbHQ7c2NoZW1hIC4gLiAuPgotICAgICAgICAgLiAuIC4KLSAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzAzL3htbC54c2QiLz4KLQotICAgICAgICBTdWJzZXF1ZW50bHksIHF1YWxpZmllZCByZWZlcmVuY2UgdG8gYW55IG9mIHRoZSBhdHRyaWJ1dGVzCi0gICAgICAgIG9yIHRoZSBncm91cCBkZWZpbmVkIGJlbG93IHdpbGwgaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QsIGUuZy4KLQotICAgICAgICAmbHQ7dHlwZSAuIC4gLj4KLSAgICAgICAgIC4gLiAuCi0gICAgICAgICAmbHQ7YXR0cmlidXRlR3JvdXAgcmVmPSJ4bWw6c3BlY2lhbEF0dHJzIi8+Ci0gCi0gICAgICAgICB3aWxsIGRlZmluZSBhIHR5cGUgd2hpY2ggd2lsbCBzY2hlbWEtdmFsaWRhdGUgYW4gaW5zdGFuY2UKLSAgICAgICAgIGVsZW1lbnQgd2l0aCBhbnkgb2YgdGhvc2UgYXR0cmlidXRlczwveHM6ZG9jdW1lbnRhdGlvbj4KLSA8L3hzOmFubm90YXRpb24+Ci0KLSA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+SW4ga2VlcGluZyB3aXRoIHRoZSBYTUwgU2NoZW1hIFdHJ3Mgc3RhbmRhcmQgdmVyc2lvbmluZwotICAgcG9saWN5LCB0aGlzIHNjaGVtYSBkb2N1bWVudCB3aWxsIHBlcnNpc3QgYXQKLSAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDMveG1sLnhzZC4KLSAgIEF0IHRoZSBkYXRlIG9mIGlzc3VlIGl0IGNhbiBhbHNvIGJlIGZvdW5kIGF0Ci0gICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QuCi0gICBUaGUgc2NoZW1hIGRvY3VtZW50IGF0IHRoYXQgVVJJIG1heSBob3dldmVyIGNoYW5nZSBpbiB0aGUgZnV0dXJlLAotICAgaW4gb3JkZXIgdG8gcmVtYWluIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgWE1MIFNjaGVtYQotICAgaXRzZWxmLiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZSBjaGFuZ2VzLCB0aGUgdmVyc2lvbgotICAgb2YgdGhpcyBkb2N1bWVudCBhdAotICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIHdpbGwgY2hhbmdlCi0gICBhY2NvcmRpbmdseTsgdGhlIHZlcnNpb24gYXQKLSAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDMveG1sLnhzZCB3aWxsIG5vdCBjaGFuZ2UuCi0gIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSA8L3hzOmFubm90YXRpb24+Ci0KLSA8eHM6YXR0cmlidXRlIG5hbWU9ImxhbmciIHR5cGU9InhzOmxhbmd1YWdlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj5JbiBkdWUgY291cnNlLCB3ZSBzaG91bGQgaW5zdGFsbCB0aGUgcmVsZXZhbnQgSVNPIDItIGFuZCAzLWxldHRlcgotICAgICAgICAgY29kZXMgYXMgdGhlIGVudW1lcmF0ZWQgcG9zc2libGUgdmFsdWVzIC4gLiAuPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czphdHRyaWJ1dGU+Ci0KLSA8eHM6YXR0cmlidXRlIG5hbWU9InNwYWNlIiBkZWZhdWx0PSJwcmVzZXJ2ZSI+Ci0gIDx4czpzaW1wbGVUeXBlPgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5DTmFtZSI+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkZWZhdWx0Ii8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwcmVzZXJ2ZSIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotIDwveHM6YXR0cmlidXRlPgotCi0gPHhzOmF0dHJpYnV0ZSBuYW1lPSJiYXNlIiB0eXBlPSJ4czphbnlVUkkiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPlNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi94bWxiYXNlLyBmb3IKLSAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYXR0cmlidXRlLjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6YXR0cmlidXRlPgotCi0gPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9InNwZWNpYWxBdHRycyI+Ci0gIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6YmFzZSIvPgotICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgPHhzOmF0dHJpYnV0ZSByZWY9InhtbDpzcGFjZSIvPgotIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvczRzL1hNTFNjaGVtYS54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9zNHMvWE1MU2NoZW1hLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3NzI1MS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9zNHMvWE1MU2NoZW1hLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI1MDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gWE1MIFNjaGVtYSBzY2hlbWEgZm9yIFhNTCBTY2hlbWFzOiBQYXJ0IDE6IFN0cnVjdHVyZXMgLS0+Ci08IS0tIE5vdGUgdGhpcyBzY2hlbWEgaXMgTk9UIHRoZSBub3JtYXRpdmUgc3RydWN0dXJlcyBzY2hlbWEuIC0tPgotCi08IS0tIFRoZSBwcm9zZSBjb3B5IGluIHRoZSBzdHJ1Y3R1cmVzIFJFQyBpcyB0aGUgbm9ybWF0aXZlIC0tPgotCi08IS0tIHZlcnNpb24gKHdoaWNoIHNob3VsZG4ndCBkaWZmZXIgZnJvbSB0aGlzIG9uZSBleGNlcHQgZm9yIC0tPgotCi08IS0tIHRoaXMgY29tbWVudCBhbmQgZW50aXR5IGV4cGFuc2lvbnMsIGJ1dCBqdXN0IGluIGNhc2UgLS0+Ci0KLTwhRE9DVFlQRSB4czpzY2hlbWEgUFVCTElDICItLy9XM0MvL0RURCBYTUxTQ0hFTUEgMjAwMTAyLy9FTiIgIlhNTFNjaGVtYS5kdGQiIFsKLQotPCEtLSBwcm92aWRlIElEIHR5cGUgaW5mb3JtYXRpb24gZXZlbiBmb3IgcGFyc2VycyB3aGljaCBvbmx5IHJlYWQgdGhlCi0gICAgIGludGVybmFsIHN1YnNldCAtLT4KLTwhQVRUTElTVCB4czpzY2hlbWEgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpjb21wbGV4VHlwZSAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpjb21wbGV4Q29udGVudCAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpzaW1wbGVDb250ZW50ICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpleHRlbnNpb24gICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czplbGVtZW50ICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpncm91cCAgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4gCi08IUFUVExJU1QgeHM6YWxsICAgICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6Y2hvaWNlICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6c2VxdWVuY2UgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6YW55ICAgICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6YW55QXR0cmlidXRlICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6YXR0cmlidXRlICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6YXR0cmlidXRlR3JvdXAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6dW5pcXVlICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6a2V5ICAgICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6a2V5cmVmICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6c2VsZWN0b3IgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6ZmllbGQgICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6aW5jbHVkZSAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6aW1wb3J0ICAgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6cmVkZWZpbmUgICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IUFUVExJU1QgeHM6bm90YXRpb24gICAgICAgIGlkICBJRCAgI0lNUExJRUQ+Ci08IS0tCi0gICAgIGtlZXAgdGhpcyBzY2hlbWEgWE1MMS4wIERURCB2YWxpZAotICAtLT4KLSAgICAgICAgPCFFTlRJVFkgJSBzY2hlbWFBdHRycyAneG1sbnM6aGZwIENEQVRBICNJTVBMSUVEJz4KLQotICAgICAgICA8IUVMRU1FTlQgaGZwOmhhc0ZhY2V0IEVNUFRZPgotICAgICAgICA8IUFUVExJU1QgaGZwOmhhc0ZhY2V0Ci0gICAgICAgICAgICAgICAgbmFtZSBOTVRPS0VOICNSRVFVSVJFRD4KLQotICAgICAgICA8IUVMRU1FTlQgaGZwOmhhc1Byb3BlcnR5IEVNUFRZPgotICAgICAgICA8IUFUVExJU1QgaGZwOmhhc1Byb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZSBOTVRPS0VOICNSRVFVSVJFRAotICAgICAgICAgICAgICAgIHZhbHVlIENEQVRBICNSRVFVSVJFRD4KLTwhLS0KLSAgICAgICAgTWFrZSBzdXJlIHRoYXQgcHJvY2Vzc29ycyB0aGF0IGRvIG5vdCByZWFkIHRoZSBleHRlcm5hbAotICAgICAgICBzdWJzZXQgd2lsbCBrbm93IGFib3V0IHRoZSB2YXJpb3VzIElEcyB3ZSBkZWNsYXJlCi0gIC0tPgotICAgICAgICA8IUFUVExJU1QgeHM6c2ltcGxlVHlwZSBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOm1heEV4Y2x1c2l2ZSBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOm1pbkV4Y2x1c2l2ZSBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOm1heEluY2x1c2l2ZSBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOm1pbkluY2x1c2l2ZSBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOnRvdGFsRGlnaXRzIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6ZnJhY3Rpb25EaWdpdHMgaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czpsZW5ndGggaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czptaW5MZW5ndGggaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czptYXhMZW5ndGggaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czplbnVtZXJhdGlvbiBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOnBhdHRlcm4gaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czphcHBpbmZvIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6ZG9jdW1lbnRhdGlvbiBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOmxpc3QgaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czp1bmlvbiBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgXT4KLTx4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgYmxvY2tEZWZhdWx0PSIjYWxsIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdmVyc2lvbj0iMS4wIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbDpsYW5nPSJFTiIgeG1sbnM6aGZwPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1oYXNGYWNldEFuZFByb3BlcnR5Ij4KLSA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgUGFydCAxIHZlcnNpb246IElkOiBYTUxTY2hlbWEueHNkLHYgMS41MyAyMDAzLzAyLzI0IDE3OjQwOjA3IGh0IEV4cCAKLSAgICBQYXJ0IDIgdmVyc2lvbjogSWQ6IGRhdGF0eXBlcy54c2QsdiAxLjU4IDIwMDMvMDIvMjYgMTQ6MDE6MjkgaHQgRXhwIAotICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gPC94czphbm5vdGF0aW9uPgotCi0KLSA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvWE1ML0dyb3VwLzIwMDIvMDkveG1sc2NoZW1hLTEvc3RydWN0dXJlcy13aXRoLWVycmF0YS5odG1sIj4KLSAgIFRoZSBzY2hlbWEgY29ycmVzcG9uZGluZyB0byB0aGlzIGRvY3VtZW50IGlzIG5vcm1hdGl2ZSwKLSAgIHdpdGggcmVzcGVjdCB0byB0aGUgc3ludGFjdGljIGNvbnN0cmFpbnRzIGl0IGV4cHJlc3NlcyBpbiB0aGUKLSAgIFhNTCBTY2hlbWEgbGFuZ3VhZ2UuICBUaGUgZG9jdW1lbnRhdGlvbiAod2l0aGluICZsdDtkb2N1bWVudGF0aW9uPiBlbGVtZW50cykKLSAgIGJlbG93LCBpcyBub3Qgbm9ybWF0aXZlLCBidXQgcmF0aGVyIGhpZ2hsaWdodHMgaW1wb3J0YW50IGFzcGVjdHMgb2YKLSAgIHRoZSBXM0MgUmVjb21tZW5kYXRpb24gb2Ygd2hpY2ggdGhpcyBpcyBhIHBhcnQ8L3hzOmRvY3VtZW50YXRpb24+Ci0gPC94czphbm5vdGF0aW9uPgotCi0gPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIFRoZSBzaW1wbGVUeXBlIGVsZW1lbnQgYW5kIGFsbCBvZiBpdHMgbWVtYmVycyBhcmUgZGVmaW5lZAotICAgICAgdG93YXJkcyB0aGUgZW5kIG9mIHRoaXMgc2NoZW1hIGRvY3VtZW50PC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgIEdldCBhY2Nlc3MgdG8gdGhlIHhtbDogYXR0cmlidXRlIGdyb3VwcyBmb3IgeG1sOmxhbmcKLSAgICAgICBhcyBkZWNsYXJlZCBvbiAnc2NoZW1hJyBhbmQgJ2RvY3VtZW50YXRpb24nIGJlbG93Ci0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmltcG9ydD4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJvcGVuQXR0cnMiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgIFRoaXMgdHlwZSBpcyBleHRlbmRlZCBieSBhbG1vc3QgYWxsIHNjaGVtYSB0eXBlcwotICAgICAgIHRvIGFsbG93IGF0dHJpYnV0ZXMgZnJvbSBvdGhlciBuYW1lc3BhY2VzIHRvIGJlCi0gICAgICAgYWRkZWQgdG8gdXNlciBzY2hlbWFzLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlUeXBlIj4KLSAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhbm5vdGF0ZWQiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgIFRoaXMgdHlwZSBpcyBleHRlbmRlZCBieSBhbGwgdHlwZXMgd2hpY2ggYWxsb3cgYW5ub3RhdGlvbgotICAgICAgIG90aGVyIHRoYW4gJmx0O3NjaGVtYSZndDsgaXRzZWxmCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpvcGVuQXR0cnMiPgotICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgotICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpncm91cCBuYW1lPSJzY2hlbWFUb3AiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgVGhpcyBncm91cCBpcyBmb3IgdGhlCi0gICBlbGVtZW50cyB3aGljaCBvY2N1ciBmcmVlbHkgYXQgdGhlIHRvcCBsZXZlbCBvZiBzY2hlbWFzLgotICAgQWxsIG9mIHRoZWlyIHR5cGVzIGFyZSBiYXNlZCBvbiB0aGUgImFubm90YXRlZCIgdHlwZSBieSBleHRlbnNpb24uPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjaG9pY2U+Ci0gICA8eHM6Z3JvdXAgcmVmPSJ4czpyZWRlZmluYWJsZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czplbGVtZW50Ii8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmF0dHJpYnV0ZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpub3RhdGlvbiIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotIAotIDx4czpncm91cCBuYW1lPSJyZWRlZmluYWJsZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBUaGlzIGdyb3VwIGlzIGZvciB0aGUKLSAgIGVsZW1lbnRzIHdoaWNoIGNhbiBzZWxmLXJlZGVmaW5lIChzZWUgJmx0O3JlZGVmaW5lPiBiZWxvdykuPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjaG9pY2U+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOnNpbXBsZVR5cGUiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Y29tcGxleFR5cGUiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Z3JvdXAiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6YXR0cmlidXRlR3JvdXAiLz4KLSAgPC94czpjaG9pY2U+Ci0gPC94czpncm91cD4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImZvcm1DaG9pY2UiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InF1YWxpZmllZCIvPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bnF1YWxpZmllZCIvPgotICA8L3hzOnJlc3RyaWN0aW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9InJlZHVjZWREZXJpdmF0aW9uQ29udHJvbCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBBIHV0aWxpdHkgdHlwZSwgbm90IGZvciBwdWJsaWMgdXNlPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpkZXJpdmF0aW9uQ29udHJvbCI+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuc2lvbiIvPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZXN0cmljdGlvbiIvPgotICA8L3hzOnJlc3RyaWN0aW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImRlcml2YXRpb25TZXQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgI2FsbCBvciAocG9zc2libHkgZW1wdHkpIHN1YnNldCBvZiB7ZXh0ZW5zaW9uLCByZXN0cmljdGlvbn08L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnVuaW9uPgotICAgPHhzOnNpbXBsZVR5cGU+ICAgIAotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2FsbCIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6cmVkdWNlZERlcml2YXRpb25Db250cm9sIi8+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDwveHM6dW5pb24+Ci0gPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiBpZD0ic2NoZW1hIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1zY2hlbWEiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpvcGVuQXR0cnMiPgotICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6aW5jbHVkZSIvPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6aW1wb3J0Ii8+Ci0gICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpyZWRlZmluZSIvPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIvPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgICA8eHM6c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6c2NoZW1hVG9wIi8+Ci0gICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICAgICA8L3hzOnNlcXVlbmNlPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHM6bm9ybWFsaXplZFN0cmluZyIvPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpbmFsRGVmYXVsdCIgdHlwZT0ieHM6ZGVyaXZhdGlvblNldCIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmxvY2tEZWZhdWx0IiB0eXBlPSJ4czpibG9ja1NldCIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlRm9ybURlZmF1bHQiIHR5cGU9InhzOmZvcm1DaG9pY2UiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9InVucXVhbGlmaWVkIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZWxlbWVudEZvcm1EZWZhdWx0IiB0eXBlPSJ4czpmb3JtQ2hvaWNlIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJ1bnF1YWxpZmllZCIvPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgotICAgICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmtleSBuYW1lPSJlbGVtZW50Ij4KLSAgIDx4czpzZWxlY3RvciB4cGF0aD0ieHM6ZWxlbWVudCIvPgotICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIvPgotICA8L3hzOmtleT4KLQotICA8eHM6a2V5IG5hbWU9ImF0dHJpYnV0ZSI+Ci0gICA8eHM6c2VsZWN0b3IgeHBhdGg9InhzOmF0dHJpYnV0ZSIvPgotICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIvPgotICA8L3hzOmtleT4KLQotICA8eHM6a2V5IG5hbWU9InR5cGUiPgotICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ4czpjb21wbGV4VHlwZXx4czpzaW1wbGVUeXBlIi8+Ci0gICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+Ci0gIDwveHM6a2V5PgotIAotICA8eHM6a2V5IG5hbWU9Imdyb3VwIj4KLSAgIDx4czpzZWxlY3RvciB4cGF0aD0ieHM6Z3JvdXAiLz4KLSAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiLz4KLSAgPC94czprZXk+Ci0gCi0gIDx4czprZXkgbmFtZT0iYXR0cmlidXRlR3JvdXAiPgotICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ4czphdHRyaWJ1dGVHcm91cCIvPgotICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIvPgotICA8L3hzOmtleT4KLSAKLSAgPHhzOmtleSBuYW1lPSJub3RhdGlvbiI+Ci0gICA8eHM6c2VsZWN0b3IgeHBhdGg9InhzOm5vdGF0aW9uIi8+Ci0gICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+Ci0gIDwveHM6a2V5PgotCi0gIDx4czprZXkgbmFtZT0iaWRlbnRpdHlDb25zdHJhaW50Ij4KLSAgIDx4czpzZWxlY3RvciB4cGF0aD0iLi8veHM6a2V5fC4vL3hzOnVuaXF1ZXwuLy94czprZXlyZWYiLz4KLSAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiLz4KLSAgPC94czprZXk+Ci0KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJhbGxOTkkiPgotICA8eHM6YW5ub3RhdGlvbj48eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIGZvciBtYXhPY2N1cnM8L3hzOmRvY3VtZW50YXRpb24+PC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0gICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idW5ib3VuZGVkIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0ib2NjdXJzIj4KLSAgPHhzOmFubm90YXRpb24+PHhzOmRvY3VtZW50YXRpb24+Ci0gICBmb3IgYWxsIHBhcnRpY2xlczwveHM6ZG9jdW1lbnRhdGlvbj48L3hzOmFubm90YXRpb24+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHR5cGU9InhzOmFsbE5OSSIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iMSIvPgotIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0KLSA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iZGVmUmVmIj4KLSAgPHhzOmFubm90YXRpb24+PHhzOmRvY3VtZW50YXRpb24+Ci0gICBmb3IgZWxlbWVudCwgZ3JvdXAgYW5kIGF0dHJpYnV0ZUdyb3VwLAotICAgd2hpY2ggYm90aCBkZWZpbmUgYW5kIHJlZmVyZW5jZTwveHM6ZG9jdW1lbnRhdGlvbj48L3hzOmFubm90YXRpb24+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB0eXBlPSJ4czpRTmFtZSIvPgotIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0KLSA8eHM6Z3JvdXAgbmFtZT0idHlwZURlZlBhcnRpY2xlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAnY29tcGxleFR5cGUnIHVzZXMgdGhpczwveHM6ZG9jdW1lbnRhdGlvbj48L3hzOmFubm90YXRpb24+Ci0gIDx4czpjaG9pY2U+Ci0gICA8eHM6ZWxlbWVudCBuYW1lPSJncm91cCIgdHlwZT0ieHM6Z3JvdXBSZWYiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6YWxsIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmNob2ljZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzZXF1ZW5jZSIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotIAotIAotCi0gPHhzOmdyb3VwIG5hbWU9Im5lc3RlZFBhcnRpY2xlIj4KLSAgPHhzOmNob2ljZT4KLSAgIDx4czplbGVtZW50IG5hbWU9ImVsZW1lbnQiIHR5cGU9InhzOmxvY2FsRWxlbWVudCIvPgotICAgPHhzOmVsZW1lbnQgbmFtZT0iZ3JvdXAiIHR5cGU9InhzOmdyb3VwUmVmIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmNob2ljZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzZXF1ZW5jZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbnkiLz4KLSAgPC94czpjaG9pY2U+Ci0gPC94czpncm91cD4KLSAKLSA8eHM6Z3JvdXAgbmFtZT0icGFydGljbGUiPgotICA8eHM6Y2hvaWNlPgotICAgPHhzOmVsZW1lbnQgbmFtZT0iZWxlbWVudCIgdHlwZT0ieHM6bG9jYWxFbGVtZW50Ii8+Ci0gICA8eHM6ZWxlbWVudCBuYW1lPSJncm91cCIgdHlwZT0ieHM6Z3JvdXBSZWYiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6YWxsIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmNob2ljZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzZXF1ZW5jZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbnkiLz4KLSAgPC94czpjaG9pY2U+Ci0gPC94czpncm91cD4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOmRlZlJlZiIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6UU5hbWUiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZSIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0ib3B0aW9uYWwiPgotICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByb2hpYml0ZWQiLz4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im9wdGlvbmFsIi8+Ci0gICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZXF1aXJlZCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6YXR0cmlidXRlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaXhlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmb3JtIiB0eXBlPSJ4czpmb3JtQ2hvaWNlIi8+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0b3BMZXZlbEF0dHJpYnV0ZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphdHRyaWJ1dGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZvcm0iIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmdyb3VwIG5hbWU9ImF0dHJEZWNscyI+Ci0gIDx4czpzZXF1ZW5jZT4KLSAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIiB0eXBlPSJ4czphdHRyaWJ1dGUiLz4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVHcm91cCIgdHlwZT0ieHM6YXR0cmlidXRlR3JvdXBSZWYiLz4KLSAgIDwveHM6Y2hvaWNlPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbnlBdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIvPgotICA8L3hzOnNlcXVlbmNlPgotIDwveHM6Z3JvdXA+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJhbnlBdHRyaWJ1dGUiIHR5cGU9InhzOndpbGRjYXJkIiBpZD0iYW55QXR0cmlidXRlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWFueUF0dHJpYnV0ZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmdyb3VwIG5hbWU9ImNvbXBsZXhUeXBlTW9kZWwiPgotICA8eHM6Y2hvaWNlPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzaW1wbGVDb250ZW50Ii8+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmNvbXBsZXhDb250ZW50Ii8+Ci0gICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgVGhpcyBicmFuY2ggaXMgc2hvcnQgZm9yCi0gICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VHlwZSI+Ci0gICAuLi4KLSAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gICAmbHQ7L2NvbXBsZXhDb250ZW50PjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6dHlwZURlZlBhcnRpY2xlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Y2hvaWNlPgotIDwveHM6Z3JvdXA+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iY29tcGxleFR5cGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpncm91cCByZWY9InhzOmNvbXBsZXhUeXBlTW9kZWwiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSI+Ci0gICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBXaWxsIGJlIHJlc3RyaWN0ZWQgdG8gcmVxdWlyZWQgb3IgZm9yYmlkZGVuPC94czpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaXhlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iZmFsc2UiPgotICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgTm90IGFsbG93ZWQgaWYgc2ltcGxlQ29udGVudCBjaGlsZCBpcyBjaG9zZW4uCi0gICAgICBNYXkgYmUgb3ZlcnJpZGVuIGJ5IHNldHRpbmcgb24gY29tcGxleENvbnRlbnQgY2hpbGQuPC94czpkb2N1bWVudGF0aW9uPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFic3RyYWN0IiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJmYWxzZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmluYWwiIHR5cGU9InhzOmRlcml2YXRpb25TZXQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJsb2NrIiB0eXBlPSJ4czpkZXJpdmF0aW9uU2V0Ii8+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0b3BMZXZlbENvbXBsZXhUeXBlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmNvbXBsZXhUeXBlIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmNvbXBsZXhUeXBlTW9kZWwiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsQ29tcGxleFR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Y29tcGxleFR5cGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6Y29tcGxleFR5cGVNb2RlbCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFic3RyYWN0IiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpbmFsIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJsb2NrIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0icmVzdHJpY3Rpb25UeXBlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6dHlwZURlZlBhcnRpY2xlIi8+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpzaW1wbGVSZXN0cmljdGlvbk1vZGVsIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmFzZSIgdHlwZT0ieHM6UU5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PiAgICAgICAKLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNvbXBsZXhSZXN0cmljdGlvblR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6cmVzdHJpY3Rpb25UeXBlIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlRoaXMgY2hvaWNlIGlzIGFkZGVkIHNpbXBseSB0bwotICAgICAgICAgICAgICAgICAgIG1ha2UgdGhpcyBhIHZhbGlkIHJlc3RyaWN0aW9uIHBlciB0aGUgUkVDPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6dHlwZURlZlBhcnRpY2xlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4gICAgICAgCi0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJleHRlbnNpb25UeXBlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6dHlwZURlZlBhcnRpY2xlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YXR0ckRlY2xzIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJhc2UiIHR5cGU9InhzOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4gICAgICAgCi0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImNvbXBsZXhDb250ZW50IiBpZD0iY29tcGxleENvbnRlbnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtY29tcGxleENvbnRlbnQiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6Y2hvaWNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmVzdHJpY3Rpb24iIHR5cGU9InhzOmNvbXBsZXhSZXN0cmljdGlvblR5cGUiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0ieHM6ZXh0ZW5zaW9uVHlwZSIvPgotICAgICA8L3hzOmNob2ljZT4gICAgIAotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1peGVkIiB0eXBlPSJ4czpib29sZWFuIj4KLSAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgIE92ZXJyaWRlcyBhbnkgc2V0dGluZyBvbiBjb21wbGV4VHlwZSBwYXJlbnQuPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgPC94czphbm5vdGF0aW9uPgotICAgIDwveHM6YXR0cmlidXRlPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ic2ltcGxlUmVzdHJpY3Rpb25UeXBlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnJlc3RyaWN0aW9uVHlwZSI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5UaGlzIGNob2ljZSBpcyBhZGRlZCBzaW1wbHkgdG8KLSAgICAgICAgICAgICAgICAgICBtYWtlIHRoaXMgYSB2YWxpZCByZXN0cmljdGlvbiBwZXIgdGhlIFJFQzwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpncm91cCByZWY9InhzOnNpbXBsZVJlc3RyaWN0aW9uTW9kZWwiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ic2ltcGxlRXh0ZW5zaW9uVHlwZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpleHRlbnNpb25UeXBlIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBObyB0eXBlRGVmUGFydGljbGUgZ3JvdXAgcmVmZXJlbmNlPC94czpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVDb250ZW50IiBpZD0ic2ltcGxlQ29udGVudCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1zaW1wbGVDb250ZW50Ii8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InJlc3RyaWN0aW9uIiB0eXBlPSJ4czpzaW1wbGVSZXN0cmljdGlvblR5cGUiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0ieHM6c2ltcGxlRXh0ZW5zaW9uVHlwZSIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotIAotIDx4czplbGVtZW50IG5hbWU9ImNvbXBsZXhUeXBlIiB0eXBlPSJ4czp0b3BMZXZlbENvbXBsZXhUeXBlIiBpZD0iY29tcGxleFR5cGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtY29tcGxleFR5cGUiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLQotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImJsb2NrU2V0Ij4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgI2FsbCBvciAocG9zc2libHkgZW1wdHkpIHN1YnNldCBvZiB7c3Vic3RpdHV0aW9uLCBleHRlbnNpb24sCi0gICAgcmVzdHJpY3Rpb259PC94czpkb2N1bWVudGF0aW9uPgotICAgPC94czphbm5vdGF0aW9uPgotICAgPHhzOnVuaW9uPgotICAgIDx4czpzaW1wbGVUeXBlPiAgICAKLSAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2FsbCIvPgotICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgPHhzOmxpc3Q+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZGVyaXZhdGlvbkNvbnRyb2wiPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuc2lvbiIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlc3RyaWN0aW9uIi8+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3Vic3RpdHV0aW9uIi8+Ci0gICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgPC94czpsaXN0PgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgIDwveHM6dW5pb24+ICAKLSAgPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIFRoZSBlbGVtZW50IGVsZW1lbnQgY2FuIGJlIHVzZWQgZWl0aGVyCi0gICBhdCB0aGUgdG9wIGxldmVsIHRvIGRlZmluZSBhbiBlbGVtZW50LXR5cGUgYmluZGluZyBnbG9iYWxseSwKLSAgIG9yIHdpdGhpbiBhIGNvbnRlbnQgbW9kZWwgdG8gZWl0aGVyIHJlZmVyZW5jZSBhIGdsb2JhbGx5LWRlZmluZWQKLSAgIGVsZW1lbnQgb3IgdHlwZSBvciBkZWNsYXJlIGFuIGVsZW1lbnQtdHlwZSBiaW5kaW5nIGxvY2FsbHkuCi0gICBUaGUgcmVmIGZvcm0gaXMgbm90IGFsbG93ZWQgYXQgdGhlIHRvcCBsZXZlbC48L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImNvbXBsZXhUeXBlIiB0eXBlPSJ4czpsb2NhbENvbXBsZXhUeXBlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czppZGVudGl0eUNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOmRlZlJlZiIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6UU5hbWUiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN1YnN0aXR1dGlvbkdyb3VwIiB0eXBlPSJ4czpRTmFtZSIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOm9jY3VycyIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaXhlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuaWxsYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iZmFsc2UiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFic3RyYWN0IiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJmYWxzZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmluYWwiIHR5cGU9InhzOmRlcml2YXRpb25TZXQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJsb2NrIiB0eXBlPSJ4czpibG9ja1NldCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZm9ybSIgdHlwZT0ieHM6Zm9ybUNob2ljZSIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0idG9wTGV2ZWxFbGVtZW50Ij4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmVsZW1lbnQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb21wbGV4VHlwZSIgdHlwZT0ieHM6bG9jYWxDb21wbGV4VHlwZSIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6aWRlbnRpdHlDb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmb3JtIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1pbk9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsRWxlbWVudCI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czplbGVtZW50Ij4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InNpbXBsZVR5cGUiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY29tcGxleFR5cGUiIHR5cGU9InhzOmxvY2FsQ29tcGxleFR5cGUiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmlkZW50aXR5Q29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdWJzdGl0dXRpb25Hcm91cCIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaW5hbCIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhYnN0cmFjdCIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJlbGVtZW50IiB0eXBlPSJ4czp0b3BMZXZlbEVsZW1lbnQiIGlkPSJlbGVtZW50Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWVsZW1lbnQiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJncm91cCIgYWJzdHJhY3Q9InRydWUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgZ3JvdXAgdHlwZSBmb3IgZXhwbGljaXQgZ3JvdXBzLCBuYW1lZCB0b3AtbGV2ZWwgZ3JvdXBzIGFuZAotICAgZ3JvdXAgcmVmZXJlbmNlczwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOmdyb3VwIHJlZj0ieHM6cGFydGljbGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ4czpkZWZSZWYiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ4czpvY2N1cnMiLz4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InJlYWxHcm91cCI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpncm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YWxsIi8+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmNob2ljZSIvPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzZXF1ZW5jZSIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkR3JvdXAiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6cmVhbEdyb3VwIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYWxsIj4KLSAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbGwiPgotICAgICAgICAgIDx4czpncm91cCByZWY9InhzOmFsbE1vZGVsIi8+Ci0gICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHVzZT0icHJvaGliaXRlZCIvPgotICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4T2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImNob2ljZSIgdHlwZT0ieHM6c2ltcGxlRXhwbGljaXRHcm91cCIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UiIHR5cGU9InhzOnNpbXBsZUV4cGxpY2l0R3JvdXAiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1pbk9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9Imdyb3VwUmVmIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnJlYWxHcm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOlFOYW1lIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJleHBsaWNpdEdyb3VwIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIGdyb3VwIHR5cGUgZm9yIHRoZSB0aHJlZSBraW5kcyBvZiBncm91cDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Z3JvdXAiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6bmVzdGVkUGFydGljbGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdHlwZT0ieHM6UU5hbWUiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaW1wbGVFeHBsaWNpdEdyb3VwIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmV4cGxpY2l0R3JvdXAiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6bmVzdGVkUGFydGljbGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmdyb3VwIG5hbWU9ImFsbE1vZGVsIj4KLSAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlRoaXMgY2hvaWNlIHdpdGggbWluL21heCBpcyBoZXJlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGF2b2lkIGEgcGJsbSB3aXRoIHRoZSBFbHQ6QWxsL0Nob2ljZS9TZXEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGljbGUgZGVyaXZhdGlvbiBjb25zdHJhaW50PC94czpkb2N1bWVudGF0aW9uPgotICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJlbGVtZW50IiB0eXBlPSJ4czplbGVtZW50SW5BbGwiLz4KLSAgICAgIDwveHM6Y2hvaWNlPgotICAgICA8L3hzOnNlcXVlbmNlPgotIDwveHM6Z3JvdXA+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImVsZW1lbnRJbkFsbCI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj5yZXN0cmljdGVkIG1heC9taW48L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmxvY2FsRWxlbWVudCI+Ci0gICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIi8+Ci0gICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY29tcGxleFR5cGUiIHR5cGU9InhzOmxvY2FsQ29tcGxleFR5cGUiLz4KLSAgICAgIDwveHM6Y2hvaWNlPgotICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6aWRlbnRpdHlDb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjAiLz4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+Ci0gICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4T2NjdXJzIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbGxOTkkiPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjAiLz4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+Ci0gICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPiAgICAKLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYWxsIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgT25seSBlbGVtZW50cyBhbGxvd2VkIGluc2lkZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZXhwbGljaXRHcm91cCI+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmFsbE1vZGVsIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjAiLz4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+Ci0gICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4T2NjdXJzIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbGxOTkkiPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJhbGwiIGlkPSJhbGwiIHR5cGU9InhzOmFsbCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hbGwiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9ImNob2ljZSIgdHlwZT0ieHM6ZXhwbGljaXRHcm91cCIgaWQ9ImNob2ljZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1jaG9pY2UiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9InNlcXVlbmNlIiB0eXBlPSJ4czpleHBsaWNpdEdyb3VwIiBpZD0ic2VxdWVuY2UiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtc2VxdWVuY2UiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9Imdyb3VwIiB0eXBlPSJ4czpuYW1lZEdyb3VwIiBpZD0iZ3JvdXAiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtZ3JvdXAiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ3aWxkY2FyZCI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6bmFtZXNwYWNlTGlzdCIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iIyNhbnkiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InByb2Nlc3NDb250ZW50cyIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0ic3RyaWN0Ij4KLSAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0gICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJza2lwIi8+Ci0gICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJsYXgiLz4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InN0cmljdCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6YXR0cmlidXRlPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImFueSIgaWQ9ImFueSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hbnkiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czp3aWxkY2FyZCI+Ci0gICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOm9jY3VycyIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIHNpbXBsZSB0eXBlIGZvciB0aGUgdmFsdWUgb2YgdGhlICduYW1lc3BhY2UnIGF0dHIgb2YKLSAgICdhbnknIGFuZCAnYW55QXR0cmlidXRlJzwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgVmFsdWUgaXMKLSAgICAgICAgICAgICAgIyNhbnkgICAgICAtIC0gYW55IG5vbi1jb25mbGljdGluZyBXRlhNTC9hdHRyaWJ1dGUgYXQgYWxsCi0KLSAgICAgICAgICAgICAgIyNvdGhlciAgICAtIC0gYW55IG5vbi1jb25mbGljdGluZyBXRlhNTC9hdHRyaWJ1dGUgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIG90aGVyIHRoYW4gdGFyZ2V0TlMKLQotICAgICAgICAgICAgICAjI2xvY2FsICAgIC0gLSBhbnkgdW5xdWFsaWZpZWQgbm9uLWNvbmZsaWN0aW5nIFdGWE1ML2F0dHJpYnV0ZSAKLQotICAgICAgICAgICAgICBvbmUgb3IgICAgIC0gLSBhbnkgbm9uLWNvbmZsaWN0aW5nIFdGWE1ML2F0dHJpYnV0ZSBmcm9tCi0gICAgICAgICAgICAgIG1vcmUgVVJJICAgICAgICB0aGUgbGlzdGVkIG5hbWVzcGFjZXMKLSAgICAgICAgICAgICAgcmVmZXJlbmNlcwotICAgICAgICAgICAgICAoc3BhY2Ugc2VwYXJhdGVkKQotCi0gICAgIyN0YXJnZXROYW1lc3BhY2Ugb3IgIyNsb2NhbCBtYXkgYXBwZWFyIGluIHRoZSBhYm92ZSBsaXN0LCB0bwotICAgICAgICByZWZlciB0byB0aGUgdGFyZ2V0TmFtZXNwYWNlIG9mIHRoZSBlbmNsb3NpbmcKLSAgICAgICAgc2NoZW1hIG9yIGFuIGFic2VudCB0YXJnZXROYW1lc3BhY2UgcmVzcGVjdGl2ZWx5PC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJuYW1lc3BhY2VMaXN0Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnVuaW9uPgotICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjI2FueSIvPgotICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjb3RoZXIiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOmxpc3Q+Ci0gICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnVuaW9uIG1lbWJlclR5cGVzPSJ4czphbnlVUkkiPgotICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjI2xvY2FsIi8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgPC94czp1bmlvbj4KLSAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6bGlzdD4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiIHR5cGU9InhzOnRvcExldmVsQXR0cmlidXRlIiBpZD0iYXR0cmlidXRlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWF0dHJpYnV0ZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZUdyb3VwIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ4czpkZWZSZWYiLz4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkQXR0cmlidXRlR3JvdXAiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YXR0cmlidXRlR3JvdXAiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YXR0ckRlY2xzIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGVHcm91cFJlZiI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphdHRyaWJ1dGVHcm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOlFOYW1lIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZUdyb3VwIiB0eXBlPSJ4czpuYW1lZEF0dHJpYnV0ZUdyb3VwIiBpZD0iYXR0cmlidXRlR3JvdXAiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtYXR0cmlidXRlR3JvdXAiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9ImluY2x1ZGUiIGlkPSJpbmNsdWRlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWluY2x1ZGUiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjaGVtYUxvY2F0aW9uIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0icmVkZWZpbmUiIGlkPSJyZWRlZmluZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1yZWRlZmluZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm9wZW5BdHRycyI+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iLz4KLSAgICAgIDx4czpncm91cCByZWY9InhzOnJlZGVmaW5hYmxlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjaGVtYUxvY2F0aW9uIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iaW1wb3J0IiBpZD0iaW1wb3J0Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWltcG9ydCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czphbnlVUkkiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWFMb2NhdGlvbiIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9InNlbGVjdG9yIiBpZD0ic2VsZWN0b3IiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtc2VsZWN0b3IiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4cGF0aCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+QSBzdWJzZXQgb2YgWFBhdGggZXhwcmVzc2lvbnMgZm9yIHVzZQotaW4gc2VsZWN0b3JzPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5BIHV0aWxpdHkgdHlwZSwgbm90IGZvciBwdWJsaWMKLXVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5UaGUgZm9sbG93aW5nIHBhdHRlcm4gaXMgaW50ZW5kZWQgdG8gYWxsb3cgWFBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zIHBlciB0aGUgZm9sbG93aW5nIEVCTkY6Ci0gICAgICAgICAgU2VsZWN0b3IgICAgOjo9ICAgIFBhdGggKCAnfCcgUGF0aCApKiAgCi0gICAgICAgICAgUGF0aCAgICA6Oj0gICAgKCcuLy8nKT8gU3RlcCAoICcvJyBTdGVwICkqICAKLSAgICAgICAgICBTdGVwICAgIDo6PSAgICAnLicgfCBOYW1lVGVzdCAgCi0gICAgICAgICAgTmFtZVRlc3QgICAgOjo9ICAgIFFOYW1lIHwgJyonIHwgTkNOYW1lICc6JyAnKicgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQ6OiBpcyBhbHNvIGFsbG93ZWQKLSAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8IS0tIFRTSCBjb21tZW50ZWQgb3V0IHNpbmNlIHRoaXMgaW5jb3JyZWN0bHkgZG9lcyBub3QgYWxsb3cgd2hpdGUgc3BhY2UgLS0+Ci0gICAgICAgIDwhLS0gPHhzOnBhdHRlcm4gdmFsdWU9IihcLi8vKT8oKChjaGlsZDo6KT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKSgvKCgoY2hpbGQ6Oik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLikpKihcfChcLi8vKT8oKChjaGlsZDo6KT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKSgvKCgoY2hpbGQ6Oik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLikpKikqIj4gCi0gICAgICAgIDwveHM6cGF0dGVybj4gLS0+Ci0gICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgPC94czphdHRyaWJ1dGU+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9ImZpZWxkIiBpZD0iZmllbGQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtZmllbGQiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4cGF0aCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+QSBzdWJzZXQgb2YgWFBhdGggZXhwcmVzc2lvbnMgZm9yIHVzZQotaW4gZmllbGRzPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5BIHV0aWxpdHkgdHlwZSwgbm90IGZvciBwdWJsaWMKLXVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5UaGUgZm9sbG93aW5nIHBhdHRlcm4gaXMgaW50ZW5kZWQgdG8gYWxsb3cgWFBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zIHBlciB0aGUgc2FtZSBFQk5GIGFzIGZvciBzZWxlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGZvbGxvd2luZyBjaGFuZ2U6Ci0gICAgICAgICAgUGF0aCAgICA6Oj0gICAgKCcuLy8nKT8gKCBTdGVwICcvJyApKiAoIFN0ZXAgfCAnQCcgTmFtZVRlc3QgKSAKLSAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8IS0tIFRTSCBjb21tZW50ZWQgb3V0IHNpbmNlIHRoaXMgaW5jb3JyZWN0bHkgZG9lcyBub3QgYWxsb3cgd2hpdGUgc3BhY2UgLS0+Ci0gICAgICAgIDwhLS0gPHhzOnBhdHRlcm4gdmFsdWU9IihcLi8vKT8oKCgoY2hpbGQ6Oik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLikvKSooKCgoY2hpbGQ6Oik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLil8KChhdHRyaWJ1dGU6OnxAKSgoXGlcYyo6KT8oXGlcYyp8XCopKSkpKFx8KFwuLy8pPygoKChjaGlsZDo6KT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKS8pKigoKChjaGlsZDo6KT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKXwoKGF0dHJpYnV0ZTo6fEApKChcaVxjKjopPyhcaVxjKnxcKikpKSkpKiI+IAotICAgICAgICA8L3hzOnBhdHRlcm4+LS0+Ci0gICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgPC94czphdHRyaWJ1dGU+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJrZXliYXNlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzZWxlY3RvciIvPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmZpZWxkIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpncm91cCBuYW1lPSJpZGVudGl0eUNvbnN0cmFpbnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPlRoZSB0aHJlZSBraW5kcyBvZiBpZGVudGl0eSBjb25zdHJhaW50cywgYWxsIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgIHR5cGUgb2Ygb3IgZGVyaXZlZCBmcm9tICdrZXliYXNlJy4KLSAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y2hvaWNlPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czp1bmlxdWUiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6a2V5Ii8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmtleXJlZiIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0idW5pcXVlIiB0eXBlPSJ4czprZXliYXNlIiBpZD0idW5pcXVlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXVuaXF1ZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotIDx4czplbGVtZW50IG5hbWU9ImtleSIgdHlwZT0ieHM6a2V5YmFzZSIgaWQ9ImtleSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1rZXkiLz4KLSAgPC94czphbm5vdGF0aW9uPgotIDwveHM6ZWxlbWVudD4KLSA8eHM6ZWxlbWVudCBuYW1lPSJrZXlyZWYiIGlkPSJrZXlyZWYiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQta2V5cmVmIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6a2V5YmFzZSI+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmZXIiIHR5cGU9InhzOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9Im5vdGF0aW9uIiBpZD0ibm90YXRpb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtbm90YXRpb24iLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InB1YmxpYyIgdHlwZT0ieHM6cHVibGljIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3lzdGVtIiB0eXBlPSJ4czphbnlVUkkiLz4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0icHVibGljIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgcHVibGljIGlkZW50aWZpZXIsIHBlciBJU08gODg3OTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iLz4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJhcHBpbmZvIiBpZD0iYXBwaW5mbyI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hcHBpbmZvIi8+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotICAgIDx4czpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzb3VyY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJkb2N1bWVudGF0aW9uIiBpZD0iZG9jdW1lbnRhdGlvbiI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1kb2N1bWVudGF0aW9uIi8+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotICAgIDx4czpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzb3VyY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiBpZD0iYW5ub3RhdGlvbiI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hbm5vdGF0aW9uIi8+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm9wZW5BdHRycyI+Ci0gICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YXBwaW5mbyIvPgotICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6ZG9jdW1lbnRhdGlvbiIvPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgotICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBub3RhdGlvbnMgZm9yIHVzZSB3aXRoaW4gWE1MIFNjaGVtYSBzY2hlbWFzPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czpub3RhdGlvbiBuYW1lPSJYTUxTY2hlbWFTdHJ1Y3R1cmVzIiBwdWJsaWM9InN0cnVjdHVyZXMiIHN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOC9YTUxTY2hlbWEueHNkIi8+Ci0gPHhzOm5vdGF0aW9uIG5hbWU9IlhNTCIgcHVibGljPSJSRUMteG1sLTE5OTgwMjEwIiBzeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLXhtbC0xOTk4MDIxMCIvPgotICAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYW55VHlwZSIgbWl4ZWQ9InRydWUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgTm90IHRoZSByZWFsIHVyVHlwZSwgYnV0IGFzIGNsb3NlIGFuIGFwcHJveGltYXRpb24gYXMgd2UgY2FuCi0gICBnZXQgaW4gdGhlIFhNTCByZXByZXNlbnRhdGlvbjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6c2VxdWVuY2U+Ci0gICA8eHM6YW55IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gIDwveHM6c2VxdWVuY2U+Ci0gIDx4czphbnlBdHRyaWJ1dGUgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgRmlyc3QgdGhlIGJ1aWx0LWluIHByaW1pdGl2ZSBkYXRhdHlwZXMuICBUaGVzZSBkZWZpbml0aW9ucyBhcmUgZm9yCi0gICAgICBpbmZvcm1hdGlvbiBvbmx5LCB0aGUgcmVhbCBidWlsdC1pbiBkZWZpbml0aW9ucyBhcmUgbWFnaWMuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotCi0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBGb3IgZWFjaCBidWlsdC1pbiBkYXRhdHlwZSBpbiB0aGlzIHNjaGVtYSAoYm90aCBwcmltaXRpdmUgYW5kCi0gICAgICBkZXJpdmVkKSBjYW4gYmUgdW5pcXVlbHkgYWRkcmVzc2VkIHZpYSBhIFVSSSBjb25zdHJ1Y3RlZAotICAgICAgYXMgZm9sbG93czoKLSAgICAgICAgMSkgdGhlIGJhc2UgVVJJIGlzIHRoZSBVUkkgb2YgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlCi0gICAgICAgIDIpIHRoZSBmcmFnbWVudCBpZGVudGlmaWVyIGlzIHRoZSBuYW1lIG9mIHRoZSBkYXRhdHlwZQotCi0gICAgICBGb3IgZXhhbXBsZSwgdG8gYWRkcmVzcyB0aGUgaW50IGRhdGF0eXBlLCB0aGUgVVJJIGlzOgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludAotCi0gICAgICBBZGRpdGlvbmFsbHksIGVhY2ggZmFjZXQgZGVmaW5pdGlvbiBlbGVtZW50IGNhbiBiZSB1bmlxdWVseQotICAgICAgYWRkcmVzc2VkIHZpYSBhIFVSSSBjb25zdHJ1Y3RlZCBhcyBmb2xsb3dzOgotICAgICAgICAxKSB0aGUgYmFzZSBVUkkgaXMgdGhlIFVSSSBvZiB0aGUgWE1MIFNjaGVtYSBuYW1lc3BhY2UKLSAgICAgICAgMikgdGhlIGZyYWdtZW50IGlkZW50aWZpZXIgaXMgdGhlIG5hbWUgb2YgdGhlIGZhY2V0Ci0KLSAgICAgIEZvciBleGFtcGxlLCB0byBhZGRyZXNzIHRoZSBtYXhJbmNsdXNpdmUgZmFjZXQsIHRoZSBVUkkgaXM6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbWF4SW5jbHVzaXZlCi0KLSAgICAgIEFkZGl0aW9uYWxseSwgZWFjaCBmYWNldCB1c2FnZSBpbiBhIGJ1aWx0LWluIGRhdGF0eXBlIGRlZmluaXRpb24KLSAgICAgIGNhbiBiZSB1bmlxdWVseSBhZGRyZXNzZWQgdmlhIGEgVVJJIGNvbnN0cnVjdGVkIGFzIGZvbGxvd3M6Ci0gICAgICAgIDEpIHRoZSBiYXNlIFVSSSBpcyB0aGUgVVJJIG9mIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZQotICAgICAgICAyKSB0aGUgZnJhZ21lbnQgaWRlbnRpZmllciBpcyB0aGUgbmFtZSBvZiB0aGUgZGF0YXR5cGUsIGZvbGxvd2VkCi0gICAgICAgICAgIGJ5IGEgcGVyaW9kICgiLiIpIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIHRoZSBmYWNldAotCi0gICAgICBGb3IgZXhhbXBsZSwgdG8gYWRkcmVzcyB0aGUgdXNhZ2Ugb2YgdGhlIG1heEluY2x1c2l2ZSBmYWNldCBpbgotICAgICAgdGhlIGRlZmluaXRpb24gb2YgaW50LCB0aGUgVVJJIGlzOgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludC5tYXhJbmNsdXNpdmUKLQotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InN0cmluZyIgaWQ9InN0cmluZyI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jc3RyaW5nIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJwcmVzZXJ2ZSIgaWQ9InN0cmluZy5wcmVzZXJ2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJib29sZWFuIiBpZD0iYm9vbGVhbiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IiB2YWx1ZT0iZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNib29sZWFuIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJib29sZWFuLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZmxvYXQiIGlkPSJmbG9hdCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InRvdGFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIgdmFsdWU9ImZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNmbG9hdCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZmxvYXQud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkb3VibGUiIGlkPSJkb3VibGUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJ0b3RhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiIHZhbHVlPSJmaW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZG91YmxlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZG91YmxlLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZGVjaW1hbCIgaWQ9ImRlY2ltYWwiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0idG90YWxEaWdpdHMiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJmcmFjdGlvbkRpZ2l0cyIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0idG90YWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJkZWNpbWFsLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotCi0gICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkdXJhdGlvbiIgaWQ9ImR1cmF0aW9uIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2R1cmF0aW9uIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZHVyYXRpb24ud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkYXRlVGltZSIgaWQ9ImRhdGVUaW1lIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkYXRlVGltZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImRhdGVUaW1lLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idGltZSIgaWQ9InRpbWUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3RpbWUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJ0aW1lLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZGF0ZSIgaWQ9ImRhdGUiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImRhdGUud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJnWWVhck1vbnRoIiBpZD0iZ1llYXJNb250aCI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnWWVhck1vbnRoIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZ1llYXJNb250aC53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImdZZWFyIiBpZD0iZ1llYXIiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dZZWFyIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZ1llYXIud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImdNb250aERheSIgaWQ9ImdNb250aERheSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ01vbnRoRGF5Ii8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgZml4ZWQ9InRydWUiCi0gICAgICAgICAgICAgICAgaWQ9ImdNb250aERheS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImdEYXkiIGlkPSJnRGF5Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ0RheSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBpZD0iZ0RheS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0iZ01vbnRoIiBpZD0iZ01vbnRoIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ01vbnRoIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICAgICAgICAgIGlkPSJnTW9udGgud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iaGV4QmluYXJ5IiBpZD0iaGV4QmluYXJ5Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNiaW5hcnkiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImhleEJpbmFyeS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImJhc2U2NEJpbmFyeSIgaWQ9ImJhc2U2NEJpbmFyeSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNiYXNlNjRCaW5hcnkiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImJhc2U2NEJpbmFyeS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYW55VVJJIiBpZD0iYW55VVJJIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNhbnlVUkkiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJhbnlVUkkud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iUU5hbWUiIGlkPSJRTmFtZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNRTmFtZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9IlFOYW1lLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgIDx4czpzaW1wbGVUeXBlIG5hbWU9Ik5PVEFUSU9OIiBpZD0iTk9UQVRJT04iPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk9UQVRJT04iLz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgICBOT1RBVElPTiBjYW5ub3QgYmUgdXNlZCBkaXJlY3RseSBpbiBhIHNjaGVtYTsgcmF0aGVyIGEgdHlwZQotICAgICAgICBtdXN0IGJlIGRlcml2ZWQgZnJvbSBpdCBieSBzcGVjaWZ5aW5nIGF0IGxlYXN0IG9uZSBlbnVtZXJhdGlvbgotICAgICAgICBmYWNldCB3aG9zZSB2YWx1ZSBpcyB0aGUgbmFtZSBvZiBhIE5PVEFUSU9OIGRlY2xhcmVkIGluIHRoZQotICAgICAgICBzY2hlbWEuCi0gICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iTk9UQVRJT04ud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIE5vdyB0aGUgZGVyaXZlZCBwcmltaXRpdmUgdHlwZXMKLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJub3JtYWxpemVkU3RyaW5nIiBpZD0ibm9ybWFsaXplZFN0cmluZyI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNub3JtYWxpemVkU3RyaW5nIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9InJlcGxhY2UiCi0gICAgICAgIGlkPSJub3JtYWxpemVkU3RyaW5nLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idG9rZW4iIGlkPSJ0b2tlbiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN0b2tlbiIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9ybWFsaXplZFN0cmluZyI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiIGlkPSJ0b2tlbi53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Imxhbmd1YWdlIiBpZD0ibGFuZ3VhZ2UiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbGFuZ3VhZ2UiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgIDx4czpwYXR0ZXJuCi0gICAgICAgIHZhbHVlPSJbYS16QS1aXXsxLDh9KC1bYS16QS1aMC05XXsxLDh9KSoiCi0gICAgICAgICAgICAgICAgaWQ9Imxhbmd1YWdlLnBhdHRlcm4iPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCNOVC1MYW5ndWFnZUlEIj4KLSAgICAgICAgICAgIHBhdHRlcm4gc3BlY2lmaWVzIHRoZSBjb250ZW50IG9mIHNlY3Rpb24gMi4xMiBvZiBYTUwgMS4wZTIKLSAgICAgICAgICAgIGFuZCBSRkMgMzA2NiAoUmV2aXNlZCB2ZXJzaW9uIG9mIFJGQyAxNzY2KS4KLSAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDwveHM6cGF0dGVybj4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iSURSRUZTIiBpZD0iSURSRUZTIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0lEUkVGUyIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOklEUkVGIi8+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czptaW5MZW5ndGggdmFsdWU9IjEiIGlkPSJJRFJFRlMubWluTGVuZ3RoIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9IkVOVElUSUVTIiBpZD0iRU5USVRJRVMiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluTGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4TGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jRU5USVRJRVMiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpFTlRJVFkiLz4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOm1pbkxlbmd0aCB2YWx1ZT0iMSIgaWQ9IkVOVElUSUVTLm1pbkxlbmd0aCIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJOTVRPS0VOIiBpZD0iTk1UT0tFTiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOTVRPS0VOIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iXGMrIiBpZD0iTk1UT0tFTi5wYXR0ZXJuIj4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwjTlQtTm10b2tlbiI+Ci0gICAgICAgICAgICBwYXR0ZXJuIG1hdGNoZXMgcHJvZHVjdGlvbiA3IGZyb20gdGhlIFhNTCBzcGVjCi0gICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8L3hzOnBhdHRlcm4+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Ik5NVE9LRU5TIiBpZD0iTk1UT0tFTlMiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluTGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4TGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk1UT0tFTlMiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpOTVRPS0VOIi8+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czptaW5MZW5ndGggdmFsdWU9IjEiIGlkPSJOTVRPS0VOUy5taW5MZW5ndGgiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTmFtZSIgaWQ9Ik5hbWUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTmFtZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IlxpXGMqIiBpZD0iTmFtZS5wYXR0ZXJuIj4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCNOVC1OYW1lIj4KLSAgICAgICAgICAgIHBhdHRlcm4gbWF0Y2hlcyBwcm9kdWN0aW9uIDUgZnJvbSB0aGUgWE1MIHNwZWMKLSAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDwveHM6cGF0dGVybj4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTkNOYW1lIiBpZD0iTkNOYW1lIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05DTmFtZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TmFtZSI+Ci0gICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iW1xpLVs6XV1bXGMtWzpdXSoiIGlkPSJOQ05hbWUucGF0dGVybiI+Ci0gICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sLW5hbWVzLyNOVC1OQ05hbWUiPgotICAgICAgICAgICAgcGF0dGVybiBtYXRjaGVzIHByb2R1Y3Rpb24gNCBmcm9tIHRoZSBOYW1lc3BhY2VzIGluIFhNTCBzcGVjCi0gICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8L3hzOnBhdHRlcm4+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJJRCIgaWQ9IklEIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0lEIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOQ05hbWUiLz4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iSURSRUYiIGlkPSJJRFJFRiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNJRFJFRiIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIi8+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgIDx4czpzaW1wbGVUeXBlIG5hbWU9IkVOVElUWSIgaWQ9IkVOVElUWSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNFTlRJVFkiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5DTmFtZSIvPgotICAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImludGVnZXIiIGlkPSJpbnRlZ2VyIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2ludGVnZXIiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmRlY2ltYWwiPgotICAgICAgPHhzOmZyYWN0aW9uRGlnaXRzIHZhbHVlPSIwIiBmaXhlZD0idHJ1ZSIgaWQ9ImludGVnZXIuZnJhY3Rpb25EaWdpdHMiLz4KLSAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSdbLStdP1swLTldKycvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJub25Qb3NpdGl2ZUludGVnZXIiIGlkPSJub25Qb3NpdGl2ZUludGVnZXIiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9uUG9zaXRpdmVJbnRlZ2VyIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnRlZ2VyIj4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjAiIGlkPSJub25Qb3NpdGl2ZUludGVnZXIubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Im5lZ2F0aXZlSW50ZWdlciIgaWQ9Im5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNuZWdhdGl2ZUludGVnZXIiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vblBvc2l0aXZlSW50ZWdlciI+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSItMSIgaWQ9Im5lZ2F0aXZlSW50ZWdlci5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ibG9uZyIgaWQ9ImxvbmciPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIgdmFsdWU9ImZpbml0ZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbG9uZyIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aW50ZWdlciI+Ci0gICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSItOTIyMzM3MjAzNjg1NDc3NTgwOCIgaWQ9ImxvbmcubWluSW5jbHVzaXZlIi8+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSI5MjIzMzcyMDM2ODU0Nzc1ODA3IiBpZD0ibG9uZy5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iaW50IiBpZD0iaW50Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2ludCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bG9uZyI+Ci0gICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSItMjE0NzQ4MzY0OCIgaWQ9ImludC5taW5JbmNsdXNpdmUiLz4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjIxNDc0ODM2NDciIGlkPSJpbnQubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InNob3J0IiBpZD0ic2hvcnQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jc2hvcnQiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludCI+Ci0gICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSItMzI3NjgiIGlkPSJzaG9ydC5taW5JbmNsdXNpdmUiLz4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjMyNzY3IiBpZD0ic2hvcnQubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImJ5dGUiIGlkPSJieXRlIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2J5dGUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnNob3J0Ij4KLSAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9Ii0xMjgiIGlkPSJieXRlLm1pbkluY2x1c2l2ZSIvPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMTI3IiBpZD0iYnl0ZS5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ibm9uTmVnYXRpdmVJbnRlZ2VyIiBpZD0ibm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25vbk5lZ2F0aXZlSW50ZWdlciIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aW50ZWdlciI+Ci0gICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSIwIiBpZD0ibm9uTmVnYXRpdmVJbnRlZ2VyLm1pbkluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ1bnNpZ25lZExvbmciIGlkPSJ1bnNpZ25lZExvbmciPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIgdmFsdWU9ImZpbml0ZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRMb25nIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMTg0NDY3NDQwNzM3MDk1NTE2MTUiCi0gICAgICAgIGlkPSJ1bnNpZ25lZExvbmcubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InVuc2lnbmVkSW50IiBpZD0idW5zaWduZWRJbnQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRJbnQiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnVuc2lnbmVkTG9uZyI+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSI0Mjk0OTY3Mjk1IgotICAgICAgICBpZD0idW5zaWduZWRJbnQubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InVuc2lnbmVkU2hvcnQiIGlkPSJ1bnNpZ25lZFNob3J0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Vuc2lnbmVkU2hvcnQiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnVuc2lnbmVkSW50Ij4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjY1NTM1IgotICAgICAgICBpZD0idW5zaWduZWRTaG9ydC5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idW5zaWduZWRCeXRlIiBpZD0idW5zaWduZWRCeXRlIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Vuc2lnbmVkQnl0ZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dW5zaWduZWRTaG9ydCI+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIyNTUiIGlkPSJ1bnNpZ25lZEJ5dGUubWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InBvc2l0aXZlSW50ZWdlciIgaWQ9InBvc2l0aXZlSW50ZWdlciI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNwb3NpdGl2ZUludGVnZXIiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSIxIiBpZD0icG9zaXRpdmVJbnRlZ2VyLm1pbkluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImRlcml2YXRpb25Db250cm9sIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzdWJzdGl0dXRpb24iLz4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5zaW9uIi8+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlc3RyaWN0aW9uIi8+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imxpc3QiLz4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idW5pb24iLz4KLSAgPC94czpyZXN0cmljdGlvbj4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6Z3JvdXAgbmFtZT0ic2ltcGxlRGVyaXZhdGlvbiI+Ci0gIDx4czpjaG9pY2U+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpyZXN0cmljdGlvbiIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6bGlzdCIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6dW5pb24iLz4KLSAgPC94czpjaG9pY2U+Ci0gPC94czpncm91cD4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9InNpbXBsZURlcml2YXRpb25TZXQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgI2FsbCBvciAocG9zc2libHkgZW1wdHkpIHN1YnNldCBvZiB7cmVzdHJpY3Rpb24sIHVuaW9uLCBsaXN0fQotICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBBIHV0aWxpdHkgdHlwZSwgbm90IGZvciBwdWJsaWMgdXNlPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czp1bmlvbj4KLSAgIDx4czpzaW1wbGVUeXBlPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2FsbCIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZGVyaXZhdGlvbkNvbnRyb2wiPgotICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imxpc3QiLz4KLSAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmlvbiIvPgotICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlc3RyaWN0aW9uIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNpbXBsZVR5cGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgICAgIDx4czpncm91cCByZWY9InhzOnNpbXBsZURlcml2YXRpb24iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaW5hbCIgdHlwZT0ieHM6c2ltcGxlRGVyaXZhdGlvblNldCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSI+Ci0gICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgQ2FuIGJlIHJlc3RyaWN0ZWQgdG8gcmVxdWlyZWQgb3IgZm9yYmlkZGVuCi0gICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRvcExldmVsU2ltcGxlVHlwZSI+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnNpbXBsZVR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpzaW1wbGVEZXJpdmF0aW9uIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIKLSAgICAgICAgICAgICB0eXBlPSJ4czpOQ05hbWUiPgotICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIFJlcXVpcmVkIGF0IHRoZSB0b3AgbGV2ZWwKLSAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbFNpbXBsZVR5cGUiPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6c2ltcGxlRGVyaXZhdGlvbiIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icHJvaGliaXRlZCI+Ci0gICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgRm9yYmlkZGVuIHdoZW4gbmVzdGVkCi0gICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaW5hbCIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6dG9wTGV2ZWxTaW1wbGVUeXBlIiBpZD0ic2ltcGxlVHlwZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LXNpbXBsZVR5cGUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6Z3JvdXAgbmFtZT0iZmFjZXRzIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgIFdlIHNob3VsZCB1c2UgYSBzdWJzdGl0dXRpb24gZ3JvdXAgZm9yIGZhY2V0cywgYnV0Ci0gICAgICAgdGhhdCdzIHJ1bGVkIG91dCBiZWNhdXNlIGl0IHdvdWxkIGFsbG93IHVzZXJzIHRvCi0gICAgICAgYWRkIHRoZWlyIG93biwgd2hpY2ggd2UncmUgbm90IHJlYWR5IGZvciB5ZXQuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgPC94czphbm5vdGF0aW9uPgotICAgPHhzOmNob2ljZT4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOm1pbkV4Y2x1c2l2ZSIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6bWluSW5jbHVzaXZlIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czptYXhFeGNsdXNpdmUiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOm1heEluY2x1c2l2ZSIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6dG90YWxEaWdpdHMiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOmZyYWN0aW9uRGlnaXRzIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpsZW5ndGgiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOm1pbkxlbmd0aCIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6bWF4TGVuZ3RoIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czplbnVtZXJhdGlvbiIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6d2hpdGVTcGFjZSIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6cGF0dGVybiIvPgotICAgPC94czpjaG9pY2U+Ci0gIDwveHM6Z3JvdXA+Ci0KLSAgPHhzOmdyb3VwIG5hbWU9InNpbXBsZVJlc3RyaWN0aW9uTW9kZWwiPgotICAgPHhzOnNlcXVlbmNlPgotICAgIDx4czplbGVtZW50IG5hbWU9InNpbXBsZVR5cGUiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPHhzOmdyb3VwIHJlZj0ieHM6ZmFjZXRzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmdyb3VwPgotCi0gIDx4czplbGVtZW50IG5hbWU9InJlc3RyaWN0aW9uIiBpZD0icmVzdHJpY3Rpb24iPgotICAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LXJlc3RyaWN0aW9uIj4KLSAgICAgICAgICBiYXNlIGF0dHJpYnV0ZSBhbmQgc2ltcGxlVHlwZSBjaGlsZCBhcmUgbXV0dWFsbHkKLSAgICAgICAgICBleGNsdXNpdmUsIGJ1dCBvbmUgb3Igb3RoZXIgaXMgcmVxdWlyZWQKLSAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpzaW1wbGVSZXN0cmljdGlvbk1vZGVsIi8+Ci0gICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJhc2UiIHR5cGU9InhzOlFOYW1lIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibGlzdCIgaWQ9Imxpc3QiPgotICAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LWxpc3QiPgotICAgICAgICAgIGl0ZW1UeXBlIGF0dHJpYnV0ZSBhbmQgc2ltcGxlVHlwZSBjaGlsZCBhcmUgbXV0dWFsbHkKLSAgICAgICAgICBleGNsdXNpdmUsIGJ1dCBvbmUgb3Igb3RoZXIgaXMgcmVxdWlyZWQKLSAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpdGVtVHlwZSIgdHlwZT0ieHM6UU5hbWUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ1bmlvbiIgaWQ9InVuaW9uIj4KLSAgIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC11bmlvbiI+Ci0gICAgICAgICAgbWVtYmVyVHlwZXMgYXR0cmlidXRlIG11c3QgYmUgbm9uLWVtcHR5IG9yIHRoZXJlIG11c3QgYmUKLSAgICAgICAgICBhdCBsZWFzdCBvbmUgc2ltcGxlVHlwZSBjaGlsZAotICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZW1iZXJUeXBlcyIgdXNlPSJvcHRpb25hbCI+Ci0gICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOlFOYW1lIi8+Ci0gICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2V0Ij4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaXhlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIKLSAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJub0ZpeGVkRmFjZXQiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZmFjZXQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZml4ZWQiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Im1pbkV4Y2x1c2l2ZSIgaWQ9Im1pbkV4Y2x1c2l2ZSIgdHlwZT0ieHM6ZmFjZXQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1taW5FeGNsdXNpdmUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibWluSW5jbHVzaXZlIiBpZD0ibWluSW5jbHVzaXZlIiB0eXBlPSJ4czpmYWNldCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LW1pbkluY2x1c2l2ZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czplbGVtZW50IG5hbWU9Im1heEV4Y2x1c2l2ZSIgaWQ9Im1heEV4Y2x1c2l2ZSIgdHlwZT0ieHM6ZmFjZXQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1tYXhFeGNsdXNpdmUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibWF4SW5jbHVzaXZlIiBpZD0ibWF4SW5jbHVzaXZlIiB0eXBlPSJ4czpmYWNldCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LW1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJudW1GYWNldCI+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmZhY2V0Ij4KLSAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idG90YWxEaWdpdHMiIGlkPSJ0b3RhbERpZ2l0cyI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LXRvdGFsRGlnaXRzIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm51bUZhY2V0Ij4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6cG9zaXRpdmVJbnRlZ2VyIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotICA8eHM6ZWxlbWVudCBuYW1lPSJmcmFjdGlvbkRpZ2l0cyIgaWQ9ImZyYWN0aW9uRGlnaXRzIiB0eXBlPSJ4czpudW1GYWNldCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LWZyYWN0aW9uRGlnaXRzIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibGVuZ3RoIiBpZD0ibGVuZ3RoIiB0eXBlPSJ4czpudW1GYWNldCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LWxlbmd0aCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotICA8eHM6ZWxlbWVudCBuYW1lPSJtaW5MZW5ndGgiIGlkPSJtaW5MZW5ndGgiIHR5cGU9InhzOm51bUZhY2V0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbWluTGVuZ3RoIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0gIDx4czplbGVtZW50IG5hbWU9Im1heExlbmd0aCIgaWQ9Im1heExlbmd0aCIgdHlwZT0ieHM6bnVtRmFjZXQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1tYXhMZW5ndGgiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGlvbiIgaWQ9ImVudW1lcmF0aW9uIiB0eXBlPSJ4czpub0ZpeGVkRmFjZXQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1lbnVtZXJhdGlvbiIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czplbGVtZW50IG5hbWU9IndoaXRlU3BhY2UiIGlkPSJ3aGl0ZVNwYWNlIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtd2hpdGVTcGFjZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpmYWNldCI+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByZXNlcnZlIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZXBsYWNlIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjb2xsYXBzZSIvPgotICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJwYXR0ZXJuIiBpZD0icGF0dGVybiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LXBhdHRlcm4iLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9GaXhlZEZhY2V0Ij4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9qYXZhc3JjL1NpbXBsZVBlcnNvblRlc3QuamF2YSBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9qYXZhc3JjL1NpbXBsZVBlcnNvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZmNmM3ZS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9zaW1wbGUvamF2YXNyYy9TaW1wbGVQZXJzb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotaW1wb3J0IG9yZy5vcGVudXJpLm15dGVzdC5QZXJzb247Ci1pbXBvcnQgb3JnLm9wZW51cmkubXl0ZXN0LkN1c3RvbWVyRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IGRydGNhc2VzLlRlc3RFbnY7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5Sb290OwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlUGVyc29uVGVzdAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRlc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEN1c3RvbWVyRG9jdW1lbnQgZG9jID0KLSAgICAgICAgICAgIEN1c3RvbWVyRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL3NpbXBsZS9wZXJzb24ueG1sIiksIG51bGwpOwotCi0gICAgICAgIC8vIE1vdmUgZnJvbSB0aGUgcm9vdCB0byB0aGUgcm9vdCBjdXN0b21lciBlbGVtZW50Ci0gICAgICAgIFBlcnNvbiBwZXJzb24gPSBkb2MuZ2V0Q3VzdG9tZXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSG93ZHkiLCBwZXJzb24uZ2V0Rmlyc3RuYW1lKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQsICAgcGVyc29uLnNpemVPZk51bWJlckFycmF5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQzNiwgcGVyc29uLmdldE51bWJlckFycmF5KDApKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMjMsIHBlcnNvbi5nZXROdW1iZXJBcnJheSgxKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDQsICBwZXJzb24uZ2V0TnVtYmVyQXJyYXkoMikpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDkzMywgcGVyc29uLmdldE51bWJlckFycmF5KDMpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCAgIHBlcnNvbi5zaXplT2ZCaXJ0aGRheUFycmF5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBEYXRlKCJUdWUgQXVnIDI1IDE3OjAwOjAwIFBEVCAxOTk4IiksIHBlcnNvbi5nZXRCaXJ0aGRheUFycmF5KDApKTsKLQotICAgICAgICBQZXJzb24uR2VuZGVyLkVudW0gZyA9IHBlcnNvbi5nZXRHZW5kZXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhQZXJzb24uR2VuZGVyLk1BTEUsIGcpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkVHSVFUV1laSiIsIG5ldyBTdHJpbmcocGVyc29uLmdldEhleCgpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlRoaXMgc3RyaW5nIGlzIGJhc2U2NEJpbmFyeSBlbmNvZGVkISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhwZXJzb24uZ2V0QmFzZTY0KCkpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJHR0lRVFdZR0ciLCBuZXcgU3RyaW5nKHBlcnNvbi5nZXRIZXhBdHQoKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGlzIHN0cmluZyBpcyBiYXNlNjRCaW5hcnkgZW5jb2RlZCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcocGVyc29uLmdldEJhc2U2NEF0dCgpKSk7Ci0KLSAgICAgICAgcGVyc29uLnNldEZpcnN0bmFtZSgiR2VvcmdlIik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdlb3JnZSIsIHBlcnNvbi5nZXRGaXJzdG5hbWUoKSk7Ci0KLSAgICAgICAgcGVyc29uLnNldEhleCgiaGV4IGVuY29kaW5nIi5nZXRCeXRlcygpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaGV4IGVuY29kaW5nIiwgbmV3IFN0cmluZyhwZXJzb24uZ2V0SGV4KCkpKTsKLQotICAgICAgICBwZXJzb24uc2V0QmFzZTY0KCJiYXNlNjQgZW5jb2RlZCIuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImJhc2U2NCBlbmNvZGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKHBlcnNvbi5nZXRCYXNlNjQoKSkpOwotCi0gICAgICAgIC8vcGVyc29uLnNldEhleEF0dCgiaGV4IGVuY29kaW5nIGluIGF0dHJpYnV0ZXMiLmdldEJ5dGVzKCkpOwotICAgICAgICAvL0Fzc2VydC5hc3NlcnRFcXVhbHMoImhleCBlbmNvZGluZyBpbiBhdHRyaWJ1dGVzIiwKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcocGVyc29uLmdldEhleEF0dCgpKSk7Ci0KLSAgICAgICAgLy9wZXJzb24uc2V0QmFzZTY0QXR0KCJiYXNlNjQgZW5jb2RlZCBpbiBhdHRyaWJ1dGVzIi5nZXRCeXRlcygpKTsKLSAgICAgICAgLy9Bc3NlcnQuYXNzZXJ0RXF1YWxzKCJiYXNlNjQgZW5jb2RlZCBpbiBhdHRyaWJ1dGVzIiwKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcocGVyc29uLmdldEJhc2U2NEF0dCgpKSk7Ci0vLwotLy8gICAgICAgIFhtbEN1cnNvciBjcCA9IHBlcnNvbi5uZXdYbWxDdXJzb3IoKTsKLS8vICAgICAgICBSb290LmR1bXAoIGNwICk7Ci0KLS8vICAgICAgICBYbWxDdXJzb3IgYyA9IHBlcnNvbi54Z2V0QmlydGhkYXlBcnJheSgwKS5uZXdYbWxDdXJzb3IoKTsKLQotLy8gICAgICAgIFJvb3QuZHVtcCggYyApOwotCi0vLyAgICAgICAgcGVyc29uLnNldEJpcnRoZGF5KDAsbmV3IERhdGUoIlR1ZSBBdWcgMjUgMTY6MDA6MDAgUERUIDIwMDEiKSk7Ci0KLS8vICAgICAgICBSb290LmR1bXAoIGMgKTsKLQotLy8gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLQotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIi0tLSIgKyBjLmdldFRleHQoKSArICItLS0iICk7Ci0KLS8vICAgICAgICBSb290LmR1bXAoIGMgKTsKLQotLy8gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocGVyc29uLmdldEJpcnRoZGF5QXJyYXkoMCksIG5ldyBEYXRlKCJUdWUgQXVnIDI1IDE2OjAwOjAwIFBEVCAyMDAyIikpOwotLy8KLS8vICAgICAgICBwZXJzb24uc2V0Rmlyc3RuYW1lKCJHZW9yZ2UiKTsKLS8vICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHBlcnNvbi5nZXRGaXJzdG5hbWUoKSwgIkdlb3JnZSIpOwotLy8KLS8vICAgICAgICBwZXJzb24uYWRkTnVtYmVyKCAoc2hvcnQpIDY5ICk7Ci0vLyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwZXJzb24uY291bnROdW1iZXIoKSwgNSk7Ci0vLyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwZXJzb24uZ2V0TnVtYmVyQXJyYXkoNCksIDY5KTsKLS8vCi0vLwotLy8gICAgICAgIHdoaWxlICggYy5oYXNOZXh0VG9rZW4oKSApCi0vLyAgICAgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9zaW1wbGUvcGVyc29uLnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9wZXJzb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmFmMzVhLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9wZXJzb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPGN1c3RvbWVyIHhtbG5zPSJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IgotICBnZW5kZXI9Im1hbGUiCi0gIGhleEF0dD0iNDc0NzQ5NTE1NDU3NTk0NzQ3IgotICBiYXNlNjRBdHQ9IiAgICAgICAgCi0JVkdocGN5QnpkSEpwYm1jZ2FYTWdZbUZ6WlRZMFFtbHVZWEo1SUdWdVkyOWtaV1FoCi0JICAiPgotICA8Zmlyc3RuYW1lPkhvd2R5PC9maXJzdG5hbWU+Ci0gIDxudW1iZXI+NDM2PC9udW1iZXI+Ci0gIDxudW1iZXI+MTIzPC9udW1iZXI+Ci0gIDxiaXJ0aGRheT4xOTk4LTA4LTI2WjwvYmlydGhkYXk+Ci0gIDxudW1iZXI+NDQ8L251bWJlcj4KLSAgPG51bWJlcj45MzM8L251bWJlcj4KLSAgPGJpcnRoZGF5PjIwMDAtMDgtMDYtMDg6MDA8L2JpcnRoZGF5PgotICA8aGV4PjQ1NDc0OTUxNTQ1NzU5NUE0QTwvaGV4PgotICA8YmFzZTY0PlZHaHBjeUJ6ZEhKcGJtY2dhWE1nWW1GelpUWTBRbWx1WVhKNUlHVnVZMjlrWldRaDwvYmFzZTY0PgotPC9jdXN0b21lcj4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9wZXJzb24ueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlL3BlcnNvbi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ODZlY2IuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlL3BlcnNvbi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczptdD0iaHR0cDovL29wZW51cmkub3JnL215dGVzdCIKLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL215dGVzdCIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiA+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNvbiI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZmlyc3RuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgIDx4czpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJudW1iZXIiPgotICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aW50ZWdlciI+Ci0gICAgICAgICAgICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIxMDAwIi8+Ci0gICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9ImJpcnRoZGF5IiB0eXBlPSJ4czpkYXRlIi8+Ci0gICAgICA8L3hzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImhleCIgdHlwZT0ieHM6aGV4QmluYXJ5Ii8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJiYXNlNjQiIHR5cGU9InhzOmJhc2U2NEJpbmFyeSIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJnZW5kZXIiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im1hbGUiLz4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZlbWFsZSIvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6YXR0cmlidXRlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaGV4QXR0Ij4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aGV4QmluYXJ5Ij4KLSAgICAgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iKFs0NV1bMC05QS1GXSkqIi8+Ci0gICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJhc2U2NEF0dCI+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmJhc2U2NEJpbmFyeSI+Ci0gICAgICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIi8+Ci0gICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJWR2hwY3lCemRISnBibWNnYVhNZ1ltRnpaVFkwUW1sdVlYSjVJR1Z1WTI5a1pXUWgiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6YXR0cmlidXRlPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImN1c3RvbWVyIiB0eXBlPSJtdDpwZXJzb24iLz4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJlbXBsb3llZSI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9Im10OnBlcnNvbiI+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZWlkIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi08L3hzOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlL3NpbXBsZWMueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlL3NpbXBsZWMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzA3NmE5Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9zaW1wbGVjLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIHhtbG5zOm10PSJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IgotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IgotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNpbXBsaWNpdHkiPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9Im10OnRob3VzYW5kIj4KLSAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5vdGUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idGhvdXNhbmQiPgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludGVnZXIiPgotICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSIxIi8+Ci0gICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjEwMDAiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGUiIHR5cGU9Im10OnNpbXBsaWNpdHkiLz4KLQotPC94czpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS8wMDNfcHJvY2Vzc19wb18wMDcueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpLzAwM19wcm9jZXNzX3BvXzAwNy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ODljNmMuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpLzAwM19wcm9jZXNzX3BvXzAwNy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgIExpY2Vuc2UgaW5mb3JtYXRpb24gZm9yIHRoaXMgZmlsZSBpcyBwcm92aWRlZCBpbiBMSUNFTlNFLlRYVCwgYXMgcHVibGlzaGVkCi0gICAgICBvbiB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgd2ViIHNpdGUuIHd3dy5vcGVuYXBwbGljYXRpb25zLm9yZwotCi0gICAgICBGb3Igc3VwcG9ydCwgbW9yZSBpbmZvcm1hdGlvbiwgb3IgdG8gcmVwb3J0IGltcGxlbWVudGF0aW9uIGJ1Z3MsCi0gICAgICBwbGVhc2UgY29udGFjdCB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgYXQgeG1sQG9wZW5hcHBsaWNhdGlvbnMub3JnCi0KLSAgICAkUmV2aXNpb246IDEuMSAkCi0gICAgJERhdGU6IDIwMDMvMDkvMTUgMTg6MjA6NDIgJAotICAgIE9wZW4gQXBwbGljYXRpb25zIEdyb3VwIFhTRAotICAgIENvcHlyaWdodCAxOTk4LTIwMDEsIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotICAgJE5hbWU6ICAkCi0KLWNtawk2LjIuMCAgIAkxMS8yMi8xOTk5CUluaXRpYWwgUmVsZWFzZSAtIHVwZGF0ZSBmcm9tIHZlcnNpb24gMDAzCi0JCQkJCQkJQWRkIFBPTE5TVEFUVVMsIERBVEVUSU1FLk5FRURERUxWIHRvIFBPT1JERVJMSU4KLQkJCQkJCQlGaXggcHJvY2Vzc2luZyBub3RlIHJ1bGVzCi1yamoJNy4wLjAJCTEwLzE1LzIwMDAJU3BlY2lhbCBSZXZpc2lvbiBVcGRhdGUKLXJqagk3LjAuMgkJMTEvMjQvMjAwMAlBbGxvdyBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgTk9URVMuCi1tbHIJNy4xCQkwNC8xNi8yMDAxCUFkZCBBVFRDSFJFRiB0byBCT0QuCi1hancJCTcuMi4xCQkJMTAvMzEvMjAwMQkJVzNDIFNjaGVtYSBSZWxlYXNlIAotCi1TdHJ1Y3R1cmUgT3ZlcnZpZXcKLQotCVBST0NFU1NfUE8gKFBPT1JERVJIRFIsIFBPT1JERVJMSU4rKQotCQlQT09SREVSSERSIChQQVJUTkVSKywgQVRUQ0hSRUYqLCBDSEFSR0UqLCBQT1RFUk0qKQotCQkJUE9URVJNICgpCi0JCVBPT1JERVJMSU4gKEFUVENIUkVGKiwgQ0hBUkdFKiwgRElTVFJJQlVUTiosIFBBUlRORVIqLCBQT1RFUk0qLCAKLQkJICBQT0JTVUJMSU5FKiwgUE9MSU5FU0NIRCopCi0JCQlQT1RFUk0gKCkKLQkJCVBPU1VCTElORSAoKQotCQkJUE9MSU5FU0NIRCAoKQotCi1Ob3RlczoKLQotLS0+Ci08eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy8wMDNfcHJvY2Vzc19wb18wMDciIHhtbG5zOm9zPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX3NlZ21lbnRzIiB4bWxuczpvZj0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19maWVsZHMiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvMDAzX3Byb2Nlc3NfcG9fMDA3Ij4KLQk8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19zZWdtZW50cyIgc2NoZW1hTG9jYXRpb249Im9hZ2lzX3NlZ21lbnRzLnhzZCIvPgotCTx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX2ZpZWxkcyIgc2NoZW1hTG9jYXRpb249Im9hZ2lzX2ZpZWxkcy54c2QiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk9DRVNTX1BPXzAwNyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkNOVFJPTEFSRUEiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9IkRBVEFBUkVBIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iREFUQUFSRUEiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJQUk9DRVNTX1BPIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk9DRVNTX1BPIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0iUE9PUkRFUkhEUiIvPgotCQkJCTx4czplbGVtZW50IHJlZj0iUE9PUkRFUkxJTiIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlBPT1JERVJIRFIiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpEQVRFVElNRUFOWSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpPUEVSQU1UIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBPSUQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBPVFlQRSIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6QUNLUkVRVUVTVCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDT05UUkFDVEIiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q09OVFJBQ1RTIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOT1RFUyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6T1BSQU1UQVVUSCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQT1JFTEVBU0UiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VEFYV0hFWE1QVCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpQQVJUTkVSIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6QVRUQ0hSRUYiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkNIQVJHRSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0iUE9URVJNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPCEtLSAoJURBVEVUSU1FLkRPQ1VNRU5UOyk/IC0tPgotCQkJCTwhLS0gKCVPUEVSQU1ULkVYVEVOREVELlQ7KT8gLS0+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT1RFUk0iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VEVSTUlEIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6Y2hvaWNlPgotCQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRBWU9GTU9OVEgiLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UFJPWE1PTlRIIi8+Ci0JCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REFZU05VTSIvPgotCQkJCTwveHM6Y2hvaWNlPgotCQkJCTx4czpjaG9pY2U+Ci0JCQkJCTx4czplbGVtZW50IHJlZj0ib3M6T1BFUkFNVCIvPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOlFVQU5USVRZIi8+Ci0JCQkJCTwhLS0gKCVPUEVSQU1ULkVYVEVOREVELlQ7KT8gLS0+Ci0JCQkJCTwhLS0gKCVRVUFOVElUWS5QRVJDRU5UOykgLS0+Ci0JCQkJPC94czpjaG9pY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPCEtLSAoKERBWU9GTU9OVEgsIFBST1hNT05USCkgfCBEQVlTTlVNKSwgKCglT1BFUkFNVC5FWFRFTkRFRC5UOykgfCAoJVFVQU5USVRZLlBFUkNFTlQ7KSkgLS0+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT09SREVSTElOIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6UVVBTlRJVFkiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOk9QRVJBTVQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UE9MSU5FTlVNIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpEUkFXSU5HIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkhBWlJETUFUTCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNUlYiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTVJWWCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOT1RFUyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UEFDS0lORyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQT0xOU1RBVFVTIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlRBWFdIRVhNUFQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czpjaG9pY2U+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REVTQ1JJUFROIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU0iIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNWCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTSIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNWCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTVgiLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVUEMiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQk8L3hzOmNob2ljZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkFUVENIUkVGIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpDSEFSR0UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRJU1RSSUJVVE4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOlBBUlRORVIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9IlBPVEVSTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0iUE9TVUJMSU5FIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJQT0xJTkVTQ0hEIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPCEtLSAoJVFVQU5USVRZLlBFUkNFTlQ7KSkgLS0+Ci0JCQkJPCEtLSAoJURBVEVUSU1FLk5FRURERUxWOyk/IC0tPgotCQkJCTwhLS0gKCVPUEVSQU1ULlVOSVQuVDspPyAtLT4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlBPU1VCTElORSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOlFVQU5USVRZIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpEUkFXSU5HIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1SViIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNUlZYIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBTQkxJTkVOVU0iIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czpjaG9pY2U+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REVTQ1JJUFROIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU0iIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNWCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTSIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNWCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTVgiLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVUEMiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQk8L3hzOmNob2ljZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8IS0tICglUVVBTlRJVFkuSVRFTTspIC0tPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUE9MSU5FU0NIRCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOlFVQU5USVRZIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UFNDTElORU5VTSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPCEtLSAoJURBVEVUSU1FLk5FRURERUxWOykgLS0+Ci0JCQkJPCEtLSAoJVFVQU5USVRZLk9SREVSRUQ7KSAtLT4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvMDA0X2Fja25vd2xlZGdlX3BvXzAwOC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvMDA0X2Fja25vd2xlZGdlX3BvXzAwOC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNWJjOWIuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpLzAwNF9hY2tub3dsZWRnZV9wb18wMDgueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JTGljZW5zZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBmaWxlIGlzIHByb3ZpZGVkIGluIExJQ0VOU0UuVFhULCBhcyBwdWJsaXNoZWQKLQlvbiB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgd2ViIHNpdGUuIHd3dy5vcGVuYXBwbGljYXRpb25zLm9yZwotCQotCUZvciBzdXBwb3J0LCBtb3JlIGluZm9ybWF0aW9uLCBvciB0byByZXBvcnQgaW1wbGVtZW50YXRpb24gYnVncywKLQlwbGVhc2UgY29udGFjdCB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgYXQgeG1sQG9wZW5hcHBsaWNhdGlvbnMub3JnCi0JCi0JJFJldmlzaW9uOiAxLjEgJAotCSREYXRlOiAyMDAzLzA5LzE1IDE4OjIwOjQyICQKLQlPcGVuIEFwcGxpY2F0aW9ucyBHcm91cCBYU0QKLQlDb3B5cmlnaHQgMTk5OC0yMDAxLCBBbGwgUmlnaHRzIFJlc2VydmVkCi0JCi0JJE5hbWU6ICAkCi0KLQljbWsJNi4yLjAgICAJMTEvMjIvMTk5OQlJbml0aWFsIFJlbGVhc2UgLSBVcGRhdGUgZnJvbSB2ZXJzaW9uIDAwMwotCQkJCQkJCQlBZGQgUE9MTlNUQVRVUywgREFURVRJTUUuTkVFRERFTFYgdG8gUE9PUkRFUkxJTgotCQkJCQkJCQlGaXggcHJvY2Vzc2luZyBub3RlIHJ1bGVzCi0JcmpqCTcuMC4wCTEwLzE1LzIwMDAJU3BlY2lhbCBSZXZpc2lvbiBVcGRhdGUKLQlyamoJNy4wLjIJMTEvMjQvMjAwMAlBbGxvdyBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgTk9URVMuCi0JbWxyCTcuMQkJMDQvMTYvMjAwMQlBZGQgQVRUQ0hSRUYgdG8gQk9ELgotCWFqdyA3LjIJCTA5LzMwLzIwMDEgCU1hZGUgQUNLTElORSBzZWdtZW50ICcwIHRvIG1hbnknIHRpbWVzCi0JYWp3CTcuMi4xCTA5LzAxLzAwCVczQyBTY2hlbWEgUmVsZWFzZQotCi0gICAgU3RydWN0dXJlIE92ZXJ2aWV3Ci0KLSAgICBBQ0tOT1dMRURHRV9QTyAoUE9PUkRFUkhEUiwgUE9PUkRFUkxJTiopCi0gICAgICAgIFBPT1JERVJIRFIgKEFDS0hFQURFUiwgQVRUQ0hSRUYqLCBDSEFSR0UqLCBQQVJUTkVSKiwgUE9URVJNKikKLSAgICAgICAgICAgIEFDS0hFQURFUiAoKQotICAgICAgICAgICAgUE9URVJNICgpCi0gICAgICAgIFBPT1JERVJMSU4gKEFDS0xJTkUqLCBBVFRDSFJFRiosIENIQVJHRSosIERJU1RSSUJVVE4qLCBQQVJUTkVSKiwKLSAgICAgICAgICAgIFBPTElORVNDSEQqLCBQT1NVQkxJTkUqLCBQT1RFUk0qKQotICAgICAgICAgICAgQUNLTElORSAoKQotICAgICAgICAgICAgUEFSVE5FUiAoKQotICAgICAgICAgICAgUE9MSU5FU0NIRCAoKQotICAgICAgICAgICAgUE9TVUJMSU5FICgpCi0gICAgICAgICAgICBQT1RFUk0gKCkKLQotTm90ZXM6Ci0KLS0tPgotPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvMDA0X2Fja25vd2xlZGdlX3BvXzAwOCIgeG1sbnM9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvMDA0X2Fja25vd2xlZGdlX3BvXzAwOCIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpvZj0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19maWVsZHMiIHhtbG5zOm9zPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX3NlZ21lbnRzIj4KLQk8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19zZWdtZW50cyIgc2NoZW1hTG9jYXRpb249Im9hZ2lzX3NlZ21lbnRzLnhzZCIvPgotCTx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX2ZpZWxkcyIgc2NoZW1hTG9jYXRpb249Im9hZ2lzX2ZpZWxkcy54c2QiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0tOT1dMRURHRV9QT18wMDgiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpDTlRST0xBUkVBIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJEQVRBQVJFQSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkRBVEFBUkVBIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0iQUNLTk9XTEVER0VfUE8iLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkFDS05PV0xFREdFX1BPIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0iUE9PUkRFUkhEUiIvPgotCQkJCTx4czplbGVtZW50IHJlZj0iUE9PUkRFUkxJTiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUE9PUkRFUkhEUiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOk9QRVJBTVQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UE9JRCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UE9UWVBFIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpBQ0tSRVFVRVNUIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNPTlRSQUNUQiIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDT05UUkFDVFMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REVTQ1JJUFROIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5PVEVTIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpPUFJBTVRBVVRIIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBPUkVMRUFTRSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpUQVhXSEVYTVBUIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9IkFDS0hFQURFUiIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6QVRUQ0hSRUYiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkNIQVJHRSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6UEFSVE5FUiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0iUE9URVJNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPCEtLSAoJURBVEVUSU1FLkRPQ1VNRU5UOyk/IC0tPgotCQkJCTwhLS0gKCVPUEVSQU1ULkVYVEVOREVELlQ7KT8gLS0+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0tIRUFERVIiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpTRU5ERVIiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkFDS0NPREUiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOT1RFUyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6U0FMRVNPUkRJRCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPCEtLSAoJURBVEVUSU1FLlBST01ERUxWOyk/IC0tPgotCQkJCTwhLS0gKCVEQVRFVElNRS5QUk9NU0hJUDspPyAtLT4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlBPVEVSTSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpURVJNSUQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czpjaG9pY2U+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REFZT0ZNT05USCIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQUk9YTU9OVEgiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpEQVlTTlVNIi8+Ci0JCQkJPC94czpjaG9pY2U+Ci0JCQkJPHhzOmNob2ljZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpPUEVSQU1UIi8+Ci0JCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib3M6UVVBTlRJVFkiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQk8L3hzOmNob2ljZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8IS0tICgoREFZT0ZNT05USCwgUFJPWE1PTlRIKSB8IERBWVNOVU0pLCAoKCVPUEVSQU1ULkVYVEVOREVELlQ7KSB8ICglUVVBTlRJVFkuUEVSQ0VOVDspKSAtLT4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlBPT1JERVJMSU4iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpRVUFOVElUWSIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6REFURVRJTUVBTlkiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6T1BFUkFNVCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQT0xJTkVOVU0iLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRSQVdJTkciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SEFaUkRNQVRMIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1SViIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNUlZYIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5PVEVTIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQQUNLSU5HIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBPTE5TVEFUVVMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VEFYV0hFWE1QVCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmNob2ljZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1YIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1YIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNWCIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVUEMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIvPgotCQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJCTwveHM6Y2hvaWNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0iQUNLTElORSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6QVRUQ0hSRUYiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkNIQVJHRSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6RElTVFJJQlVUTiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6UEFSVE5FUiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0iUE9URVJNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJQT1NVQkxJTkUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9IlBPTElORVNDSEQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8IS0tICglUVVBTlRJVFkuUEVSQ0VOVDspKSAtLT4KLQkJCQk8IS0tICglREFURVRJTUUuTkVFRERFTFY7KT8gLS0+Ci0JCQkJPCEtLSAoJU9QRVJBTVQuVU5JVC5UOyk/IC0tPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQUNLTElORSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOlFVQU5USVRZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkFDS0NPREUiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5PVEVTIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpTQUxFU09SRElEIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8IS0tICglREFURVRJTUUuUFJPTURFTFY7KT8gLS0+Ci0JCQkJPCEtLSAoJURBVEVUSU1FLlBST01TSElQOyk/IC0tPgotCQkJCTwhLS0gKCVRVUFOVElUWS5PUkRFUkVEOyk/IC0tPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUE9TVUJMSU5FIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6UVVBTlRJVFkiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRSQVdJTkciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTVJWIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1SVlgiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UFNCTElORU5VTSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmNob2ljZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1YIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1YIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNWCIvPgotCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVUEMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIvPgotCQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJCTwveHM6Y2hvaWNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwhLS0gKCVRVUFOVElUWS5JVEVNOykgLS0+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT0xJTkVTQ0hEIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6REFURVRJTUVBTlkiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3M6UVVBTlRJVFkiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQU0NMSU5FTlVNIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8IS0tICglREFURVRJTUUuTkVFRERFTFY7KSAtLT4KLQkJCQk8IS0tICglUVVBTlRJVFkuT1JERVJFRDspIC0tPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9PcmRlci54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvT3JkZXIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWRkZDRmLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9PcmRlci54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMDI1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM9InB1YmxpY2lkOm9yZy54Q0JMOnNjaGVtYXMvWENCTDM1L09yZGVyLnhzZCIgdGFyZ2V0TmFtZXNwYWNlPSJwdWJsaWNpZDpvcmcueENCTDpzY2hlbWFzL1hDQkwzNS9PcmRlci54c2QiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbiB4bWw6bGFuZz0iZW4iPgotICAgICAgICAgICAgWE1MIENvbW1vbiBCdXNpbmVzcyBMaWJyYXJ5IDMuNQotICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDAgQ29tbWVyY2UgT25lLCBJbmMuCi0gICAgICAgICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICAgICAgICBEVEQncywgc2NoZW1hcyBhbmQgbW9kdWxlcyBpbiB0aGUgQ29tbWVyY2UgT25lIFhNTCBDb21tb24gQnVzaW5lc3MKLSAgICAgICAgICAgIExpYnJhcnkgVmVyc2lvbiAzLjUgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgc3BlY2lmaWVkCi0gICAgICAgICAgICBhdCBodHRwOi8vd3d3LnhjYmwub3JnL2xpY2Vuc2UuaHRtbAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAlQTEVBU0UgTk9URTogVGhpcyBzY2hlbWEsIHdoaWxzdCBpdCBkZXNjcmliZXMgaW4gZW50aXJldHkgYSB2YWxpZCwgc2luZ2xlLAotICAgICAgICAJeENCTCAzLjUgZG9jdW1lbnQsIGlzIGRlZmluZWQgdG8gYmUgaW4gYSBuYW1lc3BhY2Ugb3RoZXIgdGhhbiB0aGUgbWFpbiB4Q0JMIDMuNQotICAgICAgICAJbmFtZXNwYWNlLiBUaGVyZWZvcmUgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgZnVsbCB4Q0JMIDMuNSBzY2hlbWEgaXMgdXNlZAotICAgICAgICAJZm9yIGZ1bGwgcHJvZHVjdGlvbiBzaXR1YXRpb25zLiBQbGVhc2Ugc2VlIHRoZSBub3RlcyBhdAotICAgICAgICAJPGEgaHJlZj0iaHR0cDovL3d3dy54Y2JsLm9yZy94Y2JsMzUveHNkL3NjaGVtYXMuaHRtbCI+d3d3LnhDQkwub3JnPC9hPi4KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iT3JkZXJIZWFkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iT3JkZXJEZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iT3JkZXJTdW1tYXJ5Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlciIgdHlwZT0iT3JkZXIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVySGVhZGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJJc3N1ZURhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJPcmRlclJlZmVyZW5jZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlbGVhc2VOdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlB1cnBvc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUmVxdWVzdGVkUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iT3JkZXJUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJDdXJyZW5jeSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheEFjY291bnRpbmdDdXJyZW5jeSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckxhbmd1YWdlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGFuZ3VhZ2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJUYXhSZWZlcmVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJUYXhSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJJbnZvaWNlTWVkaXVtVHlwZUNvZGVkIiB0eXBlPSJPcmRlckludm9pY2VNZWRpdW1UeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJJbnZvaWNlTWVkaXVtVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iT3JkZXJEYXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFydGlhbFNoaXBtZW50QWxsb3dlZCIgdHlwZT0ieGNibEJvb2xlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik9yZGVyUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhcnRMb2NhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJPcmRlclRlcm1zT2ZEZWxpdmVyeSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlRlcm1zT2ZEZWxpdmVyeSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmRlckhlYWRlclByaWNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mUHJpY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJQYXltZW50SW5zdHJ1Y3Rpb25zIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGF5bWVudEluc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmRlckFsbG93YW5jZXNPckNoYXJnZXMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZBbGxvd09yQ2hhcmdlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUm91bmRUcmlwSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVySGVhZGVyTm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZTdHJ1Y3R1cmVkTm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZOYW1lVmFsdWVTZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVySGVhZGVyQXR0YWNobWVudHMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZBdHRhY2htZW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVySGVhZGVyIiB0eXBlPSJPcmRlckhlYWRlciIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJOdW1iZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJ1eWVyT3JkZXJOdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlbGxlck9yZGVyTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZk1lc3NhZ2VJRCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJOdW1iZXIiIHR5cGU9Ik9yZGVyTnVtYmVyIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZNZXNzYWdlSUQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9Ik1lc3NhZ2VJRCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mTWVzc2FnZUlEIiB0eXBlPSJMaXN0T2ZNZXNzYWdlSUQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1lc3NhZ2VJRCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUROdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklEQXNzaWduZWRCeSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSURBc3NpZ25lZERhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWVzc2FnZUlEIiB0eXBlPSJNZXNzYWdlSUQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IklEQXNzaWduZWRCeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSURBc3NpZ25lZEJ5Q29kZWQiIHR5cGU9IlBhcnR5Um9sZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IklEQXNzaWduZWRCeUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IklEQXNzaWduZWRCeSIgdHlwZT0iSURBc3NpZ25lZEJ5Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlBhcnR5Um9sZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhbmNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50Q29vcmRpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdTdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50T2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRPZkRlc3RpbmF0aW9uUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRPZi1PcmlnaW5QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50T3duZXJzU2VydmljaW5nQmFua09uVGhlUmVjZWl2aW5nU2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE93bmVyc1NlcnZpY2luZ0JhbmtPblRoZVNlbmRpbmdTaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50U2VydmljaW5nRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUGF5YWJsZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VtZW50UmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3JvbnltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpb25QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsUHVyY2hhc2Vyc0N1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxSZWZlcnJlZEJ5T3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxSZWZlcnJlZFRvT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3V0ZUNhcmVIb3NwaXRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxEZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxEZWxpdmVyeUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxQaWNrVXBBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRpb25DZW50cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWl0dGluZ0hlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaXR0aW5nU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWl0dGluZ1N1cmdlb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdWx0RGF5Q2FyZVByb2dyYW1GYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJ0aXNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJ0aXNpbmdHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNlVGhyb3VnaEJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzaW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmaWFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmaWxpYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZmZpbGlhdGVkQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmaWxpYXRlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUdyYW50aW5nU2VjdXJpdHlDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50T3JSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRzQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUlEU09yQVJDVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQW1idWxhbmNlU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckNhcmdvQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRm9yY2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlybGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlycG9ydEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbEJldmVyYWdlRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbGlzbUFuZE90aGVyQ2hlbWljYWxEZXBlbmRlbmN5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xPckRydWdBYnVzZU9yRGVwZW5kZW5jeUlucGF0aWVudFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xPckRydWdBYnVzZU9yRGVwZW5kZW5jeU91dHBhdGllbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxpYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsaWVuQWZmaWxpYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxlZ2VkRGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsaWVkSGVhbHRoUHJvZmVzc2lvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvdG1lbnRDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhYmxlUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVSZXR1cm5BZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGl2ZUFkZHJlc3NlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRpdmVNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsemhlaW1lcnNEaWFnbm9zdGljT3JBc3Nlc3NtZW50U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZW5kZWROYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkluZGlhbi1Pd25lZEJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWljdXNDdXJpYWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuZXN0aGVzaW9sb2d5U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuZ2lvcGxhc3R5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuaW1hbEJlaW5nSW52ZXN0aWdhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmltYWxTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVpdGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWl0YW50UGF5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGVubmFTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBlbGxhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGVsbGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudENvbWFrZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudEZvckpvYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50c0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudHNDb3NpZ25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50c0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvblBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzYWxDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzZXJOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZlZENvbnNpZ25vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92ZWRJbXBvcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyYml0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyY2hpdGVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJjaGl0ZWN0LURlc2lnbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhT2ZPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFybWVkU2VydmljZXNMb2NhdGlvbkRlc2lnbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcm15RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycmVzdGluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFydGhyaXRpc1RyZWF0bWVudENlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRBY2NvdW50SG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3Npc3RhbnRTdXJnZW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3Npc3RhbnRVU1RydXN0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZUdlbmVyYWxBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGVuZGluZ1BoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dG9ybmV5Rm9yRGVmZW5kYW50UHJpdmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0b3JuZXlGb3JEZWZlbmRhbnRQdWJsaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dG9ybmV5Rm9yUGxhaW50aWZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRvcm5leU9mUmVjb3JkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWN0aW9uZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpdE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aGVudGljYXRpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpdHlGb3JTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXphdGlvbkFzc2lnbmVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRBY2NlcHRpbmdPZmZpY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZEVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZEV4cG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZEltcG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkTWFya2V0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRPZmZpY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkVHJhZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemluZ09mZmljaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWREYXRhUHJvY2Vzc2luZ1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWRVbmRlcndyaXRpbmdTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZVdpdGhCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFiaWxpdHlTaGlwVG9QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFpbGlmZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFpbG1lbnRXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhaWxQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFrZXJ5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rcnVwdGN5UmVmZXJlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua3J1cHRjeVRydXN0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VKdXJpc2RpY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VQZXJpb2RFbXBsb3llciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmF0dGVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhbE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZmljaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhcnlzQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRPcGVuaW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxBbmRTaGlwVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxlZEZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ1JlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsLVRvUGFydHlGb3JEaXZlcnNpb25DaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aGluZ1Jvb21PckxEUlBSb29tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRocGxhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb29kQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZlJlYWx0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2J0YWlsU2VydmljZVBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb25kc21hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va2luZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29raW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29ra2VlcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3JkZXJDcm9zc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9ycm93ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcnJvd2Vyc0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3R0bGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFrZW1hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuZE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFrQnVsa0JlcnRoT3BlcmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFrQnVsa1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9hZGNhc3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJEZWFsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlck9waW5pb25PckFuYWx5c2lzUmVxdWVzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJPclNhbGVzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJzQXNzaXN0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWlsZGVyTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVpbGRpbmdJbnNwZWN0b3JhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1aWxkaW5nU2l0ZUVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWlsZGluZ1NpdGVGb3J3YXJkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1aWxkaW5nU2l0ZVB1cmNoYXNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVyZWF1T2ZMYW5kTWFuYWdlbWVudFByb3BlcnR5VW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVybkNhcmVVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0Fzc29jaWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzUGFydG5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyQXNPZmZpY2lhbGx5UmVnaXN0ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQWdlbnRPclJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDb3Jwb3JhdGVPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNRdWFsaXR5UmV2aWV3Qm9hcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWluZ0dyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXlpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5DdXN0b21zQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5kaWRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmR5QW5kQ29uZmVjdGlvbnNEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkaWFjQ2F0aGVyaXphdGlvbkxhYm9yYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRpYWNJbnRlbnNpdmVDYXJlVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZGlhY1JlaGFiaWxpdGF0aW9uUHJvZ3JhbUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkaWFjUmVoYWJpbGl0YXRpb25TZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FybmV0SXNzdWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyc0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZU9mTmVlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoUG9vbExldmVsQWNjb3VudFNlcnZpY2luZ0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoUG9vbFN1Yi1BY2NvdW50U2VydmljaW5nRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hQb29sVG9wQWNjb3VudFNlcnZpY2luZ0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZWRpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50cmFsQmFua09yUmVndWxhdG9yeUF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbENhdGFsb2d1ZVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZWRBY2NvdW50YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZ5aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYWlycGVyc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFtYmVyT2ZDb21tZXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlZEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZXNQYXllckF0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJ0ZXJTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXNQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlY2tpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlcXVlRHJhd25CYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVxdWVPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpZWZEZXB1dHlDbGVya09mQ291cnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNDaHJvbmljRGlzZWFzZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNEYXlDYXJlQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNFeWVFYXJOb3NlQW5kVGhyb2F0RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc0dlbmVyYWxGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zSG9zcGl0YWxVbml0T2ZBbkluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNPcnRob3BlZGljRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc090aGVyU3BlY2lhbHR5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc1BzeWNoaWF0cmljRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc1JlaGFiaWxpdGF0aW9uRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc1R1YmVyY3Vsb3Npc0FuZE90aGVyUmVzcGlyYXRvcnlEaXNlYXNlc0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlyb3ByYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNocm9uaWNEaXNlYXNlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNocm9uaWNPYnN0cnVjdGl2ZVB1bG1vbmFyeURpc2Vhc2VTZXJ2aWNlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNodXJjaE9wZXJhdGVkRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpZ2FyZXR0ZXNBbmRUb2JhY2NvRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lyY3VpdExvY2F0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1BZG1pbmlzdHJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbWFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1hbnRBdXRob3JpemVkUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVyayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlcmtPZkNvdXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGluaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZERvb3JQaGFybWFjeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2F0aW5nT3JQYWludFN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1Cb3Jyb3dlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tQ29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tQ291bnNlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tRGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1EZWZlbmRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLURyaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tSW52ZXN0aWdhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXRlcmFsQXNzaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uUHJpbmNpcGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsSW5zdXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWlzc2lvbmFibGVBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWlzc2lvblByb2Nlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbXVuaXR5QWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11bml0eUhlYWx0aFByb21vdGlvbkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55QXNzaWduZWRXZWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55SW50ZXJ2aWV3ZXJXb3Jrc0ZvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUluV2hpY2hJbnRlcmVzdEhlbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlNZXJnZWRXaXRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55LU93bmVkT2lsRmllbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlXaGljaEhvbGRzRmluYW5jaWFsSW50ZXJlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmFibGVQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVByb3BlcnR5TGlzdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVJlbnRhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGluZ1Byb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZXRpdGl2ZVByb3BlcnR5TGlzdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGlsYXRpb25BZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsYWluYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGFpbmFudHNBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9uZW50TWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wcmVoZW5zaXZlR2VyaWF0cmljQXNzZXNzbWVudEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jdXJyZW50RW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmR1Y3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZHVjdG9yUGlsb3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmR1aXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbm5lY3RpbmdDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25uZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZUNvdXJpZXJUcmFuc2ZlclN0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZU9mVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZVRvQmVTcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZS1Ub1JlY2VpdmVMYXJnZVBhcmNlbHNBbmRGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWUtVG9SZWNlaXZlTWFpbEFuZFNtYWxsUGFyY2VscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3JDb3VyaWVyVHJhbnNmZXJTdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3JzUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZERlYnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJ1Y3Rpb25Db250cmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJ1Y3Rpb25GaXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdWx0YW50c09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsdGluZ1BoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJDcmVkaXRBY2NvdW50Q29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJSZWZlcnJhbENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVyU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lclNlcnZpY2VQcm92aWRlckN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0QmFuazEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RCYW5rMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGFydHkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGFydHkyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGFydHkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGFydHk0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGVyc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTG9jYXRpb25QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyT3BlcmF0b3JPckxlc3NlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyUmV0dXJuQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU3VydmV5QWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbmdlbnRBbm51aXRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbmdlbnRCZW5lZmljaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZ2VudE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEFkbWluaXN0cmF0aW9uT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdGVkU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RpbmdPZmZpY2VyUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3ItR2VuZXJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RPckNvZ25pemFudFNlY3VyaXR5T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yLUxlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3ItTWFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3R1YWxEZWxpdmVyeU1ldGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdHVhbFJlY2VpcHRNZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlclF1YWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udm95aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLU9jY3VwYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1PcGVyYXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3BlcmF0aXZlQnV5aW5nR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1Pd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tUGFydGljaXBhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLVByb2R1Y2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3B5TWVzc2FnZVRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGlvbkZvci1Qcm9maXRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zaWduZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc2lnbmVyc0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VuY2lsT2ZHb3Zlcm5tZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRlckNsYWltYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5T2ZEZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeU9mRXhwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5T2ZPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0QXBwb2ludGVkQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdEdyYW50b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRvcnNBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0UmF0aW5nQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRSZXBvcnRpbmdBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZXdNZW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaW1lVmljdGltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc0NsYWltYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zcy1Ub3duU3dpdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVFNjYW5uZXJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RW1wbG95ZXItUHJpbWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEVtcGxveWVyLVNlY29uZGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFJlY2VpdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50U2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b2RpYWxQYXJlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvZGlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyRk9yV2hvbVNhbWVPclNpbWlsYXJXT3JrV2FzUGVyRm9ybWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lcklkZW50aWZpY2F0aW9uRmlsZUN1c3RvbWVySWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0Jyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc09mZmljZU9mQ2xlYXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYWlyeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFQcm9jZXNzaW5nU2VydmljZUJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvckNvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvckluZGl2aWR1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvci1Jbi1Qb3NzZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3JzQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRQYXltZW50QXV0aG9yaXNhdGlvblBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNpc2lvbk1ha2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmFudHNBZ2VudE9yUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY29uc29saWRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZhdWx0T3JGb3JlY2xvc3VyZVNwZWNpYWxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVuZGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaWNhdGVzc2VuRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnRpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkp1c3RpY2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwZW5kZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnRJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnROYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc2lnbmF0ZWRIYXphcmRvdXNXYXN0ZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNpZ25FbmdpbmVlcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzaWduZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoQ2hhcmdlUGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25EcmF5bWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbkludGVybW9kYWxSYW1wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbk1haWxGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25UZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc3RpY1JhZGlvaXNvdG9wZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFseXNpc0NlbnRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpZmZlcmVudFByZW1pc2VBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJsZWRJbmRpdmlkdWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNidXJzaW5nT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2hhcmdlUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NpcGxpbmFyeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RpbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JCcmFuY2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdEF0dG9ybmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdEp1c3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmlzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N0b3JPZk9wdG9tZXRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdG9yT2ZPc3Rlb3BhdGh5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFjY291bnRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBY2NvdW50UGFydHlzQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBcHBsaWNhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QmVuZWZpY2lhcnlzQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRSZWltYnVyc2luZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0U2Vjb25kQmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50Q3VzdG9kaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudE9yTWVzc2FnZUlzc3Vlck9yU2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9pbmdCdXNpbmVzc0FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3duc3RyZWFtRmlyc3RTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG93bnN0cmVhbU1ldGVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvd25zdHJlYW1QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmlsbGluZ0NvbnRyYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcC1PZmZMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ5R3JvY2VyeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cmFibGVNZWRpY2FsRXF1aXBtZW50U3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVjb25vbWljYWxseURpc2FkdmFudGFnZWRJbmRpdmlkdWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25hbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljRGF0YUludGVyY2hhbmdlQ29vcmRpbmF0b3JQb2ludEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNGaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY1JlZ2lzdHJhdGlvblV0aWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNSZXR1cm5PcmlnaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVtZW50YXJ5U2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGlnaWJsZVBhcnR5VG9UaGVDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpZ2libGVQYXJ0eVRvVGhlUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGVwYXJ0bWVudFNvY2lhbFdvcmtTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5TWVkaWNhbFRlY2huaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lSZXNwb25zZVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnaW5nU21hbGxCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5Q29udGFpbmVyUmVzcG9uc2libGVQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlDb250YWluZXJSZXR1cm5BZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlFcXVpcG1lbnREZXNwYXRjaFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUVxdWlwbWVudFJldHVyblBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRJdGVtTWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRVc2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmVyZ3lJbmZvcm1hdGlvbkFkbWluaXN0cmF0aW9uLU93bmVkT2lsRmllbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlci1Db25zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyLUNvbnN1bHRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlck1lYXN1cmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlclBpbG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlci1SZXNpZGVudENvbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5yb2xsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0eUhvbGRpbmdUaGVJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5SW5XaGljaEFGaW5hbmNpYWxJbnRlcmVzdElzSGVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5UHJvdmlkaW5nVGhlU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5UmVzcG9uc2libGVGb3JGb2xsb3ctVXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudHJ5UG9pbnRUZWNobmljYWxBc3Nlc3NtZW50R3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudERyb3AtT2ZmUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRSZXBhaXJQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0YWJsaXNoZWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGFtaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaGFuZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNpc2VQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVkZWRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlY3V0aXZlQ29tbWl0dGVlTWVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRvck9mRXN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVydFdpdG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeC1TcG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkQ2FyZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYWNvcnBvcmVhbFNob2NrLVdhdmVMaXRob3RyaXB0ZXJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeWVFYXJOb3NlQW5kVGhyb2F0RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3Rvci1Db3JyZXNwb25kZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW1pbHlNZW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsR292ZXJubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbGx5Q2hhcnRlcmVkRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxTdGF0ZUNvdW50eU9yQ2l0eUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWxsb3dzaGlwSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlbG9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmllbGRvckJyYW5jaE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZXJOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxpbmdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxpbmdMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsaW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbEN1c3RvbWVyT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbE1haW50ZW5hbmNlT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbE1haW50ZW5hbmNlUGVyaW9kRGVzaWduYXRpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsTWVzc2FnZVJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsUmVmZXJyZWRUb09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxTY2hlZHVsZWREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFBsYW5uZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFN0YXRlbWVudFJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyZW1hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RBcHByYWlzZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0QnJlYWtUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXRuZXNzQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vZENlcnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb2REZXRlcm1pbmF0aW9uUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb3JhbERlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvb2RTZXJ2aWNlT3BlcmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjbG9zaW5nTGVuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduRGlzY2xvc3VyZUluZm9ybWF0aW9uT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTGFuZ3VhZ2VTeW5vbnltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduUmVnaXN0cmF0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25TdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJseURvaW5nQnVzaW5lc3NBcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWVybHlLbm93bkFzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJQcmVzaWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1lclJlZ2lzdGVyZWRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJSZXNpZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvclByb2ZpdEhlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3VuZGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFuY2hpc2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFuY2hpc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlb25Cb2FyZFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0Rm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0TWFuYWdlbWVudEZhY2lsaXRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0T3JDaGFyZ2VzUGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRQYXllck9uQmVoYWxmT2ZUaGVDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRQYXllck9uQmVoYWxmT2ZUaGVDb25zaWdub3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb3plbkRlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1dHVyZUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhaW5pbmdJbnZlbnRvcnlNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXJhZ2VkTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhcm5pc2hlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzUGxhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uRW5kaW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uUG9pbnQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUcmFuc2FjdGlvblBvaW50MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVHJhbnNhY3Rpb25TdGFydGluZ1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXRld2F5UHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxJbnBhdGllbnRDYXJlRm9yQUlEU09yQVJDRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxNZWRpY2FsQW5kU3VyZ2ljYWxGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbE1lcmNoYW5kaXNlRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXRpY0NvdW5zZWxpbmdPclNjcmVlbmluZ1NlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZXJpYXRyaWNBY3V0ZUNhcmVVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZXJpYXRyaWNDbGluaWNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHaWZ0UmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0NvbGxlY3Rpb25QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNDdXN0b2RpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUmVsZWFzZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQtQ29tYmluZWRDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50LUZlZGVyYWwtTWlsaXRhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQtRmVkZXJhbC1PdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudC1GZWRlcmFsLVZldGVyYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50RnVybmlzaGVkUHJvcGVydHlGT0JQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudExvYW5BZ2VuY3lTcG9uc29yT3JBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudC1Mb2NhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhbmRwYXJlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYW50b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VuZEFtYnVsYW5jZVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBBZmZpbGlhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwQWZmaWxpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwaW5nQ2VudHJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cFByYWN0aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cFB1cmNoYXNpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZUFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmRpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNXYXN0ZUdlbmVyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQW5kQmVhdXR5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoY2FyZVByb2Zlc3Npb25hbFNob3J0YWdlQXJlYUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhNYWludGVuYW5jZU9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoTWlzY2VsbGFuZW91cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoU2NpZW5jZXNMaWJyYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZW1vZGlhbHlzaXNGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlzb3BhdGhvbG9neUxhYm9yYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhpc3BhbmljU2VydmljZUluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlzdG9yaWNhbGx5QmxhY2tDb2xsZWdlT3JVbml2ZXJzaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lSGVhbHRoQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lSGVhbHRoQ2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUhlYWx0aENvcnBvcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lSGVhbHRoU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVTdGF0ZU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbEF1eGlsaWFyeVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpdGFsRGlzdHJpY3RPckF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zcGl0YWxVbml0T2ZBbkluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbFVuaXRXaXRoaW5Bbkluc3RpdHV0aW9uRm9yVGhlTWVudGFsbHlSZXRhcmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zdGlsZVdpdG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydGVkRnJvbUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5DYXJlT2ZQYXJ0eU5vMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5DYXJlT2ZQYXJ0eU5vMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uSnVyaXNkaWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uU3RhdGVQbGFjZU9mQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRpb25TdGF0ZVByaW5jaXBhbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kZXBlbmRlbnRBZGp1c3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kZXBlbmRlbnRMYWIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGVwZW5kZW50UGh5c2ljaWFuc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsRm9yLVByb2ZpdEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeUFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeUJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5lbGlnaWJsZVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbkRpc3NlbWluYXRpb25BZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uTWFpbnRlbmFuY2VBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUmVmZXJlbmNlQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbERlYWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbE1lZGljYWxQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFN1YnNjcmliZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluamVjdGlvblBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1QYXRpZW50UGhhcm1hY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklucXVpcmluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJ5QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW4tU2VydmljZVNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25BbmRBY2NlcHRhbmNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25BbmRBY2NlcHRhbmNlUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25Db21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uTGVhZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGF0aW9uT25TaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsZWRBdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRpb25hbFByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0aXR1dGlvbkZvck1lbnRhbFJldGFyZGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1TdG9yZUJha2VyeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUJlbmVmaWNpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDbGFpbUFkanVzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VJbnN0aXR1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZE9yU3Vic2NyaWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZWdyYXRlZE1hdGVyaWFsTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZWxsZWN0dWFsUHJvcGVydHlPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmltRnVuZGluZ09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpbVRydXN0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybGluZVNlcnZpY2VDb21taXRtZW50Q3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXJ5QmFuazEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWFyeUJhbmsyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhcnlPckJyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVMZXZlbFBhcmVudENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxGcmVpZ2h0Rm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5zaGlwRW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnByZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ2aWV3ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVydmlld2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5Q29udHJvbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5Q29udHJvbFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlSZXBvcnRpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0aWdhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50QWR2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNpbmdEZWFsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9sdmVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklycmV2b2NhYmxlQmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVyT2ZEZWJpdE9yQ3JlZGl0TWVtbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVyT2ZJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZXJPZldheWJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVNoaXBUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVNoaXBGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludEFubnVpdGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRBbm51aXRhbnRPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnREZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50RGVidG9yQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50T3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50T3duZXJBbm51aXRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50T3duZXJBbm51aXRhbnRQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRPd25lckpvaW50QW5udWl0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludE93bmVySm9pbnRBbm51aXRhbnRQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRPd25lclBheW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludFZlbnR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdW5pb3JIaWdoU2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXJpc2RpY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1dmVuaWxlRGVmZW5kYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXZlbmlsZU93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXZlbmlsZVZpY3RpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnV2ZW5pbGVXaXRuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZXlQZXJzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktpZG5leURpYWx5c2lzVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFiZWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JTdXJwbHVzQXJlYUZpcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRsb3JkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXJnZUJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0QnJlYWtUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEVtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0S25vd25Tb3VyY2VPZlN1cHBseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXdFbmZvcmNlbWVudEFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF3RmlybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxSZWNlaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxUaXRsZUhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kaW5nSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc2Vlc1N1cnZleW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpYWJpbGl0eUhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZW5Ib2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWl0ZWRMaWFiaWxpdHlDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1pdGVkTGlhYmlsaXR5UGFydG5lcnNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWl0ZWRQYXJ0bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0aW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0aW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0TWFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0T3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpdGVyYWxseVRyYW5zbGF0ZWROYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5BcHBsaWNhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5Ccm9rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5Db3JyZXNwb25kZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuSG9sZGVyRm9yUmVhbEVzdGF0ZUFzc2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuT3JpZ2luYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblNlcnZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbENoYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbEdvdmVybm1lbnRTcG9uc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZHb29kc0ZvckN1c3RvbXNFeGFtaW5hdGlvbkJlZm9yZUNsZWFyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZkxvYWRFeGNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZlByaW5jaXBhbEFzc2V0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZlNwb3RGb3JTdG9yYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25nVGVybUNhcmVGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9uZy1UZXJtRGlzYWJpbGl0eUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc2luZ0ludmVudG9yeU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3NQYXllZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWdpc3RyYXRlSnVkZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hZ25ldGljUmVzb25hbmNlSW1hZ2luZ0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlkZW5OYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlubGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VPcmdhbml6YXRpb25Vc2VkRm9yRXN0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbW1vZ3JhcGh5U2NyZWVuaW5nQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VkQ2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlZENhcmVPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZW1lbnRDb250cm9sQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZW1lbnROb24tT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdpbmdHZW5lcmFsQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlck9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlcnNSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ1BsYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpbmVTdXJ2ZXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2VyT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldFRpbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrLUZvclBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyR2VuZXJhbEFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ2hhbmdlTm90aWNlQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxEaXNwb3NpdGlvbkF1dGhvcml6YXRpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsU2FmZXR5RGF0YVNoZWV0UmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFuc09mVHJhbnNwb3J0Q2hhcnRlcmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWF0RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbERvY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbEluc3VyYW5jZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxOdXJzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFN1cmdpY2FsT3JPdGhlckludGVuc2l2ZUNhcmVVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsVHJlYXRtZW50RXhlY3V0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsVHJlYXRtZW50UHJlc2NyaWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVldGluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWdhdm9sdGFnZVJhZGlhdGlvblRoZXJhcHlVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmNoYW50QmFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJnZWRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJnZWRDb21wYW55V2l0aFJldGFpbmVkSWRlbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmdlZE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyaW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1leGljYW5DdXN0b21zQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWRkbGVTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pZ3JhbnRIZWFsdGhDbGluaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5QnJhbmNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUm95YWx0eVBheW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pc3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlub3JpdHlJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlub3JpdHktT3duZWRCdXNpbmVzc0xhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5vcml0eS1Pd25lZEJ1c2luZXNzU21hbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc2NlbGxhbmVvdXNIZWFsdGhDYXJlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbml0b3JpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUluc3VyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlTGlhYmlsaXR5QWNjb3VudEhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdFJlY2VudEVtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JWZWhpY2xlUmVwb3J0UHJvdmlkZXJDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdW5pY2lwYWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVDaGFuZ2VkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVOb3RUb0JlQ29uZnVzZWRXaXRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lb25DcmVkaXRDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lVW5kZXJXaGljaEZpbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lVmFyaWF0aW9uU3lub255bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDaGFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGl2ZUhhd2FpaWFuT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXZ5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ2xlY3RlZE9yRGVsaW5xdWVudEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGluZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5laWdoYm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWlnaGJvcmhvb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lb25hdGFsSW50ZW5zaXZlQ2FyZVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldHdvcmtOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdBc3NpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3RGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdTZWN1cmVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1NlcnZpY2VQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3c3BhcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdTdXBwbHlTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFNjaGVkdWxlZERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOaWNrbmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9IZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb21pbmF0ZWRCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb21pbmF0ZWRGcmVpZ2h0Q29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLURvbWVzdGljRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmVtcGxveW1lbnRJbmNvbWVTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1IZWFsdGhDYXJlTWlzY2VsbGFuZW91c0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUludmFzaXZlQ2FyZGlhY0Fzc2Vzc21lbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLU1vcnRnYWdlTGlhYmlsaXR5QWNjb3VudEhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLU9jY3VwYW50Q28tQm9ycm93ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Qcm9kdWN0aW9uU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Qcm9maXRIZWFsdGhDYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbnByb2ZpdEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmFpbHJvYWRFbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblJlZ2lzdGVyZWRCdXNpbmVzc05hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZWdpc3RlcmVkSW52ZXN0bWVudEFkdmlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZXNpZGVudEJlbmVmaWNpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVzaWRlbnRDcmVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2lkZW50RGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVzaWRlbnRHcm91cENvbXBhbnlXaXRoV2hvbUZpbmFuY2lhbEFjY291bnRJcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2lkZW50SW5zdHJ1Y3RpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2lkZW50VGhpcmRQYXJ0eUNvbXBhbnlXaXRoV2hvbUZpbmFuY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVRlbXBvcmFyeVN0b3JhZ2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90YXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RhcnlQdWJsaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGVDby1TaWduZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEZvclByb2ZpdEhlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5UGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeVBhcnR5Rm9yU2hpcHBlcnNPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5UGFydHlObzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeVBhcnR5Tm8yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdXJzaW5nSG9tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVyc2luZ0hvbWVDaGFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JzZXJ2YXRpb25Sb29tU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ic3RldHJpY3NBbmRHeW5lY29sb2d5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ic3RldHJpY3NVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsSGVhbHRoU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25hbFRoZXJhcHlTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5UYXJpZmZDb25mZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZzZXRPcGVyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsQW5kR2FzQ3VzdG9kaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxBbmRHYXNSZWd1bGF0b3J5QWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRBc3NpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkRGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRTZWN1cmVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uQmVoYWxmT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uLUNhbGxQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25jb2xvZ3lDZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW4tSGVhcnRTdXJnZXJ5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ1BoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3ItQ29tbXVuaWNhdGlvbkNoYW5uZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yLUVzc2VudGlhbFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvck9mUHJvcGVydHlPckVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JPZlByb3BlcnR5T3JVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvck9mVGhlU291cmNlVHJhbnNmZXJQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JPZlRoZVRyYW5zZmVyUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyZWRCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyaW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdQaHlzaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyT2ZTaGlwcGVyc09yZGVycy1UcmFuc3BvcnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJPZlRoZVNoaXBwZXJQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJXcml0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5pemF0aW9uQ29tcGxldGluZ0NvbmZpZ3VyYXRpb25DaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXphdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6YXRpb25IYXZpbmdTb3VyY2VDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6ZWRPdXRwYXRpZW50U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXplZFNvY2lhbFdvcmtTZXJ2aWNlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXplciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5PclRpc3N1ZVRyYW5zcGxhbnRVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbENsYWltYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEludGVybW9kYWxSYW1wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEp1cmlzZGljdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFNoaXBwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmF0aW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdG9yT2ZBcnRpY2xlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5EcmF5bWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5NYWlsRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpblN1YmxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5UZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3J0aG9wZWRpY0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcnRob3BlZGljU3VyZ2VyeUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckRlcGFydG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckRpc2FkdmFudGFnZWRCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJJbmRpdmlkdWFsRGlzYWJpbGl0eUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVySW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJOb3QtRm9yLVByb2ZpdEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclBlcnNvbk9yRW50aXR5QXNzb2NpYXRlZFdpdGhTdHVkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclBoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJSZWxhdGVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyU3BlY2lhbHR5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVW5saXN0ZWRUeXBlT2ZPcmdhbml6YXRpb25hbEVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbFNoZWxmQXJlYUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXQtT2YtU3RhdGVQcmluY2lwYWxPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHBhdGllbnRTb2NpYWxXb3JrU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHBhdGllbnRTdXJnZXJ5U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHBhdGllbnRTdXJnaWNlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZUluc3BlY3Rpb25BZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVQcm9jZXNzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVUZXN0QWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVycmlkZUluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJBbm51aXRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyQW5udWl0YW50UGF5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVySm9pbnRBbm51aXRhbnRQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZkVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZk1lYW5zT2ZUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZlByb3BlcnR5T3JVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mUmVzaWRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mVmVoaWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZlZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPckxlc3NvcnNTdXJ2ZXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc1JlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25pbmdJbnZlbnRvcnlDb250cm9sUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94eWdlblRoZXJhcHlGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJhbWVkaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmFtZWRpY2FsQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGljaXBhdGluZ0FyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYXRpbmdMYWJvcmF0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0bmVyc2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydG5lcnNoaXBGb3ItUHJvZml0RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRSZW1hbnVmYWN0dXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHNEaXN0cmlidXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydFNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBY2NvcmRpbmdUb0RvY3VtZW50YXJ5Q3JlZGl0VHJhbnNhY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QXNzaWduaW5nQVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBdEZpbmFsUGxhY2VPZlBvc2l0aW9uaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUF0UGljay1VcExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUF1dGhvcml6ZWR0b0RlZmluaXRpemVDb250cmFjdEFjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBdXRob3JpemVkVG9NYWtlRGVmaW5pdGVBQ29udHJhY3RBY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QXV0aG9yaXppbmdEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBdXRob3JpemluZ1JlbGVhc2VPZlNlY3VyaXR5SW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RGF0YVJlc3BvbnNpYmxlUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RGVjbGFyaW5nVGhlVmFsdWVBZGRlZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlEZXNpZ25hdGVkVG9FeGVjdXRlUmUtSWNpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RGVzaWduYXRlZFRvRXhlY3V0ZVNhbml0YXJ5UHJvY2VkdXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlEZXNpZ25hdGVkVG9Qcm92aWRlTGl2aW5nQW5pbWFsQ2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlFeGVjdXRpbmdBbmRWZXJpZnlpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RmlsbGluZ1NoaXBwZXJzT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5Rm9yV2hvbUl0ZW1Jc1VsdGltYXRlbHlJbnRlbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlGcm9tV2hvbUN1c3RvbXNEb2N1bWVudHNBcmVUb0JlUGlja2VkVXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RnJvbVdob21Ob24tQ3VzdG9tc0RvY3VtZW50c0FyZVRvQmVQaWNrZWRVcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlGdWxmaWxsaW5nQWxsT3BlcmF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlJblBvc3Nlc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5SXNzdWluZ011dHVhbGx5QWdyZWVkQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5TWFpbnRhaW5pbmdUaGVDb2Rlc1VzZWRJblRoZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5TWFpbnRhaW5pbmdUaGVJZGVudGlmaWVyc1VzZWRJblRoZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5TWFuZGF0ZWRUb0xpcXVpZGF0ZUFuRW50ZXJwcmlzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlNYW51ZmFjdHVyZWRGb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5Tm90VG9CZUNvbmZ1c2VkV2l0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlQYXNzaW5nVGhlVHJhbnNhY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UGVyZm9ybWluZ0NlcnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UGVyZm9ybWluZ0NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVBlcmZvcm1pbmdJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVBlcmZvcm1pbmdUYXNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVBlcmZvcm1pbmdWZXJpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UHJvdmlkaW5nRmluYW5jaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVByb3ZpZGluZ0dvdmVybm1lbnRGdXJuaXNoZWRQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlSZWNvdmVyaW5nVGhlVmFsdWVBZGRlZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlSZXByZXNlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlSZXNwb25zaWJsZUZvckRpc2luZmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlSZXNwb25zaWJsZUZvckZpbmFuY2lhbFNldHRsZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UmVzcG9uc2libGVGb3JSZWZ1ZWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5U3VibWl0dGluZ1F1b3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRoYXRSZWNlaXZlZERpc2Nsb3N1cmVTdGF0ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VGhhdFJlbWl0c1BheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9BcHBlYXJCZWZvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9BcHByb3ZlU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b2JlYWR2aXNlZC1Xcml0dGVuT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvQmVCaWxsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9CZUJpbGxlZEZvck90aGVyVGhhbkZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9Db250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb0ZpbGVQZXJzb25hbFByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvTGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9QZXJmb3JtUGFja2FnaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUHJpbnRTb21lRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9Qcm92aWRlRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQWxsRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZUJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDZXJ0aWZpY2F0ZU9mQ29tcGxpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDZXJ0aWZpY2F0ZU9mQ29uZm9ybWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ2VydGlmaWVkSW5zcGVjdGlvblJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDZXJ0aWZpZWRUZXN0UmVzdWx0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDb21tZXJjaWFsSW52b2ljZVJlbWl0dGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ29udHJhY3RTZWN1cml0eUNsYXNzaWZpY2F0aW9uU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDb3B5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUNvcnJlc3BvbmRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDdXN0b21zRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUVsZWN0cm9uaWNNZW1vT2ZJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVGcmVpZ2h0QmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVJbnNwZWN0aW9uUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUludml0YXRpb25Ub09mZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZUludm9pY2VGT3JHb29kc09yU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlSW52b2ljZUZvckxlYXNlUGF5bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlTGltaXRhdGlvbnNPZkhlYXZ5RWxlbWVudHNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlTWF0ZXJpYWxSZWxlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZU5vbi1DdXN0b21zRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZU9yZGVyVG9TdXBwbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlUGFja2luZ0NyYXRpbmdBbmRIYW5kbGluZ0NyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVQYXBlck1lbW9PZkludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlUHJvcG9zYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlUHVyY2hhc2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVSZXBvcnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZVNjYWxlVGlja2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZVNoaXBwaW5nTWFuaWZlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlU2hpcHBpbmdOb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlU29saWNpdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVN0YXRlbWVudE9mQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVTdGF0ZW1lbnRPZkZlZXNEdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVRlY2huaWNhbERvY3VtZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlVGVzdFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVUcmFuc3BvcnRhdGlvbkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1dob21BY2tub3dsZWRnbWVudFNob3VsZEJlU2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1dob21Eb2N1bWVudHNBcmVUb0JlUHJlc2VudGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvV2hvbVByb3Rlc3RTdWJtaXR0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5V2FpdmluZ1JlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlXaGljaERlbGl2ZXJzQ29uc2lnbm1lbnRzVG9UaGVUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlXaGljaFBpY2tzVXBDb25zaWdubWVudHNGcm9tVGhlVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5V2hvU2lnbmVkVGhlRGVsaXZlcnlSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVdpdGhLbm93bGVkZ2VPZkFmZmFpcnNPZlRoZUNvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5V2l0aFBvd2VyVG9Wb3RlU2VjdXJpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc2VuZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50Q29tcGFuaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50RWR1Y2F0aW9uVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50UmVwcmVzZW50YXRpdmVTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlc0NvbXBhbnlOYW1lT3JJZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyT2ZMYXN0UmVzb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcnNDb21wYW55TmFtZU9ySWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyc0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5aW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5aW5nRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5LVRvUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZGVzdHJpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZGlhdHJpY0FjdXRlSW5wYXRpZW50VW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9ybWVkQXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1pdEhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uRm9yV2hvc2VCZW5lZml0UHJvcGVydHl3YXNTZWl6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbm5lbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uT25DbGFpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uT3JPdGhlckVudGl0eUxlZ2FsbHlSZXNwb25zaWJsZUZvckFDaGlsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uT3JPdGhlckVudGl0eUxlZ2FsbHlSZXNwb25zaWJsZUZvckFuZFdpdGhXaG9tQUNoaWxkUmVzaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uT3JPdGhlckVudGl0eVdpdGhXaG9tQUNoaWxkUmVzaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0aXRpb25pbmdDcmVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0aXRpb25pbmdDcmVkaXRvcnNBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhhcm1hY2lzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhhcm1hY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoYXJtYWN5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbFRoZXJhcHlTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNpYW5DbGluaWNPckdyb3VwUHJhY3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2lhbkhvc3BpdGFsT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNpYW4tU3BlY2lhbGlzdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2tVcEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmVTZWdtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZVNlZ21lbnRCb3VuZGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkJvdHRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZEaXN0aWxsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mT2NjdXJyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZlBlcmZvcm1hbmNlQ29nbml6YW50U2VjdXJpdHlPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWludGlmZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbkFkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uaW5nT3JNYWludGVuYW5jZU9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbm5pbmdDb21taXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmluZ1NjaGVkdWxlT3JNYXRlcmlhbFJlbGVhc2VJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5TcG9uc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRDbGVhcmFuY2VPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2RpYXRyaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2ludE9mU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5SG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lXcml0aW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGxpbmdTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0QXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0YWxNYWlsaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdHNlY29uZGFyeUVkdWNhdGlvblJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdHNlY29uZGFyeUVkdWNhdGlvblNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1TZWNvbmRhcnlJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG90ZW50aWFsU291cmNlT2ZTdXBwbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvd2VyT2ZBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1LRGF5Q2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLWtpbmRlcmdhcnRlblRvR3JhZGUxMlJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLWtpbmRlcmdhcnRlblRvR3JhZGUxMlNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlDdXN0b21lck9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlJbnNwZWN0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5TWFpbnRlbmFuY2VPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5TWFpbnRlbmFuY2VQZXJpb2REZXNpZ25hdGluZ09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlSZWZlcnJlZFRvT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50aW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0J1c2luZXNzUGFydG5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDcmVkaXRHcmFudG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0RlYnRIb2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRGlzdHJpYnV0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNNZW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNOYW1lT2ZGaXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c05laWdoYm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c09jY3VwYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c093bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1Jlc2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNTdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1RpdGxlQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNUcmFkZVVuaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFkbWluaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5QmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQ2hlY2tTaGlwVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDb250cm9sUG9pbnRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUhlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUluc3VyZWRPclN1YnNjcmliZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlJbnRlcmV4Y2hhbmdlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUludGVybmF0aW9uYWxUZWxlY29tQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUludHJhLUxBVEFDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5SW52ZW50b3J5Q29udHJvbEFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5T3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlQYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVBoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVJlc2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVN1cHBvcnRPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlTdXJnZW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5VGF4cGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1lQ29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxCb3Jyb3dlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsRXhlY3V0aXZlT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxQZXJzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQmFzZUp1cmlzZGljdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JJbmNvcnJlY3RJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckluc3VyYW5jZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yVGl0bGVFdmlkZW5jZUhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZVByZS1LRWR1Y2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlU2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9Cb25vQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY3VyZW1lbnRSZXNwb25zaWJpbGl0eUZvck9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25NYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0UG9zaXRpb25Ib2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RTZXJ2aWNlc0FuZFJlcGFpcnNDZW50cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3Npb25hbE9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdENvb3JkaW5hdGlvbk9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE1hbmFnZW1lbnRPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlPckJ1aWxkaW5nTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zZWRJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvU2VDb3Vuc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90b3R5cGVTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljQ2hpbGRPckFkb2xlc2NlbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNDb25zdWx0YXRpb24tTGlhaXNvblNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0VkdWNhdGlvblNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0VtZXJnZW5jeVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0dlcmlhdHJpY1NlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0hlYWx0aEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0lucGF0aWVudFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljT3V0cGF0aWVudFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY1BhcnRpYWxIb3NwaXRhbGl6YXRpb25Qcm9ncmFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNob2xvZ2lzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljQWx0ZXJuYXRpdmVTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY0hlYWx0aFNlcnZpY2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljSGVhbHRoU2VydmljZUluZGlhblNlcnZpY2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljb3JQcml2YXRlT3JnYW5pemF0aW9uRm9yVGhlRGlzYWJsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY1ByZS1LRWR1Y2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1Ymxpc2hlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVtcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZWRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZXJzRGVwYXJ0bWVudEJ1eWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZVNlcnZpY2VQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGlmeWluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90YXRpb25SZXF1ZXN0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvYWN0aXZlSW1wbGFudHNVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb0NvbnRyb2xTdGF0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvU3RhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHRNZXRlckxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXB0Wm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWRGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlck9mQ2hlcXVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlck9mRnVuZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyc0NvcnJlc3BvbmRlbnRCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlclNpdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyc1N1Yi1FbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0NvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0ZhY2lsaXR5U2NoZWR1bGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ1BvaW50Rm9yQ3VzdG9tZXJTYW1wbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdTdWItTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2lwaWVudE9mQ2l2aWxvckxlZ2FsTGlhYmlsaXR5UGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFtYXRpb25DZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZC1LZWVwaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3ZlcnlSb29tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNyZWF0aW9uYWxUaGVyYXB5U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlc0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJhbFByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJpbmdIZWFsdGhDYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmluZ1Byb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZpbmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmaW5lcnlPcGVyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmdXNhbFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbmFsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkQnVzaW5lc3NOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkSW52ZXN0bWVudEFkdmlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZFByaW5jaXBhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJpbmdOb25wYXJlbnRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJpbmdQYXJlbnRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25UcmlidW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhckRlYWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdG9yeVN0YXRlRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRvcnlTdGF0ZUVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVoYWJpbGl0YXRpb25GYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVoYWJpbGl0YXRpb25JbnBhdGllbnRVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWhhYmlsaXRhdGlvbk91dHBhdGllbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbWJ1cnNpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZUludGVybWVkaWFyeU9yQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlRHJheW1hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZVRvUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0dGluZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0VG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbmRlcmluZ1Byb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyaW5nT3V0bGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJPclJlZnVyYmlzaExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNpbmdNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdDYXJyaWVyc05vbWluYXRlZEFnZW50T3JSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0aW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByb2R1Y3RpdmVIZWFsdGhTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkTGVuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2FsZUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNhbGVEZWFsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VhcmNoSW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZvaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW5jZU9yRG9taWNpbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW5jeUluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudEJlbmVmaWNpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudEluc3RydWN0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BpcmF0b3J5VGhlcmFweVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwaXRlQ2FyZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZUV4aGliaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVHb3Zlcm5tZW50QWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZUluc3RhbGxhdGlvbkRlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZUluc3RhbGxhdGlvbk9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsUGhhcm1hY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHJvY2Vzc2lvbmFpcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmVkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRpbmdQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm95YWx0eU93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdXJhbEhlYWx0aENsaW5pYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNBc3Npc3RhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc3BlcnNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNSZXNwb25zaWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsdmFnZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZXNUb0JlUmV0dXJuZWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxpbmdMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sLUJhc2VkU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0NvcnBvcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY3JlZW5pbmdQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhbGluZ0NvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUludmVudG9yeUNvbnRyb2xBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5TG9jYXRpb25BZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlQYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5VGF4cGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVdhcnJhbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kQ29udGFjdE9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kSG9tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kTGV2ZWxQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNyZXRhcmlhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvbjhBUHJvZ3JhbVBhcnRpY2lwYW50RmlybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cmVkUGFydHlDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cmVkUGFydHlJbmRpdmlkdWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJBc09mZmljaWFsbHlSZWdpc3RlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzQWdlbnRPclJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGluZ09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kZXJPZkZ1bmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kZXJzQ29ycmVzcG9uZGVudEJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmlvck1lbWJlcnNoaXBQcm9ncmFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQnVyZWF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUGVyZm9ybWFuY2VTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUGVyZm9ybWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VSZXF1ZXN0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljaW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2luZ0Jyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljaW5nRGVhbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlaG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsdGVyZWRXb3Jrc2hvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nTGluZVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nU2NoZWR1bGVJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvd2luZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWJsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmlmaWNhbnRPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlUGhvdG9uRW1pc3Npb25Db21wdXRlcml6ZWRUb21vZ3JhcGh5VW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2l0ZU9wZXJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2lsbGVkTnVyc2luZ0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2lsbGVkTnVyc2luZ29yT3RoZXJMb25nLVRlcm1DYXJlVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpbGxlZE51cnNpbmdTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xhdWdodGVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsb3RDaGFydGVyUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQmFzZVN0YXRpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxDb250cm9sU3RhdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbERpc2FkdmFudGFnZWRCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsbHlEaXNhZHZhbnRhZ2VkQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbGx5RGlzYWR2YW50YWdlZEluZGl2aWR1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbGx5SW5zdXJlZFBlcnNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsU2VjdXJpdGllc0NvbGxlY3RvcnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lldHlPZlByb3BlcnR5SW5mb3JtYXRpb25Db21waWxlcnNBbmRBbmFseXN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkVG9BbmRTaGlwVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGRUb0lmRGlmZmVyZW50RnJvbUJpbGxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZVByb3ByaWV0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlTWV0ZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlUGFydHlPZkluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENvdW5zZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxpemVkTW9iaWxlUmFkaW9TZXJ2aWNlTGljZW5zZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxpemVkT3V0cGF0aWVudFByb2dyYW1Gb3JBSURTT3JBUkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmllZFJlcG9zaXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWVjaFRoZXJhcHlTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvcnRzTWVkaWNpbmVDbGluaWNPclNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3VzZUluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwdWRDb250cmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVDaGFydGVyZWRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVEaXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RlYW1zaGlwQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tob2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlRmFjaWxpdHlhdERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlRmFjaWxpdHlBdE9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlQ2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlS2VlcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWR5U3VibWl0dGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RPckNvZ25pemFudFNlY3VyaXR5T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yLU5vbWluYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvcldpdGhEaXJlY3RQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItRW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJncm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdE9mSW5xdWlyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdFByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXR0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pdHRlck9mU2FtcGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzY3JpYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzY3JpYmVyc0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzY3JpYmVyc1NjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2VxdWVudE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItU2VydmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpZGlhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpZGlhcnlEaXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZVN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWNjZXNzZnVsSm9iQXBwbGljYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc2luZ0hlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNpbmdQaHlzaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3J5QXBwcmFpc2VyTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyT3JNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc0NvcnBvcmF0ZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJXb3JrVGVhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGx5U291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwb3J0aW5nUGVyc29ubmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwb3J0UGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZXR5Rm9yQWRkaXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJldHlGb3JBbnRpZHVtcGluZ09yQ291bnRlcnZhaWxpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlRGlzY2hhcmdlQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlTWFuYWdlbWVudEVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZ2VvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VycGx1c0RlYWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5b3ItUG9mZXNzaW9uYWxRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5b3JRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5b3JUb3BvZ3JhcGhpY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtGYXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rRmFybU93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Q29sbGVjdG9yc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RXhlbXB0T3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZUFuc3dlcmluZ1NlcnZpY2VCdXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuYW50TWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuZGVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbE9wZXJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJ0aWFyeVBheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nTGFib3JhdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RTcG9uc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVhdGVyQ2lyY3VpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlYXRyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlcmFwZXV0aWNSYWRpb2lzb3RvcGVGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eUFkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlJbnZlc3RtZW50QWR2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eU1hcmtldGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UmVwcmljaW5nT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UmVwcmljaW5nUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlSZXZpZXdpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlSZXZpZXdpbmdQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVob2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlSW5zdXJhbmNlU2VydmljZXNQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVVbmRlcndyaXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbGluZ0Rlc2lnbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbGluZ0ZhYnJpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29sU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3BQYXJlbnRDb21wYW55SW5TYW1lQ291bnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG93aW5nQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZW5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlTmFtZVN5bm9ueW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlVW5pb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluaW5nSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVycmluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlclRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0QXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0Q2hhcmdlUGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRGcmVpZ2h0Rm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0UHJpbmNpcGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0UHJpbmNpcGFsc0FnZW50T3JSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXR0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRlck9mSGF6YXJkb3VzV2FzdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zc2hpcG1lbnRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdW1hQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYmFsR292ZXJubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0ZWVzQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0T2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3RPckVzdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHViZXJjdWxvc2lzQW5kT1RoZXJSZXNwaXJhdG9yeURpc2Vhc2VzRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZVBhcmVudENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlU2FtZUNvdW50cnlQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRyYXNvdW5kVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hc3NpZ25lZEFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcndyaXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5leHBlY3RlZEhhbmRsaW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNDdXN0b21zQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNPdmVyc2Vhc1NlY3VyaXR5QWRtaW5pc3RyYXRpb25PZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2l0eS1Db2xsZWdlT3JTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNlcnZpY2VhYmxlTWF0ZXJpYWxDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwc3RyZWFtTWV0ZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBzdHJlYW1QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNUcnVzdGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGlsaXphdGlvbk1hbmFnZW1lbnRPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY2F0aW9uSG9tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRhdGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkTmV0d29ya1Byb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlQ3VzdG9kaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlU2FsdmFnZUFzc2lnbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsTWFzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmFuLU93bmVkQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyYW5zQWRtaW5pc3RyYXRpb25GYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJhbnNBZG1pbmlzdHJhdGlvbkxvYW5BdXRob3JpemVkU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyYW5zQWRtaW5pc3RyYXRpb25Mb2FuR3VhcmFudHlBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyaW5hcmlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJpbmFyeUhvc3BpdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaWN0aW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpZGVvRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW50ZWVyU2VydmljZXNEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZUVhcm5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VEZXBvc2l0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZUtlZXBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlckFtYnVsYW5jZVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlclN5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxDYXNpbmdEZXB0aEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbFBhZENvbnN0cnVjdGlvbkNvbnRyYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xlc2FsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xseS1Pd25lZFN1YnNpZGlhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildpbm5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0aGRyYXdhbFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRuZXNzRm9yRGVmZW5kYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRuZXNzRm9yUGxhaW50aWZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRuZXNzRm9yUHJvc2VjdXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvbWFuLU93bmVkQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvbWFuLU93bmVkQnVzaW5lc3NMYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29tYW4tT3duZWRCdXNpbmVzc1NtYWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb21lbnNIZWFsdGhDZW50ZXJPclNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc2l0ZUhlYWx0aFByb21vdGlvbkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc01hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtUZWFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXcml0aW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlgtUmF5UmFkaWF0aW9uVGhlcmFweVVuaXQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyUmVmZXJlbmNlcyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBY2NvdW50Q29kZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlJlZmVyZW5jZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250cmFjdFJlZmVyZW5jZXMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZDb250cmFjdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJRdW90ZVJlZmVyZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlJlZmVyZW5jZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPdGhlck9yZGVyUmVmZXJlbmNlcyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlJlZmVyZW5jZUNvZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyUmVmZXJlbmNlcyIgdHlwZT0iT3JkZXJSZWZlcmVuY2VzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZWZlcmVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJlZk51bSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVmRGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2UiIHR5cGU9IlJlZmVyZW5jZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQ29udHJhY3QiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkNvbnRyYWN0Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb250cmFjdCIgdHlwZT0iTGlzdE9mQ29udHJhY3QiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRyYWN0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250cmFjdElEIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNvbnRyYWN0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJWYWxpZGl0eURhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTeXN0ZW1JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udHJhY3QiIHR5cGU9IkNvbnRyYWN0Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJZGVudGlmaWVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklkZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJZGVudGlmaWVyIiB0eXBlPSJJZGVudGlmaWVyIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBZ2VuY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFnZW5jeUNvZGVkIiB0eXBlPSJBZ2VuY3lDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBZ2VuY3lDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBZ2VuY3lEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29kZUxpc3RJZGVudGlmaWVyQ29kZWQiIHR5cGU9IkNvZGVMaXN0SWRlbnRpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvZGVMaXN0SWRlbnRpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFnZW5jeSIgdHlwZT0iQWdlbmN5Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkFnZW5jeUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQU1WQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUJDRC1UaGVNaWNyb2NvbXB1dGVySW5kdXN0cnlBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNHSUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDT1JEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnRpc2luZ0luZHVzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRUNNQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUlIQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyVHJhbnNwb3J0QXNzb2NpYXRpb25PZkFtZXJpY2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsYWJhbWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsYXNrYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx1bWludW1Bc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5BcHBhcmVsTWFudWZhY3R1cmVyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkZ1cm5pdHVyZU1hbnVmYWN0dXJlcnNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5Jcm9uQW5kU3RlZWxJbnN0aXR1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuTGFuZFRpdGxlQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuTWVkaWNhbEFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblBhcGVySW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblBldHJvbGV1bUluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVBXQUFuZE9DU0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuU29jaWV0eUZvckF1dG9tYXRpb25JblBoYXJtYWN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblRleHRpbGVNYW51ZmFjdHVyZXJzSW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblRydWNraW5nQXNzb2NpYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTlNJQWNjcmVkaXRlZFN0YW5kYXJkc0NvbW1pdHRlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJpem9uYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJrYW5zYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTTUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlCdXllck9yQnV5ZXJzQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5RGlzdHJpYnV0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlNYXJrZXRQbGFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeU5hdGlvbmFsVHJhZGVBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlPd25lck9mT3BlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5UGFydHlPcmlnaW5hdGluZ1RoZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlTZWxsZXJPclNlbGxlcnNBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeVRyYW5zcG9ydENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTVE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVC1HZWxkYXVzZ2FiZWF1dG9tYXRlblNlcnZpY2VHZXNlbGxzY2hhZnRNQkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFULUF1c3RyaWFuQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVQtQXVzdHJpYW5QVFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFULVZlcmJhbmRPZXN0ZXJyZWljaGlzY2hlckJhbmtlblVuZEJhbmtpZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1BQ09TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1BREEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUFJSFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUFQQ0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUFRSVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUF1c3RyaWFuQ3VzdG9tc1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLURPSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtSElDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1MSUZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1OQ0NIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1ST0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLVNBQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtVHJhZGVnYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBV1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFZU0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRS1CZWxnaWFuQmFua2Vyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRS1CZWxnaWFuQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkUtQmVsZ2lhbk1pbmlzdHJ5T2ZGaW5hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWxsY29yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va0luZHVzdHJ5U3lzdGVtc0Fkdmlzb3J5Q29tbWl0dGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUi1CYW5jb0NlbnRyYWxEb0JyYXppbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlItTUFBbmRSQUFBbmRMSU1ORVRBbmRSSU5FVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0EtQ1BBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQS1DU0lPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxpZm9ybmlhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxpZm9ybmlhTGFuZFRpdGxlQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuRnJlaWdodENsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJiaWRlTWFudWZhY3R1cmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0EtUmV2ZW51ZUNhbmFkYUN1c3RvbXNBbmRFeGNpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0EtU0NDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VDREdYSUlJRDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFQ0RHWFhJMDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFQ0RHWFhJQjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFQ0RHWFhYSVYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFRklDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtQWRtaW5pc3RyYXRpb25GZWRlcmFsZURlc0NvbnRyaWJ1dGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILUFzc29jaWF0aW9uU3Vpc3NlQ29kZURlc0FydGljbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1DYXJidXJhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1DZW50cmFsZVN1aXNzZVBvdXJMSW1wb3J0YXRpb25EdUNoYXJib24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILURpcmVjdGlvbkdlbmVyYWxlRGVzRG91YW5lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtRGl2aXNpb25EZXNJbXBvcnRhdGlvbnNFdEV4cG9ydGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtRW50cmVwcmlzZURlc1BUVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtTWluaXN0cnlPZlRheGF0aW9uQ2VudHJhbEN1c3RvbXNBbmRUYXhBZG1pbmlzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtT2ZmaWNlRmlkdWNpYWlyZURlc0ltcG9ydGF0ZXVyc0RlRGVucmVlc0FsaW1lbnRhaXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtU3dpc3NTZWN1cml0aWVzQ2xlYXJpbmdDb3Jwb3JhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtVGVsZWt1cnNBRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0lEWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0lFQ0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZGVBc3NpZ25lZEJ5VGhlT3JnYW5pemF0aW9uVGhhdElzVGhlVWx0aW1hdGVEZXN0aW5hdGlvbk9mVGhlVHJhbnNhY3Rpb25TZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPLURJQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbG9yYWRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tYW5kZXJSb21lQWlyRGV2ZWxvcG1lbnRDZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmNvcmRFRElHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdGljdXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25zT25TQURBbmRUcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3BwZXJBbmRCcmFzc0ZhYnJpY2F0b3JzQ291bmNpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ08tU0JEQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5RGVzaWduYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNTSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1NJRXh0ZW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNVU0lQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUFSRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtQkRJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1CSUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUJSRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtRElOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1EVEFHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1FRElCQVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVuc2VMb2dpc3RpY3NBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUdEViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtR2VybWFuQmFua2Vyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1HZXJtYW5DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1HTUJIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxhd2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mQWlyRm9yY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkFybXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkRlZmVuc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkhlYWx0aEFuZEh1bWFuU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkhvdXNpbmdBbmRVcmJhbkRldmVsb3BtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZMYWJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mVGhlTmF2eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtU2llbWVuc0FHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1WREEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRGQVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRJTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0aW9uR2VuZXJhbGVEZXNEb3VhbmVzRXREcm9pdHNJbmRpcmVjdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0T2ZDb2x1bWJpYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRLLUVBTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREstTUhBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESy1OQkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRLLVBCUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVuQW5kQnJhZHN0cmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGlidWlsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpZWxOb3JkaWNGb3J1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJRklDRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJVEVVUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJVEVYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRUc3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFSURYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJpY1V0aWxpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0luZHVzdHJpZXNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVBBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVNEWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVMtT0RFVFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVTLVNwYW5pc2hDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFVS1FRElGSUNBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVUtRVRJUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVUtUk9GRVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZBU0xJTkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZDQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkNJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGREEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxHb3Zlcm5tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSGlnaHdheUFkbWluaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkktQVRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSS1GaW5uaXNoQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkktVEIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJLVRoZUZpbm5pc2hCYW5rZXJzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb3JpZGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1BR0YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUFydkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUJhbnF1ZURlRnJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1DRk9OQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItQ05BTVRTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1EQ1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLURHSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItRURJRkNBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItRURJRlJBTkNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1FRElUUkFOU1BPUlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUdBTElBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1HRU5DT0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUlOU0VFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1SQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUFCSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQUJUQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQXJ0aWNsZU51bWJlckFzc29jaWF0aW9uTGltaXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQXNzb2NpYXRpb25Gb3JQYXltZW50Q2xlYXJpbmdTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQkFDU0xpbWl0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUNIQVBTQW5kVG93bkNsZWFyaW5nQ29tcGFueUxpbWl0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUZMRUVUTkVUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1ITUN1c3RvbXNBbmRFeGNpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLU9ERVRURSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItVGhlQ2xlYXJpbmdIb3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvcmdpYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhcGhpY3NDb21tdW5pY2F0aW9uc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdSLUdyZWVrQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1NBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVElOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXdhaWkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5zdXJhbmNlQXNzb2NpYXRpb25PZkFtZXJpY2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhLLUhvbmdLb25nQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklBUFNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQVJDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQVRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQ0FPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRhaG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJRS1SZXZlbnVlQ29tbWlzc2lvbmVyc0N1c3RvbXNBRVByb2plY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklMLUlzcmFlbEN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklsbGlub2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGlhbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyQ29udGFpbmVySW50ZXJGcmlnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFzc29jaWF0aW9uT2ZDb3Jwb3JhdGlvbkFkbWluaXN0cmF0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQXNzb2NpYXRpb25PZkluZHVzdHJpYWxBY2NpZGVudEJvYXJkc0FuZENvbW1pc3Npb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsU3RhbmRhcmRzT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJb3dhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJvbkFuZFN0ZWVsU3RhbmRhcmRzQ29tbWl0dGVlSVNNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUy1JY2VsYW5kQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VTZXJ2aWNlc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklULUFzc29jaWF6aW9uZUJhbmNhcmlhSXRhbGlhbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklULUl0YWxpYW5DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVC1PREVUVEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklULVNvY2llYXRhSW50ZXJiYW5jYXJpYVBlckxBdXRvbWF6aW9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSmFwYW5lc2VTdGFuZGFyZHNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlAtSmFwYW5DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKUC1NT1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpQLU1TQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlAtTkFDQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkthbnNhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VudHVja3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNpbmdJbmR1c3RyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZUFuZEFubnVpdHlJbmR1c3RyeUNvbW1pdHRlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEktTGllY2h0ZW5zdGVpbkF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGxveWRzUmVnaXN0ZXJPZlNoaXBwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3Vpc2lhbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVS1MdXhlbWJvdXJnQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJ5bGFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzc2FjaHVzZXR0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxTYWZldHlEYXRhU2hlZXRQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWljaGlnYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5U3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbm5lc290YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzc2lzc2lwcGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc3NvdXJpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb250YW5hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUJhbmtlcnNBc3NvY2lhdGlvbk9mQW1lcmljYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVktRGFnYW5nTmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWS1NYWxheXNpYUNlbnRyYWxCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWS1NYWxheXNpYUN1c3RvbXNBbmRFeGNpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BQ0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BR1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQWxjb2hvbEJldmVyYWdlQ29udHJvbEFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEFzc29jaWF0aW9uT2ZCdXNpbmVzc0FuZEVkdWNhdGlvbmFsUmFkaW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQnVzaW5lc3NGb3Jtc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENlbnRlcmZvclN0YXRlQ291cnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENvdHRvbkNvdW5jaWxPZkFtZXJpY2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ291bmNpbE9uQ29tcGVuc2F0aW9uSW5zdXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFJldGFpbE1lcmNoYW50c0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFdob2xlc2FsZURydWdnaXN0c0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQVRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmFsR2FzVXRpbGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQ0lDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWJyYXNrYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkVNQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV2YWRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdIYW1wc2hpcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0plcnNleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3TWV4aWNvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdzcGFwZXJBc3NvY2lhdGlvbk9mQW1lcmljYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3WW9yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkZQQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTklDQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTklPU0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRoZXJsYW5kc1JhaWx3YXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1CYW5rR2lyb2NlbnRyYWxlQlYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLUJFQU5FVEJWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1FQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLUludGVycGF5Q2FyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLUludGVycGF5R2lyYWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1OZXRoZXJsYW5kc0N1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLU9ERVRURSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9yd2VpZ2lhblN0YXRlUmFpbHdheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PLU5PUlBSTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk8tTm9yd2VnaWFuQmFua2Vyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTy1Ob3J3ZWdpYW5DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTy1Ob3J3ZWdpYW5JbnRlcmJhbmtSZXNlYXJjaE9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhBbWVyaWNhLVRlbGVjb21tdW5pY2F0aW9uc0luZHVzdHJ5Rm9ydW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoQ2Fyb2xpbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoRGFrb3RhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5aLU5ld1plYWxhbmRDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPREVUVEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU9mTWFuYWdlbWVudEFuZEJ1ZGdldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZXb3JrZXJzQ29tcGVuc2F0aW9uUHJvZ3JhbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVByb2R1Y3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaGlvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPa2xhaG9tYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aWNhbEluZHVzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmVnb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9TSEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbm5zeWx2YW5pYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVubnN5bHZhbmlhQ291cnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBULUNCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVC1Qb3J0dWd1ZXNlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFQtU0lCUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZUluZm9ybWF0aW9uSW5kdXN0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJob2RlSXNsYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSSU5FVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJVLUJJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlUtU0ZUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNBLVNhdWRpQXJhYmlhQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFLUNlbnRyYWxCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRS1PREVUVEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFLVN2ZW5za2FCYW5rZm9lcmVuaW5nZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFLVN3ZWRpc2hDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSVNBQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXRoQ2Fyb2xpbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXRoRGFrb3RhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUFnZW5jeUFzc2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50TG9hbkd1YXJhbnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBTEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21tdW5pY2F0aW9uc0luZHVzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wb3JhcnlIZWxwSW5kdXN0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbm5lc3NlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGV4YXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRleGFzTGFuZFRpdGxlQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRleHRpbGVEaXN0cmlidXRvcnNBc3NvY2lhdGlvbkluYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVERDQy1FRElBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUVy1DaGluZXNlVGFpcGVpQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFctVHJhZGUtdmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVORUNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTkNUQUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc0NvdXJ0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzTWFyaW5lQ29ycHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc051Y2xlYXJSZWd1bGF0b3J5Q29tbWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQUFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BQkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFJQUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFpclRyYW5zcG9ydEFzc29jaWF0aW9uT2ZBbWVyaWNhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BSVNJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BbWVyaWNhblBldHJvbGV1bUluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQU5TSUFTQ1gxMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQVBJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BU1RNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BVEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUJBVEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUJYQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQ0hJUFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUNJRFgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUNNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1DT1BBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtREFuZEIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURDSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtREVBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ESEhTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ESVNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ESVNDVVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURMTVNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ET0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURPRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRE9EQUFDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ET0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURPVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRFNBQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRUlBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1GQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUZEQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRklQUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRk1DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1GV1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUdTQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtSEJJQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUhJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ITDciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUlTQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTUFSQUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5BQkNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OQUlDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05hdGlvbmFsQ2VudGVyRm9ySGVhbHRoU3RhdGlzdGljc0NvbW1pc3Npb25PZlByb2Zlc3Npb25hbEFuZEhvc3BpdGFsQWN0aXZpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTmF0aW9uYWxNb3RvckZyZWlnaHRDbGFzc2lmaWNhdGlvbkFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OYXRpb25hbFJldGFpbEZlZGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5DQ01BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OSVNUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OUkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5XREEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU9EVEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU9GQUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU9NQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtU3RhbmRhcmRDYXJyaWVyQWxwaGFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1URENDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1VQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVOLVNQU0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVPUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVVNDZW5zdXNCdXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVTQ3VzdG9tc1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVTUFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1WSUNTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1XU1NBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGFoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGlsaXR5SW5kdXN0cnlHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVybW9udCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVklDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlyZ2luaWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildhc2hpbmd0b24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildlc3RWaXJnaW5pYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0hNSVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildpc2NvbnNpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV3lvbWluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0b3JHZW5lcmFsT2ZDYW5hZGEiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ29kZUxpc3RJZGVudGlmaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFuY2VTaXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnRQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvcmRFdXJvcGVlblJlbGF0aWZBdVRyYW5zcG9ydEludGVybmF0aW9uYWxEZXNNYXJjaGFuZGlzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRBbmFseXNpc0NvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50Q2hhcmFjdGVyaXN0aWNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ0luZm9ybWF0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFJlbGF0aW9uc2hpcFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjcXVpc2l0aW9uQWR2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNxdWlzaXRpb25NZXRob2RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3F1aXNpdGlvbk1ldGhvZFN1ZmZpeENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXRlUHJpbmNpcGFsZUV4ZXJjZWVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaXR0aW5nRGlhZ25vc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnNlRXZlbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnNlRXZlbnRPdXRjb21lQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaWRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ29tbW9kaXR5QW5kU3BlY2lhbEhhbmRsaW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyY3JhZnRNaXNzaW9uRGVzaWduU2VyaWVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRGltZW5zaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlycG9ydE9yQ2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlycG9ydFRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJUZXJtaW5hbElkZW50aWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxlZ2F0aW9uVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbFBhdGllbnREaWFnbm9zaXNSZWxhdGVkR3JvdXBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxQYXRpZW50UmVmaW5lZERpYWdub3Npc1JlbGF0ZWRHcm91cHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVyYXRpb25Mb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtYnVsYXRvcnlQYXRpZW50R3JvdXBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVuZG1lbnRDb2RlLUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuUHN5Y2hpYXRyaWNBc3NvY2lhdGlvbkRpYWdub3N0aWNTdGF0aXN0aWNhbE1hbnVhbE9mTWVudGFsRGlzb3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblNvY2lldHlGb3JUZXN0aW5nQW5kTWF0ZXJpYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRlbm5hUG9sYXJpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRlbm5hU3RydWN0dXJlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50Q2xhc3NpZmljYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkFja25vd2xlZGdlbWVudEFuZEVycm9yQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRXJyb3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvblF1ZXN0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhT2ZPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycmVzdFJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJ0aWNsZVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXREZXRhaWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldFJlY3VycmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0U3RhdHVzT3JUcmFuc2FjdGlvblJlcG9ydGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0VHJhbnNmZXJTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlSZWNlaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeVNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb25PZkFtZXJpY2FuUmFpbHJvYWRzRGVwcmVzY3JpcHRpb25EaXN0cmlidXRpb25MaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNEZXByZXNjcmlwdGlvbkV4Y2VwdGlvbkxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uT2ZBbWVyaWNhblJhaWxyb2Fkc1JhdGVFZGlOZXR3b3JrRXJyb3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNTdGFuZGFyZFRyYW5zcG9ydGF0aW9uQ29tbW9kaXR5Q29kZURlc2NyaXB0aW9uUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNTdGFuZGFyZFRyYW5zcG9ydGF0aW9uQ29tbW9kaXR5Q29kZU1hc3RlckRlc2NyaXB0aW9uSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uT2ZBbWVyaWNhblJhaWxyb2Fkc1N3aXRjaFJlbGVhc2VDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzdXJlZERlbGl2ZXJ5SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkQ2xlYXJpbmdIb3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkRGF0YVByb2Nlc3NpbmdFcXVpcG1lbnRJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF3YXJkU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxhbmNlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtBZG1pbmlzdHJhdGlvbkluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua0JyYW5jaFNvcnRpbmdJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua0lkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rU2VjdXJpdGllc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2lzT2ZKdXJpc2RpY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZmljaWFyeVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZFJlamVjdGlvblJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGVkT2ZmaWNlSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ0FkdmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdDbGF1c2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mSW5zcGVjdGlvbkFuZFN1cnZleVBhcnRMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZJbnNwZWN0aW9uQW5kU3VydmV5UmVzcG9uc2liaWxpdHlMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZJbnNwZWN0aW9uQW5kU3VydmV5U2hpcExvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0NoYW5nZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQ2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQ3JlZGl0UmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eUZpbGluZ0RldGFpbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5RmlsaW5nTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eUZpbGluZ1JlcG9ydFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eUZpbGluZ1NlY3VyaXRpZXNJbmZvcm1hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5RmlsaW5nU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHlGaW5hbmNpYWxJbmZvcm1hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5U3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NGdW5jdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NMZWdhbFN0cnVjdHVyZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzU2l6ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbFNpZ25EaXJlY3RvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuSW50ZXJFZGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxhdGlvblJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VEZXNpZ25hdG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlT3JpZ2luQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaERpc2NvdW50U3RpcHVsYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXVzZUxvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F1c2VPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdXNlT2ZMb3NzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VpbGluZ1R5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uUmVxdWlyZW1lbnRzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRpemVuSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlTdWJkaXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1QYXltZW50UmVtYXJrQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhc3NPZk9wZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhc3NPZlBpdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGF1c2VTdGF0dXNUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2VBdXRvbWF0ZWRQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlSW50ZXJiYW5rUGF5bWVudFN5c3RlbVBhcnRpY2lwYW50c0lkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlSW50ZXJiYW5rUGF5bWVudFN5c3RlbVVuaXZlcnNhbElkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2FzdERlc2lnbmF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29nbml6YW5jZVN5bWJvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGlzaW9uSW5kdXN0cnlFbGVjdHJvbmljQ29tbWVyY2VBc3NvY2lhdGlvbi1JbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsaXNpb25JbmR1c3RyeUVsZWN0cm9uaWNDb21tZXJjZUFzc29jaWF0aW9uLUxvc3NDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGlzaW9uSW5kdXN0cnlFbGVjdHJvbmljQ29tbWVyY2VBc3NvY2lhdGlvbi1Qb2ludHNPZkltcGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGlzaW9uSW5kdXN0cnlFbGVjdHJvbmljQ29tbWVyY2VBc3NvY2lhdGlvbi1Qcm9maWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaXRlcm1zMTk5MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEFuZEdvdmVybm1lbnRFbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxEcml2ZXJzTGljZW5zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVPcGVyYXRpb25zQ29tbW9kaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVPcGVyYXRpb25zSGF6YXJkb3VzTWF0ZXJpYWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZU9wZXJhdGlvbnNJbnN1cmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlT3BlcmF0aW9uc1NhZmV0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlT3BlcmF0aW9uc1N0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlUmVnaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVUaXRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb2RpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11bmljYXRpb25zUm91dGluZ0lkZW50aWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZW5zYXRpb25UeXBlQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGl0aXZlQ2hhcmFjdGVyaXN0aWNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxhaW50UmVxdWVzdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsaWFuY2VSZXZpZXdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jbHVzaW9uRXZhbHVhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZGl0aW9uRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzUHJlbWlzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vcnNQcmVtaXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGlvbkFuZENvbnRhaW5lcml6YXRpb25Qb2ludENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb25EZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cnVjdGlvbk1hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0b3JBbGVydExpc3RSZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJBbmRSb2xsLU9uT3JSb2xsLU9mZk51bWJlckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250ZW50SW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDbG9zZS1PdXRHcm91cENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RGVsaXZlcnlEYXRlUmV2aXNpb25BZ2VudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RnVuZFJlcG9ydGluZ1RyYW5zYWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvckFsZXJ0TGlzdFN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvclJldmlld0xpc3RTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UGF5bWVudERlZHVjdGlvbk9yQ29sbGVjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UGF5bWVudExpbmVJdGVtU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RTaGlwbWVudEFkdmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRJbnZlbnRvcnlJdGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbFVuaXREZXNpZ25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm92ZXJ0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmljdGlvbk9mZmVuc2VUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29wZXJhdGl2ZUxvZ2lzdGljc1Byb2dyYW1TdXBwb3J0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlRmluYW5jaWFsRmlsaW5nQ3JpdGVyaWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZVN0YXRlbWVudEZpbGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3Rpb25PckNoYW5nZUZvclN0b3JhZ2VJdGVtUmVjb3Jkc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlBbmRBY3Rpdml0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlDb2RlLUZpbmFuY2VBbmRBY3F1aXNpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeVN1Yi1FbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5RGVzaWduYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXBvbkFkanVzdG1lbnRSZWFzb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydEFwcGVhcmFuY2VUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRDYXNlU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnREaXNwb3NpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0RG9jdW1lbnRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRJc3N1ZWRXYXJyYW50VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0T2ZMYXdFdmVudFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0T2ZMYXdUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydFBhcnR5U3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydFBsZWFkaW5nVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlQ29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlTW9kaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNwYS1DYW5hZGlhblBheW1lbnRzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaW1pbmFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmltaW5hbENoYXJnZUdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcml0aWNhbGl0eURlc2lnbmF0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdWlzaW5lVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRBc3NldERldGFpbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREZW50YWxUZXJtaW5vbG9neUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRMaWFiaWxpdHlEZXRhaWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50UHJvY2VkdXJhbFRlcm1pbm9sb2d5Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyTWFpbnRlbmFuY2VMZXZlbExvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJXaXRoaW5Db3VudHJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9taXplZE5vdGljZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQXJlYU9mVHJhbnNhY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEb21lc3RpY1BvcnRMb2NhdGlvbkNvZGVzLVVTU2NoZWR1bGVEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRm9yZWlnblBvcnRMb2NhdGlvbkNvZGVzLVVTU2NoZWR1bGVLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW5zcGVjdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNQcmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUHJvY2VkdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUmVsZWFzZU5vdGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1NpbXBsaWZpZWRQcm9jZWR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNTcGVjaWFsQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNTdGF0dXNPZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zVHJhbnNpdEd1YXJhbnRlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1RyYW5zaXRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zVmFsdWF0aW9uTWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zV2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNHb29kc1BhY2tpbmdUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVTaGlwcGVkT3JSZWNlaXZlZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvckJ1c2luZXNzVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvclR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlbmRhbnRQbGVhVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVuc2VQcmlvcml0aWVzQW5kQWxsb2NhdGlvbnNTeXN0ZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJhbExvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmaWNpZW5jeUNhdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZpY2llbmN5SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpbnF1ZW5jeUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTb3VyY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVRlcm1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW1hbmRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW1pbGl0YXJpemF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mRGVmZW5zZUlkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlQXZhaWxhYmlsaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlRXZhbHVhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZUV2ZW50UHJvYmxlbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZU9wZXJhdG9yVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZVN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZVVzYWdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zaXNFbmNvdW50ZXJlZER1cmluZ0V4YW1pbmF0aW9uQW5kSW52ZXN0aWdhdGlvbk9mSW5kaXZpZHVhbHNBbmRQb3B1bGF0aW9uc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWdub3Npc1JlbGF0ZWRHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc3RpY0FuZFN0YXRpc3RpY2FsTWFudWFsT2ZNZW50YWxEaXNvcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdE51bWVyaWNhbENvbnRyb2xTeXN0ZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNidXJzZW1lbnRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVwYW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JlcGFuY3lBZHZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVwYW5jeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXBhbmN5SW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JlcGFuY3lTdGF0dXNPckRpc3Bvc2l0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcG9zYWxBdXRob3JpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NhbENvbmRpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50SWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFJlcXVlc3RlZEJ5Q3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9kYWFjLURlcGFydG1lbnRPZkRlZmVuc2VBY3Rpdml0eUFkZHJlc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY0xpbmVPZkJ1c2luZXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9zZUZvcm1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzTGljZW5zZVdpdGhkcmF3YWxCYXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc0xpY2Vuc2VXaXRoZHJhd2FsRHVlUHJvY2Vzc1N0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc0xpY2Vuc2VXaXRoZHJhd2FsRXh0ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzTGljZW5zZVdpdGhkcmF3YWxSZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnNMaWNlbnNlV2l0aGRyYXdhbFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdEZXRhaWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnU3RhdHVzQWR2ZXJzZUV2ZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z1N0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bXBpbmdPckNvdW50ZXJ2YWlsaW5nQXNzZXNzbWVudE1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVtcGluZ1NwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bkFuZEJyYWRzdHJlZXRDYW5hZGFzOERpZ2l0U3RhbmRhcmRJbmR1c3RyaWFsQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5zLUR1bkFuZEJyYWRzdHJlZXRQbHVzNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVuc1N0YW5kYXJkSW5kdXN0cmlhbENsYXNzaWZpY2F0aW9uMlBsdXMyRHVuQW5kQnJhZHN0cmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eVRheE9yRmVlUGF5bWVudE1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHluYW1pY0dlbmVyYXRvclNldENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR5bmFtaWNMb2NvbW90aXZlVGFnQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpcmEtSWQtRWRpUmVnaXN0cmF0aW9uQXV0aG9yaXR5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkaXRFcnJvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbmFsSW5zdGl0dXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25hbFN0dWR5QXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb21hZ25ldGljVHJhbnNtaXR0ZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5oYW5jZWRQYXJ0eUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRpdGxlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5UmVsYXRpb25zaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRTdGF0dXNMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVycm9yQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3NlbnRpYWxpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRUaW1lT2ZBcnJpdmFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVUeXBlTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0aW5nTWV0aG9kU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXRobmljaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmFsdWF0ZVdvcmtDYW5kaWRhdGVMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2YWx1YXRlV29ya0NhbmRpZGF0ZVJlYXNvbkxvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRBYmF0ZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudENvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudE9yRXhwb3N1cmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudFJlYXBwZWFyYW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4YW1pbmF0aW9uRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2F2YXRpb25JbmZvcm1hdGlvbkNvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NNYXRlcmlhbERpc3Bvc2l0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaXNlRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0Q29tbW9kaXR5Q2xhc3NpZmljYXRpb24tVVNTY2hlZHVsZUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydFJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5zaW9uUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeWVDb2xvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5U2VjdXJpdHlDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWx1cmVUb0F3YXJkUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWVBZGp1c3RhYmxlUmF0ZU1vcnRnYWdlUGxhbkNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWUtRmVkZXJhbE5hdGlvbmFsTW9ydGdhZ2VBc3NvY2lhdGlvbi1Nb3J0Z2FnZUluc3VyYW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZS1GZWRlcmFsTmF0aW9uYWxNb3J0Z2FnZUFzc29jaWF0aW9uLVBvb2xGZWF0dXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlLUZlZGVyYWxOYXRpb25hbE1vcnRnYWdlQXNzb2NpYXRpb24tUmVtaXR0YW5jZVByb2dyYW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWUtRmVkZXJhbE5hdGlvbmFsTW9ydGdhZ2VBc3NvY2lhdGlvbi1TcGVjaWFsRmVhdHVyZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZVJlZmluYW5jZVBsYW5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsRmluYW5jZUNvZGVMaXN0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhlYWx0aENhcmVDb2RlTGlzdDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxMb2dpc3RpY3NDb2RlTGlzdDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxQcm9jdXJlbWVudENvZGVMaXN0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFRyYW5zcG9ydGF0aW9uQ29kZUxpc3QxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxBbmFseXNpc0NhdGVnb3JpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEluZm9ybWF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSXRlbUFsbG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEl0ZW1BdHRyaWJ1dGVkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSXRlbVJlY2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbE1hbmFnZW1lbnRTZXJ2aWNlQ2FzaC1MaW5rQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsUmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxSZWdpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFJvdXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFN0YXRlbWVudEZvcm1hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxlZXRQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG93T2ZUaGVHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9sbG93LVVwQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTGluZU9mQnVzaW5lc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTWlsaXRhcnlTYWxlc0NvdW50cnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRpbmdSZXN0cmljdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWMtRmVkZXJhbEhvbWVMb2FuTW9ydGdhZ2VDb3Jwb3JhdGlvbi1Nb3J0Z2FnZUluc3VyYW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWMtRmVkZXJhbEhvbWVMb2FuTW9ydGdhZ2VDb3Jwb3JhdGlvbi1SZW1pdHRhbmNlUHJvZ3JhbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWMtRmVkZXJhbEhvbWVMb2FuTW9ydGdhZ2VDb3Jwb3JhdGlvbi1TcGVjaWFsQ2hhcmFjdGVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZGRpZU1hY1JlZmluYW5jZVBsYW5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlT25Cb2FyZFNpdGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEZvcndhcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlcXVlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVxdWVuY3lCYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbEdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZFB1cnBvc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhaW5Pckxvc3NJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsU2VydmljZXNBZG1pbmlzdHJhdGlvbkN1c3RvbWVyU3VwcGx5Q2VudGVyTnVtYmVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbFRlcnJpdG9yeVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYXRvclNldE1vdW50aW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHbGFzc0FjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRBZ2VuY3lQcm9jZWR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWRlT2ZEaWZmaWN1bHR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cFF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhaXJDb2xvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRsaW5nQWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJtb25pemVkU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsc0NyZWRlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c1Jlc3BvbnNlQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVDbGFpbVN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbkNvbW1vblByb2NlZHVyYWxDb2RpbmdTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbkNvbW1vblByb2NlZHVyYWxDb2RpbmdTeXN0ZW1QcmluY2lwYWxQcm9jZWR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbkR1cmFibGVNZWRpY2FsRXF1aXBtZW50UmVnaW9uYWxDYXJyaWVyQ2VydGlmaWNhdGVPZk1lZGljYWxOZWNlc3NpdHlGb3JtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoY2FyZVByb3ZpZGVyQ2hhcmFjdGVyaXN0aWNzQW5kUmVzb3VyY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhjYXJlUHJvdmlkZXJUYXhvbm9teSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5kdXN0cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluZHVzdHJ5T3JnYW5pemF0aW9uSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvYmJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJY2QxMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGlmeWluZ0NoYXJhY3RlcmlzdGljcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpdHlEaXNjbG9zdXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1tdW5pemF0aW9uSW5qZWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wYWN0QXhpc09yQW5hbG9nUG9ydENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGFjdFJlY29yZGVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnRDb25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudENvbnNlcXVlbmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnRMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50UmVsYXRlZEFjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY290ZXJtczE5ODAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxJbnN1cmFuY2VGaW5hbmNpYWxEZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxQYXJ0aWNpcGF0aW9uSW5Db21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsU2VjdXJpdHlDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5UmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbkluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUmVxdWVzdFJlc3VsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25SZXF1ZXN0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsVHJlYXRtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5xdWlyeVNlbGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvblBhcmFtZXRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNvdmVyYWdlRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VJbmZvcm1hdGlvbkluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUGxhbkRlc2NyaXB0aW9uQ2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVDb250YWluZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVDb250YWluZXJRdWFudGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxDbGFzc2lmaWNhdGlvbk9mRGlzZWFzZXNDbGluaWNhbE1vZGlmaWNhdGlvblByb2NlZHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbENsYXNzaWZpY2F0aW9uT2ZEaXNlYXNlc0NsaW5pY2FsTW9kaWZpY2F0aW9uUHJpbmNpcGFsUHJvY2VkdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQ2xhc3NpZmljYXRpb25PZkRpc2Vhc2VzQ2xpbmljYWxNb2RpZmljYXRpb24tSWNkLTktQ21Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsU3RhbmRhcmREZXNpZ25hdGlvblN5c3RlbUZvclRlZXRoQW5kQXJlYXNPZlRoZU9yYWxDYXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeUNhdGVnb3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdGlnYXRpb25TdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50RnVuZFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG1lbnRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcnNRdWFsaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbU1hbmFnZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtU291cmNpbmdDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvYkNoYXJhY3RlcmlzdGljc0xvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iT3JpZ2luYXRvckxvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRMaWZlSW5zdXJhbmNlSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRpY2lhbEhlYXJpbmdUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkaWNpYWxPcmRlclR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRpY2lhbFNlbnRlbmNlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1cmlzZGljdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktleUV2ZW50TG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLaW5kT2ZDb250cmFjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktpbmRPZk1vZGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnlSZXN1bHRzSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5VGVzdENvbmRpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsQ2FzZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsRXZlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsU3RydWN0dXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZSZWNvbW1lbmRhdGlvblJhdGluZ0NhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWFiaWxpdHlEZXRhaWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWFiaWxpdHlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlT3JBbm51aXR5UHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVPckFubnVpdHlTZXJ2aWNlRmVhdHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVPckFubnVpdHlTdGF0dXNDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZVJlaW5zdXJhbmNlTWVzc2FnZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtQ29uZGl0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZU9mQXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lT2ZCdXNpbmVzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbGVPZkFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFNvdXJjZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbnNGb3JUYXJpZmZDYWxjdWxhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZ2ljYWxPYnNlcnZhdGlvbklkZW50aWZpZXJOYW1lc0FuZENvZGVzQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZ2lzdGljc0NvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzRGVzY3JpcHRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzU2V2ZXJpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3RUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFqb3JGb3JjZVByb2dyYW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlbWVudEluZGljYXRvckNvZGUtUGV0cm9sZXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51YWxDbGFzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmluZUJlcnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpbmVXaGFyZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0UGxhY2VPcmdhbml6YXRpb25JRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0UGxhY2VUcmFkaW5nUGFydG5lcklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENvbnRyb2xDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYW5zT2ZDb21tdW5pY2F0aW9uc0lkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYW5zT2ZUcmFuc3BvcnRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVjaGFuaXphdGlvbk9mQ29udHJhY3RBZG1pbmlzdHJhdGlvblNlcnZpY2VzU3lzdGVtRXJyb3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpYUFuZFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWlkUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxCZW5lZml0c1NjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpdW1PZlRyYW5zbWlzc2lvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lbWJlck9yZ2FuaXphdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGhvZEV2YWx1YXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRob2RzT2ZQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUFuZENpdmlsaWFuR3JhZGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUFzc2lzdGFuY2VQcm9ncmFtQWRkcmVzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbm9yaXR5SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNzaW9uSW1wYWN0U3RhdGVtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9uZXRhcnlGdW5jdGlvbkRldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VJbmRleFNvdXJjZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpLU1lZGlhT2JqZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYWNoYS1OYXRpb25hbEF1dG9tYXRlZENsZWFyaW5nSG91c2VBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDb3VuY2lsRm9yUHJlc2NyaXB0aW9uRHJ1Z1Byb2dyYW1zUmVqZWN0T3JQYXltZW50Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ291bmNpbE9uQ29tcGVuc2F0aW9uSW5zdXJhbmNlTmF0dXJlT2ZJbmp1cnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENvdW5jaWxPbkNvbXBlbnNhdGlvbkluc3VyYW5jZVBhcnRPZkJvZHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENvdW5jaWxPbkNvbXBlbnNhdGlvbkluc3VyYW5jZVNvdXJjZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxEcnVnQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxNb3RvckZyZWlnaHRDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsU3RhbmRhcmRUb290aE51bWJlcmluZ1N5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZCdXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mRGVidENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mRXZlbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmVPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mU3VpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZTdWl0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZUcmFuc2FjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9Mb25nZXJDb25zaWRlcmVkRm9yQXdhcmRSZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbWVuY2xhdHVyZUFjdGl2aXR5Q2xhc3NpZmljYXRpb25FY29ub215Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVBvc3RhbFRvd24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcm1lQWN0aXZpdGVGcmFuY2Fpc2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpY2VUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25JbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYmxpZ2F0aW9uVmFyaWFuY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uYWxTYWZldHlBbmRIZWFsdGhBZG1pbmlzdHJhdGlvbk5hdHVyZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsU2FmZXR5QW5kSGVhbHRoQWRtaW5pc3RyYXRpb25QYXJ0T2ZCb2R5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsU2FmZXR5QW5kSGVhbHRoQWRtaW5pc3RyYXRpb25Tb3VyY2VPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25DbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VycmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VycmVuY2VTcGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbkNhcnJpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlckFuZFJlbGVhc2VPcHRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VPZldvcmtlcnNDb21wZW5zYXRpb25Qcm9ncmFtc05hdHVyZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZXb3JrZXJzQ29tcGVuc2F0aW9uUHJvZ3JhbXNPY2N1cGF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZXb3JrZXJzQ29tcGVuc2F0aW9uUHJvZ3JhbXNQYXJ0T2ZCb2R5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZXb3JrZXJzQ29tcGVuc2F0aW9uUHJvZ3JhbXNTb3VyY2VPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ1N0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnNpemVPck92ZXJ3ZWlnaHRDcmVkZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBSaWdodHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VGYWlsdXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0FuZE9yVW5wYWNraW5nRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdSZXF1aXJlbWVudExldmVsQUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdSZXF1aXJlbWVudExldmVsQkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdSZXF1aXJlbWVudExldmVsQ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRPZkJvZHlBZmZlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydE9mQm9keUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3Nwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50RXZlbnRQcm9ibGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEJlaGF2aW91clJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWRlc3RyaWFuQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxQcm9wZXJ0eUFuZENvbnRlbnRzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtQmlsbFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bUxhbmRDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtTGVhc2VTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVByb2R1Y3REaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUHJvZHVjdFBvaW50LU9mLVNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVByb2R1Y3RTZWxsaW5nQXJyYW5nZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVByb2R1Y3RWYWx1ZUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVJlZ3VsYXRvcnlSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVJveWFsdHlBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Sb3lhbHR5Q2FsY3VsYXRpb25NZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVJveWFsdHlUcmFuc2FjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtVW5pdGVkU3RhdGVzR2VvbG9naWNhbFN1cnZleUZvcm1hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVdlbGxBY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVdlbGxDbGFzc2lmaWNhdGlvblN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtV2VsbEluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1XZWxsU2h1dC1JblJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtV2VsbFRlc3RJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxDaGFyYWN0ZXJpc3RpY3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudENsZWFyYW5jZU9mZmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXNPck1pbnVzSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5T25DbGFpbUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5UmVzZXJ2ZVZhbHVhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRhbElEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0YWxEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGFsU2VydmljZUNhcnJpZXJSb3V0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGNvZGVEaXJlY3RvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RNYXJrZXRTdHVkeVN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWNpb3VzTWV0YWxzSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VydmF0aW9uRGF0YUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlcnZhdGlvbk1hdGVyaWFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmVudGl2ZU1lYXN1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlEaWFnbm9zaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbERpYWdub3NpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsUGFydHlDaXRpemVuc2hpcENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5RGVzaWduYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5TG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlckZpbmFuY2lhbEhpc3RvcnlDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RRdWFsaXR5RGVmaWNpZW5jeVJlcG9ydFN1bW1hcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0U3VwcGx5Q29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mZXNzaW9uYWxEZXNpZ25hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvbmFsU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvblR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtT3JpZ2luYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1ZZWFyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3Rpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eU93bmVyc2hpcEV4dGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlPd25lcnNoaXBUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlSZWNvcmRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eVNvdXJjZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlVbmRlcndyaXRpbmdDb25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wcmlldGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2luZ0NvbnRyYWN0T2ZmaWNlckluc3RydWN0aW9uc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cnBvc2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5QWxlcnRMaXN0UmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5QXNzdXJhbmNlU2l0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb25mb3JtYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNvbnRyb2xDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVBlclVuaXRQYWNrQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVlcnlPcHRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWVyeVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9GcmVxdWVuY3lUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb1NlcnZpY2VUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb1N5c3RlbVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxBZGRpdGlvbmFsQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbGNhckxldHRlck1hcmtpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxEb2N1bWVudE5hbWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsSGFuZGxpbmdSZXN0cmljdGlvbnNBbmRJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxIYXJtb25pemVkQ29kaWZpY2F0aW9uT2ZUYXJpZmZzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsSGFybW9uaXplZEVxdWlwbWVudFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxSb3V0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxVbmlmaWVkTm9tZW5jbGF0dXJlT2ZHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheUNvbXBhbnlOZXR3b3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsd2F5Q3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWx3YXlGcm9udGllckFuZFRyYW5zaXRQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheUxvY2F0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheVNlcnZpY2VzSGFybW9uaXplZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0aW5nU3VtbWFyeVZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlQXNzZXRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Gb3JDb250cmFjdERlbGl2ZXJ5RGF0ZVJldmlzaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yRGVsYXllZENsb3NpbmdPZkNvbnRyYWN0RmlsZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNvbkZvckRpc3Bvc2FsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yRmluYW5jaWFsSXRlbURldGFpbENoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yUHVibGljUmVjb3JkRmlsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Gb3JSZXF1aXNpdGlvbmluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2lwaWVudE9mQmlsbGluZ1N0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29tbWVuZGF0aW9uc1JlZ2FyZGluZ0RlbGF5ZWREZWxpdmVyaWVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkUHJlY2VkZW5jZUJhc2VkT25JdHNDdXJyZW5jeUluVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlQW5kU3RhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRpb25Vbml0T3BlcmF0aW5nTW9kZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZENvbnRyYWN0b3JBY3Rpdml0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlTW9uZXRhcnlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZVBvbGljeUF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdEFkdmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdEluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWREZXZpY2VBcHBsaWNhYmlsaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaWdpb3VzQWZmaWxpYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1lZGlhbEFjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW92YWJsZUFjY2Vzc29yaWVzQW5kU3BlY2lhbEVxdWlwbWVudE9uUmFpbGNhcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRhbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGFibGVFdmVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGFibGVFdmVudFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydERpc3RyaWJ1dGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydFNvdXJjZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcHJlc2VudGF0aXZlQnV5SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZW1lbnRzSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVuY3lJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50aWFsQW5kQ29tbWVyY2lhbFJvb21Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZVN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0aW9uc0FuZFByb2hpYml0aW9uc1BsYWNlZE9uVGhlUmUtVXNlT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3VsdEV2YWx1YXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXdQZXJpb2RJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaXNrQ2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRDaGFyYWN0ZXJpc3RpY0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWR3YXlEZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWR3YXlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1blR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eUFuZEZpdG5lc3NFbGVjdHJvbmljUmVjb3JkU3lzdGVtc0Vycm9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5QW5kRml0bmVzc0VsZWN0cm9uaWNSZWNvcmRTeXN0ZW1zU3Vic2NyaXB0aW9uT3B0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlIYXphcmRMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eVJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUHJpY2VDb25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWx2YWdlRGlzcG9zaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVFeHRyYWN0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYXZhbk93bmVyc2hpcENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeURpYWdub3NpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5U291cmNlT2ZJbmp1cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5U2hhcmVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQW5kQWdlbmN5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbnRyYWN0QWN0T2NjdXBhdGlvbkNhdGVnb3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbnRyYWN0QWN0T2NjdXBhdGlvbkNsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbnRyYWN0QWN0T3BlcmF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudE9yUGF5b3V0T3B0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbGZMaWZlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRBY2NlcHRhbmNlRGlzY3JlcGFuY3lFeHBsYW5hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50SG9sZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50UmVsZWFzZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25hbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVN0YXRlUmVnaXN0cmF0aW9uU3lzdGVtQW5kT3BlcmF0aW5nQXV0aG9yaXR5Q3JlZGVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlVXNlTGFiZWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXplQW5kVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpblRvbmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbEFybXNFcnJvclRyYW5zYWN0aW9uUmVqZWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxBcm1zVHJhbnNhY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxTZWN1cml0eUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xpY2l0YXRpb25DYW5jZWxsYXRpb25SZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGljaXRhdGlvbk1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291bmRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU1haW50ZW5hbmNlQW5kUmVjb3ZlcmFiaWxpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkRlcG9zaXRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkRpc2Nsb3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZMZWFkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZMb3NzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENhdGVnb3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENvbnRyYWN0UHJvdmlzaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbERhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsTWFya2V0aW5nVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxNYXJraW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbE1hdGVyaWFsSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUHJvZ3JhbVJlcXVpcmVtZW50U3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFJlaW1idXJzYWJsZVByb3Zpc2lvbnNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUmVxdWlyZW1lbnRMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxSZXF1aXJlbWVudHNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZEluZHVzdHJpYWxDbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRPY2N1cGF0aW9uQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFRleHRBY2NvcmRpbmdVU0VtYmFyZ29SZWd1bGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRUZXh0Q2xhdXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRUZXh0Rm9yRXhwb3J0QWNjb3JkaW5nTmF0aW9uYWxQcmVzY3JpcHRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpb25DbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlvbkNsYXNzaWZpY2F0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxBZG1pbmlzdHJhdGl2ZUluZm9ybWF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxOYXR1cmVPZlRyYW5zYWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbE9iamVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxQcm9jZWR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNCdW5kZXNBbXRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja0V4Y2hhbmdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tFeGNoYW5nZURldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tGdW5kT3JOb24tU3RvY2tGdW5kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50QWN0aXZpdHlUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZGVudEF3YXJkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vicm9nYXRpb25BY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJyb2dhdGlvblBheW1lbnRPcHRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJyb2dhdGlvblJlcXVlc3RDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vicm9nYXRpb25SZXNwb25zZUNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzaXN0ZW5jZVR5cGVPZlBhY2tDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWZmaXhDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWZmaXhPckxpbWl0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbW9uc1R5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YWxEYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YXJ5QWNjb3VudGluZ0NsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzU3RvY2tUdXJub3ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGx5Q29uZGl0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZURlc2NyaXB0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ludGF4Tm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbWF0aXplZE5vbWVuY2xhdHVyZU9mSHVtYW5BbmRWZXRlcmluYXJ5TWVkaWNpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmU2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEFzc2Vzc21lbnRNZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheE9yRmVlRXhlbXB0aW9uUmVhc29uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UGFydHlJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsQXNzZXNzbWVudENoZWNrbGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lRGlyZWN0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wbGF0ZUNoYXJhY3RlcmlzdGljTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wbGF0ZU93bmVyTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wbGF0ZVR5cGVMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtc09mRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcnRpYXJ5RGlhZ25vc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nRGVtb2dyYXBoaWNDYXRlZ29yeUNvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nU2VydmljZVF1ZXN0aW9uQ29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmdTdGF0aXN0aWNhbENhdGVnb3J5Q29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RSZXN1bHRzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVEb2N1bWVudENvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZUV4Y2VwdGlvbkFuZFJlcXVpcmVtZW50Q29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5JZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb25TdGF0dXNJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkJpbGxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkhvbGRpbmdEZWxheUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uTW9kZU9yTWV0aG9kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25Nb2RlUmVhc29uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25Qcmlvcml0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJ5TWFuYWdlbWVudEFzc29jaWF0aW9uU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJ5TWFuYWdlbWVudEFzc29jaWF0aW9uU2VydmljZUNvZGVBbmRCYW5rU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJ5U3ltYm9sQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZW5kUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlhbFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlQWRqdXN0bWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVBbmRDYXVzZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVEdWUtSW5JbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVJZGVudGl0eUNoYW5nZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVJbnNwZWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU51bWVyaWNhbENvbnRyb2xTeXN0ZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZBc3NldHNBbmRMaWFiaWxpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQXNzaXN0YW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkJpbGxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZCdXNpbmVzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkNhcmdvQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQ29udHJhY3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZDb250cmFjdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mRGVsYXlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZGaW5hbmNpYWxBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZGaXJtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mSW5kdXN0cmlhbEFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZJbnF1aXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mSXNzdWVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZMb2NhdGlvblJlY29uY2lsaWF0aW9uUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mTWVkaWFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZQYWNrYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZQcm9jdXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mU3RvcmFnZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZlN1cnZleVF1ZXN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlUGFja0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVQaHlzaWNhbEludmVudG9yeU9yVHJhbnNhY3Rpb25IaXN0b3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVSZWNpcGllbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmNsYWltZWRQcm9wZXJ0eUFkZGl0aW9uc0RlbGV0aW9uc0FuZERlZHVjdGlvbnNDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5jbGFpbWVkUHJvcGVydHlUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pZm9ybUZyZWlnaHRDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWZvcm1SZXNpZGVudGlhbEFwcHJhaXNhbEF0dHJpYnV0ZXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkTmF0aW9uc0NvbW1vbkNvZGluZ1N5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkTmF0aW9uc1N0YW5kYXJkUHJvZHVjdHNBbmRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzRGVwYXJ0bWVudE9mSGVhbHRoQW5kSHVtYW5TZXJ2aWNlc09mZmljZU9mVml0YWxTdGF0aXN0aWNzRS1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNvbGljaXRlZFByb3Bvc2FsUmVqZWN0aW9uUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGlsaXphdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY2NpbmF0aW9uSW5ub2N1bGF0aW9uT3JJc29sYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1YXRpb25UeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlQWRkZWRUYXhJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZUNsYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlT2NjdXBhbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlUGFyYW1ldGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsU3RhdHVzQW5kVGVybXNPZkNhcnJpYWdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsU3Rvd2FnZUxvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsU3VzdGFpbmluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpZXdQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaW9sYXRpb25UeXBlQ29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZveWFnZURvY3VtZW50TnVtYmVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm95YWdlTWFuaWZlc3RSZWZlcmVuY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhclJlc2VydmVNYXRlcmlhbFJlcXVpcmVtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJDb21tb2RpdHlBbmRTcGVjaWFsSGFuZGxpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlclRlcm1pbmFsSWRlbnRpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodE9yRnJhZ2lsaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlbkRpc2NvdmVyZWRMb29rdXAiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRyYWN0VHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udHJhY3RUeXBlQ29kZWQiIHR5cGU9IkNvbnRyYWN0VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRyYWN0VHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRyYWN0VHlwZSIgdHlwZT0iQ29udHJhY3RUeXBlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkNvbnRyYWN0VHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zaXNSZWxhdGVkR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlckRpZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhcmlhYmxlUGVyRGllbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwaXRhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGVkR3Jvd2luZ0VxdWl0eU1vcnRnYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRpY2lwYXRlZENvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSG91c2luZ0F1dGhvcml0eUFkanVzdGFibGVSYXRlTW9ydGdhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIb3VzaW5nQXV0aG9yaXR5VmV0ZXJhbnNBZmZhaXJzRml4ZWRSYXRlTW9ydGdhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25hbFNlY29uZE1vcnRnYWdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVudGlvbmFsRml4ZWRSYXRlTW9ydGdhZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSG91c2luZ0F1dGhvcml0eVZldGVyYW5zQWZmYWlyc0dyYWR1YXRlZFBheW1lbnRNb3J0Z2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnb3RpYXRlZENvbnZlbnRpb25hbEdyYWR1YXRlZFBheW1lbnRPclN0ZXBSYXRlTW9ydGdhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25hbEFkanVzdGFibGVSYXRlTW9ydGdhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQbHVzSW5jZW50aXZlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0U2hhcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBsdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQbHVzQXdhcmRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQbHVzRml4ZWRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdXNpdmVBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1c2l2ZVJpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJtb3JBY3R1YWxDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZUluY2VudGl2ZUZpcm1UYXJnZXRXaXRoUGVyZm9ybWFuY2VJbmNlbnRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VJbmNlbnRpdmVGaXJtVGFyZ2V0V2l0aG91dFBlcmZvcm1hbmNlSW5jZW50aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlUmVkZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNld2l0aEVzY2FsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VJbmNlbnRpdmVTdWNjZXNzaXZlVGFyZ2V0V2l0aFBlcmZvcm1hbmNlSW5jZW50aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlSW5jZW50aXZlU3VjY2Vzc2l2ZVRhcmdldFdpdGhvdXRQZXJmb3JtYW5jZUluY2VudGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZUF3YXJkRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlSW5jZW50aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlTGV2ZWxvZkVmZm9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9Db3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRyb2FjdGl2ZUZpeGVkUHJpY2VSZWRldGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcm1GaXhlZFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNld2l0aEVjb25vbWljUHJpY2VBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV2ZWxvZkVmZm9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJDb250cmFjdFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3NwZWN0UmVzZXJ2YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbWVQZXJjZW50YWdlYXNGaWxtUmVudGFsRWFybmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lYW5kTWF0ZXJpYWxzIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJWYWxpZGl0eURhdGVzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTdGFydERhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVuZERhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVmFsaWRpdHlEYXRlcyIgdHlwZT0iVmFsaWRpdHlEYXRlcyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUmVmZXJlbmNlQ29kZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlJlZmVyZW5jZUNvZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZSZWZlcmVuY2VDb2RlZCIgdHlwZT0iTGlzdE9mUmVmZXJlbmNlQ29kZWQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJlZmVyZW5jZUNvZGVkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VUeXBlQ29kZWQiIHR5cGU9IlJlZmVyZW5jZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWZlcmVuY2VUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlByaW1hcnlSZWZlcmVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3VwcG9ydGluZ1JlZmVyZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlJlZmVyZW5jZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdXBwb3J0aW5nU3ViUmVmZXJlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlZmVyZW5jZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VDb2RlZCIgdHlwZT0iUmVmZXJlbmNlQ29kZWQiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUmVmZXJlbmNlVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBYmJyZXZpYXRlZE5ld0RydWdBcHBsaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YWJsZVNvdXJjZURVTlNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFibGVTb3VyY2VQdXJjaGFzZXJJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YWJsZVNvdXJjZVN1cHBsaWVySUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2Vzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2Vzc29yaWFsUmFpbERpdmVyc2lvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXNzb3JpYWxTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudENhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ0VxdWlwbWVudExvY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nRmlsZVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1BlcmlvZFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE1hbmFnZXJzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFBhcnR5c0JhbmtSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRQYXJ0eXNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRQYXlhYmxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50U2VydmljaW5nQmFua3NSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUmVjZWl2YWJsZUN1c3RvbWVyQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNSZWNlaXZhYmxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1JlY2VpdmFibGVPcGVuSXRlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNSZWNlaXZhYmxlU3RhdGVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50U3VmZml4Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VtZW50T2ZPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aW9uQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkT25TeXN0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZHJlc3NlZVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRSZXByaWNlZENsYWltUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZFJlcHJpY2VkTGluZUl0ZW1SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRDb250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50TWVtb0NoYXJnZUJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0b3JzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnNhcnlDYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnRpc2VyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpY2VPZkNvbGxlY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzZVRocm91Z2hCYW5rc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNpbmdCYW5rc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWVyb25hdXRpY2FsRXF1aXBtZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmZmVjdGVkU3Vic3lzdGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmaWxpYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUFzc2lnbmVkRW1wbG95ZWVJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5QXNzaWduZWROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUNhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lDbGF1c2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFJREFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lIaWVyYXJjaGljYWxMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5TG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lzU3R1ZGVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50c0JhbmtSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50c1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRzU2hpcG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFHRVJEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmVlbWVudFRvUGF5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJDYXJnb1RyYW5zZmVyTWFuaWZlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckRpbWVuc2lvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckhhbmRsaW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlybGluZXNGbGlnaHRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlybGluZVRpY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyV2F5YmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3RtZW50SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZVJlY2lwaWVudElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVDbGF1c2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtYnVsYXRvcnlQYXRpZW50R3JvdXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZW5kZWRVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZW5kbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lbmRtZW50RmlsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkJhbmtlcnNBc3NvY2lhdGlvblRyYW5zaXRPclJvdXRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuR2FzQXNzb2NpYXRpb25FcXVhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5Pc3Rlb3BhdGhpY0Fzc29jaWF0aW9uQ2VydGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5QZXRyb2xldW1JbnN0aXR1dGVEZWR1Y3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblBldHJvbGV1bUluc3RpdHV0ZVdlbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuYWx5c2lzTnVtYmVyT3JUZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmVzdGhlc2lhTGljZW5zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5pbWFsU3BlY2llcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5pbWFsU3RyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRpRHVtcGluZ0Nhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFQRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYWJsZUNvZWZmaWNpZW50SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FibGVJbnN0cnVjdGlvbnNPclN0YW5kYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50c0JhbmtSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudHNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25UcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwb2ludG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJhaXNlckxpY2Vuc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvcHJpYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFydGljbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2VtYmx5TGluZUZlZWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZW1ibHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2Vzc21lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlUcmFuc2FjdGlvblNldFNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWdubWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWdubWVudFJlY29yZGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZENhc2VDb250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkSW52b2ljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWROdW1iZXJGb3JKb2luZWRVbml0Tm90UmVzdWJkaXZpZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkTnVtYmVyRm9yTGltaXRlZENvbW1vbkVsZW1lbnRQYXJraW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkTnVtYmVyRm9yVW5pdFBhcmtpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWRQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWRQcm9kdWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkUHJvcGVydHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWRQdXJjaGFzZU9yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb25PZkFtZXJpY2FuUmFpbHJvYWRzUmFpbHdheUFjY291bnRpbmdSdWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzdW1pbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdGFDYXJuZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0b21pY1NhZmV0eWFuZExpY2Vuc2luZ0JvYXJkUGFuZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaGVkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaG1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXNhdGlvbkZvclJlcGFpclJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXR5SXNzdWVkRXF1aXBtZW50SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6YXRpb25OdW1iZXJGb3JFeGNlcHRpb25Ub0Rhbmdlcm91c0dvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uVG9NZWV0Q29tcGV0aXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9Mb3NzSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIUmV0dXJuT3JOb3RpZmljYXRpb25PZkNoYW5nZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSEVudHJ5RGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFN0YW5kYXJkRW50cnlDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIVHJhY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRlZFVuZGVyd3JpdGluZ1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXhsZVJhdGlvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrb3V0UHJvY2VkdXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFkZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGFuY2VEdWVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtBc3NpZ25lZEJhbmtlcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtBc3NpZ25lZFNlY3VyaXR5SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2Vyc0FjY2VwdGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtydXB0Y3lQcm9jZWR1cmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtzQ29tbW9uVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtzSW5kaXZpZHVhbFRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rVGVsZWdyYXBoaWNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtUb0JhbmtJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyQ29kZWRMYWJlbFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyQ29kZWRTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlUGVybWl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNpY0NvbnRyYWN0TGluZUl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhdGNoTnVtYmVyT3JMb3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhdGNoU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlYW1Bc3NlbWJseUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2luTWlsZU1hcmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5uaW5nSm9iU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2lubmluZ0thbmJhblNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5uaW5nTWV0ZXJSZWFkaW5nQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbm5pbmdNZXRlclJlYWRpbmdFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2lubmluZ1NlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhcnlzQmFua1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhcnlzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGF0ZXJhbENhclNlcnZpY2VBZ3JlZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsQW5kSG9sZEludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nQ2VudGVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxvZk1hdGVyaWFsUmV2aXNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZlF1YW50aXRpZXNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbmFyeU9iamVjdElkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbkxvY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGFua2V0T3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsZW5kZWRXaXRoQmF0Y2hOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsZW5kZWRXaXRoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmx1ZUNyb3NzUHJvdmlkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsdWVTaGllbGRQcm92aWRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9uZGVkQ2FycmllckludGVybmFsUmV2ZW51ZVNlcnZpY2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va2luZ1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9yZGVyZWF1TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2hJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyT3JTYWxlc09mZmljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyUmVmZXJlbmNlMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyUmVmZXJlbmNlMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2Vyc09yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldENoYXB0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cmVhdW9mTGFib3JhbmRTdGF0aXN0aWNzU2NoZWR1bGVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJlYXVTaWduaW5nT1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cmVhdVNpZ25pbmdTUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NUYXhOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0FwcHJvdmFsTWFyayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQ2F0YWxvZ3VlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQ3JlZGl0TWVtbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzRGViaXRNZW1vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNEZWJ0b3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0l0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc09yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNTaGlwbWVudE1hcmtOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhZEZpbGVMYXllckNvbnZlbnRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGVuZGFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbE9mZk9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxsU2lnbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5FeGNpc2VFbnRyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5GaW5hbmNpYWxJbnN0aXR1dGlvbkJyYW5jaEFuZEluc3RpdHV0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkdvb2RzQW5kU2VydmljZXNvclF1ZWJlY1NhbGVzVGF4UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhblByb3ZpbmNlT3BlcmF0aW5nQXV0aG9yaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhblNvY2lhbEluc3VyYW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5XaGVhdEJvYXJkUGVybWl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxlZFJldmlzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkQWNjb3VudFJlcG9ydGluZ0lkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRBY2NvdW50UmVwb3J0aW5nTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRBY2NvdW50U3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZEFjY291bnRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZEJpbGxpbmdUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZElzc3VlclRyYW5zYWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29BY2NlcHRhbmNlT3JkZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29NYW5pZmVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FybmV0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyQXNzaWduZWRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyQXNzaWduZWRDb25zaWduZWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJBc3NpZ25lZFBhY2thZ2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckFzc2lnbmVkUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyQXNzaWduZWRTaGlwcGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyc0FnZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyc0N1c3RvbXNCb25kTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZU9mTmVlZFBhcnR5c1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzdWFsdHlSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc3VhbHR5UmVwb3J0U2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRhbG9nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRhbG9ndWVTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0YXN0cm9waGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGVnb3J5T2ZXb3JrUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZWRlbnRzQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlZGluZ0NvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlaWxpbmdGb3JtdWxhUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNBdXRvbWF0ZWRGaWxlc0lEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNCbG9ja0dyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNTdGF0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnN1c1RyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNUcmFjdFN1ZmZpeCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbFNlY3JldGFyaWF0TG9nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50cmFsU2VjcmV0YXJpYXRMb2dOdW1iZXJDaGlsZERhdGFNYWludGVuYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbFNlY3JldGFyaWF0TG9nTnVtYmVyUGFyZW50RGF0YU1haW50ZW5hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZkNvbmZvcm1pdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlb2ZJbmNvcnBvcmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZW9mVHJhbnNwb3J0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZE1haWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNSTkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW1iZXJPZkNvbW1lcmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFtYmVyT2ZDb21tZXJjZVJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBTVBVU0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VEb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VPcmRlckF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlVmVyaWZpY2F0aW9uUHJvY2VkdXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlQ2FyZEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZUNhcmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZU5vdGVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcnRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlY2tpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZWNrTGlzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZW1pY2FsQWJzdHJhY3RTZXJ2aWNlUmVnaXN0cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZXF1ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lyY3VpdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lyY3VsYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1bGFyUHVibGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRhdGlvbk9mT3BpbmlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0YXRpb25PZlN0YXR1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGl6ZW5zaGlwRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdmlsQWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXZpbExpYWJpbGl0aWVzb2ZPaWxDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1BZG1pbmlzdHJhdG9yQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltYW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbWFudHNDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltT2ZmaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXNzT2ZDb250cmFjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXVzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdIb3VzZUludGVyYmFua1BheW1lbnRzU3lzdGVtU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2VJbnRlcmJhbmtQYXltZW50U3lzdGVtUGFydGljaXBhbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2VJbnRlcmJhbmtQYXltZW50U3lzdGVtVXNlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJUZXh0Q2xhdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGllbnRDb21wYW55Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGllbnRSZXBvcnRpbmdDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpbmljYWxMYWJvcmF0b3J5SW1wcm92ZW1lbnRBbWVuZG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsaW5pY051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hbEF1dGhvcml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29kZU9mRmVkZXJhbFJlZ3VsYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2lsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xkUm9sbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGluZ0JhbmtzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0b3JJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbG9jYXRpb25JbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmVkU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxPclByaXZhdGVQYXNzZW5nZXJWZWhpY2xlUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsQWNjb3VudFN1bW1hcnlSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxhbmRHb3Zlcm5tZW50RW50aXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbERyaXZlcnNMaWNlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVTYWZldHlBc3N1cmFuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pdG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pdHRlZU9uVW5pZm9ybVNlY3VyaXR5SWRlbnRpZmljYXRpb25Qcm9jZWR1cmVzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb2RpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vbkFjY2Vzc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9uVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlBbmRQbGFjZVJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUFuZFN5bmRpY2F0ZVJlZmVyZW5jZTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlBbmRTeW5kaWNhdGVSZWZlcmVuY2UyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55SXNzdWVkRXF1aXBtZW50SWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNSTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJhYmxlUHJvcGVydHlQZW5kaW5nU2FsZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVByb3BlcnR5U2FsZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVByb3BlcnR5VmVyaWZpY2F0aW9uU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZXRlbnRBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsYWludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxhaW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkVW5pdHNQYXltZW50UmVxdWVzdFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxpYW5jZUNvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBvbmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZGl0aW9uT2ZQdXJjaGFzZURvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kaXRpb25PZlNhbGVEb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZG9taW5pdW1JZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZ3Jlc3Npb25hbERpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25uZWN0aW5nQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzRnVydGhlck9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlc09yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzUmVsZWFzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlc1NoaXBtZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdubWVudENsYXNzaWZpY2F0aW9uSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vcnNGdXJ0aGVyT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZEludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb25TaGlwbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdG9yc1JlY2VpcHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cmFpbnROb3RhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1wdGlvbkRhdGFSZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJPckVxdWlwbWVudFJlY2VpcHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck9yUGFja2FnaW5nU3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyRGlzcG9zaXRpb25PcmRlclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyT3BlcmF0b3JzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJvckVxdWlwbWVudFJlY2VpcHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclByZWZpeCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldvcmtPcmRlclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludWF0aW9uRmlsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51YXRpb25Vbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVvdXNNb3ZlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51b3VzVHJhbnNmZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QWRkZW5kdW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QXVkaXRvcklETnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEJyZWFrZG93blJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDb29wTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEhvbGRlckNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdExpbmVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RPcHRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JEYXRhUmVxdWlyZW1lbnRzTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvckVzdGFibGlzaG1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yUmVxdWVzdFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RQYXJ0eVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UmlkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZleWFuY2VSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3BlcmF0aW9uQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcm5ib3JlQ2VydGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkQmF0Y2hOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZENvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRTb2NpYWxTZWN1cml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RBbGxvY2F0aW9uUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0YVJpY2FuSnVkaWNpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RDZW50cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RFbGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlCdXNpbmVzc1JlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5TGVnaXNsYXRpdmVEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cG9uRGlzdHJpYnV0aW9uTWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Vwb25SZWRlbXB0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmFnZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdENhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdENvdW5zZWxpbmdJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0TWVtb051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Tm90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9yRGViaXRBZGp1c3RtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRvcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdFJhdGluZ0FnZW5jeXNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0UmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRSZXBvc2l0b3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpdGljYWxBcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpdGljYWxpdHlEZXNpZ25hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9wWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3NMaXN0ZWRDb3Vyc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUzU0S2V5VHJhaW5JbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUzU0S2V5VHJhaW5JbmRpY2F0b3JHcm91cE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRvckxhdGVzdENvdXJzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFByb2NlZHVyYWxUZXJtaW5vbG9neUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRSZXZpc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJDYXRhbG9nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck1haW50ZW5hbmNlUGVyaW9kU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyTWF0ZXJpYWxTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclByb2Nlc3NTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJSZWZlcmVuY2VOdW1iZXJBc3NpZ25lZFRvUHJldmlvdXNCYWxhbmNlT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyc0NvbW1vblRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lcnNJbmRpdmlkdWFsVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyc1BhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyU3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJzUmVsZWFzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJzVW5pdEludmVudG9yeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJUcmFja2luZ051bWJlckZvckxvYW5lZE1hdGVyaWFscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0JhckNvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNCcm9rZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNpc2lvblJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RyYXdiYWNrRW50cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNHdWFyYW50ZWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNob3VzZUJyb2tlckxpY2Vuc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUHJlZmVyZW5jZUlucXVpcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNSZWxlYXNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1RhcmlmZk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1RyYW5zaGlwbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1ZhbHVhdGlvbkRlY2lzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c0dvb2RzU2VjdXJpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c0dvb2RzVHJhbnNwb3J0TGljZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YUF1dGhlbnRpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhSXRlbURlc2NyaXB0aW9uUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhUXVhbGl0eVJlamVjdFJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YVJlbGlhYmlsaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YVNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YVN0cnVjdHVyZVRhZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhbGVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhbGVyT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlcnB1cmNoYXNlb3JkZXJudW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlclR5cGVJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdE5vdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvcnNBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3JzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhbnRzQ3VzdG9tc0lkZW50aXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhbnRzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlY3RDb2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlbnNlRmVkZXJhbEFjcXVpc2l0aW9uUmVndWxhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVuc2VQcmlvcml0aWVzQWxsb2NhdGlvblN5c3RlbVByaW9yaXR5UmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcm1lbnRBcHByb3ZhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyZWRQYXltZW50UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU5vdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVF1b3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlSZWdpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U2NoZWR1bGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5VGlja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVRyYWlsZXJNYW5pZmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlWZXJpZmljYXRpb25DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuaWFsUmVhc29uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuc2l0eU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW50YWxJbnN1cmFuY2VBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW50YWxJbnN1cmFuY2VQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnRpc3RMaWNlbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T3JBZ2VuY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZkFncmljdWx0dXJlQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZDb21tZXJjZUFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mRGVmZW5zZUZvcm0yNTBSZXF1aXJlbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkRlZmVuc2VJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkREVFNDTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mRWR1Y2F0aW9uQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZFbmVyZ3lBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhIU0FSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVURBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mSW50ZXJpb3JBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZkp1c3RpY2VBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZkxhYm9yQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZTdGF0ZUFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mdGhlVHJlYXN1cnlBY3F1aXNpdGlvbk9yUHJvY3VyZW1lbnRSZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZUcmFuc3BvcnRhdGlvbkFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mVHJhbnNwb3J0YXRpb25Cb25kTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZUcmFuc3BvcnRhdGlvbkhhemFyZG91c051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mVmV0ZXJhbnNBZmZhaXJzQWNxdWlzaXRpb25SZWd1bGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudFdoZXJlSW5qdXJ5T2NjdXJyZWRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlZnJvbVNwZWNpZmljYXRpb25DbGFzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZWZyb21TcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVmcm9tU3BlY2lmaWNhdGlvblR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnRzSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0b3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRvcnlUcnVzdENvbXBhbnlJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdFNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXJhdENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNjcmlwdGlvbk9mQ2hhbmdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hBZHZpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZVBvc3RQYXJjZWxzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9ub2ZTaGlwbWVudEhhcm1vbml6ZWRCYXNlZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWdub3Npc1JlbGF0ZWRHcm91cE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0RGViaXRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdG9yeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5bWVudFZhbHVhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5bWVudFZhbHVhdGlvblJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FiaWxpdHlJbnN1cmFuY2VBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmlsaXR5SW5zdXJhbmNlUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudGVyUmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwZW5zYXRpb25SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3Bvc2FsVHVybkluRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3B1dGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvbkNlbnRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uU3RhdGVtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JBc3NpZ25lZE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvckFzc2lnbmVkVHJhbnNhY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dE9ySW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JzQWNjb3VudElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvcnNBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvcnNSZXByZXNlbnRhdGl2ZUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvcnNTcGxpdEFnZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2ZXJzaW9uQXV0aG9yaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZpc2lvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9ja1JlY2VpcHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QW1lbmRtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlQYXltZW50UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGF0aW9uQWZmZWN0ZWROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50SWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRWb2x1bWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljRmxpZ2h0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY0ludmVudG9yeU1hbmFnZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21pY2lsZUJyYW5jaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9taW5pb25PZkNhbmFkYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvd25zdHJlYW1TaGlwcGVyQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWZ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFpbmhvbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdlZXNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmdMaXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nUmV2aXNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmdUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzTGljZW5zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z0VuZm9yY2VtZW50QWRtaW5pc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdFbmZvcmNlbWVudEFkbWluaXN0cmF0aW9uT3JkZXJCbGFua051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z0Zvcm11bGFyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVuQW5kQnJhZHN0cmVldENhbmFkYXM4RGlnaXRTdGFuZGFyZEluZHVzdHJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bkFuZEJyYWRzdHJlZXRVUzhEaWdpdFN0YW5kYXJkSW5kdXN0cmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFVOU051bWJlcndpdGhGb3VyQ2hhcmFjdGVyU3VmZml4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEVU5TTnVtYmVyRHVuQW5kQnJhZHN0cmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVwbGljYXRlQmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVwbGljYXRlV2F5YmlsbGluUm91dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cGxpY2F0ZVdheWJpbGxOb3RJblJvdXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXR5RnJlZVByb2R1Y3RzUmVjZWlwdEF1dGhvcmlzYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1dHlGcmVlUHJvZHVjdHNTZWN1cml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eU1lbW9OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR5ZUxvdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUNDTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uYWxJbnN0aXR1dGlvbklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdGlvbkRpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljRGF0YUludGVyY2hhbmdlQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljZGV2aWNlcGlubnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljRnVuZHNUcmFuc2ZlcklETnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljUGF5bWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxldmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWJhcmdvTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWJhcmdvUGVybWl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1pc3Npb25EZXNpZ25hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZU9yTm9uRW1wbG95ZWVDbGFzc2lmaWNhdGlvblF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVUYXhGaWxpbmdTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llcklkZW50aWZpY2F0aW9uTnVtYmVyT2ZTZXJ2aWNlQnVyZWF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llcnNJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXJzU29jaWFsU2VjdXJpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveW1lbnRWaXNhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUNvbnRhaW5lckJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5UmVwb3NpdGlvbmluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nSm9iU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ0thbmJhblNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nTWV0ZXJSZWFkaW5nQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdNZXRlclJlYWRpbmdFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ1BhY2thZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ1NlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kSXRlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kTWlsZU1hcmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kb3JzZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFVzZUF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFVzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kVXNlcnNQdXJjaGFzZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0NoYW5nZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0NoYW5nZVByb3Bvc2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0RhdGFMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ1NwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVucXVpcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudHJ5UG9pbnRBc3Nlc3NtZW50TG9nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRyeVBvaW50QXNzZXNzbWVudExvZ051bWJlckNoaWxkRG1yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRyeVBvaW50QXNzZXNzbWVudExvZ051bWJlclBhcmVudERtciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW52aXJvbm1lbnRhbFByb3RlY3Rpb25BZ2VuY3lBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmlyb25tZW50YWxQcm90ZWN0aW9uQWdlbmN5VGVzdFR5cGVQdXJwb3NlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW52aXJvbm1lbnRhbFByb3RlY3Rpb25BZ2VuY3lUcmFuc3BvcnRlcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRJbml0aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudE93bmVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50VHJhbnNwb3J0Q2hhcmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpdmFsZW50Q291cnNlTnVtYmVyYXRSZXF1ZXN0aW5nSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVycm9ySWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2Nyb3dGaWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVPcmRlclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXRlcm1zUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdXIxQ2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NUcmFuc3BvcnRhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhoaWJpdERpc3RyaWJ1dGlvbkxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aGliaXRJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBhbnNpb25vbkVmZmVjdG9mQ2hhbmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRDbGVhcmFuY2VJbnN0cnVjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0RGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydGVyc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0RXN0YWJsaXNobWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0TGljZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0UGVybWl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkT3JFeGhpYml0TGluZUl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5Q2VydGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjaWxpdHlJRE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjaWxpdHlNZWFzdXJlbWVudFBvaW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNpbGl0eU5ldHdvcmtJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbHVyZUFuYWx5c2lzUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsdXJlbWVjaGFuaXNtbnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW1pbHlNZW1iZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFtaWx5VW5pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlU2VsbGVyU2VydmljZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxBY3F1aXNpdGlvblJlZ3VsYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsQnVyZWF1T2ZJbnZlc3RpZ2F0aW9uSW5kaXZpZHVhbElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsQ29tbXVuaWNhdGlvbnNDb21taXNzaW9uQ29uZGl0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbENvbW11bmljYXRpb25zQ29tbWlzc2lvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxDb21tdW5pY2F0aW9uc0NvbW1pc3Npb25UcmFkZU9yQnJhbmRJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsRW5lcmd5UmVndWxhdG9yeUNvbW1pc3Npb25DZXJ0aWZpY2F0ZU9mUHVibGljQ29udmVuaWVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZITE1DRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhvbWVMb2FuTW9ydGdhZ2VDb3Jwb3JhdGlvbkxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIb3VzaW5nQWRtaW5pc3RyYXRpb25DYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSFVNUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhvdXNpbmdBZG1pbmlzdHJhdGlvbk9yaWdpbmF0b3JJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEluZm9ybWF0aW9uUmVzb3VyY2VzTWFuYWdlbWVudFJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNYXJpdGltZUNvbW1pc3Npb25Gb3J3YXJkZXJzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWFyaXRpbWVDb21taXNzaW9uVGFyaWZmTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTmF0aW9uYWxNb3J0Z2FnZUFzc29jaWF0aW9uTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxTdXBwbHlDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxTdXBwbHlTY2hlZHVsZUl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxTdXBwbHlTY2hlZHVsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFRheHBheWVyc0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsV2lyZVRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGRURXSVJFQ29uZmlybWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWVTY2hlZHVsZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlQ29udmVyc2lvbkpvdXJuYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVMaW5lSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZXJDb2RlSXNzdWVkYnlCdXJlYXVPZkNlbnN1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZXJDb2RlSXNzdWVkQnlDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlVHJhbnNmZXJGb3JtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlVHJhbnNmZXJQcm90b2NvbExvY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVWZXJzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFdvcmtDYW5kaWRhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbENsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsRGV0YWlsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsTWFuYWdlbWVudFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsUGhhc2VSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFNldHRsZW1lbnRQYXJ0eXNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5kZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmVMaW5lQ2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaExvdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RUcmFuc2Zlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlzY2FsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlzY2FsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGVldFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxleGlibGVTcGVuZGluZ0FjY291bnRJbnN1cmFuY2VBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGV4aWJsZVNwZW5kaW5nQWNjb3VudEluc3VyYW5jZVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb2REYXRhSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb2Rab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb3JQbGFuQXBwcm92YWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb3dSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvbGRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vZEFuZERydWdBZG1pbmlzdHJhdGlvbkFjY2Vzc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vZEFuZERydWdBZG1pbmlzdHJhdGlvblByb2R1Y3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb29kQW5kRHJ1Z0FkbWluaXN0cmF0aW9uUHJvZHVjdFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjbG9zaW5nU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2xvc3VyZUFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25FeGNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkV4Y2hhbmdlQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25NaWxpdGFyeVNhbGVzQ2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk1pbGl0YXJ5U2FsZXNOb3RpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25NaWxpdGFyeVNhbGVzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduVHJhZGVab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3Jlc3RyeVBlcm1pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWFsU3RhdGVtZW50UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1hdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvclBpY2t1cExpbWl0ZWRGcmVpZ2h0VGFyaWZmTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzT3JBZ2VudHNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRpbmdPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYW5jaGlzZVRheEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWNTZWxsZXJTZXJ2aWNlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZVpvbmVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0QmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEZvcndhcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEZvcndhcmRlcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRQYXlvclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVsbFRpbWVPclBhcnRUaW1lRW1wbG95ZWVDbGFzc2lmaWNhdGlvblF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbENhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsV29ya0dyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kQ29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kTWFuYWdlcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRzQXV0aG9yaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzQW5hbHlzaXNTb3VyY2VNZXRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzQ3VzdG9kaWFuSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdWdlVGlja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQWdlbmN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQ2FyZ29Db25zaWdubWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbERlY2xhcmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsTGVkZ2VyQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsUHVycG9zZU1lc3NhZ2VSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxTZXJ2aWNlc0FkbWluaXN0cmF0aW9uUmVndWxhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNEZXN0aW5hdGlvblpvbmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNJbmRleCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY0tleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY1Njb3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHaW5uaWVNYWVQb29sUGFja2FnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNBbmRTZXJ2aWNlc1RheElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc2FuZFNlcnZpY2VUYXhSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzRGVjbGFyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybmluZ0NsYXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEFjY291bnRpbmdDbGFzc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEFkdmFuY2VQcm9ncmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEFnZW5jeVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEJpbGxvZkxhZGluZ09mZmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFByaW9yaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50UXVhbGl0eUFzc3VyYW5jZUFuZENvbnRyb2xMZXZlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFRyYW5zcG9ydGF0aW9uUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5CbG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5PcmRlclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jhdml0eVNvdXJjZU1ldGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmVlbkNhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwQWNjb3VudGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwT3JQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwV29ya0NhbmRpZGF0ZVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm93dGhGYWN0b3JSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRvckxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRvclVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFybW9uaXNlZFN5c3RlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFybW9uaXplZENvZGVTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhhc3RlbmluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzQ2VydGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzRXhlbXB0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNXYXN0ZU1hbmlmZXN0RG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbk5hdGlvbmFsUGF5ZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQ2FyZUZpbmFuY2luZ0FkbWluaXN0cmF0aW9uTmF0aW9uYWxQcm92aWRlcklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aGNhcmVNYW5wb3dlclNob3J0YWdlQXJlYUZhY2lsaXR5SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISUJDQ0xhYmVsZXJJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluZHVzdHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbnN1cmFuY2VBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbnN1cmFuY2VDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5zdXJhbmNlUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbnN1cmFuY2VSYXRpbmdBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbnN1cmFuY2VSYXRpbmdTdWZmaXhDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhNYWludGVuYW5jZU9yZ2FuaXphdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoTWFpbnRlbmFuY2VPcmdhbml6YXRpb25BdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhNYWludGVuYW5jZU9yZ2FuaXphdGlvbkNvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoT3JXaWRlRmlsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaEZhYnJpY2F0aW9uQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFJhd01hdGVyaWFsQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZU1vcnRnYWdlRGlzY2xvc3VyZUFjdENlbnN1c1RyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lTW9ydGdhZ2VEaXNjbG9zdXJlQWN0QmxvY2tOdW1iZXJBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lTW9ydGdhZ2VEaXNjbG9zdXJlQWN0Q291bnR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZU1vcnRnYWdlRGlzY2xvc3VyZUFjdE1ldHJvcG9saXRhblN0YXRpc3RpY2FsQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZU1vcnRnYWdlRGlzY2xvc3VyZUFjdFN0YXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9yaXpvbnRhbENvb3JkaW5hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcnNlcG93ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdFJvbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXNlQmlsbE9mTGFkaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZVdheWJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklhdGFDYXJnb0FnZW50Q2Fzc0FkZHJlc3NOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklhdGFDYXJnb0FnZW50Q29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUNEOUNNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGlmaWNhdGlvbkNhcmRTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aXR5Q2FyZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1hZ2VJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbW1lZGlhdGVFeHBvcnRhdGlvbk5vRm9ySW5Cb25kTW92ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltbWVkaWF0ZVRyYW5zcG9ydGF0aW9uTm9Gb3JJbkJvbmRNb3ZlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wbGVtZW50YXRpb25WZXJzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRDbGVhcmFuY2VJbnN0cnVjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0ZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydGVyc1JlZmVyZW5jZU51bWJlclRvTGV0dGVyT2ZDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydExpY2VuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydFBlcm1pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wdXRhdGlvbkFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluQm9uZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5ib3VuZFRvT3JPdXRib3VuZEZyb21QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5ib3VuZFRvUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0ZWRMZWdhbFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbFRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRGVhbGVyQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxGYWlsdXJlQ2xhaW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxTYW1wbGVJbnNwZWN0aW9uUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsVHJvdWJsZUluZGljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFRyYW5zcG9ydE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJ5UmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbmFuZFN1cnZleVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0b3JJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRlT2ZTZWN1cml0eUFuZEZ1dHVyZU1hcmtldERldmVsb3BtZW50U2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0aXR1dGlvbkxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RpdHV0aW9uTm90ZUhvbGRlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0aXR1dGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNlcnRpZmljYXRlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDb250cmFjdFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlTGljZW5zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVkTG9jYXRpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVkUGFyY2VsUG9zdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZHNMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVyQXNzaWduZWRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3Vyb3JQb29sSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVncmF0ZWRMb2dpc3RpY1N1cHBvcnRDcm9zc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZWdyYXRlZE1hc3RlclBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVncmF0ZWRNYXN0ZXJTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJjaGFuZ2VBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyY2hhbmdlTnVtYmVyTmV3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmNoYW5nZU51bWJlck9sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJjaGFuZ2VUcmFpbklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmdvdmVybm1lbnRhbE1hcml0aW1lT3JnYW5pemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmltRnVuZGluZ09yZ2FuaXphdGlvbkxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWFyeUJyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxDb250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbEN1c3RvbWVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbERhdGFQcm9jZXNzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbFB1cmNoYXNlT3JkZXJJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbFB1cmNoYXNlT3JkZXJSZWxlYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbFZlbmRvck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFzc2Vzc21lbnRMb2dOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBc3Nlc3NtZW50TG9nTnVtYmVyQ2hpbGREYXRhTWFpbnRlbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBc3Nlc3NtZW50TG9nTnVtYmVyUGFyZW50RGF0YU1haW50ZW5hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsRmxpZ2h0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsRnVlbFRheEFncmVlbWVudEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxSZWdpc3RyYXRpb25QbGFuQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFJlZ2lzdHJhdGlvblBsYW5TdGlja2VyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsU3RhbmRhcmRJbmR1c3RyaWFsQ2xhc3NpZmljYXRpb25Eb21pbmlvbk9mQ2FuYWRhQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFN0YW5kYXJkSW5kdXN0cnlDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyc3RhdGVDb21tZXJjZUNvbW1pc3Npb25BY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnZpZXdlcklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRyYVBsYW50Um91dGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5UmVwb3J0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RpZ2F0b3JpYWxOZXdEcnVnTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0b3JBc3NpZ25lZElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RvckxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG9yTm90ZUhvbGRlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VOdW1iZXJTdWZmaXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2luZ0RhdGFTaGVldFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJvbkNoYXJnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVNGTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VpbmdCYW5rc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iT3JQcm9qZWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2JPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50Q3JlZGl0U3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRseUFkbWluaXN0ZXJlZENhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50VmVudHVyZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRpY2lhbERpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRpY2lhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVyaXNkaWN0aW9uYWxDb21tdW5pdHlOYW1lSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVyaXNkaWN0aW9uYWxDb21tdW5pdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnlSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yT3BlcmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcm9yQWZmaWxpYXRpb25JZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFRyYW5zZmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRpdHVkZUV4cHJlc3NlZGluRGVncmVlc01pbnV0ZXNhbmRTZWNvbmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRpdHVkZUV4cHJlc3NlZGluU2Vjb25kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhZENhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlQWdyZWVtZW50QW1lbmRtZW50TnVtYmVyTWFzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZUNvbnRyYWN0UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VSaWRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VTY2hlZHVsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VTY2hlZHVsZU51bWJlckJsYW5rZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlU2NoZWR1bGVOdW1iZXJQcmlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VTY2hlZHVsZU51bWJlclJlcGxhY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kZXJBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kZXJDYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kZXJFbnRpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlbmRlclVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc2VlQmlsbENvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NlZUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJvZkNyZWRpdERyYWZ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkNyZWRpdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyb2ZDcmVkaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlcnNvck5vdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXZ5aW5nT2ZmaWNlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlUGxhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVJbnN1cmFuY2VCaWxsaW5nQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZUluc3VyYW5jZUJpbGxpbmdTdWZmaXhDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlSW5zdXJhbmNlUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1pdGVkUGFydG5lcnNoaXBJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1Db250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lb2ZCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZU9mQ3JlZGl0Q2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmtTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdEJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RPZk1hdGVyaWFscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGxveWRzQ2xhaW1zT2ZmaWNlUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZExpbmVDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZFBsYW5uaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuQWNxdWlzaXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5GZWF0dXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblByb3NwZWN0b3JLZXlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5SZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxKdXJpc2RpY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsbHlBc3NpZ25lZENvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsTWVkaWFJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFNjaG9vbENvdXJzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxTY2hvb2xEaXN0cmljdENvdXJzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxTdHVkZW50SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uRXhjZXB0aW9uT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbm9uUHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uU3BlY2lmaWNTZXJ2aWNlc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25XaXRoaW5FcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2tib3giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9naWNhbE9ic2VydmF0aW9uSWRlbnRpZmllck5hbWVzYW5kQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZ2lzdGljc1N1cHBvcnREb2N1bWVudGF0aW9uVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvbmdpdHVkZUV4cHJlc3NlZEluRGVncmVlc01pbnV0ZXNhbmRTZWNvbmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25naXR1ZGVFeHByZXNzZWRpblNlY29uZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvbmdUZXJtRGlzYWJpbGl0eVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zc09yRXZlbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3NSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93ZXJBcnRpY2xlTnVtYmVyT2ZSYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFnYXppbmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsYm94Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsaW5nUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsU2xvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VBdmFpbGFiaWxpdHlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZVJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ham9yRm9yY2VQcm9ncmFtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWpvclN5c3RlbUFmZmVjdGVkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFrZWdvb2RDb21tZXJjaWFsTGluZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFtbW9ncmFwaHlDZXJ0aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VkQ2FyZU9yZ2FuaXphdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZWRDYXJlT3JnYW5pemF0aW9uSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmlmZXN0S2V5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51YWxQcm9jZXNzaW5nQXV0aG9yaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJEZWZpbmVkUmVwYWlyUmF0ZXNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyc01hdGVyaWFsU2FmZXR5RGF0YVNoZWV0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJzUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ0RpcmVjdGl2ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ09wZXJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ09yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyaXRpbWVEZWNsYXJhdGlvbm9mSGVhbHRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJraW5nT3JMYWJlbFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQWlyV2F5YmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQmlsbE9mTGFkaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyTGFiZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckxlYXNlQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlclByb3BlcnR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlclNvbGljaXRhdGlvblByb2NlZHVyZXNUZXJtc0FuZENvbmRpdGlvbnNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ2hhbmdlTm90aWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFN0b3JhZ2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0dXJlZENlcnRpZmljYXRlT2ZEZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWF0UHJvY2Vzc2luZ0VzdGFibGlzaG1lbnRSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWlkUHJvdmlkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWlkUmVjaXBpZW50SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxBc3Npc3RhbmNlQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxSZWNvcmRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQcm92aWRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVWZXJzaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVtYmVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lbWJlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVyY2hhbmRpc2VUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVyY2hhbnRDYXRlZ29yeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VBZGRyZXNzb3JJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZUJhdGNoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlRGVzaWduR3JvdXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VTZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlclByb3ZpbmdSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyUmVhZGluZ0F0VGhlQmVnaW5uaW5nT2ZUaGVEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJSZWFkaW5nQXRUaGVFbmRPZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlclRpY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJVbml0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSUNSTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWNyb2ZpbG1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pZ3JhbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGVzdG9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlDYWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUlEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUludGVyZGVwYXJ0bWVudGFsUHVyY2hhc2VSZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeU9yZG5hbmNlU2VjdXJpdHlSaXNrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeVJhbmtPckNpdmlsaWFuUGF5R3JhZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5U3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlTdGFuZGFyZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsbGluZ2luVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsbE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUm95YWx0eVBheW9ySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmlzdGVyaWFsQ2VydGlmaWNhdGVPZkhvbW9sb2dhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlbHllYXJudW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1PUk5FVFBsdXNDYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNT1JORVRQbHVzSW5zdGl0dXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1PUk5FVFBsdXNVc2VySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlQmFja2VkU2VjdXJpdHlMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUJhY2tlZFNlY3VyaXR5UG9vbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VFbGVjdHJvbmljUmVnaXN0cmF0aW9uU3lzdGVtT3JnYW5pemF0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VlTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VJbnN1cmFuY2VDb21wYW55TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUluc3VyYW5jZUluZGljYXRvck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yQ2FycmllcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvckZ1ZWxDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JWZWhpY2xlSUROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpZmFtaWx5UHJvamVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZUJvb2tUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlTWFwWENvb3JkaW5hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2VNYXBZQ29vcmRpbmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZVN1YkFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlUE9PZkFuSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVab25lT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bmljaXBhbGl0eUFzc2lnbmVkQnVzaW5lc3NSZWdpc3RyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkFDRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkFGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lZEJhbmtzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEFlcm9uYXV0aWNzYW5kU3BhY2VBZG1pbmlzdHJhdGlvbkZBUlN1cHBsZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQXNzb2NpYXRpb25PZkJvYXJkc09mUGhhcm1hY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQXNzb2NpYXRpb25PZkluc3VyYW5jZUNvbW1pc3Npb25lcnNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEJ1c2luZXNzSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ3JpbWluYWxJbmZvcm1hdGlvbkNlbnRlck9yaWdpbmF0aW5nQWdlbmN5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRmxvb2RJbnN1cmFuY2VQcm9ncmFtQ29tbXVuaXR5TmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxGbG9vZEluc3VyYW5jZVByb2dyYW1Db21tdW5pdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRmxvb2RJbnN1cmFuY2VQcm9ncmFtQ291bnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEZsb29kSW5zdXJhbmNlUHJvZ3JhbU1hcE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxGbG9vZEluc3VyYW5jZVByb2dyYW1TdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxHb3Zlcm5tZW50QnVzaW5lc3NJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxQcm9wZXJ0eVJlZ2lzdHJ5U3lzdGVtTGV2ZWwxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFByb3BlcnR5UmVnaXN0cnlTeXN0ZW1MZXZlbDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUHJvcGVydHlSZWdpc3RyeVN5c3RlbUxldmVsMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxTdG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJhbEdhc1BvbGljeUFjdENhdGVnb3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3RHJ1Z0FwcGxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdIZWFsdGhJbnN1cmFuY2VDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3UGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFJlbnRhbEFncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFJlbnRhbEFncmVlbWVudFJlYXNvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFNoaXBtZW50SWRlbnRpZmljYXRpb25OdW1iZXJDb250aW51b3VzTW92ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTklUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb21pbmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25BbWVyaWNhbklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25Db25mb3JtYW5jZVJlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uTmVnb3RpYWJsZU1hcml0aW1lVHJhbnNwb3J0RG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbk9yaWdpbmF0aW5nVGhpcmRQYXJ0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uUGlja3VwTGltaXRlZFRhcmlmZk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uUHJvdmlzaW9uYWxQYXRlbnRBcHBsaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uU3BvdXNlVGllIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb09UNUF1dGhvcml0eVplcm9NaWxlYWdlUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhBbWVyaWNhbkRhdHVtU3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoQW1lcmljYW5GcmVlVHJhZGVBZ3JlZW1lbnRDb21wbGlhbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aEFtZXJpY2FuSGF6YXJkb3VzQ2xhc3NpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoQW1lcmljYW5IYXphcmRvdXNHb29kc0NsYXNzaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aEFtZXJpY2FuSW5kdXN0cmlhbENsYXNzaWZpY2F0aW9uU3lzdGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9USUNPTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZUZW1wb3JhcnlJbXBvcnRhdGlvbkRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1lcm9kZUNlZHVsYWRlSWRlbnRpZGFkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1lcm9kZUlkZW50aWZpY2FjaW9uVHJpYnV0YXJpYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JqZWN0SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsU2FmZXR5YW5kSGVhbHRoQWRtaW5pc3RyYXRpb25DbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbkNsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuQmlsbG9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbkNvbnRhaW5lck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5NYW5pZmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZW5kZXJUcmFja2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZW5zZVRyYWNraW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlckdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VyTGljZW5zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlU3ltYm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRNZXRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lQ2FsbEFnZW5jeVRpY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25saW5lUHJvY3VyZW1lbnRhbmRBY2NvdW50aW5nQ29udHJvbFRyYW5zYWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuYW5kUHJlcGFpZFN0YXRpb25MaXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yQXNzaWduZWRVbml0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvckxlYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25Qb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyT3JQYXJhZ3JhcGhOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyaW5nQ3VzdG9tZXJDb25zaWdubWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdDdXN0b21lcnNTZWNvbmRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5pemF0aW9uQnJlYWtkb3duU3RydWN0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbENlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEZkb1RyYW5zYWN0aW9uUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEZpbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxGaWxpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxQdXJjaGFzZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxSZXR1cm5SZXF1ZXN0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFNoaXBwZXJzQmlsbE9mTGFkaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFN1Ym1pdHRlckNoaWxkRGF0YU1haW50ZW5hbmNlUmVxdWVzdExvZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxTdWJtaXR0ZXJMb2dOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsU3VibWl0dGVyUGFyZW50RGF0YU1haW50ZW5hbmNlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsVm91Y2hlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRpbmdDYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdGluZ0NvbXBhbnlJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdGluZ0RlcG9zaXRvcnlGaW5hbmNpYWxJbnN0aXR1dGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmF0b3JzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5Ib3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luT2ZTaGlwbWVudEhhcm1vbml6ZWRCYXNlZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9UNUF1dGhvcml0eUNvbmRpdGlvbk9yUmVzdHJpY3Rpb25vbkNhckhpcmVSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclVubGlzdGVkVHlwZU9mUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRib3VuZEZyb21QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbFNoZWxmQXJlYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGVyQ29udGluZW50YWxTaGVsZkJsb2NrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlcnBhY2thZ2luZ1VuaXRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0bGV0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRvZlNlcnZpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmluZ0J1cmVhdUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrQW5kSG9sZEludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2luZ0dyb3VwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmdTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmdVbml0SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nR3JvdXBDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nTGlzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ1BsYW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJhZ3JhcGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmFncmFwaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyYW1lZGljYWxJRE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyZW50RmlsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydENhdXNpbmdSZXBhaXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRDb25zaWdubWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbFBheW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYXRpbmdBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0SW50ZXJjaGFuZ2VhYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0UmVmZXJlbmNlSW5kaWNhdG9ySW5BRHJhd2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlJbmZvcm1hdGlvbk1lc3NhZ2VSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5U2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3Nwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0ZW50Q29vcGVyYXRpb25UcmVhdHlBcHBsaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0ZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRlbnRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50QWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0cm9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZUxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlc0ZpbmFuY2lhbEluc3RpdHV0aW9uQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWVzRmluYW5jaWFsSW5zdGl0dXRpb25UcmFuc2l0Um91dGluZ05vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZXNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyQXNzaWduZWRSZXN1Ym1pc3Npb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyc0ZpbmFuY2lhbEluc3RpdHV0aW9uQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJzRmluYW5jaWFsSW5zdGl0dXRpb25UcmFuc2l0Um91dGluZ05vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheUdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50Q2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRIaXN0b3J5UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50SW5BZHZhbmNlUmVxdWVzdFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEluc3RhbG1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50UGxhblJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFZhbHVhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5b3JzQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQY3NDYXRhc3Ryb3BoZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVlclJldmlld09yZ2FuaXphdGlvbkFwcHJvdmFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5kaW5nQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuc2lvbkNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RpY2l0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxJZGVudGl0eUNhcmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbmFsSUROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVBvb2xDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaGFybWFjeVByZXNjcmlwdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhvbmVDYWxscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxJbnZlbnRvcnlSZWNvdW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXBSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY3R1cmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY3R1cmVPZkFjdHVhbFByb2R1Y3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY3R1cmVPZkFHZW5lcmljUHJvZHVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlnZ3liYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWxvdExpY2Vuc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuTmV0d29ya0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmluZ1BhY2thZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGF0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGZvcm1JZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxvdEZpbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdWdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUZvcm1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUxpbmtOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9sbHV0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sQ29udHJhY3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sU3VmZml4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3NpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RFbnRyeVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlQXdhcmRTdXJ2ZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWNpbmN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVkZWNlc3NvckFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWRldGVybWluYXRpb25vZkJlbmVmaXRzSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZENhbGxTaWduIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvbkF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZFByb3ZpZGVyT3JnYW5pemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvblNpdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5V29ya0NhbmRpZGF0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWFya2V0QXBwbGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1hcmtldE5vdGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bUF1ZGl0UHJpb3JpdHlJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtQXVkaXRQdXJwb3NlSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bUF1ZGl0VHlwZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1SYXRlVGFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmVyc1ZlcmlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGluZ0JhbmtzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzc0Zvcm1JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzc0lkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQmlsbG9mTGFkaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NhcmdvQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDbGFpbUhpc3RvcnlJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NvdXJzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDcmVkaXRPckRlYml0QWRqdXN0bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDcmVkaXRBZHZpY2VSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3VzdG9tZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRGVsaXZlcnlJbnN0cnVjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNEZWxpdmVyeVNjaGVkdWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0Rpc3RyaWJ1dG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0RyaXZlcnNMaWNlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0RydWdFbmZvcmNlbWVudEFkbWluaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0hpZ2hlc3RTY2hlZHVsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c2x5UmVwb3J0ZWRTb2NpYWxTZWN1cml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNNZW1iZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1JlbnRhbEFncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVxdWVzdEZvck1ldGVyZWRSZWFkaW5nUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1NjaGVtZU9yUGxhbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNTZXF1ZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNTaGlwbWVudElkZW50aWZpY2F0aW9uTnVtYmVyQ29udGludW91c01vdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzVGF4Q29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNUaWNrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlT3JTYWxlc0NhdGFsb2d1ZVJlc3BvbnNlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFyZWFOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlTGlzdENoYW5nZW9ySXNzdWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlTGlzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VMaXN0VmVyc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VRdW90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VWYXJpYXRpb25Gb3JtdWxhUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltZUNvbnRyYWN0b3JDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxzQmFua1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckNhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQ2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yRGF0YVVuaXZlcnNhbE51bWJlclN5c3RlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JIZWFsdGhJbmR1c3RyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JJZGVudGlmaWVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckluY29ycmVjdEJhdGNoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckluY29ycmVjdFNvY2lhbFNlY3VyaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcml0eVJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclBob25lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JQb3N0YWxaaXBDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclB1cmNoYXNlT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ycHVyY2hhc2VvcmRlcm51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JUYXhJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JUcmFkaW5nUGFydG5lcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclVuaXZlcnNhbFByb3ZpZGVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2NlZWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NIYW5kbGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NpbmdBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nUGxhbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NvcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzb3JzSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY3VyZW1lbnRCdWRnZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2N1cmVtZW50UmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY3VyaW5nQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0Q2hhbmdlQXV0aG9yaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0Q2hhbmdlSW5mb3JtYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RDaGFuZ2VOb3RpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RMaWNlbnNpbmdBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RMaW5lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0UGVyaW9kRm9yV2hpY2hMYWJvckNvc3RzQXJlRmlybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFJlc2VydmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0U291cmNpbmdBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RTcGVjaWZpY2F0aW9uRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9maWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mb3JtYUludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1JZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3Jlc3NQYXltZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFBhcmFncmFwaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFByb3BlcnR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0U3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uT3JEZWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9vZk9mRGVsaXZlcnlSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5Q29tcG9uZW50TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5Q29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlMb3NzSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Bvc2FsUGFyYWdyYXBoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NlZENvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NlZEdyb3VwV29ya0NhbmRpZGF0ZVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NlZFNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NlZFdvcmtDYW5kaWRhdGVTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdG9jb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RyYWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlckNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlckNvbW1lcmNpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJPcmRlclRpY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJQbGFuTmV0d29ya0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlclNpdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyVVBJTk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmluY2lhbENhbmFkaWFuU2FsZXNUYXhFeGVtcHRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpbmNpYWxUYXhJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxQYXRlbnRBcHBsaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljYXRpb25Jc3N1ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljRGVlZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljRmlsaW5nUmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNVdGlsaXRpZXNDb21taXNzaW9uQ2VydGlmaWNhdGVPZlB1YmxpY0NvbnZlbmllbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZURlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9wdGlvbkFncmVlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlckNoYW5nZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlckxpbmVJdGVtSWRlbnRpZmllckJ1eWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTnVtYmVySW5jbHVkZWRpbk9uT3JkZXJQb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlck51bWJlck9mT3JkZXJSZWNlaXZlZFNpbmNlTGFzdFJlcG9ydGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJOdW1iZXJPZlNoaXBtZW50UmVjZWl2ZWRTaW5jZUxhc3RSZXBvcnRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTnVtYmVyU3VmZml4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyUmVzcG9uc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJSZXZpc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VSZXF1aXNpdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2Vyc1JlcXVlc3RSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNpbmdBY3Rpdml0eUNsYXVzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGlmaWVkTWF0ZXJpYWxzTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGlmaWVkUHJvZHVjdHNMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5Q2xhdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5RGlzcG9zaXRpb25BcmVhSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUluc3BlY3Rpb25BcmVhSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eVJlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eVJldmlld01hdGVyaWFsQ3JpYklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5VmFsdWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVZhbHVhdGlvblJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJhbnRpbmVPclRyZWF0bWVudFN0YXR1c1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcnRlclF1YXJ0ZXJTZWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyUXVhcnRlclNwb3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1ZXN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90YU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGVPclNob3BwaW5nQ2FydElEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWNrVHlwZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbE9yUm9hZFJvdXRpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlscm9hZENvbW1pc3Npb25PaWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkQ29tbWlzc2lvblJlY29yZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFJvdXRpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsV2F5QmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheUNvbnNpZ25tZW50Tm90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheVdhZ29uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5nZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZUNhcmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVDb2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQ29uZmVyZW5jZUlEQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZU5vdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGluZ1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF3bWF0ZXJpYWxTdXBwbGllckR1bkFuZEJyYWRzdHJlZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVPd25lZFByb3BlcnR5SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yQ2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Ob3RMb3dlc3RDb3N0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmViYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNhbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlckFzc2lnbmVkRHJvcFpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVySURRdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyc0ZpbGVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyU3ViSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0FkdmljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nQmFua3NBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdDb21wYW55SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nRGVwb3NpdG9yeUZpbmFuY2lhbEluc3RpdHV0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdQYXJ0eXNNZW1iZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25jaWxpYXRpb25SZXBvcnRTZWN0aW9uSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZHVjZWRFYXJuaW5nV2Vla0lkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZWRCeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlZFBhdHRlcm5JZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlRHJhd2luZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlTnVtYmVyQXNzaWduZWRCeVRoaXJkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZU51bWJlck9mQVJlcXVlc3RGb3JNZXRlcmVkUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlTnVtYmVyUXVvdGVkT25TdGF0ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZU51bWJlclRvUHJldmlvdXNNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VWZXJzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyZWRQcm9kdWN0Rm9yQ2hlbWljYWxBbmFseXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyZWRQcm9kdWN0Rm9yTWVjaGFuaWNhbEFuYWx5c2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZpbmVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uYWxBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpcmlzdG9GZWRlcmFsRGVDb250cmlidXllbnRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXJpc3RvRmVkZXJhbGRlQ29udHJpYnV5ZW50ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRDYXBpdGFsUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkQ29udHJhY3RvckFjdGl2aXR5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZE1haWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uTnVtYmVyT2ZQcmV2aW91c0N1c3RvbXNEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cm9JbmZvcm1hY2lvbkZpc2NhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cm9OYWNpb25hbGRlQ29udHJpYnV5ZW50ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cm9Vbmljb2RlQ29udHJpYnV5ZW50ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdGlvblByaW1hcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRpb25TZWNvbmRhcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRvcnlHdWlkZWxpbmVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmVyc0NsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWlzc3VlQ2Vzc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZENvbnRyYWN0TGluZUl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWREb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZE5vbmNvbmZvcm1hbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkT2JqZWN0SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRUcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZFZlbmRvck9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVByaW9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlSW52b2ljZU51bWJlckZvclByaW9yQmlsbEFuZEhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0dGFuY2VBZHZpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0dGluZ0JhbmtzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdmFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWxBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWxBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRQYXlvcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJBY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckNhdGVnb3J5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJEYXRhUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyRXN0aW1hdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpck9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBlYXRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwZXRpdGl2ZUJvb2tpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGV0aXRpdmVDYXJnb1NoaXBtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBldGl0aXZlUGF0dGVybkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGV0aXRpdmVXYXliaWxsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRBc3NlbWJseU1vZGVsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudEFzc2VtYmx5U2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudENsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudEN1c3RvbWVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudERydWdFbmZvcmNlbWVudEFkbWluaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNpbmdQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsZW5pc2htZW50UHVyY2hhc2VPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGVuaXNobWVudFB1cmNoYXNlT3JkZXJSYW5nZUVuZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGVuaXNobWVudFB1cmNoYXNlT3JkZXJSYW5nZVN0YXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdGb3JtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcHJlc2VudGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByZXNlbnRhdGl2ZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByaWNlZENsYWltUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByaWNlZExpbmVJdGVtUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yQ2FuY2VsbGF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Zm9yUXVvdGF0aW9uUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yUXVvdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VydmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZlQXNzZW1ibHlMaW5lRmVlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNvdXJjZVNjcmVlbmluZ1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzb3VyY2VVdGlsaXphdGlvbkdyb3VwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZXRvYVJlcXVlc3Rmb3JRdW90YXRpb25SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRBdmFpbGFiaWxpdHlBdXRob3JpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkQXZhaWxhYmlsaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN1Ym1pc3Npb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3VibWlzc2lvblJlYXNvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3VibWl0bnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRhaWxNZXJjaGFudHNDZXJ0aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRpcmVtZW50UGxhbkFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGlyZW1lbnRQbGFuUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5hYmxlQ29udGFpbmVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5hYmxlQ29udGFpbmVyU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5lZEdvb2RzQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuR29vZHNCaWxsT2ZMYWRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybk1hdGVyaWFsQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuc05vdGljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2ZW51ZVNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aWV3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXdlckZpbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlld1BlcmlvZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aXNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJJRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkQ29uc2lnbm1lbnROb3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVPcmRlck51bWJlckRvbWVzdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZU9yZGVyTnVtYmVyRW1lcmdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZU9yZGVyTnVtYmVyRXhwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0aW5nSW5zdHJ1Y3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJVQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVsZVNlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1bk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZWtlZXBpbmdBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlFcXVpcG1lbnRDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5b2ZSYWRpb0NlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlvZlNoaXBDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNPclRlcnJpdG9yeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzQWxsb3dhbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc0RlcGFydG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzRm9yZWNhc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzT2ZmaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1BlcnNvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNQcm9ncmFtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1JlZ2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUmVwcmVzZW50YXRpdmVPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNSZXNwb25zaWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXZpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjYWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2FuTGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVtZU9yUGxhbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFsT2ZmTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFsT25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYXJjaEtleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5Q292ZXJhZ2VDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5Q292ZXJhZ2VDb21wYW55TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlDdXN0b21zUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlFbXBsb3llZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlIZWFsdGhJbnN1cmFuY2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5UG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlQcm92aWRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5U3VmZml4Q29kZUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kQmVuZWZpY2lhcnlzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNyZXRhcmlhZGVDb21lcmNpYXlGYW1lbnRhSW5kdXN0cmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjcmV0YXJ5b2ZTdGF0ZUFzc2lnbmVkSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb25PZlRoZU5hdGlvbmFsSG91c2luZ0FjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5SW5zdHJ1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdHlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmSW5zdXJhbmNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGZJbnN1cmVyQXV0aG9yaXphdGlvblR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmSW5zdXJlck9yZ2FuaXphdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlckxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNDYXRhbG9ndWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNDcmVkaXRNZW1vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzRGViaXRNZW1vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc1NhbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxpbmdBcnJhbmdlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGVyRGVmaW5lZENsYXVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGVyc0NsYXVzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGVyc0ZpbGVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRlcnNSZWZlcmVuY2VUb1RoZU9yaWdpbmFsTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGluZ0JhbmtSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRpbmdDb21wYW55QXVkaXROdW1iZXJBdXRvbWF0ZWRDbGVhcmluZ2hvdXNlVHJhbnNmZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUJ1bGxldGluTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQnVyZWF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ2hhbmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ2hhcmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VFc3RpbWF0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUdyb3VwSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VJbnRlcnJ1cHRUcmFja2luZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUGVyZm9ybWVkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VSZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlckxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWxmTGlmZUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGVzdGluYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudE9yaWdpbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwTm90aWNlT3JNYW5pZmVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG93bmVyc0F1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJDYXJPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlcnNCb25kTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyc0hhemFyZG91c051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlcnNPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdMYWJlbFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdOb3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ1VuaXRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9ydFRlcm1EaXNhYmlsaXR5UG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG93SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYWxDb2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVUcmFuc2FjdGlvblNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSVJFTk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lSRVROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpdGVTcGVjaWZpY1Byb2NlZHVyZXNUZXJtc0FuZENvbmRpdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpdHVhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xhdWdodGVyUGxhbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbEluc3VyYW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsU2VjdXJpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lldHlvZlByb3BlcnR5SW5mb3JtYXRpb25Db21waWxlcnNhbmRBbmFseXN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29mdHdhcmVBcHBsaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29saWNpdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3J0QW5kU2VncmVnYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VEb2N1bWVudEludGVybmFsUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGFjaW5nVW5pdE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQXBwcm92YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxCdWRnZXRBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ2hhcmdlT3JBbGxvd2FuY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ2xhdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsR292ZXJubWVudEFjY291bnRpbmdDbGFzc2lmaWNhdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEluc3RydWN0aW9uc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbE1vdmVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQYWNrYWdpbmdJbnN0cnVjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFBheW1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQcm9jZXNzaW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFF1b3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsdHlMaWNlbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpY2F0aW9uQ2xhc3NOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmljYXRpb25SZXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2ltZW5JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdEJvb2tpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0UHJlbWl1bUF1ZGl0Q2hhbmdlSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXRTaGlwbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvbnNvcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3VzZVRpZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhY2tUcmFpbklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRDYXJyaWVyQWxwaGFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZENsYXVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRJbmR1c3RyeUNsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmROdW1iZXJPZkluc3BlY3Rpb25Eb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRQb2ludExvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRzQ29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZHNWZXJzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFRyYW5zcG9ydGF0aW9uQ29tbW9kaXR5Q29kZUJyaWRnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRUcmFuc3BvcnRhdGlvbkNvbW1vZGl0eUNvZGVSZXBsYWNlbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0aW5nUGFja2FnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVBc3NlbWJseURpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUNoYXJ0ZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQ29udHJvbGxlZFN1YnN0YW5jZUxpY2Vuc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQ3JpbWluYWxIaXN0b3J5UmVwb3NpdG9yeUluZGl2aWR1YWxJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVEZXBhcnRtZW50STIwRm9ybU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVEZXBhcnRtZW50SUFQNjZGb3JtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUhhemFyZG91c1dhc3RlRW50aXR5SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVJbmR1c3RyaWFsQWNjaWRlbnRQcm92aWRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVMZWdpc2xhdGl2ZURpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUxpY2Vuc2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVMaWNlbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlbWVudE9mV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVOb25SZXNpZGVudFZpb2xhdG9yQ29tcGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVvclByb3ZpbmNlQXNzaWduZWRCdXNpbmVzc1JlZ2lzdHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZU9yUHJvdmluY2VBc3NpZ25lZEVudGl0eUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVNhbGVzVGF4SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlU2VuYXRlRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlU3R1ZGVudElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVRheElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZXdpZGVDb3Vyc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja0NlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja0V4Y2hhbmdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tFeGNoYW5nZUNvbXBhbnlJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja0tlZXBpbmdVbml0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcFNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlSW5mb3JtYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmFzc2VtYmx5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdExpbmVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvckRhdGFSZXF1aXJlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmRheU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViZGl2aXNpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJleGhpYml0TGluZUl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YkZpbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmhvdXNlQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0UHJvcGVydHlOb25TYWxlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0UHJvcGVydHlSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RQcm9wZXJ0eVZlcmlmaWNhdGlvblNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibGluZW9mSW5zdXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXNzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXR0ZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2NyaWJlckF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNjcmliZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNlcnZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJTZXJ2aWNlckxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpc3RlbmNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0YW50aXZlbHlDb25zb2xpZGF0ZWRDYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRlQWlyV2F5YmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZU1hbnVmYWN0dXJlcnNQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRlTmF0aW9uYWxTdG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZVBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YlN1YmhvdXNlQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWNjZXNzb3JBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWZmaXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVyaW50ZW5kZW5jaWFkZUludmVyc2lvbmVzRXh0cmFuamVyYXNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3J5QXBwcmFpc2VyQ2VydGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFsQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFsQWdyZWVtZW50QXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YWxDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyUmVwbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyRG9jdW1lbnRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzQ3JlZGl0Q2xhaW1SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBvcnRpbmdEb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZXR5Qm9uZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VzcGVuc2lvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3YXBPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXSUZUTVQxMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXSUZUTVQyMDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXSUZUQ29uZmlybWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW1ib2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bWJvbE51bWJlckZvck1pbGVzdG9uZU9yTE9CUmVwb3J0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtYXRpemVkTm9tZW5jbGF0dXJlb2ZIdW1hbmFuZFZldGVyaW5hcnlNZWRpY2luZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtZUluZm9ybWF0aXF1ZVBvdXJMZVJlcGVydG9pcmVEZXNFbnRyZXByaXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtZUluZm9ybWF0aXF1ZVBvdXJMZVJlcGVydG9pcmVEZXNFdGFibGlzc2VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmUGFnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmUnVsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmU2VjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmU3VmZml4TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZTdXBwbGVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXNrT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEFnZW5jeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RXhjaGFuZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhFeGVtcHRpb25MaWNlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhFeGVtcHROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEZpbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Rm9ybUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheGluZ0F1dGhvcml0eUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhMaWNlbnNlRXhlbXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhMaWVuSnVyaXNkaWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFNjaGVkdWxlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4U2hlbHRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4V29ya3NoZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQ04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlYW1Bc3NpZ25tZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxEb2N1bWVudGF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbEluZm9ybWF0aW9uUGFja2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbFBoYXNlUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxSZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlY29tbXVuaWNhdGlvbkNpcmN1aXRTdXBwbGVtZW50YWxJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXhNZXNzYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wbGF0ZVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbE9wZXJhdG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbFJlbGVhc2VPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYXRpb25GaWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0UmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0U3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGV4dEVsZW1lbnRJZGVudGlmaWVyRGVsZXRpb25SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZWF0ZXJTY3JlZW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkQmFua3NSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkQmFua3NSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlBZG1pbmlzdHJhdG9yQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlOb3RlSG9sZGVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlPcmdhbml6YXRpb25BdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5T3JpZ2luYXRvck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVB1cmNoYXNlT3JkZXJJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UHVyY2hhc2VPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVB1cmNoYXNlT3JkZXJSZWxlYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJvdWdoQmlsbE9mTGFkaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaWNrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVGYWlsdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXJDYXJuZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJUk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVDb21wYW55Q29kZUJvb2tSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlRG9jdW1lbnRTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZVhJWElkZW50aWZpZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRva3lvU2hva29SZXNlYXJjaEJ1c2luZXNzSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9sbEJpbGxpbmdUZWxlcGhvbmVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ3ljbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT3JkZXJDeWNsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG93bnNoaXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRveGljb2xvZ3lJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2VyQWN0aW9uUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2tpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZXJBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkaW5nUGFydG5lcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyVHlwZVF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlclVzZUFncmVlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluaW5nRmxpZ2h0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2FjdGlvbkNhdGVnb3J5T3JUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRHdWFyYW50ZWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9uZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkFjY291bnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25FeHBvcnRhdGlvbk5vRm9ySW5Cb25kTW92ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uUHJpb3JpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENvbnRyYWN0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb3N0c1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFJldHVyblJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3RyaXBwaW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN0dWZmaW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN1cnZleVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3VydmV5UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdXJ2ZXlSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydFJvdXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRTZWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmF2ZWxNYW5pZmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXR5SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlhbExvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpcGxlYmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tlcnNCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRTUkJ1c2luZXNzSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQ29tbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mRXNjcm93TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZIb3VzZWhvbGRHb29kc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkxhd1N1aXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZk91dHN0YW5kaW5nSnVkZ21lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZlNjaWVuY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVLlMuRGVmZW5zZUZlZGVyYWxBY3F1aXNpdGlvblJlZ3VsYXRpb25TdXBwbGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVLlMuRGVwYXJ0bWVudE9mVmV0ZXJhbnNBZmZhaXJzQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVLlMuR292ZXJubWVudFRyYW5zcG9ydGF0aW9uQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ3VzdG9tZXJzT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ3VzdG9tZXJzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmFjY2VwdGFibGVTb3VyY2VEVU5TTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmFjY2VwdGFibGVTb3VyY2VQdXJjaGFzZXJJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hY2NlcHRhYmxlU291cmNlU3VwcGxpZXJJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJ3cml0ZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJ3cml0aW5nQWxlcnRSZWZlcmVuY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTkRHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmVtcGxveW1lbnRJbnN1cmFuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWZvcm1Db21tZXJjaWFsQ29kZUZpbGluZ0NvbGxhdGVyYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWZvcm1SZXNvdXJjZUxvY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlxdWVDbGFpbXNSZWZlcmVuY2VOdW1iZXJPZlRoZVNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pcXVlQ29uc2lnbm1lbnRJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlxdWVDb25zaWdubWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pcXVlQ3VycmFjUmVmZXJlbmNlTnVtYmVyT2ZUaGVTZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXF1ZU1hcmtldFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pcXVlUmVpbmFjUmVmZXJlbmNlTnVtYmVyT2ZUaGVTZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXF1ZVN1cHBsaWVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZE5hdGlvbnNIYXphcmRvdXNDbGFzc2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzR292ZXJubWVudFZpc2FOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc1N0YW5kYXJkTWV0cm9wb2xpdGFuU3RhdGlzdGljYWxBcmVhQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdExvYWREZXZpY2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFByb3BlcnR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UmVsaWVmTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UmVwb3J0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UmVwb3J0UGVyaW9kSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRUcmFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2FsUmFpbHJvYWRSZXZlbnVlV2F5YmlsbElkZW50aWZpZWROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXZlcnNhbFRyYW5zdmVyc2VNZXJjYXRvckVhc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXZlcnNhbFRyYW5zdmVyc2VNZXJjYXRvck5vcnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzYWxUcmFuc3ZlcnNlTWVyY2F0b3Jab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnBhaWRJbnN0YWxsbWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBwZXJTZXJpYWxOdW1iZXJPZlJhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcHN0cmVhbVNoaXBwZXJDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDRlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VBbnRpRHVtcGluZ0R1dHlDYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlQmluZGluZ1J1bGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZUNvbW1lcmNpYWxEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZUNvdW50ZXJ2YWlsaW5nRHV0eUNhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VFbnRyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZUVudHJ5VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VQcmVBcHByb3ZhbFJ1bGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZVByZUNsYXNzaWZpY2F0aW9uUnVsaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlU3RhdGVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0RPRUFuZE5DRVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTRE9UQm9uZFN1cmV0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZXJJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0ZDQ0ltcG9ydENvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNGZWRlcmFsQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0ZlZGVyYWxJbmZvcm1hdGlvblJlc291cmNlc01hbmFnZW1lbnRSZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0Zvb2RBbmREcnVnQWRtaW5pc3RyYXRpb25Fc3RhYmxpc2htZW50SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0dlbmVyYWxTZXJ2aWNlc0FkbWluaXN0cmF0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNHb3Zlcm5tZW50QWdlbmN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkVGF4UmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXRSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVCdXNpbmVzc1VzZVF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZUxpY2VuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVSYWRpdXNvZk9wZXJhdGlvblF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZVJlbGF0ZWRTZXJ2aWNlc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZVNpemVDbGFzc1F1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQWJicmV2aWF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQ2hhbmdlSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JDaGFuZ2VQcm9jZWR1cmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9ySUROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvck9yZGVyTnVtYmVyU3VmZml4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JQcm9kdWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JzUHJldmlvdXNKb2JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvclRlcm1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJpZmljYXRpb25Tb3VyY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJzaW9uQ29kZUxvY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJzaW9uQ29kZU5hdGlvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJ0aWNhbENvb3JkaW5hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsQWdlbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmFuc0FkbWluaXN0cmF0aW9uT3JpZ2luYXRvcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmFuc0FmZmFpcnNDYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWSU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpc2FUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZVB1cmNoYXNlQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3VjaGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3lhZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZ2VEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWl2ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZUVudHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VQaWNrVGlja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VSZWNlaXB0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VTdG9yYWdlTG9jYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnR5Q292ZXJhZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50eVJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F5YmlsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VhcG9uU3lzdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdGhkcmF3YWxBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRoZHJhd2FsUmVjb3JkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29sSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2xUYXhSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtCcmVha2Rvd25TdHJ1Y3R1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtDYW5kaWRhdGVTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0NlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya2luZ1NoaWZ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrSXRlbVF1YW50aXR5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya09yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrUGFja2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1NoaWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc2l0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1Rhc2tDaGFyZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtUZWFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZYXJkUG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpvbmUiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlB1cnBvc2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlB1cnBvc2VDb2RlZCIgdHlwZT0iUHVycG9zZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlB1cnBvc2VDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJQdXJwb3NlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlB1cnBvc2VDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cGxpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25Pbmx5Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXF1ZXN0ZWRSZXNwb25zZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVxdWVzdGVkUmVzcG9uc2VDb2RlZCIgdHlwZT0iUmVxdWVzdGVkUmVzcG9uc2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXF1ZXN0ZWRSZXNwb25zZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlJlcXVlc3RlZFJlc3BvbnNlIiB0eXBlPSJSZXF1ZXN0ZWRSZXNwb25zZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJSZXF1ZXN0ZWRSZXNwb25zZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VIb2xkU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZW1lbnRXaGVuRXJyb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlTm9EZXRhaWxPckNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VPbmx5Q2hhbmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VQcm9kdWN0UmVwbGVuaXNobWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VXaXRoRGV0YWlsQW5kQ2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZVdpdGhEZXRhaWxOb0NoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aWNlV2l0aERldGFpbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmljZVdpdGhvdXREZXRhaWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRoZW50aWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0QWR2aWNlQW5kQWNrbm93bGVkZ2VtZW50Rm9yRGlyZWN0RGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdEFkdmljZU1lc3NhZ2VBY2tub3dsZWRnZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdEFkdmljZVJlcXVlc3RlZEZvckRpcmVjdERlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdEFkdmljZUZvckVhY2hUcmFuc2FjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRBZHZpY2VNZXNzYWdlQWNrbm93bGVkZ2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdEFkdmljZU1lc3NhZ2VBY2tub3dsZWRnZW1lbnRGb3JFYWNoVHJhbnNhY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0QWR2aWNlUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlQWNrbm93bGVkZ2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0Fja25vd2xlZGdlbWVudE5lZWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2VFeHBlY3RlZCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJUeXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlclR5cGVDb2RlZCIgdHlwZT0iT3JkZXJUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJUeXBlIiB0eXBlPSJPcmRlclR5cGUiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iT3JkZXJUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlbWVudE1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlbWVudE9mT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDbGFpbUZvclBhcnRzQW5kT3JMYWJvdXJDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpY2VPZkFuQW1lbmRtZW50T2ZBRG9jdW1lbnRhcnlDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmljZU9mQ29sbGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aWNlT2ZEaXN0cmlidXRpb25PZkRvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNpbmdJdGVtc1RvQmVCb29rZWRUb0FGaW5hbmNpYWxBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JlZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmVlbWVudFRvUGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJXYXliaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBT0dDcml0aWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU9HU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25BY2tub3dsZWRnZW1lbnRBbmRFcnJvclJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25FcnJvckFuZEFja25vd2xlZGdlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25FcnJvck1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yQmFua2Vyc0RyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckJhbmtlcnNHdWFyYW50ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yRGVzaWduYXRpb25PZkJlcnRoaW5nUGxhY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckRvY3VtZW50YXJ5Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckV4Y2hhbmdlQWxsb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JHb29kc0NvbnRyb2xDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JJbnNwZWN0aW9uQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yUGh5dG9zYW5pdGFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvclNoaWZ0aW5nRnJvbVRoZURlc2lnbmF0ZWRQbGFjZUluUG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JVc2FnZU9mQmVydGhPck1vb3JpbmdGYWNpbGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvclZlc3NlbHNFbnRlcmluZ0ludG9Qb3J0QXJlYUluTmlnaHQtVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92ZWRVbnByaWNlZEJpbGxPZlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxOb3RpY2VHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb3J0bWVudEFnYWluc3RCbGFua2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdGFDYXJuZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6YXRpb25Ub1BsYW5BbmRTaGlwT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uVG9QbGFuQW5kU3VnZ2VzdE9yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXR5VG9Qcm9jZWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWlsbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFpbG1lbnRDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsYW5jZUNvbmZpcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2Vyc0RyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rZXJzR3VhcmFudGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5raW5nU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rVG9CYW5rRnVuZHNUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaWNBZ3JlZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2ljT3JkZXJpbmdBZ3JlZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZGRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxhbmRIb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZFeGNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdDb3B5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdPcmlnaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxhbmtldE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGFua2V0T3JkZXJFc3RpbWF0ZWRRdWFudGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGFua2V0UHVyY2hhc2VBZ3JlZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tpbmdDb25maXJtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tpbmdSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3JkZXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldGFyeVF1b3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXlBbWVyaWNhQ2VydGlmaWNhdGVPZkNvbXBsaWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbGluZ0ZvcndhcmROb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGxPZmZEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbE9mZk9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW1wYWlnblByaWNlU2FsZXNDYXRhbG9ndWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQWNjZXB0YW5jZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0FuYWx5c2lzVm95YWdlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0RlY2xhcmF0aW9uQXJyaXZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29EZWNsYXJhdGlvbkRlcGFydHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29NYW5pZmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29Nb3ZlbWVudEV2ZW50TG9nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb01vdmVtZW50Vm95YWdlU3VtbWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29SZWxlYXNlTm90aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb1N0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29WZXNzZWxEaXNjaGFyZ2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29WZXNzZWxMb2FkaW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnRhZ2VPcmRlckxvY2FsVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoUG9vbEZpbmFuY2lhbFN0YXRlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaW5nU2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0YWxvZ09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZkFuYWx5c2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mQ29uZm9ybWl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZk9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JDZXJ0aWZpY2F0ZU9mT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mT3JpZ2luRm9ybUdzcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZlF1YWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZlJlZ2lzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mU2VhbGluZ09mRXhwb3J0TWVhdExvY2tlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZENvc3RBbmRQcmljZURhdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZEluc3BlY3Rpb25BbmRUZXN0UmVzdWx0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlVG9Db250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlVG9QdXJjaGFzZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VUb1JlbGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZXNOb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXZpbExpYWJpbGl0eUZvck9pbENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZU91dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ1N0YXRlbWVudE9mQW5BY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2RlQ2hhbmdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tSW5zdXJhbmNlQ2VkaW5nQm9yZGVyZWF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXRlcmFsQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvbk9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uUGF5bWVudEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluZWRDZXJ0aWZpY2F0ZU9mVmFsdWVBbmRPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmVkVHJhbnNwb3J0QmlsbE9mTGFkaW5nTXVsdGltb2RhbEJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluZWRUcmFuc3BvcnREb2N1bWVudEdlbmVyaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxBY2NvdW50U3VtbWFyeVJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsRGlzcHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxJbnZvaWNlV2hpY2hJbmNsdWRlc0FQYWNraW5nTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWlzc2lvbk5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBvc2l0ZURhdGFFbGVtZW50Q2hhbmdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9zaXRlRGF0YUVsZW1lbnRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25tZW50SW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnRTdGF0dXNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25tZW50VW5wYWNrUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRDcmVkaXROb3RlR29vZHNBbmRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsYXJJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJEaXNjaGFyZ2VMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJNYW5pZmVzdFVuaXRQYWNraW5nTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyT2ZmSGlyZU5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU3RyaXBwaW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclN0dWZmaW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEF3YXJkTm90aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEJpbGxPZlF1YW50aXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RnVuZHNTdGF0dXNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0U2VjdXJpdHlDbGFzc2lmaWNhdGlvblNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xEb2N1bWVudFQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXlhbmNlRGVjbGFyYXRpb25BcnJpdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXlhbmNlRGVjbGFyYXRpb25Db21iaW5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmV5YW5jZURlY2xhcmF0aW9uRGVwYXJ0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVTdXBlcmFubnVhdGlvbkNvbnRyaWJ1dGlvbnNBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZVN1cGVyYW5udWF0aW9uTWVtYmVyTWFpbnRlbmFuY2VNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0RGF0YVN1bW1hcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQZXJmb3JtYW5jZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBlcmZvcm1hbmNlUmVwb3J0Rm9ybWF0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBlcmZvcm1hbmNlUmVwb3J0Rm9ybWF0MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBlcmZvcm1hbmNlUmVwb3J0Rm9ybWF0MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBlcmZvcm1hbmNlUmVwb3J0Rm9ybWF0NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBlcmZvcm1hbmNlUmVwb3J0Rm9ybWF0NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFNjaGVkdWxlU3RhdHVzUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Zlck5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Q292ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdE5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdE5vdGVGb3JQcmljZVZhcmlhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Tm90ZVJlbGF0ZWRUb0ZpbmFuY2lhbEFkanVzdG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXROb3RlUmVsYXRlZFRvR29vZHNPclNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmV3TGlzdERlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmV3c0VmZmVjdHNEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3NEb2NraW5nRGVzcGF0Y2hBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzRG9ja2luZ09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc0RvY2tpbmdTZXJ2aWNlc09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50QWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJQYXltZW50T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNDbGVhcmFuY2VOb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNDcmV3QW5kQ29udmV5YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uUG9zdFBhcmNlbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvbkZvckNhcmdvRXhhbWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvbkZvckNhcmdvRXhhbWluYXRpb25BbHRlcm5hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvbldpdGhDb21tZXJjaWFsQW5kSXRlbURldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uV2l0aG91dENvbW1lcmNpYWxEZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvbldpdGhvdXRJdGVtRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVsaXZlcnlOb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRG9jdW1lbnRzRXhwaXJhdGlvbk5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ltbWVkaWF0ZVJlbGVhc2VEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNNYW5pZmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1N1bW1hcnlEZWNsYXJhdGlvbldpdGhDb21tZXJjaWFsRGV0YWlsQWx0ZXJuYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zU3VtbWFyeURlY2xhcmF0aW9uV2l0aG91dENvbW1lcmNpYWxEZXRhaWxBbHRlcm5hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZUNlcnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c0dvb2RzRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c0dvb2RzTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXROb3RlUmVsYXRlZFRvRmluYW5jaWFsQWRqdXN0bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0Tm90ZVJlbGF0ZWRUb0dvb2RzT3JTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYXRpb25PZk9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYXRpb25SZWdhcmRpbmdUaGVJbndhcmRBbmRPdXR3YXJkTW92ZW1lbnRPZlZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsY3JlZGVyZUNyZWRpdE5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGNyZWRlcmVJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUZvcmVjYXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUluc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlKdXN0SW5UaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Tm90aWNlR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Tm90aWNlUmFpbFRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlSZWxlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNjaGVkdWxlUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5VmVyaWZpY2F0aW9uQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcmF0RG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVQb3N0UGFyY2VscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlTW9kZWxUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVNb2RlbFQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVNb2RlbFQyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVNb2RlbFQyTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5bWVudFZhbHVhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5bWVudFZhbHVhdGlvblJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFjY2VwdGFuY2VBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QW1lbmRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFtZW5kbWVudEluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFtZW5kbWVudE5vdGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRDb2xsZWN0aW9uSW5zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0SXNzdWFuY2VJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRMZXR0ZXJPZkluZGVtbml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXROZWdvdGlhdGlvbkFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXROb3RpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0UGF5bWVudEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRUcmFuc2ZlckFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRSZXNwb25zZUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50c1ByZXNlbnRhdGlvbkZvcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWZ0QmlsbE9mUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZpbmdMaWNlbmNlSW50ZXJuYXRpb25hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmluZ0xpY2VuY2VOYXRpb25hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcHNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVjQ2FybmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGlBc3NvY2lhdGVkT2JqZWN0QWRtaW5pc3RyYXRpb25NZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWJhcmdvUGVybWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlDb250YWluZXJCaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUNvbnRhaW5lckRpc3Bvc2l0aW9uT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFVzZUF1dGhvcml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVucXVpcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVycm9yUmVzcG9uc2VDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2NvcnRPZmZpY2lhbFJlY29nbml0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRQcmljZWRCaWxsT2ZRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyMUNlcnRpZmljYXRlT2ZPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2VwdGlvbmFsT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2hhbmdlQ29udHJvbERlY2xhcmF0aW9uSW1wb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNoYW5nZUNvbnRyb2xEZWNsYXJhdGlvbkV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaXNlQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydExpY2VuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yRXhwb3J0TGljZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5kZWRDcmVkaXRBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkUGF5bWVudE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYS1Db21tdW5pdHlUcmFkZVN0YXRpc3RpY2FsRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhYnJpY2F0ZUFuZEhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3RvcmVkQ3JlZGl0Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjdG9yZWRJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTGFiZWxBcHByb3ZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxQYXltZW50UmVxdWVzdEJhc2VkT25Db21wbGV0aW9uT2ZXb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxTdGF0ZW1lbnRPZkFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0U2FtcGxlVGVzdFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkV4Y2hhbmdlUGVybWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtdWxhRnVuZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNBZHZpY2VUb0V4cG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzQWR2aWNlVG9JbXBvcnRBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc0JpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc0NlcnRpZmljYXRlT2ZSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzQ2VydGlmaWNhdGVPZlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc0ludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNXYXJlaG91c2VSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkaW5nSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlUGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRNYW5pZmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVtaWdhdGlvbkNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXRlUGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbENhcmdvU3VtbWFyeU1hbmlmZXN0UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsUmVzcG9uc2VDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0NvbnRyb2xDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNEZWNsYXJhdGlvbkZvckN1c3RvbXNUcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0RlY2xhcmF0aW9uRm9yRXhwb3J0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzRGVjbGFyYXRpb25Gb3JIb21lVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0RlY2xhcmF0aW9uRm9ySW1wb3J0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUmVjZWlwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNSZWNlaXB0Q2FycmlhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRsaW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpcmVJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaXJlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcnNlbWVhdFNhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXNlQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZVdheWJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aXR5Q2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wZW5kaW5nQXJyaXZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wbGVtZW50YXRpb25HdWlkZWxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydExpY2VuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9ySW1wb3J0TGljZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kZWZpbml0ZURlbGl2ZXJ5RGVmaW5pdGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kZWZpbml0ZURlbGl2ZXJ5RGVmaW5pdGVRdWFudGl0eUNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRlZmluaXRlRGVsaXZlcnlJbmRlZmluaXRlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGVmaW5pdGVEZWxpdmVyeUluZGVmaW5pdGVRdWFudGl0eUNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeVN1cGVyYW5udWF0aW9uQ29udHJpYnV0aW9uc0FkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlTdXBlcmFubnVhdGlvbk1lbWJlck1haW50ZW5hbmNlTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5lZGlibGVTYW5pdGFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbkNvcHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFdhdGVyd2F5QmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25SZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25SZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0cnVjdGlvbnNGb3JCYW5rVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RydWN0aW9uVG9Db2xsZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlRGVjbGFyYXRpb25TaGVldEJvcmRlcmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUG9saWN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVyc0ludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW1BcHBsaWNhdGlvbkZvclBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsVHJhbnNwb3J0T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludHJhc3RhdERlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlBZGp1c3RtZW50U3RhdHVzUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlNb3ZlbWVudEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlTdGF0dXNBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2luZ0RhdGFTaGVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbXNCb29rZWRUb0FGaW5hbmNpYWxBY2NvdW50UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2JMb3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkthbmJhblNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VCbGFua2V0QWdyZWVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZUludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsU3RhdGVtZW50T2ZBbkFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlckNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkluZGVtbml0eUZvck5vbi1TdXJyZW5kZXJPZkJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZJbnRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVJbnN1cmFuY2VQYXlyb2xsRGVkdWN0aW9uc0FkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdGluZ1N0YXRlbWVudE9mQW5BY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkbGluZURvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dWYWx1ZVBheW1lbnRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFrZU9yQnV5UGxhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ1NwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcml0aW1lRGVjbGFyYXRpb25PZkhlYWx0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQWlyV2F5YmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbEluc3BlY3Rpb25BbmRSZWNlaXZpbmdSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVTUmVjZWlwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhbnNPZlRyYW5zcG9ydEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhbnNPZlRyYW5zcG9ydGF0aW9uQXZhaWxhYmlsaXR5SW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYW5zT2ZUcmFuc3BvcnRhdGlvblNjaGVkdWxlSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXRBbmRNZWF0QnktUHJvZHVjdHNTYW5pdGFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWF0Rm9vZFByb2R1Y3RzU2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZUluRGV2ZWxvcG1lbnRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlcmVkU2VydmljZXNJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxsQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGlmaWNhdGlvbk9mRXhpc3RpbmdNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZlbWVudENlcnRpZmljYXRlQVRyMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlkcm9wT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpbW9kYWxDb21iaW5lZFRyYW5zcG9ydERvY3VtZW50R2VuZXJpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGltb2RhbFRyYW5zcG9ydERvY3VtZW50R2VuZXJpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVQYXltZW50T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVQcm9kdWN0UGxhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0NvZGVSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdNZXNzYWdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1Byb2R1Y3RJbnRyb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1N0b3JlT3BlbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLU5lZ290aWFibGVNYXJpdGltZVRyYW5zcG9ydERvY3VtZW50R2VuZXJpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVByZS1BdXRob3Jpc2VkRGlyZWN0RGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1QcmUtQXV0aG9yaXNlZERpcmVjdERlYml0UmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90Rm9yU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWNlT2ZDaXJjdW1zdGFuY2VzUHJldmVudGluZ0RlbGl2ZXJ5R29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGljZU9mQ2lyY3Vtc3RhbmNlc1ByZXZlbnRpbmdUcmFuc3BvcnRHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpY2F0aW9uT2ZFbWVyZ2VuY3lTaGlmdGluZ0Zyb21UaGVEZXNpZ25hdGVkUGxhY2VJblBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWNhdGlvbk9mVXNhZ2VPZkJlcnRoT3JNb29yaW5nRmFjaWxpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZXJRdW90YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aWNhbENoYXJhY3RlclJlYWRpbmdQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJTdGF0dXNFbnF1aXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlclN0YXR1c1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZVJlc3BvbnNlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzZW5nZXJMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEJvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudE9yUGVyZm9ybWFuY2VCb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50UmVxdWVzdEZvckNvbXBsZXRlZFVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50VmFsdWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50VmFsdWF0aW9uRm9yVW5zY2hlZHVsZWRJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9ybWFuY2VCb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaGFybWFjZXV0aWNhbFNhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXRvc2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja1VwTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0Q2hhcmdlc0RvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdFJlY2VpcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvdWx0cnlTYW5pdGFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVhZHZpY2VPZkFDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZUF1dGhvcml6ZWREaXJlY3REZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlQXV0aG9yaXplZERpcmVjdERlYml0UmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVyZW5jZUNlcnRpZmljYXRlT2ZPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5Q3JlZGl0QXNzZXNzbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlTYWxlc1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGF5bWVudEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3VzdG9tc0RvY3VtZW50TWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VTYWxlc0NhdGFsb2d1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VTYWxlc0NhdGFsb2d1ZVJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZWRBbHRlcm5hdGVUZW5kZXJCaWxsT2ZRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VkVGVuZGVyQm9xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZU5lZ290aWF0aW9uUmVzdWx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZVZhcmlhdGlvbkludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NEYXRhUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0RGF0YU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RQZXJmb3JtYW5jZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFNwZWNpZmljYXRpb25SZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zvcm1hSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3Jlc3NpdmVEaXNjaGFyZ2VSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RNYXN0ZXJQbGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TWFzdGVyU2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQbGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UGxhbm5pbmdBdmFpbGFibGVSZXNvdXJjZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQbGFubmluZ0NhbGVuZGFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UHJvZHVjdGlvblBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RSZWNvdmVyeVBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzc29yeU5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxQYXltZW50VmFsdWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyQ2hhbmdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlclJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzaW5nU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eURhdGFNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVZhbHVhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlWYWx1YXRpb25SZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGFQcmlvckFsbG9jYXRpb25DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbENvbnNpZ25tZW50Tm90ZUdlbmVyaWNUZXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFkeUZvckRlc3BhdGNoQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzc2lnbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHRDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNoYXJnaW5nRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZFVwZGF0ZVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbmFsQXBwZWxsYXRpb25DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uQ2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25Eb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uUmVuZXdhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0ZWREaXJlY3REZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZERvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlQWdhaW5zdEFzc29ydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VPckRlbGl2ZXJ5T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0dGFuY2VBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbmV3YWxPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJBbmRSZXR1cm4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpck9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRPZlRyYW5zYWN0aW9uc0ZvckluZm9ybWF0aW9uT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0T2ZUcmFuc2FjdGlvbnNXaGljaE5lZWRGdXJ0aGVySW5mb3JtYXRpb25Gcm9tVGhlUmVjZWl2ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JBbkFtZW5kbWVudE9mQURvY3VtZW50YXJ5Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yRGVsaXZlcnlJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JGaW5hbmNpYWxDYW5jZWxsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yUXVvdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JTdGF0aXN0aWNhbERhdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlbWVudHNDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmUtU2VuZGluZ0NvbnNpZ25tZW50Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2VUb0FuQW1lbmRtZW50T2ZBRG9jdW1lbnRhcnlDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNlVG9BVHJhZGVTdGF0aXN0aWNzTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2VUb1ByZXZpb3VzQmFua2luZ1N0YXR1c01lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNlVG9RdWVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2VUb1JlZ2lzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdG93Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN1bWVXb3JrT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGFpbGVyUHJlY29tbWl0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2ZXJzYWxPZkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2ZXJzYWxPZkRlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkQ29uc2lnbm1lbnROb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkTGlzdC1TbWdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdXNoT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eUFuZEhhemFyZERhdGFTaGVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5T2ZFcXVpcG1lbnRDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5T2ZSYWRpb0NlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlPZlNoaXBDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYXNvblRpY2tldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhV2F5YmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VnbWVudENoYW5nZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlZ21lbnRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmQmlsbGVkQ3JlZGl0Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZi1CaWxsZWRJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXF1ZW5jZWREZWxpdmVyeVNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRGlyZWN0b3J5RGVmaW5pdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudE9mQUxldHRlck9mQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVkT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzTGV0dGVyT2ZJbnN0cnVjdGlvbnNBaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ05vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBzU3RvcmVzRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbXBsZURhdGFFbGVtZW50Q2hhbmdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2ltcGxlRGF0YUVsZW1lbnRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVBZG1pbmlzdHJhdGl2ZURvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGFyZVBhcnRzT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZEFsb25lT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kaW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlbWVudE9mQWNjb3VudE1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsQW5kT3RoZXJBZG1pbmlzdHJhdGl2ZUludGVybmFsRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbERhdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsRGVmaW5pdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsRG9jdW1lbnRFeHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsRG9jdW1lbnRJbXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c0luZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3BXb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZXNSZXF1aXNpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvclBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVBaXJXYXliaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tYXJ5U2FsZXNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhcnlEb2N1bWVudEZvckFwcGxpY2F0aW9uRm9yQ2FyZ29PcGVyYXRpb25PZkRhbmdlcm91c0dvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YXJ5RG9jdW1lbnRGb3JBcHBsaWNhdGlvbkZvclRyYW5zcG9ydE9mRGFuZ2Vyb3VzR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBseU9yU2VydmljZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd2FwT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtlckJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFza09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhDYWxjdWxhdGlvbkNvbmZpcm1hdGlvblJlc3BvbnNlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RGVjbGFyYXRpb25HZW5lcmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhEZWNsYXJhdGlvblZhbHVlQWRkZWRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheERlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4SW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Tm90aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyb3VnaEJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlmRm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZU1hdGVyaWFscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlyQ2FybmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb2xsQ29udmVyc2lvbk9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFja2luZ051bWJlckFzc2lnbm1lbnRSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlRGF0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Q2FyZ29SZWxlYXNlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydERlcGFydHVyZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RGlzY2hhcmdlSW5zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydERpc2NoYXJnZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RW1lcmdlbmN5Q2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RW1wdHlFcXVpcG1lbnRBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudEFjY2VwdGFuY2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50RGFtYWdlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnREZWxpdmVyeU5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50RGlyZWN0SW50ZXJjaGFuZ2VSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudEVtcHR5UmVsZWFzZUluc3RydWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRJbXBlbmRpbmdBcnJpdmFsQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRNYWludGVuYW5jZUFuZFJlcGFpck5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50TWFpbnRlbmFuY2VBbmRSZXBhaXJXb3JrQXV0aG9yaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50TWFpbnRlbmFuY2VBbmRSZXBhaXJXb3JrRXN0aW1hdGVBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE1haW50ZW5hbmNlQW5kUmVwYWlyV29ya0VzdGltYXRlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE1vdmVtZW50SW5zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE1vdmVtZW50UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRPZmZIaXJlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRPZmZIaXJlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50T25IaXJlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE9uSGlyZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50T25IaXJlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50UGFja2luZ0luc3RydWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRQaWNrVXBBdmFpbGFiaWxpdHlDb25maXJtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFBpY2tVcEF2YWlsYWJpbGl0eVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFBpY2tVcFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U2hpZnRSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFNwZWNpYWxTZXJ2aWNlSW5zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN0YXR1c0NoYW5nZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3RvY2tSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN1cnZleU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdXJ2ZXlPcmRlclJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdXJ2ZXlSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFVucGFja2luZ0luc3RydWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRVbnBhY2tpbmdSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydExvYWRpbmdJbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0TG9hZGluZ1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0TW92ZW1lbnRHYXRlSW5SZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydE1vdmVtZW50R2F0ZU91dFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0U3RhdHVzUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRTdGF0dXNSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3NoaXBtZW50RGVzcGF0Y2hBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zc2hpcG1lbnRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50TmlsT3V0dHVybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50UGVyc29uYWxFZmZlY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudFRpbWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50VGltZVVwVW5kZXJib25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnRVbmRlcmJvbmRCeVNlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJib25kQXBwcm92YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyYm9uZFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXREb3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWROYXRpb25zU3RhbmRhcmRNZXNzYWdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdEV4Y2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzYWxNdWx0aXB1cnBvc2VUcmFuc3BvcnREb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5wcmljZWRCaWxsT2ZRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zaGlwUGVybWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcmdlbnRTZXJ2aWNlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlckRpcmVjdG9yeURlZmluaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY2NpbmF0aW9uQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbGlkYXRlZFByaWNlZFRlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsVW5wYWNrUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmluYXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZ2VEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VXYXJyYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50eU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXliaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0TGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2luZUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29sSGVhbHRoQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldyaXR0ZW5JbnN0cnVjdGlvbnNJbkNvbmZvcm1hbmNlV2l0aEFkckFydGljbGVOdW1iZXIxMDM4NSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ3VycmVuY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkN1cnJlbmN5Q29kZWQiIHR5cGU9IkN1cnJlbmN5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ3VycmVuY3lDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDdXJyZW5jeSIgdHlwZT0iQ3VycmVuY3kiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ3VycmVuY3lDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEWkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFERiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQURQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFSUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFXRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFaTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlNEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJEVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkJEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCWUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJFRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlpEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJUTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQk9CIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCQUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJXUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJHTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQklGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLSFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1ZFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLWUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhPRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWEFGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYUEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNMUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0xGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTlkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS01GIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhSSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1VQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNaSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREtLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJBRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREpGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJET1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhDRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUNTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFR1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNWQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVJOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVUQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYRVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZLUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkpEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaQUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlJGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdFTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0hDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhBVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1JEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVFEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdORiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1dQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHWUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhURyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSE5MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIS0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhVRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVNLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklEUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklRRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUVQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk1EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKUFkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1pUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLRVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktXRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU9SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLR1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxBSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFZMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFNMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMUkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxZRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFRMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1PUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUtEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNR0YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1XSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVlSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1UTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1YTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTURMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1BRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVpNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCT1YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1NSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkFEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFORyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVdHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTEciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFPTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFdEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaUk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5aRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTklPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOR04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktQVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQS1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEdLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQWUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEhQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBMWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFRFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT01SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJST0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJVUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUldGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXU1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNURCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0FSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNDUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0xMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTR0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNLSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWkFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUlciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVTUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEtSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNEQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0REIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNSRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1pMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1lQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRaUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEhCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRPUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFREIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE1NIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFFRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUdYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVDViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVlVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVaUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVlVWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWRUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZORCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWUVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZVU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpNSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWldEIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMYW5ndWFnZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGFuZ3VhZ2VDb2RlZCIgdHlwZT0iTGFuZ3VhZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMYW5ndWFnZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxvY2FsZUNvZGVkIiB0eXBlPSJMb2NhbGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMb2NhbGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJMYW5ndWFnZURlcGVuZGVudCIgdHlwZT0ieGNibEJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGFuZ3VhZ2UiIHR5cGU9Ikxhbmd1YWdlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ikxhbmd1YWdlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJheiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJibiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkeiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJldSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imd1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJoYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImhpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJociIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaHUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imh5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImllIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imp3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia3UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imt5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibHYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im15Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJubyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib2MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icm4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJydSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icnciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzcSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0ZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0ayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0byIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1ayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InV6Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ2aSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IndvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ4aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ieWkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InlvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ6YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iemgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Inp1Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkxvY2FsZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImF6Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJqIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJibSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYm4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJidSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYnciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJieiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNjIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY3YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImN4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY3oiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkaiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZHoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVjIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imd0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJndSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ3ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imd5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJoayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaG4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImhyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaHUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImptIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ianAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia3ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imt5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJreiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxiIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibHYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im10Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im13Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJteCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im16Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5pIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJubCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibnUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im56Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icHIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InFhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJydyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNiIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzaiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3oiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRjIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0ZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InR2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0dyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1ZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InZhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ2YyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InZnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ2aSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idm4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InZ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3ZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InllIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ5dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ieXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InphIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ6bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ienciLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRheFJlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJUYXgiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXhUcmVhdG1lbnRDb2RlZCIgdHlwZT0iVGF4VHJlYXRtZW50Q29kZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhUcmVhdG1lbnRDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXhSZWZlcmVuY2UiIHR5cGU9IlRheFJlZmVyZW5jZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGF4TG9jYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTG9jYXRpb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRheExvY2F0aW9uIiB0eXBlPSJUYXhMb2NhdGlvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGF4Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXhGdW5jdGlvblF1YWxpZmllckNvZGVkIiB0eXBlPSJUYXhGdW5jdGlvblF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheEZ1bmN0aW9uUXVhbGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRheENhdGVnb3J5Q29kZWQiIHR5cGU9IlRheENhdGVnb3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4Q2F0ZWdvcnlDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWFzb25UYXhFeGVtcHRDb2RlZCIgdHlwZT0iUmVhc29uVGF4RXhlbXB0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVhc29uVGF4RXhlbXB0Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRheFR5cGVDb2RlZCIgdHlwZT0iVGF4VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheFR5cGVDb2RlZE90aGVyIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhQZXJjZW50IiB0eXBlPSJEZWNpbWFsMTBfNCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4UGF5bWVudE1ldGhvZENvZGVkIiB0eXBlPSJUYXhQYXltZW50TWV0aG9kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4UGF5bWVudE1ldGhvZENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheGFibGVBbW91bnQiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhhYmxlQW1vdW50SW5UYXhBY2NvdW50aW5nQ3VycmVuY3kiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGF4QW1vdW50IiB0eXBlPSJEZWNpbWFsMjFfNiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4QW1vdW50SW5UYXhBY2NvdW50aW5nQ3VycmVuY3kiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlRheExvY2F0aW9uIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXgiIHR5cGU9IlRheCIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUYXhGdW5jdGlvblF1YWxpZmllckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsRHV0eVRheE9yRmVlQ3VzdG9tc0l0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT2ZBbGxEdXRpZXNUYXhlc0FuZEZlZXNDdXN0b21zSXRlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPZkVhY2hEdXR5VGF4T3JGZWVUeXBlQ3VzdG9tc0RlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE9mQWxsRHV0aWVzVGF4ZXNBbmRGZWVUeXBlc0N1c3RvbXNEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhSZWxhdGVkSW5mb3JtYXRpb24iLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGF4Q2F0ZWdvcnlDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyaWN1bHR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFBheUlEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJsZWRWZXRlcmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXR5UGFpZEJ5U3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEZvckV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0Rm9yUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRmcm9tQ291bnR5UHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdGZyb21Mb2NhbFByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRmcm9tU2Nob29sUHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdGZyb21TdGF0ZVByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGcm9tVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRHb29kc2FuZFNlcnZpY2VzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRMZXR0ZXJPbkZpbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdExvY2FsU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0Tm90Rm9yUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtUGVyU3RhdGVMYXciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdFByb3ZpbmNpYWxTYWxlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0U2FsZVRvVVNHb3Zlcm5tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRUb2xsU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUV4cG9ydEl0ZW1UYXhOb3RDaGFyZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoZXJSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lc3RlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yVGF4YWJsZU1hdGVyaWFsRXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dlclJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsVGF4YWJsZUxhYm9yRXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXhlZFRheFJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Ib21lc3RlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vLU5vdFRheEV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90RXhlbXB0Rm9yUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RFeGVtcHROb3RGb3JSZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFRheGFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5TcGFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJQcm9wZXJ0eVRheEV4ZW1wdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcjY1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWN1cnJpbmdFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VzT3V0c2lkZVNjb3BlT2ZUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxseUV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzYWdlRXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkVGF4RHVlRnJvbUFQcmV2aW91c0ludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlQWRkZWRUYXhOb3ROb3dEdWVGb3JQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JraW5nRmFybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVzLVRheEV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWmVyb1JhdGVkR29vZHMiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUmVhc29uVGF4RXhlbXB0Q29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1Gb3JFeHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Illlcy1UYXhFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vLU5vdFRheEV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LUZvclJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90RXhlbXB0T3JGb3JSZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1Ob3RGb3JSZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEV4ZW1wdE5vdEZvclJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5SWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1TYWxlVG9VU0dvdmVybm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1QZXJTdGF0ZUxhdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JUYXhhYmxlTWF0ZXJpYWxFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsVGF4YWJsZUxhYm9yRXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RUYXhhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0VG9sbFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1Hb29kc0FuZFNlcnZpY2VzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtUHJvdmluY2lhbFNhbGVzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lc3RlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmljdWx0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JraW5nRmFybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlblNwYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRMb2NhbFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FibGVkVmV0ZXJhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUhvbWVzdGVhZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcjY1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGcm9tU2Nob29sUHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEZyb21Mb2NhbFByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWN1cnJpbmdFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEZyb21Db3VudHlQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxseUV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNhZ2VFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEZyb21TdGF0ZVByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclByb3BlcnR5VGF4RXhlbXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtTGV0dGVyT25GaWxlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRheFR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTExQ2l0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTExQ291bnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MTFFeGNpc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkxMVN0YXRlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MTFUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY29tbW9kYXRpb25zVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZFZhbG9yZW1UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmljdWx0dXJhbEV4cG9ydFJlYmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyaWN1bHR1cmFsbGV2eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbGljQmV2ZXJhZ2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xNYXJrVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxUYXhlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aS1EdW1waW5nRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXNzbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NMaWNlbnNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1ByaXZpbGVnZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5UmVudGFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5U2FsZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZmZlZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29pbk9wZXJhdGVkRGV2aWNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb2RpdHlTcGVjaWZpY1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlSW5jb21lVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudGVydmFpbGluZ0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eU9yUGFyaXNoU2FsZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eVJlbnRhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmYXVsdExhYm9yVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmVyZ3lUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuaGFuY2VkOTExU3RhdGVFeGNpc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmlyb25tZW50YWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0YXRlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNpc2VEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsRXhjaXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSW5jb21lVGF4V2l0aGhvbGRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxWYWx1ZUFkZGVkVGF4T25Hb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFZhbHVlQWRkZWRUYXhPblNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWVJbkxpZXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJQ0FNZWRpY2FyZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRklDQVNvY2lhbFNlY3VyaXR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUNBVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFuY2hpc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxMVVNUVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsU3BpbGxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxTdXBlckZ1bmRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhbWluZ1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbENvbnN0cnVjdGlvblRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2lmdFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNBbmRTZXJ2aWNlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NSZWNlaXB0c1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZGljYXBUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c1dhc3RlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdod2F5VXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbGx1bWluYW50c1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsSW5jb21lVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmhlcml0YW5jZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEZ1ZWxUYXhBZ3JlZW1lbnRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yQnlUcmFkZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVha3lVbmRlcmdyb3VuZFN0b3JhZ2VUYW5rVGF4RmVkZXJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVha3lVbmRlcmdyb3VuZFN0b3JhZ2VUYW5rVGF4U3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZ2h0RHVlc1BheWFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsQ29uc3RydWN0aW9uVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFNhbGVzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTHVzdFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldHJvcG9saXRhblRyYW5zaXRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc2NlbGxhbmVvdXNDYXNoRGVwb3NpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzY2VsbGFuZW91c1N0YXRlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb25ldGFyeUNvbXBlbnNhdG9yeUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JGdWVsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdW5pY2lwYWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25hbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJUYXhlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFwZXJDb25zb3J0aXVtVGF4LUl0YWx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25hbFByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RUaHJlc2hvbGRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcmVuY2VEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVUaHJlc2hvbGRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Zpc2lvbmFsY291bnRlcnZhaWxpbmdEdXR5Qm9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxDb3VudGVydmFpbGluZ0R1dHlDYXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aXNpb25hbER1dHlCb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aXNpb25hbER1dHlDYXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNIZWFsdGhBbmRFZHVjYXRpb25UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNBbmRVc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5UGVyY2VudGFnZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V2ZXJhbmNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlmdGVkU29jaWFsU2VjdXJpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpZnRlZFdhZ2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGlkV2FzdGVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDb25zdHJ1Y3Rpb25UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWRpdW1UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW1wRHV0eS1JbXBvc3RhZGlCb2xsbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVhbmRMb2NhbFNhbGVzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUFuZExvY2FsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUFuZFByb3ZpbmNpYWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlRXhjaXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW9yUHJvdmluY2lhbEZ1ZWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlT3JQcm92aW5jaWFsU2FsZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlb3JQcm92aW5jaWFsVGF4T25Hb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVvclByb3ZpbmNpYWxUYXhPblNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVJlbnRhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVUYXhvblNwZWNpZmljTGFib3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVyZnVuZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXNwZW5kZWREdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlY29tbXVuaWNhdGlvbnNEZXZpY2VGb3JUaGVEZWFmU2VydmljZUV4Y2lzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbW11bmljYXRpb25zVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJlc2hvbGRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvYmFjY29UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvbm5hZ2VUYXhlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdXJpc21UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1cm5PdmVyVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmVtcGxveW1lbnRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXRpbGl0eVVzZXJzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1YXRpb25EZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0aGhvbGRpbmdUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtlcnNDb21wZW5zYXRpb25UYXgiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGVjaW1hbDEwXzQiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KLSAgICAgICAgICAgIDx4c2Q6dG90YWxEaWdpdHMgdmFsdWU9IjEwIi8+Ci0gICAgICAgICAgICA8eHNkOmZyYWN0aW9uRGlnaXRzIHZhbHVlPSI0Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRheFBheW1lbnRNZXRob2RDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ybWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGZBc3Nlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheVZlbmRvciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJEZWNpbWFsMjFfNiI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgICAgICAgPHhzZDp0b3RhbERpZ2l0cyB2YWx1ZT0iMjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZnJhY3Rpb25EaWdpdHMgdmFsdWU9IjYiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkxvY2F0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxvY2F0aW9uUXVhbGlmaWVyQ29kZWQiIHR5cGU9IkxvY2F0aW9uUXVhbGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTG9jYXRpb25RdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMb2NhdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxBZGRyZXNzSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJOYW1lQWRkcmVzcyIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJHUFNDb29yaWRpbmF0ZXMiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkxvY2F0aW9uIiB0eXBlPSJMb2NhdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJMb2NhdGlvblF1YWxpZmllckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXJpc2RpY3Rpb25Ub1JlY2VpdmVDcmVkaXRGb3JVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWl0dGluZ1V0aWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzU2NoZWR1bGVEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNCbG9ja0dyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUJhc2VBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNUcmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzU2NoZWR1bGVLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxpbmdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtYW5lbnRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aHBsYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JsZHdpZGVHZW9ncmFwaGljTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWFyZXN0Q3Jvc3NTdHJlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUNyb3NzU3RyZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcnRlclNlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtlcklkZW50aWZpZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlU3ViZGl2aXNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyaWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2VyVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0aXR1ZGUtTG9uZ2l0dWRlU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXBTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JpZFNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxpcXVvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFpbmhvbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlCbG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vdGFnZUNhbGxEaXJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uRGlyZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlckNvbnRpbmVudGFsTGVhc2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXBRdWFkcmFuZ2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxNZXJpZGlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbFNoZWxmQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbFNoZWxmQmxvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljaWFsUHJvdHJhY3Rpb25EaWFncmFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyUXVhcnRlclF1YXJ0ZXJTZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyUXVhcnRlclNlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBYnN0cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWd1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2FsVHJhbnN2ZXJzZU1lcmNhdG9yUXVhZHJhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJzZURpcmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGVyc0xvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJzTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVhbFN0YXRlbWVudHNNYWlsaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eWFuZFN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxQb2ludHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFybWVkU2VydmljZXNMb2NhdGlvbkRlc2lnbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRWNvbm9taWNBcmVhUmVnaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEJpbGxvZkxhZGluZ09mZmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvcG9saXRpY2FsTmFtZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlPZk9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlybWF0aW9uTWFpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuQ3VzdG9tc09mZmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlc3BvbmRlbmNlTWFpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUmF0ZUJhc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlPclBhcmlzaEFuZFN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblRhbmtDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuU1BMQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5T3JQYXJpc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvbkNlbnRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb24tU2hpcHBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdE9mUmVzaWRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21pY2lsZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llckxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWN0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0RXF1YWxpemF0aW9uUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25GcmVpZ2h0Rm9yd2FyZGVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxJbmZvcm1hdGlvblByb2Nlc3NpbmdTdGFuZGFyZHM1NS1OYW1lZFBvcHVsYXRlZFBsYWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVS5TLkN1c3RvbXNGYWNpbGl0aWVzSW5mb3JtYXRpb25hbmRSZXNvdXJjZU1hbmFnZW1lbnRTeXN0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0U3RhdGlvbkFjY291bnRpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduVHJhZGVab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlQWxvbmdzaWRlVmVzc2VsLUZyZWVPbkJvYXJkUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRTdGF0aW9uR2VvZ3JhcGhpY0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQWlyVHJhbnNwb3J0QXNzb2NpYXRpb25Mb2NhdGlvblF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlTdGFuZGFyZE1vdmVtZW50UHJvY2VkdXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblN0b3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVGT0JQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydE9mRW1iYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRGdXJuaXNoZWRQcm9wZXJ0eUZPQlBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0cm9wb2xpdGFuU2FtcGxpbmdBcmVhUmVnaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV4aWNhblBvc3RhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlPclN0YXRlRnJvbVBvaW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luLUFmdGVyTG9hZGluZ09uRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclVubGlzdGVkRnJlZU9uQm9hcmRQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlbmFuZFByZXBheVN0YXRpb25MaXN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZEFjY2VwdGFuY2VQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luLVNoaXBwaW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uVmVzc2VsLUZyZWVPbkJvYXJkUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRvZkFycml2YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRvZkRpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5TWFpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmVudHNBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsU2VydmljaW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNEaWdpdFVTWklQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0RGlnaXRVU1pJUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNURpZ2l0VVNaSVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNEaWdpdENhbmFkaWFuUG9zdGFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNkRpZ2l0Q2FuYWRpYW5Qb3N0YWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQXJlYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluUmFpbENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uYWxFZHVjYXRpb25TZXJ2aWNlQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1cmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZENhcnJpZXJBbHBoYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlQWRtaW5pc3RyYXRpdmVNZXNzYWdlVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VidXJiYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlPclN0YXRlQW5kUG9pbnRzV2l0aGluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xDYW1wdXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1TUExDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVPclByb3ZpbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluU3RvcmFnZVRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3aXRjaGluZ0Rpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2NvbnRpbmVudGFsRnJlaWdodEJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxDYXJnb0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG93bnNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBvcmFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFRlcnJpdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4aW5nRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZE5hdGlvbnNMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVyYmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1VuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaWxsYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxTdG93YWdlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoYXJmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWm9uZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJzZWFzQW5kUG9pbnRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxQb3J0T2ZEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RDaGFyZ2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc09mZmljZU9mTWFuaWZlc3RPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNPZmZpY2VPZk1hbmlmZXN0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXR5TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpblJhaWxJbnRlcm1vZGFsVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uUmFpbEludGVybW9kYWxUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RPcHRpb25hbFBvcnRPZkRpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kT3B0aW9uYWxQb3J0T2ZEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZBY2NlcHRhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbnNvbGlkYXRpb25Qb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGUtQ29uc29saWRhdGlvblBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0T2ZEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFBheWFibGVBdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydE9mRW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRPZkV4aXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW1Qb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nUG9ydE9mTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nUG9ydE9mRGlzY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0T2ZMb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxEZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwYXRjaGluZ1Bvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ09yaWdpbk9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Qb29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3NoaXBtZW50UG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZENoYXJnZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdSZWxlYXNlT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZE9wdGlvbmFsUG9ydE9mRGlzY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxheVBvcnQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkxvY2F0aW9uSWRlbnRpZmllciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTG9jSUQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxvY2F0aW9uRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkxvY2F0aW9uSWRlbnRpZmllciIgdHlwZT0iTG9jYXRpb25JZGVudGlmaWVyIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOYW1lQWRkcmVzcyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFeHRlcm5hbEFkZHJlc3NJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5hbWUxIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOYW1lMiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTmFtZTMiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJQT0JveCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3RyZWV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIb3VzZU51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3RyZWV0U3VwcGxlbWVudDEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN0cmVldFN1cHBsZW1lbnQyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJCdWlsZGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRmxvb3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJvb21OdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkluaG91c2VNYWlsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEZXBhcnRtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQb3N0YWxDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDaXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb3VudHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUmVnaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEaXN0cmljdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDb3VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlRpbWV6b25lIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJBZGRyZXNzVHlwZUNvZGVkIiB0eXBlPSJBZGRyZXNzVHlwZUNvZGUiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9Ik5vdEFwcGxpY2FibGUiLz4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQWRkcmVzc1R5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik5hbWVBZGRyZXNzIiB0eXBlPSJOYW1lQWRkcmVzcyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUE9Cb3giPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJQT0JveFBvc3RhbENvZGUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUE9Cb3giIHR5cGU9IlBPQm94Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZWdpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJlZ2lvbkNvZGVkIiB0eXBlPSJSZWdpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWdpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZWdpb24iIHR5cGU9IlJlZ2lvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJSZWdpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVBQ1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVTlNXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVU5UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVFMRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVTQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUQVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVklDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVdBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkFDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkFMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkFNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkFQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkRGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkVTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkdPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUk1BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUk1HIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUk1TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUk1UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlBBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlBCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlBFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlBJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlBSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlJKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlJOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlJSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlJTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlNDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlNQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUlRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQUFCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQUJDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQU1CIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQU5CIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQU5GIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQU5TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQU5UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQU9OIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQVBFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQVFDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQVNLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQVlUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkFNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkFUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkJZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkNWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkRCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkRGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkRHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkRMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkROIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkRVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkRWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkRZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkVTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkZJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkZNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkdMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkdNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkdSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkdTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkdXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkdZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkhBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkhJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkhMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkhSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkhUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkhXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQklXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQktFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQktIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQkxVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk1BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk1HIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk1JIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk1LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk1PIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk1ZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5CIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5FIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5IIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5NIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk5VIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk9NIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk9SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQk9YIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlBCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlBMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlBNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlBPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlBZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlJEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlJFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlJNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlJVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlNZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlREIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlRIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlRXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQldBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQldEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQldHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQldJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQldMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQldNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQldPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQldSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQldUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQllLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQllOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQllTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQllXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEFHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEFMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEFOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEFPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEFQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEFRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEFUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEFWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEJHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEJJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEJOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEJSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEJTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEJaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVENaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEVOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEZFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEZHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEZJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEZPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEZSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEdFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEdPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEdSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVElNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVElTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEtSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVExDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVExFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVExJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVExPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVExUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVExVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE1DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE1FIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE1JIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE1OIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE1PIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE1TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE1UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE5BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE5PIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE5VIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVE9SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFBaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFJDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFJFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFJHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFJJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFJNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFJOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFJWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFNJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFNQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFNSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFNTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFNWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFRFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFROIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFRQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFRSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFRTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFRWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFVEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFZDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFZFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFZJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFZSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFZUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVFZWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0FLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0FMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0FSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0FTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0FaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0NBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0NPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0NUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0RDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0RFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0ZMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0dBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0dVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0hJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0lBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0lEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0lMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0lOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0tTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0tZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0xBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU01BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU01EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU01FIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU01JIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU01OIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU01PIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU01QIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU01TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU01UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05FIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05IIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05KIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05NIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05WIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05ZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU09IIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU09LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU09SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1BBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1BSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1JJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1NDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1NEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1ROIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1RYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1VUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1ZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1ZJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1ZUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1dBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1dJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1dWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1dZIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb3VudHJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb3VudHJ5Q29kZWQiIHR5cGU9IkNvdW50cnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb3VudHJ5Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ291bnRyeSIgdHlwZT0iQ291bnRyeSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDb3VudHJ5Q29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRksiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJITiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1HIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1PIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1VIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1YIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5GIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTloiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9NIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlREIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJURiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlROIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVlUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaVyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGltZXpvbmUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRpbWV6b25lQ29kZWQiIHR5cGU9IlRpbWV6b25lQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGltZXpvbmVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUaW1lem9uZSIgdHlwZT0iVGltZXpvbmUiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGltZXpvbmVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMi4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTEuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjExLjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMS4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTEuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEwLjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMC4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTAuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEwLjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwOS40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDkuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA5LjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwOS4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDguNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA4LjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwOC4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDguMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA3LjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNy4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDcuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA3LjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNi40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDYuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA2LjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNi4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDUuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA1LjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNS4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDUuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA0LjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNC4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDQuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA0LjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMy40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDMuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAzLjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMy4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDIuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAyLjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMi4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDIuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAxLjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMS4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDEuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAxLjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMC40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDAuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAwLjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMC4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAwLjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDAuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMC40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAxLjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDEuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMS4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAxLjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDIuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMi4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAyLjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDIuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMy4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAzLjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDMuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMy40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA0LjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDQuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNC4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA0LjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDUuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNS4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA1LjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDUuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNi4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA2LjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDYuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNi40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA3LjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDcuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNy4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA3LjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDguMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wOC4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA4LjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDguNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wOS4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA5LjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDkuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wOS40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTEwLjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMTAuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0xMC4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTEwLjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMTEuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0xMS4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTExLjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMTEuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0xMi4wMCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJBZGRyZXNzVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhbmNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUGF5YWJsZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VtZW50UmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbERlbGl2ZXJ5QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFBpY2tVcEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xCZXZlcmFnZURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0ZVJldHVybkFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0aXZlQWRkcmVzc2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpdE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFpbG1lbnRXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZE9wZW5pbmdMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbEFuZFNoaXBUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGVkRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tpbmdPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmR5QW5kQ29uZmVjdGlvbnNEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VkQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUFzc2lnbmVkV2VsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueS1Pd25lZE9pbEZpZWxkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVDb3VyaWVyVHJhbnNmZXJTdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3JDb3VyaWVyVHJhbnNmZXJTdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdWx0YW50c09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcHlNZXNzYWdlVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbk1haWxGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlmZmVyZW50UHJlbWlzZUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvblJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRPck1lc3NhZ2VJc3N1ZXJPclNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvd25zdHJlYW1NZXRlckxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wLU9mZkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RhYmxpc2hlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxpbmdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxpbmdMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsaW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbE1lc3NhZ2VSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFNjaGVkdWxlZERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9yYWxEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduRGlzY2xvc3VyZUluZm9ybWF0aW9uT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduUmVnaXN0cmF0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1lckFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVvbkJvYXJkUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb3plbkRlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhcmFnZWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzUGxhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uRW5kaW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uUG9pbnQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUcmFuc2FjdGlvblBvaW50MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVHJhbnNhY3Rpb25TdGFydGluZ1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0ZWRGcm9tTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uU3RhdGVQbGFjZU9mQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRpb25TdGF0ZVByaW5jaXBhbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5xdWlyeUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25BZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uQW5kQWNjZXB0YW5jZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxlZEF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1TdG9yZUJha2VyeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEJyZWFrVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RpbmdPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsQ2hhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZkdvb2RzRm9yQ3VzdG9tc0V4YW1pbmF0aW9uQmVmb3JlQ2xlYXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mTG9hZEV4Y2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mU3BvdEZvclN0b3JhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ1BsYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDaGFuZ2VOb3RpY2VBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbERpc3Bvc2l0aW9uQXV0aG9yaXphdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWF0RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVldGluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWlnaGJvcmhvb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1N1cHBseVNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0U2NoZWR1bGVkRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1UZW1wb3JhcnlTdG9yYWdlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEFwcGxpY2FibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yT2ZUaGVUcmFuc2ZlclBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5NYWlsRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpblN1YmxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5UZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJEZXBhcnRtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbFNoZWxmQXJlYUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXQtT2YtU3RhdGVQcmluY2lwYWxPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmluZ0ludmVudG9yeUNvbnRyb2xQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydFNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbm5lbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhhcm1hY3lEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2tVcEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZVNlZ21lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lU2VnbWVudEJvdW5kYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mQm90dGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGFsTWFpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5SW5zcGVjdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDb250cm9sUG9pbnRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjZURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RTZXJ2aWNlc0FuZFJlcGFpcnNDZW50cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RDb29yZGluYXRpb25PZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RNYW5hZ2VtZW50T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5Q29udHJvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9Db250cm9sU3RhdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlscm9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWlwdE1ldGVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHRab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZEZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyU2l0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ1BvaW50Rm9yQ3VzdG9tZXJTYW1wbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdTdWItTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhbWF0aW9uQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmQtS2VlcGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmluZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb25hbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZVRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1pdFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJpbmdPdXRsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpck9yUmVmdXJiaXNoTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlYXJjaEluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbmNlT3JEb21pY2lsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuZWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGluZ1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlc1RvQmVSZXR1cm5lZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlMb2NhdGlvbkFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZEhvbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxpbmdPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VCdXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbHRlcmVkV29ya3Nob3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQmFzZVN0YXRpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxDb250cm9sU3RhdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkVG9BbmRTaGlwVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGRUb0lmRGlmZmVyZW50RnJvbUJpbGxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VGYWNpbGl0eWF0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VGYWNpbGl0eUF0T3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdE9yQ29nbml6YW50U2VjdXJpdHlPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViLU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2lkaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2lkaWFyeURpdmlzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllck9yTWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNDb3Jwb3JhdGVPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBseVNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0Zhcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheENvbGxlY3RvcnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmdMYWJvcmF0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29sU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlclBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlclRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbk9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlUGFyZW50Q29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcHN0cmVhbU1ldGVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY2F0aW9uSG9tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaWRlb0RlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hvbGVzYWxlciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR1BTQ29vcmlkaW5hdGVzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJHUFNTeXN0ZW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMYXRpdHVkZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkxvbmdpdHVkZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iR1BTQ29vcmlkaW5hdGVzIiB0eXBlPSJHUFNDb29yaWRpbmF0ZXMiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGF4VHJlYXRtZW50Q29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vVGF4QXBwbGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0SW52b2ljZUxldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc0ludm9pY2VMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0TGluZUxldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc0xpbmVMZXZlbCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJPcmRlckludm9pY2VNZWRpdW1UeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1aXRzd2l0Y2hpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJVEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFSSU5DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWJsZUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVESVRyYW5zbWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY01haWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZVRyYW5zZmVyQWNjZXNzTWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlRmF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRUlTTWFpbGJveCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUJNSW5mb3JtYXRpb25FeGNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxNYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0Qm94Tm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tldFN3aXRjaGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWdyYXBoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxleCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZU1haWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVUZXh0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUV1giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlguNDAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RSZXF1aXJlZCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJEYXRlcyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXF1ZXN0ZWRTaGlwQnlEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlcXVlc3RlZERlbGl2ZXJCeURhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJvbWlzZURhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJWYWxpZGl0eURhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYW5jZWxCeURhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZEYXRlQ29kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyRGF0ZXMiIHR5cGU9Ik9yZGVyRGF0ZXMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkRhdGVDb2RlZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iRGF0ZUNvZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZEYXRlQ29kZWQiIHR5cGU9Ikxpc3RPZkRhdGVDb2RlZCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGF0ZUNvZGVkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkRhdGVRdWFsaWZpZXIiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkRhdGVDb2RlZCIgdHlwZT0iRGF0ZUNvZGVkIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEYXRlUXVhbGlmaWVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEYXRlUXVhbGlmaWVyQ29kZWQiIHR5cGU9IkRhdGVRdWFsaWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEYXRlUXVhbGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGF0ZVF1YWxpZmllciIgdHlwZT0iRGF0ZVF1YWxpZmllciIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJEYXRlUXVhbGlmaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM2MDMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNjUzMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzY1NjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNjAyODMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNjUyODMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNjU2MjgzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMXN0U2NoZWR1bGVEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMXN0U2NoZWR1bGVTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlbGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFuY2VEYXRlT2ZEb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YW5jZURhdGVPZkdvb2RzRGVjbGFyYXRpb25DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhbmNlRGF0ZVRpbWVPZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudEJlbmVmaXRBZ2VMaW1pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnRCZW5lZml0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudERhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50SW5zdXJhbmNlRWxpbWluYXRpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50TGlmZXRpbWVCZW5lZml0UXVhbGlmaWNhdGlvbkFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGFudHNPcGluaW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudENsb3NlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdNZXRob2RvbG9neUNoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdQZXJpb2RFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nUGVyaW9kU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nVHJhbnNhY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nVmFsdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE9wZW5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNSZWNlaXZhYmxlLVN0YXRlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3F1aXNpdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGlvbkVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXR5UmVwb3J0aW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZpdHlQZXJpb2REYXRlUmFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsQXJjaGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbERhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NoYXJnZURhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxQb3J0T2ZFbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsUmVsZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsUmV0dXJuVG9Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdXRlTWFuaWZlc3RhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdXRlTWFuaWZlc3RhdGlvbk9mQUNocm9uaWNDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRyZXNzUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGpvdXJubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkQ29udGVzdGFiaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkRGVhdGhCZW5lZml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRIaXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50RWZmZWN0aXZlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50UHJvY2Vzc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50UHJvbWlzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRUb0JpbGxEYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRvck9yZGVyZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pc3Npb25EYXRlQW5kT3JUaW1lRXhwZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkb3B0aW9uRGF0ZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNlQWZ0ZXJEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNlQmVmb3JlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzZUNvbXBsZXRlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2VPbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2luZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyZWVtZW50VG9QYXlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG90bWVudFBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FibGVFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93ZWRSZW5ld2FsRHVyYXRpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0ZUJhc2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0ZVByb2JsZW1SZXNvbHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGl2ZUR1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuYWx5c2lzTW9udGhFbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuZXN0aGVzaWFBZG1pbmlzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5uaXZlcnNhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVhbFJlcG9ydERlbGlucXVlbnRPbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVhbFJlcG9ydER1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVhbFJlcG9ydEZpbGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVhbFJlcG9ydE1haWxpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51aXRpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51aXR5Q29tbWVuY2VtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aWNpcGF0ZWRDbG9zaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWFuY2VQbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudFNpZ25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uTG9nZ2VkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25TdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcG9pbnRtZW50RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBvaW50bWVudEV4cGlyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJhaXNhbE9yZGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmFsT2ZmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmFsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxEYXRlVGltZUF0SW5pdGlhbFBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxEYXRlVGltZUVhcmxpZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVPZlRyYW5zcG9ydExlYWRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxEYXRlVGltZVVsdGltYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsSW5Db3VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnRlcmlhbEJsb29kR2FzVGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZW1ibHlTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0QW5kTGlhYmlsaXR5U2NoZWR1bGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldERvY3VtZW50YXRpb25FeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbm1lbnRSZWNvcmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0ZW5kYW5jZURhdGVBbmRPclRpbWVBbmRPclBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaWVuY2VEZWZpY2llbmN5UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpdFBlcmlvZEFmdGVyU3BsaXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpdFBlcmlvZFByaW9yVG9TcGxpdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhlbnRpY2F0aW9uRGF0ZVRpbWVPZkRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRoZW50aWNhdGlvblZhbGlkYXRpb25EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXphdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRpY1ByZW1pdW1Mb2FuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFiaWxpdHlEdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFiaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VEZWxpdmVyeURlbGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlUGF5bWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXdhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPbk1hcmtldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja09yZGVyRGVsaXZlcnlEYXRlVGltZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsYW5jZURhdGVUaW1lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxhbmNlU2hlZXREYXRlTGF0ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZWxpbmVDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZWxpbmVTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVmb3JlSW52ZW50b3J5SXNSZXBsZW5pc2hlZEJhc2VkT25TdG9ja0NoZWNrTGVhZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2lubmluZ0xheURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2luVGhlcmFweSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhcnlzQmFua3NEdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0QWRqdXN0bWVudEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdEFkanVzdG1lbnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRBZGp1c3RtZW50U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRBcHBsaWNhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdENoYW5nZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0Q3JlZGl0RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0Q3JlZGl0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0Q3JlZGl0U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXREZWJpdEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdERlYml0U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRQYXltZW50c1Rlcm1pbmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFJlbGVhc2VBdXRob3JpemF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdHNQYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0VHJhbnNmZXJFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRUcmFuc2ZlclBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFRyYW5zZmVyU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRUeXBlR3Jvc3NXZWVrbHlBbW91bnRFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRUeXBlTmV0V2Vla2x5QW1vdW50RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0UGVyaW9kRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFBlcmlvZFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVzdEJlZm9yZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlc3RUaW1lVG9DYWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWFubnVhbFRlcm1pbmFsSW5zcGVjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkT3BlbkRhdGVCaWRzV2lsbEJlT3BlbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRQcmljZUV4Y2VwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGVkVGhyb3VnaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlydGhDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlydGhEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxhbmtzVmFsdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbHVlcHJpbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZEaXJlY3RvcnNJbmNvbXBsZXRlQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZkRpcmVjdG9yc05vdEF1dGhvcml6ZWRBc09mR2l2ZW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mRGlyZWN0b3JzTm90Q29tcGxldGVBc09mR2l2ZW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mRGlyZWN0b3JzUmVnaXN0cmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va0VudHJ5RGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tpbmdEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJpdGlzaFRoZXJtYWxVbml0VGVzdFBlcmZvcm1lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0TGluZUFwcGxpY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NDb250cm9sQ2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NPcGVuZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1Rlcm1pbmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzRG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzTG9jYWxUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGVuZGFyQW5uaXZlcnNhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGVuZGFyWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsQWZ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbEFmdGVyRXhDb3VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxBZnRlckV4RmFjdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsSWZOb3REZWxpdmVyZWRCeVRoaXNEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxJZk5vdFB1Ymxpc2hlZEJ5VGhpc0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbElmTm90U2hpcHBlZEJ5VGhpc0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxhdGlvbkRhdGVUaW1lTGF0ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXBpdGFsaXphdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcGl0YXRpb25QZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcGl0YXRpb25QZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29Cb29raW5nQ29uZmlybWVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvUmVsZWFzZURhdGVUaW1lVWx0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VDb252ZXJ0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VSZW9wZW5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaENhbGxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRlZ29yeUNoYW5nZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZWFzZWRPcGVyYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvbk9mV2VpZ2h0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb25QZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvblJldmlzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VkQWNjb3VudGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VCYWNrRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlUGVyaW9kRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlUGVyaW9kU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFydE9mQWNjb3VudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZWNrZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZGJpcnRoRGF0ZUFuZE9yVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRiaXJ0aERhdGVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNocmlzdGVuaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0aXplbnNoaXBDaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbUFkbWluaXN0cmF0b3JLbm93bGVkZ2VPZlRoZUluanVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1BZG1pbmlzdHJhdG9yTm90aWZpZWRPZkVtcGxveWVlTGVnYWxSZXByZXNlbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1JbmN1cnJlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltTWFkZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltTm90aWZpY2F0aW9uUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltc01hZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltU3RhdGVtZW50UGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbVN0YXRlbWVudFBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGF1c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyYW5jZURhdGVDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGluaWNhbEV4YW1pbmF0aW9uRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRVbnRpbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NpbmdEYXRlT2ZGaXJzdEJhbGFuY2VTaGVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zdXJlRGF0ZVRpbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxhdGVyYWxEZXBlbmRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxhdGVyYWxEZXBlbmRlbnRCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGF0ZXJhbERlcGVuZGVudEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvbkRhdGVUaW1lRWFybGllc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3Rpb25EYXRlVGltZUxhdGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVuY2VkUHVtcGluZ0JhbGxhc3REYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVuY2VkVGFua0NsZWFuaW5nRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxSYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlUZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyaXNvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGlsYXRpb25EYXRlQW5kVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxhaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWRQdW1waW5nQmFsbGFzdERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWRUYW5rQ2xlYW5pbmdEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpb25EYXRlT3JUaW1lTm90QWZ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpb25EYXRlT3JUaW1lTm90QmVmb3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0aW9uRGF0ZU9yVGltZVNjaGVkdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZGl0aW9uSW5pdGlhbFRyZWF0bWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpbmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maW5lbWVudEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmluZW1lbnRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlybWF0aW9uRGF0ZUxlYWRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRPbW5pYnVzQnVkZ2V0UmVjb25jaWxpYXRpb25BY3RDT0JSQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkT21uaWJ1c0J1ZGdldFJlY29uY2lsaWF0aW9uQWN0Q09CUkFCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkT21uaWJ1c0J1ZGdldFJlY29uY2lsaWF0aW9uQWN0Q09CUkFFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZE9tbmlidXNCdWRnZXRSZWNvbmNpbGlhdGlvbkFjdENPQlJBUXVhbGlmeWluZ0V2ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RydWN0aW9uRGF0ZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RydWN0aW9uU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclNhZmV0eUNvbnZlbnRpb25Dc2NJbnNwZWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU2FmZXR5Q29udmVudGlvbkNzY1BsYXRlRXhwaXJhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclN0cmlwcGluZ0RhdGVUaW1lVWx0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclN0dWZmaW5nRGF0ZVRpbWVVbHRpbWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGVzdGFiaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbmdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW5nZW5jeUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVhdGlvbk9mUGF5U3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51aW5nRWR1Y2F0aW9uUmVxdWlyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVvdXNDb3ZlcmFnZURhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51b3VzUGFzc2l2ZU1vdGlvbkNQTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RBdWRpdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QXdhcmREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RCaW5kaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDb21wbGV0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDb3N0c1Rocm91Z2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3REZWZpbml0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEVmZmVjdGl2ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RXhwaXJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RNYWlsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UGVyZm9ybWFuY2VEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RQZXJmb3JtYW5jZVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RSZS1PcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdHVhbERlbGl2ZXJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3R1YWxTdGFydERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmlidXRpb25QZXJpb2RFbmREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJpYnV0aW9uUGVyaW9kU3RhcnREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJpYnV0aW9uc0NlYXNpbmdEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbFBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb3ZlcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXJzaW9uUHJpdmlsZWdlRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXJzaW9uVG9SZXBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlcnNpb25JbnRvSG9sZGluZ0NvbXBhbnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXJ0ZWRUb0VsZWN0cm9uaWNEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXlhbmNlUmVnaXN0cmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmljdGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcmRpbmF0aW9uT2ZCZW5lZml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcmRpbmF0aW9uT2ZCZW5lZml0c0JlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29yZGluYXRpb25PZkJlbmVmaXRzRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWREYXRlT2ZCaXJ0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zaWduZXJTaWduZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0RGlzbWlzc2FsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRFdmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnROb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0UmVnaXN0cmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJhZ2VEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJhZ2VJc3N1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyZWRJbmNvbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0RG9jdW1lbnRhdGlvbkV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdGVkU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0ZWRTZXJ2aWNlQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdGVkU2VydmljZUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0b3JzUmVxdWVzdGVkVmFsdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpbWluYWxTZW50ZW5jZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc2JvcmRlckRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cmVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50QXV0aG9yaXR5Q29udHJvbFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudERpc2FiaWxpdHlQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREaXNhYmlsaXR5UGVyaW9kTGFzdERheVdvcmtlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudERpc2FiaWxpdHlQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEluY29tZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudExlZ2FsU3RydWN0dXJlRWZmZWN0aXZlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudExpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRNb250aEVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudE5hbWVFZmZlY3RpdmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50UmVwb3J0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFNjaGVkdWxlRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRTY2hlZHVsZVNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnRhaWxtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VydGFpbG1lbnREYXRlZnJvbUFkdmljZU9mUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJDb250cmFjdEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJDb250cmFjdEV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyVmFsdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQ2FyZ29SZWxlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQ2xlYXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRW50cnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDeWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3ljbGVCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3ljbGVFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN5Y2xlVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQWNjb3VudE1hdHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVBY3F1aXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUFuZE9yVGltZU9mSGFuZGxpbmdFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVBc0F0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQXNzaWdubWVudEZpbGVkRm9yUmVjb3JkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rcnVwdGN5RmlsZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQmVjYW1lQXdhcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVDbGFpbVBhaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVDb3Vyc2VPZk9ydGhvZG9udGljc1RyZWF0bWVudEJlZ2FuT3JJc0V4cGVjdGVkVG9CZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZURlZWRGaWxlZEZvclJlY29yZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZURlZmF1bHRXYXNDdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZURvY3VtZW50YXRpb25PclBhcGVyd29ya09yQm90aFdhc1NlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUZvcmVjbG9zdXJlSGVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUZvcmVjbG9zdXJlUHJvY2VlZGluZ3NJbnN0aXR1dGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlRm9yZWNsb3N1cmVTYWxlU2NoZWR1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlRm9yVGhlTGFzdFVwZGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUhhemFyZEluc3VyYW5jZVBvbGljeUNhbmNlbGxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUhhemFyZEluc3VyYW5jZVBvbGljeVJlZnVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVNYXRlcmlhbFVzYWdlU3VzcGVuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBYmFuZG9ubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQWNxdWlzaXRpb25PZlRpdGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFkdmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFwcHJhaXNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQXNzaWdubWVudEFwcHJvdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBc3NpZ25tZW50UmVqZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZDbGFpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQ2xvc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRGFtYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNlYXNlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRGVlZEluTGlldSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRGl2b3JjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRXh0ZW5zaW9uVG9Db252ZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkZpcm1Db21taXRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZGaXJzdE1vcnRnYWdlUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRmlyc3RSZWdpc3RyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkZpcnN0VW5jdXJlZERlZmF1bHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkZvcmVjbG9zdXJlTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMYXN0Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTGFzdERyYXciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxhc3RJbnN0YWxsbWVudFJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMYXN0UGF5bWVudFJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMYXN0VXBkYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMb2FuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMb2NhbE9mZmljZUFwcHJvdmFsT2ZDb252ZXlhbmNlT2ZEYW1hZ2VkUmVhbEVzdGF0ZVByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMb2NhbE9mZmljZUFwcHJvdmFsT2ZDb252ZXlhbmNlT2ZPY2N1cGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTG9jYWxPZmZpY2VDZXJ0aWZpY2F0aW9uT2ZDb252ZXlhbmNlT2ZEYW1hZ2VkUmVhbEVzdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTWF4aW11bU1lZGljYWxJbXByb3ZlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTm90aWNlT2ZQcm9iYWJsZUluZWxpZ2liaWxpdHlGb3JBc3NpZ25tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZOb3RpY2VPZlJlZmVycmFsRm9yQXNzaWdubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTm90aWNlVG9Db252ZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk9wZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mT3JkZXJMZWFkVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUG9zc2Vzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUHJvZHVjdEZhaWx1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlByb3BlcnR5SW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZUZyb21CYW5rcnVwdGN5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUmVwYWlyT3JTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZTZWl6dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZTZXBhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZTb3VyY2VEb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPbldoaWNoQXNzZXRzSnVkZ2VkSW5zdWZmaWNpZW50VG9QYXlDcmVkaXRvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPdXRzdGFuZGluZ0xvYW5CYWxhbmNlUmVwb3J0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2luZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVQYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUGxhY2VkSW5EaXNmYXZvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVQb3NzZXNzb3J5QWN0aW9uSW5pdGlhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUHJhY3RpY2VDZWFzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVQcmFjdGljZUVzdGFibGlzaGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUHJvcGVydHlTb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUmVhZHlGb3JDb2xsZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUmVkZW1wdGlvblBlcmlvZEVuZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVSZWZlcnJlZFRvQXR0b3JuZXlGb3JGb3JlY2xvc3VyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVUaHJvdWdoV2hpY2hQcm9wZXJ0eVRheGVzSGF2ZUJlZW5QYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlVGltZU9mRGlzY291bnRUZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVRpbWVPZkludGVyZXN0RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlVGltZU9mTGF0ZXN0QWNjb3VudHNGaWxpbmdBdFB1YmxpY1JlZ2lzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlVG90YWxBbW91bnRPZkRlbGlucXVlbmN5UmVwb3J0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVWb2x1bnRhcnlDb252ZXlhbmNlQWNjZXB0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVXaGVuQ29udGFpbmVyRXF1aXBtZW50QmVjb21lc0RvbWVzdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXlsaWdodE92ZXJkcmFmdFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRheXNPZk9wZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhdGhEYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRWYWx1ZURhdGVSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRJbmN1cnJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjaXNpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYXRpb25QcmVzZW50YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhdGlvblJlZmVyZW5jZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVkdWN0aWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVlZE5vdEF2YWlsYWJsZUFzT2ZHaXZlbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVycmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJlZERpc3RyaWJ1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyZWRQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJlZFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmaW5pdGlvbk9mRGlzYWJpbGl0eUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxheWVkQmlsbGluZ05vdERlbGF5ZWRQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxldGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlck5vdEJlZm9yZUFuZE5vdEFmdGVyRGF0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5QXBwb2ludG1lbnREYXRlQW5kVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZTFTdFNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lQ3VycmVudFNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lRGVmZXJyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVFYXJsaWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUV4cGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lRmlyc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVMYXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lTGF0ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lUHJvbWlzZWRGb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVQcm9taXNlZEZvckFmdGVyQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lUHJvbWlzZWRGb3JQcmlvclRvQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lU2NoZWR1bGVkRm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlPcmRlcklzc3VlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlSYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVRpY2tldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuaWFsRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW5pYWxSZXNjaXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50QWRtaXNzaW9uRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudERpc2NoYXJnZURhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkxhYm9yV2FnZURldGVybWluYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRGF0ZVRpbWVFYXJsaWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRGF0ZVRpbWVGcm9tTGFzdFBvcnRPZkNhbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZURhdGVUaW1lU2NoZWR1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVEYXRlVGltZVVsdGltYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVGcm9tU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaERhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldHJpbWVudGFsSW5mb3JtYXRpb25SZWNlaXB0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0SW50ZXJjaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmlsaXR5V2FpdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYnVyc2VtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2hhcmdlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NoYXJnZUFuZExvYWRpbmdDb21wbGV0ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2hhcmdlLVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXBhbmN5RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2VtYmFya2F0aW9uRGF0ZUFuZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc21pc3NhbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3Bvc2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yVGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmlkZW5kQXBwbGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBbWVuZG1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEV4cGlyeURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdElzc3VlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRQcmVzZW50YXRpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnREdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50TWVzc2FnZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFJlY2VpdmVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50UmVxdWVzdGVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90RGVsaXZlckFmdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdERlbGl2ZXJCZWZvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90U2hpcEJlZm9yZUV4Q291bnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RTaGlwQmVmb3JlRXhGYWN0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2luZ1JldmlzaW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcEFjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3BwZWRUb0xlc3NUaGFuSGFsZlRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZURhdGVMYXN0Q29tcGxldGVJbnN0YWxsbWVudFBhaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZURhdGVPZkZpcnN0UGF5bWVudFRvUHJpbmNpcGFsQW5kSW50ZXJlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZVRvQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cGxpY2F0ZUJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJsaWVzdEZpbGluZ1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybGllc3RTYWxlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybHlGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmx5U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmx5V2l0aGRyYXdhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybmluZ3NFZmZlY3RpdmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbkJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25FbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25TdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVmZmVjdGl2ZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZmZlY3RpdmVEYXRlT2ZDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGlnaWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpZ2liaWxpdHlCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpZ2liaWxpdHlFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtYmFya2F0aW9uRGF0ZUFuZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkSW5UaGlzUG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkSW5UaGlzUHJvZmVzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVFZmZlY3RpdmVEYXRlT2ZDb3ZlcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVMYWlkT2ZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVRlbXBvcmFyeUxhaWRPZmZQZXJpb2RTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVGVtcG9yYXJ5TGFpZE9mZlBlcmlvZEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlV2FnZXNDZWFzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVyS25vd2xlZGdlT2ZUaGVJbmp1cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVyUmVwb3J0ZWRJbmp1cnlUb0NsYWltQWRtaW5pc3RyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95bWVudFBvc2l0aW9uU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50T3JIaXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50UG9zaXRpb25TdGFydERhdGVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveW1lbnRQcm9mZXNzaW9uU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kQXZhaWxhYmlsaXR5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kRGF0ZU9mU3VwcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kRGF0ZVNjaGVkdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nTGF5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kT2ZHcmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kT2ZMYXN0RmlzY2FsWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kb3JzZWRDZXJ0aWZpY2F0ZUlzc3VlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kb3JzZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0NoYW5nZUxldmVsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdEYXRhTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5yb2xsbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5yb2xsbWVudFNpZ25hdHVyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudHJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50cnlEYXRlRXN0aW1hdGVkQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50Q29sbGVjdGlvbk9yUGlja1VwRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudENvbGxlY3Rpb25PclBpY2tVcERhdGVUaW1lRWFybGllc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudENvbGxlY3Rpb25PclBpY2tVcERhdGVUaW1lUGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50TG9nRW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFBvc2l0aW9uaW5nRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFBvc2l0aW9uaW5nRGF0ZVRpbWVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFBvc2l0aW9uaW5nRGF0ZVRpbWVSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFBvc2l0aW9uaW5nRGF0ZVRpbWVVbHRpbWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UHJlVHJpcERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFJlY29uZGl0aW9uaW5nRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFJlcGFpclJlYWR5RGF0ZVRpbWVVbHRpbWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UmV0dXJuUGVyaW9kRXhwZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFN0b2NrQ2hlY2tEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjYWxhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY2FsYXRpb25TdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGFibGlzaGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVDb21tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEFjY2VwdGFuY2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpb25EYXRlT3JUaW1lRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRDb21wbGV0aW9uLUZpcnN0UHJpb3JNb250aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkQ29tcGxldGlvbi1TZWNvbmRQcmlvck1vbnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRDb21wbGV0aW9uLVRoaXJkUHJpb3JNb250aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RydWN0aW9uRGF0ZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQmlydGhFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZURhdGVUaW1lRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRFc2Nyb3dDbG9zaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRJbW1pZ3JhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFBvaW50T2ZBcnJpdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRQb2ludE9mRGlzY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRQb3J0T2ZFbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRTdGFydC1GaXJzdFByaW9yTW9udGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFN0YXJ0LVNlY29uZFByaW9yTW9udGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFN0YXJ0LVRoaXJkUHJpb3JNb250aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVQcmVwYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZhbHVhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhhbWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZWN1dGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZWN1dGlvbkRhdGVUaW1lUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGl0UGxhbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlY3RlZENvbnRhaW5lckhpcmVGcm9tRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVjdGVkRnVuZGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVjdGVkUHJvYmxlbVJlc29sdXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlY3RlZFJlcGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlY3RlZFZhbHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkT24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb25EYXRlT2ZFeHRlbnNpb25Ub0Fzc2lnbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbkRhdGVPZkV4dGVuc2lvbnRvRm9yZWNsb3NlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uRGF0ZVRpbWVPZkN1c3RvbXNEb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbkRhdGVUb1N1Ym1pdFRpdGxlRXZpZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb25PZkV4dGVuc2lvblRvQ29udmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uT2ZFeHRlbnNpb25Ub1N1Ym1pdEZpc2NhbERhdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb25PZkZvcmVjbG9zdXJlVGltZWZyYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcnlEYXRlT2ZFeHBvcnRMaWNlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcnlEYXRlT2ZJbXBvcnRMaWNlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBsYW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0YXRpb25EYXRlRm9yVGV4dGlsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9zdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvc3VyZVNvdXJjZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3NpbWlsZUR1ZUJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWx1cmVNb2RlRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWFzaWJpbGl0eVNpZ25PZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIaWdod2F5QWRtaW5pc3RyYXRpb25GaHdhSW5zcGVjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZUNhcGl0YWxpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZEZhaWx1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkVGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZUdlbmVyYXRpb25EYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsSXNzdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsUmVjb25jaWxpYXRpb25WYWx1ZUVzdGltYXRlQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxTY2hlZHVsZWRQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxDb3ZlcmFnZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSW5mb3JtYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJbmZvcm1hdGlvblN1Ym1pc3Npb25EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoRGF0ZU9yVGltZU1hbmRhdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoRGF0ZU9yVGltZUVhcmxpZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hEYXRlT3JUaW1lTGF0ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0RGF0ZU9mT3JkZXJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0SW50ZXJlc3RCZWFyaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RJbnRlcmVzdFBheW1lbnREdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0SW52b2x2ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0SXNzdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0TWFya2V0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UGF5bWVudENoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RQYXltZW50RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFByb2R1Y2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFB1Ymxpc2hlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UmF0ZUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0U2FsZURhdGVBbmRPclRpbWVBbmRPclBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RTdWJtaXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFZpc2l0b3JDb25zdWx0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpc2NhbEFubml2ZXJzYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0RXh0cmFFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRFeHRyYVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0UGVyaW9kRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0QmlsbERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mQXdhcmRUb0NvbXBsZXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZBd2FyZFRvRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZBd2FyZFRvRWFybGllc3REZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZkF3YXJkVG9MYXRlc3REZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZk5vdGljZVRvUHJvY2VlZFRvQ29tbWVuY2VtZW50T2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZOb3RpY2VUb1Byb2NlZWRUb0NvbXBsZXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZPcmRlclJlY2VpcHRUb0RlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mT3JkZXJSZWNlaXB0VG9TYW1wbGVSZWFkeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZk9yZGVyUmVjZWlwdFRvU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZSZWNlaXB0T2ZJdGVtVG9BcHByb3ZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZlJlY2VpcHRPZlRvb2xpbmdBaWRzVG9TYW1wbGVSZWFkeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZlNhbXBsZUFwcHJvdmFsVG9GaXJzdFByb2R1Y3RTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZlRvb2xpbmdBdXRob3JpemF0aW9uVG9TYW1wbGVSZWFkeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbUxhc3RCb29rZWRPcmRlclRvRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bWlnYXRpb25EYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsVGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZHNBcHByb3ByaWF0aW9uLUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZHNBcHByb3ByaWF0aW9uLVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdXR1cmVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhbGxvbnNQZXJNaW51dGVUZXN0UGVyZm9ybWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0NvbGxlY3Rpb25PclBpY2tVcERhdGVUaW1lUGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNQb3NpdGlvbmluZ0RhdGVUaW1lRXhwZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUG9zaXRpb25pbmdEYXRlVGltZVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUmVjZWlwdERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkdWF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBDb250cmFjdEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBDb250cmFjdEV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudG9yUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRPdmVyRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRPdmVyRGF0ZVRpbWVQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoQ2FwaXRhbFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hGYWJyaWNhdGlvblJlbGVhc2VBdXRob3JpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoUmF3TWF0ZXJpYWxBdXRob3JpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaXJlZEZyb21EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaXJlZFVudGlsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9sZEFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGRBc1N0b2NrQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9saWRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9saWRheUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9saWRheVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lc3RlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvcml6b25FbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Jpem9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Jpem9uU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Nlc0Nvbm5lY3RlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Nlc0Rpc2Nvbm5lY3RlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbEFkbWlzc2lvbkRhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpdGFsRGlzY2hhcmdlRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSHlkcm90ZXN0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWxsbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWxsbmVzc0JlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbGxuZXNzUmVjb3ZlcnlEYXRlRXhwZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltbWlncmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wbGFudGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBsZW1lbnRhdGlvbkRhdGVUaW1lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0TGljZW5jZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluYWN0aXZpdHlFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmJvdW5kTW92ZW1lbnRBdXRob3JpemF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb21lRG9jdW1lbnRhdGlvbkV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29tZUluY3JlYXNlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uRGlzc29sdXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY3VtYmVuY3lQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxFZHVjYXRpb25QbGFuSUVQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1mb3JjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25SZWxlYXNlQXV0aG9yaXphdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxDbGFpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbENvbXBsZXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxDb250YWN0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbERpc2FiaWxpdHlQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxEaXNhYmlsaXR5UGVyaW9kTGFzdERheVdvcmtlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbERpc2FiaWxpdHlQZXJpb2RSZXR1cm5Ub1dvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxEaXNhYmlsaXR5UGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxGZWVEdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxGaW5hbmNpYWxBY2NvdW50c0ZpbGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50RGF0ZUluaXRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxQcmVtaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsUHJlbWl1bUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFJlcXVlc3REYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsVHJlYXRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmp1cnlCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5qdXJ5RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmp1cnlPcklsbG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklucXVpcnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblNlcnZpY2VTdXJ2ZXlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNvbHZlbmN5RGlzY2hhcmdlR3JhbnRlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsYXRpb25EYXRlVGltZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbG1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxtZW50UGF5bWVudER1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RydWN0aW9uc09yaWdpbmFsRXhlY3V0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdWZmaWNpZW50QXNzZXRzSnVkZ2VtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RDYXBpdGFsaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RQYWlkVGhyb3VnaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RQYWlkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdFJhdGVWYWxpZGl0eVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFzc2Vzc21lbnRBcHByb3ZhbEZvclB1YmxpY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFJldmlld0N5Y2xlU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnJ1cHRpb25FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVycnVwdGlvblN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnZpZXdlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVydmlld2VyU2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVJlcG9ydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdGlnYXRpb25FbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RpZ2F0aW9uU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50TnVtYmVyQWxsb2NhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludml0YXRpb25Ub1RlbmRlckRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VEYXRlUmVxdWlyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljaW5nUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcnJlZ3VsYXJJbnRlcmVzdFBheW1lbnREdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbUNvbnRyYWN0RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtQ29udHJhY3RFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2luZWRFbXBsb3llckRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW5lZEZ1bmREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkZ2VtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkZ21lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktleUV2ZW50Q2FsZW5kYXJZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZXlFdmVudEZpc2NhbFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm91cldhZ2VEZXRlcm1pbmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEFjdGl2aXR5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEFubnVhbFJlcG9ydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RDYXBpdGFsQ2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdENlcnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RDaGVja0ZvckJhbGFuY2VTaGVldFVwZGF0ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RDaXZpbGlhbkZsaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdERhdGVGb3JBR292ZXJubWVudEFnZW5jeVRvRmlsZUFDbGFpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdERhdGVPZkFjY291bnRzRmlsZWRBdFB1YmxpY1JlZ2lzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RGF0ZU9mT3JkZXJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3REYXRlVG9GaWxlQUNsYWltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RGF0ZVRvT2JqZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RXBpc29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEZsaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEZvbGxvdy11cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEluc3VyYW5jZU1lZGljYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RJbnRlcmVzdEJlYXJpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0SXRlbURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0TG9nZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0TWFya2V0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RNZWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0TWVuc3RydWFsQ3ljbGVTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RNZW5zdHJ1YWxQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RNaWxpdGFyeUZsaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE5vdGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE9mZkhpcmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0T25IaXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFBhaWRJbnN0YWxsbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQYXltZW50TWFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFBoeXNpY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0UHJlbWl1bUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFByZW1pdW1QYWlkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFByb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQdWJsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFB1Ymxpc2hlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RTYWxhcnlJbmNyZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFNhbGVEYXRlQW5kT3JUaW1lQW5kT3JQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RTY3JlZW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RTZWVuRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFZpc2l0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFhSYXlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlRmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RBYnNlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdEJhbGFuY2VTaGVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0Q2hlY2tJblRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdERlbGl2ZXJ5RGF0ZWF0UGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0RGVsaXZlcnlEYXRlQXRSYWlsUmFtcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0RmlsaW5nUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RNYXRlcmlhbFNhZmV0eURhdGFTaGVldERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdE1ldGVyUmVhZGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdE9uQm9hcmRDYXJyaWVyRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0UHJpY2VBZGp1c3RtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0UmVjZWl2aW5nRGF0ZUN1dG9mZkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdFZpc2l0b3JDb25zdWx0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxheVRpbWVGaXJzdERheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF5VGltZUxhc3REYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZUNvbW1lbmNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlVGVybUVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlVGVybVN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVmdEVtcGxveWVyRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxBY3Rpb25DbG9zZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbEFjdGlvblN0YXJ0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsU2V0dGxlbWVudFRlcm1zTWV0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxTdHJ1Y3R1cmVDaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kZXJDcmVkaXRDaGVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZBZ3JlZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkxpYWJpbGl0eURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlUmVuZXdhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGllbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0aW5nUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RQcmljZUNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGVkb25WZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmdEYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblB1cmNoYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuU2VydmljaW5nVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uRXhjZXB0aW9uT3JkZXJOdW1iZXJBc3NpZ25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90TnVtYmVyRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93ZXN0QWN0aXZpdHlQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbEJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbFJlY2VpcHREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VDb21tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFrZWdvb2RDb21tZXJjaWFsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlbWVudEF2YWlsYWJsZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZXJOb3RSZWdpc3RlcmVkQXNPZkdpdmVuRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuZGF0b3J5T3JUYXJnZXRGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmRhdG9yeU9yVGFyZ2V0U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmlmZXN0U2hpcE5vdGljZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk1hcnJpYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJMZWFzZUFncmVlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDaGFuZ2VOb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0dXJpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdHVyaXR5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUNyZWRpdEdyYW50ZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWF0QWdlaW5nUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhaWRCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhaWRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbEluZm9ybWF0aW9uU2lnbmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsSW5mb3JtYXRpb25TeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QUNvdmVyYWdlRWZmZWN0aXZlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QUVsaWdpYmlsaXR5QmVnaW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRBRWxpZ2liaWxpdHlFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRBVGVybWluYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRCQ292ZXJhZ2VFZmZlY3RpdmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRCRWxpZ2liaWxpdHlCZWdpbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEJFbGlnaWJpbGl0eUVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEJUZXJtaW5hdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZXRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlkcG9pbnRPZlBlcmZvcm1hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUmVxdWlyZWREaXN0cmlidXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1TaGVsZkxpZmVSZW1haW5pbmdBdFRpbWVPZkRlc3BhdGNoUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtU2hlbGZMaWZlUmVtYWluaW5nQXRUaW1lT2ZSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb250aEVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9udGhUb0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vb3JpbmdEYXRlQW5kVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VlT2ZmaWNpYWxTaWduYXR1cmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZWVSZXBvcnRlZEN1cnRhaWxtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VOb3RlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdExpa2VseUVhcmx5RmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0TGlrZWx5RWFybHlTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdExpa2VseUxhdGVGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RMaWtlbHlMYXRlU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RSZWNlbnRIZW1vZ2xvYmluT3JIZW1hdG9jcml0T3JCb3RoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0UmVjZW50UmVuZXdhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdFJlY2VudFJldmlzaW9ub3JJbml0aWFsVmVyc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdFJlY2VudFNlcnVtQ3JlYXRpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmVkRnJvbUxvY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnb3RpYXRlZEV4dGVuc2lvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ290aWF0ZWRGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ290aWF0ZWRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnb3RpYXRpb25zU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRDcmVkaXRTZXJ2aWNlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0V29ydGhEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0QWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRBbm5pdmVyc2FyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dEFubnVhbE1lZXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRJbnN0YWxsbWVudER1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRJbnRlcmVzdENoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRQYXlJbmNyZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFBheW1lbnREdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRSZXZpZXdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25Xb3JraW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1Byb2R1Y3Rpb25TY2hlZHVsZUVzdGFibGlzaGVkQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9Qcm9taXNlQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9TaGlwcGluZ1NjaGVkdWxlRXN0YWJsaXNoZWRBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RBZnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90QmVmb3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWNhdGlvbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25PZkRlYXRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25UaW1lTGltaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RSZWdpc3RlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RSZWdpc3RlcmVkQXNPZkdpdmVuRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVyc2luZ0hvbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51cnNpbmdIb21lRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVyc2luZ0hvbWVUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cnJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cnJlbmNlU3BhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXJyZW5jZVNwYW5Gcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cnJlbmNlU3BhblRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlckV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZkhpcmVTdXJ2ZXlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZIb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2lhbFJhaWxDYXJJbnRlcmNoYW5nZUVpdGhlckFjdHVhbG9yQWdyZWVkVXBvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmLU1hcmtldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Zmc2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZzZXRCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Zmc2V0RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZzZXRGcm9tQ29vcmRpbmF0ZWRVbml2ZXJzYWxUaW1lVXRjIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRlc3RVbnBhaWRJbnN0YWxsbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uQm9hcmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkhpcmVTdXJ2ZXlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uc2V0T2ZDdXJyZW50U3ltcHRvbXNPcklsbG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uc2V0T2ZTaW1pbGFyU3ltcHRvbXNPcklsbG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5Ib3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlbmluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGlvbnNDZWFzZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGluaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpbWlzdGljRWFybHlGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGltaXN0aWNFYXJseVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpbWlzdGljTGF0ZUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW1pc3RpY0xhdGVTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJBbWVuZG1lbnRCaW5kaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJDb21wbGV0aW9uRGF0ZVRpbWVVbHRpbWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyUmVjZWl2ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJUb1Byb2NlZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxEdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbER1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEVhcmx5RmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEVhcmx5U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRXN0aW1hdGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbElzc3VlQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbExpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsbHlTY2hlZHVsZWRTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbE1hdHVyaXR5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxOYW1lQ2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxQb3N0aW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcnRob2RvbnRpY1RyZWF0bWVudFBlcmlvZFJlbWFpbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3J0aG9kb250aWNUcmVhdG1lbnRQZXJpb2RUb3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0LU9mLVBvY2tldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZUF1ZGl0b3JzUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyaGF1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVycmlkZURhdGVGb3JTZXR0bGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyVGFyZ2V0QmFzZWxpbmVNb250aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnRpbWVFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVydGltZVN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwQ2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeHlnZW5TYXR1cmF0aW9uVGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3h5Z2VuVGhlcmFweSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3h5Z2VuVGhlcmFweUV2YWx1YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94eWdlblRoZXJhcHlGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeHlnZW5UaGVyYXB5VG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkSW5GdWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkVGhyb3VnaERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWQtVGhyb3VnaERhdGVGb3JBY2NydWVkU2lja1BheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZFRocm91Z2hEYXRlRm9yTWluaW11bVBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWQtVGhyb3VnaERhdGVGb3JTYWxhcnlDb250aW51YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRUaHJvdWdoRGF0ZUZvclRvdGFsUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC1UaHJvdWdoRGF0ZUZvclZhY2F0aW9uUGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkLXVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXBlcndvcmtNYWlsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxBbm51aXRpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydFRpbWVXb3JraW5nQ2hhbmdlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3REdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnRGaXJzdFZpc2l0Rm9yQ29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50Q29tbWVuY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudERhdGVUaW1lRGVmZXJyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnREdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50SW5pdGlhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50SW5zdHJ1Y3Rpb25EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudElzc3VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50UGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50UGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRWYWx1YXRpb25QcmVzZW50YXRpb25EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbERlZHVjdGlvbkRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsUGVyaW9kQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlYWtBY3Rpdml0eVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVlclJldmlld09yZ2FuaXphdGlvblBST0FwcHJvdmVkU3RheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVlclJldmlld09yZ2FuaXphdGlvblBST0FwcHJvdmVkU3RheUZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZXJSZXZpZXdPcmdhbml6YXRpb25QUk9BcHByb3ZlZFN0YXlUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuYWx0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuYWx0eUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5hbHR5RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5kaW5nQXJjaGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY29sYXRpb25UZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RBbkV2ZW50SXNMYXRlRHVlVG9DdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kQXNzaWduZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZEJldHdlZW5DaGFuZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RDb3ZlcmVkQnlTb3VyY2VEb2N1bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kRXh0ZW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZGljSW5zcGVjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZE9mQ2FyZUVuZERhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZE9mQ2FyZVN0YXJ0RGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kT2ZJbGxuZXNzRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kT2ZJbGxuZXNzU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RPdmVyZHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kV29ya2VkRm9yVGhlQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVybWl0VG9BZG1pdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1pdFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlc3NpbWlzdGljRWFybHlGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlc3NpbWlzdGljRWFybHlTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVzc2ltaXN0aWNMYXRlRmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXNzaW1pc3RpY0xhdGVTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja1VwQ29sbGVjdGlvbkRhdGVUaW1lT2ZDYXJnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja1VwRGF0ZVRpbWVPZkVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnREYXRlUHJldmlvdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudFBlcmlvZEV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5Bbm5pdmVyc2FyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbkJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuRW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uZWREdXJhdGlvbk9mV29ya3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uZWRSZWxlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuT2ZUcmVhdG1lbnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5QYXJ0aWNpcGF0aW9uU3VzcGVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhblBlcmlvZEVsZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuUGVyaW9kRWxlY3Rpb25CZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhblBlcmlvZEVsZWN0aW9uRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuVGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdWdnZWRBbmRBYmFuZG9uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5RWZmZWN0aXZlT25PckFmdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lFZmZlY3RpdmVPbk9yQmVmb3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lTdXJyZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xTZXR0bGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3NpdGlvbmluZ0RhdGVUaW1lT2ZFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc2l0aW9uaW5nRGF0ZVRpbWVPZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0aW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdG1hcmtEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1SZWNsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0LVJlY2xhc3NpZmljYXRpb25FbmRPZlNlY29uZFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3QtUmVjbGFzc2lmaWNhdGlvbkZpcnN0UmVwb3J0Q2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1SZWNsYXNzaWZpY2F0aW9uRmlyc3RTZW1pLWFubnVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1SZWNsYXNzaWZpY2F0aW9uU2Vjb25kU2VtaS1hbm51YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWFycmFuZ2VkRGVhbE1hdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtQXdhcmRTdXJ2ZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWNlZGluZ1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLWNlcnRpZmljYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmb3JlY2xvc3VyZUFjY2VwdGFuY2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmb3JlY2xvc3VyZVNhbGVDbG9zaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZ25hbmN5QmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWduYW5jeUR1cmF0aW9uQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVnbmFuY3lFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1DaGFuZ2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1QYWlkVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtUGFpZFRvRGF0ZUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtUGFpZFRvRGF0ZUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25EYXRlVGltZU9mRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uRGlzcGVuc2luZ0RhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbkZpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbkZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbklzc3VlRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRhdGlvbkRhdGVMYXRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRhdGlvbkRhdGVPZkdvb2RzRGVjbGFyYXRpb25DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50YXRpb25Ub0JhbmtydXB0Y3lSZWNlaXZlcnNEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50Q29udHJvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGVkVG9SZWNlaXZlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRMZWdhbFN0cnVjdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGx5UmVzaWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRSZXNpZGVuY2VTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQm9va2luZ0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NvdXJ0RXZlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3VycmVudEFjY291bnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0VtcGxveW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRW1wbG95bWVudEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNFbXBsb3ltZW50U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzSW52b2ljZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzbHlSZXBvcnRlZERhdGVPZkJpcnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c2x5UmVzaWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNNZXRlclJlYWRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c01vbnRoRW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZXBvcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1Jlc2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZXNpZGVuY2VFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVzaWRlbmNlU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzVGVybWluYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFkanVzdG1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFkanVzdG1lbnRMaW1pdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQWRqdXN0bWVudFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VCYXNlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlUHJvdGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNhcmVQcm92aWRlckJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Q2FyZVByb3ZpZGVyRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmludGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckNvbnRyYWN0QW5uaXZlcnNhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQ29udHJhY3RJc3N1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JIb3NwaXRhbGl6YXRpb25EYXRlc1JlbGF0ZWRUb0N1cnJlbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JJbmNvcnJlY3REYXRlT2ZCaXJ0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JOb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yUGxhY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2aWxlZ2VEZXRhaWxzVmVyaWZpY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nRGF0ZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ0VuZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nU3RhcnREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdEF2YWlsYWJpbGl0eURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RIZWxkVW50aWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25EYXRlTm9TY2hlZHVsZUVzdGFibGlzaGVkQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbkluc3BlY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uTWFudWZhY3R1cmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TGlmZXNwYW5BdFRpbWVPZlByb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2ZpdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbW1lZENhbGVuZGFyWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbW1lZEZpc2NhbFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyZXNzUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdGVkQWN0aW9uRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdGVkRm9yZWNsb3N1cmVTYWxlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE92ZXJUYXJnZXRCYXNlbGluZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yRGVsaXZlcnlBZnRlckFuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzZWRGb3JEZWxpdmVyeVByaW9yVG9BbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yRGVsaXZlcnlXZWVrT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yU2hpcG1lbnRBZnRlckFuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzZWRGb3JTaGlwbWVudFByaW9ydG9BbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yU2hpcG1lbnRXZWVrT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbkRhdGVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbkVuZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25GbG9vclN0b2NrUHJvdGVjdC1FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbkZsb29yU3RvY2tQcm90ZWN0LVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25JbnZvaWNlUGVyZm9ybWFuY2UtRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25JbnZvaWNlUGVyZm9ybWFuY2UtU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbk9yZGVyLUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uT3JkZXItU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblBlcmZvcm1hbmNlLUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uUGVyZm9ybWFuY2UtU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblJlcXVlc3RlZERlbGl2ZXJ5LUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uUmVxdWVzdGVkRGVsaXZlcnktU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblNoaXAtRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25TaGlwLVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25TdGFydERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlBY3F1aXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlCdWlsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdG90eXBlVGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJTaWduYXR1cmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJMYXRlc3RQb3NzaWJsZUNoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHV0SW50b1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlSYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJ0ZXJFbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RhRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RlVG9CZVJlY2VpdmVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZU9mRXhjaGFuZ2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZVByaWNlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWNoZWRUb3RhbERlcHRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFkeUZvckluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZVRheFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYnVpbHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2FwdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2YWJsZXNDb2xsZWN0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZUF0TG9ja2JveERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkSW5UaGVNYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlckFwcG9pbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJzaGlwUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcnNoaXBSZXN1bHREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYXNzaWZpY2F0aW9uRXhpdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29tcGxldGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3ZlcnlGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY292ZXJ5U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlLWVudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZS1ldmFsdWF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVFeHBvcnRhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VkSXRlbUNyZWF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyYWxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJlZEZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmVkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmluYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmdXNhbFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZENvbnRyYWN0b3JOdW1iZXJBc3NpZ25tZW50RGF0ZU9yaWdpbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25EYXRlT2ZQcmV2aW91c0N1c3RvbXNEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uT2ZCb2FyZE9mRGlyZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWhpcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW1idXJzZW1lbnRDbGFpbUlzc3VlRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVJbXBvcnRhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdGF0ZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZUFjY291bnRpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlQ292ZXJhZ2VEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VDdXJyZW50QWNjb3VudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlSXNzdWVBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlUGFpZFVwRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VQYXltZW50RnJlcXVlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWlzc3VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlRGF0ZUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VEYXRlT2ZDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZURhdGVPZlN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlZFJldHVyblRvV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZWRUb1Zlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZUZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZU9mSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0dGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW9kZWxpbmdDb21wbGV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW92ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbmV3YWxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWxQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudFN1cnZleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyVHVybmFyb3VuZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGF5bWVudEJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBheW1lbnRTY2hlZHVsZVNlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGx5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGluZ0N5Y2xlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVhbGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZERlcGFydHVyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZEZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVJlcXVlc3RlZEZvckFmdGVyQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lUmVxdWVzdGVkRm9yUHJpb3JUb0FuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkRm9yRGVsaXZlcnlXZWVrT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGF0ZVRpbWVSZXF1ZXN0ZWRGb3JBZnRlckFuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnREYXRlVGltZVJlcXVlc3RlZEZvclByaW9yVG9BbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZEZvclNoaXBtZW50V2Vla09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRPZmZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkUGljay11cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkU2V0dGxlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JRdW90YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVkRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VydmF0aW9uT2ZGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbnRMaWNlbnNlRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudExpY2Vuc2VFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZ25hdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNvbHZlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3REYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdWJtaXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRlbnRpb25SZWxlYXNlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGVudGlvblJlbGVhc2VEYXRlVGltZVBhcnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGlyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHJhbnNtaXNzaW9uVGltZVN0YW1wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5lZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmVkVG9DdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuVG9Xb3JrRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuVG9Xb3JrUGFydFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlld0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlld1BlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aXNlZEFkanVzdGVkRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpc2VkQWRqdXN0ZWRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aXNlZEVzdGltYXRlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aXNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldm9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldm9rZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ0Fycml2YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRGdW5kVGF4RXhwaXJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FpbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsYXJ5Q2hhbmdlRWZmZWN0aXZlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsYXJ5RGVmZXJyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVhYmxlU3RvY2tEZW1hbmRDb3ZlclBlcmlvZEV4cGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc0RhdGVBbmRPclRpbWVBbmRPclBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZUF2YWlsYWJsZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZUNvbGxlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlUmVxdWlyZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVzVG9CZVJldHVybmVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbmN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXRpc2ZhY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXRpc2ZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZEZvckRlbGl2ZXJ5T25PckFmdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGb3JEZWxpdmVyeU9uT3JCZWZvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZEZvckRlbGl2ZXJ5V2Vla09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGb3JTaGlwbWVudEFmdGVyQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGb3JTaGlwbWVudFByaW9yVG9BbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZEZvclNoaXBtZW50V2Vla09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRJbnRlcmNoYW5nZURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVSZWxlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xSZWZ1bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZEFkbWlzc2lvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZERpc2NoYXJnZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5UmF0ZUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5U2hhcmVQcmljZUFzT2ZHaXZlbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxlY3Rpb25QZXJpb2RFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxlY3Rpb25QZXJpb2RTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxCeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNMb2NhbFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbWlhbm51YWxFbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRpbmdSb2FkVGltZVN0YW1wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXB0aWNBcHByb3ZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbXBsZXRpb25EYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUludGVycnVwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlclNpZ25hdHVyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldG9mZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnREYXRlQXNTcGVjaWZpZWRCeVRoZU9yaWdpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnREYXRlRnJvbUludGVybGluZVNldHRsZW1lbnRTeXN0ZW1Pbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50RGF0ZVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnREdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50U3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsZkxpZmVFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwRGF0ZU9yaWdpbmFsbHlTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBEdXJpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudERhdGVUaW1lUHJvbWlzZWRGb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGF0ZVRpbWVQcm9taXNlZEZvclByaW9yVG9BbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGF0ZVRpbWVSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBOb3RMYXRlclRoYW5EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcE5vdEJlZm9yZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwTm90QmVmb3JlQW5kTm90QWZ0ZXJEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcE9uT3JBYm91dERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nRGF0ZUFuZE9yVGltZUN1cnJlbnRTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdEYXRlTm9TY2hlZHVsZUVzdGFibGlzaGVkQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFdlZWtPZkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNodXRJbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lja25lc3NCZW5lZml0QWdlTGltaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpY2tuZXNzQmVuZWZpdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lja25lc3NJbnN1cmFuY2VFbGltaW5hdGlvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lja25lc3NMaWZldGltZUJlbmVmaXRRdWFsaWZpY2F0aW9uQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWRldHJhY2tlZFdlbGxib3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYXR1cmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYXR1cmVSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2ltaWxhcklsbG5lc3NPbnNldERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbXBsZUludGVyZXN0RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGF1Z2h0ZXJpbmdFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGF1Z2h0ZXJpbmdTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbFNlY3VyaXR5Q2xhaW1zVmVyaWZpY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZEJvb2tQdWJsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZURpcmVjdG9yc2hpcFJlZ2lzdHJhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGljaXRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlRG9jdW1lbnRDYXB0dXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BhY2luZ09yZGVyVW5pdEFzc2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG9uc29yZWREZXBlbmRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb25zb3JlZERlcGVuZGVudEJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG9uc29yZWREZXBlbmRlbnRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3VzZVJldGlyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwdWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lRWFybGllc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lTGF0ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVNYW5kYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZU5vdEFmdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVOb3RCZWZvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZVNjaGVkdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlVGltZVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0ZWREb2luZ0J1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydE5vRWFybGllclRoYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0Tm9MYXRlclRoYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVSZXNpZGVuY3lEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbFRpbWVTZXJpZXNEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c0FmdGVyQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNBc3NpZ25tZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzQ2hhbmdlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c0NvbW1lcmNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c091dHNpZGVQcm9jZXNzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c1ByaW9yQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wRGlzdHJpYnV0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcFdvcmtBc09mR2l2ZW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWRlbnRTaWduZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JQZXJpb2RPZkhpcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pc3Npb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXR0YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNlcXVlbnRJbnRlcmVzdFBheW1lbnREdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNlcXVlbnRTdWJtaXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnNlZGVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhbElzc3VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNBdmVyYWdlQ3JlZGl0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlQ2FzaW5nQXV0aG9yaXR5QXBwcm92YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmdlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnJlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5WWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VzcGVuZGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VzcGVuc2lvbkVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VzcGVuc2lvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3dvcm5BbmRTdWJzY3JpYmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW1wdG9tc09uc2V0UGF0aWVudEFsbGVnZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbVN1cnZleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtVGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFibGVSYXRpbmdFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhaWxDb3ZlcmFnZUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYWlsQ292ZXJhZ2VFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtzQWNjZXB0ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua3NJbnNwZWN0ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFBlcmlvZEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFBlcmlvZFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UG9pbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxSYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGV4RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcG9yYXJ5UHJvc3RoZXNpc0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmRlclN1Ym1pc3Npb25EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYXRlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hdGlvbk9mRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1zRGlzY291bnREdWVEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybXNNZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1zTmV0RHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdENvbXBsZXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0UGVyZm9ybWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0UGVyaW9kRW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0U3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXhhc0xpbmVUZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlcmFweSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUVtcGxveWVlQmVnYW5Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lSW5VUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUxpbWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lTm93RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbGluZ1JlcXVpcmVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxTaGVsZkxpZmVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVTdHlsZVJlZ2lzdHJhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluaW5nQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluaW5nRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2FjdGlvbkNyZWF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJOb3RlQWNjZXB0YW5jZURhdGVBbmRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlcnJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNoaXBtZW50RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRUaW1lTGltaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pc3Npb25EYXRlVGltZU9mRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWl0dGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdHJpcHBpbmdEYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdHVmZmluZ0RhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlhbEJhbGFuY2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWFsU2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlhbFN0YXJ0RGF0ZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYWxTdGFydERhdGVTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcndyaXRpbmdZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRlZERhdGVBbmRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWxpZGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRpdHlQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbGlkaXR5U3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWxpZFVudGlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1YXRpb25EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWF0aW9uRGF0ZUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlQWRkZWRUYXhDbGFpbXNWZXJpZmljYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlRGF0ZU9mSW5kZXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcmJhbFJlcG9ydE5lZWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyaWZpY2F0aW9uUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcmlmaWNhdGlvblNlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcmlmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxSZWdpc3RyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzdGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3RpbmdTZXJ2aWNlQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3RpbmdTZXJ2aWNlRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bnRhcnlUZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm91Y2hlckRhdGVPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZXNFYXJuZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZ2VQZXJpb2RFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWdlUGVyaW9kU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWl0aW5nVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudHlFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXliaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWVrRW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsTG9nUnVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaG9sZXNhbGVDb250cmFjdEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hvbGVzYWxlQ29udHJhY3RFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWxsQWR2aXNlQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0aGRyYXduRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0aGhlbGREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrRWZmZWN0aXZlU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JraW5nUGVyaW9kRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya2luZ1BlcmlvZFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya3NDb21wbGV0aW9uRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtzQ29tcGxldGlvbkRhdGVUaW1lUGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29yc3RUaW1lVG9DYWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyQmVnaW5uaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyRHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyRW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyT2ZPY2N1cnJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyVG9EYXRlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlclBhcnR5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCdXllclBhcnR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQnV5ZXJUYXhJbmZvcm1hdGlvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5VGF4SW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNlbGxlclBhcnR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VsbGVyVGF4SW5mb3JtYXRpb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eVRheEluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBUb1BhcnR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQmlsbFRvUGFydHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZW1pdFRvUGFydHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwRnJvbVBhcnR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iV2FyZWhvdXNlUGFydHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTb2xkVG9QYXJ0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1hbnVmYWN0dXJpbmdUb1BhcnR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTWF0ZXJpYWxJc3N1ZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlBhcnR5Q29kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyUGFydHkiIHR5cGU9Ik9yZGVyUGFydHkiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhcnR5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0eUlEIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1ERkJ1c2luZXNzIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJOYW1lQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJDb250YWN0Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ29udGFjdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWNlaXZpbmdDb250YWN0Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ29udGFjdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwcGluZ0NvbnRhY3QiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb250YWN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik90aGVyQ29udGFjdHMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZDb250YWN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvcnJlc3BvbmRlbmNlTGFuZ3VhZ2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMYW5ndWFnZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0eSIgdHlwZT0iUGFydHkiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZklkZW50aWZpZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IklkZW50aWZpZXIiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZklkZW50aWZpZXIiIHR5cGU9Ikxpc3RPZklkZW50aWZpZXIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRhY3QiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udGFjdElEIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdE5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ29udGFjdEZ1bmN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250YWN0RGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mQ29udGFjdE51bWJlciIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdCIgdHlwZT0iQ29udGFjdCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGFjdEZ1bmN0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWN0RnVuY3Rpb25Db2RlZCIgdHlwZT0iQ29udGFjdEZ1bmN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udGFjdEZ1bmN0aW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdEZ1bmN0aW9uIiB0eXBlPSJDb250YWN0RnVuY3Rpb24iLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ29udGFjdEZ1bmN0aW9uQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGluZ09mZmljaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nY29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNQYXlhYmxlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNSZWNlaXZhYmxlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbEluc3VyYW5jZUluZm9ybWF0aW9uQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRpdmVDb250cmFjdGluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmdGVyLUhvdXJzQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0ZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwb2ludG1lbnRTY2hlZHVsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJhaXNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0ZW50aW9uLVRvUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dG9ybmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpdGluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRGaW5hbmNpYWxDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkTmVnb3RpYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkU2lnbmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWRDbGVhcmluZ2hvdXNlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2luZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxJbnF1aXJ5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRTdGFmZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1VuaXRNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllck5hbWVvckRlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBREFuZENBTVNwZWNpYWxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFpcm1hbk9mVGhlQm9hcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZWRCeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlT3JkZXJBcHByb3ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpZWZFeGVjdXRpdmVPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGllZkZpbmFuY2lhbE9mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWVmSW5mb3JtYXRpb25PZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGllZk9wZXJhdGluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlXb3Jrc0F1dGhvcml0eUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbUFwcHJvdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbVJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1zQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdob3VzZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZXJrT2ZDb3VydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tQm9ycm93ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUludmVzdGlnYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWdlb2ZFZHVjYXRpb25BZG1pc3Npb25zT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGlhbmNlT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9uZW50RW5naW5lZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXB1dGVyU3lzdGVtc0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmN1cnJlbnRFbXBsb3llckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpcm1lZFdpdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdGlvbkNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVQdXJjaGFzaW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RBbmRTY2hlZHVsZUNvb3JkaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckNvbnRhY3RHcmFudGluZ0FwcG9pbnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck1haW50ZW5hbmNlTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJSZWxhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c0dvb2RzQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUluc3RydWN0aW9uc0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnRhbFNjaG9vbEFkbWlzc2lvbnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPckVtcGxveWVlVG9FeGVjdXRlRXhwb3J0UHJvY2VkdXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9yRW1wbG95ZWVUb0V4ZWN1dGVJbXBvcnRQcm9jZWR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T3JQZXJzb25SZXNwb25zaWJsZUZvclByb2Nlc3NpbmdQdXJjaGFzZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNpZ25FbmdpbmVlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2ZWxvcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RvcnlBZHZlcnRpc2luZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmlzaW9uRGlyZWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmlzaW9uTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJQ29vcmRpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbkNvb3JkaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJpY2l0eVN1cHBseUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNEYXRhSW50ZXJjaGFuZ2VDb29yZGluYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY1N1Ym1pc3Npb25SZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeUNvbnRhY3QtQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lDb250YWN0LU1pbGl0YXJ5VHJhZmZpY01hbmFnZW1lbnRDb21tYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lDb250YWN0LVNoaXBwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeURhbmdlcm91c0dvb2RzQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRlcmVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbmluZ1Byb2dyYW1zT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRpdmVPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRpdmVWaWNlLVByZXNpZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxBaWRPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjbG9zaW5nTGVuZGVyQWRtaW5pc3RyYXRpdmVDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzU3VwcGx5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUmVjZWl2aW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZHVhdGVBZG1pc3Npb25zT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkdWF0ZUJ1c2luZXNzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkdWF0ZUVuZ2luZWVyaW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkdWF0ZUZpbmVBcnRzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWlkYW5jZUNvdW5zZWxvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWxDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkT2ZVbml0Rm9ySW5mb3JtYXRpb25EaXNzZW1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkT2ZVbml0Rm9ySW5mb3JtYXRpb25Qcm9kdWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkT2ZVbml0T3JDb21wdXRlckRhdGFQcm9jZXNzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhNYWludGVuYW5jZU9yZ2FuaXphdGlvbkNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh1bWFuUmVzb3VyY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbkNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVydmlld2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RpZ2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG1lbnRDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1aW5nT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRXb3JrQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kcmVnaXN0cnlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXdGaXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXdTY2hvb2xBZG1pc3Npb25zT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbEF1ZGl0aW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsUHVyY2hhc2luZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdQbGFudENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldGluZ0RlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldGluZ0RpcmVjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENvbnRyb2xDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbERpc3Bvc2l0aW9uQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxIYW5kbGluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsU2FmZXR5RGF0YVNoZWV0Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxBZG1pc3Npb25zT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVJlY2lwaWVudENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VTZW5kZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlU3RhZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2VWZW5kb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0J1c2luZXNzUHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3RGV2ZWxvcG1lbnRzQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90YXJ5UHVibGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1lcmljYWxDb250cm9sRW5naW5lZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVN0YWZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckFkdWx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmVudG9yR3VhcmRpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYXRpbmdMYWJvcmF0b3J5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydG5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWVDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcnNDbGFpbU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9ybWFuY2VFdmFsdWF0aW9uQ29tbWl0dGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25uZWxDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZDb2xsZWN0aW9uQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkRlbGl2ZXJ5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudE9yRXF1aXBtZW50Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGZvcm1NYWludGVuYW5jZU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRFbmdpbmVlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlYXdhcmRTdXJ2ZXlNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvbkNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzaWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQWRtaW5pc3RyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Q29udHJvbFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5VGF4cGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbFN0dWR5Q29udGFjdG9yQXV0aG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9iYXRpb25vckxlZ2FsT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc0VuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25SZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdE1hbmFnZW1lbnRDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtRGlyZWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1NYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0RGlyZWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RNYW5hZ2VtZW50Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RvdHlwZUNvb3JkaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljUmVsYXRpb25zQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VTZXJ2aWNlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzaW5nQ29udHJhY3RpbmdPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5QXNzdXJhbmNlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNvb3JkaW5hdG9yQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUluc3BlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U3VydmV5b3JDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVTdXBlcnZpc29yT3JDbGVyayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZVByb3BlcnR5S2V5SG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlUHJvcGVydHlPY2N1cGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmViYXRlT3JDaGFyZ2ViYWNrQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nRG9ja0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsQ29tcGFueUFkbWluaXN0cmF0aXZlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0QXV0aG9yaXplciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0UHJlcGFyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uZGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVQZXJzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlUGVyc29uRm9yQ29tcHV0ZXJEYXRhUHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVQZXJzb25mb3JJbmZvcm1hdGlvbkRpc3NlbWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlUGVyc29uRm9ySW5mb3JtYXRpb25Qcm9kdWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXdBbmRSZXByaWNpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc0FkbWluaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1JlcHJlc2VudGF0aXZlT3JEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbENsZXJrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xvZlRoZW9sb2d5QWRtaXNzaW9uc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sb2ZWZXRlcmluYXJ5TWVkaWNpbmVBZG1pc3Npb25zT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xQcmluY2lwYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVRheHBheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNyZXRhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZU9yZGVyV3JpdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlVGVhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVRlY2huaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbFNlcnZpY2VzV29ya2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2Z0d2FyZUhvdXNlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFByb2dyYW1Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50aW5BYnNlbnRpYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZHlTdWJtaXR0ZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXR0aW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1zQWRtaW5pc3RyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsRG9jdW1lbnRhdGlvblJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsTWFya2V0aW5nUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbFdyaXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbW11bmljYXRpb25zTmV0d29ya0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZUFuc3dlcmluZ1NlcnZpY2VDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5hbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmRlckRldmVsb3BlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkLVBhcnR5QWRtaW5pc3RyYXRvckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvd25QbGFubmluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWZmaWNBZG1pbmlzdHJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFmZmljQXV0aG9yaXR5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXR0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEluZnJhc3RydWN0dXJlQXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhc3VyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZVJlY2VpdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcmdyYWR1YXRlQWRtaXNzaW9uc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJ3cml0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaW9uUHJlc2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaWNlUHJlc2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWl2ZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyU3VwcGx5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0Jyb2tlck1haW50ZW5hbmNlTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya3Nob3BDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc01hbmFnZW1lbnRDb250YWN0Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZDb250YWN0TnVtYmVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJDb250YWN0TnVtYmVyIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb250YWN0TnVtYmVyIiB0eXBlPSJMaXN0T2ZDb250YWN0TnVtYmVyIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250YWN0TnVtYmVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWN0TnVtYmVyVmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWN0TnVtYmVyVHlwZUNvZGVkIiB0eXBlPSJDb250YWN0TnVtYmVyVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRhY3ROdW1iZXJUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdE51bWJlciIgdHlwZT0iQ29udGFjdE51bWJlciIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDb250YWN0TnVtYmVyVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZheE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1haWxBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2JpbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGV4TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWdlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZVBhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldXVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlRQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUkxPdGhlciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQ29udGFjdCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iQ29udGFjdCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQ29udGFjdCIgdHlwZT0iTGlzdE9mQ29udGFjdCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFydHlUYXhJbmZvcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhJZGVudGlmaWVyIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWdpc3RlcmVkTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVnaXN0ZXJlZE9mZmljZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJUYXhMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29tcGFueVJlZ2lzdHJhdGlvbk51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFydHlUYXhJbmZvcm1hdGlvbiIgdHlwZT0iUGFydHlUYXhJbmZvcm1hdGlvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUGFydHlDb2RlZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGFydHlDb2RlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUGFydHlDb2RlZCIgdHlwZT0iTGlzdE9mUGFydHlDb2RlZCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFydHlDb2RlZCI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJQYXJ0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhcnR5Um9sZUNvZGVkIiB0eXBlPSJQYXJ0eVJvbGVDb2RlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhcnR5Um9sZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhcnR5Q29kZWQiIHR5cGU9IlBhcnR5Q29kZWQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iVHJhbnNwb3J0Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZUcmFuc3BvcnQiIHR5cGU9Ikxpc3RPZlRyYW5zcG9ydCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRJRCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJUcmFuc3BvcnRNb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlRyYW5zcG9ydE1lYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXJyaWVyTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2FycmllcklEIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDdXN0U2hpcHBpbmdDb250cmFjdE51bSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VydmljZUxldmVsQ29kZWQiIHR5cGU9IlNlcnZpY2VMZXZlbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlcnZpY2VMZXZlbENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBwaW5nSW5zdHJ1Y3Rpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnRMZWdDb2RlZCIgdHlwZT0iVHJhbnNwb3J0TGVnQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0TGVnQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZUcmFuc3BvcnRFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVHJhbnNpdERpcmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0Tm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0IiB0eXBlPSJUcmFuc3BvcnQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zcG9ydE1vZGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydE1vZGVDb2RlZCIgdHlwZT0iVHJhbnNwb3J0TW9kZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydE1vZGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRNb2RlIiB0eXBlPSJUcmFuc3BvcnRNb2RlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zcG9ydE1vZGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJDaGFydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJFeHByZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJGcmllZ2h0Rm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJUYXhpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFybWVkRm9yY2VzQ291cmllclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2toYXVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVzdFdheS1TaGlwcGVyc09wdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va1Bvc3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWJPclRheGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vbklycmVndWxhckNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcml6ZWRPY2VhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZW50aW9uYWxPY2VhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJQaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUGlja3VwT3JDdXN0b21lcnNFeHBlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZWF3YXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlYXdheVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV1cm9wZWFuT3JQYWNpZmljRGlzdHJpYnV0aW9uU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRUcmFuc3BvcnRJbnN0YWxsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZseWF3YXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNSZWNlaXZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNSZWNlaXZpbmdPclNoaXBwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljU2hpcHBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFdhdGVyVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRXYXRlcndheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtb2RhbC1QaWdneWJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuVHJhaWxlckxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZ2FpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyaXRpbWVUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5SW50cmF0aGVhdGVyQWlybGlmdFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5T2ZmaWNpYWxNYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlVW5rbm93biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yLUJ1bGtDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3Rvci1Db21tb25DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3Rvci1GbGF0YmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3Rvci1QYWNrYWdlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3ItVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdXRpbW9kYWxUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbkNvbmZlcmVuY2VDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2Vhbk5vbi1Db25mZXJlbmNlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyY2VsUG9zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xlZEFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbGVkUGlnZ3liYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sZWRSYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sZWRUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbFRvUG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVQYXJjZWxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWlja3RyYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFPckFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQWdlbnQtVHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhY2tUcmFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RlYW1zaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllclRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3dhd2F5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlck9yUGlwZWxpbmVJbnRlcm1vZGFsTW92ZW1lbnQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zcG9ydE1lYW5zIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRNZWFuc0NvZGVkIiB0eXBlPSJUcmFuc3BvcnRNZWFuc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydE1lYW5zQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0TWVhbnMiIHR5cGU9IlRyYW5zcG9ydE1lYW5zIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zcG9ydE1lYW5zQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIwRnRJTENvbnRhaW5lci1DbG9zZWRUb3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIwRnRJTENvbnRhaW5lci1PcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MEZ0SUxDb250YWluZXItT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDBGdElMQ29udGFpbmVyLUNsb3NlZFRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyY3JhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckZyZWlnaHQtQnJlYWtCdWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJSaWRlVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2VDaGVtaWNhbFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2VPcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhckZ1bGx5RW5jbG9zZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyRnVsbHlPcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhclNjcmVlbmVkLU5vUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1XaXRoUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9naWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyQ3VzaGlvblVuZGVyRnJhbWVPRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLURhbWFnZUZyZWVFcXVpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLUluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLUludGVyaW9yQnVsa2hlYWRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrdHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtUcnVja0FuZEJ1bGtUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrVHJ1Y2tBbmRFeHRlbmRhYmxlR29uZG9sYVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtUcnVja0FuZEV4dGVuZGFibGVUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrVHJ1Y2tBbmRHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa1RydWNrQW5kVGFua1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtUcnVja0FuZFRyYWlsZXJXaXRoT3BlbmluZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhYm9vc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29BbmRQYXNzZW5nZXJWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcldpdGhDYXJhdmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW1lbnRWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXMtR29vc2VuZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZENvbnRhaW5lci1Db250cm9sbGVkVGVtcGVyYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hbFZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hc3RlckNoZW1pY2FsVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2lsLUNhckNvdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvaWxDYXJPcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1BbHVtaW51bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUJ1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1DbG9zZWRUb3AtTGVuZ3RoVW5zcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1IZWF0ZWRPckluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUhpZ2hTaWRlT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUxvd1NpZGVPcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJPbmx5VmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItT3Blbi1TaWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLU9wZW5Ub3AtTGVuZ3RoVW5zcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1QbGF0Zm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVycmVzdGluZ29uYUNoYXNzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1TdGVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rQ2hlbWljYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFua0Zvb2RHcmFkZS1MaXF1aWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rR2FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVXBncmFkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1WZW50ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcndpdGhCYWdIYW5nZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJ3aXRoRmxvb3JTZWN1cmluZ1JpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJ3aXRoRmx1c2hEb29ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyd2l0aEhhbmdhckJhcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhTbW9vdGhTaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aFdhdnlPclJpcHBsZVNpZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkVGVtcGVyYXR1cmVUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJlZEJhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcnVkZU9pbFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJEZXRlcm1pbmVkRGVhbnNPZlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJSYWlsVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXQtSW5IZWxwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZXBTZWFDaGVtaWNhbFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG91YmxlLURyb3BUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wQmFja1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyeUJ1bGtDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRvZlRyYWluRGV2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlcHRpb25hbFRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVycnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpc2hpbmdWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkLVJhY2tEb3VibGVEcm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRSYWNrLUZsYXRCZWRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFJhY2stU2luZ2xlRHJvcFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRiZWRTbGlkaW5nVGFuZGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXItUmVtb3ZhYmxlU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyd2l0aEhlYWRib2FyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyd2l0aE5vSGVhZGJvYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdENhci1FbmRCdWxraGVhZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRjYXJXaXRoUGVkZXN0YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWV6ZXJUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZXplclRydWNrQW5kSXNvdGhlcm1pY1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWV6ZXJUcnVja0FuZFJlZnJpZ2VyYXRlZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWV6ZXJUcnVja0FuZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWV6ZXJWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb3plbkZvb2RUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdXJuaXR1cmVUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQ2FyZ29WZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYXRvclNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29uZG9sYUNhci1Db3ZlcmVkSW50ZXJpb3JCdWxraGVhZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvbmRvbGFDYXItT3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29uZG9sYUNvdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluY2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhdmVsVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYWxmSGVpZ2h0RmxhdFJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWQtRW5kSGVscGVyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZG9mVHJhaW5EZXZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hDdWJlVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3BwZXJDYXItQ292ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9wcGVyQ2FyLUNvdmVyZWRQbmV1bWF0aWNEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcHBlckNhci1PcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIeWRyYW50Q2FydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRsZXJDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzb3RoZXJtaWNUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNvdGhlcm1pY1RydWNrQW5kRnJlZXplclRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzb3RoZXJtaWNUcnVja0FuZElzb3RoZXJtaWNUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc290aGVybWljdHJ1Y2thbmRyZWZyaWdlcmF0ZWR0cmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc290aGVybWljVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1ZWZpZWROYXR1cmFsR2FzQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWVmaWVkUGV0cm9sZXVtR2FzQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZE9yVW5sb2FkRGV2aWNlT25FcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY29tb3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxQcm9kdWN0c1RhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3Blbi1Ub3BPckZsYXRCZWRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuVG9wVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmVDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzZW5nZXJWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdHJvbFZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljay1VcFRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG93ZXJQYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0ZWRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsQnVsa0NhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbEV4cHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkTWFpbnRlbmFuY2VPZldheUNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFNpbG9UYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxUYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXItRW5kSGVscGVyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUcnVja0FuZEZyZWV6ZXJUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUcnVja0FuZElzb3RoZXJtaWNUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUcnVja0FuZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3ZhYmxlU2lkZVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW92YWxUcnVja0FuZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ2lkVHJ1Y2tXaXRoVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnaWRUcnVja1dpdGhUYW5rQW5kQnVsa1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ2lkVHJ1Y2tXaXRoVGFua0FuZFRhbmtUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkUmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkU2lsb1RhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sbE9uLVJvbGxPZmZWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZGRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyRGV0ZXJtaW5lZE1lYW5zT2ZUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBUYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZS1Ecm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhY2tDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUQUstUkFLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGVlbFByb2R1Y3RzVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXIyNVRvbm5lV2l0aDkwQ3ViaWNNZXRlclRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja0FuZEV4dGVuZGFibGVHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tBbmRFeHRlbmRhYmxlVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tBbmRHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tBbmRSZW1vdmFsVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tBbmRUcmFpbGVyV2l0aE9wZW5pbmdGbG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZkFuZEV4dGVuZGFibGVHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZkFuZEV4dGVuZGFibGVUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja1dpdGhSZW1vdmFibGVSb29mQW5kR29uZG9sYVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrV2l0aFJlbW92YWJsZVJvb2ZBbmRSZW1vdmFsVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZmFuZFRyYWlsZXJXaXRoT3BlbmluZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlc2NvcGluZ1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWJlck9yTG9nQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlwLVVwQXJ0aWN1bGF0ZWRUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlwLVVwdHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpcC1VcFRydWNrQW5kRXh0ZW5kYWJsZUdvbmRvbGFUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXAtVXBUcnVja0FuZEdvbmRvbGFUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXAtVXBUcnVja0FuZFRyYWlsZXJXaXRoT3BlbmluZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUJvYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLURyeUZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItRWxlY3RyaWNIZWF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUhlYXRlZE9ySW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1JbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItTm90T3RoZXJ3aXNlU3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVBuZXVtYXRpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1SZWZyaWdlcmF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItVGFuay1DaGVtaWNhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItVGFuay1Gb29kR3JhZGVMaXF1aWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItVGFuay1HYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluaW5nVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbldpdGgyME9yTW9yZVdhZ29ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5XaXRoTW9yZVRoYW5PbmVBbmRMZXNzVGhhbjIwV2Fnb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbldpdGhPbmVXYWdvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyMjBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1GdWxseUVuY2xvc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1Ob1Jvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLVdpdGhEb29yc05vUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtV2l0aFJvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja0FuZFRyYWlsZXJXaXRoT3BlbmluZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wSGlnaFNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLU9wZW5Ub3BMb3dTaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja09yVHJhaWxlcldpdGhUaWx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1WYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrV2l0aE9wZW5pbmdGbG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tXaXRoT3BlbmluZ0Zsb29yQW5kRXh0ZW5kYWJsZUdvbmRvbGFUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja1dpdGhPcGVuaW5nRmxvb3JBbmRFeHRlbmRhYmxlVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tXaXRoT3BlbmluZ0Zsb29yQW5kR29uZG9sYVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1Z2FuZE9yUHVzaGJvYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRMb2FkRGV2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbi1TcGVjaWFsSW5zaWRlTGVuZ3RoV2lkdGhPckhlaWdodFJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLUxha2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2VhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuLUNvbnRhaW5lcnNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2Vhbi1MYXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4tUm9sbE9uLVJvbGxPZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2RjaGlwY2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1Zlc3NlbCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTZXJ2aWNlTGV2ZWxDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa0NvbW1vZGl0eVRyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyZWVEYXlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5QU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckNhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJFY29ub215Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlQmlsbGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJpZXJFeHByZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cHJlc3NTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNjaGVkdWxlZE5leHREYXlCeUNhcnRhZ2VBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTY2hlZHVsZWRTZWNvbmREYXlCeUNhcnRhZ2VBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTY2hlZHVsZWRUaGlyZERheUJ5Q2FydGFnZUFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUNvbmZpcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyZWRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUNvbmZpcm1hdGlvblJldHVybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9vclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Tm90aWZpY2F0aW9uT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvb2ZPZkRlbGl2ZXJ5V2l0aFNpZ25hdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHByZXNzU2VydmljZVBsdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNraW5nR3JvdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRTZXJ2aWNlV29ybGR3aWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHByZXNzU2VydmljZVdvcmxkd2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0cm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpd2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0RGF5QWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0RmxpZ2h0T3V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0RGF5SHVuZHJlZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dE1vcm5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFNlcnZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3Zlcm5pZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U2VydmljZUFyZWFOZXh0RGF5QnkxMDMwQU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5TWFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVNlcnZpY2VBcmVhTmV4dERheUJ5OTMwQU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5TWFpbEluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U2VydmljZUFyZWFOZXh0RGF5QnlOb29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQT0JveFppcENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlTZXJ2aWNlQXJlYU5leHREYXlCeTUwMFBNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U2VydmljZUFyZWFTZWNvbmREYXlCeU5vb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3NlbmdlclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlJbnRlcm1vZGFsSGlnaFNwZWVkNzBNaWxlc1BlckhvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVySW50ZXJtb2RhbEFuZFN0YWNrU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjBNaWxlc1BlckhvdXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5pZmVzdEZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1c1RyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVHJhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11dGVyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFJldHVyblNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbWVEYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZERheUFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJkYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZERheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRHcm91bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZERheUh1bmRyZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkR3JvdW5kSHVuZHJlZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kTW9ybmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJkYXlQaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkQ2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hTcGVlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ybWFsU3BlZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RTZXJ2aWNlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zcG9ydExlZ0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0VGhlU3RhdGlzdGljYWxUZXJyaXRvcnlMaW1pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLUNhcnJpYWdlVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdEJvcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXREZXBhcnR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1Gb3VydGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtRmlmdGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtU2l4dGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtU2V2ZW50aENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1FaWdodGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluLUNhcnJpYWdlVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtRmlyc3RDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlDYXJyaWFnZS1TZWNvbmRDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtVGhpcmRDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRXYXRlcndheVRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlDYXJyaWVyQWxsVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRQcmUtQ2FycmlhZ2VUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1BY2NlcHRhbmNlVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRPbi1DYXJyaWFnZVRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLU5pbnRoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT24tQ2FycmlhZ2VUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1UZW50aENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1FbGV2ZW50aENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1Ud2VsZnRoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMXN0Q2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMm5kQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM3JkQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNHRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNXRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNnRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iN3RoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOHRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOXRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRzUm91dGluZ09yaWdpbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbkRlbGl2ZXJ5Q2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVMWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF1bGFnZVJpZ2h0c0NhcnJpZXJBbmRKdW5jdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luU3dpdGNoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF1bGFnZU1vdmVtZW50Q2FycmllckFuZEp1bmN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5DYXJyaWVyQWlyTW90b3JPck9jZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5DYXJyaWVyUnVsZTExU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzUm91dGluZ09yaWdpbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZVN3aXRjaENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RDYXJyaWVySW5Sb3V0ZU9uUmV0dXJuUm91dGVNb3ZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdW5jdGlvblNldHRsZW1lbnRDYXJyaWVyRm9sbG93aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdW5jdGlvblNldHRsZW1lbnRDYXJyaWVyUHJlZGVjZXNzb3IiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlRyYW5zcG9ydEVxdWlwbWVudCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iVHJhbnNwb3J0RXF1aXBtZW50Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZUcmFuc3BvcnRFcXVpcG1lbnQiIHR5cGU9Ikxpc3RPZlRyYW5zcG9ydEVxdWlwbWVudCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNwb3J0RXF1aXBtZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudFByb3ZpZGVyQ29kZWQiIHR5cGU9IkVxdWlwbWVudFByb3ZpZGVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBtZW50UHJvdmlkZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRPd25lckNvZGVkIiB0eXBlPSJFcXVpcG1lbnRPd25lckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudE93bmVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVxdWlwbWVudElEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRTaXplVHlwZUNvZGVkIiB0eXBlPSJFcXVpcG1lbnRTaXplVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwZW1lbnRTaXplVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudFN0YXR1c0NvZGVkIiB0eXBlPSJFcXVpcG1lbnRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRTdGF0dXNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGdWxsSW5kaWNhdG9yQ29kZWQiIHR5cGU9IkZ1bGxJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGdWxsSW5kaWNhdG9yQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDb25kaXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnROb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlNlYWxJbmZvIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaXN0T2ZFcXVpcG1lbnRNZWFzdXJlbWVudHMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZEaW1lbnNpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0RXF1aXBtZW50IiB0eXBlPSJUcmFuc3BvcnRFcXVpcG1lbnQiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRXF1aXBtZW50UHJvdmlkZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlclN1cHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyU3VwcGxpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRvclN1cHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNvbnNvbGlkYXRvclN1cHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5U3VwcGxpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlclN1cHBsaWVkRnJvbUFMZWFzaW5nQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyU3VwcGxpZWRGcm9tVGhlUmFpbHdheXNQb29sIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkVxdWlwbWVudE93bmVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEN1c3RvbWVyT3duZWRPckxlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyT3duZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyT3duZWRPckxlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpcExlYXNlZCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJFcXVpcG1lbnRTaXplVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMEZ0SWxDb250YWluZXItQ2xvc2VkVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMEZ0SWxDb250YWluZXItT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDBGdElsQ29udGFpbmVyLUNsb3NlZFRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDBGdElsQ29udGFpbmVyLU9wZW5Ub3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmNyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJGcmVpZ2h0LUJyZWFrQnVsayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyUmlkZVZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlT3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJGdWxseUVuY2xvc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhckZ1bGx5T3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1Ob1Jvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyU2NyZWVuZWRXaXRoUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9naWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyQ3VzaGlvblVuZGVyRnJhbWVPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLURhbWFnZUZyZWVFcXVpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLUluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLUludGVyaW9yQnVsa2hlYWRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhYm9vc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXMtR29vc2VuZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZENvbnRhaW5lci1Db250cm9sbGVkVGVtcGVyYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29pbC1DYXJDb3ZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2lsQ2FyT3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItQWx1bWludW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1CdWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItQ2xvc2VkVG9wLUxlbmd0aFVuc3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItSGVhdGVkT3JJbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1IaWdoU2lkZU9wZW5Ub3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckljMjBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJJYzMwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVySWM0MEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1JbnN1bGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1JbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1Mb3dTaWRlT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLU9wZW4tU2lkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1PcGVuVG9wLUxlbmd0aFVuc3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItUGxhdGZvcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclJlc3RpbmdPbkFDaGFzc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItU3RlZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFuay1DaGVtaWNhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rLUZvb2RHcmFkZS1MaXF1aWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rLUdhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVVwZ3JhZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVmVudGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoQmFnSGFuZ2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aEZsb29yU2VjdXJpbmdSaW5ncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aEZsdXNoRG9vcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhIYW5nYXJCYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoU21vb3RoU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhXYXZ5T3JSaXBwbGVTaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZFRlbXBlcmF0dXJlVHJhaWxlci1SZWVmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmVkQmFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1dC1JbkhlbHBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGltZUNvYXRlZFRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvdWJsZS1Ecm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcEJhY2tUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWFsVHJhaWxlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZE9mVHJhaW5EZXZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVwb3h5Q29hdGVkVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyb1BhbGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaGFuZ2VhYmxlUGFsbGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZC1SYWNrLURvdWJsZURyb3BUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZC1SYWNrLUZsYXQtQmVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWQtUmFjay1TaW5nbGUtRHJvcFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRiZWRTbGlkaW5nVGFuZGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXItUmVtb3ZhYmxlU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyV2l0aEhlYWRib2FyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyV2l0aE5vSGVhZGJvYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdENhci1FbmRCdWxraGVhZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRjYXJXaXRoUGVkZXN0YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb3plbkZvb2RUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmF0b3JTZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvbmRvbGFDYXItQ292ZXJlZC1JbnRlcmlvckJ1bGtoZWFkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29uZG9sYUNhci1PcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb25kb2xhQ292ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFsZkhlaWdodEZsYXRSYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkLUVuZEhlbHBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRPZlRyYWluRGV2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoQ3ViZVZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9wcGVyQ2FyLUNvdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcHBlckNhci1Db3ZlcmVkLVBuZXVtYXRpY0Rpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9wcGVyQ2FyLU9wZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh5ZHJhbnQtQ2FydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRsZXJDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklNTzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklNTzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklNTzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRPclVubG9hZERldmljZU9uRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NvbW90aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZhYmxlQ2FzZS1CZXR3ZWVuMTAuOTBNQW5kMTMuNzVNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZhYmxlQ2FzZS1CZXR3ZWVuNi4xNU1BbmQ3LjgyTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92YWJsZUNhc2UtQmV0d2VlbjcuODJNQW5kOS4xNU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmFibGVDYXNlLUJldHdlZW45LjE1TUFuZDEwLjkwTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92YWJsZUNhc2UtTGVzc1RoYW42LjE1TSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ud29ya2luZ1JlZWZlckNvbnRhaW5lcjIwRnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbndvcmtpbmdSZWVmZXJDb250YWluZXI0MEZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25Xb3JraW5nUmVmcmlnZXJhdGVkT3JSZWVmZXJDb250YWluZXIzMEZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhblZlc3NlbC1CcmVha0J1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW4tVG9wT3JGbGF0YmVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlblRvcFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljay1VcFRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3dlclBhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNzdXJpemVkVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVjdGVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHJvYWRNYWludGVuYW5jZU9mV2F5Q2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyLUVuZEhlbHBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkT3JSZWVmZXJDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbmsyMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbmszMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbms0MEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbmtJYzIwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVGFua0ljNDBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdmFibGVTaWRlVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FkZGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2FuZGluYXZpYW5QYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbWktUmVmcmlnZXJhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW1pLVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZS1Ecm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhY2tDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWlubGVzc1N0ZWVsVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Rhay1SYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXIyMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXIzMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXI0MEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXJJYzIwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NvbnRhaW5lckljMzBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ29udGFpbmVySWM0MEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVzY29waW5nVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVDb250cm9sbGVkQ29udGFpbmVyMjBGdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVDb250cm9sbGVkQ29udGFpbmVyMzBGdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVDb250cm9sbGVkQ29udGFpbmVyNDBGdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90ZWJpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1Cb2F0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1EcnlGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUVsZWN0cmljSGVhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1IZWF0ZWRPckluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1JbnN1bGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItSW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLU5vdE90aGVyd2lzZVNwZWNpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1QbmV1bWF0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItUmVmcmlnZXJhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVRhbmstQ2hlbWljYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVRhbmstRm9vZEdyYWRlLUxpcXVpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1UYW5rLUdhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyMjBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1GdWxseUVuY2xvc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1Ob1Jvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLVdpdGhEb29ycy1Ob1Jvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLVdpdGhSb29mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wSGlnaFNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLU9wZW5Ub3BMb3dTaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1WYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRMb2FkRGV2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYW4tU3BlY2lhbEluc2lkZUxlbmd0aC1XaWR0aE9ySGVpZ2h0UmVxdWlyZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtTGFrZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4tQ29udGFpbmVyc2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuLUxhc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2Vhbi1Sb2xsb24tUm9sbG9mZiIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJFcXVpcG1lbnRTdGF0dXNDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZW50YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1haW5PbkJvYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlmdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3J0bGFuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVybGFuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zaXRpb25pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbG9hZGVyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkZ1bGxJbmRpY2F0b3JDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWwiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbmRpdGlvbnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVmcmlnZXJhdGlvbk9uIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVzaWR1ZSIgdHlwZT0ieGNibEJvb2xlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikxpc3RPZkNvbmRpdGlvbnMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZEaW1lbnNpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29uZGl0aW9ucyIgdHlwZT0iQ29uZGl0aW9ucyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRGltZW5zaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJEaW1lbnNpb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkRpbWVuc2lvbiIgdHlwZT0iTGlzdE9mRGltZW5zaW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaW1lbnNpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEaW1lbnNpb25Db2RlZCIgdHlwZT0iRGltZW5zaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGltZW5zaW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGltZW5zaW9uIiB0eXBlPSJEaW1lbnNpb24iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1lYXN1cmVtZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1lYXN1cmVtZW50VmFsdWUiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNZWFzdXJlbWVudFJhbmdlIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJVbml0T2ZNZWFzdXJlbWVudCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWVhc3VyZW1lbnQiIHR5cGU9Ik1lYXN1cmVtZW50Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZWFzdXJlbWVudFZhbHVlIj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkIiB0eXBlPSJTaWduaWZpY2FuY2VDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZCIgdHlwZT0iQ29uZGl0aW9uc0NvZGUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNZWFzdXJlbWVudFZhbHVlIiB0eXBlPSJNZWFzdXJlbWVudFZhbHVlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3hpbWF0ZWx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVhbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmVhdGVyVGhhbk9yRXF1YWxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JlYXRlclRoYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzVGhhbk9yRXF1YWxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90RXF1YWxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWVWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JzZXJ2ZWRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0T2ZSYW5nZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDb25kaXRpb25zQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoZXJlQWlyRXF1YWxzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlcmVCdXR5bEFjZXRhdGVFcXVhbHMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGVyZUgyT0VxdWFsczFPcldhdGVyRXF1YWxzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkVG82MERlZ3JlZXNGYWhyZW5oZWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGVyZVRvbHVlbmVFcXVhbHMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXBvckluQWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXBvckluT3RoZXJUaGFuQWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFRlbXBlcmF0dXJlQW5kUHJlc3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbnNPdGhlclRoYW5TdGFuZGFyZFRlbXBlcmF0dXJlQW5kUHJlc3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluRXRoeWxBbGNvaG9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbkV0aHlsRXRoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluV2F0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0MUF0bW9zcGhlcmVQcmVzc3VyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlcmVFdGhlckVxdWFsczEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZGljdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXItRHJpZWRCYXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXMtUmVjZWl2ZWRCYXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ5QmFzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlsaWJyaXVtQmFzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vaXN0dXJlQW5kQXNoLUZyZWVCYXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3hpZGl6aW5nQXRtb3NwaGVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkdWNpbmdBdG1vc3BoZXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2FsZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGNoZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyYXRlZFZhcG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmNvbmRpdGlvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9ydC1UZXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lLVdlaWdodGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuY29ycmVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZQZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPblBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyR2FsbG9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWRvbWluYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZU93bmVkT3JDb3Jwb3JhdGVPd25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRlZE9yQmxvY2tlZFVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudExpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdFdoZW5Tb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc0lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc1JlcGFpcmVkT3JJbXByb3ZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFudGFuZW91cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dUb0dvb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1RvSGlnaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93VG9NZWRpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1RvTW9kZXJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaXVtVG9Hb29kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpdW1Ub0hpZ2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVyYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlcmF0ZVRvR29vZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZXJhdGVUb0hpZ2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVyYXRlVG9NZWRpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RUb0hpZ2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG9jYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jcmVhc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsaW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3RlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXJPbi1QZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXJNaWQtUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyT2ZmLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lclN1cGVyT24tUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyU3VwZXJPZmYtUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyT24tUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyTWlkLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlck9mZi1QZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXJTdXBlck9uLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlclN1cGVyT2ZmLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lckRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyTmlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlckRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyTmlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5pZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWFrLTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlYWstMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVhay00Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG91bGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uVGltZVJlbGF0ZWREZW1hbmQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1lYXN1cmVtZW50UmFuZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWluaW11bVZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNYXhpbXVtVmFsdWUiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik1lYXN1cmVtZW50UmFuZ2UiIHR5cGU9Ik1lYXN1cmVtZW50UmFuZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1pbmltdW1WYWx1ZSI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZCIgdHlwZT0iU2lnbmlmaWNhbmNlQ29kZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWQiIHR5cGU9IkNvbmRpdGlvbnNDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWluaW11bVZhbHVlIiB0eXBlPSJNaW5pbXVtVmFsdWUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1heGltdW1WYWx1ZSI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZCIgdHlwZT0iU2lnbmlmaWNhbmNlQ29kZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWQiIHR5cGU9IkNvbmRpdGlvbnNDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWF4aW11bVZhbHVlIiB0eXBlPSJNYXhpbXVtVmFsdWUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlVuaXRPZk1lYXN1cmVtZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJVT01Db2RlZCIgdHlwZT0iVU9NQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVU9NQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVW5pdE9mTWVhc3VyZW1lbnQiIHR5cGU9IlVuaXRPZk1lYXN1cmVtZW50Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlVPTUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjE2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjE5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjI4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQ4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjUzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjU3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjYwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjYzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjY5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI3MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjczIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI3NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijc3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI3OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iODAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjgxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI4NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iODUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijg2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI4NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iODkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijk2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMkYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIySCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIySyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMlUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMlgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM0IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM0YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0QiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0RyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0SiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0TSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0UCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNFEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0VCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0WCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1QyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1RyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1SiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1USIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTExIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTE0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTE3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTIyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTI4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTMyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTM1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTM4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNDMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNDciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTUwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTUzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTU2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTYxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTY0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTY3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTcxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTc1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTc4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNzkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTgyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTg1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTg4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE5MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE5NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTk2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE5OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU1IIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUFoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVJFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIxMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIxNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjE2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjIyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjI4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjMzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMzQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjM2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMzciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjM5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQ2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjUwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjUzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjU2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjU5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjYwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjYzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjY2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjcxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjc0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjc3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI4MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjgzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCODQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI4NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjg2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCODciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI4OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjg5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjkwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjk2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjk5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJGVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJJTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkxEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlFMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlRVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlVBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVUkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQloiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzEwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzE2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzE5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzI3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzM0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzM4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMzkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQ4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzUyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzU1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzU4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzYyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzY1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzY4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM3MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzcyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM3NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzc2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNzciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM3OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzgxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzg0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzg3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzk0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzk3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNDVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNETCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0dNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0oiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDS0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNMVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ01LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNNVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ05QIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDV0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNXSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDEwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQxMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDE0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQxNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDE4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDIyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDI4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQzMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQzNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDM1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMzciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQzOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDM5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQ4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDUyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDU1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDU4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ2MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDY0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ2NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDY3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDcyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDc1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDc5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDgwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEODEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDgzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEODUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDg3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEODgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDk0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDk3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJETFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRNSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRE1RIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJETVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkROIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJETyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFBDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRQVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRSSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFROIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFdUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRaTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFpQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkU0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkY5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGQUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZPVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlRLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGVFEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikc1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdGSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdHUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdJSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0oiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0xEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdMTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdSTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1JPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdXSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhCQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEJYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEdNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhJVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJITCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSExUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJITSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSE1RIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJITVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJITyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhQQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVFoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhVUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5RIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkoyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkszIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0JBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0VMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktHTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0dTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLSFoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0pPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktNSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS01LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktOSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS05TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktQSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1BPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1NEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLU0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktUTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1VSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLVkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktWUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1ZUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1dIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLV1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxCUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEJUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMRUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMUEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFROIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxVTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFVYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik0wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik00Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik05Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUFMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1BVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1CRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUJGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQ1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUdNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUhaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUlLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1JTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUlPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1MVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU1LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1NVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU9OIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1RIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1RUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVNLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVRLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVFEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1UUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVRTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVdIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1aIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik4zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkJCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkNMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5FVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5HIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5JVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTUkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5NUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5QTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlBSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5RIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlRUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5YIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ITSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9OWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1pBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPWkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlAzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlA2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlA5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEFMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBHTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBURCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFRJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlEyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRVEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFUSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUVRMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRVFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlI2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJQTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlBTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUzQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlM1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUzciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlM4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0FOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQ08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNDUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNIVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNNSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1NUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQ2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJURiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE5FIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFBSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFFEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFNEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUU0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlUyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZMVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVlEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ilc0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldDRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldFQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0VFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldIUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1NEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXVFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWURLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZRFEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZUkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlozIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ilo2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWlAiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGltZW5zaW9uQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdE5ldFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdEdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE5ldFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxHcm9zc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbUdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXROZXRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVW5pdHNQZXJQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhdENvbnRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NUb25uYWdlT2ZUaGVWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFRvbm5hZ2VPZlRoZVZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSHVtaWRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvd2VyQ29uc3VtcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXREaXNzaXBhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRmxvdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvY2tJbXBhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGl2ZVRlbXBlcmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25PcGVyYXRpdmVUZW1wZXJhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJDb250ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5zaWxlU3RyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWJyb3NpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdWdlTGVuZ3RoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmFpZ2h0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1XZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodE9mQ29udmV5YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmV5YW5jZVN1bW1lckRlYWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcml6ZWRDYXJnb09uVmVzc2Vsc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUNvbnRhaW5lcml6ZWRDYXJnb09uVmVzc2Vsc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0QXNjZXJ0YWluZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbE92ZXJhbGxMZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmdNZXRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQXhsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0UG9zaXRpb25JblRoZUxlbmd0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kUG9zaXRpb25JblRoZUxlbmd0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRQb3NpdGlvbkluVGhlV2lkdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFBvc2l0aW9uSW5UaGVXaWR0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRQb3NpdGlvbkluVGhlVGhpY2tuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRQb3NpdGlvbkluVGhlVGhpY2tuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb250YWluZXJBY3R1YWxGaWxsaW5nV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb250YWluZXJNYXhpbXVtQ2FwYWNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmVkTmV0V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nSGVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFja2luZ0hlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY3VsYXRlZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVycml0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wdXJpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluU2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFudGhhbmlkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsYXN0aWNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWluZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhbGxpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cm9udGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50U3RvcmFnZUxpbWl0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvYWN0aXZlSW5kZXhPZlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9hY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZUdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkRHJhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmdGVyRHJhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudEdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFRyYW5zcG9ydEVxdWlwbWVudEdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2lkaXR5T2ZKdWljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuZXRyb21ldHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXJvZmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWljZVdlaWdodFBlcjEwMEdyYW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcnVpdFNraW5Db2xvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuZ2xlT2ZCZW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZEluY3JlbWVudGFsTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cm9mZWxEMTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cm9mZWxEMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cm9mZWxENTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1TdGFja2luZ1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NNZWFzdXJlQ3ViZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudGFnZUZhdENvbnRlbnRJbkRyeU1hdHRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FjY2hhcm9tZXRyaWNDb250ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIeWRyYXRlQ29udGVudE9mQW5BbGNvaG9saWNQcm9kdWN0QWZ0ZXJCb3R0bGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5oeWRyb3VzQ29udGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVkV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFraW5nTG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGludW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbHZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZVdhdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5QZXRyb2xldW1JbnN0aXR1dGVHcmF2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Hcm9zc09ic2VydmVkVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Hcm9zc1N0YW5kYXJkVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtTmV0U3RhbmRhcmRWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsT24tQm9hcmRRdWFudGl0eS1BZnRlckRpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtVG90YWxDYWxjdWxhdGVkVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Ub3RhbE9ic2VydmVkVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbm5hZ2VHYXVnZURpc3RhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1OZXRTdGFuZGFyZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VkaW1lbnRBbmRXYXRlckluUGV0cm9sZXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYnNlcnZlZFJlZmVyZW5jZUhlaWdodC1UYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VIZWlnaHQtVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWxsYWdlR2F1Z2VEaXN0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbUNvcnJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvd1RvQnJpZGdlRGlzdGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyaWdodG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYWtlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFraW5nU3RyZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFraW5nU3RyZW5ndGhXZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2lzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbG91ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGVudHNPZlBhY2thZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcmVMZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uV2VpZ2h0QWdyZWVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFtZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsdGFWYWx1ZUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcHRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW5pZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RhbmNlQmV0d2VlblBvaW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lkdGgtQm94Y2FyRG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkTmV3V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbG9uZ2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZpY2l0V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxhbWVudENvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25naXR1ZGluYWxGbGF0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zdmVyc2VGbGF0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1dlaWdodC1NYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJkbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVpZ2h0LU1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlaWdodERpbWVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wYWN0RW5lcmd5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGVEaWFtZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlbmd0aC1NYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5ndGhEaW1lbnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1XZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vaXN0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxOZXRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVEaWFtZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlU3RyZXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyVG9ubmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlSHVtaWRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lzdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2Nrd2VsbEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYW1XZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZHVjdGlvbk9mQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVuLVByb2Nlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGlvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBlcmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlja25lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodFBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlaWdodC1WYW5Eb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWR0aC1WYW5Eb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRQZXJVbml0T2ZBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWR0aERpbWVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lkdGgtTWF4aW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRQZXJVbml0T2ZMZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZGVIZWlnaHQtRmxhdEJlZFdpdGhSZW1vdmFibGVTaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNxdWFyZW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb29sU2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWllbGRTdHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdW1pbml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJzZW5pYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9yb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpc211dGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmJvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY2l1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sdW1iaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNobG9yaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2JhbHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNocm9taXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3BwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklyb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklyb25QbHVzU2lsaWNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VybWFuaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIeWRyb2dlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG90YXNzaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWduZXNpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmdhbmVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9seWJkZW51bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTml0cm9nZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvZGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmlvYml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmlja2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeHlnZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBob3NwaG9ydXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bHBodXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGltb255Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxlbml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lsaWNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lsaWNpdW1PeHlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbnRhbGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsbHVyaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRhbml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFuYWRpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1bmdzdGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXN0ZUNvbnRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlppbmMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlppcmNvbml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZVRlbXBlcmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRUZW1wZXJhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29PcGVyYXRpbmdUZW1wZXJhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RW1lcmdlbmN5VGVtcGVyYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENvbnRyb2xUZW1wZXJhdHVyZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU2VhbEluZm8iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlNlYWxJbmZvIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTZWFsSW5mbyIgdHlwZT0iTGlzdE9mU2VhbEluZm8iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNlYWxJbmZvIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWFsTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlNlYWxJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iU2VhbFN0YXR1c0Rlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWFsSW5mbyIgdHlwZT0iU2VhbEluZm8iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNlYWxJc3N1ZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNlYWxJc3N1ZXJDb2RlZCIgdHlwZT0iU2VhbElzc3VlckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlYWxJc3N1ZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWFsSXNzdWVyIiB0eXBlPSJTZWFsSXNzdWVyIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNlYWxJc3N1ZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmtub3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFyYW50aW5lQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbE9wZXJhdG9yIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTZWFsU3RhdHVzRGVzY3JpcHRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VhbFN0YXR1c0NvZGVkIiB0eXBlPSJTZWFsU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VhbFN0YXR1c0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlYWxTdGF0dXNJbmZvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWFsU3RhdHVzRGVzY3JpcHRpb24iIHR5cGU9IlNlYWxTdGF0dXNEZXNjcmlwdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTZWFsU3RhdHVzQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5SaWdodENvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZUVsZWN0cm9uaWNTZWFsSXNGYXVsdHkiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zaXREaXJlY3Rpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zaXREaXJlY3Rpb25Db2RlZCIgdHlwZT0iVHJhbnNpdERpcmVjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zaXREaXJlY3Rpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc2l0VGltZVF1YWxpZmllckNvZGVkIiB0eXBlPSJUcmFuc2l0VGltZVF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zaXRUaW1lUXVhbGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNpdFRpbWUiIHR5cGU9InhzZDpkZWNpbWFsIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc2l0RGlyZWN0aW9uIiB0eXBlPSJUcmFuc2l0RGlyZWN0aW9uIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zaXREaXJlY3Rpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJUb1NlbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyVG9CdXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvclRvU2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJUb0Ryb3BTaGlwRGVzaWduYXRlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJUb0ZyZWlnaHRGb3J3YXJkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlclRvU3ViY29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90aGVyVmVzc2VsVG9MaWdodGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWdodGVyVG9Nb3RoZXJWZXNzZWwiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVHJhbnNpdFRpbWVRdWFsaWZpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlySG91cnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckRheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGVuZGFyRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsZW5kYXJXZWVrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlSG91cnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtpbmdEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1RGF5V29ya1dlZWsiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlcm1zT2ZEZWxpdmVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGVybXNPZkRlbGl2ZXJ5RnVuY3Rpb25Db2RlZCIgdHlwZT0iVGVybXNPZkRlbGl2ZXJ5RnVuY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUZXJtc09mRGVsaXZlcnlGdW5jdGlvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydFRlcm1zQ29kZWQiIHR5cGU9IlRyYW5zcG9ydFRlcm1zQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0VGVybXNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2hpcG1lbnRNZXRob2RPZlBheW1lbnRDb2RlZCIgdHlwZT0iU2hpcG1lbnRNZXRob2RPZlBheW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwbWVudE1ldGhvZE9mUGF5bWVudENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRlcm1zT2ZEZWxpdmVyeURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnREZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmlza09mTG9zc0NvZGVkIiB0eXBlPSJSaXNrT2ZMb3NzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmlza09mTG9zc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJpc2tPZkxvc3NEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGVybXNPZkRlbGl2ZXJ5IiB0eXBlPSJUZXJtc09mRGVsaXZlcnkiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGVybXNPZkRlbGl2ZXJ5RnVuY3Rpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoQ29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZWFuZERlc3BhdGNoQ29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0ZWRCeUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Q29uZGl0aW9uIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zcG9ydFRlcm1zQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4LVdvcmtzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlLUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVBbG9uZ3NpZGVTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlT25Cb2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdEFuZEZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3QtSW5zdXJhbmNlQW5kRnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmlhZ2VQYWlkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpYWdlLUluc3VyYW5jZVBhaWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkQXRGcm9udGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkRXgtU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkRXgtUXVheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkRHV0eVVucGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkRHV0eVBhaWQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2hpcG1lbnRNZXRob2RPZlBheW1lbnRDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZUNvbGxlY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VQcmVwYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoT25EZWxpdmVyeVNlcnZpY2VDaGFyZ2VQYWlkQnlDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hPbkRlbGl2ZXJ5U2VydmljZUNoYXJnZVBhaWRCeUNvbnNpZ25vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdEZyZWlnaHRDcmVkaXRlZFRvUGF5bWVudEN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0T25EZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJQaWNrLVVwT3JCYWNraGF1bCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmaW5lZEJ5QnV5ZXJBbmRTZWxsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvYlBvcnRPZkNhbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbGZQcmVwYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbkNvcHktTm9QYXltZW50RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDb3N0c1BhaWRCeUNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ29zdHNQYWlkQnlDb25zaWdub3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1peGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25SZXZlbnVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RTcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRCeUJ1eWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkQnlTdXBwbGllck9yU2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlhYmxlRWxzZXdoZXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkQW5kU3VtbWFyeUJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRCdXRDaGFyZ2VkVG9DdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZEJ5UHJvY2Vzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkLUJ5U2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkTG9jYWxDb2xsZWN0T3V0c3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Db250YWluZXJGcmVpZ2h0RnJlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuQ29udGFpbmVyRnJlaWdodFBhaWRCeUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Db250YWluZXJGcmVpZ2h0UGFpZEJ5U3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1bGUxMVNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRnJlaWdodC1Ob0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVBheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0Q29uZGl0aW9uIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlJpc2tPZkxvc3NDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlza09mTG9zc0luVHJhbnNpdFRvRGVzdGluYXRpb25Jc0J1eWVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlza09mTG9zc0luVHJhbnNpdFRvRnJlaWdodEVxdWFsaXphdGlvblBvaW50SXNTZWxsZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaXNrT2ZMb3NzSW5UcmFuc2l0VG9Qb29sUG9pbnRJc1NlbGxlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpc2tPZkxvc3NJblRyYW5zaXRUb0Rlc3RpbmF0aW9uSXNTZWxsZXJzIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZQcmljZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUHJpY2UiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlByaWNlIiB0eXBlPSJMaXN0T2ZQcmljZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJpY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJQcmljaW5nVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iVW5pdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmljZUJhc2lzUXVhbnRpdHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYWxjdWxhdGVkUHJpY2VCYXNpc1F1YW50aXR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJWYWxpZGl0eURhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmljZVF1YW50aXR5UmFuZ2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlByaWNlTXVsdGlwbGllciIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJpY2UiIHR5cGU9IlByaWNlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmljaW5nVHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJpY2VUeXBlQ29kZWQiIHR5cGU9IlByaWNlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByaWNlVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlByaWNpbmdUeXBlIiB0eXBlPSJQcmljaW5nVHlwZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQcmljZVR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGF0aW9uUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlclRvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bU9yZGVyUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5nZURlcGVuZGVudFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVJbmdyZWRpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc0lzUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGN1bGF0aW9uTmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGlvbkdyb3NzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhJbmNsdWRlZEFsbG93YW5jZXNBbmRDaGFyZ2VzTm90SW5jbHVkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZVNlbGxpbmdQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25QcmljZVRheEluY2x1ZGVkRXhjbHVkaW5nQWxsb3dhbmNlc09yQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25QcmljZUV4Y2x1ZGluZ0FsbG93YW5jZXNPckNoYXJnZXNBbmRUYXhlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpdmVVbml0UHJpY2VDb21wb25lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VHZW5lcmljUHJvZHVjdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZVdob2xlc2FsZVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXI2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXI3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXI4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXI5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjEyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjE4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjI3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGlvblByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRhbG9nUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRyYWxEaXN0cmlidXRpb25GYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudERvbWVzdGljVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZWRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtZWRVbml0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmVkQ3VzdG9tc1VuaXRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhbGVyQWRqdXN0ZWRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JzUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50QW1vdW50QWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0U3RvcmVEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0U2hpcFByb2dyYW1QcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWNzY1ByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lEaXJlY3RTaGlwUHJpY2VPcmlnaW5hbEVxdWlwbWVudE1hbnVmYWN0dXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGlyZWN0U2hpcFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lEaXJlY3RTaGlwUHJpY2VTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGlyZWN0U2hpcFByaWNlV2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWN0ZWRVbml0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZXF1ZW50RGVsaXZlcnlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsRXhjaXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlR29vZHNQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFVwcGVyTGltaXRQcmljZU1heGltdW1BbGxvd2FibGVDb3N0UHJpY2luZ0ZvckRydWdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJtUHJpY2VEb05vdEFkdmlzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UHJpY2VUaHJvdWdoUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJpYWxQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25QcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRpb25hbFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlQmlsbGluZ1ByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmRhdG9yeVRvQWR2aXNlVW5pdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtQWN0aXZpdHlTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1PcmRlclF1YW50aXR5UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1PcmRlclF1YW50aXR5UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1SZWxlYXNlUXVhbnRpdHlQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVByaWNlUmVkdWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJzU3VnZ2VzdGVkUmV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtUmVsZWFzZVF1YW50aXR5UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjEwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjE2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjE5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjIyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjI4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldEl0ZW1QcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25hbFRvQWR2aXNlVW5pdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFB1cmNoYXNlT3JkZXJQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VCcmVha1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UHJpY2VCZWdpbm5pbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VCcmVha1B1cmNoYXNlT3JkZXJDb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VDYXRhbG9ndWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlckVhY2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlSW5FZmZlY3RBdFRpbWVPZlNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJLaWxvZ3JhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyTGl0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRGcmVpZ2h0Q2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvbmFsUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y2Vyc1ByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25hbFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJUb25uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWVkVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90ZVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VnZ2VzdGVkRGVhbGVyTmV0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Z2dlc3RlZEZsZWV0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBBbmREZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VnZ2VzdGVkTGlzdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVByaWNlRmFjdG9yc0VxdWFsaXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VnZ2VzdGVkUmV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1PZkxpbmVJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VnZ2VzdGVkV2hvbGVzYWxlUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvQmVOZWdvdGlhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJlc2hvbGRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbnZvaWNlQW1vdW50RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVkVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlb3JldGljYWxXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRDb3N0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWm9uZVByaWNlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJVbml0UHJpY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlVuaXRQcmljZVZhbHVlIiB0eXBlPSJEZWNpbWFsMjFfNiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDdXJyZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJVbml0T2ZNZWFzdXJlbWVudCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVW5pdFByaWNlIiB0eXBlPSJVbml0UHJpY2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlF1YW50aXR5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5VmFsdWUiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eVJhbmdlIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJVbml0T2ZNZWFzdXJlbWVudCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUXVhbnRpdHkiIHR5cGU9IlF1YW50aXR5Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJRdWFudGl0eVZhbHVlIj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkIiB0eXBlPSJTaWduaWZpY2FuY2VDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZCIgdHlwZT0iQ29uZGl0aW9uc0NvZGUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eVZhbHVlIiB0eXBlPSJRdWFudGl0eVZhbHVlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJRdWFudGl0eVJhbmdlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1pbmltdW1WYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWF4aW11bVZhbHVlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eVJhbmdlIiB0eXBlPSJRdWFudGl0eVJhbmdlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmljZU11bHRpcGxpZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlByaWNlTXVsdGlwbGllckNvZGVkIiB0eXBlPSJQcmljZU11bHRpcGxpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmljZU11bHRpcGxpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTXVsdGlwbGllciIgdHlwZT0ieHNkOmRlY2ltYWwiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlByaWNlTXVsdGlwbGllciIgdHlwZT0iUHJpY2VNdWx0aXBsaWVyIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlByaWNlTXVsdGlwbGllckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0TWFya3VwTXVsdGlwbGllci1PcmlnaW5hbENvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RNYXJrdXBNdWx0aXBsaWVyLVJldGFpbENvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50TXVsdGlwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdE1hcmt1cE11bHRpcGxpZXItV2hvbGVzYWxlQ29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudFNvbHV0aW9uTXVsdGlwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGluZ011bHRpcGxpZXIiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBheW1lbnRJbnN0cnVjdGlvbnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlBheW1lbnRUZXJtcyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlBheW1lbnRNZXRob2QiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBheW1lbnRJbnN0cnVjdGlvbnMiIHR5cGU9IlBheW1lbnRJbnN0cnVjdGlvbnMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBheW1lbnRUZXJtcyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGF5bWVudFRlcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkRpc2NvdW50cyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGF5bWVudFRlcm1zTm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGF5bWVudFRlcm1zIiB0eXBlPSJQYXltZW50VGVybXMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBheW1lbnRUZXJtIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXltZW50VGVybUNvZGVkIiB0eXBlPSJQYXltZW50VGVybUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBheW1lbnRUZXJtQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGF5bWVudFRlcm1WYWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGF5bWVudFRlcm1EZXRhaWxzIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iRGlzY291bnRzIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBheW1lbnRUZXJtIiB0eXBlPSJQYXltZW50VGVybSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQYXltZW50VGVybUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMERheXNBZnRlckVuZE9mTW9udGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlZFBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGljaXBhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlQnlBY2NlcHRhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVCeURlZmVycmVkUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlQnlOZWdvdGlhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlQnlOZWdvdGlhdGlvbkJ5TmFtZWRCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVCeU5lZ290aWF0aW9uV2l0aEFueUJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZUJ5TmVnb3RpYXRpb25XaXRoQW55QmFua2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVCeVNpZ2h0UGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua1RyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaWNDb21taXNzaW9uVGVybXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2ljRGlzY291bnRPZmZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZFeGNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbFRvQmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGF0aW9uT3B0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaEFnYWluc3REb2N1bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hCeVN0YXRlTGF3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoRGlzY291bnRUZXJtc0FwcGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNob25BZHZhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNob25BcnJpdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoT25EZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaFBlclZlbmRvclJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hXaXRoT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZENoZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZVBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEJhc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGx1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Q29udHJvbGxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0aW5nR2l2ZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVycmVkT3JJbnN0YWxsbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdFJlcXVpcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnROb3RBcHBsaWNhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudFdpdGhBZHZhbmNlUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnRXaXRoUHJvbXB0UGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudHNBZ2FpbnN0QWNjZXB0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRzQWdhaW5zdFBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRPZk1vbnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFzdFBheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZERhdGVMYXRlUGF5bWVudFBlbmFsdHlBcHBsaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbG1lbnRQYXltZW50c0FyZUR1ZUFubnVhbGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsbWVudFBheW1lbnRzQXJlRHVlTW9udGhseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbG1lbnRQYXltZW50c0FyZUR1ZVF1YXJ0ZXJseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbG1lbnRQYXltZW50c0FyZUR1ZVNlbWlBbm51YWxseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJDb21wYW55QWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJyZXZvY2FibGVMZXR0ZXJPZkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZVBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlQWdyZWVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZDcmVkaXRBdFNpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTHVtcFN1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWl4ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldE1vbnRoRm9sbG93aW5nSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblN0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RZZXREZWZpbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkQWdhaW5zdFN0YXRlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbEFkdmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRCeUluc3RhbG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRCeWluc3RhbG1lbnRzQWNjb3JkaW5nVG9Qcm9ncmVzc0FBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50QnlJbnN0YWxtZW50c0FjY29yZGluZ1RvUHJvZ3Jlc3NUQkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnREdWVVcG9uUmVjZWlwdE9mSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudE9yZGVyVGhyb3VnaEJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRUZXJtc0RlZmluZWRJbkNvbnNvbGlkYXRlZEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRVcG9uQ29tcGxldGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuYWx0eVRlcm1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c2x5QWdyZWVkVXBvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3Jlc3NQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNzb3J5Tm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21wdFBheW1lbnRBY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3hpbW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyZWRBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsQnlOb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJUb0FkdmlzZUJ1eWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUHJveGltbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJGbG9vclBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbm9yUGF5bWVudFRlcm1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtc05vdEFwcGxpY2FibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlQWNjZXB0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNGdW5kc1JlcXVpcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmtub3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2FuY2VCaWxsIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjb3VudHMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGlzY291bnRQZXJjZW50IiB0eXBlPSJEZWNpbWFsMTBfNCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGlzY291bnRBbW91bnQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNb25ldGFyeVZhbHVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRpc2NvdW50RGF5c0R1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGlzY291bnREdWVEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRpc2NvdW50RGF5T2ZNb250aCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGlzY291bnREYXRlVGltZVJlZkNvZGVkIiB0eXBlPSJEYXRlVGltZVJlZkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRpc2NvdW50RGF0ZVRpbWVSZWZDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOZXREYXlzRHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOZXREdWVEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik5ldERhdGVUaW1lUmVmQ29kZWQiIHR5cGU9IkRhdGVUaW1lUmVmQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTmV0RGF0ZVRpbWVSZWZDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEaXNjb3VudHMiIHR5cGU9IkRpc2NvdW50cyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTW9uZXRhcnlWYWx1ZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTW9uZXRhcnlBbW91bnQiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlJhdGVPZkV4Y2hhbmdlRGV0YWlsIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNb25ldGFyeVZhbHVlIiB0eXBlPSJNb25ldGFyeVZhbHVlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSYXRlT2ZFeGNoYW5nZURldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlQ3VycmVuY3kiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDdXJyZW5jeSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGFyZ2V0Q3VycmVuY3kiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDdXJyZW5jeSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmF0ZU9mRXhjaGFuZ2UiIHR5cGU9IkRlY2ltYWwxOV85Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJbnZlcnNlUmF0ZU9mRXhjaGFuZ2UiIHR5cGU9IkRlY2ltYWwxOV85Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEYXRlT2ZSYXRlT2ZFeGNoYW5nZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaXN0T2ZSYXRlT2ZFeGNoYW5nZVJlZmVyZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlJlZmVyZW5jZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSYXRlT2ZFeGNoYW5nZURldGFpbCIgdHlwZT0iUmF0ZU9mRXhjaGFuZ2VEZXRhaWwiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGVjaW1hbDE5XzkiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KLSAgICAgICAgICAgIDx4c2Q6dG90YWxEaWdpdHMgdmFsdWU9IjE5Ii8+Ci0gICAgICAgICAgICA8eHNkOmZyYWN0aW9uRGlnaXRzIHZhbHVlPSI5Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZSZWZlcmVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlJlZmVyZW5jZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUmVmZXJlbmNlIiB0eXBlPSJMaXN0T2ZSZWZlcmVuY2UiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGF0ZVRpbWVSZWZDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aWNpcGF0ZWREZWxpdmVyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmFsT2ZHYWdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92YWxPZlNhbXBsZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpb25BbmRBY2NlcHRhbmNlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0NsZWFyYW5jZURhdGVFeHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNDbGVhcmFuY2VEYXRlSW1wb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQ3JlZGl0Tm90ZVJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlRXhXb3JrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUdvb2RzSGFuZGVkT3ZlckZvclNoaXBtZW50QnlTZWxsZXJPckFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlR29vZHNSZWNlaXZlZEJ5QnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVHb29kc1JlY2VpdmVkQnlCdXllcnNBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUdvb2RzUmVjZWl2ZWRCeUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVJbnZvaWNlUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFjY2VwdGFuY2VPZkZpcnN0U2FtcGxlc1Byb2R1Y2VkVW5kZXJQcm9kdWN0aW9uQ29uZGl0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQWNjZXB0YW5jZU9mTmVnb3RpYWJsZUluc3RydW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFjY2VwdGFuY2VPZlRvb2xpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFycml2YWxPZlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQmlsbE9mTGFkaW5nQ29uc2lnbm1lbnROb3RlT3JPdGhlclRyYW5zcG9ydERvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZDZXJ0aWZpY2F0ZU9mRmluYWxBY2NlcHRhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZDZXJ0aWZpY2F0ZU9mUHJlbGltaW5hcnlBY2NlcHRhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZDb25maXJtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkNvbmZpcm1hdGlvbk9mT3JkZXJSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkNyZWRpdE5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRGVsaXZlcnlPZkdvb2RzVG9Fc3RhYmxpc2htZW50c0RvbWljaWxlU2l0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRGVsaXZlcnlUb0J1eWVyT2ZEb2N1bWVudHNSZXByZXNlbnRpbmdHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRGVsaXZlcnlUb0J1eWVyc0FnZW50T2ZEb2N1bWVudHNSZXByZXNlbnRpbmdHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRGVsaXZlcnlUb0NhcnJpZXJPZkRvY3VtZW50c1JlcHJlc2VudGluZ0dvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZEZWxpdmVyeVRvSW50ZXJtZWRpYXJ5QmFua09mRG9jdW1lbnRzUmVwcmVzZW50aW5nR29vZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRW5kT2ZXb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZGaW5hbEFjY2VwdGFuY2VPZldvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZklud2FyZEZyb250aWVyQ3Jvc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZklzc3VlT2ZUcmFuc3BvcnREb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTmVnb3RpYWJsZUluc3RydW1lbnREcmFmdFByb21pc3NvcnlOb3RlQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk91dHdhcmRGcm9udGllckNyb3NzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZQcmVzZW50YXRpb25PZkRvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUHJlc2VudGF0aW9uT2ZOZWdvdGlhYmxlSW5zdHJ1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUHJlc2VudERvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZQcm92aXNpb25hbFJlY2VwdGlvbk9mV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUmVjZWlwdEZvckxvYWRpbmdNYXRlc1JlY2VpcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlJlY2VpcHRPZlRvb2xEZXBlbmRlbnRJbml0aWFsU2FtcGxlc1BsdXNVbmxpbWl0ZWRBYnNvbHV0ZUJhbmtHdWFyYW50ZWVQbHVzVmFsdWVBZGRlZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUmVjZWlwdE9mVG9vbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUmVzYWxlQnlCdXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU2FsYXJ5UGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlNoaXBtZW50QXNFdmlkZW5jZWRCeVRoZVRyYW5zcG9ydERvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZTaWduYXR1cmVPZkNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZTdGFydE9mV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVByZXNlbnREb2N1bWVudFJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUHJvY2VlZHNPZlJlc2FsZUNvbGxlY3RlZEJ5QnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWZ0QXREYXlzQWZ0ZXJEYXRlT2ZJc3N1YW5jZU9mVHJhbnNwb3J0RG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWZ0QXREYXlzQWZ0ZXJEYXRlT2ZQcmVzZW50YXRpb25PZkRvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhZnRBdERheXNEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFmdEF0RGF5c1NpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWVEYXRlT2ZOZWdvdGlhYmxlSW5zdHJ1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWZmZWN0aXZlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VSZWNlaXB0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZVRyYW5zbWlzc2lvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VWZXJpZmljYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclJlZmVyZW5jZURhdGVBZ3JlZWRVcG9uQmV0d2VlblRoZVBhcnRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlckRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlBcHByb3ZhbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJ0ZXJTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHRPZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWREYXRlT2ZEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWVkRHJhZnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGlwdWxhdGVkRGF0ZUZvckFjY2VwdGFuY2VPZkRvY3VtZW50YXJ5Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGlwdWxhdGVkRGF0ZUZvck5lZ290aWF0aW9uT2ZEb2N1bWVudGFyeUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RpcHVsYXRlZERhdGVGb3JQYXltZW50T2ZEb2N1bWVudGFyeUNyZWRpdCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGF5bWVudE1ldGhvZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGF5bWVudE1lYW5Db2RlZCIgdHlwZT0iUGF5bWVudE1lYW5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXltZW50TWVhbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBheW1lbnRNZWFuUmVmZXJlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBheW1lbnRTeXN0ZW1Db2RlZCIgdHlwZT0iUGF5bWVudFN5c3RlbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBheW1lbnRTeXN0ZW1Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmlnaW5hdGluZ0ZJQWNjb3VudCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkZJQWNjb3VudCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWNlaXZpbmdGSUFjY291bnQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJGSUFjY291bnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDYXJkSW5mbyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGF5bWVudE1ldGhvZCIgdHlwZT0iUGF5bWVudE1ldGhvZCIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQYXltZW50TWVhbkNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMDM1RXhjaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGVkQmlsbE9mRXhjaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSERlbWFuZENhc2hDb25jZW50cmF0aW9uT3JEaXNidXJzZW1lbnRDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSERlbWFuZENhc2hDb25jZW50cmF0aW9uT3JEaXNidXJzZW1lbnREZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIRGVtYW5kQ2FzaENvbmNlbnRyYXRpb25PckRpc2J1cnNlbWVudFBsdXNDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSERlbWFuZENhc2hDb25jZW50cmF0aW9uT3JEaXNidXJzZW1lbnRQbHVzRGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSERlbWFuZENvcnBvcmF0ZVRyYWRlRXhjaGFuZ2VDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSERlbWFuZENvcnBvcmF0ZVRyYWRlRXhjaGFuZ2VEZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIRGVtYW5kQ29ycG9yYXRlVHJhZGVQYXltZW50Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hEZW1hbmRDb3Jwb3JhdGVUcmFkZVBheW1lbnREZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIRGVtYW5kQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hEZW1hbmRDcmVkaXRSZXZlcnNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIRGVtYW5kRGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSERlbWFuZERlYml0UmV2ZXJzYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFByZUFycmFuZ2VkUGF5bWVudEFuZERlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFJldmVyc2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzQ2FzaENvbmNlbnRyYXRpb25PckRpc2J1cnNlbWVudENyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0Nhc2hDb25jZW50cmF0aW9uT3JEaXNidXJzZW1lbnREZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0Nhc2hDb25jZW50cmF0aW9uT3JEaXNidXJzZW1lbnRQUERDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDYXNoQ29uY2VudHJhdGlvbk9yRGlzYnVyc2VtZW50UFBERGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDYXNoQ29uY2VudHJhdGlvbk9yRGlzYnVyc2VtZW50UFBEUGx1c0NyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0Nhc2hDb25jZW50cmF0aW9uT3JEaXNidXJzZW1lbnRQUERQbHVzRGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDYXNoQ29uY2VudHJhdGlvbk9yRGlzYnVyc2VtZW50UGx1c0NyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0Nhc2hDb25jZW50cmF0aW9uT3JEaXNidXJzZW1lbnRQbHVzRGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDb3Jwb3JhdGVUcmFkZUV4Y2hhbmdlQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzQ29ycG9yYXRlVHJhZGVFeGNoYW5nZURlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzQ29ycG9yYXRlVHJhZGVQYXltZW50Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzQ29ycG9yYXRlVHJhZGVQYXltZW50RGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDcmVkaXRSZXZlcnNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0RlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzRGViaXRSZXZlcnNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkQ2xlYXJpbmdIb3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkQ2xlYXJpbmdIb3VzZUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkQ2xlYXJpbmdIb3VzZURlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rQ2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2NoZXF1ZS1Jc3N1ZWRCeUFCYW5raW5nT3JTaW1pbGFyRXN0YWJsaXNobWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua0RyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rZXJzRHJhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxEcmF3bkJ5Q3JlZGl0b3JPblRoaXJkUGFydHlBbmRBY2NlcHRlZEFuZEVuZG9yc2VkQnlBQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbERyYXduQnlUaGVDcmVkaXRvckFuZEVuZG9yc2VkQnlBbm90aGVyQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbERyYXduQnlUaGVDcmVkaXRvck9uQUJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxEcmF3bkJ5VGhlQ3JlZGl0b3JPbkFCYW5rQW5kRW5kb3JzZWRCeUFUaGlyZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsRHJhd25CeVRoZUNyZWRpdG9yT25BVGhpcmRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbERyYXduQnlUaGVDcmVkaXRvck9uVGhlRGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va0VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29rRW50cnlDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tFbnRyeURlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoaWVyc0NoZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDY2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNjZFBsdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZEJhbmtlcnNEcmFmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVkQ2hlcXVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVxdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nQmV0d2VlblBhcnRuZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlSW50ZXJiYW5rUGF5bWVudFN5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdFBheW1lbnRCeUNlcnRpZmllZEZ1bmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0UGF5bWVudEJ5Q29tcGFueUNoZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZW5zYXRpb25CeUJhbGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0QWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0RGViaXRBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3RwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdHgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0Q2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVkdWN0aW9uRnJvbUZpbG1SZW50YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdERlYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3REZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQYXlUb090aGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVCSU5BWENsZWFyaW5nTmV0d29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY1BheW1lbnRTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxSZXNlcnZlRnVuZHNPcldpcmVUcmFuc2ZlclJlcGV0aXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxSZXNlcnZlRnVuZHNPcldpcmVUcmFuc2Zlck5vblJlcGV0aXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEluc3RpdHV0aW9uT3B0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlRm9ybWF0R2lybyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFBheW1lbnRCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkdWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWUtQmFua2luZ0RlYml0VHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluQ2FzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb21lQ29udGluZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb21lU2Vuc2l0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbktpbmRQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0cnVtZW50Tm90RGVmaW5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJCYW5rRGViaXRUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZWRTZXBhcmF0ZWx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV2ZWwtU3VtQ29uc3RhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsQ2hlcXVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NrQm94Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb25leU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbE9yUmVnaW9uYWxDbGVhcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uUGF5bWVudERhdGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFRyYW5zZmVyYWJsZUJhbmtlcnNEcmFmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90VHJhbnNmZXJhYmxlTG9jYWxDaGVxdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheUJ5Q2hlY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRCeVBvc3RHaXJvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50VG9CYW5rQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbERlZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtQ2xlYXJpbmdob3VzZUJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBQRENyZWRpdFRvRGVtYW5kRGVwb3NpdEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBQRERlYml0VG9EZW1hbmREZXBvc2l0QWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFBEUGx1c0FkZGVuZHVtQ3JlZGl0VG9EZW1hbmREZXBvc2l0QWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFBEUGx1c0FkZGVuZHVtRGViaXRUb0RlbWFuZERlcG9zaXRBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVhdXRocm9pemVkQ2hlY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzbHlDaGFyZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlTmV0dGluZ0FncmVlbWVudFBheUJ5V2lyZVRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlTmV0dGluZ1BheUJ5Q2hlY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc3NvcnlOb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNzb3J5Tm90ZVNpZ25lZEJ5QUJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc3NvcnlOb3RlU2lnbmVkQnlBQmFua0FuZEVuZG9yc2VkQnlBbm90aGVyQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzc29yeU5vdGVTaWduZWRCeUFUaGlyZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNzb3J5Tm90ZVNpZ25lZEJ5QVRoaXJkUGFydHlBbmRFbmRvcnNlZEJ5QUJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc3NvcnlOb3RlU2lnbmVkQnlUaGVEZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc3NvcnlOb3RlU2lnbmVkQnlUaGVEZWJ0b3JBbmRFbmRvcnNlZEJ5QVRoaXJkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc3NvcnlOb3RlU2lnbmVkQnlUaGVEZWJ0b3JBbmRFbmRvcnNlZEJ5QmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcHJpZXRhcnlOZXR3b3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VkSG9tZS1CYW5raW5nQ3JlZGl0VHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZUdpcm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWREZXRhaWxBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRNZXRob2RGb3JQYXltZW50V2FzTm90VXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1hcnlBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdmVsZXJzQ2hlY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVyZ2VudEdpcm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZJU0FTcGVjaWFsRWxlY3Ryb25pY0Z1bmRzVHJhbnNmZXJOZXR3b3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpcmVUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWDEyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlBheW1lbnRTeXN0ZW1Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkaW5hcnlQb3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJNYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJFbXBsb3llZUNoZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoQ29uY2VudHJhdGlvbkRpc2J1cnNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaENvbmNlbnRyYXRpb25EaXNidXJzZW1lbnRQbHVzQWRkZW5kYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJJbml0aWF0ZWRFbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJJbml0aWF0ZWRFbnRyeVBsdXNBZGRlbmRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVUcmFkZUV4Y2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVDaGVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWdyYXBoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxleCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVHJhbnNtaXNzaW9uTmV0d29ya3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldHdvcmtzTm90RGVmaW5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkd2lyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWwtRmFjZS1Uby1GYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVhcnJhbmdlZFBheW1lbnRBbmREZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVhcnJhbmdlZFBheW1lbnRBbmREZXBvc2l0UGx1c0FkZGVuZGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWF1dGhvcml6ZWREcmFmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZEFpck1haWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRNYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzZW5nZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQUNIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckFDSCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRklBY2NvdW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQWNjb3VudERldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkZJQWNjb3VudCIgdHlwZT0iRklBY2NvdW50Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY2NvdW50RGV0YWlsIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBY2NvdW50SUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlY29uZGFyeUFjY291bnRJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSUJBTiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQWNjb3VudENvbnRyb2xLZXkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBY2NvdW50VHlwZUNvZGVkIiB0eXBlPSJBY2NvdW50VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFjY291bnRUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFjY291bnROYW1lMSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQWNjb3VudE5hbWUyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBY2NvdW50UmVmZXJlbmNlcyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlJlZmVyZW5jZUNvZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFjY291bnREZXRhaWwiIHR5cGU9IkFjY291bnREZXRhaWwiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQWNjb3VudFR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3QnVzaW5lc3NBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb25leU1hcmtldEZ1bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGlyZW1lbnRBY2NvdW50VmVzdGVkSW50ZXJlc3RhdE1hcmtldFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRpcmVtZW50QWNjb3VudFZlc3RlZEludGVyZXN0TmV0Q2FzaFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsUmV0aXJlbWVudEFjY291bnQtSVJBLVZlc3RlZEludGVyZXN0YXRNYXJrZXRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbFJldGlyZW1lbnRBY2NvdW50LUlSQS1WZXN0ZWRJbnRlcmVzdE5ldENhc2hWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlQ29udHJvbGxlZFJldGlyZW1lbnRBY2NvdW50VmVzdGVkSW50ZXJlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVEZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVja2luZ0FjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlSW5zdXJhbmNlRmFjZVZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRpcmVtZW50QWNjb3VudC1WZXN0ZWRJbnRlcmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzdEZ1bmRBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja3NhbmRCb25kc0FjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVJbnN1cmFuY2VBY2NvdW50LU5ldENhc2hWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVSZXRpcmVtZW50QWNjb3VudC00MDFLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJhZ2VBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VCYWNrQWNjb3VudGZvclJldHVybnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdENhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hNYW5hZ2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW1hbmREZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdENhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aXN0aW5nQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuSXRlbXNvbkRlbWFuZERlcG9zaXRBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5JdGVtc29uU2F2aW5nc0FjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdmluZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUxvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZERpc2J1cnNlbWVudE1hc3RlckFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWREaXNidXJzZW1lbnRTdWJBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRVbmlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5yaWNoZWRQbGFuQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvbmctdGVybURpc2FiaWxpdHlQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11dHVhbEZ1bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGlvbnNoaXBTdW1tYXJ5QWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZWtlZXBpbmctQ3VzdG9keUFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ilplcm9CYWxhbmNlTWFzdGVyQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWmVyb0JhbGFuY2VBZmZpbGlhdGVBY2NvdW50Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJGaW5hbmNpYWxJbnN0aXR1dGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRmluYW5jaWFsSW5zdGl0dXRpb25JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkZpbmFuY2lhbEluc3RpdHV0aW9uTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRklCcmFuY2hJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRklCcmFuY2hOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGSUJyYW5jaFN0cmVldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRklCcmFuY2hIb3VzZU51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRklCcmFuY2hTdHJlZXRTdXBwbGVtZW50MSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRklCcmFuY2hTdHJlZXRTdXBwbGVtZW50MiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRklCcmFuY2hQb3N0YWxDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGSUJyYW5jaENpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZJQnJhbmNoUmVnaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUmVnaW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZJQnJhbmNoQ291bnRyeSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvdW50cnkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRmluYW5jaWFsSW5zdGl0dXRpb24iIHR5cGU9IkZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDYXJkSW5mbyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ2FyZE51bSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2FyZEF1dGhDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXJkUmVmTnVtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXJkRXhwaXJhdGlvbkRhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2FyZFR5cGUiIHR5cGU9IkNhcmRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2FyZFR5cGVPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2FyZEhvbGRlck5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNhcmRJbmZvIiB0eXBlPSJDYXJkSW5mbyIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDYXJkVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTUVYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWSVNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY292ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpDQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGluZXJzIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZBbGxvd09yQ2hhcmdlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJBbGxvd09yQ2hhcmdlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZBbGxvd09yQ2hhcmdlIiB0eXBlPSJMaXN0T2ZBbGxvd09yQ2hhcmdlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBbGxvd09yQ2hhcmdlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJbmRpY2F0b3JDb2RlZCIgdHlwZT0iSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSW5kaWNhdG9yQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQmFzaXNDb2RlZCIgdHlwZT0iQmFzaXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJCYXNpc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RPZkhhbmRsaW5nQ29kZWQiIHR5cGU9Ik1ldGhvZE9mSGFuZGxpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNZXRob2RPZkhhbmRsaW5nQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFsbG93YW5jZU9yQ2hhcmdlRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJBbGxvd09yQ2hnRGVzYyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlZhbGlkaXR5RGF0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJhc2lzUXVhbnRpdHlSYW5nZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJCYXNpc01vbmV0YXJ5UmFuZ2UiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlR5cGVPZkFsbG93YW5jZU9yQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJUYXgiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNlcU5vIiB0eXBlPSJ4c2Q6aW50IiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFsbG93T3JDaGFyZ2UiIHR5cGU9IkFsbG93T3JDaGFyZ2UiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSW5kaWNhdG9yQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFib3V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZUxpbmVJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlUGVyQ2FsbE9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZUxpbmVJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlUGVyQ2FsbE9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1BbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW51cy1BbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbnVzLVBlcmNlbnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0FsbG93YW5jZU9yQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1cy1BbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXMtUGVyY2VudGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1c09yTWludXNPckFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1c09yTWludXMtUGVyY2VudGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE90aGVyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkJhc2lzQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb25ldGFyeUFtb3VudCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJNZXRob2RPZkhhbmRsaW5nQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxCYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JDaGVja1RvQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdEN1c3RvbWVyQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlVG9CZVBhaWRCeVZlbmRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlVG9CZVBhaWRCeUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmR3Jvc3NRdWFudGl0eUludm9pY2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VUb0JlSXNzdWVkQnlWZW5kb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZVRvQmVJc3N1ZWRCeVJlc2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VEZW5pZWRCeVZlbmRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbk9ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1QYXlhYmxlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NydWFsRnVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEZ1bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hJbkFkdmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGN1bGF0ZUFuZEFkZHRvSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWxsb3dPckNoZ0Rlc2MiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVmSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZXJ2aWNlQ29kZWQiIHR5cGU9IlNlcnZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZXJ2aWNlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQWxsb3dPckNoZ0Rlc2MiIHR5cGU9IkFsbG93T3JDaGdEZXNjIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZEZXNjcmlwdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iRGVzY3JpcHRpb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkRlc2NyaXB0aW9uIiB0eXBlPSJMaXN0T2ZEZXNjcmlwdGlvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpcHRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uVGV4dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGFuZ3VhZ2UiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiB0eXBlPSJEZXNjcmlwdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTZXJ2aWNlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFib3V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBYnNvbHV0ZU1pbmltdW1DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2Vzc0NoYXJnZS1GZWRlcmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2Nlc3NDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2Nlc3NDaGFyZ2UtU3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnROdW1iZXJDb3JyZWN0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2lkQmF0dGVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ21lbnRvZkRlbGl2ZXJ5RmVlQU9EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmF0aW9uT2ZDYXJuZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxDb21tZXJjaWFsSW52b2ljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxDb3BpZXNPZkZyZWlnaHRCaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxUYXJpZmZDbGFzc2lmaWNhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZE9uLURlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRPbi1PcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZHJlc3NDb3JyZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRUb01ha2VNYXJrZXRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudEZvck1heGltdW1DaGFyZ2VzQmlsbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudEZvck1pbmltdW1BdmVyYWdlVGltZVJlcXVpcmVtZW50QmlsbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZFZhbG9yZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VDaGFyZ2VzSGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VEZXN0aW5hdGlvbkFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZURlc3RpbmF0aW9uRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlTGFkaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlT3JpZ2luQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlT3JpZ2luRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJ0aXNpbmdBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmZmlkYXZpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnREaXNidXJzZW1lbnQtRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50RGlzYnVyc2VtZW50LU9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyY3JhZnRPbkdyb3VuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRXhwb3J0Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckV4cHJlc3NDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmxpbmVPcGVuaW5nRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJwb3J0VGVybWluYWxIYW5kbGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyVHJhbnNwb3J0YXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xpY0JldmVyYWdlUmVwb3J0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxlZ2hlbnlDb3VudHlQQURlbGl2ZXJ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZUxpbmVJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlUGVyQ2FsbE9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VBZHZhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VGb3JDb25zaWdubWVudE1lcmNoYW5kaXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VOb24tUGVyZm9ybWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVyYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVuZGluZ0V4cG9ydERvY3VtZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubmVhbEhlYXRTdGVlbG9yR2xhc3NUcmVhdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFub2RpemluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aS1kdW1waW5nRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwb2ludG1lbnROb3RpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyYml0cmFyeUluQWRkaXRpb25Ub1Rocm91Z2hSYXRlc2FuZENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFydFdvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2VtYmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3Npc3RBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaG1lbnRzVG9CaWxsT2ZMYWRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhZERlYnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtpbmdEcmFmdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlRnJlaWdodEFsbEtpbmRzU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaWNSZW9yZGVyQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFtaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWRkaW5nRmVlZGluZ0Rpc2luZmVjdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVlZkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV5b25kQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXlvbmRGcmVpZ2h0Q2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbEFuZEhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxlZERlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nQXR0ZW5kYW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGFja0x1bmdUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb2NraW5nQW5kQnJhY2luZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvd2VyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2J0YWlsQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9uZEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9uZENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9wU2hlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcmRlYXV4QXJiaXRyYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdGgtRmxhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWtidWxrU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFrQnVsa1N1cmZhY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyaWRnZVRvbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlbkxvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VuUGFja2FnZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJhZ2VPckR1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bmtlckFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bmtlckFkanVzdG1lbnQtMjBGb290Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdW5rZXJBZGp1c3RtZW50LTQwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVua2VyU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJkZW5PdmVyaGVhZE9yQWxsb3dhbmNlRm9ySW5kaXJlY3RDb3N0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVybmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJIYW5kQ2FycnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0NhckFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FibGVQcmVzc3VyaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FibGVzU2VuZGluZ09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxsVGFnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW1wQXJiaXRyYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGFHcmVhdExha2VzQWRkaXRpb25hbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuQ1FDdXN0b21zQ2xlYXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkN1cnJlbmN5RXhjaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuSW1wb3J0VGVybWluYXRpb25GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuUmVjb25zaWdubWVudEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5SZW1hbmlmZXN0RmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsYXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxlZE9yZGVySGVhdnlEdXR5RmxhdGNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwcGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwdHVyZUFkZGl0aW9uYWxEYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb1RheGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJMb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJSZW50YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJDcmVkaXRBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJEZWJpdEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Fycmllck5vdGlmaWNhdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FydGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FydGFnZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0YWxvZ2luZ1NlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50cmFsQnV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50c09mZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZkNvbmZvcm1hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mUmVnaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFpbkFuZEJpbmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW1iZXJPZkNvbW1lcmNlU2VydmljZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlT2ZBaXJiaWxsLVNlcnZpY2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlTGluZUl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VQZXJDYWxsT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZXNGb3J3YXJkQWR2YW5jZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcnRlclNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFzc2lzVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZW1pY2FsTWlsbGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpY2Fnb0xvb3BDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpZ2FyZXR0ZVN0YW1waW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5RGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlNYWludGVuYW5jZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eVBpY2stdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlUZXJtaW5hbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYW5pbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NpbmdTZWFsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2F0aW5nRGlwUnVzdHByb29mRURQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT0RBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPRENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RPbkRlbGl2ZXJ5QWx0ZXJhdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdE9uRGVsaXZlcnlEZWxldGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdFN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tbWFudWZhY3R1cmluZ0Rpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluYXRpb25QZXJmb3JtYW5jZUFuZE5vbi1wZXJmb3JtYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluZUFsbFNhbWVEYXlTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWlzc2lvbkFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbXVuaWNhdGlvbnNDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZXRpdGl2ZUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGV0aXRpdmVDYXJBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGl0aXZlUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXByZXNzb3JDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmNlc3Npb25DcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmNlc3Npb25Nb25leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZ2VzdGlvblN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2VydmF0aW9uUmVzZWFyY2hGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZVVubG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RhbnRTdXJ2ZWlsbGFuY2VTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdGFudFN1cnZlaWxsYW5jZVNlcnZpY2UtQXJtZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bGFyaXphdGlvbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsYXJMZWdhbGl6YXRpb25TZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdWx0aW5nU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJTZXJ2aWNlUHJvdmlkZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyRGVwb3NpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckRlc3R1ZmZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckRpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJEaXZlcnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckxlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMZWFzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMb3NzRGFtYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTZXJ2aWNlQ2hhcmdlVUtFVVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclNlcnZpY2VDaGFyZ2VVU0FDYW5hZGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclN0dWZmaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJUcmFpbGVyQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51b3VzTWlsZWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RXNjYWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RTZXJ2aWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkQXRtb3NwaGVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVydGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tb3BDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3BlcmF0aXZlQWR2ZXJ0aXNpbmdNZXJjaGFuZGlzaW5nQWxsb3dhbmNlUGVyZm9ybWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcHlpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcHlPZkJpbGxPZkxhZGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29weU9mRGVsaXZlcnlSZWNlaXB0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UmVjb3ZlcnlBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UmVjb3ZlcnlGYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdHRvbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRBbmRSZWNvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudGVydmFpbGluZ0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXBvblJlaW1idXJzZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyYWZ0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5QWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lBZGp1c3RtZW50LTIwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lBZGp1c3RtZW50LTQwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lBZGp1c3RtZW50LUJyZWFrQnVsayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lBZGp1c3RtZW50RmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW5jeURpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckFjY291bnRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJFcXVpcG1lbnRBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNCcm9rZXJGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNFeGFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRmVlcy1Db250YWluZXJMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ZlZXMtTGlmdExldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRm9ybWFsaXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW52b2ljZS1BZGRpdGlvbmFsUGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1BlbmFsdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3V0QW5kUGFyYWxsZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1dHRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZWRNZXJjaGFuZGlzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlVG9DYXJyaWVyRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VUb0NhcnJpZXJWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZVRvR292ZXJubWVudEVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YURyYXdpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWRoZWFkTWlsZWFnZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhZkFuZERpc2FibGVkU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJlZFZhbHVlRm9yQ2FycmlhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmVkVmFsdWVGb3JDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJlZFZhbHVlRm9ySW5zdXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWR1Y3RUb01ha2VNYXJrZXRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZWN0aXZlQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZpY2l0RnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGUtSW5zdGFsbGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxheUZ1cm5pc2hpbmdEZXN0aW5hdGlvbldlaWdodHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVtYW5kQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW11cnJhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbXVycmFnZS1BdmVyYWdlQWdyZWVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW11cnJhZ2UtU3BlY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRJbkxpZXVPZk9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXJhbXBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcnJpY2tDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc2lnbmF0ZWRTdXBwbGllckluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb25Mb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb25PZlBvd2VyVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvbk9mVHJhaWxlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvbi1TcGVjaWFsVHlwZUZsYXRDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvblVubG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZXJtaW5lZEZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmVsb3BtZW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWVTZXJ2aWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQcm9kdWN0SGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2J1cnNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY29ubmVjdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LURyb3BCb3hDb252ZW5pZW5jZUN0ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtSW5jZW50aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1NdWx0aXBsZVNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1TZXJ2aWNlT3B0aW9uRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LVNlcnZpY2VPcHRpb25QaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LVNwZWNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BsYXlBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JEaXNjb3VudEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2ZXJzaW9uQW5kUmVjb25zaWdubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2ZXJzaW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZlcnNpb25Ub0FpckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9ja2FnZS1Cb2F0RGV0ZW50aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGF0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb29yLVRvLURvb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvd2VsUGluQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdBdFBvcnRPZkRlYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdlYXRQb3J0T2ZEZWJhcmthdGlvblJhdGVab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdlQXRQb3J0T2ZFbWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZWF0UG9ydE9mRW1iYXJrYXRpb25SYXRlWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZUxpbmVIYXVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJBc3Npc3RlZFVubG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc1dhZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wRG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcFlhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydW1Db3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVtRGVwb3NpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1bVVwQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnllckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ5SWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5uYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXR5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXR5RHJhd2JhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmx5QnV5QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJseVBheW1lbnRBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmx5U2hpcEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5UG9ydENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5U3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eVdlaWdoaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmNsb3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZG9yc2VtZW50RmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmVyZ3ljaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZXJneVN1cmNoYXJnZUZ1ZWxBZGp1c3RtZW50RmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdTdXBwbGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5ncmF2aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRlcmVkVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmlyb25tZW50YWxQcm90ZWN0aW9uU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50TWFudWZhY3R1cmVyUmVzdG9yYXRpb25BdWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjYWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjb3J0U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjcm93Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdXIxUHJlc2VudGF0aW9uRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdXJvcGVhblBvcnRDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzaXZlVmFsdWVDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc01pbGVhZ2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc1BlcmlvZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc1ZhbHVlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2hhbmdlQWNjZXNzQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdXNpdmVVc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1c2l2ZVVzZU9mRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0aW9uRGVsaXZlcnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aGliaXRpb25QaWNrdXBDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGFuZGVkU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkT25lRGF5Q29uc3VsYXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRTZXJ2aWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRTaGlwbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRpbmdGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRpbmdQcmVtaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRDdXN0b21zQ2xlYXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnREZWNsYXJhdGlvbnMtQXV0b21hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnREZWNsYXJhdGlvbnMtVVNTaGlwcGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0SW1wb3J0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRMaWNlbnNlQXBwbGljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydFNoaXBwaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYUNvcGllc2FuZE1haWxpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYUxhYm9ySGVscGVyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFMZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhTGVuZ3RoU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYVNlcnZpY2UtQ291bnRlci1Uby1Db3VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWJyaWNhdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjc2ltaWxlQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjc2ltaWxlQ2hhcmdlcy1BZGRpdGlvbmFsUGFnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWxlZExhbXBQYW5lbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmF4UHJlLWFsZXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVHJhbnNmZXJTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RBcnRpY2xlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdEZsaWdodE91dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdHJhY2tTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vclN0b2NrUHJvdGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vZEFuZExvZGdpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25DdXN0b21zRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk1pbGl0YXJ5U2FsZXNSZW50YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25NaWxpdGFyeVNhbGVzU3BlY2lhbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk9mZmljZUFkdmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRDb3Vwb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkaW5nQWdlbnRDb21taXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFuY2hpc2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVEb21pY2lsZVNoaXBtZW50UHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0QmFzZWRPbkRvbGxhck1pbmltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRDaGFyZ2VzVG9Cb3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRDaGFyZ2VzVG9EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEVxdWFsaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEludGVybmF0aW9uYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRJbnRlcm5hdGlvbmFsTm9uLVVTRG9sbGFycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEludGVybmF0aW9uYWxVU0RvbGxhcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRQYXNzdGhyb3VnaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlc2huZXNzTGVha2VyQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWxsU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVsbFRydWNrbG9hZEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVtaWdhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FybWVudERpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXJtZW50U3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNQcmVzc3VyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2F0ZXdheUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2xhemUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvbGRGYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQW5kU2VydmljZXNDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQW5kU2VydmljZXNDcmVkaXRBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQW5kU2VydmljZXNUYXhDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50V2FyZWhvdXNlRmVlLURlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50V2FyZWhvdXNlRmVlLU9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5Eb29ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5GbG93Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmF0dWl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JpbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzUmVjZWlwdHNTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwYWdlRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwZWRJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlZEluc3BlY3Rpb25UZWNobmljYWxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWxmUG9ydERlbGl2ZXJ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZGxpbmdDaGFyZ2VzT25EaXN0cmlidXRpb25GcmVpZ2h0Rm9yd2FyZGVkQmV5b25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kbGluZ0ZyZWlnaHRBdFBvc2l0aW9uc05vdEltbWVkaWF0ZWx5QWRqYWNlbnRUb1ZlaGljbGVDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhcmJvck1haW50ZW5hbmNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJib3JNYWludGVuYW5jZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF1bGluZ0FuZEhvaXN0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXVsaW5nQW5kSG9pc3RpbmdUb0JlRGlyZWN0QmlsbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNDYXJnb0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzQ2FyZ29PbkRlY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsc0hhbmRsaW5nRmVlLURvbWVzdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbHNIYW5kbGluZ0ZlZS1JbnRlcm5hdGlvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNTdG9yYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0SW5UcmFuc2l0Q2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdFRyZWF0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF2eUR1dHlGbGF0Q2FyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF2eUxpZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hTZWN1cml0eVJlZEluLWJvbmRTZWFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdod2F5SW50ZXJjaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvaW50aW5zQW5kSGF1bGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9sZGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUxpbmVGcmVpZ2h0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb25leUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9vay11cGNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zZUNoYXJnZVNwZWNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXNlaG9sZEdvb2RzUGljay11cE9yRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklBVEFBaXJiaWxsUHJlcGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklBVEFGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRTZXJ2aWNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXByb3BlckRvY3VtZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluYm91bmRGcmVpZ2h0Q2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb21lRnJlaWdodE1hbnVmYWN0dXJpbmdUb1NoaXBwaW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycmVjdEJpbGxpbmdBY2NvdW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeVByaWNlQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsTGljZW5zZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5sYW5kVHJhbnNwb3J0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZUNhYmxlQ29ubmVjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zaWRlRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZVBpY2stdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3RBdERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0QXRPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGF0aW9uQW5kVHJhaW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxhdGlvbldhcnJhbnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1bGF0ZWRUYW5rQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUGxhY2VtZW50Q29zdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUHJlbWl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUHJvdmlkZWRCeUxlc3NlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUHJvdmlkZWRCeUxlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmRpdmlzaW9uUHJvZml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RPblJlZnVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RPblNlY3VyaXR5RGVwb3NpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpbVVzZVBlcm1pdHRlZEF0U3BlY2lhbFJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBaXJUcmFuc3BvcnRBc3NvY2lhdGlvbkNvbW1pc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBaXJUcmFuc3BvcnRBc3NvY2lhdGlvbk1hcmt1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbENvdXJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxEb29yLXRvLURvb3JIYW5kbGluZ0ZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJwbGFudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJzdGF0ZUhpZ2h3YXlUb2xsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblRyYW5zaXRQcmljZVByb3RlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludHJhLXBsYW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlQWRkaXRpb25hbEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VBdC1Db3N0QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlRGVsaXZlcnlUZXJtc0Ftb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZU5vLUNoYXJnZUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlV2l0aEdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcmlzaEFyYml0cmFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc2xhbmREZWxpdmVyeUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNsYW5kUGljay1VcENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRhbGlhblJlbGVhc2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1QZXJjZW50YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtLVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktlZXBGcm9tRnJlZXppbmdQZXJjZW50RGlmZmVyZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLb3NoZXJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYmVsQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJlbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvckNvc3RPZlJlbW92YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yTW9kaWZ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvck5vVHJvdWJsZUZvdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvck92ZXJ0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclByZW1pdW1PdmVydGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JSZXBhaXJBbmRSZXR1cm5PcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JTdHJhaWdodC10aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclRlc3RBbmRDYWxpYnJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhZGluZ0FkanVzdG1lbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRDdXJyZW5jeUFkanVzdG1lbnRGYWN0b3ItMjBGb290Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kQ3VycmVuY3lBZGp1c3RtZW50RmFjdG9yLTQwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzaGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZU9yZGVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlUGF5bWVudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF5b3V0RGVzaWduIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXlvdmVyQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhZEZhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVha2luZ1VuZGVyZ3JvdW5kU3RvcmFnZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VTaG9ydGZhbGxDb25zaWRlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzVGhhbkNvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc1RoYW5UcnVja2xvYWRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mQ3JlZGl0UHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZUFuZFRpdGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlbGluZVN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmdEdhdGVUcnVja09yRm9ya2xpZnRTZXJ2aWNlQXRQaWNrLXVwRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWVGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZWhhdWxGcm9tUG9ydE9mRGViYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVoYXVsUGVyY2VudERpZmZlcmVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZWhhdWxUb1BvcnRPZkVtYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lclRlcm1zQXRQb3J0T2ZEZWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZXJUZXJtc0F0UG9ydE9mRW1iYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0ZWREYW1hZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGlvbkFudGktRHVtcGluZ0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0aW9uQ291bnRlcnZhaWxpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGlvblRheEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRpb25Ub3RhbER1ZVVTQ3VzdG9tc1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0aW9uVG90YWxGZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nTGFib3JDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkV2VpZ2hpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsRGVsaXZlcnlEcmF5YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NvbW90aXZlRGVsYXllZEluU3dpdGNoaW5nU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jb21vdGl2ZVVuZGVyT3duUG93ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90dGVyeUNoYXJnZUJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdHRlcnlDcm9zc1JlZGVlbWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3ctVGllckxvdHRlcnlDYXNoaW5nQm9udXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvdy1UaWVyTG90dGVyeVdpbm5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikx1bXBTdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hY2hpbmluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbGluZy1Qb3N0YWdlQ29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbGluZy1TZXJ2aWNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbEludm9pY2VUb0VhY2hMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuaWZlc3RDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldERldmVsb3BtZW50RnVuZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtpbmdPclRhZ2dpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcnJpYWdlUnVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVtb1JldHVybmFibGVDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmNoYW5kaXNlUHJvY2Vzc2luZ0ZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVJhdGVBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzZW5nZXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRhbHNTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWQtVGllckxvdHRlcnlDYXNoaW5nQm9udXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pZC1UaWVyTG90dGVyeVdpbm5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGVhZ2VGZWVGb3JSZXBhaXJBbmRSZXR1cm4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGVhZ2VPclRyYXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWludXMtQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW51cy1QZXJjZW50YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RpZmllZEF0bW9zcGhlcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbnRobHlSZW50YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdW50RGVtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW91bnRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bmljaXBhbFN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVzaHJvb21GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0Rpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdEaXN0cmlidXRpb25BbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0l0ZW1BbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1N0b3JlQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdTdG9yZURpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1dhcmVob3VzZURpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdZb3JrRGVsaXZlcnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1lvcmtQaWNrLXVwQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSERXaGFyZmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9BbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQWxsb3dhbmNlT3JDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tRHV0aWFibGVDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25HZW5lcmF0ZWRGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tcmV0dXJuYWJsZUNvbnRhaW5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vUmV0dXJuQ3JlZGl0QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3JtYWxQdW1wQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3Rhcml6ZWRBZmZpZGF2aXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeUNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5Q29uc2lnbmVlQmVmb3JlRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5venpsZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5DaGFyZ2VzLUhhemFyZG91cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5GcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VTdXBwbGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Zmc2hvcmUtQWxhc2thSGF3YWlpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkNhcnJpYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkRlY2tCcmVha0J1bGtEaWZmZXJlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZS1EYXlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmVUaW1lRW5naW5lZXJpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZS1UaW1lTGljZW5zZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lLVRpbWUtT25seUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25ldGltZVRvb2xpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uSGFuZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25hbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uYWxTb2Z0d2FyZVN1cHBvcnRGb3JPcGVyYXRpb25hbFN1cHBvcnRTeXN0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25hbFNvZnR3YXJlU3VwcG9ydEZvclN3aXRjaGluZ1N5c3RlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvbkNoYXJnZUNvbG9yRmFicmljT2ZmaWNlRnVybml0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlci1GbGF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlck5vdGlmeUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJBY2Nlc3NvcmlhbFNlcnZpY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyQWR2YW5jZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyRXhwb3J0Q2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJHb3Zlcm5tZW50QWdlbmN5RGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyR292ZXJubWVudEFnZW5jeUV4YW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVySW1wb3J0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlck1pc2NlbGxhbmVvdXNFYXJuaW5nT3JBZGRpdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJTZWVSZWxhdGVkRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dE9mUm91dGVNaWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0T2Zab25lUGljay11cE9yRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVDYWJsZUNvbm5lY3RvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJEaW1lbnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJIZWlnaHRDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJydW5DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJzaXplZFByZW1pdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJ0aW1lTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcldpZHRoQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2luZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdDcmF0aW5nQW5kSGFuZGxpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdDcmF0aW5nSGFuZGxpbmdBbmRUcmFuc3BvcnRhdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja0ludm9pY2VXaXRoU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaW50aW5nUHJpbWVyT3JGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhbGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFsbGV0RXhjaGFuZ2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhbGxldGl6aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJhbGxlbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyaXNoQ291bnR5U2FsZXNUYXhPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzaW5nU2hpcHBlcnNFeHBvcnRFbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbEFkZGl0aXZlc092ZXJ0aW1lTGFib3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxBZGRpdGl2ZXNTdHJhaWdodFRpbWVMYWJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbFRheGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWNhbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuYWx0eUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudERpZmZlcmVudGlhbC1MZXNzVGhhbkNvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudE9mUHJvZHVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudE9mU2hpcG1lbnRWYWx1ZVRoYXRJc1JldHVybmFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnRPZlNoaXBwZWRRdWFudGl0eVRoYXRJc1JldHVybmFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmZvcm1hbmNlQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJmb3JtYW5jZUF3YXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJJdGVtQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtaXRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1pdHNCb25kc0VzY29ydEF0dGVuZGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyT3JkZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlclBvdW5kQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25hbFByb3BlcnR5TWVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25hbFByb3BlcnR5U3BvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaG9zcGhhdGl6aW5nU3RlZWxUcmVhdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2tsZUFuZE9pbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja1VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrLXVwQW5kRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cC1PdXRPZkFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cFN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllckNoYXJnZXNPdGhlclRoYW5XaGFyZmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllckNoYXJnZXMtV2hhcmZhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJQaWNrLXVwQW5kT3JEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllclVubG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlsb3RJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnRBbmRPclJlbW92YWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXMtQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzLVBlcmNlbnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXNPck1pbnVzLUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1c09yTWludXMtUGVyY2VudGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9sZUxhc2hpbmdFcXVpcG1lbnRTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGVXb29kLVNlcnZpY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcmtGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRDaGFuZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0SGFuZGxpbmdBbmRVbmxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc2l0aW9uaW5nQXRPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3REYW1hZ2VkSGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvdGF0b0ZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG93ZXJGYWN0b3JBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtY2FycmlhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1jYXJyaWFnZUV4Y2VzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlY2lvdXNNZXRhbENvbnRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxvYWRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxvZGdlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXNlVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtVHJhbnNwb3J0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRVc2FnZUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uQW5kRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZBaXJXYXliaWxsLU9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZkNhbmFkaWFuQ3VzdG9tc0ludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZDb21tZXJjaWFsSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZkV4cG9ydEVudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mSW5zdXJhbmNlQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZVU0V4cG9ydERvY3VtZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1Qb3NpdGlvbmVkSW52ZW50b3J5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNCaWxsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFkanVzdG1lbnRQZXJjZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFuZE1hcmtldGluZ0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VEZXZpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JCaWxsaW5nQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckRlbGl2ZXJ5T2ZCaWxsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcml0eVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yTW9udGhDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVPd25lZFZlaGljbGVQcm9jZXNzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzSW5UcmFuc2l0UHJpdmlsZWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jdXJlbWVudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvbmFsRmVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZm9ybWFJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmVzc1BheW1lbnRSZXF1aXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uYWxBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbmFsRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb29mQ29tcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb29mT2ZEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVjdGl2ZVNlcnZpY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RpdmVTZXJ2aWNlLUNvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RpdmVTZXJ2aWNlLUhlYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVIb3VzZWhvbGRJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlTmFtZUFuZEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1bGxpbmdFeWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdW1wQWlyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdW1wQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9wdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxoZWFkSGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhbXBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlUmVkdWN0aW9uQm9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmViYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZS1CaWxsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWJpbGxlZERyYXlhZ2UtRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYmlsbGVkRHJheWFnZS1PcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjaXBpZW50QWRkcmVzc0NvcnJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhbWF0aW9uQ2VudGVySGFuZGxpbmdDaHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFtYXRpb25GZWRlcmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYW1hdGlvblNoYXJlZFJlc3BvbnNpYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYW1hdGlvblN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbmNpbGlhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25uZWN0Y2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbnNpZ25Db25zaWduZWVDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29uc2lnbkRlbGl2ZXJ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbnNpZ25tZW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvb3BlcmluZ0F0T3duZXJzT3JTaGlwcGVyc0V4cGVuc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZEZpbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3ZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY292ZXJ5RmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNyYXRpbmdSZWNvb3BlcmluZy1EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjcmF0aW5nUmVjb29wZXJpbmctT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWN1cnJpbmdIYXJkd2FyZU1haW50ZW5hbmNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWN1cnJpbmdMaWNlbnNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWN1cnJpbmdTb2Z0d2FyZU1haW50ZW5hbmNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWRpc3RyaWJ1dGlvbkFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkdWN0aW9uUHJlcGFsbGV0aXplZENhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVmZXJDYXJnb1BlcmNlbnREaWZmZXJlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWZlck1haW50ZW5hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVsQ2FibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWxEZXBvc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0aW9uTWVjaGFuaWNhbERldGVudGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZ1cmJpc2hpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2FpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uT2ZFeHBvcnRGb3JSZWVudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25PZkV4cG9ydFNoaXBtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdG9yeUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdG9yeVJlcXVpcmVkUmVmdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpYWJpbGl0eUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaW5xdWlzaG1lbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlxdWlkYXRpb25BbnRpLUR1bXBpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpcXVpZGF0aW9uQ291bnRlcnZhaWxpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpcXVpZGF0aW9uVGF4QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpcXVpZGF0aW9uVG90YWxEdWVVU0N1c3RvbXNTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpcXVpZGF0aW9uVG90YWxGZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRhbERlZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudHNBbmRMZWFzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFja0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJBdEJ1eWVyc0V4cGVuc2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckF0Q3VzdG9tZXJFeHBlbnNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJBdEdvdmVybm1lbnRFeHBlbnNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBpY2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdFZpYUNhbmFkYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZWFyY2hEZXZlbG9wbWVudEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZWxsZXJzRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50aWFsRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50aWFsUGljay11cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG90dGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdG9ja2luZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZEFydGljbGVGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5hYmxlQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5DYXJnb0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuZWRMb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXdvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZGluZ0F0dGVuZGFudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9ja3lNb3VudGFpbkJ1cmVhdTU4M0l0ZW0xMTAwQXJiaXRyYXJ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2xsT3V0QWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sbFJlYmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm95YWx0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWx2YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1lLURheVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyZGF5RGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyZGF5UGljay1VcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJkYXlQaWNrLXVwT3JEZWxpdmVyeUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NhbGVDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjYWxlQ2hhcmdlVW5sb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY3JhcEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdHlTaWduYXR1cmVTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWdyZWdhdGluZ1NvcnRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGVjdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZlVubG9hZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJIYW5kQ2FycnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VBc3Npc3RhbmNlUHJvZ3JhbVN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNoYXJnZVdpdGhDYXNoRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VVcGdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXQtdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWFyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVlcEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJMb2FkQW5kQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJMb2FkQ2FycmllckNvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyTG9hZENvbnNpZ25lZVVubG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nQW5kSGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBzaWRlUGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwVG9TdG9ja1F1YWxpdHlBdWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvdGJsYXN0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaHJpbmthZ2VBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNocmlua0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hyaW5rLVdyYXBDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUZhY3Rvck9yaWdpbmF0aW9uRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUZhY3Rvck9yaWdpbmF0aW9uUG9ydE9mRGViYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUZhY3RvclBvcnRPZkVtYmFya2F0aW9uRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUludm9pY2VBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVBpY2stdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVNoaXBtZW50RmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGVldmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xpcFNoZWV0UmFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xpcFNoZWV0VHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsaXBTaGVldFVubG9hZGluZ0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xvdHRpbmdBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsT3JkZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvZnR3YXJlU3VwcG9ydFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZUluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxCdXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDaXJjdXNUcmFpbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbERldGVudGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEVxdWlwbWVudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEZpbmlzaENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEZyZWlnaHRTdXBwbGVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsTWlsZWFnZU1vdmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFBhY2thZ2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFBlcm1pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQdW1wQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsU2VhbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsVGVzdEVxdWlwbWVudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFRvb2xpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxUb29saW5ncmV3b3JrY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsVHJhaW5Nb3ZlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFZlaGljbGVSZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpY2F0aW9uUmV2aWV3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpY0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0RGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0UGljay11cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXRQaWNrLVVwQXRQaWVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG9vbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdHRpbmdPZlRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwcmVhZGVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFtcEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbXBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlTWV0cm9wb2xpdGFuVHJhbnNpdEF1dGhvcml0eVN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVNb3RvckZ1ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlU2FsZXNDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGVhbWluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RlbmNpbGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcGNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcC1vZmZBdERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wLW9mZkF0T3JpZ2luYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3Atb2ZmQXRQaWVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wLW9mZkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcHBpbmdJblRyYW5zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VJblRyYW5zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmFpZ2h0ZW5pbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmFwcGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyZWV0TGFtcHNDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmlwcGluZ1NvcnRpbmdBbmRDb25zb2xpZGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVmZmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZmZpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RUb0Nvb3BlcmF0aXZlQWR2ZXJ0aXNpbmdBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RUb1RheE9uUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWZmZXJhbmNlV2FyZWhvdXNlQ2hhcmdlRXhwb3J0T3JJbXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Z2FyRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1PZkFkZHNBbmREZWR1Y3RzVG9NYWtlTWFya2V0VmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bmRheU9ySG9saWRheVBpY2stdXBPckRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlckJhZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNvckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFsRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFsSXRlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZXR5Qm9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3dlbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3aXRjaENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3dpdGNoaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ2FyQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rUmVudGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1BaXJwb3J0VGF4RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1BaXJwb3J0VGF4T3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtQmV2ZXJhZ2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1DaXR5U2FsZXNUYXhPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1FeGNpc2VUYXgtRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1FeGNpc2VUYXgtT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtRmVkZXJhbEV4Y2lzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUZlZGVyYWxFeGNpc2VUYXhPblRpcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtR292ZXJubWVudGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtSGFuZGxpbmdDaGFyZ2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheExpYWJpbGl0eS1BbW9ydGl6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheExpYWJpbGl0eS1PbmVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtTG9jYWxTYWxlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUxvY2FsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtTWV0cm9wb2xpdGFuVHJhbnNpdFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4T25NaXNjZWxsYW5lb3VzQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4T25UcmFuc3BvcnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVJlZ3VsYXRvcnlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1TYWxlc2FuZFVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVNhbGVzVGF4U3RhdGVBbmRMb2NhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVN0YXRlSGF6YXJkb3VzU3Vic3RhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtU3RhdGVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1TdXBlckZ1bmRFeGNpc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1Vc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1WYWx1ZUFkZGVkVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWFGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2hub2xvZ3lFeGNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWdyYW1DaGFyZ2ViYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmVDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZS1EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lLU9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVQcm90ZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wb3JhcnlBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBvcmFyeVZvbHVudGFyeUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuZGVyZWRBc1RydWNrbG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsRGlmZmVyZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbEhhbmRsaW5nQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxTZXJ2aWNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtc0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZ1NlcnZpY2VzQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0UXVhbGlmaWNhdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVBhbGxldHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocm91Z2hwdXRBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocm91Z2hwdXRDb250YWluZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocnV3YXlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpY2tldGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvYmFjY29Qcm9kdWN0c1JlcG9ydENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE9GQ1NlcnZpY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xpbmdSZXdvcmtDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xzRm9yUHJpbnRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQXNzZXNzb3JpYWxDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbER1ZVVTQ3VzdG9tc1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRmVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbnZvaWNlQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEludm9pY2VBbW91bnROb24tVVNEb2xsYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEludm9pY2VBbW91bnRVU0RvbGxhcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTWF0ZXJpYWxJbnZvaWNlQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjaW5nSW5ib3VuZFZpYU90aGVyQ2FycmllcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNpbmdTZXJ2aWNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFja1N0b3JhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlSW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXJSZW50YWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2Zlck9mTGFkaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlcnJlZENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWlzc2lvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25BbmRTZXR1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25DaGFyZ2VNaW5pbXVtUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25EaXJlY3RCaWxsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvblRoaXJkUGFydHlCaWxsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvblZlbmRvclByb3ZpZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmltbWluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tEZXRlbnRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrbG9hZERpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdXJuaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUd28tRGF5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHdvRG9vclBpY2tVcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hYnNvcmJlZFN3aXRjaGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGl6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkaW5nTGFib3JDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRpbmdSZWxvYWRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc2FsZWFibGVNZXJjaGFuZGlzZUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zY2hlZHVsZWRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2FnZVBsYW5EZXRhaWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VGbGF0QXNzaXN0QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlTWF4aW11bUFzc2lzdEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNEQUluc3BlY3RlZFN0YW1waW5nQ2VydGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlQ2hhcmdlVG9vbGluZ1BlcnNvbm5lbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlLVNwZWNpYWxUeXBlRmxhdENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNWZWhpY2xlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWF0aW9uRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYW5DbGVhbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZU9yZGVyZWRCdXROb3RVc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlUHJlcENoYXJnZUNvdXJ0ZXN5RGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVSb2FkQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW50aW5nSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaXJnaW5Jc2xhbmRUcmFuc2ZlckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVudGFyeUNvbnRyaWJ1dGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FpdGluZ1RpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhclJpc2tDcmV3SW5zdXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJSaXNrSW5zdXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJSaXNrU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXN0ZWRGdXRpbGVUcmlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlcm1lbG9uRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXliaWxsQW5kSW52b2ljZURpc3RyaWJ1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VhdGhlclByb3RlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodFZlcmlmaWNhdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hhcmZhZ2UtQnJlYWtidWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGFyZmFnZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hhcmZhZ2UtQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGFyZmFnZUhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWRlQXJlYVRlbGVwaG9uZVNlcnZpY2VVc2FnZUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lsbENhbGxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldyaXR0ZW5Qcm9vZk9mRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlgtcmF5Q2hhcmdlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCYXNpc01vbmV0YXJ5UmFuZ2UiPgotICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5UmFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5TGltaXQiLz4KLSAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNpc01vbmV0YXJ5UmFuZ2UiIHR5cGU9IkJhc2lzTW9uZXRhcnlSYW5nZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTW9uZXRhcnlSYW5nZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWluaW11bU1vbmV0YXJ5VmFsdWUiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWF4aW11bU1vbmV0YXJ5VmFsdWUiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDdXJyZW5jeSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTW9uZXRhcnlSYW5nZSIgdHlwZT0iTW9uZXRhcnlSYW5nZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTW9uZXRhcnlMaW1pdCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTW9uZXRhcnlMaW1pdFZhbHVlIiB0eXBlPSJEZWNpbWFsMjFfNiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ3VycmVuY3kiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkIiB0eXBlPSJTaWduaWZpY2FuY2VDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTW9uZXRhcnlMaW1pdCIgdHlwZT0iTW9uZXRhcnlMaW1pdCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHlwZU9mQWxsb3dhbmNlT3JDaGFyZ2UiPgotICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5QWxsb3dhbmNlT3JDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBlcmNlbnRhZ2VBbGxvd2FuY2VPckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTW9uZXRhcnlWYWx1ZSIvPgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlR5cGVPZkFsbG93YW5jZU9yQ2hhcmdlIiB0eXBlPSJUeXBlT2ZBbGxvd2FuY2VPckNoYXJnZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUXVhbnRpdHlBbGxvd2FuY2VPckNoYXJnZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUXVhbnRpdHlNb25ldGFyeVZhbHVlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTW9uZXRhcnlWYWx1ZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eUFsbG93YW5jZU9yQ2hhcmdlIiB0eXBlPSJRdWFudGl0eUFsbG93YW5jZU9yQ2hhcmdlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSYXRlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSYXRlUGVyVW5pdCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlVuaXRQcmljZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVW5pdFByaWNlQmFzaXMiIHR5cGU9IkRlY2ltYWwxOF8zIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlVuaXRPZk1lYXN1cmVtZW50Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSYXRlIiB0eXBlPSJSYXRlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkRlY2ltYWwxOF8zIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+Ci0gICAgICAgICAgICA8eHNkOnRvdGFsRGlnaXRzIHZhbHVlPSIxOCIvPgotICAgICAgICAgICAgPHhzZDpmcmFjdGlvbkRpZ2l0cyB2YWx1ZT0iMyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGVyY2VudGFnZUFsbG93YW5jZU9yQ2hhcmdlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBlcmNlbnRRdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJjZW50IiB0eXBlPSJEZWNpbWFsMTBfNCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGVyY2VudGFnZU1vbmV0YXJ5VmFsdWUiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNb25ldGFyeVZhbHVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBlcmNlbnRhZ2VBbGxvd2FuY2VPckNoYXJnZSIgdHlwZT0iUGVyY2VudGFnZUFsbG93YW5jZU9yQ2hhcmdlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQZXJjZW50UXVhbGlmaWVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJjZW50UXVhbGlmaWVyQ29kZWQiIHR5cGU9IlBlcmNlbnRRdWFsaWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQZXJjZW50UXVhbGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGVyY2VudFF1YWxpZmllciIgdHlwZT0iUGVyY2VudFF1YWxpZmllciIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQZXJjZW50UXVhbGlmaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1MaXN0Q29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbU5ldENvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LUdyb3NzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1OZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VQcmljZXBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VQcmljZUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZVByaWNlQW1vdW50TGVzc1ByZXZpb3VzRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldE1vbnRobHlPbkFsbEludm9pY2VzUGFzdER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZVBheW1lbnRDaGFyZ2VCYXNlQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsUmF0ZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm91bmRUcmlwSW5mb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSW1tdXRhYmxlIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVMaW5rIiB0eXBlPSJ4c2Q6YW55VVJJIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdXBwbGllclNob3BwaW5nQ2FydElEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJSb3VuZFRyaXBPcmRlciIgdHlwZT0ieGNibEJvb2xlYW4iIGZpeGVkPSJ0cnVlIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlJvdW5kVHJpcEluZm9ybWF0aW9uIiB0eXBlPSJSb3VuZFRyaXBJbmZvcm1hdGlvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU3RydWN0dXJlZE5vdGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlN0cnVjdHVyZWROb3RlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTdHJ1Y3R1cmVkTm90ZSIgdHlwZT0iTGlzdE9mU3RydWN0dXJlZE5vdGUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlN0cnVjdHVyZWROb3RlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkdlbmVyYWxOb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOb3RlSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOb3RlVVJMIiB0eXBlPSJ4c2Q6YW55VVJJIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUZXh0VHlwZUNvZGVkIiB0eXBlPSJUZXh0VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRleHRUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU3RydWN0dXJlZE5vdGUiIHR5cGU9IlN0cnVjdHVyZWROb3RlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRleHRUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWRsaW5lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuYWx0eUZvckJyZWFjaE9mQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UmlkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJDb250cmFjdHVhbFN0aXB1bGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb1JlY29yZFBPVGV4dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxQT1RleHQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZk5hbWVWYWx1ZVNldCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iTmFtZVZhbHVlU2V0Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZOYW1lVmFsdWVTZXQiIHR5cGU9Ikxpc3RPZk5hbWVWYWx1ZVNldCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmFtZVZhbHVlU2V0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZXROYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZXRJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mTmFtZVZhbHVlUGFpciIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTmFtZVZhbHVlU2V0IiB0eXBlPSJOYW1lVmFsdWVTZXQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZk5hbWVWYWx1ZVBhaXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9Ik5hbWVWYWx1ZVBhaXIiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZk5hbWVWYWx1ZVBhaXIiIHR5cGU9Ikxpc3RPZk5hbWVWYWx1ZVBhaXIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWVWYWx1ZVBhaXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJWYWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGF0YXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik5hbWVWYWx1ZVBhaXIiIHR5cGU9Ik5hbWVWYWx1ZVBhaXIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkF0dGFjaG1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkF0dGFjaG1lbnQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkF0dGFjaG1lbnQiIHR5cGU9Ikxpc3RPZkF0dGFjaG1lbnQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkF0dGFjaG1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQXR0YWNobWVudEFjdGlvbkNvZGVkIiB0eXBlPSJBdHRhY2htZW50QWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQXR0YWNobWVudEFjdGlvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50UHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRmlsZU5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkF0dGFjaG1lbnRUaXRsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQXR0YWNobWVudERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxhbmd1YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNSU1FVHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVwbGFjZW1lbnRGaWxlIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnRMb2NhdGlvbiIgdHlwZT0ieHNkOmFueVVSSSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQXR0YWNobWVudCIgdHlwZT0iQXR0YWNobWVudCIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJBdHRhY2htZW50QWN0aW9uQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBkYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQ2hhbmdlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlckRldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZJdGVtRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlBhY2thZ2VEZXRhaWwiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyRGV0YWlsIiB0eXBlPSJPcmRlckRldGFpbCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mSXRlbURldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iSXRlbURldGFpbCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mSXRlbURldGFpbCIgdHlwZT0iTGlzdE9mSXRlbURldGFpbCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSXRlbURldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJCYXNlSXRlbURldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJQcmljaW5nRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkRlbGl2ZXJ5RGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlJvdW5kVHJpcEluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaW5lSXRlbU5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mU3RydWN0dXJlZE5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mTmFtZVZhbHVlU2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaW5lSXRlbUF0dGFjaG1lbnRzIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mQXR0YWNobWVudCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJdGVtRGV0YWlsIiB0eXBlPSJJdGVtRGV0YWlsIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCYXNlSXRlbURldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaW5lSXRlbU51bSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaW5lSXRlbVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhcmVudEl0ZW1OdW1iZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaW5lSXRlbU51bWJlclJlZmVyZW5jZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikl0ZW1JZGVudGlmaWVycyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZEaW1lbnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRvdGFsUXVhbnRpdHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNYXhCYWNrT3JkZXJRdWFudGl0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mUXVhbnRpdHlDb2RlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT2ZmQ2F0YWxvZ0ZsYWciIHR5cGU9InhjYmxCb29sZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNhdGFsb2dSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikl0ZW1Db250cmFjdFJlZmVyZW5jZXMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZDb250cmFjdEl0ZW0iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGlzdE9mSXRlbVJlZmVyZW5jZXMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZSZWZlcmVuY2VDb2RlZCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb3VudHJ5T2ZPcmlnaW4iPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb3VudHJ5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvdW50cnlPZkRlc3RpbmF0aW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ291bnRyeSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGaW5hbFJlY2lwaWVudCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mUGFydHlDb2RlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDb25kaXRpb25zT2ZTYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNNYXRlcmlhbHMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJIYXphcmRvdXMiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQmFzZUl0ZW1EZXRhaWwiIHR5cGU9IkJhc2VJdGVtRGV0YWlsIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaW5lSXRlbU51bSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQnV5ZXJMaW5lSXRlbU51bSIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VsbGVyTGluZUl0ZW1OdW0iIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkxpbmVJdGVtTnVtIiB0eXBlPSJMaW5lSXRlbU51bSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGluZUl0ZW1UeXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaW5lSXRlbVR5cGVDb2RlZCIgdHlwZT0iTGluZUl0ZW1UeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGluZUl0ZW1UeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGluZUl0ZW1UeXBlIiB0eXBlPSJMaW5lSXRlbVR5cGUiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iTGluZUl0ZW1UeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9uZW50R3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRleHRJdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGluZUl0ZW1OdW1iZXJSZWZlcmVuY2UiPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6aW50Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJMaW5lSXRlbU51bVR5cGVDb2RlZCIgdHlwZT0iTGluZUl0ZW1OdW1UeXBlQ29kZSIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iQnV5ZXIiLz4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGluZUl0ZW1OdW1iZXJSZWZlcmVuY2UiIHR5cGU9IkxpbmVJdGVtTnVtYmVyUmVmZXJlbmNlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkxpbmVJdGVtTnVtVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXIiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikl0ZW1JZGVudGlmaWVycyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlBhcnROdW1iZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZXJ2aWNlIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSXRlbURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkl0ZW1DaGFyYWN0ZXJpc3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29tbW9kaXR5Q29kZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDYXRlZ29yeSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSXRlbUlkZW50aWZpZXJzIiB0eXBlPSJJdGVtSWRlbnRpZmllcnMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhcnROdW1iZXJzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlbGxlclBhcnROdW1iZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0TnVtIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJ1eWVyUGFydE51bWJlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnROdW0iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJNYW51ZmFjdHVyZXJQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdGFuZGFyZFBhcnROdW1iZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQcm9kdWN0SWRlbnRpZmllckNvZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1YnN0aXR1dGVQYXJ0TnVtYmVycyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3RoZXJJdGVtSWRlbnRpZmllcnMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZQcm9kdWN0SWRlbnRpZmllckNvZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhcnROdW1iZXJzIiB0eXBlPSJQYXJ0TnVtYmVycyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFydE51bSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFydElEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXJ0SURFeHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJldmlzaW9uTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0TnVtIiB0eXBlPSJQYXJ0TnVtIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNYW51ZmFjdHVyZXJQYXJ0TnVtYmVyIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlBhcnROdW0iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1hbnVmYWN0dXJlcklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1hbnVmYWN0dXJlck5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik1hbnVmYWN0dXJlclBhcnROdW1iZXIiIHR5cGU9Ik1hbnVmYWN0dXJlclBhcnROdW1iZXIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlByb2R1Y3RJZGVudGlmaWVyUXVhbGlmaWVyQ29kZWQiIHR5cGU9IlByb2R1Y3RJZGVudGlmaWVyUXVhbGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJvZHVjdElkZW50aWZpZXJRdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJvZHVjdElkZW50aWZpZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByb2R1Y3RJZGVudGlmaWVyRXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9kdWN0SWRlbnRpZmllckNvZGVkIiB0eXBlPSJQcm9kdWN0SWRlbnRpZmllckNvZGVkIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlByb2R1Y3RJZGVudGlmaWVyUXVhbGlmaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxQcm9kdWN0SWRlbnRpZmljYXRpb25Bc3NpZ25lZEJ5VGhlTWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnRpc2luZ1BhY2thZ2VJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdncmVnYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJUcmFuc3BvcnRhdGlvbkFzc29jaWF0aW9uUHJvcHJpZXRhcnlSaWdodHNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvY2F0aW9uTWV0aG9kb2xvZ3lJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0ZUlTQk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuRGVudGFsQXNzb2NpYXRpb25Db2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5UcnVja2luZ0Fzc29jaWF0aW9uc0Fzc2VtYmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblRydWNraW5nQXNzb2NpYXRpb25zUGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5UcnVja2luZ0Fzc29jaWF0aW9uc1N5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5uaXZlcnNhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uQ29tcGxldGlvbk1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25TdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcmFpc2FsUHJvZHVjdFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJhaXNhbFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFSTklDUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZW1ibHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2VtYmx5TG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldENhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvcnRhYmlsaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFBhcnRzTGlzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGljVHJhbnNtaXNzaW9uU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXhpbGlhcnlUcmFuc21pc3Npb25TZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1eGlsbGFyeVRyYW5zbWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXhsZVJhdGlvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBeGxlU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNraW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXItQ29kZWRTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhdGNoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0SUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJldmVyYWdlQ29tbW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGJvYXJkc0NvbW1lcmNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxDcmVkaXRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsU3ViZ3JvdXBDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaW5kaW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmRPckxhYmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJQcmljZU9waW5pb25TZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNCb2R5U2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllckdyb3VuZFNoYWRlSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQ2F0YWxvZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQ29sb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0VuZFByb2R1Y3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0VuZ2luZWVyaW5nQ2hhbmdlTGV2ZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0ludGVybmFsUHJvZHVjdEdyb3VwQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzUXVhbGlmaWVyRm9yU2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzU2l6ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc1N0eWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNTdWJsaW5lSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FHRUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmRpZGF0ZU9pbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycnktT3ZlclBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGFsb2dOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5uZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXNTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZW1pY2FsQWJzdHJhY3RTZXJ2aWNlUmVnaXN0cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFzc09mQ29udHJhY3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTEVJQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29nbml6YW5jZVN5bWJvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sZFJvbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5lZE5DQ01BT3JCYW5rU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pc3Npb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXNzaW9uWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWl0dGVlRm9yVW5pZm9ybVNlY3VyaXR5SWRlbnRpZmljYXRpb25Qcm9jZWR1cmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vZGl0eUdyb3VwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb2RpdHlOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb25MYW5ndWFnZUVxdWlwbWVudElkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnktT3duZWRVbml0VHJhaW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXRpYmxlQ3V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZW5zYXRpb25BbGxvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGVuc2F0aW9uVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmNlcHRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maWd1cmF0aW9uSXRlbUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbm5lY3RvclR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RBY3Rpdml0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QnJlYWtkb3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdENoYW5nZUF1dGhvcml6YXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvckVzdGFibGlzaG1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRyYW5zZmVyUmVhc29uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJpYnV0aW9uWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeUZyb21XaGljaFByb2N1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5T2ZPcmlnaW5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Vwb25GYW1pbHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Vwb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlUmlza1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFByb2NlZHVyYWxUZXJtaW5vbG9neUNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckNvbXBhbnlSZWdpc3RyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJQcm92aWRlZEVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0FydGljbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1dE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YUNhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZEZWZlbnNlSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0SXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzaWduTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZpY2VGYW1pbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWdub3Npc0NvZGVQb2ludGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvbnRpbnVlZFBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50R3JvdXBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZpZGVuZFVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmdSZXZpc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z1VQQ0NvbnN1bWVyUGFja2FnZUNvZGUxLTQtNi0xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnVVBDU2hpcHBpbmdDb250YWluZXJDb2RlMS0yLTQtNi0xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5BbmRCcmFkc3RyZWV0U3RhbmRhcmRQcm9kdWN0QW5kU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR5ZUxvdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFOMi01LTUtMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFOLTk5SW4tU3RvcmVDb3Vwb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGl0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kLUl0ZW1EZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lRGlzcGxhY2VtZW50SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nQ2hhbmdlTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nRGF0YUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZVNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50Q29kZVBlckNPUEFTU3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudEhpZXJhcmNoaWNhbFNlcXVlbmNlSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2hhbmdlZFBhcnRPckFzc2VtYmx5T3JQcm9kdWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhoaWJpdExpbmVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlbmRhYmxlQ29udGFpbmVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVuc2VJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGQUFTZXJ2aWNlQnVsbGV0aW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhYnJpY1BpZWNlc1BlclJvbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWxlZFN1YmFzc2VtYmx5TW9kZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWxlZFN1YmFzc2VtYmx5U2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWVBZmZvcmRhYmxlTGVuZGluZ1Byb2R1Y3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWVQcm9qZWN0Q29uZG9taW5pdW1DbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxTdXBwbHlDbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlmdGhXaGVlbFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxUZXN0TG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxQaGFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoTG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaE9ySGFuZFN0YW5kYXJkUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJlUHVtcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RQcmlvcklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1lclB1Ymxpc2hlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZGRpZU1hY0FmZm9yZGFibGVMZW5kaW5nUHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWNQcm9qZWN0Q29uZG9taW5pdW1DbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb250QXhsZS1SZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9udEF4bGVEcml2ZW5TZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb250QXhsZU5vbkRyaXZlblNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbnRBeGxlU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsVGFua1NlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZEFiYnJldmlhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZE1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRTdWItQWR2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdBU0ZMT1dJbnZvaWNlUG9zdGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdBU0ZMT1dQcm9kdWN0b3JTZXJ2aWNlQ2hhcmdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2F0aGVyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZWFyUmF0aW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmljTmFtZURlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHbGlkZXJLaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZGVOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFpbkRpcmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhcGhpY3NJbmR1c3RyeUJhckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VuZFNoYWRlU3RhbmRhcmRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwUXVhbGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1RJTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFybW9uaXNlZFN5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSENQQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhJQkMtSGVhbHRoSW5kdXN0cnlCYXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISUJDU3VwcGxpZXJMYWJlbGluZ1N0YW5kYXJkUHJpbWFyeURhdGFNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISUVDUHJvZHVjdE9yU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdFJvbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklDRC05LUNNLVByb2NlZHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWduaXRpb25LZXlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcHJpbnQtVHJhZGVtYXJrQ29kZU9mU3Vic2lkaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlDb21tb2RpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbk1lZGlhVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5ncmVkaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUGxhbkRlc2NyaXB0aW9uQ2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVyc0Z1bmRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmNoYW5nZWFiaWxpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmlvckNvbG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFydGljbGVOdW1iZXJpbmdBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUNELTktQ00tRGlhZ25vc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsSGFybW9uaXplZENvbW1vZGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxTdGFuZGFyZEJvb2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG1lbnRGdW5kVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVJTUXVhbGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklTQk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklTU04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1NYW5hZ2VtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVR5cGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvYk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50TGlmZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1cmlzZGljdGlvblNwZWNpZmljUHJvY2VkdXJlQW5kU3VwcGx5Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkthbmJhblBsYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnlTYW1wbGVJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeVRlc3RDb25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvckdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlicmFyeU9mQ29uZ3Jlc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlT3JBbm51aXR5UHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVPckFubnVpdHlTZXJ2aWNlRmVhdHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZnRHYXRlU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lT2ZBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVPZkJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkU2VxdWVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsbHlBc3NpZ25lZENvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsU3RvY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTE9JTkNDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3RQcmljaW5nVW5pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFjaGluZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VJbmRleFBhZ2VSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ham9yUHJvZHVjdE9yTWF0ZXJpYWxPck1hY2hpbmVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51YWxUcmFuc21pc3Npb25TZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyc0FydGljbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlcnNQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRQcm9ncmFtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENvbnRyb2xDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbERpc2NoYXJnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhc3VyZW1lbnRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbEluZm9ybWF0aW9uQnVyZWF1QXV0aG9yaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFN0b3BMb3NzQ292ZXJhZ2VDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFN0b3BMb3NzTGV2ZWxDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFN0b3BMb3NzUHJvZHVjdExpbmVDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1FTUFQcm9kdWN0VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGhvZE9mRGVsaXZlcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxlc3RvbmVFdmVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlTdGFuZGFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUlMU1BFQ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlQ3JlZGl0RGF0YU9yZGVyVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VJbnN1cmFuY2VQcm9kdWN0Q29kZU9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZVByb2R1Y3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZVVuZGVyd3JpdGluZ1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yVmVoaWNsZUlkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvclZlaGljbGUtTGluZURlc2lnbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmVtZW50VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRHJ1Z0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRHJ1Z0NvZGU0LTQtMkZvcm1hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxEcnVnQ29kZTUtMy0yRm9ybWF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbERydWdDb2RlNS00LTFGb3JtYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRHJ1Z0NvZGU1LTQtMkZvcm1hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxIZWFsdGhSZWxhdGVkSXRlbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsSGVhbHRoUmVsYXRlZEl0ZW1Db2RlSW40LTZGb3JtYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsSGVhbHRoUmVsYXRlZEl0ZW1Db2RlSW41LTVGb3JtYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUHJvZHVjdEdyb3VwQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxSZXRhaWxGZWRlcmF0aW9uQ29sb3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFJldGFpbEZlZGVyYXRpb25TaXplQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxTdG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkRDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdNaWNyb2NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1JlcGxhY2VtZW50UGFydE9yQXNzZW1ibHlEZWZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRIaWdoZXJBc3NlbWJseU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dEhpZ2hlclVzZWRBc3NlbWJseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uZm9yZmVpdHVyZU9wdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2FsZWFibGVJdGVtRXhjbHVkaW5nRGVwb3NpdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlNOLU5vcnRoQXRsYW50aWNUcmVhdHlPcmdhbml6YXRpb25TdG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlVCQ1VCODJDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlVCQ1VCOTJDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQb3NpdGlvbnNPbk1hY2hpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ibGlnYXRpb25BdXRob3JpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ic29sZXRlUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZE1pY3JvY29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkVVBDT3JFQU5DYXNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkVVBDT3JFQU5Db25zdW1lclBhY2thZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRVUENPckVBTk1vZHVsZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZFVQQ09yRUFOTXVsdGlwYWNrQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JBc3NpZ25lZFByb3BlcnR5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wcG9zaXRlLUhhbmRQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpY2FsQ2FibGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpY2FsSW5kdXN0cnlQcm9kdWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxFcXVpcG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVQcm9kdWN0aW9uT3BlcmF0aW9uU2hlZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnaW5nRHJhd2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnaW5nU3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydERyYXdpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnROdW1iZXJEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0dGVybk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEFTQ0NFQy1Hb29kc0FuZFNlcnZpY2VzVGF4Rm9yd2FyZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQVNDQ0VDLUdvb2RzQW5kU2VydmljZXNUYXhOb3RBcHBsaWNhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQVNDLU5vblR1YnVsYXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQVNDT01DLUdvb2RzQW5kU2VydmljZXNUYXhGb3J3YXJkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBU0NPTUMtR29vZHNBbmRTZXJ2aWNlc1RheE5vdEFwcGxpY2FibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bUFjY291bnRhbnRzU29jaWV0eU9mQ2FuYWRhVHVidWxhckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVjZXNJblJvbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZ2d5YmFja0NvbW1lcmNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lVHJhbnNhY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRFcXVpcG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5Rm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZE1hbnVmYWN0dXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkTmF0aW9uYWxTdG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bVJhdGVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzU2FtcGxlSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlTG9va1VwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltZUNvbnRyYWN0b3JQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmludENvbG9yU3RhbmRhcmRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW50T3JEcmF3aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0T3JTZXJ2aWNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RDaGFuZ2VOb3RpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3REYXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdElkQXR0cmlidXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0VmVyc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1EZXNjcmlwdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1MZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uYWxWYXJpYW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eUFuZENhc3VhbHR5U2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaXNoZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZXJzSXRlbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlcnNPcmRlckxpbmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cnBvc2VPZkluc3VyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaWF0b3JTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkLU93bmVkVW5pdFRyYWluTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5kb21XZWlnaHRBZ2dyZWdhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVEZXRhaWxDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlUHJvcGVydHlJbmZvcm1hdGlvblNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXJBeGxlRXh0ZW5kZWRUYWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXJBeGxlRnJvbnRSZWFyRHJpdmVuU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyQXhsZU1pZGRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhckF4bGVQdXNoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXJBeGxlUmVhckRyaXZlblNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhckF4bGVSZWFyTm9uRHJpdmVuU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyQXhsZVNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhckF4bGVUYWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhbWF0aW9uUHJvY2VzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkS2VlcGluZ09yTW9kZWxZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVmZXJTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWxUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VPaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmluZWRQcm9kdWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZE1vZGVsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkTW9kZWxUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkUG9saWN5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlVmFsdWVVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaWdpb3VzUmV0YWlsTm9uLUJvb2tJdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJGcm9tUHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckluZHVjdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpclRhZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZWRQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudE5hdGlvbmFsU3RvY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50UHJvZHVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRTdWJhc3NlbWJseU1vZGVsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudFN1YmFzc2VtYmx5U2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNvdXJjZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsUExVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5hYmxlQ29udGFpbmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2xsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2xsU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJTS051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1ByZXNlbnRhdGlvbklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVtYXRpY0RpYWdyYW1SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYXRTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVBseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kUHJpb3JJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN0aW9uUHJpbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNEYXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0xvdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VyaWFsSXRlbUFuZENvbnRyaWJ1dGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VyaWVzSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvZGVQZXJDT1BBU1N0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ29udHJvbElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRmVhdHVyZUlEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUmVuZGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudE9yUGF5b3V0T3B0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsZi1MaWZlQWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbGYtTGlmZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaWZ0V29ya2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWRlVXBPclNpZGVEb3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2lsbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNLVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xhYk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xlZXBlckJveEtleU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xlZXBlckJveFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU05PTUVEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2Z0d2FyZVJldmlzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkRlcG9zaXRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkxlYWRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsTWF0ZXJpYWxJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNTQ0MtMThBbmRBcHBsaWNhdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkR3JvdXBPZlByb2R1Y3RzLU1peGVkQXNzb3J0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRJbmR1c3RyaWFsQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUxhYmVsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVTYW1wbGVJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0eWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJsaW5lSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWlzc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2lzdGVuY2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZVByb2R1Y3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnRvcGljTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVyc2VkZWRQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnNlZGVkUHVyY2hhc2VPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJCcmFuZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyQ29tcGFueVJlZ2lzdHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNBcnRpY2xlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNTdXBwbGllckFydGljbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bnRoZXRpY0x1YmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQ1RDb21tb2RpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxNYW51YWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxQaGFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbW11bmljYXRpb25zQ2lyY3VpdElkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlY29tbXVuaWNhdGlvbnNJbmR1c3RyeVNlcnZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlY29tU2VydmljZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZUluZHVzdHJ5TWFudWZhY3R1cmVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGVkTWF0ZXJpYWxJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGV4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFByaW9ySWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUNvbXBsaWFudFRlY2huaWNhbE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvcGljTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlSW5JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlckNhc2VTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWlzc2lvblNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0R3JvdXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJ5TWFuYWdlbWVudEFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhc3VyeU1hbmFnZW1lbnRBc3NvY2lhdGlvblNlcnZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhc3VyeU1hbmFnZW1lbnRBc3NvY2lhdGlvblNlcnZpY2VDb2RlQW5kQmFua1NlcnZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnRDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tCb2R5U2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlU2VsdmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUNDT3JFQU4tMTI4Q291cG9uRXh0ZW5kZWRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUN1c3RvbWVyc0FydGljbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVOQ0NTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcndyaXRpbmdNZXRob2RPZkRpcmVjdFdyaXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pZm9ybVN0b2NrU3ltYm9sU3lzdGVtQ29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2FsUHJvZHVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU5OdW1iZXJEYW5nZXJvdXNHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENPckVBTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDQ2FzZUNvZGVOdW1iZXIxLTEtNS01Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENDb25zdW1lclBhY2thZ2VDb2RlMS01LTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ0NvbnN1bWVyUGFja2FnZUNvZGUxLTUtNS0xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENDb3Vwb25Db2RlMS01LTUtMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDT3JFQU5DYXNlQ29kZTItNS01Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENPckVBTkNvbnN1bWVyUGFja2FnZUNvZGUyLTUtNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDT3JFQU5Db3Vwb25Db2RlMi01LTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ09yRUFOTW9kdWxlQ29kZTItNS01Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENPckVBTk11bHRpcGFja0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ09yRUFOU2hpcHBpbmdDb250YWluZXJDb2RlMS0yLTUtNS0xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENTaGlwcGluZ0NvbnRhaW5lckNvZGUxLTItNS01Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENTdWZmaXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ1N1ZmZpeC1EZWZpbmVzUGFja2luZ1ZhcmlhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZXItRGVmaW5lZFNoaXBwaW5nQ29udGFpbmVySWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVZNUlBNTGluZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVWTVVMaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXJpYWJsZU1lYXN1cmVQcm9kdWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFyeUl0ZW1Qcm9kdWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlTWFpbnRlbmFuY2VSZXBvcnRpbmdTdGFuZGFyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckFscGhhbnVtZXJpY1NpemVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JDb2xvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yR3JvdW5kU2hhZGVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JzQ2F0YWxvZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yc0l0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcnNQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JzQmFzaWNVbml0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JzRW5naW5lZXJpbmdDaGFuZ2VMZXZlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yc09yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JzU3R5bGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcnNTdXBwbGVtZW50YWxJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaW50YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVTZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZVR5cGVJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZVVzYWdlSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWZlckxvdElkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoZWVsQ2hhaXJMaWZ0U2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29sZW5DdXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2xlblJ1biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1Rhc2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtVbml0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JsZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Illhcm5Db3VudC1FbmdsaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZYXJuQ291bnQtTWV0cmljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZYXJuQ291bnRXb3JzdGVkIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZQcm9kdWN0SWRlbnRpZmllckNvZGVkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQcm9kdWN0SWRlbnRpZmllckNvZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZQcm9kdWN0SWRlbnRpZmllckNvZGVkIiB0eXBlPSJMaXN0T2ZQcm9kdWN0SWRlbnRpZmllckNvZGVkIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZJdGVtQ2hhcmFjdGVyaXN0aWMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9Ikl0ZW1DaGFyYWN0ZXJpc3RpYyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mSXRlbUNoYXJhY3RlcmlzdGljIiB0eXBlPSJMaXN0T2ZJdGVtQ2hhcmFjdGVyaXN0aWMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikl0ZW1DaGFyYWN0ZXJpc3RpYyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJdGVtQ2hhcmFjdGVyaXN0aWNDb2RlZCIgdHlwZT0iSXRlbUNoYXJhY3RlcmlzdGljQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSXRlbUNoYXJhY3RlcmlzdGljQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3VyZmFjZUxheWVyUG9zaXRpb25Db2RlZCIgdHlwZT0iU3VyZmFjZUxheWVyUG9zaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdXJmYWNlTGF5ZXJQb3NpdGlvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJdGVtQ2hhcmFjdGVyaXN0aWNWYWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlVuaXRPZk1lYXN1cmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkRpbWVuc2lvbiIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSXRlbUNoYXJhY3RlcmlzdGljIiB0eXBlPSJJdGVtQ2hhcmFjdGVyaXN0aWMiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSXRlbUNoYXJhY3RlcmlzdGljQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxTZWN0b3JpYWxDaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbEJldmVyYWdlQ2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xCZXZlcmFnZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG95Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmF0b21pY2FsT3JpZ2luT2ZTYW1wbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFydGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZW1ibHlSZXF1aXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxhbmNlT3V0QXJ0aWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaXNXZWlnaHRTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWhpbmQtdGhlLUNvdW50ZXJEcnVncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV2ZXJhZ2VBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJldmVyYWdlQnJhbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJldmVyYWdlQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJldmVyYWdlQ29udGFpbmVyQ2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXZlcmFnZUZsYXZvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJldmVyYWdlU2VnbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmluZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90dG9taG9sZUxvY2F0aW9uTWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3R0b21ob2xlUHJlc3N1cmVNZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5kR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5kR3JvdXAtQUdyb3VwaW5nT2ZTaW1pbGFyQnJhbmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJlYXVvZkFsY29ob2xUb2JhY2NvQW5kRmlyZWFybXNDbGFzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cmVhdU9mQWxjb2hvbFRvYmFjY29BbmRGaXJlYXJtc1R5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDb2xvckRlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNJdGVtU2l6ZURlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNpbmctTGluZXItVHViaW5nVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaW5nT3JMaW5lclR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZDb25mb3JtaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFzc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVtaWNhbEZhbWlseU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZW1pc3RyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0lELUNvbW1lcmNpYWxJdGVtRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYXRpbmdPclBhaW50U3lzdGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hdGluZ09yUGFpbnRTeXN0ZW1OYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXRlcmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uTWV0aG9kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbG9yLUxvd2VyQm9keSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sb3ItVXBwZXJCb2R5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb25DaGVtaWNhbE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlGaWVsZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsaWFuY2VNZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBvc2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kaXRpb25lZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cnVjdGlvbk1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtYWJsZVJlc291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lckluc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbEl0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRTdWJzdGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRTdWJzdGFuY2UtQ2xhc3MyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkU3Vic3RhbmNlLUNsYXNzM05hcmNvdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkU3Vic3RhbmNlLUNsYXNzM05Ob24tbmFyY290aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRTdWJzdGFuY2UtQ2xhc3M0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkU3Vic3RhbmNlLUNsYXNzNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcmRpbmF0ZURlc2NyaXB0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcmRpbmF0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJvc2lvblJlc2lzdGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXBsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50QXJ0aWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEFydGljbGVTcGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNTcGVjaWZpY2F0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlRmF1bHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuc2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGltZW5zaW9uYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdGlvbmFsSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwZXJzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3NhZ2VGb3JtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnRWZmaWNhY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdFZmZpY2FjeVN0dWR5SW1wbGVtZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR5ZUxvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHllTG90RGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkZ2VUcmVhdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3RyaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY2FsbHlDbGVhbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljRmllbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZHMtU2xpdHRpbmctU3BsaXR0aW5nLUN1dHRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFRyZWF0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kVXNlQXBwbGljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5ld2l0aFRyYW5zbWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2Nyb3dDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdXJvcGVhbkNvbW11bml0eVJpc2tDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFicmljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWJyaWNEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbHVyZUFuYWx5c2lzUHJvY2VzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkVEU1BFQy1GZWRlcmFsU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkVELVNURC1GZWRlcmFsU3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWJyZVRvdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmllbGRDb2RlLUVJQU9yRE9EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZFRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGFtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWx0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoT3JTdXJmYWNlUm91Z2huZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF2b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb3ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsdWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb2xkQ29uZmlndXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9udCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3REZXZpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm11bGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYWdyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbFBlcmZvcm1hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdXJ0aGVySWRlbnRpZnlpbmdDaGFyYWN0ZXJpc3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbERlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsTWVyY2hhbmRpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxQcm9kdWN0Rm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJpY0RydWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5EaXJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYXBlVmFyaWV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZFJhdGluZ1N5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQW5kQmVhdXR5QWlkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdFRyZWF0T3JBbm5lYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh5ZHJhdWxpY3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZ3JlZGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxTYW1wbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluamVjdGFibGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZXktV29yZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm91ckRvdWJsZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm91ck92ZXJ0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFkT3JDb3BwZXJTYW1wbGVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZWRSZXNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltaXRpbmdPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikx1c3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFjaGluZVJ1biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFnbmV0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ham9yR3JhZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdNZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdQcm9jZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRTZWdtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJraW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxSZXNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxTdGF0dXMtT3V0c2lkZVByb2Nlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVjaGFuaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFN1cHBsaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRhbGxvZ3JhcGhpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUlMU1BFQy1NaWxpdGFyeVNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1NU0JMTS1JbmRpYW5MYW5kUHJvcGVydHlPclVuaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vaXN0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aS1NZWRpYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVzaWNTdHlsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXV0dWFsbHlEZWZpbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdBcnRpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tSGF6YXJkb3VzTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1QcmVzY3JpcHRpb25EcnVnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25SZWN1cnJpbmdSZXNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnV0cml0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYnNvbGV0ZUFydGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9kb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9kb3JpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmllbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJEaXJlY3RSZXNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJQaHlzaWNhbERlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyLXRoZS1Db3VudGVyRHJ1ZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZUludGVncml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyYW1ldGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXR0ZXJuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50YWdlT2ZBbGNvaG9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJmb3JhdGlvbkNvbnRpbnVpdHlJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmZvcmF0aW9uSW50ZXJ2YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmZvcmF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtLUFlcm9zb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybS1Bc0RpbHV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybS1Db25jZW50cmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtLUVtdWxzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0tR2FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0tTGlxdWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0tUG93ZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0tU2VtaXNvbGlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0tU29saWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVDb3VwbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmVTdHJlYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWNhdXRpb25hcnlJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbkRydWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRhdGlvbkVmZmVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VydmF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5R3JhcGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW50T3JpZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVMYWJlbE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NBY3Rpb25UYWtlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc09yUHJvZHVjdGlvblVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RBcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdERhdGFCYXNlTWFuYWdlbWVudERlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TGlmZUN5Y2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0U3ViamVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uYWxFdmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uYWxPZmZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ByaWV0YXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGlzaGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJlRm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHV0LXVwRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlBc3N1cmFuY2VTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHktUXVhbGl0eUxldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmRpbmdNZWRpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3VycmluZ1Jlc291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWN5Y2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZ1cmJpc2hlZEFydGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRvcnlPclN0YXRlRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRvcnktU3RhdGVPckVudGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdGF0ZWRBcnRpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWplY3Rpb25SZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2Vydm9pckNvZGUtQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdWx0c01ldGhvZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlzZWRBcnRpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpc2VkRGVzaWduIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZU9mQWRtaW5pc3RyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUdyYXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNyZXRPckNvbmZpZGVudGlhbEluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN0aW9uUHJvZmlsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VyaWVzVGl0bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VGZWF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWxmLUxpZmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsZlRhZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdVbml0Q29tcG9uZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwVG9MaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwVG9TdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lsaG91ZXR0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2l6ZVN5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWV0eUdvdmVybm1lbnRBbmRPckN1c3RvbWVyU3BlY2lmaWNhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbHViaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFByb2Nlc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUNvbnRyb2xsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VBbmREaXNwbGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdFJlc291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItUHJvZHVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZUNvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZUxvY2F0aW9uTWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlUHJvdGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZVRyZWF0bWVudC1DaGVtaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZVRyZWF0bWVudC1NZWNoYW5pY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW5vbnltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmdBbmRJbnNwZWN0aW9uQWdlbmNpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RQYW5lbFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RTYW1wbGVEaXJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RTYW1wbGVGcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RTYW1wbGVMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlb3JldGljYWxXZWlnaHRGb3JtdWxhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVyYXBldXRpY0NsYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVyYXBldXRpY0VxdWl2YWxlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJlc2hvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZUluc3VyYW5jZUZvcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2xhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR3aXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlQW5kT3JQcm9jZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mU2FtcGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZUZXN0LUluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVTcGlubmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQ29sb3JEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yU2l6ZURlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaW50YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaXN1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbGF0aWxlT3JnYW5pY0NvbXBvdW5kQ29udHJvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lVGl0bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnR5RGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnR5VHlwZURlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXN0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F4Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsZHNPclNwbGljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxDbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbERpcmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbFBlcmZvcmF0aW9uQ29udGludWl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbFBlcmZvcmF0aW9uSW50ZXJ2YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxUZXN0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2luZGluZ0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2luZUZydWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW5lR3Jvd2luZ1JlZ2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWFybkNvdW50Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlN1cmZhY2VMYXllclBvc2l0aW9uQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja09mQ2FiIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxhdGVyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2xzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3RoU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdHRvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJpY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2luZ0hlYWRGbGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ybmVyRGlhZ29uYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3VibGVFbmRPdmVyaGFuZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG93bnN0cmVhbVRhcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVhbEZ1ZWxUYW5rUG9zaXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlcmlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb250U3BhcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zaWRlTGVmdFJlYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZVJpZ2h0UmVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktlbGx5QnVzaGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVmdEZyb250Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWZ0UmVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc0NyaXRpY2FsU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pZGRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9yZUNyaXRpY2FsU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRSZWxhdGl2ZVBvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RTcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZlN1cmZhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZVNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3Bwb3NpdGVDb3JuZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlTGVmdFJlYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVSaWdodFJlYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJhbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXJTcGFyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjExIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjE0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjE3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjI3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjM0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjM3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQ3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb241MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb243Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnaHRGcm9udCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnaHRSZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWRlT25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWRlVHdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlRW5kT3ZlcmhhbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbHVibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwYXJlVGlyZVBvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFyYm9hcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVjY28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Yi1TZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtCb3R0b20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb3RoQnVjY2FsU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vdGhEaXN0YWxTdXJmYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb290aEZhY2lhbFN1cmZhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb3RoSW5jaXNhbFN1cmZhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb3RoTGluZ3VhbFN1cmZhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb3RoTWVzaWFsU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vdGhPY2NsdXNhbFN1cmZhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHdvU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyQ2FiIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlsYXRlcmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcHBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBzdHJlYW1UYXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2QiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNhdGVnb3J5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhdGVnb3J5SUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iU3RhbmRhcmRDYXRlZ29yeUlEIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDYXRlZ29yeSIgdHlwZT0iQ2F0ZWdvcnkiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcnlJRCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU3RhbmRhcmRDYXRlZ29yeVR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDbGFzc2lmaWNhdGlvbklEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUZWNobmljYWxJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU3RhbmRhcmRDYXRlZ29yeUlEIiB0eXBlPSJTdGFuZGFyZENhdGVnb3J5SUQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlF1YW50aXR5Q29kZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlF1YW50aXR5Q29kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlF1YW50aXR5Q29kZWQiIHR5cGU9Ikxpc3RPZlF1YW50aXR5Q29kZWQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlF1YW50aXR5Q29kZWQiPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iUXVhbnRpdHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eVF1YWxpZmllckNvZGVkIiB0eXBlPSJRdWFudGl0eVF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUXVhbnRpdHlRdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eUNvZGVkIiB0eXBlPSJRdWFudGl0eUNvZGVkIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlF1YW50aXR5UXVhbGlmaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFibGVVbnNlcnZpY2VhYmxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUGF5YWJsZUF2ZXJhZ2VPdmVyZHVlRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNQbGFjZWRGb3JDb2xsZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlQWNjb3VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUNvbnRyYWN0c0RlbGlucXVlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUNvbnRyYWN0c0RlbGlucXVlbnQtQnV5aW5nUGFydHlDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUNvbnRyYWN0c0RlbGlucXVlbnQtQ29udHJhY3RvckNhdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlQ29udHJhY3RzRGVsaW5xdWVudC1Vbmtub3duQ2F1c2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVJbmdyZWRpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVJbmdyZWRpZW50RG9zZVBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUluZ3JlZGllbnREb3NlUGVyVW5pdERpc3BlbnNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlTGluZUl0ZW1zRGVsaW5xdWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlTGluZUl0ZW1zRGVsaW5xdWVudC1CdXlpbmdQYXJ0eUNhdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlTGluZUl0ZW1zRGVsaW5xdWVudC1Db250cmFjdG9yQ2F1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVMaW5lSXRlbXNEZWxpbnF1ZW50LVVua25vd25DYXVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUxpc3RpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVNYWludGVuYW5jZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXR5Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbEhvdXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxTdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFVuaXRzQ3VtdWxhdGl2ZVRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkZWRFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxEZW1hbmRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFByb21vdGlvblNhbGVzRm9yZWNhc3RRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFJlcGxlbmlzaG1lbnREZW1hbmRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFVzYWdlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkQ29ycmVjdG9yUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFRvSW52ZW50b3J5UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZUF0RGVhdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZWRBY3RpdmVMaW5lSXRlbXNEZWxpbnF1ZW50LUNvbnRyYWN0b3JDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZWRMaW5lSXRlbXNDb21wbGV0ZWQtQ29udHJhY3RvckNhdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlZExpbmVJdGVtc0RlbGlucXVlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZUhpZ2hWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlTG93VmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZU1vZGlmeWluZ1VuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VOZWFyZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VOZXh0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZU9mRmluYW5jaWFsSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZ3JlZ2F0ZUJlbmVmaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmljdWx0dXJhbFdvcmtlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmNyYWZ0UmFkaW9zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJsaW5lQXR0ZW5kYW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb2NhdGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG90dGVkVXNhZ2VRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxUaW1lQnV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbW9ydGlzYXRpb25RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1vcnRpemF0aW9uQ3VtdWxhdGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtb3J0aXphdGlvbk9yZGVyUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtb3J0aXphdGlvblRlcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtb3J0aXphdGlvblRvdGFsUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGljaXBhdGVkTGVuZ3RoT2ZTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZhbE9yT2ZmZXJEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92ZWRBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJveGltYXRlTnVtYmVyT2ZIb2xkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3hpbWF0ZU51bWJlck9mVW5pdHNGb3JTYWxlUHJvamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3hpbWF0ZU51bWJlck9mVW5pdHNQcm9qZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyZWFEYW1hZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhT2ZMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYVBlclVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJlc3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc0lzUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0U2VpemVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXRDb21wbGV0ZVZhcmlhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdENvbXBsZXRpb25RdWFudGl0eUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0ZW5kYW50LUhhbmRsZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1ZGl0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcmlzZWRTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRSZXRlbnRpb25MZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZVJlc291cmNlVGFza1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZUVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZU51bWJlck9mRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBeGxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja29yZGVyTGluZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tvcmRlclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rUmVqZWN0SXRlbUNvdW50LiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua3J1cHRjeVBldGl0aW9uc0ZpbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXRocm9vbUNvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXRocm9vbXNGaW5pc2hlZEFyZWFBYm92ZUdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWRyb29tQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZHJvb21zRmluaXNoZWRBcmVhQWJvdmVHcmFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5uaW5nU2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsYWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdVbml0UGVyUHJpY2luZ1VuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRoV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGFua1ZvdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9vZFJlY29yZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va0ludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va09yZGVyUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2hMb2NhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaExvY2F0aW9uc0xlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoTG9jYXRpb25zT3duZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaE9mZmljZUxvY2F0aW9uc0VzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJvdGhlcnNEZWNlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJvdGhlcnNMaXZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0QXRDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0Q3VtdWxhdGl2ZVRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0ZWRIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NDbGFzc0ZhaWx1cmVJbmNpZGVuY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0ZhaWx1cmVDbGFzc0luY2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NGYWlsdXJlSW5kdXN0cnlJbmNpZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRmFpbHVyZU5hdGlvbmFsQXZlcmFnZUluY2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eXVwT3JCdXlkb3duUmF0ZVBlckJhc2lzUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ5dGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhclVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwaXRhbENoYW5nZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZFJlZ2lzdGVyZWROdXJzZUFuZXN0aGV0aXN0TnVtYmVyT2ZDb25jdXJyZW50UHJvY2VkdXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlc0luQ2FwaXRhbFN0cnVjdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlQ3ViaWNNZWFzdXJlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVEaXN0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZUdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlTGVuZ3RoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlTnVtYmVyT2ZBeGxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZU51bWJlck9mQ29udGFpbmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZU51bWJlck9mUGFja2FnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVOdW1iZXJPZlJhaWxXYWdvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVOdW1iZXJPZlVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZVRhcmVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXJjdWxhdGluZ09pbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0YXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlcmtzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zaW5nU3RhdGVtZW50QmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ1N0b2NrQmFsYW5jZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbzJJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUluc3VyZWQtQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1JbnN1cmVkLUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGF0ZXJhbFJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWl0bWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWl0dGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11bml0eVNlcnZpY2VEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFuaWVzSW5jbHVkZWRJbkNvbnNvbGlkYXRlZEZpbmFuY2lhbFN0YXRlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFuaWVzSW5jbHVkZWRJbkNvbnNvbGlkYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbmllc0luU2FtZUFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJpc29uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlZENvbnRyYWN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkTGluZUl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWRQcm9qZWN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9uZW50TWV0ZXJSZWFkaW5nQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmN1cnJlbnRJdGVtT3V0cHV0T2ZUb29saW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZERpc2NvdW50SW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lclJlc2VydmVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVhbmNlRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QnV5ZG93biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RCdXl1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDb21wbGV0ZWREZWxpbnF1ZW50LUNvbnRyYWN0b3JDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0TGluZUl0ZW1RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvckF0Q29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JDdW11bGF0aXZlVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdHNDb21wbGV0ZWREZWxpbnF1ZW50LUJ1eWluZ1BhcnR5Q2F1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdHNDb21wbGV0ZWREZWxpbnF1ZW50LVVua25vd25DYXVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyaWJ1dGlvblRvdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25hbE1vYmlsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZpY3Rpb25zU2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcGVyYXRpdmVTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aXZlQWN0aW9uUmVxdWVzdHMtTWV0aG9kQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGl2ZUFjdGlvblJlcXVlc3RzLU1ldGhvZEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RpdmVBY3Rpb25SZXF1ZXN0cy1NZXRob2RFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aXZlQWN0aW9uUmVxdWVzdHMtVmVyYmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aXZlQWN0aW9uUmVxdWVzdHMtV3JpdHRlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRlckNsZXJrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnNlU2VnbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmVkLUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJlZC1Fc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpbWluYWxTZW50ZW5jZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlQnVkZ2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlRWFybmVkVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVFZmZlY3RPZlByaW9yUGVyaW9kQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUdhc0luamVjdGlvblZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUdhc1ZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUxpcXVpZEluamVjdGlvblZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZU9pbE9yQ29uZGVuc2F0ZVZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlBY3R1YWxFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eUFjdHVhbE1lYXN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlBY3R1YWxQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlPcmRlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlQcmVjZWRpbmdQZXJpb2RFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVByZWNlZGluZ1BlcmlvZE1lYXN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlQcmVjZWRpbmdQZXJpb2RQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlQcmVjZWRpbmdQZXJpb2RSZWFjaGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5UmVjZWl2ZWRFbmRPZlByaW9yWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbC1EaXNwb3NpdGlvblBlbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uUmVwbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVJlcXVpcmVkUHJpb3JUb1RoZUZpcnN0U2NoZWR1bGVkUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNjaGVkdWxlZFVwVG9BY2N1bXVsYXRpb25TdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNoaXBwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNoaXBwZWRMb25nLURpc3Bvc2l0aW9uQ2hhbGxlbmdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5U2hpcHBlZExvbmctRGlzcG9zaXRpb25QZW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTaGlwcGVkU2hvcnQtRGlzcG9zaXRpb25DaGFsbGVuZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTaGlwcGVkU2hvcnQtRGlzcG9zaXRpb25QZW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlU2NoZWR1bGVWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVNjcmFwUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVdhdGVyVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RGF5c09uTWFya2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWR1Y3RpYmxlQmxvb2RVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmYXVsdE5vdGlmaWNhdGlvblJlc3BvbnNlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWdyZWVTZWdtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsZXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlCYXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlCYXRjaE11bHRpcGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVF1YW50aXR5QmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGVuZGVudENvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnRzQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnRUb3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzaWduRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdHJveWVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldHJpbWVudGFsTGVnYWxGaWxpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRyaW1lbnRhbExlZ2FsRmlsaW5nc0FnYWluc3REaXJlY3RvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpbWVuc2lvbmFsU2FtcGxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0U2hpcG1lbnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0V29ya2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYnVyc2VtZW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVldFF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXRlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXRlUXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbC1EaXNwb3NpdGlvbkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JldGVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uUGVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JldGVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uUmVwbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3Bvc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NpdGlvblVuZGV0ZXJtaW5lZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljQWZmaWxpYXRlZENvbXBhbmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWNVc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3NlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFmdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVlLUluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXBsaWNhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXJhdGlvbkluQ3VycmVudEpvYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHdlbGxpbmdBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJuZWRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybmVkVmFsdWVDdW11bGF0aXZlVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJuZWRWYWx1ZUhvdXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZmZlY3RpdmVBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsYXBzZWREdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY1NpZ25hdHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaW1pbmF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGltaW5hdGlvblBlcmlvZC1BY2NpZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpbWluYXRpb25QZXJpb2QtU2lja25lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeU1vZGlmeWluZ1VuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZEF0TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkQXRUaGlzTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkQnlUaGlzQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWRJblRoaXNQcm9mZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZE9uVGhpc0pvYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVBdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlc0FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzLU5vbm93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXNOb3RJbmNsdWRpbmdPd25lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlc051bWJlck9mRGF5c0F3YXlGcm9tV29ya0R1ZVRvSW5qdXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXNOdW1iZXJPZkRheXNPZlJlc3RyaWN0ZWRXb3JrQWN0aXZpdHlEdWVUb0luanVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzLU93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXMtUGFydFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlcy1TYW1lRHV0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXMtU2FtZU9jY3VwYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlc1NoYXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzVG90YWxOdW1iZXJPZkRheXNBd2F5RnJvbVdvcmtEdWVUb0lsbG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVG90YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVG90YWxGaXJzdE1vbnRoT2ZRdWFydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVRvdGFsU2Vjb25kTW9udGhPZlF1YXJ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVG90YWxUaGlyZE1vbnRoT2ZRdWFydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdTdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kT2ZNb250aEludmVudG9yeVByaW9yVG9TaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJlZFN0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpdHlTZWN1cml0eUhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVBdENvbXBsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEFjY291bnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRBbm51YWxWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZER1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRFbXBsb3llZXNBdExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFJlYWRpbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUmVtYWluaW5nRWNvbm9taWNMaWZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRSZW1haW5pbmdQaHlzaWNhbExpZmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFRvdGFsRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmFwb3JhdGVkV2F0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1c2l2ZVVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZWN1dGl2ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aXN0ZW5jZUxpbWl0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlbmRpdHVyZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZFRlcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhVW5wbGFubmVkRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZENsYWltTWFuZGF0ZS1DYXRlZ29yeTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRDbGFpbU1hbmRhdGUtQ2F0ZWdvcnkyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkQ2xhaW1NYW5kYXRlLUNhdGVnb3J5MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZENsYWltTWFuZGF0ZS1DYXRlZ29yeTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRDbGFpbU1hbmRhdGUtQ2F0ZWdvcnk1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnkyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnk0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnk1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnkyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnk0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnk1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkV29ya2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZVNpemVBZnRlckNvbXByZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlU2l6ZUJlZm9yZUNvbXByZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbERlbGl2ZXJ5UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbENvdmVyYWdlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJbnN0aXR1dGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaE9mZnNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RRdWFydGVyTm9uLVJlY3VycmluZ0RlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RRdWFydGVyTm9uLVJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RRdWFydGVyUmVjdXJyaW5nRGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFF1YXJ0ZXJSZWN1cnJpbmdPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXJlT3JGbGFzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEV4dHJhUHJlbWl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vcnNPY2N1cGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0QXRDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RlZFNjYW5uZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RUb0NvbXBsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduUmVsYXRlZEVudGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlbWVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3VydGhRdWFydGVyTm9uLVJlY3VycmluZ0RlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm91cnRoUXVhcnRlck5vbi1SZWN1cnJpbmdPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvdXJ0aFF1YXJ0ZXJSZWN1cnJpbmdEZW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvdXJ0aFF1YXJ0ZXJSZWN1cnJpbmdPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVGbG9hdC1JbkNhbGVuZGFyVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVGbG9hdFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVHb29kc1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlbGFuY2VEZWJ0Q29sbGVjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZWxhbmNlU2FsZXNwZXJzb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlUXVhbnRpdHlJbmNsdWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZVF1YW50aXR5Tm90SW5jbHVkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbENvbnN1bWVkT3JCdXJuZWRBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxQdW1wcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVsbEJhdGhzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsR3JvdXBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsU2FtcGxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1cm5pc2hlZEJsb29kVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhcmFnZU9yQ2FycG9ydEFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc0luamVjdGlvblZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzTGlmdFZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzUmVjZWlwdFZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzUmV0dXJuZWRUb0VhcnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNSZXR1cm5lZFRvUHJvcGVydHlGb3JGdWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNTaHJpbmthZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1NvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1VzZWRGb3JEcmlsbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVXNlZEZvckZ1ZWxTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1VzZWRGb3JQbGFudEZ1ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1VzZWRGb3JSZXByZXNzdXJpbmdPclByZXNzdXJlTWFpbnRlbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1VzZWRPblByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNWZW50ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1ZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbEVsaW1pbmF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50UmVwb3J0aW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWRlVHJhbnNmZXJBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzQW5udWFsSW5jb21lTXVsdGlwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NCdWlsZGluZ0FyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzRXN0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzTGl2aW5nQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NMaXZpbmdGaW5pc2hlZEFyZWFBYm92ZUdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1Byb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzUmVudE11bHRpcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVGZWVCdXl1cE1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZUZlZVJhdGVBZnRlckFsdGVybmF0ZVBheW1lbnRNZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZUZlZVJhdGVBZnRlckJ1eXVwT3JCdXlkb3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaEZhYnJpY2F0aW9uQXV0aG9yaXphdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoUmF3TWF0ZXJpYWxBdXRob3JpemF0aW9uUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGRpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Vyc0Zsb3duLUFpcmNyYWZ0T3JUeXBlRmx5aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Vyc0Zsb3duLUFpcmNyYWZ0VHlwZU9yTGlmZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnNGbG93bi1BaXJjcmFmdFR5cGVPclBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnNGbG93bi1MaWZldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnNGbG93bi1UeXBlRmx5aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBhaXJtZW50RHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGFpcm1lbnRGcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY3JlbWVudGFsT3JkZXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXJlY3RFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5QnVzaW5lc3NGYWlsdXJlSW5jaWRlbmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25Qcm92aWRlclN0YW5kYXJkaXplZE1vdG9yVmVoaWNsZVBlbmFsdHlQb2ludHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUmVhZGluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsZWRDYXBhY2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbG1lbnRGcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxtZW50UGF5bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdWZmaWNpZW50RnVuZHNSZXR1cm5lZENoZXF1ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVuZGVkQ2hhbmdlVGltZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RGb3JPdmVyZHJhd25BY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmltVGVybVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ0YW5rVHJhbnNmZXJBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluVHJhbnNpdFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1Vc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeUNhdGVnb3J5VHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeURpc2NyZXBhbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlNb3ZlbWVudFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlPblNoZWxmV29ya0luUHJvZ3Jlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVF1YW50aXR5QXRTdXBwbGllcnNOb3RTdWJqZWN0VG9JbnNwZWN0aW9uQnlDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5UXVhbnRpdHlBdFN1cHBsaWVyc1N1YmplY3RUb0luc3BlY3Rpb25CeUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlXaXRoZHJhd2FsUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvbHZlbWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVkU2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKYWlsU2VudGVuY2VEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkZ2VtZW50c1JlZ2lzdGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkaWNpYWxTdGF5RHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvdXJIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFnVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZEhvbGRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZVBheW1lbnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdEN1bXVsYXRpdmVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF3U3VpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVBlcmlvZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlbmd0aE9mUmVzaWRlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXZlbFJlc291cmNlLVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXZlbFJlc291cmNlVGFza1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXZlbHNPY2N1cGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZVdpdGhkcmF3YWxEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZVdpdGhkcmF3YWxzU2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGllbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZW5zUmVnaXN0ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZXRpbWVDYXBhY2l0eU9mVG9vbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZS1UaW1lUmVzZXJ2ZS1BY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmV0aW1lUmVzZXJ2ZURheXMtQXBwbGllZFRvVGhpc0NsYWltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlLVRpbWVSZXNlcnZlLUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltaXRlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbXNDb21wbGV0ZWREZWxpbnF1ZW50LUJ1eWluZ1BhcnR5Q2F1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbXNDb21wbGV0ZWREZWxpbnF1ZW50LUNvbnRyYWN0b3JDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtc0NvbXBsZXRlZERlbGlucXVlbnQtVW5rbm93bkNhdXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZVRocmVhZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpdmVzdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5SZXBheW1lbnRUb3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zc0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zc09yR2FpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zdEdhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zdEdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3N0T2lsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3N0V29ya1RpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3RXb3JrVGltZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90U2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFjaGluZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVkVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmluZVJhZGlvcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0UHJpY2VDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGNoaW5nRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbE9uLUJvYXJkUXVhbnRpdHlQcmlvclRvTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUJlbmVmaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1CZW5lZml0UGVyaW9kLUFjY2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQmVuZWZpdFBlcmlvZEFjY2lkZW50VG9BZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1CZW5lZml0UGVyaW9kLVNpY2tuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQmVuZWZpdFBlcmlvZFNpY2tuZXNzVG9BZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1DcmltaW5hbFNlbnRlbmNlRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1EZWxpdmVyeUJhdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtRm9yZWNhc3RRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU1hdHVyaXR5RXh0ZW5zaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtTnVtYmVyT2ZFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1OdW1iZXJPZkVtcGxveWVlc0F0TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1OdW1iZXJPZlB1cmNoYXNlT3JkZXJzQWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU51bWJlck9mU2hpcG1lbnRzQWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU9yZGVyUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1Qcm9kdWN0aW9uQmF0Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1RdWFudGl0eVRvV2hpY2hUYXhSYXRlQXBwbGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVJlcXVlc3RhYmxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1TaGlwUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1TdGFja2FiaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1TdG9ja0xldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtU3VwcGx5UXVhbnRpdHlTdXBwbGllckVuZG9yc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lY2hhbmljcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhdGlvbkR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZW1iZXJzSW5Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2VuZ2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlTYWxlc1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxsaW9uRG9sbGFyUm91bmR0YWJsZUNyZWRpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1BZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1BdmVyYWdlVGltZVJlcXVpcmVtZW50VW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1Db250cmFjdFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtQ3JpbWluYWxTZW50ZW5jZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtRGVsaXZlcnlCYXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUVtcGxveWVlc0F0TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1GYWJyaWNhdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtRm9yZWNhc3RRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bU51bWJlck9mRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtT3JkZXJQYWNrYWdlTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1PcmRlclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUHJvZHVjdGlvbkJhdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUXVhbnRpdHlUb1doaWNoVGF4UmF0ZUFwcGxpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1SZXF1ZXN0YWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtU2hpcFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtU3RvY2tMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNjZWxsYW5lb3VzQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2JpbGVMb2FkaW5nQWxsb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZWxPclRhcmdldFN0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb250aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VQb29sQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RMaWtlbHlEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxCdXNpbmVzc0ZhaWx1cmVJbmNpZGVuY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFF1YW50aXR5RGVjcmVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFF1YW50aXR5SW5jcmVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFRvUGF5SXRlbUNvdW50LiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9EZWxpdmVyeVJlcXVpcmVtZW50SW5UaGlzSW5zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1CaWxsYWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb21taXR0ZWRJbnZlbnRvcnlPblNoZWxmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb25mb3JtYW5jZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tQ29uc29saWRhdGVkVG90YWwtRG9tZXN0aWNTdWJzaWRpYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Db25zb2xpZGF0ZWRUb3RhbC1Gb3JlaWduU3Vic2lkaWFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb3ZlcmVkLUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUNvdmVyZWQtRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tRG9tZXN0aWNTdG9ja2hvbGRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmV4Y2x1c2l2ZVVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1VbmlvbkVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVVyZ2VudERlbGl2ZXJ5UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcm1hbERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3JtYWxSZWFkaW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFJlcGxhY2VkQmxvb2RVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9Wb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZBY2NvdW50c1Bhc3REdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQWN0aXZlQWNjb3VudHNUaGlzQ3ljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQWRkZWRMb2NhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQWRqdXN0bWVudFBlcmlvZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQXR0YWNrc09yT2NjdXJyZW5jZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQmF0Y2hlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZCb3Jyb3dlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ2FyZHNOb3RSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDYXJkc091dHN0YW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNoZWNrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDbGFpbWFudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ2xvc2VkTG9jYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNvLUluc3VyYW5jZURheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ29waWVzT2ZCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ3JldyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZEYXlzQ292ZXJlZEJ5SW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkRlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRGVsaW5xdWVudEluc3RhbGxtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZEZWxpdmVyaWVzUGVyRGVzcGF0Y2hQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRGVwZW5kZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZFbmRVc2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZFbnRpdGxlZEV4ZW1wdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRmFpbGVkQnVzaW5lc3Nlc09mRGlyZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkZyYW5jaGlzZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkZ1bGwtVGltZUVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZIb3NwaXRhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSWRlbnRpY2FsSGFuZGxpbmdVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZJbnN1cmVkTGl2ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSW50ZXJlc3RQYXltZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZJcnJlZ3VsYXJJbnRlcmVzdFBheW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkl0ZW1zQXV0aG9yaXplZEF0U3RvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSXRlbXNBdXRob3JpemVkQXRXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSXRlbXNJblN0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxhdGVDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxldmVscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZMaW1pdGVkUGFydG5lcnNoaXBTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTGl2aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxvYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxvc3RDYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZNZW1iZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk1lc3NhZ2VSZWNpcGllbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk1vbnRocyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZNb3J0Z2Fnb3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk1vdWxkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZOb24tQ292ZXJlZERheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTm9uc3VmZmljaWVudEZ1bmRJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZPcGVuQWNjb3VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mT3BlcmF0aW5nUGVyaW9kc0F0RmFpbHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZPcGVyYXRvckNyZWRpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mT3JpZ2luYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlBhY2thZ2VzSW5IYW5kbGluZ1VuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUGFzc2VuZ2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQYXRpZW50QWRtaXNzaW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQZW9wbGVMaXZpbmdBdFJlc2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQaHlzaWNpYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlByb2R1Y2luZ1dlbGxzUmVtYWluaW5nT25Qcm9wZXJ0eU9yRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUHJvZHVjaW5nV2VsbHNSZW1haW5pbmdPblJveWFsdHlBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlF1YW50aXRhdGl2ZUluY2VudGl2ZVNjaGVtZVVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlNlcnZpY2VzT3JQcm9jZWR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlNoZWxmRmFjaW5ncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTaGVsZlRhZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mU2lnbmVkQmlsbHNPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTdGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTdG9sZW5DYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTdG9wcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZUaGVhdHJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZUaW1lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZUaW1lc0RlcG9ydGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlRyYW5zcG9ydERvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZVbml0cy1Ib3VzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlVuaXRzSW5UaGVEZXB0aE9mQUxheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlVuaXRzSW5UaGVXaWR0aE9mQUxheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlVuc2lnbmVkQmlsbHNPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZXaXRoaG9sZGluZ0V4ZW1wdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlcnNPZkNvbnN1bWVyVW5pdHNJblRoZVRyYWRlZFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlcldlZWtzUGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVyc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZW1JbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVNpemUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVdvcmtlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZkxlYXNlRnVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmUHJlbWlzZVNhbGVzUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZlByZW1pc2VzU2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbENvbmRlbnNhdGVTb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxDb25kZW5zYXRlVXNlZE9uUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbE9yQ29uZGVuc2F0ZVZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsU2VkaW1lbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsVGhlZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uSGFuZEFuZER1ZS1JbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25Ib2xkRm9yU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uT3JkZXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25QcmVtaXNlU2FsZXNRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25QcmVtaXNlc1NhbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuaW5nU3RhdGVtZW50QmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlbmluZ1N0b2NrQmFsYW5jZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ0JlZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ0RpdmlzaW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JzV29ya2luZ0ludGVyZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpbWFsUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGltaXN0aWNEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJDb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlclF1YW50aXR5TXVsdGlwbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbER1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbExvYW5UZXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFBheW1lbnRJdGVtQ291bnQuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFRlcm1JblllYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJHYXNEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyTWlzY2VsbGFuZW91c0Rpc3Bvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlck9pbENvbmRlbnNhdGVEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZFBhcnRpY2lwYW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZFN0b2NraG9sZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJXYXJSZXNlcnZlTWF0ZXJpYWxSZXF1aXJlbWVudHNQcm90ZWN0YWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlcldhdGVyRGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGxpZXJEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRPZkludmVudG9yeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzdGFuZGluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzdGFuZGluZ1NoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0LVR1cm5lZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyZmxvd1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyU2hpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc0VxdWl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwQ2hhbmdlQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwUGVyY2VudGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duT2NjdXBhdGlvblF1YWxpZmljYXRpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhZ2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC1JbkNvbW1vblNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC1JblByZWZlcnJlZFNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC1JblNlY3VyaXR5U2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJraW5nU3BhY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsQmF0aHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYW50VG90YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYXRpb25TaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRuZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0VGltZUVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzdER1ZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudENhbmNlbGxhdGlvbkl0ZW1Db3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudER1cmF0aW9uV2Vla3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRFeHBlcmllbmNlc0luVGhlTGFzdDEyTW9udGhzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RXhwZXJpZW5jZXNJblRoZUxhc3QzTW9udGhzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RnJlcXVlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50T3JkZXJzRmlsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50YWdlT2ZPcmRlcmVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZGljQ2FwYWNpdHlPZlRvb2xpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZE9mRW1wbG95bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kUXVhbnRpdHlNZWFzdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kUXVhbnRpdHlQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RRdWFudGl0eVJlYWNoZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNpc3RlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXNzaW1pc3RpY0R1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRpdGlvbnNGaWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxTdGF0dXNJaWkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsU3RhdHVzSXYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsU3RhdHVzViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljaWFucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljdHVyZUNvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVjZXNEZWxpdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpbGZlcmFnZUdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWxvdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lQWRqdXN0bWVudE9yQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGl0dGVkV2F0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudFBlcmlvZEV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uZWRVbml0RGV2ZWxvcG1lbnRVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudFdvcmtlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRmb3JtQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRhYmxlUmFkaW9zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0ZWRUZWxlcGhvbmVMaW5lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1PcERheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvdWx0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWRvbWluYXRlQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtT3BEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkUXVhbnRpdHlOb3RTaGlwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkUXVhbnRpdHlTaGlwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtUHJvZHVjdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbkRvc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uRWZmZWN0aXZlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25GcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNpZGVudGlhbFZvdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzc3VyZUJhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQmVuZWZpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3VtdWxhdGl2ZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0hpZ2hlc3RDdW11bGF0aXZlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzbHlBbW9ydGlzZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNNb250aHNVc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNOdW1iZXJPZkFjY291bnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c051bWJlck9mQnJhbmNoTG9jYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c051bWJlck9mRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c09yZGVyUXVhbnRpdHlUb0JlQ2FuY2VsbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1dlZWtRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VCcmVha0Zyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQnJlYWtUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2luZ1VuaXRQZXJCaWxsaW5nVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeU1hbmFnZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5TWV0ZXJSZWFkaW5nVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlOZXRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsc0luY2x1ZGVkQXNFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQ3VtdWxhdGl2ZUltYmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JVbml0c0FjY2VwdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9iYXRpb25EdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjaW5nV2VsbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RFeGNoYW5nZUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvblJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbldvcmtlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RTYWxlc0Ftb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvbmFscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0ZWRBdmFpbGFibGVJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQaGFzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RzSW5Qcm9jZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0VW5pdHNTb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3RlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZXN0ZWRCaWxscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljYXRpb25UdXJuU2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPZlByb2R1Y3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpZmljYXRpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpZnlpbmdXZWVrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNvbnRyb2xGYWlsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb250cm9sSGVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdGF0aXZlSW5jZW50aXZlU2NoZW1lQmFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBZHZpc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUFwcHJvdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUF0MTAwUGN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUF2YWlsYWJsZUZvclJldHVybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBdmFpbGFibGVGb3JTYWxlLVN0b2NrUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5QXZhaWxhYmxlT25TaGVsZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBd2FpdGluZ0RlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUJ5UG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5Q2FuY2VsbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUNhcnJpZWRGb3J3YXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eURlZmVycmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eURlbGl2ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlEaXNhcHByb3ZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlEaXNwZW5zZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5RGlzcGxheWVkTm90QXZhaWxhYmxlRm9yU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlFYXJuZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SGVsZEJ5RGVsaXZlcnlWZWhpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUhlbGRCeUxvZ2lzdGljU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUhlbGRCeVJldGFpbE91dGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlJbkZsb2F0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUluSG9sZE91dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlJbk1hbnVmYWN0dXJpbmdQcm9jZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUluUGh5c2ljYWxJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SW5RdWFyYW50aW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUluVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlMYW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5TG9hZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eU1hbmlmZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5Tm90QXZhaWxhYmxlRm9yRGVzcGF0Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5T2ZEZWFsZXJMaWNlbnNlUGxhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eU9mTWF0ZXJpYWxJbk9yZGVyZWRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eU9uSGFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlPbkhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UGVyTmV4dEhpZ2hlckFzc2VtYmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVBlclBhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UGVyU2tpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlQZXJVbml0T2ZJc3N1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZW1haW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UmVxdWlyZW1lbnRGb3JNYWludGVuYW5jZUFuZFJlcGFpck9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVJlcXVpcmVtZW50Rm9yU2FtcGxlSW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZXF1aXJpbmdNYW5pcHVsYXRpb25CZWZvcmVEZXNwYXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZXR1cm5lZERlZmVjdGl2ZU9yRGFtYWdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U2VydmljZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U29sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlTb2xkTmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVN1c3BlbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlUb0JlRGVsaXZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5V2l0aGRyYXduIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVdpdGhoZWxkQnlPd25lck9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RlUXVhbnRpdHlPbkludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFuZ2VBdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5nZU1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhbmdlTWluaW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZVBlckRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWlwdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkQW5kQWNjZXB0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkTm90QWNjZXB0ZWRUb0JlRGVzdHJveWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZE5vdEFjY2VwdGVkVG9CZVJldHVybmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbW1lbmRlZE1haW50ZW5hbmNlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29tbWVuZGVkT3ZlcmhhdWxBbmRSZXBhaXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25zaWRlcmF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWRlbGl2ZXJ5QWZ0ZXJQb3N0UHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmaWxsc0F1dGhvcml6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRCcmFuZHNEaXN0cmlidXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZEJyYW5kc01hbnVmYWN0dXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0ZWRSZXR1cm5RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZEJ1c2luZXNzRW50aXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRFbnRpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpb25zaGlwRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlc0VtcGxveWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1haW5pbmdBdXRob3JpemVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWFpbmluZ0R1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1haW5pbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVvcmRlcmluZ0xldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW9yZGVyUG9pbnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZWRBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VkQmxvb2RVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGVuaXNobWVudE92ZXJyaWRlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxlbmlzaG1lbnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0RGlmZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0ZWREZWZpY2llbmNpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZW1lbnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZW1lbnRRdWFudGl0eVRoYXRXYXNQcmV2aW91c2x5UmVsZWFzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpc2l0aW9uaW5nT2JqZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZlZFF1YW50aXR5Q3VzdG9tZXJEaXJlY3REZWxpdmVyeVNhbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZlZFF1YW50aXR5UmV0YWlsU2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW5jZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNvdXJjZS1RdWFudGl0eS1BdmFpbGFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RpbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3Rpb25EdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsU2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGVudGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5lZEJ5Q29uc3VtZXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybnNSZXBsYWNlbWVudFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb29tQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvb21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb29tc0ZpbmlzaGVkQXJlYUFib3ZlR3JhZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJveWFsdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eUxldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc3BlcnNvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUXVhbnRpdHlOb3RJbmNsdWRlZEluVGhlUmVwbGVuaXNobWVudENhbGN1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1F1YW50aXR5UGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2F0dGVyZWRWb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NyYXBBbGxvd2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY3JhcFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWF0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5TmV0UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZFF1YXJ0ZXJOb24tUmVjdXJyaW5nRGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRRdWFydGVyTm9uLVJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kUXVhcnRlclJlY3VycmluZ0RlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kUXVhcnRlclJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjcmV0YXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyZWRDaGFyZ2VzUmVnaXN0ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdGllc1NoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VnbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVob2xkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZWhvbGRlcnNIb2xkaW5nUmVtYWluZGVyT2ZTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzQWRkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc0RlbGV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc0hlbGRBc1RyZWFzdXJ5U3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc09mQ29tbW9uU3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc09mUHJlZmVycmVkU3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc093bmVkQnlJbi1TdGF0ZVJlc2lkZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzT3duZWRCeU91dC1PZi1TdGF0ZVJlc2lkZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzU3Vic2NyaWJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzU3Vic2NyaWJlZEJ1dE5vdElzc3VlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpZnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBOb3RpY2VRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9ydGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvcnQtTGFuZGVkR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3J0U2hpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lsZW50UGFydG5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmNlTGFzdFRyYXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlRGVsaXZlcnlRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lzdGVyc0RlY2Vhc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXN0ZXJzTGl2aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXplT2ZIb3VzZWhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraWxsZWRXb3JrZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQnVzaW5lc3NVc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xpY2l0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvcnRlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3J0ZWRRdWFudGl0eVJlamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGFjZU9jY3VwaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUGFydG5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWVkQ2FwYWNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0U2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydE9mZnNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVPclByb3ZpbmNlTW90b3JWZWhpY2xlUGVuYWx0eVBvaW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxTYWxlc1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja1RyYW5zZmVyc0luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja1RyYW5zZmVyc091dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvbGVuQ2hlcXVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvckF0Q29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JDdW11bGF0aXZlVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGVkUXVhbnRpdHlSZXR1cm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGVkUXVhbnRpdHlTb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzZXF1ZW50RGVsaXZlcnlRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2lkaWFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRpb25hbFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWl0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyRXN0aW1hdGVkTGF0ZXN0TWV0ZXJSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckVzdGltYXRlZFByZXZpb3VzTWV0ZXJSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckxhdGVzdE1ldGVyUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJQcmV2aW91c01ldGVyUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnBsdXNHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5c0luQXZlcmFnZVJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VzcGVuZGVkRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3YW4tR2FueiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFibGVzQXZhaWxhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYWxrUGF0aHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZkxvc3NBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheGFibGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVhY2hlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNpYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVvcmV0aWNhbFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFF1YXJ0ZXJOb24tUmVjdXJyaW5nRGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFF1YXJ0ZXJOb24tUmVjdXJyaW5nT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFF1YXJ0ZXJSZWN1cnJpbmdEZW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUXVhcnRlclJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUV4cGVuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lRnJhbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVJbkNvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVJblBvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VIb3NwaXRhbGl6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZUxhc3RBcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTGFzdENpdmlsaWFuRmxpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VMYXN0SW5zdXJhbmNlTWVkaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTGFzdE1pbGl0YXJ5RmxpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VNZWRpY2FsQ29uc3VsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTWVkaWNhdGlvbkVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTWVkaWNhdGlvblN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VPbnNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlU3VyZ2VyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlVHJpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lVW5pdHNLbm93biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVVuaXRzUGVyU2hpZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVVbml0c1NwZW50T25EdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9Db21wbGV0ZVF1YW50aXR5RXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb2xlcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEFkanVzdG1lbnRzVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEFtb3J0aXNhdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEF0Q29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQXV0aG9yaXplZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEJlZ2lubmluZ0ludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNBc3NvY2lhdGVkV2l0aFJlcGVhdGVkVHJhdW1hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhEYXlzQXdheUZyb21Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhEaXNvcmRlcnNEdWVUb1BoeXNpY2FsQWdlbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhEdXN0RGlzZWFzZXNPZlRoZUx1bmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhvdXREYXlzQXdheUZyb21Xb3JrQW5kV2l0aG91dFJlc3RyaWN0ZWRXb3JrQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ2xhaW1zV2l0aFBvaXNvbmluZ0lsbG5lc3NlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNXaXRoUmVzcGlyYXRvcnlDb25kaXRpb25zRHVlVG9Ub3hpY0FnZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNXaXRoU2tpbkRpc2Vhc2VzT3JEaXNvcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ29uc29saWRhdGVkRG9tZXN0aWNTdWJzaWRpYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ29uc29saWRhdGVkRm9yZWlnblN1YnNpZGlhcmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDb25zb2xpZGF0ZWRTdWJzaWRpYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ3JlZGl0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDcmVkaXRzQWNjZXB0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ3JlZGl0c1JlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENyZWRpdHNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEYXlzQXdheUZyb21Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERheXNBd2F5RnJvbVdvcmtEdWVUb0lsbG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c0F3YXlGcm9tV29ya0R1ZVRvSW5qdXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERheXNPZlJlc3RyaWN0ZWRXb3JrQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c09mUmVzdHJpY3RlZFdvcmtBY3Rpdml0eUR1ZVRvSWxsbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEYXlzT25NYXJrZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c1dpdGhSZXN0cmljdGVkV29ya0FjdGl2aXR5RHVlVG9Jbmp1cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGVhdGhDbGFpbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGVhdGhzQXNBUmVzdWx0T2ZJbGxuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlYXRoc0FzQVJlc3VsdE9mSW5qdXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlYml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWJpdHNBY2NlcHRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWJpdHNSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWJpdHNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWxpdmVyeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlbWFuZE9yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZW1hbmRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRW5kaW5nSW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEZsb2F0VGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxHYXNEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxHYXNJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSWxsbmVzc0NsYWltc1dpdGhEYXlzQXdheUZyb21Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbElsbG5lc3NDbGFpbXNXaXRoT2NjdXBhdGlvbmFsSWxsbmVzc2VzTm90T3RoZXJ3aXNlQ2xhc3NpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbGxuZXNzQ2xhaW1zV2l0aG91dExvc3RXb3JrRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbGxuZXNzV2l0aExvc3RXb3JrRGF5c09yUmVzdHJpY3RlZFdvcmtBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbmp1cnlDbGFpbXNXaXRoRGF5c0F3YXlGcm9tV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbmp1cnlDbGFpbXNXaXRoRGF5c0F3YXlGcm9tV29ya09yUmVzdHJpY3RlZFdvcmtBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbmp1cnlDbGFpbXNXaXRob3V0TG9zdFdvcmtEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOb24tQ29uc29saWRhdGVkU3Vic2lkaWFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mQ29udmljdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZEb21lc3RpY1N1YnNpZGlhcmllc0luY2x1ZGVkSW5GaW5hbmNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZEb21lc3RpY1N1YnNpZGlhcmllc05vdEluY2x1ZGVkSW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZGb3JlaWduU3Vic2lkaWFyaWVzSW5jbHVkZWRJbkZpbmFuY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZkZvcmVpZ25TdWJzaWRpYXJpZXNOb3RJbmNsdWRlZEluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mTG9hbkRldGFpbFJlY29yZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZNb3J0Z2FnZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mUGFya2luZ1NwYWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZlN1YnNpZGlhcmllc05vdEluY2x1ZGVkSW5UaGVGaW5hbmNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZlVuaXRzRm9yU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZldvcmtlcnNDb21wZW5zYXRpb25Db21iaW5lZFJlcG9ydHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZXb3JrZXJzQ29tcGVuc2F0aW9uRmlyc3RSZXBvcnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mV29ya2Vyc0NvbXBlbnNhdGlvblN1YnNlcXVlbnRSZXBvcnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE9mSXNzdWFibGVBc3NldHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT2lsQW5kT3JDb25kZW5zYXRlRGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT2lsQW5kT3JDb25kZW5zYXRlSW5qZWN0aW9uVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE90aGVyUHJvcGVydGllc093bmVkQW5kRmluYW5jZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUGF5bWVudHNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQb3N0LUFkdmljZXNBY2NlcHRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQb3N0LUFkdmljZXNSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQb3N0LUFkdmljZXNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcmUtQWR2aWNlc0FjY2VwdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByZS1BZHZpY2VzUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJlLUFkdmljZXNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcmVub3Rlc0FjY2VwdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByZW5vdGVzUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJlbm90ZXNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcm9kdWN0aW9uVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByb3BlcnRpZXNPd25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxRdWFudGl0eVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUmVzb3VyY2UtUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUm9vbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU2VydmljZUJhY2tvcmRlclF1YW50aXR5SGlnaFByaW9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFNlcnZpY2VCYWNrb3JkZXJRdWFudGl0eUxvd1ByaW9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFNoYXJlc09mU3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU3lzdGVtQmFja29yZGVyUXVhbnRpdHlIaWdoUHJpb3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU3lzdGVtQmFja29yZGVyUXVhbnRpdHlMb3dQcmlvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxUb0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsVHJhbnNhY3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFVuaWRlbnRpZmllZFRyYW5zYWN0aW9uc1JlamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFdhdGVyRGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsV2F0ZXJJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsV29ya2VkQnlBbGxFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsV29ya2luZ0ludGVyZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZW1hcmtSZXByZXNlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVtYXJrc1VzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb25TZXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlcnJlZEluUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVycmVkT3V0UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYXZlbEZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdmVsbGluZ0VtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdmVsUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlwRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaXBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVua2VkQ2hhbm5lbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYWNrbm93bGVkZ2VkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYWRqdXN0ZWRDb3JyZWN0b3JSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmNvdmVyZWRDaGVxdWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlvbkVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzQ29tcGxldGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c0ZvclNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzUGVyVW5pdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1Byb2R1Y2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1JlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNXb3JrZWRMYXN0RGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1dvcmtlZFBlckRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNXb3JrZWRQZXJRdWFydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1dvcmtlZFBlcldlZWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVucGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zYWxlYWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNvbGRRdWFudGl0eUhlbGRCeVdob2xlc2FsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVudGlsTmV4dFRyYXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW51c2FibGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW51c2VkQWNjdW11bGF0ZWRTaWNrRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW52ZXJpZmllZFJlY2VpcHRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcmdlbnREZWxpdmVyeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VPZkV4dHJhY29ycG9yZWFsQ2lyY3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZU9mSHlwZXJiYXJpY1ByZXNzdXJpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VPZkh5cGVydGVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlT2ZIeXBvdGVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlT2ZIeXBvdGhlcm1pYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFjYW5jaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFyaWFuY2VBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY3VsYXJSYWRpb3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcmlmaWVkUmVjZWlwdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpc2l0YXRpb25GcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpc2l0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9pY2VTdG9yYWdlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvaWRWb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lU2hyaW5rYWdlQWRqdXN0bWVudE9yQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm90aW5nU2hhcmVzSGVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlclJlLUluamVjdGVkT25Qcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlZWtzV29ya2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodENoYW5nZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0R2FpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0TG9zcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hvbGVzYWxlclRvV2hvbGVzYWxlclNhbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWRlQXJlYVRlbGVwaG9uZVNlcnZpY2VQZXI4MDBTZXJ2aWNlVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtDYWxlbmRhclVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0luUHJvY2VzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1RpbWVVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1RpbWVVbml0c1BlclNoaWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhcnNJblNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhcnNJblRoaXNMaW5lT2ZXb3JrT3JQcm9mZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyc09uSm9iIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyc1JlbWFpbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVzVm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEludmVudG9yeVF1YW50aXR5QXZhaWxhYmxlRm9yU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRQZXJpb2RJbWJhbGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRTZXJ2aWNlTGlmZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFNoYXJlQmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJFc3RpbWF0ZWRMYXRlc3RNZXRlclJlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyRXN0aW1hdGVkUHJldmlvdXNNZXRlclJlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUmVhZGluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYWlseUFkanVzdG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYWlseUF2ZXJhZ2VRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFpbHlXb3JrU2hpZnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VkR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFTdG9yYWdlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRheXNPcGVyYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF5c1Byb2R1Y2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXlzU3VwcGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJlbnR1cmVCb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJlbnR1cmVzRmlsZWRBZ2FpbnN0RGlyZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0Q29sbGVjdG9ycyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2F0YWxvZ1JlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ2F0YWxvZ1VSTCIgdHlwZT0ieHNkOmFueVVSSSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2F0YWxvZ0lEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXRhbG9nSXRlbUlEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDYXRhbG9nUmVmZXJlbmNlIiB0eXBlPSJDYXRhbG9nUmVmZXJlbmNlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZDb250cmFjdEl0ZW0iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkNvbnRyYWN0SXRlbSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQ29udHJhY3RJdGVtIiB0eXBlPSJMaXN0T2ZDb250cmFjdEl0ZW0iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRyYWN0SXRlbSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udHJhY3RJdGVtTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250cmFjdEl0ZW0iIHR5cGU9IkNvbnRyYWN0SXRlbSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uZGl0aW9uc09mU2FsZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iU2FsZXNSZXF1aXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2FsZXNBY3Rpb25Db2RlZCIgdHlwZT0iU2FsZXNBY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTYWxlc0FjdGlvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNhbGVzQWN0aW9uVmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbmRpdGlvbnNPZlNhbGUiIHR5cGU9IkNvbmRpdGlvbnNPZlNhbGUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNhbGVzUmVxdWlyZW1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNhbGVzUmVxdWlyZW1lbnRDb2RlZCIgdHlwZT0iU2FsZXNSZXF1aXJlbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNhbGVzUmVxdWlyZW1lbnRDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTYWxlc1JlcXVpcmVtZW50IiB0eXBlPSJTYWxlc1JlcXVpcmVtZW50Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNhbGVzUmVxdWlyZW1lbnRDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkUXVhbnRpdHlUb01ha2VNaW5pbXVtV2VpZ2h0UmVxdWlyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPcmRlcklmSXRlbXNBcmVPdXRPZlN0b2NrT3JOb3RZZXRQdWJsaXNoZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPcmRlcklmT3V0T2ZTdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja09yZGVyT25seUlmTmV3SXRlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkR3VhcmFudGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5lZFNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNzQW5kTGFib3JTdXJwbHVzQXJlYVNldC1Bc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90UHJlc2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1YWxQcm9kdWN0QWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVkZUltcG9ydFF1b3RhSW5GaXJzdENvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3RvcnlTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVkU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jbHVkZUltcG9ydFF1b3RhSW5GaXJzdENvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yU3VycGx1c0FyZWFTZXQtQXNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhcmdlUHVyY2hhc2VTZXQtQXNpZGVGb3JTbWFsbEJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXlQcmVzaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aS15ZWFyQXdhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQmFja09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1N1YnN0aXR1dGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlQcmlvclRvU2hpcG1lbnRJZlF1YW50aXR5U3BlY2lmaWVkSXNOb3RBdmFpbGFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uUXVhbGlmaWVkQmlkZGVyc0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uUXVhbGlmaWVkTWFudWZhY3R1cmVyc0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVW5saXN0ZWRTYWxlc0NvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbExhYm9yU3VycGx1c0FyZWFTZXRBc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvQXBwcm92ZWRTb3VyY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9FZHVjYXRpb25hbEluc3RpdHV0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvSGlzdG9yaWNhbGx5QmxhY2tDb2xsZWdlT3JVbml2ZXJzaXR5T3JNaW5vcml0eUluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9JbmR1c3RyaWFsUHJlcGFyZWRuZXNzUHJvZ3JhbVBhcnRpY2lwYW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvUXVhbGlmaWVkUHJvZHVjdHNMaXN0UHJvZHVjdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRUb1VTQW5kQ2FuYWRpYW5Tb3VyY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9Zb3VuZ0ludmVzdGlnYXRvclByb2dyYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb244YVNldC1Bc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0LWFzaWRlRm9yQW1lcmljYW5JbmRpYW4tb3duZWRCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEFzU29vbkFzUG9zc2libGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEZ1bGxUcnVja09ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBJbi1QbGFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBhcnRpYWwtQmFsYW5jZUJhY2tPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBhcnRpYWxCYWxhbmNlQ2FuY2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGFydGlhbEJhbGFuY2VTdWJzdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGFydGlhbENhcmxvYWRMb3RzT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBhcnRpYWxJdGVtUXR5UHJvcG9ydGlvbmFsVG9Ub3RhbE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGFydGlhbFRydWNrbG9hZExvdHNPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGVyUmVsZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBlclJlbGVhc2VvckJ1eWVyQXV0aG9yaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBlclNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbEJ1c2luZXNzV2l0aFNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNzQ29uc2lkZXJhdGlvblNldC1Bc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxEaXNhZHZhbnRhZ2VkQnVzaW5lc3NTZXQtQXNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsUHVyY2hhc2VTZXRBc2lkZUZvclNtYWxsQnVzaW5lc3NlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxSZW1haW5pbmdCYWxhbmNlQ2FuY2VsbGF0aW9uQWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxSZW1haW5pbmdCYWxhbmNlQ2FuY2VsbGF0aW9uTm90QWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZUl0ZW1BbGxvd2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnJlc3RyaWN0ZWRQcm9jdXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudHkiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2FsZXNBY3Rpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsQmFsYW5jZVRoYXRFeGNlZWRzU2FsZXNBY3Rpb25WYWx1ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbEVudGlyZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSGF6YXJkb3VzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mSGF6YXJkb3VzSWRlbnRpZmllcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZENsYXNzQ29kZWQiIHR5cGU9IkhhemFyZENsYXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkQ2xhc3NDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkhhemFyZG91c1BsYWNhcmRJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzUmVmZXJlbmNlcyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlJlZmVyZW5jZUNvZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c0NvbnRhY3QiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb250YWN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZE5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlVOREdOdW0iIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iSGF6YXJkb3VzVGVtcGVyYXR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkhhemFyZG91c1NoaXBtZW50SW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVNU051bSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTWZhZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzIiB0eXBlPSJIYXphcmRvdXMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkhhemFyZG91c0lkZW50aWZpZXJzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJIYXphcmRvdXNJZGVudGlmaWVycyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mSGF6YXJkb3VzSWRlbnRpZmllcnMiIHR5cGU9Ikxpc3RPZkhhemFyZG91c0lkZW50aWZpZXJzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJIYXphcmRvdXNJZGVudGlmaWVycyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzUmVndWxhdGlvbnNDb2RlZCIgdHlwZT0iQWdlbmN5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzUmVndWxhdGlvbnNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb2RlRXh0ZW5zaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb2RlVmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkT2ZmaWNpYWxUZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmVtQ2FyZE51bSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzSWRlbnRpZmllcnMiIHR5cGU9IkhhemFyZG91c0lkZW50aWZpZXJzIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkhhemFyZENsYXNzQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSGF6YXJkb3VzUGxhY2FyZEluZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1BsYWNhcmRJZGVudGlmaWNhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzUGxhY2FyZFRleHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkhhemFyZG91c1BsYWNhcmRJbmZvcm1hdGlvbiIgdHlwZT0iSGF6YXJkb3VzUGxhY2FyZEluZm9ybWF0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJIYXphcmRvdXNUZW1wZXJhdHVyZXMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRmxhc2hwb2ludCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVtZXJnZW5jeSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRyb2wiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaXN0T2ZUZW1wZXJhdHVyZUNvZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mRGltZW5zaW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkhhemFyZG91c1RlbXBlcmF0dXJlcyIgdHlwZT0iSGF6YXJkb3VzVGVtcGVyYXR1cmVzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJIYXphcmRvdXNTaGlwbWVudEluZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZFBhY2tpbmdDb2RlZCIgdHlwZT0iSGF6YXJkUGFja2luZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZFBhY2tpbmdDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNTaGlwbWVudENvZGVkIiB0eXBlPSJIYXphcmRvdXNTaGlwbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1NoaXBtZW50Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzU2hpcG1lbnROb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNab25lQ29kZWQiIHR5cGU9IkhhemFyZG91c1pvbmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNab25lQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzU2hpcG1lbnRJbmZvcm1hdGlvbiIgdHlwZT0iSGF6YXJkb3VzU2hpcG1lbnRJbmZvcm1hdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJIYXphcmRQYWNraW5nQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFNwZWNpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JlYXREYW5nZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGl1bURhbmdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlub3JEYW5nZXIiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSGF6YXJkb3VzU2hpcG1lbnRDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbERlc2NyaXB0aXZlSW5mb3JtYXRpb25Ob3RSZXF1aXJlZEJ5UmVndWxhdGlvbkJ1dERlc2lyZWRUb0FjY29tcGFueVRoZU1vdmVtZW50QnlUaGVTaGlwcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0FpcmxpZnRPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJET1QtMTEzRG9Ob3RCdW1wT3JDdXRPZmZDYXJXaGlsZUluTW90aW9uRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZWRDYXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c1doZW5XZXREZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRU1TUGFnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpZmllc1Byb2R1Y3RzSW5BSGVhdGVkTW9sdGVuU3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c1N1YnN0YW5jZUNvbnN0aXR1ZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5oYWxhdGlvbkhhemFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltaXRlZFF1YW50aXR5RGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1GQUdQYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtT3BlcmF0aW5nU3BlZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmluZVBvbGx1dGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9pc29uLUluaGFsYXRpb25IYXphcmREZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9pc29uRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvYWN0aXZlTWF0ZXJpYWxEYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxPckNoZW1pY2FsR3JvdXBOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildhc3RlRGVjbGFyYXRpb24iLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSGF6YXJkb3VzWm9uZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRab25lQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkWm9uZUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZFpvbmVDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRab25lRCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJpY2luZ0RldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJdGVtQWxsb3dhbmNlc09yQ2hhcmdlcyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkFsbG93T3JDaGFyZ2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVG90YWxWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5VmFsdWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJpY2luZ0RldGFpbCIgdHlwZT0iUHJpY2luZ0RldGFpbCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcnlEZXRhaWwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcFRvTG9jYXRpb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMb2NhdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwRnJvbUxvY2F0aW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTG9jYXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZTY2hlZHVsZUxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iSXRlbVBhY2thZ2luZ1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2ltcGxlUGFja2FnZU5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlRlcm1zT2ZEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDYXJnb0NsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEZWxpdmVyeURldGFpbCIgdHlwZT0iRGVsaXZlcnlEZXRhaWwiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlNjaGVkdWxlTGluZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iU2NoZWR1bGVMaW5lIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTY2hlZHVsZUxpbmUiIHR5cGU9Ikxpc3RPZlNjaGVkdWxlTGluZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2NoZWR1bGVMaW5lIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNjaGVkdWxlTGluZUlEIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwbWVudFN0YXR1c0V2ZW50Q29kZWQiIHR5cGU9IlNoaXBtZW50U3RhdHVzRXZlbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwbWVudFN0YXR1c0V2ZW50Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcG1lbnRTdGF0dXNSZWFzb25zIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mU3RhdHVzUmVhc29uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXF1ZXN0ZWREZWxpdmVyeURhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGlzdE9mT3RoZXJEZWxpdmVyeURhdGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZEYXRlQ29kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2NoZWR1bGVMaW5lTm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0UmVmZXJlbmNlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlNoaXBUb1N1YkluZm9ybWF0aW9uIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTY2hlZHVsZUxpbmUiIHR5cGU9IlNjaGVkdWxlTGluZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTaGlwbWVudFN0YXR1c0V2ZW50Q29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEFwcGxpY2FibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFlldFNoaXBwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPcmRlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrT3JkZXJTaGlwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFkeUZvclBpY2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5UcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsbHlTaGlwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsbHlEZWxpdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50Q29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJlZCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU3RhdHVzUmVhc29uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJTdGF0dXNSZWFzb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlN0YXR1c1JlYXNvbiIgdHlwZT0iTGlzdE9mU3RhdHVzUmVhc29uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdGF0dXNSZWFzb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlN0YXR1c1JlYXNvbkNvZGVkIiB0eXBlPSJTdGF0dXNSZWFzb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdGF0dXNSZWFzb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTdGF0dXNSZWFzb24iIHR5cGU9IlN0YXR1c1JlYXNvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTdGF0dXNSZWFzb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VkU2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RydWN0aW9uc0F3YWl0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUmVmdXNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlPbkluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uSW5jb3JyZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRSZXN0cmljdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydFJlc3RyaWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudE5vdFJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURpZmZlcmVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5VG9vTGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnRBdHRyaWJ1dGVkVG9TZWxsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50QXR0cmlidXRlZFRvVGhlQnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50QXR0cmlidXRlZFRvVGhlQ2FycmllciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU2hpcFRvU3ViSW5mb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlNoaXBUb1N1YkluZm9ybWF0aW9uIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTaGlwVG9TdWJJbmZvcm1hdGlvbiIgdHlwZT0iTGlzdE9mU2hpcFRvU3ViSW5mb3JtYXRpb24iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNoaXBUb1N1YkluZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTaGlwVG9TdWJMb2NhdGlvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTaGlwVG9TdWJRdWFudGl0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1YkxvY2F0aW9uSXRlbVBhY2thZ2luZ1JlZmVyZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikl0ZW1QYWNrYWdpbmdSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2hpcFRvU3ViSW5mb3JtYXRpb24iIHR5cGU9IlNoaXBUb1N1YkluZm9ybWF0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJdGVtUGFja2FnaW5nUmVmZXJlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQYWNrYWdlUmVmZXJlbmNlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJdGVtUGFja2FnaW5nUmVmZXJlbmNlIiB0eXBlPSJJdGVtUGFja2FnaW5nUmVmZXJlbmNlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlUmVmZXJlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlSURSZWZlcmVuY2UiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUGFja2FnZVJlZmVyZW5jZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZVJlZmVyZW5jZSIgdHlwZT0iUGFja2FnZVJlZmVyZW5jZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2FyZ29DbGFzc2lmaWNhdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOYXR1cmVPZkdvb2RzIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcGVyYXRpb25hbFR5cGVDb2RlZCIgdHlwZT0iT3BlcmF0aW9uYWxUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3BlcmF0aW9uYWxUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHlwZU9mQ2FyZ28iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNhcmdvQ2xhc3NpZmljYXRpb24iIHR5cGU9IkNhcmdvQ2xhc3NpZmljYXRpb24iLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iT3BlcmF0aW9uYWxUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93VmFsdWVOb24tRHV0aWFibGVDb25zaWdubWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1ZhbHVlRHV0aWFibGVDb25zaWdubWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hWYWx1ZUNvbnNpZ25tZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJOb24tQ29udGFpbmVyaXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvbGwtT25Sb2xsLU9mZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFsbGV0aXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyaXplZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWtidWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNDYXJnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbENhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRDYXJnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVDb250cm9sbGVkQ2FyZ28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmlyb25tZW50YWxQb2xsdXRhbnRDYXJnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90LUhhemFyZG91c0NhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXBsb21hdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Jub3hpb3VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRPZkdhdWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZWhvbGRHb29kc0FuZFBlcnNvbmFsRWZmZWN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvemVuQ2FyZ28iLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlBhY2thZ2VEZXRhaWwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlBhY2thZ2VEZXRhaWwiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlBhY2thZ2VEZXRhaWwiIHR5cGU9Ikxpc3RPZlBhY2thZ2VEZXRhaWwiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2VEZXRhaWwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFja2FnZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOdW1iZXJPZlBhY2thZ2VzIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlBhY2thZ2UiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VEZXRhaWwiIHR5cGU9IlBhY2thZ2VEZXRhaWwiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2VUeXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlVHlwZUNvZGVkIiB0eXBlPSJQYWNrYWdlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhY2thZ2VUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFja2FnZVR5cGVEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkRlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VUeXBlIiB0eXBlPSJQYWNrYWdlVHlwZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQYWNrYWdlVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZXJvc29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHVtaW51bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1tb1BhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtcG91bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtcG91bGUtTm9uLVByb3RlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1wb3VsZS1Qcm90ZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzU3BlY2lmaWVkQnlUaGVET1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0b21pemVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGUtQ29tcHJlc3NlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsZS1Ob24tQ29tcHJlc3NlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsbG9vbi1Ob24tUHJvdGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxsb29uLVByb3RlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFycmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJzLUluQnVuZGxlT3JCdW5jaE9yVHJ1c3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2tldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVlckNyYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWx0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbmdDaGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkLUluQnVuZGxlT3JCdW5jaE9yVHJ1c3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYmJpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9sdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90dGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3R0bGVjcmF0ZS1Cb3R0bGVyYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3R0bGUtTm9uLVByb3RlY3RlZC1CdWxib3VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3R0bGUtTm9uLVByb3RlY3RlZC1DeWxpbmRyaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90dGxlLVByb3RlY3RlZEJ1bGJvdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdHRsZS1Qcm90ZWN0ZWRDeWxpbmRyaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hXaXRoSW5uZXJDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYWNpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1Y2tldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsay1HYXMtQXQxMDMxTWJhckFuZDE1RGVnQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsay1MaXF1ZWZpZWRHYXMtQXRBYm5vcm1hbFRlbXBlcmF0dXJlT3JQcmVzc3VyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsay1MaXF1aWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGstU29saWQtRmluZVBhcnRpY2xlcy1Qb3dkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrLVNvbGlkLUdyYW51bGFyUGFydGljbGVzLUdyYWlucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsay1Tb2xpZC1MYXJnZVBhcnRpY2xlcy1Ob2R1bGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdW5jaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVuZGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJsYXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1dHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhYmluZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbkNhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbi1DeWxpbmRyaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuaXN0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbi1SZWN0YW5ndWxhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FudmFzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJib3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmJveS1Ob24tUHJvdGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJib3ktUHJvdGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJMb2FkLVJhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnRvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlZXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlbWljYWxseUhhcmRlbmVkRmlicmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaHVybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3RoT3JGYWJyaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3RoVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2ZmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZmZpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29pbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGFwc2libGVUdWJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wcmVzc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUNvbW1lcmNpYWxIaWdod2F5TGlmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUVuZ2luZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLU1hYy1Jc28tTHQuV2d0OFg4WDIwRm9vdEFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLU11bHRpLVdhbGxlZC1TZWN1cmVkVG9XYXJlaG91c2VQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1OYXZ5Q2FyZ29UcmFuc3BvcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyc09mQnVsa0NhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JuZXJSZWluZm9yY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JydWdhdGVkT3JTb2xpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyYWRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN5bGluZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW1pam9obi1Ob24tUHJvdGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW1pam9obi1Qcm90ZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvdWJsZS1MZW5ndGhSYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3VibGUtTGVuZ3RoU2tpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG91YmxlLUxlbmd0aFRvdGVCaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvdWJsZVdhbGxDb3JydWdhdGVkQm9hcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvdWJsZS1XYWxsUGFwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyeUJ1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZmZlbGJhZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRnZVByb3RlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVnZ0NyYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmVsb3BlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWJlcmJvYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWJlcmJvYXJkTWV0YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpYnJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWJyZS1QYXBlcmJvYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxtcGFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlya2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGFzayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvLUJpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9hbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vdGxvY2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZFJlZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFtZWRDcmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJ1aXRDcmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzQm90dGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHaXJkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdpcmRlcnMtSW5CdW5kbGVPckJ1bmNoT3JUcnVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbGYtU3RhbmRhcmRSYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYWxmLVN0YW5kYXJkVG90ZUJpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFtcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkc09mQmVlZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9nc2hlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcHBlclRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZWhvbGRHb29kc0NvbnRhaW5lci1Xb29kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmdvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5nb3RzLUluQnVuZGxlQnVuY2hUcnVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5Jbm5lckNvbnRhaW5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1vZGFsVHJhaWxlck9yQ29udGFpbmVyTG9hZC1SYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcm9uT3JTdGVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSmFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKZXJyaWNhbi1DeWxpbmRyaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSmVycmljYW4tUmVjdGFuZ3VsYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVtYm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1dGViYWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktlZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLbm9ja2Rvd25SYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLbm9ja2Rvd25Ub3RlQmluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZ0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmdFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXBPclRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkQnVsayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2dzLUluQnVuZGxlT3JCdW5jaE9yVHJ1c3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvb3NlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMdWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0Y2hCb3giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRhbENhbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGtDcmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsdmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXhlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWl4ZWRDb250YWluZXJUeXBlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9pc3R1cmVSZXNpc3RhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbGRlZFBsYXN0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1zY3ZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGUtV2FsbFBhcGVyLTJPck1vcmVXYWxscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGUtV2FsbFBhcGVyM09yTW9yZVdhbGxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBseUJhZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGktUm9sbFBhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpd2FsbFNhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9pbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90T3RoZXJ3aXNlU3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkhhbmdlck9yUmFja0luQm94ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uT3duV2hlZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVGhhbkdsYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclRoYW5NZXRhbE9yUGxhc3RpY1R1YmVzT3JHbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2VkLU5vdE90aGVyd2lzZVNwZWNpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdW1pbnVtUGFsbGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRhbFBhbGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0ZWVsUGFsbGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29kUGFsbGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGlwU2hlZXRQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRPVFBhbGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFsbGV0LTJXYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhbGxldC00V2F5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFwZXItVmNpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJjZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpdGlvbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZVJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVzLUluQnVuZGxlT3JCdW5jaE9yVHJ1c3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcm5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXRjaGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbmtzLUluQnVuZGxlT3JCdW5jaE9yVHJ1c3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXN0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXN0aWMtSW5qZWN0aW9uTW9sZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFzdGljLVJlZ3JpbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXN0aWMtU3RydWN0dXJhbEZvYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXN0aWMtVmFjdXVtRm9ybWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFzdGljLVZpcmdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhc3RpYy1XcmFwcGVkVHJheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRlcy1JbkJ1bmRsZU9yQnVuY2hPclRydXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGF0Zm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9seWV0aHlsZW5lTGluZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbHlzdHlyZW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvdWNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5TGlmdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZVZlaGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1bHBib2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcnRlck9mQmVlZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbC1TZW1pY29uZHVjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWRuZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5mb3JjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmVyc2VSZWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvZHMtSW5CdW5kbGVPckJ1bmNoT3JUcnVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnViYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdWJiZXJBbmRGYWJyaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhY2hldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhLUNoZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWF2YW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcGFyYXRvck9yRGl2aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhbGxvd0NyYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlZXRtZXRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlZXRzLUluQnVuZGxlT3JCdW5jaE9yVHJ1c3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob29rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaHJpbmtXcmFwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaHJpbmt3cmFwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWRlT2ZCZWVmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVXYWxsQ29ycnVnYXRlZEJvYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2VsZXRvbkNhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraWQtRWxldmF0aW5nT3JMaWZ0VHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsZWV2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xpcHNoZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsSnVtYm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwaW5DeWxpbmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwaW5kbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFpbmxlc3NTdGVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0ZWVsLVZpbnlsQ29hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJldGNoV3JhcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VpdGNhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmstQ3lsaW5kcmljYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmstUmVjdGFuZ3VsYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVhLUNoZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaWVyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90ZUJpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJheVBhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaXBsZVdhbGxDb3JydWdhdGVkQm9hcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVua0FuZENoZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVuay1TYWxlc21lblNhbXBsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1YiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHViZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHViZS1Db2xsYXBzaWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHViZXMtSW5CdW5kbGVPckJ1bmNoT3JUcnVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHViZXMtTWV0YWxPclBsYXN0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5wYWNrZWRPclVucGFja2FnZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY3V1bS1QYWNrZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhblBhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZUluT3BlcmF0aW5nQ29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlZWxlZENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpY2tlcmJvdHRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lyZU1lc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpcmVPckNvcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldyYXBwZWQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlBhY2thZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlBhY2thZ2UiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlBhY2thZ2UiIHR5cGU9Ikxpc3RPZlBhY2thZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VJRCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGlzdE9mSXRlbVJlZmVyZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZk9yZGVyUmVmZXJlbmNlcyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlBhY2thZ2VNYXJrIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlBhY2thZ2VDaGFyYWN0ZXJpc3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZEaW1lbnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mUGFja2FnZURlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnRSZWZlcmVuY2UiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iU3BlY2lhbEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNQYWNrYWdpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJIYXphcmRvdXMiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJBc3NvY2lhdGVkRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwcGluZ0luc3RydWN0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJSZXR1cm5hYmxlQ29udGFpbmVySW5mbyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGFja2FnZURldGFpbCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZSIgdHlwZT0iUGFja2FnZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mT3JkZXJSZWZlcmVuY2VzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJPcmRlclJlZmVyZW5jZXMiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZk9yZGVyUmVmZXJlbmNlcyIgdHlwZT0iTGlzdE9mT3JkZXJSZWZlcmVuY2VzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZQYWNrYWdlTWFyayI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGFja2FnZU1hcmsiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlBhY2thZ2VNYXJrIiB0eXBlPSJMaXN0T2ZQYWNrYWdlTWFyayIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZU1hcmsiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VNYXJrQ29kZWQiIHR5cGU9IlBhY2thZ2VNYXJrQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFja2FnZU1hcmtDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYWNrYWdlTWFya1ZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlTWFyayIgdHlwZT0iUGFja2FnZU1hcmsiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUGFja2FnZU1hcmtDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyLUFzc2lnbmVkUGFja2FnZUlkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyc0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RNYXJrU3VwcGxpZXJzQ29tcGFueU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGlyZVNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeUluc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxSZXF1aXJlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya0FkZGl0aW9uYWxseUN1c3RvbWVyc0FydGljbGVEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya0FydGljbGVOdW1iZXJDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya0JhdGNoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrQ2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya0N1c3RvbWVyc0NvbXBhbnlOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrQ3VzdG9tZXJzUmVmZXJlbmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya0RhdGVPZlByb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtFeGNsdXNpdmVseUN1c3RvbWVyc0FydGljbGVEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya0V4cGlyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtGcmVlVGV4dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya0dyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrTmV0V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrUGFja2FnZXNEaW1lbnNpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrUnVubmluZ051bWJlck9mUGFja2FnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtTZXJpYWxTaGlwcGluZ0NvbnRhaW5lckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtTdXBwbGllck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya1RhcmVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckNhcnRvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRvckFzc2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXRDb25maWd1cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZU1hcmtlZEJ5QnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyQXNzaWduZWREcm9wWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZi1JZGVudGlmeWluZ0NvbnRhaW5lclZpYVJhZGlvRnJlcXVlbmN5SWREZXZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJBc3NpZ25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlci1Bc3NpZ25lZENhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJBc3NpZ25lZFJvbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJBc3NpZ25lZFNraWROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNTQ0MtMTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNTQ0MtMThBbmRBcHBsaWNhdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ1NoaXBwaW5nQ29udGFpbmVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUNDT3JFQU4xMjhBcHBsaWNhdGlvbklkZW50aWZpZXJBbmREYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtQ29kZUNvdW5jaWxGb3JtYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ0NvbnN1bWVyUGFja2FnZUNvZGUtMS01LTUtMSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUGFja2FnZUNoYXJhY3RlcmlzdGljIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQYWNrYWdlQ2hhcmFjdGVyaXN0aWMiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlBhY2thZ2VDaGFyYWN0ZXJpc3RpYyIgdHlwZT0iTGlzdE9mUGFja2FnZUNoYXJhY3RlcmlzdGljIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlQ2hhcmFjdGVyaXN0aWMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VDaGFyYWN0ZXJpc3RpY0NvZGVkIiB0eXBlPSJQYWNrYWdlQ2hhcmFjdGVyaXN0aWNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYWNrYWdlQ2hhcmFjdGVyaXN0aWNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZUNoYXJhY3RlcmlzdGljRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VDaGFyYWN0ZXJpc3RpYyIgdHlwZT0iUGFja2FnZUNoYXJhY3RlcmlzdGljIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlBhY2thZ2VDaGFyYWN0ZXJpc3RpY0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNpbmdUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ1BhY2thZ2VMYWJlbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdQYWNrYWdlU2VhbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdE1hcmtpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVvZlBhY2thZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VTcGVjaWZpY2F0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZVByb3RlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcnBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRmb3JtT3JTa2lkTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlYXJpbmdQaWVjZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnRvbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwYWNpbmdEaXJlY3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRpbmdEZXZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZGluZ0VxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdE1hcmtpbmdQYXR0ZXJuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TWFya2luZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdlT3JDb250YWluZXJNYXJrTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtpbmdNZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcmVDaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0ZhY2lsaXR5TGltaXRhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhZ2dpbmdPckJhckNvZGVJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraWRPclBhbGxldFR5cGUiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlBhY2thZ2VEZXNjcmlwdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGFja2FnZURlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZQYWNrYWdlRGVzY3JpcHRpb24iIHR5cGU9Ikxpc3RPZlBhY2thZ2VEZXNjcmlwdGlvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZURlc2NyaXB0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mUGFja2FnZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRhaW5lckNvdW50ZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxvYWRPcmRlckNvdW50ZXIiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VEZXNjcmlwdGlvbiIgdHlwZT0iUGFja2FnZURlc2NyaXB0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZQYWNrYWdlSWRlbnRpZmllciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGFja2FnZUlkZW50aWZpZXIiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlBhY2thZ2VJZGVudGlmaWVyIiB0eXBlPSJMaXN0T2ZQYWNrYWdlSWRlbnRpZmllciIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZUlkZW50aWZpZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VJZGVudGlmaWVyQ29kZWQiIHR5cGU9IlBhY2thZ2VJZGVudGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFja2FnZUlkZW50aWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYWNrYWdlSWRlbnRpZmllclZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlSWRlbnRpZmllciIgdHlwZT0iUGFja2FnZUlkZW50aWZpZXIiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUGFja2FnZUlkZW50aWZpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFOOE9yRUFOMTNCYXJjb2RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRGMTRPcklURjZCYXJjb2RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUNDT3JFQU4xMjhCYXJjb2RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQURSIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTcGVjaWFsSGFuZGxpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNwZWNpYWxIYW5kbGluZ0NvZGVkIiB0eXBlPSJTcGVjaWFsSGFuZGxpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTcGVjaWFsSGFuZGxpbmdDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTcGVjaWFsSGFuZGxpbmdOb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTcGVjaWFsSGFuZGxpbmciIHR5cGU9IlNwZWNpYWxIYW5kbGluZyIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTcGVjaWFsSGFuZGxpbmdDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVlZFJlc3RyaWN0ZWRUbzE1TWlsZXNQZXJIb3VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVlZFJlc3RyaWN0ZWRUbzI1TWlsZXNQZXJIb3VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVlZFJlc3RyaWN0ZWRUbzM1TWlsZXNQZXJIb3VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVlZFJlc3RyaWN0ZWRUbzQ1TWlsZXNQZXJIb3VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0ZhY2lhbEhhaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcklzQWlyQnJha2VDb250cm9sbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclJlcXVpcmVkUGFja2luZ0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUmVxdWlyZWRQUk9OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUmVxdWlyZWRBcHBvaW50bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZE9uVG9wT2ZSZXNpZHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NlT2ZSZXNpZHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50LUF1dG9LZXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50VG9Nb3ZlV2l0aENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWFsVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50cy1BZHZhbmNlT25seVdheWJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5naG91c2VCYWxhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG93YWJsZUxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklmQmFkT3JkZXJlZE5vdGlmeVNoaXBwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxTaGlwcGVyRm9yV2VpZ2hDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckNvbnNvbGlkYXRvckxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaG1lbnQtQ3VzdG9tZXJzRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyZWRGb3JFeHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckZhY3RvcnlMb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNobWVudC1Db3R0b25NYW5pZmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9NYXJzaGFsbGluZ1JlcXVpcmVkRm9ySGF6YXJkb3VzTWF0ZXJpYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXJjdXNSYW1wT25seVRPRkNWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxDb25zaWduZWVGb3JXZWlnaENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvcExvYWRPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uVGhhdFRoaXNTaGlwbWVudElzRm9yUmVjeWNsaW5nQXNEZWZpbmVkSW5BcHBsaWNhYmxlVGFyaWZmc0NvbnRhaW5pbmdTdWNoUHJvdmlzaW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFuZ2Vyb3VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW11cnJhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQXV0aG9yaXphdGlvblJlcXVpcmVkRm9yRGl2ZXJzaW9uT3JDb25zaWdubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcFlhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5T25seU9uU3VycmVuZGVyT2ZXcml0dGVuT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWRJblRvdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RVbmNvdXBsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbldlaWdodHNBcHBseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzaXZlRGltZW5zaW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0VxdWlwbWVudFRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnZpcm9ubWVudGFsQ29udHJvbExpbWl0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkVtcHR5VmlhUmV2ZXJzZVJvdXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VzSW5jdXJyZWRJZlNoaXBtZW50RmFpbHNUb01lZXRWZXNzZWxMb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NpdmVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGxvc2l2ZUZsYW1tYWJsZUdhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjZUEtRW5kVG9IZWFkT2ZUcmFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjZUItRW5kVG9IZWFkT2ZUcmFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92aW5nVW5kZXJGb3JGdXJ0aGVyYW5jZUluc3RydWN0aW9uc0FuZE1heUJlRGVsaXZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWxsU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhbW1hYmxlR2FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGFtbWFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYW1tYWJsZVBvaXNvbkdhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhZ2lsZS1IYW5kbGVXaXRoQ2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9udHJhbnNpdEZsYXRTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5JbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkRW5kQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZWhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZG9yc2VkQXNIYXphcmRvdXNNYXRlcmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9sZEZvck9yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdGVkUHJpb3JUb0xvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVGb3JSZXBhaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hWYWx1ZUxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hXaWRlTG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW4tQm9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudFRvQmVJbnNwZWN0ZWRBdERlc3RpbmF0aW9uQW5kRGlzcG9zaXRpb25JbnN0cnVjdGlvbnNXaWxsQmVGdXJuaXNoZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyb2ZmaWNlTW92ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0U2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxJbmNlbnRpdmVSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJ2ZWlsbGFuY2VTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdW5jdGlvblNldHRsZW1lbnRBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kQnJpZGdlSW1wb3J0T3JFeHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhclRyaXBMZWFzZWRUb0NvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZ0RldmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRlZFRvRnVsbFZpc2libGVDYXBhY2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc1RoYW5Db250YWluZXJDb25zb2xpZGF0b3JMb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0TG93ZXN0VGhyb3VnaFJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuQ29udGFpbmVyRmFjdG9yeUxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsU2VydmljZU9ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuRnVsbENhcmxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbkluQ2hhcmdlT2ZDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyZWRGb3JCb3JkZXJDcm9zc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVQaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lY2hhbmljYWxSZWZyaWdlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlDb25zaWduZWVCZWZvcmVEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3REaXZlcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vU3BlY2lhbEVudHJhaW5tZW50UmVxdWlyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90SHVtcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3RXF1aXBtZW50Rmlyc3RUcmFuc2JvcmRlck1vdmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdFBvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeVNoaXBwZXJCZWZvcmVSZWNvbnNpZ25tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdFRyYW5zZmVyQ29udGVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluQ2FzZU9mRmlyZURvTm90VXNlV2F0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEZvckV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9kaXR5TG9hZGVkTGVzc1RoYW5PckVxdWFsVG9UaGVDYXJPcmRlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyd2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpc2hhYmxlSW5Cb3hDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVseUNvbnRyb2xsZWRQcml2YXRlRXF1aXBtZW50U3ViamVjdFRvRGVtdXJyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2lzb25vdXNHYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkljZWRQcmlvclRvTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFByb3RlY3Rpb25TZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50LVByZXBhaWRXYXliaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5BdXRob3JpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW5kZXJCaWxsRm9yQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHJvYWRDb250cm9sbGVkUHJpdmF0ZUVxdWlwbWVudFN1YmplY3RUb0RlbXVycmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9hY3RpdmVNYXRlcmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVzaE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyUmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3RIb3VybHlJZkNhclN0b3BwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZEZvclRyYW5zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJMb2FkT3JDYXJyaWVyQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3ZlVG9SZXN0QW5kQ292ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RUb1NwZWNpYWxEZXRlbnRpb25SdWxlc09yQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNobWVudC1TaGlwcGVyc0V4cG9ydERvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlmdGFibGVMb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwVG9Dcm9zc0RvY2tPclBvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVzU2hlbGZDb3VwbGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNobWVudC1TaGlwcGVyc01hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50LVNoaXBwZXJzUGFja2luZ0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlZWRSZXN0cmljdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFja1RyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJldGNoV3JhcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Fyc1RlbXBvcmFyaWx5QXJ0aWN1bGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXJDb25zb2xpZGF0b3JMb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyRmFjdG9yeUxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1cm5DYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVhbVRyYWNrRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVWb2x1bWVSYXRlc09ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZEF0QnVtcGVyQ2lyY3VzUmFtcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGl6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZEZyb21MZWZ0U2lkZU9mQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRBc1BsYWNhcmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5wcm90ZWN0ZWRQZXJpc2hhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRGcm9tUmlnaHRTaWRlT2ZDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJDZXJ0aWZpZXNHcm9zc1dlaWdodFVuZGVyMjQwMDAwUG91bmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJpZmljYXRpb25XZWlnaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVudGlsYXRpb25JbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpZGUtQm9keVBpY2t1cFRydWNrQXBwbGllc1RvRmluaXNoZWRWZWhpY2xlTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FpdmVkSW5zcGVjdGlvbi1TZXREaXJlY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdoRW1wdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaG1lbnRzLUhpZ2hXaWRlTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWl2ZUluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmlmZXN0TXVzdEFjY29tcGFueVdheWJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdoVG9DaGVja0Zvck92ZXJsb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXN0ZVdhdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzVG93biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZWRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxTdXJjaGFyZ2VBdXRob3JpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZzaG9yZS1BbGFza2FPckhhd2FpaVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJzaXplZFByZW1pdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZBaXJXYXliaWxsLU9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZkNhbmFkaWFuQ3VzdG9tc0ludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZFeHBvcnRFbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZkluc3VyYW5jZUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mVS5TLkV4cG9ydERvY3VtZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyZGF5RGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyZGF5UGljay1VcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdHlTaWduYXR1cmVTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXcml0dGVuUHJvb2ZPZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2dyZWdhdGUxMDAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2dyZWdhdGUzMDAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2dyZWdhdGU1MDAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRlbmRhbnRzQWNjb21wYW55aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ3JhZnRGdXJuaXNoZWRBbmROb3RVc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2dyZWdhdGVUZW5kZXJEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJtZWRHdWFyZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxJbmplY3Rpb25PckJsZW5kaW5nU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydENoYW5nZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZU9mQWx0ZXJuYXRlVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEuTS5EZWxpdmVyeVJlcXVpcmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmNob3JpbmdBbmRVbmFuY2hvcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbENvcHlPZlNoaXBwaW5nUGFwZXJzRm9yUHJvb2ZPZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWFuY2VTZXJ2aWNpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckNvbmRpdGlvbmluZ0Rpc2Nvbm5lY3RBbmRDb25uZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsQXJtZWRHdWFyZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclJpZGVUcmFjdG9yU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyUmlkZVRydWNrU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZW1ibHlTZXJ2aWNlUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXhpbGlhcnlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCeXBhc3NDb25zb2xpZGF0aW9uUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGt5QXJ0aWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvY2tpbmdBbmRCcmFjaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGluZFNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2xzdGVyTG9hZERvTm90U3dpdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hpbmdTZXJ2aWNlLURyeUJ1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bmtlclN1cmNoYXJnZUF1dGhvcml6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bmtlckFkanVzdG1lbnQtMjBGb290Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdW5rZXJBZGp1c3RtZW50LTQwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVua2VyQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lBZGp1c3RtZW50LTIwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lBZGp1c3RtZW50LTQwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9lZUNhck9yUGljay1VcFRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXJ0Q29tbWVyY2lhbEJpbGxPZkxhZGluZ0JvbFRvR292ZXJubWVudEJvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckNhYm9vc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJvc2lvbkFkZGl0aXZlU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ZlZXMtQ29udGFpbmVyTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNGZWVzLUxpZnRMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Fycmllckd1YXJkQ2FyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuQ2Fycmllckd1YXJkQ2FyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29UYXhlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhaW5BbmRCaW5kZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsSW52b2ljZVByZXBhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdGFudFN1cnZlaWxsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXNzUmF0ZXNBcHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iLlJhdGVzT3ZlckRldHJvaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb25BbmRMaW5lSGF1bCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RSYXRlc0FwcGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uVGhhdFRoZU5ld3NwcmludFdpbmRpbmdDb3Jlc0JlaW5nUmV0dXJuZWRFbXB0eVdlcmVSZWNlaXZlZEZpbGxlZEJ5UmFpbEZyZWlnaHRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVVbmxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJpZXJPdmVybmlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcGlsb3RTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUGFwZXJzTWFpbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cmllclNhbWVEYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRDYWJvb3NlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkQXRtb3NwaGVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTW91bnRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1aXRvdXNSb3V0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW5jeUFkanVzdG1lbnQtQnJlYWtCdWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3VibGVXaWRlU2VwYXJhdGVBbmRSZWFzc2VtYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU9mRnVlbEZyb21CYXJnZVRvUGlwZWxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvZENvbnN0YW50U3VydmVpbGxhbmNlU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVhbERyaXZlcldpdGhOYXRpb25hbEFnZW5jeUNoZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWFsRHJpdmVyUHJvdGVjdGl2ZVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdlQXRQb3J0T2ZEZWJhcmthdGlvblJhdGVab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvbk9mQ29udmV5aW5nRXF1aXBtZW50QW5kVGhlUG93ZXJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb25PZkNvbnZleWluZ0VxdWlwbWVudEV4Y2x1ZGluZ1RoZVBvd2VyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZUF0UG9ydE9mRW1iYXJrYXRpb25SYXRlWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VlcEZyb21GcmVlemluZ1BlcmNlbnREaWZmZXJlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQxMERyb21lZGFyeVdpdGhNZWNoYW5pY2FsUmVzdHJhaW5pbmdEZXZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MTBEcm9tZWRhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvblNlcnZpY2VSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5T2ZGdWVsRnJvbVJhaWxUYW5rQ2FyVG9QaXBlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5U2hpcHBlckltbWVkaWF0ZWx5SWZTaGlwbWVudElzRGVsYXllZEVuUm91dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90Q291cGxlVG9PdGhlckRpYXBocmFnbWVkQ2FycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RGcmVlemUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90Q291cGxlVG9UYW5rQ2FycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhdGlvbi1TcGVjaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJEaXZlcnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5T2ZGdWVsRnJvbVBpcGVsaW5lVG9CYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZUF0UG9ydE9mRGViYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXlhZ2VBdFBvcnRPZkVtYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU9mRnVlbEZyb21QaXBlbGluZVRvUmFpbFRhbmtDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5T2ZGdWVsRnJvbVBpcGVsaW5lVG9UYW5rVHJ1Y2tPclRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvbldpdGhQb3dlclVuaXRzMzBNaW51dGVQZXJpb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wLU9mZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVtbWluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90Q291cGxlVG9Eb3VibGVTaGVsZkNvdXBsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb21lZGFyeVdpdGhNZWNoYW5pY2FsUmVzdHJhaW5pbmdEZXZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9tZWRhcnlTZXJ2aWNlUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb29yU2lkZVZhbm5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yQXNzb2NpYXRlZFdpdGhEZXRlbnRpb25PZkNvbnZleWluZ0VxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlPZkZ1ZWxGcm9tVGFua1RydWNrT3JUcmFpbGVyVG9QaXBlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uVmVoaWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uV2l0aFBvd2VyVW5pdHM2ME1pbnV0ZVBlcmlvZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhQXhsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY29ydE9yQ291cmllclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5UmFpbGNhck9yZGVyZWRCdXROb3RVc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRIb3NlQXREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50SG9zZUF0T3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdXNpdmVVc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhTGlnaHRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eU1vdmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRvcnNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlSZXR1cm4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdGlzZmFjdG9yeVNlcnZpY2VTdGFuZGFyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc2l2ZVZhbHVhdGlvbkF1dGhvcml6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1c2l2ZVVzZU9mVmVoaWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFEcml2ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhTGVuZ3RoU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRQcmVwYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkUmF0ZXNBcHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYUxhYm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdXNpdmVVc2VPZlZlaGljbGVEYW1hZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBhbmRSZW1vdmVBbmRJbnN0YWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2Fkd2F5RWFzeVJhdGVzQXBwbGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2VGcmVpZ2h0QWxsS2luZHNTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJlYXJtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVybmlzaGluZ0NoYXNzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxGaWx0ZXJzRnVybmlzaGVkQnlDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsRmlsdGVyc0Z1cm5pc2hlZEJ5U2hpcHBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdHJhY2tTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvclByb2Nlc3NpbmdJblRyYW5zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGVkQnlDYXJyaWVyQXRPd25lclNSaXNrT2ZGcmVlemluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yU3RvcmFnZUluVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsdHJhdGlvblNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhcm1lbnRTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQtT3duZWRDb250YWluZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50R3VhcmRDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyZWF0ZXJTZWN1cml0eVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGRBdExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZEJyYWtlc0F0RWFjaEVuZE11c3RCZVJlbGVhc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudEhvbGRvdmVyRm9ySG9saWRheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50SG9sZG92ZXJGb3JXZWVrZW5kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdEluVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdC1TcGVjaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0V2l0aFN0ZWFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2Nlc3NpYmxlSGF6YXJkb3VzTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluYWNjZXNzaWJsZUhhemFyZG91c01hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW5kYXlPckhvbGlkYXlQaWNrdXBPckRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyNEhvdXJBdmFpbGFiaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxIb3NlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoQ3ViZVRyYWlsZXJSYXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdGVyT3JSZWZyaWdlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaXRjaEluc3RhbGxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWxzU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNDYXJnb09uRGVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRsZXJDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJY2luZ0luaGliaXRvclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGFjdG9ncmFwaHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybW9kYWxTaGlwbWVudFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludHJhLVBsYW50TW92ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zaWRlUGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmxpbmVUcmFuc2ZlclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1c3QtSW4tVGltZUppdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRMaW5lRXhjZXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uVGhhdFRoZUNvbnRhaW5lcnNCZWluZ1JldHVybmVkRW1wdHlXZXJlUmVjZWl2ZWRGaWxsZWRCeVJhaWxGcmVpZ2h0U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VlcE1hdGVyaWFsRHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvckRpc3R1cmJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXlvdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBseUFVQ0NPckVBTlNlcmlhbFNoaXBwaW5nQ29udGFpbmVyTGFiZWxUb1RoZVNoaXBwaW5nQ29udGFpbmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlnaHRCYXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dCb3lUcmFpbGVyT3JGbGF0QmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kQ3VycmVuY3lBZGp1c3RtZW50RmFjdG9yLTIwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZEN1cnJlbmN5QWRqdXN0bWVudC00MEZvb3RDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnREaWZmZXJlbnRpYWwtTGVzc1RoYW5Db250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5laGF1bEZyb21Qb3J0T2ZEZWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZWhhdWxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWFiaWxpdHlPZkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVyVGVybXNBdFBvcnRPZkRlYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lclRlcm1zQXRQb3J0T2ZFbWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZWhhdWxQZXJjZW50RGlmZmVyZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5laGF1bFRvUG9ydE9mRW1iYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuVHJ1Y2tsb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXlvdmVyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kaWZpZWRBdG1vc3BoZXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2NvcnRTZXJ2aWNlV2l0aE92ZXJuaWdodFN1YnNpc3RlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2NvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY29ydFNlcnZpY2VzVGVsZXBob25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1bGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yU3VydmVpbGxhbmNlU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlUcmFmZmljRXhwZWRpdGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxNb3RvclN1cnZlaWxsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RIdW1wT3JIdW1wSW50byIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RVc2VIZWxwZXJMb2NvbW90aXZlVG9QdXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1BsYWNhcmRzUmVxdWlyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vc2VTaWRlVmFubmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Rvd0F3YXlGcm9tSGVhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvY2tTdG93YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0Fib2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckxvYWRBbmRDb25zaWduZWVVbmxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJIZWlnaHRDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpbmdTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlWZXJpZmljYXRpb25Ob3RSZXF1aXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Rvd1dpdGhEb29yc0ZhY2luZ0lud2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0Q29tbW9kaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbkZyb250T2ZIb3VzZVN0b3dhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bWlnYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhhcm1sZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxGaWVsZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZU5vSG9va3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFJlc3RyaWN0ZWRDYXJnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29PbkJvYXJkQ2VydGlmaWNhdGlvblJlcXVpcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkRlY2tTdG93YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyTG9hZEFuZENhcnJpZXJVbmxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlzaGFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Rvd0JlbG93RGVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Rvd0JldHdlZW5EZWNrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lT2ZEZWxpdmVyeUFuZFNpZ25hdHVyZVJlcXVpcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPblRvcEluLUhhdGNoU3Rvd2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25Ub3BPbi1EZWNrU3Rvd2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJDb250YWluZXJPbi1EZWNrU3Rvd2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVsb3dXYXRlckxpbmVTdG93YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyZmxvdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcldpZHRoQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmVXYXlSYXRlc0FwcGxpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1bXBpbmdFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cE9mU2hpcG1lbnRzT25TYXR1cmRheVN1bmRheUFuZE9ySG9saWRheXNSZXF1aXJpbmdBYnNvbHV0ZU5leHREYXlEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwQW5kRGVsaXZlcnlGcm9tU3RvcmFnZUluVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwQW5kRGVsaXZlcnlCZXlvbmRTZXJ2aWNlQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFBlcm1pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RGcm9tSGVhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVySG91clJhdGVzQXBwbGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhbGxldHNPclNraWRzT3JQbGF0Zm9ybXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlAuTS5EZWxpdmVyeVJlcXVpcmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJNaWxlUmF0ZXNBcHBseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwT2ZTaGlwbWVudHNSZXF1aXJpbmdTYW1lRGF5RGVsaXZlcnlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXBPZlNoaXBtZW50c1JlcXVpcmluZ1NhbWVEYXlEZWxpdmVyeVNlcnZpY2VBbmRPckRlbGl2ZXJ5QXRBU3BlY2lmaWVkVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlhbm9Pck9yZ2FuQ2FycnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc2l0aW9uaW5nQXRPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cEFuZERlbGl2ZXJ5U2VydmljZUZvclBlcmlzaGFibGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsb2RnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZmZpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RpdmVTZXJ2aWNlU2VjdXJpdHlXaXRoQXJtZWRHdWFyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RpdmVTZWN1cml0eVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RpdmVUYXJwRm9yU2VjdXJpdHlQdXJwb3NlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXBBbmREZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja0FuZFVucGFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFVQVHJhaWxlclJhdGVzQXBwbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvbmRlZFByaXZhdGVseU93bmVkVmVoaWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uT2ZQcml2YXRlbHlPd25lZFZlaGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklub3BlcmFibGVQcml2YXRlbHlPd25lZFZlaGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmdPclVubG9hZGluZ09mUHJpdmF0ZWx5T3duZWRWZWhpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlT3duZWRWZWhpY2xlUHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcC1PZmZzRm9yUHJpdmF0ZWx5T3duZWRWZWhpY2xlU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVseU93bmVkVmVoaWNsZUluVHJ1Y2thd2F5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JpdHlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbnNpZ25tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsaGVhZEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkcmFpbGVyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG90dGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbnRpYWxEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlZmVyTWFpbnRlbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VkVmFsdWVDaGFyZ2VJbkV4Y2Vzc09mQ2Fycmllck1heGltdW1MaWFiaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbG9jYXRpb25PZlZlaGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybk9mRW1wdHlDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybk1vdmVtZW50T2ZQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxTdXJ2ZWlsbGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWZlckNhcmdvUGVyY2VudERpZmZlcmVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91bmRUcmlwU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFNwZWVkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZXJ2YXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXdlaWdodFJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRIb2xkb3Zlck9uV2Vla2VuZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyZGF5UGlja3VwT3JEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENvbnRhaW5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJMb2FkQW5kQ29uc2lnbmVlVW5sb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsRHJvbWVkYXJ5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEVxdWlwbWVudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckV4cG9ydERlY2xhcmF0aW9uUmVxdWlyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWlyc0VsZXZhdG9yRXhjZXNzQ2FycnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDaGFyZ2VBcHBsaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0eUVzY29ydFZlaGljbGVTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVGYWN0b3JPcmlnaW5hdGlvbk9yRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUZhY3Rvck9yaWdpbmF0aW9uT3JQb3J0T2ZEZWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlRmFjdG9yUG9ydE9mRW1iYXJrYXRpb25PckRlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsVHJhaW5Nb3ZlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50SG9sZG92ZXJPbkhvbGlkYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyTG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRIb2xkb3Zlck9uV2Vla2RheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraXJ0aW5nQW5kVW5za2lydGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckxvYWRBbmRDb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxQYWNrYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pdEFTaGlwTm90aWNlT3JNYW5pZmVzdFRyYW5zYWN0aW9uU2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXRlbGxpdGVTdXJ2ZWlsbGFuY2VTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudEZyb21Ob24tVGVtcFN0b3JhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3AtT2ZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyTG9hZEFuZENhcnJpZXJVbmxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQZXJtaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwcmVhZGVyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdEZvclN0b3JhZ2UtTm9TaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXRQaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnZleWluZ1JvdXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyaXBwaW5nU29ydGluZ0FuZENvbnNvbGlkYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVTZXJ2aWNlTm90VG9CZVVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGVMYXNoaW5nRXF1aXBtZW50UGxlU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kdWN0aXZpdHlPckFudGktU3RhdGljQWRkaXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3AtT2ZmQXREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Rvd2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcC1PZmZBdE9yaWdpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYXR1cmVBbmRUYWxseVJlY29yZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdEZvclVubG9hZGluZ0Zyb21BRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG90Rm9yVW5sb2FkaW5nRnJvbUJCcmFrZUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNvclJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZU9mVmVoaWNsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrbG9hZC1Eb3VibGVPcGVyYXRvci1Db21tb25DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja2xvYWQtRG91YmxlT3BlcmF0b3ItUGFkZGVkVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbEhhbmRsaW5nQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuZGVyZWRBc1RydWNrbG9hZFRydWNrbG9hZFNlcnZpY2VSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpLVRhbmtTdXJ2ZWlsbGFuY2VTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5kZXJpbmdPZk11bHRpcGxlVmVoaWNsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXJPbkZsYXRDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjdG9yT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tSYXRlc0FwcGxpY2FibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXJQcmVwYXJhdGlvbi1TcGVjaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJQcm9kdWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXJlUmVwYWlyQW5kUmVwbGFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVTaG93Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjdG9yQW5kVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tsb2FkLVNpbmdsZU9wZXJhdG9yLUNvbW1vbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrbG9hZC1TaW5nbGVPcGVyYXRvci1QYWRkZWRWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtTdXJ2ZWlsbGFuY2VTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlckNhcnJpYWdlRnVybmlzaGVkQnlDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnBhY2tpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZGluZ09yUmVsb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGlsaXRpZXNEaXNjb25uZWN0QW5kQ29ubmVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFjdXVtU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9lZVZhblR5cGVUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFuQ2xlYW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVzRnVybmlzaGVkQnV0Tm90VXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZXNJbm9wZXJhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wLU9mZkRlbGl2ZXJ5T2ZQZXJzb25hbFZlaGljbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlc0luVHJ1Y2thd2F5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGFyZmFnZS1CcmVha2J1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoYXJmYWdlLUNvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJmcm9udERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGFyZmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyUmlza0NyZXdCb251cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyUmlza0luc3VyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FpdGluZ1RpbWVBdXRob3JpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRWZXJpZmljYXRpb24iLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFzc29jaWF0ZWREb2N1bWVudHMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZEb2N1bWVudExvb3NlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkRvY3VtZW50QXR0YWNoZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFzc29jaWF0ZWREb2N1bWVudHMiIHR5cGU9IkFzc29jaWF0ZWREb2N1bWVudHMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkRvY3VtZW50TG9vc2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJEb2N1bWVudExvb3NlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFja2FnZURvYyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZEb2N1bWVudExvb3NlIiB0eXBlPSJMaXN0T2ZEb2N1bWVudExvb3NlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlRG9jIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRvY3VtZW50VGl0bGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkRvY3VtZW50VHlwZUNvZGVkIiB0eXBlPSJEb2N1bWVudFR5cGVDb2RlIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkRvY3VtZW50VHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZURvYyIgdHlwZT0iUGFja2FnZURvYyIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJEb2N1bWVudFR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZkFuYWx5c2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mQ29uZm9ybWl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZlF1YWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RQZXJmb3JtYW5jZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFNwZWNpZmljYXRpb25SZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NEYXRhUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFNhbXBsZVRlc3RSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlU2FsZXNDYXRhbG9ndWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5SW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxMYWJlbEFwcHJvdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxsQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0TGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmVkQ2VydGlmaWNhdGVPZlZhbHVlQW5kT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZlbWVudENlcnRpZmljYXRlQVRyMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5RGF0YU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZVRvUXVlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c0luZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0b3ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckRpc2NoYXJnZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZVN1cGVyYW5udWF0aW9uQ29udHJpYnV0aW9uc0FkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlTdXBlcmFubnVhdGlvbkNvbnRyaWJ1dGlvbnNBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZVN1cGVyYW5udWF0aW9uTWVtYmVyTWFpbnRlbmFuY2VNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeVN1cGVyYW5udWF0aW9uTWVtYmVyTWFpbnRlbmFuY2VNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlSW5zdXJhbmNlUGF5cm9sbERlZHVjdGlvbnNBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyYm9uZFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyYm9uZEFwcHJvdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mU2VhbGluZ09mRXhwb3J0TWVhdExvY2tlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aXR5Q2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2VUb0FUcmFkZVN0YXRpc3RpY3NNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWNjaW5hdGlvbkNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmluZ0xpY2VuY2VOYXRpb25hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmluZ0xpY2VuY2VJbnRlcm5hdGlvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlUGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vhc29uVGlja2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRTdGF0dXNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydFN0YXR1c1JlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtpbmdTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhLUNvbW11bml0eVRyYWRlU3RhdGlzdGljYWxEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV3JpdHRlbkluc3RydWN0aW9uc0luQ29uZm9ybWFuY2VXaXRoQWRyQXJ0aWNsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlQ2VydGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRhdGVkUHJpY2VkVGVuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZVNhbGVzQ2F0YWxvZ3VlUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlTmVnb3RpYXRpb25SZXN1bHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eUFuZEhhemFyZERhdGFTaGVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxTdGF0ZW1lbnRPZkFuQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdGluZ1N0YXRlbWVudE9mQW5BY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zaW5nU3RhdGVtZW50T2ZBbkFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE9uLUhpcmVSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE9mZi1IaXJlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnQtTmlsT3V0dHVybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50LVRpbWUtVXBVbmRlcmJvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudC1VbmRlcmJvbmRCeVNlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50LVBlcnNvbmFsRWZmZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnQtVGltYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeUNyZWRpdEFzc2Vzc21lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdENvdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50QWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbERpc3B1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNzaWdubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGF0ZXJhbEFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNoaXBQZXJtaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsRGVmaW5pdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsRGF0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvclN0YXRpc3RpY2FsRGF0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbC1PZmZEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnRTdGF0dXNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeU1vdmVtZW50QWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlTdGF0dXNBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0Tm90ZVJlbGF0ZWRUb0dvb2RzT3JTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Tm90ZVJlbGF0ZWRUb0dvb2RzT3JTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJlZFNlcnZpY2VzSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Tm90ZVJlbGF0ZWRUb0ZpbmFuY2lhbEFkanVzdG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdE5vdGVSZWxhdGVkVG9GaW5hbmNpYWxBZGp1c3RtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc01hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxVbnBhY2tSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxDYXJnb1N1bW1hcnlNYW5pZmVzdFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnRVbnBhY2tSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXRBbmRNZWF0QnktUHJvZHVjdHNTYW5pdGFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWF0Rm9vZFByb2R1Y3RzU2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG91bHRyeVNhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcnNlbWVhdFNhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2luZ1Nhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoYXJtYWNldXRpY2FsU2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5lZGlibGVTYW5pdGFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBlbmRpbmdBcnJpdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFuc09mVHJhbnNwb3J0QWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvUmVsZWFzZU5vdGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaXNlQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbkRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhOb3RpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudERpcmVjdEludGVyY2hhbmdlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRJbXBlbmRpbmdBcnJpdmFsQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnREYW1hZ2VSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE1haW50ZW5hbmNlQW5kUmVwYWlyV29ya0VzdGltYXRlQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRFbXB0eVJlbGVhc2VJbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0TW92ZW1lbnRHYXRlSW5SZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydE1vdmVtZW50R2F0ZU91dFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50VW5wYWNraW5nSW5zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFVucGFja2luZ1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50UGljay1VcEF2YWlsYWJpbGl0eVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFBpY2stVXBBdmFpbGFiaWxpdHlDb25maXJtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFBpY2stVXBSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFNoaWZ0UmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnREaXNjaGFyZ2VJbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RGlzY2hhcmdlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZXNSZXF1aXNpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0TG9hZGluZ0luc3RydWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRMb2FkaW5nUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRNYWludGVuYW5jZUFuZFJlcGFpcldvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydERlcGFydHVyZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RW1wdHlFcXVpcG1lbnRBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudEFjY2VwdGFuY2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3BlY2lhbFNlcnZpY2VJbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3RvY2tSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENhcmdvUmVsZWFzZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNpbmdEYXRhU2hlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFBhY2tpbmdJbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0NsZWFyYW5jZU5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RvY3VtZW50c0V4cGlyYXRpb25Ob3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE9uLUhpcmVSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRPbi1IaXJlT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE9mZi1IaXJlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3VydmV5T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN1cnZleU9yZGVyUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN1cnZleVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNpbmdJdGVtc1RvQmVCb29rZWRUb0FGaW5hbmNpYWxBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRNYWludGVuYW5jZUFuZFJlcGFpcldvcmtFc3RpbWF0ZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRNYWludGVuYW5jZUFuZFJlcGFpck5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlDb250YWluZXJEaXNwb3NpdGlvbk9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb1Zlc3NlbERpc2NoYXJnZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb1Zlc3NlbExvYWRpbmdPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlkcm9wT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhaWxtZW50Q29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2ljQWdyZWVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbFRyYW5zcG9ydE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kZWZpbml0ZURlbGl2ZXJ5SW5kZWZpbml0ZVF1YW50aXR5Q29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGVmaW5pdGVEZWxpdmVyeURlZmluaXRlUXVhbnRpdHlDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZW1lbnRzQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhc2tPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFrZU9yQnV5UGxhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvclBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3REYXRhU3VtbWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVkQ29zdEFuZFByaWNlRGF0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZURldGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RnVuZHNTdGF0dXNSZXBvcnRDZnNyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZWRJbnNwZWN0aW9uQW5kVGVzdFJlc3VsdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsSW5zcGVjdGlvbkFuZFJlY2VpdmluZ1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2luZ1NwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRPclBlcmZvcm1hbmNlQm9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RTZWN1cml0eUNsYXNzaWZpY2F0aW9uU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ1NwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eUFtZXJpY2FDZXJ0aWZpY2F0ZU9mQ29tcGxpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyT2ZmLUhpcmVOb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQWNjZXB0YW5jZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrLVVwTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3Jpc2F0aW9uVG9QbGFuQW5kU3VnZ2VzdE9yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXNhdGlvblRvUGxhbkFuZFNoaXBPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQZXJmb3JtYW5jZVJlcG9ydENwckZvcm1hdDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RTY2hlZHVsZVN0YXR1c1JlcG9ydENzc3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQZXJmb3JtYW5jZVJlcG9ydENwckZvcm1hdDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQZXJmb3JtYW5jZVJlcG9ydENwckZvcm1hdDMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQZXJmb3JtYW5jZVJlcG9ydENwckZvcm1hdDQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQZXJmb3JtYW5jZVJlcG9ydENwckZvcm1hdDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyZXNzaXZlRGlzY2hhcmdlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxhbmNlQ29uZmlybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTdHJpcHBpbmdPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU3R1ZmZpbmdPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmV5YW5jZURlY2xhcmF0aW9uQXJyaXZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmV5YW5jZURlY2xhcmF0aW9uRGVwYXJ0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXlhbmNlRGVjbGFyYXRpb25Db21iaW5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFJlY292ZXJ5UGxhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFByb2R1Y3Rpb25QbGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbEFuZE90aGVyQWRtaW5pc3RyYXRpdmVJbnRlcm5hbERvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE1hc3RlclNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZWRBbHRlcm5hdGVUZW5kZXJCaWxsT2ZRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUHJpY2VkQmlsbE9mUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWZ0QmlsbE9mUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0Q29sbGVjdGlvbkluc3RydWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yQW5BbWVuZG1lbnRPZkFEb2N1bWVudGFyeUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBbWVuZG1lbnRJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aWNlT2ZBbkFtZW5kbWVudE9mQURvY3VtZW50YXJ5Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZVRvQW5BbWVuZG1lbnRPZkFEb2N1bWVudGFyeUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRJc3N1YW5jZUluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQYXltZW50VmFsdWF0aW9uUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5bWVudFZhbHVhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxQYXltZW50VmFsdWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50VmFsdWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVZhbHVhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlWYWx1YXRpb25SZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEJpbGxPZlF1YW50aXRpZXMtQm9xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnByaWNlZEJpbGxPZlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZWRUZW5kZXJCb3EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVucXVpcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW1BcHBsaWNhdGlvbkZvclBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmVlbWVudFRvUGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yRmluYW5jaWFsQ2FuY2VsbGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtQXV0aG9yaXNlZERpcmVjdERlYml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZJbnRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmVkVW5wcmljZWRCaWxsT2ZRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFZhbHVhdGlvbkZvclVuc2NoZWR1bGVkSXRlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsUGF5bWVudFJlcXVlc3RCYXNlZE9uQ29tcGxldGlvbk9mV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFJlcXVlc3RGb3JDb21wbGV0ZWRVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsYW5rZXRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdXNoT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpck9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxsT2ZmT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25tZW50T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd2FwT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJDaGFuZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpcmVPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BhcmVQYXJ0c09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW1wYWlnblByaWNlU2FsZXNDYXRhbG9ndWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Rm9yZWNhc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzRG9ja2luZ1NlcnZpY2VzT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1QcmUtQXV0aG9yaXNlZERpcmVjdERlYml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0ZWREaXJlY3REZWJpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5SW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUp1c3QtSW4tVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLUF1dGhvcmlzZWREaXJlY3REZWJpdFJlcXVlc3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUHJlLUF1dGhvcmlzZWREaXJlY3REZWJpdFJlcXVlc3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVJlbGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnRPZkFMZXR0ZXJPZkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua1RvQmFua0Z1bmRzVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUGF5bWVudE9yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93VmFsdWVQYXltZW50T3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmV3TGlzdERlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZVRvUHJldmlvdXNCYW5raW5nU3RhdHVzTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE1hc3RlclBsYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQbGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0U2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQbGFubmluZ0F2YWlsYWJsZVJlc291cmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFBsYW5uaW5nQ2FsZW5kYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kaW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvTW92ZW1lbnRFdmVudExvZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29BbmFseXNpc1ZveWFnZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZkJpbGxlZENyZWRpdE5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZENyZWRpdE5vdGUtR29vZHNBbmRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5QWRqdXN0bWVudFN0YXR1c1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50TW92ZW1lbnRJbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50TW92ZW1lbnRSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN0YXR1c0NoYW5nZVJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVtaWdhdGlvbkNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW5lQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2xIZWFsdGhDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlOb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3Q29kZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZGVDaGFuZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW1wbGVEYXRhRWxlbWVudFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbXBsZURhdGFFbGVtZW50Q2hhbmdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9zaXRlRGF0YUVsZW1lbnRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wb3NpdGVEYXRhRWxlbWVudENoYW5nZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlZ21lbnRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWdtZW50Q2hhbmdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3TWVzc2FnZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VJbkRldmVsb3BtZW50UmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kaWZpY2F0aW9uT2ZFeGlzdGluZ01lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNraW5nTnVtYmVyQXNzaWdubWVudFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlckRpcmVjdG9yeURlZmluaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZE5hdGlvbnNTdGFuZGFyZE1lc3NhZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRGlyZWN0b3J5RGVmaW5pdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLYW5iYW5TY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdERhdGFNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ2xhaW1Gb3JQYXJ0c0FuZE9yTGFib3VyQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTY2hlZHVsZVJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvblJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25BY2tub3dsZWRnZW1lbnRBbmRFcnJvclJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VWYXJpYXRpb25JbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXROb3RlRm9yUHJpY2VWYXJpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RydWN0aW9uVG9Db2xsZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNHb29kc0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvblJlbmV3YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbkNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2VUb1JlZ2lzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wbGVtZW50YXRpb25HdWlkZWxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBlcmZvcm1hbmNlUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkVycm9yQW5kQWNrbm93bGVkZ2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoUG9vbEZpbmFuY2lhbFN0YXRlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VxdWVuY2VkRGVsaXZlcnlTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsY3JlZGVyZUNyZWRpdE5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmVyUXVvdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yUXVvdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlbWVudE1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRXJyb3JNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb01vdmVtZW50Vm95YWdlU3VtbWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yVXNhZ2VPZkJlcnRoT3JNb29yaW5nRmFjaWxpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JEZXNpZ25hdGlvbk9mQmVydGhpbmdQbGFjZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yU2hpZnRpbmdGcm9tVGhlRGVzaWduYXRlZFBsYWNlSW5Qb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YXJ5RG9jdW1lbnRGb3JBcHBsaWNhdGlvbkZvckNhcmdvT3BlcmF0aW9uT2ZEYW5nZXJvdXNHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VtZW50T2ZPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFyeURvY3VtZW50Rm9yQXBwbGljYXRpb25Gb3JUcmFuc3BvcnRPZkRhbmdlcm91c0dvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpY2FsQ2hhcmFjdGVyUmVhZGluZ09jclBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5U2FsZXNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVtZXJnZW5jeUNhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zvcm1hSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmFtZVByb2R1Y3RQbGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tSW5zdXJhbmNlQ2VkaW5nQm9yZGVyZWF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yRGVsaXZlcnlJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxJbnZvaWNlV2hpY2hJbmNsdWRlc0FQYWNraW5nTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVEYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25Gb3JDYXJnb0V4YW1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25Gb3JDYXJnb0V4YW1pbmF0aW9uQWx0ZXJuYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29raW5nUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0NyZXdBbmRDb252ZXlhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zU3VtbWFyeURlY2xhcmF0aW9uV2l0aENvbW1lcmNpYWxEZXRhaWxBbHRlcm5hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1zQm9va2VkVG9BRmluYW5jaWFsQWNjb3VudFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0T2ZUcmFuc2FjdGlvbnNXaGljaE5lZWRGdXJ0aGVySW5mb3JtYXRpb25Gcm9tVGhlUmVjZWl2ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyc0xldHRlck9mSW5zdHJ1Y3Rpb25zQWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRPZlRyYW5zYWN0aW9uc0ZvckluZm9ybWF0aW9uT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FydGFnZU9yZGVyTG9jYWxUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkaUFzc29jaWF0ZWRPYmplY3RBZG1pbmlzdHJhdGlvbk1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWR5Rm9yRGVzcGF0Y2hBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1hcnlTYWxlc1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJTdGF0dXNFbnF1aXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlclN0YXR1c1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYXRpb25SZWdhcmRpbmdUaGVJbndhcmRBbmRPdXR3YXJkTW92ZW1lbnRPZlZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWNhdGlvbk9mVXNhZ2VPZkJlcnRoT3JNb29yaW5nRmFjaWxpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JWZXNzZWxzRW50ZXJpbmdJbnRvUG9ydEFyZWFJbk5pZ2h0LVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWNhdGlvbk9mRW1lcmdlbmN5U2hpZnRpbmdGcm9tVGhlRGVzaWduYXRlZFBsYWNlSW5Qb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zU3VtbWFyeURlY2xhcmF0aW9uV2l0aG91dENvbW1lcmNpYWxEZXRhaWxBbHRlcm5hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmZvcm1hbmNlQm9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEJvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmljZU9mRGlzdHJpYnV0aW9uT2ZEb2N1bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXROb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXNzaW9uTm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXROb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXltZW50SW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlyZUludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGYtQmlsbGVkSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsY3JlZGVyZUludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3RvcmVkSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdubWVudEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3RvcmVkQ3JlZGl0Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEFjY291bnRTdW1tYXJ5UmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzRG9ja2luZ0Rlc3BhdGNoQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3NoaXBtZW50RGVzcGF0Y2hBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2VwdGlvbmFsT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zc2hpcG1lbnRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3NEb2NraW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYW5zT2ZUcmFuc3BvcnRhdGlvbkF2YWlsYWJpbGl0eUluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFuc09mVHJhbnNwb3J0YXRpb25TY2hlZHVsZUluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnREZWxpdmVyeU5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdHJ1Y3Rpb25zRm9yQmFua1RyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckJhbmtlcnNEcmFmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvblBheW1lbnRBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0UGF5bWVudEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBY2NlcHRhbmNlQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdE5lZ290aWF0aW9uQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckJhbmtlcnNHdWFyYW50ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtlcnNHdWFyYW50ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0TGV0dGVyT2ZJbmRlbW5pdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWFkdmljZU9mQUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvbk9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudHNQcmVzZW50YXRpb25Gb3JtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkUGF5bWVudE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZVBheW1lbnRPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0QWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZENyZWRpdEFkdmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmVyc2FsT2ZEZWJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2ZXJzYWxPZkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0Tm90aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdFRyYW5zZmVyQWR2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFtZW5kbWVudE5vdGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBbWVuZG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0dGFuY2VBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtlcnNEcmFmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mRXhjaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc3NvcnlOb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxTdGF0ZW1lbnRPZkFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlbWVudE9mQWNjb3VudE1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VQb2xpY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZURlY2xhcmF0aW9uU2hlZXRCb3JkZXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZXJzSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJOb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkaW5nSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzQWR2aWNlVG9JbXBvcnRBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc0FkdmljZVRvRXhwb3J0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzQ2VydGlmaWNhdGVPZlJlY2VpcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nTm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc1dhcmVob3VzZVJlY2VpcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUmVjZWlwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydENoYXJnZXNEb2N1bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZVdhcnJhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5T3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRsaW5nT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdGVQYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXliaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzYWxNdWx0aXB1cnBvc2VUcmFuc3BvcnREb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNSZWNlaXB0Q2FycmlhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXNlV2F5YmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ09yaWdpbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdDb3B5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUNvbnRhaW5lckJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtlckJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhV2F5YmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5sYW5kV2F0ZXJ3YXlCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1OZWdvdGlhYmxlTWFyaXRpbWVUcmFuc3BvcnREb2N1bWVudEdlbmVyaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVzUmVjZWlwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91c2VCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mSW5kZW1uaXR5Rm9yTm9uLVN1cnJlbmRlck9mQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsQ29uc2lnbm1lbnROb3RlR2VuZXJpY1Rlcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRMaXN0LVNtZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY29ydE9mZmljaWFsUmVjb2duaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2hhcmdpbmdEb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZENvbnNpZ25tZW50Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyV2F5YmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQWlyV2F5YmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZUFpcldheWJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZXdzRWZmZWN0c0RlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzZW5nZXJMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU5vdGljZVJhaWxUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZVBvc3RQYXJjZWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aW1vZGFsQ29tYmluZWRUcmFuc3BvcnREb2N1bWVudEdlbmVyaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocm91Z2hCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNDZXJ0aWZpY2F0ZU9mVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5lZFRyYW5zcG9ydERvY3VtZW50R2VuZXJpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGltb2RhbFRyYW5zcG9ydERvY3VtZW50R2VuZXJpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluZWRUcmFuc3BvcnRCaWxsT2ZMYWRpbmdNdWx0aW1vZGFsQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29raW5nQ29uZmlybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxsaW5nRm9yd2FyZE5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxOb3RpY2VHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWNlT2ZDaXJjdW1zdGFuY2VzUHJldmVudGluZ0RlbGl2ZXJ5R29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGljZU9mQ2lyY3Vtc3RhbmNlc1ByZXZlbnRpbmdUcmFuc3BvcnRHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlOb3RpY2VHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29NYW5pZmVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodE1hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3JkZXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck1hbmlmZXN0VW5pdFBhY2tpbmdMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VzTm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aWNlT2ZDb2xsZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlPZlNoaXBDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5T2ZSYWRpb0NlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlPZkVxdWlwbWVudENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXZpbExpYWJpbGl0eUZvck9pbENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkbGluZURvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXJhdERvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpdGltZURlY2xhcmF0aW9uT2ZIZWFsdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZSZWdpc3RyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHNTdG9yZXNEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0TGljZW5jZUFwcGxpY2F0aW9uRm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRMaWNlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNoYW5nZUNvbnRyb2xEZWNsYXJhdGlvbkV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlTW9kZWxUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVNb2RlbFQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVNb2RlbFQyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sRG9jdW1lbnRUNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmUtU2VuZGluZ0NvbnNpZ25tZW50Tm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlTW9kZWxUMkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzRGVjbGFyYXRpb25Gb3JFeHBvcnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29EZWNsYXJhdGlvbkRlcGFydHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JHb29kc0NvbnRyb2xDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNDb250cm9sQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yUGh5dG9zYW5pdGFyeUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHl0b3Nhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbml0YXJ5Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyaW5hcnlDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JJbnNwZWN0aW9uQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZk9yaWdpbkFwcGxpY2F0aW9uRm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhdGlvbk9mT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb25hbEFwcGVsbGF0aW9uQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcmVuY2VDZXJ0aWZpY2F0ZU9mT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mT3JpZ2luRm9ybUdzcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsYXJJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNHb29kc0RlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbERvY3VtZW50RXhwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRyYXN0YXREZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlWZXJpZmljYXRpb25DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0TGljZW5jZUFwcGxpY2F0aW9uRm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRMaWNlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25XaXRob3V0Q29tbWVyY2lhbERldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uV2l0aENvbW1lcmNpYWxBbmRJdGVtRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25XaXRob3V0SXRlbURldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZERvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXB0Q3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JFeGNoYW5nZUFsbG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25FeGNoYW5nZVBlcm1pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaGFuZ2VDb250cm9sRGVjbGFyYXRpb25JbXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzRGVjbGFyYXRpb25Gb3JJbXBvcnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNEZWNsYXJhdGlvbkZvckhvbWVVc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNJbW1lZGlhdGVSZWxlYXNlRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWxpdmVyeU5vdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvRGVjbGFyYXRpb25BcnJpdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZURlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uUG9zdFBhcmNlbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheERlY2xhcmF0aW9uVmFsdWVBZGRlZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RGVjbGFyYXRpb25HZW5lcmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhEZW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtYmFyZ29QZXJtaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzRGVjbGFyYXRpb25Gb3JDdXN0b21zVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlmRm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlyQ2FybmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFY0Nhcm5ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyMUNlcnRpZmljYXRlT2ZPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0YUNhcm5ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlQWRtaW5pc3RyYXRpdmVEb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbFJlc3BvbnNlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRSZXNwb25zZUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVycm9yUmVzcG9uc2VDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdlUmVzcG9uc2VDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhDYWxjdWxhdGlvbkNvbmZpcm1hdGlvblJlc3BvbnNlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGFQcmlvckFsbG9jYXRpb25DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kVXNlQXV0aG9yaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudENvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbERvY3VtZW50SW1wb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckRvY3VtZW50YXJ5Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0N1c3RvbXNEb2N1bWVudE1lc3NhZ2UiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkRvY3VtZW50QXR0YWNoZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJEb2N1bWVudEF0dGFjaGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFja2FnZURvYyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZEb2N1bWVudEF0dGFjaGVkIiB0eXBlPSJMaXN0T2ZEb2N1bWVudEF0dGFjaGVkIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXR1cm5hYmxlQ29udGFpbmVySW5mbyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXR1cm5hYmxlQ29udGFpbmVyUGFydE51bWJlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnROdW0iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGF5bWVudFJlc3BvbnNpYmlsaXR5Q29kZWQiIHR5cGU9IlBheW1lbnRSZXNwb25zaWJpbGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBheW1lbnRSZXNwb25zaWJpbGl0eUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJldHVybkxvYWRDb2RlZCIgdHlwZT0iUmV0dXJuTG9hZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJldHVybkxvYWRDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXR1cm5Ob3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZXR1cm5hYmxlQ29udGFpbmVySW5mbyIgdHlwZT0iUmV0dXJuYWJsZUNvbnRhaW5lckluZm8iLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUGF5bWVudFJlc3BvbnNpYmlsaXR5Q29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRCeUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkQnlTdXBwbGllciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJSZXR1cm5Mb2FkQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRlZEVpdGhFbXB0eTRCbG9ja0ZvckJsb2NraW5nUHVycG9zZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5Q29udGFpbmVyV2l0aER1bm5hZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkZWRXaXRoUHJvZHVjdGlvbk1hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXhlZEVtcHR5QW5kTG9hZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYnNvbGV0ZU1hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkZWRXaXRoRXhjZXNzUmV0dXJuZWRQcm9kdWN0aW9uTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRlZFdpdGhSZWplY3RlZE1hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUGFydE9ic29sZXRlQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkZWRXaXRoUmV0dXJuZWRQcm9jZXNzZWRNYXRlcmlhbCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJTdW1tYXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik51bWJlck9mTGluZXMiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRvdGFsVGF4Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTW9uZXRhcnlWYWx1ZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUb3RhbEFtb3VudCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5VmFsdWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJUcmFuc3BvcnRQYWNrYWdpbmdUb3RhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1bW1hcnlOb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlclN1bW1hcnkiIHR5cGU9Ik9yZGVyU3VtbWFyeSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNwb3J0UGFja2FnaW5nVG90YWxzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRvdGFsUGFja2FnZXMiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRvdGFsUGFja2FnZURlcHRoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUb3RhbFRyYW5zcG9ydCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVG90YWxHcm9zc1dlaWdodCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1lYXN1cmVtZW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRvdGFsTmV0V2VpZ2h0Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVG90YWxOZXROZXRXZWlnaHQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNZWFzdXJlbWVudCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUb3RhbFRhcmVXZWlnaHQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNZWFzdXJlbWVudCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJHcm9zc1ZvbHVtZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1lYXN1cmVtZW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydFBhY2thZ2luZ1RvdGFscyIgdHlwZT0iVHJhbnNwb3J0UGFja2FnaW5nVG90YWxzIi8+Ci0gICAgPCEtLSBTT1ggZm9ybWF0IGRhdGF0eXBlcyB3aGVyZSB0aGV5IGRpZmVyIGZyb20gc3RhbmRhcmQgWFNETCBkYXRhdHlwZXMtLT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieGNibERhdGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbMC05XXs0fSgoKDAxfDAzfDA1fDA3fDA4fDEwfDEyKSgoMFsxLTldKXwoWzEtMl1bMC05XSl8KDNbMC0xXSkpKXwoKDA0fDA2fDA5fDExKSgoMFsxLTldKXwoWzEtMl1bMC05XSl8MzApKXwoKDAyKSgoMFsxLTldKXwoWzEtMl1bMC05XSkpKSkiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieGNibFRpbWUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSIoKChbMC0xXVswLTldKXwoMlswLTNdKSkoOihbMC01XVswLTldKSl7Mn0oKFwrfC0pKChbMC0xXVswLTldKXwoMlswLTNdKSk6KFswLTVdWzAtOV0pKT8pIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhjYmxEYXRldGltZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldezR9KCgoMDF8MDN8MDV8MDd8MDh8MTB8MTIpKCgwWzEtOV0pfChbMS0yXVswLTldKXwoM1swLTFdKSkpfCgoMDR8MDZ8MDl8MTEpKCgwWzEtOV0pfChbMS0yXVswLTldKXwzMCkpfCgoMDIpKCgwWzEtOV0pfChbMS0yXVswLTldKSkpKVQoKChbMC0xXVswLTldKXwoMlswLTNdKSkoOihbMC01XVswLTldKSl7Mn0oKFwrfC0pKChbMC0xXVswLTldKXwoMlswLTNdKSk6KFswLTVdWzAtOV0pKT8pIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhjYmxCb29sZWFuIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9InRydWV8ZmFsc2UiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieGNibEZsb2F0Ij4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZmxvYXQiPgotICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSIoXCt8LSk/WzAtOV0qXC4/WzAtOV0qKEV8ZSk/WzAtOV0qIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhjYmxEb3VibGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkb3VibGUiPgotICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSIoXCt8LSk/WzAtOV0qXC4/WzAtOV0qKEV8ZSk/WzAtOV0qIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvT3JkZXJDb25maXJtYXRpb24ueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpL09yZGVyQ29uZmlybWF0aW9uLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM5Y2QzNi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvT3JkZXJDb25maXJtYXRpb24ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTcwNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zPSJwdWJsaWNpZDpvcmcueENCTDpzY2hlbWFzL1hDQkwzNS9PcmRlckNvbmZpcm1hdGlvbi54c2QiIHRhcmdldE5hbWVzcGFjZT0icHVibGljaWQ6b3JnLnhDQkw6c2NoZW1hcy9YQ0JMMzUvT3JkZXJDb25maXJtYXRpb24ueHNkIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24geG1sOmxhbmc9ImVuIj4KLSAgICAgICAgICAgIFhNTCBDb21tb24gQnVzaW5lc3MgTGlicmFyeSAzLjUKLSAgICAgICAgICAgIENvcHlyaWdodCAyMDAwIENvbW1lcmNlIE9uZSwgSW5jLgotICAgICAgICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgICAgICAgRFREJ3MsIHNjaGVtYXMgYW5kIG1vZHVsZXMgaW4gdGhlIENvbW1lcmNlIE9uZSBYTUwgQ29tbW9uIEJ1c2luZXNzCi0gICAgICAgICAgICBMaWJyYXJ5IFZlcnNpb24gMy41IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHNwZWNpZmllZAotICAgICAgICAgICAgYXQgaHR0cDovL3d3dy54Y2JsLm9yZy9saWNlbnNlLmh0bWwKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJUExFQVNFIE5PVEU6IFRoaXMgc2NoZW1hLCB3aGlsc3QgaXQgZGVzY3JpYmVzIGluIGVudGlyZXR5IGEgdmFsaWQsIHNpbmdsZSwKLSAgICAgICAgCXhDQkwgMy41IGRvY3VtZW50LCBpcyBkZWZpbmVkIHRvIGJlIGluIGEgbmFtZXNwYWNlIG90aGVyIHRoYW4gdGhlIG1haW4geENCTCAzLjUKLSAgICAgICAgCW5hbWVzcGFjZS4gVGhlcmVmb3JlIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGZ1bGwgeENCTCAzLjUgc2NoZW1hIGlzIHVzZWQKLSAgICAgICAgCWZvciBmdWxsIHByb2R1Y3Rpb24gc2l0dWF0aW9ucy4gUGxlYXNlIHNlZSB0aGUgbm90ZXMgYXQKLSAgICAgICAgCTxhIGhyZWY9Imh0dHA6Ly93d3cueGNibC5vcmcveGNibDM1L3hzZC9zY2hlbWFzLmh0bWwiPnd3dy54Q0JMLm9yZzwvYT4uCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik9yZGVyQ29uZmlybWF0aW9uSGVhZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJPcmRlckNvbmZpcm1hdGlvbkRldGFpbCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJDb25maXJtYXRpb24iIHR5cGU9Ik9yZGVyQ29uZmlybWF0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkhlYWRlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2VsbGVyT3JkZXJDb25maXJtYXRpb25OdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWxsZXJPcmRlck51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uSXNzdWVEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iT3JkZXJDb25maXJtYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxhbmd1YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ik9yZGVyQ29uZmlybWF0aW9uUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iT3JkZXJDb25maXJtYXRpb25BY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uSGVhZGVyU2hvcnREZXNjcmlwdGlvbiIgdHlwZT0iQWxwaGFOdW00MCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJDb25maXJtYXRpb25IZWFkZXJOb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlN0cnVjdHVyZWROb3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZk5hbWVWYWx1ZVNldCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZBdHRhY2htZW50Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkhlYWRlciIgdHlwZT0iT3JkZXJDb25maXJtYXRpb25IZWFkZXIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJDb25maXJtYXRpb25UeXBlQ29kZWQiIHR5cGU9Ik9yZGVyQ29uZmlybWF0aW9uVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uVHlwZSIgdHlwZT0iT3JkZXJDb25maXJtYXRpb25UeXBlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlckNvbmZpcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuRGVsaXZlcnkiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxhbmd1YWdlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMYW5ndWFnZUNvZGVkIiB0eXBlPSJMYW5ndWFnZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikxhbmd1YWdlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTG9jYWxlQ29kZWQiIHR5cGU9IkxvY2FsZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxvY2FsZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Ikxhbmd1YWdlRGVwZW5kZW50IiB0eXBlPSJ4Y2JsQm9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMYW5ndWFnZSIgdHlwZT0iTGFuZ3VhZ2UiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iTGFuZ3VhZ2VDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFiIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImF6Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJibyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYnIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImR6Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImV1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZqIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZnIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ3UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImhhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJoZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImhyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJodSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iml1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ianciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImthIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImttIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsdiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1pIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJydyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0bCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idG4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InR0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0dyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InZpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ2byIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InhoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ5aSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ieW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InphIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ6aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ienUiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iTG9jYWxlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJibiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJicyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJidyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJ6Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImN1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjdiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY3giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjeiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRqIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZG0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkeiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZnIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImduIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJncCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ3EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imd1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJndyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImhrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJobiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaHIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imh0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJodSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImllIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpcSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iam0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImpvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJraCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia2kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImttIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imt6Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibGIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxjIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imx1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsdiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1vIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im11Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtdiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im14Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJteSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJubyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibnAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJudSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibnoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icG0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InB3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJweSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJybyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icnUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJ3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNjIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNqIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzeiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0ZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0aiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idG0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0byIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InR3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0eiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1eiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InZjIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InZpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ2biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idnUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IndmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ieWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Inl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ5dSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iemEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InptIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ6dyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ3VycmVuY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkN1cnJlbmN5Q29kZWQiIHR5cGU9IkN1cnJlbmN5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ3VycmVuY3lDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDdXJyZW5jeSIgdHlwZT0iQ3VycmVuY3kiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ3VycmVuY3lDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEWkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFERiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQURQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFSUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFXRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFaTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlNEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJEVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkJEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCWUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJFRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlpEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJUTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQk9CIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCQUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJXUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJHTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQklGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLSFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1ZFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLWUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhPRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWEFGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYUEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNMUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0xGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTlkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS01GIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhSSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1VQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNaSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREtLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJBRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREpGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJET1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhDRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUNTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFR1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNWQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVJOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVUQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYRVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZLUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkpEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaQUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlJGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdFTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0hDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhBVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1JEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVFEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdORiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1dQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHWUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhURyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSE5MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIS0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhVRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVNLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklEUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklRRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUVQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk1EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKUFkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1pUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLRVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktXRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU9SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLR1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxBSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFZMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFNMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMUkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxZRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFRMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1PUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUtEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNR0YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1XSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVlSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1UTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1YTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTURMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1BRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVpNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCT1YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1NSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkFEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFORyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVdHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTEciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFPTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFdEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaUk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5aRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTklPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOR04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktQVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQS1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEdLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQWUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEhQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBMWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFRFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT01SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJST0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJVUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUldGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXU1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNURCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0FSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNDUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0xMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTR0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNLSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWkFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUlciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVTUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEtSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNEQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0REIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNSRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1pMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1lQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRaUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEhCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRPUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFREIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE1NIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFFRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUdYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVDViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVlVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVaUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVlVWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWRUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZORCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWUVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZVU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpNSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWldEIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlckNvbmZpcm1hdGlvblBhcnR5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJ1eWVyUGFydHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZWxsZXJQYXJ0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBUb1BhcnR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZQYXJ0eUNvZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckNvbmZpcm1hdGlvblBhcnR5IiB0eXBlPSJPcmRlckNvbmZpcm1hdGlvblBhcnR5Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYXJ0eSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFydHlJRCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNREZCdXNpbmVzcyIgdHlwZT0ieGNibEJvb2xlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTmFtZUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVyQ29udGFjdCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvbnRhY3QiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVjZWl2aW5nQ29udGFjdCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvbnRhY3QiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcHBpbmdDb250YWN0Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ29udGFjdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPdGhlckNvbnRhY3RzIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mQ29udGFjdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb3JyZXNwb25kZW5jZUxhbmd1YWdlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGFuZ3VhZ2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFydHkiIHR5cGU9IlBhcnR5Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJZGVudGlmaWVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklkZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJZGVudGlmaWVyIiB0eXBlPSJJZGVudGlmaWVyIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBZ2VuY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFnZW5jeUNvZGVkIiB0eXBlPSJBZ2VuY3lDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBZ2VuY3lDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBZ2VuY3lEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29kZUxpc3RJZGVudGlmaWVyQ29kZWQiIHR5cGU9IkNvZGVMaXN0SWRlbnRpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvZGVMaXN0SWRlbnRpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFnZW5jeSIgdHlwZT0iQWdlbmN5Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkFnZW5jeUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQU1WQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUJDRC1UaGVNaWNyb2NvbXB1dGVySW5kdXN0cnlBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNHSUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDT1JEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnRpc2luZ0luZHVzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRUNNQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUlIQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyVHJhbnNwb3J0QXNzb2NpYXRpb25PZkFtZXJpY2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsYWJhbWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsYXNrYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx1bWludW1Bc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5BcHBhcmVsTWFudWZhY3R1cmVyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkZ1cm5pdHVyZU1hbnVmYWN0dXJlcnNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5Jcm9uQW5kU3RlZWxJbnN0aXR1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuTGFuZFRpdGxlQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuTWVkaWNhbEFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblBhcGVySW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblBldHJvbGV1bUluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVBXQUFuZE9DU0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuU29jaWV0eUZvckF1dG9tYXRpb25JblBoYXJtYWN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblRleHRpbGVNYW51ZmFjdHVyZXJzSW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblRydWNraW5nQXNzb2NpYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTlNJQWNjcmVkaXRlZFN0YW5kYXJkc0NvbW1pdHRlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJpem9uYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJrYW5zYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTTUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlCdXllck9yQnV5ZXJzQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5RGlzdHJpYnV0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlNYXJrZXRQbGFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeU5hdGlvbmFsVHJhZGVBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlPd25lck9mT3BlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5UGFydHlPcmlnaW5hdGluZ1RoZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlTZWxsZXJPclNlbGxlcnNBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeVRyYW5zcG9ydENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTVE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVC1HZWxkYXVzZ2FiZWF1dG9tYXRlblNlcnZpY2VHZXNlbGxzY2hhZnRNQkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFULUF1c3RyaWFuQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVQtQXVzdHJpYW5QVFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFULVZlcmJhbmRPZXN0ZXJyZWljaGlzY2hlckJhbmtlblVuZEJhbmtpZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1BQ09TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1BREEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUFJSFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUFQQ0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUFRSVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUF1c3RyaWFuQ3VzdG9tc1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLURPSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtSElDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1MSUZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1OQ0NIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1ST0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLVNBQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtVHJhZGVnYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBV1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFZU0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRS1CZWxnaWFuQmFua2Vyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRS1CZWxnaWFuQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkUtQmVsZ2lhbk1pbmlzdHJ5T2ZGaW5hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWxsY29yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va0luZHVzdHJ5U3lzdGVtc0Fkdmlzb3J5Q29tbWl0dGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUi1CYW5jb0NlbnRyYWxEb0JyYXppbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlItTUFBbmRSQUFBbmRMSU1ORVRBbmRSSU5FVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0EtQ1BBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQS1DU0lPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxpZm9ybmlhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxpZm9ybmlhTGFuZFRpdGxlQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuRnJlaWdodENsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJiaWRlTWFudWZhY3R1cmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0EtUmV2ZW51ZUNhbmFkYUN1c3RvbXNBbmRFeGNpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0EtU0NDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VDREdYSUlJRDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFQ0RHWFhJMDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFQ0RHWFhJQjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFQ0RHWFhYSVYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFRklDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtQWRtaW5pc3RyYXRpb25GZWRlcmFsZURlc0NvbnRyaWJ1dGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILUFzc29jaWF0aW9uU3Vpc3NlQ29kZURlc0FydGljbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1DYXJidXJhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1DZW50cmFsZVN1aXNzZVBvdXJMSW1wb3J0YXRpb25EdUNoYXJib24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILURpcmVjdGlvbkdlbmVyYWxlRGVzRG91YW5lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtRGl2aXNpb25EZXNJbXBvcnRhdGlvbnNFdEV4cG9ydGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtRW50cmVwcmlzZURlc1BUVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtTWluaXN0cnlPZlRheGF0aW9uQ2VudHJhbEN1c3RvbXNBbmRUYXhBZG1pbmlzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtT2ZmaWNlRmlkdWNpYWlyZURlc0ltcG9ydGF0ZXVyc0RlRGVucmVlc0FsaW1lbnRhaXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtU3dpc3NTZWN1cml0aWVzQ2xlYXJpbmdDb3Jwb3JhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtVGVsZWt1cnNBRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0lEWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0lFQ0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZGVBc3NpZ25lZEJ5VGhlT3JnYW5pemF0aW9uVGhhdElzVGhlVWx0aW1hdGVEZXN0aW5hdGlvbk9mVGhlVHJhbnNhY3Rpb25TZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPLURJQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbG9yYWRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tYW5kZXJSb21lQWlyRGV2ZWxvcG1lbnRDZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmNvcmRFRElHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdGljdXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25zT25TQURBbmRUcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3BwZXJBbmRCcmFzc0ZhYnJpY2F0b3JzQ291bmNpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ08tU0JEQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5RGVzaWduYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNTSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1NJRXh0ZW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNVU0lQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUFSRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtQkRJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1CSUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUJSRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtRElOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1EVEFHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1FRElCQVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVuc2VMb2dpc3RpY3NBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUdEViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtR2VybWFuQmFua2Vyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1HZXJtYW5DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1HTUJIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxhd2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mQWlyRm9yY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkFybXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkRlZmVuc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkhlYWx0aEFuZEh1bWFuU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkhvdXNpbmdBbmRVcmJhbkRldmVsb3BtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZMYWJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mVGhlTmF2eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtU2llbWVuc0FHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1WREEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRGQVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRJTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0aW9uR2VuZXJhbGVEZXNEb3VhbmVzRXREcm9pdHNJbmRpcmVjdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0T2ZDb2x1bWJpYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRLLUVBTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREstTUhBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESy1OQkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRLLVBCUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVuQW5kQnJhZHN0cmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGlidWlsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpZWxOb3JkaWNGb3J1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJRklDRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJVEVVUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJVEVYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRUc3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFSURYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJpY1V0aWxpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0luZHVzdHJpZXNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVBBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVNEWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVMtT0RFVFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVTLVNwYW5pc2hDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFVS1FRElGSUNBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVUtRVRJUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVUtUk9GRVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZBU0xJTkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZDQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkNJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGREEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxHb3Zlcm5tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSGlnaHdheUFkbWluaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkktQVRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSS1GaW5uaXNoQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkktVEIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJLVRoZUZpbm5pc2hCYW5rZXJzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb3JpZGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1BR0YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUFydkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUJhbnF1ZURlRnJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1DRk9OQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItQ05BTVRTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1EQ1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLURHSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItRURJRkNBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItRURJRlJBTkNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1FRElUUkFOU1BPUlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUdBTElBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1HRU5DT0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUlOU0VFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1SQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUFCSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQUJUQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQXJ0aWNsZU51bWJlckFzc29jaWF0aW9uTGltaXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQXNzb2NpYXRpb25Gb3JQYXltZW50Q2xlYXJpbmdTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQkFDU0xpbWl0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUNIQVBTQW5kVG93bkNsZWFyaW5nQ29tcGFueUxpbWl0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUZMRUVUTkVUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1ITUN1c3RvbXNBbmRFeGNpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLU9ERVRURSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItVGhlQ2xlYXJpbmdIb3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvcmdpYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhcGhpY3NDb21tdW5pY2F0aW9uc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdSLUdyZWVrQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1NBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVElOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXdhaWkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5zdXJhbmNlQXNzb2NpYXRpb25PZkFtZXJpY2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhLLUhvbmdLb25nQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklBUFNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQVJDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQVRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQ0FPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRhaG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJRS1SZXZlbnVlQ29tbWlzc2lvbmVyc0N1c3RvbXNBRVByb2plY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklMLUlzcmFlbEN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklsbGlub2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGlhbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyQ29udGFpbmVySW50ZXJGcmlnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFzc29jaWF0aW9uT2ZDb3Jwb3JhdGlvbkFkbWluaXN0cmF0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQXNzb2NpYXRpb25PZkluZHVzdHJpYWxBY2NpZGVudEJvYXJkc0FuZENvbW1pc3Npb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsU3RhbmRhcmRzT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJb3dhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJvbkFuZFN0ZWVsU3RhbmRhcmRzQ29tbWl0dGVlSVNNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUy1JY2VsYW5kQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VTZXJ2aWNlc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklULUFzc29jaWF6aW9uZUJhbmNhcmlhSXRhbGlhbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklULUl0YWxpYW5DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVC1PREVUVEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklULVNvY2llYXRhSW50ZXJiYW5jYXJpYVBlckxBdXRvbWF6aW9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSmFwYW5lc2VTdGFuZGFyZHNBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlAtSmFwYW5DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKUC1NT1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpQLU1TQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlAtTkFDQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkthbnNhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VudHVja3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNpbmdJbmR1c3RyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZUFuZEFubnVpdHlJbmR1c3RyeUNvbW1pdHRlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEktTGllY2h0ZW5zdGVpbkF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGxveWRzUmVnaXN0ZXJPZlNoaXBwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3Vpc2lhbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVS1MdXhlbWJvdXJnQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJ5bGFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzc2FjaHVzZXR0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxTYWZldHlEYXRhU2hlZXRQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWljaGlnYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5U3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbm5lc290YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzc2lzc2lwcGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc3NvdXJpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb250YW5hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUJhbmtlcnNBc3NvY2lhdGlvbk9mQW1lcmljYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVktRGFnYW5nTmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWS1NYWxheXNpYUNlbnRyYWxCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWS1NYWxheXNpYUN1c3RvbXNBbmRFeGNpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BQ0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BR1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQWxjb2hvbEJldmVyYWdlQ29udHJvbEFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEFzc29jaWF0aW9uT2ZCdXNpbmVzc0FuZEVkdWNhdGlvbmFsUmFkaW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQnVzaW5lc3NGb3Jtc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENlbnRlcmZvclN0YXRlQ291cnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENvdHRvbkNvdW5jaWxPZkFtZXJpY2EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ291bmNpbE9uQ29tcGVuc2F0aW9uSW5zdXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFJldGFpbE1lcmNoYW50c0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFdob2xlc2FsZURydWdnaXN0c0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQVRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmFsR2FzVXRpbGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQ0lDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWJyYXNrYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkVNQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV2YWRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdIYW1wc2hpcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0plcnNleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3TWV4aWNvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdzcGFwZXJBc3NvY2lhdGlvbk9mQW1lcmljYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3WW9yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkZQQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTklDQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTklPU0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRoZXJsYW5kc1JhaWx3YXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1CYW5rR2lyb2NlbnRyYWxlQlYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLUJFQU5FVEJWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1FQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLUludGVycGF5Q2FyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLUludGVycGF5R2lyYWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1OZXRoZXJsYW5kc0N1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLU9ERVRURSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9yd2VpZ2lhblN0YXRlUmFpbHdheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PLU5PUlBSTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk8tTm9yd2VnaWFuQmFua2Vyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTy1Ob3J3ZWdpYW5DdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTy1Ob3J3ZWdpYW5JbnRlcmJhbmtSZXNlYXJjaE9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhBbWVyaWNhLVRlbGVjb21tdW5pY2F0aW9uc0luZHVzdHJ5Rm9ydW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoQ2Fyb2xpbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoRGFrb3RhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5aLU5ld1plYWxhbmRDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPREVUVEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU9mTWFuYWdlbWVudEFuZEJ1ZGdldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZXb3JrZXJzQ29tcGVuc2F0aW9uUHJvZ3JhbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVByb2R1Y3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaGlvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPa2xhaG9tYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aWNhbEluZHVzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmVnb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9TSEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbm5zeWx2YW5pYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVubnN5bHZhbmlhQ291cnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBULUNCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVC1Qb3J0dWd1ZXNlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFQtU0lCUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZUluZm9ybWF0aW9uSW5kdXN0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJob2RlSXNsYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSSU5FVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJVLUJJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlUtU0ZUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNBLVNhdWRpQXJhYmlhQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFLUNlbnRyYWxCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRS1PREVUVEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFLVN2ZW5za2FCYW5rZm9lcmVuaW5nZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFLVN3ZWRpc2hDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSVNBQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXRoQ2Fyb2xpbmEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXRoRGFrb3RhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUFnZW5jeUFzc2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50TG9hbkd1YXJhbnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBTEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21tdW5pY2F0aW9uc0luZHVzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wb3JhcnlIZWxwSW5kdXN0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbm5lc3NlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGV4YXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRleGFzTGFuZFRpdGxlQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRleHRpbGVEaXN0cmlidXRvcnNBc3NvY2lhdGlvbkluYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVERDQy1FRElBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUVy1DaGluZXNlVGFpcGVpQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFctVHJhZGUtdmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVJQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVORUNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTkNUQUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc0NvdXJ0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzTWFyaW5lQ29ycHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc051Y2xlYXJSZWd1bGF0b3J5Q29tbWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQUFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BQkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFJQUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFpclRyYW5zcG9ydEFzc29jaWF0aW9uT2ZBbWVyaWNhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BSVNJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BbWVyaWNhblBldHJvbGV1bUluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQU5TSUFTQ1gxMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQVBJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BU1RNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BVEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUJBVEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUJYQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQ0hJUFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUNJRFgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUNNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1DT1BBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtREFuZEIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURDSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtREVBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ESEhTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ESVNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ESVNDVVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURMTVNPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ET0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURPRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRE9EQUFDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ET0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURPVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRFNBQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRUlBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1GQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUZEQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRklQUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRk1DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1GV1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUdTQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtSEJJQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUhJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ITDciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUlTQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTUFSQUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5BQkNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OQUlDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU05hdGlvbmFsQ2VudGVyRm9ySGVhbHRoU3RhdGlzdGljc0NvbW1pc3Npb25PZlByb2Zlc3Npb25hbEFuZEhvc3BpdGFsQWN0aXZpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTmF0aW9uYWxNb3RvckZyZWlnaHRDbGFzc2lmaWNhdGlvbkFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OYXRpb25hbFJldGFpbEZlZGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5DQ01BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OSVNUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OUkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5XREEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU9EVEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU9GQUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU9NQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtU3RhbmRhcmRDYXJyaWVyQWxwaGFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1URENDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1VQ0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVOLVNQU0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVPUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVVNDZW5zdXNCdXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVTQ3VzdG9tc1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVTUFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVZBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1WSUNTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1XU1NBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGFoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGlsaXR5SW5kdXN0cnlHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVybW9udCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVklDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlyZ2luaWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildhc2hpbmd0b24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildlc3RWaXJnaW5pYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0hNSVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildpc2NvbnNpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV3lvbWluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0b3JHZW5lcmFsT2ZDYW5hZGEiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ29kZUxpc3RJZGVudGlmaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFuY2VTaXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnRQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvcmRFdXJvcGVlblJlbGF0aWZBdVRyYW5zcG9ydEludGVybmF0aW9uYWxEZXNNYXJjaGFuZGlzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRBbmFseXNpc0NvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50Q2hhcmFjdGVyaXN0aWNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ0luZm9ybWF0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFJlbGF0aW9uc2hpcFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjcXVpc2l0aW9uQWR2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNxdWlzaXRpb25NZXRob2RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3F1aXNpdGlvbk1ldGhvZFN1ZmZpeENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXRlUHJpbmNpcGFsZUV4ZXJjZWVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaXR0aW5nRGlhZ25vc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnNlRXZlbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnNlRXZlbnRPdXRjb21lQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaWRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ29tbW9kaXR5QW5kU3BlY2lhbEhhbmRsaW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyY3JhZnRNaXNzaW9uRGVzaWduU2VyaWVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRGltZW5zaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlycG9ydE9yQ2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlycG9ydFRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJUZXJtaW5hbElkZW50aWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxlZ2F0aW9uVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbFBhdGllbnREaWFnbm9zaXNSZWxhdGVkR3JvdXBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxQYXRpZW50UmVmaW5lZERpYWdub3Npc1JlbGF0ZWRHcm91cHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVyYXRpb25Mb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtYnVsYXRvcnlQYXRpZW50R3JvdXBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVuZG1lbnRDb2RlLUN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuUHN5Y2hpYXRyaWNBc3NvY2lhdGlvbkRpYWdub3N0aWNTdGF0aXN0aWNhbE1hbnVhbE9mTWVudGFsRGlzb3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblNvY2lldHlGb3JUZXN0aW5nQW5kTWF0ZXJpYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRlbm5hUG9sYXJpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRlbm5hU3RydWN0dXJlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50Q2xhc3NpZmljYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkFja25vd2xlZGdlbWVudEFuZEVycm9yQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRXJyb3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvblF1ZXN0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhT2ZPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycmVzdFJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJ0aWNsZVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXREZXRhaWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldFJlY3VycmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0U3RhdHVzT3JUcmFuc2FjdGlvblJlcG9ydGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0VHJhbnNmZXJTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlSZWNlaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeVNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb25PZkFtZXJpY2FuUmFpbHJvYWRzRGVwcmVzY3JpcHRpb25EaXN0cmlidXRpb25MaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNEZXByZXNjcmlwdGlvbkV4Y2VwdGlvbkxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uT2ZBbWVyaWNhblJhaWxyb2Fkc1JhdGVFZGlOZXR3b3JrRXJyb3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNTdGFuZGFyZFRyYW5zcG9ydGF0aW9uQ29tbW9kaXR5Q29kZURlc2NyaXB0aW9uUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNTdGFuZGFyZFRyYW5zcG9ydGF0aW9uQ29tbW9kaXR5Q29kZU1hc3RlckRlc2NyaXB0aW9uSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uT2ZBbWVyaWNhblJhaWxyb2Fkc1N3aXRjaFJlbGVhc2VDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzdXJlZERlbGl2ZXJ5SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkQ2xlYXJpbmdIb3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkRGF0YVByb2Nlc3NpbmdFcXVpcG1lbnRJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF3YXJkU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxhbmNlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtBZG1pbmlzdHJhdGlvbkluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua0JyYW5jaFNvcnRpbmdJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua0lkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rU2VjdXJpdGllc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2lzT2ZKdXJpc2RpY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZmljaWFyeVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZFJlamVjdGlvblJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGVkT2ZmaWNlSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ0FkdmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdDbGF1c2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mSW5zcGVjdGlvbkFuZFN1cnZleVBhcnRMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZJbnNwZWN0aW9uQW5kU3VydmV5UmVzcG9uc2liaWxpdHlMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZJbnNwZWN0aW9uQW5kU3VydmV5U2hpcExvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0NoYW5nZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQ2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQ3JlZGl0UmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eUZpbGluZ0RldGFpbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5RmlsaW5nTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eUZpbGluZ1JlcG9ydFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eUZpbGluZ1NlY3VyaXRpZXNJbmZvcm1hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5RmlsaW5nU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHlGaW5hbmNpYWxJbmZvcm1hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5U3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NGdW5jdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NMZWdhbFN0cnVjdHVyZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzU2l6ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbFNpZ25EaXJlY3RvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuSW50ZXJFZGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxhdGlvblJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VEZXNpZ25hdG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlT3JpZ2luQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaERpc2NvdW50U3RpcHVsYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXVzZUxvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F1c2VPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdXNlT2ZMb3NzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VpbGluZ1R5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uUmVxdWlyZW1lbnRzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRpemVuSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlTdWJkaXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1QYXltZW50UmVtYXJrQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhc3NPZk9wZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhc3NPZlBpdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGF1c2VTdGF0dXNUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2VBdXRvbWF0ZWRQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlSW50ZXJiYW5rUGF5bWVudFN5c3RlbVBhcnRpY2lwYW50c0lkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlSW50ZXJiYW5rUGF5bWVudFN5c3RlbVVuaXZlcnNhbElkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2FzdERlc2lnbmF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29nbml6YW5jZVN5bWJvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGlzaW9uSW5kdXN0cnlFbGVjdHJvbmljQ29tbWVyY2VBc3NvY2lhdGlvbi1JbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsaXNpb25JbmR1c3RyeUVsZWN0cm9uaWNDb21tZXJjZUFzc29jaWF0aW9uLUxvc3NDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGlzaW9uSW5kdXN0cnlFbGVjdHJvbmljQ29tbWVyY2VBc3NvY2lhdGlvbi1Qb2ludHNPZkltcGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGlzaW9uSW5kdXN0cnlFbGVjdHJvbmljQ29tbWVyY2VBc3NvY2lhdGlvbi1Qcm9maWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaXRlcm1zMTk5MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEFuZEdvdmVybm1lbnRFbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxEcml2ZXJzTGljZW5zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVPcGVyYXRpb25zQ29tbW9kaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVPcGVyYXRpb25zSGF6YXJkb3VzTWF0ZXJpYWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZU9wZXJhdGlvbnNJbnN1cmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlT3BlcmF0aW9uc1NhZmV0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlT3BlcmF0aW9uc1N0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlUmVnaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVUaXRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb2RpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11bmljYXRpb25zUm91dGluZ0lkZW50aWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZW5zYXRpb25UeXBlQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGl0aXZlQ2hhcmFjdGVyaXN0aWNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxhaW50UmVxdWVzdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsaWFuY2VSZXZpZXdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jbHVzaW9uRXZhbHVhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZGl0aW9uRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzUHJlbWlzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vcnNQcmVtaXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGlvbkFuZENvbnRhaW5lcml6YXRpb25Qb2ludENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb25EZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cnVjdGlvbk1hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0b3JBbGVydExpc3RSZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJBbmRSb2xsLU9uT3JSb2xsLU9mZk51bWJlckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250ZW50SW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDbG9zZS1PdXRHcm91cENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RGVsaXZlcnlEYXRlUmV2aXNpb25BZ2VudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RnVuZFJlcG9ydGluZ1RyYW5zYWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvckFsZXJ0TGlzdFN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvclJldmlld0xpc3RTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UGF5bWVudERlZHVjdGlvbk9yQ29sbGVjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UGF5bWVudExpbmVJdGVtU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RTaGlwbWVudEFkdmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRJbnZlbnRvcnlJdGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbFVuaXREZXNpZ25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm92ZXJ0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmljdGlvbk9mZmVuc2VUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29wZXJhdGl2ZUxvZ2lzdGljc1Byb2dyYW1TdXBwb3J0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlRmluYW5jaWFsRmlsaW5nQ3JpdGVyaWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZVN0YXRlbWVudEZpbGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3Rpb25PckNoYW5nZUZvclN0b3JhZ2VJdGVtUmVjb3Jkc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlBbmRBY3Rpdml0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlDb2RlLUZpbmFuY2VBbmRBY3F1aXNpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeVN1Yi1FbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5RGVzaWduYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXBvbkFkanVzdG1lbnRSZWFzb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydEFwcGVhcmFuY2VUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRDYXNlU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnREaXNwb3NpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0RG9jdW1lbnRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRJc3N1ZWRXYXJyYW50VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0T2ZMYXdFdmVudFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0T2ZMYXdUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydFBhcnR5U3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydFBsZWFkaW5nVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlQ29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlTW9kaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNwYS1DYW5hZGlhblBheW1lbnRzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaW1pbmFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmltaW5hbENoYXJnZUdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcml0aWNhbGl0eURlc2lnbmF0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdWlzaW5lVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRBc3NldERldGFpbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREZW50YWxUZXJtaW5vbG9neUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRMaWFiaWxpdHlEZXRhaWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50UHJvY2VkdXJhbFRlcm1pbm9sb2d5Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyTWFpbnRlbmFuY2VMZXZlbExvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJXaXRoaW5Db3VudHJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9taXplZE5vdGljZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQXJlYU9mVHJhbnNhY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEb21lc3RpY1BvcnRMb2NhdGlvbkNvZGVzLVVTU2NoZWR1bGVEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRm9yZWlnblBvcnRMb2NhdGlvbkNvZGVzLVVTU2NoZWR1bGVLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW5zcGVjdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNQcmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUHJvY2VkdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUmVsZWFzZU5vdGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1NpbXBsaWZpZWRQcm9jZWR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNTcGVjaWFsQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNTdGF0dXNPZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zVHJhbnNpdEd1YXJhbnRlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1RyYW5zaXRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zVmFsdWF0aW9uTWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zV2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNHb29kc1BhY2tpbmdUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVTaGlwcGVkT3JSZWNlaXZlZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvckJ1c2luZXNzVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvclR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlbmRhbnRQbGVhVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVuc2VQcmlvcml0aWVzQW5kQWxsb2NhdGlvbnNTeXN0ZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJhbExvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmaWNpZW5jeUNhdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZpY2llbmN5SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpbnF1ZW5jeUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTb3VyY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVRlcm1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW1hbmRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW1pbGl0YXJpemF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mRGVmZW5zZUlkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlQXZhaWxhYmlsaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlRXZhbHVhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZUV2ZW50UHJvYmxlbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZU9wZXJhdG9yVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZVN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZVVzYWdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zaXNFbmNvdW50ZXJlZER1cmluZ0V4YW1pbmF0aW9uQW5kSW52ZXN0aWdhdGlvbk9mSW5kaXZpZHVhbHNBbmRQb3B1bGF0aW9uc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWdub3Npc1JlbGF0ZWRHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc3RpY0FuZFN0YXRpc3RpY2FsTWFudWFsT2ZNZW50YWxEaXNvcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdE51bWVyaWNhbENvbnRyb2xTeXN0ZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNidXJzZW1lbnRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVwYW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JlcGFuY3lBZHZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVwYW5jeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXBhbmN5SW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JlcGFuY3lTdGF0dXNPckRpc3Bvc2l0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcG9zYWxBdXRob3JpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NhbENvbmRpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50SWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFJlcXVlc3RlZEJ5Q3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9kYWFjLURlcGFydG1lbnRPZkRlZmVuc2VBY3Rpdml0eUFkZHJlc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY0xpbmVPZkJ1c2luZXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9zZUZvcm1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzTGljZW5zZVdpdGhkcmF3YWxCYXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc0xpY2Vuc2VXaXRoZHJhd2FsRHVlUHJvY2Vzc1N0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc0xpY2Vuc2VXaXRoZHJhd2FsRXh0ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzTGljZW5zZVdpdGhkcmF3YWxSZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnNMaWNlbnNlV2l0aGRyYXdhbFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdEZXRhaWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnU3RhdHVzQWR2ZXJzZUV2ZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z1N0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bXBpbmdPckNvdW50ZXJ2YWlsaW5nQXNzZXNzbWVudE1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVtcGluZ1NwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bkFuZEJyYWRzdHJlZXRDYW5hZGFzOERpZ2l0U3RhbmRhcmRJbmR1c3RyaWFsQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5zLUR1bkFuZEJyYWRzdHJlZXRQbHVzNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVuc1N0YW5kYXJkSW5kdXN0cmlhbENsYXNzaWZpY2F0aW9uMlBsdXMyRHVuQW5kQnJhZHN0cmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eVRheE9yRmVlUGF5bWVudE1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHluYW1pY0dlbmVyYXRvclNldENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR5bmFtaWNMb2NvbW90aXZlVGFnQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpcmEtSWQtRWRpUmVnaXN0cmF0aW9uQXV0aG9yaXR5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkaXRFcnJvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbmFsSW5zdGl0dXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25hbFN0dWR5QXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb21hZ25ldGljVHJhbnNtaXR0ZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5oYW5jZWRQYXJ0eUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRpdGxlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5UmVsYXRpb25zaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRTdGF0dXNMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVycm9yQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3NlbnRpYWxpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRUaW1lT2ZBcnJpdmFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVUeXBlTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0aW5nTWV0aG9kU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXRobmljaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmFsdWF0ZVdvcmtDYW5kaWRhdGVMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2YWx1YXRlV29ya0NhbmRpZGF0ZVJlYXNvbkxvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRBYmF0ZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudENvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudE9yRXhwb3N1cmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudFJlYXBwZWFyYW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4YW1pbmF0aW9uRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2F2YXRpb25JbmZvcm1hdGlvbkNvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NNYXRlcmlhbERpc3Bvc2l0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaXNlRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0Q29tbW9kaXR5Q2xhc3NpZmljYXRpb24tVVNTY2hlZHVsZUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydFJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5zaW9uUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeWVDb2xvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5U2VjdXJpdHlDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWx1cmVUb0F3YXJkUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWVBZGp1c3RhYmxlUmF0ZU1vcnRnYWdlUGxhbkNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWUtRmVkZXJhbE5hdGlvbmFsTW9ydGdhZ2VBc3NvY2lhdGlvbi1Nb3J0Z2FnZUluc3VyYW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZS1GZWRlcmFsTmF0aW9uYWxNb3J0Z2FnZUFzc29jaWF0aW9uLVBvb2xGZWF0dXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlLUZlZGVyYWxOYXRpb25hbE1vcnRnYWdlQXNzb2NpYXRpb24tUmVtaXR0YW5jZVByb2dyYW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWUtRmVkZXJhbE5hdGlvbmFsTW9ydGdhZ2VBc3NvY2lhdGlvbi1TcGVjaWFsRmVhdHVyZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZVJlZmluYW5jZVBsYW5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsRmluYW5jZUNvZGVMaXN0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhlYWx0aENhcmVDb2RlTGlzdDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxMb2dpc3RpY3NDb2RlTGlzdDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxQcm9jdXJlbWVudENvZGVMaXN0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFRyYW5zcG9ydGF0aW9uQ29kZUxpc3QxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxBbmFseXNpc0NhdGVnb3JpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEluZm9ybWF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSXRlbUFsbG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEl0ZW1BdHRyaWJ1dGVkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSXRlbVJlY2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbE1hbmFnZW1lbnRTZXJ2aWNlQ2FzaC1MaW5rQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsUmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxSZWdpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFJvdXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFN0YXRlbWVudEZvcm1hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxlZXRQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG93T2ZUaGVHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9sbG93LVVwQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTGluZU9mQnVzaW5lc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTWlsaXRhcnlTYWxlc0NvdW50cnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRpbmdSZXN0cmljdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWMtRmVkZXJhbEhvbWVMb2FuTW9ydGdhZ2VDb3Jwb3JhdGlvbi1Nb3J0Z2FnZUluc3VyYW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWMtRmVkZXJhbEhvbWVMb2FuTW9ydGdhZ2VDb3Jwb3JhdGlvbi1SZW1pdHRhbmNlUHJvZ3JhbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWMtRmVkZXJhbEhvbWVMb2FuTW9ydGdhZ2VDb3Jwb3JhdGlvbi1TcGVjaWFsQ2hhcmFjdGVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZGRpZU1hY1JlZmluYW5jZVBsYW5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlT25Cb2FyZFNpdGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEZvcndhcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlcXVlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVxdWVuY3lCYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbEdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZFB1cnBvc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhaW5Pckxvc3NJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsU2VydmljZXNBZG1pbmlzdHJhdGlvbkN1c3RvbWVyU3VwcGx5Q2VudGVyTnVtYmVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbFRlcnJpdG9yeVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYXRvclNldE1vdW50aW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHbGFzc0FjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRBZ2VuY3lQcm9jZWR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWRlT2ZEaWZmaWN1bHR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cFF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhaXJDb2xvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRsaW5nQWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJtb25pemVkU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsc0NyZWRlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c1Jlc3BvbnNlQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVDbGFpbVN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbkNvbW1vblByb2NlZHVyYWxDb2RpbmdTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbkNvbW1vblByb2NlZHVyYWxDb2RpbmdTeXN0ZW1QcmluY2lwYWxQcm9jZWR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbkR1cmFibGVNZWRpY2FsRXF1aXBtZW50UmVnaW9uYWxDYXJyaWVyQ2VydGlmaWNhdGVPZk1lZGljYWxOZWNlc3NpdHlGb3JtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoY2FyZVByb3ZpZGVyQ2hhcmFjdGVyaXN0aWNzQW5kUmVzb3VyY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhjYXJlUHJvdmlkZXJUYXhvbm9teSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5kdXN0cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluZHVzdHJ5T3JnYW5pemF0aW9uSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvYmJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJY2QxMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGlmeWluZ0NoYXJhY3RlcmlzdGljcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpdHlEaXNjbG9zdXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1tdW5pemF0aW9uSW5qZWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wYWN0QXhpc09yQW5hbG9nUG9ydENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGFjdFJlY29yZGVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnRDb25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudENvbnNlcXVlbmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnRMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50UmVsYXRlZEFjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY290ZXJtczE5ODAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxJbnN1cmFuY2VGaW5hbmNpYWxEZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxQYXJ0aWNpcGF0aW9uSW5Db21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsU2VjdXJpdHlDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5UmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbkluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUmVxdWVzdFJlc3VsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25SZXF1ZXN0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsVHJlYXRtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5xdWlyeVNlbGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvblBhcmFtZXRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNvdmVyYWdlRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VJbmZvcm1hdGlvbkluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUGxhbkRlc2NyaXB0aW9uQ2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVDb250YWluZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVDb250YWluZXJRdWFudGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxDbGFzc2lmaWNhdGlvbk9mRGlzZWFzZXNDbGluaWNhbE1vZGlmaWNhdGlvblByb2NlZHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbENsYXNzaWZpY2F0aW9uT2ZEaXNlYXNlc0NsaW5pY2FsTW9kaWZpY2F0aW9uUHJpbmNpcGFsUHJvY2VkdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQ2xhc3NpZmljYXRpb25PZkRpc2Vhc2VzQ2xpbmljYWxNb2RpZmljYXRpb24tSWNkLTktQ21Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsU3RhbmRhcmREZXNpZ25hdGlvblN5c3RlbUZvclRlZXRoQW5kQXJlYXNPZlRoZU9yYWxDYXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeUNhdGVnb3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdGlnYXRpb25TdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50RnVuZFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG1lbnRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcnNRdWFsaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbU1hbmFnZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtU291cmNpbmdDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvYkNoYXJhY3RlcmlzdGljc0xvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iT3JpZ2luYXRvckxvb2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRMaWZlSW5zdXJhbmNlSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRpY2lhbEhlYXJpbmdUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkaWNpYWxPcmRlclR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRpY2lhbFNlbnRlbmNlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1cmlzZGljdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktleUV2ZW50TG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLaW5kT2ZDb250cmFjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktpbmRPZk1vZGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnlSZXN1bHRzSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5VGVzdENvbmRpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsQ2FzZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsRXZlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsU3RydWN0dXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZSZWNvbW1lbmRhdGlvblJhdGluZ0NhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWFiaWxpdHlEZXRhaWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWFiaWxpdHlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlT3JBbm51aXR5UHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVPckFubnVpdHlTZXJ2aWNlRmVhdHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVPckFubnVpdHlTdGF0dXNDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZVJlaW5zdXJhbmNlTWVzc2FnZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtQ29uZGl0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZU9mQXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lT2ZCdXNpbmVzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbGVPZkFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFNvdXJjZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbnNGb3JUYXJpZmZDYWxjdWxhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZ2ljYWxPYnNlcnZhdGlvbklkZW50aWZpZXJOYW1lc0FuZENvZGVzQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZ2lzdGljc0NvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzRGVzY3JpcHRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzU2V2ZXJpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3RUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFqb3JGb3JjZVByb2dyYW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlbWVudEluZGljYXRvckNvZGUtUGV0cm9sZXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51YWxDbGFzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmluZUJlcnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpbmVXaGFyZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0UGxhY2VPcmdhbml6YXRpb25JRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0UGxhY2VUcmFkaW5nUGFydG5lcklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENvbnRyb2xDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYW5zT2ZDb21tdW5pY2F0aW9uc0lkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYW5zT2ZUcmFuc3BvcnRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVjaGFuaXphdGlvbk9mQ29udHJhY3RBZG1pbmlzdHJhdGlvblNlcnZpY2VzU3lzdGVtRXJyb3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpYUFuZFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWlkUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxCZW5lZml0c1NjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpdW1PZlRyYW5zbWlzc2lvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lbWJlck9yZ2FuaXphdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGhvZEV2YWx1YXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRob2RzT2ZQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUFuZENpdmlsaWFuR3JhZGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUFzc2lzdGFuY2VQcm9ncmFtQWRkcmVzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbm9yaXR5SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNzaW9uSW1wYWN0U3RhdGVtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9uZXRhcnlGdW5jdGlvbkRldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VJbmRleFNvdXJjZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpLU1lZGlhT2JqZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYWNoYS1OYXRpb25hbEF1dG9tYXRlZENsZWFyaW5nSG91c2VBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDb3VuY2lsRm9yUHJlc2NyaXB0aW9uRHJ1Z1Byb2dyYW1zUmVqZWN0T3JQYXltZW50Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ291bmNpbE9uQ29tcGVuc2F0aW9uSW5zdXJhbmNlTmF0dXJlT2ZJbmp1cnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENvdW5jaWxPbkNvbXBlbnNhdGlvbkluc3VyYW5jZVBhcnRPZkJvZHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENvdW5jaWxPbkNvbXBlbnNhdGlvbkluc3VyYW5jZVNvdXJjZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxEcnVnQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxNb3RvckZyZWlnaHRDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsU3RhbmRhcmRUb290aE51bWJlcmluZ1N5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZCdXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mRGVidENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mRXZlbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmVPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mU3VpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZTdWl0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZUcmFuc2FjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9Mb25nZXJDb25zaWRlcmVkRm9yQXdhcmRSZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbWVuY2xhdHVyZUFjdGl2aXR5Q2xhc3NpZmljYXRpb25FY29ub215Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVBvc3RhbFRvd24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcm1lQWN0aXZpdGVGcmFuY2Fpc2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpY2VUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25JbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYmxpZ2F0aW9uVmFyaWFuY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uYWxTYWZldHlBbmRIZWFsdGhBZG1pbmlzdHJhdGlvbk5hdHVyZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsU2FmZXR5QW5kSGVhbHRoQWRtaW5pc3RyYXRpb25QYXJ0T2ZCb2R5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsU2FmZXR5QW5kSGVhbHRoQWRtaW5pc3RyYXRpb25Tb3VyY2VPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25DbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VycmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VycmVuY2VTcGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbkNhcnJpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlckFuZFJlbGVhc2VPcHRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VPZldvcmtlcnNDb21wZW5zYXRpb25Qcm9ncmFtc05hdHVyZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZXb3JrZXJzQ29tcGVuc2F0aW9uUHJvZ3JhbXNPY2N1cGF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZXb3JrZXJzQ29tcGVuc2F0aW9uUHJvZ3JhbXNQYXJ0T2ZCb2R5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZXb3JrZXJzQ29tcGVuc2F0aW9uUHJvZ3JhbXNTb3VyY2VPZkluanVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ1N0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnNpemVPck92ZXJ3ZWlnaHRDcmVkZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBSaWdodHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VGYWlsdXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0FuZE9yVW5wYWNraW5nRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdSZXF1aXJlbWVudExldmVsQUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdSZXF1aXJlbWVudExldmVsQkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdSZXF1aXJlbWVudExldmVsQ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRPZkJvZHlBZmZlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydE9mQm9keUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3Nwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50RXZlbnRQcm9ibGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEJlaGF2aW91clJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWRlc3RyaWFuQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxQcm9wZXJ0eUFuZENvbnRlbnRzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtQmlsbFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bUxhbmRDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtTGVhc2VTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVByb2R1Y3REaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUHJvZHVjdFBvaW50LU9mLVNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVByb2R1Y3RTZWxsaW5nQXJyYW5nZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVByb2R1Y3RWYWx1ZUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVJlZ3VsYXRvcnlSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVJveWFsdHlBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Sb3lhbHR5Q2FsY3VsYXRpb25NZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVJveWFsdHlUcmFuc2FjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtVW5pdGVkU3RhdGVzR2VvbG9naWNhbFN1cnZleUZvcm1hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVdlbGxBY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVdlbGxDbGFzc2lmaWNhdGlvblN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtV2VsbEluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1XZWxsU2h1dC1JblJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtV2VsbFRlc3RJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxDaGFyYWN0ZXJpc3RpY3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudENsZWFyYW5jZU9mZmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXNPck1pbnVzSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5T25DbGFpbUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5UmVzZXJ2ZVZhbHVhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRhbElEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0YWxEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGFsU2VydmljZUNhcnJpZXJSb3V0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGNvZGVEaXJlY3RvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RNYXJrZXRTdHVkeVN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWNpb3VzTWV0YWxzSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VydmF0aW9uRGF0YUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlcnZhdGlvbk1hdGVyaWFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmVudGl2ZU1lYXN1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlEaWFnbm9zaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbERpYWdub3NpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsUGFydHlDaXRpemVuc2hpcENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5RGVzaWduYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5TG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlckZpbmFuY2lhbEhpc3RvcnlDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RRdWFsaXR5RGVmaWNpZW5jeVJlcG9ydFN1bW1hcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0U3VwcGx5Q29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mZXNzaW9uYWxEZXNpZ25hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvbmFsU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvblR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtT3JpZ2luYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1ZZWFyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3Rpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eU93bmVyc2hpcEV4dGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlPd25lcnNoaXBUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlSZWNvcmRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eVNvdXJjZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlVbmRlcndyaXRpbmdDb25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wcmlldGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2luZ0NvbnRyYWN0T2ZmaWNlckluc3RydWN0aW9uc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cnBvc2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5QWxlcnRMaXN0UmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5QXNzdXJhbmNlU2l0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb25mb3JtYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNvbnRyb2xDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVBlclVuaXRQYWNrQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVlcnlPcHRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWVyeVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9GcmVxdWVuY3lUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb1NlcnZpY2VUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb1N5c3RlbVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxBZGRpdGlvbmFsQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbGNhckxldHRlck1hcmtpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxEb2N1bWVudE5hbWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsSGFuZGxpbmdSZXN0cmljdGlvbnNBbmRJbnN0cnVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxIYXJtb25pemVkQ29kaWZpY2F0aW9uT2ZUYXJpZmZzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsSGFybW9uaXplZEVxdWlwbWVudFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxSb3V0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxVbmlmaWVkTm9tZW5jbGF0dXJlT2ZHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheUNvbXBhbnlOZXR3b3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsd2F5Q3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWx3YXlGcm9udGllckFuZFRyYW5zaXRQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheUxvY2F0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheVNlcnZpY2VzSGFybW9uaXplZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0aW5nU3VtbWFyeVZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlQXNzZXRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Gb3JDb250cmFjdERlbGl2ZXJ5RGF0ZVJldmlzaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yRGVsYXllZENsb3NpbmdPZkNvbnRyYWN0RmlsZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNvbkZvckRpc3Bvc2FsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yRmluYW5jaWFsSXRlbURldGFpbENoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yUHVibGljUmVjb3JkRmlsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Gb3JSZXF1aXNpdGlvbmluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2lwaWVudE9mQmlsbGluZ1N0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29tbWVuZGF0aW9uc1JlZ2FyZGluZ0RlbGF5ZWREZWxpdmVyaWVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkUHJlY2VkZW5jZUJhc2VkT25JdHNDdXJyZW5jeUluVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlQW5kU3RhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRpb25Vbml0T3BlcmF0aW5nTW9kZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZENvbnRyYWN0b3JBY3Rpdml0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlTW9uZXRhcnlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZVBvbGljeUF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdEFkdmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdEluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWREZXZpY2VBcHBsaWNhYmlsaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaWdpb3VzQWZmaWxpYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1lZGlhbEFjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW92YWJsZUFjY2Vzc29yaWVzQW5kU3BlY2lhbEVxdWlwbWVudE9uUmFpbGNhcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRhbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGFibGVFdmVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGFibGVFdmVudFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydERpc3RyaWJ1dGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydFNvdXJjZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcHJlc2VudGF0aXZlQnV5SW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZW1lbnRzSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVuY3lJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50aWFsQW5kQ29tbWVyY2lhbFJvb21Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZVN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0aW9uc0FuZFByb2hpYml0aW9uc1BsYWNlZE9uVGhlUmUtVXNlT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3VsdEV2YWx1YXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXdQZXJpb2RJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaXNrQ2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRDaGFyYWN0ZXJpc3RpY0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWR3YXlEZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWR3YXlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1blR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eUFuZEZpdG5lc3NFbGVjdHJvbmljUmVjb3JkU3lzdGVtc0Vycm9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5QW5kRml0bmVzc0VsZWN0cm9uaWNSZWNvcmRTeXN0ZW1zU3Vic2NyaXB0aW9uT3B0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlIYXphcmRMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eVJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUHJpY2VDb25kaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWx2YWdlRGlzcG9zaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVFeHRyYWN0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYXZhbk93bmVyc2hpcENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeURpYWdub3NpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5U291cmNlT2ZJbmp1cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5U2hhcmVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQW5kQWdlbmN5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbnRyYWN0QWN0T2NjdXBhdGlvbkNhdGVnb3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbnRyYWN0QWN0T2NjdXBhdGlvbkNsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbnRyYWN0QWN0T3BlcmF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudE9yUGF5b3V0T3B0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbGZMaWZlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRBY2NlcHRhbmNlRGlzY3JlcGFuY3lFeHBsYW5hdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50SG9sZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50UmVsZWFzZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25hbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVN0YXRlUmVnaXN0cmF0aW9uU3lzdGVtQW5kT3BlcmF0aW5nQXV0aG9yaXR5Q3JlZGVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlVXNlTGFiZWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXplQW5kVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpblRvbmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbEFybXNFcnJvclRyYW5zYWN0aW9uUmVqZWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxBcm1zVHJhbnNhY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxTZWN1cml0eUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xpY2l0YXRpb25DYW5jZWxsYXRpb25SZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGljaXRhdGlvbk1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291bmRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU1haW50ZW5hbmNlQW5kUmVjb3ZlcmFiaWxpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkRlcG9zaXRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkRpc2Nsb3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU9mSW5qdXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZMZWFkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZMb3NzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENhdGVnb3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENvbnRyYWN0UHJvdmlzaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbERhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsTWFya2V0aW5nVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxNYXJraW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbE1hdGVyaWFsSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUHJvZ3JhbVJlcXVpcmVtZW50U3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFJlaW1idXJzYWJsZVByb3Zpc2lvbnNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUmVxdWlyZW1lbnRMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxSZXF1aXJlbWVudHNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZEluZHVzdHJpYWxDbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRPY2N1cGF0aW9uQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFRleHRBY2NvcmRpbmdVU0VtYmFyZ29SZWd1bGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRUZXh0Q2xhdXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRUZXh0Rm9yRXhwb3J0QWNjb3JkaW5nTmF0aW9uYWxQcmVzY3JpcHRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpb25DbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlvbkNsYXNzaWZpY2F0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxBZG1pbmlzdHJhdGl2ZUluZm9ybWF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxOYXR1cmVPZlRyYW5zYWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbE9iamVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxQcm9jZWR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNCdW5kZXNBbXRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja0V4Y2hhbmdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tFeGNoYW5nZURldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tGdW5kT3JOb24tU3RvY2tGdW5kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50QWN0aXZpdHlUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZGVudEF3YXJkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vicm9nYXRpb25BY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJyb2dhdGlvblBheW1lbnRPcHRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJyb2dhdGlvblJlcXVlc3RDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vicm9nYXRpb25SZXNwb25zZUNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzaXN0ZW5jZVR5cGVPZlBhY2tDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWZmaXhDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWZmaXhPckxpbWl0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbW9uc1R5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YWxEYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YXJ5QWNjb3VudGluZ0NsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzU3RvY2tUdXJub3ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGx5Q29uZGl0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZURlc2NyaXB0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ludGF4Tm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbWF0aXplZE5vbWVuY2xhdHVyZU9mSHVtYW5BbmRWZXRlcmluYXJ5TWVkaWNpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmU2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEFzc2Vzc21lbnRNZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheE9yRmVlRXhlbXB0aW9uUmVhc29uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UGFydHlJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsQXNzZXNzbWVudENoZWNrbGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lRGlyZWN0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wbGF0ZUNoYXJhY3RlcmlzdGljTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wbGF0ZU93bmVyTG9va3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wbGF0ZVR5cGVMb29rdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtc09mRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcnRpYXJ5RGlhZ25vc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nRGVtb2dyYXBoaWNDYXRlZ29yeUNvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nU2VydmljZVF1ZXN0aW9uQ29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmdTdGF0aXN0aWNhbENhdGVnb3J5Q29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RSZXN1bHRzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVEb2N1bWVudENvZGVMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZUV4Y2VwdGlvbkFuZFJlcXVpcmVtZW50Q29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5JZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb25TdGF0dXNJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkJpbGxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkhvbGRpbmdEZWxheUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uTW9kZU9yTWV0aG9kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25Nb2RlUmVhc29uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25Qcmlvcml0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJ5TWFuYWdlbWVudEFzc29jaWF0aW9uU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJ5TWFuYWdlbWVudEFzc29jaWF0aW9uU2VydmljZUNvZGVBbmRCYW5rU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJ5U3ltYm9sQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZW5kUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlhbFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlQWRqdXN0bWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVBbmRDYXVzZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVEdWUtSW5JbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVJZGVudGl0eUNoYW5nZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVJbnNwZWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU51bWVyaWNhbENvbnRyb2xTeXN0ZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZBc3NldHNBbmRMaWFiaWxpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQXNzaXN0YW5jZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkJpbGxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZCdXNpbmVzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkNhcmdvQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQ29udHJhY3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZDb250cmFjdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mRGVsYXlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZGaW5hbmNpYWxBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZGaXJtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mSW5kdXN0cmlhbEFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZJbnF1aXJ5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mSXNzdWVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZMb2NhdGlvblJlY29uY2lsaWF0aW9uUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mTWVkaWFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZQYWNrYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZQcm9jdXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mU3RvcmFnZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZlN1cnZleVF1ZXN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlUGFja0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVQaHlzaWNhbEludmVudG9yeU9yVHJhbnNhY3Rpb25IaXN0b3J5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVSZWNpcGllbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmNsYWltZWRQcm9wZXJ0eUFkZGl0aW9uc0RlbGV0aW9uc0FuZERlZHVjdGlvbnNDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5jbGFpbWVkUHJvcGVydHlUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pZm9ybUZyZWlnaHRDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWZvcm1SZXNpZGVudGlhbEFwcHJhaXNhbEF0dHJpYnV0ZXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkTmF0aW9uc0NvbW1vbkNvZGluZ1N5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkTmF0aW9uc1N0YW5kYXJkUHJvZHVjdHNBbmRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzRGVwYXJ0bWVudE9mSGVhbHRoQW5kSHVtYW5TZXJ2aWNlc09mZmljZU9mVml0YWxTdGF0aXN0aWNzRS1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNvbGljaXRlZFByb3Bvc2FsUmVqZWN0aW9uUmVhc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGlsaXphdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY2NpbmF0aW9uSW5ub2N1bGF0aW9uT3JJc29sYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1YXRpb25UeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlQWRkZWRUYXhJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZUNsYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlT2NjdXBhbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlUGFyYW1ldGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsU3RhdHVzQW5kVGVybXNPZkNhcnJpYWdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsU3Rvd2FnZUxvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsU3VzdGFpbmluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpZXdQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaW9sYXRpb25UeXBlQ29kZUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZveWFnZURvY3VtZW50TnVtYmVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm95YWdlTWFuaWZlc3RSZWZlcmVuY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhclJlc2VydmVNYXRlcmlhbFJlcXVpcmVtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJDb21tb2RpdHlBbmRTcGVjaWFsSGFuZGxpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlclRlcm1pbmFsSWRlbnRpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodE9yRnJhZ2lsaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlbkRpc2NvdmVyZWRMb29rdXAiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZklkZW50aWZpZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IklkZW50aWZpZXIiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZklkZW50aWZpZXIiIHR5cGU9Ikxpc3RPZklkZW50aWZpZXIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWVBZGRyZXNzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkV4dGVybmFsQWRkcmVzc0lEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTmFtZTEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik5hbWUyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOYW1lMyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlBPQm94Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdHJlZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhvdXNlTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdHJlZXRTdXBwbGVtZW50MSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3RyZWV0U3VwcGxlbWVudDIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJ1aWxkaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGbG9vciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUm9vbU51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSW5ob3VzZU1haWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRlcGFydG1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBvc3RhbENvZGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvdW50eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJSZWdpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRpc3RyaWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVGltZXpvbmUiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkFkZHJlc3NUeXBlQ29kZWQiIHR5cGU9IkFkZHJlc3NUeXBlQ29kZSIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iTm90QXBwbGljYWJsZSIvPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJBZGRyZXNzVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTmFtZUFkZHJlc3MiIHR5cGU9Ik5hbWVBZGRyZXNzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQT0JveCI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlBPQm94UG9zdGFsQ29kZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQT0JveCIgdHlwZT0iUE9Cb3giLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJlZ2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVnaW9uQ29kZWQiIHR5cGU9IlJlZ2lvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlZ2lvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlJlZ2lvbiIgdHlwZT0iUmVnaW9uIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlJlZ2lvbkNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVUFDVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVOU1ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVTlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVUUxEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRBUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVWSUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVV0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSQUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSQUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSQU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSQVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSQkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSQ0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSREYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSRVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSR08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSTUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSTUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSTVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSTVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUEIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUkoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSUlMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSU0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSU0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSU1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSVE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBTUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBTkIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBTkYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBTlMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBTlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBT04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBUEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBUUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBU0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBWVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQkIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQkYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQksiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQlMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQlUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQlkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCQ1YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCREIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCREYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCREciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCREwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCRE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCRE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCRFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCRFYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCRFkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCRVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCRVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCRkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCRk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCR0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCR00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCR1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCR1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCR1ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCR1kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCSEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCSEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCSEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCSFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCSFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCSFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCSVciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCS0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCS0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTUkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTVkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTkIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTksiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTlMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCTlUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCT00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCT1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCT1giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUEIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUFkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUlUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU1ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCU1kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCVEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCVEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCVEgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCVE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCVFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCV0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCV0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCV0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCV0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCV0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCV00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCV08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCV1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCV1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCWUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCWU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCWVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCWVciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQVYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQlMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQloiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ0IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUQ1oiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklURU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklURkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklURkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklURkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklURk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklURlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUR0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUR08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUR1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUSU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUSVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUS1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTUkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUTlUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUT1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUEciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUFYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUFoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUUlYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUU0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUU0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUU08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUU1AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUU1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUU1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUU1YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVFYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUVlYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQVoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTREMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTREUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTRkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTR0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTR1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTSEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTSUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTSUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTSU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTS1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTS1kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTUkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTkoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTlYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTlkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTT0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTT0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTT1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTUEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTUFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTUkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTU0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTU0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTVE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTVFgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTVVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTVkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTVkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTVlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTV0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTV0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTV1YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTV1kiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvdW50cnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvdW50cnlDb2RlZCIgdHlwZT0iQ291bnRyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvdW50cnlDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb3VudHJ5IiB0eXBlPSJDb3VudHJ5Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkNvdW50cnlDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQloiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJETSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1oiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1IIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1NIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1QIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1TIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1WIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5HIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5VIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0oiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJURyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpXIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUaW1lem9uZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGltZXpvbmVDb2RlZCIgdHlwZT0iVGltZXpvbmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUaW1lem9uZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRpbWV6b25lIiB0eXBlPSJUaW1lem9uZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUaW1lem9uZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEyLjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMS40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTEuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjExLjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMS4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTAuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEwLjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMC4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTAuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA5LjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwOS4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDkuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA5LjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwOC40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDguMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA4LjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwOC4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDcuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA3LjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNy4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDcuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA2LjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNi4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDYuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA2LjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNS40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDUuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA1LjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNS4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDQuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA0LjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNC4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDQuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAzLjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMy4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDMuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAzLjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMi40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDIuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAyLjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMi4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDEuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAxLjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMS4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDEuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAwLjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMC4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDAuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAwLjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDAuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMC4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAwLjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDEuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMS4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAxLjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDEuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMi4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAyLjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDIuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMi40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAzLjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDMuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMy4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAzLjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDQuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNC4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA0LjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDQuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNS4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA1LjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDUuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNS40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA2LjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDYuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNi4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA2LjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDcuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNy4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA3LjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDcuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wOC4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA4LjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDguMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wOC40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA5LjAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDkuMTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wOS4zMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA5LjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMTAuMDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0xMC4xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTEwLjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMTAuNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0xMS4wMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTExLjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMTEuMzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0xMS40NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTEyLjAwIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkFkZHJlc3NUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFuY2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNQYXlhYmxlT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZW1lbnRSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsRGVsaXZlcnlBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsUGlja1VwQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbEJldmVyYWdlRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRlUmV0dXJuQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRpdmVBZGRyZXNzZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1ZGl0T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWlsbWVudFdhcmVob3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkT3BlbmluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsQW5kU2hpcFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsZWRGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va2luZ09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuZHlBbmRDb25mZWN0aW9uc0RlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZWRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55QXNzaWduZWRXZWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55LU93bmVkT2lsRmllbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZUNvdXJpZXJUcmFuc2ZlclN0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vckNvdXJpZXJUcmFuc2ZlclN0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bHRhbnRzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29weU1lc3NhZ2VUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uTWFpbEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWZmZXJlbnRQcmVtaXNlQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudE9yTWVzc2FnZUlzc3Vlck9yU2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWNGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG93bnN0cmVhbU1ldGVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3AtT2ZmTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGFibGlzaGVkTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxpbmdPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsTWVzc2FnZVJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsU2NoZWR1bGVkRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb3JhbERlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25EaXNjbG9zdXJlSW5mb3JtYXRpb25PZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25PZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25SZWdpc3RyYXRpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWVyQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZW9uQm9hcmRQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvemVuRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FyYWdlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNQbGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVHJhbnNhY3Rpb25FbmRpbmdQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVHJhbnNhY3Rpb25Qb2ludDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uUG9pbnQyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUcmFuc2FjdGlvblN0YXJ0aW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRlZEZyb21Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGVkTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRpb25TdGF0ZVBsYWNlT2ZCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGlvblN0YXRlUHJpbmNpcGFsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJ5QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25BbmRBY2NlcHRhbmNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGVkQXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluLVN0b3JlQmFrZXJ5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0QnJlYWtUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdGluZ09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxDaGFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZkdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mR29vZHNGb3JDdXN0b21zRXhhbWluYXRpb25CZWZvcmVDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZMb2FkRXhjaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZTcG90Rm9yU3RvcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nUGxhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlclByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENoYW5nZU5vdGljZUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsRGlzcG9zaXRpb25BdXRob3JpemF0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXREZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWV0aW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5laWdoYm9yaG9vZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3U3VwcGx5U291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRTY2hlZHVsZWREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVRlbXBvcmFyeVN0b3JhZ2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90QXBwbGljYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JPZlRoZVRyYW5zZmVyUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbk1haWxGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luU3VibG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpblRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckRlcGFydG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlckNvbnRpbmVudGFsU2hlbGZBcmVhTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dC1PZi1TdGF0ZVByaW5jaXBhbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duaW5nSW52ZW50b3J5Q29udHJvbFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0U291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29ubmVsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaGFybWFjeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja1VwQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lU2VnbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmVTZWdtZW50Qm91bmRhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZCb3R0bGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0YWxNYWlsaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlJbnNwZWN0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNvbnRyb2xQb2ludExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFNlcnZpY2VzQW5kUmVwYWlyc0NlbnRyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdENvb3JkaW5hdGlvbk9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE1hbmFnZW1lbnRPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb0NvbnRyb2xTdGF0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXB0TWV0ZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWlwdFpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nUG9pbnRGb3JDdXN0b21lclNhbXBsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ1N1Yi1Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFtYXRpb25DZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZC1LZWVwaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmaW5lcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbmFsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0VG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpcmluZ091dGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyT3JSZWZ1cmJpc2hMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0aW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VhcmNoSW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVuY2VPckRvbWljaWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5lZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0aW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVzVG9CZVJldHVybmVkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsaW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUxvY2F0aW9uQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kSG9tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGluZ09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsdGVyZWRXb3Jrc2hvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxCYXNlU3RhdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbENvbnRyb2xTdGF0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGRUb0FuZFNoaXBUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZFRvSWZEaWZmZXJlbnRGcm9tQmlsbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUZhY2lsaXR5YXREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUZhY2lsaXR5QXRPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0T3JDb2duaXphbnRTZWN1cml0eU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdFByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzaWRpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzaWRpYXJ5RGl2aXNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyT3JNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc0NvcnBvcmF0ZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGx5U291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rRmFybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Q29sbGVjdG9yc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZ0xhYm9yYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwc3RyZWFtTWV0ZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFjYXRpb25Ib21lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpZGVvRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaG9sZXNhbGVyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250YWN0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRhY3RJRCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3ROYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNvbnRhY3RGdW5jdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udGFjdERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkNvbnRhY3ROdW1iZXIiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3QiIHR5cGU9IkNvbnRhY3QiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRhY3RGdW5jdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdEZ1bmN0aW9uQ29kZWQiIHR5cGU9IkNvbnRhY3RGdW5jdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRhY3RGdW5jdGlvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3RGdW5jdGlvbiIgdHlwZT0iQ29udGFjdEZ1bmN0aW9uIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkNvbnRhY3RGdW5jdGlvbkNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRpbmdPZmZpY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ2NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUGF5YWJsZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUmVjZWl2YWJsZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxJbnN1cmFuY2VJbmZvcm1hdGlvbkNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0aXZlQ29udHJhY3RpbmdPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pbmlzdHJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZnRlci1Ib3Vyc0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcG9pbnRtZW50U2NoZWR1bGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGVudGlvbi1Ub1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaXRpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkRmluYW5jaWFsQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZE5lZ290aWF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFNpZ25hdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkQ2xlYXJpbmdob3VzZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsSW5xdWlyeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkU3RhZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NVbml0TWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJOYW1lb3JEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQURBbmRDQU1TcGVjaWFsaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvbkNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhaXJtYW5PZlRoZUJvYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZU9yZGVyQXBwcm92ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWVmRXhlY3V0aXZlT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpZWZGaW5hbmNpYWxPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGllZkluZm9ybWF0aW9uT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpZWZPcGVyYXRpbmdPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5V29ya3NBdXRob3JpdHlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbWFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1BcHByb3ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1SZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltc0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5naG91c2VDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVya09mQ291cnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUJvcnJvd2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1JbnZlc3RpZ2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVnZW9mRWR1Y2F0aW9uQWRtaXNzaW9uc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxpYW5jZU9mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBvbmVudEVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wdXRlclN5c3RlbXNDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jdXJyZW50RW1wbG95ZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtZWRXaXRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29yZGluYXRpb25Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29yZGluYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlUHVyY2hhc2luZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0QW5kU2NoZWR1bGVDb29yZGluYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJDb250YWN0R3JhbnRpbmdBcHBvaW50bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJFbmdpbmVlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJNYWludGVuYW5jZU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUmVsYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNHb29kc0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlJbnN0cnVjdGlvbnNDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW50YWxTY2hvb2xBZG1pc3Npb25zT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T3JFbXBsb3llZVRvRXhlY3V0ZUV4cG9ydFByb2NlZHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPckVtcGxveWVlVG9FeGVjdXRlSW1wb3J0UHJvY2VkdXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9yUGVyc29uUmVzcG9uc2libGVGb3JQcm9jZXNzaW5nUHVyY2hhc2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzaWduRW5naW5lZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmVsb3BtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0b3J5QWR2ZXJ0aXNpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZpc2lvbkRpcmVjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZpc2lvbk1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVESUNvb3JkaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25Db29yZGluYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3RyaWNpdHlTdXBwbHlDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljRGF0YUludGVyY2hhbmdlQ29vcmRpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNTdWJtaXNzaW9uUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lDb250YWN0LUNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5Q29udGFjdC1NaWxpdGFyeVRyYWZmaWNNYW5hZ2VtZW50Q29tbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5Q29udGFjdC1TaGlwcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lEYW5nZXJvdXNHb29kc0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50ZXJlZEJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW5pbmdQcm9ncmFtc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlY3V0aXZlT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlY3V0aXZlVmljZS1QcmVzaWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsQWlkT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2xvc2luZ0xlbmRlckFkbWluaXN0cmF0aXZlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbE1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1N1cHBseUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc1JlY2VpdmluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWR1YXRlQWRtaXNzaW9uc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZHVhdGVCdXNpbmVzc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZHVhdGVFbmdpbmVlcmluZ09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZHVhdGVGaW5lQXJ0c09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VpZGFuY2VDb3Vuc2Vsb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZE9mVW5pdEZvckluZm9ybWF0aW9uRGlzc2VtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZE9mVW5pdEZvckluZm9ybWF0aW9uUHJvZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZE9mVW5pdE9yQ29tcHV0ZXJEYXRhUHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoTWFpbnRlbmFuY2VPcmdhbml6YXRpb25Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIdW1hblJlc291cmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnZpZXdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0aWdhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50V29ya0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZHJlZ2lzdHJ5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF3RmlybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF3U2Nob29sQWRtaXNzaW9uc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxBdWRpdGluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFB1cmNoYXNpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nUGxhbnRDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRpbmdEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRpbmdEaXJlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDb250cm9sQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxEaXNwb3NpdGlvbkNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsSGFuZGxpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFNhZmV0eURhdGFTaGVldENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsQWRtaXNzaW9uc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VSZWNpcGllbnRDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlU2VuZGVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZVN0YWZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlVmVuZG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdCdXNpbmVzc1Byb2Nlc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0RldmVsb3BtZW50c0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGFyeVB1YmxpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpY2F0aW9uQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtZXJpY2FsQ29udHJvbEVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VTdGFmZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlckRlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyaW5nT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJBZHVsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJlbnRvckd1YXJkaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGF0aW5nTGFib3JhdG9yeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRuZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJzQ2xhaW1PZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmZvcm1hbmNlRXZhbHVhdGlvbkNvbW1pdHRlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29ubmVsQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mQ29sbGVjdGlvbkNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZEZWxpdmVyeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50TWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRPckVxdWlwbWVudENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRmb3JtTWFpbnRlbmFuY2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0RW5naW5lZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWF3YXJkU3VydmV5TWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb25Db250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFkbWluaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNvbnRyb2xQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVRheHBheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxTdHVkeUNvbnRhY3RvckF1dGhvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvYmF0aW9ub3JMZWdhbE9mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NFbmdpbmVlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RNYW5hZ2VtZW50Q29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbURpcmVjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdERpcmVjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TWFuYWdlbWVudENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90b3R5cGVDb29yZGluYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY1JlbGF0aW9uc0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzaW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2luZ0NvbnRyYWN0aW5nT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUFzc3VyYW5jZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb29yZGluYXRvckNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlJbnNwZWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVN1cnZleW9yQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlU3VwZXJ2aXNvck9yQ2xlcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVQcm9wZXJ0eUtleUhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZVByb3BlcnR5T2NjdXBhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYmF0ZU9yQ2hhcmdlYmFja0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0RvY2tDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRhbENvbXBhbnlBZG1pbmlzdHJhdGl2ZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydEF1dGhvcml6ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydFByZXBhcmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbmRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlUGVyc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZVBlcnNvbkZvckNvbXB1dGVyRGF0YVByb2Nlc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlUGVyc29uZm9ySW5mb3JtYXRpb25EaXNzZW1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZVBlcnNvbkZvckluZm9ybWF0aW9uUHJvZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aWV3QW5kUmVwcmljaW5nQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNBZG1pbmlzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNSZXByZXNlbnRhdGl2ZU9yRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xDbGVyayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sb2ZUaGVvbG9neUFkbWlzc2lvbnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbG9mVmV0ZXJpbmFyeU1lZGljaW5lQWRtaXNzaW9uc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sUHJpbmNpcGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlUYXhwYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjcmV0YXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VPcmRlcldyaXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZU9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVRlYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VUZWNobmljaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxTZXJ2aWNlc1dvcmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29mdHdhcmVIb3VzZUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQcm9ncmFtQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFmZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZGVudGluQWJzZW50aWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWR5U3VibWl0dGVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGluZ0NvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtc0FkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbERlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbERvY3VtZW50YXRpb25SZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbE1hcmtldGluZ1JlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxXcml0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21tdW5pY2F0aW9uc05ldHdvcmtDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmVBbnN3ZXJpbmdTZXJ2aWNlQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5kZXJEZXZlbG9wZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZC1QYXJ0eUFkbWluaXN0cmF0b3JDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3duUGxhbm5pbmdDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFmZmljQWRtaW5pc3RyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZmZpY0F1dGhvcml0eUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWl0dGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRJbmZyYXN0cnVjdHVyZUF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXN1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVSZWNlaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJncmFkdWF0ZUFkbWlzc2lvbnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyd3JpdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlvblByZXNpZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmljZVByZXNpZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FpdmVyQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlclN1cHBseUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtCcm9rZXJNYWludGVuYW5jZU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtzaG9wQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya3NNYW5hZ2VtZW50Q29udGFjdCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQ29udGFjdE51bWJlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iQ29udGFjdE51bWJlciIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQ29udGFjdE51bWJlciIgdHlwZT0iTGlzdE9mQ29udGFjdE51bWJlciIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGFjdE51bWJlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdE51bWJlclZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdE51bWJlclR5cGVDb2RlZCIgdHlwZT0iQ29udGFjdE51bWJlclR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250YWN0TnVtYmVyVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3ROdW1iZXIiIHR5cGU9IkNvbnRhY3ROdW1iZXIiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ29udGFjdE51bWJlclR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYXhOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtYWlsQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9iaWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxleE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFnZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVQYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXV1ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZUUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVJMT3RoZXIiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkNvbnRhY3QiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkNvbnRhY3QiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkNvbnRhY3QiIHR5cGU9Ikxpc3RPZkNvbnRhY3QiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlBhcnR5Q29kZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlBhcnR5Q29kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlBhcnR5Q29kZWQiIHR5cGU9Ikxpc3RPZlBhcnR5Q29kZWQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhcnR5Q29kZWQiPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iUGFydHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0eVJvbGVDb2RlZCIgdHlwZT0iUGFydHlSb2xlQ29kZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXJ0eVJvbGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0eUNvZGVkIiB0eXBlPSJQYXJ0eUNvZGVkIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlBhcnR5Um9sZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhbmNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50Q29vcmRpbmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdTdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50T2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRPZkRlc3RpbmF0aW9uUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRPZi1PcmlnaW5QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50T3duZXJzU2VydmljaW5nQmFua09uVGhlUmVjZWl2aW5nU2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE93bmVyc1NlcnZpY2luZ0JhbmtPblRoZVNlbmRpbmdTaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50U2VydmljaW5nRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUGF5YWJsZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VtZW50UmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3JvbnltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpb25QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsUHVyY2hhc2Vyc0N1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxSZWZlcnJlZEJ5T3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxSZWZlcnJlZFRvT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3V0ZUNhcmVIb3NwaXRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxEZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxEZWxpdmVyeUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxQaWNrVXBBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRpb25DZW50cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWl0dGluZ0hlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaXR0aW5nU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWl0dGluZ1N1cmdlb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdWx0RGF5Q2FyZVByb2dyYW1GYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJ0aXNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJ0aXNpbmdHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNlVGhyb3VnaEJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzaW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmaWFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmaWxpYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZmZpbGlhdGVkQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmaWxpYXRlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUdyYW50aW5nU2VjdXJpdHlDbGVhcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50T3JSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRzQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUlEU09yQVJDVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQW1idWxhbmNlU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckNhcmdvQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRm9yY2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlybGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlycG9ydEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbEJldmVyYWdlRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbGlzbUFuZE90aGVyQ2hlbWljYWxEZXBlbmRlbmN5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xPckRydWdBYnVzZU9yRGVwZW5kZW5jeUlucGF0aWVudFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xPckRydWdBYnVzZU9yRGVwZW5kZW5jeU91dHBhdGllbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxpYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsaWVuQWZmaWxpYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxlZ2VkRGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsaWVkSGVhbHRoUHJvZmVzc2lvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvdG1lbnRDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhYmxlUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVSZXR1cm5BZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGl2ZUFkZHJlc3NlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRpdmVNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsemhlaW1lcnNEaWFnbm9zdGljT3JBc3Nlc3NtZW50U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZW5kZWROYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkluZGlhbi1Pd25lZEJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWljdXNDdXJpYWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuZXN0aGVzaW9sb2d5U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuZ2lvcGxhc3R5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuaW1hbEJlaW5nSW52ZXN0aWdhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmltYWxTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVpdGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWl0YW50UGF5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGVubmFTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBlbGxhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGVsbGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudENvbWFrZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudEZvckpvYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50c0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudHNDb3NpZ25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50c0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvblBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzYWxDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzZXJOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZlZENvbnNpZ25vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92ZWRJbXBvcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyYml0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyY2hpdGVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJjaGl0ZWN0LURlc2lnbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhT2ZPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFybWVkU2VydmljZXNMb2NhdGlvbkRlc2lnbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcm15RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycmVzdGluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFydGhyaXRpc1RyZWF0bWVudENlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRBY2NvdW50SG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3Npc3RhbnRTdXJnZW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3Npc3RhbnRVU1RydXN0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZUdlbmVyYWxBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGVuZGluZ1BoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dG9ybmV5Rm9yRGVmZW5kYW50UHJpdmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0b3JuZXlGb3JEZWZlbmRhbnRQdWJsaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dG9ybmV5Rm9yUGxhaW50aWZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRvcm5leU9mUmVjb3JkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWN0aW9uZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpdE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aGVudGljYXRpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpdHlGb3JTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXphdGlvbkFzc2lnbmVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRBY2NlcHRpbmdPZmZpY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZEVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZEV4cG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZEltcG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkTWFya2V0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRPZmZpY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkVHJhZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemluZ09mZmljaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWREYXRhUHJvY2Vzc2luZ1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWRVbmRlcndyaXRpbmdTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZVdpdGhCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFiaWxpdHlTaGlwVG9QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFpbGlmZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFpbG1lbnRXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhaWxQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFrZXJ5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rcnVwdGN5UmVmZXJlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua3J1cHRjeVRydXN0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VKdXJpc2RpY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VQZXJpb2RFbXBsb3llciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmF0dGVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhbE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZmljaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhcnlzQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRPcGVuaW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxBbmRTaGlwVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxlZEZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ1JlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsLVRvUGFydHlGb3JEaXZlcnNpb25DaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aGluZ1Jvb21PckxEUlBSb29tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRocGxhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb29kQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZlJlYWx0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2J0YWlsU2VydmljZVBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb25kc21hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va2luZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29raW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29ra2VlcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3JkZXJDcm9zc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9ycm93ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcnJvd2Vyc0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3R0bGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFrZW1hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuZE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFrQnVsa0JlcnRoT3BlcmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFrQnVsa1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9hZGNhc3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJEZWFsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlck9waW5pb25PckFuYWx5c2lzUmVxdWVzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJPclNhbGVzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJzQXNzaXN0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWlsZGVyTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVpbGRpbmdJbnNwZWN0b3JhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1aWxkaW5nU2l0ZUVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWlsZGluZ1NpdGVGb3J3YXJkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1aWxkaW5nU2l0ZVB1cmNoYXNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVyZWF1T2ZMYW5kTWFuYWdlbWVudFByb3BlcnR5VW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVybkNhcmVVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0Fzc29jaWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzUGFydG5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyQXNPZmZpY2lhbGx5UmVnaXN0ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQWdlbnRPclJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDb3Jwb3JhdGVPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNRdWFsaXR5UmV2aWV3Qm9hcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWluZ0dyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXlpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5DdXN0b21zQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5kaWRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmR5QW5kQ29uZmVjdGlvbnNEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkaWFjQ2F0aGVyaXphdGlvbkxhYm9yYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRpYWNJbnRlbnNpdmVDYXJlVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZGlhY1JlaGFiaWxpdGF0aW9uUHJvZ3JhbUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkaWFjUmVoYWJpbGl0YXRpb25TZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FybmV0SXNzdWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyc0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZU9mTmVlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoUG9vbExldmVsQWNjb3VudFNlcnZpY2luZ0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoUG9vbFN1Yi1BY2NvdW50U2VydmljaW5nRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hQb29sVG9wQWNjb3VudFNlcnZpY2luZ0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZWRpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50cmFsQmFua09yUmVndWxhdG9yeUF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbENhdGFsb2d1ZVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZWRBY2NvdW50YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZ5aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYWlycGVyc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFtYmVyT2ZDb21tZXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlZEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZXNQYXllckF0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJ0ZXJTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXNQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlY2tpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlcXVlRHJhd25CYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVxdWVPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpZWZEZXB1dHlDbGVya09mQ291cnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNDaHJvbmljRGlzZWFzZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNEYXlDYXJlQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNFeWVFYXJOb3NlQW5kVGhyb2F0RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc0dlbmVyYWxGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zSG9zcGl0YWxVbml0T2ZBbkluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNPcnRob3BlZGljRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc090aGVyU3BlY2lhbHR5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc1BzeWNoaWF0cmljRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc1JlaGFiaWxpdGF0aW9uRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc1R1YmVyY3Vsb3Npc0FuZE90aGVyUmVzcGlyYXRvcnlEaXNlYXNlc0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlyb3ByYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNocm9uaWNEaXNlYXNlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNocm9uaWNPYnN0cnVjdGl2ZVB1bG1vbmFyeURpc2Vhc2VTZXJ2aWNlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNodXJjaE9wZXJhdGVkRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpZ2FyZXR0ZXNBbmRUb2JhY2NvRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lyY3VpdExvY2F0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1BZG1pbmlzdHJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbWFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1hbnRBdXRob3JpemVkUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVyayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlcmtPZkNvdXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGluaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZERvb3JQaGFybWFjeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2F0aW5nT3JQYWludFN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1Cb3Jyb3dlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tQ29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tQ291bnNlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tRGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1EZWZlbmRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLURyaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tSW52ZXN0aWdhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXRlcmFsQXNzaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uUHJpbmNpcGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsSW5zdXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWlzc2lvbmFibGVBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWlzc2lvblByb2Nlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbXVuaXR5QWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11bml0eUhlYWx0aFByb21vdGlvbkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55QXNzaWduZWRXZWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55SW50ZXJ2aWV3ZXJXb3Jrc0ZvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUluV2hpY2hJbnRlcmVzdEhlbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlNZXJnZWRXaXRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55LU93bmVkT2lsRmllbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlXaGljaEhvbGRzRmluYW5jaWFsSW50ZXJlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmFibGVQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVByb3BlcnR5TGlzdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVJlbnRhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGluZ1Byb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZXRpdGl2ZVByb3BlcnR5TGlzdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGlsYXRpb25BZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsYWluYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGFpbmFudHNBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9uZW50TWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wcmVoZW5zaXZlR2VyaWF0cmljQXNzZXNzbWVudEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jdXJyZW50RW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmR1Y3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZHVjdG9yUGlsb3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmR1aXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbm5lY3RpbmdDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25uZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZUNvdXJpZXJUcmFuc2ZlclN0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZU9mVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZVRvQmVTcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZS1Ub1JlY2VpdmVMYXJnZVBhcmNlbHNBbmRGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWUtVG9SZWNlaXZlTWFpbEFuZFNtYWxsUGFyY2VscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3JDb3VyaWVyVHJhbnNmZXJTdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3JzUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZERlYnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJ1Y3Rpb25Db250cmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJ1Y3Rpb25GaXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdWx0YW50c09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsdGluZ1BoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJDcmVkaXRBY2NvdW50Q29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJSZWZlcnJhbENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVyU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lclNlcnZpY2VQcm92aWRlckN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0QmFuazEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RCYW5rMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGFydHkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGFydHkyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGFydHkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGFydHk0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGVyc29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTG9jYXRpb25QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyT3BlcmF0b3JPckxlc3NlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyUmV0dXJuQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU3VydmV5QWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbmdlbnRBbm51aXRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbmdlbnRCZW5lZmljaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZ2VudE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEFkbWluaXN0cmF0aW9uT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdGVkU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RpbmdPZmZpY2VyUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3ItR2VuZXJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RPckNvZ25pemFudFNlY3VyaXR5T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yLUxlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3ItTWFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3R1YWxEZWxpdmVyeU1ldGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdHVhbFJlY2VpcHRNZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlclF1YWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udm95aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLU9jY3VwYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1PcGVyYXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3BlcmF0aXZlQnV5aW5nR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1Pd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tUGFydGljaXBhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLVByb2R1Y2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3B5TWVzc2FnZVRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGlvbkZvci1Qcm9maXRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zaWduZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc2lnbmVyc0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VuY2lsT2ZHb3Zlcm5tZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRlckNsYWltYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5T2ZEZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeU9mRXhwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5T2ZPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0QXBwb2ludGVkQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdEdyYW50b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRvcnNBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0UmF0aW5nQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRSZXBvcnRpbmdBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZXdNZW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaW1lVmljdGltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc0NsYWltYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zcy1Ub3duU3dpdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVFNjYW5uZXJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RW1wbG95ZXItUHJpbWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEVtcGxveWVyLVNlY29uZGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFJlY2VpdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50U2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b2RpYWxQYXJlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvZGlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyRk9yV2hvbVNhbWVPclNpbWlsYXJXT3JrV2FzUGVyRm9ybWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lcklkZW50aWZpY2F0aW9uRmlsZUN1c3RvbWVySWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0Jyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc09mZmljZU9mQ2xlYXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYWlyeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFQcm9jZXNzaW5nU2VydmljZUJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvckNvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvckluZGl2aWR1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvci1Jbi1Qb3NzZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3JzQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRQYXltZW50QXV0aG9yaXNhdGlvblBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNpc2lvbk1ha2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmFudHNBZ2VudE9yUmVwcmVzZW50YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY29uc29saWRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZhdWx0T3JGb3JlY2xvc3VyZVNwZWNpYWxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVuZGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaWNhdGVzc2VuRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnRpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkp1c3RpY2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwZW5kZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnRJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnROYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc2lnbmF0ZWRIYXphcmRvdXNXYXN0ZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNpZ25FbmdpbmVlcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzaWduZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoQ2hhcmdlUGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25EcmF5bWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbkludGVybW9kYWxSYW1wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbk1haWxGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25UZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc3RpY1JhZGlvaXNvdG9wZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFseXNpc0NlbnRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpZmZlcmVudFByZW1pc2VBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJsZWRJbmRpdmlkdWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNidXJzaW5nT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2hhcmdlUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NpcGxpbmFyeUNvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RpbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JCcmFuY2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdEF0dG9ybmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdEp1c3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmlzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N0b3JPZk9wdG9tZXRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdG9yT2ZPc3Rlb3BhdGh5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFjY291bnRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBY2NvdW50UGFydHlzQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBcHBsaWNhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QmVuZWZpY2lhcnlzQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRSZWltYnVyc2luZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0U2Vjb25kQmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50Q3VzdG9kaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudE9yTWVzc2FnZUlzc3Vlck9yU2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9pbmdCdXNpbmVzc0FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3duc3RyZWFtRmlyc3RTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG93bnN0cmVhbU1ldGVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvd25zdHJlYW1QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmlsbGluZ0NvbnRyYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcC1PZmZMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ5R3JvY2VyeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cmFibGVNZWRpY2FsRXF1aXBtZW50U3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVjb25vbWljYWxseURpc2FkdmFudGFnZWRJbmRpdmlkdWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25hbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljRGF0YUludGVyY2hhbmdlQ29vcmRpbmF0b3JQb2ludEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNGaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY1JlZ2lzdHJhdGlvblV0aWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNSZXR1cm5PcmlnaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVtZW50YXJ5U2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGlnaWJsZVBhcnR5VG9UaGVDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpZ2libGVQYXJ0eVRvVGhlUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGVwYXJ0bWVudFNvY2lhbFdvcmtTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5TWVkaWNhbFRlY2huaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lSZXNwb25zZVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnaW5nU21hbGxCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5Q29udGFpbmVyUmVzcG9uc2libGVQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlDb250YWluZXJSZXR1cm5BZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlFcXVpcG1lbnREZXNwYXRjaFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUVxdWlwbWVudFJldHVyblBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRJdGVtTWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRVc2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmVyZ3lJbmZvcm1hdGlvbkFkbWluaXN0cmF0aW9uLU93bmVkT2lsRmllbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlci1Db25zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyLUNvbnN1bHRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlck1lYXN1cmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlclBpbG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlci1SZXNpZGVudENvbnN0cnVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5yb2xsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0eUhvbGRpbmdUaGVJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5SW5XaGljaEFGaW5hbmNpYWxJbnRlcmVzdElzSGVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5UHJvdmlkaW5nVGhlU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5UmVzcG9uc2libGVGb3JGb2xsb3ctVXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudHJ5UG9pbnRUZWNobmljYWxBc3Nlc3NtZW50R3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudERyb3AtT2ZmUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRSZXBhaXJQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0YWJsaXNoZWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGFtaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaGFuZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNpc2VQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVkZWRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlY3V0aXZlQ29tbWl0dGVlTWVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRvck9mRXN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVydFdpdG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeC1TcG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkQ2FyZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYWNvcnBvcmVhbFNob2NrLVdhdmVMaXRob3RyaXB0ZXJVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeWVFYXJOb3NlQW5kVGhyb2F0RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3Rvci1Db3JyZXNwb25kZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW1pbHlNZW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsR292ZXJubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbGx5Q2hhcnRlcmVkRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxTdGF0ZUNvdW50eU9yQ2l0eUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWxsb3dzaGlwSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlbG9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmllbGRvckJyYW5jaE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZXJOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxpbmdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxpbmdMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsaW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbEN1c3RvbWVyT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbE1haW50ZW5hbmNlT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbE1haW50ZW5hbmNlUGVyaW9kRGVzaWduYXRpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsTWVzc2FnZVJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxSZWNpcGllbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsUmVmZXJyZWRUb09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxTY2hlZHVsZWREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFBsYW5uZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFN0YXRlbWVudFJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyZW1hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RBcHByYWlzZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0QnJlYWtUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXRuZXNzQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vZENlcnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb2REZXRlcm1pbmF0aW9uUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb3JhbERlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvb2RTZXJ2aWNlT3BlcmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjbG9zaW5nTGVuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduRGlzY2xvc3VyZUluZm9ybWF0aW9uT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTGFuZ3VhZ2VTeW5vbnltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduUmVnaXN0cmF0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25TdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJseURvaW5nQnVzaW5lc3NBcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWVybHlLbm93bkFzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJQcmVzaWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1lclJlZ2lzdGVyZWRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJSZXNpZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvclByb2ZpdEhlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3VuZGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFuY2hpc2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFuY2hpc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlb25Cb2FyZFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0Rm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0TWFuYWdlbWVudEZhY2lsaXRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0T3JDaGFyZ2VzUGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRQYXllck9uQmVoYWxmT2ZUaGVDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRQYXllck9uQmVoYWxmT2ZUaGVDb25zaWdub3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb3plbkRlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1dHVyZUFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhaW5pbmdJbnZlbnRvcnlNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXJhZ2VkTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhcm5pc2hlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzUGxhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uRW5kaW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uUG9pbnQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUcmFuc2FjdGlvblBvaW50MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVHJhbnNhY3Rpb25TdGFydGluZ1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXRld2F5UHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxJbnBhdGllbnRDYXJlRm9yQUlEU09yQVJDRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxNZWRpY2FsQW5kU3VyZ2ljYWxGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbE1lcmNoYW5kaXNlRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXRpY0NvdW5zZWxpbmdPclNjcmVlbmluZ1NlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZXJpYXRyaWNBY3V0ZUNhcmVVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZXJpYXRyaWNDbGluaWNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHaWZ0UmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0NvbGxlY3Rpb25QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNDdXN0b2RpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUmVsZWFzZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQtQ29tYmluZWRDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50LUZlZGVyYWwtTWlsaXRhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQtRmVkZXJhbC1PdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudC1GZWRlcmFsLVZldGVyYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50RnVybmlzaGVkUHJvcGVydHlGT0JQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudExvYW5BZ2VuY3lTcG9uc29yT3JBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudC1Mb2NhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhbmRwYXJlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYW50b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VuZEFtYnVsYW5jZVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBBZmZpbGlhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwQWZmaWxpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwaW5nQ2VudHJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cFByYWN0aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cFB1cmNoYXNpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZUFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmRpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNXYXN0ZUdlbmVyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQW5kQmVhdXR5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoY2FyZVByb2Zlc3Npb25hbFNob3J0YWdlQXJlYUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhNYWludGVuYW5jZU9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoTWlzY2VsbGFuZW91cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoU2NpZW5jZXNMaWJyYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZW1vZGlhbHlzaXNGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlzb3BhdGhvbG9neUxhYm9yYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhpc3BhbmljU2VydmljZUluc3RpdHV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlzdG9yaWNhbGx5QmxhY2tDb2xsZWdlT3JVbml2ZXJzaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lSGVhbHRoQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lSGVhbHRoQ2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUhlYWx0aENvcnBvcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lSGVhbHRoU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVTdGF0ZU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbEF1eGlsaWFyeVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpdGFsRGlzdHJpY3RPckF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zcGl0YWxVbml0T2ZBbkluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbFVuaXRXaXRoaW5Bbkluc3RpdHV0aW9uRm9yVGhlTWVudGFsbHlSZXRhcmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zdGlsZVdpdG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydGVkRnJvbUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5DYXJlT2ZQYXJ0eU5vMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5DYXJlT2ZQYXJ0eU5vMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uSnVyaXNkaWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uU3RhdGVQbGFjZU9mQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRpb25TdGF0ZVByaW5jaXBhbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kZXBlbmRlbnRBZGp1c3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kZXBlbmRlbnRMYWIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGVwZW5kZW50UGh5c2ljaWFuc0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsRm9yLVByb2ZpdEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeUFzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeUJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5lbGlnaWJsZVBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbkRpc3NlbWluYXRpb25BZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uTWFpbnRlbmFuY2VBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUmVmZXJlbmNlQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbERlYWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbE1lZGljYWxQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFN1YnNjcmliZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluamVjdGlvblBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1QYXRpZW50UGhhcm1hY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklucXVpcmluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJ5QWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW4tU2VydmljZVNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25BbmRBY2NlcHRhbmNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25BbmRBY2NlcHRhbmNlUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25Db21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uTGVhZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGF0aW9uT25TaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsZWRBdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRpb25hbFByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0aXR1dGlvbkZvck1lbnRhbFJldGFyZGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1TdG9yZUJha2VyeURlcGFydG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUJlbmVmaWNpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDbGFpbUFkanVzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VJbnN0aXR1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZE9yU3Vic2NyaWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZWdyYXRlZE1hdGVyaWFsTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZWxsZWN0dWFsUHJvcGVydHlPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmltRnVuZGluZ09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpbVRydXN0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybGluZVNlcnZpY2VDb21taXRtZW50Q3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXJ5QmFuazEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWFyeUJhbmsyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhcnlPckJyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVMZXZlbFBhcmVudENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxGcmVpZ2h0Rm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5zaGlwRW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnByZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ2aWV3ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVydmlld2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5Q29udHJvbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5Q29udHJvbFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlSZXBvcnRpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0aWdhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50QWR2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNpbmdEZWFsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9sdmVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklycmV2b2NhYmxlQmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVyT2ZEZWJpdE9yQ3JlZGl0TWVtbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVyT2ZJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZXJPZldheWJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVNoaXBUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVNoaXBGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludEFubnVpdGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRBbm51aXRhbnRPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnREZWJ0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50RGVidG9yQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50T3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50T3duZXJBbm51aXRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50T3duZXJBbm51aXRhbnRQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRPd25lckpvaW50QW5udWl0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludE93bmVySm9pbnRBbm51aXRhbnRQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRPd25lclBheW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludFZlbnR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdW5pb3JIaWdoU2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXJpc2RpY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1dmVuaWxlRGVmZW5kYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXZlbmlsZU93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXZlbmlsZVZpY3RpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnV2ZW5pbGVXaXRuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZXlQZXJzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktpZG5leURpYWx5c2lzVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFiZWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JTdXJwbHVzQXJlYUZpcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRsb3JkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXJnZUJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0QnJlYWtUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEVtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0S25vd25Tb3VyY2VPZlN1cHBseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXdFbmZvcmNlbWVudEFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF3RmlybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxSZWNlaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxUaXRsZUhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kaW5nSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc2Vlc1N1cnZleW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpYWJpbGl0eUhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZW5Ib2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWl0ZWRMaWFiaWxpdHlDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1pdGVkTGlhYmlsaXR5UGFydG5lcnNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWl0ZWRQYXJ0bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0aW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0aW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0TWFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0T3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpdGVyYWxseVRyYW5zbGF0ZWROYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5BcHBsaWNhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5Ccm9rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5Db3JyZXNwb25kZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuSG9sZGVyRm9yUmVhbEVzdGF0ZUFzc2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuT3JpZ2luYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblNlcnZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbENoYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbEdvdmVybm1lbnRTcG9uc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZHb29kc0ZvckN1c3RvbXNFeGFtaW5hdGlvbkJlZm9yZUNsZWFyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZkxvYWRFeGNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZlByaW5jaXBhbEFzc2V0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZlNwb3RGb3JTdG9yYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25nVGVybUNhcmVGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9uZy1UZXJtRGlzYWJpbGl0eUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc2luZ0ludmVudG9yeU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3NQYXllZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWdpc3RyYXRlSnVkZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hZ25ldGljUmVzb25hbmNlSW1hZ2luZ0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlkZW5OYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlubGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VPcmdhbml6YXRpb25Vc2VkRm9yRXN0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbW1vZ3JhcGh5U2NyZWVuaW5nQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VkQ2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlZENhcmVPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZW1lbnRDb250cm9sQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZW1lbnROb24tT2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdpbmdHZW5lcmFsQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlck9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlcnNSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ1BsYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpbmVTdXJ2ZXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2VyT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldFRpbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrLUZvclBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyR2VuZXJhbEFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ2hhbmdlTm90aWNlQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxEaXNwb3NpdGlvbkF1dGhvcml6YXRpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsU2FmZXR5RGF0YVNoZWV0UmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFuc09mVHJhbnNwb3J0Q2hhcnRlcmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWF0RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbERvY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbEluc3VyYW5jZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxOdXJzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFN1cmdpY2FsT3JPdGhlckludGVuc2l2ZUNhcmVVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsVHJlYXRtZW50RXhlY3V0YW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsVHJlYXRtZW50UHJlc2NyaWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVldGluZ0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWdhdm9sdGFnZVJhZGlhdGlvblRoZXJhcHlVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmNoYW50QmFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJnZWRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJnZWRDb21wYW55V2l0aFJldGFpbmVkSWRlbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmdlZE5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyaW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1leGljYW5DdXN0b21zQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWRkbGVTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pZ3JhbnRIZWFsdGhDbGluaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5QnJhbmNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUm95YWx0eVBheW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pc3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlub3JpdHlJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlub3JpdHktT3duZWRCdXNpbmVzc0xhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5vcml0eS1Pd25lZEJ1c2luZXNzU21hbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc2NlbGxhbmVvdXNIZWFsdGhDYXJlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbml0b3JpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUluc3VyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlTGlhYmlsaXR5QWNjb3VudEhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdFJlY2VudEVtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JWZWhpY2xlUmVwb3J0UHJvdmlkZXJDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdW5pY2lwYWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVDaGFuZ2VkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVOb3RUb0JlQ29uZnVzZWRXaXRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lb25DcmVkaXRDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lVW5kZXJXaGljaEZpbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lVmFyaWF0aW9uU3lub255bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDaGFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGl2ZUhhd2FpaWFuT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXZ5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ2xlY3RlZE9yRGVsaW5xdWVudEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGluZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5laWdoYm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWlnaGJvcmhvb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lb25hdGFsSW50ZW5zaXZlQ2FyZVVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldHdvcmtOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdBc3NpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3RGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdTZWN1cmVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1NlcnZpY2VQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3c3BhcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdTdXBwbHlTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFNjaGVkdWxlZERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOaWNrbmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9IZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb21pbmF0ZWRCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb21pbmF0ZWRGcmVpZ2h0Q29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLURvbWVzdGljRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmVtcGxveW1lbnRJbmNvbWVTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1IZWFsdGhDYXJlTWlzY2VsbGFuZW91c0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUludmFzaXZlQ2FyZGlhY0Fzc2Vzc21lbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLU1vcnRnYWdlTGlhYmlsaXR5QWNjb3VudEhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLU9jY3VwYW50Q28tQm9ycm93ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Qcm9kdWN0aW9uU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Qcm9maXRIZWFsdGhDYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbnByb2ZpdEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmFpbHJvYWRFbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblJlZ2lzdGVyZWRCdXNpbmVzc05hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZWdpc3RlcmVkSW52ZXN0bWVudEFkdmlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZXNpZGVudEJlbmVmaWNpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVzaWRlbnRDcmVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2lkZW50RGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVzaWRlbnRHcm91cENvbXBhbnlXaXRoV2hvbUZpbmFuY2lhbEFjY291bnRJcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2lkZW50SW5zdHJ1Y3RpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2lkZW50VGhpcmRQYXJ0eUNvbXBhbnlXaXRoV2hvbUZpbmFuY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVRlbXBvcmFyeVN0b3JhZ2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90YXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RhcnlQdWJsaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGVDby1TaWduZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEZvclByb2ZpdEhlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5UGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeVBhcnR5Rm9yU2hpcHBlcnNPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5UGFydHlObzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeVBhcnR5Tm8yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdXJzaW5nSG9tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVyc2luZ0hvbWVDaGFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JzZXJ2YXRpb25Sb29tU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ic3RldHJpY3NBbmRHeW5lY29sb2d5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ic3RldHJpY3NVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsSGVhbHRoU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25hbFRoZXJhcHlTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5UYXJpZmZDb25mZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZzZXRPcGVyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsQW5kR2FzQ3VzdG9kaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxBbmRHYXNSZWd1bGF0b3J5QWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRBc3NpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkRGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRTZWN1cmVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uQmVoYWxmT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uLUNhbGxQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25jb2xvZ3lDZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW4tSGVhcnRTdXJnZXJ5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ1BoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3ItQ29tbXVuaWNhdGlvbkNoYW5uZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yLUVzc2VudGlhbFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvck9mUHJvcGVydHlPckVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JPZlByb3BlcnR5T3JVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvck9mVGhlU291cmNlVHJhbnNmZXJQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JPZlRoZVRyYW5zZmVyUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyZWRCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmVkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyaW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdQaHlzaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyT2ZTaGlwcGVyc09yZGVycy1UcmFuc3BvcnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJPZlRoZVNoaXBwZXJQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJXcml0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5pemF0aW9uQ29tcGxldGluZ0NvbmZpZ3VyYXRpb25DaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXphdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6YXRpb25IYXZpbmdTb3VyY2VDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6ZWRPdXRwYXRpZW50U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXplZFNvY2lhbFdvcmtTZXJ2aWNlRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXplciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5PclRpc3N1ZVRyYW5zcGxhbnRVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbENsYWltYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEludGVybW9kYWxSYW1wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEp1cmlzZGljdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFNoaXBwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmF0aW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdG9yT2ZBcnRpY2xlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5EcmF5bWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5NYWlsRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpblN1YmxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5UZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3J0aG9wZWRpY0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcnRob3BlZGljU3VyZ2VyeUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckRlcGFydG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckRpc2FkdmFudGFnZWRCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJJbmRpdmlkdWFsRGlzYWJpbGl0eUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVySW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJOb3QtRm9yLVByb2ZpdEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclBlcnNvbk9yRW50aXR5QXNzb2NpYXRlZFdpdGhTdHVkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclBoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJSZWxhdGVkUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyU3BlY2lhbHR5RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVW5saXN0ZWRUeXBlT2ZPcmdhbml6YXRpb25hbEVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbFNoZWxmQXJlYUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXQtT2YtU3RhdGVQcmluY2lwYWxPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHBhdGllbnRTb2NpYWxXb3JrU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHBhdGllbnRTdXJnZXJ5U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHBhdGllbnRTdXJnaWNlbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZUluc3BlY3Rpb25BZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVQcm9jZXNzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVUZXN0QWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVycmlkZUluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJBbm51aXRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyQW5udWl0YW50UGF5b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVySm9pbnRBbm51aXRhbnRQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZkVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZk1lYW5zT2ZUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZlByb3BlcnR5T3JVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mUmVzaWRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mVmVoaWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZlZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPckxlc3NvcnNTdXJ2ZXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc1JlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25pbmdJbnZlbnRvcnlDb250cm9sUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94eWdlblRoZXJhcHlGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJhbWVkaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmFtZWRpY2FsQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGljaXBhdGluZ0FyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYXRpbmdMYWJvcmF0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0bmVyc2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydG5lcnNoaXBGb3ItUHJvZml0RmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRSZW1hbnVmYWN0dXJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHNEaXN0cmlidXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydFNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBY2NvcmRpbmdUb0RvY3VtZW50YXJ5Q3JlZGl0VHJhbnNhY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QXNzaWduaW5nQVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBdEZpbmFsUGxhY2VPZlBvc2l0aW9uaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUF0UGljay1VcExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUF1dGhvcml6ZWR0b0RlZmluaXRpemVDb250cmFjdEFjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBdXRob3JpemVkVG9NYWtlRGVmaW5pdGVBQ29udHJhY3RBY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QXV0aG9yaXppbmdEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBdXRob3JpemluZ1JlbGVhc2VPZlNlY3VyaXR5SW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RGF0YVJlc3BvbnNpYmxlUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RGVjbGFyaW5nVGhlVmFsdWVBZGRlZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlEZXNpZ25hdGVkVG9FeGVjdXRlUmUtSWNpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RGVzaWduYXRlZFRvRXhlY3V0ZVNhbml0YXJ5UHJvY2VkdXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlEZXNpZ25hdGVkVG9Qcm92aWRlTGl2aW5nQW5pbWFsQ2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlFeGVjdXRpbmdBbmRWZXJpZnlpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RmlsbGluZ1NoaXBwZXJzT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5Rm9yV2hvbUl0ZW1Jc1VsdGltYXRlbHlJbnRlbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlGcm9tV2hvbUN1c3RvbXNEb2N1bWVudHNBcmVUb0JlUGlja2VkVXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RnJvbVdob21Ob24tQ3VzdG9tc0RvY3VtZW50c0FyZVRvQmVQaWNrZWRVcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlGdWxmaWxsaW5nQWxsT3BlcmF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlJblBvc3Nlc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5SXNzdWluZ011dHVhbGx5QWdyZWVkQ29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5TWFpbnRhaW5pbmdUaGVDb2Rlc1VzZWRJblRoZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5TWFpbnRhaW5pbmdUaGVJZGVudGlmaWVyc1VzZWRJblRoZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5TWFuZGF0ZWRUb0xpcXVpZGF0ZUFuRW50ZXJwcmlzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlNYW51ZmFjdHVyZWRGb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5Tm90VG9CZUNvbmZ1c2VkV2l0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlQYXNzaW5nVGhlVHJhbnNhY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UGVyZm9ybWluZ0NlcnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UGVyZm9ybWluZ0NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVBlcmZvcm1pbmdJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVBlcmZvcm1pbmdUYXNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVBlcmZvcm1pbmdWZXJpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UHJvdmlkaW5nRmluYW5jaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVByb3ZpZGluZ0dvdmVybm1lbnRGdXJuaXNoZWRQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlSZWNvdmVyaW5nVGhlVmFsdWVBZGRlZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlSZXByZXNlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlSZXNwb25zaWJsZUZvckRpc2luZmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlSZXNwb25zaWJsZUZvckZpbmFuY2lhbFNldHRsZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UmVzcG9uc2libGVGb3JSZWZ1ZWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5U3VibWl0dGluZ1F1b3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRoYXRSZWNlaXZlZERpc2Nsb3N1cmVTdGF0ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VGhhdFJlbWl0c1BheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9BcHBlYXJCZWZvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9BcHByb3ZlU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b2JlYWR2aXNlZC1Xcml0dGVuT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvQmVCaWxsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9CZUJpbGxlZEZvck90aGVyVGhhbkZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9Db250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb0ZpbGVQZXJzb25hbFByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvTGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9QZXJmb3JtUGFja2FnaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUHJpbnRTb21lRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9Qcm92aWRlRGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQWxsRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZUJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDZXJ0aWZpY2F0ZU9mQ29tcGxpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDZXJ0aWZpY2F0ZU9mQ29uZm9ybWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ2VydGlmaWVkSW5zcGVjdGlvblJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDZXJ0aWZpZWRUZXN0UmVzdWx0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDb21tZXJjaWFsSW52b2ljZVJlbWl0dGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ29udHJhY3RTZWN1cml0eUNsYXNzaWZpY2F0aW9uU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDb3B5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUNvcnJlc3BvbmRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZUNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDdXN0b21zRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUVsZWN0cm9uaWNNZW1vT2ZJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVGcmVpZ2h0QmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVJbnNwZWN0aW9uUmVwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUludml0YXRpb25Ub09mZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZUludm9pY2VGT3JHb29kc09yU2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlSW52b2ljZUZvckxlYXNlUGF5bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlTGltaXRhdGlvbnNPZkhlYXZ5RWxlbWVudHNSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlTWF0ZXJpYWxSZWxlYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZU5vbi1DdXN0b21zRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZU9yZGVyVG9TdXBwbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlUGFja2luZ0NyYXRpbmdBbmRIYW5kbGluZ0NyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVQYXBlck1lbW9PZkludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlUHJvcG9zYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlUHVyY2hhc2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVSZXBvcnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZVNjYWxlVGlja2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZVNoaXBwaW5nTWFuaWZlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlU2hpcHBpbmdOb3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlU29saWNpdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVN0YXRlbWVudE9mQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVTdGF0ZW1lbnRPZkZlZXNEdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVRlY2huaWNhbERvY3VtZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlVGVzdFJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVUcmFuc3BvcnRhdGlvbkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1dob21BY2tub3dsZWRnbWVudFNob3VsZEJlU2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1dob21Eb2N1bWVudHNBcmVUb0JlUHJlc2VudGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvV2hvbVByb3Rlc3RTdWJtaXR0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5V2FpdmluZ1JlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlXaGljaERlbGl2ZXJzQ29uc2lnbm1lbnRzVG9UaGVUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlXaGljaFBpY2tzVXBDb25zaWdubWVudHNGcm9tVGhlVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5V2hvU2lnbmVkVGhlRGVsaXZlcnlSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVdpdGhLbm93bGVkZ2VPZkFmZmFpcnNPZlRoZUNvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5V2l0aFBvd2VyVG9Wb3RlU2VjdXJpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc2VuZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50Q29tcGFuaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50RWR1Y2F0aW9uVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50UmVwcmVzZW50YXRpdmVTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlc0NvbXBhbnlOYW1lT3JJZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyT2ZMYXN0UmVzb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcnNDb21wYW55TmFtZU9ySWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyc0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5aW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5aW5nRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5LVRvUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZGVzdHJpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZGlhdHJpY0FjdXRlSW5wYXRpZW50VW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9ybWVkQXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1pdEhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uRm9yV2hvc2VCZW5lZml0UHJvcGVydHl3YXNTZWl6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbm5lbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uT25DbGFpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uT3JPdGhlckVudGl0eUxlZ2FsbHlSZXNwb25zaWJsZUZvckFDaGlsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uT3JPdGhlckVudGl0eUxlZ2FsbHlSZXNwb25zaWJsZUZvckFuZFdpdGhXaG9tQUNoaWxkUmVzaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uT3JPdGhlckVudGl0eVdpdGhXaG9tQUNoaWxkUmVzaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0aXRpb25pbmdDcmVkaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0aXRpb25pbmdDcmVkaXRvcnNBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhhcm1hY2lzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhhcm1hY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoYXJtYWN5RGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbFRoZXJhcHlTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNpYW5DbGluaWNPckdyb3VwUHJhY3RpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2lhbkhvc3BpdGFsT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNpYW4tU3BlY2lhbGlzdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2tVcEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmVTZWdtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZVNlZ21lbnRCb3VuZGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkJvdHRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZEaXN0aWxsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mT2NjdXJyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZlBlcmZvcm1hbmNlQ29nbml6YW50U2VjdXJpdHlPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWludGlmZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbkFkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uaW5nT3JNYWludGVuYW5jZU9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbm5pbmdDb21taXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmluZ1NjaGVkdWxlT3JNYXRlcmlhbFJlbGVhc2VJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5TcG9uc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRDbGVhcmFuY2VPZmZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2RpYXRyaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2ludE9mU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5SG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lXcml0aW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGxpbmdTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0QXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0YWxNYWlsaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdHNlY29uZGFyeUVkdWNhdGlvblJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdHNlY29uZGFyeUVkdWNhdGlvblNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1TZWNvbmRhcnlJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG90ZW50aWFsU291cmNlT2ZTdXBwbHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvd2VyT2ZBdHRvcm5leSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1LRGF5Q2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLWtpbmRlcmdhcnRlblRvR3JhZGUxMlJlY2lwaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLWtpbmRlcmdhcnRlblRvR3JhZGUxMlNlbmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlDdXN0b21lck9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlJbnNwZWN0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5TWFpbnRlbmFuY2VPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5TWFpbnRlbmFuY2VQZXJpb2REZXNpZ25hdGluZ09yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlSZWZlcnJlZFRvT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50aW5nQmFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0J1c2luZXNzUGFydG5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDcmVkaXRHcmFudG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0RlYnRIb2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRGlzdHJpYnV0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRW1wbG95ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNNZW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNOYW1lT2ZGaXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c05laWdoYm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c09jY3VwYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c093bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1Jlc2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNTdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1RpdGxlQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNUcmFkZVVuaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFkbWluaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5QmVuZWZpY2lhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQ2hlY2tTaGlwVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDb250cm9sUG9pbnRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUhlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUluc3VyZWRPclN1YnNjcmliZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlJbnRlcmV4Y2hhbmdlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUludGVybmF0aW9uYWxUZWxlY29tQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUludHJhLUxBVEFDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5SW52ZW50b3J5Q29udHJvbEFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5T3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlQYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVBoeXNpY2lhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVJlc2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVN1cHBvcnRPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlTdXJnZW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5VGF4cGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1lQ29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxCb3Jyb3dlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsRXhlY3V0aXZlT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxQZXJzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQmFzZUp1cmlzZGljdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JJbmNvcnJlY3RJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckluc3VyYW5jZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yVGl0bGVFdmlkZW5jZUhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZVByZS1LRWR1Y2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlU2Nob29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9Cb25vQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY3VyZW1lbnRSZXNwb25zaWJpbGl0eUZvck9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25NYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0UG9zaXRpb25Ib2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RTZXJ2aWNlc0FuZFJlcGFpcnNDZW50cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3Npb25hbE9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdENvb3JkaW5hdGlvbk9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE1hbmFnZW1lbnRPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlPckJ1aWxkaW5nTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zZWRJbnN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvU2VDb3Vuc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90b3R5cGVTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljQ2hpbGRPckFkb2xlc2NlbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNDb25zdWx0YXRpb24tTGlhaXNvblNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0VkdWNhdGlvblNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0VtZXJnZW5jeVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0dlcmlhdHJpY1NlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0hlYWx0aEZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0lucGF0aWVudFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljT3V0cGF0aWVudFNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY1BhcnRpYWxIb3NwaXRhbGl6YXRpb25Qcm9ncmFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNob2xvZ2lzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljQWx0ZXJuYXRpdmVTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY0hlYWx0aFNlcnZpY2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljSGVhbHRoU2VydmljZUluZGlhblNlcnZpY2VGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljb3JQcml2YXRlT3JnYW5pemF0aW9uRm9yVGhlRGlzYWJsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY1ByZS1LRWR1Y2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1Ymxpc2hlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVtcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZWRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZXJzRGVwYXJ0bWVudEJ1eWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZVNlcnZpY2VQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGlmeWluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90YXRpb25SZXF1ZXN0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvYWN0aXZlSW1wbGFudHNVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb0NvbnRyb2xTdGF0aW9uTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvU3RhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHRNZXRlckxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXB0Wm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWRGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlck9mQ2hlcXVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlck9mRnVuZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyc0NvcnJlc3BvbmRlbnRCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlclNpdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyc1N1Yi1FbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0NvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0ZhY2lsaXR5U2NoZWR1bGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ1BvaW50Rm9yQ3VzdG9tZXJTYW1wbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdTdWItTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2lwaWVudE9mQ2l2aWxvckxlZ2FsTGlhYmlsaXR5UGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFtYXRpb25DZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZC1LZWVwaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3ZlcnlSb29tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNyZWF0aW9uYWxUaGVyYXB5U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlc0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJhbFByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJpbmdIZWFsdGhDYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmluZ1Byb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZpbmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmaW5lcnlPcGVyYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmdXNhbFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbmFsT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkQnVzaW5lc3NOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkSW52ZXN0bWVudEFkdmlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZFByaW5jaXBhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJpbmdOb25wYXJlbnRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJpbmdQYXJlbnRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJpbmdQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25UcmlidW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhckRlYWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdG9yeVN0YXRlRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRvcnlTdGF0ZUVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVoYWJpbGl0YXRpb25GYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVoYWJpbGl0YXRpb25JbnBhdGllbnRVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWhhYmlsaXRhdGlvbk91dHBhdGllbnRTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbWJ1cnNpbmdCYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZUludGVybWVkaWFyeU9yQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlRHJheW1hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZVRvUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0dGluZ0JhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0VG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbmRlcmluZ1Byb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRQYXlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyaW5nT3V0bGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJPclJlZnVyYmlzaExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNpbmdNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdDYXJyaWVyc05vbWluYXRlZEFnZW50T3JSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0aW5nTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGluZ09mZmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByb2R1Y3RpdmVIZWFsdGhTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkTGVuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2FsZUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNhbGVEZWFsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VhcmNoSW5zdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZvaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW5jZU9yRG9taWNpbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW5jeUluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudEJlbmVmaWNpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudEluc3RydWN0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BpcmF0b3J5VGhlcmFweVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwaXRlQ2FyZUZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZUV4aGliaXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVHb3Zlcm5tZW50QWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZUluc3RhbGxhdGlvbkRlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZUluc3RhbGxhdGlvbk9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsUGhhcm1hY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHJvY2Vzc2lvbmFpcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmVkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRpbmdQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm95YWx0eU93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdXJhbEhlYWx0aENsaW5pYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNBc3Npc3RhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc3BlcnNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNSZXNwb25zaWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsdmFnZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZXNUb0JlUmV0dXJuZWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxpbmdMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sLUJhc2VkU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0NvcnBvcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY3JlZW5pbmdQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhbGluZ0NvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUludmVudG9yeUNvbnRyb2xBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5TG9jYXRpb25BZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlQYXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5VGF4cGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVdhcnJhbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kQ29udGFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kQ29udGFjdE9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kSG9tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kTGV2ZWxQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNyZXRhcmlhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvbjhBUHJvZ3JhbVBhcnRpY2lwYW50RmlybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJlZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cmVkUGFydHlDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cmVkUGFydHlJbmRpdmlkdWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmSW5zdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJBc09mZmljaWFsbHlSZWdpc3RlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzQWdlbnRPclJlcHJlc2VudGF0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxpbmdBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGluZ09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kZXJPZkZ1bmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kZXJzQ29ycmVzcG9uZGVudEJhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmlvck1lbWJlcnNoaXBQcm9ncmFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQnVyZWF1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUGVyZm9ybWFuY2VTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUGVyZm9ybWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VSZXF1ZXN0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljaW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2luZ0Jyb2tlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljaW5nRGVhbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlaG9sZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsdGVyZWRXb3Jrc2hvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzQXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nTGluZVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nU2NoZWR1bGVJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvd2luZ0FnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWJsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmlmaWNhbnRPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlUGhvdG9uRW1pc3Npb25Db21wdXRlcml6ZWRUb21vZ3JhcGh5VW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2l0ZU9wZXJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2lsbGVkTnVyc2luZ0ZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2lsbGVkTnVyc2luZ29yT3RoZXJMb25nLVRlcm1DYXJlVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpbGxlZE51cnNpbmdTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xhdWdodGVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsb3RDaGFydGVyUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQmFzZVN0YXRpb25Mb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxDb250cm9sU3RhdGlvbkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbERpc2FkdmFudGFnZWRCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsbHlEaXNhZHZhbnRhZ2VkQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbGx5RGlzYWR2YW50YWdlZEluZGl2aWR1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbGx5SW5zdXJlZFBlcnNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsU2VjdXJpdGllc0NvbGxlY3RvcnNPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lldHlPZlByb3BlcnR5SW5mb3JtYXRpb25Db21waWxlcnNBbmRBbmFseXN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkVG9BbmRTaGlwVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGRUb0lmRGlmZmVyZW50RnJvbUJpbGxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZVByb3ByaWV0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlTWV0ZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlUGFydHlPZkluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENvdW5zZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxpemVkTW9iaWxlUmFkaW9TZXJ2aWNlTGljZW5zZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxpemVkT3V0cGF0aWVudFByb2dyYW1Gb3JBSURTT3JBUkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmllZFJlcG9zaXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWVjaFRoZXJhcHlTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvcnRzTWVkaWNpbmVDbGluaWNPclNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3VzZUluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwdWRDb250cmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVDaGFydGVyZWRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVEaXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RlYW1zaGlwQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tob2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlRmFjaWxpdHlhdERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlRmFjaWxpdHlBdE9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlQ2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlS2VlcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZU1hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWR5U3VibWl0dGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RPckNvZ25pemFudFNlY3VyaXR5T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yLU5vbWluYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvcldpdGhEaXJlY3RQYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItRW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJncm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdE9mSW5xdWlyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdFByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXR0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pdHRlck9mU2FtcGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzY3JpYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzY3JpYmVyc0VtcGxveWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzY3JpYmVyc1NjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2VxdWVudE93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItU2VydmljZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpZGlhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpZGlhcnlEaXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZVN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWNjZXNzZnVsSm9iQXBwbGljYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc2luZ0hlYWx0aENhcmVQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNpbmdQaHlzaWNpYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3J5QXBwcmFpc2VyTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyT3JNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc0NvcnBvcmF0ZU9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJXb3JrVGVhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGx5U291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwb3J0aW5nUGVyc29ubmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwb3J0UGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZXR5Rm9yQWRkaXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJldHlGb3JBbnRpZHVtcGluZ09yQ291bnRlcnZhaWxpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlRGlzY2hhcmdlQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlTWFuYWdlbWVudEVudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZ2VvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VycGx1c0RlYWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5b3ItUG9mZXNzaW9uYWxRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5b3JRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5b3JUb3BvZ3JhcGhpY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtGYXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rRmFybU93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Q29sbGVjdG9yc09mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RXhlbXB0T3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZUFuc3dlcmluZ1NlcnZpY2VCdXJlYXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuYW50TWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuZGVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbE9wZXJhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJ0aWFyeVBheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nTGFib3JhdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RTcG9uc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVhdGVyQ2lyY3VpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlYXRyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlcmFwZXV0aWNSYWRpb2lzb3RvcGVGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eUFkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlJbnZlc3RtZW50QWR2aXNvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eU1hcmtldGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UmVwcmljaW5nT3JnYW5pemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UmVwcmljaW5nUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlSZXZpZXdpbmdPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlSZXZpZXdpbmdQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVob2xkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlSW5zdXJhbmNlU2VydmljZXNQcm92aWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVVbmRlcndyaXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbGluZ0Rlc2lnbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbGluZ0ZhYnJpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29sU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3BQYXJlbnRDb21wYW55SW5TYW1lQ291bnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG93aW5nQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZW5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlTmFtZVN5bm9ueW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlVW5pb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluaW5nSW5zdGl0dXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVycmluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlclRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0QXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0Q2hhcmdlUGF5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRGcmVpZ2h0Rm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0UHJpbmNpcGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0UHJpbmNpcGFsc0FnZW50T3JSZXByZXNlbnRhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXR0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRlck9mSGF6YXJkb3VzV2FzdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zc2hpcG1lbnRQYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdW1hQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnRGYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYmFsR292ZXJubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0ZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0ZWVzQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0T2ZmaWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3RPckVzdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHViZXJjdWxvc2lzQW5kT1RoZXJSZXNwaXJhdG9yeURpc2Vhc2VzRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZVBhcmVudENvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlU2FtZUNvdW50cnlQYXJlbnRDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRyYXNvdW5kVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hc3NpZ25lZEFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcndyaXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5leHBlY3RlZEhhbmRsaW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNDdXN0b21zQnJva2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNPdmVyc2Vhc1NlY3VyaXR5QWRtaW5pc3RyYXRpb25PZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2l0eS1Db2xsZWdlT3JTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNlcnZpY2VhYmxlTWF0ZXJpYWxDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwc3RyZWFtTWV0ZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBzdHJlYW1QYXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNUcnVzdGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVdGlsaXphdGlvbk1hbmFnZW1lbnRPcmdhbml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY2F0aW9uSG9tZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRhdGluZ1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkTmV0d29ya1Byb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlQ3VzdG9kaWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlU2FsdmFnZUFzc2lnbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsTWFzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmFuLU93bmVkQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyYW5zQWRtaW5pc3RyYXRpb25GYWNpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJhbnNBZG1pbmlzdHJhdGlvbkxvYW5BdXRob3JpemVkU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyYW5zQWRtaW5pc3RyYXRpb25Mb2FuR3VhcmFudHlBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyaW5hcmlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJpbmFyeUhvc3BpdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaWN0aW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpZGVvRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW50ZWVyU2VydmljZXNEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZUVhcm5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VEZXBvc2l0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZUtlZXBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlckFtYnVsYW5jZVNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlclN5c3RlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0aW5nUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxDYXNpbmdEZXB0aEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbFBhZENvbnN0cnVjdGlvbkNvbnRyYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xlc2FsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xseS1Pd25lZFN1YnNpZGlhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildpbm5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0aGRyYXdhbFBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRuZXNzRm9yRGVmZW5kYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRuZXNzRm9yUGxhaW50aWZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRuZXNzRm9yUHJvc2VjdXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvbWFuLU93bmVkQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvbWFuLU93bmVkQnVzaW5lc3NMYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29tYW4tT3duZWRCdXNpbmVzc1NtYWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb21lbnNIZWFsdGhDZW50ZXJPclNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc2l0ZUhlYWx0aFByb21vdGlvbkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc01hbmFnZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtUZWFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXcml0aW5nQWdlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlgtUmF5UmFkaWF0aW9uVGhlcmFweVVuaXQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uQWN0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkFjdGlvbkNvZGVkIiB0eXBlPSJPcmRlckNvbmZpcm1hdGlvbkFjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uQWN0aW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJDb25maXJtYXRpb25BY3Rpb24iIHR5cGU9Ik9yZGVyQ29uZmlybWF0aW9uQWN0aW9uIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uQWN0aW9uQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBkYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxldGUiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQWxwaGFOdW00MCI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iNDAiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlN0cnVjdHVyZWROb3RlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJTdHJ1Y3R1cmVkTm90ZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mU3RydWN0dXJlZE5vdGUiIHR5cGU9Ikxpc3RPZlN0cnVjdHVyZWROb3RlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdHJ1Y3R1cmVkTm90ZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJHZW5lcmFsTm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTm90ZUlEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkFnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTm90ZVVSTCIgdHlwZT0ieHNkOmFueVVSSSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGV4dFR5cGVDb2RlZCIgdHlwZT0iVGV4dFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUZXh0VHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlN0cnVjdHVyZWROb3RlIiB0eXBlPSJTdHJ1Y3R1cmVkTm90ZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUZXh0VHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFkbGluZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmFsdHlGb3JCcmVhY2hPZkNvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFJpZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyQ29udHJhY3R1YWxTdGlwdWxhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9SZWNvcmRQT1RleHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsUE9UZXh0Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZOYW1lVmFsdWVTZXQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9Ik5hbWVWYWx1ZVNldCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mTmFtZVZhbHVlU2V0IiB0eXBlPSJMaXN0T2ZOYW1lVmFsdWVTZXQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWVWYWx1ZVNldCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2V0TmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2V0SUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZk5hbWVWYWx1ZVBhaXIiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik5hbWVWYWx1ZVNldCIgdHlwZT0iTmFtZVZhbHVlU2V0Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZOYW1lVmFsdWVQYWlyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJOYW1lVmFsdWVQYWlyIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZOYW1lVmFsdWVQYWlyIiB0eXBlPSJMaXN0T2ZOYW1lVmFsdWVQYWlyIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOYW1lVmFsdWVQYWlyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRhdGF0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOYW1lVmFsdWVQYWlyIiB0eXBlPSJOYW1lVmFsdWVQYWlyIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZBdHRhY2htZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJBdHRhY2htZW50Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZBdHRhY2htZW50IiB0eXBlPSJMaXN0T2ZBdHRhY2htZW50Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBdHRhY2htZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkF0dGFjaG1lbnRBY3Rpb25Db2RlZCIgdHlwZT0iQXR0YWNobWVudEFjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkF0dGFjaG1lbnRBY3Rpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQXR0YWNobWVudFB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZpbGVOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBdHRhY2htZW50VGl0bGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkF0dGFjaG1lbnREZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMYW5ndWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTUlNRVR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlcGxhY2VtZW50RmlsZSIgdHlwZT0ieGNibEJvb2xlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50TG9jYXRpb24iIHR5cGU9InhzZDphbnlVUkkiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnQiIHR5cGU9IkF0dGFjaG1lbnQiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQXR0YWNobWVudEFjdGlvbkNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwZGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0NoYW5nZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJDb25maXJtYXRpb25EZXRhaWwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mT3JkZXJDb25maXJtYXRpb25JdGVtRGV0YWlsIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkRldGFpbCIgdHlwZT0iT3JkZXJDb25maXJtYXRpb25EZXRhaWwiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZk9yZGVyQ29uZmlybWF0aW9uSXRlbURldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iT3JkZXJDb25maXJtYXRpb25JdGVtRGV0YWlsIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZPcmRlckNvbmZpcm1hdGlvbkl0ZW1EZXRhaWwiIHR5cGU9Ikxpc3RPZk9yZGVyQ29uZmlybWF0aW9uSXRlbURldGFpbCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJDb25maXJtYXRpb25JdGVtRGV0YWlsIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkl0ZW1OdW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iT3JkZXJDb25maXJtYXRpb25BY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uRGV0YWlsU2hvcnREZXNjcmlwdGlvbiIgdHlwZT0iQWxwaGFOdW00MCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iT3JkZXJDb25maXJtYXRpb25EZXRhaWxSZWZlcmVuY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEZWxpdmVyeUNvbXBsZXRlIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSXRlbURldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZBY2NvdW50QXNzaWdubWVudCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJDb25maXJtYXRpb25JdGVtRGV0YWlsIiB0eXBlPSJPcmRlckNvbmZpcm1hdGlvbkl0ZW1EZXRhaWwiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uRGV0YWlsUmVmZXJlbmNlcyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQdXJjaGFzZU9yZGVyUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNhdGFsb2dSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ29udHJhY3RBbmRTeXN0ZW1SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mUmVmZXJlbmNlQ29kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uRGV0YWlsUmVmZXJlbmNlcyIgdHlwZT0iT3JkZXJDb25maXJtYXRpb25EZXRhaWxSZWZlcmVuY2VzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQdXJjaGFzZU9yZGVyUmVmZXJlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJjaGFzZU9yZGVyTnVtYmVyIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlB1cmNoYXNlT3JkZXJEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlB1cmNoYXNlT3JkZXJMaW5lSXRlbU51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFydGlhbE9yZGVyQ29kZWQiIHR5cGU9IkFTTlBhcnRpYWxPcmRlckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhcnRpYWxPcmRlckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlB1cmNoYXNlT3JkZXJSZWZlcmVuY2UiIHR5cGU9IlB1cmNoYXNlT3JkZXJSZWZlcmVuY2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVmTnVtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWZEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZSIgdHlwZT0iUmVmZXJlbmNlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkFTTlBhcnRpYWxPcmRlckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsT3JkZXIiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNhdGVnb3J5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhdGVnb3J5SUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iU3RhbmRhcmRDYXRlZ29yeUlEIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDYXRlZ29yeSIgdHlwZT0iQ2F0ZWdvcnkiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcnlJRCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU3RhbmRhcmRDYXRlZ29yeVR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDbGFzc2lmaWNhdGlvbklEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUZWNobmljYWxJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU3RhbmRhcmRDYXRlZ29yeUlEIiB0eXBlPSJTdGFuZGFyZENhdGVnb3J5SUQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNhdGFsb2dSZWZlcmVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNhdGFsb2dVUkwiIHR5cGU9InhzZDphbnlVUkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhdGFsb2dJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2F0YWxvZ0l0ZW1JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ2F0YWxvZ1JlZmVyZW5jZSIgdHlwZT0iQ2F0YWxvZ1JlZmVyZW5jZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udHJhY3RJRCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250cmFjdElEIiB0eXBlPSJDb250cmFjdElEIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250cmFjdEFuZFN5c3RlbVJlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb250cmFjdElEIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udHJhY3RJdGVtSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN5c3RlbUlEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250cmFjdEFuZFN5c3RlbVJlZmVyZW5jZSIgdHlwZT0iQ29udHJhY3RBbmRTeXN0ZW1SZWZlcmVuY2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlJlZmVyZW5jZUNvZGVkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJSZWZlcmVuY2VDb2RlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUmVmZXJlbmNlQ29kZWQiIHR5cGU9Ikxpc3RPZlJlZmVyZW5jZUNvZGVkIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZWZlcmVuY2VDb2RlZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlVHlwZUNvZGVkIiB0eXBlPSJSZWZlcmVuY2VUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVmZXJlbmNlVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcmltYXJ5UmVmZXJlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1cHBvcnRpbmdSZWZlcmVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3VwcG9ydGluZ1N1YlJlZmVyZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlJlZmVyZW5jZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWZlcmVuY2VEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlQ29kZWQiIHR5cGU9IlJlZmVyZW5jZUNvZGVkIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlJlZmVyZW5jZVR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWJicmV2aWF0ZWROZXdEcnVnQXBwbGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFibGVTb3VyY2VEVU5TTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhYmxlU291cmNlUHVyY2hhc2VySUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFibGVTb3VyY2VTdXBwbGllcklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2Nlc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2Nlc3NvcmlhbFJhaWxEaXZlcnNpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2Vzc29yaWFsU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdFcXVpcG1lbnRMb2NhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ0ZpbGVSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdQZXJpb2RSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRNYW5hZ2Vyc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRQYXJ0eXNCYW5rUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50UGFydHlzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50UGF5YWJsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFNlcnZpY2luZ0JhbmtzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1JlY2VpdmFibGVDdXN0b21lckFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUmVjZWl2YWJsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNSZWNlaXZhYmxlT3Blbkl0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUmVjZWl2YWJsZVN0YXRlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFN1ZmZpeENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlbWVudE9mT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGlvbkF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZE9uU3lzdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRyZXNzZWVSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkUmVwcmljZWRDbGFpbVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRSZXByaWNlZExpbmVJdGVtUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50Q29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudE1lbW9DaGFyZ2VCYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pbmlzdHJhdG9yc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJzYXJ5Q2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJ0aXNlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aWNlT2ZDb2xsZWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2VUaHJvdWdoQmFua3NSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzaW5nQmFua3NSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFlcm9uYXV0aWNhbEVxdWlwbWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUZFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZmZlY3RlZFN1YnN5c3RlbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmZmlsaWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lBc3NpZ25lZEVtcGxveWVlSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUFzc2lnbmVkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lDYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5Q2xhdXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBSURBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5SGllcmFyY2hpY2FsTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUxvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5c1N0dWRlbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50Q2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50Q29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudHNCYW5rUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudHNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50c1NoaXBtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBR0VSRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JlZW1lbnRUb1BheU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ2FyZ29UcmFuc2Zlck1hbmlmZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJEaW1lbnNpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJIYW5kbGluZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmxpbmVzRmxpZ2h0SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmxpbmVUaWNrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcldheWJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG90bWVudElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VSZWNpcGllbnRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRlQ2xhdXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWJ1bGF0b3J5UGF0aWVudEdyb3VwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVuZGVkVW5pZm9ybUNvbW1lcmNpYWxDb2RlRmlsaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVuZG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZW5kbWVudEZpbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5CYW5rZXJzQXNzb2NpYXRpb25UcmFuc2l0T3JSb3V0aW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkdhc0Fzc29jaWF0aW9uRXF1YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuT3N0ZW9wYXRoaWNBc3NvY2lhdGlvbkNlcnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuUGV0cm9sZXVtSW5zdGl0dXRlRGVkdWN0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5QZXRyb2xldW1JbnN0aXR1dGVXZWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmFseXNpc051bWJlck9yVGVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5lc3RoZXNpYUxpY2Vuc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuaW1hbFNwZWNpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuaW1hbFN0cmFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aUR1bXBpbmdDYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FibGVDb2VmZmljaWVudElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhYmxlSW5zdHJ1Y3Rpb25zT3JTdGFuZGFyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudHNCYW5rUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcG9pbnRtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzZXJMaWNlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ByaWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnRpY2xlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NlbWJseUxpbmVGZWVkTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2VtYmx5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3Nlc3NtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5VHJhbnNhY3Rpb25TZXRTZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbm1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbm1lbnRSZWNvcmRpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWRDYXNlQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZEludm9pY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkTnVtYmVyRm9ySm9pbmVkVW5pdE5vdFJlc3ViZGl2aWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZE51bWJlckZvckxpbWl0ZWRDb21tb25FbGVtZW50UGFya2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZE51bWJlckZvclVuaXRQYXJraW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkUHJvZHVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZFByb3BlcnR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkUHVyY2hhc2VPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uT2ZBbWVyaWNhblJhaWxyb2Fkc1JhaWx3YXlBY2NvdW50aW5nUnVsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc3VtaW5nQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXRhQ2FybmV0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdG9taWNTYWZldHlhbmRMaWNlbnNpbmdCb2FyZFBhbmVsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2hlZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0b3JuZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcmlzYXRpb25Gb3JSZXBhaXJSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml0eUlzc3VlZEVxdWlwbWVudElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uTnVtYmVyRm9yRXhjZXB0aW9uVG9EYW5nZXJvdXNHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXphdGlvblRvTWVldENvbXBldGl0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvTG9zc0l0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFJldHVybk9yTm90aWZpY2F0aW9uT2ZDaGFuZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hFbnRyeURlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTdGFuZGFyZEVudHJ5Q2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFRyYWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWRVbmRlcndyaXRpbmdSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF4bGVSYXRpbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja291dFByb2NlZHVyZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhZGdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxhbmNlRHVlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rQXNzaWduZWRCYW5rZXJzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rQXNzaWduZWRTZWN1cml0eUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtlcnNBY2NlcHRhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rcnVwdGN5UHJvY2VkdXJlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rc0NvbW1vblRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rc0luZGl2aWR1YWxUcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua1RlbGVncmFwaGljTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rVG9CYW5rSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhckNvZGVkTGFiZWxTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhckNvZGVkU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZVBlcm1pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaWNDb250cmFjdExpbmVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXRjaE51bWJlck9yTG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXRjaFNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFtQXNzZW1ibHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbk1pbGVNYXJrZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2lubmluZ0pvYlNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbm5pbmdLYW5iYW5TZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2lubmluZ01ldGVyUmVhZGluZ0FjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5uaW5nTWV0ZXJSZWFkaW5nRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbm5pbmdTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaWNpYXJ5c0JhbmtSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaWNpYXJ5c1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxhdGVyYWxDYXJTZXJ2aWNlQWdyZWVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbEFuZEhvbGRJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ0NlbnRlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsb2ZNYXRlcmlhbFJldmlzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZRdWFudGl0aWVzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaW5hcnlPYmplY3RJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaW5Mb2NhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxhbmtldE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGVuZGVkV2l0aEJhdGNoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGVuZGVkV2l0aE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsdWVDcm9zc1Byb3ZpZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbHVlU2hpZWxkUHJvdmlkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvbmRlZENhcnJpZXJJbnRlcm5hbFJldmVudWVTZXJ2aWNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tpbmdSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcmRlcmVhdU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlck9yU2FsZXNPZmZpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlclJlZmVyZW5jZTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlclJlZmVyZW5jZTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlcnNPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWRnZXRDaGFwdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJlYXVvZkxhYm9yYW5kU3RhdGlzdGljc1NjaGVkdWxlSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVyZWF1U2lnbmluZ09SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJlYXVTaWduaW5nU1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzVGF4TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNBcHByb3ZhbE1hcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0NhdGFsb2d1ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0NyZWRpdE1lbW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0RlYml0TWVtbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzRGVidG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzU2hpcG1lbnRNYXJrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWRGaWxlTGF5ZXJDb252ZW50aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsZW5kYXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGxPZmZPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbFNpZ24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuRXhjaXNlRW50cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuRmluYW5jaWFsSW5zdGl0dXRpb25CcmFuY2hBbmRJbnN0aXR1dGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5Hb29kc0FuZFNlcnZpY2Vzb3JRdWViZWNTYWxlc1RheFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5Qcm92aW5jZU9wZXJhdGluZ0F1dGhvcml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5Tb2NpYWxJbnN1cmFuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuV2hlYXRCb2FyZFBlcm1pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsZWRSZXZpc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZEFjY291bnRSZXBvcnRpbmdJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkQWNjb3VudFJlcG9ydGluZ0xldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkQWNjb3VudFN0YXR1c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRBY2NvdW50VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRCaWxsaW5nVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRJc3N1ZXJUcmFuc2FjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQWNjZXB0YW5jZU9yZGVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0NvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvTWFuaWZlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcm5ldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckFzc2lnbmVkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckFzc2lnbmVkQ29uc2lnbmVlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyQXNzaWduZWRQYWNrYWdlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJBc3NpZ25lZFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckFzc2lnbmVkU2hpcHBlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllcnNBZ2VudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllcnNDdXN0b21zQm9uZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VPZk5lZWRQYXJ0eXNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc3VhbHR5UmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXN1YWx0eVJlcG9ydFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0YWxvZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0YWxvZ3VlU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGFzdHJvcGhlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRlZ29yeU9mV29ya1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VkZW50c0NsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZWRpbmdDb21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZWlsaW5nRm9ybXVsYVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzQXV0b21hdGVkRmlsZXNJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzQmxvY2tHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzU3RhdGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNUcmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzVHJhY3RTdWZmaXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRyYWxTZWNyZXRhcmlhdExvZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbFNlY3JldGFyaWF0TG9nTnVtYmVyQ2hpbGREYXRhTWFpbnRlbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRyYWxTZWNyZXRhcmlhdExvZ051bWJlclBhcmVudERhdGFNYWludGVuYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZDb25mb3JtaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZW9mSW5jb3Jwb3JhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVvZlRyYW5zcG9ydGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZWRNYWlsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUk5BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFtYmVyT2ZDb21tZXJjZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbWJlck9mQ29tbWVyY2VSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQU1QVVNJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlT3JkZXJBdXRob3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZVZlcmlmaWNhdGlvblByb2NlZHVyZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZUNhcmRBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VDYXJkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VOb3RlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJ0ZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZWNraW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVja0xpc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZWNrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVtaWNhbEFic3RyYWN0U2VydmljZVJlZ2lzdHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVxdWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1aXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1bGFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXJjdWxhclB1YmxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0YXRpb25PZk9waW5pb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGF0aW9uT2ZTdGF0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRpemVuc2hpcERvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXZpbEFjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l2aWxMaWFiaWxpdGllc29mT2lsQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltQWRtaW5pc3RyYXRvckNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbWFudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1hbnRzQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbU9mZmljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFzc09mQ29udHJhY3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGF1c2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2VJbnRlcmJhbmtQYXltZW50c1N5c3RlbVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlSW50ZXJiYW5rUGF5bWVudFN5c3RlbVBhcnRpY2lwYW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlSW50ZXJiYW5rUGF5bWVudFN5c3RlbVVzZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyVGV4dENsYXVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpZW50Q29tcGFueUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsaWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpZW50UmVwb3J0aW5nQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsaW5pY2FsTGFib3JhdG9yeUltcHJvdmVtZW50QW1lbmRtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGluaWNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYWxBdXRob3JpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZGVPZkZlZGVyYWxSZWd1bGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29pbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sZFJvbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RpbmdCYW5rc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdG9ySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxvY2F0aW9uSW5kaWNhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5lZFNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsT3JQcml2YXRlUGFzc2VuZ2VyVmVoaWNsZVF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEFjY291bnRTdW1tYXJ5UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsYW5kR292ZXJubWVudEVudGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxEcml2ZXJzTGljZW5zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlU2FmZXR5QXNzdXJhbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXRtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXR0ZWVPblVuaWZvcm1TZWN1cml0eUlkZW50aWZpY2F0aW9uUHJvY2VkdXJlc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9kaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb25BY2Nlc3NSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vblRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55QW5kUGxhY2VSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlBbmRTeW5kaWNhdGVSZWZlcmVuY2UxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55QW5kU3luZGljYXRlUmVmZXJlbmNlMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUlzc3VlZEVxdWlwbWVudElkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmFibGVQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVByb3BlcnR5UGVuZGluZ1NhbGVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmFibGVQcm9wZXJ0eVNhbGVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmFibGVQcm9wZXJ0eVZlcmlmaWNhdGlvblNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGV0ZW50QXV0aG9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGFpbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsYWludENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlZFVuaXRzUGF5bWVudFJlcXVlc3RSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsaWFuY2VDb2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wb25lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbk9mUHVyY2hhc2VEb2N1bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZGl0aW9uT2ZTYWxlRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRvbWluaXVtSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmdyZXNzaW9uYWxEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdGluZ0NhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlc0Z1cnRoZXJPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlc0ludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZXNPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlc1JlbGVhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZXNTaGlwbWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnRDbGFzc2lmaWNhdGlvbklEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3JzRnVydGhlck9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3JzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0aW9uU2hpcG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRvcnNSZWNlaXB0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJhaW50Tm90YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVySWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtcHRpb25EYXRhUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyT3JFcXVpcG1lbnRSZWNlaXB0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJPclBhY2thZ2luZ1NwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckRpc3Bvc2l0aW9uT3JkZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck9wZXJhdG9yc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyb3JFcXVpcG1lbnRSZWNlaXB0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJQcmVmaXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXb3JrT3JkZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVhdGlvbkZpbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludWF0aW9uVW5pZm9ybUNvbW1lcmNpYWxDb2RlRmlsaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51b3VzTW92ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludW91c1RyYW5zZmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEFkZGVuZHVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEF1ZGl0b3JJRE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RCcmVha2Rvd25SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Q29vcE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RIb2xkZXJDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RMaW5lSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0T3B0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yRGF0YVJlcXVpcmVtZW50c0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JFc3RhYmxpc2htZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvclJlcXVlc3RSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UGFydHlSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFJpZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXlhbmNlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29wZXJhdGlvbkNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JuYm9yZUNlcnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZEJhdGNoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkU29jaWFsU2VjdXJpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0QWxsb2NhdGlvblJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdGFSaWNhbkp1ZGljaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0Q2VudHJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0RWxlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5QnVzaW5lc3NSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eUxlZ2lzbGF0aXZlRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXBvbkRpc3RyaWJ1dGlvbk1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cG9uUmVkZW1wdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJhZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRDYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRDb3Vuc2VsaW5nSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdE1lbW9OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdE5vdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRvckRlYml0QWRqdXN0bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0b3JzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRSYXRpbmdBZ2VuY3lzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdFJlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0UmVwb3NpdG9yeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaXRpY2FsQXBwbGljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaXRpY2FsaXR5RGVzaWduYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JvcFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzTGlzdGVkQ291cnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1M1NEtleVRyYWluSW5kaWNhdG9yQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1M1NEtleVRyYWluSW5kaWNhdG9yR3JvdXBOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50Q2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50b3JMYXRlc3RDb3Vyc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRQcm9jZWR1cmFsVGVybWlub2xvZ3lDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50UmV2aXNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyQ2F0YWxvZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJNYWludGVuYW5jZVBlcmlvZFNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck1hdGVyaWFsU3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJQcm9jZXNzU3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUmVmZXJlbmNlTnVtYmVyQXNzaWduZWRUb1ByZXZpb3VzQmFsYW5jZU9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lcnNDb21tb25UcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJzSW5kaXZpZHVhbFRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lcnNQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyc1JlbGVhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyc1VuaXRJbnZlbnRvcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyVHJhY2tpbmdOdW1iZXJGb3JMb2FuZWRNYXRlcmlhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNCYXJDb2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQnJva2VyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjaXNpb25SZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEcmF3YmFja0VudHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zR3VhcmFudGVlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zaG91c2VCcm9rZXJMaWNlbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1ByZWZlcmVuY2VJbnF1aXJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUmVsZWFzZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNUYXJpZmZOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNUcmFuc2hpcG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNWYWx1YXRpb25EZWNpc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNHb29kc1NlY3VyaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNHb29kc1RyYW5zcG9ydExpY2VuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFBdXRoZW50aWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YUl0ZW1EZXNjcmlwdGlvblJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YVF1YWxpdHlSZWplY3RSZWFzb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFSZWxpYWJpbGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFTdHJ1Y3R1cmVUYWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFsZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlck9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFsZXJwdXJjaGFzZW9yZGVybnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFsZXJUeXBlSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0QWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXROb3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3JzQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYW50c0N1c3RvbXNJZGVudGl0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYW50c1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZWN0Q29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZW5zZUZlZGVyYWxBY3F1aXNpdGlvblJlZ3VsYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlbnNlUHJpb3JpdGllc0FsbG9jYXRpb25TeXN0ZW1Qcmlvcml0eVJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJtZW50QXBwcm92YWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVycmVkUGF5bWVudFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlOb3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlRdW90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UmVnaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNjaGVkdWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVRpY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlUcmFpbGVyTWFuaWZlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5VmVyaWZpY2F0aW9uQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbmlhbFJlYXNvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnNpdHlPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVudGFsSW5zdXJhbmNlQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVudGFsSW5zdXJhbmNlUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW50aXN0TGljZW5zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9yQWdlbmN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZBZ3JpY3VsdHVyZUFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mQ29tbWVyY2VBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkRlZmVuc2VGb3JtMjUwUmVxdWlyZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZEZWZlbnNlSWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERFRTQ04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZkVkdWNhdGlvbkFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mRW5lcmd5QWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISFNBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFVEQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZkludGVyaW9yQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZKdXN0aWNlQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZMYWJvckFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mU3RhdGVBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZnRoZVRyZWFzdXJ5QWNxdWlzaXRpb25PclByb2N1cmVtZW50UmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mVHJhbnNwb3J0YXRpb25BY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZlRyYW5zcG9ydGF0aW9uQm9uZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mVHJhbnNwb3J0YXRpb25IYXphcmRvdXNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZlZldGVyYW5zQWZmYWlyc0FjcXVpc2l0aW9uUmVndWxhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRXaGVyZUluanVyeU9jY3VycmVkSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZWZyb21TcGVjaWZpY2F0aW9uQ2xhc3NDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVmcm9tU3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlZnJvbVNwZWNpZmljYXRpb25UeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwZW5kZW50c0luZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0QWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdG9yTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0b3J5VHJ1c3RDb21wYW55SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVyYXRDZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzY3JpcHRpb25PZkNoYW5nZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoQWR2aWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVQb3N0UGFyY2Vsc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbm9mU2hpcG1lbnRIYXJtb25pemVkQmFzZWRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zaXNSZWxhdGVkR3JvdXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdERlYml0UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RvcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFBheW1lbnRWYWx1YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFBheW1lbnRWYWx1YXRpb25SZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmlsaXR5SW5zdXJhbmNlQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJpbGl0eUluc3VyYW5jZVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnRlclJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcGVuc2F0aW9uUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NhbFR1cm5JbkRvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwdXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25DZW50ZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvbkxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvblN0YXRlbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yQXNzaWduZWRPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JBc3NpZ25lZFRyYW5zYWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRPckludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yc0FjY291bnRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JzQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JzUmVwcmVzZW50YXRpdmVJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JzU3BsaXRBZ2VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmVyc2lvbkF1dGhvcml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2aXNpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2NrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY2tSZWNlaXB0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFtZW5kbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5UGF5bWVudFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhdGlvbkFmZmVjdGVkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudElkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50Vm9sdW1lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY0ZsaWdodE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWNJbnZlbnRvcnlNYW5hZ2VtZW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9taWNpbGVCcmFuY2hOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWluaW9uT2ZDYW5hZGFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3duc3RyZWFtU2hpcHBlckNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFmdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhaW5ob2xlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3ZWVzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nTGlzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2luZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2luZ1JldmlzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc0xpY2Vuc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdFbmZvcmNlbWVudEFkbWluaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnRW5mb3JjZW1lbnRBZG1pbmlzdHJhdGlvbk9yZGVyQmxhbmtOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdGb3JtdWxhcnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bkFuZEJyYWRzdHJlZXRDYW5hZGFzOERpZ2l0U3RhbmRhcmRJbmR1c3RyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5BbmRCcmFkc3RyZWV0VVM4RGlnaXRTdGFuZGFyZEluZHVzdHJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRVTlNOdW1iZXJ3aXRoRm91ckNoYXJhY3RlclN1ZmZpeCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFVOU051bWJlckR1bkFuZEJyYWRzdHJlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cGxpY2F0ZUJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cGxpY2F0ZVdheWJpbGxpblJvdXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXBsaWNhdGVXYXliaWxsTm90SW5Sb3V0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eUZyZWVQcm9kdWN0c1JlY2VpcHRBdXRob3Jpc2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXR5RnJlZVByb2R1Y3RzU2VjdXJpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1dHlNZW1vTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEeWVMb3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVDQ04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbmFsSW5zdGl0dXRpb25JZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Rpb25EaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0RhdGFJbnRlcmNoYW5nZUFncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY2RldmljZXBpbm51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0Z1bmRzVHJhbnNmZXJJRE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY1BheW1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZXZhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1iYXJnb051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1iYXJnb1Blcm1pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5T3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtaXNzaW9uRGVzaWduYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVPck5vbkVtcGxveWVlQ2xhc3NpZmljYXRpb25RdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVGF4RmlsaW5nU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXJJZGVudGlmaWNhdGlvbk51bWJlck9mU2VydmljZUJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXJzSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVyc1NvY2lhbFNlY3VyaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50VmlzYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlDb250YWluZXJCaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eVJlcG9zaXRpb25pbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ0pvYlNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdLYW5iYW5TZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ01ldGVyUmVhZGluZ0FjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nTWV0ZXJSZWFkaW5nRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdQYWNrYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZEl0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZEl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZE1pbGVNYXJrZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZG9yc2VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRVc2VBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRVc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFVzZXJzUHVyY2hhc2VPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdDaGFuZ2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdDaGFuZ2VQcm9wb3NhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdEYXRhTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnF1aXJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRyeVBvaW50QXNzZXNzbWVudExvZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50cnlQb2ludEFzc2Vzc21lbnRMb2dOdW1iZXJDaGlsZERtciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50cnlQb2ludEFzc2Vzc21lbnRMb2dOdW1iZXJQYXJlbnREbXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmlyb25tZW50YWxQcm90ZWN0aW9uQWdlbmN5QWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnZpcm9ubWVudGFsUHJvdGVjdGlvbkFnZW5jeVRlc3RUeXBlUHVycG9zZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmlyb25tZW50YWxQcm90ZWN0aW9uQWdlbmN5VHJhbnNwb3J0ZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50SW5pdGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRPd25lclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50U2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFRyYW5zcG9ydENoYXJnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXZhbGVudENvdXJzZU51bWJlcmF0UmVxdWVzdGluZ0luc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcnJvcklkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjcm93RmlsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlT3JkZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV0ZXJtc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyMUNlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzVHJhbnNwb3J0YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aGliaXREaXN0cmlidXRpb25MaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwYW5zaW9ub25FZmZlY3RvZkNoYW5nZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0Q2xlYXJhbmNlSW5zdHJ1Y3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydERlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRlcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydEVzdGFibGlzaG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydExpY2VuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydFBlcm1pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZE9yRXhoaWJpdExpbmVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNpbGl0eUNlcnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5SUROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5TWVhc3VyZW1lbnRQb2ludE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjaWxpdHlOZXR3b3JrSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWx1cmVBbmFseXNpc1JlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbHVyZW1lY2hhbmlzbW51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFtaWx5TWVtYmVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbWlseVVuaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZVNlbGxlclNlcnZpY2VyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsQWNxdWlzaXRpb25SZWd1bGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEJ1cmVhdU9mSW52ZXN0aWdhdGlvbkluZGl2aWR1YWxJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbENvbW11bmljYXRpb25zQ29tbWlzc2lvbkNvbmRpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxDb21tdW5pY2F0aW9uc0NvbW1pc3Npb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsQ29tbXVuaWNhdGlvbnNDb21taXNzaW9uVHJhZGVPckJyYW5kSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEVuZXJneVJlZ3VsYXRvcnlDb21taXNzaW9uQ2VydGlmaWNhdGVPZlB1YmxpY0NvbnZlbmllbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSExNQ0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIb21lTG9hbk1vcnRnYWdlQ29ycG9yYXRpb25Mb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSG91c2luZ0FkbWluaXN0cmF0aW9uQ2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hVTVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIb3VzaW5nQWRtaW5pc3RyYXRpb25PcmlnaW5hdG9ySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxJbmZvcm1hdGlvblJlc291cmNlc01hbmFnZW1lbnRSZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWFyaXRpbWVDb21taXNzaW9uRm9yd2FyZGVyc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1hcml0aW1lQ29tbWlzc2lvblRhcmlmZk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE5hdGlvbmFsTW9ydGdhZ2VBc3NvY2lhdGlvbkxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxSZWd1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsU3VwcGx5Q2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsU3VwcGx5U2NoZWR1bGVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsU3VwcGx5U2NoZWR1bGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxUYXhwYXllcnNJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFdpcmVUcmFuc2ZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkVEV0lSRUNvbmZpcm1hdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVlU2NoZWR1bGVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZUNvbnZlcnNpb25Kb3VybmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlTGluZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVyQ29kZUlzc3VlZGJ5QnVyZWF1T2ZDZW5zdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVyQ29kZUlzc3VlZEJ5Q3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZVRyYW5zZmVyRm9ybU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZVRyYW5zZmVyUHJvdG9jb2xMb2NhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlVmVyc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxXb3JrQ2FuZGlkYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbERldGFpbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbE1hbmFnZW1lbnRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFBoYXNlUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxTZXR0bGVtZW50UGFydHlzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxUcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5lTGluZUNsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hMb3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0VHJhbnNmZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpc2NhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpc2NhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxlZXRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsZXhpYmxlU3BlbmRpbmdBY2NvdW50SW5zdXJhbmNlQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxleGlibGVTcGVuZGluZ0FjY291bnRJbnN1cmFuY2VQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29kRGF0YUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29kWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29yUGxhbkFwcHJvdmFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG93UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb2xkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvb2RBbmREcnVnQWRtaW5pc3RyYXRpb25BY2Nlc3Npb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvb2RBbmREcnVnQWRtaW5pc3RyYXRpb25Qcm9kdWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vZEFuZERydWdBZG1pbmlzdHJhdGlvblByb2R1Y3RUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2xvc2luZ1N0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNsb3N1cmVBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduRXhjaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25FeGNoYW5nZUNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTWlsaXRhcnlTYWxlc0Nhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25NaWxpdGFyeVNhbGVzTm90aWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTWlsaXRhcnlTYWxlc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnblRyYWRlWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZXN0cnlQZXJtaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1hbFN0YXRlbWVudFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtYXRpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JQaWNrdXBMaW1pdGVkRnJlaWdodFRhcmlmZk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc09yQWdlbnRzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkaW5nT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFuY2hpc2VUYXhBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVkZGllTWFjU2VsbGVyU2VydmljZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVab25lSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRGb3J3YXJkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRGb3J3YXJkZXJzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0UGF5b3JSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bGxUaW1lT3JQYXJ0VGltZUVtcGxveWVlQ2xhc3NpZmljYXRpb25RdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmN0aW9uYWxDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbFdvcmtHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZENvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZE1hbmFnZXJzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kc0F1dGhvcml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc0FuYWx5c2lzU291cmNlTWV0ZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc0N1c3RvZGlhbklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXVnZVRpY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbEFnZW5jeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbENhcmdvQ29uc2lnbm1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxEZWNsYXJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbExlZGdlckFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbFB1cnBvc2VNZXNzYWdlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsU2VydmljZXNBZG1pbmlzdHJhdGlvblJlZ3VsYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljRGVzdGluYXRpb25ab25lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljSW5kZXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNLZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNTY29yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2lubmllTWFlUG9vbFBhY2thZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQW5kU2VydmljZXNUYXhJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNhbmRTZXJ2aWNlVGF4UmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0RlY2xhcmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5pbmdDbGFzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRBY2NvdW50aW5nQ2xhc3NSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRBZHZhbmNlUHJvZ3Jlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRBZ2VuY3lSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRCaWxsb2ZMYWRpbmdPZmZpY2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50Q29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRQcmlvcml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFF1YWxpdHlBc3N1cmFuY2VBbmRDb250cm9sTGV2ZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRUcmFuc3BvcnRhdGlvblJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluQmxvY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluT3JkZXJSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYXZpdHlTb3VyY2VNZXRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JlZW5DYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cEFjY291bnRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cE9yUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cFdvcmtDYW5kaWRhdGVTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvd3RoRmFjdG9yUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50b3JMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50b3JVc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhhcm1vbmlzZWRTeXN0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhhcm1vbml6ZWRDb2RlU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXN0ZW5pbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c0NlcnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c0V4ZW1wdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzV2FzdGVNYW5pZmVzdERvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhDYXJlRmluYW5jaW5nQWRtaW5pc3RyYXRpb25OYXRpb25hbFBheWVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbk5hdGlvbmFsUHJvdmlkZXJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhjYXJlTWFucG93ZXJTaG9ydGFnZUFyZWFGYWNpbGl0eUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSElCQ0NMYWJlbGVySWRlbnRpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbmR1c3RyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5zdXJhbmNlQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5zdXJhbmNlQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluc3VyYW5jZVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5zdXJhbmNlUmF0aW5nQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5zdXJhbmNlUmF0aW5nU3VmZml4Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoTWFpbnRlbmFuY2VPcmdhbml6YXRpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aE1haW50ZW5hbmNlT3JnYW5pemF0aW9uQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoTWFpbnRlbmFuY2VPcmdhbml6YXRpb25Db2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaE9yV2lkZUZpbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hGYWJyaWNhdGlvbkF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hSYXdNYXRlcmlhbEF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVNb3J0Z2FnZURpc2Nsb3N1cmVBY3RDZW5zdXNUcmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZU1vcnRnYWdlRGlzY2xvc3VyZUFjdEJsb2NrTnVtYmVyQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZU1vcnRnYWdlRGlzY2xvc3VyZUFjdENvdW50eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVNb3J0Z2FnZURpc2Nsb3N1cmVBY3RNZXRyb3BvbGl0YW5TdGF0aXN0aWNhbEFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVNb3J0Z2FnZURpc2Nsb3N1cmVBY3RTdGF0ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvcml6b250YWxDb29yZGluYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3JzZXBvd2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3RSb2xsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZUJpbGxPZkxhZGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91c2VXYXliaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJYXRhQ2FyZ29BZ2VudENhc3NBZGRyZXNzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJYXRhQ2FyZ29BZ2VudENvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklDRDlDTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpZmljYXRpb25DYXJkU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGl0eUNhcmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltYWdlSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1tZWRpYXRlRXhwb3J0YXRpb25Ob0ZvckluQm9uZE1vdmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbW1lZGlhdGVUcmFuc3BvcnRhdGlvbk5vRm9ySW5Cb25kTW92ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGxlbWVudGF0aW9uVmVyc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0Q2xlYXJhbmNlSW5zdHJ1Y3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydGVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRlcnNSZWZlcmVuY2VOdW1iZXJUb0xldHRlck9mQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRMaWNlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRQZXJtaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcHV0YXRpb25BY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbkJvbmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluYm91bmRUb09yT3V0Ym91bmRGcm9tUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluYm91bmRUb1BhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGVkTGVnYWxSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxUcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbERlYWxlckNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRmFpbHVyZUNsYWltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsU2FtcGxlSW5zcGVjdGlvblJlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFRyb3VibGVJbmRpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRUcmFuc3BvcnRPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5xdWlyeVJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25hbmRTdXJ2ZXlTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvblJlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdG9ySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RpdHV0ZU9mU2VjdXJpdHlBbmRGdXR1cmVNYXJrZXREZXZlbG9wbWVudFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRpb25Mb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0aXR1dGlvbk5vdGVIb2xkZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDZXJ0aWZpY2F0ZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ29udHJhY3RSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUxpY2Vuc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZExvY2F0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZFBhcmNlbFBvc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWRzTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlckFzc2lnbmVkUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cm9yUG9vbElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlZ3JhdGVkTG9naXN0aWNTdXBwb3J0Q3Jvc3NSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVncmF0ZWRNYXN0ZXJQbGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlZ3JhdGVkTWFzdGVyU2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyY2hhbmdlQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmNoYW5nZU51bWJlck5ldyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJjaGFuZ2VOdW1iZXJPbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyY2hhbmdlVHJhaW5JZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJnb3Zlcm5tZW50YWxNYXJpdGltZU9yZ2FuaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpbUZ1bmRpbmdPcmdhbml6YXRpb25Mb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhcnlCcm9rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxDdXN0b21lck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxEYXRhUHJvY2Vzc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxQdXJjaGFzZU9yZGVySXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxQdXJjaGFzZU9yZGVyUmVsZWFzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxWZW5kb3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBc3Nlc3NtZW50TG9nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQXNzZXNzbWVudExvZ051bWJlckNoaWxkRGF0YU1haW50ZW5hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQXNzZXNzbWVudExvZ051bWJlclBhcmVudERhdGFNYWludGVuYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEZsaWdodE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEZ1ZWxUYXhBZ3JlZW1lbnRBY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsUmVnaXN0cmF0aW9uUGxhbkFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxSZWdpc3RyYXRpb25QbGFuU3RpY2tlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFN0YW5kYXJkSW5kdXN0cmlhbENsYXNzaWZpY2F0aW9uRG9taW5pb25PZkNhbmFkYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxTdGFuZGFyZEluZHVzdHJ5Q2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnN0YXRlQ29tbWVyY2VDb21taXNzaW9uQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ2aWV3ZXJJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50cmFQbGFudFJvdXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVJlcG9ydFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0aWdhdG9yaWFsTmV3RHJ1Z051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0bWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG9yQXNzaWduZWRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0b3JMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3Rvck5vdGVIb2xkZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlTnVtYmVyU3VmZml4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNpbmdEYXRhU2hlZXRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklyb25DaGFyZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklTRk1EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1aW5nQmFua3NSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvYk9yUHJvamVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvYlNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludENyZWRpdFNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50bHlBZG1pbmlzdGVyZWRDYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludFZlbnR1cmVSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRnbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkaWNpYWxEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkaWNpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1cmlzZGljdGlvbmFsQ29tbXVuaXR5TmFtZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1cmlzZGljdGlvbmFsQ29tbXVuaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5UmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvck9wZXJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JvckFmZmlsaWF0aW9uSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RUcmFuc2Zlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0aXR1ZGVFeHByZXNzZWRpbkRlZ3JlZXNNaW51dGVzYW5kU2Vjb25kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0aXR1ZGVFeHByZXNzZWRpblNlY29uZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWRDYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZUFncmVlbWVudEFtZW5kbWVudE51bWJlck1hc3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VDb250cmFjdFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlUmlkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlU2NoZWR1bGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlU2NoZWR1bGVOdW1iZXJCbGFua2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVNjaGVkdWxlTnVtYmVyUHJpb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlU2NoZWR1bGVOdW1iZXJSZXBsYWNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGVyQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGVyQ2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGVyRW50aXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kZXJVc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NlZUJpbGxDb2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzZWVJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyb2ZDcmVkaXREcmFmdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZDcmVkaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlcm9mQ3JlZGl0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJzb3JOb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV2eWluZ09mZmljZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZVBsYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlSW5zdXJhbmNlQmlsbGluZ0FjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVJbnN1cmFuY2VCaWxsaW5nU3VmZml4Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZUluc3VyYW5jZVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltaXRlZFBhcnRuZXJzaGlwSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZW9mQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVPZkNyZWRpdENhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5rU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RCaWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0T2ZNYXRlcmlhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxsb3lkc0NsYWltc09mZmljZVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZ0F1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRMaW5lQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRQbGFubmluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbkFjcXVpc2l0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuRmVhdHVyZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5Qcm9zcGVjdG9yS2V5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsSnVyaXNkaWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbGx5QXNzaWduZWRDb250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbE1lZGlhSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxTY2hvb2xDb3Vyc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsU2Nob29sRGlzdHJpY3RDb3Vyc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsU3R1ZGVudElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbkV4Y2VwdGlvbk9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25vblByb2R1Y3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvblNwZWNpZmljU2VydmljZXNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uV2l0aGluRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NrYm94Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZ2ljYWxPYnNlcnZhdGlvbklkZW50aWZpZXJOYW1lc2FuZENvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2dpc3RpY3NTdXBwb3J0RG9jdW1lbnRhdGlvblR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25naXR1ZGVFeHByZXNzZWRJbkRlZ3JlZXNNaW51dGVzYW5kU2Vjb25kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9uZ2l0dWRlRXhwcmVzc2VkaW5TZWNvbmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25nVGVybURpc2FiaWxpdHlQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3NPckV2ZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd2VyQXJ0aWNsZU51bWJlck9mUmFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hZ2F6aW5lQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbGJveCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbGluZ1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbFNsb3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlQXZhaWxhYmlsaXR5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VSZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWpvckZvcmNlUHJvZ3JhbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFqb3JTeXN0ZW1BZmZlY3RlZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ha2Vnb29kQ29tbWVyY2lhbExpbmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbW1vZ3JhcGh5Q2VydGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlZENhcmVPcmdhbml6YXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VkQ2FyZU9yZ2FuaXphdGlvbklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5pZmVzdEtleU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWFsUHJvY2Vzc2luZ0F1dGhvcml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyRGVmaW5lZFJlcGFpclJhdGVzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlcnNNYXRlcmlhbFNhZmV0eURhdGFTaGVldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyc1BhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdEaXJlY3RpdmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdPcGVyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXBSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcml0aW1lRGVjbGFyYXRpb25vZkhlYWx0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0QXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2luZ09yTGFiZWxSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckFpcldheWJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckJpbGxPZkxhZGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckxhYmVsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJMZWFzZUFncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJQcm9wZXJ0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJTb2xpY2l0YXRpb25Qcm9jZWR1cmVzVGVybXNBbmRDb25kaXRpb25zTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENoYW5nZU5vdGljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxTdG9yYWdlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdHVyZWRDZXJ0aWZpY2F0ZU9mRGVwb3NpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhdFByb2Nlc3NpbmdFc3RhYmxpc2htZW50UmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FpZFByb3ZpZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FpZFJlY2lwaWVudElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsQXNzaXN0YW5jZUNhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsUmVjb3JkSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUHJvdmlkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlVmVyc2lvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lbWJlcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZW1iZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmNoYW5kaXNlVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmNoYW50Q2F0ZWdvcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlQWRkcmVzc29ySUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VCYXRjaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZURlc2lnbkdyb3VwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlUmVjaXBpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlU2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJQcm92aW5nUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlclJlYWRpbmdBdFRoZUJlZ2lubmluZ09mVGhlRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyUmVhZGluZ0F0VGhlRW5kT2ZEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJUaWNrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyVW5pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUlDUk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWljcm9maWxtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWdyYW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxlc3RvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5Q2FsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlJbnRlcmRlcGFydG1lbnRhbFB1cmNoYXNlUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlPcmRuYW5jZVNlY3VyaXR5Umlza051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlSYW5rT3JDaXZpbGlhblBheUdyYWRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeVNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5U3RhbmRhcmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGxpbmdpblRyYW5zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGxPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVJveWFsdHlQYXlvcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pc3RlcmlhbENlcnRpZmljYXRlT2ZIb21vbG9nYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZWx5ZWFybnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNT1JORVRQbHVzQ2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU9STkVUUGx1c0luc3RpdHV0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNT1JORVRQbHVzVXNlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUJhY2tlZFNlY3VyaXR5TG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VCYWNrZWRTZWN1cml0eVBvb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlRWxlY3Ryb25pY1JlZ2lzdHJhdGlvblN5c3RlbU9yZ2FuaXphdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlZUxvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlSW5zdXJhbmNlQ29tcGFueU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VJbnN1cmFuY2VJbmRpY2F0b3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvckNhcnJpZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JGdWVsQ2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yVmVoaWNsZUlETnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aWZhbWlseVByb2plY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZUFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2VCb29rVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZU1hcFhDb29yZGluYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlTWFwWUNvb3JkaW5hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2VTdWJBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZVBPT2ZBbkludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlWm9uZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdW5pY2lwYWxpdHlBc3NpZ25lZEJ1c2luZXNzUmVnaXN0cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BQ0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmFtZWRCYW5rc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxBZXJvbmF1dGljc2FuZFNwYWNlQWRtaW5pc3RyYXRpb25GQVJTdXBwbGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEFzc29jaWF0aW9uT2ZCb2FyZHNPZlBoYXJtYWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEFzc29jaWF0aW9uT2ZJbnN1cmFuY2VDb21taXNzaW9uZXJzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxCdXNpbmVzc0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENyaW1pbmFsSW5mb3JtYXRpb25DZW50ZXJPcmlnaW5hdGluZ0FnZW5jeUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEZsb29kSW5zdXJhbmNlUHJvZ3JhbUNvbW11bml0eU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRmxvb2RJbnN1cmFuY2VQcm9ncmFtQ29tbXVuaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEZsb29kSW5zdXJhbmNlUHJvZ3JhbUNvdW50eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxGbG9vZEluc3VyYW5jZVByb2dyYW1NYXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRmxvb2RJbnN1cmFuY2VQcm9ncmFtU3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsR292ZXJubWVudEJ1c2luZXNzSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUHJvcGVydHlSZWdpc3RyeVN5c3RlbUxldmVsMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxQcm9wZXJ0eVJlZ2lzdHJ5U3lzdGVtTGV2ZWwyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFByb3BlcnR5UmVnaXN0cnlTeXN0ZW1MZXZlbDMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsU3RvY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyYWxHYXNQb2xpY3lBY3RDYXRlZ29yeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0RydWdBcHBsaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3SGVhbHRoSW5zdXJhbmNlQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1BhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRSZW50YWxBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRSZW50YWxBZ3JlZW1lbnRSZWFzb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRTaGlwbWVudElkZW50aWZpY2F0aW9uTnVtYmVyQ29udGludW91c01vdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5JVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9taW5hdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uQW1lcmljYW5JZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uQ29uZm9ybWFuY2VSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbk5lZ290aWFibGVNYXJpdGltZVRyYW5zcG9ydERvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25PcmlnaW5hdGluZ1RoaXJkUGFydHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblBpY2t1cExpbWl0ZWRUYXJpZmZOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblByb3Zpc2lvbmFsUGF0ZW50QXBwbGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblNwb3VzZVRpZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9PVDVBdXRob3JpdHlaZXJvTWlsZWFnZVJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoQW1lcmljYW5EYXR1bVN0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aEFtZXJpY2FuRnJlZVRyYWRlQWdyZWVtZW50Q29tcGxpYW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhBbWVyaWNhbkhhemFyZG91c0NsYXNzaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aEFtZXJpY2FuSGF6YXJkb3VzR29vZHNDbGFzc2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhBbWVyaWNhbkluZHVzdHJpYWxDbGFzc2lmaWNhdGlvblN5c3RlbUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PVElDT0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVGVtcG9yYXJ5SW1wb3J0YXRpb25Eb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtZXJvZGVDZWR1bGFkZUlkZW50aWRhZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtZXJvZGVJZGVudGlmaWNhY2lvblRyaWJ1dGFyaWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9iamVjdElkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25hbFNhZmV0eWFuZEhlYWx0aEFkbWluaXN0cmF0aW9uQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25DbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbkJpbGxvZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5Db250YWluZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuTWFuaWZlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmVuZGVyVHJhY2tpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmVuc2VUcmFja2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZXJHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlckxpY2Vuc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVN5bWJvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkTWV0ZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZFBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZUNhbGxBZ2VuY3lUaWNrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ubGluZVByb2N1cmVtZW50YW5kQWNjb3VudGluZ0NvbnRyb2xUcmFuc2FjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlbmFuZFByZXBhaWRTdGF0aW9uTGlzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvckFzc2lnbmVkVW5pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JMZWFzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlck9yUGFyYWdyYXBoTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmluZ0N1c3RvbWVyQ29uc2lnbm1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyaW5nQ3VzdG9tZXJzU2Vjb25kUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXphdGlvbkJyZWFrZG93blN0cnVjdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxGZG9UcmFuc2FjdGlvblJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxGaWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRmlsaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUHVyY2hhc2VPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUmV0dXJuUmVxdWVzdFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxTaGlwcGVyc0JpbGxPZkxhZGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxTdWJtaXR0ZXJDaGlsZERhdGFNYWludGVuYW5jZVJlcXVlc3RMb2ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsU3VibWl0dGVyTG9nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFN1Ym1pdHRlclBhcmVudERhdGFNYWludGVuYW5jZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsVW5pZm9ybUNvbW1lcmNpYWxDb2RlRmlsaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFZvdWNoZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmF0aW5nQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRpbmdDb21wYW55SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRpbmdEZXBvc2l0b3J5RmluYW5jaWFsSW5zdGl0dXRpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdG9yc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luSG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbk9mU2hpcG1lbnRIYXJtb25pemVkQmFzZWRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVDVBdXRob3JpdHlDb25kaXRpb25PclJlc3RyaWN0aW9ub25DYXJIaXJlUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZFR5cGVPZlJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0Ym91bmRGcm9tUGFydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGVyQ29udGluZW50YWxTaGVsZkFyZWFDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlckNvbnRpbmVudGFsU2hlbGZCbG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJwYWNrYWdpbmdVbml0SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGxldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0b2ZTZXJ2aWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25pbmdCdXJlYXVJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja0FuZEhvbGRJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmdHcm91cE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnaW5nU3BlY2lmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnaW5nVW5pdElkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0dyb3VwQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0xpc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdQbGFudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyYWdyYXBoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJhZ3JhcGhOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmFtZWRpY2FsSUROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmVudEZpbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRDYXVzaW5nUmVwYWlyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0Q29uc2lnbm1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxQYXltZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGF0aW5nQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydEludGVyY2hhbmdlYWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydFJlZmVyZW5jZUluZGljYXRvckluQURyYXdpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5SW5mb3JtYXRpb25NZXNzYWdlUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVNlcXVlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc3BvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGVudENvb3BlcmF0aW9uVHJlYXR5QXBwbGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0ZW50VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdHJvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWVJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWVMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZXNGaW5hbmNpYWxJbnN0aXR1dGlvbkFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlc0ZpbmFuY2lhbEluc3RpdHV0aW9uVHJhbnNpdFJvdXRpbmdObyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWVzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllckFzc2lnbmVkUmVzdWJtaXNzaW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllckNhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcnNGaW5hbmNpYWxJbnN0aXR1dGlvbkFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyc0ZpbmFuY2lhbEluc3RpdHV0aW9uVHJhbnNpdFJvdXRpbmdObyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlHcmFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudENhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50SGlzdG9yeVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEluQWR2YW5jZVJlcXVlc3RSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRJbnN0YWxtZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFBsYW5SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRWYWx1YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW9yc0NsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGNzQ2F0YXN0cm9waGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZXJSZXZpZXdPcmdhbml6YXRpb25BcHByb3ZhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuZGluZ0Nhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbnNpb25Db250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kaWNpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbmFsSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbmFsSWRlbnRpdHlDYXJkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25hbElETnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Qb29sQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhhcm1hY3lQcmVzY3JpcHRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBob25lQ2FsbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsSW52ZW50b3J5UmVjb3VudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWN0dXJlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWN0dXJlT2ZBY3R1YWxQcm9kdWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWN0dXJlT2ZBR2VuZXJpY1Byb2R1Y3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZ2d5YmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlsb3RMaWNlbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbk5ldHdvcmtJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbm5pbmdQYWNrYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRmb3JtSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsb3RGaWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVnTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lGb3JtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lMaW5rTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGx1dGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbENvbnRyYWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbFN1ZmZpeCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0RW50cnlSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZUF3YXJkU3VydmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVjaW5jdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZGVjZXNzb3JBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVkZXRlcm1pbmF0aW9ub2ZCZW5lZml0c0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRDYWxsU2lnbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb25BdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb25TaXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeVdvcmtDYW5kaWRhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1hcmtldEFwcGxpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtYXJrZXROb3RpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1BdWRpdFByaW9yaXR5SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bUF1ZGl0UHVycG9zZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1BdWRpdFR5cGVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtUmF0ZVRhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJlcnNWZXJpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRpbmdCYW5rc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc3NGb3JtSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc3NJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0JpbGxvZkxhZGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDYXJnb0NvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ2xhaW1IaXN0b3J5SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDb3Vyc2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3JlZGl0T3JEZWJpdEFkanVzdG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3JlZGl0QWR2aWNlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0N1c3RvbWVyUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0RlbGl2ZXJ5SW5zdHJ1Y3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRGVsaXZlcnlTY2hlZHVsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNEaXN0cmlidXRvck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNEcml2ZXJzTGljZW5zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNEcnVnRW5mb3JjZW1lbnRBZG1pbmlzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNIaWdoZXN0U2NoZWR1bGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzSW52b2ljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNseVJlcG9ydGVkU29jaWFsU2VjdXJpdHlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTWVtYmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1BvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZW50YWxBZ3JlZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1JlcXVlc3RGb3JNZXRlcmVkUmVhZGluZ1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNTY2hlbWVPclBsYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzU2VxdWVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzU2hpcG1lbnRJZGVudGlmaWNhdGlvbk51bWJlckNvbnRpbnVvdXNNb3ZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1RheENvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzVGlja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZU9yU2FsZXNDYXRhbG9ndWVSZXNwb25zZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBcmVhTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUxpc3RDaGFuZ2Vvcklzc3VlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUxpc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlTGlzdFZlcnNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlUXVvdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlVmFyaWF0aW9uRm9ybXVsYVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWVDb250cmFjdG9yQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsc0JhbmtSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbHNSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JDYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckNlcnRpZmljYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckRhdGFVbml2ZXJzYWxOdW1iZXJTeXN0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySGVhbHRoSW5kdXN0cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySWRlbnRpZmllck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JJbmNvcnJlY3RCYXRjaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JJbmNvcnJlY3RTb2NpYWxTZWN1cml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JpdHlSYXRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yTG9hbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JQaG9uZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JQb2xpY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yUG9zdGFsWmlwQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JQdXJjaGFzZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcnB1cmNoYXNlb3JkZXJudW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yVGF4SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yVHJhZGluZ1BhcnRuZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JVbml2ZXJzYWxQcm92aWRlcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZWVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzSGFuZGxpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ1BsYW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzb3JJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc29yc0ludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2N1cmVtZW50QnVkZ2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jdXJlbWVudFJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2N1cmluZ0FnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdENoYW5nZUF1dGhvcml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdENoYW5nZUluZm9ybWF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0Q2hhbmdlTm90aWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0R3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TGljZW5zaW5nQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TGluZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFBlcmlvZEZvcldoaWNoTGFib3JDb3N0c0FyZUZpcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RSZXNlcnZhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFNvdXJjaW5nQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0U3BlY2lmaWNhdGlvbkRvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmlsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZm9ybWFJbnZvaWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyZXNzUGF5bWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQYXJhZ3JhcGhOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQcm9wZXJ0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbk9yRGVhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvb2ZPZkRlbGl2ZXJ5UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eUNvbXBvbmVudExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eUNvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5TG9zc0l0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Bvc2FsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NhbFBhcmFncmFwaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zZWRDb250cmFjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zZWRHcm91cFdvcmtDYW5kaWRhdGVTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zZWRTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zZWRXb3JrQ2FuZGlkYXRlU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RvY29sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90cmFjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJDb21tZXJjaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlckNvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyT3JkZXJUaWNrZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyUGxhbk5ldHdvcmtJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJTaXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlclVQSU5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpbmNpYWxDYW5hZGlhblNhbGVzVGF4RXhlbXB0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aW5jaWFsVGF4SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Zpc2lvbmFsUGF0ZW50QXBwbGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY2F0aW9uSXNzdWVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY0RlZWROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY0ZpbGluZ1JlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljVXRpbGl0aWVzQ29tbWlzc2lvbkNlcnRpZmljYXRlT2ZQdWJsaWNDb252ZW5pZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcHRpb25BZ3JlZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJDaGFuZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJMaW5lSXRlbUlkZW50aWZpZXJCdXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlck51bWJlckluY2x1ZGVkaW5Pbk9yZGVyUG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJOdW1iZXJPZk9yZGVyUmVjZWl2ZWRTaW5jZUxhc3RSZXBvcnRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTnVtYmVyT2ZTaGlwbWVudFJlY2VpdmVkU2luY2VMYXN0UmVwb3J0aW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlck51bWJlclN1ZmZpeCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlclJlc3BvbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyUmV2aXNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlUmVxdWlzaXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlcnNSZXF1ZXN0UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzaW5nQWN0aXZpdHlDbGF1c2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpZmllZE1hdGVyaWFsc0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpZmllZFByb2R1Y3RzTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNsYXVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eURpc3Bvc2l0aW9uQXJlYUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlJbnNwZWN0aW9uQXJlYUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlSZXBvcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlSZXZpZXdNYXRlcmlhbENyaWJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVZhbHVhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlWYWx1YXRpb25SZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFyYW50aW5lT3JUcmVhdG1lbnRTdGF0dXNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJ0ZXJRdWFydGVyU2VjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcnRlclF1YXJ0ZXJTcG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWVzdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGFOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RlT3JTaG9wcGluZ0NhcnRJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFja1R5cGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxPclJvYWRSb3V0aW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHJvYWRDb21taXNzaW9uT2lsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlscm9hZENvbW1pc3Npb25SZWNvcmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxSb3V0aW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFdheUJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWx3YXlDb25zaWdubWVudE5vdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWx3YXlXYWdvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFuZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVDYXJkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQ29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZUNvbmZlcmVuY2VJRENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVOb3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhd21hdGVyaWFsU3VwcGxpZXJEdW5BbmRCcmFkc3RyZWV0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlT3duZWRQcm9wZXJ0eUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNvbkZvckNoYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uTm90TG93ZXN0Q29zdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYmF0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjYWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXB0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJBc3NpZ25lZERyb3Bab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlckNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcklEUXVhbGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcnNGaWxlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlclN1YklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdBZHZpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0JhbmtzQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nQ29tcGFueUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0RlcG9zaXRvcnlGaW5hbmNpYWxJbnN0aXR1dGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nUGFydHlzTWVtYmVySWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29uY2lsaWF0aW9uUmVwb3J0U2VjdGlvbklkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWR1Y2VkRWFybmluZ1dlZWtJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VkQnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZWRQYXR0ZXJuSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZURyYXdpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZU51bWJlckFzc2lnbmVkQnlUaGlyZFBhcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VOdW1iZXJPZkFSZXF1ZXN0Rm9yTWV0ZXJlZFJlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZU51bWJlclF1b3RlZE9uU3RhdGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VOdW1iZXJUb1ByZXZpb3VzTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlVmVyc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmVkUHJvZHVjdEZvckNoZW1pY2FsQW5hbHlzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmVkUHJvZHVjdEZvck1lY2hhbmljYWxBbmFseXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmaW5lcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbmFsQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXJpc3RvRmVkZXJhbERlQ29udHJpYnV5ZW50ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lyaXN0b0ZlZGVyYWxkZUNvbnRyaWJ1eWVudGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkQ2FwaXRhbFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZENvbnRyYWN0b3JBY3Rpdml0eVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRNYWlsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbk51bWJlck9mUHJldmlvdXNDdXN0b21zRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJvSW5mb3JtYWNpb25GaXNjYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJvTmFjaW9uYWxkZUNvbnRyaWJ1eWVudGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJvVW5pY29kZUNvbnRyaWJ1eWVudGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRpb25QcmltYXJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0aW9uU2Vjb25kYXJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0b3J5R3VpZGVsaW5lSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJlcnNDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpc3N1ZUNlc3Npb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZENhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRDb250cmFjdExpbmVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWROb25jb25mb3JtYW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZE9iamVjdElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRWZW5kb3JPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQcmlvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZUludm9pY2VOdW1iZXJGb3JQcmlvckJpbGxBbmRIb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1pdHRhbmNlQWR2aWNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1pdHRpbmdCYW5rc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3ZhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsQWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50UGF5b3JJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyQWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJDYXRlZ29yeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyRGF0YVJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckVzdGltYXRlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwZWF0TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGV0aXRpdmVCb29raW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBldGl0aXZlQ2FyZ29TaGlwbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwZXRpdGl2ZVBhdHRlcm5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBldGl0aXZlV2F5YmlsbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50QXNzZW1ibHlNb2RlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRBc3NlbWJseVNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRDbGFpbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRDdXN0b21lclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnREcnVnRW5mb3JjZW1lbnRBZG1pbmlzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjaW5nUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGVuaXNobWVudFB1cmNoYXNlT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxlbmlzaG1lbnRQdXJjaGFzZU9yZGVyUmFuZ2VFbmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxlbmlzaG1lbnRQdXJjaGFzZU9yZGVyUmFuZ2VTdGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0ZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0aW5nRm9ybU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByZXNlbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwcmVzZW50YXRpdmVJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwcmljZWRDbGFpbVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwcmljZWRMaW5lSXRlbVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvckNhbmNlbGxhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGZvclF1b3RhdGlvblJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvclF1b3RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZXJ2ZUFzc2VtYmx5TGluZUZlZWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzb3VyY2VTY3JlZW5pbmdSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc291cmNlVXRpbGl6YXRpb25Hcm91cE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2V0b2FSZXF1ZXN0Zm9yUXVvdGF0aW9uUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkQXZhaWxhYmlsaXR5QXV0aG9yaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZEF2YWlsYWJpbGl0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdWJtaXNzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN1Ym1pc3Npb25SZWFzb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN1Ym1pdG51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsTWVyY2hhbnRzQ2VydGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0aXJlbWVudFBsYW5BY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRpcmVtZW50UGxhblBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuYWJsZUNvbnRhaW5lclJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuYWJsZUNvbnRhaW5lclNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuZWRHb29kc0F1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkdvb2RzQmlsbE9mTGFkaW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5NYXRlcmlhbEF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybnNOb3RpY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmVudWVTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlldyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aWV3ZXJGaWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXdQZXJpb2ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSSUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZENvbnNpZ25tZW50Tm90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlT3JkZXJOdW1iZXJEb21lc3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVPcmRlck51bWJlckVtZXJnZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVPcmRlck51bWJlckV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGluZ0luc3RydWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSVUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1bGVTZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmVrZWVwaW5nQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5RXF1aXBtZW50Q2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eW9mUmFkaW9DZXJ0aWZpY2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5b2ZTaGlwQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzT3JUZXJyaXRvcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc0FsbG93YW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNEZXBhcnRtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc0ZvcmVjYXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc09mZmljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNQZXJzb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUHJvZ3JhbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNSZWdpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1JlcHJlc2VudGF0aXZlT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUmVzcG9uc2liaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F2aW5ncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0JBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2FsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NhbkxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlbWVPclBsYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbExvYW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbFVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhbE9mZk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhbE9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFyY2hLZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUNvdmVyYWdlQ2VydGlmaWNhdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUNvdmVyYWdlQ29tcGFueU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5Q3VzdG9tc1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5RW1wbG95ZWVJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5SGVhbHRoSW5zdXJhbmNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5UHJvdmlkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVN1ZmZpeENvZGVJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZEJlbmVmaWNpYXJ5c1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjcmV0YXJpYWRlQ29tZXJjaWF5RmFtZW50YUluZHVzdHJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3JldGFyeW9mU3RhdGVBc3NpZ25lZElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN0aW9uT2ZUaGVOYXRpb25hbEhvdXNpbmdBY3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0eUluc3RydW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZkluc3VyYW5jZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmSW5zdXJlckF1dGhvcml6YXRpb25UeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZkluc3VyZXJPcmdhbml6YXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzQ2F0YWxvZ3VlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzQ3JlZGl0TWVtbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0RlYml0TWVtbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0ludm9pY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNTYWxlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsaW5nQXJyYW5nZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRlckRlZmluZWRDbGF1c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRlcnNDbGF1c2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRlcnNGaWxlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kZXJzUmVmZXJlbmNlVG9UaGVPcmlnaW5hbE1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRpbmdCYW5rUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kaW5nQ29tcGFueUF1ZGl0TnVtYmVyQXV0b21hdGVkQ2xlYXJpbmdob3VzZVRyYW5zZmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUF1dGhvcml6YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VCdWxsZXRpbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNoYW5nZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNoYXJnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRXN0aW1hdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VHcm91cElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlSW50ZXJydXB0VHJhY2tpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVBlcmZvcm1lZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUmVxdWVzdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZXJMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsZkxpZmVJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudERlc3RpbmF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRPcmlnaW5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcE5vdGljZU9yTWFuaWZlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBvd25lcnNBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQ2FyT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzQm9uZE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlcnNIYXphcmRvdXNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nTGFiZWxTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nTm90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdVbml0SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvcnRUZXJtRGlzYWJpbGl0eVBvbGljeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvd0lkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmFsQ29kZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlVHJhbnNhY3Rpb25TZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lSRU5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJUkVUTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXRlU3BlY2lmaWNQcm9jZWR1cmVzVGVybXNBbmRDb25kaXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXR1YXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsYXVnaHRlclBsYW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxJbnN1cmFuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbFNlY3VyaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpZXR5b2ZQcm9wZXJ0eUluZm9ybWF0aW9uQ29tcGlsZXJzYW5kQW5hbHlzdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvZnR3YXJlQXBwbGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGljaXRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29ydEFuZFNlZ3JlZ2F0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlRG9jdW1lbnRJbnRlcm5hbFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BhY2luZ1VuaXRPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEFwcHJvdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQnVkZ2V0QWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENoYXJnZU9yQWxsb3dhbmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENsYXVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEdvdmVybm1lbnRBY2NvdW50aW5nQ2xhc3NpZmljYXRpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxJbnN0cnVjdGlvbnNOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxNb3ZlUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUGFja2FnaW5nSW5zdHJ1Y3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQYXltZW50UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUHJvY2Vzc2luZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxRdW90ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbHR5TGljZW5zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWNhdGlvbkNsYXNzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpY2F0aW9uUmV2aXNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpbWVuSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXRCb29raW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdFByZW1pdW1BdWRpdENoYW5nZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0U2hpcG1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb25zb3JzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG91c2VUaWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWNrVHJhaW5JZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkQ2FycmllckFscGhhQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRDbGF1c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkSW5kdXN0cnlDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkTnVtYmVyT2ZJbnNwZWN0aW9uRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkUG9pbnRMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkc0NvZGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkc051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRzVmVyc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRUcmFuc3BvcnRhdGlvbkNvbW1vZGl0eUNvZGVCcmlkZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkVHJhbnNwb3J0YXRpb25Db21tb2RpdHlDb2RlUmVwbGFjZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydGluZ1BhY2thZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQXNzZW1ibHlEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVDaGFydGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUNvbnRyb2xsZWRTdWJzdGFuY2VMaWNlbnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUNyaW1pbmFsSGlzdG9yeVJlcG9zaXRvcnlJbmRpdmlkdWFsSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlRGVwYXJ0bWVudEkyMEZvcm1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlRGVwYXJ0bWVudElBUDY2Rm9ybU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVIYXphcmRvdXNXYXN0ZUVudGl0eUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlSW5kdXN0cmlhbEFjY2lkZW50UHJvdmlkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlTGVnaXNsYXRpdmVEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVMaWNlbnNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlTGljZW5zZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW1lbnRPZldvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlTm9uUmVzaWRlbnRWaW9sYXRvckNvbXBhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlb3JQcm92aW5jZUFzc2lnbmVkQnVzaW5lc3NSZWdpc3RyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVPclByb3ZpbmNlQXNzaWduZWRFbnRpdHlJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVTYWxlc1RheElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVNlbmF0ZURpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVN0dWRlbnRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVUYXhJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGV3aWRlQ291cnNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aW9uUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c1JlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tDZXJ0aWZpY2F0ZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tFeGNoYW5nZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrRXhjaGFuZ2VDb21wYW55SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tLZWVwaW5nVW5pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3BTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUluZm9ybWF0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJhc3NlbWJseU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RMaW5lSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JEYXRhUmVxdWlyZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJkYXlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmRpdmlzaW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViZXhoaWJpdExpbmVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJGaWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJob3VzZUJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdFByb3BlcnR5Tm9uU2FsZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdFByb3BlcnR5UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0UHJvcGVydHlWZXJpZmljYXRpb25Tb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmxpbmVvZkluc3VyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWlzc2lvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNjcmliZXJBdXRob3JpemF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzY3JpYmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzZXJ2aWNlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViU2VydmljZXJMb2FuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzaXN0ZW5jZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGFudGl2ZWx5Q29uc29saWRhdGVkQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZUFpcldheWJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVNYW51ZmFjdHVyZXJzUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZU5hdGlvbmFsU3RvY2tOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJTdWJob3VzZUJpbGxPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VjY2Vzc29yQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VmZml4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcmludGVuZGVuY2lhZGVJbnZlcnNpb25lc0V4dHJhbmplcmFzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc29yeUFwcHJhaXNlckNlcnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhbEFjY291bnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhbEFncmVlbWVudEF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFsQ2xhaW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllclJlcGxhY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckRvY3VtZW50SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc0NvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc0NyZWRpdENsYWltUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwb3J0aW5nRG9jdW1lbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmV0eUJvbmROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1c3BlbnNpb25JZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd2FwT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXSUZUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVE1UMTAwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVE1UMjAyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVENvbmZpcm1hdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ltYm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW1ib2xOdW1iZXJGb3JNaWxlc3RvbmVPckxPQlJlcG9ydHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbWF0aXplZE5vbWVuY2xhdHVyZW9mSHVtYW5hbmRWZXRlcmluYXJ5TWVkaWNpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbWVJbmZvcm1hdGlxdWVQb3VyTGVSZXBlcnRvaXJlRGVzRW50cmVwcmlzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbWVJbmZvcm1hdGlxdWVQb3VyTGVSZXBlcnRvaXJlRGVzRXRhYmxpc3NlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZlBhZ2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZlJ1bGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZlNlY3Rpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZlN1ZmZpeE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmU3VwcGxlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFza09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhBZ2VuY3lOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEV4Y2hhbmdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RXhlbXB0aW9uTGljZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RXhlbXB0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhGaWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEZvcm1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhpbmdBdXRob3JpdHlJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4TGljZW5zZUV4ZW1wdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4TGllbkp1cmlzZGljdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhTY2hlZHVsZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFNoZWx0ZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFdvcmtzaGVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVENOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWFtQXNzaWdubWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsRG9jdW1lbnRhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbERvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxJbmZvcm1hdGlvblBhY2thZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbE9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxQaGFzZVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbW11bmljYXRpb25DaXJjdWl0U3VwcGxlbWVudGFsSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGV4TWVzc2FnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGxhdGVTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVub3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxPcGVyYXRvck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxSZWxlYXNlT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmF0aW9uRmlsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0ZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFJlcG9ydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRleHRFbGVtZW50SWRlbnRpZmllckRlbGV0aW9uUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVhdGVyU2NyZWVuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZEJhbmtzUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZEJhbmtzUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5QWRtaW5pc3RyYXRvckNsYWltTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5Tm90ZUhvbGRlcklkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5T3JnYW5pemF0aW9uQXV0aG9yaXphdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eU9yaWdpbmF0b3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlQdXJjaGFzZU9yZGVySXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVB1cmNoYXNlT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlQdXJjaGFzZU9yZGVyUmVsZWFzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyb3VnaEJpbGxPZkxhZGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlja2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lRmFpbHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlyQ2FybmV0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSVJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlQ29tcGFueUNvZGVCb29rUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZURvY3VtZW50U2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlUG9saWN5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZVJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVYSVhJZGVudGlmaWVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb2t5b1Nob2tvUmVzZWFyY2hCdXNpbmVzc0lkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvbGxCaWxsaW5nVGVsZXBob25lUmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEN5Y2xlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE9yZGVyQ3ljbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvd25zaGlwTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3hpY29sb2d5SUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNlckFjdGlvblJlcXVlc3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNraW5nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVyQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGluZ1BhcnRuZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlclR5cGVRdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXJVc2VBZ3JlZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbmluZ0ZsaWdodE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb25DYXRlZ29yeU9yVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0R3VhcmFudGVlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvbmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25BY2NvdW50Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25BY2NvdW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkNvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uRXhwb3J0YXRpb25Ob0ZvckluQm9uZE1vdmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvblByaW9yaXR5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb250cmFjdFJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Q29zdHNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydERvY3VtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRSZXR1cm5SZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN0cmlwcGluZ09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdHVmZmluZ09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdXJ2ZXlSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN1cnZleVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3VydmV5UmVwb3J0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRSb3V0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0U2VjdGlvblJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdmVsTWFuaWZlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0eUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYWxMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaXBsZWJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrZXJzQmlsbE9mTGFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzdGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUU1JCdXNpbmVzc0lkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkNvbW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkVzY3Jvd051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mSG91c2Vob2xkR29vZHNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZMYXdTdWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZPdXRzdGFuZGluZ0p1ZGdtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZTY2llbmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVS5TLkRlZmVuc2VGZWRlcmFsQWNxdWlzaXRpb25SZWd1bGF0aW9uU3VwcGxlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVS5TLkRlcGFydG1lbnRPZlZldGVyYW5zQWZmYWlyc0FjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVS5TLkdvdmVybm1lbnRUcmFuc3BvcnRhdGlvbkNvbnRyb2xOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ29uc2lnbmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUN1c3RvbWVyc09yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUN1c3RvbWVyc1JlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hY2NlcHRhYmxlU291cmNlRFVOU051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hY2NlcHRhYmxlU291cmNlUHVyY2hhc2VySUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYWNjZXB0YWJsZVNvdXJjZVN1cHBsaWVySUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyd3JpdGVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyd3JpdGluZ0FsZXJ0UmVmZXJlbmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU5ERyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5lbXBsb3ltZW50SW5zdXJhbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdDb2xsYXRlcmFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtUmVzb3VyY2VMb2NhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pcXVlQ2xhaW1zUmVmZXJlbmNlTnVtYmVyT2ZUaGVTZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXF1ZUNvbnNpZ25tZW50SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pcXVlQ29uc2lnbm1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXF1ZUN1cnJhY1JlZmVyZW5jZU51bWJlck9mVGhlU2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlxdWVNYXJrZXRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXF1ZVJlaW5hY1JlZmVyZW5jZU51bWJlck9mVGhlU2VuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlxdWVTdXBwbGllcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWROYXRpb25zSGF6YXJkb3VzQ2xhc3NpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc0dvdmVybm1lbnRWaXNhTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNTdGFuZGFyZE1ldHJvcG9saXRhblN0YXRpc3RpY2FsQXJlYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRMb2FkRGV2aWNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRQcm9wZXJ0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFJlbGllZk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFJlcG9ydFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFJlcG9ydFBlcmlvZElEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0VHJhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXZlcnNhbFJhaWxyb2FkUmV2ZW51ZVdheWJpbGxJZGVudGlmaWVkTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzYWxUcmFuc3ZlcnNlTWVyY2F0b3JFYXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzYWxUcmFuc3ZlcnNlTWVyY2F0b3JOb3J0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2FsVHJhbnN2ZXJzZU1lcmNhdG9yWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5wYWlkSW5zdGFsbG1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwcGVyU2VyaWFsTnVtYmVyT2ZSYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBzdHJlYW1TaGlwcGVyQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ0ZSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0NTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlQW50aUR1bXBpbmdEdXR5Q2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZUJpbmRpbmdSdWxpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VDb21tZXJjaWFsRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VDb3VudGVydmFpbGluZ0R1dHlDYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlRW50cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VFbnRyeVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlUHJlQXBwcm92YWxSdWxpbmdOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VQcmVDbGFzc2lmaWNhdGlvblJ1bGluZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZVN0YXRlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNET0VBbmROQ0VTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0RPVEJvbmRTdXJldHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VySUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNGQ0NJbXBvcnRDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTRmVkZXJhbEFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNGZWRlcmFsSW5mb3JtYXRpb25SZXNvdXJjZXNNYW5hZ2VtZW50UmVndWxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNGb29kQW5kRHJ1Z0FkbWluaXN0cmF0aW9uRXN0YWJsaXNobWVudEluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNHZW5lcmFsU2VydmljZXNBZG1pbmlzdHJhdGlvblJlZ3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTR292ZXJubWVudEFnZW5jeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVBZGRlZFRheFJlZ2lzdHJhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmF0UmVnaXN0cmF0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlQnVzaW5lc3NVc2VRdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVMaWNlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlUmFkaXVzb2ZPcGVyYXRpb25RdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVSZWxhdGVkU2VydmljZXNSZWZlcmVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVTaXplQ2xhc3NRdWFsaWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckFiYnJldmlhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckNoYW5nZUlkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQ2hhbmdlUHJvY2VkdXJlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQ29udHJhY3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcklETnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JPcmRlck51bWJlclN1ZmZpeCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yUHJvZHVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yc1ByZXZpb3VzSm9iTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JUZXJtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyaWZpY2F0aW9uU291cmNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyc2lvbkNvZGVMb2NhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyc2lvbkNvZGVOYXRpb25hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVydGljYWxDb29yZGluYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbEFnZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJhbnNBZG1pbmlzdHJhdGlvbk9yaWdpbmF0b3JJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJhbnNBZmZhaXJzQ2FzZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVklOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaXNhVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVQdXJjaGFzZUFncmVlbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm91Y2hlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm95YWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWdlRGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FpdmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VFbnRyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlUGlja1RpY2tldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlUmVjZWlwdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlU3RvcmFnZUxvY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50eUNvdmVyYWdlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudHlSZWdpc3RyYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldheWJpbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlYXBvblN5c3RlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0QWdyZWVtZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsQ2xhc3NpZmljYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRoZHJhd2FsQWNjb3VudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0aGRyYXdhbFJlY29yZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29vbElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29sVGF4UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrQnJlYWtkb3duU3RydWN0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrQ2FuZGlkYXRlU2VxdWVuY2VOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtDZW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtpbmdTaGlmdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0l0ZW1RdWFudGl0eURldGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtPcmRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1BhY2thZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtTaGlmdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya3NpdGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtUYXNrQ2hhcmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVGVhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWFyZFBvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJab25lIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJdGVtRGV0YWlsIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkJhc2VJdGVtRGV0YWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlByaWNpbmdEZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iRGVsaXZlcnlEZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUm91bmRUcmlwSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxpbmVJdGVtTm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZTdHJ1Y3R1cmVkTm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZOYW1lVmFsdWVTZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxpbmVJdGVtQXR0YWNobWVudHMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZBdHRhY2htZW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikl0ZW1EZXRhaWwiIHR5cGU9Ikl0ZW1EZXRhaWwiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJhc2VJdGVtRGV0YWlsIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkxpbmVJdGVtTnVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkxpbmVJdGVtVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFyZW50SXRlbU51bWJlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkxpbmVJdGVtTnVtYmVyUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iSXRlbUlkZW50aWZpZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkRpbWVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVG90YWxRdWFudGl0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1heEJhY2tPcmRlclF1YW50aXR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZRdWFudGl0eUNvZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPZmZDYXRhbG9nRmxhZyIgdHlwZT0ieGNibEJvb2xlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ2F0YWxvZ1JlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSXRlbUNvbnRyYWN0UmVmZXJlbmNlcyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkNvbnRyYWN0SXRlbSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaXN0T2ZJdGVtUmVmZXJlbmNlcyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlJlZmVyZW5jZUNvZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvdW50cnlPZk9yaWdpbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvdW50cnkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ291bnRyeU9mRGVzdGluYXRpb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb3VudHJ5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZpbmFsUmVjaXBpZW50Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZQYXJ0eUNvZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNvbmRpdGlvbnNPZlNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c01hdGVyaWFscyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkhhemFyZG91cyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNlSXRlbURldGFpbCIgdHlwZT0iQmFzZUl0ZW1EZXRhaWwiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkxpbmVJdGVtTnVtIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCdXllckxpbmVJdGVtTnVtIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZWxsZXJMaW5lSXRlbU51bSIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGluZUl0ZW1OdW0iIHR5cGU9IkxpbmVJdGVtTnVtIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaW5lSXRlbVR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkxpbmVJdGVtVHlwZUNvZGVkIiB0eXBlPSJMaW5lSXRlbVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaW5lSXRlbVR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaW5lSXRlbVR5cGUiIHR5cGU9IkxpbmVJdGVtVHlwZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJMaW5lSXRlbVR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wb25lbnRHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGV4dEl0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaW5lSXRlbU51bWJlclJlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDppbnQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkxpbmVJdGVtTnVtVHlwZUNvZGVkIiB0eXBlPSJMaW5lSXRlbU51bVR5cGVDb2RlIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJCdXllciIvPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaW5lSXRlbU51bWJlclJlZmVyZW5jZSIgdHlwZT0iTGluZUl0ZW1OdW1iZXJSZWZlcmVuY2UiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iTGluZUl0ZW1OdW1UeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSXRlbUlkZW50aWZpZXJzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUGFydE51bWJlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlcnZpY2UiIHR5cGU9InhjYmxCb29sZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJdGVtRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mSXRlbUNoYXJhY3RlcmlzdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb21tb2RpdHlDb2RlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNhdGVnb3J5Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJdGVtSWRlbnRpZmllcnMiIHR5cGU9Ikl0ZW1JZGVudGlmaWVycyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFydE51bWJlcnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VsbGVyUGFydE51bWJlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnROdW0iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQnV5ZXJQYXJ0TnVtYmVyIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydE51bSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ik1hbnVmYWN0dXJlclBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN0YW5kYXJkUGFydE51bWJlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3Vic3RpdHV0ZVBhcnROdW1iZXJzIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mUHJvZHVjdElkZW50aWZpZXJDb2RlZCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPdGhlckl0ZW1JZGVudGlmaWVycyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFydE51bWJlcnMiIHR5cGU9IlBhcnROdW1iZXJzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYXJ0TnVtIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0SUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhcnRJREV4dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmV2aXNpb25OdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhcnROdW0iIHR5cGU9IlBhcnROdW0iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1hbnVmYWN0dXJlclBhcnROdW1iZXIiPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iUGFydE51bSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTWFudWZhY3R1cmVySUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTWFudWZhY3R1cmVyTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWFudWZhY3R1cmVyUGFydE51bWJlciIgdHlwZT0iTWFudWZhY3R1cmVyUGFydE51bWJlciIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvZHVjdElkZW50aWZpZXJDb2RlZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJvZHVjdElkZW50aWZpZXJRdWFsaWZpZXJDb2RlZCIgdHlwZT0iUHJvZHVjdElkZW50aWZpZXJRdWFsaWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcm9kdWN0SWRlbnRpZmllclF1YWxpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9kdWN0SWRlbnRpZmllciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJvZHVjdElkZW50aWZpZXJFeHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiIHR5cGU9IlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUHJvZHVjdElkZW50aWZpZXJRdWFsaWZpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFByb2R1Y3RJZGVudGlmaWNhdGlvbkFzc2lnbmVkQnlUaGVNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmVydGlzaW5nUGFja2FnZUlkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2dyZWdhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclRyYW5zcG9ydGF0aW9uQXNzb2NpYXRpb25Qcm9wcmlldGFyeVJpZ2h0c0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG9jYXRpb25NZXRob2RvbG9neUlkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRlSVNCTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5EZW50YWxBc3NvY2lhdGlvbkNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblRydWNraW5nQXNzb2NpYXRpb25zQXNzZW1ibHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuVHJ1Y2tpbmdBc3NvY2lhdGlvbnNQYXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblRydWNraW5nQXNzb2NpYXRpb25zU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm5pdmVyc2FyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Db21wbGV0aW9uTWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvblN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzYWxQcm9kdWN0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcmFpc2FsU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVJOSUNQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NlbWJseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZW1ibHlMb3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0Q2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29ydGFiaWxpdHlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkUGFydHNMaXN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0aWNUcmFuc21pc3Npb25TZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1eGlsaWFyeVRyYW5zbWlzc2lvblNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV4aWxsYXJ5VHJhbnNtaXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBeGxlUmF0aW8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF4bGVTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhci1Db2RlZFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmF0Y2hOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlYW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV2ZXJhZ2VDb21tb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsYm9hcmRzQ29tbWVyY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbENyZWRpdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxTdWJncm91cENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbmRpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuZE9yTGFiZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlclByaWNlT3BpbmlvblNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c0JvZHlTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyR3JvdW5kU2hhZGVJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDYXRhbG9nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDb2xvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzRW5kUHJvZHVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzRW5naW5lZXJpbmdDaGFuZ2VMZXZlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzSW50ZXJuYWxQcm9kdWN0R3JvdXBDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNRdWFsaWZpZXJGb3JTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNTaXplQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzU3R5bGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc1N1YmxpbmVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQUdFQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuZGlkYXRlT2lsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyeS1PdmVyUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0YWxvZ051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbm5lbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhc3Npc1NlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlbWljYWxBYnN0cmFjdFNlcnZpY2VSZWdpc3RyeU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXNzT2ZDb250cmFjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNMRUlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2duaXphbmNlU3ltYm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xkUm9sbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmVkTkNDTUFPckJhbmtTZXJ2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWlzc2lvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pc3Npb25ZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXR0ZWVGb3JVbmlmb3JtU2VjdXJpdHlJZGVudGlmaWNhdGlvblByb2NlZHVyZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9kaXR5R3JvdXBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vZGl0eU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vbkxhbmd1YWdlRXF1aXBtZW50SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueS1Pd25lZFVuaXRUcmFpbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueVBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhdGlibGVDdXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBlbnNhdGlvbkFsbG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZW5zYXRpb25UeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uY2VwdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpZ3VyYXRpb25JdGVtSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdG9yVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEFjdGl2aXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RCcmVha2Rvd24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Q2hhbmdlQXV0aG9yaXphdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yRXN0YWJsaXNobWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VHJhbnNmZXJSZWFzb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmlidXRpb25ZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5RnJvbVdoaWNoUHJvY3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlPZk9yaWdpbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXBvbkZhbWlseUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXBvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJhZ2VSaXNrVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJhZ2VUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50UHJvY2VkdXJhbFRlcm1pbm9sb2d5Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyQ29tcGFueVJlZ2lzdHJ5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclByb3ZpZGVkRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQXJ0aWNsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhQ2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkRlZmVuc2VJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNpZ25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZUZhbWlseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc2lzQ29kZVBvaW50ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY29udGludWVkUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnRHcm91cGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmlkZW5kVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudElkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2luZ1JldmlzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnVVBDQ29uc3VtZXJQYWNrYWdlQ29kZTEtNC02LTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdVUENTaGlwcGluZ0NvbnRhaW5lckNvZGUxLTItNC02LTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bkFuZEJyYWRzdHJlZXRTdGFuZGFyZFByb2R1Y3RBbmRTZXJ2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHllTG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQU4yLTUtNS0xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQU4tOTlJbi1TdG9yZUNvdXBvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkaXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmQtSXRlbURlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVEaXNwbGFjZW1lbnRJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdDaGFuZ2VMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdEYXRhTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRDb2RlUGVyQ09QQVNTdGFuZGFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50SGllcmFyY2hpY2FsU2VxdWVuY2VJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaGFuZ2VkUGFydE9yQXNzZW1ibHlPclByb2R1Y3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aGliaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aGliaXRJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0TGluZUl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVuZGFibGVDb250YWluZXJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZW5zZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZBQVNlcnZpY2VCdWxsZXRpbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFicmljUGllY2VzUGVyUm9sbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbGVkU3ViYXNzZW1ibHlNb2RlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbGVkU3ViYXNzZW1ibHlTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZUFmZm9yZGFibGVMZW5kaW5nUHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZVByb2plY3RDb25kb21pbml1bUNsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFN1cHBseUNsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWZ0aFdoZWVsU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFRlc3RMb3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFBoYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hMb3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoT3JIYW5kU3RhbmRhcmRSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcmVQdW1wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFByaW9ySWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWVyUHVibGlzaGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVkZGllTWFjQWZmb3JkYWJsZUxlbmRpbmdQcm9kdWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZGRpZU1hY1Byb2plY3RDb25kb21pbml1bUNsYXNzaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbnRBeGxlLVJlYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb250QXhsZURyaXZlblNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbnRBeGxlTm9uRHJpdmVuU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9udEF4bGVTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxUYW5rU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kQWJicmV2aWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kTWFuYWdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZFN1Yi1BZHZpc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0FTRkxPV0ludm9pY2VQb3N0aW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0FTRkxPV1Byb2R1Y3RvclNlcnZpY2VDaGFyZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXRoZXJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlYXJSYXRpbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbFNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyaWNOYW1lRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdsaWRlcktpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkZU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluRGlyZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFwaGljc0luZHVzdHJ5QmFyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdW5kU2hhZGVTdGFuZGFyZFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBRdWFsaWZpZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVElOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJtb25pc2VkU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQ1BDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSElCQy1IZWFsdGhJbmR1c3RyeUJhckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhJQkNTdXBwbGllckxhYmVsaW5nU3RhbmRhcmRQcmltYXJ5RGF0YU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhJRUNQcm9kdWN0T3JTZXJ2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG90Um9sbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUNELTktQ00tUHJvY2VkdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZ25pdGlvbktleU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wcmludC1UcmFkZW1hcmtDb2RlT2ZTdWJzaWRpYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeUNvbW1vZGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uTWVkaWFUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmdyZWRpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VQbGFuRGVzY3JpcHRpb25DaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZXJzRnVuZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyY2hhbmdlYWJpbGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW9yQ29sb3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQXJ0aWNsZU51bWJlcmluZ0Fzc29jaWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQ0QtOS1DTS1EaWFnbm9zaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxIYXJtb25pemVkQ29tbW9kaXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFN0YW5kYXJkQm9va051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0bWVudEZ1bmRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUlNRdWFsaWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVNCTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVNTTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbU1hbmFnZW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtVHlwZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2JTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRMaWZlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVyaXNkaWN0aW9uU3BlY2lmaWNQcm9jZWR1cmVBbmRTdXBwbHlDb2RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2FuYmFuUGxhbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeVNhbXBsZUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5VGVzdENvbmRpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWJyYXJ5T2ZDb25ncmVzc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVPckFubnVpdHlQcm9kdWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZU9yQW5udWl0eVNlcnZpY2VGZWF0dXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmdEdhdGVTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVPZkF1dGhvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZU9mQnVzaW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRTZXF1ZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxseUFzc2lnbmVkQ29udHJvbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxTdG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMT0lOQ0NvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdFByaWNpbmdVbml0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWNoaW5lTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZUluZGV4UGFnZVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFqb3JQcm9kdWN0T3JNYXRlcmlhbE9yTWFjaGluZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVhbFRyYW5zbWlzc2lvblNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJzQXJ0aWNsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyc1BhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldFByb2dyYW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ29udHJvbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsRGlzY2hhcmdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFzdXJlbWVudFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsSW5mb3JtYXRpb25CdXJlYXVBdXRob3JpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsU3RvcExvc3NDb3ZlcmFnZUNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsU3RvcExvc3NMZXZlbENvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsU3RvcExvc3NQcm9kdWN0TGluZUNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUVNQVByb2R1Y3RUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0aG9kT2ZEZWxpdmVyeUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGVzdG9uZUV2ZW50TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeVN0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSUxTUEVDTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VDcmVkaXREYXRhT3JkZXJUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUluc3VyYW5jZVByb2R1Y3RDb2RlT3JOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlUHJvZHVjdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlVW5kZXJ3cml0aW5nVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JWZWhpY2xlSWROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yVmVoaWNsZS1MaW5lRGVzaWduYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92ZW1lbnRUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxEcnVnQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxEcnVnQ29kZTQtNC0yRm9ybWF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbERydWdDb2RlNS0zLTJGb3JtYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRHJ1Z0NvZGU1LTQtMUZvcm1hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxEcnVnQ29kZTUtNC0yRm9ybWF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEhlYWx0aFJlbGF0ZWRJdGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxIZWFsdGhSZWxhdGVkSXRlbUNvZGVJbjQtNkZvcm1hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxIZWFsdGhSZWxhdGVkSXRlbUNvZGVJbjUtNUZvcm1hdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxQcm9kdWN0R3JvdXBDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFJldGFpbEZlZGVyYXRpb25Db2xvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUmV0YWlsRmVkZXJhdGlvblNpemVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFN0b2NrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOREMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld01pY3JvY29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3UmVwbGFjZW1lbnRQYXJ0T3JBc3NlbWJseURlZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dEhpZ2hlckFzc2VtYmx5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0SGlnaGVyVXNlZEFzc2VtYmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25mb3JmZWl0dXJlT3B0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVzYWxlYWJsZUl0ZW1FeGNsdWRpbmdEZXBvc2l0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOU04tTm9ydGhBdGxhbnRpY1RyZWF0eU9yZ2FuaXphdGlvblN0b2NrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVUJDVUI4MkNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVUJDVUI5MkNvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlBvc2l0aW9uc09uTWFjaGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JsaWdhdGlvbkF1dGhvcml0eU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Jzb2xldGVQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkTWljcm9jb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRVUENPckVBTkNhc2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRVUENPckVBTkNvbnN1bWVyUGFja2FnZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZFVQQ09yRUFOTW9kdWxlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkVVBDT3JFQU5NdWx0aXBhY2tDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvckFzc2lnbmVkUHJvcGVydHlJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3Bwb3NpdGUtSGFuZFBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGljYWxDYWJsZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGljYWxJbmR1c3RyeVByb2R1Y3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEVxdWlwbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZVByb2R1Y3Rpb25PcGVyYXRpb25TaGVldE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmdEcmF3aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmdTcGVjaWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0RHJhd2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydE51bWJlckRlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0UmVmZXJlbmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXR0ZXJuTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQVNDQ0VDLUdvb2RzQW5kU2VydmljZXNUYXhGb3J3YXJkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBU0NDRUMtR29vZHNBbmRTZXJ2aWNlc1RheE5vdEFwcGxpY2FibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBU0MtTm9uVHVidWxhckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBU0NPTUMtR29vZHNBbmRTZXJ2aWNlc1RheEZvcndhcmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEFTQ09NQy1Hb29kc0FuZFNlcnZpY2VzVGF4Tm90QXBwbGljYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtQWNjb3VudGFudHNTb2NpZXR5T2ZDYW5hZGFUdWJ1bGFyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZWNlc0luUm9sbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlnZ3liYWNrQ29tbWVyY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmVUcmFuc2FjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudEVxdWlwbWVudE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lGb3JtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkTWFudWZhY3R1cmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWROYXRpb25hbFN0b2NrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRQYXJ0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtUmF0ZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1Vc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNTYW1wbGVJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VMb29rVXBOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1lQ29udHJhY3RvclBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW50Q29sb3JTdGFuZGFyZFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbnRPckRyYXdpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RPclNlcnZpY2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdENoYW5nZU5vdGljZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdERhdGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0SWRBdHRyaWJ1dGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RWZXJzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbURlc2NyaXB0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbUxldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25hbFZhcmlhbnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5QW5kQ2FzdWFsdHlTZXJ2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1Ymxpc2hlckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlcnNJdGVtQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2Vyc09yZGVyTGluZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVycG9zZU9mSW5zdXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWNrTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpYXRvclNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHJvYWQtT3duZWRVbml0VHJhaW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhbmRvbVdlaWdodEFnZ3JlZ2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZURldGFpbENhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVQcm9wZXJ0eUluZm9ybWF0aW9uU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhckF4bGVFeHRlbmRlZFRhZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhckF4bGVGcm9udFJlYXJEcml2ZW5TZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXJBeGxlTWlkZGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyQXhsZVB1c2hlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhckF4bGVSZWFyRHJpdmVuU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyQXhsZVJlYXJOb25Ecml2ZW5TZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXJBeGxlU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyQXhsZVRhZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFtYXRpb25Qcm9jZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmRLZWVwaW5nT3JNb2RlbFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWZlclNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlbFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZU9pbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmaW5lZFByb2R1Y3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkTW9kZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRNb2RlbFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRQb2xpY3lJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVWYWx1ZVVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpZ2lvdXNSZXRhaWxOb24tQm9va0l0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckZyb21Qcm9kdWN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlySW5kdWN0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyVGFnTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlZFBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50TmF0aW9uYWxTdG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRQcm9kdWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudFN1YmFzc2VtYmx5TW9kZWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50U3ViYXNzZW1ibHlTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc291cmNlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRhaWxQTFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmFibGVDb250YWluZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvbGxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvbGxTZXF1ZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlNLTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdW5OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUHJlc2VudGF0aW9uSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZW1hdGljRGlhZ3JhbVJlZmVyZW5jZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhdFNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5UGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRQcmlvcklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb25QcmludE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0RhdGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzTG90TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJpYWxJdGVtQW5kQ29udHJpYnV0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJpZXNJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ29kZVBlckNPUEFTU3RhbmRhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDb250cm9sSWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VGZWF0dXJlSUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VSZW5kZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50T3JQYXlvdXRPcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWxmLUxpZmVBY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsZi1MaWZlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpZnRXb3JrZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZGVVcE9yU2lkZURvd24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraWxsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0tVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGFiTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGVlcGVyQm94S2V5TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGVlcGVyQm94U2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTk9NRUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvZnR3YXJlUmV2aXNpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU9mRGVwb3NpdENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU9mTGVhZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxNYXRlcmlhbElkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1NDQy0xOEFuZEFwcGxpY2F0aW9uSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRHcm91cE9mUHJvZHVjdHMtTWl4ZWRBc3NvcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZEluZHVzdHJpYWxDbGFzc2lmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlTGFiZWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVNhbXBsZUlkZW50aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R5bGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmxpbmVJdGVtTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXNzaW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzaXN0ZW5jZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRlUHJvZHVjdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VidG9waWNMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJzZWRlZFBhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVyc2VkZWRQdXJjaGFzZU9yZGVyTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckJyYW5kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJDb21wYW55UmVnaXN0cnlOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc0FydGljbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc1N1cHBsaWVyQXJ0aWNsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ludGhldGljTHViZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFDVENvbW1vZGl0eUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbE1hbnVhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbFBoYXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlY29tbXVuaWNhdGlvbnNDaXJjdWl0SWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21tdW5pY2F0aW9uc0luZHVzdHJ5U2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21TZXJ2aWNlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lSW5kdXN0cnlNYW51ZmFjdHVyZXJDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0ZWRNYXRlcmlhbElkZW50aWZpY2F0aW9uTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUHJpb3JJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lQ29tcGxpYW50VGVjaG5pY2FsT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9waWNMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVJbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyQ2FzZVNlcmlhbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXNzaW9uU2VyaWFsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRHcm91cE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXN1cnlNYW5hZ2VtZW50QXNzb2NpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJ5TWFuYWdlbWVudEFzc29jaWF0aW9uU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWFzdXJ5TWFuYWdlbWVudEFzc29jaWF0aW9uU2VydmljZUNvZGVBbmRCYW5rU2VydmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudENvZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja0JvZHlTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVTZWx2YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQ0NPckVBTi0xMjhDb3Vwb25FeHRlbmRlZENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ3VzdG9tZXJzQXJ0aWNsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU5DQ1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyd3JpdGluZ01ldGhvZE9mRGlyZWN0V3JpdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtU3RvY2tTeW1ib2xTeXN0ZW1Db2RlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzYWxQcm9kdWN0TnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTk51bWJlckRhbmdlcm91c0dvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ09yRUFOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENDYXNlQ29kZU51bWJlcjEtMS01LTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ0NvbnN1bWVyUGFja2FnZUNvZGUxLTUtNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDQ29uc3VtZXJQYWNrYWdlQ29kZTEtNS01LTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ0NvdXBvbkNvZGUxLTUtNS0xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENPckVBTkNhc2VDb2RlMi01LTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ09yRUFOQ29uc3VtZXJQYWNrYWdlQ29kZTItNS01Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENPckVBTkNvdXBvbkNvZGUyLTUtNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDT3JFQU5Nb2R1bGVDb2RlMi01LTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ09yRUFOTXVsdGlwYWNrQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDT3JFQU5TaGlwcGluZ0NvbnRhaW5lckNvZGUxLTItNS01LTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ1NoaXBwaW5nQ29udGFpbmVyQ29kZTEtMi01LTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ1N1ZmZpeCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDU3VmZml4LURlZmluZXNQYWNraW5nVmFyaWF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlci1EZWZpbmVkU2hpcHBpbmdDb250YWluZXJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVVk1SUE1MaW5lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVZNVUxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhcmlhYmxlTWVhc3VyZVByb2R1Y3RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXJ5SXRlbVByb2R1Y3ROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVNYWludGVuYW5jZVJlcG9ydGluZ1N0YW5kYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQWxwaGFudW1lcmljU2l6ZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckNvbG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JHcm91bmRTaGFkZUlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcnNDYXRhbG9nTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JzSXRlbU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yc1BhcnROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcnNCYXNpY1VuaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcnNFbmdpbmVlcmluZ0NoYW5nZUxldmVsTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JzT3JkZXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvclNwZWNpZmljYXRpb25OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcnNTdHlsZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yc1N1cHBsZW1lbnRhbEl0ZW1OdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpbnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZVNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lVHlwZUlkZW50aWZpY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lVXNhZ2VJZGVudGlmaWNhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZmVyTG90SWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlZWxDaGFpckxpZnRTZXJpYWxOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2xlbkN1dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29vbGVuUnVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVGFza051bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1VuaXROdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmxkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWFybkNvdW50LUVuZ2xpc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Illhcm5Db3VudC1NZXRyaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Illhcm5Db3VudFdvcnN0ZWQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiIHR5cGU9Ikxpc3RPZlByb2R1Y3RJZGVudGlmaWVyQ29kZWQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkl0ZW1DaGFyYWN0ZXJpc3RpYyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iSXRlbUNoYXJhY3RlcmlzdGljIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZJdGVtQ2hhcmFjdGVyaXN0aWMiIHR5cGU9Ikxpc3RPZkl0ZW1DaGFyYWN0ZXJpc3RpYyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSXRlbUNoYXJhY3RlcmlzdGljIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikl0ZW1DaGFyYWN0ZXJpc3RpY0NvZGVkIiB0eXBlPSJJdGVtQ2hhcmFjdGVyaXN0aWNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJdGVtQ2hhcmFjdGVyaXN0aWNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdXJmYWNlTGF5ZXJQb3NpdGlvbkNvZGVkIiB0eXBlPSJTdXJmYWNlTGF5ZXJQb3NpdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1cmZhY2VMYXllclBvc2l0aW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ikl0ZW1DaGFyYWN0ZXJpc3RpY1ZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVW5pdE9mTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mRGltZW5zaW9uIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJdGVtQ2hhcmFjdGVyaXN0aWMiIHR5cGU9Ikl0ZW1DaGFyYWN0ZXJpc3RpYyIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJJdGVtQ2hhcmFjdGVyaXN0aWNDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFNlY3RvcmlhbENoYXJhY3RlcmlzdGljcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9sQmV2ZXJhZ2VDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbEJldmVyYWdlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuYXRvbWljYWxPcmlnaW5PZlNhbXBsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwZWFyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJ0aXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NlbWJseVJlcXVpcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGFuY2VPdXRBcnRpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNpc1dlaWdodFNpemUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlaGluZC10aGUtQ291bnRlckRydWdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXZlcmFnZUFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV2ZXJhZ2VCcmFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV2ZXJhZ2VDYXRlZ29yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV2ZXJhZ2VDb250YWluZXJDaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJldmVyYWdlRmxhdm91ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV2ZXJhZ2VTZWdtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3R0b21ob2xlTG9jYXRpb25NZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdHRvbWhvbGVQcmVzc3VyZU1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmRHcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmRHcm91cC1BR3JvdXBpbmdPZlNpbWlsYXJCcmFuZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cmVhdW9mQWxjb2hvbFRvYmFjY29BbmRGaXJlYXJtc0NsYXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVyZWF1T2ZBbGNvaG9sVG9iYWNjb0FuZEZpcmVhcm1zVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0NvbG9yRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0l0ZW1TaXplRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2luZy1MaW5lci1UdWJpbmdUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNpbmdPckxpbmVyVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZkNvbmZvcm1pdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZW1pY2FsRmFtaWx5TmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlbWlzdHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSUQtQ29tbWVyY2lhbEl0ZW1EZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hdGluZ09yUGFpbnRTeXN0ZW1Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2F0aW5nT3JQYWludFN5c3RlbU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxhdGVyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3Rpb25NZXRob2RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sb3ItTG93ZXJCb2R5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xvci1VcHBlckJvZHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxTdGF0dXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vbkNoZW1pY2FsTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUZpZWxkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxpYW5jZU1ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9zZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbmVkQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RydWN0aW9uTWV0aG9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1hYmxlUmVzb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVySW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sSXRlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZFN1YnN0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZFN1YnN0YW5jZS1DbGFzczIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRTdWJzdGFuY2UtQ2xhc3MzTmFyY290aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRTdWJzdGFuY2UtQ2xhc3MzTk5vbi1uYXJjb3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZFN1YnN0YW5jZS1DbGFzczQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRTdWJzdGFuY2UtQ2xhc3M1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29yZGluYXRlRGVzY3JpcHRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29yZGluYXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycm9zaW9uUmVzaXN0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRBcnRpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50QXJ0aWNsZVNwYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1NwZWNpZmljYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VGYXVsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW5zaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaW1lbnNpb25hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0aW9uYWxJbmRpY2F0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BlcnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvc2FnZUZvcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdFZmZpY2FjeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z0VmZmljYWN5U3R1ZHlJbXBsZW1lbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHllTG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEeWVMb3REZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRnZVRyZWF0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJpY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljYWxseUNsZWFuZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNGaWVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kcy1TbGl0dGluZy1TcGxpdHRpbmctQ3V0dGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kVHJlYXRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRVc2VBcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmV3aXRoVHJhbnNtaXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY3Jvd0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV1cm9wZWFuQ29tbXVuaXR5Umlza0NsYXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWJyaWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhYnJpY0Rlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsdXJlQW5hbHlzaXNQcm9jZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGRURTUEVDLUZlZGVyYWxTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGRUQtU1RELUZlZGVyYWxTdGFuZGFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmliZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpYnJlVG93Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZENvZGUtRUlBT3JET0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkVGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsYW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbHRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hPclN1cmZhY2VSb3VnaG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXZvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmx1aWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvbGRDb25maWd1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb250Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdERldmlhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybXVsYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhZ3JhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsUGVyZm9ybWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1cnRoZXJJZGVudGlmeWluZ0NoYXJhY3RlcmlzdGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxNZXJjaGFuZGlzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbFByb2R1Y3RGb3JtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmljRHJ1ZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFpbkRpcmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhcGVWYXJpZXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkUmF0aW5nU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhBbmRCZWF1dHlBaWRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0VHJlYXRPckFubmVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSHlkcmF1bGljcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5ncmVkaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFNhbXBsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5qZWN0YWJsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktleS1Xb3JkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm91ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3VyRG91YmxlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3VyT3ZlcnRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWRPckNvcHBlclNhbXBsZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlZFJlc291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1pdGluZ09wZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTHVzdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWNoaW5lUnVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWduZXRpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFqb3JHcmFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ01ldGhvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ1Byb2Nlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldFNlZ21lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbERlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFJlc291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFN0YXR1cy1PdXRzaWRlUHJvY2Vzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWNoYW5pY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsU3VwcGxpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGFsbG9ncmFwaGljIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSUxTUEVDLU1pbGl0YXJ5U3BlY2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU1TQkxNLUluZGlhbkxhbmRQcm9wZXJ0eU9yVW5pdE51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9pc3R1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpLU1lZGlhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdXNpY1N0eWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdXR1YWxseURlZmluZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0FydGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1IYXphcmRvdXNNYXRlcmlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVByZXNjcmlwdGlvbkRydWciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblJlY3VycmluZ1Jlc291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdXRyaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ic29sZXRlQXJ0aWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Rvcml6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWVudGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckRpcmVjdFJlc291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclBoeXNpY2FsRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXItdGhlLUNvdW50ZXJEcnVnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdlSW50ZWdyaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJhbWV0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdHRlcm4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnRhZ2VPZkFsY29ob2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmZvcmF0aW9uQ29udGludWl0eUluZGljYXRvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9yYXRpb25JbnRlcnZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9yYXRpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0tQWVyb3NvbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtLUFzRGlsdXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtLUNvbmNlbnRyYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0tRW11bHNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybS1HYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybS1MaXF1aWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybS1Qb3dkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybS1TZW1pc29saWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybS1Tb2xpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZUNvdXBsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZVN0cmVhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlY2F1dGlvbmFyeUluc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uRHJ1ZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGF0aW9uRWZmZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZXJ2YXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlHcmFwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbnRPcmllbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZUxhYmVsTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc0FjdGlvblRha2VuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzT3JQcm9kdWN0aW9uVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdEFwcGxpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0RGF0YUJhc2VNYW5hZ2VtZW50RGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RMaWZlQ3ljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RTdWJqZWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25hbEV2ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25hbE9mZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcHJpZXRhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY0luZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaXNoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmVGb3JtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXQtdXBEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUFzc3VyYW5jZVN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eS1RdWFsaXR5TGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZGluZ01lZGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjdXJyaW5nUmVzb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3ljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnVyYmlzaGVkQXJ0aWNsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdG9yeU9yU3RhdGVEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdG9yeS1TdGF0ZU9yRW50aXR5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN0YXRlZEFydGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdGlvblJlYXNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZXJ2b2lyQ29kZS1Db21wYW55Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN1bHRzTWV0aG9kQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aXNlZEFydGljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlzZWREZXNpZ24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlT2ZBZG1pbmlzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5R3JhcGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3JldE9yQ29uZmlkZW50aWFsSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb25Qcm9maWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJpZXNUaXRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUZlYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbGYtTGlmZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWxmVGFnIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ1VuaXRDb21wb25lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBUb0xpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBUb1N0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWxob3VldHRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXplU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpZXR5R292ZXJubWVudEFuZE9yQ3VzdG9tZXJTcGVjaWZpY2F0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sdWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQ29udHJvbGxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUFuZERpc3BsYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0UmVzb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Yi1Qcm9kdWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlQ29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlTG9jYXRpb25NZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VQcm90ZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlVHJlYXRtZW50LUNoZW1pY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlVHJlYXRtZW50LU1lY2hhbmljYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bm9ueW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZ0FuZEluc3BlY3Rpb25BZ2VuY2llcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFBhbmVsVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFNhbXBsZURpcmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFNhbXBsZUZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFNhbXBsZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVvcmV0aWNhbFdlaWdodEZvcm11bGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZXJhcGV1dGljQ2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZXJhcGV1dGljRXF1aXZhbGVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocmVzaG9sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlSW5zdXJhbmNlRm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG93Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbGF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHdpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVBbmRPclByb2Nlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVmYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZTYW1wbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZlRlc3QtSW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZVNwaW5uaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JDb2xvckRlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JTaXplRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpbnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpc3VhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sYXRpbGVPcmdhbmljQ29tcG91bmRDb250cm9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVUaXRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudHlEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudHlUeXBlRGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildhc3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXhDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxkc09yU3BsaWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbENsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsRGlyZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsUGVyZm9yYXRpb25Db250aW51aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsUGVyZm9yYXRpb25JbnRlcnZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbFRlc3RUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW5kaW5nSW5zdHJ1Y3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW5lRnJ1aXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbmVHcm93aW5nUmVnaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZYXJuQ291bnQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU3VyZmFjZUxheWVyUG9zaXRpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrT2ZDYWIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGF0ZXJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvbHN0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdGhTaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90dG9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmljayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaW5nSGVhZEZsYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JuZXJEaWFnb25hbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvdWJsZUVuZE92ZXJoYW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3duc3RyZWFtVGFwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWFsRnVlbFRhbmtQb3NpdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVyaW9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9udCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbnRTcGFyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGVMZWZ0UmVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zaWRlUmlnaHRSZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmlvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VsbHlCdXNoaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWZ0RnJvbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZnRSZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzQ3JpdGljYWxTdXJmYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlkZGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3JlQ3JpdGljYWxTdXJmYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFJlbGF0aXZlUG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFNwZWNpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lU2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25TdXJmYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHBvc2l0ZUNvcm5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVMZWZ0UmVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZVJpZ2h0UmVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcmFsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhclNwYXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjEwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjE2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjE5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjIzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjI2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjI5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjMzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjM2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjM5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQ2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjUwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb244Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnRmxvb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWdodEZyb250Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWdodFJlYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZGVPbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZGVUd28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVFbmRPdmVyaGFuZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sdWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BhcmVUaXJlUG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJib2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWNjbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViLVNlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0JvdHRvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vdGhCdWNjYWxTdXJmYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb290aERpc3RhbFN1cmZhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb3RoRmFjaWFsU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vdGhJbmNpc2FsU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vdGhMaW5ndWFsU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vdGhNZXNpYWxTdXJmYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb290aE9jY2x1c2FsU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUd29TaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJDYWIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWxhdGVyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcHN0cmVhbVRhcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29vZCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVW5pdE9mTWVhc3VyZW1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlVPTUNvZGVkIiB0eXBlPSJVT01Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJVT01Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJVbml0T2ZNZWFzdXJlbWVudCIgdHlwZT0iVW5pdE9mTWVhc3VyZW1lbnQiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVU9NQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjE0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjE3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjI2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjI5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjMyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQ2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjUwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjU0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjU4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjYxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjY0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjcxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI3MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijc0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI3NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNzciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijc4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI4MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iODEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijg0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI4NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iODYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijg3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI4OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijk0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijk3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMkIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIySSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMkoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMk0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMlEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMlYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMlkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM0MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM0ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0QyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0SCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0SyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0TiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0USIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0VSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1QSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1RSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1SCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1SyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTEwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTE2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTE5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTI3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTM0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTM3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQ4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNDkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTUyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTU1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTU4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTYwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTYzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTY2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTY5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTcwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTc0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTc3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNzgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTgxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTg0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTg3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE5MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE5NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTk1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE5NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTk4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFNUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFOTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFQWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIxMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjEyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIxNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIxOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjI3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjMyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjM1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjM4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMzkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQ1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQ4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjUyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjU1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjU4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjYyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjY1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjY5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjcwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjczIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjc2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjc5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjgxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCODMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI4NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjg1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCODYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI4NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjg4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCODkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjkyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5NCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjk1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjk4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkZUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJIUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQklMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQksiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJMTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJVSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzEyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzE4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzIzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzI2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzI5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzMzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMzQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzM2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMzgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQ3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzUxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzU0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzU3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzYxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzY0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzY3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM3MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzcxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM3MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzc1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM3NyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzc4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzgwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzgzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzg2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzg5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzkwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzk2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzk5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0NUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0RMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDR00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNLRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNMRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0xUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNNUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ01UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNOVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNUTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNVUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNXQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1dJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1oiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQxMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQxNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDE3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQxOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDI3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQzMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDM0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQzNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDM4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMzkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQ3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDUxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDU0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDU3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ2MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDYzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENjQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ2NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDY2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENjciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ2OSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3MCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDcxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDc0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3NiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDc3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENzkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEODAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4MSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDgyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEODMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDg2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEODciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDg5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDkwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5MiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDk2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5OCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDk5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkREIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRMVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRE1LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJETVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRNVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRQUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFBUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRSQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFJJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRSTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEVE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEV1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFpOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEWlAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkUyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkU1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZBSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRk9UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGVEsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZUUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRloiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkcyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikc3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ZJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0dSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdJQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0lJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdMSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0xMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdSTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1JOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdSVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1dIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1oiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkgxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhBUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEJBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQlgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIR00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSElVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJITFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJITVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhNVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFBBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhUWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5LIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IksxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iks1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0EiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLQkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLRUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0dNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLR1MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktIWiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLSk8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS01IIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktNUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS05JIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTlMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktOVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktQQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1BIIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUE8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktQUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLU0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktTSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktNVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1ROIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLVVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktWQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1ZSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLVlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLV0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktXVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkwyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEJSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQlQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxFRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxKIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMSyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxQQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxUUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFVNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVVgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxYIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik0xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik01Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1BTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUFXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUJFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQkYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1CUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1DVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1GIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNR00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1IIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSFoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1JIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1JTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUlOIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSU8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1JVSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1MRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUxUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1NUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU1UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNT04iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1QQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1RSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVFTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNU0siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVEsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1UUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVRSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1WIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1XIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNV0giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1YIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik4xIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQVIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5CIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQkIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5DIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQ0wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5EIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkVXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5IIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTklVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5NSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk1QIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlBMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5QVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5SIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5UIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5VIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT0hNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT05aIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9aIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPWkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9aSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlAxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlA0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlA3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEdMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUE4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFREIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBUTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBWIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBaIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlEzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUTUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlE2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFBTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUUsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRUyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFURCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUVRJIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRVEwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFUUiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlI5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUksiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUk4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJPIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlBNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSUFMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlMzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUzUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlM2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUzgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQU4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNDTyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0NSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0hUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU01JIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU08iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTU1QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVEkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUTiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTWCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQ3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJURCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRGIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEoiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlROIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTkUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUFIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRRIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUkwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRTIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUU0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRTSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRVIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRZIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlUzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVMIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkxUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVlMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZUIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVzQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldBIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXQiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0NEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXRSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0VCIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXRUUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldHIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXSCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0hSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXSSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV00iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXU0QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldUVCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1ciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlgxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZREsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllEUSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllSRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWVQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IloxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ilo0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ilo4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaUCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRGltZW5zaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJEaW1lbnNpb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkRpbWVuc2lvbiIgdHlwZT0iTGlzdE9mRGltZW5zaW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaW1lbnNpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEaW1lbnNpb25Db2RlZCIgdHlwZT0iRGltZW5zaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGltZW5zaW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGltZW5zaW9uIiB0eXBlPSJEaW1lbnNpb24iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1lYXN1cmVtZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1lYXN1cmVtZW50VmFsdWUiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNZWFzdXJlbWVudFJhbmdlIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJVbml0T2ZNZWFzdXJlbWVudCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWVhc3VyZW1lbnQiIHR5cGU9Ik1lYXN1cmVtZW50Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZWFzdXJlbWVudFZhbHVlIj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkIiB0eXBlPSJTaWduaWZpY2FuY2VDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZCIgdHlwZT0iQ29uZGl0aW9uc0NvZGUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNZWFzdXJlbWVudFZhbHVlIiB0eXBlPSJNZWFzdXJlbWVudFZhbHVlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3hpbWF0ZWx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVhbFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmVhdGVyVGhhbk9yRXF1YWxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JlYXRlclRoYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzVGhhbk9yRXF1YWxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90RXF1YWxUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWVWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JzZXJ2ZWRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0T2ZSYW5nZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDb25kaXRpb25zQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoZXJlQWlyRXF1YWxzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlcmVCdXR5bEFjZXRhdGVFcXVhbHMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGVyZUgyT0VxdWFsczFPcldhdGVyRXF1YWxzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkVG82MERlZ3JlZXNGYWhyZW5oZWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGVyZVRvbHVlbmVFcXVhbHMxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXBvckluQWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXBvckluT3RoZXJUaGFuQWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFRlbXBlcmF0dXJlQW5kUHJlc3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbnNPdGhlclRoYW5TdGFuZGFyZFRlbXBlcmF0dXJlQW5kUHJlc3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluRXRoeWxBbGNvaG9sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbkV0aHlsRXRoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluV2F0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0MUF0bW9zcGhlcmVQcmVzc3VyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlcmVFdGhlckVxdWFsczEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZGljdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXItRHJpZWRCYXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXMtUmVjZWl2ZWRCYXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ5QmFzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlsaWJyaXVtQmFzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vaXN0dXJlQW5kQXNoLUZyZWVCYXNpcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3hpZGl6aW5nQXRtb3NwaGVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkdWNpbmdBdG1vc3BoZXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2FsZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGNoZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyYXRlZFZhcG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmNvbmRpdGlvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9ydC1UZXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lLVdlaWdodGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuY29ycmVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZQZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPblBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyR2FsbG9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWRvbWluYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuYW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZU93bmVkT3JDb3Jwb3JhdGVPd25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRlZE9yQmxvY2tlZFVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudExpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdFdoZW5Tb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc0lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc1JlcGFpcmVkT3JJbXByb3ZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFudGFuZW91cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dUb0dvb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1RvSGlnaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93VG9NZWRpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1RvTW9kZXJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaXVtVG9Hb29kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpdW1Ub0hpZ2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVyYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlcmF0ZVRvR29vZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZXJhdGVUb0hpZ2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVyYXRlVG9NZWRpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RUb0hpZ2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG9jYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jcmVhc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsaW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3RlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXJPbi1QZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXJNaWQtUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyT2ZmLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lclN1cGVyT24tUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyU3VwZXJPZmYtUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyT24tUGVhayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyTWlkLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlck9mZi1QZWFrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXJTdXBlck9uLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlclN1cGVyT2ZmLVBlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lckRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyTmlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlckRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyTmlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5pZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWFrLTIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlYWstMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVhay00Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG91bGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uVGltZVJlbGF0ZWREZW1hbmQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1lYXN1cmVtZW50UmFuZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWluaW11bVZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNYXhpbXVtVmFsdWUiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik1lYXN1cmVtZW50UmFuZ2UiIHR5cGU9Ik1lYXN1cmVtZW50UmFuZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1pbmltdW1WYWx1ZSI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZCIgdHlwZT0iU2lnbmlmaWNhbmNlQ29kZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWQiIHR5cGU9IkNvbmRpdGlvbnNDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWluaW11bVZhbHVlIiB0eXBlPSJNaW5pbXVtVmFsdWUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1heGltdW1WYWx1ZSI+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZCIgdHlwZT0iU2lnbmlmaWNhbmNlQ29kZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWQiIHR5cGU9IkNvbmRpdGlvbnNDb2RlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWF4aW11bVZhbHVlIiB0eXBlPSJNYXhpbXVtVmFsdWUiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGltZW5zaW9uQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdE5ldFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdEdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE5ldFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxHcm9zc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbUdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXROZXRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVW5pdHNQZXJQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhdENvbnRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NUb25uYWdlT2ZUaGVWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFRvbm5hZ2VPZlRoZVZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSHVtaWRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvd2VyQ29uc3VtcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXREaXNzaXBhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRmxvdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvY2tJbXBhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGl2ZVRlbXBlcmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25PcGVyYXRpdmVUZW1wZXJhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJDb250ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5zaWxlU3RyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWJyb3NpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdWdlTGVuZ3RoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmFpZ2h0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1XZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodE9mQ29udmV5YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmV5YW5jZVN1bW1lckRlYWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcml6ZWRDYXJnb09uVmVzc2Vsc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUNvbnRhaW5lcml6ZWRDYXJnb09uVmVzc2Vsc1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0QXNjZXJ0YWluZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbE92ZXJhbGxMZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmdNZXRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQXhsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0UG9zaXRpb25JblRoZUxlbmd0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kUG9zaXRpb25JblRoZUxlbmd0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRQb3NpdGlvbkluVGhlV2lkdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFBvc2l0aW9uSW5UaGVXaWR0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRQb3NpdGlvbkluVGhlVGhpY2tuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRQb3NpdGlvbkluVGhlVGhpY2tuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb250YWluZXJBY3R1YWxGaWxsaW5nV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb250YWluZXJNYXhpbXVtQ2FwYWNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmVkTmV0V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nSGVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFja2luZ0hlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY3VsYXRlZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVycml0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wdXJpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluU2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFudGhhbmlkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsYXN0aWNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWluZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhbGxpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cm9udGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50U3RvcmFnZUxpbWl0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvYWN0aXZlSW5kZXhPZlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9hY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZUdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkRHJhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmdGVyRHJhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudEdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFRyYW5zcG9ydEVxdWlwbWVudEdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2lkaXR5T2ZKdWljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuZXRyb21ldHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXJvZmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWljZVdlaWdodFBlcjEwMEdyYW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcnVpdFNraW5Db2xvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuZ2xlT2ZCZW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZEluY3JlbWVudGFsTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cm9mZWxEMTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cm9mZWxEMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cm9mZWxENTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1TdGFja2luZ1dlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NNZWFzdXJlQ3ViZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudGFnZUZhdENvbnRlbnRJbkRyeU1hdHRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FjY2hhcm9tZXRyaWNDb250ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIeWRyYXRlQ29udGVudE9mQW5BbGNvaG9saWNQcm9kdWN0QWZ0ZXJCb3R0bGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5oeWRyb3VzQ29udGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVkV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFraW5nTG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGludW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbHZlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZVdhdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5QZXRyb2xldW1JbnN0aXR1dGVHcmF2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Hcm9zc09ic2VydmVkVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Hcm9zc1N0YW5kYXJkVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtTmV0U3RhbmRhcmRWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsT24tQm9hcmRRdWFudGl0eS1BZnRlckRpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtVG90YWxDYWxjdWxhdGVkVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Ub3RhbE9ic2VydmVkVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbm5hZ2VHYXVnZURpc3RhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1OZXRTdGFuZGFyZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VkaW1lbnRBbmRXYXRlckluUGV0cm9sZXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYnNlcnZlZFJlZmVyZW5jZUhlaWdodC1UYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VIZWlnaHQtVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWxsYWdlR2F1Z2VEaXN0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbUNvcnJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvd1RvQnJpZGdlRGlzdGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyaWdodG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYWtlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFraW5nU3RyZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFraW5nU3RyZW5ndGhXZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2lzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbG91ciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGVudHNPZlBhY2thZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcmVMZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uV2VpZ2h0QWdyZWVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFtZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsdGFWYWx1ZUwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcHRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW5pZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RhbmNlQmV0d2VlblBvaW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lkdGgtQm94Y2FyRG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkTmV3V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbG9uZ2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZpY2l0V2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxhbWVudENvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25naXR1ZGluYWxGbGF0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zdmVyc2VGbGF0bmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1dlaWdodC1NYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJkbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVpZ2h0LU1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlaWdodERpbWVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wYWN0RW5lcmd5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGVEaWFtZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlbmd0aC1NYXhpbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5ndGhEaW1lbnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1XZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vaXN0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxOZXRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVEaWFtZXRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlU3RyZXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyVG9ubmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlSHVtaWRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lzdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2Nrd2VsbEMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYW1XZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZHVjdGlvbk9mQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVuLVByb2Nlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGlvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBlcmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlja25lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodFBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlaWdodC1WYW5Eb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWR0aC1WYW5Eb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRQZXJVbml0T2ZBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWR0aERpbWVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lkdGgtTWF4aW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRQZXJVbml0T2ZMZW5ndGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZGVIZWlnaHQtRmxhdEJlZFdpdGhSZW1vdmFibGVTaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNxdWFyZW5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb29sU2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWllbGRTdHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdW1pbml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJzZW5pYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9yb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpc211dGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmJvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY2l1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sdW1iaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNobG9yaW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2JhbHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNocm9taXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3BwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklyb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklyb25QbHVzU2lsaWNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VybWFuaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIeWRyb2dlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG90YXNzaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWduZXNpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmdhbmVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9seWJkZW51bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTml0cm9nZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvZGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmlvYml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmlja2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeHlnZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBob3NwaG9ydXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bHBodXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGltb255Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxlbml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lsaWNvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lsaWNpdW1PeHlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbnRhbGl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsbHVyaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRhbml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFuYWRpdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1bmdzdGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXN0ZUNvbnRlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlppbmMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlppcmNvbml1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZVRlbXBlcmF0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRUZW1wZXJhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29PcGVyYXRpbmdUZW1wZXJhdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RW1lcmdlbmN5VGVtcGVyYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENvbnRyb2xUZW1wZXJhdHVyZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUXVhbnRpdHkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHlWYWx1ZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5UmFuZ2UiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlVuaXRPZk1lYXN1cmVtZW50Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eSIgdHlwZT0iUXVhbnRpdHkiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlF1YW50aXR5VmFsdWUiPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWQiIHR5cGU9IlNpZ25pZmljYW5jZUNvZGUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkIiB0eXBlPSJDb25kaXRpb25zQ29kZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlF1YW50aXR5VmFsdWUiIHR5cGU9IlF1YW50aXR5VmFsdWUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlF1YW50aXR5UmFuZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWluaW11bVZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNYXhpbXVtVmFsdWUiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlF1YW50aXR5UmFuZ2UiIHR5cGU9IlF1YW50aXR5UmFuZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlF1YW50aXR5Q29kZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlF1YW50aXR5Q29kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlF1YW50aXR5Q29kZWQiIHR5cGU9Ikxpc3RPZlF1YW50aXR5Q29kZWQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlF1YW50aXR5Q29kZWQiPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iUXVhbnRpdHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eVF1YWxpZmllckNvZGVkIiB0eXBlPSJRdWFudGl0eVF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUXVhbnRpdHlRdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eUNvZGVkIiB0eXBlPSJRdWFudGl0eUNvZGVkIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlF1YW50aXR5UXVhbGlmaWVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFibGVVbnNlcnZpY2VhYmxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUGF5YWJsZUF2ZXJhZ2VPdmVyZHVlRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNQbGFjZWRGb3JDb2xsZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlQWNjb3VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUNvbnRyYWN0c0RlbGlucXVlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUNvbnRyYWN0c0RlbGlucXVlbnQtQnV5aW5nUGFydHlDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUNvbnRyYWN0c0RlbGlucXVlbnQtQ29udHJhY3RvckNhdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlQ29udHJhY3RzRGVsaW5xdWVudC1Vbmtub3duQ2F1c2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVJbmdyZWRpZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVJbmdyZWRpZW50RG9zZVBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUluZ3JlZGllbnREb3NlUGVyVW5pdERpc3BlbnNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlTGluZUl0ZW1zRGVsaW5xdWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlTGluZUl0ZW1zRGVsaW5xdWVudC1CdXlpbmdQYXJ0eUNhdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlTGluZUl0ZW1zRGVsaW5xdWVudC1Db250cmFjdG9yQ2F1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVMaW5lSXRlbXNEZWxpbnF1ZW50LVVua25vd25DYXVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUxpc3RpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVNYWludGVuYW5jZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXR5Q29kZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbEhvdXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxTdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFVuaXRzQ3VtdWxhdGl2ZVRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkZWRFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxEZW1hbmRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFByb21vdGlvblNhbGVzRm9yZWNhc3RRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFJlcGxlbmlzaG1lbnREZW1hbmRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFVzYWdlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkQ29ycmVjdG9yUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFRvSW52ZW50b3J5UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZUF0RGVhdGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZWRBY3RpdmVMaW5lSXRlbXNEZWxpbnF1ZW50LUNvbnRyYWN0b3JDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZWRMaW5lSXRlbXNDb21wbGV0ZWQtQ29udHJhY3RvckNhdXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlZExpbmVJdGVtc0RlbGlucXVlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZUhpZ2hWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlTG93VmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZU1vZGlmeWluZ1VuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VOZWFyZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VOZXh0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZU9mRmluYW5jaWFsSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZ3JlZ2F0ZUJlbmVmaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmljdWx0dXJhbFdvcmtlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmNyYWZ0UmFkaW9zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJsaW5lQXR0ZW5kYW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb2NhdGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG90dGVkVXNhZ2VRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxUaW1lQnV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbW9ydGlzYXRpb25RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1vcnRpemF0aW9uQ3VtdWxhdGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtb3J0aXphdGlvbk9yZGVyUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtb3J0aXphdGlvblRlcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtb3J0aXphdGlvblRvdGFsUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGljaXBhdGVkTGVuZ3RoT2ZTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZhbE9yT2ZmZXJEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92ZWRBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJveGltYXRlTnVtYmVyT2ZIb2xkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3hpbWF0ZU51bWJlck9mVW5pdHNGb3JTYWxlUHJvamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3hpbWF0ZU51bWJlck9mVW5pdHNQcm9qZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyZWFEYW1hZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhT2ZMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYVBlclVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJlc3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc0lzUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0U2VpemVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXRDb21wbGV0ZVZhcmlhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdENvbXBsZXRpb25RdWFudGl0eUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0ZW5kYW50LUhhbmRsZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVjdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1ZGl0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcmlzZWRTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRSZXRlbnRpb25MZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZVJlc291cmNlVGFza1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZUVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZU51bWJlck9mRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBeGxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja29yZGVyTGluZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tvcmRlclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rUmVqZWN0SXRlbUNvdW50LiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua3J1cHRjeVBldGl0aW9uc0ZpbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXRocm9vbUNvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXRocm9vbXNGaW5pc2hlZEFyZWFBYm92ZUdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWRyb29tQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZHJvb21zRmluaXNoZWRBcmVhQWJvdmVHcmFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5uaW5nU2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsYWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdVbml0UGVyUHJpY2luZ1VuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRoV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGFua1ZvdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9vZFJlY29yZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va0ludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va09yZGVyUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2hMb2NhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaExvY2F0aW9uc0xlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoTG9jYXRpb25zT3duZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaE9mZmljZUxvY2F0aW9uc0VzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJvdGhlcnNEZWNlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJvdGhlcnNMaXZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0QXRDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0Q3VtdWxhdGl2ZVRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0ZWRIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NDbGFzc0ZhaWx1cmVJbmNpZGVuY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0ZhaWx1cmVDbGFzc0luY2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NGYWlsdXJlSW5kdXN0cnlJbmNpZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRmFpbHVyZU5hdGlvbmFsQXZlcmFnZUluY2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eXVwT3JCdXlkb3duUmF0ZVBlckJhc2lzUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ5dGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhclVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwaXRhbENoYW5nZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZFJlZ2lzdGVyZWROdXJzZUFuZXN0aGV0aXN0TnVtYmVyT2ZDb25jdXJyZW50UHJvY2VkdXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlc0luQ2FwaXRhbFN0cnVjdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlQ3ViaWNNZWFzdXJlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVEaXN0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZUdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlTGVuZ3RoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlTnVtYmVyT2ZBeGxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZU51bWJlck9mQ29udGFpbmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZU51bWJlck9mUGFja2FnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVOdW1iZXJPZlJhaWxXYWdvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVOdW1iZXJPZlVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZVRhcmVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXJjdWxhdGluZ09pbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0YXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlcmtzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zaW5nU3RhdGVtZW50QmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ1N0b2NrQmFsYW5jZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbzJJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUluc3VyZWQtQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1JbnN1cmVkLUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGF0ZXJhbFJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWl0bWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWl0dGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11bml0eVNlcnZpY2VEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFuaWVzSW5jbHVkZWRJbkNvbnNvbGlkYXRlZEZpbmFuY2lhbFN0YXRlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFuaWVzSW5jbHVkZWRJbkNvbnNvbGlkYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbmllc0luU2FtZUFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJpc29uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlZENvbnRyYWN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkTGluZUl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWRQcm9qZWN0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9uZW50TWV0ZXJSZWFkaW5nQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmN1cnJlbnRJdGVtT3V0cHV0T2ZUb29saW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZERpc2NvdW50SW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lclJlc2VydmVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVhbmNlRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QnV5ZG93biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RCdXl1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDb21wbGV0ZWREZWxpbnF1ZW50LUNvbnRyYWN0b3JDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0TGluZUl0ZW1RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvckF0Q29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JDdW11bGF0aXZlVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdHNDb21wbGV0ZWREZWxpbnF1ZW50LUJ1eWluZ1BhcnR5Q2F1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdHNDb21wbGV0ZWREZWxpbnF1ZW50LVVua25vd25DYXVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyaWJ1dGlvblRvdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25hbE1vYmlsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZpY3Rpb25zU2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcGVyYXRpdmVTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aXZlQWN0aW9uUmVxdWVzdHMtTWV0aG9kQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGl2ZUFjdGlvblJlcXVlc3RzLU1ldGhvZEQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RpdmVBY3Rpb25SZXF1ZXN0cy1NZXRob2RFIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aXZlQWN0aW9uUmVxdWVzdHMtVmVyYmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aXZlQWN0aW9uUmVxdWVzdHMtV3JpdHRlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRlckNsZXJrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnNlU2VnbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmVkLUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJlZC1Fc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpbWluYWxTZW50ZW5jZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlQnVkZ2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlRWFybmVkVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVFZmZlY3RPZlByaW9yUGVyaW9kQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUdhc0luamVjdGlvblZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUdhc1ZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUxpcXVpZEluamVjdGlvblZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZU9pbE9yQ29uZGVuc2F0ZVZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlBY3R1YWxFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eUFjdHVhbE1lYXN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlBY3R1YWxQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlPcmRlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlQcmVjZWRpbmdQZXJpb2RFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVByZWNlZGluZ1BlcmlvZE1lYXN1cmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlQcmVjZWRpbmdQZXJpb2RQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlQcmVjZWRpbmdQZXJpb2RSZWFjaGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5UmVjZWl2ZWRFbmRPZlByaW9yWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbC1EaXNwb3NpdGlvblBlbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uUmVwbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVJlcXVpcmVkUHJpb3JUb1RoZUZpcnN0U2NoZWR1bGVkUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNjaGVkdWxlZFVwVG9BY2N1bXVsYXRpb25TdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNoaXBwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNoaXBwZWRMb25nLURpc3Bvc2l0aW9uQ2hhbGxlbmdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5U2hpcHBlZExvbmctRGlzcG9zaXRpb25QZW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTaGlwcGVkU2hvcnQtRGlzcG9zaXRpb25DaGFsbGVuZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTaGlwcGVkU2hvcnQtRGlzcG9zaXRpb25QZW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlU2NoZWR1bGVWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVNjcmFwUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVdhdGVyVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RGF5c09uTWFya2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWR1Y3RpYmxlQmxvb2RVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmYXVsdE5vdGlmaWNhdGlvblJlc3BvbnNlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWdyZWVTZWdtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsZXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlCYXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlCYXRjaE11bHRpcGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVF1YW50aXR5QmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGVuZGVudENvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnRzQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnRUb3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzaWduRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdHJveWVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldHJpbWVudGFsTGVnYWxGaWxpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRyaW1lbnRhbExlZ2FsRmlsaW5nc0FnYWluc3REaXJlY3RvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpbWVuc2lvbmFsU2FtcGxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0U2hpcG1lbnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0V29ya2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYnVyc2VtZW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVldFF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXRlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXRlUXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbC1EaXNwb3NpdGlvbkNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JldGVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uUGVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JldGVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uUmVwbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3Bvc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NpdGlvblVuZGV0ZXJtaW5lZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljQWZmaWxpYXRlZENvbXBhbmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWNVc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3NlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFmdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVlLUluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXBsaWNhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXJhdGlvbkluQ3VycmVudEpvYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHdlbGxpbmdBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJuZWRWYWx1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybmVkVmFsdWVDdW11bGF0aXZlVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJuZWRWYWx1ZUhvdXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZmZlY3RpdmVBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsYXBzZWREdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY1NpZ25hdHVyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaW1pbmF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGltaW5hdGlvblBlcmlvZC1BY2NpZGVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpbWluYXRpb25QZXJpb2QtU2lja25lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeU1vZGlmeWluZ1VuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZEF0TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkQXRUaGlzTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkQnlUaGlzQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWRJblRoaXNQcm9mZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZE9uVGhpc0pvYiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVBdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlc0FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzLU5vbm93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXNOb3RJbmNsdWRpbmdPd25lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlc051bWJlck9mRGF5c0F3YXlGcm9tV29ya0R1ZVRvSW5qdXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXNOdW1iZXJPZkRheXNPZlJlc3RyaWN0ZWRXb3JrQWN0aXZpdHlEdWVUb0luanVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzLU93bmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXMtUGFydFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlcy1TYW1lRHV0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXMtU2FtZU9jY3VwYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlc1NoYXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzVG90YWxOdW1iZXJPZkRheXNBd2F5RnJvbVdvcmtEdWVUb0lsbG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVG90YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVG90YWxGaXJzdE1vbnRoT2ZRdWFydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVRvdGFsU2Vjb25kTW9udGhPZlF1YXJ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVG90YWxUaGlyZE1vbnRoT2ZRdWFydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdTdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kT2ZNb250aEludmVudG9yeVByaW9yVG9TaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJlZFN0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpdHlTZWN1cml0eUhvbGRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVBdENvbXBsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEFjY291bnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRBbm51YWxWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZER1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRFbXBsb3llZXNBdExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFJlYWRpbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUmVtYWluaW5nRWNvbm9taWNMaWZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRSZW1haW5pbmdQaHlzaWNhbExpZmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFRvdGFsRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmFwb3JhdGVkV2F0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1c2l2ZVVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZWN1dGl2ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aXN0ZW5jZUxpbWl0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlbmRpdHVyZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZFRlcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhVW5wbGFubmVkRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZENsYWltTWFuZGF0ZS1DYXRlZ29yeTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRDbGFpbU1hbmRhdGUtQ2F0ZWdvcnkyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkQ2xhaW1NYW5kYXRlLUNhdGVnb3J5MyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZENsYWltTWFuZGF0ZS1DYXRlZ29yeTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRDbGFpbU1hbmRhdGUtQ2F0ZWdvcnk1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnkyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnk0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkUGF5bWVudE1hbmRhdGUtQ2F0ZWdvcnk1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnkxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnkyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnkzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnk0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUGVuc2lvbk1hbmRhdGUtQ2F0ZWdvcnk1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkV29ya2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZVNpemVBZnRlckNvbXByZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlU2l6ZUJlZm9yZUNvbXByZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbERlbGl2ZXJ5UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbENvdmVyYWdlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJbnN0aXR1dGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaE9mZnNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RRdWFydGVyTm9uLVJlY3VycmluZ0RlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RRdWFydGVyTm9uLVJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RRdWFydGVyUmVjdXJyaW5nRGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFF1YXJ0ZXJSZWN1cnJpbmdPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXJlT3JGbGFzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEV4dHJhUHJlbWl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vcnNPY2N1cGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0QXRDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RlZFNjYW5uZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RUb0NvbXBsZXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduUmVsYXRlZEVudGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlbWVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3VydGhRdWFydGVyTm9uLVJlY3VycmluZ0RlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm91cnRoUXVhcnRlck5vbi1SZWN1cnJpbmdPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvdXJ0aFF1YXJ0ZXJSZWN1cnJpbmdEZW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvdXJ0aFF1YXJ0ZXJSZWN1cnJpbmdPcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVGbG9hdC1JbkNhbGVuZGFyVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVGbG9hdFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVHb29kc1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlbGFuY2VEZWJ0Q29sbGVjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZWxhbmNlU2FsZXNwZXJzb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlUXVhbnRpdHlJbmNsdWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZVF1YW50aXR5Tm90SW5jbHVkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbENvbnN1bWVkT3JCdXJuZWRBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxQdW1wcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVsbEJhdGhzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsR3JvdXBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsU2FtcGxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1cm5pc2hlZEJsb29kVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhcmFnZU9yQ2FycG9ydEFyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc0luamVjdGlvblZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzTGlmdFZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzUmVjZWlwdFZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzUmV0dXJuZWRUb0VhcnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNSZXR1cm5lZFRvUHJvcGVydHlGb3JGdWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNTaHJpbmthZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1NvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1VzZWRGb3JEcmlsbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVXNlZEZvckZ1ZWxTeXN0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1VzZWRGb3JQbGFudEZ1ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1VzZWRGb3JSZXByZXNzdXJpbmdPclByZXNzdXJlTWFpbnRlbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1VzZWRPblByb3BlcnR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNWZW50ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1ZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbEVsaW1pbmF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50UmVwb3J0aW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWRlVHJhbnNmZXJBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzQW5udWFsSW5jb21lTXVsdGlwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NCdWlsZGluZ0FyZWEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzRXN0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzTGl2aW5nQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NMaXZpbmdGaW5pc2hlZEFyZWFBYm92ZUdyYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1Byb2R1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzUmVudE11bHRpcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVGZWVCdXl1cE1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZUZlZVJhdGVBZnRlckFsdGVybmF0ZVBheW1lbnRNZXRob2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZUZlZVJhdGVBZnRlckJ1eXVwT3JCdXlkb3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaEZhYnJpY2F0aW9uQXV0aG9yaXphdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoUmF3TWF0ZXJpYWxBdXRob3JpemF0aW9uUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGRpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Vyc0Zsb3duLUFpcmNyYWZ0T3JUeXBlRmx5aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Vyc0Zsb3duLUFpcmNyYWZ0VHlwZU9yTGlmZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnNGbG93bi1BaXJjcmFmdFR5cGVPclBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnNGbG93bi1MaWZldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnNGbG93bi1UeXBlRmx5aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBhaXJtZW50RHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGFpcm1lbnRGcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY3JlbWVudGFsT3JkZXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXJlY3RFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5QnVzaW5lc3NGYWlsdXJlSW5jaWRlbmNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25Qcm92aWRlclN0YW5kYXJkaXplZE1vdG9yVmVoaWNsZVBlbmFsdHlQb2ludHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUmVhZGluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsZWRDYXBhY2l0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbG1lbnRGcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxtZW50UGF5bWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdWZmaWNpZW50RnVuZHNSZXR1cm5lZENoZXF1ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVuZGVkQ2hhbmdlVGltZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RGb3JPdmVyZHJhd25BY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmltVGVybVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ0YW5rVHJhbnNmZXJBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluVHJhbnNpdFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1Vc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeUNhdGVnb3J5VHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeURpc2NyZXBhbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlNb3ZlbWVudFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlPblNoZWxmV29ya0luUHJvZ3Jlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVF1YW50aXR5QXRTdXBwbGllcnNOb3RTdWJqZWN0VG9JbnNwZWN0aW9uQnlDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5UXVhbnRpdHlBdFN1cHBsaWVyc1N1YmplY3RUb0luc3BlY3Rpb25CeUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlXaXRoZHJhd2FsUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvbHZlbWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVkU2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKYWlsU2VudGVuY2VEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkZ2VtZW50c1JlZ2lzdGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkaWNpYWxTdGF5RHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvdXJIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFnVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZEhvbGRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZVBheW1lbnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdEN1bXVsYXRpdmVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF3U3VpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVBlcmlvZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlbmd0aE9mUmVzaWRlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXZlbFJlc291cmNlLVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXZlbFJlc291cmNlVGFza1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXZlbHNPY2N1cGllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZVdpdGhkcmF3YWxEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZVdpdGhkcmF3YWxzU2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGllbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZW5zUmVnaXN0ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZXRpbWVDYXBhY2l0eU9mVG9vbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZS1UaW1lUmVzZXJ2ZS1BY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmV0aW1lUmVzZXJ2ZURheXMtQXBwbGllZFRvVGhpc0NsYWltIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlLVRpbWVSZXNlcnZlLUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltaXRlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbXNDb21wbGV0ZWREZWxpbnF1ZW50LUJ1eWluZ1BhcnR5Q2F1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbXNDb21wbGV0ZWREZWxpbnF1ZW50LUNvbnRyYWN0b3JDYXVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtc0NvbXBsZXRlZERlbGlucXVlbnQtVW5rbm93bkNhdXNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZVRocmVhZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpdmVzdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5SZXBheW1lbnRUb3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zc0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zc09yR2FpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zdEdhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zdEdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3N0T2lsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3N0V29ya1RpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3RXb3JrVGltZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90U2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFjaGluZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVkVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmluZVJhZGlvcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0UHJpY2VDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGNoaW5nRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbE9uLUJvYXJkUXVhbnRpdHlQcmlvclRvTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUJlbmVmaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1CZW5lZml0UGVyaW9kLUFjY2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQmVuZWZpdFBlcmlvZEFjY2lkZW50VG9BZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1CZW5lZml0UGVyaW9kLVNpY2tuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQmVuZWZpdFBlcmlvZFNpY2tuZXNzVG9BZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1DcmltaW5hbFNlbnRlbmNlRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1EZWxpdmVyeUJhdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtRm9yZWNhc3RRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU1hdHVyaXR5RXh0ZW5zaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtTnVtYmVyT2ZFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1OdW1iZXJPZkVtcGxveWVlc0F0TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1OdW1iZXJPZlB1cmNoYXNlT3JkZXJzQWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU51bWJlck9mU2hpcG1lbnRzQWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU9yZGVyUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1Qcm9kdWN0aW9uQmF0Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1RdWFudGl0eVRvV2hpY2hUYXhSYXRlQXBwbGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVJlcXVlc3RhYmxlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1TaGlwUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1TdGFja2FiaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1TdG9ja0xldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtU3VwcGx5UXVhbnRpdHlTdXBwbGllckVuZG9yc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lY2hhbmljcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhdGlvbkR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZW1iZXJzSW5Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2VuZ2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlTYWxlc1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxsaW9uRG9sbGFyUm91bmR0YWJsZUNyZWRpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1BZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1BdmVyYWdlVGltZVJlcXVpcmVtZW50VW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1Db250cmFjdFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtQ3JpbWluYWxTZW50ZW5jZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtRGVsaXZlcnlCYXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUVtcGxveWVlc0F0TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1GYWJyaWNhdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtRm9yZWNhc3RRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bU51bWJlck9mRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtT3JkZXJQYWNrYWdlTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1PcmRlclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUHJvZHVjdGlvbkJhdGNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUXVhbnRpdHlUb1doaWNoVGF4UmF0ZUFwcGxpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1SZXF1ZXN0YWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtU2hpcFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtU3RvY2tMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVRyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNjZWxsYW5lb3VzQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2JpbGVMb2FkaW5nQWxsb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZWxPclRhcmdldFN0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb250aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VQb29sQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RMaWtlbHlEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxCdXNpbmVzc0ZhaWx1cmVJbmNpZGVuY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFF1YW50aXR5RGVjcmVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFF1YW50aXR5SW5jcmVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFRvUGF5SXRlbUNvdW50LiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9EZWxpdmVyeVJlcXVpcmVtZW50SW5UaGlzSW5zdHJ1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1CaWxsYWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb21taXR0ZWRJbnZlbnRvcnlPblNoZWxmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb25mb3JtYW5jZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tQ29uc29saWRhdGVkVG90YWwtRG9tZXN0aWNTdWJzaWRpYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Db25zb2xpZGF0ZWRUb3RhbC1Gb3JlaWduU3Vic2lkaWFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb3ZlcmVkLUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUNvdmVyZWQtRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tRG9tZXN0aWNTdG9ja2hvbGRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmV4Y2x1c2l2ZVVzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1VbmlvbkVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVVyZ2VudERlbGl2ZXJ5UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcm1hbERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3JtYWxSZWFkaW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFJlcGxhY2VkQmxvb2RVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9Wb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZBY2NvdW50c1Bhc3REdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQWN0aXZlQWNjb3VudHNUaGlzQ3ljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQWRkZWRMb2NhdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQWRqdXN0bWVudFBlcmlvZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQXR0YWNrc09yT2NjdXJyZW5jZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQmF0Y2hlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZCb3Jyb3dlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ2FyZHNOb3RSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDYXJkc091dHN0YW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNoZWNrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDbGFpbWFudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ2xvc2VkTG9jYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNvLUluc3VyYW5jZURheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ29waWVzT2ZCaWxsT2ZMYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ3JldyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZEYXlzQ292ZXJlZEJ5SW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkRlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRGVsaW5xdWVudEluc3RhbGxtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZEZWxpdmVyaWVzUGVyRGVzcGF0Y2hQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRGVwZW5kZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZFbmRVc2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZFbnRpdGxlZEV4ZW1wdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRmFpbGVkQnVzaW5lc3Nlc09mRGlyZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkZyYW5jaGlzZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkZ1bGwtVGltZUVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZIb3NwaXRhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSWRlbnRpY2FsSGFuZGxpbmdVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZJbnN1cmVkTGl2ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSW50ZXJlc3RQYXltZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZJcnJlZ3VsYXJJbnRlcmVzdFBheW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkl0ZW1zQXV0aG9yaXplZEF0U3RvcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSXRlbXNBdXRob3JpemVkQXRXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSXRlbXNJblN0b2NrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxhdGVDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxldmVscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZMaW1pdGVkUGFydG5lcnNoaXBTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTGl2aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxvYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxvc3RDYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZNZW1iZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk1lc3NhZ2VSZWNpcGllbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk1vbnRocyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZNb3J0Z2Fnb3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk1vdWxkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZOb24tQ292ZXJlZERheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTm9uc3VmZmljaWVudEZ1bmRJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZPcGVuQWNjb3VudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mT3BlcmF0aW5nUGVyaW9kc0F0RmFpbHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZPcGVyYXRvckNyZWRpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mT3JpZ2luYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlBhY2thZ2VzSW5IYW5kbGluZ1VuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUGFzc2VuZ2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQYXRpZW50QWRtaXNzaW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQZW9wbGVMaXZpbmdBdFJlc2lkZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQaHlzaWNpYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlByb2R1Y2luZ1dlbGxzUmVtYWluaW5nT25Qcm9wZXJ0eU9yRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUHJvZHVjaW5nV2VsbHNSZW1haW5pbmdPblJveWFsdHlBY2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlF1YW50aXRhdGl2ZUluY2VudGl2ZVNjaGVtZVVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlNlcnZpY2VzT3JQcm9jZWR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlNoZWxmRmFjaW5ncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTaGVsZlRhZ3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mU2lnbmVkQmlsbHNPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTdGF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTdG9sZW5DYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTdG9wcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZUaGVhdHJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZUaW1lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZUaW1lc0RlcG9ydGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlRyYW5zcG9ydERvY3VtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZVbml0cy1Ib3VzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlVuaXRzSW5UaGVEZXB0aE9mQUxheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlVuaXRzSW5UaGVXaWR0aE9mQUxheWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlVuc2lnbmVkQmlsbHNPZkxhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZXaXRoaG9sZGluZ0V4ZW1wdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlcnNPZkNvbnN1bWVyVW5pdHNJblRoZVRyYWRlZFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlcldlZWtzUGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVyc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZW1JbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVNpemUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVdvcmtlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZkxlYXNlRnVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmUHJlbWlzZVNhbGVzUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZlByZW1pc2VzU2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbENvbmRlbnNhdGVTb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxDb25kZW5zYXRlVXNlZE9uUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbE9yQ29uZGVuc2F0ZVZvbHVtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsU2VkaW1lbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsVGhlZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uSGFuZEFuZER1ZS1JbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25Ib2xkRm9yU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uT3JkZXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25QcmVtaXNlU2FsZXNRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25QcmVtaXNlc1NhbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuaW5nU3RhdGVtZW50QmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlbmluZ1N0b2NrQmFsYW5jZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ0JlZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ0RpdmlzaW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JzV29ya2luZ0ludGVyZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpbWFsUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGltaXN0aWNEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJDb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlclF1YW50aXR5TXVsdGlwbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbER1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbExvYW5UZXJtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFBheW1lbnRJdGVtQ291bnQuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFRlcm1JblllYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJHYXNEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyTWlzY2VsbGFuZW91c0Rpc3Bvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlck9pbENvbmRlbnNhdGVEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZFBhcnRpY2lwYW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZFN0b2NraG9sZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJXYXJSZXNlcnZlTWF0ZXJpYWxSZXF1aXJlbWVudHNQcm90ZWN0YWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlcldhdGVyRGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGxpZXJEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRPZkludmVudG9yeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzdGFuZGluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzdGFuZGluZ1NoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0LVR1cm5lZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyZmxvd1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyU2hpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc0VxdWl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwQ2hhbmdlQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwUGVyY2VudGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duT2NjdXBhdGlvblF1YWxpZmljYXRpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhZ2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC1JbkNvbW1vblNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC1JblByZWZlcnJlZFNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC1JblNlY3VyaXR5U2hhcmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJraW5nU3BhY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsQmF0aHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYW50VG90YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYXRpb25TaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRuZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0VGltZUVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzdER1ZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudENhbmNlbGxhdGlvbkl0ZW1Db3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudER1cmF0aW9uV2Vla3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRFeHBlcmllbmNlc0luVGhlTGFzdDEyTW9udGhzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RXhwZXJpZW5jZXNJblRoZUxhc3QzTW9udGhzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RnJlcXVlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50T3JkZXJzRmlsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRzTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50YWdlT2ZPcmRlcmVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZGljQ2FwYWNpdHlPZlRvb2xpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZE9mRW1wbG95bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kUXVhbnRpdHlNZWFzdXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kUXVhbnRpdHlQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RRdWFudGl0eVJlYWNoZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNpc3RlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXNzaW1pc3RpY0R1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRpdGlvbnNGaWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxTdGF0dXNJaWkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsU3RhdHVzSXYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsU3RhdHVzViIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljaWFucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljdHVyZUNvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVjZXNEZWxpdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpbGZlcmFnZUdvb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWxvdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lQWRqdXN0bWVudE9yQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGl0dGVkV2F0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudFBlcmlvZEV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uZWRVbml0RGV2ZWxvcG1lbnRVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudFdvcmtlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRmb3JtQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRhYmxlUmFkaW9zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0ZWRUZWxlcGhvbmVMaW5lcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1PcERheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvdWx0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWRvbWluYXRlQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtT3BEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkUXVhbnRpdHlOb3RTaGlwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkUXVhbnRpdHlTaGlwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtUHJvZHVjdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbkRvc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uRWZmZWN0aXZlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25GcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNpZGVudGlhbFZvdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzc3VyZUJhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQmVuZWZpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3VtdWxhdGl2ZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0hpZ2hlc3RDdW11bGF0aXZlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzbHlBbW9ydGlzZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNNb250aHNVc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNOdW1iZXJPZkFjY291bnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c051bWJlck9mQnJhbmNoTG9jYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c051bWJlck9mRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c09yZGVyUXVhbnRpdHlUb0JlQ2FuY2VsbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1dlZWtRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VCcmVha0Zyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQnJlYWtUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2luZ1VuaXRQZXJCaWxsaW5nVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeU1hbmFnZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5TWV0ZXJSZWFkaW5nVmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlOZXRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsc0luY2x1ZGVkQXNFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQ3VtdWxhdGl2ZUltYmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JVbml0c0FjY2VwdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9iYXRpb25EdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjaW5nV2VsbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RFeGNoYW5nZUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvblJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbldvcmtlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RTYWxlc0Ftb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvbmFscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0ZWRBdmFpbGFibGVJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQaGFzZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RzSW5Qcm9jZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0VW5pdHNTb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3RlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZXN0ZWRCaWxscyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljYXRpb25UdXJuU2l6ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPZlByb2R1Y3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpZmljYXRpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpZnlpbmdXZWVrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNvbnRyb2xGYWlsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb250cm9sSGVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdGF0aXZlSW5jZW50aXZlU2NoZW1lQmFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBZHZpc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUFwcHJvdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUF0MTAwUGN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUF2YWlsYWJsZUZvclJldHVybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBdmFpbGFibGVGb3JTYWxlLVN0b2NrUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5QXZhaWxhYmxlT25TaGVsZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBd2FpdGluZ0RlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUJ5UG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5Q2FuY2VsbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUNhcnJpZWRGb3J3YXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eURlZmVycmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eURlbGl2ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlEaXNhcHByb3ZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlEaXNwZW5zZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5RGlzcGxheWVkTm90QXZhaWxhYmxlRm9yU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlFYXJuZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SGVsZEJ5RGVsaXZlcnlWZWhpY2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUhlbGRCeUxvZ2lzdGljU2VydmljZVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUhlbGRCeVJldGFpbE91dGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlJbkZsb2F0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUluSG9sZE91dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlJbk1hbnVmYWN0dXJpbmdQcm9jZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUluUGh5c2ljYWxJbnZlbnRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SW5RdWFyYW50aW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUluVHJhbnNpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlMYW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5TG9hZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eU1hbmlmZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5Tm90QXZhaWxhYmxlRm9yRGVzcGF0Y2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5T2ZEZWFsZXJMaWNlbnNlUGxhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eU9mTWF0ZXJpYWxJbk9yZGVyZWRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eU9uSGFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlPbkhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UGVyTmV4dEhpZ2hlckFzc2VtYmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVBlclBhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UGVyU2tpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlQZXJVbml0T2ZJc3N1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZW1haW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UmVxdWlyZW1lbnRGb3JNYWludGVuYW5jZUFuZFJlcGFpck9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVJlcXVpcmVtZW50Rm9yU2FtcGxlSW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZXF1aXJpbmdNYW5pcHVsYXRpb25CZWZvcmVEZXNwYXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZXR1cm5lZERlZmVjdGl2ZU9yRGFtYWdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U2VydmljZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U29sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlTb2xkTmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVN1c3BlbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlUb0JlRGVsaXZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVVzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5V2l0aGRyYXduIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVdpdGhoZWxkQnlPd25lck9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RlUXVhbnRpdHlPbkludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFuZ2VBdmVyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5nZU1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhbmdlTWluaW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZVBlckRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWlwdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkQW5kQWNjZXB0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkTm90QWNjZXB0ZWRUb0JlRGVzdHJveWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZE5vdEFjY2VwdGVkVG9CZVJldHVybmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbW1lbmRlZE1haW50ZW5hbmNlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29tbWVuZGVkT3ZlcmhhdWxBbmRSZXBhaXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25zaWRlcmF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWRlbGl2ZXJ5QWZ0ZXJQb3N0UHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmaWxsc0F1dGhvcml6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRCcmFuZHNEaXN0cmlidXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZEJyYW5kc01hbnVmYWN0dXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0ZWRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0ZWRSZXR1cm5RdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZEJ1c2luZXNzRW50aXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRFbnRpdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpb25zaGlwRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlc0VtcGxveWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1haW5pbmdBdXRob3JpemVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWFpbmluZ0R1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1haW5pbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVvcmRlcmluZ0xldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW9yZGVyUG9pbnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZWRBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VkQmxvb2RVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGVuaXNobWVudE92ZXJyaWRlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxlbmlzaG1lbnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0RGlmZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0ZWREZWZpY2llbmNpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZW1lbnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZW1lbnRRdWFudGl0eVRoYXRXYXNQcmV2aW91c2x5UmVsZWFzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpc2l0aW9uaW5nT2JqZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZlZFF1YW50aXR5Q3VzdG9tZXJEaXJlY3REZWxpdmVyeVNhbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZlZFF1YW50aXR5UmV0YWlsU2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW5jZUR1cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNvdXJjZS1RdWFudGl0eS1BdmFpbGFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RpbmdRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3Rpb25EdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsU2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGVudGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5lZEJ5Q29uc3VtZXJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybnNSZXBsYWNlbWVudFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb29tQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvb21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb29tc0ZpbmlzaGVkQXJlYUFib3ZlR3JhZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJveWFsdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eUxldmVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc3BlcnNvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUXVhbnRpdHlOb3RJbmNsdWRlZEluVGhlUmVwbGVuaXNobWVudENhbGN1bGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1F1YW50aXR5UGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2F0dGVyZWRWb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NyYXBBbGxvd2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY3JhcFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWF0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5TmV0UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZFF1YXJ0ZXJOb24tUmVjdXJyaW5nRGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRRdWFydGVyTm9uLVJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kUXVhcnRlclJlY3VycmluZ0RlbWFuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kUXVhcnRlclJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjcmV0YXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyZWRDaGFyZ2VzUmVnaXN0ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdGllc1NoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VnbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVob2xkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZWhvbGRlcnNIb2xkaW5nUmVtYWluZGVyT2ZTaGFyZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzQWRkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc0RlbGV0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc0hlbGRBc1RyZWFzdXJ5U3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc09mQ29tbW9uU3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc09mUHJlZmVycmVkU3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc093bmVkQnlJbi1TdGF0ZVJlc2lkZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzT3duZWRCeU91dC1PZi1TdGF0ZVJlc2lkZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzU3Vic2NyaWJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzU3Vic2NyaWJlZEJ1dE5vdElzc3VlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpZnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBOb3RpY2VRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9ydGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvcnQtTGFuZGVkR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3J0U2hpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lsZW50UGFydG5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmNlTGFzdFRyYXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlRGVsaXZlcnlRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lzdGVyc0RlY2Vhc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXN0ZXJzTGl2aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXplT2ZIb3VzZWhvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraWxsZWRXb3JrZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQnVzaW5lc3NVc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xpY2l0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvcnRlZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3J0ZWRRdWFudGl0eVJlamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGFjZU9jY3VwaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUGFydG5lcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWVkQ2FwYWNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0U2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydE9mZnNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVPclByb3ZpbmNlTW90b3JWZWhpY2xlUGVuYWx0eVBvaW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxTYWxlc1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja1RyYW5zZmVyc0luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja1RyYW5zZmVyc091dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvbGVuQ2hlcXVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvckF0Q29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JDdW11bGF0aXZlVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGVkUXVhbnRpdHlSZXR1cm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGVkUXVhbnRpdHlTb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzZXF1ZW50RGVsaXZlcnlRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2lkaWFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRpb25hbFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWl0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyRXN0aW1hdGVkTGF0ZXN0TWV0ZXJSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckVzdGltYXRlZFByZXZpb3VzTWV0ZXJSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckxhdGVzdE1ldGVyUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJQcmV2aW91c01ldGVyUmVhZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnBsdXNHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5c0luQXZlcmFnZVJhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VzcGVuZGVkRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3YW4tR2FueiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFibGVzQXZhaWxhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYWxrUGF0aHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZkxvc3NBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheGFibGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVhY2hlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNpYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVvcmV0aWNhbFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFF1YXJ0ZXJOb24tUmVjdXJyaW5nRGVtYW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFF1YXJ0ZXJOb24tUmVjdXJyaW5nT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFF1YXJ0ZXJSZWN1cnJpbmdEZW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUXVhcnRlclJlY3VycmluZ09yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUV4cGVuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lRnJhbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVJbkNvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVJblBvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VIb3NwaXRhbGl6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZUxhc3RBcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTGFzdENpdmlsaWFuRmxpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VMYXN0SW5zdXJhbmNlTWVkaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTGFzdE1pbGl0YXJ5RmxpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VNZWRpY2FsQ29uc3VsdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTWVkaWNhdGlvbkVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTWVkaWNhdGlvblN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VPbnNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlU3VyZ2VyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlVHJpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lVW5pdHNLbm93biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVVuaXRzUGVyU2hpZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVVbml0c1NwZW50T25EdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9Db21wbGV0ZVF1YW50aXR5RXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb2xlcmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEFkanVzdG1lbnRzVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEFtb3J0aXNhdGlvblF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEF0Q29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQXV0aG9yaXplZFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEJlZ2lubmluZ0ludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNBc3NvY2lhdGVkV2l0aFJlcGVhdGVkVHJhdW1hIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhEYXlzQXdheUZyb21Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhEaXNvcmRlcnNEdWVUb1BoeXNpY2FsQWdlbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhEdXN0RGlzZWFzZXNPZlRoZUx1bmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhvdXREYXlzQXdheUZyb21Xb3JrQW5kV2l0aG91dFJlc3RyaWN0ZWRXb3JrQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ2xhaW1zV2l0aFBvaXNvbmluZ0lsbG5lc3NlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNXaXRoUmVzcGlyYXRvcnlDb25kaXRpb25zRHVlVG9Ub3hpY0FnZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNXaXRoU2tpbkRpc2Vhc2VzT3JEaXNvcmRlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ29uc29saWRhdGVkRG9tZXN0aWNTdWJzaWRpYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ29uc29saWRhdGVkRm9yZWlnblN1YnNpZGlhcmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDb25zb2xpZGF0ZWRTdWJzaWRpYXJpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ3JlZGl0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDcmVkaXRzQWNjZXB0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ3JlZGl0c1JlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENyZWRpdHNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEYXlzQXdheUZyb21Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERheXNBd2F5RnJvbVdvcmtEdWVUb0lsbG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c0F3YXlGcm9tV29ya0R1ZVRvSW5qdXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERheXNPZlJlc3RyaWN0ZWRXb3JrQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c09mUmVzdHJpY3RlZFdvcmtBY3Rpdml0eUR1ZVRvSWxsbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEYXlzT25NYXJrZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c1dpdGhSZXN0cmljdGVkV29ya0FjdGl2aXR5RHVlVG9Jbmp1cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGVhdGhDbGFpbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGVhdGhzQXNBUmVzdWx0T2ZJbGxuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlYXRoc0FzQVJlc3VsdE9mSW5qdXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlYml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWJpdHNBY2NlcHRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWJpdHNSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWJpdHNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWxpdmVyeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlbWFuZE9yZGVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZW1hbmRRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRW5kaW5nSW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEZsb2F0VGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxHYXNEaXNwb3NpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxHYXNJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSWxsbmVzc0NsYWltc1dpdGhEYXlzQXdheUZyb21Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbElsbG5lc3NDbGFpbXNXaXRoT2NjdXBhdGlvbmFsSWxsbmVzc2VzTm90T3RoZXJ3aXNlQ2xhc3NpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbGxuZXNzQ2xhaW1zV2l0aG91dExvc3RXb3JrRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbGxuZXNzV2l0aExvc3RXb3JrRGF5c09yUmVzdHJpY3RlZFdvcmtBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbmp1cnlDbGFpbXNXaXRoRGF5c0F3YXlGcm9tV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbmp1cnlDbGFpbXNXaXRoRGF5c0F3YXlGcm9tV29ya09yUmVzdHJpY3RlZFdvcmtBY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbmp1cnlDbGFpbXNXaXRob3V0TG9zdFdvcmtEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEludmVudG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOb24tQ29uc29saWRhdGVkU3Vic2lkaWFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mQ29udmljdGlvbnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZEb21lc3RpY1N1YnNpZGlhcmllc0luY2x1ZGVkSW5GaW5hbmNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZEb21lc3RpY1N1YnNpZGlhcmllc05vdEluY2x1ZGVkSW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZGb3JlaWduU3Vic2lkaWFyaWVzSW5jbHVkZWRJbkZpbmFuY2lhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZkZvcmVpZ25TdWJzaWRpYXJpZXNOb3RJbmNsdWRlZEluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mTG9hbkRldGFpbFJlY29yZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZNb3J0Z2FnZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mUGFya2luZ1NwYWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZlN1YnNpZGlhcmllc05vdEluY2x1ZGVkSW5UaGVGaW5hbmNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZlVuaXRzRm9yU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZldvcmtlcnNDb21wZW5zYXRpb25Db21iaW5lZFJlcG9ydHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZXb3JrZXJzQ29tcGVuc2F0aW9uRmlyc3RSZXBvcnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mV29ya2Vyc0NvbXBlbnNhdGlvblN1YnNlcXVlbnRSZXBvcnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE9mSXNzdWFibGVBc3NldHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT2lsQW5kT3JDb25kZW5zYXRlRGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT2lsQW5kT3JDb25kZW5zYXRlSW5qZWN0aW9uVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE90aGVyUHJvcGVydGllc093bmVkQW5kRmluYW5jZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUGF5bWVudHNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQb3N0LUFkdmljZXNBY2NlcHRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQb3N0LUFkdmljZXNSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQb3N0LUFkdmljZXNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcmUtQWR2aWNlc0FjY2VwdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByZS1BZHZpY2VzUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJlLUFkdmljZXNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcmVub3Rlc0FjY2VwdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByZW5vdGVzUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJlbm90ZXNSZWplY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcm9kdWN0aW9uVm9sdW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByb3BlcnRpZXNPd25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxRdWFudGl0eVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUmVzb3VyY2UtUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUm9vbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU2FsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU2VydmljZUJhY2tvcmRlclF1YW50aXR5SGlnaFByaW9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFNlcnZpY2VCYWNrb3JkZXJRdWFudGl0eUxvd1ByaW9yaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFNoYXJlc09mU3RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU3lzdGVtQmFja29yZGVyUXVhbnRpdHlIaWdoUHJpb3JpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU3lzdGVtQmFja29yZGVyUXVhbnRpdHlMb3dQcmlvcml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxUb0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsVHJhbnNhY3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFVuaWRlbnRpZmllZFRyYW5zYWN0aW9uc1JlamVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFdhdGVyRGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsV2F0ZXJJbmplY3Rpb25Wb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsV29ya2VkQnlBbGxFbXBsb3llZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsV29ya2luZ0ludGVyZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZW1hcmtSZXByZXNlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVtYXJrc1VzZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbmVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb25TZXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlclF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlcnJlZEluUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVycmVkT3V0UXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYXZlbEZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdmVsbGluZ0VtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdmVsUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlwRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaXBzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVua2VkQ2hhbm5lbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYWNrbm93bGVkZ2VkUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYWRqdXN0ZWRDb3JyZWN0b3JSZWFkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmNvdmVyZWRDaGVxdWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlvbkVtcGxveWVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzQ29tcGxldGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c0ZvclNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzUGVyVW5pdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1Byb2R1Y2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1JlbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNXb3JrZWRMYXN0RGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1dvcmtlZFBlckRheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNXb3JrZWRQZXJRdWFydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1dvcmtlZFBlcldlZWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVucGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zYWxlYWJsZVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNvbGRRdWFudGl0eUhlbGRCeVdob2xlc2FsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVudGlsTmV4dFRyYXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW51c2FibGVRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW51c2VkQWNjdW11bGF0ZWRTaWNrRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW52ZXJpZmllZFJlY2VpcHRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcmdlbnREZWxpdmVyeVF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VPZkV4dHJhY29ycG9yZWFsQ2lyY3VsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZU9mSHlwZXJiYXJpY1ByZXNzdXJpemF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VPZkh5cGVydGVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlT2ZIeXBvdGVuc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlT2ZIeXBvdGhlcm1pYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFjYW5jaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXJpYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFyaWFuY2VBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY3VsYXJSYWRpb3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcmlmaWVkUmVjZWlwdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpc2l0YXRpb25GcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpc2l0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9pY2VTdG9yYWdlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvaWRWb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lU2hyaW5rYWdlQWRqdXN0bWVudE9yQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3RlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm90aW5nU2hhcmVzSGVsZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlRW1wbG95ZWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VTaXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlclJlLUluamVjdGVkT25Qcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJWb2x1bWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlZWtzV29ya2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodENoYW5nZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0R2FpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0TG9zcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hvbGVzYWxlclRvV2hvbGVzYWxlclNhbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWRlQXJlYVRlbGVwaG9uZVNlcnZpY2VQZXI4MDBTZXJ2aWNlVW5pdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtDYWxlbmRhclVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0luUHJvY2VzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1RpbWVVbml0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1RpbWVVbml0c1BlclNoaWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhcnNJblNjaG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhcnNJblRoaXNMaW5lT2ZXb3JrT3JQcm9mZXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyc09uSm9iIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyc1JlbWFpbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVzVm90ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEludmVudG9yeVF1YW50aXR5QXZhaWxhYmxlRm9yU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRQZXJpb2RJbWJhbGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRTZXJ2aWNlTGlmZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFNoYXJlQmFsYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJFc3RpbWF0ZWRMYXRlc3RNZXRlclJlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyRXN0aW1hdGVkUHJldmlvdXNNZXRlclJlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUmVhZGluZ1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYWlseUFkanVzdG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYWlseUF2ZXJhZ2VRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFpbHlXb3JrU2hpZnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VkR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFTdG9yYWdlUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRheXNPcGVyYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF5c1Byb2R1Y2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXlzU3VwcGx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJlbnR1cmVCb25kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJlbnR1cmVzRmlsZWRBZ2FpbnN0RGlyZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0Q29sbGVjdG9ycyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQ29udHJhY3RJdGVtIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJDb250cmFjdEl0ZW0iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkNvbnRyYWN0SXRlbSIgdHlwZT0iTGlzdE9mQ29udHJhY3RJdGVtIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250cmFjdEl0ZW0iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ29udHJhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRyYWN0SXRlbU51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udHJhY3RJdGVtIiB0eXBlPSJDb250cmFjdEl0ZW0iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRyYWN0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvbnRyYWN0SUQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ29udHJhY3RUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlZhbGlkaXR5RGF0ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN5c3RlbUlEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250cmFjdCIgdHlwZT0iQ29udHJhY3QiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRyYWN0VHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udHJhY3RUeXBlQ29kZWQiIHR5cGU9IkNvbnRyYWN0VHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRyYWN0VHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRyYWN0VHlwZSIgdHlwZT0iQ29udHJhY3RUeXBlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkNvbnRyYWN0VHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zaXNSZWxhdGVkR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlckRpZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhcmlhYmxlUGVyRGllbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwaXRhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGVkR3Jvd2luZ0VxdWl0eU1vcnRnYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRpY2lwYXRlZENvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSG91c2luZ0F1dGhvcml0eUFkanVzdGFibGVSYXRlTW9ydGdhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIb3VzaW5nQXV0aG9yaXR5VmV0ZXJhbnNBZmZhaXJzRml4ZWRSYXRlTW9ydGdhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25hbFNlY29uZE1vcnRnYWdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVudGlvbmFsRml4ZWRSYXRlTW9ydGdhZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSG91c2luZ0F1dGhvcml0eVZldGVyYW5zQWZmYWlyc0dyYWR1YXRlZFBheW1lbnRNb3J0Z2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnb3RpYXRlZENvbnZlbnRpb25hbEdyYWR1YXRlZFBheW1lbnRPclN0ZXBSYXRlTW9ydGdhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25hbEFkanVzdGFibGVSYXRlTW9ydGdhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQbHVzSW5jZW50aXZlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0U2hhcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBsdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQbHVzQXdhcmRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQbHVzRml4ZWRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdXNpdmVBZ2VuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1c2l2ZVJpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJtb3JBY3R1YWxDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZUluY2VudGl2ZUZpcm1UYXJnZXRXaXRoUGVyZm9ybWFuY2VJbmNlbnRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VJbmNlbnRpdmVGaXJtVGFyZ2V0V2l0aG91dFBlcmZvcm1hbmNlSW5jZW50aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlUmVkZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNld2l0aEVzY2FsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VJbmNlbnRpdmVTdWNjZXNzaXZlVGFyZ2V0V2l0aFBlcmZvcm1hbmNlSW5jZW50aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlSW5jZW50aXZlU3VjY2Vzc2l2ZVRhcmdldFdpdGhvdXRQZXJmb3JtYW5jZUluY2VudGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZUF3YXJkRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlSW5jZW50aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlTGV2ZWxvZkVmZm9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9Db3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRyb2FjdGl2ZUZpeGVkUHJpY2VSZWRldGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcm1GaXhlZFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNld2l0aEVjb25vbWljUHJpY2VBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV2ZWxvZkVmZm9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JIb3VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJDb250cmFjdFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3NwZWN0UmVzZXJ2YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbWVQZXJjZW50YWdlYXNGaWxtUmVudGFsRWFybmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lYW5kTWF0ZXJpYWxzIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJWYWxpZGl0eURhdGVzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTdGFydERhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVuZERhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVmFsaWRpdHlEYXRlcyIgdHlwZT0iVmFsaWRpdHlEYXRlcyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uZGl0aW9uc09mU2FsZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iU2FsZXNSZXF1aXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2FsZXNBY3Rpb25Db2RlZCIgdHlwZT0iU2FsZXNBY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTYWxlc0FjdGlvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNhbGVzQWN0aW9uVmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbmRpdGlvbnNPZlNhbGUiIHR5cGU9IkNvbmRpdGlvbnNPZlNhbGUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNhbGVzUmVxdWlyZW1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNhbGVzUmVxdWlyZW1lbnRDb2RlZCIgdHlwZT0iU2FsZXNSZXF1aXJlbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNhbGVzUmVxdWlyZW1lbnRDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTYWxlc1JlcXVpcmVtZW50IiB0eXBlPSJTYWxlc1JlcXVpcmVtZW50Ii8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNhbGVzUmVxdWlyZW1lbnRDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkUXVhbnRpdHlUb01ha2VNaW5pbXVtV2VpZ2h0UmVxdWlyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPcmRlcklmSXRlbXNBcmVPdXRPZlN0b2NrT3JOb3RZZXRQdWJsaXNoZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPcmRlcklmT3V0T2ZTdG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja09yZGVyT25seUlmTmV3SXRlbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkR3VhcmFudGVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5lZFNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNzQW5kTGFib3JTdXJwbHVzQXJlYVNldC1Bc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90UHJlc2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1YWxQcm9kdWN0QWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVkZUltcG9ydFF1b3RhSW5GaXJzdENvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3RvcnlTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVkU2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jbHVkZUltcG9ydFF1b3RhSW5GaXJzdENvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yU3VycGx1c0FyZWFTZXQtQXNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhcmdlUHVyY2hhc2VTZXQtQXNpZGVGb3JTbWFsbEJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXlQcmVzaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aS15ZWFyQXdhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQmFja09yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1N1YnN0aXR1dGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlQcmlvclRvU2hpcG1lbnRJZlF1YW50aXR5U3BlY2lmaWVkSXNOb3RBdmFpbGFibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uUXVhbGlmaWVkQmlkZGVyc0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uUXVhbGlmaWVkTWFudWZhY3R1cmVyc0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVW5saXN0ZWRTYWxlc0NvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbExhYm9yU3VycGx1c0FyZWFTZXRBc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvQXBwcm92ZWRTb3VyY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9FZHVjYXRpb25hbEluc3RpdHV0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvSGlzdG9yaWNhbGx5QmxhY2tDb2xsZWdlT3JVbml2ZXJzaXR5T3JNaW5vcml0eUluc3RpdHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9JbmR1c3RyaWFsUHJlcGFyZWRuZXNzUHJvZ3JhbVBhcnRpY2lwYW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvUXVhbGlmaWVkUHJvZHVjdHNMaXN0UHJvZHVjdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRUb1VTQW5kQ2FuYWRpYW5Tb3VyY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9Zb3VuZ0ludmVzdGlnYXRvclByb2dyYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb244YVNldC1Bc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0LWFzaWRlRm9yQW1lcmljYW5JbmRpYW4tb3duZWRCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEFzU29vbkFzUG9zc2libGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEZ1bGxUcnVja09ubHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBJbi1QbGFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBhcnRpYWwtQmFsYW5jZUJhY2tPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBhcnRpYWxCYWxhbmNlQ2FuY2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGFydGlhbEJhbGFuY2VTdWJzdGl0dXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGFydGlhbENhcmxvYWRMb3RzT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBhcnRpYWxJdGVtUXR5UHJvcG9ydGlvbmFsVG9Ub3RhbE9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGFydGlhbFRydWNrbG9hZExvdHNPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGVyUmVsZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBlclJlbGVhc2VvckJ1eWVyQXV0aG9yaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBlclNjaGVkdWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbEJ1c2luZXNzV2l0aFNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNzQ29uc2lkZXJhdGlvblNldC1Bc2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxEaXNhZHZhbnRhZ2VkQnVzaW5lc3NTZXQtQXNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsUHVyY2hhc2VTZXRBc2lkZUZvclNtYWxsQnVzaW5lc3NlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxSZW1haW5pbmdCYWxhbmNlQ2FuY2VsbGF0aW9uQWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxSZW1haW5pbmdCYWxhbmNlQ2FuY2VsbGF0aW9uTm90QWxsb3dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZUl0ZW1BbGxvd2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnJlc3RyaWN0ZWRQcm9jdXJlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudHkiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2FsZXNBY3Rpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsQmFsYW5jZVRoYXRFeGNlZWRzU2FsZXNBY3Rpb25WYWx1ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbEVudGlyZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSGF6YXJkb3VzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mSGF6YXJkb3VzSWRlbnRpZmllcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZENsYXNzQ29kZWQiIHR5cGU9IkhhemFyZENsYXNzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkQ2xhc3NDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkhhemFyZG91c1BsYWNhcmRJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzUmVmZXJlbmNlcyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlJlZmVyZW5jZUNvZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c0NvbnRhY3QiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb250YWN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZE5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlVOREdOdW0iIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iSGF6YXJkb3VzVGVtcGVyYXR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkhhemFyZG91c1NoaXBtZW50SW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVNU051bSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTWZhZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzIiB0eXBlPSJIYXphcmRvdXMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkhhemFyZG91c0lkZW50aWZpZXJzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJIYXphcmRvdXNJZGVudGlmaWVycyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mSGF6YXJkb3VzSWRlbnRpZmllcnMiIHR5cGU9Ikxpc3RPZkhhemFyZG91c0lkZW50aWZpZXJzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJIYXphcmRvdXNJZGVudGlmaWVycyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzUmVndWxhdGlvbnNDb2RlZCIgdHlwZT0iQWdlbmN5Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzUmVndWxhdGlvbnNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb2RlRXh0ZW5zaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb2RlVmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkT2ZmaWNpYWxUZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmVtQ2FyZE51bSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzSWRlbnRpZmllcnMiIHR5cGU9IkhhemFyZG91c0lkZW50aWZpZXJzIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkhhemFyZENsYXNzQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSGF6YXJkb3VzUGxhY2FyZEluZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1BsYWNhcmRJZGVudGlmaWNhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzUGxhY2FyZFRleHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkhhemFyZG91c1BsYWNhcmRJbmZvcm1hdGlvbiIgdHlwZT0iSGF6YXJkb3VzUGxhY2FyZEluZm9ybWF0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJIYXphcmRvdXNUZW1wZXJhdHVyZXMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRmxhc2hwb2ludCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVtZXJnZW5jeSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRyb2wiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaXN0T2ZUZW1wZXJhdHVyZUNvZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mRGltZW5zaW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkhhemFyZG91c1RlbXBlcmF0dXJlcyIgdHlwZT0iSGF6YXJkb3VzVGVtcGVyYXR1cmVzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJIYXphcmRvdXNTaGlwbWVudEluZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZFBhY2tpbmdDb2RlZCIgdHlwZT0iSGF6YXJkUGFja2luZ0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZFBhY2tpbmdDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNTaGlwbWVudENvZGVkIiB0eXBlPSJIYXphcmRvdXNTaGlwbWVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1NoaXBtZW50Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzU2hpcG1lbnROb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNab25lQ29kZWQiIHR5cGU9IkhhemFyZG91c1pvbmVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNab25lQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzU2hpcG1lbnRJbmZvcm1hdGlvbiIgdHlwZT0iSGF6YXJkb3VzU2hpcG1lbnRJbmZvcm1hdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJIYXphcmRQYWNraW5nQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFNwZWNpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JlYXREYW5nZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGl1bURhbmdlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlub3JEYW5nZXIiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSGF6YXJkb3VzU2hpcG1lbnRDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbERlc2NyaXB0aXZlSW5mb3JtYXRpb25Ob3RSZXF1aXJlZEJ5UmVndWxhdGlvbkJ1dERlc2lyZWRUb0FjY29tcGFueVRoZU1vdmVtZW50QnlUaGVTaGlwcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0FpcmxpZnRPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJET1QtMTEzRG9Ob3RCdW1wT3JDdXRPZmZDYXJXaGlsZUluTW90aW9uRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZWRDYXJOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c1doZW5XZXREZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRU1TUGFnZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpZmllc1Byb2R1Y3RzSW5BSGVhdGVkTW9sdGVuU3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c1N1YnN0YW5jZUNvbnN0aXR1ZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5oYWxhdGlvbkhhemFyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltaXRlZFF1YW50aXR5RGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1GQUdQYWdlTnVtYmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtT3BlcmF0aW5nU3BlZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmluZVBvbGx1dGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9pc29uLUluaGFsYXRpb25IYXphcmREZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9pc29uRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvYWN0aXZlTWF0ZXJpYWxEYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxPckNoZW1pY2FsR3JvdXBOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildhc3RlRGVjbGFyYXRpb24iLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSGF6YXJkb3VzWm9uZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRab25lQSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkWm9uZUIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZFpvbmVDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRab25lRCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJpY2luZ0RldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJdGVtQWxsb3dhbmNlc09yQ2hhcmdlcyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkFsbG93T3JDaGFyZ2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVG90YWxWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5VmFsdWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJpY2luZ0RldGFpbCIgdHlwZT0iUHJpY2luZ0RldGFpbCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUHJpY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlByaWNlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZQcmljZSIgdHlwZT0iTGlzdE9mUHJpY2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByaWNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUHJpY2luZ1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlVuaXRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJpY2VCYXNpc1F1YW50aXR5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2FsY3VsYXRlZFByaWNlQmFzaXNRdWFudGl0eSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVmFsaWRpdHlEYXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJpY2VRdWFudGl0eVJhbmdlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJQcmljZU11bHRpcGxpZXIiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlByaWNlIiB0eXBlPSJQcmljZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJpY2luZ1R5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlByaWNlVHlwZUNvZGVkIiB0eXBlPSJQcmljZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmljZVR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcmljaW5nVHlwZSIgdHlwZT0iUHJpY2luZ1R5cGUiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUHJpY2VUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxhdGlvblByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJUb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1PcmRlclByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFuZ2VEZXBlbmRlbnRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlSW5ncmVkaWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNJc1F1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGlvbk5ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY3VsYXRpb25Hcm9zcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4SW5jbHVkZWRBbGxvd2FuY2VzQW5kQ2hhcmdlc05vdEluY2x1ZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VTZWxsaW5nUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUHJpY2VUYXhJbmNsdWRlZEV4Y2x1ZGluZ0FsbG93YW5jZXNPckNoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUHJpY2VFeGNsdWRpbmdBbGxvd2FuY2VzT3JDaGFyZ2VzQW5kVGF4ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aXZlVW5pdFByaWNlQ29tcG9uZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlR2VuZXJpY1Byb2R1Y3RQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRlUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VXaG9sZXNhbGVQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjExIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjE0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjE3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjIzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyNCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjI2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyNyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjI5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIzMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY3VsYXRpb25QcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0YWxvZ1ByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50cmFsRGlzdHJpYnV0aW9uRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREb21lc3RpY1ZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VkUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlybWVkVW5pdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJlZEN1c3RvbXNVbml0VmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlckFkanVzdGVkUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yc1ByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudEFtb3VudEFsbG93ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFN0b3JlRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFNoaXBQcm9ncmFtUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVjc2NQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGlyZWN0U2hpcFByaWNlT3JpZ2luYWxFcXVpcG1lbnRNYW51ZmFjdHVyZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeURpcmVjdFNoaXBQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGlyZWN0U2hpcFByaWNlU3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeURpcmVjdFNoaXBQcmljZVdhcmVob3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVjdGVkVW5pdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVxdWVudERlbGl2ZXJ5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEV4Y2lzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUdvb2RzUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxVcHBlckxpbWl0UHJpY2VNYXhpbXVtQWxsb3dhYmxlQ29zdFByaWNpbmdGb3JEcnVncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlybVByaWNlRG9Ob3RBZHZpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFByaWNlVGhyb3VnaFF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyaWFsUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RpdHV0aW9uYWxQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZUJpbGxpbmdQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5kYXRvcnlUb0FkdmlzZVVuaXRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUFjdGl2aXR5U3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtT3JkZXJRdWFudGl0eVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtT3JkZXJRdWFudGl0eVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUmVsZWFzZVF1YW50aXR5UHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1QcmljZVJlZHVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyc1N1Z2dlc3RlZFJldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVJlbGVhc2VRdWFudGl0eVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXI1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXI2Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXI3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXI4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXI5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjEyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxMyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjE1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxNiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjE4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxOSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyMiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjI0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyNSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjI3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyOCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjMwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRJdGVtUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uYWxUb0FkdmlzZVVuaXRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxQdXJjaGFzZU9yZGVyUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQnJlYWtRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFByaWNlQmVnaW5uaW5nUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQnJlYWtQdXJjaGFzZU9yZGVyQ291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQ2F0YWxvZ3VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJFYWNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUluRWZmZWN0QXRUaW1lT2ZTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyS2lsb2dyYW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlckxpdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkRnJlaWdodENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3Npb25hbFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlcnNQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uYWxQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyVG9ubmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmllZFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Zpc2lvbmFsUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGVQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Z2dlc3RlZERlYWxlck5ldFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWdnZXN0ZWRGbGVldFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwQW5kRGViaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Z2dlc3RlZExpc3RQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVQcmljZUZhY3RvcnNFcXVhbGl6ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Z2dlc3RlZFJldGFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtT2ZMaW5lSXRlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Z2dlc3RlZFdob2xlc2FsZVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb0JlTmVnb3RpYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyZXNob2xkUHJpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSW52b2ljZUFtb3VudER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlZFVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZW9yZXRpY2FsV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0Q29zdFByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaG9sZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpvbmVQcmljZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVW5pdFByaWNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJVbml0UHJpY2VWYWx1ZSIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ3VycmVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVW5pdE9mTWVhc3VyZW1lbnQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlVuaXRQcmljZSIgdHlwZT0iVW5pdFByaWNlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkRlY2ltYWwyMV82Ij4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+Ci0gICAgICAgICAgICA8eHNkOnRvdGFsRGlnaXRzIHZhbHVlPSIyMSIvPgotICAgICAgICAgICAgPHhzZDpmcmFjdGlvbkRpZ2l0cyB2YWx1ZT0iNiIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJpY2VNdWx0aXBsaWVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcmljZU11bHRpcGxpZXJDb2RlZCIgdHlwZT0iUHJpY2VNdWx0aXBsaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJpY2VNdWx0aXBsaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik11bHRpcGxpZXIiIHR5cGU9InhzZDpkZWNpbWFsIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcmljZU11bHRpcGxpZXIiIHR5cGU9IlByaWNlTXVsdGlwbGllciIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQcmljZU11bHRpcGxpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdE1hcmt1cE11bHRpcGxpZXItT3JpZ2luYWxDb3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0TWFya3VwTXVsdGlwbGllci1SZXRhaWxDb3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudE11bHRpcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RNYXJrdXBNdWx0aXBsaWVyLVdob2xlc2FsZUNvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnRTb2x1dGlvbk11bHRpcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxpbmdNdWx0aXBsaWVyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXgiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRheEZ1bmN0aW9uUXVhbGlmaWVyQ29kZWQiIHR5cGU9IlRheEZ1bmN0aW9uUXVhbGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4RnVuY3Rpb25RdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGF4Q2F0ZWdvcnlDb2RlZCIgdHlwZT0iVGF4Q2F0ZWdvcnlDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhDYXRlZ29yeUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlYXNvblRheEV4ZW1wdENvZGVkIiB0eXBlPSJSZWFzb25UYXhFeGVtcHRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWFzb25UYXhFeGVtcHRDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGF4VHlwZUNvZGVkIiB0eXBlPSJUYXhUeXBlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4VHlwZUNvZGVkT3RoZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheFBlcmNlbnQiIHR5cGU9IkRlY2ltYWwxMF80Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhQYXltZW50TWV0aG9kQ29kZWQiIHR5cGU9IlRheFBheW1lbnRNZXRob2RDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhQYXltZW50TWV0aG9kQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4YWJsZUFtb3VudCIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheGFibGVBbW91bnRJblRheEFjY291bnRpbmdDdXJyZW5jeSIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXhBbW91bnQiIHR5cGU9IkRlY2ltYWwyMV82Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhBbW91bnRJblRheEFjY291bnRpbmdDdXJyZW5jeSIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheExvY2F0aW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTG9jYXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGF4IiB0eXBlPSJUYXgiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGF4RnVuY3Rpb25RdWFsaWZpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbER1dHlUYXhPckZlZUN1c3RvbXNJdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE9mQWxsRHV0aWVzVGF4ZXNBbmRGZWVzQ3VzdG9tc0l0ZW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT2ZFYWNoRHV0eVRheE9yRmVlVHlwZUN1c3RvbXNEZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPZkFsbER1dGllc1RheGVzQW5kRmVlVHlwZXNDdXN0b21zRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UmVsYXRlZEluZm9ybWF0aW9uIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRheENhdGVnb3J5Q29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmljdWx0dXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQYXlJRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FibGVkVmV0ZXJhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eVBhaWRCeVN1cHBsaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGb3JFeHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEZvclJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0ZnJvbUNvdW50eVByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRmcm9tTG9jYWxQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0ZnJvbVNjaG9vbFByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRmcm9tU3RhdGVQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0RnJvbVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0R29vZHNhbmRTZXJ2aWNlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0TGV0dGVyT25GaWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRMb2NhbFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdE5vdEZvclJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LVBlclN0YXRlTGF3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRQcm92aW5jaWFsU2FsZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdFNhbGVUb1VTR292ZXJubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0VG9sbFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVFeHBvcnRJdGVtVGF4Tm90Q2hhcmdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaGVyUmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZXN0ZWFkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclRheGFibGVNYXRlcmlhbEV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93ZXJSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFRheGFibGVMYWJvckV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWl4ZWRUYXhSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tSG9tZXN0ZWFkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOby1Ob3RUYXhFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEV4ZW1wdEZvclJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90RXhlbXB0Tm90Rm9yUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RUYXhhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuU3BhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyUHJvcGVydHlUYXhFeGVtcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXI2NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjdXJyaW5nRXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlc091dHNpZGVTY29wZU9mVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsbHlFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVycmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2FnZUV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVBZGRlZFRheER1ZUZyb21BUHJldmlvdXNJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkVGF4Tm90Tm93RHVlRm9yUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya2luZ0Zhcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Illlcy1UYXhFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ilplcm9SYXRlZEdvb2RzIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlJlYXNvblRheEV4ZW1wdENvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtRm9yRXhwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZXMtVGF4RXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOby1Ob3RUYXhFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1Gb3JSZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEV4ZW1wdE9yRm9yUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtTm90Rm9yUmVzYWxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RFeGVtcHROb3RGb3JSZXNhbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFBheUlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtU2FsZVRvVVNHb3Zlcm5tZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtUGVyU3RhdGVMYXciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yVGF4YWJsZU1hdGVyaWFsRXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFRheGFibGVMYWJvckV4ZW1wdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90VGF4YWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdFRvbGxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtR29vZHNBbmRTZXJ2aWNlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LVByb3ZpbmNpYWxTYWxlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZXN0ZWFkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JpY3VsdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya2luZ0Zhcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5TcGFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0TG9jYWxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmxlZFZldGVyYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Ib21lc3RlYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXI2NSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0RnJvbVNjaG9vbFByb3BlcnR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGcm9tTG9jYWxQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjdXJyaW5nRXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGcm9tQ291bnR5UHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsbHlFeGVtcHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzYWdlRXhlbXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGcm9tU3RhdGVQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJQcm9wZXJ0eVRheEV4ZW1wdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LUxldHRlck9uRmlsZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUYXhUeXBlQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkxMUNpdHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkxMUNvdW50eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTExRXhjaXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MTFTdGF0ZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTExVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvbW1vZGF0aW9uc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRWYWxvcmVtVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JpY3VsdHVyYWxFeHBvcnRSZWJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmljdWx0dXJhbGxldnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xpY0JldmVyYWdlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9sTWFya1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsVGF4ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGktRHVtcGluZ0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2Vzc21lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzTGljZW5zZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NQcml2aWxlZ2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhclRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eVJlbnRhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eVNhbGVzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2ZmZWVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvaW5PcGVyYXRlZERldmljZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9kaXR5U3BlY2lmaWNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZUluY29tZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRlcnZhaWxpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlPclBhcmlzaFNhbGVzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlSZW50YWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmF1bHRMYWJvclRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95bWVudFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5lcmd5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmhhbmNlZDkxMVN0YXRlRXhjaXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnZpcm9ubWVudGFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGF0ZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaXNlRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEV4Y2lzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEluY29tZVRheFdpdGhob2xkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVmFsdWVBZGRlZFRheE9uR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxWYWx1ZUFkZGVkVGF4T25TZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVlSW5MaWV1Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUNBTWVkaWNhcmVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJQ0FTb2NpYWxTZWN1cml0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRklDQVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhbmNoaXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsTFVTVFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbFNwaWxsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsU3VwZXJGdW5kVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYW1pbmdUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxDb25zdHJ1Y3Rpb25UYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdpZnRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQW5kU2VydmljZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzUmVjZWlwdHNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRpY2FwVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNXYXN0ZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaHdheVVzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWxsdW1pbmFudHNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbEluY29tZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5oZXJpdGFuY2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxGdWVsVGF4QWdyZWVtZW50VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvckJ5VHJhZGVUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWt5VW5kZXJncm91bmRTdG9yYWdlVGFua1RheEZlZGVyYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWt5VW5kZXJncm91bmRTdG9yYWdlVGFua1RheFN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWdodER1ZXNQYXlhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbENvbnN0cnVjdGlvblRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxTYWxlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikx1c3RUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRyb3BvbGl0YW5UcmFuc2l0VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNjZWxsYW5lb3VzQ2FzaERlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc2NlbGxhbmVvdXNTdGF0ZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9uZXRhcnlDb21wZW5zYXRvcnlBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yRnVlbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVuaWNpcGFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uYWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVGF4ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcGVyQ29uc29ydGl1bVRheC1JdGFseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxQcm9wZXJ0eVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0VGhyZXNob2xkVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJlbmNlRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlVGhyZXNob2xkVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aXNpb25hbGNvdW50ZXJ2YWlsaW5nRHV0eUJvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Zpc2lvbmFsQ291bnRlcnZhaWxpbmdEdXR5Q2FzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxEdXR5Qm9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxEdXR5Q2FzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljSGVhbHRoQW5kRWR1Y2F0aW9uVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsUHJvcGVydHlUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzQW5kVXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVBlcmNlbnRhZ2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldmVyYW5jZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpZnRlZFNvY2lhbFNlY3VyaXRpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaWZ0ZWRXYWdlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xpZFdhc3RlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ29uc3RydWN0aW9uVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFkaXVtVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFtcER1dHktSW1wb3N0YWRpQm9sbG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlYW5kTG9jYWxTYWxlc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVBbmRMb2NhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVBbmRQcm92aW5jaWFsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUV4Y2lzZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVvclByb3ZpbmNpYWxGdWVsVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZU9yUHJvdmluY2lhbFNhbGVzVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW9yUHJvdmluY2lhbFRheE9uR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlb3JQcm92aW5jaWFsVGF4T25TZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVSZW50YWxUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlVGF4b25TcGVjaWZpY0xhYm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcmZ1bmRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1clRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VzcGVuZGVkRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbW11bmljYXRpb25zRGV2aWNlRm9yVGhlRGVhZlNlcnZpY2VFeGNpc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21tdW5pY2F0aW9uc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyZXNob2xkVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb2JhY2NvVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb25uYWdlVGF4ZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3VyaXNtVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdXJuT3ZlclRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5lbXBsb3ltZW50VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlV0aWxpdHlVc2Vyc1RheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWF0aW9uRGVwb3NpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVBZGRlZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdGhob2xkaW5nVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrZXJzQ29tcGVuc2F0aW9uVGF4Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkRlY2ltYWwxMF80Ij4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+Ci0gICAgICAgICAgICA8eHNkOnRvdGFsRGlnaXRzIHZhbHVlPSIxMCIvPgotICAgICAgICAgICAgPHhzZDpmcmFjdGlvbkRpZ2l0cyB2YWx1ZT0iNCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUYXhQYXltZW50TWV0aG9kQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcm1hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmQXNzZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlWZW5kb3IiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkxvY2F0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxvY2F0aW9uUXVhbGlmaWVyQ29kZWQiIHR5cGU9IkxvY2F0aW9uUXVhbGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTG9jYXRpb25RdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMb2NhdGlvbklkZW50aWZpZXIiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxBZGRyZXNzSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJOYW1lQWRkcmVzcyIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJHUFNDb29yaWRpbmF0ZXMiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkxvY2F0aW9uIiB0eXBlPSJMb2NhdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJMb2NhdGlvblF1YWxpZmllckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXJpc2RpY3Rpb25Ub1JlY2VpdmVDcmVkaXRGb3JVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWl0dGluZ1V0aWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzU2NoZWR1bGVEIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNCbG9ja0dyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUJhc2VBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNUcmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzU2NoZWR1bGVLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbEFkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxpbmdBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtYW5lbnRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aHBsYWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JsZHdpZGVHZW9ncmFwaGljTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWFyZXN0Q3Jvc3NTdHJlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUNyb3NzU3RyZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5nZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcnRlclNlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtlcklkZW50aWZpZXJMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlU3ViZGl2aXNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyaWRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2VyVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0aXR1ZGUtTG9uZ2l0dWRlU291cmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXBTb3VyY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcFJlZmVyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JpZFNvdXJjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxpcXVvdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFpbmhvbGVOdW1iZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlCbG9jayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vdGFnZUNhbGxEaXJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uRGlyZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlckNvbnRpbmVudGFsTGVhc2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXBRdWFkcmFuZ2xlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxNZXJpZGlhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbFNoZWxmQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbFNoZWxmQmxvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljaWFsUHJvdHJhY3Rpb25EaWFncmFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyUXVhcnRlclF1YXJ0ZXJTZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyUXVhcnRlclNlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb25UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBYnN0cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWd1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2FsVHJhbnN2ZXJzZU1lcmNhdG9yUXVhZHJhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJzZURpcmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGVyc0xvY2F0aW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJzTG9jYXRpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVhbFN0YXRlbWVudHNNYWlsaW5nQWRkcmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eWFuZFN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxQb2ludHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFybWVkU2VydmljZXNMb2NhdGlvbkRlc2lnbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRWNvbm9taWNBcmVhUmVnaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEJpbGxvZkxhZGluZ09mZmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvcG9saXRpY2FsTmFtZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlPZk9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlybWF0aW9uTWFpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuQ3VzdG9tc09mZmljZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlc3BvbmRlbmNlTWFpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUmF0ZUJhc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlPclBhcmlzaEFuZFN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblRhbmtDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuU1BMQyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5T3JQYXJpc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvbkNlbnRlck51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb24tU2hpcHBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0T2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdE9mUmVzaWRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21pY2lsZVR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llckxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWN0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0RXF1YWxpemF0aW9uUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25GcmVpZ2h0Rm9yd2FyZGVyTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxJbmZvcm1hdGlvblByb2Nlc3NpbmdTdGFuZGFyZHM1NS1OYW1lZFBvcHVsYXRlZFBsYWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVS5TLkN1c3RvbXNGYWNpbGl0aWVzSW5mb3JtYXRpb25hbmRSZXNvdXJjZU1hbmFnZW1lbnRTeXN0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0U3RhdGlvbkFjY291bnRpbmdDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduVHJhZGVab25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlQWxvbmdzaWRlVmVzc2VsLUZyZWVPbkJvYXJkUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRTdGF0aW9uR2VvZ3JhcGhpY0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQWlyVHJhbnNwb3J0QXNzb2NpYXRpb25Mb2NhdGlvblF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlTdGFuZGFyZE1vdmVtZW50UHJvY2VkdXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblN0b3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVGT0JQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydE9mRW1iYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRGdXJuaXNoZWRQcm9wZXJ0eUZPQlBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbE9mZmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0cm9wb2xpdGFuU2FtcGxpbmdBcmVhUmVnaW9uQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV4aWNhblBvc3RhbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlPclN0YXRlRnJvbVBvaW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luLUFmdGVyTG9hZGluZ09uRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclVubGlzdGVkRnJlZU9uQm9hcmRQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlbmFuZFByZXBheVN0YXRpb25MaXN0Q29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZEFjY2VwdGFuY2VQb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luLVNoaXBwaW5nUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uVmVzc2VsLUZyZWVPbkJvYXJkUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRvZkFycml2YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRvZkRpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5TWFpbGluZ0FkZHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmVudHNBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckJ1c2luZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsU2VydmljaW5nT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sUG9pbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNEaWdpdFVTWklQIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0RGlnaXRVU1pJUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNURpZ2l0VVNaSVAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNEaWdpdENhbmFkaWFuUG9zdGFsQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNkRpZ2l0Q2FuYWRpYW5Qb3N0YWxDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQXJlYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluUmFpbENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uYWxFZHVjYXRpb25TZXJ2aWNlQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1cmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZENhcnJpZXJBbHBoYUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlQWRtaW5pc3RyYXRpdmVNZXNzYWdlVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VidXJiYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlPclN0YXRlQW5kUG9pbnRzV2l0aGluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xEaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xDYW1wdXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1TUExDIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZU51bWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVPclByb3ZpbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluU3RvcmFnZVRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3aXRjaGluZ0Rpc3RyaWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2NvbnRpbmVudGFsRnJlaWdodEJ1cmVhdSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxDYXJnb0xvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG93bnNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBvcmFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFRlcnJpdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4aW5nRGlzdHJpY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZE5hdGlvbnNMb2NhdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVyYmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1VuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaWxsYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxTdG93YWdlTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoYXJmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWm9uZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJzZWFzQW5kUG9pbnRMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxQb3J0T2ZEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RDaGFyZ2VMb2NhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc09mZmljZU9mTWFuaWZlc3RPcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNPZmZpY2VPZk1hbmlmZXN0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXR5TG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpblJhaWxJbnRlcm1vZGFsVGVybWluYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uUmFpbEludGVybW9kYWxUZXJtaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RPcHRpb25hbFBvcnRPZkRpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kT3B0aW9uYWxQb3J0T2ZEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZBY2NlcHRhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbnNvbGlkYXRpb25Qb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGUtQ29uc29saWRhdGlvblBvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0T2ZEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFBheWFibGVBdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydE9mRW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRPZkV4aXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW1Qb2ludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nUG9ydE9mTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nUG9ydE9mRGlzY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0T2ZMb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxEZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwYXRjaGluZ1Bvb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ09yaWdpbk9mR29vZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZSZWNlaXB0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Qb29sIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3NoaXBtZW50UG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZENoYXJnZUxvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdSZWxlYXNlT2ZmaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZE9wdGlvbmFsUG9ydE9mRGlzY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxheVBvcnQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkxvY2F0aW9uSWRlbnRpZmllciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTG9jSUQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxvY2F0aW9uRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkxvY2F0aW9uSWRlbnRpZmllciIgdHlwZT0iTG9jYXRpb25JZGVudGlmaWVyIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHUFNDb29yaWRpbmF0ZXMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkdQU1N5c3RlbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkxhdGl0dWRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTG9uZ2l0dWRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJHUFNDb29yaWRpbmF0ZXMiIHR5cGU9IkdQU0Nvb3JpZGluYXRlcyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQWxsb3dPckNoYXJnZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iQWxsb3dPckNoYXJnZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQWxsb3dPckNoYXJnZSIgdHlwZT0iTGlzdE9mQWxsb3dPckNoYXJnZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWxsb3dPckNoYXJnZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSW5kaWNhdG9yQ29kZWQiIHR5cGU9IkluZGljYXRvckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkluZGljYXRvckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJhc2lzQ29kZWQiIHR5cGU9IkJhc2lzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQmFzaXNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kT2ZIYW5kbGluZ0NvZGVkIiB0eXBlPSJNZXRob2RPZkhhbmRsaW5nQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTWV0aG9kT2ZIYW5kbGluZ0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBbGxvd2FuY2VPckNoYXJnZURlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQWxsb3dPckNoZ0Rlc2MiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJWYWxpZGl0eURhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNpc1F1YW50aXR5UmFuZ2UiPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQmFzaXNNb25ldGFyeVJhbmdlIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJUeXBlT2ZBbGxvd2FuY2VPckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iVGF4Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTZXFObyIgdHlwZT0ieHNkOmludCIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iMSIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBbGxvd09yQ2hhcmdlIiB0eXBlPSJBbGxvd09yQ2hhcmdlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkluZGljYXRvckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBYm91dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VMaW5lSXRlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZVBlckNhbGxPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VMaW5lSXRlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVBlckNhbGxPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWludXMtQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW51cy1QZXJjZW50YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0FsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9BbGxvd2FuY2VPckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXMtQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzLVBlcmNlbnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXNPck1pbnVzT3JBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXNPck1pbnVzLVBlcmNlbnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPdGhlciIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJCYXNpc0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9uZXRhcnlBbW91bnQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iTWV0aG9kT2ZIYW5kbGluZ0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsQmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQ2hlY2tUb0N1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRDdXN0b21lckFjY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVRvQmVQYWlkQnlWZW5kb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVRvQmVQYWlkQnlDdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZkdyb3NzUXVhbnRpdHlJbnZvaWNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlVG9CZUlzc3VlZEJ5VmVuZG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VUb0JlSXNzdWVkQnlSZXNlbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlRGVuaWVkQnlWZW5kb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25Pbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUGF5YWJsZVRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjcnVhbEZ1bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRGdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoSW5BZHZhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGVBbmRBZGR0b0ludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFsbG93T3JDaGdEZXNjIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlZklEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkRlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2VydmljZUNvZGVkIiB0eXBlPSJTZXJ2aWNlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VydmljZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFsbG93T3JDaGdEZXNjIiB0eXBlPSJBbGxvd09yQ2hnRGVzYyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRGVzY3JpcHRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkRlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZEZXNjcmlwdGlvbiIgdHlwZT0iTGlzdE9mRGVzY3JpcHRpb24iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvblRleHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxhbmd1YWdlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgdHlwZT0iRGVzY3JpcHRpb24iLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2VydmljZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBYm91dCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWJzb2x1dGVNaW5pbXVtQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2Nlc3NDaGFyZ2UtRmVkZXJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXNzQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXNzQ2hhcmdlLVN0YXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50TnVtYmVyQ29ycmVjdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNpZEJhdHRlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdtZW50b2ZEZWxpdmVyeUZlZUFPRCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZhdGlvbk9mQ2FybmV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsQ29tbWVyY2lhbEludm9pY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsQ29waWVzT2ZGcmVpZ2h0QmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbE1hdGVyaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsVGFyaWZmQ2xhc3NpZmljYXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRPbi1EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkT24tT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRyZXNzQ29ycmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkVG9NYWtlTWFya2V0VmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRGb3JNYXhpbXVtQ2hhcmdlc0JpbGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRGb3JNaW5pbXVtQXZlcmFnZVRpbWVSZXF1aXJlbWVudEJpbGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pbmlzdHJhdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRWYWxvcmVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlQ2hhcmdlc0hhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlRGVzdGluYXRpb25BbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VEZXN0aW5hdGlvbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZUxhZGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZU9yaWdpbkFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZU9yaWdpbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmVydGlzaW5nQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZmZpZGF2aXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50RGlzYnVyc2VtZW50LURlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudERpc2J1cnNlbWVudC1PcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmNyYWZ0T25Hcm91bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckV4cG9ydENlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJFeHByZXNzQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJsaW5lT3BlbmluZ0ZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlycG9ydFRlcm1pbmFsSGFuZGxpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclRyYW5zcG9ydGF0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9saWNCZXZlcmFnZVJlcG9ydENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsZWdoZW55Q291bnR5UEFEZWxpdmVyeUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VMaW5lSXRlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZU1lc3NhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZVBlckNhbGxPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlQWR2YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlRm9yQ29uc2lnbm1lbnRNZXJjaGFuZGlzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlTm9uLVBlcmZvcm1hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcmF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lbmRpbmdFeHBvcnREb2N1bWVudGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm5lYWxIZWF0U3RlZWxvckdsYXNzVHJlYXRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm9kaXppbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGktZHVtcGluZ0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmJpdHJhcnlJbkFkZGl0aW9uVG9UaHJvdWdoUmF0ZXNhbmRDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnRXb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NlbWJseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaXN0QW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50c1RvQmlsbE9mTGFkaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWREZWJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5raW5nRHJhZnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZUZyZWlnaHRBbGxLaW5kc1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2ljUmVvcmRlckFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbWluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVkZGluZ0ZlZWRpbmdEaXNpbmZlY3RpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZWZGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJleW9uZENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV5b25kRnJlaWdodENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxBbmRIb2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsZWREZW1hbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ0F0dGVuZGFuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxhY2tMdW5nVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9ja2luZ0FuZEJyYWNpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb3dlckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9idGFpbENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvbmRBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvbmRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcFNoZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3JkZWF1eEFyYml0cmFyaWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3RoLUZsYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFrYnVsa1NlcnZpY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVha0J1bGtTdXJmYWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmlkZ2VUb2xsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZW5Mb3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlblBhY2thZ2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyYWdlT3JEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdW5rZXJBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdW5rZXJBZGp1c3RtZW50LTIwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVua2VyQWRqdXN0bWVudC00MEZvb3RDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bmtlclN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVyZGVuT3ZlcmhlYWRPckFsbG93YW5jZUZvckluZGlyZWN0Q29zdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cm5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVySGFuZENhcnJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDYXJBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhYmxlUHJlc3N1cml6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhYmxlc1NlbmRpbmdPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbFRhZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FtcEFyYml0cmFyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRhR3JlYXRMYWtlc0FkZGl0aW9uYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkNRQ3VzdG9tc0NsZWFyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5DdXJyZW5jeUV4Y2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkltcG9ydFRlcm1pbmF0aW9uRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhblJlY29uc2lnbm1lbnRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuUmVtYW5pZmVzdEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGF0aW9uQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsZWRPcmRlckhlYXZ5RHV0eUZsYXRjYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcHBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcHR1cmVBZGRpdGlvbmFsRGF0YSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29UYXhlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyUmVudGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyQ3JlZGl0QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyRGViaXRBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJOb3RpZmljYXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnRhZ2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGFsb2dpbmdTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbEJ1eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHNPZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZDb25mb3JtYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZk9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZlJlZ2lzdHJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhaW5BbmRCaW5kZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFtYmVyT2ZDb21tZXJjZVNlcnZpY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZU9mQWlyYmlsbC1TZXJ2aWNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZUxpbmVJdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlTWVzc2FnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlUGVyQ2FsbE9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VzRm9yd2FyZEFkdmFuY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJ0ZXJTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhc3Npc1RyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVtaWNhbE1pbGxpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWNhZ29Mb29wQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaWdhcmV0dGVTdGFtcGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5TWFpbnRlbmFuY2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlQaWNrLXVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5VGVybWluYWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFuaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zaW5nU2VhbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hdGluZ0RpcFJ1c3Rwcm9vZkVEUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ09EQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT0RDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0T25EZWxpdmVyeUFsdGVyYXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RPbkRlbGl2ZXJ5RGVsZXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLW1hbnVmYWN0dXJpbmdEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmF0aW9uUGVyZm9ybWFuY2VBbmROb24tcGVyZm9ybWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmVBbGxTYW1lRGF5U2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pc3Npb25BbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11bmljYXRpb25zQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGV0aXRpdmVBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGl0aXZlQ2FyQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZXRpdGl2ZVByaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wcmVzc29yQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jZXNzaW9uQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jZXNzaW9uTW9uZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmdlc3Rpb25TdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbm5lY3RDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNlcnZhdGlvblJlc2VhcmNoRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVVbmxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0YW50U3VydmVpbGxhbmNlU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RhbnRTdXJ2ZWlsbGFuY2VTZXJ2aWNlLUFybWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdWxhcml6YXRpb25GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bGFyTGVnYWxpemF0aW9uU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsdGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVyU2VydmljZVByb3ZpZGVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckRlcG9zaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJEZXN0dWZmaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyRGl2ZXJzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTGVhc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTG9zc0RhbWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU2VydmljZUNoYXJnZVVLRVVSIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTZXJ2aWNlQ2hhcmdlVVNBQ2FuYWRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTdHVmZmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyVHJhaWxlckFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludW91c01pbGVhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEVzY2FsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0U2VydmljZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZEF0bW9zcGhlcmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlcnRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLW9wQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29wZXJhdGl2ZUFkdmVydGlzaW5nTWVyY2hhbmRpc2luZ0FsbG93YW5jZVBlcmZvcm1hbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3B5aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3B5T2ZCaWxsT2ZMYWRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcHlPZkRlbGl2ZXJ5UmVjZWlwdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29yZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFJlY292ZXJ5QWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFJlY292ZXJ5RmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3R0b25GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50QW5kUmVjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRlcnZhaWxpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Vwb25SZWltYnVyc2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmFmdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JhdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW5jeUFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5QWRqdXN0bWVudC0yMEZvb3RDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5QWRqdXN0bWVudC00MEZvb3RDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5QWRqdXN0bWVudC1CcmVha0J1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5QWRqdXN0bWVudEZhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJBY2NvdW50SWRlbnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyRXF1aXBtZW50QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQnJva2VyRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRXhhbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ZlZXMtQ29udGFpbmVyTGV2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNGZWVzLUxpZnRMZXZlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0Zvcm1hbGl0aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ludm9pY2UtQWRkaXRpb25hbFBhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNQZW5hbHR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1dEFuZFBhcmFsbGVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXR0aW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VkTWVyY2hhbmRpc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZVRvQ2FycmllckVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlVG9DYXJyaWVyVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VUb0dvdmVybm1lbnRFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFEcmF3aW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFkaGVhZE1pbGVhZ2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWZBbmREaXNhYmxlZFN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyZWRWYWx1ZUZvckNhcnJpYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJlZFZhbHVlRm9yQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyZWRWYWx1ZUZvckluc3VyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVkdWN0VG9NYWtlTWFya2V0VmFsdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVjdGl2ZUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmaWNpdEZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlLUluc3RhbGxhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsYXlGdXJuaXNoaW5nRGVzdGluYXRpb25XZWlnaHRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbWFuZENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVtdXJyYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW11cnJhZ2UtQXZlcmFnZUFncmVlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVtdXJyYWdlLVNwZWNpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0SW5MaWV1T2ZPcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVyYW1waW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXJyaWNrQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNpZ25hdGVkU3VwcGxpZXJJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uT2ZQb3dlclVuaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb25PZlRyYWlsZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb24tU3BlY2lhbFR5cGVGbGF0Q2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb25VbmxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVybWluZWRGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZlbG9wbWVudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGllU2VydmljZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UHJvZHVjdEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNidXJzZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2Nvbm5lY3RDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1Ecm9wQm94Q29udmVuaWVuY2VDdHIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LUluY2VudGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtTXVsdGlwbGVTaGlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtU2VydmljZU9wdGlvbkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1TZXJ2aWNlT3B0aW9uUGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1TcGVjaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwbGF5QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvblNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yRGlzY291bnRBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmVyc2lvbkFuZFJlY29uc2lnbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmVyc2lvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2ZXJzaW9uVG9BaXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY2thZ2UtQm9hdERldGVudGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhdGlvbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9vci1Uby1Eb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3dlbFBpbkNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnQXRQb3J0T2ZEZWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZWF0UG9ydE9mRGViYXJrYXRpb25SYXRlWm9uZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZUF0UG9ydE9mRW1iYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXlhZ2VhdFBvcnRPZkVtYmFya2F0aW9uUmF0ZVpvbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXlhZ2VMaW5lSGF1bCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyQXNzaXN0ZWRVbmxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnNXYWdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcERvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3BZYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVtQ29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1bURlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydW1VcENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ5ZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyeUljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVubmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eURyYXdiYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJseUJ1eUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybHlQYXltZW50QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJseVNoaXBBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeVBvcnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeVN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlXZWlnaGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5jbG9zdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRvcnNlbWVudEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5lcmd5Y2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmVyZ3lTdXJjaGFyZ2VGdWVsQWRqdXN0bWVudEZhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nU3VwcGxpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ3JhdmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50ZXJlZFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnZpcm9ubWVudGFsUHJvdGVjdGlvblNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudE1hbnVmYWN0dXJlclJlc3RvcmF0aW9uQXVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY2FsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY29ydFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY3JvdyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyMVByZXNlbnRhdGlvbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyb3BlYW5Qb3J0Q2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc2l2ZVZhbHVlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NNaWxlYWdlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NQZXJpb2RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NWYWx1ZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzV2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNoYW5nZUFjY2Vzc0NyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVzaXZlVXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdXNpdmVVc2VPZkVxdWlwbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhoaWJpdGlvbkRlbGl2ZXJ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0aW9uUGlja3VwQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBhbmRlZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRlZE9uZURheUNvbnN1bGFyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkU2VydmljZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkU2hpcG1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0aW5nRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0aW5nUHJlbWl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0Q3VzdG9tc0NsZWFyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0RGVjbGFyYXRpb25zLUF1dG9tYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0RGVjbGFyYXRpb25zLVVTU2hpcHBlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydEltcG9ydENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0TGljZW5zZUFwcGxpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRTaGlwcGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFDb3BpZXNhbmRNYWlsaW5ncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFMYWJvckhlbHBlclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhTGVuZ3RoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYUxlbmd0aFN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFTZXJ2aWNlLUNvdW50ZXItVG8tQ291bnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFicmljYXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3NpbWlsZUNoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3NpbWlsZUNoYXJnZXMtQWRkaXRpb25hbFBhZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsZWRMYW1wUGFuZWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZheFByZS1hbGVydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFRyYW5zZmVyU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0QXJ0aWNsZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RGbGlnaHRPdXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRyYWNrU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0UmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb3JTdG9ja1Byb3RlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvb2RBbmRMb2RnaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduQ3VzdG9tc0R1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25NaWxpdGFyeVNhbGVzUmVudGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTWlsaXRhcnlTYWxlc1NwZWNpYWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25PZmZpY2VBZHZhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkQ291cG9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGluZ0FnZW50Q29tbWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhbmNoaXNlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlRG9taWNpbGVTaGlwbWVudFByb2Nlc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEJhc2VkT25Eb2xsYXJNaW5pbXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0Q2hhcmdlc1RvQm9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0Q2hhcmdlc1RvRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRFcXVhbGl6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRJbnRlcm5hdGlvbmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0SW50ZXJuYXRpb25hbE5vbi1VU0RvbGxhcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRJbnRlcm5hdGlvbmFsVVNEb2xsYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0UGFzc3Rocm91Z2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZXNobmVzc0xlYWtlckFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbFN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVsbFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bGxUcnVja2xvYWRBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bWlnYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhcm1lbnREaXN0cmljdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FybWVudFN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzUHJlc3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdGV3YXlGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdsYXplIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb2xkRmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0FuZFNlcnZpY2VzQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0FuZFNlcnZpY2VzQ3JlZGl0QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0FuZFNlcnZpY2VzVGF4Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50SW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFdhcmVob3VzZUZlZS1EZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFdhcmVob3VzZUZlZS1PcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluRG9vcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluRmxvd0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhdHVpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyaW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1JlY2VpcHRzU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cGFnZURpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cGVkSXRlbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZWRJbnNwZWN0aW9uVGVjaG5pY2FsU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VsZlBvcnREZWxpdmVyeUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZGxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRsaW5nQ2hhcmdlc09uRGlzdHJpYnV0aW9uRnJlaWdodEZvcndhcmRlZEJleW9uZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZGxpbmdGcmVpZ2h0QXRQb3NpdGlvbnNOb3RJbW1lZGlhdGVseUFkamFjZW50VG9WZWhpY2xlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJib3JNYWludGVuYW5jZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFyYm9yTWFpbnRlbmFuY2VSZXBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhdWxpbmdBbmRIb2lzdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF1bGluZ0FuZEhvaXN0aW5nVG9CZURpcmVjdEJpbGxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzQ2FyZ29DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c0NhcmdvT25EZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbHNIYW5kbGluZ0ZlZS1Eb21lc3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWxzSGFuZGxpbmdGZWUtSW50ZXJuYXRpb25hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzU3RvcmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdEluVHJhbnNpdENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXRUcmVhdENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdnlEdXR5RmxhdENhckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdnlMaWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoU2VjdXJpdHlSZWRJbi1ib25kU2VhbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaHdheUludGVyY2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2ludGluc0FuZEhhdWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGRpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVMaW5lRnJlaWdodENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9uZXlGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvb2stdXBjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc2VDaGFyZ2VTcGVjaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZWhvbGRHb29kc1BpY2stdXBPckRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQVRBQWlyYmlsbFByZXBhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQVRBRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGlmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0U2VydmljZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wcm9wZXJEb2N1bWVudGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmJvdW5kRnJlaWdodENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29tZUZyZWlnaHRNYW51ZmFjdHVyaW5nVG9TaGlwcGluZ1BvaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnJlY3RCaWxsaW5nQWNjb3VudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlQcmljZUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbExpY2Vuc2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFRyYW5zcG9ydGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGVDYWJsZUNvbm5lY3RvcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGVQaWNrLXVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0QXREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdEF0T3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxhdGlvbkFuZFRyYWluaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsYXRpb25XYXJyYW50eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdWxhdGVkVGFua0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVBsYWNlbWVudENvc3RDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVByZW1pdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVByb3ZpZGVkQnlMZXNzZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVByb3ZpZGVkQnlMZXNzb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJkaXZpc2lvblByb2ZpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0T25SZWZ1bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0T25TZWN1cml0eURlcG9zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW1Vc2VQZXJtaXR0ZWRBdFNwZWNpYWxSYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQWlyVHJhbnNwb3J0QXNzb2NpYXRpb25Db21taXNzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQWlyVHJhbnNwb3J0QXNzb2NpYXRpb25NYXJrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxDb3VyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsRG9vci10by1Eb29ySGFuZGxpbmdGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVycGxhbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyc3RhdGVIaWdod2F5VG9sbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5UcmFuc2l0UHJpY2VQcm90ZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRyYS1wbGFudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZUFkZGl0aW9uYWxBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlQXQtQ29zdEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZURlbGl2ZXJ5VGVybXNBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VOby1DaGFyZ2VBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZVdpdGhHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJpc2hBcmJpdHJhcmllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNsYW5kRGVsaXZlcnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklzbGFuZFBpY2stVXBDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0YWxpYW5SZWxlYXNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtUGVyY2VudGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbS1Vbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZWVwRnJvbUZyZWV6aW5nUGVyY2VudERpZmZlcmVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS29zaGVyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJlbEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFiZWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JDb3N0T2ZSZW1vdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvck1vZGlmeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JOb1Ryb3VibGVGb3VuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JPdmVydGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JQcmVtaXVtT3ZlcnRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yUmVwYWlyQW5kUmV0dXJuT3JkZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yU3RyYWlnaHQtdGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JUZXN0QW5kQ2FsaWJyYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWRpbmdBZGp1c3RtZW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kQ3VycmVuY3lBZGp1c3RtZW50RmFjdG9yLTIwRm9vdENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZEN1cnJlbmN5QWRqdXN0bWVudEZhY3Rvci00MEZvb3RDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc2hpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVPcmRlckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZVBheW1lbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxheW91dERlc2lnbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF5b3ZlckNoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWRGYWN0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWtpbmdVbmRlcmdyb3VuZFN0b3JhZ2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlU2hvcnRmYWxsQ29uc2lkZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc1RoYW5Db250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuVHJ1Y2tsb2FkQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkNyZWRpdFByb2Nlc3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VBbmRUaXRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZWxpbmVTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZnRHYXRlVHJ1Y2tPckZvcmtsaWZ0U2VydmljZUF0UGljay11cERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1lRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVoYXVsRnJvbVBvcnRPZkRlYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5laGF1bFBlcmNlbnREaWZmZXJlbnRpYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVoYXVsVG9Qb3J0T2ZFbWJhcmthdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZXJUZXJtc0F0UG9ydE9mRGViYXJrYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVyVGVybXNBdFBvcnRPZkVtYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGVkRGFtYWdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRpb25BbnRpLUR1bXBpbmdEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGlvbkNvdW50ZXJ2YWlsaW5nRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRpb25UYXhBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0aW9uVG90YWxEdWVVU0N1c3RvbXNTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGlvblRvdGFsRmVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZ0xhYm9yQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZFdlaWdoaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbERlbGl2ZXJ5RHJheWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jb21vdGl2ZURlbGF5ZWRJblN3aXRjaGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY29tb3RpdmVVbmRlck93blBvd2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3RDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdHRlcnlDaGFyZ2VCYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3R0ZXJ5Q3Jvc3NSZWRlZW1lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93LVRpZXJMb3R0ZXJ5Q2FzaGluZ0JvbnVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3ctVGllckxvdHRlcnlXaW5uZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMdW1wU3VtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWNoaW5pbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxpbmctUG9zdGFnZUNvc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxpbmctU2VydmljZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxJbnZvaWNlVG9FYWNoTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmlmZXN0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXREZXZlbG9wbWVudEZ1bmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJraW5nT3JUYWdnaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJyaWFnZVJ1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lbW9SZXR1cm5hYmxlQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJjaGFuZGlzZVByb2Nlc3NpbmdGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VSYXRlQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2VuZ2VyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0YWxzU3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlkLVRpZXJMb3R0ZXJ5Q2FzaGluZ0JvbnVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWQtVGllckxvdHRlcnlXaW5uZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxlYWdlRmVlRm9yUmVwYWlyQW5kUmV0dXJuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxlYWdlT3JUcmF2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbnVzLUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWludXMtUGVyY2VudGFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kaWZpZWRBdG1vc3BoZXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb250aGx5UmVudGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3VudERlbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdW50aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdW5pY2lwYWxTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11c2hyb29tRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3RGlzdHJpYnV0aW9uQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdJdGVtQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdTdG9yZUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3U3RvcmVEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3V2FyZWhvdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdXYXJlaG91c2VEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3WW9ya0RlbGl2ZXJ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdZb3JrUGljay11cENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkhEV2hhcmZhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0FsbG93YW5jZU9yQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUR1dGlhYmxlQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uR2VuZXJhdGVkRnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLXJldHVybmFibGVDb250YWluZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1JldHVybkNyZWRpdEFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ybWFsUHVtcENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90YXJpemVkQWZmaWRhdml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeUNvbnNpZ25lZUJlZm9yZURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3p6bGVDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuQ2hhcmdlcy1IYXphcmRvdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuRnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlU3VwcGxpZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZnNob3JlLUFsYXNrYUhhd2FpaSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25DYXJyaWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25EZWNrQnJlYWtCdWxrRGlmZmVyZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmUtRGF5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lVGltZUVuZ2luZWVyaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmUtVGltZUxpY2Vuc2VGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZS1UaW1lLU9ubHlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZXRpbWVUb29saW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkhhbmRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvckNyZWRpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uYWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvbmFsU29mdHdhcmVTdXBwb3J0Rm9yT3BlcmF0aW9uYWxTdXBwb3J0U3lzdGVtcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uYWxTb2Z0d2FyZVN1cHBvcnRGb3JTd2l0Y2hpbmdTeXN0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25DaGFyZ2VDb2xvckZhYnJpY09mZmljZUZ1cm5pdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXItRmxhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJOb3RpZnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyQWNjZXNzb3JpYWxTZXJ2aWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckFkdmFuY2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckV4cG9ydENoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyR292ZXJubWVudEFnZW5jeURlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckdvdmVybm1lbnRBZ2VuY3lFeGFtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckltcG9ydENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJNaXNjZWxsYW5lb3VzRWFybmluZ09yQWRkaXRpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyU2VlUmVsYXRlZERlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRPZlJvdXRlTWlsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dE9mWm9uZVBpY2stdXBPckRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlQ2FibGVDb25uZWN0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyRGltZW5zaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVySGVpZ2h0Q29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVycnVuQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyc2l6ZWRQcmVtaXVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVydGltZUxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJXaWR0aENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmdTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nQ3JhdGluZ0FuZEhhbmRsaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nQ3JhdGluZ0hhbmRsaW5nQW5kVHJhbnNwb3J0YXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tJbnZvaWNlV2l0aFNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWludGluZ1ByaW1lck9yRmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhbGxldEV4Y2hhbmdlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXRpemluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyYWxsZWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmlzaENvdW50eVNhbGVzVGF4T25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc2luZ1NoaXBwZXJzRXhwb3J0RW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxBZGRpdGl2ZXNPdmVydGltZUxhYm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsQWRkaXRpdmVzU3RyYWlnaHRUaW1lTGFib3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxUYXhlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVjYW5GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmFsdHlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnREaWZmZXJlbnRpYWwtTGVzc1RoYW5Db250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnRPZlByb2R1Y3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnRPZlNoaXBtZW50VmFsdWVUaGF0SXNSZXR1cm5hYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50T2ZTaGlwcGVkUXVhbnRpdHlUaGF0SXNSZXR1cm5hYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJmb3JtYW5jZUFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9ybWFuY2VBd2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVySXRlbUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVybWl0Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtaXRzQm9uZHNFc2NvcnRBdHRlbmRhbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlck9yZGVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJQb3VuZENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxQcm9wZXJ0eU1lbWJlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxQcm9wZXJ0eVNwb3VzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhvc3BoYXRpemluZ1N0ZWVsVHJlYXRtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrbGVBbmRPaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2tVcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljay11cEFuZERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXAtT3V0T2ZBcmVhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXBTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJDaGFyZ2VzT3RoZXJUaGFuV2hhcmZhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJDaGFyZ2VzLVdoYXJmYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVyUGljay11cEFuZE9yRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJVbmxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpbG90SW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50QW5kT3JSZW1vdmFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzLUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1cy1QZXJjZW50YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzT3JNaW51cy1BbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXNPck1pbnVzLVBlcmNlbnRhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGVMYXNoaW5nRXF1aXBtZW50U3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xlV29vZC1TZXJ2aWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3JrRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0Q2hhbmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydEhhbmRsaW5nQW5kVW5sb2FkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3NpdGlvbmluZ0F0T3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0YWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0RGFtYWdlZEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3RhdG9GZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvd2VyRmFjdG9yQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLWNhcnJpYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtY2FycmlhZ2VFeGNlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWNpb3VzTWV0YWxDb250ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsb2FkaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsb2RnZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWlzZVVzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bVRyYW5zcG9ydGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkVXNhZ2VBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbkFuZERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mQWlyV2F5YmlsbC1PcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZDYW5hZGlhbkN1c3RvbXNJbnZvaWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mQ29tbWVyY2lhbEludm9pY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZFeHBvcnRFbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZkluc3VyYW5jZUNlcnRpZmljYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mVVNFeHBvcnREb2N1bWVudGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtUG9zaXRpb25lZEludmVudG9yeVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQmlsbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBZGp1c3RtZW50UGVyY2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBbmRNYXJrZXRpbmdBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlRGV2aWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckJhbGFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQmlsbGluZ0Ftb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JEZWxpdmVyeU9mQmlsbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JpdHlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvck1vbnRoQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlT3duZWRWZWhpY2xlUHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc0luVHJhbnNpdFByaXZpbGVnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY3VyZW1lbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3Npb25hbEZlZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zvcm1hSW52b2ljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3Jlc3NQYXltZW50UmVxdWlyZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbmFsQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25hbERpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9vZkNvbXBvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9vZk9mRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RpdmVTZXJ2aWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0aXZlU2VydmljZS1Db2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0aXZlU2VydmljZS1IZWF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlSG91c2Vob2xkSWRlbnRpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZU5hbWVBbmRBZGRyZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWxsaW5nRXllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVtcEFpckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVtcENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5RGlzY291bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U3VyY2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsaGVhZEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW1waW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZVJlZHVjdGlvbkJvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYmF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmUtQmlsbENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmViaWxsZWREcmF5YWdlLURlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWJpbGxlZERyYXlhZ2UtT3JpZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2lwaWVudEFkZHJlc3NDb3JyZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYW1hdGlvbkNlbnRlckhhbmRsaW5nQ2h1dGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhbWF0aW9uRmVkZXJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFtYXRpb25TaGFyZWRSZXNwb25zaWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFtYXRpb25TdGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25jaWxpYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29ubmVjdGNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25zaWduQ29uc2lnbmVlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbnNpZ25EZWxpdmVyeUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25zaWdubWVudENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb29wZXJpbmdBdE93bmVyc09yU2hpcHBlcnNFeHBlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmRGaWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY292ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvdmVyeUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjcmF0aW5nUmVjb29wZXJpbmctRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3JhdGluZ1JlY29vcGVyaW5nLU9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjdXJyaW5nSGFyZHdhcmVNYWludGVuYW5jZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjdXJyaW5nTGljZW5zZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjdXJyaW5nU29mdHdhcmVNYWludGVuYW5jZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkaXN0cmlidXRpb25BbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZHVjdGlvblByZXBhbGxldGl6ZWRDYXJnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlZmVyQ2FyZ29QZXJjZW50RGlmZmVyZW50aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVmZXJNYWludGVuYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlbENhYmxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVsRGVwb3NpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGlvbk1lY2hhbmljYWxEZXRlbnRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmdXJiaXNoaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbk9mRXhwb3J0Rm9yUmVlbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uT2ZFeHBvcnRTaGlwbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRvcnlGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRvcnlSZXF1aXJlZFJlZnVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaWFiaWxpdHlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlucXVpc2htZW50Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpcXVpZGF0aW9uQW50aS1EdW1waW5nRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaXF1aWRhdGlvbkNvdW50ZXJ2YWlsaW5nRHV0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaXF1aWRhdGlvblRheEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaXF1aWRhdGlvblRvdGFsRHVlVVNDdXN0b21zU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaXF1aWRhdGlvblRvdGFsRmVlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWxEZWR1Y3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRzQW5kTGVhc2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhY2tDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyQXRCdXllcnNFeHBlbnNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJBdEN1c3RvbWVyRXhwZW5zZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyQXRHb3Zlcm5tZW50RXhwZW5zZUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RWaWFDYW5hZGEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VhcmNoRGV2ZWxvcG1lbnRGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VsbGVyc0Rpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudGlhbERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudGlhbFBpY2stdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvdHRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RvY2tpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRBcnRpY2xlRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuYWJsZUNvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuQ2FyZ29DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmVkTG9hZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV3b3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWRpbmdBdHRlbmRhbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvY2t5TW91bnRhaW5CdXJlYXU1ODNJdGVtMTEwMEFyYml0cmFyeUNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sbE91dEFkanVzdG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvbGxSZWJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJveWFsdGllcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsdmFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtZS1EYXlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXR1cmRheURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXR1cmRheVBpY2stVXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyZGF5UGljay11cE9yRGVsaXZlcnlDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjYWxlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2FsZUNoYXJnZVVubG9hZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NyYXBBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5U2lnbmF0dXJlU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VncmVnYXRpbmdTb3J0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxlY3RDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGZVbmxvYWRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVySGFuZENhcnJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQXNzaXN0YW5jZVByb2dyYW1TdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDaGFyZ2VXaXRoQ2FzaERpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlVXBncmFkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0LXVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVhcmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlZXBGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJMb2FkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyTG9hZEFuZENvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyTG9hZENhcnJpZXJDb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckxvYWRDb25zaWduZWVVbmxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ0FuZEhhbmRsaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwc2lkZVBpY2t1cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFRvU3RvY2tRdWFsaXR5QXVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3RibGFzdGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hyaW5rYWdlQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaHJpbmtBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNocmluay1XcmFwQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVGYWN0b3JPcmlnaW5hdGlvbkRlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVGYWN0b3JPcmlnaW5hdGlvblBvcnRPZkRlYmFya2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVGYWN0b3JQb3J0T2ZFbWJhcmthdGlvbkRlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVJbnZvaWNlQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVQaWNrLXVwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVTaGlwbWVudEZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xlZXZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsaXBTaGVldFJhaWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsaXBTaGVldFRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGlwU2hlZXRVbmxvYWRpbmdBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsb3R0aW5nQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbE9yZGVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2Z0d2FyZVN1cHBvcnRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQnV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ2lyY3VzVHJhaW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxEZXRlbnRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxFcXVpcG1lbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxGaW5pc2hDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxGcmVpZ2h0U3VwcGxlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbE1pbGVhZ2VNb3ZlbWVudHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQYWNrYWdpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQZXJtaXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUHVtcENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFNlYWxDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxTZXJ2aWNlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFRlc3RFcXVpcG1lbnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxUb29saW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsVG9vbGluZ3Jld29ya2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFRyYWluTW92ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxVc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxWZWhpY2xlUmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWNhdGlvblJldmlldyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWNEdXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdFBpY2stdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0UGljay1VcEF0UGllckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Bvb2xDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3R0aW5nT2ZUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcHJlYWRlckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbXBGZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW1waW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGJ5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZU1ldHJvcG9saXRhblRyYW5zaXRBdXRob3JpdHlTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlTW90b3JGdWVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVNhbGVzQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVN1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RlYW1pbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0ZW5jaWxpbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3BjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3Atb2ZmQXREZXN0aW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcC1vZmZBdE9yaWdpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wLW9mZkF0UGllckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcC1vZmZDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3BwaW5nSW5UcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlSW5UcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJhaWdodGVuaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJhcHBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmVldExhbXBzQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJpcHBpbmdTb3J0aW5nQW5kQ29uc29saWRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZmZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWZmaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0VG9Db29wZXJhdGl2ZUFkdmVydGlzaW5nQWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0VG9UYXhPblJlc2FsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VmZmVyYW5jZVdhcmVob3VzZUNoYXJnZUV4cG9ydE9ySW1wb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWdhckZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtT2ZBZGRzQW5kRGVkdWN0c1RvTWFrZU1hcmtldFZhbHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW5kYXlPckhvbGlkYXlQaWNrLXVwT3JEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJCYWdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3JDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhbER1dHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhbEl0ZW1zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmV0eUJvbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3ZWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd2l0Y2hDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3aXRjaGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NhckFsbG93YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua1JlbnRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFycGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtQWlycG9ydFRheERlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtQWlycG9ydFRheE9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUJldmVyYWdlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtQ2l0eVNhbGVzVGF4T25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Q3JlZGl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtRXhjaXNlVGF4LURlc3RpbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtRXhjaXNlVGF4LU9yaWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUZlZGVyYWxFeGNpc2VUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1GZWRlcmFsRXhjaXNlVGF4T25UaXJlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUdvdmVybm1lbnRhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUhhbmRsaW5nQ2hhcmdlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhMaWFiaWxpdHktQW1vcnRpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhMaWFiaWxpdHktT25lVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUxvY2FsU2FsZXNUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1Mb2NhbFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LU1ldHJvcG9saXRhblRyYW5zaXRUYXgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheE9uTWlzY2VsbGFuZW91c0NoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheE9uVHJhbnNwb3J0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1SZWd1bGF0b3J5VGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtU2FsZXNhbmRVc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1TYWxlc1RheFN0YXRlQW5kTG9jYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1TdGF0ZUhhemFyZG91c1N1YnN0YW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVN0YXRlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtU3VwZXJGdW5kRXhjaXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtVXNlVGF4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtVmFsdWVBZGRlZFRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVhRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobm9sb2d5RXhjaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVncmFtQ2hhcmdlYmFjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmUtRGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZS1PcmlnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBlcmF0dXJlUHJvdGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcG9yYXJ5QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wb3JhcnlWb2x1bnRhcnlBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmRlcmVkQXNUcnVja2xvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbERpZmZlcmVudGlhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxIYW5kbGluZ0NoYXJnZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsU2VydmljZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybXNBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmdTZXJ2aWNlc0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFF1YWxpZmljYXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlQYWxsZXRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJvdWdocHV0QWxsb3dhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJvdWdocHV0Q29udGFpbmVyQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJ1d2F5Q2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaWNrZXRpbmdTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb2JhY2NvUHJvZHVjdHNSZXBvcnRDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRPRkNTZXJ2aWNlQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29sQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29saW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29saW5nUmV3b3JrQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29sc0ZvclByaW50aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEFzc2Vzc29yaWFsQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEdWVVU0N1c3RvbXNTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEZlZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSW52b2ljZUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbnZvaWNlQW1vdW50Tm9uLVVTRG9sbGFycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbnZvaWNlQW1vdW50VVNEb2xsYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE1hdGVyaWFsSW52b2ljZUFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2luZ0luYm91bmRWaWFPdGhlckNhcnJpZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjaW5nU2VydmljZUZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2tTdG9yYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZURpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZUluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyUmVudGFsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlckNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJPZkxhZGluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJyZWRDaGFyZ2VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pc3Npb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uQW5kU2V0dXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uQ2hhcmdlTWluaW11bVJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uRGlyZWN0QmlsbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25UaGlyZFBhcnR5QmlsbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25WZW5kb3JQcm92aWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbW1pbmdDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrRGV0ZW50aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja2xvYWREaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHVybmluZ0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHdvLURheVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR3b0Rvb3JQaWNrVXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYWJzb3JiZWRTd2l0Y2hpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZGluZ0xhYm9yQ2hhcmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkaW5nUmVsb2FkaW5nQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNhbGVhYmxlTWVyY2hhbmRpc2VBbGxvd2FuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc2NoZWR1bGVkRmVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNhZ2VQbGFuRGV0YWlsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlRmxhdEFzc2lzdEFtb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZU1heGltdW1Bc3Npc3RBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTREFJbnNwZWN0ZWRTdGFtcGluZ0NlcnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZUNoYXJnZVRvb2xpbmdQZXJzb25uZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZS1TcGVjaWFsVHlwZUZsYXRDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTVmVoaWNsZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVhdGlvbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFuQ2xlYW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVPcmRlcmVkQnV0Tm90VXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZVByZXBDaGFyZ2VDb3VydGVzeURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlUm9hZENoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yRnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVudGluZ0luc3RydWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlyZ2luSXNsYW5kVHJhbnNmZXJDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZURpc2NvdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bnRhcnlDb250cmlidXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhaXRpbmdUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50aWVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJSaXNrQ3Jld0luc3VyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyUmlza0luc3VyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyUmlza1N1cmNoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FzdGVkRnV0aWxlVHJpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJtZWxvbkZlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F5YmlsbEFuZEludm9pY2VEaXN0cmlidXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlYXRoZXJQcm90ZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRWZXJpZmljYXRpb25DaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoYXJmYWdlLUJyZWFrYnVsayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hhcmZhZ2VDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoYXJmYWdlLUNvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hhcmZhZ2VIYW5kbGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lkZUFyZWFUZWxlcGhvbmVTZXJ2aWNlVXNhZ2VDcmVkaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbGxDYWxsQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXcml0dGVuUHJvb2ZPZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYLXJheUNoYXJnZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQmFzaXNNb25ldGFyeVJhbmdlIj4KLSAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNb25ldGFyeVJhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNb25ldGFyeUxpbWl0Ii8+Ci0gICAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQmFzaXNNb25ldGFyeVJhbmdlIiB0eXBlPSJCYXNpc01vbmV0YXJ5UmFuZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1vbmV0YXJ5UmFuZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1pbmltdW1Nb25ldGFyeVZhbHVlIiB0eXBlPSJEZWNpbWFsMjFfNiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1heGltdW1Nb25ldGFyeVZhbHVlIiB0eXBlPSJEZWNpbWFsMjFfNiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ3VycmVuY3kiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik1vbmV0YXJ5UmFuZ2UiIHR5cGU9Ik1vbmV0YXJ5UmFuZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1vbmV0YXJ5TGltaXQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1vbmV0YXJ5TGltaXRWYWx1ZSIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkN1cnJlbmN5Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZCIgdHlwZT0iU2lnbmlmaWNhbmNlQ29kZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ik1vbmV0YXJ5TGltaXQiIHR5cGU9Ik1vbmV0YXJ5TGltaXQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlR5cGVPZkFsbG93YW5jZU9yQ2hhcmdlIj4KLSAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eUFsbG93YW5jZU9yQ2hhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQZXJjZW50YWdlQWxsb3dhbmNlT3JDaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5VmFsdWUiLz4KLSAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUeXBlT2ZBbGxvd2FuY2VPckNoYXJnZSIgdHlwZT0iVHlwZU9mQWxsb3dhbmNlT3JDaGFyZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlF1YW50aXR5QWxsb3dhbmNlT3JDaGFyZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlJhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlF1YW50aXR5TW9uZXRhcnlWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5VmFsdWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUXVhbnRpdHlBbGxvd2FuY2VPckNoYXJnZSIgdHlwZT0iUXVhbnRpdHlBbGxvd2FuY2VPckNoYXJnZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmF0ZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmF0ZVBlclVuaXQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJVbml0UHJpY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlVuaXRQcmljZUJhc2lzIiB0eXBlPSJEZWNpbWFsMThfMyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJVbml0T2ZNZWFzdXJlbWVudCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmF0ZSIgdHlwZT0iUmF0ZSIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJEZWNpbWFsMThfMyI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgICAgICAgPHhzZDp0b3RhbERpZ2l0cyB2YWx1ZT0iMTgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZnJhY3Rpb25EaWdpdHMgdmFsdWU9IjMiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1vbmV0YXJ5VmFsdWUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1vbmV0YXJ5QW1vdW50IiB0eXBlPSJEZWNpbWFsMjFfNiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDdXJyZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJSYXRlT2ZFeGNoYW5nZURldGFpbCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTW9uZXRhcnlWYWx1ZSIgdHlwZT0iTW9uZXRhcnlWYWx1ZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmF0ZU9mRXhjaGFuZ2VEZXRhaWwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZUN1cnJlbmN5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ3VycmVuY3kiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRhcmdldEN1cnJlbmN5Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ3VycmVuY3kiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJhdGVPZkV4Y2hhbmdlIiB0eXBlPSJEZWNpbWFsMTlfOSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSW52ZXJzZVJhdGVPZkV4Y2hhbmdlIiB0eXBlPSJEZWNpbWFsMTlfOSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGF0ZU9mUmF0ZU9mRXhjaGFuZ2UiIHR5cGU9InhjYmxEYXRldGltZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGlzdE9mUmF0ZU9mRXhjaGFuZ2VSZWZlcmVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZSZWZlcmVuY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmF0ZU9mRXhjaGFuZ2VEZXRhaWwiIHR5cGU9IlJhdGVPZkV4Y2hhbmdlRGV0YWlsIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkRlY2ltYWwxOV85Ij4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+Ci0gICAgICAgICAgICA8eHNkOnRvdGFsRGlnaXRzIHZhbHVlPSIxOSIvPgotICAgICAgICAgICAgPHhzZDpmcmFjdGlvbkRpZ2l0cyB2YWx1ZT0iOSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUmVmZXJlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJSZWZlcmVuY2UiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlJlZmVyZW5jZSIgdHlwZT0iTGlzdE9mUmVmZXJlbmNlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQZXJjZW50YWdlQWxsb3dhbmNlT3JDaGFyZ2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGVyY2VudFF1YWxpZmllciIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBlcmNlbnQiIHR5cGU9IkRlY2ltYWwxMF80Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQZXJjZW50YWdlTW9uZXRhcnlWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5VmFsdWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGVyY2VudGFnZUFsbG93YW5jZU9yQ2hhcmdlIiB0eXBlPSJQZXJjZW50YWdlQWxsb3dhbmNlT3JDaGFyZ2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBlcmNlbnRRdWFsaWZpZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBlcmNlbnRRdWFsaWZpZXJDb2RlZCIgdHlwZT0iUGVyY2VudFF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBlcmNlbnRRdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJjZW50UXVhbGlmaWVyIiB0eXBlPSJQZXJjZW50UXVhbGlmaWVyIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlBlcmNlbnRRdWFsaWZpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbUxpc3RDb3N0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtTmV0Q29zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtR3Jvc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LU5ldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZVByaWNlcGVyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZVByaWNlQW1vdW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlUHJpY2VBbW91bnRMZXNzUHJldmlvdXNEaXNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0TW9udGhseU9uQWxsSW52b2ljZXNQYXN0RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlUGF5bWVudENoYXJnZUJhc2VBbW91bnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxSYXRlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyeURldGFpbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwVG9Mb2NhdGlvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkxvY2F0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBGcm9tTG9jYXRpb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMb2NhdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlNjaGVkdWxlTGluZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJJdGVtUGFja2FnaW5nUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaW1wbGVQYWNrYWdlTm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iVGVybXNPZkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNhcmdvQ2xhc3NpZmljYXRpb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkRlbGl2ZXJ5RGV0YWlsIiB0eXBlPSJEZWxpdmVyeURldGFpbCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU2NoZWR1bGVMaW5lIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJTY2hlZHVsZUxpbmUiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlNjaGVkdWxlTGluZSIgdHlwZT0iTGlzdE9mU2NoZWR1bGVMaW5lIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTY2hlZHVsZUxpbmUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2NoZWR1bGVMaW5lSUQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBtZW50U3RhdHVzRXZlbnRDb2RlZCIgdHlwZT0iU2hpcG1lbnRTdGF0dXNFdmVudENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBtZW50U3RhdHVzRXZlbnRDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwbWVudFN0YXR1c1JlYXNvbnMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZTdGF0dXNSZWFzb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlcXVlc3RlZERlbGl2ZXJ5RGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaXN0T2ZPdGhlckRlbGl2ZXJ5RGF0ZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkRhdGVDb2RlZCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTY2hlZHVsZUxpbmVOb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRSZWZlcmVuY2UiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mU2hpcFRvU3ViSW5mb3JtYXRpb24iLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlNjaGVkdWxlTGluZSIgdHlwZT0iU2NoZWR1bGVMaW5lIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNoaXBtZW50U3RhdHVzRXZlbnRDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90QXBwbGljYWJsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90WWV0U2hpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja09yZGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPcmRlclNoaXBwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWR5Rm9yUGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblRyYW5zaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxseVNoaXBwZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxseURlbGl2ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRDb21wbGV0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZTdGF0dXNSZWFzb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlN0YXR1c1JlYXNvbiIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mU3RhdHVzUmVhc29uIiB0eXBlPSJMaXN0T2ZTdGF0dXNSZWFzb24iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlN0YXR1c1JlYXNvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU3RhdHVzUmVhc29uQ29kZWQiIHR5cGU9IlN0YXR1c1JlYXNvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN0YXR1c1JlYXNvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlN0YXR1c1JlYXNvbiIgdHlwZT0iU3RhdHVzUmVhc29uIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlN0YXR1c1JlYXNvbkNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZWRTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdHJ1Y3Rpb25zQXdhaXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNSZWZ1c2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eU9uSW5zcGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25JbmNvcnJlY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydFJlc3RyaWN0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0UmVzdHJpY3Rpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50Tm90UmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGlmZmVyZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlUb29MYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudEF0dHJpYnV0ZWRUb1NlbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnRBdHRyaWJ1dGVkVG9UaGVCdXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnRBdHRyaWJ1dGVkVG9UaGVDYXJyaWVyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZEYXRlQ29kZWQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkRhdGVDb2RlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mRGF0ZUNvZGVkIiB0eXBlPSJMaXN0T2ZEYXRlQ29kZWQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRhdGVDb2RlZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJEYXRlUXVhbGlmaWVyIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEYXRlQ29kZWQiIHR5cGU9IkRhdGVDb2RlZCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGF0ZVF1YWxpZmllciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGF0ZVF1YWxpZmllckNvZGVkIiB0eXBlPSJEYXRlUXVhbGlmaWVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGF0ZVF1YWxpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkRhdGVRdWFsaWZpZXIiIHR5cGU9IkRhdGVRdWFsaWZpZXIiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGF0ZVF1YWxpZmllckNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNjAzMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzY1MzAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM2NTYzMCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzYwMjgzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzY1MjgzMSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzY1NjI4MzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFzdFNjaGVkdWxlRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFzdFNjaGVkdWxlU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZWxlcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhbmNlRGF0ZU9mRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFuY2VEYXRlT2ZHb29kc0RlY2xhcmF0aW9uQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YW5jZURhdGVUaW1lT2ZHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnRCZW5lZml0QWdlTGltaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50QmVuZWZpdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnREYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudEluc3VyYW5jZUVsaW1pbmF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudExpZmV0aW1lQmVuZWZpdFF1YWxpZmljYXRpb25BZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRhbnRzT3BpbmlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRDbG9zZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nTWV0aG9kb2xvZ3lDaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nUGVyaW9kRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1BlcmlvZFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1RyYW5zYWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1ZhbHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1llYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRPcGVuZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUmVjZWl2YWJsZS1TdGF0ZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNxdWlzaXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpb25FbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpdml0eVJlcG9ydGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXR5UGVyaW9kRGF0ZVJhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbEFyY2hpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxEYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsQ29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZURhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjaGFyZ2VEYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsUG9ydE9mRW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFJlbGVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFJldHVyblRvV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3V0ZU1hbmlmZXN0YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3V0ZU1hbmlmZXN0YXRpb25PZkFDaHJvbmljQ29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkcmVzc1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqb3Vybm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZENvbnRlc3RhYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZERlYXRoQmVuZWZpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkSGlyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudEVmZmVjdGl2ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFByb2Nlc3NlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFByb21pc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50VG9CaWxsRGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0b3JPcmRlcmVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaXNzaW9uRGF0ZUFuZE9yVGltZUV4cGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG9wdGlvbkRhdGVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzZUFmdGVyRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzZUJlZm9yZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2VDb21wbGV0ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNlT25EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmVlbWVudFRvUGF5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvdG1lbnRQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhYmxlRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2VkUmVuZXdhbER1cmF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVCYXNlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVQcm9ibGVtUmVzb2x1dGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRpdmVEdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmFseXNpc01vbnRoRW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmVzdGhlc2lhQWRtaW5pc3RyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubml2ZXJzYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51YWxSZXBvcnREZWxpbnF1ZW50T25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51YWxSZXBvcnREdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51YWxSZXBvcnRGaWxpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51YWxSZXBvcnRNYWlsaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWl0aXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWl0eUNvbW1lbmNlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGljaXBhdGVkQ2xvc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGlhbmNlUGxhY2VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRTaWduZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkVudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkxvZ2dlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBvaW50bWVudEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwb2ludG1lbnRFeHBpcnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzYWxPcmRlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZhbE9mZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZhbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycmVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVBdEluaXRpYWxQb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVFYXJsaWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbERhdGVUaW1lT2ZUcmFuc3BvcnRMZWFkVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbERhdGVUaW1lU2NoZWR1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVVbHRpbWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbEluQ291bnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJ0ZXJpYWxCbG9vZEdhc1Rlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2VtYmx5U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldEFuZExpYWJpbGl0eVNjaGVkdWxlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXREb2N1bWVudGF0aW9uRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25tZW50UmVjb3JkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGVuZGFuY2VEYXRlQW5kT3JUaW1lQW5kT3JQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1ZGllbmNlRGVmaWNpZW5jeVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaXRQZXJpb2RBZnRlclNwbGl0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaXRQZXJpb2RQcmlvclRvU3BsaXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRoZW50aWNhdGlvbkRhdGVUaW1lT2ZEb2N1bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aGVudGljYXRpb25WYWxpZGF0aW9uRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0aWNQcmVtaXVtTG9hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmlsaXR5RHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlRGVsaXZlcnlEZWxheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZVBheW1lbnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF3YXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrT25NYXJrZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPcmRlckRlbGl2ZXJ5RGF0ZVRpbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGFuY2VEYXRlVGltZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsYW5jZVNoZWV0RGF0ZUxhdGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZWxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VsaW5lQ29tcGxldGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VsaW5lU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZm9yZUludmVudG9yeUlzUmVwbGVuaXNoZWRCYXNlZE9uU3RvY2tDaGVja0xlYWRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbm5pbmdMYXlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpblRoZXJhcHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaWNpYXJ5c0JhbmtzRHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdEFkanVzdG1lbnRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRBZGp1c3RtZW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0QWRqdXN0bWVudFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0QXBwbGljYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0QmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRDaGFuZ2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdENyZWRpdEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdENyZWRpdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdENyZWRpdFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0RGViaXRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXREZWJpdFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0UGF5bWVudHNUZXJtaW5hdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRSZWxlYXNlQXV0aG9yaXphdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRzUGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFRyYW5zZmVyRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0VHJhbnNmZXJQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRUcmFuc2ZlclN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0VHlwZUdyb3NzV2Vla2x5QW1vdW50RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0VHlwZU5ldFdlZWtseUFtb3VudEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFBlcmlvZEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRQZXJpb2RTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlc3RCZWZvcmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXN0VGltZVRvQ2FsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlhbm51YWxUZXJtaW5hbEluc3BlY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZE9wZW5EYXRlQmlkc1dpbGxCZU9wZW5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkUHJpY2VFeGNlcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxlZFRocm91Z2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRoQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRoRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsYW5rc1ZhbHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmx1ZXByaW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mRGlyZWN0b3JzSW5jb21wbGV0ZUFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZEaXJlY3RvcnNOb3RBdXRob3JpemVkQXNPZkdpdmVuRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZkRpcmVjdG9yc05vdENvbXBsZXRlQXNPZkdpdmVuRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZkRpcmVjdG9yc1JlZ2lzdHJhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tFbnRyeURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29raW5nRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyaXRpc2hUaGVybWFsVW5pdFRlc3RQZXJmb3JtZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldExpbmVBcHBsaWNhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQ29udHJvbENoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzT3BlbmVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NUZXJtaW5hdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0RvY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0xvY2FsVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY3VsYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhckFubml2ZXJzYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhclllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbEFmdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxBZnRlckV4Q291bnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsQWZ0ZXJFeEZhY3RvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbElmTm90RGVsaXZlcmVkQnlUaGlzRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsSWZOb3RQdWJsaXNoZWRCeVRoaXNEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxJZk5vdFNoaXBwZWRCeVRoaXNEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsYXRpb25EYXRlVGltZUxhdGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwaXRhbGl6YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXBpdGF0aW9uUGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXBpdGF0aW9uUGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQm9va2luZ0NvbmZpcm1lZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb1JlbGVhc2VEYXRlVGltZVVsdGltYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlQ29udmVydGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlUmVvcGVuZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hDYWxsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0ZWdvcnlDaGFuZ2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vhc2VkT3BlcmF0aW9ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb25PZldlaWdodERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uUGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb25SZXZpc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlZEFjY291bnRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlQmFja0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVBlcmlvZEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVBlcmlvZFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcnRPZkFjY291bnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVja2VkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRiaXJ0aERhdGVBbmRPclRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkYmlydGhEYXRlRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaHJpc3RlbmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGl6ZW5zaGlwQ2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1BZG1pbmlzdHJhdG9yS25vd2xlZGdlT2ZUaGVJbmp1cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltQWRtaW5pc3RyYXRvck5vdGlmaWVkT2ZFbXBsb3llZUxlZ2FsUmVwcmVzZW50YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltSW5jdXJyZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbU1hZGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbU5vdGlmaWNhdGlvblJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbXNNYWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbVN0YXRlbWVudFBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1TdGF0ZW1lbnRQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhdXNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmFuY2VEYXRlQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpbmljYWxFeGFtaW5hdGlvbkRhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkVW50aWxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zaW5nRGF0ZU9mRmlyc3RCYWxhbmNlU2hlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NpbmdEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc3VyZURhdGVUaW1lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXRlcmFsRGVwZW5kZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXRlcmFsRGVwZW5kZW50QmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxhdGVyYWxEZXBlbmRlbnRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3Rpb25EYXRlVGltZUVhcmxpZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uRGF0ZVRpbWVMYXRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lbmNlZFB1bXBpbmdCYWxsYXN0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lbmNlZFRhbmtDbGVhbmluZ0RhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsUmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55VGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmlzb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBpbGF0aW9uRGF0ZUFuZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsYWludCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkUHVtcGluZ0JhbGxhc3REYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkVGFua0NsZWFuaW5nRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0aW9uRGF0ZU9yVGltZU5vdEFmdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0aW9uRGF0ZU9yVGltZU5vdEJlZm9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGlvbkRhdGVPclRpbWVTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsaWFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbkluaXRpYWxUcmVhdG1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maW5lbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmluZW1lbnRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpbmVtZW50U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpcm1hdGlvbkRhdGVMZWFkVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlybWVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbm5lY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkT21uaWJ1c0J1ZGdldFJlY29uY2lsaWF0aW9uQWN0Q09CUkEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZE9tbmlidXNCdWRnZXRSZWNvbmNpbGlhdGlvbkFjdENPQlJBQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZE9tbmlidXNCdWRnZXRSZWNvbmNpbGlhdGlvbkFjdENPQlJBRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRPbW5pYnVzQnVkZ2V0UmVjb25jaWxpYXRpb25BY3RDT0JSQVF1YWxpZnlpbmdFdmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cnVjdGlvbkRhdGVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cnVjdGlvblN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTYWZldHlDb252ZW50aW9uQ3NjSW5zcGVjdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclNhZmV0eUNvbnZlbnRpb25Dc2NQbGF0ZUV4cGlyYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTdHJpcHBpbmdEYXRlVGltZVVsdGltYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTdHVmZmluZ0RhdGVUaW1lVWx0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRlc3RhYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW5nZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZ2VuY3lFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51YXRpb25PZlBheVN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludWluZ0VkdWNhdGlvblJlcXVpcmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51b3VzQ292ZXJhZ2VEYXRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludW91c1Bhc3NpdmVNb3Rpb25DUE0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QXVkaXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEF3YXJkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QmluZGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Q29tcGxldGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Q29zdHNUaHJvdWdoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RGVmaW5pdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RFZmZlY3RpdmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEV4cGlyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0TWFpbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFBlcmZvcm1hbmNlRGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UGVyZm9ybWFuY2VTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UmUtT3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3R1YWxEZWxpdmVyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0dWFsU3RhcnREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJpYnV0aW9uUGVyaW9kRW5kRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyaWJ1dGlvblBlcmlvZFN0YXJ0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyaWJ1dGlvbnNDZWFzaW5nRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xQbGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm92ZXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVyc2lvblByaXZpbGVnZUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVyc2lvblRvUmVwYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXJzaW9uSW50b0hvbGRpbmdDb21wYW55RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVydGVkVG9FbGVjdHJvbmljRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmV5YW5jZVJlZ2lzdHJhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZpY3RlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdGlvbk9mQmVuZWZpdHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdGlvbk9mQmVuZWZpdHNCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcmRpbmF0aW9uT2ZCZW5lZml0c0VuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkRGF0ZU9mQmlydGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc2lnbmVyU2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydERpc21pc3NhbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0RXZlbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0Tm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydFJlZ2lzdHJhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlSXNzdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmVkSW5jb21lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdERvY3VtZW50YXRpb25FeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRlZFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdGVkU2VydmljZUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRlZFNlcnZpY2VFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9yc1JlcXVlc3RlZFZhbHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaW1pbmFsU2VudGVuY2VEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3Nib3JkZXJEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5RW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5U3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEF1dGhvcml0eUNvbnRyb2xTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREaXNhYmlsaXR5UGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RGlzYWJpbGl0eVBlcmlvZExhc3REYXlXb3JrZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREaXNhYmlsaXR5UGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRJbmNvbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRMZWdhbFN0cnVjdHVyZUVmZmVjdGl2ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50TW9udGhFbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnROYW1lRWZmZWN0aXZlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFJlcG9ydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRTY2hlZHVsZURlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50U2NoZWR1bGVTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJ0YWlsbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnRhaWxtZW50RGF0ZWZyb21BZHZpY2VPZlBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyQ29udHJhY3RFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyQ29udHJhY3RFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclZhbHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0NhcmdvUmVsZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0NsZWFyYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0VudHJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3ljbGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN5Y2xlQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN5Y2xlRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDeWNsZVRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUFjY291bnRNYXR1cmVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQWNxdWlyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVBbmRPclRpbWVPZkhhbmRsaW5nRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQXNBdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUFzc2lnbm1lbnRGaWxlZEZvclJlY29yZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua3J1cHRjeUZpbGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUJlY2FtZUF3YXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQ2xhaW1QYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQ291cnNlT2ZPcnRob2RvbnRpY3NUcmVhdG1lbnRCZWdhbk9ySXNFeHBlY3RlZFRvQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVEZWVkRmlsZWRGb3JSZWNvcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVEZWZhdWx0V2FzQ3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVEb2N1bWVudGF0aW9uT3JQYXBlcndvcmtPckJvdGhXYXNTZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVGb3JlY2xvc3VyZUhlbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVGb3JlY2xvc3VyZVByb2NlZWRpbmdzSW5zdGl0dXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUZvcmVjbG9zdXJlU2FsZVNjaGVkdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUZvclRoZUxhc3RVcGRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVIYXphcmRJbnN1cmFuY2VQb2xpY3lDYW5jZWxsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVIYXphcmRJbnN1cmFuY2VQb2xpY3lSZWZ1c2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlTWF0ZXJpYWxVc2FnZVN1c3BlbmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQWJhbmRvbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFjcXVpc2l0aW9uT2ZUaXRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBZHZhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBcHByYWlzYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFzc2lnbm1lbnRBcHByb3ZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQXNzaWdubWVudFJlamVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQ2xhaW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkNsb3NpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkRhbWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjZWFzZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkRlZWRJbkxpZXUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkRpdm9yY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkV4dGVuc2lvblRvQ29udmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZGaXJtQ29tbWl0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRmlyc3RNb3J0Z2FnZVBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkZpcnN0UmVnaXN0cmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZGaXJzdFVuY3VyZWREZWZhdWx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZGb3JlY2xvc3VyZU5vdGljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTGFzdENvbnRhY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxhc3REcmF3Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMYXN0SW5zdGFsbG1lbnRSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTGFzdFBheW1lbnRSZWNlaXZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTGFzdFVwZGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTG9hbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTG9jYWxPZmZpY2VBcHByb3ZhbE9mQ29udmV5YW5jZU9mRGFtYWdlZFJlYWxFc3RhdGVQcm9wZXJ0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTG9jYWxPZmZpY2VBcHByb3ZhbE9mQ29udmV5YW5jZU9mT2NjdXBpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxvY2FsT2ZmaWNlQ2VydGlmaWNhdGlvbk9mQ29udmV5YW5jZU9mRGFtYWdlZFJlYWxFc3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk1heGltdW1NZWRpY2FsSW1wcm92ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk5vdGljZU9mUHJvYmFibGVJbmVsaWdpYmlsaXR5Rm9yQXNzaWdubWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTm90aWNlT2ZSZWZlcnJhbEZvckFzc2lnbm1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk5vdGljZVRvQ29udmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk9yZGVyTGVhZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlBvc3Nlc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlByb2R1Y3RGYWlsdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZQcm9wZXJ0eUluc3BlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VGcm9tQmFua3J1cHRjeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlJlcGFpck9yU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU2VpenVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU2VwYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU291cmNlRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlN0YW5kYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT25XaGljaEFzc2V0c0p1ZGdlZEluc3VmZmljaWVudFRvUGF5Q3JlZGl0b3JzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT3V0c3RhbmRpbmdMb2FuQmFsYW5jZVJlcG9ydGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVBsYWNlZEluRGlzZmF2b3VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUG9zc2Vzc29yeUFjdGlvbkluaXRpYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVByYWN0aWNlQ2Vhc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUHJhY3RpY2VFc3RhYmxpc2hlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVByb3BlcnR5U29sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVJlYWR5Rm9yQ29sbGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVJlZGVtcHRpb25QZXJpb2RFbmRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUmVmZXJyZWRUb0F0dG9ybmV5Rm9yRm9yZWNsb3N1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3REYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlVGhyb3VnaFdoaWNoUHJvcGVydHlUYXhlc0hhdmVCZWVuUGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVRpbWVPZkRpc2NvdW50VGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVUaW1lT2ZJbnRlcmVzdER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVRpbWVPZkxhdGVzdEFjY291bnRzRmlsaW5nQXRQdWJsaWNSZWdpc3RyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVRvdGFsQW1vdW50T2ZEZWxpbnF1ZW5jeVJlcG9ydGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlVm9sdW50YXJ5Q29udmV5YW5jZUFjY2VwdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlV2hlbkNvbnRhaW5lckVxdWlwbWVudEJlY29tZXNEb21lc3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF5bGlnaHRPdmVyZHJhZnRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXlzT2ZPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYXRoRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRBZHZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0VmFsdWVEYXRlUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0SW5jdXJyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2lzaW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmF0aW9uUHJlc2VudGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYXRpb25SZWZlcmVuY2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZHVjdGlibGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZWROb3RBdmFpbGFibGVBc09mR2l2ZW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyZWREaXN0cmlidXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVycmVkUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyZWRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmluaXRpb25PZkRpc2FiaWxpdHlEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsYXllZEJpbGxpbmdOb3REZWxheWVkUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsZXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJOb3RCZWZvcmVBbmROb3RBZnRlckRhdGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUFwcG9pbnRtZW50RGF0ZUFuZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWUxU3RTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUN1cnJlbnRTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZURlZmVycmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lRWFybGllc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVFeHBlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUZpcnN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lTGFzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUxhdGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVByb21pc2VkRm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lUHJvbWlzZWRGb3JBZnRlckFuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVByb21pc2VkRm9yUHJpb3JUb0FuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVNjaGVkdWxlZEZvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5T3JkZXJJc3N1ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlUaWNrZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbmlhbEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuaWFsUmVzY2lzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudEFkbWlzc2lvbkRhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnREaXNjaGFyZ2VEYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZMYWJvcldhZ2VEZXRlcm1pbmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZURhdGVUaW1lRWFybGllc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZURhdGVUaW1lRnJvbUxhc3RQb3J0T2ZDYWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVEYXRlVGltZVNjaGVkdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRGF0ZVRpbWVVbHRpbWF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRnJvbVNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hEYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRyaW1lbnRhbEluZm9ybWF0aW9uUmVjZWlwdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdEludGVyY2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJpbGl0eVdhaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2J1cnNlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NoYXJnZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjaGFyZ2VBbmRMb2FkaW5nQ29tcGxldGVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NoYXJnZS1QbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3ZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVwYW5jeURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNlbWJhcmthdGlvbkRhdGVBbmRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNtaXNzYWxEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcG9zaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvclRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZpZGVuZEFwcGxpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QW1lbmRtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRFeHBpcnlEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRJc3N1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0UHJlc2VudGF0aW9uUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudE1lc3NhZ2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRSZWNlaXZlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFJlcXVlc3RlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdERlbGl2ZXJBZnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3REZWxpdmVyQmVmb3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdFNoaXBCZWZvcmVFeENvdW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90U2hpcEJlZm9yZUV4RmFjdG9yeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmdSZXZpc2lvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3BBY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wcGVkVG9MZXNzVGhhbkhhbGZUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWVEYXRlTGFzdENvbXBsZXRlSW5zdGFsbG1lbnRQYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWVEYXRlT2ZGaXJzdFBheW1lbnRUb1ByaW5jaXBhbEFuZEludGVyZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWVUb0N1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXBsaWNhdGVCaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybGllc3RGaWxpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmxpZXN0U2FsZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmx5RmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJseVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJseVdpdGhkcmF3YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcm5pbmdzRWZmZWN0aXZlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25CZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZmZlY3RpdmVEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWZmZWN0aXZlRGF0ZU9mQ2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpZ2liaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaWdpYmlsaXR5QmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaWdpYmlsaXR5RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWJhcmthdGlvbkRhdGVBbmRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZEluVGhpc1Bvc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZEluVGhpc1Byb2Zlc3Npb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlRWZmZWN0aXZlRGF0ZU9mQ292ZXJhZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlTGFpZE9mZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVUZW1wb3JhcnlMYWlkT2ZmUGVyaW9kU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVRlbXBvcmFyeUxhaWRPZmZQZXJpb2RFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVdhZ2VzQ2Vhc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llcktub3dsZWRnZU9mVGhlSW5qdXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llclJlcG9ydGVkSW5qdXJ5VG9DbGFpbUFkbWluaXN0cmF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveW1lbnRQb3NpdGlvblN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95bWVudEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95bWVudE9ySGlyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95bWVudFBvc2l0aW9uU3RhcnREYXRlRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50UHJvZmVzc2lvblN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZEF2YWlsYWJpbGl0eURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZERhdGVPZlN1cHBvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZERhdGVTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ0xheURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZE9mR3JhY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZE9mTGFzdEZpc2NhbFllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZG9yc2VkQ2VydGlmaWNhdGVJc3N1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZG9yc2VtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdDaGFuZ2VMZXZlbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nRGF0YUxpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVucm9sbG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVucm9sbG1lbnRTaWduYXR1cmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudHJ5RGF0ZUVzdGltYXRlZEN1c3RvbXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudENvbGxlY3Rpb25PclBpY2tVcERhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRDb2xsZWN0aW9uT3JQaWNrVXBEYXRlVGltZUVhcmxpZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRDb2xsZWN0aW9uT3JQaWNrVXBEYXRlVGltZVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudExvZ0VudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRQb3NpdGlvbmluZ0RhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRQb3NpdGlvbmluZ0RhdGVUaW1lRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRQb3NpdGlvbmluZ0RhdGVUaW1lUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRQb3NpdGlvbmluZ0RhdGVUaW1lVWx0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFByZVRyaXBEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRSZWNvbmRpdGlvbmluZ0RhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRSZXBhaXJSZWFkeURhdGVUaW1lVWx0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFJldHVyblBlcmlvZEV4cGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRTdG9ja0NoZWNrRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY2FsYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2NhbGF0aW9uU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RhYmxpc2hlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlQ29tbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRBY2NlcHRhbmNlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbERhdGVUaW1lRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0aW9uRGF0ZU9yVGltZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkQ29tcGxldGlvbi1GaXJzdFByaW9yTW9udGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZENvbXBsZXRpb24tU2Vjb25kUHJpb3JNb250aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkQ29tcGxldGlvbi1UaGlyZFByaW9yTW9udGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cnVjdGlvbkRhdGVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkJpcnRoRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lRXN0aW1hdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVEYXRlVGltZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkRXNjcm93Q2xvc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkSW1taWdyYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRQb2ludE9mQXJyaXZhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUG9pbnRPZkRpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUG9ydE9mRW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZUVzdGltYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkU3RhcnQtRmlyc3RQcmlvck1vbnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRTdGFydC1TZWNvbmRQcmlvck1vbnRoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRTdGFydC1UaGlyZFByaW9yTW9udGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlUHJlcGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2YWx1YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4YW1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRpb25EYXRlVGltZVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhpdFBsYW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWN0ZWRDb250YWluZXJIaXJlRnJvbURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlY3RlZEZ1bmRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlY3RlZFByb2JsZW1SZXNvbHV0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWN0ZWRSZXBseSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWN0ZWRWYWx1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRlZE9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uRGF0ZU9mRXh0ZW5zaW9uVG9Bc3NpZ24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb25EYXRlT2ZFeHRlbnNpb250b0ZvcmVjbG9zZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbkRhdGVUaW1lT2ZDdXN0b21zRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb25EYXRlVG9TdWJtaXRUaXRsZUV2aWRlbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uT2ZFeHRlbnNpb25Ub0NvbnZleSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbk9mRXh0ZW5zaW9uVG9TdWJtaXRGaXNjYWxEYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uT2ZGb3JlY2xvc3VyZVRpbWVmcmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJ5RGF0ZU9mRXhwb3J0TGljZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJ5RGF0ZU9mSW1wb3J0TGljZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwbGFudGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydGF0aW9uRGF0ZUZvclRleHRpbGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvc3VyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3N1cmVTb3VyY2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNzaW1pbGVEdWVCeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsdXJlTW9kZUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVhc2liaWxpdHlTaWduT2ZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSGlnaHdheUFkbWluaXN0cmF0aW9uRmh3YUluc3BlY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWVDYXBpdGFsaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmllbGRGYWlsdXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZFRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVHZW5lcmF0aW9uRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsaW5nUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbElzc3VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFJlY29uY2lsaWF0aW9uVmFsdWVFc3RpbWF0ZUFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsU2NoZWR1bGVkUGF5bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsQ292ZXJhZ2VQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEluZm9ybWF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSW5mb3JtYXRpb25TdWJtaXNzaW9uRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaERhdGVPclRpbWVNYW5kYXRvcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaERhdGVPclRpbWVFYXJsaWVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoRGF0ZU9yVGltZUxhdGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RDb250YWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdERhdGVPZk9yZGVyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdEludGVyZXN0QmVhcmluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0SW50ZXJlc3RQYXltZW50RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdEludm9sdmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdElzc3VlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdE1hcmtldGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFBheW1lbnRDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UGF5bWVudER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RQcm9kdWNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RQdWJsaXNoZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFJhdGVBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFNhbGVEYXRlQW5kT3JUaW1lQW5kT3JQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0U3VibWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RWaXNpdG9yQ29uc3VsdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXNjYWxBbm5pdmVyc2FyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEV4dHJhRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0RXh0cmFQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdFBlcmlvZEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0UGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEJpbGxEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZkF3YXJkVG9Db21wbGV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mQXdhcmRUb0RlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mQXdhcmRUb0VhcmxpZXN0RGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZBd2FyZFRvTGF0ZXN0RGVsaXZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZOb3RpY2VUb1Byb2NlZWRUb0NvbW1lbmNlbWVudE9mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mTm90aWNlVG9Qcm9jZWVkVG9Db21wbGV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mT3JkZXJSZWNlaXB0VG9EZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZk9yZGVyUmVjZWlwdFRvU2FtcGxlUmVhZHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZPcmRlclJlY2VpcHRUb1NoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mUmVjZWlwdE9mSXRlbVRvQXBwcm92YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZSZWNlaXB0T2ZUb29saW5nQWlkc1RvU2FtcGxlUmVhZHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZTYW1wbGVBcHByb3ZhbFRvRmlyc3RQcm9kdWN0U2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZUb29saW5nQXV0aG9yaXphdGlvblRvU2FtcGxlUmVhZHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21MYXN0Qm9va2VkT3JkZXJUb0RlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW1pZ2F0aW9uRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbFRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRzQXBwcm9wcmlhdGlvbi1FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRzQXBwcm9wcmlhdGlvbi1TdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnV0dXJlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYWxsb25zUGVyTWludXRlVGVzdFBlcmZvcm1lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNDb2xsZWN0aW9uT3JQaWNrVXBEYXRlVGltZVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUG9zaXRpb25pbmdEYXRlVGltZUV4cGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc1Bvc2l0aW9uaW5nRGF0ZVRpbWVQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc1JlY2VpcHREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZHVhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwQ29udHJhY3RFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwQ29udHJhY3RFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRvclJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kT3ZlckRhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kT3ZlckRhdGVUaW1lUGxhbm5lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaENhcGl0YWxZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoRmFicmljYXRpb25SZWxlYXNlQXV0aG9yaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFJhd01hdGVyaWFsQXV0aG9yaXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlyZWRGcm9tRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlyZWRVbnRpbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGRBc09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2xkQXNTdG9ja0FzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGlkYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGlkYXlGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGlkYXlTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZXN0ZWFkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Jpem9uRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9yaXpvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9yaXpvblN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zZXNDb25uZWN0ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zZXNEaXNjb25uZWN0ZWREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zcGl0YWxBZG1pc3Npb25EYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbERpc2NoYXJnZURhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh5ZHJvdGVzdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklsbG5lc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklsbG5lc3NCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWxsbmVzc1JlY292ZXJ5RGF0ZUV4cGVjdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbW1pZ3JhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGxhbnRhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wbGVtZW50YXRpb25EYXRlVGltZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydExpY2VuY2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmFjdGl2aXR5RW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5hY3Rpdml0eSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5ib3VuZE1vdmVtZW50QXV0aG9yaXphdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29tZURvY3VtZW50YXRpb25FeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvbWVJbmNyZWFzZVBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb21lUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGlvbkRpc3NvbHV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmN1bWJlbmN5UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsRWR1Y2F0aW9uUGxhbklFUCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW4tZm9yY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUmVsZWFzZUF1dGhvcml6YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsQ2xhaW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxDb21wbGV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsQ29udGFjdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxEaXNhYmlsaXR5UGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRGlzYWJpbGl0eVBlcmlvZExhc3REYXlXb3JrZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxEaXNhYmlsaXR5UGVyaW9kUmV0dXJuVG9Xb3JrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRGlzYWJpbGl0eVBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRmVlRHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRmluYW5jaWFsQWNjb3VudHNGaWxlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudERhdGVJbml0aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsUHJlbWl1bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFByZW1pdW1FZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxSZXF1ZXN0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFRyZWF0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5qdXJ5QmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluanVyeUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5qdXJ5T3JJbGxuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJ5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5TZXJ2aWNlU3VydmV5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zb2x2ZW5jeURpc2NoYXJnZUdyYW50ZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGF0aW9uRGF0ZVRpbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbWVudFBheW1lbnREdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0cnVjdGlvbnNPcmlnaW5hbEV4ZWN1dGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VmZmljaWVudEFzc2V0c0p1ZGdlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0Q2FwaXRhbGl6YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0UGFpZFRocm91Z2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0UGFpZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RSYXRlVmFsaWRpdHlQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBc3Nlc3NtZW50QXBwcm92YWxGb3JQdWJsaWNhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxSZXZpZXdDeWNsZVN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJydXB0aW9uRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnJ1cHRpb25TdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ2aWV3ZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnZpZXdlclNpZ25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlSZXBvcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RpZ2F0aW9uRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0aWdhdGlvblN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0bWVudE51bWJlckFsbG9jYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZpdGF0aW9uVG9UZW5kZXJEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlRGF0ZVJlcXVpcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlUGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlUGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2luZ1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJyZWd1bGFySW50ZXJlc3RQYXltZW50RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1Db250cmFjdEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbUNvbnRyYWN0RXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbmVkRW1wbG95ZXJEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2luZWRGdW5kRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdlbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZXlFdmVudENhbGVuZGFyWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2V5RXZlbnRGaXNjYWxZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvdXJXYWdlRGV0ZXJtaW5hdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RBY3Rpdml0eURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RBbm51YWxSZXBvcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Q2FwaXRhbENoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RDZXJ0aWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Q2hhbmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Q2hlY2tGb3JCYWxhbmNlU2hlZXRVcGRhdGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Q2l2aWxpYW5GbGlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3REYXRlRm9yQUdvdmVybm1lbnRBZ2VuY3lUb0ZpbGVBQ2xhaW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3REYXRlT2ZBY2NvdW50c0ZpbGVkQXRQdWJsaWNSZWdpc3RlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdERhdGVPZk9yZGVyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RGF0ZVRvRmlsZUFDbGFpbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdERhdGVUb09iamVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEVwaXNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RGbGlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RGb2xsb3ctdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RJbnN1cmFuY2VNZWRpY2FsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0SW50ZXJlc3RCZWFyaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEl0ZW1EZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdExvZ2dlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE1hcmtldGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0TWVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE1lbnN0cnVhbEN5Y2xlU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0TWVuc3RydWFsUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0TWlsaXRhcnlGbGlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3ROb3RpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RPZmZIaXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE9uSGlyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQYWlkSW5zdGFsbG1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0UGF5bWVudE1hZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQaHlzaWNhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFByZW1pdW1FZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQcmVtaXVtUGFpZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQcm9kdWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0UHVibGljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQdWJsaXNoZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0U2FsYXJ5SW5jcmVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RTYWxlRGF0ZUFuZE9yVGltZUFuZE9yUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0U2NyZWVuaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0U2VlbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RWaXNpdERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RYUmF5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0QWJzZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RCYWxhbmNlU2hlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdENoZWNrSW5UaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3REZWxpdmVyeURhdGVhdFBpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdERlbGl2ZXJ5RGF0ZUF0UmFpbFJhbXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdEZpbGluZ1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0TWF0ZXJpYWxTYWZldHlEYXRhU2hlZXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RNZXRlclJlYWRpbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RPbkJvYXJkQ2FycmllckRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdFByaWNlQWRqdXN0bWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdFJlY2VpdmluZ0RhdGVDdXRvZmZEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RWaXNpdG9yQ29uc3VsdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXlUaW1lRmlyc3REYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxheVRpbWVMYXN0RGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFkVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VDb21tZW5jZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVRlcm1FbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVRlcm1TdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZnRFbXBsb3llckRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsQWN0aW9uQ2xvc2VkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxBY3Rpb25TdGFydGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbFNldHRsZW1lbnRUZXJtc01ldERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsU3RydWN0dXJlQ2hhbmdlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGVyQ3JlZGl0Q2hlY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mQWdyZWVtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZMaWFiaWxpdHlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZVJlbmV3YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VSZXF1ZXN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdGluZ1JlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0UHJpY2VDaGFuZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRlZG9uVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5QdXJjaGFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblNlcnZpY2luZ1RyYW5zZmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbkV4Y2VwdGlvbk9yZGVyTnVtYmVyQXNzaWduZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdE51bWJlckV4cGlyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd2VzdEFjdGl2aXR5UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxCeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxSZWNlaXB0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlQ29tbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ha2Vnb29kQ29tbWVyY2lhbERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZW1lbnRBdmFpbGFibGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VyTm90UmVnaXN0ZXJlZEFzT2ZHaXZlbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmRhdG9yeU9yVGFyZ2V0RmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5kYXRvcnlPclRhcmdldFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5pZmVzdFNoaXBOb3RpY2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZNYXJyaWFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyTGVhc2VBZ3JlZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ2hhbmdlTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENsYXNzaWZpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdHVyaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXR1cml0eURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1DcmVkaXRHcmFudGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhdEFnZWluZ1BlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhaWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWlkQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWlkRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsQ2VydGlmaWNhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxJbmZvcm1hdGlvblNpZ25hdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbEluZm9ybWF0aW9uU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEFDb3ZlcmFnZUVmZmVjdGl2ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEFFbGlnaWJpbGl0eUJlZ2luRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QUVsaWdpYmlsaXR5RW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QVRlcm1pbmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QkNvdmVyYWdlRWZmZWN0aXZlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QkVsaWdpYmlsaXR5QmVnaW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRCRWxpZ2liaWxpdHlFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRCVGVybWluYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWV0aW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVyZ2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlclJlYWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pZHBvaW50T2ZQZXJmb3JtYW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVJlcXVpcmVkRGlzdHJpYnV0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtU2hlbGZMaWZlUmVtYWluaW5nQXRUaW1lT2ZEZXNwYXRjaFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVNoZWxmTGlmZVJlbWFpbmluZ0F0VGltZU9mUmVjZWlwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9udGhFbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbnRoVG9EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb29yaW5nRGF0ZUFuZFRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlZU9mZmljaWFsU2lnbmF0dXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VlUmVwb3J0ZWRDdXJ0YWlsbWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlTm90ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RMaWtlbHlFYXJseUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdExpa2VseUVhcmx5U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RMaWtlbHlMYXRlRmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0TGlrZWx5TGF0ZVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0UmVjZW50SGVtb2dsb2Jpbk9ySGVtYXRvY3JpdE9yQm90aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdFJlY2VudFJlbmV3YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RSZWNlbnRSZXZpc2lvbm9ySW5pdGlhbFZlcnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RSZWNlbnRTZXJ1bUNyZWF0aW5lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZlZEZyb21Mb2NhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ290aWF0ZWRFeHRlbnNpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGVkRmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGVkU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ290aWF0aW9uc1N0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0Q3JlZGl0U2VydmljZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFdvcnRoRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dEFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0QW5uaXZlcnNhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRBbm51YWxNZWV0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0SW5zdGFsbG1lbnREdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0SW50ZXJlc3RDaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0UGF5SW5jcmVhc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRQYXltZW50RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0UmV2aWV3RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uV29ya2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9Qcm9kdWN0aW9uU2NoZWR1bGVFc3RhYmxpc2hlZEFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vUHJvbWlzZUFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vU2hpcHBpbmdTY2hlZHVsZUVzdGFibGlzaGVkQXNPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90QWZ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEJlZm9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpY2F0aW9uT2ZEZWF0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpY2F0aW9uVGltZUxpbWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90UmVnaXN0ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90UmVnaXN0ZXJlZEFzT2ZHaXZlbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51cnNpbmdIb21lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdXJzaW5nSG9tZUZyb20iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51cnNpbmdIb21lVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXJyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXJyZW5jZVNwYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VycmVuY2VTcGFuRnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXJyZW5jZVNwYW5UbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZXJFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZIaXJlU3VydmV5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmSG9sZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNpYWxSYWlsQ2FySW50ZXJjaGFuZ2VFaXRoZXJBY3R1YWxvckFncmVlZFVwb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZi1NYXJrZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZnNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Zmc2V0QmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZnNldEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Zmc2V0RnJvbUNvb3JkaW5hdGVkVW5pdmVyc2FsVGltZVV0YyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkZXN0VW5wYWlkSW5zdGFsbG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkJvYXJkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25IaXJlU3VydmV5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25Ib2xkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbnNldE9mQ3VycmVudFN5bXB0b21zT3JJbGxuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbnNldE9mU2ltaWxhclN5bXB0b21zT3JJbGxuZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuSG91c2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5pbmdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpb25zQ2Vhc2VkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BpbmlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW1pc3RpY0Vhcmx5RmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpbWlzdGljRWFybHlTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW1pc3RpY0xhdGVGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGltaXN0aWNMYXRlU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyQW1lbmRtZW50QmluZGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyQ29tcGxldGlvbkRhdGVUaW1lVWx0aW1hdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlclJlY2VpdmVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyVG9Qcm9jZWVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxEdXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxFYXJseUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxFYXJseVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEVzdGltYXRlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxJc3N1ZUFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbGx5U2NoZWR1bGVkU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxNYXR1cml0eURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsTmFtZUNoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUG9zdGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUmVjZWlwdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3J0aG9kb250aWNUcmVhdG1lbnRQZXJpb2RSZW1haW5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ydGhvZG9udGljVHJlYXRtZW50UGVyaW9kVG90YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dC1PZi1Qb2NrZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVBdWRpdG9yc1JlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcmhhdWxlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnJpZGVEYXRlRm9yU2V0dGxlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlclRhcmdldEJhc2VsaW5lTW9udGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJ0aW1lRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnRpbWVTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc2hpcENoYW5nZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc2hpcFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3h5Z2VuU2F0dXJhdGlvblRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94eWdlblRoZXJhcHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94eWdlblRoZXJhcHlFdmFsdWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeHlnZW5UaGVyYXB5RnJvbSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3h5Z2VuVGhlcmFweVRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ1N0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZEluRnVsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZFRocm91Z2hEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkLVRocm91Z2hEYXRlRm9yQWNjcnVlZFNpY2tQYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRUaHJvdWdoRGF0ZUZvck1pbmltdW1QYXltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkLVRocm91Z2hEYXRlRm9yU2FsYXJ5Q29udGludWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkVGhyb3VnaERhdGVGb3JUb3RhbFBheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWQtVGhyb3VnaERhdGVGb3JWYWNhdGlvblBheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZFRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC11cCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFwZXJ3b3JrTWFpbGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsQW5udWl0aXphdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGljaXBhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRUaW1lV29ya2luZ0NoYW5nZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXN0RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50Rmlyc3RWaXNpdEZvckNvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudENvbW1lbmNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnREYXRlVGltZURlZmVycmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEluaXRpYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEluc3RydWN0aW9uRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRJc3N1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFBlcmlvZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFBlcmlvZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50VmFsdWF0aW9uUHJlc2VudGF0aW9uRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxEZWR1Y3Rpb25EYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbFBlcmlvZEJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsUGVyaW9kRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWFrQWN0aXZpdHlQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZXJSZXZpZXdPcmdhbml6YXRpb25QUk9BcHByb3ZlZFN0YXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZXJSZXZpZXdPcmdhbml6YXRpb25QUk9BcHByb3ZlZFN0YXlGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWVyUmV2aWV3T3JnYW5pemF0aW9uUFJPQXBwcm92ZWRTdGF5VG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmFsdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmFsdHlCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuYWx0eUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuZGluZ0FyY2hpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNvbGF0aW9uVGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kQW5FdmVudElzTGF0ZUR1ZVRvQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZEFzc2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RCZXR3ZWVuQ2hhbmdlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kQ292ZXJlZEJ5U291cmNlRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZEV4dGVuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RpY0luc3BlY3Rpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RPZkNhcmVFbmREYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RPZkNhcmVTdGFydERhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZE9mSWxsbmVzc0VuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZE9mSWxsbmVzc1N0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kT3ZlcmR1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZFdvcmtlZEZvclRoZUNvbXBhbnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1pdFRvQWRtaXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtaXRZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXNzaW1pc3RpY0Vhcmx5RmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXNzaW1pc3RpY0Vhcmx5U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlc3NpbWlzdGljTGF0ZUZpbmlzaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVzc2ltaXN0aWNMYXRlU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2tVcENvbGxlY3Rpb25EYXRlVGltZU9mQ2FyZ28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2tVcERhdGVUaW1lT2ZFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50RGF0ZVByZXZpb3VzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnRQZXJpb2RFeHBpcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuQW5uaXZlcnNhcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5CZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbkVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbkVudHJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmVkRHVyYXRpb25PZldvcmtzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmVkUmVsZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbk9mVHJlYXRtZW50UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuUGFydGljaXBhdGlvblN1c3BlbnNpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5QZXJpb2RFbGVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhblBlcmlvZEVsZWN0aW9uQmVnaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5QZXJpb2RFbGVjdGlvbkVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhblRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVnZ2VkQW5kQWJhbmRvbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUVmZmVjdGl2ZU9uT3JBZnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5RWZmZWN0aXZlT25PckJlZm9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5RXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5U3VycmVuZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sU2V0dGxlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zaXRpb25pbmdEYXRlVGltZU9mRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3NpdGlvbmluZ0RhdGVUaW1lT2ZHb29kcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGluZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RtYXJrRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3QtUmVjbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1SZWNsYXNzaWZpY2F0aW9uRW5kT2ZTZWNvbmRZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0LVJlY2xhc3NpZmljYXRpb25GaXJzdFJlcG9ydENhcmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3QtUmVjbGFzc2lmaWNhdGlvbkZpcnN0U2VtaS1hbm51YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3QtUmVjbGFzc2lmaWNhdGlvblNlY29uZFNlbWktYW5udWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVhcnJhbmdlZERlYWxNYXRjaCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLUF3YXJkU3VydmV5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVjZWRpbmdQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1jZXJ0aWZpY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZm9yZWNsb3N1cmVBY2NlcHRhbmNlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZm9yZWNsb3N1cmVTYWxlQ2xvc2luZ0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWduYW5jeUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVnbmFuY3lEdXJhdGlvbkFjdHVhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZ25hbmN5RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtQ2hhbmdlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtUGFpZFRvRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bVBhaWRUb0RhdGVCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bVBhaWRUb0RhdGVFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uRGF0ZVRpbWVPZkRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbkRpc3BlbnNpbmdEYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25GaWxsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25Gcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25Jc3N1ZURhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvblRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50YXRpb25EYXRlTGF0ZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50YXRpb25EYXRlT2ZHb29kc0RlY2xhcmF0aW9uQ3VzdG9tcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGF0aW9uVG9CYW5rcnVwdGN5UmVjZWl2ZXJzRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudENvbnRyb2wiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRlZFRvUmVjZWl2ZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50TGVnYWxTdHJ1Y3R1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRseVJlc2lkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50bWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnROYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50UmVzaWRlbmNlU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0Jvb2tpbmdEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDb3VydEV2ZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0N1cnJlbnRBY2NvdW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNFbXBsb3ltZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0VtcGxveW1lbnRFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRW1wbG95bWVudFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0ludm9pY2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c2x5UmVwb3J0ZWREYXRlT2ZCaXJ0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNseVJlc2lkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTWV0ZXJSZWFkaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNNb250aEVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVwb3J0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZXNpZGVuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVzaWRlbmNlRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1Jlc2lkZW5jZVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1Rlcm1pbmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBZGp1c3RtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBZGp1c3RtZW50TGltaXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFkanVzdG1lbnRTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQmFzZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZVByb3RlY3Rpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDYXJlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDYXJlUHJvdmlkZXJCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNhcmVQcm92aWRlckVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbnRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JDb250cmFjdEFubml2ZXJzYXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckNvbnRyYWN0SXNzdWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySG9zcGl0YWxpemF0aW9uRGF0ZXNSZWxhdGVkVG9DdXJyZW50U2VydmljZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySW5jb3JyZWN0RGF0ZU9mQmlydGgiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yTm90aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclBsYWNlbWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmlsZWdlRGV0YWlsc1ZlcmlmaWNhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NpbmdEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ0RhdGVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NpbmdFbmREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ1N0YXJ0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RBdmFpbGFiaWxpdHlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0SGVsZFVudGlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uRGF0ZU5vU2NoZWR1bGVFc3RhYmxpc2hlZEFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25JbnNwZWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbk1hbnVmYWN0dXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdExpZmVzcGFuQXRUaW1lT2ZQcm9kdWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9maXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1tZWRDYWxlbmRhclllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1tZWRGaXNjYWxZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmVzc1BheW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RlZEFjdGlvbkVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RlZEZvcmVjbG9zdXJlU2FsZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RPdmVyVGFyZ2V0QmFzZWxpbmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvckRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvckRlbGl2ZXJ5QWZ0ZXJBbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yRGVsaXZlcnlQcmlvclRvQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvckRlbGl2ZXJ5V2Vla09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvclNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvclNoaXBtZW50QWZ0ZXJBbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yU2hpcG1lbnRQcmlvcnRvQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvclNoaXBtZW50V2Vla09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25EYXRlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25FbmREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uRmxvb3JTdG9ja1Byb3RlY3QtRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25GbG9vclN0b2NrUHJvdGVjdC1TdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uSW52b2ljZVBlcmZvcm1hbmNlLUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uSW52b2ljZVBlcmZvcm1hbmNlLVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25PcmRlci1FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbk9yZGVyLVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25QZXJmb3JtYW5jZS1FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblBlcmZvcm1hbmNlLVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25SZXF1ZXN0ZWREZWxpdmVyeS1FbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblJlcXVlc3RlZERlbGl2ZXJ5LVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25TaGlwLUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uU2hpcC1TdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uU3RhcnREYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5QWNxdWlyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5QnVpbHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RvdHlwZVRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyU2lnbmF0dXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTGF0ZXN0UG9zc2libGVDaGFuZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1dEludG9TZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5UmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyRW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90YURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90ZVRvQmVSZWNlaXZlZEJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQWRqdXN0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVPZkV4Y2hhbmdlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVQcmljZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFjaGVkVG90YWxEZXB0aCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhZHlGb3JJbnNwZWN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlUHJvcGVydHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVUYXhZZWFyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWJ1aWx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNhcHR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmFibGVzQ29sbGVjdGlvblBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVBdExvY2tib3hEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZEluVGhlTWFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJBcHBvaW50ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyc2hpcFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJzaGlwUmVzdWx0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFzc2lmaWNhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFzc2lmaWNhdGlvbkV4aXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbXBsZXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZGVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3ZlcnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY292ZXJ5RmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvdmVyeVN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZS1lbnRyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmUtZXZhbHVhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlRXhwb3J0YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlZEl0ZW1DcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmFsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyZWRGcm9tIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJlZFRvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZpbmFuY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnVzYWxQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRDb250cmFjdG9yTnVtYmVyQXNzaWdubWVudERhdGVPcmlnaW5hbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uRGF0ZU9mUHJldmlvdXNDdXN0b21zRGVjbGFyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbk9mQm9hcmRPZkRpcmVjdG9ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVoaXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWltYnVyc2VtZW50Q2xhaW1Jc3N1ZURhdGVBbmRPclRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlSW1wb3J0YXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3RhdGVtZW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VBY2NvdW50aW5nUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZUNvdmVyYWdlRHVyYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlQ3VycmVudEFjY291bnRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlRWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZUlzc3VlQWdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZVBhaWRVcERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlUGF5bWVudEZyZXF1ZW5jeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpc3N1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZURhdGVDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlRGF0ZU9mQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VEYXRlT2ZTdXBwbGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZWRSZXR1cm5Ub1dvcmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VkVG9WZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VGcmVxdWVuY3kiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VPZkluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1pdHRhbmNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vZGVsaW5nQ29tcGxldGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW5ld2FsRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRTdXJ2ZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpclR1cm5hcm91bmRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBheW1lbnRCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYXltZW50U2NoZWR1bGVTZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50RWZmZWN0aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBseURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0ZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdDeWNsZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0U3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1YWxpZmljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZENvbnRyYWN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWREZXBhcnR1cmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRGaW5pc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVSZXF1ZXN0ZWRGb3JBZnRlckFuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVJlcXVlc3RlZEZvclByaW9yVG9BbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZEZvckRlbGl2ZXJ5V2Vla09mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudERhdGVUaW1lUmVxdWVzdGVkRm9yQWZ0ZXJBbmRJbmNsdWRpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGF0ZVRpbWVSZXF1ZXN0ZWRGb3JQcmlvclRvQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRGb3JTaGlwbWVudFdlZWtPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkT2ZmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZFBpY2stdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZFNldHRsZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZFNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZFN0YXJ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yUXVvdGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlZEJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlZERlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZhdGlvbk9mRmFjaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50TGljZW5zZUVmZmVjdGl2ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbnRMaWNlbnNlRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWduYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZ25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzb2x2ZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0RGF5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0RmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0U3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3VibWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0ZW50aW9uUmVsZWFzZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRlbnRpb25SZWxlYXNlRGF0ZVRpbWVQYXJ0aWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRpcmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRyYW5zbWlzc2lvblRpbWVTdGFtcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5lZFRvQ3VzdG9tZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVyblRvV29ya0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVyblRvV29ya1BhcnRUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXdEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXdQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlzZWRBZGp1c3RlZEVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aXNlZEFkanVzdGVkU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlzZWRFc3RpbWF0ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlzaW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZva2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWdBcnJpdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkRnVuZFRheEV4cGlyeURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhaWxpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGFyeUNoYW5nZUVmZmVjdGl2ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGFyeURlZmVycmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlYWJsZVN0b2NrRGVtYW5kQ292ZXJQZXJpb2RFeHBlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNEYXRlQW5kT3JUaW1lQW5kT3JQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVBdmFpbGFibGVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVDb2xsZWN0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZVJlcXVpcmVkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlc1RvQmVSZXR1cm5lZEJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW5jdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0aXNmYWN0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0aXNmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkRmluaXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGb3JEZWxpdmVyeU9uT3JBZnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkRm9yRGVsaXZlcnlPbk9yQmVmb3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGb3JEZWxpdmVyeVdlZWtPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkRm9yU2hpcG1lbnRBZnRlckFuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkRm9yU2hpcG1lbnRQcmlvclRvQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGb3JTaGlwbWVudFdlZWtPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkSW50ZXJjaGFuZ2VEZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkU3RhcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlUmVsZWFzZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sUmVmdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRBZG1pc3Npb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmREaXNjaGFyZ2VEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0eVJhdGVBZGp1c3RtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0eVNoYXJlUHJpY2VBc09mR2l2ZW5EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxlY3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZWN0aW9uUGVyaW9kRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZWN0aW9uUGVyaW9kU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsQnlEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzTG9jYWxUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW1pYW5udWFsRW5kaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kaW5nUm9hZFRpbWVTdGFtcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VwdGljQXBwcm92YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDb21wbGV0aW9uRGF0ZVRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VJbnRlcnJ1cHRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VQZXJpb2RFbmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VQZXJpb2RTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVJlcXVlc3RlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZXJTaWduYXR1cmVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXRvZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50RGF0ZUFzU3BlY2lmaWVkQnlUaGVPcmlnaW5hdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50RGF0ZUZyb21JbnRlcmxpbmVTZXR0bGVtZW50U3lzdGVtT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudERhdGVQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50RHVlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudFN0YXR1cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVQcmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbGZMaWZlRXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcERhdGVPcmlnaW5hbGx5U2NoZWR1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwRHVyaW5nRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnREYXRlVGltZVByb21pc2VkRm9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudERhdGVUaW1lUHJvbWlzZWRGb3JQcmlvclRvQW5kSW5jbHVkaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudERhdGVUaW1lUmVxdWVzdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwTm90TGF0ZXJUaGFuRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBOb3RCZWZvcmVEYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcE5vdEJlZm9yZUFuZE5vdEFmdGVyRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBPbk9yQWJvdXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ0RhdGVBbmRPclRpbWVDdXJyZW50U2NoZWR1bGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nRGF0ZU5vU2NoZWR1bGVFc3RhYmxpc2hlZEFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBXZWVrT2ZEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaHV0SW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpY2tuZXNzQmVuZWZpdEFnZUxpbWl0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWNrbmVzc0JlbmVmaXRQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpY2tuZXNzSW5zdXJhbmNlRWxpbWluYXRpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpY2tuZXNzTGlmZXRpbWVCZW5lZml0UXVhbGlmaWNhdGlvbkFnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lkZXRyYWNrZWRXZWxsYm9yZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmF0dXJlRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmF0dXJlUmVjZWl2ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbWlsYXJJbGxuZXNzT25zZXREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW1wbGVJbnRlcmVzdER1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xhdWdodGVyaW5nRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xhdWdodGVyaW5nU3RhcnREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxTZWN1cml0eUNsYWltc1ZlcmlmaWNhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGRCb29rUHVibGljYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGVEaXJlY3RvcnNoaXBSZWdpc3RyYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xpY2l0YXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZURvY3VtZW50Q2FwdHVyZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwYWNpbmdPcmRlclVuaXRBc3NpZ25lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvbnNvcmVkRGVwZW5kZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG9uc29yZWREZXBlbmRlbnRCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvbnNvcmVkRGVwZW5kZW50RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG91c2VSZXRpcmVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcHVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZUVhcmxpZXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVFc3RpbWF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZUxhdGVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lTWFuZGF0b3J5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVOb3RBZnRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lTm90QmVmb3JlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVTY2hlZHVsZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZVRpbWVQbGFubmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydGVkRG9pbmdCdXNpbmVzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnROb0VhcmxpZXJUaGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydE5vTGF0ZXJUaGFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlUmVzaWRlbmN5RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVUZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxUaW1lU2VyaWVzRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNBZnRlckFuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzQXNzaWdubWVudERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c0NoYW5nZURhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNDb21tZXJjaWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNPdXRzaWRlUHJvY2Vzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNQcmlvckFuZEluY2x1ZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcERpc3RyaWJ1dGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3BXb3JrQXNPZkdpdmVuRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50U2lnbmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yUGVyaW9kT2ZIaXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXNzaW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzZXF1ZW50SW50ZXJlc3RQYXltZW50RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzZXF1ZW50U3VibWlzc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJzZWRlZERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YWxJc3N1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzQXZlcmFnZUNyZWRpdFBlcmlvZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZUNhc2luZ0F1dGhvcml0eUFwcHJvdmFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJnZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJyZW5kZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnZleVllYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1c3BlbmRlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1c3BlbnNpb25FZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1c3BlbnNpb25QZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3b3JuQW5kU3Vic2NyaWJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ltcHRvbXNPbnNldFBhdGllbnRBbGxlZ2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1TdXJ2ZXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbVRlc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhYmxlUmF0aW5nRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYWlsQ292ZXJhZ2VCZWdpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFpbENvdmVyYWdlRW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rc0FjY2VwdGVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtzSW5zcGVjdGVkRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhQZXJpb2RFbmREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhQZXJpb2RTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFBvaW50RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4WWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsUmF0aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxleERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBvcmFyeVByb3N0aGVzaXNEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5kZXJTdWJtaXNzaW9uRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmF0ZWREYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYXRpb25PZkZhY2lsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtc0Rpc2NvdW50RHVlRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1zTWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtc05ldER1ZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RDb21wbGV0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFBlcmZvcm1lZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFBlcmlvZEVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGV4YXNMaW5lVGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZXJhcHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVFbXBsb3llZUJlZ2FuV29yayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUluVVMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVMaW1pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZU5vd0RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlVHJhbnNmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xpbmdSZXF1aXJlZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU2hlbGZMaWZlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZURhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlU3R5bGVSZWdpc3RyYXRpb25EYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbmluZ0JlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbmluZ0VuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb25DcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyTm90ZUFjY2VwdGFuY2VEYXRlQW5kVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaGlwbWVudERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0VGltZUxpbWl0cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXNzaW9uRGF0ZVRpbWVPZkRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pdHRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3RyaXBwaW5nRGF0ZUFuZE9yVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3R1ZmZpbmdEYXRlQW5kT3JUaW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmF2ZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50RW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnRTdGFydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYWxCYWxhbmNlUGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlhbFNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYWxTdGFydERhdGVBY3R1YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWFsU3RhcnREYXRlU2NoZWR1bGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJ3cml0aW5nWWVhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkZWREYXRlQW5kVGltZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRhdGlvbkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbGlkaXR5UGVyaW9kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWxpZGl0eVN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRVbnRpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWF0aW9uRGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVhdGlvbkRhdGVDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkVGF4Q2xhaW1zVmVyaWZpY2F0aW9uRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVEYXRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZURhdGVPZkluZGV4Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJiYWxSZXBvcnROZWVkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcmlmaWNhdGlvblJlY2VpdmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJpZmljYXRpb25TZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyc2lvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsUmVnaXN0cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3RpbmdTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXN0aW5nU2VydmljZUJlZ2luIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXN0aW5nU2VydmljZUVuZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW50YXJ5VGVybWluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvdWNoZXJEYXRlT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZ2VFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZ2VzRWFybmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWdlUGVyaW9kRW5kRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZVBlcmlvZFN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FpdGluZ1RpbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnR5RXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F5YmlsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2Vla0VuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2hlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbExvZ1J1biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hvbGVzYWxlQ29udHJhY3RFZmZlY3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xlc2FsZUNvbnRyYWN0RXhwaXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lsbEFkdmlzZUFzT2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdGhkcmF3bkRhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdGhoZWxkRGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0VmZmVjdGl2ZVN0YXJ0RGF0ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya2luZ1BlcmlvZEVuZERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtpbmdQZXJpb2RTdGFydERhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtQZXJpb2QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtzQ29tcGxldGlvbkRhdGVUaW1lQWN0dWFsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc0NvbXBsZXRpb25EYXRlVGltZVBsYW5uZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcnN0VGltZVRvQ2FsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhckJlZ2lubmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhckR1ZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhckVuZGluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhck9mT2NjdXJyZW5jZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhclRvRGF0ZSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRJRCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJUcmFuc3BvcnRNb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlRyYW5zcG9ydE1lYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXJyaWVyTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2FycmllcklEIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDdXN0U2hpcHBpbmdDb250cmFjdE51bSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VydmljZUxldmVsQ29kZWQiIHR5cGU9IlNlcnZpY2VMZXZlbENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlcnZpY2VMZXZlbENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBwaW5nSW5zdHJ1Y3Rpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnRMZWdDb2RlZCIgdHlwZT0iVHJhbnNwb3J0TGVnQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0TGVnQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZUcmFuc3BvcnRFcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVHJhbnNpdERpcmVjdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0Tm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0IiB0eXBlPSJUcmFuc3BvcnQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zcG9ydE1vZGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydE1vZGVDb2RlZCIgdHlwZT0iVHJhbnNwb3J0TW9kZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydE1vZGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRNb2RlIiB0eXBlPSJUcmFuc3BvcnRNb2RlIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zcG9ydE1vZGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJDaGFydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJFeHByZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJGcmllZ2h0Rm9yd2FyZGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJUYXhpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFybWVkRm9yY2VzQ291cmllclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2toYXVsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVzdFdheS1TaGlwcGVyc09wdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va1Bvc3RhbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWJPclRheGkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vbklycmVndWxhckNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcml6ZWRPY2VhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZW50aW9uYWxPY2VhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJQaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUGlja3VwT3JDdXN0b21lcnNFeHBlbnNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZWF3YXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlYXdheVNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV1cm9wZWFuT3JQYWNpZmljRGlzdHJpYnV0aW9uU3lzdGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRUcmFuc3BvcnRJbnN0YWxsYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZseWF3YXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNSZWNlaXZpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNSZWNlaXZpbmdPclNoaXBwaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljU2hpcHBpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFdhdGVyVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRXYXRlcndheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtb2RhbC1QaWdneWJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuVHJhaWxlckxvYWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZ2FpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyaXRpbWVUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5SW50cmF0aGVhdGVyQWlybGlmdFNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5T2ZmaWNpYWxNYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlVW5rbm93biIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yLUJ1bGtDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3Rvci1Db21tb25DYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3Rvci1GbGF0YmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3Rvci1QYWNrYWdlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3ItVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdXRpbW9kYWxUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbkNvbmZlcmVuY2VDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2Vhbk5vbi1Db25mZXJlbmNlQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyY2VsUG9zdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xlZEFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbGVkUGlnZ3liYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sZWRSYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sZWRUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbFRvUG9vbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVQYXJjZWxTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWlja3RyYW5zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFPckFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQWdlbnQtVHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJBc3NvY2lhdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhY2tUcmFpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RlYW1zaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllclRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3dhd2F5U2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlck9yUGlwZWxpbmVJbnRlcm1vZGFsTW92ZW1lbnQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zcG9ydE1lYW5zIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRNZWFuc0NvZGVkIiB0eXBlPSJUcmFuc3BvcnRNZWFuc0NvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydE1lYW5zQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0TWVhbnMiIHR5cGU9IlRyYW5zcG9ydE1lYW5zIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zcG9ydE1lYW5zQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIwRnRJTENvbnRhaW5lci1DbG9zZWRUb3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIwRnRJTENvbnRhaW5lci1PcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MEZ0SUxDb250YWluZXItT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDBGdElMQ29udGFpbmVyLUNsb3NlZFRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyY3JhZnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckZyZWlnaHQtQnJlYWtCdWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJSaWRlVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2VDaGVtaWNhbFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2VPcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhckZ1bGx5RW5jbG9zZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyRnVsbHlPcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhclNjcmVlbmVkLU5vUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1XaXRoUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9naWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyQ3VzaGlvblVuZGVyRnJhbWVPRiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLURhbWFnZUZyZWVFcXVpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLUluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLUludGVyaW9yQnVsa2hlYWRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrdHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtUcnVja0FuZEJ1bGtUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrVHJ1Y2tBbmRFeHRlbmRhYmxlR29uZG9sYVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtUcnVja0FuZEV4dGVuZGFibGVUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrVHJ1Y2tBbmRHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa1RydWNrQW5kVGFua1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtUcnVja0FuZFRyYWlsZXJXaXRoT3BlbmluZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhYm9vc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29BbmRQYXNzZW5nZXJWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcldpdGhDYXJhdmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW1lbnRWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXMtR29vc2VuZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZENvbnRhaW5lci1Db250cm9sbGVkVGVtcGVyYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hbFZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hc3RlckNoZW1pY2FsVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2lsLUNhckNvdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvaWxDYXJPcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1BbHVtaW51bSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUJ1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1DbG9zZWRUb3AtTGVuZ3RoVW5zcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1IZWF0ZWRPckluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUhpZ2hTaWRlT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUxvd1NpZGVPcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJPbmx5VmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItT3Blbi1TaWRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLU9wZW5Ub3AtTGVuZ3RoVW5zcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1QbGF0Zm9ybSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVycmVzdGluZ29uYUNoYXNzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1TdGVlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rQ2hlbWljYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFua0Zvb2RHcmFkZS1MaXF1aWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rR2FzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVXBncmFkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1WZW50ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcndpdGhCYWdIYW5nZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJ3aXRoRmxvb3JTZWN1cmluZ1JpbmdzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJ3aXRoRmx1c2hEb29ycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyd2l0aEhhbmdhckJhcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhTbW9vdGhTaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aFdhdnlPclJpcHBsZVNpZGVzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkVGVtcGVyYXR1cmVUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJlZEJhcmdlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcnVkZU9pbFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJEZXRlcm1pbmVkRGVhbnNPZlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJSYWlsVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXQtSW5IZWxwZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZXBTZWFDaGVtaWNhbFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG91YmxlLURyb3BUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wQmFja1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyeUJ1bGtDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRvZlRyYWluRGV2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlcHRpb25hbFRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVycnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpc2hpbmdWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkLVJhY2tEb3VibGVEcm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRSYWNrLUZsYXRCZWRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFJhY2stU2luZ2xlRHJvcFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRiZWRTbGlkaW5nVGFuZGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXItUmVtb3ZhYmxlU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyd2l0aEhlYWRib2FyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyd2l0aE5vSGVhZGJvYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdENhci1FbmRCdWxraGVhZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRjYXJXaXRoUGVkZXN0YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWV6ZXJUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZXplclRydWNrQW5kSXNvdGhlcm1pY1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWV6ZXJUcnVja0FuZFJlZnJpZ2VyYXRlZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWV6ZXJUcnVja0FuZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWV6ZXJWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb3plbkZvb2RUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdXJuaXR1cmVUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVGFua2VyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQ2FyZ29WZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYXRvclNldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29uZG9sYUNhci1Db3ZlcmVkSW50ZXJpb3JCdWxraGVhZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvbmRvbGFDYXItT3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29uZG9sYUNvdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluY2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhdmVsVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYWxmSGVpZ2h0RmxhdFJhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWQtRW5kSGVscGVyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZG9mVHJhaW5EZXZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hDdWJlVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3BwZXJDYXItQ292ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9wcGVyQ2FyLUNvdmVyZWRQbmV1bWF0aWNEaXNjaGFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcHBlckNhci1PcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIeWRyYW50Q2FydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRsZXJDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzb3RoZXJtaWNUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNvdGhlcm1pY1RydWNrQW5kRnJlZXplclRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzb3RoZXJtaWNUcnVja0FuZElzb3RoZXJtaWNUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc290aGVybWljdHJ1Y2thbmRyZWZyaWdlcmF0ZWR0cmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc290aGVybWljVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1ZWZpZWROYXR1cmFsR2FzQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWVmaWVkUGV0cm9sZXVtR2FzQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZE9yVW5sb2FkRGV2aWNlT25FcXVpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY29tb3RpdmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxQcm9kdWN0c1RhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3Blbi1Ub3BPckZsYXRCZWRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuVG9wVmFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmVDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzZW5nZXJWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdHJvbFZlc3NlbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljay1VcFRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG93ZXJQYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0ZWRUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsQnVsa0NhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbEV4cHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkTWFpbnRlbmFuY2VPZldheUNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFNpbG9UYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxUYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXItRW5kSGVscGVyVW5pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUcnVja0FuZEZyZWV6ZXJUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUcnVja0FuZElzb3RoZXJtaWNUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUcnVja0FuZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3ZhYmxlU2lkZVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW92YWxUcnVja0FuZFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ2lkVHJ1Y2tXaXRoVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnaWRUcnVja1dpdGhUYW5rQW5kQnVsa1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ2lkVHJ1Y2tXaXRoVGFua0FuZFRhbmtUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkUmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkU2lsb1RhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZFRhbmtlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sbE9uLVJvbGxPZmZWZXNzZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZGRsZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyRGV0ZXJtaW5lZE1lYW5zT2ZUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBUYW5rZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZS1Ecm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhY2tDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUQUstUkFLIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGVlbFByb2R1Y3RzVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXIyNVRvbm5lV2l0aDkwQ3ViaWNNZXRlclRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja0FuZEV4dGVuZGFibGVHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tBbmRFeHRlbmRhYmxlVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tBbmRHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tBbmRSZW1vdmFsVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tBbmRUcmFpbGVyV2l0aE9wZW5pbmdGbG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZkFuZEV4dGVuZGFibGVHb25kb2xhVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZkFuZEV4dGVuZGFibGVUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja1dpdGhSZW1vdmFibGVSb29mQW5kR29uZG9sYVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrV2l0aFJlbW92YWJsZVJvb2ZBbmRSZW1vdmFsVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZmFuZFRyYWlsZXJXaXRoT3BlbmluZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhpIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlc2NvcGluZ1RyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWJlck9yTG9nQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlwLVVwQXJ0aWN1bGF0ZWRUcnVjayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlwLVVwdHJ1Y2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpcC1VcFRydWNrQW5kRXh0ZW5kYWJsZUdvbmRvbGFUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXAtVXBUcnVja0FuZEdvbmRvbGFUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXAtVXBUcnVja0FuZFRyYWlsZXJXaXRoT3BlbmluZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUJvYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItQ2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLURyeUZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItRWxlY3RyaWNIZWF0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUhlYXRlZE9ySW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1JbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItTm90T3RoZXJ3aXNlU3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVBuZXVtYXRpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1SZWZyaWdlcmF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItVGFuay1DaGVtaWNhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItVGFuay1Gb29kR3JhZGVMaXF1aWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItVGFuay1HYXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluaW5nVmVzc2VsIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbldpdGgyME9yTW9yZVdhZ29ucyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5XaXRoTW9yZVRoYW5PbmVBbmRMZXNzVGhhbjIwV2Fnb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbldpdGhPbmVXYWdvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyMjBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1GdWxseUVuY2xvc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1Ob1Jvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLVdpdGhEb29yc05vUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtV2l0aFJvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja0FuZFRyYWlsZXJXaXRoT3BlbmluZ0Zsb29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wSGlnaFNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLU9wZW5Ub3BMb3dTaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja09yVHJhaWxlcldpdGhUaWx0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1WYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrV2l0aE9wZW5pbmdGbG9vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tXaXRoT3BlbmluZ0Zsb29yQW5kRXh0ZW5kYWJsZUdvbmRvbGFUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja1dpdGhPcGVuaW5nRmxvb3JBbmRFeHRlbmRhYmxlVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tXaXRoT3BlbmluZ0Zsb29yQW5kR29uZG9sYVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1Z2FuZE9yUHVzaGJvYXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRMb2FkRGV2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbi1TcGVjaWFsSW5zaWRlTGVuZ3RoV2lkdGhPckhlaWdodFJlcXVpcmVtZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLUxha2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2VhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuLUNvbnRhaW5lcnNoaXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2Vhbi1MYXNoIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4tUm9sbE9uLVJvbGxPZmYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2RjaGlwY2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1Zlc3NlbCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTZXJ2aWNlTGV2ZWxDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa0NvbW1vZGl0eVRyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtU3VyZmFjZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyZWVEYXlTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5QU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckNhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJFY29ub215Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlQmlsbGluZ1NlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJpZXJFeHByZXNzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cHJlc3NTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNjaGVkdWxlZE5leHREYXlCeUNhcnRhZ2VBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTY2hlZHVsZWRTZWNvbmREYXlCeUNhcnRhZ2VBZ2VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTY2hlZHVsZWRUaGlyZERheUJ5Q2FydGFnZUFnZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUNvbmZpcm1hdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyZWRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUNvbmZpcm1hdGlvblJldHVybiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9vclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Tm90aWZpY2F0aW9uT25seSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvb2ZPZkRlbGl2ZXJ5V2l0aFNpZ25hdHVyZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RDbGFzcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHByZXNzU2VydmljZVBsdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNraW5nR3JvdW5kIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJYXRhIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRTZXJ2aWNlV29ybGR3aWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHByZXNzU2VydmljZVdvcmxkd2lkZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0cm8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpd2VpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0RGF5QWlyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0RmxpZ2h0T3V0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0RGF5SHVuZHJlZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dE1vcm5pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFNlcnZlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3Zlcm5pZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U2VydmljZUFyZWFOZXh0RGF5QnkxMDMwQU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5TWFpbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVNlcnZpY2VBcmVhTmV4dERheUJ5OTMwQU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5TWFpbEluc3VyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U2VydmljZUFyZWFOZXh0RGF5QnlOb29uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQT0JveFppcENvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlTZXJ2aWNlQXJlYU5leHREYXlCeTUwMFBNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U2VydmljZUFyZWFTZWNvbmREYXlCeU5vb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3NlbmdlclNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlJbnRlcm1vZGFsSGlnaFNwZWVkNzBNaWxlc1BlckhvdXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVySW50ZXJtb2RhbEFuZFN0YWNrU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjBNaWxlc1BlckhvdXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5pZmVzdEZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1c1RyYWluIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVHJhaW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11dGVyU2VydmljZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFJldHVyblNlcnZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbWVEYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZERheUFpciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJkYXkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZERheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRHcm91bmQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZERheUh1bmRyZWRXZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkR3JvdW5kSHVuZHJlZFdlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kTW9ybmluZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJkYXlQaWNrdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkQ2xhc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cHJlc3MiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hTcGVlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ybWFsU3BlZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RTZXJ2aWNlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zcG9ydExlZ0NvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0VGhlU3RhdGlzdGljYWxUZXJyaXRvcnlMaW1pdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLUNhcnJpYWdlVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdEJvcmRlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXREZXBhcnR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0RGVzdGluYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1Gb3VydGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtRmlmdGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtU2l4dGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtU2V2ZW50aENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1FaWdodGhDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluLUNhcnJpYWdlVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtRmlyc3RDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlDYXJyaWFnZS1TZWNvbmRDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtVGhpcmRDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRXYXRlcndheVRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlDYXJyaWVyQWxsVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRQcmUtQ2FycmlhZ2VUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1BY2NlcHRhbmNlVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRPbi1DYXJyaWFnZVRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLU5pbnRoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT24tQ2FycmlhZ2VUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1UZW50aENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1FbGV2ZW50aENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1Ud2VsZnRoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMXN0Q2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMm5kQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM3JkQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNHRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNXRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNnRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iN3RoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOHRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOXRoQ2FycmllckFmdGVyT3JpZ2luQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRzUm91dGluZ09yaWdpbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbkRlbGl2ZXJ5Q2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVMWSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF1bGFnZVJpZ2h0c0NhcnJpZXJBbmRKdW5jdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luU3dpdGNoQ2FycmllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF1bGFnZU1vdmVtZW50Q2FycmllckFuZEp1bmN0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5DYXJyaWVyQWlyTW90b3JPck9jZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5DYXJyaWVyUnVsZTExU2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzUm91dGluZ09yaWdpbkNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZVN3aXRjaENhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RDYXJyaWVySW5Sb3V0ZU9uUmV0dXJuUm91dGVNb3ZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdW5jdGlvblNldHRsZW1lbnRDYXJyaWVyRm9sbG93aW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdW5jdGlvblNldHRsZW1lbnRDYXJyaWVyUHJlZGVjZXNzb3IiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlRyYW5zcG9ydEVxdWlwbWVudCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iVHJhbnNwb3J0RXF1aXBtZW50Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZUcmFuc3BvcnRFcXVpcG1lbnQiIHR5cGU9Ikxpc3RPZlRyYW5zcG9ydEVxdWlwbWVudCIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNwb3J0RXF1aXBtZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudFByb3ZpZGVyQ29kZWQiIHR5cGU9IkVxdWlwbWVudFByb3ZpZGVyQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBtZW50UHJvdmlkZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRPd25lckNvZGVkIiB0eXBlPSJFcXVpcG1lbnRPd25lckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudE93bmVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVxdWlwbWVudElEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRTaXplVHlwZUNvZGVkIiB0eXBlPSJFcXVpcG1lbnRTaXplVHlwZUNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwZW1lbnRTaXplVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudFN0YXR1c0NvZGVkIiB0eXBlPSJFcXVpcG1lbnRTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRTdGF0dXNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGdWxsSW5kaWNhdG9yQ29kZWQiIHR5cGU9IkZ1bGxJbmRpY2F0b3JDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGdWxsSW5kaWNhdG9yQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDb25kaXRpb25zIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnROb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlNlYWxJbmZvIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaXN0T2ZFcXVpcG1lbnRNZWFzdXJlbWVudHMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZEaW1lbnNpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0RXF1aXBtZW50IiB0eXBlPSJUcmFuc3BvcnRFcXVpcG1lbnQiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRXF1aXBtZW50UHJvdmlkZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlclN1cHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyU3VwcGxpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRvclN1cHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNvbnNvbGlkYXRvclN1cHBsaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5U3VwcGxpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlclN1cHBsaWVkRnJvbUFMZWFzaW5nQ29tcGFueSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyU3VwcGxpZWRGcm9tVGhlUmFpbHdheXNQb29sIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkVxdWlwbWVudE93bmVyQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEN1c3RvbWVyT3duZWRPckxlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyT3duZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyT3duZWRPckxlYXNlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpcExlYXNlZCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJFcXVpcG1lbnRTaXplVHlwZUNvZGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMEZ0SWxDb250YWluZXItQ2xvc2VkVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMEZ0SWxDb250YWluZXItT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDBGdElsQ29udGFpbmVyLUNsb3NlZFRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDBGdElsQ29udGFpbmVyLU9wZW5Ub3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmNyYWZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJGcmVpZ2h0LUJyZWFrQnVsayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyUmlkZVZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlT3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJGdWxseUVuY2xvc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhckZ1bGx5T3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1Ob1Jvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyU2NyZWVuZWRXaXRoUm9vZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9naWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyQ3VzaGlvblVuZGVyRnJhbWVPZiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLURhbWFnZUZyZWVFcXVpcHBlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLUluc3VsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyLUludGVyaW9yQnVsa2hlYWRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hQYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhYm9vc2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXNzaXMtR29vc2VuZWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRDb250YWluZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZENvbnRhaW5lci1Db250cm9sbGVkVGVtcGVyYXR1cmUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29pbC1DYXJDb3ZlcmVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2lsQ2FyT3BlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItQWx1bWludW0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1CdWxrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItQ2xvc2VkVG9wLUxlbmd0aFVuc3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItSGVhdGVkT3JJbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1IaWdoU2lkZU9wZW5Ub3AiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckljMjBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJJYzMwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVySWM0MEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1JbnN1bGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1JbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1Mb3dTaWRlT3BlblRvcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLU9wZW4tU2lkZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1PcGVuVG9wLUxlbmd0aFVuc3BlY2lmaWVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItUGxhdGZvcm0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclJlc3RpbmdPbkFDaGFzc2lzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItU3RlZWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFuay1DaGVtaWNhbHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rLUZvb2RHcmFkZS1MaXF1aWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rLUdhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVVwZ3JhZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVmVudGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoQmFnSGFuZ2VycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aEZsb29yU2VjdXJpbmdSaW5ncyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aEZsdXNoRG9vcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhIYW5nYXJCYXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoU21vb3RoU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhXYXZ5T3JSaXBwbGVTaWRlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZFRlbXBlcmF0dXJlVHJhaWxlci1SZWVmZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xVbml0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmVkQmFyZ2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1dC1JbkhlbHBlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGltZUNvYXRlZFRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvdWJsZS1Ecm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcEJhY2tUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWFsVHJhaWxlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZE9mVHJhaW5EZXZpY2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVwb3h5Q29hdGVkVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyb1BhbGxldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaGFuZ2VhYmxlUGFsbGV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZC1SYWNrLURvdWJsZURyb3BUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZC1SYWNrLUZsYXQtQmVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWQtUmFjay1TaW5nbGUtRHJvcFRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRiZWRTbGlkaW5nVGFuZGVtIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXItUmVtb3ZhYmxlU2lkZXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyV2l0aEhlYWRib2FyZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyV2l0aE5vSGVhZGJvYXJkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdENhci1FbmRCdWxraGVhZHMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRjYXJXaXRoUGVkZXN0YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb3plbkZvb2RUcmFpbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmF0b3JTZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvbmRvbGFDYXItQ292ZXJlZC1JbnRlcmlvckJ1bGtoZWFkcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29uZG9sYUNhci1PcGVuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb25kb2xhQ292ZXJlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFsZkhlaWdodEZsYXRSYWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkLUVuZEhlbHBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRPZlRyYWluRGV2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoQ3ViZVZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9wcGVyQ2FyLUNvdmVyZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcHBlckNhci1Db3ZlcmVkLVBuZXVtYXRpY0Rpc2NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9wcGVyQ2FyLU9wZW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh5ZHJhbnQtQ2FydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRsZXJDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklNTzEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklNTzIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklNTzMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRPclVubG9hZERldmljZU9uRXF1aXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NvbW90aXZlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZhYmxlQ2FzZS1CZXR3ZWVuMTAuOTBNQW5kMTMuNzVNIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZhYmxlQ2FzZS1CZXR3ZWVuNi4xNU1BbmQ3LjgyTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92YWJsZUNhc2UtQmV0d2VlbjcuODJNQW5kOS4xNU0iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmFibGVDYXNlLUJldHdlZW45LjE1TUFuZDEwLjkwTSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92YWJsZUNhc2UtTGVzc1RoYW42LjE1TSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ud29ya2luZ1JlZWZlckNvbnRhaW5lcjIwRnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbndvcmtpbmdSZWVmZXJDb250YWluZXI0MEZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25Xb3JraW5nUmVmcmlnZXJhdGVkT3JSZWVmZXJDb250YWluZXIzMEZ0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhblZlc3NlbC1CcmVha0J1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW4tVG9wT3JGbGF0YmVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlblRvcFZhbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljay1VcFRydWNrIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3dlclBhY2siLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNzdXJpemVkVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVjdGVkVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbENhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHJvYWRNYWludGVuYW5jZU9mV2F5Q2FyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyLUVuZEhlbHBlclVuaXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZENvbnRhaW5lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkT3JSZWVmZXJDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbmsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbmsyMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbmszMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbms0MEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbmtJYzIwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVGFua0ljNDBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdmFibGVTaWRlVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FkZGxlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2FuZGluYXZpYW5QYWxsZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbWktUmVmcmlnZXJhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW1pLVRyYWlsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZS1Ecm9wVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhY2tDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWlubGVzc1N0ZWVsVGFuayIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Rhay1SYWsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDYXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXIyMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXIzMEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXI0MEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXJJYzIwRmVldCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NvbnRhaW5lckljMzBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ29udGFpbmVySWM0MEZlZXQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVzY29waW5nVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVDb250cm9sbGVkQ29udGFpbmVyMjBGdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVDb250cm9sbGVkQ29udGFpbmVyMzBGdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVDb250cm9sbGVkQ29udGFpbmVyNDBGdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90ZWJpbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1Cb2F0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUNhciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1EcnlGcmVpZ2h0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUVsZWN0cmljSGVhdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1IZWF0ZWRPckluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1JbnN1bGF0ZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItSW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLU5vdE90aGVyd2lzZVNwZWNpZmllZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1QbmV1bWF0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItUmVmcmlnZXJhdGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVRhbmstQ2hlbWljYWxzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVRhbmstRm9vZEdyYWRlLUxpcXVpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1UYW5rLUdhcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyMjBGZWV0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1GdWxseUVuY2xvc2VkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1Ob1Jvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLVdpdGhEb29ycy1Ob1Jvb2YiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLVdpdGhSb29mIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wSGlnaFNpZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLU9wZW5Ub3BMb3dTaWRlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1WYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRMb2FkRGV2aWNlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYW4tU3BlY2lhbEluc2lkZUxlbmd0aC1XaWR0aE9ySGVpZ2h0UmVxdWlyZW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtTGFrZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4tQ29udGFpbmVyc2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuLUxhc2giLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2Vhbi1Sb2xsb24tUm9sbG9mZiIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJFcXVpcG1lbnRTdGF0dXNDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZW50YWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1haW5PbkJvYXJkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlmdGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2hpcG1lbnQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3J0bGFuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVybGFuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpYyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zaXRpb25pbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWRlbGl2ZXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbG9hZGVyIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkZ1bGxJbmRpY2F0b3JDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVsbCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWwiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbmRpdGlvbnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVmcmlnZXJhdGlvbk9uIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVzaWR1ZSIgdHlwZT0ieGNibEJvb2xlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikxpc3RPZkNvbmRpdGlvbnMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZEaW1lbnNpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29uZGl0aW9ucyIgdHlwZT0iQ29uZGl0aW9ucyIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU2VhbEluZm8iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlNlYWxJbmZvIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTZWFsSW5mbyIgdHlwZT0iTGlzdE9mU2VhbEluZm8iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNlYWxJbmZvIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWFsTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlNlYWxJc3N1ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iU2VhbFN0YXR1c0Rlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWFsSW5mbyIgdHlwZT0iU2VhbEluZm8iLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNlYWxJc3N1ZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNlYWxJc3N1ZXJDb2RlZCIgdHlwZT0iU2VhbElzc3VlckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlYWxJc3N1ZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWFsSXNzdWVyIiB0eXBlPSJTZWFsSXNzdWVyIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNlYWxJc3N1ZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdG9yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmtub3duIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFyYW50aW5lQWdlbmN5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbE9wZXJhdG9yIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTZWFsU3RhdHVzRGVzY3JpcHRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VhbFN0YXR1c0NvZGVkIiB0eXBlPSJTZWFsU3RhdHVzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VhbFN0YXR1c0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlYWxTdGF0dXNJbmZvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWFsU3RhdHVzRGVzY3JpcHRpb24iIHR5cGU9IlNlYWxTdGF0dXNEZXNjcmlwdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTZWFsU3RhdHVzQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5SaWdodENvbmRpdGlvbiIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzc2luZyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZUVsZWN0cm9uaWNTZWFsSXNGYXVsdHkiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zaXREaXJlY3Rpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zaXREaXJlY3Rpb25Db2RlZCIgdHlwZT0iVHJhbnNpdERpcmVjdGlvbkNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zaXREaXJlY3Rpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc2l0VGltZVF1YWxpZmllckNvZGVkIiB0eXBlPSJUcmFuc2l0VGltZVF1YWxpZmllckNvZGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zaXRUaW1lUXVhbGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNpdFRpbWUiIHR5cGU9InhzZDpkZWNpbWFsIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc2l0RGlyZWN0aW9uIiB0eXBlPSJUcmFuc2l0RGlyZWN0aW9uIi8+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zaXREaXJlY3Rpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJUb1NlbGxlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyVG9CdXllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvclRvU2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJUb0Ryb3BTaGlwRGVzaWduYXRlZExvY2F0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJUb0ZyZWlnaHRGb3J3YXJkZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlclRvU3ViY29udHJhY3RvciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90aGVyVmVzc2VsVG9MaWdodGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWdodGVyVG9Nb3RoZXJWZXNzZWwiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVHJhbnNpdFRpbWVRdWFsaWZpZXJDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlySG91cnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckRheXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGVuZGFyRGF5cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsZW5kYXJXZWVrcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlSG91cnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtpbmdEYXlzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1RGF5V29ya1dlZWsiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlNoaXBUb1N1YkluZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJTaGlwVG9TdWJJbmZvcm1hdGlvbiIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mU2hpcFRvU3ViSW5mb3JtYXRpb24iIHR5cGU9Ikxpc3RPZlNoaXBUb1N1YkluZm9ybWF0aW9uIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTaGlwVG9TdWJJbmZvcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2hpcFRvU3ViTG9jYXRpb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMb2NhdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2hpcFRvU3ViUXVhbnRpdHkiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdWJMb2NhdGlvbkl0ZW1QYWNrYWdpbmdSZWZlcmVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJdGVtUGFja2FnaW5nUmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlNoaXBUb1N1YkluZm9ybWF0aW9uIiB0eXBlPSJTaGlwVG9TdWJJbmZvcm1hdGlvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSXRlbVBhY2thZ2luZ1JlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGFja2FnZVJlZmVyZW5jZSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSXRlbVBhY2thZ2luZ1JlZmVyZW5jZSIgdHlwZT0iSXRlbVBhY2thZ2luZ1JlZmVyZW5jZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZVJlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlF1YW50aXR5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZUlEUmVmZXJlbmNlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlBhY2thZ2VSZWZlcmVuY2UiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VSZWZlcmVuY2UiIHR5cGU9IlBhY2thZ2VSZWZlcmVuY2UiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlcm1zT2ZEZWxpdmVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGVybXNPZkRlbGl2ZXJ5RnVuY3Rpb25Db2RlZCIgdHlwZT0iVGVybXNPZkRlbGl2ZXJ5RnVuY3Rpb25Db2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUZXJtc09mRGVsaXZlcnlGdW5jdGlvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydFRlcm1zQ29kZWQiIHR5cGU9IlRyYW5zcG9ydFRlcm1zQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0VGVybXNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2hpcG1lbnRNZXRob2RPZlBheW1lbnRDb2RlZCIgdHlwZT0iU2hpcG1lbnRNZXRob2RPZlBheW1lbnRDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwbWVudE1ldGhvZE9mUGF5bWVudENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTG9jYXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRlcm1zT2ZEZWxpdmVyeURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnREZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmlza09mTG9zc0NvZGVkIiB0eXBlPSJSaXNrT2ZMb3NzQ29kZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmlza09mTG9zc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJpc2tPZkxvc3NEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGVybXNPZkRlbGl2ZXJ5IiB0eXBlPSJUZXJtc09mRGVsaXZlcnkiLz4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGVybXNPZkRlbGl2ZXJ5RnVuY3Rpb25Db2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoQ29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZWFuZERlc3BhdGNoQ29uZGl0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0ZWRCeUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb25kaXRpb24iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Q29uZGl0aW9uIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zcG9ydFRlcm1zQ29kZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4LVdvcmtzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlLUNhcnJpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVBbG9uZ3NpZGVTaGlwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlT25Cb2FyZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdEFuZEZyZWlnaHQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3QtSW5zdXJhbmNlQW5kRnJlaWdodCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmlhZ2VQYWlkVG8iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpYWdlLUluc3VyYW5jZVBhaWRUbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkQXRGcm9udGllciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkRXgtU2hpcCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkRXgtUXVheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkRHV0eVVucGFpZCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcmVkRHV0eVBhaWQiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2hpcG1lbnRNZXRob2RPZlBheW1lbnRDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZUNvbGxlY3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VQcmVwYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoT25EZWxpdmVyeVNlcnZpY2VDaGFyZ2VQYWlkQnlDb25zaWduZWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hPbkRlbGl2ZXJ5U2VydmljZUNoYXJnZVBhaWRCeUNvbnNpZ25vciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdEZyZWlnaHRDcmVkaXRlZFRvUGF5bWVudEN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0T25EZWxpdmVyeSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJQaWNrLVVwT3JCYWNraGF1bCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmaW5lZEJ5QnV5ZXJBbmRTZWxsZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvYlBvcnRPZkNhbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbGZQcmVwYWlkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbkNvcHktTm9QYXltZW50RHVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDb3N0c1BhaWRCeUNvbnNpZ25lZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ29zdHNQYWlkQnlDb25zaWdub3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1peGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25SZXZlbnVlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RTcGVjaWZpZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRCeUJ1eWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkQnlTdXBwbGllck9yU2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlhYmxlRWxzZXdoZXJlIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJDb250cmFjdCIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkQW5kU3VtbWFyeUJpbGwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRCdXRDaGFyZ2VkVG9DdXN0b21lciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZEJ5UHJvY2Vzc29yIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkLUJ5U2VsbGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkTG9jYWxDb2xsZWN0T3V0c3RhdGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRPbmx5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Db250YWluZXJGcmVpZ2h0RnJlZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuQ29udGFpbmVyRnJlaWdodFBhaWRCeUN1c3RvbWVyIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Db250YWluZXJGcmVpZ2h0UGFpZEJ5U3VwcGxpZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1bGUxMVNoaXBtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRnJlaWdodC1Ob0NoYXJnZSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVBheSIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0Q29uZGl0aW9uIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlJpc2tPZkxvc3NDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlza09mTG9zc0luVHJhbnNpdFRvRGVzdGluYXRpb25Jc0J1eWVycyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlza09mTG9zc0luVHJhbnNpdFRvRnJlaWdodEVxdWFsaXphdGlvblBvaW50SXNTZWxsZXJzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaXNrT2ZMb3NzSW5UcmFuc2l0VG9Qb29sUG9pbnRJc1NlbGxlcnMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpc2tPZkxvc3NJblRyYW5zaXRUb0Rlc3RpbmF0aW9uSXNTZWxsZXJzIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDYXJnb0NsYXNzaWZpY2F0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik5hdHVyZU9mR29vZHMiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9wZXJhdGlvbmFsVHlwZUNvZGVkIiB0eXBlPSJPcGVyYXRpb25hbFR5cGVDb2RlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcGVyYXRpb25hbFR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUeXBlT2ZDYXJnbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ2FyZ29DbGFzc2lmaWNhdGlvbiIgdHlwZT0iQ2FyZ29DbGFzc2lmaWNhdGlvbiIvPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJPcGVyYXRpb25hbFR5cGVDb2RlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dWYWx1ZU5vbi1EdXRpYWJsZUNvbnNpZ25tZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93VmFsdWVEdXRpYWJsZUNvbnNpZ25tZW50cyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFZhbHVlQ29uc2lnbm1lbnRzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlck5vbi1Db250YWluZXJpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlcyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sbC1PblJvbGwtT2ZmIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXRpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJpemVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVha2J1bGsiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c0NhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQ2FyZ28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZENhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wZXJhdHVyZUNvbnRyb2xsZWRDYXJnbyIvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW52aXJvbm1lbnRhbFBvbGx1dGFudENhcmdvIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3QtSGF6YXJkb3VzQ2FyZ28iLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcGxvbWF0aWMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5Ii8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYm5veGlvdXMiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dE9mR2F1Z2UiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXNlaG9sZEdvb2RzQW5kUGVyc29uYWxFZmZlY3RzIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm96ZW5DYXJnbyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm91bmRUcmlwSW5mb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSW1tdXRhYmxlIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVMaW5rIiB0eXBlPSJ4c2Q6YW55VVJJIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdXBwbGllclNob3BwaW5nQ2FydElEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJSb3VuZFRyaXBPcmRlciIgdHlwZT0ieGNibEJvb2xlYW4iIGZpeGVkPSJ0cnVlIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlJvdW5kVHJpcEluZm9ybWF0aW9uIiB0eXBlPSJSb3VuZFRyaXBJbmZvcm1hdGlvbiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQWNjb3VudEFzc2lnbm1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkFjY291bnRBc3NpZ25tZW50Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZBY2NvdW50QXNzaWdubWVudCIgdHlwZT0iTGlzdE9mQWNjb3VudEFzc2lnbm1lbnQiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjY291bnRBc3NpZ25tZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBY2NvdW50QXNzaWdubWVudElEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGlzdHJpYnV0aW9uUGVyY2VudGFnZSIgdHlwZT0ieHNkOmRlY2ltYWwiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkdMQWNjb3VudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29zdENlbnRlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQWNjb3VudEFzc2lnbm1lbnRPcmRlck51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3BlcmF0aW9uTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTYWxlc09yZGVyUmVmZXJlbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJCdXNpbmVzc0FyZWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRyb2xsaW5nQXJlYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJvZml0Q2VudGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJXb3JrQnJlYWtkb3duU3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOZXR3b3JrIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGaXhlZEFzc2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGaXhlZEFzc2V0U3ViIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGdW5kc0NlbnRlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRnVuZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29tbWl0bWVudEl0ZW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZ1bmN0aW9uYWxBcmVhIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJHZW5lcmljQWNjb3VudGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZOYW1lVmFsdWVTZXQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFjY291bnRBc3NpZ25tZW50IiB0eXBlPSJBY2NvdW50QXNzaWdubWVudCIvPgotICAgIDwhLS0gU09YIGZvcm1hdCBkYXRhdHlwZXMgd2hlcmUgdGhleSBkaWZlciBmcm9tIHN0YW5kYXJkIFhTREwgZGF0YXR5cGVzLS0+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhjYmxEYXRlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV17NH0oKCgwMXwwM3wwNXwwN3wwOHwxMHwxMikoKDBbMS05XSl8KFsxLTJdWzAtOV0pfCgzWzAtMV0pKSl8KCgwNHwwNnwwOXwxMSkoKDBbMS05XSl8KFsxLTJdWzAtOV0pfDMwKSl8KCgwMikoKDBbMS05XSl8KFsxLTJdWzAtOV0pKSkpIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhjYmxUaW1lIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iKCgoWzAtMV1bMC05XSl8KDJbMC0zXSkpKDooWzAtNV1bMC05XSkpezJ9KChcK3wtKSgoWzAtMV1bMC05XSl8KDJbMC0zXSkpOihbMC01XVswLTldKSk/KSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4Y2JsRGF0ZXRpbWUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbMC05XXs0fSgoKDAxfDAzfDA1fDA3fDA4fDEwfDEyKSgoMFsxLTldKXwoWzEtMl1bMC05XSl8KDNbMC0xXSkpKXwoKDA0fDA2fDA5fDExKSgoMFsxLTldKXwoWzEtMl1bMC05XSl8MzApKXwoKDAyKSgoMFsxLTldKXwoWzEtMl1bMC05XSkpKSlUKCgoWzAtMV1bMC05XSl8KDJbMC0zXSkpKDooWzAtNV1bMC05XSkpezJ9KChcK3wtKSgoWzAtMV1bMC05XSl8KDJbMC0zXSkpOihbMC01XVswLTldKSk/KSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4Y2JsQm9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJ0cnVlfGZhbHNlIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhjYmxGbG9hdCI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmZsb2F0Ij4KLSAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iKFwrfC0pP1swLTldKlwuP1swLTldKihFfGUpP1swLTldKiIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4Y2JsRG91YmxlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZG91YmxlIj4KLSAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iKFwrfC0pP1swLTldKlwuP1swLTldKihFfGUpP1swLTldKiIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpL2FubnVpdHluZXRfbmV3LnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9hbm51aXR5bmV0X25ldy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMjk5YjcuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpL2FubnVpdHluZXRfbmV3LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiA/PgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmFubnVpdHluZXQuY29tL25hbWVzcGFjZS9wcm9maWxlcyIKLQotICB4bWxucz0iaHR0cDovL3d3dy5hbm51aXR5bmV0LmNvbS9uYW1lc3BhY2UvcHJvZmlsZXMiCi0gIHhtbG5zOmN2b2U9Imh0dHA6Ly93d3cuY29udGl2by5jb20veG1sbnMvMjAwMi9lbnJpY2htZW50IgotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlR5cGUyIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNPREUiPgotICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6bGVuZ3RoIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJFR0lOX0RBVEUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFTkRfREFURSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRFUk1fREFURSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlR5cGUxIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iRU5WRUxPUEUiPgotICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSEVBREVSIj4KLSAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNFTkRJTkdfUEFSVFlfSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJFQ0VJVklOR19QQVJUWV9JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVFJBTlNBQ1RJT05fQ09VTlQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJURVNUIiBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJIRUFERVIiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRUZGRUNUSVZFX0RBVEUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFTX09GX0RBVEVUSU1FIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQUNUSVZJVFkiPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFERCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNT0RJRlkiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVMRVRFIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVFJBTlNBQ1RJT05fSUQiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBBUlRZX0lEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUUkFOU0FDVElPTl9JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJST1VUSU5HIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNURVAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJFQ0VJVklOR19QQVJUWV9JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU0VORElOR19QQVJUWV9JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT1JERVIiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUk9VVElOR19ISVNUT1JZIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNURVAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJFQ0VJVklOR19QQVJUWV9JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU0VORElOR19QQVJUWV9JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU0VORF9EQVRFVElNRSIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSRUNFSVZFX0RBVEVUSU1FIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OX1RZUEUiPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJVU0lORVNTX1VOSVRfREVGSU5JVElPTiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUkVRVUVTVCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJVU0lORVNTX1VOSVQiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQUNUSVZFIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRFMiIHR5cGU9IlR5cGUxIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOQU1FIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDTEFTUyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVElOIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBQ0NPVU5UX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQUNDT1VOVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDT05UQUNUX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ09OVEFDVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJFU1BPTlNJQklMSVRZIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlVTRVJTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVVNFUiIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSURTIiB0eXBlPSJUeXBlMSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQUNUSVZFIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUSU4iIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVVNFUl9MT0dPTl9JRCIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQQVNTV09SRCIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMQVNUX05BTUUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRklSU1RfTkFNRSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNSURETEVfSU5JVElBTCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNBTFVUQVRJT05fQ0QiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXJzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1zIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc3MiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dHkiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTVUZGSVhfQ0QiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3IiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUkiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUlJIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklWIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1EIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRU1BSUwiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUEhPTkVfTlVNQkVSIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkxJQ0VOU0VTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTElDRU5TRSIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRZUEUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJWEVEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZBUklBQkxFIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEVTIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVYQ0VQVElPTiIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9IlR5cGUyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBUFBPSU5UTUVOVFMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBUFBPSU5UTUVOVCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVFVTIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRU5ESU5HIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFQUE9JTlRFRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJURVJNSU5BVEVEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTkVXX0JVU0lORVNTIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ09NTUlTU0lPTlMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJXUklUSU5HX0NPTVBBTlkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMSU5FU19PRl9CVVNJTkVTUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkxJTkVfT0ZfQlVTSU5FU1MiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTkRJVklEVUFMX0xJRkUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkFSSUFCTEVfQU5OVUlUSUVTIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJWEVEX0FOTlVJVElFUyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUk9VUF9MSUZFIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZBUklBQkxFX0xJRkUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUxMIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFUyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFWENFUFRJT04iIG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJUeXBlMiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlVTRVJfUk9MRVMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJVU0VSX1JPTEUiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEUyIgdHlwZT0iVHlwZTEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkRFU0NSSVBUSU9OIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBQ0NPVU5UUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFDQ09VTlQiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEUyIgdHlwZT0iVHlwZTEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFDQ09VTlRfTkFNRSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPV05FUl9OQU1FIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFCQV9OVU1CRVIiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQUNDT1VOVF9OVU1CRVIiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFVSUE9TRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUkVNSVVNIENPTExFQ1RJT04iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ09NTUlTU0lPTiBSRUNJRVBUUyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDT05UQUNUUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNPTlRBQ1QiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEUyIgdHlwZT0iVHlwZTEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5BTUUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUEhPTkVfTlVNQkVSIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVNQUlMIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUX0FWQUlMQUJJTElUWSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJVU0lORVNTX1VOSVRfTElOS1MiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQlVTSU5FU1NfVU5JVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFWQUlMQUJJTElUWSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQUk9EVUNUUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOS1MiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVYQ0VQVElPTiIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9IlR5cGUyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RTX1BMQU5TIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LUyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUExBTl9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBMQU5fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTVEFURVMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFWENFUFRJT04iIG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJUeXBlMiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVFNfUklERVJTIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOS1MiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJJREVSX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUklERVJfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDT05GSUdVUkFUSU9OX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ09ORklHVVJBVElPTl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVYQ0VQVElPTiIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9IlR5cGUyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPUFRJT05BTElUWSIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJPUFRJT05BTCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVRVUlSRUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU9OQUwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVFNfUExBTlNfUklERVJTIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOS1MiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBMQU5fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQTEFOX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUklERVJfTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSSURFUl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNPTkZJR1VSQVRJT05fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDT05GSUdVUkFUSU9OX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEVTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRVhDRVBUSU9OIiBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTVEFURSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgdHlwZT0iVHlwZTIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9QVElPTkFMSVRZIiBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Ik9QVElPTkFMIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRVFVSVJFRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUFRJT05BTCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVFNfU0VSVklDRV9QUk9HUkFNUyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTktTIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTRVJWSUNFX1BST0dSQU1fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTRVJWSUNFX1BST0dSQU1fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPUFRJT05fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPUFRJT05fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ09ORklHVVJBVElPTl9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNPTkZJR1VSQVRJT05fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTVEFURVMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFWENFUFRJT04iIG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJUeXBlMiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT1BUSU9OQUxJVFkiIG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iT1BUSU9OQUwiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFUVVJUkVEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElPTkFMIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RTX1BMQU5TX1NFUlZJQ0VfUFJPR1JBTVMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LUyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUExBTl9MSU5LUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBMQU5fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTRVJWSUNFX1BST0dSQU1fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTRVJWSUNFX1BST0dSQU1fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPUFRJT05fX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT1BUSU9OX19MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDT05GSUdVUkFUSU9OX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ09ORklHVVJBVElPTl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVYQ0VQVElPTiIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9IlR5cGUyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPUFRJT05BTElUWSIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJPUFRJT05BTCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVRVUlSRUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU9OQUwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RTX0lOVkVTVE1FTlRfT1BUSU9OUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOS1MiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklOVkVTVE1FTlRfT1BUSU9OU19MSU5LUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklOVkVTVE1FTlRfT1BUSU9OU19MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVYQ0VQVElPTiIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9IlR5cGUyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9QRVJBVElOR19QUk9GSUxFUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9QRVJBVElOR19QUk9GSUxFIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRFMiIHR5cGU9IlR5cGUxIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJORVRUSU5HX09QVElPTiIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ09NTUlTU0lPTl9PUFRJT05fTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDT01NSVNTSU9OX09QVElPTl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUUkFOU0FDVElPTl9UWVBFUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OX1RZUEUiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRZUEUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFQUExJQ0FUSU9OIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOSVRJQUxfUFJFTUlVTSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVUJTRVFVRU5UX1BSRU1JVU0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0NIRURVTEVEX0FDSF9QUk9HUkFNIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldJVEhEUkFXQUwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1VSUkVOREVSIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSQU5TRkVSIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQkFMQU5DRSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTWVNURU1BVElDX1dJVEhEUkFXQUxfUFJPR1JBTSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUkRfUFJPR1JBTSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUkQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0NIRURVTEVEX1JFQkFMQU5DRV9QUk9HUkFNIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRDQSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQ0FfUFJPR1JBTSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTWVNURU1BVElDX1dJVEhEUkFXQUxfUFJPR1JBTSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRU5FV0FMIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFOTlVJVElaQVRJT04iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEFZT1VUIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFQVRIX0NMQUlNX1BFTkRJTkciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVBVEhfQ0xBSU0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1lTVEVNQVRJQ19XSVRIRFJBV0FMIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNDSEVEVUxFRF9BQ0giLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNT05FWV9GT1JNUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1PTkVZX0ZPUk0iIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUUkFOU0FDVElPTl9ST1VUSU5HX0xJTksiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBBUkFNRVRFUlMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJBTUVURVIiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5BTUUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5ldyBDaGFyYWN0ZXIgSXRlbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OX1JPVVRJTkdTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVFJBTlNBQ1RJT05fUk9VVElORyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRFMiIHR5cGU9IlR5cGUxIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOQU1FIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJGT1JNQVQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFOU0kiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlNDQyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTk5VSVRZTkVUX1BST0ZJTEVfVjEuMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYTUxJRkUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFhNTElGRSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBBUkFNRVRFUlMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJBTUVURVIiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5BTUUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVVNFUl9UT19CVVNJTkVTU19VTklUX01BUFBJTkdTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVVNFUl9UT19CVVNJTkVTU19VTklUX01BUFBJTkciIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJVU0lORVNTX1VOSVRfTElOSyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVVNFUl9MSU5LIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJVU0VSX1JPTEVfTElOSyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJVU0lORVNTX1VOSVRfUkVMQVRJT05TSElQUyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJVU0lORVNTX1VOSVRfUkVMQVRJT05TSElQIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJFTlRfQlVTSU5FU1NfVU5JVF9MSU5LIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDSElMRF9CVVNJTkVTU19VTklUX0xJTksiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUX09QRVJBVElOR19QUk9GSUxFX0xJTktTIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQlVTSU5FU1NfVU5JVF9MSU5LUyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LUyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT1BFUkFUSU5HX1BST0ZJTEVfTElOS1MiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPUEVSQVRJTkdfUFJPRklMRV9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNDSEVNQV9WRVJTSU9OIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQVJUTkVSX1hNTF9JTlRFUkZBQ0VfVjEuMTAiLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvY3htbC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvY3htbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkODNkMjIuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpL2N4bWwueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLVczQyBTY2hlbWEgZ2VuZXJhdGVkIGJ5IFhNTCBTcHkgdjQuNCBVIChodHRwOi8vd3d3LnhtbHNweS5jb20pLS0+Ci08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCTx4czplbGVtZW50IG5hbWU9IkFjY291bnRpbmciPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6Y2hvaWNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNlZ21lbnQiIHJlZj0iU2VnbWVudCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkFjY291bnRpbmdTZWdtZW50IiByZWY9IkFjY291bnRpbmdTZWdtZW50IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOmNob2ljZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkFjY291bnRpbmdTZWdtZW50Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik5hbWUiIHJlZj0iTmFtZSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiByZWY9IkRlc2NyaXB0aW9uIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkFkZHJlc3MiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iTmFtZSIgcmVmPSJOYW1lIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iUG9zdGFsQWRkcmVzcyIgcmVmPSJQb3N0YWxBZGRyZXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkVtYWlsIiByZWY9IkVtYWlsIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlBob25lIiByZWY9IlBob25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkZheCIgcmVmPSJGYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVVJMIiByZWY9IlVSTCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Imlzb0NvdW50cnlDb2RlIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iYWRkcmVzc0lEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQXJlYU9yQ2l0eUNvZGUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVVJMIiByZWY9IlVSTCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQmlsbFRvIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkFkZHJlc3MiIHJlZj0iQWRkcmVzcyIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQnJvd3NlckZvcm1Qb3N0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlVSTCIgcmVmPSJVUkwiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkJ1eWVyQ29va2llIj4KLQkJPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIi8+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkNJRkNvbnRlbnQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNoYW5nZXRpbWUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNoYXJnZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJNb25leSIgcmVmPSJNb25leSIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ2l0eSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ2xhc3NpZmljYXRpb24iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZG9tYWluIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ29tbWVudHMiPgotCQk8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotCQkJPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50IiByZWY9IkF0dGFjaG1lbnQiLz4KLQkJCTwveHM6Y2hvaWNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ29udGFjdCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJOYW1lIiByZWY9Ik5hbWUiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQb3N0YWxBZGRyZXNzIiByZWY9IlBvc3RhbEFkZHJlc3MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFbWFpbCIgcmVmPSJFbWFpbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlBob25lIiByZWY9IlBob25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRmF4IiByZWY9IkZheCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlVSTCIgcmVmPSJVUkwiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InJvbGUiIHR5cGU9InhzOk5NVE9LRU4iLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ29udHJhY3QiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJJRCIgcmVmPSJTdXBwbGllcklEIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ29tbWVudHMiIHJlZj0iQ29tbWVudHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbVNlZ21lbnQiIHJlZj0iSXRlbVNlZ21lbnQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImVmZmVjdGl2ZURhdGUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJleHBpcmF0aW9uRGF0ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkNvbnRyYWN0SXRlbSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtSUQiIHJlZj0iSXRlbUlEIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVW5pdFByaWNlIiByZWY9IlVuaXRQcmljZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFeHRyaW5zaWMiIHJlZj0iRXh0cmluc2ljIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDb3VudHJ5Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9Imlzb0NvdW50cnlDb2RlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ291bnRyeUNvZGUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaXNvQ291bnRyeUNvZGUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDcmVkZW50aWFsIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IklkZW50aXR5IiByZWY9IklkZW50aXR5Ii8+Ci0JCQkJPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9IlNoYXJlZFNlY3JldCIgcmVmPSJTaGFyZWRTZWNyZXQiLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iRGlnaXRhbFNpZ25hdHVyZSIgcmVmPSJEaWdpdGFsU2lnbmF0dXJlIi8+Ci0JCQkJPC94czpjaG9pY2U+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJkb21haW4iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJtYXJrZXRwbGFjZSIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEZWxpdmVyVG8iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIj4KLQkJPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4KLQkJCTx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2hvcnROYW1lIiByZWY9IlNob3J0TmFtZSIvPgotCQkJPC94czpjaG9pY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImxhbmciIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEaWdpdGFsU2lnbmF0dXJlIj4KLQkJPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJQSzcgc2VsZi1jb250YWluZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmciIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iQmFzZTY0Ii8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkRpc3RyaWJ1dGlvbiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJBY2NvdW50aW5nIiByZWY9IkFjY291bnRpbmciLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDaGFyZ2UiIHJlZj0iQ2hhcmdlIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEb2N1bWVudFJlZmVyZW5jZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icGF5bG9hZElEIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRWZmZWN0aXZlRGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRW1haWwiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkV4cGlyYXRpb25EYXRlIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFeHRlbnNpb24iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkV4dHJpbnNpYyI+Ci0JCTx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGYXgiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6Y2hvaWNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlRlbGVwaG9uZU51bWJlciIgcmVmPSJUZWxlcGhvbmVOdW1iZXIiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVUkwiIHJlZj0iVVJMIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRW1haWwiIHJlZj0iRW1haWwiLz4KLQkJCTwveHM6Y2hvaWNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRm9sbG93dXAiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVVJMIiByZWY9IlVSTCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRm9ybWF0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGcm9tIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNyZWRlbnRpYWwiIHJlZj0iQ3JlZGVudGlhbCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iR2V0UGVuZGluZ1JlcXVlc3QiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iTWVzc2FnZVR5cGUiIHJlZj0iTWVzc2FnZVR5cGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im1heE1lc3NhZ2VzIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibGFzdFJlY2VpdmVkVGltZXN0YW1wIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iR2V0UGVuZGluZ1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNYTUwiIHJlZj0iY1hNTCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSGVhZGVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkZyb20iIHJlZj0iRnJvbSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlRvIiByZWY9IlRvIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2VuZGVyIiByZWY9IlNlbmRlciIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSWRlbnRpdHkiPgotCQk8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYXN0Q2hhbmdlZFRpbWVzdGFtcCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkluZGV4Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVySUQiIHJlZj0iU3VwcGxpZXJJRCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNvbW1lbnRzIiByZWY9IkNvbW1lbnRzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNlYXJjaEdyb3VwIiByZWY9IlNlYXJjaEdyb3VwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSW5kZXhJdGVtIiByZWY9IkluZGV4SXRlbSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSW5kZXhJdGVtIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOmNob2ljZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJbmRleEl0ZW1BZGQiIHJlZj0iSW5kZXhJdGVtQWRkIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSW5kZXhJdGVtRGVsZXRlIiByZWY9IkluZGV4SXRlbURlbGV0ZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkluZGV4SXRlbVB1bmNob3V0IiByZWY9IkluZGV4SXRlbVB1bmNob3V0IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOmNob2ljZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSW5kZXhJdGVtQWRkIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1JRCIgcmVmPSJJdGVtSUQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtRGV0YWlsIiByZWY9Ikl0ZW1EZXRhaWwiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJbmRleEl0ZW1EZXRhaWwiIHJlZj0iSW5kZXhJdGVtRGV0YWlsIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJbmRleEl0ZW1EZWxldGUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbUlEIiByZWY9Ikl0ZW1JRCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSW5kZXhJdGVtRGV0YWlsIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkxlYWRUaW1lIiByZWY9IkxlYWRUaW1lIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRXhwaXJhdGlvbkRhdGUiIHJlZj0iRXhwaXJhdGlvbkRhdGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRWZmZWN0aXZlRGF0ZSIgcmVmPSJFZmZlY3RpdmVEYXRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNlYXJjaEdyb3VwRGF0YSIgcmVmPSJTZWFyY2hHcm91cERhdGEiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJUZXJyaXRvcnlBdmFpbGFibGUiIHJlZj0iVGVycml0b3J5QXZhaWxhYmxlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJbmRleEl0ZW1QdW5jaG91dCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtSUQiIHJlZj0iSXRlbUlEIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iUHVuY2hvdXREZXRhaWwiIHJlZj0iUHVuY2hvdXREZXRhaWwiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkludGVybmFsSUQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZG9tYWluIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSXRlbURldGFpbCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVbml0UHJpY2UiIHJlZj0iVW5pdFByaWNlIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHJlZj0iRGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVbml0T2ZNZWFzdXJlIiByZWY9IlVuaXRPZk1lYXN1cmUiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDbGFzc2lmaWNhdGlvbiIgcmVmPSJDbGFzc2lmaWNhdGlvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik1hbnVmYWN0dXJlclBhcnRJRCIgcmVmPSJNYW51ZmFjdHVyZXJQYXJ0SUQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iTWFudWZhY3R1cmVyTmFtZSIgcmVmPSJNYW51ZmFjdHVyZXJOYW1lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlVSTCIgcmVmPSJVUkwiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRXh0cmluc2ljIiByZWY9IkV4dHJpbnNpYyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSXRlbUlEIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyUGFydElEIiByZWY9IlN1cHBsaWVyUGFydElEIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJQYXJ0QXV4aWxpYXJ5SUQiIHJlZj0iU3VwcGxpZXJQYXJ0QXV4aWxpYXJ5SUQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtSW4iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbUlEIiByZWY9Ikl0ZW1JRCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1EZXRhaWwiIHJlZj0iSXRlbURldGFpbCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVySUQiIHJlZj0iU3VwcGxpZXJJRCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTaGlwVG8iIHJlZj0iU2hpcFRvIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNoaXBwaW5nIiByZWY9IlNoaXBwaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlRheCIgcmVmPSJUYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJxdWFudGl0eSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImxpbmVOdW1iZXIiIHR5cGU9InhzOnN0cmluZyIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtT3V0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1JRCIgcmVmPSJJdGVtSUQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtRGV0YWlsIiByZWY9Ikl0ZW1EZXRhaWwiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJJRCIgcmVmPSJTdXBwbGllcklEIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNoaXBUbyIgcmVmPSJTaGlwVG8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2hpcHBpbmciIHJlZj0iU2hpcHBpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVGF4IiByZWY9IlRheCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJEaXN0cmlidXRpb24iIHJlZj0iRGlzdHJpYnV0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ29udGFjdCIgcmVmPSJDb250YWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ29tbWVudHMiIHJlZj0iQ29tbWVudHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJxdWFudGl0eSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImxpbmVOdW1iZXIiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1aXNpdGlvbklEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWVzdGVkRGVsaXZlcnlEYXRlIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSXRlbVNlZ21lbnQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ29udHJhY3RJdGVtIiByZWY9IkNvbnRyYWN0SXRlbSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ic2VnbWVudEtleSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkxlYWRUaW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNYW51ZmFjdHVyZXJOYW1lIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImxhbmciIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNYW51ZmFjdHVyZXJQYXJ0SUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1lc3NhZ2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3RhdHVzIiByZWY9IlN0YXR1cyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6Y2hvaWNlPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQdW5jaE91dE9yZGVyTWVzc2FnZSIgcmVmPSJQdW5jaE91dE9yZGVyTWVzc2FnZSIvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25DaGFuZ2VNZXNzYWdlIiByZWY9IlN1YnNjcmlwdGlvbkNoYW5nZU1lc3NhZ2UiLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJDaGFuZ2VNZXNzYWdlIiByZWY9IlN1cHBsaWVyQ2hhbmdlTWVzc2FnZSIvPgotCQkJCTwveHM6Y2hvaWNlPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZGVwbG95bWVudE1vZGUiIGRlZmF1bHQ9InByb2R1Y3Rpb24iPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByb2R1Y3Rpb24iLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idGVzdCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpblJlcGx5VG8iIHR5cGU9InhzOnN0cmluZyIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNZXNzYWdlVHlwZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTW9uZXkiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iY3VycmVuY3kiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImFsdGVybmF0ZUFtb3VudCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iYWx0ZXJuYXRlQ3VycmVuY3kiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJOYW1lIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImxhbmciIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJOdW1iZXIiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9wdGlvbiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJhLWR0eXBlIiB0eXBlPSJ4czpOTVRPS0VOUyIgZml4ZWQ9Im5hbWUgc3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9Ik9yZGVyTWV0aG9kIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik9yZGVyVGFyZ2V0IiByZWY9Ik9yZGVyVGFyZ2V0Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iT3JkZXJQcm90b2NvbCIgcmVmPSJPcmRlclByb3RvY29sIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT3JkZXJNZXRob2RzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik9yZGVyTWV0aG9kIiByZWY9Ik9yZGVyTWV0aG9kIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ29udGFjdCIgcmVmPSJDb250YWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT3JkZXJQcm90b2NvbCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT3JkZXJSZXF1ZXN0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik9yZGVyUmVxdWVzdEhlYWRlciIgcmVmPSJPcmRlclJlcXVlc3RIZWFkZXIiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtT3V0IiByZWY9Ikl0ZW1PdXQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9Ik9yZGVyUmVxdWVzdEhlYWRlciI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJUb3RhbCIgcmVmPSJUb3RhbCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNoaXBUbyIgcmVmPSJTaGlwVG8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQmlsbFRvIiByZWY9IkJpbGxUbyIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNoaXBwaW5nIiByZWY9IlNoaXBwaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlRheCIgcmVmPSJUYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iUGF5bWVudCIgcmVmPSJQYXltZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNvbnRhY3QiIHJlZj0iQ29udGFjdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNvbW1lbnRzIiByZWY9IkNvbW1lbnRzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkZvbGxvd3VwIiByZWY9IkZvbGxvd3VwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkRvY3VtZW50UmVmZXJlbmNlIiByZWY9IkRvY3VtZW50UmVmZXJlbmNlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkV4dHJpbnNpYyIgcmVmPSJFeHRyaW5zaWMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im9yZGVySUQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJvcmRlckRhdGUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiBkZWZhdWx0PSJuZXciPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5ldyIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1cGRhdGUiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGVsZXRlIi8+Ci0JCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQkJPC94czpzaW1wbGVUeXBlPgotCQkJPC94czphdHRyaWJ1dGU+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpc2l0aW9uSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzaGlwQ29tcGxldGUiPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InllcyIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPcmRlclRhcmdldCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpjaG9pY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iUGhvbmUiIHJlZj0iUGhvbmUiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFbWFpbCIgcmVmPSJFbWFpbCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkZheCIgcmVmPSJGYXgiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVUkwiIHJlZj0iVVJMIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iT3RoZXJPcmRlclRhcmdldCIgcmVmPSJPdGhlck9yZGVyVGFyZ2V0Ii8+Ci0JCQk8L3hzOmNob2ljZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT3RoZXJPcmRlclRhcmdldCI+Ci0JCTx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQQ2FyZCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQb3N0YWxBZGRyZXNzIiByZWY9IlBvc3RhbEFkZHJlc3MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJudW1iZXIiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJleHBpcmF0aW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlBheW1lbnQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iUENhcmQiIHJlZj0iUENhcmQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlBob25lIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlRlbGVwaG9uZU51bWJlciIgcmVmPSJUZWxlcGhvbmVOdW1iZXIiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQb3N0YWxBZGRyZXNzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkRlbGl2ZXJUbyIgcmVmPSJEZWxpdmVyVG8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdHJlZXQiIHJlZj0iU3RyZWV0IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ2l0eSIgcmVmPSJDaXR5Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3RhdGUiIHJlZj0iU3RhdGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iUG9zdGFsQ29kZSIgcmVmPSJQb3N0YWxDb2RlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNvdW50cnkiIHJlZj0iQ291bnRyeSIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlBvc3RhbENvZGUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlByb2ZpbGVSZXF1ZXN0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlLz4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUHJvZmlsZVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik9wdGlvbiIgcmVmPSJPcHRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJUcmFuc2FjdGlvbiIgcmVmPSJUcmFuc2FjdGlvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZWZmZWN0aXZlRGF0ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImEtZHR5cGUiIHR5cGU9InhzOk5NVE9LRU5TIiBmaXhlZD0iZWZmZWN0aXZlRGF0ZSBkYXRlVGltZSIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQdW5jaE91dE9yZGVyTWVzc2FnZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJCdXllckNvb2tpZSIgcmVmPSJCdXllckNvb2tpZSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlB1bmNoT3V0T3JkZXJNZXNzYWdlSGVhZGVyIiByZWY9IlB1bmNoT3V0T3JkZXJNZXNzYWdlSGVhZGVyIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbUluIiByZWY9Ikl0ZW1JbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUHVuY2hPdXRPcmRlck1lc3NhZ2VIZWFkZXIiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVG90YWwiIHJlZj0iVG90YWwiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTaGlwVG8iIHJlZj0iU2hpcFRvIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNoaXBwaW5nIiByZWY9IlNoaXBwaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlRheCIgcmVmPSJUYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRpb25BbGxvd2VkIiB1c2U9InJlcXVpcmVkIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjcmVhdGUiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaW5zcGVjdCIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJlZGl0Ii8+Ci0JCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQkJPC94czpzaW1wbGVUeXBlPgotCQkJPC94czphdHRyaWJ1dGU+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlB1bmNoT3V0U2V0dXBSZXF1ZXN0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkJ1eWVyQ29va2llIiByZWY9IkJ1eWVyQ29va2llIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRXh0cmluc2ljIiByZWY9IkV4dHJpbnNpYyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkJyb3dzZXJGb3JtUG9zdCIgcmVmPSJCcm93c2VyRm9ybVBvc3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ29udGFjdCIgcmVmPSJDb250YWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJTZXR1cCIgcmVmPSJTdXBwbGllclNldHVwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNoaXBUbyIgcmVmPSJTaGlwVG8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2VsZWN0ZWRJdGVtIiByZWY9IlNlbGVjdGVkSXRlbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtT3V0IiByZWY9Ikl0ZW1PdXQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im9wZXJhdGlvbiIgdXNlPSJyZXF1aXJlZCI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY3JlYXRlIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imluc3BlY3QiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZWRpdCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQdW5jaE91dFNldHVwUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3RhcnRQYWdlIiByZWY9IlN0YXJ0UGFnZSIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUHVuY2hvdXREZXRhaWwiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHJlZj0iRGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVUkwiIHJlZj0iVVJMIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ2xhc3NpZmljYXRpb24iIHJlZj0iQ2xhc3NpZmljYXRpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJNYW51ZmFjdHVyZXJOYW1lIiByZWY9Ik1hbnVmYWN0dXJlck5hbWUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iTWFudWZhY3R1cmVyUGFydElEIiByZWY9Ik1hbnVmYWN0dXJlclBhcnRJRCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFeHBpcmF0aW9uRGF0ZSIgcmVmPSJFeHBpcmF0aW9uRGF0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFZmZlY3RpdmVEYXRlIiByZWY9IkVmZmVjdGl2ZURhdGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2VhcmNoR3JvdXBEYXRhIiByZWY9IlNlYXJjaEdyb3VwRGF0YSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlRlcnJpdG9yeUF2YWlsYWJsZSIgcmVmPSJUZXJyaXRvcnlBdmFpbGFibGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlJlcXVlc3QiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6Y2hvaWNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlByb2ZpbGVSZXF1ZXN0IiByZWY9IlByb2ZpbGVSZXF1ZXN0Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iT3JkZXJSZXF1ZXN0IiByZWY9Ik9yZGVyUmVxdWVzdCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlB1bmNoT3V0U2V0dXBSZXF1ZXN0IiByZWY9IlB1bmNoT3V0U2V0dXBSZXF1ZXN0Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3RhdHVzVXBkYXRlUmVxdWVzdCIgcmVmPSJTdGF0dXNVcGRhdGVSZXF1ZXN0Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iR2V0UGVuZGluZ1JlcXVlc3QiIHJlZj0iR2V0UGVuZGluZ1JlcXVlc3QiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25MaXN0UmVxdWVzdCIgcmVmPSJTdWJzY3JpcHRpb25MaXN0UmVxdWVzdCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbkNvbnRlbnRSZXF1ZXN0IiByZWY9IlN1YnNjcmlwdGlvbkNvbnRlbnRSZXF1ZXN0Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJMaXN0UmVxdWVzdCIgcmVmPSJTdXBwbGllckxpc3RSZXF1ZXN0Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJEYXRhUmVxdWVzdCIgcmVmPSJTdXBwbGllckRhdGFSZXF1ZXN0Ii8+Ci0JCQk8L3hzOmNob2ljZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZGVwbG95bWVudE1vZGUiIGRlZmF1bHQ9InByb2R1Y3Rpb24iPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByb2R1Y3Rpb24iLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idGVzdCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXMiIHJlZj0iU3RhdHVzIi8+Ci0JCQkJPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JCQkJCTx4czpjaG9pY2U+Ci0JCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQcm9maWxlUmVzcG9uc2UiIHJlZj0iUHJvZmlsZVJlc3BvbnNlIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQdW5jaE91dFNldHVwUmVzcG9uc2UiIHJlZj0iUHVuY2hPdXRTZXR1cFJlc3BvbnNlIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJHZXRQZW5kaW5nUmVzcG9uc2UiIHJlZj0iR2V0UGVuZGluZ1Jlc3BvbnNlIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25MaXN0UmVzcG9uc2UiIHJlZj0iU3Vic2NyaXB0aW9uTGlzdFJlc3BvbnNlIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25Db250ZW50UmVzcG9uc2UiIHJlZj0iU3Vic2NyaXB0aW9uQ29udGVudFJlc3BvbnNlIi8+Ci0JCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllckxpc3RSZXNwb25zZSIgcmVmPSJTdXBwbGllckxpc3RSZXNwb25zZSIvPgotCQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJEYXRhUmVzcG9uc2UiIHJlZj0iU3VwcGxpZXJEYXRhUmVzcG9uc2UiLz4KLQkJCQkJPC94czpjaG9pY2U+Ci0JCQkJPC94czpjaG9pY2U+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTZWFyY2hBdHRyaWJ1dGUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU2VhcmNoRGF0YUVsZW1lbnQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlNlYXJjaEdyb3VwIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik5hbWUiIHJlZj0iTmFtZSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlNlYXJjaEF0dHJpYnV0ZSIgcmVmPSJTZWFyY2hBdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlNlYXJjaEdyb3VwRGF0YSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJOYW1lIiByZWY9Ik5hbWUiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTZWFyY2hEYXRhRWxlbWVudCIgcmVmPSJTZWFyY2hEYXRhRWxlbWVudCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU2VnbWVudCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTZWxlY3RlZEl0ZW0iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbUlEIiByZWY9Ikl0ZW1JRCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU2VuZGVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNyZWRlbnRpYWwiIHJlZj0iQ3JlZGVudGlhbCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlVzZXJBZ2VudCIgcmVmPSJVc2VyQWdlbnQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlNoYXJlZFNlY3JldCI+Ci0JCTx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSIvPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTaGlwVG8iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQWRkcmVzcyIgcmVmPSJBZGRyZXNzIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTaGlwcGluZyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJNb25leSIgcmVmPSJNb25leSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiByZWY9IkRlc2NyaXB0aW9uIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0cmFja2luZ0RvbWFpbiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InRyYWNraW5nSWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0cmFja2luZyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlNob3J0TmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3RhcnRQYWdlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlVSTCIgcmVmPSJVUkwiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN0YXRlIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iY29kZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idGV4dCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN0YXR1c1VwZGF0ZVJlcXVlc3QiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRG9jdW1lbnRSZWZlcmVuY2UiIHJlZj0iRG9jdW1lbnRSZWZlcmVuY2UiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXMiIHJlZj0iU3RhdHVzIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdHJlZXQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJbnRlcm5hbElEIiByZWY9IkludGVybmFsSUQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJOYW1lIiByZWY9Ik5hbWUiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDaGFuZ2V0aW1lIiByZWY9IkNoYW5nZXRpbWUiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllcklEIiByZWY9IlN1cHBsaWVySUQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJGb3JtYXQiIHJlZj0iRm9ybWF0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiByZWY9IkRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uQ2hhbmdlTWVzc2FnZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb24iIHJlZj0iU3Vic2NyaXB0aW9uIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB1c2U9InJlcXVpcmVkIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJuZXciLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idXBkYXRlIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlbGV0ZSIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25Db250ZW50Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOmNob2ljZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDSUZDb250ZW50IiByZWY9IkNJRkNvbnRlbnQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJbmRleCIgcmVmPSJJbmRleCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNvbnRyYWN0IiByZWY9IkNvbnRyYWN0Ii8+Ci0JCQk8L3hzOmNob2ljZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZmlsZW5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25Db250ZW50UmVxdWVzdCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJbnRlcm5hbElEIiByZWY9IkludGVybmFsSUQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllcklEIiByZWY9IlN1cHBsaWVySUQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbkNvbnRlbnRSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb24iIHJlZj0iU3Vic2NyaXB0aW9uIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uQ29udGVudCIgcmVmPSJTdWJzY3JpcHRpb25Db250ZW50IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25MaXN0UmVxdWVzdCI+Ci0JCTx4czpjb21wbGV4VHlwZS8+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbkxpc3RSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb24iIHJlZj0iU3Vic2NyaXB0aW9uIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllciI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJOYW1lIiByZWY9Ik5hbWUiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDb21tZW50cyIgcmVmPSJDb21tZW50cyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllcklEIiByZWY9IlN1cHBsaWVySUQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllckxvY2F0aW9uIiByZWY9IlN1cHBsaWVyTG9jYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImNvcnBvcmF0ZVVSTCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InN0b3JlRnJvbnRVUkwiIHR5cGU9InhzOnN0cmluZyIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllckNoYW5nZU1lc3NhZ2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXIiIHJlZj0iU3VwcGxpZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHVzZT0icmVxdWlyZWQiPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5ldyIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1cGRhdGUiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGVsZXRlIi8+Ci0JCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQkJPC94czpzaW1wbGVUeXBlPgotCQkJPC94czphdHRyaWJ1dGU+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyRGF0YVJlcXVlc3QiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJJRCIgcmVmPSJTdXBwbGllcklEIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllckRhdGFSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllciIgcmVmPSJTdXBwbGllciIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJJRCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJkb21haW4iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllckxpc3RSZXF1ZXN0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlLz4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJMaXN0UmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXIiIHJlZj0iU3VwcGxpZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyTG9jYXRpb24iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQWRkcmVzcyIgcmVmPSJBZGRyZXNzIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iT3JkZXJNZXRob2RzIiByZWY9Ik9yZGVyTWV0aG9kcyIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJQYXJ0QXV4aWxpYXJ5SUQiPgotCQk8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiLz4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJQYXJ0SUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyU2V0dXAiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iVVJMIiByZWY9IlVSTCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVGF4Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Ik1vbmV5IiByZWY9Ik1vbmV5Ii8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHJlZj0iRGVzY3JpcHRpb24iLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlRlbGVwaG9uZU51bWJlciI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDb3VudHJ5Q29kZSIgcmVmPSJDb3VudHJ5Q29kZSIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkFyZWFPckNpdHlDb2RlIiByZWY9IkFyZWFPckNpdHlDb2RlIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iTnVtYmVyIiByZWY9Ik51bWJlciIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkV4dGVuc2lvbiIgcmVmPSJFeHRlbnNpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUZXJyaXRvcnlBdmFpbGFibGUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlRvIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkNyZWRlbnRpYWwiIHJlZj0iQ3JlZGVudGlhbCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVG90YWwiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iTW9uZXkiIHJlZj0iTW9uZXkiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlRyYW5zYWN0aW9uIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IlVSTCIgcmVmPSJVUkwiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJPcHRpb24iIHJlZj0iT3B0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1ZXN0TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImEtZHR5cGUiIHR5cGU9InhzOk5NVE9LRU5TIiBmaXhlZD0icmVxdWVzdE5hbWUgTk1UT0tFTiIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVUkwiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlVuaXRPZk1lYXN1cmUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlVuaXRQcmljZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJNb25leSIgcmVmPSJNb25leSIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVXNlckFnZW50IiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjWE1MIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOmNob2ljZT4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9IkhlYWRlciIgcmVmPSJIZWFkZXIiLz4KLQkJCQkJPHhzOmNob2ljZT4KLQkJCQkJCTx4czplbGVtZW50IG5hbWU9Ik1lc3NhZ2UiIHJlZj0iTWVzc2FnZSIvPgotCQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iUmVxdWVzdCIgcmVmPSJSZXF1ZXN0Ii8+Ci0JCQkJCTwveHM6Y2hvaWNlPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2UiIHJlZj0iUmVzcG9uc2UiLz4KLQkJCTwveHM6Y2hvaWNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IjEuMS4wMDkiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icGF5bG9hZElEIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idGltZXN0YW1wIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvb2FnaXNfZmllbGRzLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9vYWdpc19maWVsZHMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmFjMmI2Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9vYWdpc19maWVsZHMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsOTI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tR2VuZXJhdGVkIGJ5IFhNTCBBdXRob3JpdHkuIENvbmZvcm1zIHRvIHczYyBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS0tPgotPHhzOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19maWVsZHMiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19maWVsZHMiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCTx4czphbm5vdGF0aW9uPgotCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQotCQlMaWNlbnNlIGluZm9ybWF0aW9uIGZvciB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgaW4gTElDRU5TRS5UWFQsIGFzIHB1Ymxpc2hlZAotCQlvbiB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgd2ViIHNpdGUuIHd3dy5vcGVuYXBwbGljYXRpb25zLm9yZwotCQkKLQkJRm9yIHN1cHBvcnQsIG1vcmUgaW5mb3JtYXRpb24sIG9yIHRvIHJlcG9ydCBpbXBsZW1lbnRhdGlvbiBidWdzLAotCQlwbGVhc2UgY29udGFjdCB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgYXQgeG1sQG9wZW5hcHBsaWNhdGlvbnMub3JnCi0JCQotCQkkUmV2aXNpb246IDEuMSAkCi0JCSREYXRlOiAyMDAzLzA5LzE1IDE4OjIwOjQyICQKLQkJT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgWE1MCi0JCUNvcHlyaWdodCAxOTk4LTIwMDEsIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLQkJCi0JCSROYW1lOiAgJAotCQkKLQkJYWp3CTcuMgkJMDkvMTQvMjAwMQlGaWVsZHMgdG8gc3VwcG9ydCBFQ2F0YWxvZzogQ0xBU1NGTklELENMQVNTRk4sQ0xBU1NMRVZFTCxDTFNTU0NITVJWLEZUR1JPVVAsCi0JCQkJCQkJCQlGVFZBTElORCxGVFZBTFFVQUwsCVBSSUNFQ09ERSwJUFJJQ0VUWVBFLFNFUU5DRU5VTSxVU0FHRVJFU1ROCi0JCWFqdwk3LjIJCTA5LzE0LzIwMDEJRmllbGRzIHRvIHN1cHBvcnQgQ29uc3VtcHRuOiBDT05TTElORU5VTSxST1VURUxFVkVMMS1ST1VURUxFVkVMOSAgCi0JCW1scgk3LjIgCQkwOS8xNC8yMDAxCUFkZGVkIGZpZWxkcyB0byBzdXBwb3J0IHVwZGF0ZWQgZGVsaXZlcnk6IEFDS01PREUsIERJU0NSUFRZUEUsIFJFQ0VJUFRZUEUuCi0JCWFqdwk3LjIuMQkxMC8zMS8yMDAxCVczQyBTY2hlbWEgUmVsZWFzZSAKLQkJCi0KLQkJU3RydWN0dXJlIE92ZXJ2aWV3Ci0JCQotCQkJVGhpcyBzY2hlbWEgZGVmaW5lcyB0aGUgT0FHSSBGaWVsZCBkYXRhdHlwZXMgdXNlZCB0aHJvdWdob3V0IHRoZSBzcGVjaWZpY2F0aW9uLgotCQkJQmVsb3cgaXMgYW4gb3V0bGluZSBkZXBpY3RpbmcgdGhlaXIgcGxhY2VtZW50IGFuZCB1c2FnZS4KLQkJCQotCQkJQk9EIE5hbWVzcGFjZSAoImh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvbm5uX3ZlcmJfbm91bl9yZWwiKQotCQkJCXwKLQkJCQl8LS0tIFNlZ21lbnRzIE5hbWVzcGFjZSAtIG9hZ2lzX3NlZ21lbnRzLnhzZCAob3M6ICJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX3NlZ21lbnRzIikKLQkJCQl8CXwKLQkJCQl8LS0tCXwtLS0gRmllbGRzIE5hbWVzcGFjZSAtIG9hZ2lzX2ZpZWxkcy54c2QgKG9mOiJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX2ZpZWxkcyIpIAotCQkJCQkKLQkJCQkJCi0JCQkKLQkJPC94czpkb2N1bWVudGF0aW9uPgotCTwveHM6YW5ub3RhdGlvbj4KLQk8eHM6ZWxlbWVudCBuYW1lPSJWRVJCIiB0eXBlPSJWRVJCIi8+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iVkVSQiI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0tOT1dMRURHRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBTExPQ0FURSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBREQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FOQ0VMIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNIQU5HRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDT05GSVJNIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNSRUFURSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJHRVQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iR0VUTElTVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJU1NVRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMSVNUIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxPQUQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUE9TVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9DRVNTIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFQ0VJVkUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVTUE9ORCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTSE9XIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNZTkMiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVFJBTlNGRVIiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVVBEQVRFIi8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9Ik5PVU4iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUNUSVZJVFkiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQk9NIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJPRCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDQVRBTE9HIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNPQSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDT05TVU1QVE4iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ09VTlRJTkZPIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNSRURJVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDVVNUT01FUiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJERUxJVkVSWSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJEU1BUQ0hMSVNUIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVDQVRBTE9HIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVOR0NIR09SRFIiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVhDSE5HUkFURSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJTlNQRUNUSU9OIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklOVkVOQ09VTlQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSU5WRU5UT1JZIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklOVk9JQ0UiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSVNTVUUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSVNTVUVJTkZPIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklURU0iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSVRFTUNMQVNTIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklURU1TUEVDUyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJVEVNWFJFRiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJKT1VSTkFMIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxER1JBQ1RVQUwiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTERHUkJVREdFVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJNQUlOVE9SREVSIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1BVENIRE9DIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1BVENIRkFJTCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJNQVRDSE9LIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1GR1RMQ09ERSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJNSVNDSVRFTSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQQVlBQkxFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBFUlNPTk5FTCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQRVJTT05USU1FIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBJQ0tMSVNUIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBMQU5TQ0hEIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBMSU5WT0lDRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQTyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUklDRUxJU1QiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPREFWQUlMIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBST0RPUkRFUiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9EVUNUUkVRIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBST0pBQ0NUTkciLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPSklORk8iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUVVPVEUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVDRUlWQUJMRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRVFVSVNJVE4iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVTT1VSQ0UiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkZRIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJPVVRJTkciLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0FMRVNPUkRFUiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFTQ0hEIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNISVBNRU5UIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNISVBTQ0hEIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNJVEVMRVZFTCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTVEFUVVMiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU1VQUExJRVIiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVU9NR1JPVVAiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iV0lQQ09ORklSTSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJXSVBNRVJHRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJXSVBNT1ZFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IldJUFJFQ09WRVIiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iV0lQU1BMSVQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iV0lQU1RBVFVTIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IldSS1NDSERVTEUiLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iUkVWSVNJT04iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IkxPR0lDQUxJRCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iQ09ORklSTUFUSU9OIj4KLQkJPHhzOmFubm90YXRpb24+Ci0JCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCTAgLSBObyBDb25maXJtIEJPRCByZXF1ZXN0ZWQsIDEgLSBTZW5kIENvbmZpcm0gQk9EIG9ubHkgb24gZXJyb3IsIDIgLSBTZW5kIENvbmZpcm0gQk9EIGFsd2F5cwkJCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIwIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT0NPTkZJUk0iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT05FUlJPUiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJZRVNDT05GSVJNIi8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IkxBTkdVQUdFIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJDSEFSR0VUWVBFIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJET0NUWVBFIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJET0NVTUVOVElEIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJET0NVTUVOVFJWIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJJVEVNIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJPUklHUkVGIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJQQVJUTlJJRCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iUEFSVE5SVFlQRSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwVG8iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbFRvIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGRUbyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlGcm9tIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0VG8iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllciIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXIiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSlYiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGlzaGVyIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlciIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwRnJvbSIvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJQQVlNRVRIT0QiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IlJFQVNPTkNPREUiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IlNDSExJTkVOVU0iPgotCQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJTVEFUVVNMVkwiPgotCQk8eHM6YW5ub3RhdGlvbj4KLQkJCTx4czpkb2N1bWVudGF0aW9uPjAwIC0gU3VjY2VzcywgOTkgLSBGYWlsdXJlPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnRlZ2VyIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMDAiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iOTkiLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iU1VCTElORU5VTSI+Ci0JCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IlRBWENPREUiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IlRBWEpSU0RDVE4iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IlRFUk1JRCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTk9VTiIgdHlwZT0iTk9VTiIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFVklTSU9OIiB0eXBlPSJSRVZJU0lPTiIvPgotCTwhLS0gQVc6IHN1cHBvcnQgQlNSIFR5cGUgLSBFbmQgLS0+Ci0JPCEtLSBBVzogQmVsb3cgc3VwcG9ydCBTRU5ERVIgVHlwZSAtIFN0YXJ0IC0tPgotCTx4czplbGVtZW50IG5hbWU9IkxPR0lDQUxJRCIgdHlwZT0iTE9HSUNBTElEIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09NUE9ORU5UIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUQVNLIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRUZFUkVOQ0VJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09ORklSTUFUSU9OIiB0eXBlPSJDT05GSVJNQVRJT04iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJMQU5HVUFHRSIgdHlwZT0iTEFOR1VBR0UiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT0RFUEFHRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQVVUSElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIEVuZCAtIFN1cHBvcnQgU0VOREVSIFR5cGUgLS0+Ci0JPCEtLSBTdGFydCAtIFN1cHBvcnQgREFURVRJTUUgVHlwZSAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJZRUFSIiB0eXBlPSJ4czpnWWVhciIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1PTlRIIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iREFZIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSE9VUiIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1JTlVURSIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IlNFQ09ORCIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IlNVQlNFQ09ORCIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IlRJTUVaT05FIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIEVuZCAtIFN1cHBvcnQgREFURVRJTUUgVHlwZSAtLT4KLQk8IS0tIFN0YXJ0IC0gQWxwaGFiZXRpY2FsIGZyb20gaGVyZSBvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBQlNFTkNFVFlQIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0NUUEVSSU9EIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0NUVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQUNDVFlFQVIiIHR5cGU9InhzOmludGVnZXIiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0tDT0RFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0tNT0RFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0tSRVFVRVNUIj4KLQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjAiLz4KLQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjIiLz4KLQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5PQUNLIi8+Ci0JCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPTkNIQU5HRSIvPgotCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iWUVTQUNLIi8+Ci0JCQk8L3hzOnJlc3RyaWN0aW9uPgotCQk8L3hzOnNpbXBsZVR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkFDVElPTkNPREUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkFDVElWRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQUNUVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQUREUkxJTkUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBRERSVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQUxMT1dUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBUFBST1ZBTCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IkFQUFJPVkUiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBUFBST1ZFRCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IkFQUFJPVkVSSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkFVVEhDT0RFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJCQUNLT1JESU5EIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQklMTE9MQURORyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQktUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJCT01BTFRJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQk9NSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkJPTU5BTUUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkJPTVJFVklTT04iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkJPTVNUQVRVUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQk9NVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQk9NVVNBR0UiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkJVREdTVEFUIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQlVER1RYTiIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IkJVREdWRVIiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkJVU05BUkVBIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJCVVlFUklEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDQVJSSUVSIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDQVJSU1JWTFZMIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDQVRBTEdOQU1FIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDQVRBTE9HUlYiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNIQVJHRUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDSEFSR0VUWVBFIiB0eXBlPSJDSEFSR0VUWVBFIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ0hHTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ0lUWSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ0xBU1NGTiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkNMQVNTRk5JRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ0xBU1NMRVZFTCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ0xTU1NDSE1SViIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ0xTRUxNTFZMIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDTFNTRUxNVCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IkNMU1NMTU5USUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNMU1NTQ0hNSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNNUFJTTklEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDTVBSU05UWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDTlRDVFRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTU1FTlRTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT01NT0RJVFkiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT01QTEVWRUwiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTVBSRUZERVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTkRTVEFUVVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTlNMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT05TVU1QVE4iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTlRBSU5SSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTlRDVFRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTlROUlNFQUwiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTlROUlRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNPTlRSQUNUQiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09OVFJBQ1RJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09OVFJBQ1RTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT1NUQ0VOVEVSIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDT1NUVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09VTlRSWSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09VTlRSWURTVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09VTlRSWU9SRyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09VTlRZIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDUkFGVElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDVENIV0NPTlYiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkNUQ0hXRkxBRyIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IkNVUlJFTkNZIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDVVJSRlJPTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ1VSUlRPIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEQVRFVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iREFZT0ZNT05USCIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IkRBWVNOVU0iIHR5cGU9InhzOmludGVnZXIiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJERUZBVUxUIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJERUZMVFZBTFVFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJERUxJVkVSVE8iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkRFTlNJVFlGQUMiIHR5cGU9InhzOmludGVnZXIiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJERVBBUlRNRU5UIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJERVNDUklQVE4iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkRJU0NSUFRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkRJU1BPU0lUTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRElTUE9TSVRPTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRElTVENFTlRFUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRElWSVNJT04iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkRPQ0tJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRE9DVFlQRSIgdHlwZT0iRE9DVFlQRSIvPgotCTx4czplbGVtZW50IG5hbWU9IkRPQ1VNRU5USUQiIHR5cGU9IkRPQ1VNRU5USUQiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJET0NVTUVOVFJWIiB0eXBlPSJET0NVTUVOVFJWIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRFJBV0lORyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRFJDUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRFJPUFNISVAiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkRTUFNUTklOViIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRFVOU05VTUJFUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRUNPQVBQU1RBVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRUNPTkFNRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRUNPUFJJT1JJVFkiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkVDT1JFVklTT04iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkVDT1RZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkVMRU1FTlQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFTUFJTCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRU1QQ0FURUdSWSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRU1QREVQVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRU1QTE9ZRUVJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRU1QTkFNRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRU1QUVVBTElGIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJFTVBTVEFUVVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkVORElURU1JRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRVhDTFVTSVZFIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRVhDUExJTk5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRVhDUFROQ09ERSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRVhQSVJFRkxBRyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRVhQT1JUTElDIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRkFDVE9SIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRkFJTENMQVNTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGQUlMQ09ERSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRkFJTFRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZBSUxVUkVJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRkFYIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRkVBVFVSRUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGRUFUVkFMIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGSUVMRElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGSUVMRFZBTFVFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGSUxFTkFNRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRklMRVRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZJWERRVFlJTkQiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGSVhFREFTU0VUIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGTEVYQktUSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZSRUlHSFRDTFMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZSR0hUQ0xTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGUkdIVElURU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZSR0hUVEVSTVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZSTUlUTUNMU1MiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkZSTUlUTU5NIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGUk1JVE1OTVJWIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGUk1TSVRFTFZMIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRlJPTVBBUlRZIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGVERBVEFUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGVEdST1VQIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGVFZBTElORCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRlRWQUxRVUFMIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJGVU5EIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJHRU9HUkFQSFkiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkdMRU5USVRZRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iR0xFTlRJVFlTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJHTE5PTUFDQ1QiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkhBWlJETUFUTCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSERSU1RBVFVTIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPCEtLQk8eHM6ZWxlbWVudCBuYW1lPSJIT1VSIiB0eXBlPSJ4czppbnRlZ2VyIi8+ICBkZWYnZCBhYm92ZSAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJIUk9SRyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IklNUE9SVExJQyIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IklOQ1BMQU5GTEciIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJTkRMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJTk1SUFBMQU4iIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJTlFVRVVFSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IklOU0xJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCTx4czplbGVtZW50IG5hbWU9IklOU1BET0NSRVYiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IklOU1BFQ1RET0MiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IklOU1BFQ1RSSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IklOVkVORElTUCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSU5WTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSVRFTSIgdHlwZT0iSVRFTSIvPgotCTx4czplbGVtZW50IG5hbWU9IklURU1YIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJVEVNQ0FUSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IklURU1DTEFTUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSVRFTUNMQVNTSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IklURU1ERUZOIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJVEVNREVTQyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSVRFTVJWIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJVEVNUlZYIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJVEVNU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJJVEVNVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSVRFTVZBUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSVRNRlRWQUwiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IklUTUlERkxHIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSkVJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSk9CQ09ERSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iSlBJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iS0FOQkFOIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJMQUJPUklEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJMRURHRVIiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkxJTkUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkxJTkVGRUVEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJMSU5FVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTE9BRFBPSU5UIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJMT0NLIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTE9UTEVWRUwiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJMT1RTTkZMQUciIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1BQ0hDTEFTUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTUFDSElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNQUNISU5FSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1BQ0hTVEFURSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1BQ0hTVURFUCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTUFDSFRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1BSU5UQ0FMSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1BSU5UTE9DSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1BSU5UT1JESUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1BTkRBVE9SWSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1BVENIVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTUNIRE9DSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1DSERPQ1RZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1DSExJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCTx4czplbGVtZW50IG5hbWU9Ik1PUEFSRU5USUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1PUFJJT1JJVFkiIHR5cGU9InhzOmludGVnZXIiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNT1NUQVRVUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTU9UWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNU0RTSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik1TR0lEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNU0dURVhUIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJNU0dUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJOQU1FIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTkVXSVRNUkVWIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJORVdSRVZGTEFHIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJOT1RFUyIgdHlwZT0iTk9URVMiLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iTk9URVMiPgotCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJOVU1PRkRFQyIgdHlwZT0ieHM6aW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9JTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT0xESVRNUkVWIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPTkVUSU1FIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT1BFTklURU0iIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPUEVSQVROQU1FIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPUEVSQVROSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9QRVJBVE5TRVEiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9QRVJBVFRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9QUkFNVEFVVEgiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9QUkdSUE5BTUUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9QUkdSUFRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9QU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPUFRDTFNOQU1FIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPUFRDTFNTSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9QVElPTklEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPUFRJT05OQU1FIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJPUklHUkVGIiB0eXBlPSJPUklHUkVGIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT1RFTElHSUJMRSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9VVFFVRVVFSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9WRVJJRFBSSUMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9Ik9WRVJUSU1FIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT1dOUlNIUENERSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUEFDS0lORyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUEFDS05HREVTQyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUEFSQ05UTlJJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUEFSRU5USUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBBUkVOVExPVCIgdHlwZT0iUEFSRU5UTE9UIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlBBUkVOVExPVCI+Ci0JCTx4czpzaW1wbGVDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6c2ltcGxlQ29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czplbGVtZW50IG5hbWU9IlBBUkVOVFNOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBBUlRJQUxTSFAiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQQVJUTlJJRCIgdHlwZT0iUEFSVE5SSUQiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQQVJUTlJJRFgiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBBUlROUlJBVEciIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBBUlROUlJPTEUiIHR5cGU9InhzOmludGVnZXIiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQQVJUTlJUWVBFIiB0eXBlPSJQQVJUTlJUWVBFIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUEFZTUVUSE9EIiB0eXBlPSJQQVlNRVRIT0QiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQRVJTT05DT0RFIiB0eXBlPSJSRUFTT05DT0RFIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUElDTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUExBTk5FUklEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQTUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT0VOVElUWSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUE9JRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUE9MSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT0xOU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT1JFTEVBU0UiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBPU0lUSU9OIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT1NUQUxDT0RFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQT1NUQVRVUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUE9UWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUkNFU1NDT0RFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUkRMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUkVGRVJFTkNFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUklDRUNPREUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBSSUNFTFNUSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBSSUNFTFNUUlYiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBSSUNFVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJJTlQiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUklOVENOVEwiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBSSU9SSVRZIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk5UQ0xTRUxNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk9EQ1RMSU5FIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk9ET1JERVIiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST0RPUkRJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJPRE9TVEFUUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJPRE9UWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk9EU0VRQkVHIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk9EU0VRRU5EIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk9EU0VRTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQUk9GSVRDVFIiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST0pBQ1RTVFMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST0pBQ1RWVFkiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST0pFQ1QiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST0pSRVNFTCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlBST0pTVEFUVVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST0pUWFRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBST1BFUlRZIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFJPWE1PTlRIIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFNCTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFNDTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFNETElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUFNTVEFUVVMiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlBVQkxJU0hFUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUVNMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJRU0xJTkVTVEFUIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJRU0xJTkVUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJRVEVJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUVRFSURYIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJRVEVMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJRVEVMTlNUQVQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlFURVJFVklTT04iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlFURVNUQVRVUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUVRFVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUVVBTEZOSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlFVQUxGTlRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlFVQUxGTlZBTCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUVVBTElGIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSQVRFVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVBU09OQ09ERSIgdHlwZT0iUkVBU09OQ09ERSIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFQ0VJUFRJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVDRUlQVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVDRVBURElTUCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVDTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVGIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVHSU9OIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRUxJVEVNSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFTExPQ0lEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRUxNQUNISUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFTUlUVEFOQ0UiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFUFJUR0ZMQUciIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFUUxJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFUUxOU1RBVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVRVUVTVEVSIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRVFVSVNUTklEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRVNPUkNFVVNFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIERlcHJlY2F0ZWQgLS0+Ci0JCTx4czplbGVtZW50IG5hbWU9IlJFU09SQ0tJTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTx4czplbGVtZW50IG5hbWU9IlJFU09SQ1VTRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBEZXByZWNhdGVkCS0tPgotCTx4czplbGVtZW50IG5hbWU9IlJFU09SQ0dSUCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkVTT1JDTFZMIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRVNPUkNUWVAiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFU09VUkNFSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJFU1RSSUNUTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLQk8eHM6ZWxlbWVudCBuYW1lPSJSRVZJU0lPTiI+ICAgQWxyZWFkeSBkZWZpbmVkIGFib3ZlIC0tPgotCTx4czplbGVtZW50IG5hbWU9IlJFVklUTVNUQVQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJGUUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRlFJRFgiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJGUUxJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCTx4czplbGVtZW50IG5hbWU9IlJGUUxOU1RBVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkZRTkFNRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkZRUkVWSVNPTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUkZRU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSRlFUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJST1VURUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJST1VURUxFVkVMIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUk9VVEVUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJST1VURVZBUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUk9VVElOR0lEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJST1VUSU5HUkVWIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJST1VUSU5HVkFSIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSUVNMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSU0JMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSU0xJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgotCTx4czplbGVtZW50IG5hbWU9IlJTTElORVRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlJTUExJTk5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUlNQUkVWTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSU1BTQ0hFRElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSU1BTRExOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNBRkVUWUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTQUZFVFlUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTQUZUWUNMQVNTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTQUxFU09SRElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTQUxFU09SRyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlNBTEVTUEVSU04iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNBVkVTRVRVUCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IlNDSERVTEVUWVAiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNDSEVEVUxFSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNDSExJTkVOVU0iIHR5cGU9IlNDSExJTkVOVU0iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTQ1JBUCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IlNFUklBTE5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0VRTkNFTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTSElGVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0hJUE1BVExJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0hJUE5PVEVTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTSElQUEVSSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNISVBQRVJOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNISVBQT0lOVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0hJUFBSSU9SIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0hJUFNSVkxWTCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0hQTVRMREVTQyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0hQVU5JVFNFUSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0hQVU5JVFNUUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0hQVU5JVFRPVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0lHTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU0lURUxFVkVMIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU09MSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTT0xOU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTT1NMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTT1NUQVRVUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU1BFQ0lBTEhORCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU1BMSVRBQkxFIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU1RBR0VQT0lOVCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU1RBVEVQUk9WTiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU1RBVFVTTFZMIiB0eXBlPSJTVEFUVVNMVkwiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTVEVQSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNURVBOVU0iIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNURVBUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTVUJMSU5FTlVNIiB0eXBlPSJTVUJMSU5FTlVNIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iU1VCU0ZMQUciIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJTVUZGSVgiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNVUEVSVklTT1IiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlNZTkNJTkQiIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS0gU2VlIGFib3ZlCi0JPHhzOmVsZW1lbnQgbmFtZT0iVEFTSyIgdHlwZT0iVEFTSyIvPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IlRBU0siPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czptYXhMZW5ndGggdmFsdWU9IjEwIi8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUQVhDT0RFIiB0eXBlPSJUQVhDT0RFIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVEFYRVhFTVBUIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVEFYSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlRBWEpSU0RDVE4iIHR5cGU9IlRBWEpSU0RDVE4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUQVhMSU5FIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVEFYV0hFWE1QVCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IlRFTEVQSE9ORSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpleHRlbnNpb24+Ci0JCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlRFUk1GTEFHIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVEVSTUlEIiB0eXBlPSJURVJNSUQiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUSVRMRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVE9JVE1DTFNTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUT0lUTU5NIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUT0lUTU5NUlYiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlRPT0xDTEFTUyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVE9PTElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUT1BBUlRZIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUT1NJVEVMVkwiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUUkFDS0ZMRyIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCTx4czplbGVtZW50IG5hbWU9IlRSQUNLSU5HSUQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlRSQUtOR0ZMQUciIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUUkFOU01FVEhEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUUkFOU1RFUk1TIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUUk5TRlJUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJUWEFOQUxZU0lTIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVTklUIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVTklUVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVU9NIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVT01HUk9VUElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVT01OVU1ERUMiIHR5cGU9InhzOmludGVnZXIiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVT01WQUxVRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVVBDIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVUENQS0dJTkQiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlVQQ1NDQzE0IiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVUERUV0lQRkciIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVUkkiIHR5cGU9InhzOnN0cmluZyIvPgotCTwhLS14czp1cmlSZWZlcmVuY2UgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVVJMIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVU0FHRVJFU1ROIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVU0VSQVJFQSIgdHlwZT0iVVNFUkFSRUEiLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iVVNFUkFSRUEiIG1peGVkPSJ0cnVlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjYW55IiBwcm9jZXNzQ29udGVudHM9InNraXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czplbGVtZW50IG5hbWU9IlVTRVJJRCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVVNFVVBJVEVNIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJVU1VQSU5WRkciIHR5cGU9InhzOmJvb2xlYW4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJWQUxVRSIgdHlwZT0ieHM6ZGVjaW1hbCIvPgotCTx4czplbGVtZW50IG5hbWU9IlZBTFVFQ0xBU1MiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IlZPVUNIRVIiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IldBR0VHUk9VUCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iV0FHRVRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IldBUkVIT1VTRSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iV0FSUkFOVFkiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IldPUktDRU5URVIiIHR5cGU9InhzOnN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IldPUktPUkRFUiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iV1JLU0NIRElEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJYUkVGVFlQRUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8IS0tIEVuZCAtIFN1cHBvcnRpbmcgRmllbGRzICYgVHlwZXMgLS0+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9vYWdpc19zZWdtZW50cy54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvb2FnaXNfc2VnbWVudHMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWFkYTM3Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9vYWdpc19zZWdtZW50cy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1NjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX3NlZ21lbnRzIiB4bWxucz0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19zZWdtZW50cyIgeG1sbnM6b2Y9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvb2FnaXNfZmllbGRzIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQk8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19maWVsZHMiIHNjaGVtYUxvY2F0aW9uPSJvYWdpc19maWVsZHMueHNkIi8+Ci0JPHhzOmFubm90YXRpb24+Ci0JCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCi0JCUxpY2Vuc2UgaW5mb3JtYXRpb24gZm9yIHRoaXMgZmlsZSBpcyBwcm92aWRlZCBpbiBMSUNFTlNFLlRYVCwgYXMgcHVibGlzaGVkCi0JCW9uIHRoZSBPcGVuIEFwcGxpY2F0aW9ucyBHcm91cCB3ZWIgc2l0ZS4gd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnCi0JCQotCQlGb3Igc3VwcG9ydCwgbW9yZSBpbmZvcm1hdGlvbiwgb3IgdG8gcmVwb3J0IGltcGxlbWVudGF0aW9uIGJ1Z3MsCi0JCXBsZWFzZSBjb250YWN0IHRoZSBPcGVuIEFwcGxpY2F0aW9ucyBHcm91cCBhdCB4bWxAb3BlbmFwcGxpY2F0aW9ucy5vcmcKLQkJCi0JCSRSZXZpc2lvbjogMS4xICQKLQkJJERhdGU6IDIwMDMvMDkvMTUgMTg6MjA6NDIgJAotCQlPcGVuIEFwcGxpY2F0aW9ucyBHcm91cCBYTUwKLQkJQ29weXJpZ2h0IDE5OTgtMjAwMSwgQWxsIFJpZ2h0cyBSZXNlcnZlZAotCQkKLQkJJE5hbWU6ICAkCi0JCQotCQlhancJNy4yLjEJMTAvMzEvMjAwMQlXM0MgU2NoZW1hIFJlbGVhc2UgCi0JCQotCi0JCVN0cnVjdHVyZSBPdmVydmlldwotCQkKLQkJCVRoaXMgc2NoZW1hIGRlZmluZXMgdGhlIE9BR0kgU2VnbWVudCBkYXRhdHlwZXMgdXNlZCB0aHJvdWdob3V0IHRoZSBzcGVjaWZpY2F0aW9uLgotCQkJQmVsb3cgaXMgYW4gb3V0bGluZSBkZXBpY3RpbmcgdGhlaXIgcGxhY2VtZW50IGFuZCB1c2FnZS4KLQkJCQotCQkJQk9EIE5hbWVzcGFjZSAoImh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvbm5uX3ZlcmJfbm91bl9yZWwiKQotCQkJCXwKLQkJCQl8LS0tIFNlZ21lbnRzIE5hbWVzcGFjZSAtIG9hZ2lzX3NlZ21lbnRzLnhzZCAob3M6ICJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX3NlZ21lbnRzIikKLQkJCQl8CXwKLQkJCQl8LS0tCXwtLS0gRmllbGRzIE5hbWVzcGFjZSAtIG9hZ2lzX2ZpZWxkcy54c2QgKG9mOiJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX2ZpZWxkcyIpIAotCQkJCQkKLQkJCQkJCi0JCQkKLQkJPC94czpkb2N1bWVudGF0aW9uPgotCTwveHM6YW5ub3RhdGlvbj4KLQk8eHM6ZWxlbWVudCBuYW1lPSJDTlRST0xBUkVBIiB0eXBlPSJDTlRST0xBUkVBIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkNOVFJPTEFSRUEiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCByZWY9IkJTUiIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJTRU5ERVIiLz4KLQkJCTx4czplbGVtZW50IHJlZj0iREFURVRJTUVBTlkiLz4KLQkJCTwhLS0gRWl0aGVyIERBVEVUSU1FIG9yIERBVEVUSU1FSVNPIC0tPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQlNSIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VkVSQiIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Tk9VTiIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UkVWSVNJT04iLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IlNFTkRFUiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkxPR0lDQUxJRCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q09NUE9ORU5UIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpUQVNLIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpSRUZFUkVOQ0VJRCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q09ORklSTUFUSU9OIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpMQU5HVUFHRSIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q09ERVBBR0UiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkFVVEhJRCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iREFURVRJTUVBTlkiIGFic3RyYWN0PSJ0cnVlIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iREFURVRJTUVJU08iIHR5cGU9IkRBVEVUSU1FSVNPIiBzdWJzdGl0dXRpb25Hcm91cD0iREFURVRJTUVBTlkiLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iREFURVRJTUVJU08iPgotCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6ZGF0ZVRpbWUiPgotCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icXVhbGlmaWVyIiB0eXBlPSJEQVRFVElNRXF1YWwiLz4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8IS0tIERBVEVUSU1FSVNPIC0tPgotCTx4czplbGVtZW50IG5hbWU9IkRBVEVUSU1FIiB0eXBlPSJEQVRFVElNRSIgc3Vic3RpdHV0aW9uR3JvdXA9IkRBVEVUSU1FQU5ZIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkRBVEVUSU1FIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpZRUFSIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOk1PTlRIIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRBWSIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpIT1VSIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOk1JTlVURSIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpTRUNPTkQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6U1VCU0VDT05EIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlRJTUVaT05FIi8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0icXVhbGlmaWVyIiB0eXBlPSJEQVRFVElNRXF1YWwiIHVzZT0icmVxdWlyZWQiLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJEQVRFVElNRXR5cGUiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUNDT1VOVElORyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ1RFTkQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUNUU1RBUlQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQVBQUkVRIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFQUFJPVkFMIi8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9IkRBVEVUSU1FcXVhbCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0NPVU5USU5HIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFDVEVORCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ1RTVEFSVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBUFBSRVEiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQVBQUk9WQUwiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQVZBSUxBQkxFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJLVEVORCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCS1RTVEFSVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDQU5DRUwiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBTkdFREFURSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDT01QREFURSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDT05TVU1FIi8+CQkJCi0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNSRUFUSU9OIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNVTVVMQVRJVkUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iREVMSVZBQ1QiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iREVMSVZTQ0hFRCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJESVNDTlQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRE9DVU1FTlQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRFVFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVBUkxTVEVGRiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFQVJMU1RTSElQIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVGRkVDVElWRSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFTkdDSEciLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVhFQ0ZJTklTSCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFWEVDU1RBUlQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVhQSVJBVElPTiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGQUlMREFURSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGT1JFQ0FTVEYiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRk9SRUNBU1RTIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZST00iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iR0VORVJBVElPTiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJKT0JEVUUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSU1QTCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJTlZPSUNFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxBQk9SRklOU0giLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTEFCT1JTVEFSVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMQVNUVVNFRCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMT0FESU5HIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1BVENISU5HIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1TTUVOVERBVEUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTkVFRERFTFYiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1BGSU5JU0giLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1BTVEFSVCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQQVlFTkQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUExBTkVORCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQTEFOU1RBUlQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUE8iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPTURFTFYiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPTVNISVAiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFlNVFRFUk0iLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVDRUlWRUQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVQT1JUREFURSIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRVBPUlROR0ZOIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFUE9SVE5HU1QiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVRVUlSRUQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVTT1JDRFdORiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRVNPUkNEV05TIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJTUEREQVRFIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJTUERPQ0dFTiIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTQ0hFTkQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0NIU1RBUlQiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0VUVVBGSU5TSCIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTRVRVUFNUQVJUIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNISVAiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0hJUFNDSEVEIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNUQVRVU0RBVEUiLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVEVBUkRPV05GIi8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRFQVJET1dOUyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUTyIvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPVEhFUiIvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8IS0tIERBVEVUSU1FIC0tPgotCTx4czplbGVtZW50IG5hbWU9IkFERFJFU1MiIHR5cGU9IkFERFJFU1MiLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iQUREUkVTUyI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6QUREUkxJTkUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6QUREUlRZUEUiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDSVRZIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q09VTlRSWSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNPVU5UWSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkZBWCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQT1NUQUxDT0RFIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UkVHSU9OIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6U1RBVEVQUk9WTiIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlRBWEpSU0RDVE4iIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpURUxFUEhPTkUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVJMIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHVybmRhdGEiIHR5cGU9InhzOnN0cmluZyIvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iQ09OVEFDVCIgdHlwZT0iQ09OVEFDVCIvPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJDT05UQUNUIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOQU1FIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNPTlRDVFRZUEUiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpFTUFJTCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkZBWCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOQU1FIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlRFTEVQSE9ORSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0icmV0dXJuZGF0YSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBTU9VTlQiIHR5cGU9IkFNT1VOVCIvPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJBTU9VTlQiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlZBTFVFIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5VTU9GREVDIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlNJR04iLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q1VSUkVOQ1kiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6RFJDUiIvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InF1YWxpZmllciIgdXNlPSJyZXF1aXJlZCI+Ci0JCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUNUVUFMIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQVBQUlZPUkQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBVkFJTEFCTEUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCVURHRVQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDT01NSVNTSU9OIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iREVDTEFSRVZBTCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRTQ1BSQ05UIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRFNDVkFMVUUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJESVNDTlQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJET0NVTUVOVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVTVEVOR0lNUCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVTVEZSRUlHSFQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFU1RIUlMiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFU1RJTUFURSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVTVE1BTklNUCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVTVFVDT1NUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVhURU5ERUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGUkVJR0hUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSVRFTSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9QRU5JVEVNIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1JERVIiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPUkRMSU1JVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBBWVJBVEUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSQVRFIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJDQlJLIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVEFYIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVEFYQkFTRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRPVEFMIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVE9UTElNSVQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPVEhFUiIvPgotCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCTwveHM6YXR0cmlidXRlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiPgotCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVEFYIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1RIRVIiLz4KLQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJPC94czpzaW1wbGVUeXBlPgotCQk8L3hzOmF0dHJpYnV0ZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8IS0tIEFNT1VOVCAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJBVFRDSFJFRiIgdHlwZT0iQVRUQ0hSRUYiLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iQVRUQ0hSRUYiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCByZWY9IkRBVEVUSU1FIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0iUVVBTlRJVFkiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDTVBSU05UWVBFIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q01QUlNOSUQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpGSUxFVFlQRSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5PVEVTIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlRJVExFIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTwhLS0gPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+IC0tPgotCQkJPHhzOmNob2ljZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkZJTEVOQU1FIi8+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVSSSIvPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkZJTEVOQU1FIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpjaG9pY2U+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm5kYXRhIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czplbGVtZW50IG5hbWU9IkNIQVJHRSIgdHlwZT0iQ0hBUkdFIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkNIQVJHRSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IHJlZj0iT1BFUkFNVCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNIQVJHRUlEIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q0hBUkdFVFlQRSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNIR0xJTkVOVU0iIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9IkRJU1RSSUJVVE4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm5kYXRhIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czplbGVtZW50IG5hbWU9IkRJU1RSSUJVVE4iIHR5cGU9IkRJU1RSSUJVVE4iLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iRElTVFJJQlVUTiI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IHJlZj0iT1BFUkFNVCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkJVU05BUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q09TVENFTlRFUiIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFUEFSVE1FTlQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpESVZJU0lPTiIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkVMRU1FTlQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6RlVORCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkdFT0dSQVBIWSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkdMRU5USVRZUyIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkdMTk9NQUNDVCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBST0ZJVENUUiIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBST0pFQ1QiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVTklUIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6V0FSRUhPVVNFIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHVybmRhdGEiIHR5cGU9InhzOnN0cmluZyIvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iT1BFUkFNVCIgdHlwZT0iT1BFUkFNVCIvPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJPUEVSQU1UIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpWQUxVRSIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOVU1PRkRFQyIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpTSUdOIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNVUlJFTkNZIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVPTVZBTFVFIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVPTU5VTURFQyIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVT00iLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJxdWFsaWZpZXIiIHVzZT0icmVxdWlyZWQiPgotCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNPU1QiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFWFRFTkRFRCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZSRUlHSFQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTklUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1RIRVIiLz4KLQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJPC94czpzaW1wbGVUeXBlPgotCQk8L3hzOmF0dHJpYnV0ZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB1c2U9InJlcXVpcmVkIj4KLQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRiIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9USEVSIi8+Ci0JCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJPC94czphdHRyaWJ1dGU+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJQQVJUTkVSIiB0eXBlPSJQQVJUTkVSIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlBBUlRORVIiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5BTUUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6T05FVElNRSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBBUlROUklEIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UEFSVE5SVFlQRSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlNZTkNJTkQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpBQ1RJVkUiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDVVJSRU5DWSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRVTlNOVU1CRVIiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpHTEVOVElUWVMiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQQVJFTlRJRCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBBUlROUklEWCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBBUlROUlJBVEciIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQQVJUTlJST0xFIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UEFZTUVUSE9EIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VEFYRVhFTVBUIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VEFYSUQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpURVJNSUQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9IkFERFJFU1MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0iQ09OVEFDVCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHVybmRhdGEiIHR5cGU9InhzOnN0cmluZyIvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iVEVNUFJBVFVSRSIgdHlwZT0iVEVNUEVSQVRVUkUiLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iVEVNUEVSQVRVUkUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlZBTFVFIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5VTU9GREVDIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlNJR04iLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJxdWFsaWZpZXIiIHVzZT0icmVxdWlyZWQiPgotCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFDVFVBTCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRFTElWRVJZIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTE9BRElORyIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9USEVSIi8+Ci0JCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJPC94czphdHRyaWJ1dGU+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdXNlPSJyZXF1aXJlZCI+Ci0JCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VMU0lVUyIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZBSFJFTkhFSVQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJLRUxWSU4iLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPVEhFUiIvPgotCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCTwveHM6YXR0cmlidXRlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUVVBTlRJVFkiIHR5cGU9IlFVQU5USVRZIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlFVQU5USVRZIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpWQUxVRSIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOVU1PRkRFQyIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpTSUdOIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVPTSIvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InF1YWxpZmllciIgdXNlPSJyZXF1aXJlZCI+Ci0JCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUNDRVBURUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ1REVVIiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ1RIUlMiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBTExPQ0FURUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBTExPV0VEV1QiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBVkFJTEFCTEUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBVkdSVU5TSVpFIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQkFDS09SREVSRCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJBVENIU0laRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJBVENIVElNRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJMT0NLRUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCUkVBS1RJTUUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDQVBQRVJDRU5UIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FUQ0hXRUdIVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNPTU1JU1NJT04iLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDT01QTEVURUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDVU1VTEFUSVZFIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iREVMSVZFUkVEIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRFVSQVRJT04iLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJEVVJPVkVSIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRFVSVU5ERVIiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFTVBMT1lFRVMiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFTVBSRVFEIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVNURFVSIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVNUSFJTIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVNUV0VJR0hUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRklMRU5BTUUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGSUxFU0laRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZJWEVEVElNRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkhFSUdIVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklOU1BFQ1RFRCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklOU1BFQ1RJT04iLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJVEVNIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTERUTU9GRlNFVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxFTkdUSCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxBQk9SIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTE9BRElOR1dUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTE9UU0laRU1BWCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxPVFNJWkVNSU4iLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMT1RTSVpFTUxUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTE9XRVJMSU1JVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1BQ0hJTkVIUlMiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJNQVhJTVVNIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTUFYUEFSTFRNIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTUlOSU1VTSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1PVkVUSU1FIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTVNNRU5UIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTVVMVElQTElFUiIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5FVFdFSUdIVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9QRU4iLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPUkRFUkVEIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1RIRVJSRUoiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPVkVSU0hJUCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBBQ0tJTkciLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQRVJDRU5UIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUEVSQ0VOVFJFUSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBFUlNIQk5PUFIiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQRVJTSFdJT1BSIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUExORFBSQ1QiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUkNCUksiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUklPUiIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlFVRVVFVElNRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJBVEUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRUNFSVZFRCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFSkVDVEVEIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVKRklYRUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRUpQRVJDRU5UIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVNRFVSIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVNSFJTIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVRVUlSRUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRVRVUk5FRCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFV09SSyIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJVTlRJTUUiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTQ1JBUCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNFVFVQVElNRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNIRUxGTElGRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNISVBQRUQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTSElQVU5JVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNUQVJUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVEVBUkRPV04iLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUT09MUkVRRCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRPVFdFSUdIVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRSQU5TRlJMT1QiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTkRFUlNISVAiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTklUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVVBQRVJMSU1JVCIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlZPTFVNRSIvPgotCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IldBSVRUSU1FIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iV0VJR0hUIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iV0lEVEgiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPVEhFUiIvPgotCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCTwveHM6YXR0cmlidXRlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPCEtLSBRVUFOVElUWSAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJET0NVTU5UUkVGIiB0eXBlPSJET0NVTU5UUkVGIi8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkRPQ1VNTlRSRUYiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRPQ1RZUEUiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6RE9DVU1FTlRJRCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQQVJUTlJJRCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQQVJUTlJUWVBFIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRPQ1VNRU5UUlYiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpMSU5FTlVNIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Tk9URVMiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpTQ0hMSU5FTlVNIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6U1VCTElORU5VTSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czplbGVtZW50IG5hbWU9IkRPQ1VNRU5UIiB0eXBlPSJET0NVTUVOVCIvPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJET0NVTUVOVCI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6RE9DVU1FTlRJRCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRPQ1VNRU5UUlYiIG1pbk9jY3Vycz0iMCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpET0NUWVBFIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHVybmRhdGEiIHR5cGU9InhzOnN0cmluZyIvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iTE9UU0VSSUFMIiB0eXBlPSJMT1RTRVJJQUwiLz4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iTE9UU0VSSUFMIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJRVUFOVElUWSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8IS0tKCVRVUFOVElUWS5JVEVNOyk/IC0tPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpMT1RMRVZFTCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQQVJFTlRMT1QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UEFSRU5UU05VTSIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8eHM6ZWxlbWVudCByZWY9Im9mOlNFUklBTE5VTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0icmV0dXJuZGF0YSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JPC94czpjb21wbGV4VHlwZT4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zdG9yZS9Db25zb2xpZGF0ZVRlc3QueG1sIGIvdjEvdGVzdC9jYXNlcy9zdG9yZS9Db25zb2xpZGF0ZVRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjEwODZhLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc3RvcmUvQ29uc29saWRhdGVUZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTxlbXBsb3llZXM+Ci0gIDxlbXBsb3llZT4KLSAgICA8bmFtZT5GcmVkIEpvbmVzPC9uYW1lPgotICAgIDxhZGRyZXNzIGxvY2F0aW9uPSJob21lIj4KLSAgICAgIDxzdHJlZXQ+OTAwIEF1cm9yYSBBdmUuPC9zdHJlZXQ+Ci0gICAgICA8Y2l0eT5TZWF0dGxlPC9jaXR5PgotICAgICAgPHN0YXRlPldBPC9zdGF0ZT4KLSAgICAgIDx6aXA+OTgxMDk8L3ppcD4KLSAgICA8L2FkZHJlc3M+Ci0gICAgPGFkZHJlc3MgbG9jYXRpb249IndvcmsiPgotICAgICAgPHN0cmVldD4yMDExIDE1Mm5kIEF2ZW51ZSBORTwvc3RyZWV0PgotICAgICAgPGNpdHk+UmVkbW9uZDwvY2l0eT4KLSAgICAgIDxzdGF0ZT5XQTwvc3RhdGU+Ci0gICAgICA8emlwPjk4MDUyPC96aXA+Ci0gICAgPC9hZGRyZXNzPgotICAgIDxwaG9uZSBsb2NhdGlvbj0id29yayI+KDQyNSk2NDEtOTM4NTwvcGhvbmU+Ci0gICAgPHBob25lIGxvY2F0aW9uPSJob21lIj4oMjA2KTQ0MS0xNjk1PC9waG9uZT4KLSAgICA8cGhvbmUgbG9jYXRpb249Im1vYmlsZSI+KDIwNik3MTQtMjUxNTwvcGhvbmU+Ci0gIDwvZW1wbG95ZWU+Ci0gIDxlbXBsb3llZT4KLSAgICA8bmFtZT5TYWxseSBTbWl0aDwvbmFtZT4KLSAgICA8YWRkcmVzcyBsb2NhdGlvbj0iaG9tZSI+Ci0gICAgICA8c3RyZWV0PjE0MzAgT2FrIFBsYWNlPC9zdHJlZXQ+Ci0gICAgICA8Y2l0eT5TYWxlbTwvY2l0eT4KLSAgICAgIDxzdGF0ZT5PUjwvc3RhdGU+Ci0gICAgICA8emlwPjk3MTI1PC96aXA+Ci0gICAgPC9hZGRyZXNzPgotICAgIDxhZGRyZXNzIGxvY2F0aW9uPSJ3b3JrIj4KLSAgICAgIDxzdHJlZXQ+NzY1IE1haW4gU3QuPC9zdHJlZXQ+Ci0gICAgICA8Y2l0eT5LYWlzZXI8L2NpdHk+Ci0gICAgICA8c3RhdGU+T1I8L3N0YXRlPgotICAgICAgPHppcD45NzEwMzwvemlwPgotICAgIDwvYWRkcmVzcz4KLSAgICA8cGhvbmUgbG9jYXRpb249IndvcmsiPig1MDMpMjY0LTM4NTY8L3Bob25lPgotICAgIDxwaG9uZSBsb2NhdGlvbj0iaG9tZSI+KDUwMyk0MTYtNjk1MTwvcGhvbmU+Ci0gICAgPHBob25lIGxvY2F0aW9uPSJtb2JpbGUiPig1MDMpMjE0LTUxNTI8L3Bob25lPgotICA8L2VtcGxveWVlPgotPC9lbXBsb3llZXM+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3N0b3JlL2Vhc3lwbzEueG1sIGIvdjEvdGVzdC9jYXNlcy9zdG9yZS9lYXN5cG8xLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhkODc3ZS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3N0b3JlL2Vhc3lwbzEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPHBvOnB1cmNoYXNlLW9yZGVyIHhtbG5zOnBvPSJodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvIj4KLSAgPHBvOmN1c3RvbWVyPgotICAgIDxwbzpuYW1lPkRhdmlkIEJhdTwvcG86bmFtZT4KLSAgICA8cG86YWRkcmVzcz5HbGFkd3luZSwgUEE8L3BvOmFkZHJlc3M+Ci0gIDwvcG86Y3VzdG9tZXI+Ci0gIDxwbzpkYXRlPjIwMDItMDktMzBUMTQ6MTY6MDAtMDU6MDA8L3BvOmRhdGU+Ci0gIDxwbzpsaW5lLWl0ZW0+Ci0gICAgPHBvOmRlc2NyaXB0aW9uPkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAxPC9wbzpkZXNjcmlwdGlvbj4KLSAgICA8cG86cGVyLXVuaXQtb3VuY2VzPjU8L3BvOnBlci11bml0LW91bmNlcz4KLSAgICA8cG86cHJpY2U+MjEuNzk8L3BvOnByaWNlPgotICAgIDxwbzpxdWFudGl0eT4yPC9wbzpxdWFudGl0eT4KLSAgPC9wbzpsaW5lLWl0ZW0+Ci0gIDxwbzpsaW5lLWl0ZW0+Ci0gICAgPHBvOmRlc2NyaXB0aW9uPkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAyPC9wbzpkZXNjcmlwdGlvbj4KLSAgICA8cG86cGVyLXVuaXQtb3VuY2VzPjU8L3BvOnBlci11bml0LW91bmNlcz4KLSAgICA8cG86cHJpY2U+MTkuODk8L3BvOnByaWNlPgotICAgIDxwbzpxdWFudGl0eT4yPC9wbzpxdWFudGl0eT4KLSAgPC9wbzpsaW5lLWl0ZW0+Ci0gIDxwbzpsaW5lLWl0ZW0+Ci0gICAgPHBvOmRlc2NyaXB0aW9uPkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAzPC9wbzpkZXNjcmlwdGlvbj4KLSAgICA8cG86cGVyLXVuaXQtb3VuY2VzPjU8L3BvOnBlci11bml0LW91bmNlcz4KLSAgICA8cG86cHJpY2U+MTkuODk8L3BvOnByaWNlPgotICAgIDxwbzpxdWFudGl0eT4xPC9wbzpxdWFudGl0eT4KLSAgPC9wbzpsaW5lLWl0ZW0+Ci0gIDxwbzpzaGlwcGVyPgotICAgIDxwbzpuYW1lPlVQUzwvcG86bmFtZT4KLSAgICA8cG86cGVyLW91bmNlLXJhdGU+MC43NDwvcG86cGVyLW91bmNlLXJhdGU+Ci0gIDwvcG86c2hpcHBlcj4KLTwvcG86cHVyY2hhc2Utb3JkZXI+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3N0b3JlL2VyaWN0ZXN0LnhtbCBiL3YxL3Rlc3QvY2FzZXMvc3RvcmUvZXJpY3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjk5M2JkLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc3RvcmUvZXJpY3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPGJhcj48Zm9vPjE8L2Zvbz48Zm9vPjI8L2Zvbz48L2Jhcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3N0b3JlL3Blb3BsZS54bWwgYi92MS90ZXN0L2Nhc2VzL3N0b3JlL3Blb3BsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZDEwNDQuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9jYXNlcy9zdG9yZS9wZW9wbGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLTxwZW9wbGUgeD0iIj4KLQotICA8cGVyc29uPgotICAgIDxuYW1lPgotICAgICAgPGZpcnN0PkVyaWM8L2ZpcnN0PgotICAgICAgPGxhc3Q+VmFzaWxpazwvbGFzdD4KLSAgICA8L25hbWU+Ci0gICAgPGFnZT4zNzwvYWdlPgotICA8L3BlcnNvbj4KLQotICA8cGVyc29uPgotICAgIDxuYW1lPgotICAgICAgPGZpcnN0PlN5bHZpYTwvZmlyc3Q+Ci0gICAgICA8bGFzdD5WYXNpbGlrPC9sYXN0PgotICAgIDwvbmFtZT4KLSAgICA8YWdlPjM0PC9hZ2U+Ci0gIDwvcGVyc29uPgotCi0gIDxwZXJzb24+Ci0gICAgPG5hbWU+Ci0gICAgICA8Zmlyc3Q+Um9kPC9maXJzdD4KLSAgICAgIDxsYXN0PkNoYXZlejwvbGFzdD4KLSAgICA8L25hbWU+Ci0gICAgPGFnZT4zOTwvYWdlPgotICA8L3BlcnNvbj4KLQotICA8cGVyc29uPgotICAgIDxuYW1lPgotICAgICAgPGZpcnN0PlRlcnJ5PC9maXJzdD4KLSAgICAgIDxsYXN0Pkx1Y2FzPC9sYXN0PgotICAgIDwvbmFtZT4KLSAgICA8YWdlPjQyPC9hZ2U+Ci0gIDwvcGVyc29uPgotCi0gIDxwZXJzb24+Ci0gICAgPG5hbWU+Ci0gICAgICA8Zmlyc3Q+RGF2aWQ8L2ZpcnN0PgotICAgICAgPGxhc3Q+QmF1PC9sYXN0PgotICAgIDwvbmFtZT4KLSAgICA8YWdlPjMxPC9hZ2U+Ci0gIDwvcGVyc29uPgotCi0gIDxwZXJzb24+Ci0gICAgPG5hbWU+Ci0gICAgICA8Zmlyc3Q+RXJpYzwvZmlyc3Q+Ci0gICAgICA8bGFzdD5WYXNpbGlrPC9sYXN0PgotICAgIDwvbmFtZT4KLSAgICA8YWdlPjM3PC9hZ2U+Ci0gIDwvcGVyc29uPgotCi0gIDxwZXJzb24+Ci0gICAgPG5hbWU+Ci0gICAgICA8Zmlyc3Q+U3lsdmlhPC9maXJzdD4KLSAgICAgIDxsYXN0PlZhc2lsaWs8L2xhc3Q+Ci0gICAgPC9uYW1lPgotICAgIDxhZ2U+MzQ8L2FnZT4KLSAgPC9wZXJzb24+Ci0KLSAgPHBlcnNvbj4KLSAgICA8bmFtZT4KLSAgICAgIDxmaXJzdD5Sb2Q8L2ZpcnN0PgotICAgICAgPGxhc3Q+Q2hhdmV6PC9sYXN0PgotICAgIDwvbmFtZT4KLSAgICA8YWdlPjM5PC9hZ2U+Ci0gIDwvcGVyc29uPgotCi0gIDxwZXJzb24+Ci0gICAgPG5hbWU+Ci0gICAgICA8Zmlyc3Q+VGVycnk8L2ZpcnN0PgotICAgICAgPGxhc3Q+THVjYXM8L2xhc3Q+Ci0gICAgPC9uYW1lPgotICAgIDxhZ2U+NDI8L2FnZT4KLSAgPC9wZXJzb24+Ci0KLSAgPHBlcnNvbj4KLSAgICA8bmFtZT4KLSAgICAgIDxmaXJzdD5EYXZpZDwvZmlyc3Q+Ci0gICAgICA8bGFzdD5CYXU8L2xhc3Q+Ci0gICAgPC9uYW1lPgotICAgIDxhZ2U+MzE8L2FnZT4KLSAgPC9wZXJzb24+Ci0KLSAgPHBlcnNvbj4KLSAgICA8bmFtZT4KLSAgICAgIDxmaXJzdD5FcmljPC9maXJzdD4KLSAgICAgIDxsYXN0PlZhc2lsaWs8L2xhc3Q+Ci0gICAgPC9uYW1lPgotICAgIDxhZ2U+Mzc8L2FnZT4KLSAgPC9wZXJzb24+Ci0KLSAgPHBlcnNvbj4KLSAgICA8bmFtZT4KLSAgICAgIDxmaXJzdD5TeWx2aWE8L2ZpcnN0PgotICAgICAgPGxhc3Q+VmFzaWxpazwvbGFzdD4KLSAgICA8L25hbWU+Ci0gICAgPGFnZT4zNDwvYWdlPgotICA8L3BlcnNvbj4KLQotICA8cGVyc29uPgotICAgIDxuYW1lPgotICAgICAgPGZpcnN0PlJvZDwvZmlyc3Q+Ci0gICAgICA8bGFzdD5DaGF2ZXo8L2xhc3Q+Ci0gICAgPC9uYW1lPgotICAgIDxhZ2U+Mzk8L2FnZT4KLSAgPC9wZXJzb24+Ci0KLSAgPHBlcnNvbj4KLSAgICA8bmFtZT4KLSAgICAgIDxmaXJzdD5UZXJyeTwvZmlyc3Q+Ci0gICAgICA8bGFzdD5MdWNhczwvbGFzdD4KLSAgICA8L25hbWU+Ci0gICAgPGFnZT40MjwvYWdlPgotICA8L3BlcnNvbj4KLQotICA8cGVyc29uPgotICAgIDxuYW1lPgotICAgICAgPGZpcnN0PkRhdmlkPC9maXJzdD4KLSAgICAgIDxsYXN0PkJhdTwvbGFzdD4KLSAgICA8L25hbWU+Ci0gICAgPGFnZT4zMTwvYWdlPgotICA8L3BlcnNvbj4KLQotICA8cGVyc29uPgotICAgIDxuYW1lPgotICAgICAgPGZpcnN0PlJvZDwvZmlyc3Q+Ci0gICAgICA8bGFzdD5DaGF2ZXo8L2xhc3Q+Ci0gICAgPC9uYW1lPgotICAgIDxhZ2U+Mzk8L2FnZT4KLSAgPC9wZXJzb24+Ci0KLSAgPHBlcnNvbj4KLSAgICA8bmFtZT4KLSAgICAgIDxmaXJzdD5FcmljPC9maXJzdD4KLSAgICAgIDxsYXN0PlZhc2lsaWs8L2xhc3Q+Ci0gICAgPC9uYW1lPgotICAgIDxhZ2U+Mzc8L2FnZT4KLSAgPC9wZXJzb24+Ci0KLSAgPHBlcnNvbj4KLSAgICA8bmFtZT4KLSAgICAgIDxmaXJzdD5TeWx2aWE8L2ZpcnN0PgotICAgICAgPGxhc3Q+VmFzaWxpazwvbGFzdD4KLSAgICA8L25hbWU+Ci0gICAgPGFnZT4zNDwvYWdlPgotICA8L3BlcnNvbj4KLQotICA8cGVyc29uPgotICAgIDxuYW1lPgotICAgICAgPGZpcnN0PlJvZDwvZmlyc3Q+Ci0gICAgICA8bGFzdD5DaGF2ZXo8L2xhc3Q+Ci0gICAgPC9uYW1lPgotICAgIDxhZ2U+Mzk8L2FnZT4KLSAgPC9wZXJzb24+Ci0KLSAgPHBlcnNvbj4KLSAgICA8bmFtZT4KLSAgICAgIDxmaXJzdD5UZXJyeTwvZmlyc3Q+Ci0gICAgICA8bGFzdD5MdWNhczwvbGFzdD4KLSAgICA8L25hbWU+Ci0gICAgPGFnZT40MjwvYWdlPgotICA8L3BlcnNvbj4KLQotICA8cGVyc29uPgotICAgIDxuYW1lPgotICAgICAgPGZpcnN0PkRhdmlkPC9maXJzdD4KLSAgICAgIDxsYXN0PkJhdTwvbGFzdD4KLSAgICA8L25hbWU+Ci0gICAgPGFnZT4zMTwvYWdlPgotICA8L3BlcnNvbj4KLQotPC9wZW9wbGU+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3N0b3JlL3NtYWxsLnhtbCBiL3YxL3Rlc3QvY2FzZXMvc3RvcmUvc21hbGwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU2NDUzLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3QvY2FzZXMvc3RvcmUvc21hbGwueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgICAKLQotICAgdmVyc2lvbgotPQotCi0KLSIKLSIKLXN0YW5kYWxvbmU9J3llcycgICA/PgotPGFhYWEgYT0iYV92YWx1ZSIgYjphID0gJ2JfdmFsdWUnICB4bWxuczpiPSJiX25zIj4JCi0gIDw/cGkJdGFiICB0ZXN4dCBydD8+Ci08L2FhYWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3N0b3JlL3Rlc3QueG1sIGIvdjEvdGVzdC9jYXNlcy9zdG9yZS90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVkOTI4YS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L2Nhc2VzL3N0b3JlL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPGZvbyB4PSJ5Ij5hYjwvZm9vPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9BbGxUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3OTA4YzIuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIEFsbFRlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFFOYW1lU2V0VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChTbW9rZVRlc3RzLnN1aXRlKCkpOwotICAgICAgICAvL3N1aXRlLmFkZFRlc3RTdWl0ZShKYXZlbGluVGVzdHMuY2xhc3MpOwotCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQW5ub3RhdGlvbnNUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0Fubm90YXRpb25zVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ1Y2YzYy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQW5ub3RhdGlvbnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIEFubm90YXRpb25zVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKEFubm90YXRpb25zVGVzdHMuY2xhc3MpOyB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nW10gX2FyZ3M7Ci0gICAgc3RhdGljIFN0cmluZyBfdGVzdDsKLQotICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRDYXNlRmlsZShTdHJpbmcgdGhlQ2FzZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUZXN0RW52LnhiZWFuQ2FzZSgic3RvcmUvIiArIHRoZUNhc2UpOwotICAgIH0KLQotICAgIHN0YXRpYyBYbWxDdXJzb3IgbG9hZENhc2UoU3RyaW5nIHRoZUNhc2UpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShnZXRDYXNlRmlsZSh0aGVDYXNlKSwgbnVsbCkubmV3Q3Vyc29yKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFRlc3RCb29rbWFyayBleHRlbmRzIFhtbEN1cnNvci5YbWxCb29rbWFyawotICAgIHsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIEJhc2ljIGxvYWQgdXAgYSBmaWxlIGFuZCBpdGVyYXRlIHRocm91Z2ggaXQKLSAgICAvLwotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhc2ljWG1sKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gbG9hZENhc2UoInRlc3QueG1sIik7Ci0KLSAgICAgICAgVGVzdEJvb2ttYXJrIGExID0gbmV3IFRlc3RCb29rbWFyaygpOwotCi0gICAgICAgIGMuc2V0Qm9va21hcmsoIGExICk7Ci0gICAgICAgIAotICAgICAgICBUZXN0Qm9va21hcmsgYTIgPSBuZXcgVGVzdEJvb2ttYXJrKCk7Ci0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIAotICAgICAgICBjLnNldEJvb2ttYXJrKCBhMiApOwotICAgICAgICAKLSAgICAgICAgYy50b1ByZXZUb2tlbigpOwotICAgICAgICBjLnRvUHJldlRva2VuKCk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggYy5nZXRCb29rbWFyayggVGVzdEJvb2ttYXJrLmNsYXNzICksIGExICk7Ci0gICAgICAgIAotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGMuZ2V0Qm9va21hcmsoIFRlc3RCb29rbWFyay5jbGFzcyApLCBhMiApOwotICAgICAgICAKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0Qm9va21hcmsoIFRlc3RCb29rbWFyay5jbGFzcyApID09IG51bGwgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQXNzb3J0ZWRUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0Fzc29ydGVkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZlMjhjNi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQXNzb3J0ZWRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sVGltZTsKLWltcG9ydCBjb20uZWFzeXBvLlhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW47Ci1pbXBvcnQgY29tLmVhc3lwby5YbWxMaW5lSXRlbUJlYW47Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQ7Ci1pbXBvcnQgeGludC50ZXN0LlBvc2l0aW9uRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBc3NvcnRlZFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgQXNzb3J0ZWRUZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQXNzb3J0ZWRUZXN0cy5jbGFzcyk7IH0KLSAgICAKLSAgICAvLyBidWcgMjc0ODkKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFNhdmVyQ2hhckVzY2FwaW5nKCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIG5ld0xpbmUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoICJsaW5lLnNlcGFyYXRvciIgKTsKLSAgICAgICAgWG1sT2JqZWN0IHhkb2MgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgiPHRlc3Q+c29tZXRoaW5nPC90ZXN0PiIpOwotICAgICAgICBYbWxDdXJzb3IgY3VyID0geGRvYy5uZXdDdXJzb3IoKTsKLSAgICAgICAgY3VyLnRvRmlyc3RDaGlsZCgpOwotICAgICAgICAvLyB2YWxpZCBjaGFycwotICAgICAgICBjdXIuc2V0VGV4dFZhbHVlKCI8c29tZXRoaW5nIG9yIG90aGVyOlx1MDNDMFx1RDdGRj4iKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiPHRlc3Q+Jmx0O3NvbWV0aGluZyBvciBvdGhlcjpcdTAzQzBcdUQ3RkY+PC90ZXN0PiIgKyBuZXdMaW5lLCB4ZG9jLnRvU3RyaW5nKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gaW52YWxpZCBjaGFycyAtIGNvbnRyb2wgY2hhcnMsIHVuaWNvZGUgc3Vycm9nYXRlcywgRkZGRi9GRkZFLCBldGMKLSAgICAgICAgY3VyLnNldFRleHRWYWx1ZSgiPHNvbWV0aGluZ1wwb3JcMW90aGVyOlx1MDA0NVx1RkZGRVx1RDgwMFx1REZGRlx1REI4MFx1REMwMFx1MDNDMFx1RDdGRlx1MDAxRj4iKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiPHRlc3Q+Jmx0O3NvbWV0aGluZz9vcj9vdGhlcjpcdTAwNDU/Pz8/P1x1MDNDMFx1RDdGRj8+PC90ZXN0PiIgKyBuZXdMaW5lLCB4ZG9jLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBidWcgMjYxNDAvMjYxMDQKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdE5vVHlwZUludmFsaWQoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeGRvYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCI8dGVzdC1uby10eXBlPnNvbWV0aGluZzwvdGVzdC1uby10eXBlPiIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiVW50eXBlZCBkb2N1bWVudCBzaG91bGQgYmUgaW52YWxpZCIsICF4ZG9jLnZhbGlkYXRlKCkpOwotICAgICAgICAKLSAgICAgICAgeGRvYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCI8eDpibGFoIHhtbG5zOng9XCJodHRwOi8vbm8tdHlwZS5jb20vXCIvPiIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiVW50eXBlZCBkb2N1bWVudCBzaG91bGQgYmUgaW52YWxpZCIsICF4ZG9jLnZhbGlkYXRlKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBidWcgMjY3OTAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdENvbXBsZXhTZXR0ZXIoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuIHhkb2MgPSBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxwdXJjaGFzZS1vcmRlciB4bWxucz0naHR0cDovL29wZW51cmkub3JnL2Vhc3lwbyc+IiArCi0gICAgICAgICAgICAgICAgICI8Y3VzdG9tZXI+IiArCi0gICAgICAgICAgICAgICAgICAgIjxuYW1lPkRhdmlkIEJhdTwvbmFtZT4iICsKLSAgICAgICAgICAgICAgICAgICAiPGFkZHJlc3M+MTAwIE1haW4gU3RyZWV0PC9hZGRyZXNzPiIgKyAKLSAgICAgICAgICAgICAgICAgIjwvY3VzdG9tZXI+IiArCi0gICAgICAgICAgICAgICAgICI8ZGF0ZT4yMDAzLTA1LTE4VDExOjUwOjAwPC9kYXRlPiIgKwotICAgICAgICAgICAgICAgICAiPGxpbmUtaXRlbT4iICsKLSAgICAgICAgICAgICAgICAgICI8ZGVzY3JpcHRpb24+UmVkIENhbmR5PC9kZXNjcmlwdGlvbj4iICsKLSAgICAgICAgICAgICAgICAgICI8cGVyLXVuaXQtb3VuY2VzPjAuNDIzPC9wZXItdW5pdC1vdW5jZXM+IiArCi0gICAgICAgICAgICAgICAgICAiPHF1YW50aXR5PjQ8L3F1YW50aXR5PiIgKwotICAgICAgICAgICAgICAgICAiPC9saW5lLWl0ZW0+IiArCi0gICAgICAgICAgICAgICAgICI8bGluZS1pdGVtPiIgKwotICAgICAgICAgICAgICAgICAgIjxkZXNjcmlwdGlvbj5CbHVlIENhbmR5PC9kZXNjcmlwdGlvbj4iICsKLSAgICAgICAgICAgICAgICAgICI8cGVyLXVuaXQtb3VuY2VzPjUuMDwvcGVyLXVuaXQtb3VuY2VzPiIgKwotICAgICAgICAgICAgICAgICAgIjxxdWFudGl0eT4xPC9xdWFudGl0eT4iICsKLSAgICAgICAgICAgICAgICAgIjwvbGluZS1pdGVtPiIgKwotICAgICAgICAgICAgICAgICI8L3B1cmNoYXNlLW9yZGVyPiIpOwotICAgICAgICAvLyB0ZXN0IGNvcHktd2l0aGluIGRvYwotICAgICAgICBYbWxMaW5lSXRlbUJlYW4gbmV3SXRlbSA9IHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmFkZE5ld0xpbmVJdGVtKCk7Ci0gICAgICAgIG5ld0l0ZW0uc2V0KHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldExpbmVJdGVtQXJyYXkoMCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZig0KSwgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgyKS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuc2V0TGluZUl0ZW1BcnJheSgwLCB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDEpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMSksIHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldExpbmVJdGVtQXJyYXkoMCkuZ2V0UXVhbnRpdHkoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyB0ZXN0IGNvcHktYmV0d2VlbiBkb2NzCi0gICAgICAgIFhtbExpbmVJdGVtQmVhbiBhbm90aGVySXRlbSA9IFhtbExpbmVJdGVtQmVhbi5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICI8eG1sLWZyYWdtZW50IHhtbG5zOmVwPSdodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvJyB4bWxuczp4c2k9J2h0dHA6Ly93d3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZScgeHNpOnR5cGU9J2xpbmUtaXRlbSc+IiArCi0gICAgICAgICAgICAgICAgICI8ZXA6ZGVzY3JpcHRpb24+WWVsbG93IEJhbGxvb248L2VwOmRlc2NyaXB0aW9uPiIgKwotICAgICAgICAgICAgICAgICAiPGVwOnBlci11bml0LW91bmNlcz4wLjAwMTwvZXA6cGVyLXVuaXQtb3VuY2VzPiIgKwotICAgICAgICAgICAgICAgICAiPGVwOnF1YW50aXR5PjIwMDwvZXA6cXVhbnRpdHk+IiArCi0gICAgICAgICAgICAgICAgIjwveG1sLWZyYWdtZW50PiIpOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiWWVsbG93IEJhbGxvb24iLCBhbm90aGVySXRlbS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuc2V0TGluZUl0ZW1BcnJheSgxLCBhbm90aGVySXRlbSk7Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJZZWxsb3cgQmFsbG9vbiIsIHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDEpLCB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDApLmdldFF1YW50aXR5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigyMDApLCB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDEpLmdldFF1YW50aXR5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZig0KSwgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgyKS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHRlc3QgY29weS10by1zZWxmCi0gICAgICAgIHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLnNldExpbmVJdGVtQXJyYXkoMSwgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgxKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlllbGxvdyBCYWxsb29uIiwgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMSksIHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldExpbmVJdGVtQXJyYXkoMCkuZ2V0UXVhbnRpdHkoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDIwMCksIHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0UXVhbnRpdHkoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDQpLCB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDIpLmdldFF1YW50aXR5KCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZG9udHRlc3RQcmV0dHlQcmludCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4b2JqID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIjx0ZXN0IHhtbG5zOng9J2Zvbyc+Jmx0O1NIT1VMRE5PVEJFQVRBRyZndDs8YT5zaW1wbGU8Yi8+PC9hPiZsdDtBTFNPU0hPVUxETk9UQkVBVEFHJmd0OzwvdGVzdD4iKTsKLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKHhvYmopOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oeG9iai54bWxUZXh0KCkpOwotICAgICAgICAvKgotICAgICAgICBYbWxDdXJzb3IgeGN1ciA9IHhvYmoubmV3Q3Vyc29yKCk7Ci0gICAgICAgIHhjdXIudG9GaXJzdENoaWxkKCk7Ci0gICAgICAgIHhvYmogPSB4Y3VyLmdldE9iamVjdCgpOwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0geG9iai50b1N0cmluZygpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0KTsKLSAgICAgICAgCi0gICAgICAgIHhjdXIudG9GaXJzdENoaWxkKCk7Ci0gICAgICAgIHhjdXIudG9GaXJzdENoaWxkKCk7Ci0gICAgICAgIHhjdXIudG9GaXJzdENvbnRlbnRUb2tlbigpOwotICAgICAgICB4Y3VyLmluc2VydENoYXJzKCI8aHRtbD48Ym9keT50aGlzIGlzIGEgdGVzdDwvYm9keT48L2h0bWw+Iik7Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oeG9iaik7Ci0gICAgICAgICovCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkb250VGVzdFFOYW1lQ29weSgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFNjaGVtYURvY3VtZW50IHhvYmogPSBTY2hlbWFEb2N1bWVudC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+IiArCi0gICAgICAgICAgICAgICAgIjx4czplbGVtZW50IG5hbWU9J2ZvbycgdHlwZT0neHM6c3RyaW5nJy8+PC94czpzY2hlbWE+Iik7Ci0gICAgICAgIFNjaGVtYURvY3VtZW50IHhvYmoyID0gU2NoZW1hRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScvPiIpOwotICAgICAgICB4b2JqMi5nZXRTY2hlbWEoKS5hZGROZXdFbGVtZW50KCkuc2V0KHhvYmouZ2V0U2NoZW1hKCkuZ2V0RWxlbWVudEFycmF5KDApKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHhvYmoyKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gZG9uJ3QgcnVuIG9uIG5vcm1hbCBkcnQgYmVjYXVzZSBpdCdzIHRvbyBzbG93OiBhYm91dCAyMC0zMCBzZWNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRvbnR0ZXN0Q3Vyc29yRmluYWxpemUoKQotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IG9iaiA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyMDAwICogMTAwMDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbEN1cnNvciBjdXIgPSBvYmoubmV3Q3Vyc29yKCk7Ci0gICAgICAgICAgICAgICAgLy8gY3VyLmRpc3Bvc2UoKTsgc2tpcHBpbmcgdGhpcyBkZXBlbmRzIG9uIGZpbmFsaXphdGlvbiBvciBlbHNlIE9PTQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRGlkICIgKyBpICsgIiBpdGVyYXRpb25zIGJlZm9yZSBydW5uaW5nIG91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RPdXRPZlJhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUG9zaXRpb25Eb2N1bWVudCBkb2MgPSBQb3NpdGlvbkRvY3VtZW50LkZhY3RvcnkucGFyc2UoIjxwb3NpdGlvbiB4bWxucz0namF2YTppbnQudGVzdCc+PGxhdD40MzwvbGF0Pjxsb24+MDM3PC9sb24+PC9wb3NpdGlvbj4iKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MywgZG9jLmdldFBvc2l0aW9uKCkuZ2V0TGF0KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDM3LCBkb2MuZ2V0UG9zaXRpb24oKS5nZXRMb24oKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRvYy52YWxpZGF0ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIGRvYyA9IFBvc2l0aW9uRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgiPHBvc2l0aW9uIHhtbG5zPSdqYXZhOmludC50ZXN0Jz48bGF0PjQ0MzwvbGF0Pjxsb24+NzM3PC9sb24+PC9wb3NpdGlvbj4iKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0NDMsIGRvYy5nZXRQb3NpdGlvbigpLmdldExhdCgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MzcsIGRvYy5nZXRQb3NpdGlvbigpLmdldExvbigpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIWRvYy52YWxpZGF0ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIGRvYy5nZXRQb3NpdGlvbigpLnNldExhdCgoc2hvcnQpLTMwMCk7Ci0gICAgICAgIGRvYy5nZXRQb3NpdGlvbigpLnNldExvbigoc2hvcnQpMzI3NjcpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0zMDAsIGRvYy5nZXRQb3NpdGlvbigpLmdldExhdCgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMjc2NywgZG9jLmdldFBvc2l0aW9uKCkuZ2V0TG9uKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSghZG9jLnZhbGlkYXRlKCkpOwotICAgICAgICAKLSAgICAgICAgZG9jLmdldFBvc2l0aW9uKCkuc2V0TGF0KChzaG9ydCk0Myk7Ci0gICAgICAgIGRvYy5nZXRQb3NpdGlvbigpLnNldExvbigoc2hvcnQpMTI3KTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MywgZG9jLmdldFBvc2l0aW9uKCkuZ2V0TGF0KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEyNywgZG9jLmdldFBvc2l0aW9uKCkuZ2V0TG9uKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkb2MudmFsaWRhdGUoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0UGFyc2UoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxUaW1lIHh0ID0gWG1sVGltZS5GYWN0b3J5LnBhcnNlKCI8eG1sLWZyYWdtZW50PjEyOjAwOjAwPC94bWwtZnJhZ21lbnQ+Iik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjEyOjAwOjAwIiwgeHQuY2FsZW5kYXJWYWx1ZSgpLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIAotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0NvbXBpbGF0aW9uVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9Db21waWxhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMWMxODUuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0NvbXBpbGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5TY2hlbWFDb21waWxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5Db2RlR2VuVXRpbDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1wdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIENvbXBpbGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKENvbXBpbGF0aW9uVGVzdHMuY2xhc3MpOyB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SjJFRSgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIFRlc3RFbnYuZGVsdHJlZShUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvajJlZSIpKTsKLSAgICAgICAgLy8gRmlyc3QsIGNvbXBpbGUgc2NoZW1hCi0gICAgICAgIEZpbGUgc3JjZGlyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL2oyZWUvajJlZWNvbmZpZ3htbC9zcmMiKTsKLSAgICAgICAgRmlsZSBjbGFzc2VzZGlyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL2oyZWUvajJlZWNvbmZpZ3htbC9jbGFzc2VzIik7Ci0gICAgICAgIEZpbGUgb3V0cHV0amFyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL2oyZWUvajJlZWNvbmZpZ3htbC5qYXIiKTsKLSAgICAgICAgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycygpOwotICAgICAgICBwYXJhbXMuc2V0WHNkRmlsZXMobmV3IEZpbGVbXSB7Ci0gICAgICAgICAgICBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2oyZWUvYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2QiKSwKLSAgICAgICAgICAgIFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIiksCi0gICAgICAgICAgICBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2oyZWUvY29ubmVjdG9yXzFfNS54c2QiKSwKLSAgICAgICAgICAgIFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvajJlZS9lamItamFyXzJfMS54c2QiKSwKLSAgICAgICAgICAgIFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvajJlZS9qMmVlXzFfNC54c2QiKSwKLSAgICAgICAgICAgIFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvajJlZS9qc3BfMl8wLnhzZCIpLAotICAgICAgICAgICAgVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9qMmVlL3dlYi1hcHBfMl80LnhzZCIpLAotICAgICAgICAgICAgVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9qMmVlL1hNTC54c2QiKSwKLSAgICAgICAgfSk7Ci0gICAgICAgIHBhcmFtcy5zZXRTcmNEaXIoc3JjZGlyKTsKLSAgICAgICAgcGFyYW1zLnNldENsYXNzZXNEaXIoY2xhc3Nlc2Rpcik7Ci0gICAgICAgIHBhcmFtcy5zZXRPdXRwdXRKYXIob3V0cHV0amFyKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkJ1aWxkIGZhaWxlZCIsIFNjaGVtYUNvbXBpbGVyLmNvbXBpbGUocGFyYW1zKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDYW5ub3V0IGZpbmQgIiArIG91dHB1dGphciwgb3V0cHV0amFyLmV4aXN0cygpKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIF9fdGVzdEJ1aWxkKCkKLSAgICB7Ci0gICAgICAgIFRlc3RFbnYuZGVsdHJlZShUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvczRzIikpOwotICAgICAgICBGaWxlIGlucHV0ZmlsZTEgPSBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL3M0cy9YTUwueHNkIik7Ci0gICAgICAgIEZpbGUgaW5wdXRmaWxlMiA9IFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvczRzL1hNTFNjaGVtYS54c2QiKTsKLSAgICAgICAgRmlsZSBzcmNkaXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvczRzL3M0c3R5cGVzL3NyYyIpOwotICAgICAgICBGaWxlIGNsYXNzZXNkaXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvczRzL3M0c3R5cGVzL2NsYXNzZXMiKTsKLSAgICAgICAgRmlsZSBvdXRwdXRqYXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvczRzL3M0c3R5cGVzLmphciIpOwotICAgICAgICBTY2hlbWFDb21waWxlci5QYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBTY2hlbWFDb21waWxlci5QYXJhbWV0ZXJzKCk7Ci0gICAgICAgIHBhcmFtcy5zZXRYc2RGaWxlcyhuZXcgRmlsZVtdIHsgaW5wdXRmaWxlMSwgaW5wdXRmaWxlMiB9KTsKLSAgICAgICAgcGFyYW1zLnNldFNyY0RpcihzcmNkaXIpOwotICAgICAgICBwYXJhbXMuc2V0Q2xhc3Nlc0RpcihjbGFzc2VzZGlyKTsKLSAgICAgICAgcGFyYW1zLnNldE91dHB1dEphcihvdXRwdXRqYXIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQnVpbGQgZmFpbGVkIiwgU2NoZW1hQ29tcGlsZXIuY29tcGlsZShwYXJhbXMpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNhbm5vdXQgZmluZCAiICsgb3V0cHV0amFyLCBvdXRwdXRqYXIuZXhpc3RzKCkpOwotICAgIH0KLQotICAgIC8qIHRlc3Qgbm90IG5lZWRlZCBiZWNhdXNlIGJvb3RzdHJhcCBidWlsZCB0ZXN0cyB0aGlzIGJldHRlcgotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdCdWlsZCgpCi0gICAgewotICAgICAgICBUZXN0RW52LmRlbHRyZWUoVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL3M0cyIpKTsKLSAgICAgICAgRmlsZSBpbnB1dGZpbGUxID0gVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9zNHMvWE1MLnhzZCIpOwotICAgICAgICBGaWxlIGlucHV0ZmlsZTIgPSBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL3M0cy9YTUxTY2hlbWEueHNkIik7Ci0gICAgICAgIEZpbGUgb3V0cHV0amFyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL3M0cy9zNHN0eXBlcy5qYXIiKTsKLSAgICAgICAgU2NoZW1hQ29tcGlsZXIuY29tcGlsZShuZXcgRmlsZVtdIHsgaW5wdXRmaWxlMSwgaW5wdXRmaWxlMiB9LCBuZXcgRmlsZVswXSwgbmV3IEZpbGVbMF0sIG5ldyBGaWxlWzBdLCBudWxsLCBvdXRwdXRqYXIsICJzY2hlbWEuczRzIiwgbnVsbCwgbnVsbCwgbnVsbCwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNhbm5vdXQgZmluZCAiICsgb3V0cHV0amFyLCBvdXRwdXRqYXIuZXhpc3RzKCkpOwotICAgIH0KLSAgICAqLwotCi0gICAgcHVibGljIHZvaWQgX190ZXN0U2ltcGxlKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgVGVzdEVudi5kZWx0cmVlKFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9zaW1wbGUiKSk7Ci0gICAgICAgIC8vIEZpcnN0LCBjb21waWxlIHNjaGVtYQotICAgICAgICBGaWxlIGlucHV0ZmlsZTEgPSBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL3NpbXBsZS9wZXJzb24ueHNkIik7Ci0gICAgICAgIEZpbGUgaW5wdXRmaWxlMiA9IFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvc2ltcGxlL3NpbXBsZWMueHNkIik7Ci0gICAgICAgIEZpbGUgc3JjZGlyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL3NpbXBsZS9zaW1wbGV0eXBlcy9zcmMiKTsKLSAgICAgICAgRmlsZSBjbGFzc2VzZGlyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL3NpbXBsZS9zaW1wbGV0eXBlcy9jbGFzc2VzIik7Ci0gICAgICAgIEZpbGUgb3V0cHV0amFyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL3NpbXBsZS9zaW1wbGV0eXBlcy5qYXIiKTsKLSAgICAgICAgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycygpOwotICAgICAgICBwYXJhbXMuc2V0WHNkRmlsZXMobmV3IEZpbGVbXSB7IGlucHV0ZmlsZTEsIGlucHV0ZmlsZTIgfSk7Ci0gICAgICAgIHBhcmFtcy5zZXRTcmNEaXIoc3JjZGlyKTsKLSAgICAgICAgcGFyYW1zLnNldENsYXNzZXNEaXIoY2xhc3Nlc2Rpcik7Ci0gICAgICAgIHBhcmFtcy5zZXRPdXRwdXRKYXIob3V0cHV0amFyKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkJ1aWxkIGZhaWxlZCIsIFNjaGVtYUNvbXBpbGVyLmNvbXBpbGUocGFyYW1zKSk7Ci0KLSAgICAgICAgLy8gVGhlbiwgY29tcGlsZSBqYXZhIGNsYXNzZXMKLSAgICAgICAgRmlsZSBqYXZhc3JjID0gVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9zaW1wbGUvamF2YXNyYyIpOwotICAgICAgICBGaWxlIGphdmFjbGFzc2VzID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL3NpbXBsZS9qYXZhY2xhc3NlcyIpOwotICAgICAgICBqYXZhY2xhc3Nlcy5ta2RpcnMoKTsKLSAgICAgICAgTGlzdCB0ZXN0Y3AgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRlc3RjcC5hZGRBbGwoQXJyYXlzLmFzTGlzdChDb2RlR2VuVXRpbC5zeXN0ZW1DbGFzc3BhdGgoKSkpOwotICAgICAgICB0ZXN0Y3AuYWRkKG91dHB1dGphcik7Ci0gICAgICAgIENvZGVHZW5VdGlsLmV4dGVybmFsQ29tcGlsZShBcnJheXMuYXNMaXN0KG5ldyBGaWxlW10geyBqYXZhc3JjIH0pLCBqYXZhY2xhc3NlcywgKEZpbGVbXSl0ZXN0Y3AudG9BcnJheShuZXcgRmlsZVt0ZXN0Y3Auc2l6ZSgpXSksIHRydWUpOwotCi0gICAgICAgIC8vIFRoZW4gcnVuIHRoZSB0ZXN0Ci0gICAgICAgIHRlc3RjcC5hZGQoamF2YWNsYXNzZXMpOwotICAgICAgICBUZXN0UnVuVXRpbC5ydW4oIlNpbXBsZVBlcnNvblRlc3QiLCBuZXcgRmlsZVtdIHsgb3V0cHV0amFyLCBqYXZhY2xhc3NlcyB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBfX3Rlc3REb3dubG9hZCgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIFRlc3RFbnYuZGVsdHJlZShUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvaW5jbHVkZSIpKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBGaXJzdCwgY29tcGlsZSBzY2hlbWEgd2l0aG91dCBkb3dubG9hZCBhbmQgdmVyaWZ5IGZhaWx1cmUKLSAgICAgICAgICAgIEZpbGUgc3JjZGlyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL2luY2x1ZGUvc2hvdWxkZmFpbC9zcmMiKTsKLSAgICAgICAgICAgIEZpbGUgY2xhc3Nlc2RpciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9pbmNsdWRlL3Nob3VsZGZhaWwvY2xhc3NlcyIpOwotICAgICAgICAgICAgRmlsZSBvdXRwdXRqYXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvaW5jbHVkZS9zaG91bGRmYWlsLmphciIpOwotICAgICAgICAgICAgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycygpOwotICAgICAgICAgICAgcGFyYW1zLnNldFhzZEZpbGVzKG5ldyBGaWxlW10gewotICAgICAgICAgICAgICAgIFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvajJlZS9qMmVlXzFfNC54c2QiKSwKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgcGFyYW1zLnNldFNyY0RpcihzcmNkaXIpOwotICAgICAgICAgICAgcGFyYW1zLnNldENsYXNzZXNEaXIoY2xhc3Nlc2Rpcik7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0T3V0cHV0SmFyKG91dHB1dGphcik7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQnVpbGQgc2hvdWxkIGhhdmUgZmFpbGVkIiwgIVNjaGVtYUNvbXBpbGVyLmNvbXBpbGUocGFyYW1zKSk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiU2hvdWxkIG5vdCBoYXZlIGNyZWF0ZWQgIiArIG91dHB1dGphciwgIW91dHB1dGphci5leGlzdHMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBub3cgdHVybiBvbiBkb3dubG9hZCBhbmQgdmVyaWZ5IHN1Y2Nlc3MKLSAgICAgICAgICAgIEZpbGUgc3JjZGlyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL2luY2x1ZGUvc2hvdWxkc3VjY2VlZC9zcmMiKTsKLSAgICAgICAgICAgIEZpbGUgY2xhc3Nlc2RpciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9pbmNsdWRlL3Nob3VsZHN1Y2NlZWQvY2xhc3NlcyIpOwotICAgICAgICAgICAgRmlsZSBvdXRwdXRqYXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvaW5jbHVkZS9zaG91bGRzdWNjZWVkLmphciIpOwotICAgICAgICAgICAgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycygpOwotICAgICAgICAgICAgcGFyYW1zLnNldERvd25sb2FkKHRydWUpOwotICAgICAgICAgICAgcGFyYW1zLnNldFhzZEZpbGVzKG5ldyBGaWxlW10gewotICAgICAgICAgICAgICAgIFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvajJlZS9qMmVlXzFfNC54c2QiKSwKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgcGFyYW1zLnNldFNyY0RpcihzcmNkaXIpOwotICAgICAgICAgICAgcGFyYW1zLnNldENsYXNzZXNEaXIoY2xhc3Nlc2Rpcik7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0T3V0cHV0SmFyKG91dHB1dGphcik7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQnVpbGQgZmFpbGVkIiwgU2NoZW1hQ29tcGlsZXIuY29tcGlsZShwYXJhbXMpKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDYW5ub3V0IGZpbmQgIiArIG91dHB1dGphciwgb3V0cHV0amFyLmV4aXN0cygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIF9fdGVzdFByaWNlcXVvdGUoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBUZXN0RW52LmRlbHRyZWUoVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL3ByaWNlcXVvdGUiKSk7Ci0gICAgICAgIC8vIEZpcnN0LCBjb21waWxlIHNjaGVtYQotICAgICAgICBGaWxlIHNyY2RpciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9wcmljZXF1b3RlL3NyYyIpOwotICAgICAgICBGaWxlIGNsYXNzZXNkaXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvcHJpY2VxdW90ZS9jbGFzc2VzIik7Ci0gICAgICAgIEZpbGUgb3V0cHV0amFyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL3ByaWNlcXVvdGUvcHJpY2VxdW90ZS5qYXIiKTsKLSAgICAgICAgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycygpOwotICAgICAgICBwYXJhbXMuc2V0WHNkRmlsZXMobmV3IEZpbGVbXSB7IFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvcHJpY2VxdW90ZS9QcmljZVF1b3RlLnhzZCIpIH0pOwotICAgICAgICBwYXJhbXMuc2V0U3JjRGlyKHNyY2Rpcik7Ci0gICAgICAgIHBhcmFtcy5zZXRDbGFzc2VzRGlyKGNsYXNzZXNkaXIpOwotICAgICAgICBwYXJhbXMuc2V0T3V0cHV0SmFyKG91dHB1dGphcik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJCdWlsZCBmYWlsZWQiLCBTY2hlbWFDb21waWxlci5jb21waWxlKHBhcmFtcykpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2Fubm91dCBmaW5kICIgKyBvdXRwdXRqYXIsIG91dHB1dGphci5leGlzdHMoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgX190ZXN0QW5udWl0eSgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIFRlc3RFbnYuZGVsdHJlZShUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvYW5udWl0eSIpKTsKLSAgICAgICAgLy8gRmlyc3QsIGNvbXBpbGUgc2NoZW1hCi0gICAgICAgIEZpbGUgc3JjZGlyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL2FubnVpdHkvc3JjIik7Ci0gICAgICAgIEZpbGUgb3V0cHV0ZGlyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL2FubnVpdHkvY2xhc3NlcyIpOwotICAgICAgICBTY2hlbWFDb21waWxlci5QYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBTY2hlbWFDb21waWxlci5QYXJhbWV0ZXJzKCk7Ci0gICAgICAgIHBhcmFtcy5zZXRYc2RGaWxlcyhuZXcgRmlsZVtdIHsgVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9hbm51aXR5L2FubnVpdHluZXQueHNkIikgfSk7Ci0gICAgICAgIHBhcmFtcy5zZXRTcmNEaXIoc3JjZGlyKTsKLSAgICAgICAgcGFyYW1zLnNldENsYXNzZXNEaXIob3V0cHV0ZGlyKTsKLSAgICAgICAgcGFyYW1zLnNldENvbmZpZ0ZpbGVzKG5ldyBGaWxlW10geyBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2FubnVpdHkvYW5udWl0eW5ldC54c2Rjb25maWciKSB9KTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkJ1aWxkIGZhaWxlZCIsIFNjaGVtYUNvbXBpbGVyLmNvbXBpbGUocGFyYW1zKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDYW5ub3V0IGZpbmQgIiArIG91dHB1dGRpciwgb3V0cHV0ZGlyLmV4aXN0cygpKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIFtdIGludmFsaWRTY2hlbWFzID0gewotICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPlxuIiArCi0gICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdiYXNlJyBmaW5hbD0nZXh0ZW5zaW9uJy8+XG4iICsKLSAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2V4dCc+XG4iICsKLSAgICAgICAgIiAgICA8eHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgIiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0nYmFzZScvPlxuIiArCi0gICAgICAgICIgICAgPC94czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCi0gICAgICAgICI8L3hzOnNjaGVtYT5cbiIsCi0KLSAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKwotICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nYmFzZScgZmluYWw9JyNhbGwnLz5cbiIgKwotICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nZXh0Jz5cbiIgKwotICAgICAgICAiICAgIDx4czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAiICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSdiYXNlJy8+XG4iICsKLSAgICAgICAgIiAgICA8L3hzOmNvbXBsZXhDb250ZW50PlxuIiArCi0gICAgICAgICIgIDwveHM6Y29tcGxleFR5cGU+XG4iICsKLSAgICAgICAgIjwveHM6c2NoZW1hPlxuIiwKLQotICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnIGZpbmFsRGVmYXVsdD0nI2FsbCc+XG4iICsKLSAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2Jhc2UnLz5cbiIgKwotICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ncmVzdCc+XG4iICsKLSAgICAgICAgIiAgICA8eHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgIiAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSdiYXNlJy8+XG4iICsKLSAgICAgICAgIiAgICA8L3hzOmNvbXBsZXhDb250ZW50PlxuIiArCi0gICAgICAgICIgIDwveHM6Y29tcGxleFR5cGU+XG4iICsKLSAgICAgICAgIjwveHM6c2NoZW1hPlxuIiwKLQotICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnIGZpbmFsRGVmYXVsdD0ncmVzdHJpY3Rpb24nPlxuIiArCi0gICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdiYXNlJy8+XG4iICsKLSAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J3Jlc3QnPlxuIiArCi0gICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PlxuIiArCi0gICAgICAgICIgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0nYmFzZScvPlxuIiArCi0gICAgICAgICIgICAgPC94czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCi0gICAgICAgICI8L3hzOnNjaGVtYT5cbiIsCi0gICAgfTsKLQotICAgIHN0YXRpYyBTdHJpbmcgW10gdmFsaWRTY2hlbWFzID0gewotICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPlxuIiArCi0gICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdiYXNlJyBmaW5hbD0nZXh0ZW5zaW9uJy8+XG4iICsKLSAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J3Jlc3QnPlxuIiArCi0gICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PlxuIiArCi0gICAgICAgICIgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0nYmFzZScvPlxuIiArCi0gICAgICAgICIgICAgPC94czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCi0gICAgICAgICI8L3hzOnNjaGVtYT5cbiIsCi0KLSAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKwotICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nYmFzZScgZmluYWw9J3Jlc3RyaWN0aW9uJy8+XG4iICsKLSAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2V4dCc+XG4iICsKLSAgICAgICAgIiAgICA8eHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgIiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0nYmFzZScvPlxuIiArCi0gICAgICAgICIgICAgPC94czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCi0gICAgICAgICI8L3hzOnNjaGVtYT5cbiIsCi0KLSAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJyBmaW5hbERlZmF1bHQ9J3Jlc3RyaWN0aW9uJz5cbiIgKwotICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nYmFzZScvPlxuIiArCi0gICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdleHQnPlxuIiArCi0gICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PlxuIiArCi0gICAgICAgICIgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9J2Jhc2UnLz5cbiIgKwotICAgICAgICAiICAgIDwveHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT5cbiIgKwotICAgICAgICAiPC94czpzY2hlbWE+XG4iLAotCi0gICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScgZmluYWxEZWZhdWx0PSdleHRlbnNpb24nPlxuIiArCi0gICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdiYXNlJy8+XG4iICsKLSAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J3Jlc3QnPlxuIiArCi0gICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PlxuIiArCi0gICAgICAgICIgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0nYmFzZScvPlxuIiArCi0gICAgICAgICIgICAgPC94czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCi0gICAgICAgICI8L3hzOnNjaGVtYT5cbiIsCi0gICAgfTsKLQotICAgIHB1YmxpYyB2b2lkIF9fdGVzdEZpbmFsKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgU2NoZW1hRG9jdW1lbnRbXSBzY2hlbWFzID0gbmV3IFNjaGVtYURvY3VtZW50W2ludmFsaWRTY2hlbWFzLmxlbmd0aF07Ci0KLSAgICAgICAgLy8gUGFyc2UgdGhlIGludmFsaWQgc2NoZW1hIGZpbGVzCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGludmFsaWRTY2hlbWFzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgIHNjaGVtYXNbaV0gPSBTY2hlbWFEb2N1bWVudC5GYWN0b3J5LnBhcnNlKGludmFsaWRTY2hlbWFzW2ldKTsKLQotICAgICAgICAvLyBOb3cgY29tcGlsZSB0aGUgaW52YWxpZCBzY2hlbWFzLCB0ZXN0IHRoYXQgdGhleSBmYWlsCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHNjaGVtYXMubGVuZ3RoIDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFhtbEJlYW5zLmxvYWRYc2QobmV3IFhtbE9iamVjdFtdIHtzY2hlbWFzW2ldfSk7Ci0gICAgICAgICAgICAgICAgZmFpbCgiU2NoZW1hIHNob3VsZCBoYXZlIGZhaWxlZCB0byBjb21waWxlOlxuIiArIGludmFsaWRTY2hlbWFzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gc3VjY2Vzcykge30KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFBhcnNlIHRoZSB2YWxpZCBzY2hlbWEgZmlsZXMKLSAgICAgICAgc2NoZW1hcyA9IG5ldyBTY2hlbWFEb2N1bWVudFt2YWxpZFNjaGVtYXMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgdmFsaWRTY2hlbWFzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgIHNjaGVtYXNbaV0gPSBTY2hlbWFEb2N1bWVudC5GYWN0b3J5LnBhcnNlKHZhbGlkU2NoZW1hc1tpXSk7Ci0KLSAgICAgICAgLy8gQ29tcGlsZSB0aGUgdmFsaWQgc2NoZW1hcy4gVGhleSBzaG91bGQgbm90IGZhaWwKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgc2NoZW1hcy5sZW5ndGggOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgWG1sQmVhbnMubG9hZFhzZChuZXcgWG1sT2JqZWN0W117c2NoZW1hc1tpXX0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBmYWlsKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHRvIGNvbXBpbGUgc2NoZW1hOlxuIiArIHZhbGlkU2NoZW1hc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9DcmVhdGlvblRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQ3JlYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzE0Mjk0Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9DcmVhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgY29tLmVhc3lwby5YbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuOwotaW1wb3J0IGNvbS5lYXN5cG8uWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi5QdXJjaGFzZU9yZGVyOwotaW1wb3J0IGNvbS5lYXN5cG8uWG1sTGluZUl0ZW1CZWFuOwotaW1wb3J0IGNvbS5lYXN5cG8uWG1sU2hpcHBlckJlYW47Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotcHVibGljIGNsYXNzIENyZWF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBDcmVhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShDcmVhdGlvblRlc3RzLmNsYXNzKTsgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVBvKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbiBkb2MgPQotICAgICAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIAotICAgICAgICBQdXJjaGFzZU9yZGVyIG9yZGVyID0gZG9jLmFkZE5ld1B1cmNoYXNlT3JkZXIoKTsKLSAgICAgICAgb3JkZXIuYWRkTmV3Q3VzdG9tZXIoKS5zZXROYW1lKCJEYXZpZCBCYXUiKTsKLSAgICAgICAgb3JkZXIuZ2V0Q3VzdG9tZXIoKS5zZXRBZGRyZXNzKCJHbGFkd3luZSwgUEEiKTsKLSAgICAgICAgWG1sTGluZUl0ZW1CZWFuIGxpOwotICAgICAgICBsaSA9IG9yZGVyLmFkZE5ld0xpbmVJdGVtKCk7Ci0gICAgICAgIGxpLnNldERlc2NyaXB0aW9uKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMSIpOwotICAgICAgICBsaS5zZXRQcmljZShuZXcgQmlnRGVjaW1hbCgiMjEuNzkiKSk7Ci0gICAgICAgIGxpLnNldFF1YW50aXR5KEJpZ0ludGVnZXIudmFsdWVPZigyKSk7Ci0gICAgICAgIGxpLnNldFBlclVuaXRPdW5jZXMobmV3IEJpZ0RlY2ltYWwoIjUiKSk7Ci0gICAgICAgIGxpID0gb3JkZXIuYWRkTmV3TGluZUl0ZW0oKTsKLSAgICAgICAgbGkuc2V0RGVzY3JpcHRpb24oIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAyIik7Ci0gICAgICAgIGxpLnNldFByaWNlKG5ldyBCaWdEZWNpbWFsKCIxOS44OSIpKTsKLSAgICAgICAgbGkuc2V0UXVhbnRpdHkoQmlnSW50ZWdlci52YWx1ZU9mKDIpKTsKLSAgICAgICAgbGkuc2V0UGVyVW5pdE91bmNlcyhuZXcgQmlnRGVjaW1hbCgiNSIpKTsKLSAgICAgICAgbGkgPSBvcmRlci5hZGROZXdMaW5lSXRlbSgpOwotICAgICAgICBsaS5zZXREZXNjcmlwdGlvbigiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDMiKTsKLSAgICAgICAgbGkuc2V0UHJpY2UobmV3IEJpZ0RlY2ltYWwoIjE5Ljg5IikpOwotICAgICAgICBsaS5zZXRRdWFudGl0eShCaWdJbnRlZ2VyLnZhbHVlT2YoMSkpOwotICAgICAgICBsaS5zZXRQZXJVbml0T3VuY2VzKG5ldyBCaWdEZWNpbWFsKCI1IikpOwotICAgICAgICBYbWxTaGlwcGVyQmVhbiBzaCA9IG9yZGVyLmFkZE5ld1NoaXBwZXIoKTsKLSAgICAgICAgc2guc2V0TmFtZSgiVVBTIik7Ci0gICAgICAgIHNoLnNldFBlck91bmNlUmF0ZShuZXcgQmlnRGVjaW1hbCgiMC43NCIpKTsKLQotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihkb2MueG1sVGV4dCgpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJEYXZpZCBCYXUiLCBvcmRlci5nZXRDdXN0b21lcigpLmdldE5hbWUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdsYWR3eW5lLCBQQSIsIG9yZGVyLmdldEN1c3RvbWVyKCkuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzLCBvcmRlci5zaXplT2ZMaW5lSXRlbUFycmF5KCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAxIiwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMjEuNzkiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXRQcmljZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnSW50ZWdlcigiMiIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDApLmdldFF1YW50aXR5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCI1IiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMCkuZ2V0UGVyVW5pdE91bmNlcygpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMiIsIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjE5Ljg5IiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0UHJpY2UoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0ludGVnZXIoIjIiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiNSIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDEpLmdldFBlclVuaXRPdW5jZXMoKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDMiLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDIpLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIxOS44OSIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDIpLmdldFByaWNlKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdJbnRlZ2VyKCIxIiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0UXVhbnRpdHkoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjUiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgyKS5nZXRQZXJVbml0T3VuY2VzKCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXIuaXNTZXRTaGlwcGVyKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJVUFMiLCBvcmRlci5nZXRTaGlwcGVyKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMC43NCIpLCBvcmRlci5nZXRTaGlwcGVyKCkuZ2V0UGVyT3VuY2VSYXRlKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9Eb21UZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0RvbVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MTgwZmUuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0RvbVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5Sb290OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yLlRva2VuVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5YbWxCb29rbWFyazsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotcHVibGljIGNsYXNzIERvbVRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgRG9tVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKERvbVRlc3RzLmNsYXNzKTsgfQotCi0gICAgc3RhdGljIFN0cmluZ1tdIF9hcmdzOwotICAgIHN0YXRpYyBTdHJpbmcgX3Rlc3Q7Ci0KLSAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0Q2FzZUZpbGUoU3RyaW5nIHRoZUNhc2UpCi0gICAgewotICAgICAgICByZXR1cm4gVGVzdEVudi54YmVhbkNhc2UoInN0b3JlLyIgKyB0aGVDYXNlKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgWG1sQ3Vyc29yIGxvYWRDYXNlKFN0cmluZyB0aGVDYXNlKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoZ2V0Q2FzZUZpbGUodGhlQ2FzZSksIG51bGwpLm5ld0N1cnNvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvVGVzdERvbUltcG9ydCAoIFN0cmluZyB4bWwgKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgIERvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBmLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCi0gICAgICAgIERvY3VtZW50IGRvYyA9IHBhcnNlci5wYXJzZSggbmV3IElucHV0U291cmNlKCBuZXcgU3RyaW5nUmVhZGVyKCB4bWwgKSApICk7Ci0KLSAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggZG9jICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscyggeG1sICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZG9UZXN0RG9tRXhwb3J0ICggU3RyaW5nIHhtbCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKS5uZXdEb21Ob2RlKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscyggeG1sICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZG9UZXN0ICggU3RyaW5nIHhtbCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGRvVGVzdERvbUltcG9ydCggeG1sICk7Ci0gICAgICAgIGRvVGVzdERvbUV4cG9ydCggeG1sICk7Ci0gICAgfQotCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9tMiAoICkKLS8vICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0vLyAgICB7Ci0vLyAgICAgICAgRE9NUGFyc2VyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKLS8vICAgICAgICAKLS8vICAgICAgICBwYXJzZXIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiwgdHJ1ZSApOwotLy8gICAgICAgIAotLy8gICAgICAgIHBhcnNlci5wYXJzZSggbmV3IElucHV0U291cmNlKCBuZXcgU3RyaW5nUmVhZGVyKCAiPGZvbyBhPSd4XG5cbnknPjwvZm9vPiIgKSApICk7Ci0vLwotLy8gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sTG9hZGVyLkZhY3RvcnkucGFyc2UoIHBhcnNlci5nZXREb2N1bWVudCgpICk7Ci0vLwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggeC54bWxUZXh0KCkgKTsKLS8vICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG9tICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBkb1Rlc3QoICI8Zm9vIHhtbG5zPVwieFwiLz4iICk7Ci0gICAgICAgIGRvVGVzdCggIjxmb28geG1sbnM9XCJ4XCIgeG1sbnM6ZT1cInZcIi8+IiApOwotICAgICAgICBkb1Rlc3QoICI8Zm9vPmE8P1g/PmI8L2Zvbz4iICk7Ci0gICAgICAgIGRvVGVzdCggIjxmb28+YTwhLS1YLS0+YjwvZm9vPiIgKTsKLSAgICAgICAgZG9UZXN0KCAiPCEtLVgtLT48Zm9vLz4iICk7Ci0gICAgICAgIGRvVGVzdCggIjxmb28vPiIgKTsKLSAgICAgICAgZG9UZXN0KCAiPGZvbyB4PVwieVwiLz4iICk7Ci0gICAgICAgIGRvVGVzdCggIjxmb28+PGEvPjxiPm1vbzwvYj48L2Zvbz4iICk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgeHggPQotICAgICAgICAgICAgIjwhLS1nZy0tPjw/YSBiPz48Zm9vPnNkc2Q8YS8+c2RzZDxiPm1vbzwvYj5zZDwhLS1hc2FzLS0+c2Q8L2Zvbz48IS0taGgtLT4iOwotICAgICAgICAKLSAgICAgICAgZG9UZXN0KCB4eCApOwotCi0gICAgICAgIFN0cmluZyB4bWwgPQotICAgICAgICAgICAgIjx4bWwtZnJhZ21lbnQ+IiArCi0gICAgICAgICAgICAiZm9vIiArCi0gICAgICAgICAgICAiPC94bWwtZnJhZ21lbnQ+IjsKLQotICAgICAgICBkb1Rlc3REb21FeHBvcnQoIHhtbCApOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHhtbCA9Ci0gICAgICAgICAgICAgICAgIjx4bWwtZnJhZ21lbnQgIiArCi0gICAgICAgICAgICAgICAgIiAgZm9vPSdiYXInPiIgKwotICAgICAgICAgICAgICAgICI8L3htbC1mcmFnbWVudD4iOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgZG9UZXN0RG9tRXhwb3J0KCB4bWwgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIHh4ICk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5vZGUgbiA9IGMubmV3RG9tTm9kZSgpOwotICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIG4gKTsKLQotICAgICAgICAgICAgaWYgKGMudG9OZXh0VG9rZW4oKS5pc05vbmUoKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9FYXN5UG9UZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0Vhc3lQb1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MjAxZTkuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0Vhc3lQb1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5lYXN5cG8uWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbjsKLWltcG9ydCBjb20uZWFzeXBvLlhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4uUHVyY2hhc2VPcmRlcjsKLQotcHVibGljIGNsYXNzIEVhc3lQb1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgRWFzeVBvVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKEVhc3lQb1Rlc3RzLmNsYXNzKTsgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVhc3lQbygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4gZG9jID0gKFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4pCi0gICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShUZXN0RW52LnhiZWFuQ2FzZSgic3RvcmUvZWFzeXBvMS54bWwiKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZmFsc2UsIGRvYy5pc05pbCgpKTsKLSAgICAgICAgUHVyY2hhc2VPcmRlciBvcmRlciA9IGRvYy5nZXRQdXJjaGFzZU9yZGVyKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkRhdmlkIEJhdSIsIG9yZGVyLmdldEN1c3RvbWVyKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR2xhZHd5bmUsIFBBIiwgb3JkZXIuZ2V0Q3VzdG9tZXIoKS5nZXRBZGRyZXNzKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIG9yZGVyLnNpemVPZkxpbmVJdGVtQXJyYXkoKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDEiLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDApLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIyMS43OSIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDApLmdldFByaWNlKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdJbnRlZ2VyKCIyIiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMCkuZ2V0UXVhbnRpdHkoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjUiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXRQZXJVbml0T3VuY2VzKCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAyIiwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMTkuODkiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXRQcmljZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnSW50ZWdlcigiMiIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDEpLmdldFF1YW50aXR5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCI1IiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0UGVyVW5pdE91bmNlcygpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMyIsIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjE5Ljg5IiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0UHJpY2UoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0ludGVnZXIoIjEiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgyKS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiNSIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDIpLmdldFBlclVuaXRPdW5jZXMoKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlLCBvcmRlci5pc1NldFNoaXBwZXIoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlVQUyIsIG9yZGVyLmdldFNoaXBwZXIoKS5nZXROYW1lKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIwLjc0IiksIG9yZGVyLmdldFNoaXBwZXIoKS5nZXRQZXJPdW5jZVJhdGUoKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzLCBvcmRlci5zaXplT2ZMaW5lSXRlbUFycmF5KCkpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQXV0b1ZhbGlkYWl0b24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAiPHB1cmNoYXNlLW9yZGVyIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvJy8+IiApOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxwdXJjaGFzZS1vcmRlIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvJy8+IiApOwotCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFhtbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4uRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPHB1cmNoYXNlLW9yZGVyIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXAnLz4iICk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxmOmZyYWdtZW50IHhtbG5zOmY9J2h0dHA6Ly93d3cub3BlbnVyaS5vcmcvZnJhZ21lbnQnLz4iICk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxmOmZyYWdtZW50IHhtbG5zOmY9J2h0dHA6Ly93d3cub3BlbnVyaS5vcmcvZnJhZ21lbnQnPjxhLz48L2Y6ZnJhZ21lbnQ+IiApOwotCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFhtbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICI8ZjpmcmFnbWVudCB4bWxuczpmPSdodHRwOi8vd3d3Lm9wZW51cmkub3JnL2ZyYWdtZW50Jz48YS8+PGEvPjwvZjpmcmFnbWVudD4iICk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvRW51bVRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvRW51bVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OWU3OTUuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0VudW1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLm9wZW51cmkuZW51bXRlc3QuU3RhdHVzcmVwb3J0RG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLm9wZW51cmkuZW51bXRlc3QuUXVhbnRpdHk7Ci1pbXBvcnQgb3JnLm9wZW51cmkuZW51bXRlc3QuRGF0YTsKLQotcHVibGljIGNsYXNzIEVudW1UZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIEVudW1UZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRW51bVRlc3RzLmNsYXNzKTsgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RSZXBvcnQxKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RhdHVzcmVwb3J0RG9jdW1lbnQgZG9jID0gKFN0YXR1c3JlcG9ydERvY3VtZW50KQotICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShUZXN0RW52LnhiZWFuQ2FzZSgiZW51bXRlc3QvcmVwb3J0MS54bWwiKSk7Ci0KLSAgICAgICAgUXVhbnRpdHkuRW51bVtdIGNvbnRlbnRzID0gbmV3IFF1YW50aXR5LkVudW1bXQotICAgICAgICB7Ci0gICAgICAgICAgICBRdWFudGl0eS5BTEwsCi0gICAgICAgICAgICBRdWFudGl0eS5BTEwsCi0gICAgICAgICAgICBRdWFudGl0eS5GRVcsCi0gICAgICAgICAgICBRdWFudGl0eS5BTEwsCi0gICAgICAgICAgICBRdWFudGl0eS5NT1NULAotICAgICAgICAgICAgUXVhbnRpdHkuTk9ORSwKLSAgICAgICAgICAgIFF1YW50aXR5Lk5PTkUsCi0gICAgICAgICAgICBRdWFudGl0eS5OT05FLAotICAgICAgICB9OwotICAgICAgICBEYXRhW10gZGF0YSA9IGRvYy5nZXRTdGF0dXNyZXBvcnQoKS5nZXRTdGF0dXNBcnJheSgpOwotICAgICAgICBpbnQgdCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjb250ZW50c1t0KytdLCBkYXRhW2ldLmVudW1WYWx1ZSgpKTsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVGFyZ2V0OiAiICsgZGF0YVtpXS5nZXRUYXJnZXQoKSArICIsIHZhbHVlOiAiICsgZGF0YVtpXS5lbnVtVmFsdWUoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGNvbnRlbnRzW3QrK10sIGRhdGFbaV0uZ2V0VGFyZ2V0KCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0dEYXRlVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9HRGF0ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZjMwZmIuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0dEYXRlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEdXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEdXJhdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDYWxlbmRhcjsKLQotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci0KLXB1YmxpYyBjbGFzcyBHRGF0ZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgR0RhdGVUZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoR0RhdGVUZXN0cy5jbGFzcyk7IH0KLQotICAgIHN0YXRpYyBTdHJpbmdbXSB2YWxpZER1cmF0aW9ucyA9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIlBUMFMiLAotICAgICAgICAgICAgICAgICJQMVkiLAotICAgICAgICAgICAgICAgICJQMU0iLAotICAgICAgICAgICAgICAgICJQMUQiLAotICAgICAgICAgICAgICAgICJQMlkiLAotICAgICAgICAgICAgICAgICJQMk0iLAotICAgICAgICAgICAgICAgICJQMkQiLAotICAgICAgICAgICAgICAgICJQVDFIIiwKLSAgICAgICAgICAgICAgICAiUFQxTSIsCi0gICAgICAgICAgICAgICAgIlBUMVMiLAotICAgICAgICAgICAgICAgICJQVDM2MDBTIiwKLSAgICAgICAgICAgICAgICAiUDFZMU0xRFQxSDFNMVMiLAotICAgICAgICAgICAgICAgICJQMVkxTTFEVDFIMU0xLjFTIiwKLSAgICAgICAgICAgICAgICAiUDFZMzY1RCIsCi0gICAgICAgICAgICAgICAgIlAxWTM2NkQiLAotICAgICAgICAgICAgICAgICJQVDAuMVMiLAotICAgICAgICAgICAgICAgICJQMVktMzY0RCIsCi0gICAgICAgICAgICAgICAgIlAxWS0zNjVEIiwKLSAgICAgICAgICAgICAgICAiUDFZLTM2NkQiLAotICAgICAgICAgICAgICAgICJQMVktMzY3RCIsCi0gICAgICAgICAgICAgICAgIlAxWS0xMk0iLAotICAgICAgICAgICAgICAgICJQMU0yOUQiLAotICAgICAgICAgICAgICAgICJQMU0tMjdEIiwKLSAgICAgICAgICAgICAgICAiUDFNLTI4RCIsCi0gICAgICAgICAgICAgICAgIlAxTS0yOUQiLAotICAgICAgICAgICAgICAgICJQMU0tMzFEIiwKLSAgICAgICAgICAgICAgICAiUDFNLTMyRCIsCi0gICAgICAgICAgICAgICAgIlAxTVQtNjYwSCIsCi0gICAgICAgICAgICAgICAgIlAxTVQtNjcwSCIsCi0gICAgICAgICAgICAgICAgIlAxTVQtNjgwSCIsCi0gICAgICAgICAgICAgICAgIlAxTVQtNjkwSCIsCi0gICAgICAgICAgICAgICAgIlAxTVQtNzAwSCIsCi0gICAgICAgICAgICAgICAgIlAxTVQtNzEwSCIsCi0gICAgICAgICAgICAgICAgIlAxTVQtNzIwSCIsCi0gICAgICAgICAgICAgICAgIlAxTVQtNzMwSCIsCi0gICAgICAgICAgICAgICAgIlAxTVQtNzQwSCIsCi0gICAgICAgICAgICAgICAgIlBUMC4xNDE1OTI2UyIsCi0gICAgICAgICAgICAgICAgIlBUNTIzMzEzMlMiLAotICAgICAgICAgICAgICAgICJQVDE0MjMzMk0iLAotICAgICAgICAgICAgICAgICJQVDk4MDIzSCIsCi0KLSAgICAgICAgICAgICAgICAiLVBUMFMiLAotICAgICAgICAgICAgICAgICItUDFZIiwKLSAgICAgICAgICAgICAgICAiLVAxTSIsCi0gICAgICAgICAgICAgICAgIi1QMUQiLAotICAgICAgICAgICAgICAgICItUFQxSCIsCi0gICAgICAgICAgICAgICAgIi1QVDFNIiwKLSAgICAgICAgICAgICAgICAiLVBUMVMiLAotICAgICAgICAgICAgICAgICItUDFZMU0xRFQxSDFNMVMiLAotICAgICAgICAgICAgICAgICItUDFZMU0xRFQxSDFNMS4xUyIsCi0gICAgICAgICAgICAgICAgIi1QMjdEIiwKLSAgICAgICAgICAgICAgICAiLVAyOEQiLAotICAgICAgICAgICAgICAgICItUDI5RCIsCi0gICAgICAgICAgICAgICAgIi1QMzBEIiwKLSAgICAgICAgICAgICAgICAiLVAzMUQiLAotICAgICAgICAgICAgICAgICItUDM2NEQiLAotICAgICAgICAgICAgICAgICItUDM2NUQiLAotICAgICAgICAgICAgICAgICItUDM2NkQiLAotICAgICAgICAgICAgICAgICItUFQwLjFTIiwKLSAgICAgICAgICAgICAgICAiLVBUMC4xNDE1OTI2UyIsCi0gICAgICAgICAgICAgICAgIi1QVDUyMzMxMzJTIiwKLSAgICAgICAgICAgICAgICAiLVBUMTQyMzMyTSIsCi0gICAgICAgICAgICAgICAgIi1QVDk4MDIzSCIsCi0KLSAgICAgICAgICAgIH07Ci0KLSAgICBzdGF0aWMgU3RyaW5nW10gaW52YWxpZERhdGVzID0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAiKzE0OjAxIiwgLy8gdHoKLSAgICAgICAgICAgICAgICAiLTE0OjAxIiwgLy8gdHoKLSAgICAgICAgICAgICAgICAiKzE1OjAwIiwgLy8gdHoKLSAgICAgICAgICAgICAgICAiLTE1OjAwIiwgLy8gdHoKLSAgICAgICAgICAgICAgICAiWCIsCi0gICAgICAgICAgICAgICAgIiwiLAotICAgICAgICAgICAgICAgICJUIiwKLSAgICAgICAgICAgICAgICAiKyIsCi0gICAgICAgICAgICAgICAgIi0iLAotICAgICAgICAgICAgICAgICI6IiwKLSAgICAgICAgICAgICAgICAiMCIsCi0gICAgICAgICAgICAgICAgIk1hcmNoIDIiLAotICAgICAgICAgICAgICAgICJUMDA6MDA6MDBaIiwgLy8gVCBub3QgYWxsb3dlZAotICAgICAgICAgICAgICAgICItMDA6MDA6MDBaIiwgLy8gLSBub3QgYWxsb3dlZAotICAgICAgICAgICAgICAgICI5Ni0wMi0yOFQwMDowMDowMFoiLCAvLyB5ZWFyIHdpZHRoCi0gICAgICAgICAgICAgICAgIjEwMC0wMi0yOFQwMDowMDowMFoiLCAvLyB5ZWFyIHdpZHRoCi0gICAgICAgICAgICAgICAgIjE5MDAtMi0yOFQwMDowMDowMFoiLCAvLyBtb250aCB3aWR0aAotICAgICAgICAgICAgICAgICIxOTAwLTAyLThUMDA6MDA6MDBaIiwgLy8gZGF5IHdpZHRoCi0gICAgICAgICAgICAgICAgIjE5MDAtMDItMDhUMDowMDowMFoiLCAvLyBob3VyIHdpZHRoCi0gICAgICAgICAgICAgICAgIjE5MDAtMDItMDhUMDA6MDowMFoiLCAvLyBob3VyIHdpZHRoCi0gICAgICAgICAgICAgICAgIjE5MDAtMDItMDhUMDA6MDA6MFoiLCAvLyBob3VyIHdpZHRoCi0gICAgICAgICAgICAgICAgIjE5MDAtMDItMDhUMDA6MDBaIiwgLy8gdGltZSBpbmNvbXBsZXRlCi0gICAgICAgICAgICAgICAgIjE5MDAtMDItMDggVDAwOjAwOjAwWiIsIC8vIHNwYWNlCi0gICAgICAgICAgICAgICAgIjE5MDAtMDItMDhUIDAwOjAwOjAwWiIsIC8vIHNwYWNlCi0gICAgICAgICAgICAgICAgIjE5MDAtMDItMDhUMDA6MDA6MDAgWiIsIC8vIHNwYWNlCi0gICAgICAgICAgICAgICAgIjE5MDAtMDItMjlUMDBaIiwgLy8gdGltZSBpbmNvbXBsZXRlCi0gICAgICAgICAgICAgICAgIjAwOjAwIiwgLy8gdGltZSBpbmNvbXBsZXRlCi0gICAgICAgICAgICAgICAgIjAwIiwgLy8gaW5jb21wbGV0ZQotICAgICAgICAgICAgICAgICIyMTAwLTAyLTI5IiwgLy8gbm90IGxlYXAKLSAgICAgICAgICAgICAgICAiLTk5OTk5OTktMDItMjhUMDA6MDA6MDBaIiwgLy8gdG9vIGxvbmcgYWdvCi0gICAgICAgICAgICAgICAgIjk5OTk5OTktMDItMjhUMDA6MDA6MDBaIiwgLy8gdG9vIGxvbmcgZnJvbSBub3cKLSAgICAgICAgICAgICAgICAiOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OS0wMi0yOFQwMDowMDowMFoiLCAvLyBvdmVyZmxvdz8KLSAgICAgICAgICAgICAgICAiMTk5Ni0wMC0yOFQwMDowMDowMFoiLCAvLyBtb250aAotICAgICAgICAgICAgICAgICIxOTk2LTEzLTI4VDAwOjAwOjAwWiIsIC8vIG1vbnRoCi0gICAgICAgICAgICAgICAgIjE5OTYtMDItMDBUMDA6MDA6MDBaIiwgLy8gZGF5Ci0gICAgICAgICAgICAgICAgIjIwMDAtMDItMzBUMDA6MDA6MDBaIiwgLy8gZGF5Ci0gICAgICAgICAgICAgICAgIjE5OTYtMDItMjlUMjQ6MDA6MDBaIiwgLy8gaHIKLSAgICAgICAgICAgICAgICAiMTk5Ni0wMi0yOVQwMDo2MDowMFoiLCAvLyBtaW4KLSAgICAgICAgICAgICAgICAiMTk5Ni0wMi0yOVQwMDowMDo2MFoiLCAvLyBzZWMKLSAgICAgICAgICAgICAgICAiMTk5Ni0wMi0yOVQwMDowMDowMCsxNDowMSIsIC8vIHR6Ci0gICAgICAgICAgICAgICAgIjE5OTYtMDItMjlUMDA6MDA6MDAtMTQ6MDEiLCAvLyB0egotICAgICAgICAgICAgICAgICIxOTk2LTAyLTI5VDAwOjAwOjAwKzE1OjAwIiwgLy8gdHoKLSAgICAgICAgICAgICAgICAiMTk5Ni0wMi0yOVQwMDowMDowMC0xNTowMCIsIC8vIHR6Ci0gICAgICAgICAgICAgICAgIjE5OTYtMDAtMjkiLCAvLyBtb250aAotICAgICAgICAgICAgICAgICIxOTk2LTEzLTI5IiwgLy8gbW9udGgKLSAgICAgICAgICAgICAgICAiMTk5Ni0wMi0wMCIsIC8vIGRheQotICAgICAgICAgICAgICAgICIyMDAwLTAyLTMwIiwgLy8gZGF5Ci0gICAgICAgICAgICAgICAgIi0tMDAiLCAvLyBtb250aAotICAgICAgICAgICAgICAgICItLTEzIiwgLy8gbW9udGgKLSAgICAgICAgICAgICAgICAiLS0wMC0wMSIsIC8vIG1vbnRoCi0gICAgICAgICAgICAgICAgIi0tMTMtMDEiLCAvLyBtb250aAotICAgICAgICAgICAgICAgICItLTAyLTAwIiwgLy8gZGF5Ci0gICAgICAgICAgICAgICAgIi0tMDItMzAiLCAvLyBkYXkKLSAgICAgICAgICAgICAgICAiLS0wMS0zMiIsIC8vIGRheQotICAgICAgICAgICAgICAgICItLTExLTMxIiwgLy8gZGF5Ci0gICAgICAgICAgICAgICAgIi0tLTAwIiwgLy8gZGF5Ci0gICAgICAgICAgICAgICAgIi0tLTMyIiwgLy8gZGF5Ci0gICAgICAgICAgICAgICAgIjI0OjAwOjAwWiIsIC8vIGhyCi0gICAgICAgICAgICAgICAgIjAwOjYwOjAwWiIsIC8vIG1pbgotICAgICAgICAgICAgICAgICIwMDowMDo2MFoiLCAvLyBzZWMKLSAgICAgICAgICAgICAgICAiMDA6MDA6MDArMTQ6MDEiLCAvLyB0egotICAgICAgICAgICAgICAgICIwMDowMDowMC0xNDowMSIsIC8vIHR6Ci0gICAgICAgICAgICAgICAgIjAwOjAwOjAwKzE1OjAwIiwgLy8gdHoKLSAgICAgICAgICAgICAgICAiMDA6MDA6MDAtMTU6MDAiLCAvLyB0egotICAgICAgICAgICAgfTsKLQotICAgIHN0YXRpYyBTdHJpbmdbXSB2YWxpZERhdGVzID0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICAgICAiWiIsIC8vIHRpbWV6b25lIG9ubHkKLSAgICAgICAgICAgICAgICAiLTE0OjAwIiwgLy8gdGltZXpvbmUgb25seQotICAgICAgICAgICAgICAgICI5OTk5OTktMTItMzFUMjM6NTk6NTkuOTk5WiIsCi0gICAgICAgICAgICAgICAgIjE5NzAtMTItMzFUMjM6NTk6NTkuOTkwKzE0OjAwIiwKLSAgICAgICAgICAgICAgICAiMTk5Ni0wMi0yOVQwMDowMDowMFoiLCAvLyBsZWFwCi0gICAgICAgICAgICAgICAgIjIwMDAtMDItMjlUMDA6MDA6MDBaIiwgLy8gbGVhcAotICAgICAgICAgICAgICAgICIyMDA0LTAyLTI5VDAwOjAwOjAwWiIsIC8vIGxlYXAKLSAgICAgICAgICAgICAgICAiMjAwOC0wMi0yOVQwMDowMDowMFoiLCAvLyBsZWFwCi0gICAgICAgICAgICAgICAgIjIwMTItMDItMjlUMDA6MDA6MDBaIiwgLy8gbGVhcAotICAgICAgICAgICAgICAgICIxOTAwLTAyLTI4VDAwOjAwOjAwWiIsIC8vIG5vdCBsZWFwCi0gICAgICAgICAgICAgICAgIjIxMDAtMDItMjhUMDA6MDA6MDBaIiwgLy8gbm90IGxlYXAKLSAgICAgICAgICAgICAgICAiMTkwMC0wMy0yOFQwMDowMDowMFoiLCAvLyBub3QgbGVhcAotICAgICAgICAgICAgICAgICItNDcxMi0wMS0wMVQwMDowMDowMFoiLAotICAgICAgICAgICAgICAgICIxOTk5LTAxLTAxVDAwOjAwOjAwKzAxOjAwIiwKLSAgICAgICAgICAgICAgICAiMjAwMS0xMi0zMVQyMzo1OTo1OS4wMTAiLAotICAgICAgICAgICAgICAgICIyMDAxLTEyLTMxVDIzOjU5OjU5Ljk5OTkwMTAwMCIsCi0gICAgICAgICAgICAgICAgIjE5OTktMTItMzFUMjM6NTk6NTkuMTIzNDU2Nzg5MC0xNDowMCIsCi0gICAgICAgICAgICAgICAgIjE5OTItMTItMzFUMjM6NTk6NTkuMDEtMTQ6MDAiLAotICAgICAgICAgICAgICAgICIxOTY1LTEyLTMxVDIzOjU5OjU5LjAwMFoiLAotICAgICAgICAgICAgICAgICIwMDAwLTEyLTMxVDA0OjM1OjIyLjQ1NiIsCi0gICAgICAgICAgICAgICAgIjE2OTYtMDktMDFUMDA6MDA6MDBaIiwKLSAgICAgICAgICAgICAgICAiMTY5Ny0wMi0wMVQwMDowMDowMFoiLAotICAgICAgICAgICAgICAgICIxOTAzLTAzLTAxVDAwOjAwOjAwWiIsCi0gICAgICAgICAgICAgICAgIjE5MDMtMDctMDFUMDA6MDA6MDBaIiwKLSAgICAgICAgICAgICAgICAiMTY5Ni0wOS0wMVQwMDowMDowMCswMDowMCIsCi0gICAgICAgICAgICAgICAgIjE2OTctMDItMDFUMDA6MDA6MDAtMDA6MDAiLAotICAgICAgICAgICAgICAgICIyMDAyIiwKLSAgICAgICAgICAgICAgICAiLTAwMDEiLAotICAgICAgICAgICAgICAgICItLTEyIiwKLSAgICAgICAgICAgICAgICAiLTAwMDEtMTEiLAotICAgICAgICAgICAgICAgICIyMDAyLTAxIiwKLSAgICAgICAgICAgICAgICAiLS0tMzEiLAotICAgICAgICAgICAgICAgICIxNTU0LS0zMSIsCi0gICAgICAgICAgICAgICAgIi0wMDA0LS0zMSIsCi0gICAgICAgICAgICAgICAgIi0tMDItMjkiLAotICAgICAgICAgICAgICAgICItLTEyLTMxIiwKLSAgICAgICAgICAgICAgICAiMjAwMi0wNC0xOCIsCi0gICAgICAgICAgICAgICAgIi0wNDIzLTEyLTMxIiwKLSAgICAgICAgICAgICAgICAiMjM6NTk6NTkiLAotICAgICAgICAgICAgICAgICIwMDowMDowMCIsCi0gICAgICAgICAgICAgICAgIjIwMTBUMjM6NTk6NTkiLAotICAgICAgICAgICAgICAgICItMDAwMVQwMDowMDowMCIsCi0gICAgICAgICAgICAgICAgIi0tMTJUMjM6NTk6NTkiLAotICAgICAgICAgICAgICAgICItMDAwMS0xMVQwMDowMDowMCIsCi0gICAgICAgICAgICAgICAgIjIwMTEtMDFUMjM6NTk6NTkiLAotICAgICAgICAgICAgICAgICItLS0zMVQwMDowMDowMCIsCi0gICAgICAgICAgICAgICAgIjIwMDItLTMxVDIzOjU5OjU5IiwKLSAgICAgICAgICAgICAgICAiLTAwMDQtLTMxVDAwOjAwOjAwIiwKLSAgICAgICAgICAgICAgICAiMjAwMi0wMi0xOFQyMzo1OTo1OSIsCi0gICAgICAgICAgICAgICAgIi0wNDIzLTEyLTMxVDAwOjAwOjAwIiwKLSAgICAgICAgICAgICAgICAiMjAwMloiLAotICAgICAgICAgICAgICAgICItMDAwMSswMTozMCIsCi0gICAgICAgICAgICAgICAgIi0tMTItMTQ6MDAiLAotICAgICAgICAgICAgICAgICItMDAwMS0xMVoiLAotICAgICAgICAgICAgICAgICIxOTcwLTEyLTAxOjAwIiwKLSAgICAgICAgICAgICAgICAiLS0tMzErMDE6MzAiLAotICAgICAgICAgICAgICAgICIyMDAyLS0zMVoiLAotICAgICAgICAgICAgICAgICItLTAzLTMxLTAzOjAwIiwKLSAgICAgICAgICAgICAgICAiLS0wNC0zMCswNTowMCIsCi0gICAgICAgICAgICAgICAgIi0wMDA0LS0zMS0wMTowMCIsCi0gICAgICAgICAgICAgICAgIjIwMDItMDQtMTgtMTQ6MDAiLAotICAgICAgICAgICAgICAgICItMDQyMy0xMi0zMVoiLAotICAgICAgICAgICAgICAgICIyMzo1OTo1OS0wMTowMCIsCi0gICAgICAgICAgICAgICAgIjAwOjAwOjAwWiIsCi0gICAgICAgICAgICAgICAgIjAwOjAwOjAwKzAxOjMwIiwKLSAgICAgICAgICAgICAgICAiMTc3NlQyMzo1OTo1OS0xNDowMCIsCi0gICAgICAgICAgICAgICAgIi0wMDAxVDAwOjAwOjAwWiIsCi0gICAgICAgICAgICAgICAgIi0tMTJUMjM6NTk6NTkrMDE6MzAiLAotICAgICAgICAgICAgICAgICItMDAwMS0xMVQwMDowMDowMC0wMTowMCIsCi0gICAgICAgICAgICAgICAgIjIwMDItMDJUMjM6NTk6NTlaIiwKLSAgICAgICAgICAgICAgICAiLS0tMzFUMDA6MDA6MDAtMTQ6MDAiLAotICAgICAgICAgICAgICAgICIyMDAyLS0zMVQyMzo1OTo1OS0wMTowMCIsCi0gICAgICAgICAgICAgICAgIi0wMDA0LS0zMVQwMDowMDowMCswMTozMCIsCi0gICAgICAgICAgICAgICAgIjIwMDItMDQtMThUMjM6NTk6NTlaIiwKLSAgICAgICAgICAgICAgICAiLTA0MjMtMTItMzFUMDA6MDA6MDAtMDU6MDAiLAotICAgICAgICAgICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzVGltZShHRHVyYXRpb24gZ2QpCi0gICAgewotICAgICAgICByZXR1cm4gZ2QuZ2V0SG91cigpICE9IDAgfHwgZ2QuZ2V0TWludXRlKCkgIT0gMCB8fCBnZC5nZXRTZWNvbmQoKSAhPSAwIHx8IGdkLmdldEZyYWN0aW9uKCkuc2lnbnVtKCkgIT0gMDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RHcmVnb3JpYW5DYWxlbmRhcigpCi0gICAgewotICAgICAgICAvLyB0aGlzIGlzIGEgY2hlY2sgb2YgRFNUIG9mZnNldHMKLSAgICAgICAgRGF0ZSBkYXRlID0gbmV3IEdEYXRlKCIyMDAyLTA0LTE4VDIzOjU5OjU5WiIpLmdldERhdGUoKTsKLSAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgZ2NhbCA9IG5ldyBYbWxDYWxlbmRhcihkYXRlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhkYXRlLCBnY2FsLmdldFRpbWUoKSk7Ci0KLSAgICAgICAgLy8gbm93IGNoZWNrIG91dCBzb21lIHRoaW5ncwotICAgICAgICBHRGF0ZSBnZCA9IG5ldyBHRGF0ZSgiMjAwMS0xMi0zMVQwNzowMDo1OS4wMTAiKTsKLSAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgZ2MgPSBnZC5nZXRDYWxlbmRhcigpOwotICAgICAgICBEYXRlIGdkZCA9IGdkLmdldERhdGUoKTsKLSAgICAgICAgRGF0ZSBnY2QgPSBnYy5nZXRUaW1lKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZ2RkLCBnY2QpOwotICAgICAgICAKLSAgICAgICAgLy8gc2V0IHVwIDIvMjksIGFuZCByZWFkIG91dCBGZWIgMjkgaW4gdGhlIHllYXIgMSBCQy4KLSAgICAgICAgQ2FsZW5kYXIgZ3JlZ2NhbCA9IG5ldyBHRGF0ZSgiLS0wMi0yOSIpLmdldENhbGVuZGFyKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjksIGdyZWdjYWwuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIgLSAxLCBncmVnY2FsLmdldChDYWxlbmRhci5NT05USCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGdyZWdjYWwuZ2V0KENhbGVuZGFyLllFQVIpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBncmVnY2FsLmdldChDYWxlbmRhci5FUkEpKTsKLSAgICAgICAgLy8gcmVwZWF0IHNvbWUgdGVzdHMgdG8gbWFrZSBzdXJlIGl0J3Mgc3RhYmxlLgotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDI5LCBncmVnY2FsLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyIC0gMSwgZ3JlZ2NhbC5nZXQoQ2FsZW5kYXIuTU9OVEgpKTsKLQotICAgICAgICAvLyBub3cgdHJ5IHNvbWUgc2V0dGVycwotICAgICAgICBncmVnY2FsID0gbmV3IEdEYXRlKCItLTAyLTI5IikuZ2V0Q2FsZW5kYXIoKTsKLSAgICAgICAgZ3JlZ2NhbC5zZXQoQ2FsZW5kYXIuTU9OVEgsIDEwKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiLS0xMS0yOSIsIGdyZWdjYWwudG9TdHJpbmcoKSk7Ci0gICAgICAgIC8vIHJlcGVhdCB0byBlbnN1cmUgaXQncyBzdGFibGUuCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIi0tMTEtMjkiLCBncmVnY2FsLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0VmFsaWREdXJhdGlvbigpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkRHVyYXRpb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBHRHVyYXRpb24gZ2QgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIHN0ciA9IHZhbGlkRHVyYXRpb25zW2ldOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2QgPSBuZXcgR0R1cmF0aW9uKHN0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlByb2JsZW0gd2l0aCAiICsgc3RyICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc3RyLCBnZC50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB2YWxpZER1cmF0aW9ucy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBHRHVyYXRpb24gZ2QyID0gbnVsbDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3RyMiA9IHZhbGlkRHVyYXRpb25zW2pdOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZ2QyID0gbmV3IEdEdXJhdGlvbihzdHIyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlByb2JsZW0gd2l0aCAiICsgc3RyMiArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHN1YnRyYWN0aW5nIHR3byB3YXlzIHdvcmtzCi0gICAgICAgICAgICAgICAgR0R1cmF0aW9uIGRpZmYgPSBnZC5zdWJ0cmFjdChnZDIpOwotICAgICAgICAgICAgICAgIEdEdXJhdGlvbkJ1aWxkZXIgZ2RiID0gbmV3IEdEdXJhdGlvbkJ1aWxkZXIoZ2QyKTsKLSAgICAgICAgICAgICAgICBnZGIuc2V0U2lnbigtZ2RiLmdldFNpZ24oKSk7Ci0gICAgICAgICAgICAgICAgZ2RiLmFkZEdEdXJhdGlvbihnZCk7Ci0gICAgICAgICAgICAgICAgR0R1cmF0aW9uIHN1bTIgPSBnZGIudG9HRHVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGRpZmYuY29tcGFyZVRvR0R1cmF0aW9uKHN1bTIpKTsKLSAgICAgICAgICAgICAgICBnZGIubm9ybWFsaXplKCk7Ci0gICAgICAgICAgICAgICAgR0R1cmF0aW9uQnVpbGRlciBnZGIxID0gbmV3IEdEdXJhdGlvbkJ1aWxkZXIoZGlmZik7Ci0gICAgICAgICAgICAgICAgZ2RiMS5ub3JtYWxpemUoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJQcm9ibGVtOiAiICsgZ2QgKyAiIGFuZCAiICsgZ2QyLCBnZGIudG9TdHJpbmcoKSwgZ2RiMS50b1N0cmluZygpKTsKLQotCi0gICAgICAgICAgICAgICAgLy8gY29tcGFyaW5nIGlzIHJldmVyc2libGUKLSAgICAgICAgICAgICAgICBpbnQgY29tcDEgPSBnZC5jb21wYXJlVG9HRHVyYXRpb24oZ2QyKTsKLSAgICAgICAgICAgICAgICBpbnQgY29tcDIgPSBnZDIuY29tcGFyZVRvR0R1cmF0aW9uKGdkKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcDEgPT0gMikKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBjb21wMik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC1jb21wMSwgY29tcDIpOwotCi0gICAgICAgICAgICAgICAgLy8gY29tcGFyaW5nIHRyYW5zbGF0ZXMgdG8gYWRkaXRpb24gdG8gZGF0ZXMKLSAgICAgICAgICAgICAgICBib29sZWFuW10gc2VlbiA9IG5ldyBib29sZWFuWzNdOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB2YWxpZERhdGVzLmxlbmd0aDsgaysrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgR0RhdGUgZGF0ZSA9IG5ldyBHRGF0ZSh2YWxpZERhdGVzW2tdKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRlLmhhc0RhdGUoKSB8fCBkYXRlLmdldFllYXIoKSA+IDk5OTk5IHx8IGRhdGUuZ2V0WWVhcigpIDwgLTQwMDApCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChoYXNUaW1lKGdkKSB8fCBoYXNUaW1lKGdkMikpICYmICFkYXRlLmhhc1RpbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyAiICsgZ2QgKyAiIGFuZCAiICsgZ2QyICsgIiB0byAiICsgZGF0ZSArICIsIGV4cGVjdGluZyAiICsgY29tcDEpOwotICAgICAgICAgICAgICAgICAgICBHRGF0ZSBkYXRlMSA9IGRhdGUuYWRkKGdkKTsKLSAgICAgICAgICAgICAgICAgICAgR0RhdGUgZGF0ZTIgPSBkYXRlLmFkZChnZDIpOwotCi0gICAgICAgICAgICAgICAgICAgIGNvbXAyID0gZGF0ZTEuY29tcGFyZVRvR0RhdGUoZGF0ZTIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcDEgIT0gMikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiQWRkaW5nICIgKyBkYXRlICsgIiArICIgKyBnZCArICIgLT4gIiArIGRhdGUxICsgIiwgIiArIGdkMiArICIgLT4gIiArIGRhdGUyICsgIiwgZXhwZWN0aW5nICIgKyBjb21wMSwgY29tcDEsIGNvbXAyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvbXAyICE9IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2Vlbltjb21wMiArIDFdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHN1YnRyYWN0aW9uIHNob3VsZCB5ZWlsZCB0aGUgc2FtZSByZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAxICE9IDIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdEYXRlIGRhdGUzID0gZGF0ZS5hZGQoZGlmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGNvbXAxLCBkYXRlMy5jb21wYXJlVG9HRGF0ZShkYXRlKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29tcDEgPT0gMikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzZWVuY291bnQgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHNlZW4ubGVuZ3RoOyBrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VlbltrXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVuY291bnQgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIk5vdCBhbWJpZ3VvdXMgYXMgYWR2ZXJ0aXNlZCIgLyogKyBnZCArICIsICIgKyBnZDIgKyAiIGQ6ICIgKyBkaWZmICovLCBzZWVuY291bnQgPiAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdE9yZGVyKCkKLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiMTk5OC0wOC0yNiIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjAwMS0wOC0wNiIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiMTk3MC0xMi0yMFQwNDoxNDoyMloiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjE5NzEtMDQtMThUMTI6NTE6NDFaIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIjIwMDEtMDgtMDYiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIwMDEtMDgtMDZaIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIjIwMDEtMDgtMDYiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIwMDEtMDgtMDcrMTA6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5ldyBHRGF0ZSgiMjAwMS0wOC0wNiIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjAwMS0wOC0wNS0xMDowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCIyMDAxLTAyLTI4IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDAxLTAzLTAxKzEwOjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIjIwMDEtMDMtMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIwMDEtMDItMjgtMTA6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIjIwMDAtMDItMjgiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIwMDAtMDMtMDErMTA6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5ldyBHRGF0ZSgiMjAwMC0wMy0wMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjAwMC0wMi0yOC0xMDowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiMjAwMS0wOC0wNloiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIwMDEtMDgtMDYtMDA6MDEiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG5ldyBHRGF0ZSgiMDA6MDA6MDBaIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIwMDowMTowMCswMDowMSIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbmV3IEdEYXRlKCIxMjowMDowMC0wNTowMCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMDk6MDA6MDAtMDg6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIjA5OjAwOjAwLTA1OjAwIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIwOTowMDowMC0wODowMCIpKSk7IC8vIHRoZSBlYXN0IGNvYXN0IHJpc2VzIGJlZm9yZSB0aGUgd2VzdAotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIjIwMDMtMDUtMDVUMDk6MDA6MDAtMDU6MDAiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIwMDMtMDUtMDVUMDk6MDA6MDAtMDg6MDAiKSkpOyAvLyB0aGUgZWFzdCBjb2FzdCByaXNlcyBiZWZvcmUgdGhlIHdlc3QKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCItLS0wMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMzEiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIi0tLTAxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLS0zMSsxNDowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiLS0tMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTMxLTE0OjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuZXcgR0RhdGUoIi0tLTMxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLS0wMSIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmV3IEdEYXRlKCItLS0zMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMDErMTQ6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5ldyBHRGF0ZSgiLS0tMzEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTAxLTE0OjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCItLS0wMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMDIiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5ldyBHRGF0ZSgiLS0tMDIiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTAxIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCItLS0wMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMDJaIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuZXcgR0RhdGUoIi0tLTAyIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLS0wMVoiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5ldyBHRGF0ZSgiLS0tMDIiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTAxLTEwOjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIi0tLTAxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLS0wMisxMDowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmV3IEdEYXRlKCItLS0wMiIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMDEtMDk6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIi0tLTAxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLS0wMiswOTowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbmV3IEdEYXRlKCItLS0wMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMDEiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIjIwMDMiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIwMDQiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIi0tMTEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tMTIiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIjIwMDMtMTIiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIwMDQtMDEiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIi0tMTEtMzAiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tMTItMDEiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIi0tMDItMjgiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tMDItMjkiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIi0tMDItMjkiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tMDMtMDEiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5ldyBHRGF0ZSgiLS0wMi0yOSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0wMy0wMSsxMDowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCItLTAyLTI4IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLTAzLTAxKzEwOjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIi0tMDMtMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tMDItMjgtMTA6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5ldyBHRGF0ZSgiLS0wMy0wMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0wMi0yOS0xMDowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiLS0wMi0yOSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0wMy0wMSswOTowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiLS0wMi0yOCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0wMy0wMSswOTowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmV3IEdEYXRlKCItLTAzLTAxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLTAyLTI4LTA5OjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuZXcgR0RhdGUoIi0tMDMtMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tMDItMjktMDk6MDAiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIjAwOjAwOjAwIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMzo1OTo1OSIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiMDA6MDA6MDAiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIzOjU5OjU5KzA5OjU5IikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCIwMDowMDowMCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjM6NTk6MDErMDk6NTkiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5ldyBHRGF0ZSgiMDA6MDA6MDAiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIzOjU5OjAwKzA5OjU5IikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIjAwOjAwOjAwIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMzo1OTo1OSsxMDowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiMDA6MDA6MDAiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIzOjU5OjU5LTE0OjAwIikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuZXcgR0RhdGUoIjIzOjU5OjU5IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIwMDowMDowMC0wOTo1OSIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmV3IEdEYXRlKCIyMzo1OTo1OSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMDA6MDA6NTgtMDk6NTkiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5ldyBHRGF0ZSgiMjM6NTk6NTkiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjAwOjAwOjU5LTA5OjU5IikpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIjIzOjU5OjU5IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIwMDowMDowMC0xMDowMCIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmV3IEdEYXRlKCIyMzo1OTo1OSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMDA6MDA6MDArMTQ6MDAiKSkpOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RGYWlsdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkRGF0ZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBzdHIgPSBpbnZhbGlkRGF0ZXNbaV07Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXcgR0RhdGUoc3RyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJNaXNzaW5nIGV4Y2VwdGlvbiBmb3IgR0RhdGUgIiArIHN0ciwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZERhdGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgc3RyID0gdmFsaWREYXRlc1tpXTsKLSAgICAgICAgICAgIEdEYXRlIGdkYXRlID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdkYXRlID0gbmV3IEdEYXRlKHN0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlByb2JsZW0gd2l0aCAiICsgc3RyICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG11c3Qgcm91bmQtdHJpcCB0byBzdHJpbmcKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc3RyLCBnZGF0ZS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgLy8gbXVzdCByb3VuZC10cmlwIHRvIEdyZWdvcmlhbkNhbGVuZGFyIGlmIGZyYWN0aW9ucy1vZi1zZWNvbmRzIDw9MyBkaWdpdHMKLSAgICAgICAgICAgIGlmIChnZGF0ZS5nZXRGcmFjdGlvbigpID09IG51bGwgfHwgZ2RhdGUuZ2V0RnJhY3Rpb24oKS5zY2FsZSgpIDw9IDMpCi0gICAgICAgICAgICAgICAgaWYgKCFnZGF0ZS50b1N0cmluZygpLmVxdWFscygiLS0wMi0yOSIpKSAvLyBidWcgaW4gZ2NhbCAtPiAwMy0wMQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjYWwgPSBnZGF0ZS5nZXRDYWxlbmRhcigpOwotICAgICAgICAgICAgICAgIEdEYXRlIGdkYXRlMiA9IG5ldyBHRGF0ZShnY2FsKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGdkYXRlLCBnZGF0ZTIpOwotCi0gICAgICAgICAgICAgICAgLy8gYW5kIGlmIGZyYWN0aW9ucy1vZi1zZWNvbmRzIGlzIDMgZGlnaXRzLCBzdHJpbmdyZXAgbXVzdCByb3VuZC10cmlwCi0gICAgICAgICAgICAgICAgaWYgKGdkYXRlLmdldEZyYWN0aW9uKCkgPT0gbnVsbCB8fCBnZGF0ZS5nZXRGcmFjdGlvbigpLnNjYWxlKCkgPT0gMyB8fCBnZGF0ZS5nZXRGcmFjdGlvbigpLnNjYWxlKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhnZGF0ZS50b1N0cmluZygpLCBnZGF0ZTIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG11c3Qgcm91bmQtdHJpcCB0byBEYXRlIGlmIGFic29sdXRlIHRpbWUrdGltZXpvbmUgKyBmcmFjdGlvbnMtb2Ytc2Vjb25kcyA8PSAzCi0gICAgICAgICAgICBpZiAoZ2RhdGUuaGFzVGltZVpvbmUoKSAmJiBnZGF0ZS5nZXRZZWFyKCkgPiAtNDAwMCAmJiBnZGF0ZS5nZXRZZWFyKCkgPCA5OTk5OSAmJiBnZGF0ZS5nZXRCdWlsdGluVHlwZUNvZGUoKSA9PSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUUgJiYgZ2RhdGUuZ2V0RnJhY3Rpb24oKS5zY2FsZSgpIDw9IDMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRGF0ZSBkYXRlID0gZ2RhdGUuZ2V0RGF0ZSgpOwotICAgICAgICAgICAgICAgIEdEYXRlIGdkYXRlMiA9IG5ldyBHRGF0ZShkYXRlKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGdkYXRlLCBnZGF0ZTIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSB0byBVVEMgZnJhY3Rpb25zLW9mLXNlY29uZHMgaXMgMCBvciAzIGRpZ2l0cyBbbm90IDAwMF0sIHN0cmluZ3JlcCBtdXN0IHJvdW5kLXRyaXAKLSAgICAgICAgICAgICAgICBpZiAoZ2RhdGUuZ2V0VGltZVpvbmVTaWduKCkgPT0gMCAmJiAoKGdkYXRlLmdldEZyYWN0aW9uKCkuc2NhbGUoKSA9PSAzICYmIGdkYXRlLmdldEZyYWN0aW9uKCkuc2lnbnVtKCkgIT0gMCkgfHwgZ2RhdGUuZ2V0RnJhY3Rpb24oKS5zY2FsZSgpID09IDApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgR0RhdGVCdWlsZGVyIGdkYiA9IG5ldyBHRGF0ZUJ1aWxkZXIoZ2RhdGUyKTsKLSAgICAgICAgICAgICAgICAgICAgZ2RiLm5vcm1hbGl6ZVRvVGltZVpvbmUoMCwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZ2RhdGUudG9TdHJpbmcoKSwgZ2RiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IGdvaW5nIHRocm91Z2ggZ2NhbCBnaXZlcyB1cyB0aGUgc2FtZSB0aGluZwotICAgICAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjYWwgPSBnZGF0ZS5nZXRDYWxlbmRhcigpOwotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZGF0ZSwgZ2NhbC5nZXRUaW1lKCkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGRvdWJsZS1jaGVjayBYbWxDYWxlbmRhciBjb25zdHJ1Y3RvcgotICAgICAgICAgICAgICAgIGdjYWwgPSBuZXcgWG1sQ2FsZW5kYXIoZGF0ZSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRG9pbmcgIiArIGdkYXRlLCBkYXRlLCBnY2FsLmdldFRpbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChnZGF0ZS5oYXNEYXRlKCkgJiYgKGdkYXRlLmdldEZyYWN0aW9uKCkgPT0gbnVsbCB8fCBnZGF0ZS5nZXRGcmFjdGlvbigpLnNjYWxlKCkgPD0gMykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBhYmxlIHRvIGdldCBhIGRhdGUgaWYgdGltZSt0aW1lem9uZSBpcyB1bnNldCAobWlkbmlnaHQsIGx0eiBhcmUgYXNzdW1lZCkKLSAgICAgICAgICAgICAgICBEYXRlIGRhdGUgPSBnZGF0ZS5nZXREYXRlKCk7Ci0gICAgICAgICAgICAgICAgR0RhdGVCdWlsZGVyIGdkYXRlMSA9IG5ldyBHRGF0ZUJ1aWxkZXIoZ2RhdGUpOwotICAgICAgICAgICAgICAgIGlmICghZ2RhdGUxLmhhc1RpbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgZ2RhdGUxLnNldFRpbWUoMCwgMCwgMCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhnZGF0ZTEuZ2V0RGF0ZSgpLCBkYXRlKTsKLQotICAgICAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IGdvaW5nIHRocm91Z2ggZ2NhbCBnaXZlcyB1cyB0aGUgc2FtZSB0aGluZwotICAgICAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjYWwgPSBnZGF0ZS5nZXRDYWxlbmRhcigpOwotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkNvbXBhcmluZyAiICsgZ2RhdGUgKyAiIGFuZCAiICsgZ2NhbCwgZGF0ZSwgZ2NhbC5nZXRUaW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0lERUN1cnNvclVzYWdlVGVzdC5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0lERUN1cnNvclVzYWdlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmEyZjFhLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9JREVDdXJzb3JVc2FnZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBUZXN0cyBhIHNpbXBsZSB1c2FnZSBvZiB0aGUgY3Vyc29yIEknbSBoYXZpbmcgdHJvdWJsZSB3aXRoIGluIElERSBjb2RlLgotICovCi1wdWJsaWMgY2xhc3MgSURFQ3Vyc29yVXNhZ2VUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgSURFQ3Vyc29yVXNhZ2VUZXN0KFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShJREVDdXJzb3JVc2FnZVRlc3QuY2xhc3MpOyB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0Q2FzZUZpbGUoU3RyaW5nIHRoZUNhc2UpCi0gICAgewotICAgICAgICByZXR1cm4gVGVzdEVudi54YmVhbkNhc2UoInN0b3JlLyIgKyB0aGVDYXNlKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgWG1sQ3Vyc29yIGxvYWRDYXNlKFN0cmluZyB0aGVDYXNlKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoZ2V0Q2FzZUZpbGUodGhlQ2FzZSkpLm5ld0N1cnNvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTY2FuRWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjdXJzb3IgPSBsb2FkQ2FzZSgiQ29uc29saWRhdGVUZXN0LnhtbCIpOwotICAgICAgICBjdXJzb3IudG9GaXJzdENoaWxkKCk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IGN1cnNvci5uZXdDdXJzb3IoKTsKLQotICAgICAgICAvLyBiYWNrIHVwIHRvIHByZXZpb3VzIHN0YXJ0IG9yIGVuZCB0YWcKLSAgICAgICAgd2hpbGUgKCFpc1N0YXJ0T3JFbmQoY3VyLnRvUHJldlRva2VuKCkpKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQmFja2luZyB1cDogYXQgIiArIGN1ci5jdXJyZW50VG9rZW5UeXBlKCkpOyB9Ci0gICAgICAgIC8vIHRoZW4gZm9yd2FyZCB0byBmaXJzdCBzdGFydCBvciBjb21tZW50IChtYXkgZW5kIHVwIHdoZXJlIHdlIHN0YXJ0ZWQpCi0gICAgICAgIHdoaWxlICghaXNTdGFydE9yQ29tbWVudChjdXIudG9OZXh0VG9rZW4oKSkpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBZHZhbmNpbmc6IGF0ICIgKyBjdXIuY3VycmVudFRva2VuVHlwZSgpKTsgfQotICAgICAgICAvLyB0aGVuIGdyYWIgdGhlICJzdGFydCIgamF2ZWxpbiBhbm5vdGF0aW9uLCBhbmQgZ3JhYiB0aGUgc3RhcnQgdG9rZW4gYW5kIHRoZSBmaXJzdCBjaGFyCi0gICAgICAgIC8vIF9maXJzdFRva2VuID0gKChKYXZlbGluQW5ub3RhdGlvbiljdXIuZ2V0QW5ub3RhdGlvbihKYXZlbGluQW5ub3RhdGlvbi5jbGFzcykpLmdldFN0YXJ0VG9rZW4oKTsKLQotICAgICAgICAvLyBub3cgcGVlayBhdCB0aGUgZW5kIHRhZyAoaXQgbWF5IGJlIHVucGxhY2VkIGZvciB0aGUgPGEvPiBjYXNlLCBzbyB1c2UgdGhlIHN0YXJ0IHRhZyBpZiBuZWVkZWQKLSAgICAgICAgY3VyLnRvQ3Vyc29yKGN1cnNvcik7Ci0gICAgICAgIC8vIF9sYXN0VG9rZW4gPSAoKEphdmVsaW5Bbm5vdGF0aW9uKWN1ci5nZXRBbm5vdGF0aW9uKEphdmVsaW5Bbm5vdGF0aW9uLmNsYXNzKSkuZ2V0RW5kVG9rZW4oKTsKLSAgICAgICAgY3VyLnRvRW5kVG9rZW4oKTsKLSAgICAgICAgLy8gSmF2ZWxpbkFubm90YXRpb24gZW5kQW5uID0gKEphdmVsaW5Bbm5vdGF0aW9uKWN1ci5nZXRBbm5vdGF0aW9uKEphdmVsaW5Bbm5vdGF0aW9uLmNsYXNzKTsKLSAgICAgICAgLy8gaWYgKGVuZEFubiAhPSBudWxsKQotICAgICAgICAvLyAgICBfbGFzdFRva2VuID0gZW5kQW5uLmdldEVuZFRva2VuKCk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc1N0YXJ0T3JFbmQoWG1sQ3Vyc29yLlRva2VuVHlwZSB0b2tUeXBlKQotICAgIHsKLSAgICAgICAgc3dpdGNoICh0b2tUeXBlLmludFZhbHVlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgWG1sQ3Vyc29yLlRva2VuVHlwZS5JTlRfRU5EOgotICAgICAgICAgICAgY2FzZSBYbWxDdXJzb3IuVG9rZW5UeXBlLklOVF9FTkRET0M6Ci0gICAgICAgICAgICBjYXNlIFhtbEN1cnNvci5Ub2tlblR5cGUuSU5UX1NUQVJUOgotICAgICAgICAgICAgY2FzZSBYbWxDdXJzb3IuVG9rZW5UeXBlLklOVF9TVEFSVERPQzoKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc1N0YXJ0T3JDb21tZW50KFhtbEN1cnNvci5Ub2tlblR5cGUgdG9rVHlwZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAodG9rVHlwZS5pbnRWYWx1ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFhtbEN1cnNvci5Ub2tlblR5cGUuSU5UX1NUQVJUOgotICAgICAgICAgICAgY2FzZSBYbWxDdXJzb3IuVG9rZW5UeXBlLklOVF9TVEFSVERPQzoKLSAgICAgICAgICAgIGNhc2UgWG1sQ3Vyc29yLlRva2VuVHlwZS5JTlRfQ09NTUVOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvSW50VGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9JbnRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzhhYjZhLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9JbnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCB4aW50LnRlc3QuUG9zaXRpb25Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIEludFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgSW50VGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKEludFRlc3RzLmNsYXNzKTsgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RMYXRMb25nKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUG9zaXRpb25Eb2N1bWVudCBkb2MgPSBQb3NpdGlvbkRvY3VtZW50LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgIjxwOnBvc2l0aW9uIHhtbG5zOnA9J2phdmE6aW50LnRlc3QnPjxwOmxhdD40MzwvcDpsYXQ+PHA6bG9uPjAyMDwvcDpsb24+PC9wOnBvc2l0aW9uPiIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQzLCBkb2MuZ2V0UG9zaXRpb24oKS5nZXRMYXQoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAsIGRvYy5nZXRQb3NpdGlvbigpLmdldExvbigpKTsKLSAgICAgICAgZG9jLmdldFBvc2l0aW9uKCkueGdldExhdCgpLnNldCgiMDciKTsKLSAgICAgICAgZG9jLmdldFBvc2l0aW9uKCkueGdldExvbigpLnNldCgiMDQwIik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNywgZG9jLmdldFBvc2l0aW9uKCkuZ2V0TGF0KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwLCBkb2MuZ2V0UG9zaXRpb24oKS5nZXRMb24oKSk7Ci0gICAgICAgIGRvYy5nZXRQb3NpdGlvbigpLnNldExhdCgoc2hvcnQpMjIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9MaXN0QW5kVW5pb25UZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0xpc3RBbmRVbmlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2Q4NjYuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0xpc3RBbmRVbmlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLm9wZW51cmkubHV0Lkxpc3RzRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLm9wZW51cmkubHV0LlVuaW9uc0RvY3VtZW50OwotaW1wb3J0IG9yZy5vcGVudXJpLmx1dC5JbmNpZGVudFJlcG9ydHNEb2N1bWVudDsKLWltcG9ydCBvcmcub3BlbnVyaS5sdXQuRGF0ZU9yRGF0ZVRpbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGF0ZVRpbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDYWxlbmRhcjsKLQotcHVibGljIGNsYXNzIExpc3RBbmRVbmlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgTGlzdEFuZFVuaW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKExpc3RBbmRVbmlvblRlc3RzLmNsYXNzKTsgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExpc3RHZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTGlzdHNEb2N1bWVudCBsaXN0cyA9IExpc3RzRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGx1dDpsaXN0cyB4bWxuczpsdXQ9J2h0dHA6Ly9vcGVudXJpLm9yZy9sdXQnPjxsdXQ6aW50LWxpc3Q+MiA0IDggMTYgMzI8L2x1dDppbnQtbGlzdD48bHV0Om5uaS1saXN0PnVuYm91bmRlZCAzIHVuYm91bmRlZCA2PC9sdXQ6bm5pLWxpc3Q+PC9sdXQ6bGlzdHM+Iik7Ci0gICAgICAgIExpc3QgaW50TGlzdCA9IGxpc3RzLmdldExpc3RzKCkuZ2V0SW50TGlzdCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDIpLCBpbnRMaXN0LmdldCgwKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNCksIGludExpc3QuZ2V0KDEpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig4KSwgaW50TGlzdC5nZXQoMikpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE2KSwgaW50TGlzdC5nZXQoMykpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDMyKSwgaW50TGlzdC5nZXQoNCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUsIGludExpc3Quc2l6ZSgpKTsKLQotICAgICAgICBMaXN0IG5uaUxpc3QgPSBsaXN0cy5nZXRMaXN0cygpLmdldE5uaUxpc3QoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygidW5ib3VuZGVkIiwgbm5pTGlzdC5nZXQoMCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigzKSwgbm5pTGlzdC5nZXQoMSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ1bmJvdW5kZWQiLCBubmlMaXN0LmdldCgyKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDYpLCBubmlMaXN0LmdldCgzKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNCwgbm5pTGlzdC5zaXplKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0U2V0dGVycygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIExpc3RzRG9jdW1lbnQgZG9jID0gTGlzdHNEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIExpc3RzRG9jdW1lbnQuTGlzdHMgbGlzdHMgPSBkb2MuYWRkTmV3TGlzdHMoKTsKLSAgICAgICAgbGlzdHMuc2V0SW50TGlzdChBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKDQpLCBuZXcgSW50ZWdlcigxOCkgfSkpOwotICAgICAgICBsaXN0cy5zZXRObmlMaXN0KEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsgQmlnSW50ZWdlci52YWx1ZU9mKDEpLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMiksICJ1bmJvdW5kZWQiIH0pKTsKLSAgICAgICAgU3RyaW5nIHh0ZXh0ID0gZG9jLnhtbFRleHQoKTsKLQotICAgICAgICBMaXN0c0RvY3VtZW50IGRvY3J0ID0gTGlzdHNEb2N1bWVudC5GYWN0b3J5LnBhcnNlKHh0ZXh0KTsKLSAgICAgICAgTGlzdCBpbnRMaXN0ID0gZG9jcnQuZ2V0TGlzdHMoKS5nZXRJbnRMaXN0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNCksIGludExpc3QuZ2V0KDApKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxOCksIGludExpc3QuZ2V0KDEpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBpbnRMaXN0LnNpemUoKSk7Ci0KLSAgICAgICAgTGlzdCBubmlMaXN0ID0gZG9jcnQuZ2V0TGlzdHMoKS5nZXRObmlMaXN0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDEpLCBubmlMaXN0LmdldCgwKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDIpLCBubmlMaXN0LmdldCgxKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInVuYm91bmRlZCIsIG5uaUxpc3QuZ2V0KDIpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzLCBubmlMaXN0LnNpemUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVuaW9uR2V0dGVycygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFVuaW9uc0RvY3VtZW50IHVuaW9ucyA9IFVuaW9uc0RvY3VtZW50LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxsdXQ6dW5pb25zIHhtbG5zOmx1dD0naHR0cDovL29wZW51cmkub3JnL2x1dCc+PGx1dDpubmk+dW5ib3VuZGVkPC9sdXQ6bm5pPjxsdXQ6c2l6ZXM+MiAzIDUgNyAxMTwvbHV0OnNpemVzPjwvbHV0OnVuaW9ucz4iKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ1bmJvdW5kZWQiLCB1bmlvbnMuZ2V0VW5pb25zKCkuZ2V0Tm5pKCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHVuaW9ucy5nZXRVbmlvbnMoKS5nZXRTaXplcygpIGluc3RhbmNlb2YgTGlzdCk7Ci0gICAgICAgIExpc3Qgc2l6ZXMgPSAoTGlzdCl1bmlvbnMuZ2V0VW5pb25zKCkuZ2V0U2l6ZXMoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigyKSwgc2l6ZXMuZ2V0KDApKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigzKSwgc2l6ZXMuZ2V0KDEpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1KSwgc2l6ZXMuZ2V0KDIpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig3KSwgc2l6ZXMuZ2V0KDMpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMSksIHNpemVzLmdldCg0KSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNSwgc2l6ZXMuc2l6ZSgpKTsKLQotICAgICAgICBVbmlvbnNEb2N1bWVudCB1bmlvbnMyID0gVW5pb25zRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGx1dDp1bmlvbnMgeG1sbnM6bHV0PSdodHRwOi8vb3BlbnVyaS5vcmcvbHV0Jz48bHV0Om5uaT4zNzwvbHV0Om5uaT48bHV0OnNpemVzPmFsbDwvbHV0OnNpemVzPjwvbHV0OnVuaW9ucz4iKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigzNyksIHVuaW9uczIuZ2V0VW5pb25zKCkuZ2V0Tm5pKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJhbGwiLCB1bmlvbnMyLmdldFVuaW9ucygpLmdldFNpemVzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmlvblNldHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotCi0gICAgICAgIC8vIGNyZWF0ZSBhIGRvY3VtZW50Ci0gICAgICAgIFVuaW9uc0RvY3VtZW50IGRvYyA9IFVuaW9uc0RvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgVW5pb25zRG9jdW1lbnQuVW5pb25zIHVuaW9ucyA9IGRvYy5hZGROZXdVbmlvbnMoKTsKLSAgICAgICAgdW5pb25zLnNldE5uaSgidW5ib3VuZGVkIik7Ci0gICAgICAgIHVuaW9ucy5zZXRTaXplcyhBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKDUpLCBuZXcgSW50ZWdlcigyMikgfSkpOwotCi0gICAgICAgIC8vIHJvdW5kIHRyaXAgdG8gcyB0ZXh0Ci0gICAgICAgIFN0cmluZyB4dGV4dCA9IGRvYy54bWxUZXh0KCk7Ci0gICAgICAgIFVuaW9uc0RvY3VtZW50IGRvY3J0ID0gVW5pb25zRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSh4dGV4dCk7Ci0KLSAgICAgICAgLy8gdmVyaWZ5IGNvbnRlbnRzCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInVuYm91bmRlZCIsIGRvY3J0LmdldFVuaW9ucygpLmdldE5uaSgpKTsKLSAgICAgICAgTGlzdCBzaXplcyA9IChMaXN0KWRvY3J0LmdldFVuaW9ucygpLmdldFNpemVzKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNSksIHNpemVzLmdldCgwKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMjIpLCBzaXplcy5nZXQoMSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIHNpemVzLnNpemUoKSk7Ci0KLSAgICAgICAgLy8gY2hhbmdlIHRoZSBvcmlnaW5hbCBkb2N1bWVudAotICAgICAgICB1bmlvbnMuc2V0Tm5pKG5ldyBJbnRlZ2VyKDExKSk7Ci0gICAgICAgIHVuaW9ucy5zZXRTaXplcygidW5rbm93biIpOwotCi0gICAgICAgIC8vIHJvdW5kIHRyaXAgaXQgYWdhaW4KLSAgICAgICAgeHRleHQgPSBkb2MueG1sVGV4dCgpOwotICAgICAgICBkb2NydCA9IFVuaW9uc0RvY3VtZW50LkZhY3RvcnkucGFyc2UoeHRleHQpOwotCi0gICAgICAgIC8vIHZlcmlmeSBjb250ZW50cyBhZ2FpbgotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigxMSksIGRvY3J0LmdldFVuaW9ucygpLmdldE5uaSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygidW5rbm93biIsIGRvY3J0LmdldFVuaW9ucygpLmdldFNpemVzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmlvbkFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSW5jaWRlbnRSZXBvcnRzRG9jdW1lbnQgZG9jID0gSW5jaWRlbnRSZXBvcnRzRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAgIjxsdXQ6aW5jaWRlbnQtcmVwb3J0cyB4bWxuczpsdXQ9J2h0dHA6Ly9vcGVudXJpLm9yZy9sdXQnPjxsdXQ6d2hlbj4yMDAxLTA4LTA2VDAzOjM0OjAwPC9sdXQ6d2hlbj48bHV0OndoZW4+MjAwMi0wMS0wNDwvbHV0OndoZW4+PGx1dDp3aGVuPjIwMDItMDgtMjZUMjM6MTA6MDA8L2x1dDp3aGVuPjwvbHV0OmluY2lkZW50LXJlcG9ydHM+Iik7Ci0gICAgICAgIEluY2lkZW50UmVwb3J0c0RvY3VtZW50LkluY2lkZW50UmVwb3J0cyByZXBvcnRzID0gZG9jLmdldEluY2lkZW50UmVwb3J0cygpOwotICAgICAgICBEYXRlT3JEYXRlVGltZVtdIGR0ID0gcmVwb3J0cy54Z2V0V2hlbkFycmF5KCk7Ci0gICAgICAgIENhbGVuZGFyW10gZ2QgPSByZXBvcnRzLmdldFdoZW5BcnJheSgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIGR0Lmxlbmd0aCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMywgZ2QubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoKChTaW1wbGVWYWx1ZSlkdFtpXSkuZ0RhdGVWYWx1ZSgpLCBuZXcgR0RhdGUoZ2RbaV0pKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZ2RbaV0sIGR0W2ldLm9iamVjdFZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgWG1sQ2FsZW5kYXIoIjIwMDEtMDgtMDZUMDM6MzQ6MDAiKSwgZ2RbMF0pOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBYbWxDYWxlbmRhcigiMjAwMi0wMS0wNCIpLCBnZFsxXSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IFhtbENhbGVuZGFyKCIyMDAyLTA4LTI2VDIzOjEwOjAwIiksIGdkWzJdKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFhtbERhdGVUaW1lLnR5cGUsIGR0WzBdLmluc3RhbmNlVHlwZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhYbWxEYXRlLnR5cGUsIGR0WzFdLmluc3RhbmNlVHlwZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhYbWxEYXRlVGltZS50eXBlLCBkdFsyXS5pbnN0YW5jZVR5cGUoKSk7Ci0KLSAgICAgICAgcmVwb3J0cy5zZXRXaGVuQXJyYXkoMCwgbmV3IFhtbENhbGVuZGFyKCIxOTgwLTA0LTE4IikpOwotICAgICAgICByZXBvcnRzLnNldFdoZW5BcnJheSgxLCBuZXcgWG1sQ2FsZW5kYXIoIjE5NzAtMTItMjBUMDQ6MzM6MDAiKSk7Ci0KLSAgICAgICAgZHQgPSByZXBvcnRzLnhnZXRXaGVuQXJyYXkoKTsKLSAgICAgICAgZ2QgPSByZXBvcnRzLmdldFdoZW5BcnJheSgpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IFhtbENhbGVuZGFyKCIxOTgwLTA0LTE4IiksIGdkWzBdKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgWG1sQ2FsZW5kYXIoIjE5NzAtMTItMjBUMDQ6MzM6MDAiKSwgZ2RbMV0pOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBYbWxDYWxlbmRhcigiMjAwMi0wOC0yNlQyMzoxMDowMCIpLCBnZFsyXSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhYbWxEYXRlLnR5cGUsIGR0WzBdLmluc3RhbmNlVHlwZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhYbWxEYXRlVGltZS50eXBlLCBkdFsxXS5pbnN0YW5jZVR5cGUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoWG1sRGF0ZVRpbWUudHlwZSwgZHRbMl0uaW5zdGFuY2VUeXBlKCkpOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvTmFtZXdvcmxkVGVzdC5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL05hbWV3b3JsZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5NGJjZi4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvTmFtZXdvcmxkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBvcmcub3BlbnVyaS5uYW1ld29ybGQuTmFtZXdvcmxkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLm9wZW51cmkubmFtZXdvcmxkLk5hbWV3b3JsZERvY3VtZW50Lk5hbWV3b3JsZDsKLWltcG9ydCBvcmcub3BlbnVyaS5uYW1ld29ybGQuTG9jOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBOYW1ld29ybGRUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgTmFtZXdvcmxkVGVzdChTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTmFtZXdvcmxkVGVzdC5jbGFzcyk7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0V29ybGQxKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTmFtZXdvcmxkRG9jdW1lbnQgZG9jID0gKE5hbWV3b3JsZERvY3VtZW50KQotICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShUZXN0RW52LnhiZWFuQ2FzZSgibmFtZXdvcmxkL3dvcmxkMS54bWwiKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgUU5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy9uYW1ld29ybGQiLCAibmFtZXdvcmxkIiksIGRvYy5zY2hlbWFUeXBlKCkuZ2V0RG9jdW1lbnRFbGVtZW50TmFtZSgpKTsKLQotICAgICAgICBRTmFtZVtdIGNvbnRlbnRzID0gbmV3IFFOYW1lW10KLSAgICAgICAgewotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vYmFyLmNvbS8iLCAiYmFyY2l0eSIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vZm9vLmNvbS8iLCAiZm9vdG93biIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vYmFyLmNvbS8iLCAiYmFydmlsbGFnZSIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vYmFyLmNvbS8iLCAiYmFydG93biIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vZm9vLmNvbS8iLCAiZm9vdmlsbGFnZSIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vYmFyLmNvbS8iLCAiYmFydmlsbGFnZSIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vZm9vLmNvbS8iLCAiZm9vY2l0eSIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vYmFyLmNvbS8iLCAiYmFydG93biIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vZm9vLmNvbS8iLCAiZm9vdmlsbGFnZSIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vZm9vLmNvbS8iLCAiZm9vdG93biIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vYmFyLmNvbS8iLCAiYmFydmlsbGFnZSIpLAotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vZm9vLmNvbS8iLCAiZm9vdmlsbGFnZSIpLAotICAgICAgICB9OwotICAgICAgICBpbnQgdCA9IDA7Ci0KLSAgICAgICAgTmFtZXdvcmxkIHdvcmxkID0gZG9jLmdldE5hbWV3b3JsZCgpOwotICAgICAgICBOYW1ld29ybGQuSXNsYW5kW10gaXNsYW5kcyA9IHdvcmxkLmdldElzbGFuZEFycmF5KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXNsYW5kcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgTG9jW10gbG9jcyA9IGlzbGFuZHNbaV0uZ2V0TG9jYXRpb25BcnJheSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsb2NzLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExvYy5SZWZlcmVuY2VbXSByZWZzID0gbG9jc1tqXS5nZXRSZWZlcmVuY2VBcnJheSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcmVmcy5sZW5ndGg7IGsrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoY29udGVudHNbdCsrXSwgcmVmc1trXS5nZXRUbygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0QWNjZXNzQnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTmFtZXdvcmxkRG9jdW1lbnQgZG9jID0gKE5hbWV3b3JsZERvY3VtZW50KQotICAgICAgICAgICAgICAgICAgICBYbWxMb2FkZXIuRmFjdG9yeS5wYXJzZShUZXN0RW52LnhiZWFuQ2FzZSgibmFtZXdvcmxkL3dvcmxkMS54bWwiKSwKLSAgICAgICAgICAgICAgICAgICAgTmFtZXdvcmxkRG9jdW1lbnQudHlwZSk7Ci0gICAgICAgIFN0cmluZ1tdIGNvbnRlbnRzID0gbmV3IFN0cmluZ1tdCi0gICAgICAgIHsKLSAgICAgICAgICAgICJodHRwOi8vZm9vLmNvbS8iLAotICAgICAgICAgICAgImZvb2NpdHkiLAotICAgICAgICAgICAgImZvb3Rvd24iLAotICAgICAgICAgICAgImZvb3ZpbGxhZ2UiLAotICAgICAgICAgICAgImh0dHA6Ly9iYXIuY29tLyIsCi0gICAgICAgICAgICAiYmFyY2l0eSIsCi0gICAgICAgICAgICAiYmFydG93biIsCi0gICAgICAgICAgICAiYmFydmlsbGFnZSIsCi0gICAgICAgIH07Ci0gICAgICAgIGludCB0ID0gMDsKLSAgICAgICAgTmFtZXdvcmxkIHdvcmxkID0gKE5hbWV3b3JsZClkb2MuZWxlbWVudEJ5TmFtZShuZXcgTmFtZSgiaHR0cDovL29wZW51cmkub3JnL25hbWV3b3JsZCIsICJuYW1ld29ybGQiKSwgMCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd29ybGQuY291bnRPZkVsZW1lbnRCeU5hbWUobmV3IE5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy9uYW1ld29ybGQiLCAiaXNsYW5kIikpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5hbWV3b3JsZC5Jc2xhbmQgaXNsYW5kID0gKE5hbWV3b3JsZC5Jc2xhbmQpd29ybGQuZWxlbWVudEJ5TmFtZShuZXcgTmFtZSgiaHR0cDovL29wZW51cmkub3JnL25hbWV3b3JsZCIsICJpc2xhbmQiKSwgaSk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGNvbnRlbnRzW3QrK10sICgoU2ltcGxlVmFsdWUpaXNsYW5kLmF0dHJpYnV0ZUJ5TmFtZShuZXcgTmFtZSgidGFyZ2V0TmFtZXNwYWNlIikpKS5zdHJpbmdWYWx1ZSgpKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaXNsYW5kLmNvdW50T2ZFbGVtZW50QnlOYW1lKG5ldyBOYW1lKCAiaHR0cDovL29wZW51cmkub3JnL25hbWV3b3JsZCIsICJsb2NhdGlvbiIpKTsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExvYyBsb2MgPSAoTG9jKWlzbGFuZC5lbGVtZW50QnlOYW1lKG5ldyBOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbmFtZXdvcmxkIiwgImxvY2F0aW9uIiksIGopOwotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoY29udGVudHNbdCsrXSwgKChTaW1wbGVWYWx1ZSlsb2MuYXR0cmlidXRlQnlOYW1lKG5ldyBOYW1lKCJuYW1lIikpKS5zdHJpbmdWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAqLwotCi19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvUU5hbWVTZXRUZXN0LmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvUU5hbWVTZXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NmJiZjEuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1FOYW1lU2V0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0QnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgUU5hbWVTZXRUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgUU5hbWVTZXRUZXN0KFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShRTmFtZVNldFRlc3QuY2xhc3MpOyB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXQoaW50IGluZGVudCwgaW50IGl0ZXIsIFN0cmluZyBwLCBRTmFtZVNldEJ1aWxkZXIgc2V0KQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgU3lzdGVtLmVyci5wcmludChuZXcgRGVjaW1hbEZvcm1hdCgiMDAwMDAgIikuZm9ybWF0KGl0ZXIpKTsKLSAgICAgICAgd2hpbGUgKGluZGVudC0tID4gMCkKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnQoJyAnKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludChwKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludCgiID0gIik7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihzZXQuZHVtcCgpKTsKLSAgICAgICAgKi8KLQotICAgICAgICByZXR1cm4gImNhc2UjICIgKyBpdGVyICsgIiAiICsgcCArICIgIiArIHNldC50b1N0cmluZygpOwotCi0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UU5hbWVTZXRzKCkKLSAgICB7Ci0gICAgICAgIGludCBpdGVyYXRpb25zID0gMTAwMDA7Ci0gICAgICAgIGludCBzZWVkID0gMDsKLSAgICAgICAgaW50IHN0b3BhdCA9IC0xOwotCi0gICAgICAgIFJhbmRvbSBybmQgPSBuZXcgUmFuZG9tKHNlZWQpOwotICAgICAgICBTdHJpbmdbXSBsb2NhbG5hbWUgPSB7ImEiLCAiYiIsICJjIiwgImQiLCAiZSJ9OwotICAgICAgICBTdHJpbmdbXSBuYW1lc3BhY2UgPSB7Im4xIiwgIm4yIiwgIm4zIiwgIm40IiwgIm41In07Ci0gICAgICAgIGludCB3aWR0aCA9IGxvY2FsbmFtZS5sZW5ndGg7Ci0KLSAgICAgICAgUU5hbWVbXSBuYW1lID0gbmV3IFFOYW1lW3dpZHRoICogbmFtZXNwYWNlLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuYW1lc3BhY2UubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmFtZVtpICsgd2lkdGggKiBqXSA9IG5ldyBRTmFtZShuYW1lc3BhY2Vbal0sIGxvY2FsbmFtZVtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdGFjayB0ZXN0c3RhY2sgPSBuZXcgU3RhY2soKTsgLy8gc3RhY2sgb2Ygc2V0cwotICAgICAgICBTdGFjayB0cmFja3N0YWNrID0gbmV3IFN0YWNrKCk7IC8vIHN0YWNrIG9mIGJvb2xlYW4gYXJyYXlzCi0KLSAgICAgICAgUU5hbWVTZXRCdWlsZGVyIGN1cnJlbnQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKCk7Ci0gICAgICAgIGJvb2xlYW5bXSBjb250ZW50cyA9IG5ldyBib29sZWFuW3dpZHRoICogbmFtZXNwYWNlLmxlbmd0aF07Ci0gICAgICAgIGJvb2xlYW5bXSB0ZW1wOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGludCBqID0gMDsKLQotICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGl0ZXJhdGlvbnM7IGwrKykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZm9yIGRlYnVnZ2luZwotCi0gICAgICAgICAgICBpZiAobCA9PSBzdG9wYXQpCi0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJXZSdyZSBoZXJlIik7Ci0KLSAgICAgICAgICAgIC8vIGFwcGx5IGEgcmFuZG9tIG9wZXJhdGlvbgotCi0gICAgICAgICAgICBpZiAocm5kLm5leHRJbnQoMykgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpID0gcm5kLm5leHRJbnQod2lkdGggLSAxKTsgLy8gZG9uJ3QgZG8gdGhlIGxhc3Qgb25lIGZvciBpc0FsbCB0ZXN0Ci0gICAgICAgICAgICAgICAgaiA9IHJuZC5uZXh0SW50KG5hbWVzcGFjZS5sZW5ndGggLSAxKTsgLy8gZG9uJ3QgZG8gdGhlIGxhc3Qgb25lIGZvciBpc0FsbCB0ZXN0Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBsYWJlbDsKLQotICAgICAgICAgICAgc3dpdGNoICh0ZXN0c3RhY2suc2l6ZSgpIDwgMSA/IDI0IDogcm5kLm5leHRJbnQoaXRlcmF0aW9ucyAtIGwgPiB0ZXN0c3RhY2suc2l6ZSgpID8gMjQgOiA1KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0ZXN0c3RhY2sucHVzaChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2tzdGFjay5wdXNoKGNvbnRlbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSBuZXcgYm9vbGVhblt3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGhdOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJuZXciOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgICAgICAgICB0ZXN0c3RhY2sucHVzaChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2tzdGFjay5wdXNoKGNvbnRlbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSBuZXcgYm9vbGVhblt3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGhdOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChybmQubmV4dEludCgyKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmludmVydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aDsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2sgKyB3aWR0aCAqIChuYW1lc3BhY2UubGVuZ3RoIC0gMSldID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGggPSAwOyBoIDwgbmFtZXNwYWNlLmxlbmd0aCAtIDE7IGgrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJuZC5uZXh0SW50KDIpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5yZW1vdmVOYW1lc3BhY2UobmFtZXNwYWNlW2hdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmFkZE5hbWVzcGFjZShuYW1lc3BhY2VbaF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW3dpZHRoIC0gMSArIHdpZHRoICogaF0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aCAtIDE7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm5kLm5leHRJbnQoMikgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5yZW1vdmUobmFtZVtrICsgd2lkdGggKiBoXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hZGQobmFtZVtrICsgd2lkdGggKiBoXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2sgKyB3aWR0aCAqIGhdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAicmFuZG9tIjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuYWRkQWxsKChRTmFtZVNldFNwZWNpZmljYXRpb24pdGVzdHN0YWNrLnBvcCgpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IChib29sZWFuW10pdHJhY2tzdGFjay5wb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGg7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wW2tdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2tdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiYWRkIHNldCI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnJlbW92ZUFsbCgoUU5hbWVTZXRTcGVjaWZpY2F0aW9uKXRlc3RzdGFjay5wb3AoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAgPSAoYm9vbGVhbltdKXRyYWNrc3RhY2sucG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgd2lkdGggKiBuYW1lc3BhY2UubGVuZ3RoOyBrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFtrXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50c1trXSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJyZW1vdmUgc2V0IjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQucmVzdHJpY3QoKFFOYW1lU2V0U3BlY2lmaWNhdGlvbil0ZXN0c3RhY2sucG9wKCkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wID0gKGJvb2xlYW5bXSl0cmFja3N0YWNrLnBvcCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdpZHRoICogbmFtZXNwYWNlLmxlbmd0aDsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZW1wW2tdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2tdID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gInJlc3RyaWN0IHNldCI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJ1bmlvbiI7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKGN1cnJlbnQudW5pb24oKFFOYW1lU2V0U3BlY2lmaWNhdGlvbil0ZXN0c3RhY2sucG9wKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IChib29sZWFuW10pdHJhY2tzdGFjay5wb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGg7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wW2tdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2tdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAidW5pb24iOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiaW50ZXJzZWN0IjsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoY3VycmVudC5pbnRlcnNlY3QoKFFOYW1lU2V0U3BlY2lmaWNhdGlvbil0ZXN0c3RhY2sucG9wKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IChib29sZWFuW10pdHJhY2tzdGFjay5wb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGg7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGVtcFtrXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50c1trXSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJpbnRlcnNlY3QiOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gImNvcHkiOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmFkZChuYW1lW2kgKyB3aWR0aCAqIGpdKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudHNbaSArIHdpZHRoICogal0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJhZGQgb25lICIgKyBuYW1lW2kgKyB3aWR0aCAqIGpdOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQucmVtb3ZlKG5hbWVbaSArIHdpZHRoICogal0pOwotICAgICAgICAgICAgICAgICAgICBjb250ZW50c1tpICsgd2lkdGggKiBqXSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJyZW1vdmUgb25lICIgKyBuYW1lW2kgKyB3aWR0aCAqIGpdOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hZGROYW1lc3BhY2UobmFtZXNwYWNlW2pdKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aDsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNbayArIHdpZHRoICogal0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJhZGQgbmFtZXNwYWNlICIgKyBuYW1lc3BhY2Vbal07Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnJlbW92ZU5hbWVzcGFjZShuYW1lc3BhY2Vbal0pOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdpZHRoOyBrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50c1trICsgd2lkdGggKiBqXSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJyZW1vdmUgbmFtZXNwYWNlICIgKyBuYW1lc3BhY2Vbal07Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmludmVydCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdpZHRoICogbmFtZXNwYWNlLmxlbmd0aDsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNba10gPSAhY29udGVudHNba107Ci0gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gImludmVydCI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAxODoKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoY3VycmVudC5pbnZlcnNlKCkpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdpZHRoICogbmFtZXNwYWNlLmxlbmd0aDsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNba10gPSAhY29udGVudHNba107Ci0gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gImludmVyc2UiOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oZm9ybWF0KHRlc3RzdGFjay5zaXplKCksIGwsIGxhYmVsLCBjdXJyZW50KSk7Ci0KLSAgICAgICAgICAgIC8vIHRoZW4sIHZlcmlmeSBjdXJyZW50IG1hdGNoZXMgY29udGVudHMKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdpZHRoICogbmFtZXNwYWNlLmxlbmd0aDsgaysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGZvcm1hdCgwLCBsLCAiQ29udGVudCBtaXNtYXRjaCAiICsgbmFtZVtrXSwgY3VycmVudCksIChjdXJyZW50LmNvbnRhaW5zKG5hbWVba10pID09IGNvbnRlbnRzW2tdKSk7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyB0ZXN0cHJpbnQoMCwgbCwgIkVSUk9SIE9OICIgKyBuYW1lW2tdLCBjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGVzdHByaW50KDAsIGwsICJleHBlY3RlZCAiICsgY29udGVudHNba10gKyAiLCBnb3QgIiArICFjb250ZW50c1trXSwgY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY29udGVudHNba10pCi0gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGZvcm1hdCgwLCBsLCAiRVJST1I6IGlzRW1wdHkgaXMgd3JvbmciLCBjdXJyZW50KSwgKChjb3VudCA9PSAwKSA9PSBjdXJyZW50LmlzRW1wdHkoKSkpOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHRlc3RwcmludCgwLCBsLCAiRVJST1I6IGlzRW1wdHkgaXMgd3JvbmciLCBjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAvLyB0ZXN0cHJpbnQoMCwgbCwgImV4cGVjdGVkICIgKyAoY291bnQgPT0gMCkgKyAiLCBnb3QgIiArICEoY291bnQgPT0gMCksIGN1cnJlbnQpOwotICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmb3JtYXQoMCwgbCwgIkVSUk9SOiBpc0FsbCBpcyB3cm9uZyIsIGN1cnJlbnQpLCAoY291bnQgPT0gd2lkdGggKiBuYW1lc3BhY2UubGVuZ3RoKSA9PSBjdXJyZW50LmlzQWxsKCkpOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHRlc3RwcmludCgwLCBsLCAiRVJST1I6IGlzQWxsIGlzIHdyb25nIiwgY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgLy8gdGVzdHByaW50KDAsIGwsICJleHBlY3RlZCAiICsgKGNvdW50ID09IHdpZHRoICogbmFtZXNwYWNlLmxlbmd0aCkgKyAiLCBnb3QgIiArICEoY291bnQgPT0gd2lkdGggKiBuYW1lc3BhY2UubGVuZ3RoKSwgY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgLy8gU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHRlc3QgaXNEaXNqb2ludCBhbmQgY29udGFpbnNBbGwKLSAgICAgICAgICAgIGlmICh0ZXN0c3RhY2suc2l6ZSgpID49IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNqb2ludCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IChib29sZWFuW10pdHJhY2tzdGFjay5wZWVrKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGg7IGsrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wW2tdICYmIGNvbnRlbnRzW2tdKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNqb2ludCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZm9ybWF0KDAsIGwsICJFUlJPUjogZGlzam9pbnQgaXMgd3JvbmciLCBjdXJyZW50KSwgZGlzam9pbnQgPT0gY3VycmVudC5pc0Rpc2pvaW50KChRTmFtZVNldFNwZWNpZmljYXRpb24pdGVzdHN0YWNrLnBlZWsoKSkpOwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGVzdHByaW50KDAsIGwsICJFUlJPUjogZGlzam9pbnQgaXMgd3JvbmciLCBjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGVzdHByaW50KDAsIGwsICJleHBlY3RlZCAiICsgZGlzam9pbnQgKyAiLCBnb3QgIiArICFkaXNqb2ludCwgKFFOYW1lU2V0QnVpbGRlcil0ZXN0c3RhY2sucGVlaygpKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJvb2xlYW4gY29udGFpbnNBbGwgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgd2lkdGggKiBuYW1lc3BhY2UubGVuZ3RoOyBrKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFtrXSAmJiAhY29udGVudHNba10pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zQWxsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmb3JtYXQoMCwgbCwgIkVSUk9SOiBjb250YWluc0FsbCBpcyB3cm9uZyIsIGN1cnJlbnQpLCBjb250YWluc0FsbCA9PSBjdXJyZW50LmNvbnRhaW5zQWxsKChRTmFtZVNldFNwZWNpZmljYXRpb24pdGVzdHN0YWNrLnBlZWsoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvUU5hbWVUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1FOYW1lVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2NjdlMS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvUU5hbWVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIFFOYW1lVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBRTmFtZVRlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShRTmFtZVRlc3RzLmNsYXNzKTsgfQotCi0gICAgc3RhdGljIFN0cmluZ1tdIF9hcmdzOwotICAgIHN0YXRpYyBTdHJpbmcgX3Rlc3Q7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UU5hbWUgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBzY2hlbWEgPQotICAgICAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nYW55Jz5cbiIgKwotICAgICAgICAgICAgIiAgPC94czplbGVtZW50PlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiPC94czpzY2hlbWE+XG4iICsKLSAgICAgICAgICAgICIiOwotCi0gICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgc3RsID0KLSAgICAgICAgICAgIFhtbEJlYW5zLmxvYWRYc2QoIG5ldyBYbWxPYmplY3RbXSB7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2Uoc2NoZW1hKSB9ICk7Ci0KLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRlc3QgdGhlIHNldF9YTUxOYW1lIGZ1bmN0aW9uIG9uIFhtbFFOYW1lSW1wbAotICAgICAgICAvLwotCi0gICAgICAgIFN0cmluZyBucyA9Ci0gICAgICAgICAgICAieG1sbnM6eHNpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZScgIiArCi0gICAgICAgICAgICAgICAgInhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSciOwotICAgICAgICAKLSAgICAgICAgWG1sT2JqZWN0IHNvdXJjZURvY3VtZW50ID0KLSAgICAgICAgICAgIHN0bC5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpRTmFtZScgeG1sbnM6eHh4PSd4eHguY29tJz4iICsKLSAgICAgICAgICAgICAgICAgICAgInh4eDphYmM8L2FueT4iLCBudWxsLCBudWxsICk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIHNvdXJjZUN1cnNvciA9IHNvdXJjZURvY3VtZW50Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIHNvdXJjZUN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKLQotICAgICAgICBYbWxRTmFtZSBzb3VyY2VRTmFtZSA9IChYbWxRTmFtZSkgc291cmNlQ3Vyc29yLmdldE9iamVjdCgpOwotCi0gICAgICAgIFhtbE9iamVjdCB0YXJnZXREb2N1bWVudCA9Ci0gICAgICAgICAgICBzdGwucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6UU5hbWUnPiIgKwotICAgICAgICAgICAgICAgICAgICAiPC9hbnk+IiwgbnVsbCwgbnVsbCApOwotCi0gICAgICAgIFhtbEN1cnNvciB0YXJnZXRDdXJzb3IgPSB0YXJnZXREb2N1bWVudC5uZXdDdXJzb3IoKTsKLQotICAgICAgICB0YXJnZXRDdXJzb3IudG9GaXJzdENoaWxkKCk7Ci0KLSAgICAgICAgWG1sUU5hbWUgdGFyZ2V0UU5hbWUgPSAoWG1sUU5hbWUpIHRhcmdldEN1cnNvci5nZXRPYmplY3QoKTsKLQotICAgICAgICB0YXJnZXRRTmFtZS5zZXQoIHNvdXJjZVFOYW1lICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB0YXJnZXRRTmFtZS5xTmFtZVZhbHVlKCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKCAieHh4LmNvbSIgKSApOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRlc3QgdGhlIHNldF90ZXh0IGZ1bmN0aW9uIG9uIFhtbFFOYW1lSW1wbAotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgdGFyZ2V0RG9jdW1lbnQgPQotICAgICAgICAgICAgc3RsLnBhcnNlKAotICAgICAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOlFOYW1lJyB4bWxuczp4eHg9J3h4eC5jb20nPiIgKwotICAgICAgICAgICAgICAgICAgICAiPC9hbnk+IiwgbnVsbCwgbnVsbCApOwotCi0gICAgICAgIHRhcmdldEN1cnNvciA9IHRhcmdldERvY3VtZW50Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIHRhcmdldEN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKLQotICAgICAgICB0YXJnZXRRTmFtZSA9IChYbWxRTmFtZSkgdGFyZ2V0Q3Vyc29yLmdldE9iamVjdCgpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRRTmFtZS5zZXQoICJ6eno6YWJjIiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsgLy8gTXVzdCBmYWlsCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgdCApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGFyZ2V0UU5hbWUuc2V0KCAieHh4OmFiYyIgKTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgdGFyZ2V0UU5hbWUucU5hbWVWYWx1ZSgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyggInh4eC5jb20iICkgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvUnVudGltZVNjaGVtYUxvYWRlclRlc3QuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9SdW50aW1lU2NoZW1hTG9hZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmZlMDlmLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9SdW50aW1lU2NoZW1hTG9hZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50LlNjaGVtYTsKLQotcHVibGljIGNsYXNzIFJ1bnRpbWVTY2hlbWFMb2FkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgUnVudGltZVNjaGVtYUxvYWRlclRlc3QoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKFJ1bnRpbWVTY2hlbWFMb2FkZXJUZXN0LmNsYXNzKTsgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNMb2FkKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgRmlsZSBpbnB1dGZpbGUxID0gVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9keW5hbWljL2R5bnRlc3QueHNkIik7Ci0gICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyID0gWG1sQmVhbnMubG9hZFhzZChuZXcgWG1sT2JqZWN0W10geyBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShpbnB1dGZpbGUxKSB9KTsKLSAgICAgICAgWG1sT2JqZWN0IHJlc3VsdCA9IGxvYWRlci5wYXJzZShUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2R5bmFtaWMvZHludGVzdC54bWwiKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkQ9d3JhcHBlZGluc3RhbmNlQGh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L2R5bnRlc3QiLCByZXN1bHQuc2NoZW1hVHlwZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGxvYWRlci5maW5kRG9jdW1lbnRUeXBlKG5ldyBRTmFtZSgiaHR0cDovL29wZW51cmkub3JnL3Rlc3QvZHludGVzdCIsICJ3cmFwcGVkaW5zdGFuY2UiICkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zY2hlbWFUeXBlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTG9hZDIoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBGaWxlIGlucHV0ZmlsZTEgPSBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2R5bmFtaWMvZHludGVzdDIueHNkIik7Ci0gICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyID0gWG1sQmVhbnMubG9hZFhzZChuZXcgWG1sT2JqZWN0W10geyBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShpbnB1dGZpbGUxKSB9KTsKLSAgICAgICAgWG1sT2JqZWN0IHJlc3VsdCA9IGxvYWRlci5wYXJzZShUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2R5bmFtaWMvZHludGVzdDIueG1sIiksIG51bGwsIG51bGwpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJEPXdyYXBwZWR3aWxkY2FyZEBodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9keW50ZXN0IiwgcmVzdWx0LnNjaGVtYVR5cGUoKS50b1N0cmluZygpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhsb2FkZXIuZmluZERvY3VtZW50VHlwZShuZXcgUU5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L2R5bnRlc3QiLCAid3JhcHBlZHdpbGRjYXJkIikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zY2hlbWFUeXBlKCkpOwotICAgICAgICBYbWxDdXJzb3IgY3VyID0gcmVzdWx0Lm5ld0N1cnNvcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgYSByb290IGVsZW1lbnQiLCBjdXIudG9GaXJzdENoaWxkKCkpOwotICAgICAgICByZXN1bHQgPSBjdXIuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkU9d3JhcHBlZHdpbGRjYXJkfEQ9d3JhcHBlZHdpbGRjYXJkQGh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L2R5bnRlc3QiLCByZXN1bHQuc2NoZW1hVHlwZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGxvYWRlci5maW5kRWxlbWVudChuZXcgUU5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L2R5bnRlc3QiLCAid3JhcHBlZHdpbGRjYXJkIikpLmdldFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2NoZW1hVHlwZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlNob3VsZCBoYXZlIGEgZmlyc3QgY2hpbGQiLCBjdXIudG9GaXJzdENoaWxkKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAic2NoZW1hIiksIGN1ci5nZXROYW1lKCkpOwotICAgICAgICBYbWxPYmplY3Qgb2JqID0gY3VyLmdldE9iamVjdCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFNjaGVtYS50eXBlLCBvYmouc2NoZW1hVHlwZSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU2NoZW1hVHlwZXNUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1NjaGVtYVR5cGVzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE2ZWI5YS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU2NoZW1hVHlwZXNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbENhbGVuZGFyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcub3BlbnVyaS54c3R5cGVzLnRlc3QuKjsKLWltcG9ydCBvcmcub3BlbnVyaS5kZWYuRGVmYXVsdHNEb2N1bWVudDsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFNjaGVtYVR5cGVzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBTY2hlbWFUeXBlc1Rlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShTY2hlbWFUeXBlc1Rlc3RzLmNsYXNzKTsgfQotCi0gICAgcHJpdmF0ZSBDdXN0b21lckRvY3VtZW50IGRvYzsKLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVEb2MoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiggZG9jPT1udWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZG9jID0gKEN1c3RvbWVyRG9jdW1lbnQpCi0gICAgICAgICAgICAgICAgICAgIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKFRlc3RFbnYueGJlYW5DYXNlKCIuLi9zcmMveHN0eXBlcy94c3R5cGVzLnhtbCIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0cygpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIERlZmF1bHRzRG9jdW1lbnQgZG9jID0gRGVmYXVsdHNEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIERlZmF1bHRzRG9jdW1lbnQuRGVmYXVsdHMgZGVmcyA9IGRvYy5hZGROZXdEZWZhdWx0cygpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDc4MywgZGVmcy5nZXRDb29sKCkpOyAvLyB0aGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNvdXJjZU5hbWUoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBTdHJpbmcgbmFtZSA9IERlZmF1bHRzRG9jdW1lbnQudHlwZS5nZXRTb3VyY2VOYW1lKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImRlZmF1bHRzLnhzZCIsIG5hbWUpOwotICAgICAgICBJbnB1dFN0cmVhbSBzdHIgPSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLmdldFNvdXJjZUFzU3RyZWFtKCJkZWZhdWx0cy54c2QiKTsKLSAgICAgICAgU2NoZW1hRG9jdW1lbnQgZG9jID0gU2NoZW1hRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShzdHIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkb2MudmFsaWRhdGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlYWQoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBlbnN1cmVEb2MoKTsKLQotICAgICAgICAvLyBNb3ZlIGZyb20gdGhlIHJvb3QgdG8gdGhlIHJvb3QgY3VzdG9tZXIgZWxlbWVudAotICAgICAgICBQZXJzb24gcGVyc29uID0gZG9jLmdldEN1c3RvbWVyKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkhvd2R5IiwgcGVyc29uLmdldEZpcnN0bmFtZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0LCAgIHBlcnNvbi5zaXplT2ZOdW1iZXJBcnJheSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MzYsIHBlcnNvbi5nZXROdW1iZXJBcnJheSgwKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTIzLCBwZXJzb24uZ2V0TnVtYmVyQXJyYXkoMSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQ0LCAgcGVyc29uLmdldE51bWJlckFycmF5KDIpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg5MzMsIHBlcnNvbi5nZXROdW1iZXJBcnJheSgzKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgICBwZXJzb24uc2l6ZU9mQmlydGhkYXlBcnJheSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgWG1sQ2FsZW5kYXIoIjE5OTgtMDgtMjZaIiksCi0gICAgICAgICAgICAgcGVyc29uLmdldEJpcnRoZGF5QXJyYXkoMCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBYbWxDYWxlbmRhcigiMjAwMC0wOC0wNi0wODowMCIpLAotICAgICAgICAgICAgIHBlcnNvbi5nZXRCaXJ0aGRheUFycmF5KDEpKTsKLQotICAgICAgICBQZXJzb24uR2VuZGVyLkVudW0gZyA9IHBlcnNvbi5nZXRHZW5kZXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhQZXJzb24uR2VuZGVyLk1BTEUsIGcpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkVHSVFUV1laSiIsIG5ldyBTdHJpbmcocGVyc29uLmdldEhleCgpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlRoaXMgc3RyaW5nIGlzIGJhc2U2NEJpbmFyeSBlbmNvZGVkISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhwZXJzb24uZ2V0QmFzZTY0KCkpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJHR0lRVFdZR0ciLCBuZXcgU3RyaW5nKHBlcnNvbi5nZXRIZXhBdHQoKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGlzIHN0cmluZyBpcyBiYXNlNjRCaW5hcnkgZW5jb2RlZCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcocGVyc29uLmdldEJhc2U2NEF0dCgpKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygie3NvbWVfdXJpfWxvY2FsbmFtZSIsIHBlcnNvbi5nZXRRbmFtZUF0dCgpLnRvU3RyaW5nKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ7aHR0cDovL29wZW51cmkub3JnL3hzdHlwZXMvdGVzdH1vcGVudXJpX29yZ19sb2NhbG5hbWUiLCBwZXJzb24uZ2V0UW5hbWUoKS50b1N0cmluZygpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJodHRwOi8vZG1vei5vcmcvV29ybGQvRnJhblx1MDBlN2Fpcy8iLCBwZXJzb24uZ2V0QW55dXJpQXR0KCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImh0dHA6Ly8zc3BhY2Uub3JnL3NwYWNlJTIwc3BhY2UvIiwgcGVyc29uLmdldEFueXVyaSgpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vUnVudGltZUV4Y2VwdGlvbjogc3JjL3htbHN0b3JlL2NvbS9iZWEveG1sL3N0b3JlL1NwbGF5LmphdmEoMTUzNyk6IG5zICE9IG51bGwgJiYgbnMubGVuZ3RoKCkgPiAwIGZhaWxlZAotICAgICAgICAvL0Fzc2VydC5hc3NlcnRFcXVhbHMoIkpQRUciLCBwZXJzb24uZ2V0Tm90YXRpb25BdHQoKS50b1N0cmluZygpKTsKLSAgICAgICAgLy9Bc3NlcnQuYXNzZXJ0RXF1YWxzKCJHSUYiLCBwZXJzb24uZ2V0Tm90YXRpb24oKS50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVSZWFkKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgZW5zdXJlRG9jKCk7Ci0gICAgICAgIC8vIE1vdmUgZnJvbSB0aGUgcm9vdCB0byB0aGUgcm9vdCBjdXN0b21lciBlbGVtZW50Ci0gICAgICAgIFBlcnNvbiBwZXJzb24gPSBkb2MuZ2V0Q3VzdG9tZXIoKTsKLQotICAgICAgICBwZXJzb24uc2V0Rmlyc3RuYW1lKCJHZW9yZ2UiKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR2VvcmdlIiwgcGVyc29uLmdldEZpcnN0bmFtZSgpKTsKLQotICAgICAgICBwZXJzb24uc2V0SGV4KCJoZXggZW5jb2RpbmciLmdldEJ5dGVzKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJoZXggZW5jb2RpbmciLCBuZXcgU3RyaW5nKHBlcnNvbi5nZXRIZXgoKSkpOwotCi0gICAgICAgIHBlcnNvbi5zZXRCYXNlNjQoImJhc2U2NCBlbmNvZGVkIi5nZXRCeXRlcygpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYmFzZTY0IGVuY29kZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcocGVyc29uLmdldEJhc2U2NCgpKSk7Ci0KLSAgICAgICAgcGVyc29uLnNldEhleEF0dCgiaGV4IGVuY29kaW5nIGluIGF0dHJpYnV0ZXMiLmdldEJ5dGVzKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJoZXggZW5jb2RpbmcgaW4gYXR0cmlidXRlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhwZXJzb24uZ2V0SGV4QXR0KCkpKTsKLQotICAgICAgICBwZXJzb24uc2V0QmFzZTY0QXR0KCJUaGlzIHN0cmluZyBpcyBiYXNlNjRCaW5hcnkgZW5jb2RlZCEiLmdldEJ5dGVzKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGlzIHN0cmluZyBpcyBiYXNlNjRCaW5hcnkgZW5jb2RlZCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcocGVyc29uLmdldEJhc2U2NEF0dCgpKSk7Ci0KLSAgICAgICAgcGVyc29uLnNldEFueXVyaSgiYS5jOjcwMDEiKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYS5jOjcwMDEiLCBwZXJzb24uZ2V0QW55dXJpKCkpOwotCi0gICAgICAgIHBlcnNvbi5zZXRBbnl1cmlBdHQoImIuZDo3MDAyIik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImIuZDo3MDAyIiwgcGVyc29uLmdldEFueXVyaUF0dCgpKTsKLQotICAgICAgICBwZXJzb24uc2V0UW5hbWVBdHQobmV3IFFOYW1lKCJhYWEiLCJiYmIiKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInthYWF9YmJiIiwgcGVyc29uLmdldFFuYW1lQXR0KCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgcGVyc29uLnNldFFuYW1lKG5ldyBRTmFtZSgiZGRkIiwiZWVlIikpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ7ZGRkfWVlZSIsIHBlcnNvbi5nZXRRbmFtZSgpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vRXhjZXB0aW9uOiBzcmMveG1sc3RvcmUvY29tL2JlYS94bWwvc3RvcmUvVHlwZS5qYXZhKDE4OSk6IHVzZXIgPT0gX3VzZXIgZmFpbGVkCi0vLyAgICAgICAgcGVyc29uLnNldEFueXVyaUF0dChVUkkuY3JlYXRlKCJiLmQ6NzAwMiIpKTsKLS8vICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJiLmQ6NzAwMiIsIHBlcnNvbi5nZXRBbnl1cmlBdHQoKS50b1N0cmluZygpKTsKLQotICAgICAgICAvL1htbE5PVEFUSU9OIG5vdGF0aW9uID0gKFhtbE5PVEFUSU9OKVBlcnNvbi5Ob3RhdGlvbi50eXBlLmNyZWF0ZU5vZGUoKTsKLSAgICAgICAgLy9ub3RhdGlvbi5zZXRWYWx1ZSgiSlBFRyIpOwotICAgICAgICAvL3BlcnNvbi5zZXROb3RhdGlvbiggbm90YXRpb24gKTsKLSAgICAgICAgLy9Bc3NlcnQuYXNzZXJ0RXF1YWxzKCJKUEVHIiwgcGVyc29uLmdldE5vdGF0aW9uKCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgLy9YbWxOT1RBVElPTiBub3RhdGlvbkF0dCA9IChYbWxOT1RBVElPTilQZXJzb24uTm90YXRpb25BdHQudHlwZS5jcmVhdGVOb2RlKCk7Ci0gICAgICAgIC8vbm90YXRpb25BdHQuc2V0VmFsdWUoIkdJRiIpOwotICAgICAgICAvL3BlcnNvbi5zZXROb3RhdGlvbkF0dCggbm90YXRpb25BdHQgKTsKLSAgICAgICAgLy9wZXJzb24uc2V0Tm90YXRpb25BdHQobm90YXRpb24pOwotICAgICAgICAvL0Fzc2VydC5hc3NlcnRFcXVhbHMoIkdJRiIsIHBlcnNvbi5nZXROb3RhdGlvbkF0dCgpLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9yZVdyaXRlKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgZW5zdXJlRG9jKCk7Ci0gICAgICAgIC8vIE1vdmUgZnJvbSB0aGUgcm9vdCB0byB0aGUgcm9vdCBjdXN0b21lciBlbGVtZW50Ci0gICAgICAgIFBlcnNvbiBwZXJzb24gPSBkb2MuZ2V0Q3VzdG9tZXIoKTsKLQotICAgICAgICBYbWxPYmplY3QgeG1sb2JqOwotICAgICAgICBYbWxDdXJzb3IgeG1sY3VyczsKLQotICAgICAgICBwZXJzb24uc2V0Rmlyc3RuYW1lKCJHZW9yZ2UiKTsKLSAgICAgICAgeG1sb2JqID0gcGVyc29uLnhnZXRGaXJzdG5hbWUoKTsKLSAgICAgICAgeG1sY3VycyA9IHhtbG9iai5uZXdDdXJzb3IoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR2VvcmdlIiwgeG1sY3Vycy5nZXRUZXh0VmFsdWUoKSApOwotCi0gICAgICAgIHBlcnNvbi5zZXRRbmFtZUF0dCggbmV3IFFOYW1lKCJodHRwOi8vZ2dnLmNvbSIsImhoaCIpICk7Ci0gICAgICAgIHhtbG9iaiA9IHBlcnNvbi54Z2V0UW5hbWVBdHQoKTsKLSAgICAgICAgeG1sY3VycyA9IHhtbG9iai5uZXdDdXJzb3IoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZ2dnOmhoaCIsIHhtbGN1cnMuZ2V0VGV4dFZhbHVlKCkgKTsKLQotICAgICAgICBwZXJzb24uc2V0UW5hbWUoIG5ldyBRTmFtZSgiaHR0cDovL2dnZy5jb20vZ2dnQWdhaW4iLCJra2siKSApOwotICAgICAgICB4bWxvYmogPSBwZXJzb24ueGdldFFuYW1lKCk7Ci0gICAgICAgIHhtbGN1cnMgPSB4bWxvYmoubmV3Q3Vyc29yKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImdnZzE6a2trIiwgeG1sY3Vycy5nZXRUZXh0VmFsdWUoKSApOwotCi0gICAgICAgIHBlcnNvbi5zZXRBbnl1cmkoICJjcm9zc2dhaW4uY29tIiApOwotICAgICAgICB4bWxvYmogPSBwZXJzb24ueGdldEFueXVyaSgpOwotICAgICAgICB4bWxjdXJzID0geG1sb2JqLm5ld0N1cnNvcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJjcm9zc2dhaW4uY29tIiwgeG1sY3Vycy5nZXRUZXh0VmFsdWUoKSApOwotCi0gICAgICAgIHBlcnNvbi5zZXRBbnl1cmlBdHQoICJ3d3cuY3Jvc3NnYWluLmNvbSIgKTsKLSAgICAgICAgeG1sb2JqID0gcGVyc29uLnhnZXRBbnl1cmlBdHQoKTsKLSAgICAgICAgeG1sY3VycyA9IHhtbG9iai5uZXdDdXJzb3IoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygid3d3LmNyb3NzZ2Fpbi5jb20iLCB4bWxjdXJzLmdldFRleHRWYWx1ZSgpICk7Ci0KLSAgICAgICAgLy9wZXJzb24uc2V0Tm90YXRpb24oIkdJRiIpOwotICAgICAgICAvL3htbG9iaiA9IHBlcnNvbi5nZXROb3RhdGlvbigpOwotICAgICAgICAvL3htbGN1cnMgPSB4bWxvYmoubmV3WG1sQ3Vyc29yKCk7Ci0gICAgICAgIC8vQXNzZXJ0LmFzc2VydEVxdWFscygiR0lGIiwgeG1sY3Vycy5nZXRUZXh0KCkgKTsKLQotICAgICAgICAvL3BlcnNvbi5zZXROb3RhdGlvbkF0dCgiSlBFR3UiKTsKLSAgICAgICAgLy94bWxvYmogPSBwZXJzb24ueGdldE5vdGF0aW9uQXR0KCk7Ci0gICAgICAgIC8veG1sY3VycyA9IHhtbG9iai5uZXdYbWxDdXJzb3IoKTsKLSAgICAgICAgLy9Bc3NlcnQuYXNzZXJ0RXF1YWxzKCJKUEVHIiwgeG1sY3Vycy5nZXRUZXh0KCkgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU2VyaWFsaXphdGlvblRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU2VyaWFsaXphdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNjQyYWQuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1NlcmlhbGl6YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGNvbS5lYXN5cG8uWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi5QdXJjaGFzZU9yZGVyOwotaW1wb3J0IGNvbS5lYXN5cG8uWG1sTGluZUl0ZW1CZWFuOwotaW1wb3J0IGNvbS5lYXN5cG8uWG1sU2hpcHBlckJlYW47Ci1pbXBvcnQgY29tLmVhc3lwby5YbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgU2VyaWFsaXphdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgU2VyaWFsaXphdGlvblRlc3RzIChTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoU2VyaWFsaXphdGlvblRlc3RzLmNsYXNzKTsgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFhtbE9iamVjdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgc2ltcGxlRG9jdW1lbnQgPSAiPHNpbXBsZURvYz48bmVzdGVkVGFnIGF0dHI9XCJzYW1wbGVcIj40MzwvbmVzdGVkVGFnPjwvc2ltcGxlRG9jPiI7Ci0gICAgICAgIFhtbE9iamVjdCBkb2MgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShzaW1wbGVEb2N1bWVudCk7Ci0KLSAgICAgICAgLy8gYmFzZWxpbmUgdGVzdAotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHNpbXBsZURvY3VtZW50LCBkb2MueG1sVGV4dCgpKTsKLQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShvdXQpOwotICAgICAgICBvb3Mud3JpdGVPYmplY3QoZG9jKTsKLSAgICAgICAgb29zLmNsb3NlKCk7Ci0KLSAgICAgICAgYnl0ZVtdIGJ5dGVBcnJheSA9IG91dC50b0J5dGVBcnJheSgpOwotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlQXJyYXkpOwotICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW4pOwotICAgICAgICBYbWxPYmplY3QgbmV3ZG9jID0gKFhtbE9iamVjdClvaXMucmVhZE9iamVjdCgpOwotICAgICAgICBvaXMuY2xvc2UoKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHNpbXBsZURvY3VtZW50LCBuZXdkb2MueG1sVGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0WEJlYW5TZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbiBkb2MgPSBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgUHVyY2hhc2VPcmRlciBvcmRlciA9IGRvYy5hZGROZXdQdXJjaGFzZU9yZGVyKCk7Ci0gICAgICAgIG9yZGVyLmFkZE5ld0N1c3RvbWVyKCkuc2V0TmFtZSgiRGF2aWQgQmF1Iik7Ci0gICAgICAgIG9yZGVyLmdldEN1c3RvbWVyKCkuc2V0QWRkcmVzcygiR2xhZHd5bmUsIFBBIik7Ci0gICAgICAgIFhtbExpbmVJdGVtQmVhbiBsaTsKLSAgICAgICAgbGkgPSBvcmRlci5hZGROZXdMaW5lSXRlbSgpOwotICAgICAgICBsaS5zZXREZXNjcmlwdGlvbigiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDEiKTsKLSAgICAgICAgbGkuc2V0UHJpY2UobmV3IEJpZ0RlY2ltYWwoIjIxLjc5IikpOwotICAgICAgICBsaS5zZXRRdWFudGl0eShCaWdJbnRlZ2VyLnZhbHVlT2YoMikpOwotICAgICAgICBsaS5zZXRQZXJVbml0T3VuY2VzKG5ldyBCaWdEZWNpbWFsKCI1IikpOwotICAgICAgICBsaSA9IG9yZGVyLmFkZE5ld0xpbmVJdGVtKCk7Ci0gICAgICAgIGxpLnNldERlc2NyaXB0aW9uKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMiIpOwotICAgICAgICBsaS5zZXRQcmljZShuZXcgQmlnRGVjaW1hbCgiMTkuODkiKSk7Ci0gICAgICAgIGxpLnNldFF1YW50aXR5KEJpZ0ludGVnZXIudmFsdWVPZigyKSk7Ci0gICAgICAgIGxpLnNldFBlclVuaXRPdW5jZXMobmV3IEJpZ0RlY2ltYWwoIjUiKSk7Ci0gICAgICAgIGxpID0gb3JkZXIuYWRkTmV3TGluZUl0ZW0oKTsKLSAgICAgICAgbGkuc2V0RGVzY3JpcHRpb24oIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAzIik7Ci0gICAgICAgIGxpLnNldFByaWNlKG5ldyBCaWdEZWNpbWFsKCIxOS44OSIpKTsKLSAgICAgICAgbGkuc2V0UXVhbnRpdHkoQmlnSW50ZWdlci52YWx1ZU9mKDEpKTsKLSAgICAgICAgbGkuc2V0UGVyVW5pdE91bmNlcyhuZXcgQmlnRGVjaW1hbCgiNSIpKTsKLSAgICAgICAgWG1sU2hpcHBlckJlYW4gc2ggPSBvcmRlci5hZGROZXdTaGlwcGVyKCk7Ci0gICAgICAgIHNoLnNldE5hbWUoIlVQUyIpOwotICAgICAgICBzaC5zZXRQZXJPdW5jZVJhdGUobmV3IEJpZ0RlY2ltYWwoIjAuNzQiKSk7Ci0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0KTsKLSAgICAgICAgb29zLndyaXRlT2JqZWN0KGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgxKSk7Ci0gICAgICAgIG9vcy53cml0ZU9iamVjdChkb2MpOwotICAgICAgICBvb3Mud3JpdGVPYmplY3QoZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDIpKTsKLSAgICAgICAgb29zLmNsb3NlKCk7Ci0KLSAgICAgICAgYnl0ZVtdIGJ5dGVBcnJheSA9IG91dC50b0J5dGVBcnJheSgpOwotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlQXJyYXkpOwotICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW4pOwotICAgICAgICBYbWxMaW5lSXRlbUJlYW4gbmV3bGkxID0gKFhtbExpbmVJdGVtQmVhbilvaXMucmVhZE9iamVjdCgpOwotICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuIG5ld2RvYyA9IChYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuKW9pcy5yZWFkT2JqZWN0KCk7Ci0gICAgICAgIFhtbExpbmVJdGVtQmVhbiBuZXdsaTIgPSAoWG1sTGluZUl0ZW1CZWFuKW9pcy5yZWFkT2JqZWN0KCk7Ci0gICAgICAgIG9pcy5jbG9zZSgpOwotCi0gICAgICAgIFB1cmNoYXNlT3JkZXIgbmV3b3JkZXIgPSBuZXdkb2MuZ2V0UHVyY2hhc2VPcmRlcigpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3bGkxLCBuZXdvcmRlci5nZXRMaW5lSXRlbUFycmF5KDEpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXdsaTIsIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMikpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkRhdmlkIEJhdSIsIG5ld29yZGVyLmdldEN1c3RvbWVyKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR2xhZHd5bmUsIFBBIiwgbmV3b3JkZXIuZ2V0Q3VzdG9tZXIoKS5nZXRBZGRyZXNzKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIG5ld29yZGVyLnNpemVPZkxpbmVJdGVtQXJyYXkoKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDEiLCBuZXdvcmRlci5nZXRMaW5lSXRlbUFycmF5KDApLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIyMS43OSIpLCBuZXdvcmRlci5nZXRMaW5lSXRlbUFycmF5KDApLmdldFByaWNlKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdJbnRlZ2VyKCIyIiksIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMCkuZ2V0UXVhbnRpdHkoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjUiKSwgbmV3b3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXRQZXJVbml0T3VuY2VzKCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAyIiwgbmV3b3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMTkuODkiKSwgbmV3b3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXRQcmljZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnSW50ZWdlcigiMiIpLCBuZXdvcmRlci5nZXRMaW5lSXRlbUFycmF5KDEpLmdldFF1YW50aXR5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCI1IiksIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0UGVyVW5pdE91bmNlcygpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMyIsIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjE5Ljg5IiksIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0UHJpY2UoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0ludGVnZXIoIjEiKSwgbmV3b3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgyKS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiNSIpLCBuZXdvcmRlci5nZXRMaW5lSXRlbUFycmF5KDIpLmdldFBlclVuaXRPdW5jZXMoKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlLCBuZXdvcmRlci5pc1NldFNoaXBwZXIoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlVQUyIsIG5ld29yZGVyLmdldFNoaXBwZXIoKS5nZXROYW1lKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIwLjc0IiksIG5ld29yZGVyLmdldFNoaXBwZXIoKS5nZXRQZXJPdW5jZVJhdGUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1Ntb2tlVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TbW9rZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNWQ4ZmIuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1Ntb2tlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFNtb2tlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIFNtb2tlVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKFNtb2tlVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChBc3NvcnRlZFRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KEludFRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFJ1bnRpbWVTY2hlbWFMb2FkZXJUZXN0LnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFN0b3JlVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoUU5hbWVUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChWYWxpZGF0aW9uVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoQ29tcGlsYXRpb25UZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChBbm5vdGF0aW9uc1Rlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KEVhc3lQb1Rlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KE5hbWV3b3JsZFRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoU2NoZW1hVHlwZXNUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChFbnVtVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoQ3JlYXRpb25UZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChUaHJlYWRpbmdUZXN0LnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFNlcmlhbGl6YXRpb25UZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChEb21UZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChHRGF0ZVRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFN1YnN0R3JvdXBUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TdGFuZGFsb25lVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TdGFuZGFsb25lVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQyNDcxNy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU3RhbmRhbG9uZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBTdGFuZGFsb25lVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIFN0YW5kYWxvbmVUZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoU3RhbmRhbG9uZVRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoQXNzb3J0ZWRUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChJbnRUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChSdW50aW1lU2NoZW1hTG9hZGVyVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChTdG9yZVRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFFOYW1lVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoVmFsaWRhdGlvblRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KENvbXBpbGF0aW9uVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoQW5ub3RhdGlvbnNUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChFYXN5UG9UZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChOYW1ld29ybGRUZXN0LnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFNjaGVtYVR5cGVzVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoRW51bVRlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KENyZWF0aW9uVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoVGhyZWFkaW5nVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChTZXJpYWxpemF0aW9uVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoRG9tVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoR0RhdGVUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChTdWJzdEdyb3VwVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU3RvcmVUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1N0b3JlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmYmE2My4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU3RvcmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5MCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3IuVG9rZW5UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yLlhtbEJvb2ttYXJrOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sU2F4SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbExpbmVOdW1iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxOYW1lSW1wbDsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5BdHRyaWJ1dGU7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5BdHRyaWJ1dGVJdGVyYXRvcjsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLkNoYW5nZVByZWZpeE1hcHBpbmc7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uQ29tbWVudDsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLkVuZERvY3VtZW50OwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uRW5kRWxlbWVudDsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLkVuZFByZWZpeE1hcHBpbmc7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5TdGFydERvY3VtZW50OwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uU3RhcnRFbGVtZW50OwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uU3RhcnRQcmVmaXhNYXBwaW5nOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MRXZlbnQ7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTE5hbWU7Ci0gICAKLXB1YmxpYyBjbGFzcyBTdG9yZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgU3RvcmVUZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoU3RvcmVUZXN0cy5jbGFzcyk7IH0KLQotICAgIHN0YXRpYyBTdHJpbmdbXSBfYXJnczsKLSAgICBzdGF0aWMgU3RyaW5nIF90ZXN0OwotCi0gICAgcHVibGljIHN0YXRpYyBGaWxlIGdldENhc2VGaWxlKFN0cmluZyB0aGVDYXNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRlc3RFbnYueGJlYW5DYXNlKCJzdG9yZS8iICsgdGhlQ2FzZSk7Ci0gICAgfQotCi0gICAgc3RhdGljIFhtbEN1cnNvciBsb2FkQ2FzZShTdHJpbmcgdGhlQ2FzZSkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKGdldENhc2VGaWxlKHRoZUNhc2UpLCBudWxsKS5uZXdDdXJzb3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUNvbnRlbnRzICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeERzdCA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFhtbE9iamVjdCB4U3JjID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vLz4iICk7Ci0gICAgICAgIFhtbE9iamVjdCBuZXdEc3QgPSB4RHN0LnNldCggeFNyYyApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbmV3RHN0LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vLz4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIHhEc3QgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxiYXIvPiIgKTsKLSAgICAgICAgeFNyYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvby8+IiApOwotICAgICAgICBYbWxDdXJzb3IgYyA9IHhEc3QubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgeERzdCA9IGMuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIHhEc3Quc2V0KCB4U3JjICk7Ci0gICAgICAgIGMudG9TdGFydERvYygpOwotICAgICAgICB4RHN0ID0gYy5nZXRPYmplY3QoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhEc3QueG1sVGV4dCgpLmVxdWFscyggIjxiYXI+PGZvby8+PC9iYXI+IiApICk7Ci0KLSAgICAgICAgeERzdCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGJhciB4PSd5Jy8+IiApOwotICAgICAgICB4U3JjID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPm1vbzwvZm9vPiIgKTsKLSAgICAgICAgYyA9IHhEc3QubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICB4RHN0ID0gYy5nZXRPYmplY3QoKTsKLSAgICAgICAgeERzdC5zZXQoIHhTcmMgKTsKLSAgICAgICAgYy50b1N0YXJ0RG9jKCk7Ci0gICAgICAgIHhEc3QgPSBjLmdldE9iamVjdCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeERzdC54bWxUZXh0KCkuZXF1YWxzKCAiPGJhciB4PVwibW9vXCIvPiIgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U25pZmZpbmcgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4OwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHhvby8+IiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC5zY2hlbWFUeXBlKCkgPT0gWG1sQmVhbnMuTk9fVFlQRSApOwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgIjxzY2hlbWEgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJy8+IiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHguc2NoZW1hVHlwZSgpID09IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQudHlwZSApOwotCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICI8c2NoZW1hIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS9tb28nLz4iICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnNjaGVtYVR5cGUoKSA9PSBYbWxCZWFucy5OT19UWVBFICk7Ci0KLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgIjxzY2hlbWEgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJy8+IiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHguc2NoZW1hVHlwZSgpID09IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQudHlwZSApOwotCi0gICAgICAgIHggPSBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxzY2hlbWEgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJy8+IiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHguc2NoZW1hVHlwZSgpID09IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQudHlwZSApOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB4ID0gCi0gICAgICAgICAgICAgICAgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICAgICAiPHNjaGVtYSB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEvbW9vJy8+IiApOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApIHsgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Vyc29yU3RhY2sgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vIHg9J3knLz4iICk7Ci0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgYy5wdXNoKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy5wdXNoKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuaXNBdHRyKCkgKTsKLSAgICAgICAgYy5wb3AoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuaXNTdGFydCgpICk7Ci0gICAgICAgIGMucG9wKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmlzU3RhcnRkb2MoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXROYW1lc3BhY2VzICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBNYXAgbmFtZXNwYWNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIG5hbWVzcGFjZXMucHV0KCAiZm9vIiwgImZvby5jb20iICk7Ci0gICAgICAgIG5hbWVzcGFjZXMucHV0KCAiYmFyIiwgImJhci5jb20iICk7Ci0gICAgICAgIG5hbWVzcGFjZXMucHV0KCAiIiwgImRlZmF1bHQuY29tIiApOwotCi0gICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLlNBVkVfSU1QTElDSVRfTkFNRVNQQUNFUywgbmFtZXNwYWNlcyApOwotCi0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLQotICAgICAgICBjLmJlZ2luRWxlbWVudCggImEiLCAiZm9vLmNvbSIgKTsKLSAgICAgICAgYy5iZWdpbkVsZW1lbnQoICJiIiwgImRlZmF1bHQuY29tIiApOwotICAgICAgICBjLmJlZ2luRWxlbWVudCggImMiLCAiYmFyLmNvbSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCggb3B0aW9ucyApLmVxdWFscyggIjxmb286YT48Yj48YmFyOmMvPjwvYj48L2ZvbzphPiIgKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbnRlbnQgaW1wbGVtZW50cyBDb250ZW50SGFuZGxlciwgTGV4aWNhbEhhbmRsZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQgKCApIHRocm93cyBTQVhFeGNlcHRpb24gCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZCggIlNUQVJUX0RPQ1VNRU5UIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZW5kRG9jdW1lbnQgKCApIHRocm93cyBTQVhFeGNlcHRpb24gCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZCggIkVORF9ET0NVTUVOVCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudCAoCi0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLAotICAgICAgICAgICAgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHMgKQotICAgICAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYWRkKCAiU1RBUlRfRUxFTUVOVCIgKTsKLSAgICAgICAgICAgIGFkZCggIiAgbmFtZXNwYWNlVVJJOiAiICsgbmFtZXNwYWNlVVJJICk7Ci0gICAgICAgICAgICBhZGQoICIgIGxvY2FsTmFtZTogIiArIGxvY2FsTmFtZSApOwotLy8gICAgICAgICAgICBhZGQoICIgIHFOYW1lOiAiICsgcU5hbWUgKTsgCi0KLSAgICAgICAgICAgIFRyZWVTZXQgc29ydGVkQXR0cnMgPSBuZXcgVHJlZVNldCgpOwotCi0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgYXR0cy5nZXRMZW5ndGgoKSA7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxuID0gYXR0cy5nZXRMb2NhbE5hbWUoIGkgKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gYXR0cy5nZXRVUkkoIGkgKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcW5hbWUgPSBhdHRzLmdldFFOYW1lKCBpICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobG4uZXF1YWxzKCJ4bWxucyIpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAocW5hbWUuc3RhcnRzV2l0aCgieG1sbnMiKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLS8vICAgICAgICAgICAgICAgIGlmIChsbi5lcXVhbHMoICJ4bWxucyIgKSkKLS8vICAgICAgICAgICAgICAgICAgICBsbiA9ICIiOwotLy8KLS8vICAgICAgICAgICAgICAgIGlmICh1cmkuZXF1YWxzKCAieG1sbnMiICkpCi0vLyAgICAgICAgICAgICAgICAgICAgdXJpID0gIiI7Ci0KLSAgICAgICAgICAgICAgICBzb3J0ZWRBdHRycy5hZGQoCi0gICAgICAgICAgICAgICAgICAgIHVyaSArICItIiArIGxuICsgIi0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHMuZ2V0UU5hbWUoIGkgKSArICItIiArIGF0dHMuZ2V0VHlwZSggaSApICsgIi0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRzLmdldFZhbHVlKCBpICkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IHNvcnRlZEF0dHJzLml0ZXJhdG9yKCkgOyBpLmhhc05leHQoKSA7ICkKLSAgICAgICAgICAgICAgICBhZGQoICIgIEF0dHI6ICIgKyBpLm5leHQoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudCAoCi0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUgKQotICAgICAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYWRkKCAiRU5EX0VMRU1FTlQiICk7Ci0gICAgICAgICAgICBhZGQoICIgIG5hbWVzcGFjZVVSSTogIiArIG5hbWVzcGFjZVVSSSApOwotICAgICAgICAgICAgYWRkKCAiICBsb2NhbE5hbWU6ICIgKyBsb2NhbE5hbWUgKTsKLS8vICAgICAgICAgICAgYWRkKCAiICBxTmFtZTogIiArIHFOYW1lICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzICggY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGggKQotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGQoICJDSEFSQUNURVJTIiApOwotICAgICAgICAgICAgICAgIGFkZCggY2gsIHN0YXJ0LCBsZW5ndGggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbW1lbnQgKCBjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCApIAotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiAKLSAgICAgICAgeyAKLSAgICAgICAgICAgIGFkZCggIkNPTU1FTlQiICk7Ci0gICAgICAgICAgICBhZGQoICIgIENvbW1lbnQ6ICIsIGNoLCBzdGFydCwgbGVuZ3RoICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gKCBTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSApCi0gICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZCggIlBST0NFU1NJTkdfSU5TVFJVQ1RJT04iICk7Ci0gICAgICAgICAgICBhZGQoICAgInRhcmdldDogIiArIHRhcmdldCApOwotICAgICAgICAgICAgYWRkKCAgICJkYXRhOiAiICsgZGF0YSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZSAoIGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoICkKLSAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkKCAiSUdOT1JBQkxFX1dISVRFU1BBQ0UiICk7Ci0gICAgICAgICAgICAgICAgYWRkKCAiICB3aGl0ZXNwYWNlOiAiLCBjaCwgc3RhcnQsIGxlbmd0aCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcgKCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpICkKLSAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYWRkKCAiU1RBUlRfUFJFRklYX01BUFBJTkciICk7Ci0vLyAgICAgICAgICAgIGFkZCggIiAgcHJlZml4OiAiICsgcHJlZml4ICk7Ci0gICAgICAgICAgICBhZGQoICIgIHVyaTogIiArIHVyaSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBlbmRQcmVmaXhNYXBwaW5nICggU3RyaW5nIHByZWZpeCApIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYWRkKCAiRU5EX1BSRUZJWF9NQVBQSU5HIiApOwotLy8gICAgICAgICAgICBhZGQoICIgIHByZWZpeDogIiArIHByZWZpeCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydENEQVRBICggKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZCggIlNUQVJUX0NEQVRBIiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBlbmRDREFUQSAoICkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBhZGQoICJFTkRfQ0RBVEEiICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RFREICggU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkICkKLSAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYWRkKCAiU1RBUlRfRFREIiApOwotICAgICAgICAgICAgYWRkKCAiICBuYW1lOiAiICsgbmFtZSApOwotICAgICAgICAgICAgYWRkKCAiICBwdWJsaWNJZDogIiArIHB1YmxpY0lkICk7Ci0gICAgICAgICAgICBhZGQoICIgIHN5c3RlbUlkOiAiICsgc3lzdGVtSWQgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgZW5kRFREICggKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZCggIkVORF9EVEQiICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50aXR5ICggU3RyaW5nIG5hbWUgKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZCggIlNUQVJUX0VOVElUWSIgKTsKLSAgICAgICAgICAgIGFkZCggIiAgbmFtZTogIiArIG5hbWUgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgZW5kRW50aXR5ICggU3RyaW5nIG5hbWUgKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZCggIkVORF9FTlRJVFkiICk7Ci0gICAgICAgICAgICBhZGQoICIgIG5hbWU6ICIgKyBuYW1lICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvciAoIExvY2F0b3IgbG9jYXRvciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGFkZCggIlNUQVJUX0RPQ1VNRU5UX0xPQ0FUT1IiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBza2lwcGVkRW50aXR5ICggU3RyaW5nIG5hbWUgKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZCggIlNLSVBQRURfRU5USVRZIiApOwotICAgICAgICAgICAgYWRkKCAiICBuYW1lOiAiICsgbmFtZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZCAoIFN0cmluZyBzICkKLSAgICAgICAgewotICAgICAgICAgICAgX3NiLmFwcGVuZCggcyApOwotICAgICAgICAgICAgX3NiLmFwcGVuZCggIlxuIiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgYWRkICggU3RyaW5nIHMsIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBjY2ggKQotICAgICAgICB7Ci0gICAgICAgICAgICBfc2IuYXBwZW5kKCBzICk7Ci0gICAgICAgICAgICBfc2IuYXBwZW5kKCBidWYsIG9mZiwgY2NoICk7Ci0gICAgICAgICAgICBfc2IuYXBwZW5kKCAiXG4iICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBhZGQgKCBjaGFyW10gYnVmLCBpbnQgb2ZmLCBpbnQgY2NoICkKLSAgICAgICAgewotICAgICAgICAgICAgX3NiLmFwcGVuZCggYnVmLCBvZmYsIGNjaCApOwotICAgICAgICAgICAgX3NiLmFwcGVuZCggIlxuIiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMgKCBPYmplY3QgdGhhdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0b1N0cmluZygpLmVxdWFscyggdGhhdC50b1N0cmluZygpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICggKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3NiLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBfc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRvVGVzdFNheFNhdmVyICggU3RyaW5nIHhtbCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIE1FCi0gICAgICAgIAotICAgICAgICBDb250ZW50IGNvbnRlbnQyID0gbmV3IENvbnRlbnQoKTsKLQotICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKTsKLQotICAgICAgICB4LnNhdmUoIGNvbnRlbnQyLCBjb250ZW50MiApOwotCi0gICAgICAgIC8vIFRIRU0KLQotICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IHNwZiA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU0FYUGFyc2VyIHNwID0gc3BmLm5ld1NBWFBhcnNlcigpOwotICAgICAgICAKLSAgICAgICAgWE1MUmVhZGVyIHhyID0gc3AuZ2V0WE1MUmVhZGVyKCk7Ci0gICAgICAgIAotICAgICAgICBDb250ZW50IGNvbnRlbnQxID0gbmV3IENvbnRlbnQoKTsKLSAgICAgICAgCi0gICAgICAgIHhyLnNldFByb3BlcnR5KCAiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgY29udGVudDEgKTsKLSAgICAgICAgeHIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiLCB0cnVlICk7Ci0gICAgICAgIHhyLnNldEZlYXR1cmUoICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIHRydWUgKTsKLSAgICAgICAgeHIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgZmFsc2UgKTsKLQotICAgICAgICB4ci5zZXRDb250ZW50SGFuZGxlciggY29udGVudDEgKTsKLSAgICAgICAgCi0gICAgICAgIElucHV0U291cmNlIGlzID0gbmV3IElucHV0U291cmNlKCBuZXcgU3RyaW5nUmVhZGVyKCAgeG1sICkgKTsKLQotICAgICAgICB4ci5wYXJzZSggaXMgKTsKLQotCi0gICAgICAgIGlmICghY29udGVudDEuZXF1YWxzKCBjb250ZW50MiApKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJTQVggc2F2ZSBmYWlsdXJlOiAiICk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIHhtbCApOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIlNBWDogIiApOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCBjb250ZW50MS50b1N0cmluZygpICk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiTUU6ICIgKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggY29udGVudDIudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXhTYXZlciAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZG9UZXN0U2F4U2F2ZXIoICI8YSB4bWxucz0nbm5uJz48L2E+IiApOwotICAgICAgICBkb1Rlc3RTYXhTYXZlciggIjxhIHg9J3knPjwhLS0tLT54PGIvPjxjIHA9J3EnPno8L2M+PC9hPiIgKTsKLSAgICAgICAgZG9UZXN0U2F4U2F2ZXIoICI8YSB4PSd5Jz48IS0tLS0+PGI+bW9vPC9iPjxjIHA9J3EnPjwvYz48L2E+IiApOwotICAgICAgICBkb1Rlc3RTYXhTYXZlciggIjxhPmFzYTxiLz5zZHNkPGM+YWF6PC9jPmFkc2FzZDwvYT4iICk7Ci0gICAgICAgIGRvVGVzdFNheFNhdmVyKCAiPGE+PD90YXJnZXQgdmFsdWU/PjwvYT4iICk7Ci0gICAgICAgIGRvVGVzdFNheFNhdmVyKCAiPG46YSB4bWxuczpuPSdubm4nPjwvbjphPiIgKTsKLSAgICAgICAgZG9UZXN0U2F4U2F2ZXIoICI8ajphIHg9J3knIHA9J3EnIHhtbG5zOmo9J2snPjwvajphPiIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgX190ZXN0UGFyc2luZyAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCAxICk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgMTAwMDAwIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHhtbCA9IG1ha2VSYW5kb21Eb2N1bWVudCggciApOwotCi0vLyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIlN0YXJ0aW5nLi4uIiApOwotLy8KLS8vICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCB4bWwgKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIHhtbCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiRmFpbGVkIHBhcnNlIHRlc3Q6IiApOwotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCB4bWwgKTsKLQotICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCAiYzpcXGVlLnhtbCIgKTsKLSAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBwcyA9IG5ldyBQcmludFN0cmVhbSggb3MgKTsKLSAgICAgICAgICAgICAgICBwcy5wcmludGxuKCB4bWwgKTsKLSAgICAgICAgICAgICAgICBwcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIG9zLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotLy8gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJGaW5pc2hlZC4uLiIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvVGVzdExpbmVOdW1iZXJzICggU3RyaW5nIHhtbCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGludCBsaW5lID0gMTsKLSAgICAgICAgaW50IGNvbCA9IDE7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGMgPQotICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgeG1sLCBuZXcgWG1sT3B0aW9ucygpLnNldExvYWRMaW5lTnVtYmVycygpICkuCi0gICAgICAgICAgICAgICAgICAgIG5ld0N1cnNvcigpOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCB4bWwubGVuZ3RoKCkgOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIGNoID0geG1sLmNoYXJBdCggaSApOwotCi0gICAgICAgICAgICBpZiAoY2ggPT0gJzwnICYmIENoYXJhY3Rlci5pc0xldHRlciggeG1sLmNoYXJBdCggaSArIDEgKSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoIWMuY3VycmVudFRva2VuVHlwZSgpLmlzU3RhcnQoKSkKLSAgICAgICAgICAgICAgICAgICAgYy50b05leHRUb2tlbigpOwotCi0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuY3VycmVudFRva2VuVHlwZSgpLmlzU3RhcnQoKSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBYbWxMaW5lTnVtYmVyIGxuID0KLSAgICAgICAgICAgICAgICAgICAgKFhtbExpbmVOdW1iZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICBjLmdldEJvb2ttYXJrKCBYbWxMaW5lTnVtYmVyLmNsYXNzICk7Ci0KLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbG4gIT0gbnVsbCApOwotCi0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGxuLmdldExpbmUoKSAgID09IC0xIHx8IGxuLmdldExpbmUoKSA9PSBsaW5lICk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGxuLmdldENvbHVtbigpID09IC0xIHx8IGxuLmdldENvbHVtbigpID09IGNvbCApOwotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBsbi5nZXRPZmZzZXQoKSA9PSAtMSB8fCBsbi5nZXRPZmZzZXQoKSA9PSBpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2ggPT0gJ1xuJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsaW5lKys7Ci0gICAgICAgICAgICAgICAgY29sPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNvbCsrOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIF9fdGVzdExpbmVOdW1iZXJzICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSYW5kb20gciA9IG5ldyBSYW5kb20oIDEgKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCAxMDAwIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHhtbCA9IG1ha2VSYW5kb21Eb2N1bWVudCggciApOwotCi0vLyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIlN0YXJ0aW5nLi4uIiApOwotLy8KLS8vICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCB4bWwgKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG9UZXN0TGluZU51bWJlcnMoIHhtbCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiRmFpbGVkIGxpbmUgbnVtYmVyIHRlc3Q6IiApOwotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggeG1sICk7Ci0KLSAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggImM6XFxlZS54bWwiICk7Ci0gICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0oIG9zICk7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnRsbiggeG1sICk7Ci0gICAgICAgICAgICAgICAgcHMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBvcy5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLS8vICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiRmluaXNoZWQuLi4iICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEb2NCdWlsZGVyCi0gICAgewotICAgICAgICBSYW5kb20gcjsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiOwotICAgICAgICAKLSAgICAgICAgRG9jQnVpbGRlciAoIFJhbmRvbSBfciwgU3RyaW5nQnVmZmVyIF9zYiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHIgPSBfcjsKLSAgICAgICAgICAgIHNiID0gX3NiOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhcHBlbmQgKCBjaGFyIGNoICkKLSAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCBjaCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB2b2lkIGFwcGVuZCAoIFN0cmluZyBzICkKLSAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCBzICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB3aGl0ZXNwYWNlICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgcCA9IHIubmV4dEludCggMTAwICk7Ci0KLSAgICAgICAgICAgIGlmIChwIDwgMjApCi0gICAgICAgICAgICAgICAgYXBwZW5kKCAnXHQnICk7Ci0gICAgICAgICAgICBlbHNlIGlmIChwIDwgNDApCi0gICAgICAgICAgICAgICAgYXBwZW5kKCAnXG4nICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYXBwZW5kKCAnICcgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdoaXRlc3BhY2VzICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IHIubmV4dEludCggOCApIDsgaSA+IDAgOyBpLS0gKQotICAgICAgICAgICAgICAgIHdoaXRlc3BhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBjaGFyIG1ha2VMZXR0ZXIgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoY2hhcikgKCgoaW50KSAnYScpICsgci5uZXh0SW50KCAyNiApKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgbGV0dGVyICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcHBlbmQoIG1ha2VMZXR0ZXIoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2hhckVudGl0eSAoICkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICggci5uZXh0SW50KCA1ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwIDogYXBwZW5kKCAiJmx0OyIgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEgOiBhcHBlbmQoICImZ3Q7IiApOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMiA6IGFwcGVuZCggIiZhbXA7IiApOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMyA6IGFwcGVuZCggIiZhcG9zOyIgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDQgOiBhcHBlbmQoICImcXVvdDsiICk7IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHRleHQgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIGludCBpID0gci5uZXh0SW50KCAyMCApIDsgaSA+IDAgOyBpLS0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBwID0gci5uZXh0SW50KCAxMDAgKTsKLQotICAgICAgICAgICAgICAgIGlmIChwIDwgNzApCi0gICAgICAgICAgICAgICAgICAgIGxldHRlcigpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHAgPCA3NCkKLSAgICAgICAgICAgICAgICAgICAgY2hhckVudGl0eSgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgd2hpdGVzcGFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBtYWtlTmNOYW1lICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgbmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGFyIGNoID0gbWFrZUxldHRlcigpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNoID09ICd4JyB8fCBjaCA9PSAnWCcpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgbmFtZS5hcHBlbmQoIGNoICk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICggaW50IGkgPSByLm5leHRJbnQoIDIwICkgOyBpID4gMCA7IGktLSApCi0gICAgICAgICAgICAgICAgbmFtZS5hcHBlbmQoIG1ha2VMZXR0ZXIoKSApOwotCi0gICAgICAgICAgICByZXR1cm4gbmFtZS50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgbmNOYW1lICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcHBlbmQoIG1ha2VOY05hbWUoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY29tbWVudCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgYXBwZW5kKCAiPCEtLSIgKTsKLSAgICAgICAgICAgIHRleHQoKTsKLSAgICAgICAgICAgIGFwcGVuZCggIi0tPiIgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgcHJvY2luc3QgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFwcGVuZCggIjw/IiApOwotICAgICAgICAgICAgbmNOYW1lKCk7Ci0KLSAgICAgICAgICAgIGlmIChyLm5leHRJbnQoIDEwMCApIDwgOTApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpdGVzcGFjZSgpOwotICAgICAgICAgICAgICAgIHRleHQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXBwZW5kKCAiPz4iICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB3aGl0ZUNvbnRlbnQgKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHAgPSByLm5leHRJbnQoIDEwMCApOwotCi0gICAgICAgICAgICAgICAgaWYgKHAgPCAyMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocCA8IDUwKQotICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlcygpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHAgPCA3MCkKLSAgICAgICAgICAgICAgICAgICAgY29tbWVudCgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcHJvY2luc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgeG1sRGVjbCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgYXBwZW5kKCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz4iICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbnRlbnQgKCBpbnQgZGVwdGggKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IHIubmV4dEludCggMTAgKSA7IGkgPiAwIDsgaS0tICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKCByLm5leHRJbnQoIDQgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgMCA6Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRDb250ZW50KCBkZXB0aCArIDEgKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGNhc2UgMSA6IHRleHQoKTsgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMiA6IGNvbW1lbnQoKTsgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMyA6IHByb2NpbnN0KCk7ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgYXR0cmlidXRlICggKQotICAgICAgICB7Ci0gICAgICAgICAgICBuY05hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHIubmV4dEludCggMTAwICkgPT0gMCkKLSAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlcygpOwotCi0gICAgICAgICAgICBhcHBlbmQoICc9JyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoci5uZXh0SW50KCAxMDAgKSA9PSAwKQotICAgICAgICAgICAgICAgIHdoaXRlc3BhY2VzKCk7Ci0KLSAgICAgICAgICAgIGNoYXIgcSA9IHIubmV4dEludCggMiApID09IDAgPyAnXCcnIDogJyInOwotCi0gICAgICAgICAgICBhcHBlbmQoIHEgKTsKLQotICAgICAgICAgICAgdGV4dCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhcHBlbmQoIHEgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgZWxlbWVudENvbnRlbnQgKCBpbnQgZGVwdGggKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiBkZXB0aCA9PSAwLCBndWFyYW50ZWUgYW4gZWxlbWVudCwgb3RoZXJ3aXNlLCBhcyBkZXB0aAotICAgICAgICAgICAgLy8gaW5jcmVhc2VzLCB0aGUgcHJvYmFibGlsaXR5IHdlJ2xsIHNwaXQgb3V0IGFuIGVsZW1lbnQKLSAgICAgICAgICAgIC8vIGdldHMgc21hbGxlci4KLQotICAgICAgICAgICAgaWYgKHIubmV4dEludCggZGVwdGggKyAxICkgPD0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG1ha2VOY05hbWUoKTsKLQotICAgICAgICAgICAgICAgIGFwcGVuZCggJzwnICk7Ci0gICAgICAgICAgICAgICAgYXBwZW5kKCBuYW1lICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoci5uZXh0SW50KCAxMDAgKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlcygpOwotCi0gICAgICAgICAgICAgICAgSGFzaE1hcCBhdHRycyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSByLm5leHRJbnQoIDMgKSA7IGkgPiAwIDsgaS0tICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZCggJyAnICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYW5hbWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYW5hbWUgPSBtYWtlTmNOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF0dHJzLmNvbnRhaW5zS2V5KCBhbmFtZSApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYXR0cnMucHV0KCBhbmFtZSwgbnVsbCApOwotCi0gICAgICAgICAgICAgICAgICAgIGFwcGVuZCggYW5hbWUgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoci5uZXh0SW50KCAxMDAgKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVzcGFjZXMoKTsKLQotICAgICAgICAgICAgICAgICAgICBhcHBlbmQoICc9JyApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChyLm5leHRJbnQoIDEwMCApID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlcygpOwotCi0gICAgICAgICAgICAgICAgICAgIGNoYXIgcSA9IHIubmV4dEludCggMiApID09IDAgPyAnXCcnIDogJyInOwotCi0gICAgICAgICAgICAgICAgICAgIGFwcGVuZCggcSApOwotCi0gICAgICAgICAgICAgICAgICAgIHRleHQoKTsKLQotICAgICAgICAgICAgICAgICAgICBhcHBlbmQoIHEgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHIubmV4dEludCggMTAgKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVzcGFjZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhcHBlbmQoICc+JyApOwotCi0gICAgICAgICAgICAgICAgY29udGVudCggZGVwdGggKTsKLQotICAgICAgICAgICAgICAgIGFwcGVuZCggIjwvIiApOwotICAgICAgICAgICAgICAgIGFwcGVuZCggbmFtZSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyLm5leHRJbnQoIDEwMCApID09IDApCi0gICAgICAgICAgICAgICAgICAgIHdoaXRlc3BhY2VzKCk7Ci0KLSAgICAgICAgICAgICAgICBhcHBlbmQoICc+JyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBkb2N1bWVudCAoICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHIubmV4dEludCggMiApID09IDApCi0gICAgICAgICAgICAgICAgeG1sRGVjbCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB3aGl0ZUNvbnRlbnQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZWxlbWVudENvbnRlbnQoIDAgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgd2hpdGVDb250ZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBtYWtlUmFuZG9tRG9jdW1lbnQgKCBSYW5kb20gciApCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgRG9jQnVpbGRlciBkYiA9IG5ldyBEb2NCdWlsZGVyKCByLCBzYiApOwotCi0gICAgICAgIGRiLmRvY3VtZW50KCk7Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RUaGF0QXNzZXJ0SXNPbiAoICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgZmFsc2U7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggVGhyb3dhYmxlIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgICAgICAKLSAgICBzdGF0aWMgY2xhc3MgTXlNYXJrIGV4dGVuZHMgWG1sQm9va21hcmsKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJvb2ttYXJrcyAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28geD0neSc+YWJjZGVmZzwhLS0tLT54eTwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgTXlNYXJrIG0xID0gbmV3IE15TWFyaygpOyBjLnNldEJvb2ttYXJrKCBtMSApOwotICAgICAgICAKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBNeU1hcmsgbTIgPSBuZXcgTXlNYXJrKCk7IGMuc2V0Qm9va21hcmsoIG0yICk7Ci0gICAgICAgIAotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIE15TWFyayBtMyA9IG5ldyBNeU1hcmsoKTsgYy5zZXRCb29rbWFyayggbTMgKTsKLSAgICAgICAgCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgTXlNYXJrIG00ID0gbmV3IE15TWFyaygpOyBjLnNldEJvb2ttYXJrKCBtNCApOwotICAgICAgICAKLSAgICAgICAgYy50b05leHRDaGFyKCAxICk7Ci0gICAgICAgIE15TWFyayBtNSA9IG5ldyBNeU1hcmsoKTsgYy5zZXRCb29rbWFyayggbTUgKTsKLSAgICAgICAgCi0gICAgICAgIGMudG9OZXh0Q2hhciggMyApOwotICAgICAgICBNeU1hcmsgbTYgPSBuZXcgTXlNYXJrKCk7IGMuc2V0Qm9va21hcmsoIG02ICk7Ci0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgTXlNYXJrIG03ID0gbmV3IE15TWFyaygpOyBjLnNldEJvb2ttYXJrKCBtNyApOwotICAgICAgICAKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBNeU1hcmsgbTggPSBuZXcgTXlNYXJrKCk7IGMuc2V0Qm9va21hcmsoIG04ICk7Ci0KLSAgICAgICAgYy50b1N0YXJ0RG9jKCk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0Qm9va21hcmsgICAoIE15TWFyay5jbGFzcyApID09IG0xICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvTmV4dEJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtMiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbTMgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0Qm9va21hcmsoIE15TWFyay5jbGFzcyApID09IG00ICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvTmV4dEJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtNSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbTYgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0Qm9va21hcmsoIE15TWFyay5jbGFzcyApID09IG03ICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvTmV4dEJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtOCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbnVsbCApOwotICAgICAgICAKLSAgICAgICAgYy50b0VuZERvYygpOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0Qm9va21hcmsgICAoIE15TWFyay5jbGFzcyApID09IG04ICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldkJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtNyApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbTYgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QcmV2Qm9va21hcmsoIE15TWFyay5jbGFzcyApID09IG01ICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldkJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtNCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbTMgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QcmV2Qm9va21hcmsoIE15TWFyay5jbGFzcyApID09IG0yICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldkJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtMSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbyB4PSdhJy8+IiApOwotICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy5zZXROYW1lKCBuZXcgUU5hbWUoICJiYXIiICkgKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnNldE5hbWUoIG5ldyBRTmFtZSggInkiICkgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC54bWxUZXh0KCkuZXF1YWxzKCAiPGJhciB5PVwiYVwiLz4iICkgKTsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICAvLyBCYXNpYyBsb2FkIHVwIGEgZmlsZSBhbmQgaXRlcmF0ZSB0aHJvdWdoIGl0Ci0gICAgLy8KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEJhc2ljWG1sKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gbG9hZENhc2UoInRlc3QueG1sIik7Ci0KLSAgICAgICAgaW50IG4gPSAwOwotICAgICAgICAKLSAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgVG9rZW5UeXBlIHQgPSBjLnRvTmV4dFRva2VuKCk7Ci0KLSAgICAgICAgICAgIG4rKzsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHQgPT0gVG9rZW5UeXBlLk5PTkUpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBuID09IDYgKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIE1ha2Ugc3VyZSB0aGUgdG9rZW5zIGdvaW5nIGZvcndhcmQgdGhlIHRoZSByZXZlcnNlIG9mIHRoZSB0b2tlbnMKLSAgICAvLyBnb2luZyBiYWNrd2FyZAotICAgIC8vCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc2lzdGVudFRva2VuT3JkZXIoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXJyYXlMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBsb2FkQ2FzZSgidGVzdC54bWwiKTsKLQotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0uZXJyLnByaW50bG4oYy5jdXJyZW50VG9rZW5UeXBlKCkpOwotICAgICAgICAgICAgbC5hZGQoYy5jdXJyZW50VG9rZW5UeXBlKCkpOwotCi0gICAgICAgICAgICBpZiAoYy50b05leHRUb2tlbigpID09IFRva2VuVHlwZS5OT05FKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgYy50b0VuZERvYygpOwotICAgICAgICAvLyBTeXN0ZW0uZXJyLnByaW50bG4oIlJldmVyc2luZyIpOwotCi0gICAgICAgIGZvciAoIGludCBpID0gbC5zaXplKCkgLSAxIDsgOyBpLS0gKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0uZXJyLnByaW50bG4oYy5jdXJyZW50VG9rZW5UeXBlKCkpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhsLmdldChpKSwgYy5jdXJyZW50VG9rZW5UeXBlKCkpOwotCi0gICAgICAgICAgICBpZiAoYy50b1ByZXZUb2tlbigpID09IFRva2VuVHlwZS5OT05FKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBNYWtlIHN1cmUgeW91IGNhbid0IGluc2VydCB0ZXh0IGJlZm9yZSB0aGUgZG9jIGJlZ2luCi0gICAgLy8gZ29pbmcgYmFja3dhcmQKLSAgICAvLwotCi0gICAgcHVibGljIHZvaWQgdGVzdElsbGVnYWxUZXh0SW5zZXJ0KCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gbG9hZENhc2UoInRlc3QueG1sIik7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGMuaW5zZXJ0Q2hhcnMoICJIbyBobyBobyIgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJEaWQgbm90IGNhdGNoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIE1ha2Ugc3VyZSBnZXRUZXh0IHdvcmtzIGluIGEgYmFzaWMgd2F5Ci0gICAgLy8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RnZXRUZXh0KCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gbG9hZENhc2UoInRlc3QueG1sIik7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0VGV4dFZhbHVlKCkuZXF1YWxzKCAiYWIiICkgKTsgLy8gRG9jIG5vZGUKLQotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldFRleHRWYWx1ZSgpLmVxdWFscyggImFiIiApICk7IC8vIERvYyBlbGVtCi0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXRUZXh0VmFsdWUoKS5lcXVhbHMoICJ5IiApICk7IC8vIEF0dHIgeAotCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0Q2hhcnMoKS5lcXVhbHMoICJhYiIgKSApOyAvLyBUZXh0Ci0KLSAgICAgICAgYy50b05leHRDaGFyKCAxICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldENoYXJzKCkuZXF1YWxzKCAiYiIgKSApOyAvLyBUZXh0Ci0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXRDaGFycygpLmxlbmd0aCgpID09IDAgKTsgICAgICAgLy8gRW5kIHRhZwotCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0Q2hhcnMoKS5sZW5ndGgoKSA9PSAwICk7ICAgICAgIC8vIEVuZCBkb2MKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIFRleHQgWE1MSW5wdXRTdHJlYW0gc3VwcG9ydAotICAgIC8vCi0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0TmFtZSAoCi0gICAgICAgIFhNTE5hbWUgbmFtZSwgU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsLCBTdHJpbmcgcHJlZml4ICkKLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBsb2NhbCAhPSBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgbmFtZVVyaSA9IG5hbWUuZ2V0TmFtZXNwYWNlVXJpKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lTG9jYWwgPSBuYW1lLmdldExvY2FsTmFtZSgpOwotICAgICAgICBTdHJpbmcgbmFtZVByZWZpeCA9IG5hbWUuZ2V0UHJlZml4KCk7Ci0KLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIG5hbWVVcmkgPT0gbnVsbCApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbmFtZVVyaS5lcXVhbHMoIHVyaSApICk7Ci0gICAgICAgIAotICAgICAgICBpZiAobG9jYWwgPT0gbnVsbCkKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBuYW1lTG9jYWwgPT0gbnVsbCApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbmFtZUxvY2FsLmVxdWFscyggbG9jYWwgKSApOwotICAgICAgICAKLSAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIG5hbWVQcmVmaXggPT0gbnVsbCApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbmFtZVByZWZpeC5lcXVhbHMoIHByZWZpeCApICk7Ci0KLSAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcU5hbWUgPSBwcmVmaXggKyAiOiIgKyBsb2NhbDsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBuYW1lLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoIHFOYW1lICkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbmFtZS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKCBsb2NhbCApICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvWG1sU3RyZWFtVGVzdCAoIFN0cmluZyB4bWwgKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKS5uZXdDdXJzb3IoKTsKLSAgICAgICAgWE1MSW5wdXRTdHJlYW0geG1sU3RyZWFtID0gYy5uZXdYTUxJbnB1dFN0cmVhbSgpOwotICAgICAgICBYbWxPYmplY3QgbyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWxTdHJlYW0gKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIG8ueG1sVGV4dCgpLmVxdWFscyggeG1sICkgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9TYXZlclRlc3QgKCBTdHJpbmcgeG1sICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggeG1sICkubmV3Q3Vyc29yKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnhtbFRleHQoKS5lcXVhbHMoIHhtbCApICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBkb1NhdmVUZXN0ICggU3RyaW5nIHhtbCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGRvWG1sU3RyZWFtVGVzdCggeG1sICk7Ci0gICAgICAgIGRvU2F2ZXJUZXN0KCB4bWwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2aW5nICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBkb1NhdmVUZXN0KCAiPGZvbyB4bWxucz1cImZvby5jb21cIj48YmFyPjE8L2Jhcj48L2Zvbz4iICk7Ci0gICAgICAgIGRvU2F2ZVRlc3QoICI8Zm9vPjwhLS1jb21tZW50LS0+PD90YXJnZXQgZm9vPz48L2Zvbz4iICk7Ci0gICAgICAgIGRvU2F2ZVRlc3QoICI8Zm9vPmE8YmFyPmI8L2Jhcj5jPGJhcj5kPC9iYXI+ZTwvZm9vPiIgKTsKLSAgICAgICAgZG9TYXZlVGVzdCggIjxmb28geG1sbnM6eD1cInlcIj48YmFyIHhtbG5zOng9XCJ6XCIvPjwvZm9vPiIgKTsKLSAgICAgICAgZG9TYXZlVGVzdCggIjxmb28geD1cInlcIiBwPVwiclwiLz4iICk7Ci0KLSAgICAgICAgU3RyaW5nIHMgPSAiPGZvbz5hYWE8L2Zvbz5iYmIiOwotICAgICAgICBzID0gcyArIHMgKyBzICsgcyArIHMgKyBzICsgcyArIHMgKyBzICsgcyArIHMgKyBzICsgcyArIHMgKyBzOwotICAgICAgICBzID0gIjxiYXI+eHh4eCIgKyBzICsgIjwvYmFyPiI7Ci0gICAgICAgIAotICAgICAgICBkb1NhdmVUZXN0KCBzICk7Ci0KLSAgICAgICAgWG1sT2JqZWN0IHggPQotICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vIHhtbG5zOmE9J2EuY29tJz48YmFyIHhtbG5zOmE9J2IuY29tJy8+PC9mb28+IiApOwotCi0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLQotICAgICAgICBjLnRvRmlyc3RDaGlsZCgpOwotICAgICAgICBjLnRvRmlyc3RDaGlsZCgpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnhtbFRleHQoKS5lcXVhbHMoICI8YmFyIHhtbG5zOmE9XCJiLmNvbVwiLz4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28geG1sbnM6YT0nYS5jb20nPjxiYXIvPjwvZm9vPiIgKTsKLQotICAgICAgICBjID0geC5uZXdDdXJzb3IoKTsKLQotICAgICAgICBjLnRvRmlyc3RDaGlsZCgpOwotICAgICAgICBjLnRvRmlyc3RDaGlsZCgpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnhtbFRleHQoKS5lcXVhbHMoICI8YmFyIHhtbG5zOmE9XCJhLmNvbVwiLz4iICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0WE1MU3RyZWFtICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgbyA9Ci0gICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGZvbyB4PVwieVwiIHhtbG5zPVwiZGVmYXVsdC5jb21cIj4iICsKLSAgICAgICAgICAgICAgICAgICAgIjwhLS0geCAtLT5iYXI8L2Zvbz4iICk7Ci0gICAgICAgIAotICAgICAgICBYbWxDdXJzb3IgYyA9IG8ubmV3Q3Vyc29yKCk7Ci0gICAgICAgIAotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIAotICAgICAgICBjLmluc2VydEVsZW1lbnQoICJiYXIiLCAiYmFyLmNvbSIgKTsKLSAgICAgICAgCi0gICAgICAgIGMudG9TdGFydERvYygpOwotCi0gICAgICAgIFhNTElucHV0U3RyZWFtIHhpcyA9IGMubmV3WE1MSW5wdXRTdHJlYW0oKTsKLQotICAgICAgICBYTUxFdmVudCB4ZXY7Ci0gICAgICAgIFN0YXJ0RG9jdW1lbnQgc3RhcnREb2N1bWVudDsKLSAgICAgICAgRW5kRG9jdW1lbnQgZW5kRG9jdW1lbnQ7Ci0gICAgICAgIFN0YXJ0RWxlbWVudCBzdGFydEVsZW1lbnQ7Ci0gICAgICAgIEF0dHJpYnV0ZUl0ZXJhdG9yIGF0dHJpYnV0ZUl0ZXJhdG9yOwotICAgICAgICBTdGFydFByZWZpeE1hcHBpbmcgc3RhcnRQcmVmaXhNYXBwaW5nOwotICAgICAgICBFbmRQcmVmaXhNYXBwaW5nIGVuZFByZWZpeE1hcHBpbmc7Ci0gICAgICAgIENoYW5nZVByZWZpeE1hcHBpbmcgY3BtOwotICAgICAgICBFbmRFbGVtZW50IGVuZEVsZW1lbnQ7Ci0gICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGU7Ci0gICAgICAgIENvbW1lbnQgY29tbWVudDsKLSAgICAgICAgQ2hhcmFjdGVyRGF0YSBjaGFyYWN0ZXJEYXRhOwotICAgICAgICBYTUxOYW1lIG5hbWU7Ci0gICAgICAgIFN0cmluZyBzdHI7Ci0gICAgICAgIE1hcCBtYXA7Ci0gICAgICAgIAotICAgICAgICB4ZXYgPSBzdGFydERvY3VtZW50ID0gKFN0YXJ0RG9jdW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuZ2V0VHlwZSgpID09IFhNTEV2ZW50LlNUQVJUX0RPQ1VNRU5UICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAheGV2Lmhhc05hbWUoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggc3RhcnREb2N1bWVudC5pc1N0YXJ0RG9jdW1lbnQoKSApOwotICAgICAgICAKLSAgICAgICAgeGV2ID0gc3RhcnRQcmVmaXhNYXBwaW5nID0gKFN0YXJ0UHJlZml4TWFwcGluZykgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuU1RBUlRfUFJFRklYX01BUFBJTkcgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICF4ZXYuaGFzTmFtZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaXNTdGFydFByZWZpeE1hcHBpbmcoKSApOwotICAgICAgICBzdHIgPSBzdGFydFByZWZpeE1hcHBpbmcuZ2V0TmFtZXNwYWNlVXJpKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBzdHIuZXF1YWxzKCAiZGVmYXVsdC5jb20iICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0YXJ0UHJlZml4TWFwcGluZy5nZXRQcmVmaXgoKS5sZW5ndGgoKSA9PSAwICk7Ci0gICAgICAgIAotICAgICAgICB4ZXYgPSBzdGFydEVsZW1lbnQgPSAoU3RhcnRFbGVtZW50KSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmdldFR5cGUoKSA9PSBYTUxFdmVudC5TVEFSVF9FTEVNRU5UICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaGFzTmFtZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaXNTdGFydEVsZW1lbnQoKSApOwotICAgICAgICBhc3NlcnROYW1lKCBzdGFydEVsZW1lbnQuZ2V0TmFtZSgpLCAiZGVmYXVsdC5jb20iLCAiZm9vIiwgbnVsbCApOwotICAgICAgICBhdHRyaWJ1dGVJdGVyYXRvciA9IHN0YXJ0RWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0TmFtZSggYXR0cmlidXRlLmdldE5hbWUoKSwgbnVsbCwgIngiLCBudWxsICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGUuZ2V0VmFsdWUoKS5lcXVhbHMoICJ5IiApICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGVJdGVyYXRvci5uZXh0KCkgPT0gbnVsbCApOwotICAgICAgICBhdHRyaWJ1dGVJdGVyYXRvciA9IHN0YXJ0RWxlbWVudC5nZXROYW1lc3BhY2VzKCk7Ci0gICAgICAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0TmFtZSggYXR0cmlidXRlLmdldE5hbWUoKSwgbnVsbCwgInhtbG5zIiwgbnVsbCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlLmdldFZhbHVlKCkuZXF1YWxzKCAiZGVmYXVsdC5jb20iICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKSA9PSBudWxsICk7Ci0gICAgICAgIGF0dHJpYnV0ZUl0ZXJhdG9yID0gc3RhcnRFbGVtZW50LmdldEF0dHJpYnV0ZXNBbmROYW1lc3BhY2VzKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGVJdGVyYXRvci5uZXh0KCkgIT0gbnVsbCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlSXRlcmF0b3IubmV4dCgpICE9IG51bGwgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKSA9PSBudWxsICk7Ci0gICAgICAgIG5hbWUgPSBuZXcgWG1sTmFtZUltcGwoIG51bGwsICJ4IiwgbnVsbCApOwotICAgICAgICBhdHRyaWJ1dGUgPSBzdGFydEVsZW1lbnQuZ2V0QXR0cmlidXRlQnlOYW1lKCBuYW1lICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGUgIT0gbnVsbCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlLmdldFZhbHVlKCkuZXF1YWxzKCAieSIgKSApOwotICAgICAgICBuYW1lID0gbmV3IFhtbE5hbWVJbXBsKCBudWxsLCAieG1sbnMiLCBudWxsICk7Ci0gICAgICAgIGF0dHJpYnV0ZSA9IHN0YXJ0RWxlbWVudC5nZXRBdHRyaWJ1dGVCeU5hbWUoIG5hbWUgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZSA9PSBudWxsICk7Ci0gICAgICAgIHN0ciA9IHN0YXJ0RWxlbWVudC5nZXROYW1lc3BhY2VVcmkoIG51bGwgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0ci5lcXVhbHMoICJkZWZhdWx0LmNvbSIgKSApOwotCi0gICAgICAgIHhldiA9IHN0YXJ0UHJlZml4TWFwcGluZyA9IChTdGFydFByZWZpeE1hcHBpbmcpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuZ2V0VHlwZSgpID09IFhNTEV2ZW50LlNUQVJUX1BSRUZJWF9NQVBQSU5HICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAheGV2Lmhhc05hbWUoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmlzU3RhcnRQcmVmaXhNYXBwaW5nKCkgKTsKLSAgICAgICAgc3RyID0gc3RhcnRQcmVmaXhNYXBwaW5nLmdldE5hbWVzcGFjZVVyaSgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggc3RyLmVxdWFscyggImJhci5jb20iICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0YXJ0UHJlZml4TWFwcGluZy5nZXRQcmVmaXgoKS5lcXVhbHMoICJiYXIiICkgKTsKLSAgICAgICAgCi0gICAgICAgIHhldiA9IHN0YXJ0RWxlbWVudCA9IChTdGFydEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuZ2V0VHlwZSgpID09IFhNTEV2ZW50LlNUQVJUX0VMRU1FTlQgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5oYXNOYW1lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5pc1N0YXJ0RWxlbWVudCgpICk7Ci0gICAgICAgIGFzc2VydE5hbWUoIHN0YXJ0RWxlbWVudC5nZXROYW1lKCksICJiYXIuY29tIiwgImJhciIsICJiYXIiICk7Ci0gICAgICAgIGF0dHJpYnV0ZUl0ZXJhdG9yID0gc3RhcnRFbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKSA9PSBudWxsICk7Ci0gICAgICAgIGF0dHJpYnV0ZUl0ZXJhdG9yID0gc3RhcnRFbGVtZW50LmdldE5hbWVzcGFjZXMoKTsKLSAgICAgICAgYXR0cmlidXRlID0gYXR0cmlidXRlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICBhc3NlcnROYW1lKCBhdHRyaWJ1dGUuZ2V0TmFtZSgpLCBudWxsLCAiYmFyIiwgInhtbG5zIiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlLmdldFZhbHVlKCkuZXF1YWxzKCAiYmFyLmNvbSIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlSXRlcmF0b3IubmV4dCgpID09IG51bGwgKTsKLSAgICAgICAgYXR0cmlidXRlSXRlcmF0b3IgPSBzdGFydEVsZW1lbnQuZ2V0QXR0cmlidXRlc0FuZE5hbWVzcGFjZXMoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKSAhPSBudWxsICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGVJdGVyYXRvci5uZXh0KCkgPT0gbnVsbCApOwotICAgICAgICBzdHIgPSBzdGFydEVsZW1lbnQuZ2V0TmFtZXNwYWNlVXJpKCAiYmFyIiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggc3RyLmVxdWFscyggImJhci5jb20iICkgKTsKLSAgICAgICAgbWFwID0gc3RhcnRFbGVtZW50LmdldE5hbWVzcGFjZU1hcCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbWFwLmdldCggImJhciIgKS5lcXVhbHMoICJiYXIuY29tIiApICk7Ci0gICAgICAgIAotICAgICAgICB4ZXYgPSBlbmRFbGVtZW50ID0gKEVuZEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuZ2V0VHlwZSgpID09IFhNTEV2ZW50LkVORF9FTEVNRU5UICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaGFzTmFtZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaXNFbmRFbGVtZW50KCkgKTsKLSAgICAgICAgYXNzZXJ0TmFtZSggZW5kRWxlbWVudC5nZXROYW1lKCksICJiYXIuY29tIiwgImJhciIsICJiYXIiICk7Ci0KLSAgICAgICAgeGV2ID0gZW5kUHJlZml4TWFwcGluZyA9IChFbmRQcmVmaXhNYXBwaW5nKSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmdldFR5cGUoKSA9PSBYTUxFdmVudC5FTkRfUFJFRklYX01BUFBJTkcgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICF4ZXYuaGFzTmFtZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaXNFbmRQcmVmaXhNYXBwaW5nKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGVuZFByZWZpeE1hcHBpbmcuZ2V0UHJlZml4KCkuZXF1YWxzKCAiYmFyIiApICk7Ci0KLSAgICAgICAgeGV2ID0gY29tbWVudCA9IChDb21tZW50KSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmdldFR5cGUoKSA9PSBYTUxFdmVudC5DT01NRU5UICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAheGV2Lmhhc05hbWUoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY29tbWVudC5oYXNDb250ZW50KCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNvbW1lbnQuZ2V0Q29udGVudCgpLmVxdWFscyggIiB4ICIgKSApOwotICAgICAgICAKLSAgICAgICAgeGV2ID0gY2hhcmFjdGVyRGF0YSA9IChDaGFyYWN0ZXJEYXRhKSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmdldFR5cGUoKSA9PSBYTUxFdmVudC5DSEFSQUNURVJfREFUQSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIXhldi5oYXNOYW1lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5pc0NoYXJhY3RlckRhdGEoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5oYXNDb250ZW50KCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuZ2V0Q29udGVudCgpLmVxdWFscyggImJhciIgKSApOwotCi0gICAgICAgIHhldiA9IGVuZEVsZW1lbnQgPSAoRW5kRWxlbWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuRU5EX0VMRU1FTlQgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5oYXNOYW1lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5pc0VuZEVsZW1lbnQoKSApOwotICAgICAgICBhc3NlcnROYW1lKCBlbmRFbGVtZW50LmdldE5hbWUoKSwgImRlZmF1bHQuY29tIiwgImZvbyIsIG51bGwgKTsKLQotICAgICAgICB4ZXYgPSBjcG0gPSAoQ2hhbmdlUHJlZml4TWFwcGluZykgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuQ0hBTkdFX1BSRUZJWF9NQVBQSU5HICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAheGV2Lmhhc05hbWUoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmlzQ2hhbmdlUHJlZml4TWFwcGluZygpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjcG0uZ2V0UHJlZml4KCkubGVuZ3RoKCkgPT0gMCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY3BtLmdldE9sZE5hbWVzcGFjZVVyaSgpLmVxdWFscyggImRlZmF1bHQuY29tIiApICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjcG0uZ2V0TmV3TmFtZXNwYWNlVXJpKCkuZXF1YWxzKCAiIiApICk7Ci0KLSAgICAgICAgeGV2ID0gZW5kRG9jdW1lbnQgPSAoRW5kRG9jdW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuZ2V0VHlwZSgpID09IFhNTEV2ZW50LkVORF9ET0NVTUVOVCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIXhldi5oYXNOYW1lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5pc0VuZERvY3VtZW50KCkgKTsKLSAgICAgICAgCi0gICAgICAgIHhldiA9IHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYgPT0gbnVsbCApOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRlc3QgQ2hhbmdlUHJlZml4TWFwcGluZyBldmVudAotICAgICAgICAvLwotCi0gICAgICAgIG8gPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28geG1sbnM6eD1cInlcIj48YmFyIHhtbG5zOng9XCJ6XCIvPjwvZm9vPiIgKTsKLSAgICAgICAgYyA9IG8ubmV3Q3Vyc29yKCk7Ci0gICAgICAgIHhpcyA9IGMubmV3WE1MSW5wdXRTdHJlYW0oKTsKLSAgICAgICAgCi0gICAgICAgIHN0YXJ0RG9jdW1lbnQgPSAoU3RhcnREb2N1bWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgCi0gICAgICAgIHN0YXJ0UHJlZml4TWFwcGluZyA9IChTdGFydFByZWZpeE1hcHBpbmcpIHhpcy5uZXh0KCk7Ci0gICAgICAgIHN0ciA9IHN0YXJ0UHJlZml4TWFwcGluZy5nZXROYW1lc3BhY2VVcmkoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0ci5lcXVhbHMoICJ5IiApICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBzdGFydFByZWZpeE1hcHBpbmcuZ2V0UHJlZml4KCkuZXF1YWxzKCAieCIgKSApOwotICAgICAgICAKLSAgICAgICAgc3RhcnRFbGVtZW50ID0gKFN0YXJ0RWxlbWVudCkgeGlzLm5leHQoKTsKLQotICAgICAgICBzdGFydFByZWZpeE1hcHBpbmcgPSAoU3RhcnRQcmVmaXhNYXBwaW5nKSB4aXMubmV4dCgpOwotICAgICAgICBzdHIgPSBzdGFydFByZWZpeE1hcHBpbmcuZ2V0TmFtZXNwYWNlVXJpKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBzdHIuZXF1YWxzKCAieiIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggc3RhcnRQcmVmaXhNYXBwaW5nLmdldFByZWZpeCgpLmVxdWFscyggIngiICkgKTsKLSAgICAgICAgCi0gICAgICAgIHN0YXJ0RWxlbWVudCA9IChTdGFydEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBlbmRFbGVtZW50ID0gKEVuZEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0KLSAgICAgICAgY3BtID0gKENoYW5nZVByZWZpeE1hcHBpbmcpIHhpcy5uZXh0KCk7Ci0gICAgICAgIHN0ciA9IGNwbS5nZXRPbGROYW1lc3BhY2VVcmkoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0ci5lcXVhbHMoICJ6IiApICk7Ci0gICAgICAgIHN0ciA9IGNwbS5nZXROZXdOYW1lc3BhY2VVcmkoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0ci5lcXVhbHMoICJ5IiApICk7Ci0gICAgICAgIHN0ciA9IGNwbS5nZXRQcmVmaXgoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0ci5lcXVhbHMoICJ4IiApICk7Ci0KLSAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOwotICAgICAgICAKLSAgICAgICAgZW5kUHJlZml4TWFwcGluZyA9IChFbmRQcmVmaXhNYXBwaW5nKSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZW5kUHJlZml4TWFwcGluZy5nZXRQcmVmaXgoKS5lcXVhbHMoICJ4IiApICk7Ci0KLSAgICAgICAgZW5kRG9jdW1lbnQgPSAoRW5kRG9jdW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICB4ZXYgPSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2ID09IG51bGwgKTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBUZXN0IENoYXJhY3RlckRhdGEgZXZlbnRzCi0gICAgICAgIC8vCi0KLSAgICAgICAgbyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbz5hPGJhcj5iPGJhej5jPC9iYXo+ZDwvYmFyPmU8L2Zvbz4iICk7Ci0gICAgICAgIGMgPSBvLm5ld0N1cnNvcigpOwotICAgICAgICB4aXMgPSBjLm5ld1hNTElucHV0U3RyZWFtKCk7Ci0gICAgICAgIAotICAgICAgICBzdGFydERvY3VtZW50ID0gKFN0YXJ0RG9jdW1lbnQpIHhpcy5uZXh0KCk7Ci0KLSAgICAgICAgc3RhcnRFbGVtZW50ID0gKFN0YXJ0RWxlbWVudCkgeGlzLm5leHQoKTsKLQotICAgICAgICBjaGFyYWN0ZXJEYXRhID0gKENoYXJhY3RlckRhdGEpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmhhc0NvbnRlbnQoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5nZXRDb250ZW50KCkuZXF1YWxzKCAiYSIgKSApOwotCi0gICAgICAgIHN0YXJ0RWxlbWVudCA9IChTdGFydEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBjaGFyYWN0ZXJEYXRhID0gKENoYXJhY3RlckRhdGEpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmhhc0NvbnRlbnQoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5nZXRDb250ZW50KCkuZXF1YWxzKCAiYiIgKSApOwotCi0gICAgICAgIHN0YXJ0RWxlbWVudCA9IChTdGFydEVsZW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBjaGFyYWN0ZXJEYXRhID0gKENoYXJhY3RlckRhdGEpIHhpcy5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmhhc0NvbnRlbnQoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5nZXRDb250ZW50KCkuZXF1YWxzKCAiYyIgKSApOwotCi0gICAgICAgIGVuZEVsZW1lbnQgPSAoRW5kRWxlbWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgCi0gICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJkIiApICk7Ci0KLSAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOwotCi0gICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJlIiApICk7Ci0KLSAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOwotICAgICAgICAKLSAgICAgICAgZW5kRG9jdW1lbnQgPSAoRW5kRG9jdW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICB4ZXYgPSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2ID09IG51bGwgKTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBUZXN0IFN1YlN0cmVhbXMKLSAgICAgICAgLy8KLQotICAgICAgICBvID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmE8YmFyPmI8YmF6PmM8L2Jhej5kPC9iYXI+ZTwvZm9vPiIgKTsKLSAgICAgICAgYyA9IG8ubmV3Q3Vyc29yKCk7Ci0gICAgICAgIHhpcyA9IGMubmV3WE1MSW5wdXRTdHJlYW0oKTsKLSAgICAgICAgCi0gICAgICAgIHN0YXJ0RG9jdW1lbnQgPSAoU3RhcnREb2N1bWVudCkgeGlzLm5leHQoKTsKLQotICAgICAgICBzdGFydEVsZW1lbnQgPSAoU3RhcnRFbGVtZW50KSB4aXMubmV4dCgpOwotCi0gICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJhIiApICk7Ci0KLSAgICAgICAgc3RhcnRFbGVtZW50ID0gKFN0YXJ0RWxlbWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgCi0gICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJiIiApICk7Ci0KLSAgICAgICAgICAgIFhNTElucHV0U3RyZWFtIHhpczIgPSB4aXMuZ2V0U3ViU3RyZWFtKCk7Ci0KLSAgICAgICAgc3RhcnRFbGVtZW50ID0gKFN0YXJ0RWxlbWVudCkgeGlzLm5leHQoKTsKLSAgICAgICAgCi0gICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJjIiApICk7Ci0KLSAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOwotICAgICAgICAKLSAgICAgICAgY2hhcmFjdGVyRGF0YSA9IChDaGFyYWN0ZXJEYXRhKSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5oYXNDb250ZW50KCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuZ2V0Q29udGVudCgpLmVxdWFscyggImQiICkgKTsKLQotICAgICAgICAgICAgc3RhcnRFbGVtZW50ID0gKFN0YXJ0RWxlbWVudCkgeGlzMi5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzMi5uZXh0KCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5oYXNDb250ZW50KCkgKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJjIiApICk7Ci0KLSAgICAgICAgICAgIGVuZEVsZW1lbnQgPSAoRW5kRWxlbWVudCkgeGlzMi5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHhldiA9IHhpczIubmV4dCgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldiA9PSBudWxsICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOwotCi0gICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJlIiApICk7Ci0KLSAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOwotICAgICAgICAKLSAgICAgICAgZW5kRG9jdW1lbnQgPSAoRW5kRG9jdW1lbnQpIHhpcy5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICB4ZXYgPSB4aXMubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2ID09IG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBYbWxDdXJzb3IgbmF2RG9jICggWG1sT2JqZWN0IHgsIFN0cmluZyBkaXJzICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYXZDdXJzb3IoIHgubmV3Q3Vyc29yKCksIGRpcnMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBYbWxDdXJzb3IgbmF2TmV3Q3Vyc29yICggWG1sQ3Vyc29yIGMsIFN0cmluZyBkaXJzICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYXZDdXJzb3IoIGMubmV3Q3Vyc29yKCksIGRpcnMgKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIEZvcm1hdDoKLSAgICAvLwotICAgIC8vICAgICggWy1dW05dIHR5cGUgKSAqCi0gICAgLy8KLSAgICAvLyAgICB0eXBlOgotICAgIC8vCi0gICAgLy8gICAgICBjIC0gY2hhcmFjdGVyCi0gICAgLy8gICAgICB0IC0gdG9rZW4KLSAgICAvLyAgICAgIHAgLSBwYXJlbnQgZWxlbWVudAotICAgIC8vICAgICAgcyAtIHNpYmxpbmcgZWxlbWVudAotICAgIC8vICAgICAgZCAtIGRlc2NlbmRlbnQgKGNoaWxkKSBlbGVtZW50Ci0gICAgLy8gICAgICByIC0gZW5kIG9mIHRoZSBkb2MgKHJvb3QpCi0gICAgLy8gICAgICBiIC0gYmVnaW4gb2YgdGhlIGRvYwotICAgIC8vCi0gICAgCi0gICAgcHJpdmF0ZSBYbWxDdXJzb3IgbmF2Q3Vyc29yICggWG1sQ3Vyc29yIGMsIFN0cmluZyBkaXJzICkKLSAgICB7Ci0gICAgICAgIGludCBuID0gMDsKLSAgICAgICAgYm9vbGVhbiBwcmV2ID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgZGlycy5sZW5ndGgoKSA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSBkaXJzLmNoYXJBdCggaSApOwotCi0gICAgICAgICAgICBpZiAoY2ggPT0gJy0nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByZXYgPSAhIHByZXY7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG4gPSBuICogMTAgKyAoY2ggLSAnMCcpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobiA9PSAwKQotICAgICAgICAgICAgICAgIG4gPSAxOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY2ggPT0gJ2MnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwcmV2KQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZDaGFyKCBuICkgPT0gbiApOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0Q2hhciggbiApID09IG4gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICd0JykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoIG4tLSA+IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYpCi0gICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZUb2tlbigpICE9IFRva2VuVHlwZS5OT05FICk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvTmV4dFRva2VuKCkgIT0gVG9rZW5UeXBlLk5PTkUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAncCcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICEgcHJldiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICggbi0tID4gMCApCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUGFyZW50KCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICdyJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggISBwcmV2ICk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIG4gPT0gMSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGMudG9FbmREb2MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICdiJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggISBwcmV2ICk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIG4gPT0gMSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGMudG9TdGFydERvYygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ3MnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlICggbi0tID4gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJldikKLSAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldlNpYmxpbmcoKSApOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRTaWJsaW5nKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnZCcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICEgcHJldiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICggbi0tID4gMCApCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvRmlyc3RDaGlsZCgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG4gPSAwOwotICAgICAgICAgICAgcHJldiA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RPcHMgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4LCB4MiwgeTsKLSAgICAgICAgWG1sQ3Vyc29yIGNGcm9tLCBjVG8sIGNUZW1wLCBjVGVtcDIsIGMsIGQ7Ci0gICAgICAgIFhtbEJvb2ttYXJrIGFubm87Ci0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbz5hYmNkZWY8L2Zvbz4iICk7Ci0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZCIgKTsKLSAgICAgICAgY1RvID0gbmF2TmV3Q3Vyc29yKCBjRnJvbSwgIiIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFjRnJvbS5tb3ZlWG1sKCBjVG8gKSApOwotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICAKLSAgICAgICAgb3B0aW9ucy5wdXQoCi0gICAgICAgICAgICBYbWxPcHRpb25zLlNBVkVfU1lOVEhFVElDX0RPQ1VNRU5UX0VMRU1FTlQsCi0gICAgICAgICAgICBuZXcgUU5hbWUoIG51bGwsICJiYXIiICkgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCggb3B0aW9ucyApLmVxdWFscyggIjxiYXI+W0ZST01dW1RPXTxmb28+YWJjZGVmPC9mb28+PC9iYXI+IiApIHx8Ci0gICAgICAgICAgICAgICAgeC54bWxUZXh0KCBvcHRpb25zICkuZXF1YWxzKCAiPGJhcj5bVE9dW0ZST01dPGZvbz5hYmNkZWY8L2Zvbz48L2Jhcj4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmFiY2RlZjwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZCIgKTsKLSAgICAgICAgY1RvID0gbmF2TmV3Q3Vyc29yKCBjRnJvbSwgInR0dCIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFjRnJvbS5tb3ZlWG1sKCBjVG8gKSApOwotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCggb3B0aW9ucyApLmVxdWFscyggIjxiYXI+W0ZST01dPGZvbz5hYmNkZWY8L2Zvbz5bVE9dPC9iYXI+IiApICk7Ci0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbz5hYmNkZWY8L2Zvbz4iICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgImQiICk7Ci0gICAgICAgIGNUbyA9IG5hdk5ld0N1cnNvciggY0Zyb20sICJ0M2MiICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhY0Zyb20ubW92ZVhtbCggY1RvICkgKTsKLSAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB4LnhtbFRleHQoIG9wdGlvbnMgKS5lcXVhbHMoICI8YmFyPltGUk9NXTxmb28+YWJjW1RPXWRlZjwvZm9vPjwvYmFyPiIgKSApOwotICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxyPjxhPnh5ejwvYT48Yj5wcXI8L2I+PC9yPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZGQiICk7Ci0gICAgICAgIGNUbyA9IG5hdk5ld0N1cnNvciggY0Zyb20sICJyLTF0IiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20ubW92ZVhtbCggY1RvICkgKTsKLSAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoICI8cj5bRlJPTV08Yj5wcXI8L2I+PGE+eHl6PC9hPltUT108L3I+IiApICk7Ci0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHI+PGE+eHl6PC9hPjxiPnBxcjwvYj5BQjwvcj4iICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgImRkIiApOwotICAgICAgICBjVG8gPSBuYXZOZXdDdXJzb3IoIGNGcm9tLCAici0xdC0xYyIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLm1vdmVYbWwoIGNUbyApICk7Ci0gICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgeC54bWxUZXh0KCkuZXF1YWxzKCAiPHI+W0ZST01dPGI+cHFyPC9iPkE8YT54eXo8L2E+W1RPXUI8L3I+IiApICk7Ci0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHI+PGE+eHl6PC9hPjxiPnBxcjwvYj5BQjwvcj4iICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgImRkIiApOwotICAgICAgICBjVG8gPSBuYXZOZXdDdXJzb3IoIGNGcm9tLCAic3RjIiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20ubW92ZVhtbCggY1RvICkgKTsKLSAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoICI8cj5bRlJPTV08Yj5wPGE+eHl6PC9hPltUT11xcjwvYj5BQjwvcj4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8cj48YT54eXo8L2E+PGI+cHFyPC9iPkFCPC9yPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZGQiICk7Ci0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgImQiICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5tb3ZlWG1sKCBjVG8gKSApOwotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICB0ZXN0VGV4dEZyYWcoIHgueG1sVGV4dCgpLCAiPGE+eHl6PC9hPltUT108cj5bRlJPTV08Yj5wcXI8L2I+QUI8L3I+IiApOwotICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxyPjxhPnh5ejwvYT48Yj5wcXI8L2I+QUI8L3I+IiApOwotICAgICAgICAKLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICJkZCIgKTsKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiciIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLm1vdmVYbWwoIGNUbyApICk7Ci0gICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgeC54bWxUZXh0KCBvcHRpb25zICkuZXF1YWxzKCAiPGJhcj48cj5bRlJPTV08Yj5wcXI8L2I+QUI8L3I+PGE+eHl6PC9hPltUT108L2Jhcj4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8cj48YT54eXo8L2E+PC9yPiIgKTsKLSAgICAgICAgeDIgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxzPjwvcz4iICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgImRkIiApOwotICAgICAgICBjVG8gPSBuYXZEb2MoIHgyLCAiZHQiICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5tb3ZlWG1sKCBjVG8gKSApOwotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIHgueG1sVGV4dCgpLmVxdWFscyggIjxyPltGUk9NXTwvcj4iICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgyLnhtbFRleHQoKS5lcXVhbHMoICI8cz48YT54eXo8L2E+W1RPXTwvcz4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8cj48YT5wcTwvYT48Yj48L2I+PC9yPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZGQiICk7Ci0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgImRkc3QiICk7Ci0gICAgICAgIGNUZW1wID0gbmF2RG9jKCB4LCAiZGR0MWMiICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5tb3ZlWG1sKCBjVG8gKSApOwotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLSAgICAgICAgY1RlbXAuaW5zZXJ0Q2hhcnMoICJbVEVNUF0iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoICI8cj5bRlJPTV1bVEVNUF08Yj48YT5wcTwvYT5bVE9dPC9iPjwvcj4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmFiY2RlZjwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiMnQyYyIgKTsKLSAgICAgICAgY1RvID0gbmF2TmV3Q3Vyc29yKCBjRnJvbSwgIi0xYyIgKTsKLSAgICAgICAgY0Zyb20ubW92ZUNoYXJzKCAyLCBjVG8gKTsKLSAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vPmFjZFtUT11iW0ZST01dZWY8L2Zvbz4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmFiY2RlZjwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiMnQyYyIgKTsKLSAgICAgICAgY1RvID0gbmF2TmV3Q3Vyc29yKCBjRnJvbSwgIjNjIiApOwotICAgICAgICBjRnJvbS5tb3ZlQ2hhcnMoIDIsIGNUbyApOwotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCgpLmVxdWFscyggIjxmb28+YWJbRlJPTV1lY2RbVE9dZjwvZm9vPiIgKSApOwotICAgIAotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGJhcj48Zm9vPmFiY2RlZjwvZm9vPjxmb28+MTIzNDU2PC9mb28+PC9iYXI+IiApOwotICAgICAgICAKLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICIzdDJjIiApOwotICAgICAgICBjVG8gPSBuYXZOZXdDdXJzb3IoIGNGcm9tLCAiM3QzYyIgKTsKLSAgICAgICAgY0Zyb20ubW92ZUNoYXJzKCAyLCBjVG8gKTsKLSAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgIjxiYXI+PGZvbz5hYltGUk9NXWVmPC9mb28+PGZvbz4xMjNjZFtUT100NTY8L2Zvbz48L2Jhcj4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YmFyPjxmb28+YWJjZGVmPC9mb28+PGZvbz4xMjM0NTY8L2Zvbz48L2Jhcj4iICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgIjJkIiApOwotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICIyZHN0MmMiICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5jb3B5WG1sKCBjVG8gKSApOwotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAiPGJhcj5bRlJPTV08Zm9vPmFiY2RlZjwvZm9vPjxmb28+MTIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8Zm9vPmFiY2RlZjwvZm9vPltUT10zNDU2PC9mb28+PC9iYXI+IiApICk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxyPjxhPnh5ejwvYT48L3I+IiApOwotICAgICAgICB4MiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHM+PC9zPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZGQiICk7Ci0gICAgICAgIGNUbyA9IG5hdkRvYyggeDIsICJkdCIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLmNvcHlYbWwoIGNUbyApICk7Ci0gICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAgeC54bWxUZXh0KCkuZXF1YWxzKCAiPHI+W0ZST01dPGE+eHl6PC9hPjwvcj4iICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgyLnhtbFRleHQoKS5lcXVhbHMoICI8cz48YT54eXo8L2E+W1RPXTwvcz4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAiPGJhcj48Zm9vPmFiY2RlZjwvZm9vPmJsYWg8Zm9vPjEyMzQ1NjwvZm9vPjwvYmFyPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiMmQiICk7Ci0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgIjJkc3QyYyIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLmNvcHlYbWwoIGNUbyApICk7Ci0gICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgeC54bWxUZXh0KCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICI8YmFyPltGUk9NXTxmb28+YWJjZGVmPC9mb28+YmxhaDxmb28+MTIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8Zm9vPmFiY2RlZjwvZm9vPltUT10zNDU2PC9mb28+PC9iYXI+IiApICk7Ci0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgIjxiYXI+PGZvbyB4PSd5Jz5hYmNkZWY8L2Zvbz48Zm9vPjEyMzQ1NjwvZm9vPjc4OTA8L2Jhcj4iICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgIjJkdCIgKTsKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiMmRzdCIgKTsKLSAgICAgICAgY1RlbXAgPSBuYXZEb2MoIHgsICIyZHN0M2MiICk7Ci0gICAgICAgIGNUZW1wMiA9IG5hdkRvYyggeCwgIjJkczN0MmMiICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5jb3B5WG1sKCBjVG8gKSApOwotICAgICAgICBjVGVtcC5pbnNlcnRDaGFycyggIltURU1QXSIgKTsKLSAgICAgICAgY1RlbXAyLmluc2VydENoYXJzKCAiW1RFTVAyXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAiPGJhcj48Zm9vIHg9XCJ5XCI+YWJjZGVmPC9mb28+IiArCi0gICAgICAgICAgICAgICAgICAgICI8Zm9vIHg9XCJ5XCI+MTIzW1RFTVBdNDU2PC9mb28+NzhbVEVNUDJdOTA8L2Jhcj4iICkgKTsKLQotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgIjxiYXI+eHk8Zm9vIHg9J3knPmFiY2RlZjwvZm9vPnBxcjxmb28+MTIzNDU2PC9mb28+PC9iYXI+IiApOwotICAgICAgICAKLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICIyZCIgKTsKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiMmRzLTJjIiApOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLnJlbW92ZVhtbCgpICk7Ci0KLSAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgIjxiYXI+eHlbRlJPTV1wW1RPXXFyPGZvbz4xMjM0NTY8L2Zvbz48L2Jhcj4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAiPGJhcj54eTxmb28geD0neSc+YWJjZGVmPC9mb28+cHFyPGZvbz4xMjM0NTY8L2Zvbz48L2Jhcj4iICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgIjJkMnQyYyIgKTsKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiMmQydDVjIiApOwotICAgICAgICAKLSAgICAgICAgY0Zyb20ucmVtb3ZlQ2hhcnMoIDIgKTsKLQotICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKLSAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgIHgueG1sVGV4dCgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAiPGJhcj54eTxmb28geD1cInlcIj5hYltGUk9NXWVbVE9dZiIgKwotICAgICAgICAgICAgICAgICAgICAiPC9mb28+cHFyPGZvbz4xMjM0NTY8L2Zvbz48L2Jhcj4iICkgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YmFyPjwhLS0tLT5hYmM8L2Jhcj4iICk7Ci0gICAgICAgIAotICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgInR0IiApOwotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICJ0dHRjIiApOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLnJlbW92ZVhtbCgpICk7Ci0KLSAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7Ci0gICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscyggIjxiYXI+W0ZST01dYVtUT11iYzwvYmFyPiIgKSApOwotCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICJ0IiApOwotICAgICAgICBjVG8uaW5zZXJ0RWxlbWVudCggImJvbyIgKTsKLSAgICAgICAgY1RvLnRvUHJldlRva2VuKCk7Ci0gICAgICAgIGNUby5pbnNlcnRFbGVtZW50KCAibW9vIiApOwotICAgICAgICBjVG8udG9QcmV2VG9rZW4oKTsKLSAgICAgICAgY1RvLmluc2VydEVsZW1lbnQoICJnb28iICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscygKLSAgICAgICAgICAgICI8Ym9vPjxtb28+PGdvby8+PC9tb28+PC9ib28+IiApICk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgInQiICk7Ci0gICAgICAgIGNUby5pbnNlcnRFbGVtZW50KCAiYm9vIiApOwotICAgICAgICBjVG8udG9QcmV2VG9rZW4oKTsKLSAgICAgICAgY1RvLmluc2VydEVsZW1lbnQoICJtb28iICk7Ci0gICAgICAgIGNUby50b1ByZXZUb2tlbigpOwotICAgICAgICBjVG8uaW5zZXJ0QXR0cmlidXRlV2l0aFZhbHVlKCAieCIsICJ5IiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoCi0gICAgICAgICAgICAiPGJvbz48bW9vIHg9XCJ5XCIvPjwvYm9vPiIgKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGJhciB4PSd5Jz5hYmM8L2Jhcj4iICk7Ci0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgInR0IiApOwotICAgICAgICBjVG8uaW5zZXJ0QXR0cmlidXRlV2l0aFZhbHVlKCAicCIsICJxIiApOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscygKLSAgICAgICAgICAgICI8YmFyIHA9XCJxXCIgeD1cInlcIj5hYmM8L2Jhcj4iICkgKTsKLQotICAgICAgICAvLyBUZXh0IFhtbEJvb2ttYXJrCi0KLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHI+PGZvbz5hYmM8L2Zvbz48YmFyPjwvYmFyPjwvcj4iICk7Ci0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAidHQiICk7Ci0gICAgICAgIGFubm8gPSBuZXcgQW5ubygpOwotICAgICAgICBjRnJvbS5zZXRCb29rbWFyayggYW5ubyApOwotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICI2dCIgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLm1vdmVYbWwoIGNUbyApICk7Ci0gICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOwotICAgICAgICBhbm5vLmNyZWF0ZUN1cnNvcigpLmluc2VydENoYXJzKCAiW0FOTk9dIiApOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscygKLSAgICAgICAgICAgICI8cj5bRlJPTV08YmFyPltBTk5PXTxmb28+YWJjPC9mb28+W1RPXTwvYmFyPjwvcj4iICkgKTsKLQotICAgICAgICAvLyBUZXN0IGNvbnRlbnQgb3BzCi0KLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbyB4PSd5Jz5hYmM8L2Zvbz4iICk7Ci0gICAgICAgIHkgPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBkID0geS5uZXdDdXJzb3IoKTsKLSAgICAgICAgZC50b05leHRUb2tlbigpOwotICAgICAgICB4Lm5ld0N1cnNvcigpLm1vdmVYbWxDb250ZW50cyggZCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeS54bWxUZXh0KCkuZXF1YWxzKCAiPGZvbyB4PVwieVwiPmFiYzwvZm9vPiIgKSApOwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGJhcj48Zm9vIHg9J3knPmFiYzwvZm9vPjwvYmFyPiIgKTsKLSAgICAgICAgeSA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGQgPSB5Lm5ld0N1cnNvcigpOwotICAgICAgICBkLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMubW92ZVhtbENvbnRlbnRzKCBkICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB5LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vIHg9XCJ5XCI+YWJjPC9mb28+IiApICk7Ci0KLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGJhcj48Zm9vIHg9J3knPmFiYzwvZm9vPjwvYmFyPiIgKTsKLSAgICAgICAgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy5yZW1vdmVYbWxDb250ZW50cygpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC54bWxUZXh0KCkuZXF1YWxzKCAiPGJhci8+IiApICk7Ci0KLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbyB4PSd5Jz5hYmM8L2Zvbz4iICk7Ci0gICAgICAgIHkgPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBkID0geS5uZXdDdXJzb3IoKTsKLSAgICAgICAgZC50b05leHRUb2tlbigpOwotICAgICAgICB4Lm5ld0N1cnNvcigpLmNvcHlYbWxDb250ZW50cyggZCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeS54bWxUZXh0KCkuZXF1YWxzKCAiPGZvbyB4PVwieVwiPmFiYzwvZm9vPiIgKSApOwotICAgIH0gICAgICAgIAotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbm5vIGV4dGVuZHMgWG1sQm9va21hcmsKLSAgICB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeDsKLSAgICAgICAgWG1sQ3Vyc29yIGNUbzsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmFiY2RlZjwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vPmFiY2RlZjwvZm9vPiIgKSApOwotCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmEmbHQ7YiZhbXA7YzwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vPmEmbHQ7YiZhbXA7YzwvZm9vPiIgKSApOwotCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPjwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgImR0IiApOwotICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICImPCIgKTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vPiZhbXA7Jmx0OzwvZm9vPiIgKSApOwotCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPjxib28+YmFyPC9ib28+PC9mb28+IiApOwotICAgICAgICAKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiZHQiICk7Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY1RvLnhtbFRleHQoKS5lcXVhbHMoICI8Ym9vPmJhcjwvYm9vPiIgKSApOwotCi0gICAgICAgIC8vCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPjxib28geD1cInlcIj5iYXI8L2Jvbz48L2Zvbz4iICk7Ci0gICAgICAgIAotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICJkdCIgKTsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjVG8ueG1sVGV4dCgpLmVxdWFscyggIjxib28geD1cInlcIj5iYXI8L2Jvbz4iICkgKTsKLQotICAgICAgICAvLyBUZXN0cyBmcmFnbWVudCBzYXZpbmcgYW5kIGxvYWRpbmcKLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28+RXJpYzwvZm9vPiIgKTsKLSAgICAgICAgCi0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgImR0IiApOwotCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggY1RvLnhtbFRleHQoKSApOwotICAgICAgICAKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiIiApOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNUby5nZXRUZXh0VmFsdWUoKS5lcXVhbHMoICJFcmljIiApICk7Ci0KLSAgICAgICAgLy8gdGVzdCBzYXZlIHdoZXJlIEkgcmVwbGFjZSB0aGUgbmFtZSBvZiBhbiBlbGVtZW50Ci0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPkVyaWM8L2Zvbz4iICk7Ci0gICAgICAgIAotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICJkIiApOwotCi0gICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgIAotICAgICAgICBvcHRpb25zLnB1dCgKLSAgICAgICAgICAgIFhtbE9wdGlvbnMuU0FWRV9TWU5USEVUSUNfRE9DVU1FTlRfRUxFTUVOVCwKLSAgICAgICAgICAgIG5ldyBRTmFtZSggbnVsbCwgImJhciIgKSApOwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCBjVG8ueG1sVGV4dCggb3B0aW9ucyApICk7Ci0gICAgICAgIAotICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICIiICk7Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY1RvLnhtbFRleHQoKS5lcXVhbHMoICI8YmFyPkVyaWM8L2Jhcj4iICkgKTsKLQotICAgICAgICAvLyB0ZXN0IHNhdmUgd2hlcmUgSSByZXBsYWNlIHRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudAotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbz5FcmljPC9mb28+IiApOwotICAgICAgICAKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiIiApOwotCi0gICAgICAgIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICAKLSAgICAgICAgb3B0aW9ucy5wdXQoCi0gICAgICAgICAgICBYbWxPcHRpb25zLlNBVkVfU1lOVEhFVElDX0RPQ1VNRU5UX0VMRU1FTlQsCi0gICAgICAgICAgICBuZXcgUU5hbWUoIG51bGwsICJiYXIiICkgKTsKLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggY1RvLnhtbFRleHQoIG9wdGlvbnMgKSApOwotICAgICAgICAKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiIiApOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICBjVG8ueG1sVGV4dCgpLmVxdWFscyggIjxiYXI+PGZvbz5FcmljPC9mb28+PC9iYXI+IiApICk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8KLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxhIHhtbG5zPSdmb28nLz4iICk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIGMudG9GaXJzdENvbnRlbnRUb2tlbigpOwotICAgICAgICBjLnRvRmlyc3RDb250ZW50VG9rZW4oKTsKLQotICAgICAgICBjLmluc2VydEVsZW1lbnQoICJiIiApOwotICAgICAgICBjLnRvUHJldlNpYmxpbmcoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyggImIiICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDAgKTsKLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggeC54bWxUZXh0KCkgKTsKLSAgICAgICAgCi0gICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICAKLSAgICAgICAgYy50b0ZpcnN0Q29udGVudFRva2VuKCk7Ci0gICAgICAgIGMudG9GaXJzdENvbnRlbnRUb2tlbigpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJiIiApICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RUZXh0RnJhZyAoIFN0cmluZyBhY3R1YWwsIFN0cmluZyBleHBlY3RlZCApCi0gICAgewotICAgICAgICBTdHJpbmcgcHJlID0gIjx4bWwtZnJhZ21lbnQ+IjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBwb3N0ID0gIjwveG1sLWZyYWdtZW50PiI7Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYWN0dWFsLnN0YXJ0c1dpdGgoIHByZSApICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhY3R1YWwuZW5kc1dpdGgoIHBvc3QgKSApOwotICAgICAgICAKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICAgICBleHBlY3RlZC5lcXVhbHMoCi0gICAgICAgICAgICAgICAgYWN0dWFsLnN1YnN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgcHJlLmxlbmd0aCgpLCBhY3R1YWwubGVuZ3RoKCkgLSBwb3N0Lmxlbmd0aCgpICkgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUZyYWcgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4OwotICAgICAgICBYbWxDdXJzb3IgYzsKLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICAKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICAKLSAgICAgICAgYy5pbnNlcnRDaGFycyggIkVyaWMiICk7Ci0KLSAgICAgICAgdGVzdFRleHRGcmFnKCB4LnhtbFRleHQoKSwgIkVyaWMiICk7Ci0KLSAgICAgICAgLy8KLQotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICBjID0geC5uZXdDdXJzb3IoKTsKLQotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0KLSAgICAgICAgYy5pbnNlcnRDb21tZW50KCAiIiApOwotICAgICAgICBjLmluc2VydENoYXJzKCAieCIgKTsKLSAgICAgICAgCi0gICAgICAgIHRlc3RUZXh0RnJhZyggeC54bWxUZXh0KCksICI8IS0tLS0+eCIgKTsKLQotICAgICAgICAvLwotCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLQotICAgICAgICBjLmluc2VydEVsZW1lbnQoICJmb28iICk7Ci0gICAgICAgIGMuaW5zZXJ0Q2hhcnMoICJ4IiApOwotICAgICAgICAKLSAgICAgICAgdGVzdFRleHRGcmFnKCB4LnhtbFRleHQoKSwgIjxmb28vPngiICk7Ci0gICAgICAgIAotICAgICAgICAvLwotCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLQotICAgICAgICBjLmluc2VydEVsZW1lbnQoICJmb28iICk7Ci0gICAgICAgIGMuaW5zZXJ0RWxlbWVudCggImJhciIgKTsKLSAgICAgICAgCi0gICAgICAgIHRlc3RUZXh0RnJhZyggeC54bWxUZXh0KCksICI8Zm9vLz48YmFyLz4iICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeDsKLSAgICAgICAgCi0gICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgIAotICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5MT0FEX1JFUExBQ0VfRE9DVU1FTlRfRUxFTUVOVCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgeCA9Ci0gICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGJhciBwPSdxJyB4PSd5Jz5hYjxmb28+eHk8L2Zvbz5jZDwvYmFyPiIsIG9wdGlvbnMgKTsKLSAgICAgICAgCi0gICAgICAgIFhtbEN1cnNvciBjID0gbmF2RG9jKCB4LCAidCIgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBjLmN1cnJlbnRUb2tlblR5cGUoKSA9PSBUb2tlblR5cGUuQVRUUiApOwotCi0gICAgICAgIFN0cmluZyBvcGVuID0gInhtbG5zOm9wZW49J2h0dHA6Ly93d3cub3BlbnVyaS5vcmcvZnJhZ21lbnQnIjsKLSAgICAgICAgCi0gICAgICAgIHggPQotICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxvcGVuOmZyYWdtZW50IHA9J3EnIHg9J3knICIgKyBvcGVuICsKLSAgICAgICAgICAgICAgICAgICAgIj5hYjxmb28+eHk8L2Zvbz5jZDwvb3BlbjpmcmFnbWVudD4iICk7Ci0gICAgICAgIAotICAgICAgICBjID0gbmF2RG9jKCB4LCAidCIgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBjLmN1cnJlbnRUb2tlblR5cGUoKSA9PSBUb2tlblR5cGUuQVRUUiApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZSAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHg7Ci0gICAgICAgIFhtbEN1cnNvciBjRnJvbSwgY1RvOwotCi0gICAgICAgIC8vIEZvcndhcmQgbmF2aWdhdGlvbiAKLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxiYXIgcD0ncScgeD0neSc+YWI8Zm9vPnh5PC9mb28+Y2Q8L2Jhcj4iICk7Ci0KLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICIiICk7Ci0gICAgICAgIGNUbyA9IG5hdkRvYyggeCwgIiIgKTsKLSAgICAgICAgICAgIAotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20uY29tcGFyZVBvc2l0aW9uKCBjVG8gKSA9PSAwICk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20uaXNBdFNhbWVQb3NpdGlvbkFzKCBjVG8gKSApOwotCi0gICAgICAgICAgICBUb2tlblR5cGUgdHQgPSBjRnJvbS5jdXJyZW50VG9rZW5UeXBlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh0dCA9PSBUb2tlblR5cGUuRU5ERE9DKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodHQgPT0gVG9rZW5UeXBlLlRFWFQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY0Zyb20udG9OZXh0Q2hhciggMSApOwotICAgICAgICAgICAgICAgIGNUby50b05leHRDaGFyKCAxICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY0Zyb20udG9OZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICBjVG8udG9OZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEJhY2t3YXJkIG5hdmlnYXRpb24gCi0gICAgICAgIAotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YmFyIHA9J3EnIHg9J3knPmFiPGZvbz54eTwvZm9vPmNkPC9iYXI+IiApOwotCi0gICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiciIgKTsKLSAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiciIgKTsKLSAgICAgICAgICAgIAotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20uY29tcGFyZVBvc2l0aW9uKCBjVG8gKSA9PSAwICk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20uaXNBdFNhbWVQb3NpdGlvbkFzKCBjVG8gKSApOwotCi0gICAgICAgICAgICBpZiAoY0Zyb20udG9QcmV2Q2hhciggMSApID09IDEpCi0gICAgICAgICAgICAgICAgY1RvLnRvUHJldkNoYXIoIDEgKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGNGcm9tLnRvUHJldlRva2VuKCkgIT0gVG9rZW5UeXBlLk5PTkUpCi0gICAgICAgICAgICAgICAgY1RvLnRvUHJldlRva2VuKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgIjxiYXIgcD0ncScgeD0neSc+YWI8Zm9vPnh5PC9mb28+YzxmIHk9J3gnPnh5PC9mPmQ8L2Jhcj4iICk7Ci0KLSAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICIiICk7Ci0KLSAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiIiApOwotCi0gICAgICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjVG8uaXNBdFNhbWVQb3NpdGlvbkFzKCBjRnJvbSApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFwYXNzZWQgKTsKLSAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoY1RvLmlzTGVmdE9mKCBjRnJvbSApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFwYXNzZWQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHBhc3NlZCApOwotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY1RvLmlzUmlnaHRPZiggY0Zyb20gKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoY1RvLnRvTmV4dENoYXIoIDEgKSAhPSAxKQotICAgICAgICAgICAgICAgICAgICBpZiAoY1RvLnRvTmV4dFRva2VuKCkgPT0gVG9rZW5UeXBlLkVORERPQykKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY0Zyb20udG9OZXh0Q2hhciggMSApICE9IDEpCi0gICAgICAgICAgICAgICAgaWYgKGNGcm9tLnRvTmV4dFRva2VuKCkgPT0gVG9rZW5UeXBlLkVORERPQykKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgTXlBbm5vIGV4dGVuZHMgWG1sQm9va21hcmsKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24gKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vLz4iICk7Ci0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBNeUFubm8gYSA9IG5ldyBNeUFubm8oKTsKLSAgICAgICAgYy5zZXRCb29rbWFyayggYSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5yZW1vdmVYbWwoKSApOwotICAgICAgICBYbWxDdXJzb3IgYzIgPSBhLmNyZWF0ZUN1cnNvcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYzIgPT0gbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0clNldHRlciAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28vPiIgKTsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMuc2V0QXR0cmlidXRlVGV4dCggbmV3IFFOYW1lKCBudWxsLCAieCIgKSwgImhhcmRlaGFyIiApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC54bWxUZXh0KCkuZXF1YWxzKCAiPGZvbyB4PVwiaGFyZGVoYXJcIi8+IiApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3ROYXZpZ2F0aW9uICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGE+PHgvPjx5Lz48ei8+PC9hPiIgKTsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRTaWJsaW5nKCkgPT0gZmFsc2UgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QcmV2U2libGluZygpID09IGZhbHNlICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvRmlyc3RBdHRyaWJ1dGUoKSA9PSBmYWxzZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b0xhc3RBdHRyaWJ1dGUoKSA9PSBmYWxzZSApOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0U2libGluZygpID09IHRydWUgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyggInkiICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0U2libGluZygpID09IHRydWUgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyggInoiICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0U2libGluZygpID09IGZhbHNlICk7Ci0KLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGEgcD0ncScgbT0nbic+PHgvPjx5Lz48ei8+PC9hPiIgKTsKLSAgICAgICAgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5jdXJyZW50VG9rZW5UeXBlKCkuaXNBdHRyKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QcmV2U2libGluZygpID09IGZhbHNlICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmN1cnJlbnRUb2tlblR5cGUoKS5pc0F0dHIoKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRTaWJsaW5nKCkgPT0gdHJ1ZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAieCIgKSApOwotCi0gICAgICAgIGMudG9FbmREb2MoKTsKLSAgICAgICAgYy50b1ByZXZUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZTaWJsaW5nKCkgPT0gdHJ1ZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAieiIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZTaWJsaW5nKCkgPT0gdHJ1ZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAieSIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZTaWJsaW5nKCkgPT0gdHJ1ZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAieCIgKSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZTaWJsaW5nKCkgPT0gZmFsc2UgKTsKLSAgICAgICAgCi0gICAgICAgIGMudG9FbmREb2MoKTsKLSAgICAgICAgYy50b1ByZXZUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1BhcmVudCgpID09IHRydWUgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyggImEiICkgKTsKLSAgICAgICAgCi0gICAgICAgIGMudG9FbmREb2MoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QYXJlbnQoKSA9PSB0cnVlICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmN1cnJlbnRUb2tlblR5cGUoKS5pc1N0YXJ0ZG9jKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxhPm1vbzwhLS0tLT5mb288L2E+IiApOwotICAgICAgICBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgYy50b1N0YXJ0RG9jKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUGFyZW50KCkgPT0gdHJ1ZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAiYSIgKSApOwotICAgICAgICAKLSAgICAgICAgYy50b1N0YXJ0RG9jKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QYXJlbnQoKSA9PSB0cnVlICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJhIiApICk7Ci0KLSAgICAgICAgYy50b1N0YXJ0RG9jKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRDaGFyKCAyICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUGFyZW50KCkgPT0gdHJ1ZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAiYSIgKSApOwotICAgICAgICAKLSAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbz5lYXJseTxiYXI+dGV4dDxjaGFyPnphcDwvY2hhcj48L2Jhcj48L2Zvbz4iICk7Ci0gICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9GaXJzdENoaWxkKCkgPT0gdHJ1ZSApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXRUZXh0VmFsdWUoKS5lcXVhbHMoICJ6YXAiICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE5hbWUgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YSB4PSd5Jz5lcmljPCEtLS0tPjw/bW9vPz48L2E+IiApOwotICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKSA9PSBudWxsICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhYy50b05leHRUb2tlbigpLmlzTm9uZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJhIiApICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhYy50b05leHRUb2tlbigpLmlzTm9uZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJ4IiApICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhYy50b05leHRUb2tlbigpLmlzTm9uZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKSA9PSBudWxsICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhYy50b05leHRUb2tlbigpLmlzTm9uZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKSA9PSBudWxsICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhYy50b05leHRUb2tlbigpLmlzTm9uZSgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJtb28iICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDAgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFjLnRvTmV4dFRva2VuKCkuaXNOb25lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpID09IG51bGwgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFjLnRvTmV4dFRva2VuKCkuaXNOb25lKCkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpID09IG51bGwgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0VG9rZW4oKS5pc05vbmUoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hhcnMgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmFiY2RlZmdoaWprbDwvZm9vPiIgKTsKLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy50b05leHRDaGFyKCAyICk7Ci0gICAgICAgIAotICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbIDMgXTsKLSAgICAgICAgaW50IG4gPSBjLmdldENoYXJzKCBidWYsIDAsIDQwMCApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBuID09IDMgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGJ1ZlswXSA9PSAnYycgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGJ1ZlsxXSA9PSAnZCcgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGJ1ZlsyXSA9PSAnZScgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWVzcGFjZVN1YnN0aXR1dGlvbiAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSGFzaE1hcCBzdWJzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgc3Vicy5wdXQoICJmb28iLCAibW9vIiApOwotICAgICAgICBzdWJzLnB1dCggImEiLCAiYiIgKTsKLSAgICAgICAgCi0gICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLkxPQURfU1VCU1RJVFVURV9OQU1FU1BBQ0VTLCBzdWJzICk7Ci0gICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgWG1sT2JqZWN0IHggPQotICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxhIHhtbG5zPSdmb28nIHhtbG5zOmE9J2EnIGE6eD0neScvPiIsCi0gICAgICAgICAgICAgICAgb3B0aW9ucyApOwotCi0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLQotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoICJtb28iICkgKTsKLSAgICAgICAgCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyggIm1vbyIgKSApOwotICAgICAgICAKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKCAiYiIgKSApOwotICAgICAgICAKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKCAiYiIgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZXNwYWNlSW5zZXJ0aW9uICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLSAgICAgICAgYy5pbnNlcnRFbGVtZW50KCAiZm9vIiwgImh0dHA6Ly9wLmNvbSIgKTsKLSAgICAgICAgYy50b1ByZXZUb2tlbigpOwotICAgICAgICBjLmluc2VydE5hbWVzcGFjZSggInAiLCAiaHR0cDovL3AuY29tIiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAotICAgICAgICAgICAgeC54bWxUZXh0KCkuZXF1YWxzKCAiPHA6Zm9vIHhtbG5zOnA9XCJodHRwOi8vcC5jb21cIi8+IiApICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvdGVzdFBhcnNlciAoIFN0cmluZyB4bWwsIFN0cmluZyB4bWxSZXN1bHQgKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKTsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHgueG1sVGV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeG1sUmVzdWx0LmVxdWFscyggcmVzdWx0ICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGRvdGVzdFBhcnNlckVycm9ycyAoIFN0cmluZyB4bWwgKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFRocm93YWJsZSB0ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmlsICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeCA9IG5vTmFtZXNwYWNlLkNhbkJlTmlsRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSggIjxjYW5CZU5pbC8+IiApOwotICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgIGMudG9GaXJzdENoaWxkKCk7Ci0gICAgICAgIFhtbE9iamVjdCBmYyA9IGMuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhIGZjLmlzTmlsKCkgKTsKLSAgICAgICAgZmMuc2V0TmlsKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYy5pc05pbCgpICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoICI8Y2FuQmVOaWwgeHNpOm5pbD1cInRydWVcIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiLz4iICkgKTsKLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5pc0F0dHIoKSApOwotICAgICAgICBjLnJlbW92ZVhtbCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC54bWxUZXh0KCkuZXF1YWxzKCAiPGNhbkJlTmlsLz4iICkgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICEgZmMuaXNOaWwoKSApOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VyICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICI8aGVlIHllZT0nZml2ZSc+PGhhdz42NjwvaGF3PjwvYW55PiIgKTsKLSAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiPGZvbz48L21vbz4iICk7Ci0gICAgICAgIGRvdGVzdFBhcnNlckVycm9ycyggIjxhPjxmb28+PC9tb28+PC9hPiIgKTsKLSAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiIiApOwotICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICIgICAgIiApOwotICAgICAgICAKLSAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiaGFyIiApOwotICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICI8IS0tIGNvbW1lbnQgLS0+IiApOwotICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICI8P21vbz8+IiApOwotICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtOFwiPz4iICk7Ci0gICAgICAgIGRvdGVzdFBhcnNlckVycm9ycyggIjxhJC8+IiApOwotICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICI8Zm9vIGE9JzwnPjwvZm9vPiIgKTsKLSAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiPGZvbyBhPjwvZm9vPiIgKTsKLSAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiPGZvbz4iICk7Ci0gICAgICAgIGRvdGVzdFBhcnNlckVycm9ycyggIjwvZm9vPiIgKTsKLS8vIEZpeCB0aGUgcGFyc2VyIHRvIG1ha2UgdGhlc2Ugd29yawotLy8gICAgICAgIGRvdGVzdFBhcnNlckVycm9ycyggIjxmb28+PCEtLSAtLSAtLT48L2Zvbz4iICk7Ci0vLyAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiPGZvbz48IS0tIC0tLT48L2Zvbz4iICk7Ci0KLSAgICAgICAgZG90ZXN0UGFyc2VyKCAiPGEgYj1cInhcblxueVwiLz4iLCAiPGEgYj1cInggIHlcIi8+IiApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F4UGFyc2VyICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgeG1sID0gICI8YSB4PSd5Jz48IS0tLS0+eDxiLz48YyBwPSdxJz56PC9jPjwvYT4iOwotICAgICAgICAKLSAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzcGYgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNBWFBhcnNlciBzcCA9IHNwZi5uZXdTQVhQYXJzZXIoKTsKLSAgICAgICAgWE1MUmVhZGVyIHhyID0gc3AuZ2V0WE1MUmVhZGVyKCk7Ci0gICAgICAgIElucHV0U291cmNlIGlzID0gbmV3IElucHV0U291cmNlKCBuZXcgU3RyaW5nUmVhZGVyKCAgeG1sICkgKTsKLSAgICAgICAgWG1sU2F4SGFuZGxlciBzaCA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld1htbFNheEhhbmRsZXIoKTsKLSAgICAgICAgCi0gICAgICAgIHhyLnNldEZlYXR1cmUoCi0gICAgICAgICAgICAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsCi0gICAgICAgICAgICB0cnVlICk7Ci0KLSAgICAgICAgeHIuc2V0RmVhdHVyZSgKLSAgICAgICAgICAgICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIHRydWUgKTsKLQotICAgICAgICB4ci5zZXRGZWF0dXJlKAotICAgICAgICAgICAgImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgZmFsc2UgKTsKLQotICAgICAgICB4ci5zZXRDb250ZW50SGFuZGxlciggc2guZ2V0Q29udGVudEhhbmRsZXIoKSApOwotICAgICAgICAKLSAgICAgICAgeHIuc2V0UHJvcGVydHkoCi0gICAgICAgICAgICAiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwKLSAgICAgICAgICAgIHNoLmdldExleGljYWxIYW5kbGVyKCkgKTsKLQotICAgICAgICB4ci5wYXJzZSggaXMgKTsKLQotICAgICAgICBYbWxPYmplY3QgeDEgPSBzaC5nZXRPYmplY3QoKTsKLQotICAgICAgICBYbWxPYmplY3QgeDIgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggeG1sICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgxLnhtbFRleHQoKS5lcXVhbHMoIHgyLnhtbFRleHQoKSApICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1N1YnN0R3JvdXBUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1N1YnN0R3JvdXBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzcwMzI5Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TdWJzdEdyb3VwVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWE1MU3RyZWFtVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERlY2ltYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5vcm1hbGl6ZWRTdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8vIFR5cGVzIGZyb20gc3Vic3Rncm91cC54c2QKLWltcG9ydCBvcmcub3BlbnVyaS5zZ3MuQURvY3VtZW50OwotaW1wb3J0IG9yZy5vcGVudXJpLnNncy5CRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLm9wZW51cmkuc2dzLkNEb2N1bWVudDsKLWltcG9ydCBvcmcub3BlbnVyaS5zZ3MuUm9vdERvY3VtZW50OwotCi1pbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBTdWJzdEdyb3VwVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBTdWJzdEdyb3VwVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKFN1YnN0R3JvdXBUZXN0cy5jbGFzcyk7IH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB4bWwxID0gIjxyb290IHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvc2dzJz4iICsKLSAgICAgICAgICAgICI8QT5cdGFcdGFcdDwvQT4iICsKLSAgICAgICAgICAgICI8Qj5cdGJcdGJcdDwvQj4iICsKLSAgICAgICAgICAgICI8Qz5cdGNcdGNcdDwvQz4iICsKLSAgICAgICAgICAgICI8L3Jvb3Q+IjsKLQotCi0gICAgICAgIFJvb3REb2N1bWVudCBkb2MxID0gUm9vdERvY3VtZW50LkZhY3RvcnkucGFyc2UoeG1sMSk7Ci0gICAgICAgIFJvb3REb2N1bWVudC5Sb290IHJvb3QgPSBkb2MxLmdldFJvb3QoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkb2MxLnZhbGlkYXRlKCkpOwotCi0gICAgICAgIFhtbFN0cmluZyBhID0gcm9vdC54Z2V0QUFycmF5KDApOwotICAgICAgICBhc3NlcnRUcnVlKGEuc2NoZW1hVHlwZSgpLmVxdWFscyhYbWxTdHJpbmcudHlwZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlx0YVx0YVx0IiwgYS5zdHJpbmdWYWx1ZSgpKTsKLQotICAgICAgICBYbWxTdHJpbmcgYiA9IHJvb3QueGdldEFBcnJheSgxKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShiLnNjaGVtYVR5cGUoKS5lcXVhbHMoWG1sTm9ybWFsaXplZFN0cmluZy50eXBlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIGIgYiAiLCBiLnN0cmluZ1ZhbHVlKCkpOwotCi0gICAgICAgIFhtbFN0cmluZyBjID0gcm9vdC54Z2V0QUFycmF5KDIpOwotICAgICAgICBhc3NlcnRUcnVlKGMuc2NoZW1hVHlwZSgpLmVxdWFscyhYbWxUb2tlbi50eXBlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYyBjIiwgYy5zdHJpbmdWYWx1ZSgpKTsKLQotICAgICAgICByb290Lmluc2VydEEoMiwgImQgZCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImQgZCIsIHJvb3QuZ2V0QUFycmF5KDIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHJvb3Quc2l6ZU9mQUFycmF5KCkpOwotICAgICAgICByb290LnJlbW92ZUEoMik7Ci0KLSAgICAgICAgcm9vdC5yZW1vdmVBKDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImMgYyIsIHJvb3QuZ2V0QUFycmF5KDEpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJvb3Quc2l6ZU9mQUFycmF5KCkpOwotCi0gICAgICAgIHJvb3QuYWRkQSgiZiBmIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCByb290LnNpemVPZkFBcnJheSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmIGYiLCByb290LmdldEFBcnJheSgyKSk7Ci0KLSAgICAgICAgLy8gVGVzdCBhcnJheSBzZXR0ZXJzCi0KLSAgICAgICAgLy8gdGVzdCBtIDwgbiBjYXNlCi0gICAgICAgIFN0cmluZ1tdIHNtYWxsZXIgPSBuZXcgU3RyaW5nW117ICJ4IiwgInkiIH07Ci0gICAgICAgIHJvb3Quc2V0QUFycmF5KHNtYWxsZXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcm9vdC5zaXplT2ZBQXJyYXkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygieSIsIHJvb3QuZ2V0QUFycmF5KDEpKTsKLQotICAgICAgICAvLyB0ZXN0IG0gPiBuIGNhc2UKLSAgICAgICAgU3RyaW5nW10gbGFyZ2VyID0gbmV3IFN0cmluZ1tdIHsgInAiLCAicSIsICJyIiwgInMiIH07Ci0gICAgICAgIHJvb3Quc2V0QUFycmF5KGxhcmdlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCByb290LnNpemVPZkFBcnJheSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyIiwgcm9vdC5nZXRBQXJyYXkoMikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB4bWwxID0gIjxBIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvc2dzJz5cdGFcdGFcdDwvQT4iOwotICAgICAgICBTdHJpbmcgeG1sMiA9ICI8QiB4bWxucz0naHR0cDovL29wZW51cmkub3JnL3Nncyc+XHRiXHRiXHQ8L0I+IjsKLSAgICAgICAgU3RyaW5nIHhtbDMgPSAiPEMgeG1sbnM9J2h0dHA6Ly9vcGVudXJpLm9yZy9zZ3MnPlx0Y1x0Y1x0PC9DPiI7Ci0KLSAgICAgICAgQURvY3VtZW50IGQxID0gQURvY3VtZW50LkZhY3RvcnkucGFyc2UoeG1sMSk7Ci0gICAgICAgIFhtbFN0cmluZyBhID0gZDEueGdldEEoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhLnNjaGVtYVR5cGUoKS5lcXVhbHMoWG1sU3RyaW5nLnR5cGUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJcdGFcdGFcdCIsIGEuc3RyaW5nVmFsdWUoKSk7Ci0KLSAgICAgICAgQURvY3VtZW50IGQyID0gQURvY3VtZW50LkZhY3RvcnkucGFyc2UoeG1sMik7Ci0gICAgICAgIFhtbFN0cmluZyBiID0gZDIueGdldEEoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkMi5zY2hlbWFUeXBlKCkuZXF1YWxzKEJEb2N1bWVudC50eXBlKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYi5zY2hlbWFUeXBlKCkuZXF1YWxzKFhtbE5vcm1hbGl6ZWRTdHJpbmcudHlwZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiBiIGIgIiwgYi5zdHJpbmdWYWx1ZSgpKTsKLQotICAgICAgICBBRG9jdW1lbnQgZDMgPSBBRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSh4bWwzKTsKLSAgICAgICAgWG1sU3RyaW5nIGMgPSBkMy54Z2V0QSgpOwotICAgICAgICBhc3NlcnRUcnVlKGQzLnNjaGVtYVR5cGUoKS5lcXVhbHMoQ0RvY3VtZW50LnR5cGUpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLnNjaGVtYVR5cGUoKS5lcXVhbHMoWG1sVG9rZW4udHlwZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImMgYyIsIGMuc3RyaW5nVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpbnZhbGlkU2NoZW1hcyA9IAotICAgIHsKLSAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0EnIHR5cGU9J3hzZDpzdHJpbmcnLz4gIiArCi0gICAgICAgICIgIDx4c2Q6ZWxlbWVudCBuYW1lPSdCJyB0eXBlPSd4c2Q6aW50JyBzdWJzdGl0dXRpb25Hcm91cD0nQScvPiAiICsKLSAgICAgICAgIjwveHNkOnNjaGVtYT4iLAotICAgICAgICAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+ICIgKwotICAgICAgICAiICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9J2Zvbyc+ICIgKwotICAgICAgICAiICAgIDx4c2Q6c2VxdWVuY2U+ICIgKwotICAgICAgICAiICAgICAgPHhzZDplbGVtZW50IG5hbWU9J2Jhcicgc3Vic3RpdHV0aW9uR3JvdXA9J0EnLz4iICsKLSAgICAgICAgIiAgICA8L3hzZDpzZXF1ZW5jZT4gIiArCi0gICAgICAgICIgIDwveHNkOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAiPC94c2Q6c2NoZW1hPiIsCi0gICAgICAgICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz4gIiArCi0gICAgICAgICIgIDx4c2Q6ZWxlbWVudCBuYW1lPSdBJyB0eXBlPSd4c2Q6c3RyaW5nJyBmaW5hbD0nI2FsbCcvPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0InIHR5cGU9J3hzZDpzdHJpbmcnIHN1YnN0aXR1dGlvbkdyb3VwPSdBJy8+ICIgKwotICAgICAgICAiPC94c2Q6c2NoZW1hPiIsCi0gICAgICAgICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz4gIiArCi0gICAgICAgICIgIDx4c2Q6ZWxlbWVudCBuYW1lPSdBJyB0eXBlPSd4c2Q6c3RyaW5nJyBmaW5hbD0ncmVzdHJpY3Rpb24nLz4gIiArCi0gICAgICAgICIgIDx4c2Q6ZWxlbWVudCBuYW1lPSdCJyB0eXBlPSd4c2Q6dG9rZW4nIHN1YnN0aXR1dGlvbkdyb3VwPSdBJy8+ICIgKwotICAgICAgICAiPC94c2Q6c2NoZW1hPiIsCi0gICAgICAgICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz4gIiArCi0gICAgICAgICIgIDx4c2Q6ZWxlbWVudCBuYW1lPSdBJyB0eXBlPSd4c2Q6c3RyaW5nJyBzdWJzdGl0dXRpb25Hcm91cD0nQicvPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0InIHR5cGU9J3hzZDpzdHJpbmcnIHN1YnN0aXR1dGlvbkdyb3VwPSdDJy8+ICIgKwotICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0nQycgdHlwZT0neHNkOnN0cmluZycgc3Vic3RpdHV0aW9uR3JvdXA9J0QnLz4gIiArCi0gICAgICAgICIgIDx4c2Q6ZWxlbWVudCBuYW1lPSdEJyB0eXBlPSd4c2Q6c3RyaW5nJyBzdWJzdGl0dXRpb25Hcm91cD0nRScvPiAiICsKLSAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0UnIHR5cGU9J3hzZDpzdHJpbmcnIHN1YnN0aXR1dGlvbkdyb3VwPSdBJy8+ICIgKwotICAgICAgICAiPC94c2Q6c2NoZW1hPiIsCi0gICAgICAgICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz4gIiArCi0gICAgICAgICIgIDx4c2Q6ZWxlbWVudCBuYW1lPSdBJyB0eXBlPSd4c2Q6dG9rZW4nIHN1YnN0aXR1dGlvbkdyb3VwPSdCJy8+ICIgKwotICAgICAgICAiPC94c2Q6c2NoZW1hPiIsCi0gICAgICAgICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz4gIiArCi0gICAgICAgICIgIDx4c2Q6ZWxlbWVudCBuYW1lPSdBJyB0eXBlPSd4c2Q6c3RyaW5nJy8+ICIgKwotICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0nQicgdHlwZT0neHNkOnN0cmluZycgc3Vic3RpdHV0aW9uR3JvdXA9J0EnLz4gIiArCi0gICAgICAgICIgIDx4c2Q6ZWxlbWVudCBuYW1lPSdDb21wbGV4Jz4gIiArCi0gICAgICAgICIgICAgPHhzZDpjb21wbGV4VHlwZT4gIiArCi0gICAgICAgICIgICAgICA8eHNkOmNob2ljZT4gIiArCi0gICAgICAgICIgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9J0EnLz4iICsKLSAgICAgICAgIiAgICAgICAgPHhzZDplbGVtZW50IHJlZj0nQicvPiIgKwotICAgICAgICAiICAgICAgPC94c2Q6Y2hvaWNlPiAiICsKLSAgICAgICAgIiAgICA8L3hzZDpjb21wbGV4VHlwZT4gIiArCi0gICAgICAgICIgIDwveHNkOmVsZW1lbnQ+ICIgKwotICAgICAgICAiPC94c2Q6c2NoZW1hPiIsCi0gICAgfTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gdmFsaWRTY2hlbWFzID0gCi0gICAgewotICAgICAgICAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+IiArCi0gICAgICAgICIgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0nYmFzZSc+IiArCi0gICAgICAgICIgICAgPHhzZDphbGw+IiArCi0gICAgICAgICIgICAgICA8eHNkOmVsZW1lbnQgcmVmPSdoZWFkJy8+IiArCi0gICAgICAgICIgICAgPC94c2Q6YWxsPiIgKwotICAgICAgICAiICA8L3hzZDpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgIiAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSdyZXN0cic+IiArCi0gICAgICAgICIgICAgPHhzZDpjb21wbGV4Q29udGVudD4iICsKLSAgICAgICAgIiAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9J2Jhc2UnPiIgKwotICAgICAgICAiICAgICAgICAgPHhzZDphbGw+IiArCi0gICAgICAgICIgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9J3RhaWwnLz4iICsKLSAgICAgICAgIiAgICAgICAgIDwveHNkOmFsbD4iICsKLSAgICAgICAgIiAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4iICsKLSAgICAgICAgIiAgICA8L3hzZDpjb21wbGV4Q29udGVudD4iICsKLSAgICAgICAgIiAgPC94c2Q6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICIgIDx4c2Q6ZWxlbWVudCBuYW1lPSdoZWFkJyB0eXBlPSd4c2Q6c3RyaW5nJy8+IiArCi0gICAgICAgICIgIDx4c2Q6ZWxlbWVudCBuYW1lPSd0YWlsJyBzdWJzdGl0dXRpb25Hcm91cD0naGVhZCcvPiIgKwotICAgICAgICAiPC94c2Q6c2NoZW1hPiIsCi0gICAgfTsKLSAgICAgICAgCi0gICAgcHVibGljIHZvaWQgdGVzdDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2NoZW1hRG9jdW1lbnRbXSBzY2hlbWFzID0gbmV3IFNjaGVtYURvY3VtZW50W2ludmFsaWRTY2hlbWFzLmxlbmd0aF07Ci0KLSAgICAgICAgLy8gUGFyc2UgdGhlIGludmFsaWQgc2NoZW1hIGZpbGVzCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGludmFsaWRTY2hlbWFzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgICAgIHNjaGVtYXNbaV0gPSBTY2hlbWFEb2N1bWVudC5GYWN0b3J5LnBhcnNlKGludmFsaWRTY2hlbWFzW2ldKTsKLQotICAgICAgICAvLyBOb3cgY29tcGlsZSB0aGUgaW52YWxpZCBzY2hlbWFzLCB0ZXN0IHRoYXQgdGhleSBmYWlsCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHNjaGVtYXMubGVuZ3RoIDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFhtbEJlYW5zLmxvYWRYc2QobmV3IFhtbE9iamVjdFtdIHtzY2hlbWFzW2ldfSk7Ci0gICAgICAgICAgICAgICAgZmFpbCgiU2NoZW1hIHNob3VsZCBoYXZlIGZhaWxlZCB0byBjb21waWxlOlxuIiArIGludmFsaWRTY2hlbWFzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gc3VjY2VzcykgeyAvKiBTeXN0ZW0ub3V0LnByaW50bG4oc3VjY2Vzcyk7ICovIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gUGFyc2UgdGhlIHZhbGlkIHNjaGVtYSBmaWxlcwotICAgICAgICBzY2hlbWFzID0gbmV3IFNjaGVtYURvY3VtZW50W3ZhbGlkU2NoZW1hcy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCB2YWxpZFNjaGVtYXMubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgc2NoZW1hc1tpXSA9IFNjaGVtYURvY3VtZW50LkZhY3RvcnkucGFyc2UodmFsaWRTY2hlbWFzW2ldKTsKLQotICAgICAgICAvLyBOb3cgY29tcGlsZSB0aGUgdmFsaWQgc2NoZW1hcywgdGVzdCB0aGF0IHRoZXkgc3VjY2VlZAotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBzY2hlbWFzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBYbWxCZWFucy5sb2FkWHNkKG5ldyBYbWxPYmplY3RbXSB7c2NoZW1hc1tpXX0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBmYWlsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHRvIGNvbXBpbGUgc2NoZW1hOiAiICsgc2NoZW1hc1tpXSArICIgd2l0aCBlcnJvcjogIiArIGZhaWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBpbnZhbGlkRG9jcyA9IAotICAgIHsKLSAgICAgICAgIjxhYnN0cmFjdFRlc3QgeG1sbnM9J2h0dHA6Ly9vcGVudXJpLm9yZy9zZ3MnPiIgKwotICAgICAgICAiICAgIDxhYnN0cmFjdD5jb250ZW50PC9hYnN0cmFjdD4gIiArCi0gICAgICAgICI8L2Fic3RyYWN0VGVzdD4gIiwKLSAgICB9OwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSB2YWxpZERvY3MgPSAKLSAgICB7Ci0gICAgICAgICI8YWJzdHJhY3RUZXN0IHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvc2dzJz4iICsKLSAgICAgICAgIiAgICA8Y29uY3JldGU+Y29udGVudDwvY29uY3JldGU+ICIgKwotICAgICAgICAiPC9hYnN0cmFjdFRlc3Q+ICIsCi0gICAgfTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgdGhyb3dzIEV4Y2VwdGlvbiAKLSAgICB7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgaW52YWxpZERvY3MubGVuZ3RoIDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxPYmplY3QgeG8gPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShpbnZhbGlkRG9jc1tpXSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJEb2Mgd2FzIHZhbGlkLiBTaG91bGQgYmUgaW52YWxpZDogIiArIGludmFsaWREb2NzW2ldLCAKLSAgICAgICAgICAgICAgICAhIHhvLnZhbGlkYXRlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgdmFsaWREb2NzLmxlbmd0aCA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgWG1sT2JqZWN0IHhvID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UodmFsaWREb2NzW2ldKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkRvYyB3YXMgaW52YWxpZC4gU2hvdWxkIGJlIHZhbGlkOiAiICsgdmFsaWREb2NzW2ldLAotICAgICAgICAgICAgICAgIHhvLnZhbGlkYXRlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVGVzdEVudi5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1Rlc3RFbnYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg1ODQwMC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVGVzdEVudi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFRlc3RFbnYKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIGZ3cm9vdCA9IGdldFJvb3RGaWxlKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBjYXNlcm9vdCA9IG5ldyBGaWxlKGZ3cm9vdCwgInRlc3QvY2FzZXMiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIG91dHB1dHJvb3QgPSBuZXcgRmlsZShmd3Jvb3QsICJidWlsZC90ZXN0L291dHB1dCIpOwotCi0gICAgcHVibGljIHN0YXRpYyBGaWxlIGdldFJvb3RGaWxlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZSggU3lzdGVtLmdldFByb3BlcnR5KCAieGJlYW4ucm9vdGRpciIgKSApLmdldENhbm9uaWNhbEZpbGUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRmlsZSB4YmVhbkNhc2UoU3RyaW5nIHN0cikKLSAgICB7Ci0gICAgICAgIHJldHVybiAobmV3IEZpbGUoY2FzZXJvb3QsIHN0cikpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRmlsZSB4YmVhbk91dHB1dChTdHJpbmcgc3RyKQotICAgIHsKLSAgICAgICAgRmlsZSByZXN1bHQgPSAobmV3IEZpbGUob3V0cHV0cm9vdCwgc3RyKSk7Ci0gICAgICAgIEZpbGUgcGFyZW50ZGlyID0gcmVzdWx0LmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgcGFyZW50ZGlyLm1rZGlycygpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWx0cmVlKEZpbGUgZGlyKQotICAgIHsKLSAgICAgICAgaWYgKGRpci5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRpci5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGxpc3QgPSBkaXIubGlzdCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgZGVsdHJlZShuZXcgRmlsZShkaXIsIGxpc3RbaV0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZGlyLmRlbGV0ZSgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvdWxkIG5vdCBkZWxldGUgIiArIGRpcik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVGVzdFJ1blV0aWwuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UZXN0UnVuVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmFkZjhjLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UZXN0UnVuVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFRlc3RSdW5VdGlsCi17Ci0gICAgLyoqCi0gICAgICogUnVucyBtZXRob2QgdGhhdCBtdXN0IGJlIGRlY2xhcmVkICJzdGF0aWMgdm9pZCB0ZXN0KCkiIG9uIHRoZSBnaXZlbgotICAgICAqIGNsYXNzLCB3aXRoIHRoZSBnaXZlbiBhZGRpdGlvbmFsIGphcnMgb3IgZGlyZWN0b3JpZXMgb24gdGhlIGNsYXNzcGF0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuKFN0cmluZyBjbGFzc25hbWUsIEZpbGVbXSBjbGFzc3BhdGgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnRsbigiUnVubmluZyAiICsgY2xhc3NuYW1lICsgIiB3aXRoIGNsYXNzcGF0aDoiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnRsbihjbGFzc3BhdGhbaV0pOwotICAgICAgICAgICAgaWYgKCFjbGFzc3BhdGhbaV0uZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2xhc3NwYXRoIGNvbXBvbmVudCAiICsgY2xhc3NwYXRoICsgIiBjYW5ub3QgYmUgZm91bmQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBVUkxbXSBleHRyYWNwID0gbmV3IFVSTFtjbGFzc3BhdGgubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4dHJhY3BbaV0gPSBjbGFzc3BhdGhbaV0udG9VUkwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNYWxmb3JtZWQgY2xhc3NwYXRoIGZpbGVuYW1lIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzc0xvYWRlciBjdXJjbCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNoaWxkY2wgPSBuZXcgVVJMQ2xhc3NMb2FkZXIoZXh0cmFjcCk7Ci0gICAgICAgICAgICBDbGFzcyBqYXZhQ2xhc3MgPSBjaGlsZGNsLmxvYWRDbGFzcyhjbGFzc25hbWUpOwotICAgICAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gY2hpbGRjbC5sb2FkQ2xhc3MoIm9yZy5vcGVudXJpLm15dGVzdC5DdXN0b21lckRvY3VtZW50Iik7Ci0gICAgICAgICAgICBpZiAodGVzdENsYXNzID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgTWV0aG9kIG1ldGggPSBqYXZhQ2xhc3MuZ2V0TWV0aG9kKCJ0ZXN0IiwgbmV3IENsYXNzWzBdKTsgLy8gc2hvdWxkIGJlIHN0YXRpYwotICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2hpbGRjbCk7Ci0gICAgICAgICAgICBtZXRoLmludm9rZShudWxsLCBuZXcgT2JqZWN0WzBdKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjbGFzcyBub3QgZm91bmQiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vIHRlc3QoKSBtZXRob2QgZm91bmQiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb3VsZCBub3QgaW52b2tlIHN0YXRpYyBwdWJsaWMgdGVzdCBtZXRob2QiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBlLmdldENhdXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjdXJjbCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVGhyZWFkaW5nVGVzdC5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1RocmVhZGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM4Nzg0Yy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVGhyZWFkaW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgZHJ0Y2FzZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBUaHJlYWRpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgVGhyZWFkaW5nVGVzdChTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGhyZWFkaW5nVGVzdC5jbGFzcyk7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRIUkVBRF9DT1VOVCA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVRFUkFUSU9OX0NPVU5UID0gMTsKLQotICAgIHB1YmxpYyBjbGFzcyBDb21waWxhdGlvblRocmVhZCBleHRlbmRzIFRocmVhZAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBUaHJvd2FibGUgX3Rocm93YWJsZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIF9yZXN1bHQ7Ci0KLSAgICAgICAgcHVibGljIFRocm93YWJsZSBnZXRFeGNlcHRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3Rocm93YWJsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGdldFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJVEVSQVRJT05fQ09VTlQ7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyID0gWG1sQmVhbnMubG9hZFhzZChuZXcgWG1sT2JqZWN0W10geyBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL1htbFNpZ25hdHVyZS94bWxkc2lnLWNvcmUtc2NoZW1hLnhzZCIpKSB9KTsKLSAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0IHJlc3VsdCA9IGxvYWRlci5wYXJzZShUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL1htbFNpZ25hdHVyZS9zaWduYXR1cmUtZXhhbXBsZS54bWwiKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobG9hZGVyLmZpbmREb2N1bWVudFR5cGUobmV3IFFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiwgIlNpZ25hdHVyZSIpKSwgcmVzdWx0LnNjaGVtYVR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF9yZXN1bHQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF90aHJvd2FibGUgPSB0OwotICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGhyZWFkZWRDb21waWxhdGlvbigpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIENvbXBpbGF0aW9uVGhyZWFkW10gdGhyZWFkcyA9IG5ldyBDb21waWxhdGlvblRocmVhZFtUSFJFQURfQ09VTlRdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRocmVhZHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocmVhZHNbaV0gPSBuZXcgQ29tcGlsYXRpb25UaHJlYWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhyZWFkcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdGhyZWFkc1tpXS5zdGFydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJlYWRzW2ldLmpvaW4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhyZWFkcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwodGhyZWFkc1tpXS5nZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiVGhyZWFkICIgKyBpICsgIiBkaWRuJ3Qgc3VjY2VlZCIsIHRocmVhZHNbaV0uZ2V0UmVzdWx0KCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1R5cGVkU2V0dGVyc1Rlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVHlwZWRTZXR0ZXJzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYyNTY5YS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVHlwZWRTZXR0ZXJzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIGRydGNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3IuVG9rZW5UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yLlhtbEJvb2ttYXJrOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sU2F4SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbExpbmVOdW1iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnQ7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEubGFuZy5Db21wYXJhYmxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLSAgIAotcHVibGljIGNsYXNzIFR5cGVkU2V0dGVyc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgVHlwZWRTZXR0ZXJzVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKFR5cGVkU2V0dGVyc1Rlc3RzLmNsYXNzKTsgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNjaGVtYU5zID0ieG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluc3RhbmNlTnMgPSAieG1sbnM6eHM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBmbXQgKCBTdHJpbmcgcyApCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IHMubGVuZ3RoKCkgOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gcy5jaGFyQXQoIGkgKTsKLQotICAgICAgICAgICAgaWYgKGNoICE9ICckJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIGNoICk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNoID0gcy5jaGFyQXQoICsraSApOwotCi0gICAgICAgICAgICBTdHJpbmcgaWQgPSAiIjsKLQotICAgICAgICAgICAgd2hpbGUgKCAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykgfHwgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlkID0gaWQgKyBjaDsKLSAgICAgICAgICAgICAgICBjaCA9IHMuY2hhckF0KCArK2kgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGFyZyA9ICIiOwotCi0gICAgICAgICAgICBpZiAoY2ggPT0gJygnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoID0gcy5jaGFyQXQoICsraSApOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKCBjaCAhPSAnKScgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXJnICs9IGNoOwotICAgICAgICAgICAgICAgICAgICBjaCA9IHMuY2hhckF0KCArK2kgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaS0tOwotCi0gICAgICAgICAgICBpZiAoaWQuZXF1YWxzKCAic2NoZW1hIiApKQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggc2NoZW1hTnMgKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGlkLmVxdWFscyggInhzaSIgKSkKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIGluc3RhbmNlTnMgKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGlkLmVxdWFscyggInR5cGUiICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGFyZy5sZW5ndGgoKSA+IDAgKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICJ4c2k6dHlwZT1cIiIgKyBhcmcgKyAiXCIiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbnNlcyA9IHNjaGVtYU5zICsgIiAiICsgaW5zdGFuY2VOczsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmF2YU5vVHlwZVNpbmdsZXRvbkVsZW1lbnQgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8eHl6enkvPiIgKTsKLSAgICAgICAgWG1sT2JqZWN0IHgyID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YnViYmE+bW9vPC9idWJiYT4iICk7Ci0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgWG1sQ3Vyc29yIGMyID0geDIubmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjMi50b05leHRUb2tlbigpOwotCi0gICAgICAgIGMuZ2V0T2JqZWN0KCkuc2V0KCBjMi5nZXRPYmplY3QoKSApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoICI8eHl6enk+bW9vPC94eXp6eT4iICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEphdmFOb1R5cGVTaW5nbGV0b25BdHRyaWJ1dGUgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8eHl6enkgYT0nJy8+IiApOwotICAgICAgICBYbWxPYmplY3QgeDIgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxidWJiYSBiPSdtb28nLz4iICk7Ci0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgWG1sQ3Vyc29yIGMyID0geDIubmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMyLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMyLnRvTmV4dFRva2VuKCk7Ci0KLSAgICAgICAgYy5nZXRPYmplY3QoKS5zZXQoIGMyLmdldE9iamVjdCgpICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscyggIjx4eXp6eSBhPVwibW9vXCIvPiIgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmF2YU5vVHlwZVNpbmdsZXRvbkVsZW1lbnRXaXRoWHNpVHlwZSAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjx4eXp6eS8+IiwgbmV3IFhtbE9wdGlvbnMoKS5zZXREb2N1bWVudFR5cGUoIFhtbE9iamVjdC50eXBlICkgKTsKLSAgICAgICAgWG1sT2JqZWN0IHgyID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIGZtdCggIjxidWJiYSAkdHlwZSh4czppbnQpICR4c2kgJHNjaGVtYT42OTwvYnViYmE+IiApICk7Ci0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLSAgICAgICAgWG1sQ3Vyc29yIGMyID0geDIubmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICBjMi50b05leHRUb2tlbigpOwotCi0gICAgICAgIFhtbE9iamVjdCB4eXp6eSA9IGMuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIFhtbE9iamVjdCBidWJiYSA9IGMyLmdldE9iamVjdCgpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBidWJiYS5zY2hlbWFUeXBlKCkgPT0gWG1sSW50LnR5cGUgKTsKLQotLy8gICAgICAgIHh5enp5LnNldCggYnViYmEgKTsKLQotLy8gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoIGZtdCggIjx4eXp6eSAkdHlwZSh4czppbnQpICR4c2kgJHNjaGVtYT5tb288L3h5enp5PiIgKSApICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1ZhbGlkYXRpb25UZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1ZhbGlkYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTU5OGE1Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9WYWxpZGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MTIgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBkcnRjYXNlczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlJvb3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhNTFN0cmVhbVZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEZWNpbWFsOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBWYWxpZGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKFZhbGlkYXRpb25UZXN0cy5jbGFzcyk7IH0KLQotICAgIHN0YXRpYyBTdHJpbmdbXSBfYXJnczsKLSAgICBzdGF0aWMgU3RyaW5nIF90ZXN0OwotCi0gICAgcHVibGljIHN0YXRpYyBGaWxlIGdldENhc2VGaWxlKFN0cmluZyB0aGVDYXNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRlc3RFbnYueGJlYW5DYXNlKCJzdG9yZS8iICsgdGhlQ2FzZSk7Ci0gICAgfQotCi0gICAgc3RhdGljIFhtbEN1cnNvciBsb2FkQ2FzZShTdHJpbmcgdGhlQ2FzZSkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICBnZXRDYXNlRmlsZSggdGhlQ2FzZSApICkubmV3Q3Vyc29yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVR5cGVMb2FkZXIgbWFrZVNjaGVtYVR5cGVMb2FkZXIgKCBTdHJpbmdbXSBzY2hlbWFzICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWG1sT2JqZWN0W10gc2NoZW1hRG9jcyA9IG5ldyBYbWxPYmplY3QgWyBzY2hlbWFzLmxlbmd0aCBdOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBzY2hlbWFzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNjaGVtYURvY3NbIGkgXSA9Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgICAgIHNjaGVtYXNbIGkgXSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmxvYWRYc2QoIHNjaGVtYURvY3MgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNjaGVtYVR5cGVMb2FkZXIgbWFrZVNjaGVtYVR5cGVMb2FkZXIgKCBGaWxlW10gc2NoZW1hcyApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdFtdIHNjaGVtYURvY3MgPSBuZXcgWG1sT2JqZWN0IFsgc2NoZW1hcy5sZW5ndGggXTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgc2NoZW1hcy5sZW5ndGggOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzY2hlbWFEb2NzWyBpIF0gPQotICAgICAgICAgICAgICAgIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICAgICBzY2hlbWFzWyBpIF0sIG5ldyBYbWxPcHRpb25zKCkuc2V0TG9hZExpbmVOdW1iZXJzKCkuc2V0TG9hZE1lc3NhZ2VEaWdlc3QoKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gWG1sQmVhbnMubG9hZFhzZCggc2NoZW1hRG9jcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB2ICggU3RyaW5nIHhtbCApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIHhtbCApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC5zY2hlbWFUeXBlKCkgIT0gWG1sT2JqZWN0LnR5cGUgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgudmFsaWRhdGUoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBudiAoIFN0cmluZyB4bWwgKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHguc2NoZW1hVHlwZSgpICE9IFhtbE9iamVjdC50eXBlICk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAheC52YWxpZGF0ZSgpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIF9fX3Rlc3REZWZhdWx0ICggKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBEZWZhdWx0Ci0gICAgICAgIAotLy8gICAgICAgIHYoICI8dmFsaWRFbGVtRGVmYXVsdC8+IiApOwotLy8gICAgICAgIHYoICI8dmFsaWRBdHRyRGVmYXVsdC8+IiApOwotLy8gICAgICAgIAotLy8gICAgICAgIG52KCAiPGludmFsaWRFbGVtRGVmYXVsdC8+IiApOwotICAgICAgICBudiggIjxpbnZhbGlkQXR0ckRlZmF1bHQvPiIgKTsKLQotICAgICAgICB2KCAiPGludmFsaWRFbGVtRGVmYXVsdD4xMTxpbnZhbGlkRWxlbURlZmF1bHQ+IiApOwotICAgICAgICB2KCAiPGludmFsaWRBdHRyRGVmYXVsdCBhdHRyPScyMic+IiApOwotICAgICAgICAKLSAgICAgICAgLy8gRml4ZWQKLQotICAgICAgICB2KCAiPHZhbGlkRWxlbUZpeGVkLz4iICk7Ci0gICAgICAgIHYoICI8dmFsaWRBdHRyRml4ZWQvPiIgKTsKLSAgICAgICAgCi0gICAgICAgIG52KCAiPGludmFsaWRFbGVtRml4ZWQvPiIgKTsKLSAgICAgICAgbnYoICI8aW52YWxpZEF0dHJGaXhlZC8+IiApOwotICAgICAgICAKLSAgICAgICAgdiggIjxpbnZhbGlkRWxlbUZpeGVkPjMzPGludmFsaWRFbGVtRml4ZWQ+IiApOwotICAgICAgICB2KCAiPGludmFsaWRBdHRyRml4ZWQgYXR0cj0nNDQnLz4iICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9UZXN0ICgKLSAgICAgICAgU3RyaW5nW10gc2NoZW1hcywgUU5hbWUgZG9jVHlwZSwKLSAgICAgICAgU3RyaW5nW10gdmFsaWRJbnN0YW5jZXMsIFN0cmluZ1tdIGludmFsaWRJbnN0YW5jZXMpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBkb1Rlc3Qoc2NoZW1hcywgZG9jVHlwZSwgdmFsaWRJbnN0YW5jZXMsIGludmFsaWRJbnN0YW5jZXMsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvVGVzdCAoCi0gICAgICAgIFN0cmluZ1tdIHNjaGVtYXMsIFFOYW1lIGRvY1R5cGUsCi0gICAgICAgIFN0cmluZ1tdIHZhbGlkSW5zdGFuY2VzLCBTdHJpbmdbXSBpbnZhbGlkSW5zdGFuY2VzLCBib29sZWFuIHN0YXJ0T25Eb2N1bWVudCApCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIHN0bCA9IG1ha2VTY2hlbWFUeXBlTG9hZGVyKCBzY2hlbWFzICk7Ci0KLSAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLQotICAgICAgICBpZiAoZG9jVHlwZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlIGRvY1NjaGVtYSA9IHN0bC5maW5kRG9jdW1lbnRUeXBlKCBkb2NUeXBlICk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBkb2NTY2hlbWEgIT0gbnVsbCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5ET0NVTUVOVF9UWVBFLCBkb2NTY2hlbWEgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCB2YWxpZEluc3RhbmNlcy5sZW5ndGggOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxPYmplY3QgeCA9Ci0gICAgICAgICAgICAgICAgc3RsLnBhcnNlKCAoU3RyaW5nKSB2YWxpZEluc3RhbmNlc1sgaSBdLCBudWxsLCBvcHRpb25zICk7Ci0KLSAgICAgICAgICAgIGlmICghc3RhcnRPbkRvY3VtZW50KSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7Ci0gICAgICAgICAgICAgICAgYy50b0ZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgICAgICB4ID0gYy5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICBjLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgTGlzdCB4ZWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLkVSUk9SX0xJU1RFTkVSLCB4ZWwgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYm9vbGVhbiBpc1ZhbGlkID0geC52YWxpZGF0ZSggb3B0aW9ucyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIWlzVmFsaWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiSW52YWxpZCBkb2MsIGV4cGVjdGVkIGEgdmFsaWQgZG9jOiAiICk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiSW5zdGFuY2UoIiArIGkgKyAiKTogIiApOwotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggeC54bWxUZXh0KCkgKTsKLSAgICAgICAgICAgICAgICBSb290LmR1bXAoIHggKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJFcnJvcnM6ICIgKTsKLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaiA9IDAgOyBqIDwgeGVsLnNpemUoKSA7IGorKyApCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggeGVsLmdldCggaiApICk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBpc1ZhbGlkICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgaW52YWxpZEluc3RhbmNlcy5sZW5ndGggOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxPYmplY3QgeDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeCA9IHN0bC5wYXJzZSggKFN0cmluZykgaW52YWxpZEluc3RhbmNlc1sgaSBdLCBudWxsLCBvcHRpb25zICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoISBzdGFydE9uRG9jdW1lbnQpIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICAgICAgICAgICAgICBjLnRvRmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgICAgICAgICB4ID0gYy5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgYy5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc1ZhbGlkID0geC52YWxpZGF0ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJWYWxpZCBkb2MsIGV4cGVjdGVkIGEgaW52YWxpZCBkb2M6ICIgKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiSW5zdGFuY2UoIiArIGkgKyAiKTogIiApOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIHgueG1sVGV4dCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIFJvb3QuZHVtcCggeCApOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIWlzVmFsaWQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSnVzdCBjb21waWxlIGEgc2NoZW1hLCBnb29kIGFuZCBiYWQKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGUwICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgbW9zdCBiYXNpYyBzY2hlbWEKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBzY2hlbWEgPQotICAgICAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKwotICAgICAgICAgICAgIjwveHM6c2NoZW1hPiIgKwotICAgICAgICAgICAgIiI7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdbXSBzY2hlbWFzID0geyBzY2hlbWEgfTsKLSAgICAgICAgCi0gICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgc3RsID0gbWFrZVNjaGVtYVR5cGVMb2FkZXIoIHNjaGVtYXMgKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE9uZSB3aGljaCB1c2VzICMjdGFyZ2V0TmFtZXNwYWNlIG9uIGEgd2lsZGNhcmQKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHNjaGVtYSA9Ci0gICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPlxuIiArCi0gICAgICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nZm9vJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6c2VxdWVuY2U+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6YW55IG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnNlcXVlbmNlPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCi0gICAgICAgICAgICAiPC94czpzY2hlbWE+IiArCi0gICAgICAgICAgICAiIjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIHNjaGVtYXM5OSA9IHsgc2NoZW1hIH07Ci0gICAgICAgIAotICAgICAgICBzdGwgPSBtYWtlU2NoZW1hVHlwZUxvYWRlciggc2NoZW1hczk5ICk7Ci0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICAvLyBBIGJpZywgbmFzdHkgc2NoZW1hIDotKQotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgRmlsZSBmaWxlID0gVGVzdEVudi5nZXRSb290RmlsZSgpOwotICAgICAgICBGaWxlIHNjaGVtZUZpbGUgPSBuZXcgRmlsZSggZmlsZSwgInRlc3QvY2FzZXMvc2NoZW1hL3M0cy9YTUxTY2hlbWEueHNkIiApOwotICAgICAgICBGaWxlIHhtbEZpbGUgPSBuZXcgRmlsZSggZmlsZSwgInRlc3QvY2FzZXMvc2NoZW1hL3M0cy9YTUwueHNkIiApOwotCi0gICAgICAgIEZpbGVbXSBzY2hlbWFzRiA9IHsgc2NoZW1lRmlsZSwgeG1sRmlsZSB9OwotCi0gICAgICAgIFJvb3QuZGlzYWJsZVN0b3JlVmFsaWRhdGlvbigpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc3RsID0gbWFrZVNjaGVtYVR5cGVMb2FkZXIoIHNjaGVtYXNGICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBSb290LmVuYWJsZVN0b3JlVmFsaWRhdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgU2NoZW1hVHlwZSB0eXBlID0KLSAgICAgICAgICAgIHN0bC5maW5kRG9jdW1lbnRUeXBlKAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSggImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgInNjaGVtYSIgKSApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB0eXBlICE9IG51bGwgKTsKLQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEEgZ29vZCBwaWVjZSBmcm9tIGEgSjJFRSBzY2hlbWEKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIHNjaGVtYSA9Ci0gICAgICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz5cbiIgKyAKLSAgICAgICAgICAgICI8eHNkOnNjaGVtYSB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnXG4iICsgCi0gICAgICAgICAgICAiICAgICB4bWxuczp4c2Q9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJ1xuIiArIAotICAgICAgICAgICAgIiAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSdxdWFsaWZpZWQnXG4iICsgCi0gICAgICAgICAgICAiICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0ndW5xdWFsaWZpZWQnPlxuIiArIAotICAgICAgICAgICAgIjx4c2Q6YW5ub3RhdGlvbj5cbiIgKyAKLSAgICAgICAgICAgICI8eHNkOmRvY3VtZW50YXRpb24+XG4iICsgCi0gICAgICAgICAgICAiQCgjKWFwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkcwkxLjcgMDcvMDgvMDJcbiIgKyAKLSAgICAgICAgICAgICI8L3hzZDpkb2N1bWVudGF0aW9uPlxuIiArIAotICAgICAgICAgICAgIjwveHNkOmFubm90YXRpb24+XG4iICsgCi0gICAgICAgICAgICAiPC94c2Q6c2NoZW1hPlxuIjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gc2NoZW1hczUgPSB7IHNjaGVtYSB9OwotCi0gICAgICAgIHN0bCA9IG1ha2VTY2hlbWFUeXBlTG9hZGVyKCBzY2hlbWFzNSApOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEEgYmFkIHNjaGVtYQotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgc2NoZW1hID0gIjxmb28vPiI7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdbXSBzY2hlbWFzMiA9IHsgc2NoZW1hIH07Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN0bCA9IG1ha2VTY2hlbWFUeXBlTG9hZGVyKCBzY2hlbWFzMiApOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEEgYmFkIHNjaGVtYQotICAgICAgICAvLwotICAgICAgICBzY2hlbWEgPQotICAgICAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKwotICAgICAgICAgICAgIiAgPGZvby8+XG4iICsKLSAgICAgICAgICAgICI8L3hzOnNjaGVtYT4iICsKLSAgICAgICAgICAgICIiOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gc2NoZW1hczMgPSB7IHNjaGVtYSB9OwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBtYWtlU2NoZW1hVHlwZUxvYWRlciggc2NoZW1hczMgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBYbWxFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGUxICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgZXJpY1NjaGVtYSA9Ci0gICAgICAgICAgICAiPHhzOnNjaGVtYVxuIiArCi0gICAgICAgICAgICAiICAgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJ1xuIiArCi0gICAgICAgICAgICAiICAgeG1sbnM6bnc9J2h0dHA6Ly9vcGVudXJpLm9yZy9lcmljc2NoZW1hJ1xuIiArCi0gICAgICAgICAgICAiICAgdGFyZ2V0TmFtZXNwYWNlPSdodHRwOi8vb3BlbnVyaS5vcmcvZXJpY3NjaGVtYSdcbiIgKwotICAgICAgICAgICAgIiAgIGVsZW1lbnRGb3JtRGVmYXVsdD0ncXVhbGlmaWVkJz5cbiIgKwotICAgICAgICAgICAgIlxuIiArCi0gICAgICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nZm9vJz5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT5cbiIgKwotICAgICAgICAgICAgIlxuIiArCi0gICAgICAgICAgICAiICA8eHM6ZWxlbWVudCBuYW1lPSdmb28nIHR5cGU9J253OmZvbyc+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6ZWxlbWVudD5cbiIgKwotICAgICAgICAgICAgIlxuIiArCi0gICAgICAgICAgICAiICA8eHM6ZWxlbWVudCBuYW1lPSdlcmljJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6Y29tcGxleFR5cGU+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6c2VxdWVuY2U+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2EnIG1heE9jY3Vycz0ndW5ib3VuZGVkJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2InIC8+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx4czphbnkgbmFtZXNwYWNlPSd5YXlhJyBtaW5PY2N1cnM9JzAnIG1heE9jY3Vycz0nMScgcHJvY2Vzc0NvbnRlbnRzPSdsYXgnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nYycgLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHhzOmFueSBtaW5PY2N1cnM9JzAnIG1heE9jY3Vycz0ndW5ib3VuZGVkJyBwcm9jZXNzQ29udGVudHM9J3N0cmljdCcvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPC94czpzZXF1ZW5jZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0neCcgdXNlPSdvcHRpb25hbCcvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSd5JyB1c2U9J3JlcXVpcmVkJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9J3onIHVzZT0ncHJvaGliaXRlZCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6Y29tcGxleFR5cGU+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6ZWxlbWVudD5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIjwveHM6c2NoZW1hPlxuIjsKLQotICAgICAgICBTdHJpbmcgZXJpYzJTY2hlbWEgPQotICAgICAgICAgICAgIjx4czpzY2hlbWFcbiIgKwotICAgICAgICAgICAgIiAgIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSdcbiIgKwotICAgICAgICAgICAgIiAgIHhtbG5zOm53PSdodHRwOi8vb3BlbnVyaS5vcmcvZXJpY3NjaGVtYTInXG4iICsKLSAgICAgICAgICAgICIgICB4bWxuczplcmljPSdodHRwOi8vb3BlbnVyaS5vcmcvZXJpY3NjaGVtYSdcbiIgKwotICAgICAgICAgICAgIiAgIHRhcmdldE5hbWVzcGFjZT0naHR0cDovL29wZW51cmkub3JnL2VyaWNzY2hlbWEyJ1xuIiArCi0gICAgICAgICAgICAiICAgZWxlbWVudEZvcm1EZWZhdWx0PSdxdWFsaWZpZWQnPlxuIiArCi0gICAgICAgICAgICAiXG4iICsKLSAgICAgICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdlcmljMic+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSdlcmljOmZvbyc+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx4czpzZXF1ZW5jZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdhJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8L3hzOnNlcXVlbmNlPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPC94czpleHRlbnNpb24+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpjb21wbGV4Q29udGVudD5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT5cbiIgKwotICAgICAgICAgICAgIjwveHM6c2NoZW1hPlxuIjsKLQotICAgICAgICBTdHJpbmcgZXJpYyA9ICI8ZXJpYyB5PSdZJyB4bWxucz0naHR0cDovL29wZW51cmkub3JnL2VyaWNzY2hlbWEnPiI7Ci0gICAgICAgIFN0cmluZyBlcmljMiA9ICI8ZXJpYyB4bWxucz0naHR0cDovL29wZW51cmkub3JnL2VyaWNzY2hlbWEyJz4iOwotICAgICAgICBTdHJpbmcgeHNpID0gInhtbG5zOmVyaWMyPSdodHRwOi8vb3BlbnVyaS5vcmcvZXJpY3NjaGVtYTInIHhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnIjsKLQotICAgICAgICBTdHJpbmdbXSB2YWxpZCA9IHsKLSAgICAgICAgICAgIGVyaWMgKyAiPGEvPjxiLz48Yy8+PGZvbyB4c2k6dHlwZT0nZXJpYzI6ZXJpYzInICIgKwotICAgICAgICAgICAgICAgIHhzaSArICI+PGEgeG1sbnM9XCJodHRwOi8vb3BlbnVyaS5vcmcvZXJpY3NjaGVtYTJcIi8+PC9mb28+PC9lcmljPiIsCi0gICAgICAgICAgICBlcmljICsgIjxhLz48Yi8+PGJvbyB4bWxucz0neWF5YScvPjxjLz48L2VyaWM+IiwKLSAgICAgICAgICAgIGVyaWMgKyAiPGEvPjxiLz48Yy8+PC9lcmljPiIsCi0gICAgICAgICAgICBlcmljICsgIjxhIHg9J3knLz48Yi8+PGMvPjwvZXJpYz4iLAotICAgICAgICAgICAgIjxlcmljIHk9J1knIHg9J1gnIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvZXJpY3NjaGVtYSc+IiArCi0gICAgICAgICAgICAgICAgIjxhLz48Yi8+PGMvPjwvZXJpYz4iCi0gICAgICAgIH07Ci0KLSAgICAgICAgU3RyaW5nIGVyaWNTYW5zWSA9Ci0gICAgICAgICAgICAiPGVyaWMgeG1sbnM9J2h0dHA6Ly9vcGVudXJpLm9yZy9lcmljc2NoZW1hJz4iOwotCi0gICAgICAgIFN0cmluZ1tdIGludmFsaWQgPSB7Ci0gICAgICAgICAgICAiPGZvby8+IiwKLSAgICAgICAgICAgICI8ZXJpYz48YS8+PGZvby8+PGMvPjwvZXJpYz4iLAotICAgICAgICAgICAgZXJpYyArICJ0ZXh0PGEvPjxiLz48Yy8+PC9lcmljPiIsCi0gICAgICAgICAgICBlcmljICsgIjxhLz50ZXh0PGIvPjxjLz48L2VyaWM+IiwKLSAgICAgICAgICAgIGVyaWMgKyAiPGEvPjxiLz50ZXh0PGMvPjwvZXJpYz4iLAotICAgICAgICAgICAgZXJpYyArICI8YS8+PGIvPjxjLz50ZXh0PC9lcmljPiIsCi0gICAgICAgICAgICBlcmljICsgIjxhIHg9J3knLz48Yi8+PGMvPnRleHQ8L2VyaWM+IiwKLSAgICAgICAgICAgIGVyaWMgKyAiPGEvPjxiLz48Ym9vIHhtbG5zPSd5YXlhJy8+PG1vbyB4bWxucz0neWF5YScvPjxjLz48L2VyaWM+IiwKLSAgICAgICAgICAgIGVyaWNTYW5zWSArICI8YS8+PGIvPjxjLz48L2VyaWM+IiwKLSAgICAgICAgICAgICI8ZXJpYyB5PScnIHo9JycgeG1sbnM9J2h0dHA6Ly9vcGVudXJpLm9yZy9lcmljc2NoZW1hJz4iICsKLSAgICAgICAgICAgICAgICAiPGEvPjxiLz48Yy8+PC9lcmljPiIKLSAgICAgICAgfTsKLQotICAgICAgICBTdHJpbmdbXSBzY2hlbWFzID0geyBlcmljU2NoZW1hLCBlcmljMlNjaGVtYSB9OwotICAgICAgICAKLSAgICAgICAgZG9UZXN0KAotICAgICAgICAgICAgc2NoZW1hcywKLSAgICAgICAgICAgIG5ldyBRTmFtZSggImh0dHA6Ly9vcGVudXJpLm9yZy9lcmljc2NoZW1hIiwgImVyaWMiICksCi0gICAgICAgICAgICB2YWxpZCwgaW52YWxpZCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZTIgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBib2JTY2hlbWEgPQotICAgICAgICAgICAgIjx4czpzY2hlbWFcbiIgKwotICAgICAgICAgICAgIiAgIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSdcbiIgKwotICAgICAgICAgICAgIiAgIHhtbG5zOmJvYj0naHR0cDovL29wZW51cmkub3JnL2JvYnNjaGVtYSdcbiIgKwotICAgICAgICAgICAgIiAgIHRhcmdldE5hbWVzcGFjZT0naHR0cDovL29wZW51cmkub3JnL2JvYnNjaGVtYSdcbiIgKwotICAgICAgICAgICAgIiAgIGVsZW1lbnRGb3JtRGVmYXVsdD0ncXVhbGlmaWVkJz5cbiIgKwotICAgICAgICAgICAgIlxuIiArCi0gICAgICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nYmlmZic+XG4iICsKLSAgICAgICAgICAgICIgICA8eHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSdib2I6Zm9vJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgPHhzOnNlcXVlbmNlPlxuIiArCi0gICAgICAgICAgICAiICAgICAgIDx4czplbGVtZW50IG5hbWU9J2EnIG1pbk9jY3Vycz0nMCcgbWF4T2NjdXJzPSd1bmJvdW5kZWQnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgPC94czpzZXF1ZW5jZT5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOmV4dGVuc2lvbj5cbiIgKwotICAgICAgICAgICAgIiAgIDwveHM6Y29tcGxleENvbnRlbnQ+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6Y29tcGxleFR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdmb28nPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6ZWxlbWVudCBuYW1lPSdmb28nIHR5cGU9J2JvYjpmb28nPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOmVsZW1lbnQ+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICI8L3hzOnNjaGVtYT5cbiI7Ci0KLSAgICAgICAgU3RyaW5nIHhzaVR5cGUgPSAieG1sbnM6eHNpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSciOwotCi0gICAgICAgIFN0cmluZ1tdIHZhbGlkID0gewotICAgICAgICAgICAgIjxib2I6Zm9vIHhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnIHhtbG5zOmJvYj0naHR0cDovL29wZW51cmkub3JnL2JvYnNjaGVtYScgIiArCi0gICAgICAgICAgICAgICAgInhzaTp0eXBlPSdib2I6YmlmZic+PGJvYjphLz48Ym9iOmEvPjxib2I6YS8+PC9ib2I6Zm9vPiIKLSAgICAgICAgfTsKLQotICAgICAgICBTdHJpbmdbXSBpbnZhbGlkID0gewotICAgICAgICAgICAgIjxib2I6Zm9vIHhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnIHhtbG5zOmJvYj0naHR0cDovL29wZW51cmkub3JnL2JvYnNjaGVtYScgIiArCi0gICAgICAgICAgICAgICAgInhzaTp0eXBlPSdib2I6YmlmZic+PGJvYjpxLz48L2JvYjpmb28+IiwKLSAgICAgICAgICAgICI8Ym9iOmZvbyBhPSdiJyB4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyB4bWxuczpib2I9J2h0dHA6Ly9vcGVudXJpLm9yZy9ib2JzY2hlbWEnICIgKwotICAgICAgICAgICAgICAgICJ4c2k6dHlwZT0nYm9iOmJpZmYnPjxib2I6YS8+PGJvYjphLz48Ym9iOmEvPjwvYm9iOmZvbz4iCi0gICAgICAgIH07Ci0KLSAgICAgICAgU3RyaW5nW10gc2NoZW1hcyA9IHsgYm9iU2NoZW1hIH07Ci0gICAgICAgIAotICAgICAgICBkb1Rlc3QoIHNjaGVtYXMsIG51bGwsIHZhbGlkLCBpbnZhbGlkICk7Ci0gICAgfQotICAgIAotICAgIFN0cmluZyBucyA9Ci0gICAgICAgICJ4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyAiICsKLSAgICAgICAgICAgICJ4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnIjsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZTMgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBzY2hlbWEgPQotICAgICAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiA8eHM6c2ltcGxlVHlwZSBuYW1lPSdhbGxOTkknPlxuIiArIAotICAgICAgICAgICAgIiAgPHhzOmFubm90YXRpb24+PHhzOmRvY3VtZW50YXRpb24+XG4iICsgCi0gICAgICAgICAgICAiICAgZm9yIG1heE9jY3VyczwveHM6ZG9jdW1lbnRhdGlvbj48L3hzOmFubm90YXRpb24+XG4iICsgCi0gICAgICAgICAgICAiICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9J3hzOm5vbk5lZ2F0aXZlSW50ZWdlcic+XG4iICsgCi0gICAgICAgICAgICAiICAgPHhzOnNpbXBsZVR5cGU+XG4iICsgCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpOTVRPS0VOJz5cbiIgKyAKLSAgICAgICAgICAgICIgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ndW5ib3VuZGVkJy8+XG4iICsgCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsgCi0gICAgICAgICAgICAiICAgPC94czpzaW1wbGVUeXBlPlxuIiArIAotICAgICAgICAgICAgIiAgPC94czp1bmlvbj5cbiIgKyAKLSAgICAgICAgICAgICIgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdlcmljQmFzZTY0QmluYXJ5Jz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6YmFzZTY0QmluYXJ5Jz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nRXJpYycvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nYWJjZEhleEJpbmFyeSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmhleEJpbmFyeSc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J2FiY2QnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3plcm9OdW1iZXInPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSdudW1iZXInPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdaZXJvJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzAnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J251bWJlcic+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnVuaW9uPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkZWNpbWFsJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOnN0cmluZyc+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9J2NvbGxhcHNlJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdaZXJvJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdPbmUnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J1R3bycvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nVGhyZWUnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J01hbnknLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnVuaW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2xpc3RPZkludCc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOmxpc3QgaXRlbVR5cGU9J3hzOmludCcvPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2xpc3RPZlByaW1lJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6bGlzdCBpdGVtVHlwZT0ncHJpbWUnLz5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdlcmljQnJvdGhlcic+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOnN0cmluZyc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0nY29sbGFwc2UnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nQnJpYW4nLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nS2V2aW4nLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2VyaWNCcm90aGVycyc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOmxpc3QgaXRlbVR5cGU9J2VyaWNCcm90aGVyJy8+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nd2Vla1N0cmluZyc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOnN0cmluZyc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0nY29sbGFwc2UnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nTW9uZGF5Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J1R1ZXNkYXknLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nV2VkbmVzZGF5Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J1RodXJzZGF5Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J0ZyaWRheScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdTYXR1cmRheScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdTdW5kYXknLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2FZZWFyJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZHVyYXRpb24nPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdQMVknLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2VyaWNCRGF5Jz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGF0ZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzE5NjUtMDYtMTAnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3lvdW5nZXJUaGFuRXJpYyc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRhdGUnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1pbkV4Y2x1c2l2ZSB2YWx1ZT0nMTk2NS0wNi0xMCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nZml2ZUNoYXJRbmFtZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOlFOYW1lJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czpsZW5ndGggdmFsdWU9JzUnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3dhY2t5UW5hbWUnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpRTmFtZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWluTGVuZ3RoIHZhbHVlPSczJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWF4TGVuZ3RoIHZhbHVlPScxMCcvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9J1t4czphYmNkZV0qJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J3hzOmFiYycvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSd4czpiY2QnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2ZpdmVDaGFyQW55VVJJJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6YW55VVJJJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czpsZW5ndGggdmFsdWU9JzUnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3dhY2t5QW55VVJJJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6YW55VVJJJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptaW5MZW5ndGggdmFsdWU9JzMnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptYXhMZW5ndGggdmFsdWU9JzEwJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J2ZvbycvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdiYXInLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2JpdCc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmJvb2xlYW4nPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9JzF8MCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nZXZlbkludGVnZXInPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkZWNpbWFsJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSdbMC05XSpbMDI0NjhdJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdwcmltZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRlY2ltYWwnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9J1swLTldKlsxMzU3OV0nLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMycvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSc1Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzcnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTEnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTMnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTcnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTknLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2ZvdXJDaGFyU3RyaW5nJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6c3RyaW5nJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czpsZW5ndGggdmFsdWU9JzQnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3RocmVlT3JNb3JlQ2hhclN0cmluZyc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOnN0cmluZyc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWluTGVuZ3RoIHZhbHVlPSczJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdmaXZlT3JMZXNzQ2hhclN0cmluZyc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOnN0cmluZyc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWF4TGVuZ3RoIHZhbHVlPSc1Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdmaXZlVG90YWxEaWdpdHMnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkZWNpbWFsJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czp0b3RhbERpZ2l0cyB2YWx1ZT0nNScvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGhyZWVGcmFjdGlvbkRpZ2l0cyc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRlY2ltYWwnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmZyYWN0aW9uRGlnaXRzIHZhbHVlPSczJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd0ZW5NaW5FeGNsdXNpdmUnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkZWNpbWFsJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptaW5FeGNsdXNpdmUgdmFsdWU9JzEwJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd0ZW5NYXhFeGNsdXNpdmUnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkZWNpbWFsJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptYXhFeGNsdXNpdmUgdmFsdWU9JzEwJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd0ZW5NYXhJbmNsdXNpdmUnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkZWNpbWFsJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9JzEwJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd0ZW5NaW5JbmNsdXNpdmUnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkZWNpbWFsJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9JzEwJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd0ZW5NaW5FeGNsdXNpdmVGbG9hdCc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmZsb2F0Jz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptaW5FeGNsdXNpdmUgdmFsdWU9JzEwJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd0ZW5NYXhFeGNsdXNpdmVGbG9hdCc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmZsb2F0Jz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptYXhFeGNsdXNpdmUgdmFsdWU9JzEwJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd0ZW5NYXhJbmNsdXNpdmVGbG9hdCc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmZsb2F0Jz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9JzEwJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd0ZW5NaW5JbmNsdXNpdmVGbG9hdCc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmZsb2F0Jz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9JzEwJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiXG4iICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3Rlbk1pbkV4Y2x1c2l2ZURvdWJsZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRvdWJsZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWluRXhjbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWF4RXhjbHVzaXZlRG91YmxlJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZG91YmxlJz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czptYXhFeGNsdXNpdmUgdmFsdWU9JzEwJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKwotICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd0ZW5NYXhJbmNsdXNpdmVEb3VibGUnPlxuIiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkb3VibGUnPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0nMTAnLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3Rlbk1pbkluY2x1c2l2ZURvdWJsZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRvdWJsZSc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIlxuIiArCi0gICAgICAgICAgICAiICA8eHM6ZWxlbWVudCBuYW1lPSdhbnknPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOmVsZW1lbnQ+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czplbGVtZW50IG5hbWU9J2RlZmF1bHRfMTIzNDUnIGRlZmF1bHQ9JzEyMzQ1Jz5cbiIgKwotICAgICAgICAgICAgIiAgPC94czplbGVtZW50PlxuIiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6ZWxlbWVudCBuYW1lPSdkZWZhdWx0XzEyMzQnIGRlZmF1bHQ9JzEyMzQnPlxuIiArCi0gICAgICAgICAgICAiICA8L3hzOmVsZW1lbnQ+XG4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czplbGVtZW50IG5hbWU9J2RlZmF1bHRfZXJpYycgZGVmYXVsdD0nZXJpYyc+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6ZWxlbWVudD5cbiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIjwveHM6c2NoZW1hPlxuIjsKLQotICAgICAgICBTdHJpbmdbXSB2YWxpZCA9IHsKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3RocmVlRnJhY3Rpb25EaWdpdHMnPi4xPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3RocmVlRnJhY3Rpb25EaWdpdHMnPi4xMjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0aHJlZUZyYWN0aW9uRGlnaXRzJz4uMTIzPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nYWxsTk5JJz51bmJvdW5kZWQ8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nYWxsTk5JJz4wPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2FsbE5OSSc+MTwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmJhc2U2NEJpbmFyeSc+Q0FGRUJBQkU8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nYWJjZEhleEJpbmFyeSc+YWJjZDwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmJhc2U2NEJpbmFyeSc+YWJjZGVmZ2g8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXJpY0Jhc2U2NEJpbmFyeSc+RXJpYzwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3plcm9OdW1iZXInPiBaZXJvPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3plcm9OdW1iZXInPlplcm88L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nemVyb051bWJlcic+MDwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J251bWJlcic+MTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdudW1iZXInPiAxIDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdudW1iZXInPlR3bzwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdudW1iZXInPiBUaHJlZSA8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdlcmljQnJvdGhlcnMnPjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdlcmljQnJvdGhlcnMnPkJyaWFuPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2VyaWNCcm90aGVycyc+S2V2aW48L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXJpY0Jyb3RoZXJzJz5LZXZpbiBCcmlhbjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdlcmljQnJvdGhlcnMnPkJyaWFuIEtldmluPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbGlzdE9mSW50Jz4gIDEgIDIyICAzMzMgIDQ0NDQgIDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdsaXN0T2ZJbnQnPjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdsaXN0T2ZJbnQnPjU5OTk8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdhWWVhcic+UDFZPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZml2ZUNoYXJBbnlVUkknPmFiY2RlPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmFueVVSSSc+Zm9vPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3dhY2t5QW55VVJJJz5mb288L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd5b3VuZ2VyVGhhbkVyaWMnPjE5NjUtMDYtMTE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXJpY0JEYXknPjE5NjUtMDYtMTA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6ZGF0ZVRpbWUnPjE5OTktMDUtMzFUMTM6MjA6MDAtMDU6MDA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6dGltZSc+MDA6MDA6MDA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6dGltZSc+MTM6MjA6MDAtMDU6MDA8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd3YWNreVFuYW1lJz54czphYmM8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZml2ZUNoYXJRbmFtZSc+YWJjZGU8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZml2ZUNoYXJRbmFtZSc+eHM6YWI8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ncHJpbWUnPjM8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ncHJpbWUnPjExPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmludGVnZXInPis0NTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czppbnRlZ2VyJz4xPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmludGVnZXInPjA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6aW50ZWdlcic+LTE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6aW50ZWdlcic+LTE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6aW50ZWdlcic+NDg5NzQzNTc5ODM3NTg5NzQzNDM0PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmJvb2xlYW4nPjE8L2FueT4iLAotICAgICAgICAgICAgIjxkZWZhdWx0XzEyMzQgIiArIG5zICsgIiB4c2k6dHlwZT0nZXZlbkludGVnZXInPjwvZGVmYXVsdF8xMjM0PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdldmVuSW50ZWdlcic+MTI8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nYml0Jz4xPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2JpdCc+MDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpib29sZWFuJz5mYWxzZTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdldmVuSW50ZWdlcic+MDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd3ZWVrU3RyaW5nJz5Nb25kYXk8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nd2Vla1N0cmluZyc+U3VuZGF5PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3dlZWtTdHJpbmcnPiAgVGh1cnNkYXkgIDwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkV4Y2x1c2l2ZSc+MTAuMTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhFeGNsdXNpdmUnPjkuOTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5JbmNsdXNpdmUnPjEwPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkluY2x1c2l2ZSc+MTAuMTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhJbmNsdXNpdmUnPjEwPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEluY2x1c2l2ZSc+OS45PC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluRXhjbHVzaXZlRmxvYXQnPjEwLjE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4RXhjbHVzaXZlRmxvYXQnPjkuOTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5JbmNsdXNpdmVGbG9hdCc+MTA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluSW5jbHVzaXZlRmxvYXQnPjEwLjE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4SW5jbHVzaXZlRmxvYXQnPjEwPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEluY2x1c2l2ZUZsb2F0Jz45Ljk8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5FeGNsdXNpdmVEb3VibGUnPjEwLjE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4RXhjbHVzaXZlRG91YmxlJz45Ljk8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluSW5jbHVzaXZlRG91YmxlJz4xMDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5JbmNsdXNpdmVEb3VibGUnPjEwLjE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4SW5jbHVzaXZlRG91YmxlJz4xMDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhJbmNsdXNpdmVEb3VibGUnPjkuOTwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZvdXJDaGFyU3RyaW5nJz5lcmljPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3RocmVlT3JNb3JlQ2hhclN0cmluZyc+MTIzNDU8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZml2ZU9yTGVzc0NoYXJTdHJpbmcnPjEyMzQ8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZml2ZVRvdGFsRGlnaXRzJz4xMjM0NTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdmaXZlVG90YWxEaWdpdHMnPjEyMzQ8L2FueT4iLAotICAgICAgICAgICAgIjxkZWZhdWx0XzEyMzQgIiArIG5zICsgIiB4c2k6dHlwZT0nZXZlbkludGVnZXInPlxuXG48L2RlZmF1bHRfMTIzND4iCi0gICAgICAgIH07Ci0KLSAgICAgICAgU3RyaW5nW10gaW52YWxpZCA9IHsKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2FsbE5OSSc+Zm9vPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmhleEJpbmFyeSc+UDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpoZXhCaW5hcnknPkNBRkVCQUJQPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2FiY2RIZXhCaW5hcnknPmFiY2U8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpiYXNlNjRCaW5hcnknPmFiY2RlPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2VyaWNCYXNlNjRCaW5hcnknPkVyaWs8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd6ZXJvTnVtYmVyJz5PbmU8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nemVyb051bWJlcic+VHdlbnR5PC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbnVtYmVyJz5TZXZlbjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdudW1iZXInPkJvYjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdudW1iZXInPjwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2VyaWNCcm90aGVycyc+MTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdlcmljQnJvdGhlcnMnPkJvYjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdlcmljQnJvdGhlcnMnPlJhbHBoIEZyYW5rPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbGlzdE9mSW50Jz4gIDEgIDIyICAzMzMgIEVyaWMgIDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdsaXN0T2ZJbnQnPkVyaWM8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbGlzdE9mSW50Jz4tPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nYVllYXInPlAyWTwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3lvdW5nZXJUaGFuRXJpYyc+MTk2NS0wNi0xMDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdlcmljQkRheSc+MTk4NS0wNi0xMDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpkYXRlVGltZSc+eHgxOTk5LTA1LTMxVDEzOjIwOjAwLTA1OjAwPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmRhdGVUaW1lJz5lcmljPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOnRpbWUnPjk5Ojk5OjAwPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOnRpbWUnPjEzOjIwOjAwLTk5OjAwPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nd2Fja3lBbnlVUkknPm1vbzwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdmaXZlQ2hhckFueVVSSSc+YWI8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd3YWNreVFuYW1lJz54czphYmNkZWZnaGlqazwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd3YWNreVFuYW1lJz54czpwcXI8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6UU5hbWUnPmZvbzpiYXI8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZml2ZUNoYXJRbmFtZSc+eHM6YWJjPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3ByaW1lJz4xMjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdwcmltZSc+NjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czppbnRlZ2VyJz5mb288L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6aW50ZWdlcic+LjE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXZlbkludGVnZXInPjE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nYml0Jz50cnVlPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2JpdCc+ZmFsc2U8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nYml0Jz5uaWJibGU8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nYml0Jz4yPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmJvb2xlYW4nPmJsdXJmPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmJvb2xlYW4nPjwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdldmVuSW50ZWdlcic+PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3dlZWtTdHJpbmcnPk1vbmRheSBTdWNrczwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEV4Y2x1c2l2ZSc+MTAuMTwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhFeGNsdXNpdmUnPjEwPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkV4Y2x1c2l2ZSc+MTA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluRXhjbHVzaXZlJz45Ljk8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluSW5jbHVzaXZlJz45Ljk8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4SW5jbHVzaXZlJz4xMC4xPC9hbnk+IiwKLQotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4RXhjbHVzaXZlRmxvYXQnPjEwLjE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4RXhjbHVzaXZlRmxvYXQnPjEwPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkV4Y2x1c2l2ZUZsb2F0Jz4xMDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5FeGNsdXNpdmVGbG9hdCc+OS45PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkluY2x1c2l2ZUZsb2F0Jz45Ljk8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4SW5jbHVzaXZlRmxvYXQnPjEwLjE8L2FueT4iLAotCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhFeGNsdXNpdmVEb3VibGUnPjEwLjE8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4RXhjbHVzaXZlRG91YmxlJz4xMDwvYW55PiIsCi0gICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5FeGNsdXNpdmVEb3VibGUnPjEwPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkV4Y2x1c2l2ZURvdWJsZSc+OS45PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkluY2x1c2l2ZURvdWJsZSc+OS45PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEluY2x1c2l2ZURvdWJsZSc+MTAuMTwvYW55PiIsCi0KLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZpdmVPckxlc3NDaGFyU3RyaW5nJz4gMTIzNCA8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZml2ZVRvdGFsRGlnaXRzJz4xMjM0NTY8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZm91ckNoYXJTdHJpbmcnPnZhc2lsaWs8L2FueT4iLAotICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGhyZWVPck1vcmVDaGFyU3RyaW5nJz4xPC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZpdmVPckxlc3NDaGFyU3RyaW5nJz4xMjM0NTY3PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3RocmVlRnJhY3Rpb25EaWdpdHMnPi4xMjM0PC9hbnk+IiwKLSAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZvdXJDaGFyU3RyaW5nJz4gZXJpYyA8L2FueT4iLAotCi0gICAgICAgICAgICAiPGRlZmF1bHRfMTIzNDUgIiArIG5zICsgIiB4c2k6dHlwZT0nZXZlbkludGVnZXInPjwvZGVmYXVsdF8xMjM0NT4iLAotICAgICAgICAgICAgIjxkZWZhdWx0XzEyMzQ1ICIgKyBucyArICIgeHNpOnR5cGU9J2V2ZW5JbnRlZ2VyJz5cblxuPC9kZWZhdWx0XzEyMzQ1PiIKLSAgICAgICAgfTsKLQotICAgICAgICBTdHJpbmdbXSBzY2hlbWFzID0geyBzY2hlbWEgfTsKLQotICAgICAgICBkb1Rlc3QoIHNjaGVtYXMsIG51bGwsIHZhbGlkLCBpbnZhbGlkICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlNCAoICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHNjaGVtYSA9Ci0gICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPlxuIiArCi0gICAgICAgICAgICAiXG4iICsKLSAgICAgICAgICAgICIgIDx4czplbGVtZW50IG5hbWU9J2FueSc+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6ZWxlbWVudD5cbiIgKwotICAgICAgICAgICAgIlxuIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdraW5kYVByaW1lJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0nWzAtOV0qWzEzNTc5XScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSczJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzUnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nNycvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPScxMScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPScxMycvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPScxNycvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPScxOScvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIlxuIiArCi0gICAgICAgICAgICAiPC94czpzY2hlbWE+XG4iICsKLSAgICAgICAgICAgICIiOwotCi0gICAgICAgIFN0cmluZ1tdIHNjaGVtYXMgPSB7IHNjaGVtYSB9OwotCi0gICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgc3RsID0gbWFrZVNjaGVtYVR5cGVMb2FkZXIoIHNjaGVtYXMgKTsKLQotICAgICAgICBYbWxPYmplY3QgeCA9Ci0gICAgICAgICAgICBzdGwucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0na2luZGFQcmltZSc+MTAwPC9hbnk+IiwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsICk7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB1bnZhbGlkYXRlZCBzdHJlYW0gaXMgT0sKLQotICAgICAgICBYTUxJbnB1dFN0cmVhbSB4aXMgPSB4Lm5ld1hNTElucHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgd2hpbGUgKCB4aXMuaGFzTmV4dCgpICkKLSAgICAgICAgICAgIHhpcy5uZXh0KCk7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB2YWxpZGF0ZWQgc3RyZWFtIGZhaWxzCi0KLSAgICAgICAgYm9vbGVhbiBibGV3Q2h1bmtzID0gZmFsc2U7Ci0KLSAgICAgICAgeGlzID0KLSAgICAgICAgICAgIHN0bC5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgeC5uZXdYTUxJbnB1dFN0cmVhbSgpLCBudWxsLCBudWxsICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlICggeGlzLmhhc05leHQoKSApCi0gICAgICAgICAgICAgICAgeGlzLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFhNTFN0cmVhbVZhbGlkYXRpb25FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJsZXdDaHVua3MgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGJsZXdDaHVua3MgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGU1ICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgc2NoZW1hID0KLSAgICAgICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+XG4iICsKLSAgICAgICAgICAgICJcbiIgKwotICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0naGVlJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6Y29tcGxleFR5cGU+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6c2VxdWVuY2U+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2hhdycgdHlwZT0neHM6aW50Jy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8L3hzOnNlcXVlbmNlPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSd5ZWUnIHR5cGU9J3hzOmludCcvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6Y29tcGxleFR5cGU+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6ZWxlbWVudD5cbiIgKwotICAgICAgICAgICAgIlxuIiArCi0gICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdraW5kYVByaW1lJz5cbiIgKwotICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCc+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0nWzAtOV0qWzEzNTc5XScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSczJy8+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzUnLz5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nNycvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPScxMScvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPScxMycvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPScxNycvPlxuIiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPScxOScvPlxuIiArCi0gICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKwotICAgICAgICAgICAgIlxuIiArCi0gICAgICAgICAgICAiPC94czpzY2hlbWE+XG4iICsKLSAgICAgICAgICAgICIiOwotCi0gICAgICAgIFN0cmluZ1tdIHNjaGVtYXMgPSB7IHNjaGVtYSB9OwotCi0gICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgc3RsID0gbWFrZVNjaGVtYVR5cGVMb2FkZXIoIHNjaGVtYXMgKTsKLQotICAgICAgICBYbWxPYmplY3QgeCA9Ci0gICAgICAgICAgICBzdGwucGFyc2UoCi0gICAgICAgICAgICAgICAgIjxoZWUgeWVlPSczJz48aGF3PjY2PC9oYXc+PC9oZWU+IiwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCApOwotCi0gICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKLQotICAgICAgICBmb3IgKCA7IDsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxPYmplY3Qgb2JqID0gYy5nZXRPYmplY3QoKTsKLQotICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsKQotICAgICAgICAgICAgICAgIG9iai52YWxpZGF0ZSgpOwotCi0gICAgICAgICAgICBpZiAoYy50b05leHRUb2tlbigpLmlzTm9uZSgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaW52YWxpZAotCi0gICAgICAgIHggPQotICAgICAgICAgICAgc3RsLnBhcnNlKAotICAgICAgICAgICAgICAgICI8aGVlIHllZT0nZml2ZSc+PGhhdz42NjwvaGF3PjwvaGVlPiIsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhIHgudmFsaWRhdGUoKSApOwotCi0gICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOwotICAgICAgICBjLnRvTmV4dFRva2VuKCk7Ci0gICAgICAgIGMudG9OZXh0VG9rZW4oKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggISBjLmdldE9iamVjdCgpLnZhbGlkYXRlKCkgKTsKLQotICAgICAgICAvLyBObyBzY2hlbWEKLQotICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vIHg9J3knPmFzYXM8YmFyPmFzYXM8L2Jhcj48L2Zvbz4iICk7Ci0KLSAgICAgICAgYyA9IHgubmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sT2JqZWN0IG9iaiA9IGMuZ2V0T2JqZWN0KCk7Ci0KLSAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBvYmoudmFsaWRhdGUoKTsKLQotICAgICAgICAgICAgaWYgKGMudG9OZXh0VG9rZW4oKS5pc05vbmUoKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZTYgKCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBzY2hlbWEgPQotICAgICAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKwotICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0naGVlJz5cbiIgKwotICAgICAgICAgICAgIiAgPC94czplbGVtZW50PlxuIiArCi0gICAgICAgICAgICAiPC94czpzY2hlbWE+XG4iICsKLSAgICAgICAgICAgICIiOwotCi0gICAgICAgIFN0cmluZ1tdIHNjaGVtYXMgPSB7IHNjaGVtYSwgc2NoZW1hIH07Ci0KLQotICAgICAgICAvLyBTaG91bGQgZ2V0IGEgc2NoZW1hIGNvbXBpbGUgZXJyb3IKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbWFrZVNjaGVtYVR5cGVMb2FkZXIoIHNjaGVtYXMgKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGU3ICggKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgc2NoZW1hID0KLSAgICAgICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+IiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6ZWxlbWVudCBuYW1lPSdiYXNlJyB0eXBlPSdiYXNlJy8+IiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nYmFzZSc+IiArCi0gICAgICAgICAgICAiICAgIDx4czpzZXF1ZW5jZT4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdmb28nLz4iICsKLSAgICAgICAgICAgICIgICAgPC94czpzZXF1ZW5jZT4iICsKLSAgICAgICAgICAgICIgIDwveHM6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nZGVyaXZlZCc+IiArCi0gICAgICAgICAgICAiICAgIDx4czpjb21wbGV4Q29udGVudD4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9J2Jhc2UnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHhzOnNlcXVlbmNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdiYXInLz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwveHM6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAiICAgICAgPC94czpleHRlbnNpb24+IiArCi0gICAgICAgICAgICAiICAgIDwveHM6Y29tcGxleENvbnRlbnQ+IiArCi0gICAgICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIjwveHM6c2NoZW1hPiIgKwotICAgICAgICAgICAgIiI7Ci0KLSAgICAgICAgU3RyaW5nW10gc2NoZW1hcyA9IHsgc2NoZW1hIH07Ci0KLSAgICAgICAgU2NoZW1hVHlwZUxvYWRlciBzdGwgPSBtYWtlU2NoZW1hVHlwZUxvYWRlciggc2NoZW1hcyApOwotCi0gICAgICAgIFhtbE9iamVjdCB4ID0KLSAgICAgICAgICAgIHN0bC5wYXJzZSgKLSAgICAgICAgICAgICAgICAiPGJhc2U+PGZvby8+PC9iYXNlPiIsIG51bGwsIG51bGwgKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC52YWxpZGF0ZSgpICk7Ci0KLSAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOwotCi0gICAgICAgIGMudG9GaXJzdENoaWxkKCk7Ci0KLSAgICAgICAgWG1sT2JqZWN0IGJhc2UgPSBjLmdldE9iamVjdCgpOwotCi0gICAgICAgIGMudG9FbmRUb2tlbigpOwotICAgICAgICBjLmluc2VydEVsZW1lbnQoICJiYXIiICk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICF4LnZhbGlkYXRlKCkgKTsKLQotICAgICAgICBjLnRvUHJldlNpYmxpbmcoKTsKLQotICAgICAgICBjLnJlbW92ZVhtbCgpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnZhbGlkYXRlKCkgKTsKLQotICAgICAgICBiYXNlLmNoYW5nZVR5cGUoIHN0bC5maW5kVHlwZSggbmV3IFFOYW1lKCAiZGVyaXZlZCIgKSApICk7Ci0KLSAgICAgICAgYy5pbnNlcnRFbGVtZW50KCAiYmFyIiApOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnZhbGlkYXRlKCkgKTsKLSAgICB9Ci0KLSAgICAvLyBUZXN0cyBhYnN0cmFjdCAmIGJsb2NrIGF0dHJpYnV0ZXMgb24gQ29tcGxleFR5cGUKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGU4KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nW10gc2NoZW1hcyA9IHsKLSAgICAgICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+IiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiICA8eHM6ZWxlbWVudCBuYW1lPSdhYnN0cmFjdCcgdHlwZT0nYWJzdHJhY3QnLz4iICsKLSAgICAgICAgICAgICIgIDx4czplbGVtZW50IG5hbWU9J2Jhc2UnIHR5cGU9J2Jhc2UnLz4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdhYnN0cmFjdCcgYWJzdHJhY3Q9J3RydWUnLz4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdjb25jcmV0ZSc+IiArCi0gICAgICAgICAgICAiICAgIDx4czpjb21wbGV4Q29udGVudD4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9J2Fic3RyYWN0Jy8+IiArCi0gICAgICAgICAgICAiICAgIDwveHM6Y29tcGxleENvbnRlbnQ+IiArCi0gICAgICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2Jhc2UnIGJsb2NrPSdleHRlbnNpb24nLz4iICsKLSAgICAgICAgICAgICIiICsKLSAgICAgICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdleHQnPiIgKwotICAgICAgICAgICAgIiAgICA8eHM6Y29tcGxleENvbnRlbnQ+IiArCi0gICAgICAgICAgICAiICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSdiYXNlJy8+IiArCi0gICAgICAgICAgICAiICAgIDwveHM6Y29tcGxleENvbnRlbnQ+IiArCi0gICAgICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiIgKwotICAgICAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J3Jlc3QnPiIgKwotICAgICAgICAgICAgIiAgICA8eHM6Y29tcGxleENvbnRlbnQ+IiArCi0gICAgICAgICAgICAiICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J2Jhc2UnLz4iICsKLSAgICAgICAgICAgICIgICAgPC94czpjb21wbGV4Q29udGVudD4iICsKLSAgICAgICAgICAgICIgIDwveHM6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiIiArCi0gICAgICAgICAgICAiPC94czpzY2hlbWE+IiArCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgfTsKLQotICAgICAgICBTdHJpbmcgeHNpVHlwZSA9ICIgeG1sbnM6eHNpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZScgIjsKLQotICAgICAgICBTdHJpbmdbXSB2YWxpZCA9IHsKLSAgICAgICAgICAgICI8YWJzdHJhY3QiICsgeHNpVHlwZSArICJ4c2k6dHlwZT0nY29uY3JldGUnLz4iLAotICAgICAgICAgICAgIjxiYXNlLz4iLAotICAgICAgICAgICAgIjxiYXNlIiArIHhzaVR5cGUgKyAieHNpOnR5cGU9J3Jlc3QnLz4iLAotICAgICAgICB9OwotICAgICAgICBTdHJpbmdbXSBpbnZhbGlkID0gewotICAgICAgICAgICAgIjxhYnN0cmFjdC8+IiwKLSAgICAgICAgICAgICI8YmFzZSIgKyB4c2lUeXBlICsgInhzaTp0eXBlPSdleHQnLz4iLAotICAgICAgICB9OwotCi0gICAgICAgIGRvVGVzdChzY2hlbWFzLCBudWxsLCB2YWxpZCwgaW52YWxpZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlOSgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0KLSAgICAgICAgU3RyaW5nW10gc2NoZW1hcyA9IHsKLSAgICAgICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+IiArCi0gICAgICAgICAgICAiICAgPHhzOmVsZW1lbnQgbmFtZT0nb3JkZXInIHR5cGU9J09yZGVyVHlwZSc+IiArCi0gICAgICAgICAgICAiICAgICAgIDx4czprZXlyZWYgbmFtZT0ncHJvZE51bUtleVJlZicgcmVmZXI9J3Byb2ROdW1LZXknPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgPHhzOnNlbGVjdG9yIHhwYXRoPSdpdGVtcy8qJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICA8eHM6ZmllbGQgeHBhdGg9J0BudW1iZXInLz4iICsKLSAgICAgICAgICAgICIgICAgICAgPC94czprZXlyZWY+IiArCi0gICAgICAgICAgICAiICAgICAgIDx4czprZXkgbmFtZT0ncHJvZE51bUtleSc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICA8eHM6c2VsZWN0b3IgeHBhdGg9Jy4vL3Byb2R1Y3QnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgIDx4czpmaWVsZCB4cGF0aD0nbnVtYmVyJy8+IiArCi0gICAgICAgICAgICAiICAgICAgIDwveHM6a2V5PiIgKwotICAgICAgICAgICAgIiAgIDwveHM6ZWxlbWVudD4iICsKLQotICAgICAgICAgICAgIiAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdPcmRlclR5cGUnPiIgKwotICAgICAgICAgICAgIiAgICAgICA8eHM6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdpdGVtcyc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdpdGVtJyB0eXBlPSdJdGVtVHlwZScgbWluT2NjdXJzPScwJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICA8L3hzOmVsZW1lbnQ+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdwcm9kdWN0cyc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdwcm9kdWN0JyB0eXBlPSdQcm9kdWN0VHlwZScgbWF4T2NjdXJzPSd1bmJvdW5kZWQnIG1pbk9jY3Vycz0nMCcvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICA8L3hzOmVsZW1lbnQ+IiArCi0gICAgICAgICAgICAiICAgICAgIDwveHM6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAiICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0nbnVtYmVyJyB0eXBlPSd4czpzdHJpbmcnLz4iICsKLSAgICAgICAgICAgICIgICA8L3hzOmNvbXBsZXhUeXBlPiIgKwotCi0gICAgICAgICAgICAiICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J0l0ZW1UeXBlJz4iICsKLSAgICAgICAgICAgICIgICAgICAgPHhzOnNlcXVlbmNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ncXVhbnRpdHknIHR5cGU9J3hzOmludCcvPiIgKwotICAgICAgICAgICAgIiAgICAgICA8L3hzOnNlcXVlbmNlPiIgKwotICAgICAgICAgICAgIiAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9J251bWJlcicgdHlwZT0neHM6aW50Jy8+IiArCi0gICAgICAgICAgICAiICAgPC94czpjb21wbGV4VHlwZT4iICsKLQotICAgICAgICAgICAgIiAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdQcm9kdWN0VHlwZSc+IiArCi0gICAgICAgICAgICAiICAgICAgIDx4czpzZXF1ZW5jZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J251bWJlcicgdHlwZT0neHM6aW50JyBtaW5PY2N1cnM9JzAnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J25hbWUnIHR5cGU9J3hzOnN0cmluZycvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ncHJpY2UnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9J3hzOmRlY2ltYWwnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0nY3VycmVuY3knIHR5cGU9J3hzOnN0cmluZycvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgPC94czplbGVtZW50PiIgKwotICAgICAgICAgICAgIiAgICAgICA8L3hzOnNlcXVlbmNlPiIgKwotICAgICAgICAgICAgIiAgIDwveHM6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiPC94czpzY2hlbWE+ICIsCi0KLSAgICAgICAgICAgICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz4iICsKLQotICAgICAgICAgICAgIiAgICA8eHNkOmVsZW1lbnQgbmFtZT0ncm9vdCcgdHlwZT0nUm9vdFR5cGUnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHhzZDprZXkgbmFtZT0nRm9vSWQnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9Jy4vL3N0cmluZ3wuLy90b2tlbnwuLy9pbnQnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOmZpZWxkIHhwYXRoPSdAaWQnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwveHNkOmtleT4iICsKLSAgICAgICAgICAgICIgICAgPC94c2Q6ZWxlbWVudD4iICsKLQotICAgICAgICAgICAgIiAgICA8eHNkOmdyb3VwIG5hbWU9J2dyb3VwJz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx4c2Q6Y2hvaWNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9J3N0cmluZycvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9J3Rva2VuJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0naW50Jy8+IiArCi0gICAgICAgICAgICAiICAgICAgICA8L3hzZDpjaG9pY2U+IiArCi0gICAgICAgICAgICAiICAgIDwveHNkOmdyb3VwPiIgKwotCi0gICAgICAgICAgICAiICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0nUm9vdFR5cGUnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHhzZDpncm91cCByZWY9J2dyb3VwJyBtaW5PY2N1cnM9JzAnIG1heE9jY3Vycz0ndW5ib3VuZGVkJy8+IiArCi0gICAgICAgICAgICAiICAgIDwveHNkOmNvbXBsZXhUeXBlPiIgKwotCi0gICAgICAgICAgICAiICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSdzdHJpbmcnPiIgKwotICAgICAgICAgICAgIiAgICAgICA8eHNkOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSdncm91cCcgbWluT2NjdXJzPScwJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9J2lkJyB0eXBlPSd4c2Q6c3RyaW5nJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIgICAgPC94c2Q6ZWxlbWVudD4iICsKLQotICAgICAgICAgICAgIiAgICA8eHNkOmVsZW1lbnQgbmFtZT0naW50Jz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHhzZDpncm91cCByZWY9J2dyb3VwJyBtaW5PY2N1cnM9JzAnIG1heE9jY3Vycz0ndW5ib3VuZGVkJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0naWQnIHR5cGU9J3hzZDppbnQnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiAgICA8L3hzZDplbGVtZW50PiIgKwotCi0gICAgICAgICAgICAiICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSd0b2tlbic+IiArCi0gICAgICAgICAgICAiICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSdncm91cCcgbWluT2NjdXJzPScwJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9J2lkJyB0eXBlPSd4c2Q6dG9rZW4nLz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiAgICA8L3hzZDplbGVtZW50PiIgKwotCi0gICAgICAgICAgICAiPC94c2Q6c2NoZW1hPiIsCi0KLSAgICAgICAgICAgICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJyAiICsKLSAgICAgICAgICAgICIgICAgdGFyZ2V0TmFtZXNwYWNlPSdodHRwOi8vd3d3LnRpbS1oYW5zb24uY29tLycgeG1sbnM6dGg9J2h0dHA6Ly93d3cudGltLWhhbnNvbi5jb20vJyAiICsKLSAgICAgICAgICAgICIgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9J3F1YWxpZmllZCcgZWxlbWVudEZvcm1EZWZhdWx0PSdxdWFsaWZpZWQnPiIgKwotCi0gICAgICAgICAgICAiICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSdyb290Jz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9J2ZvbycgbWF4T2NjdXJzPSd1bmJvdW5kZWQnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSdpZCcgdHlwZT0neHNkOmludCcvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx4c2Q6a2V5IG5hbWU9J2lkJz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPScuL3RoOmZvbycvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9J0B0aDppZCcvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC94c2Q6a2V5PiIgKwotICAgICAgICAgICAgIiAgICA8L3hzZDplbGVtZW50PiIgKwotICAgICAgICAgICAgIjwveHNkOnNjaGVtYT4iLAotCi0gICAgICAgICAgICAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScgPiIgKwotICAgICAgICAgICAgIiAgICA8eHNkOmVsZW1lbnQgbmFtZT0naWR0ZXN0Jz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZSBtYXhPY2N1cnM9J3VuYm91bmRlZCc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9J2lkJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcgdHlwZT0neHNkOklEJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0naWRyZWYnIG1heE9jY3Vycz0ndW5ib3VuZGVkJyB0eXBlPSd4c2Q6SURSRUYnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSdpZHJlZnMnIG1heE9jY3Vycz0ndW5ib3VuZGVkJyB0eXBlPSd4c2Q6SURSRUZTJy8+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgIDwveHNkOmNob2ljZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPiIgKwotICAgICAgICAgICAgIiAgICA8L3hzZDplbGVtZW50PiIgKwotICAgICAgICAgICAgIjwveHNkOnNjaGVtYT4iLAotCi0gICAgICAgIH07Ci0KLSAgICAgICAgU3RyaW5nW10gdmFsaWQgPSB7Ci0gICAgICAgICAgICAiPG9yZGVyPiIgKwotICAgICAgICAgICAgIiAgICA8aXRlbXM+IiArCi0gICAgICAgICAgICAiICAgICAgPGl0ZW0gbnVtYmVyPScxMjQgJz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgPHF1YW50aXR5PjE8L3F1YW50aXR5PiIgKwotICAgICAgICAgICAgIiAgICAgIDwvaXRlbT4iICsKLSAgICAgICAgICAgICIgICAgICA8aXRlbSBudW1iZXI9JzU2Myc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgIDxxdWFudGl0eT4xPC9xdWFudGl0eT4iICsKLSAgICAgICAgICAgICIgICAgICA8L2l0ZW0+IiArCi0gICAgICAgICAgICAiICAgIDwvaXRlbXM+IiArCi0gICAgICAgICAgICAiICAgIDxwcm9kdWN0cz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDxwcm9kdWN0PiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxudW1iZXI+IDEyNDwvbnVtYmVyPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxuYW1lPlNoaXJ0PC9uYW1lPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxwcmljZSBjdXJyZW5jeT0nVVNEJz4yOS45OTwvcHJpY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICA8L3Byb2R1Y3Q+IiArCi0gICAgICAgICAgICAiICAgICAgICA8cHJvZHVjdD4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8bnVtYmVyPjU2MzwvbnVtYmVyPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxuYW1lPkhhdDwvbmFtZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8cHJpY2UgY3VycmVuY3k9J1VTRCc+NjkuOTk8L3ByaWNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC9wcm9kdWN0PiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHByb2R1Y3Q+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPG51bWJlcj40NDM8L251bWJlcj4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8bmFtZT5VbWJyZWxsYTwvbmFtZT4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8cHJpY2UgY3VycmVuY3k9J1VTRCc+NDkuOTk8L3ByaWNlPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC9wcm9kdWN0PiIgKwotICAgICAgICAgICAgIiAgICA8L3Byb2R1Y3RzPiIgKwotICAgICAgICAgICAgIjwvb3JkZXI+IiwKLQotICAgICAgICAgICAgIjxyb290PiIgKwotICAgICAgICAgICAgIiAgICA8c3RyaW5nIGlkPSdmb28xJz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDxzdHJpbmcgaWQ9J2ZvbzInPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxzdHJpbmcgaWQ9J2ZvbzMnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICA8c3RyaW5nIGlkPSdmb282Jz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIDxzdHJpbmcgaWQ9J2ZvbzcnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmcgaWQ9J2ZvbzgnLz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIDwvc3RyaW5nPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICA8L3N0cmluZz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8L3N0cmluZz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8c3RyaW5nIGlkPSdmb280Jy8+IiArCi0gICAgICAgICAgICAiICAgICAgICA8L3N0cmluZz4iICsKLSAgICAgICAgICAgICIgICAgICAgIDxzdHJpbmcgaWQ9J2ZvbzknLz4iICsKLSAgICAgICAgICAgICIgICAgPC9zdHJpbmc+IiArCi0gICAgICAgICAgICAiPC9yb290PiIsCi0KLSAgICAgICAgICAgICI8cm9vdD4iICsKLSAgICAgICAgICAgICIgICAgPGludCBpZD0nMScvPiIgKwotICAgICAgICAgICAgIiAgICA8c3RyaW5nIGlkPScxJy8+IiArCi0gICAgICAgICAgICAiPC9yb290PiIsCi0KLSAgICAgICAgICAgICI8eHl6OnJvb3QgeG1sbnM6eHl6PSdodHRwOi8vd3d3LnRpbS1oYW5zb24uY29tLyc+IiArCi0gICAgICAgICAgICAiICA8eHl6OmZvbyB4eXo6aWQ9JzEnLz4iICsKLSAgICAgICAgICAgICIgIDx4eXo6Zm9vIHh5ejppZD0nMicvPiIgKwotICAgICAgICAgICAgIiAgPHh5ejpmb28geHl6OmlkPSczJy8+IiArCi0gICAgICAgICAgICAiPC94eXo6cm9vdD4iLAotCi0gICAgICAgICAgICAiPGlkdGVzdD4iICsKLSAgICAgICAgICAgICIgIDxpZHJlZj54eXo8L2lkcmVmPiIgKwotICAgICAgICAgICAgIiAgPGlkcmVmcz5hYmMgZGVmPC9pZHJlZnM+IiArCi0gICAgICAgICAgICAiICA8aWQ+YWJjPC9pZD4iICsKLSAgICAgICAgICAgICIgIDxpZD5kZWY8L2lkPiIgKwotICAgICAgICAgICAgIiAgPGlkPnh5ejwvaWQ+IiArCi0gICAgICAgICAgICAiICA8aWRyZWY+YWJjPC9pZHJlZj4iICsKLSAgICAgICAgICAgICIgIDxpZHJlZnM+eHl6IGFiYzwvaWRyZWZzPiIgKwotICAgICAgICAgICAgIjwvaWR0ZXN0PiIsCi0gICAgICAgIH07Ci0KLSAgICAgICAgU3RyaW5nW10gaW52YWxpZCA9IHsKLSAgICAgICAgICAgICI8b3JkZXI+IiArCi0gICAgICAgICAgICAiICAgIDxpdGVtcz4iICsKLSAgICAgICAgICAgICIgICAgICA8aXRlbSBudW1iZXI9JzEyNSAnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICA8cXVhbnRpdHk+MTwvcXVhbnRpdHk+IiArCi0gICAgICAgICAgICAiICAgICAgPC9pdGVtPiIgKwotICAgICAgICAgICAgIiAgICAgIDxpdGVtIG51bWJlcj0nNTYzJz4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgPHF1YW50aXR5PjE8L3F1YW50aXR5PiIgKwotICAgICAgICAgICAgIiAgICAgIDwvaXRlbT4iICsKLSAgICAgICAgICAgICIgICAgPC9pdGVtcz4iICsKLSAgICAgICAgICAgICIgICAgPHByb2R1Y3RzPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHByb2R1Y3Q+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPG51bWJlcj4gMTI0PC9udW1iZXI+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPG5hbWU+U2hpcnQ8L25hbWU+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHByaWNlIGN1cnJlbmN5PSdVU0QnPjI5Ljk5PC9wcmljZT4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwvcHJvZHVjdD4iICsKLSAgICAgICAgICAgICIgICAgICAgIDxwcm9kdWN0PiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxudW1iZXI+NTYzPC9udW1iZXI+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPG5hbWU+SGF0PC9uYW1lPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxwcmljZSBjdXJyZW5jeT0nVVNEJz42OS45OTwvcHJpY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICA8L3Byb2R1Y3Q+IiArCi0gICAgICAgICAgICAiICAgICAgICA8cHJvZHVjdD4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8bnVtYmVyPjQ0MzwvbnVtYmVyPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxuYW1lPlVtYnJlbGxhPC9uYW1lPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDxwcmljZSBjdXJyZW5jeT0nVVNEJz40OS45OTwvcHJpY2U+IiArCi0gICAgICAgICAgICAiICAgICAgICA8L3Byb2R1Y3Q+IiArCi0gICAgICAgICAgICAiICAgIDwvcHJvZHVjdHM+IiArCi0gICAgICAgICAgICAiPC9vcmRlcj4iLAotCi0gICAgICAgICAgICAiPHJvb3Q+IiArCi0gICAgICAgICAgICAiICAgIDx0b2tlbiB0b2tlbj0nICBibGFoICBibGFoJy8+IiArCi0gICAgICAgICAgICAiICAgIDxzdHJpbmcgaWQ9J2JsYWggYmxhaCcvPiIgKwotICAgICAgICAgICAgIjwvcm9vdD4iLAotCi0gICAgICAgICAgICAiPHJvb3Q+IiArCi0gICAgICAgICAgICAiICAgIDxzdHJpbmcgaWQ9J2ZvbzEnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHN0cmluZyBpZD0nZm9vMic+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgPHN0cmluZyBpZD0nZm9vMyc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgIDxzdHJpbmcgaWQ9J2ZvbzYnPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgPHN0cmluZyBpZD0nZm9vNyc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmluZyBpZD0nZm9vMycvPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgPC9zdHJpbmc+IiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgIDwvc3RyaW5nPiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIDwvc3RyaW5nPiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC9zdHJpbmc+IiArCi0gICAgICAgICAgICAiICAgIDwvc3RyaW5nPiIgKwotICAgICAgICAgICAgIjwvcm9vdD4iLAotCi0gICAgICAgICAgICAiPHh5ejpyb290IHhtbG5zOnh5ej0naHR0cDovL3d3dy50aW0taGFuc29uLmNvbS8nPiIgKwotICAgICAgICAgICAgIiAgPHh5ejpmb28geHl6OmlkPScxJy8+IiArCi0gICAgICAgICAgICAiICA8eHl6OmZvbyB4eXo6aWQ9JzInLz4iICsKLSAgICAgICAgICAgICIgIDx4eXo6Zm9vIHh5ejppZD0nMicvPiIgKwotICAgICAgICAgICAgIjwveHl6OnJvb3Q+IiwKLSAgICAgICAgfTsKLQotICAgICAgICBTdHJpbmdbXSBpbnZhbGlkT25Eb2NPbmx5ID0gbmV3IFN0cmluZ1tdCi0gICAgICAgIHsKLQotICAgICAgICAgICAgIjxpZHRlc3Q+IiArCi0gICAgICAgICAgICAiICA8aWRyZWY+Zm9vPC9pZHJlZj4iICsKLSAgICAgICAgICAgICIgIDxpZD5hYmM8L2lkPiIgKwotICAgICAgICAgICAgIiAgPGlkPmRlZjwvaWQ+IiArCi0gICAgICAgICAgICAiICA8aWQ+eHl6PC9pZD4iICsKLSAgICAgICAgICAgICI8L2lkdGVzdD4iLAotCi0gICAgICAgICAgICAiPGlkdGVzdD4iICsKLSAgICAgICAgICAgICIgIDxpZHJlZnM+YWJjIGZvbzwvaWRyZWZzPiIgKwotICAgICAgICAgICAgIiAgPGlkPmFiYzwvaWQ+IiArCi0gICAgICAgICAgICAiICA8aWQ+ZGVmPC9pZD4iICsKLSAgICAgICAgICAgICIgIDxpZD54eXo8L2lkPiIgKwotICAgICAgICAgICAgIjwvaWR0ZXN0PiIsCi0gICAgICAgIH07Ci0KLQotICAgICAgICBkb1Rlc3Qoc2NoZW1hcywgbnVsbCwgdmFsaWQsIGludmFsaWQsIHRydWUpOwotICAgICAgICBkb1Rlc3Qoc2NoZW1hcywgbnVsbCwgdmFsaWQsIGludmFsaWQsIGZhbHNlKTsKLQotICAgICAgICAgLy8gSURSZWZzIGFyZSB2YWxpZGF0ZWQgb25seSBpZiBzdGFydGluZyBhdCB0aGUgdmVyeSByb290IG9mIHRoZSB3b3JsZAotICAgICAgICBkb1Rlc3Qoc2NoZW1hcywgbnVsbCwgbmV3IFN0cmluZ1swXSwgaW52YWxpZE9uRG9jT25seSwgdHJ1ZSk7Ci0gICAgICAgIGRvVGVzdChzY2hlbWFzLCBudWxsLCBpbnZhbGlkT25Eb2NPbmx5LCBuZXcgU3RyaW5nWzBdLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLy8gVGVzdCB2YWxpZGF0aW9uIG9mIHNldHRpbmcgd2l0aCB0aGUgVmFsaWRhdGVPblNldCBvcHRpb24KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGUxMCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc2NoZW1hID0KLSAgICAgICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+XG4iICsKLSAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2RlYy1yZXN0cmljdGlvbic+IiArCi0gICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkZWNpbWFsJz4iICsKLSAgICAgICAgICAgICIgICAgICA8eHM6bWF4RXhjbHVzaXZlIHZhbHVlPScxMDAnLz4iICsKLSAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj4iICsKLSAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT4iICsKLSAgICAgICAgICAgICI8L3hzOnNjaGVtYT4iICsKLSAgICAgICAgICAgICIiOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gc2NoZW1hcyA9IHsgc2NoZW1hIH07Ci0gICAgICAgIAotICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIHN0bCA9IG1ha2VTY2hlbWFUeXBlTG9hZGVyKCBzY2hlbWFzICk7Ci0KLSAgICAgICAgWG1sT3B0aW9ucyB2YWxpZGF0ZSA9IG5ldyBYbWxPcHRpb25zKCkuc2V0VmFsaWRhdGVPblNldCgpOwotICAgICAgICBYbWxPcHRpb25zIG5vVmFsaWRhdGUgPSBuZXcgWG1sT3B0aW9ucygpOwotCi0gICAgICAgIFNjaGVtYVR5cGUgc3QgPSBzdGwuZmluZFR5cGUobmV3IFFOYW1lKCIiLCAiZGVjLXJlc3RyaWN0aW9uIikpOwotCi0gICAgICAgIFhtbERlY2ltYWwgZGVjID0gKFhtbERlY2ltYWwpc3RsLm5ld0luc3RhbmNlKHN0LCB2YWxpZGF0ZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRlYy5zZXQoIjIwMCIpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKSB7fQotCi0gICAgICAgIGRlYyA9IChYbWxEZWNpbWFsKXN0bC5uZXdJbnN0YW5jZShzdCwgbm9WYWxpZGF0ZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRlYy5zZXQoIjIwMCIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24iKTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9lYXN5cG8vZWFzeXBvLnhzZCBiL3YxL3Rlc3Qvc3JjL2Vhc3lwby9lYXN5cG8ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjljNjhjLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2Vhc3lwby9lYXN5cG8ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPHhzOnNjaGVtYQotICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgeG1sbnM6cG89Imh0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8iCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8iCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0icHVyY2hhc2Utb3JkZXIiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY3VzdG9tZXIiIHR5cGU9InBvOmN1c3RvbWVyIi8+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9ImRhdGUiIHR5cGU9InhzOmRhdGVUaW1lIi8+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9ImxpbmUtaXRlbSIgdHlwZT0icG86bGluZS1pdGVtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9InNoaXBwZXIiIHR5cGU9InBvOnNoaXBwZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9tZXIiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFnZSIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtb28iIHR5cGU9InhzOmludCIgZGVmYXVsdD0iMTAwIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwb28iIHR5cGU9InhzOmludCIgZml4ZWQ9IjIwMCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJsaW5lLWl0ZW0iPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InBlci11bml0LW91bmNlcyIgdHlwZT0ieHM6ZGVjaW1hbCIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icHJpY2UiIHR5cGU9InhzOmRlY2ltYWwiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InF1YW50aXR5IiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ic2hpcHBlciI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwZXItb3VuY2UtcmF0ZSIgdHlwZT0ieHM6ZGVjaW1hbCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZWFzeXBvL2Vhc3lwby54c2Rjb25maWcgYi92MS90ZXN0L3NyYy9lYXN5cG8vZWFzeXBvLnhzZGNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkYjY4NS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9lYXN5cG8vZWFzeXBvLnhzZGNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTx4Yjpjb25maWcgeG1sbnM6eGI9Imh0dHA6Ly93d3cuYmVhLmNvbS8yMDAyLzA5L3hiZWFuL2NvbmZpZyIKLSAgICAgICAgICAgeG1sbnM6ZXA9Imh0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8iPgotCi0gIDx4YjpuYW1lc3BhY2UgdXJpPSJodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvIj4KLSAgICA8eGI6cGFja2FnZT5jb20uZWFzeXBvPC94YjpwYWNrYWdlPgotICA8L3hiOm5hbWVzcGFjZT4KLQotICA8eGI6bmFtZXNwYWNlIHVyaT0iIyNhbnkiPgotICAgIDx4YjpwcmVmaXg+WG1sPC94YjpwcmVmaXg+Ci0gICAgPHhiOnN1ZmZpeD5CZWFuPC94YjpzdWZmaXg+Ci0gIDwveGI6bmFtZXNwYWNlPgotCi08L3hiOmNvbmZpZz4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2Vhc3lwb3VzZS9jb20vYmVhL3Rlc3QvTG9hZEFuZFVzZVBvLmphdmEgYi92MS90ZXN0L3NyYy9lYXN5cG91c2UvY29tL2JlYS90ZXN0L0xvYWRBbmRVc2VQby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGU0ODFkLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2Vhc3lwb3VzZS9jb20vYmVhL3Rlc3QvTG9hZEFuZFVzZVBvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBjb20uYmVhLnRlc3Q7Ci0KLWltcG9ydCB4bWwudXRpbC4qOwotaW1wb3J0IG9yZy5vcGVudXJpLmVhc3lwby4qOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgTG9hZEFuZFVzZVBvCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGluZyBmaWxlICIgKyBhcmdzW2ldKTsKLSAgICAgICAgICAgIHN1bW1hcml6ZVBvRG9jdW1lbnQoUHVyY2hhc2VPcmRlckRvY3VtZW50LkZhY3RvcnkucGFyc2UobmV3IEZpbGUoYXJnc1tpXSkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdW1tYXJpemVQb0RvY3VtZW50KFB1cmNoYXNlT3JkZXJEb2N1bWVudCBkb2MpCi0gICAgewotICAgICAgICBQdXJjaGFzZU9yZGVyIG9yZGVyID0gZG9jLmdldFB1cmNoYXNlT3JkZXIoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDdXN0b21lcjogIiArIG9yZGVyLmdldEN1c3RvbWVyKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBZGRyZXNzOiAgIiArIG9yZGVyLmdldEN1c3RvbWVyKCkuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgTGluZUl0ZW1bXSBpdGVtID0gb3JkZXIuZ2V0TGluZUl0ZW0oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSXRlbSBkZXNjcmlwdGlvbjogIiArIGl0ZW1baV0uZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgUHJpY2U6ICIgKyBpdGVtW2ldLmdldFByaWNlKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIFF1YW50aXR5OiAiICsgaXRlbVtpXS5nZXRRdWFudGl0eSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBPdW5jZXM6ICIgKyBpdGVtW2ldLmdldFBlclVuaXRPdW5jZXMoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIEFtb3VudDogIiArIGl0ZW1baV0uZ2V0QW1vdW50KCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIFdlaWdodDogIiArIGl0ZW1baV0uZ2V0TGluZUl0ZW1PdW5jZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIGlmIChvcmRlci5pc1NldFNoaXBwZXIoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTaGlwcGVyOiAiICsgb3JkZXIuZ2V0U2hpcHBlcigpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgUGVyLW91bmNlIHJhdGU6ICIgKyBvcmRlci5nZXRTaGlwcGVyKCkuZ2V0UGVyT3VuY2VSYXRlKCkpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIHdlaWdodCBpbiBvdW5jZXM6ICIgKyBvcmRlci5nZXRUb3RhbE91bmNlcygpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTaGlwcGluZyBhbW91bnQ6ICIgKyBvcmRlci5nZXRTaGlwcGluZ0Ftb3VudCgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbCBhbW91bnQ6ICIgKyBvcmRlci5nZXRUb3RhbEFtb3VudCgpKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZW51bXRlc3QvZW51bXRlc3QueHNkIGIvdjEvdGVzdC9zcmMvZW51bXRlc3QvZW51bXRlc3QueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmExOTkxLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL2VudW10ZXN0L2VudW10ZXN0LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIHhtbG5zOmV0PSJodHRwOi8vb3BlbnVyaS5vcmcvZW51bXRlc3QiCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy9lbnVtdGVzdCIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJxdWFudGl0eSI+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwiLz4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibW9zdCIvPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzb21lIi8+Ci0gICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZldyIvPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImFsbE9yTm9uZSI+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9ImV0OnF1YW50aXR5Ij4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsIi8+Ci0gICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGEiPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJldDpxdWFudGl0eSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJldDphbGxPck5vbmUiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJzdGF0dXNyZXBvcnQiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic3RhdHVzIiB0eXBlPSJldDpkYXRhIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLSAKLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZXJpY3NjaGVtYS9lcmljc2NoZW1hLnhzZCBiL3YxL3Rlc3Qvc3JjL2VyaWNzY2hlbWEvZXJpY3NjaGVtYS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNjJkZGYuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZXJpY3NjaGVtYS9lcmljc2NoZW1hLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQk8eHM6ZWxlbWVudCBuYW1lPSJhc2Rhc2QiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZXJpY3Rlc3QvRXJpY1Rlc3QuamF2YSBiL3YxL3Rlc3Qvc3JjL2VyaWN0ZXN0L0VyaWNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YzI4NDkuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvZXJpY3Rlc3QvRXJpY1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5Db2RlR2VuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5TY2hlbWFDb21waWxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yLlRva2VuVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5YbWxCb29rbWFyazsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEb2N1bWVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxMaW5lTnVtYmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLWltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MRXZlbnQ7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTE5hbWU7Ci1pbXBvcnQgY29tLmJlYS54MjAwMi54MDkueGJlYW4uY29uZmlnLkNvbmZpZ0RvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgRXJpY1Rlc3QKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBIYXNoTWFwIG5zZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBuc2VzLnB1dCggIngiLCAieC5jb20iICk7Ci0gICAgICAgIG5zZXMucHV0KCAieSIsICJ5LmNvbSIgKTsKLSAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRMb2FkQWRkaXRpb25hbE5hbWVzcGFjZXMoIG5zZXMgKTsKLSAgICAgICAgCi0gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YT48L2E+Iiwgb3B0aW9ucyApOwotICAgICAgICB4LnNhdmUoIFN5c3RlbS5vdXQgKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL25hbWV3b3JsZHVzZS9jb20vYmVhL3Rlc3QvRHVtcE5hbWV3b3JsZC5qYXZhIGIvdjEvdGVzdC9zcmMvbmFtZXdvcmxkdXNlL2NvbS9iZWEvdGVzdC9EdW1wTmFtZXdvcmxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NTg4MDEuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvbmFtZXdvcmxkdXNlL2NvbS9iZWEvdGVzdC9EdW1wTmFtZXdvcmxkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIGNvbS5iZWEudGVzdDsKLQotaW1wb3J0IG9yZy5vcGVudXJpLm5hbWV3b3JsZC4qOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLQotcHVibGljIGNsYXNzIER1bXBOYW1ld29ybGQKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2FkaW5nIGZpbGUgIiArIGFyZ3NbaV0pOwotICAgICAgICAgICAgZHVtcERvY3VtZW50KE5hbWV3b3JsZERvY3VtZW50LkZhY3RvcnkucGFyc2UobmV3IEZpbGUoYXJnc1tpXSkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wRG9jdW1lbnQoTmFtZXdvcmxkRG9jdW1lbnQgZG9jKQotICAgIHsKLSAgICAgICAgTmFtZXdvcmxkIHdvcmxkID0gZG9jLmdldE5hbWV3b3JsZCgpOwotICAgICAgICBOYW1ld29ybGQuSXNsYW5kW10gaXNsYW5kcyA9IHdvcmxkLmdldElzbGFuZCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlzbGFuZHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJc2xhbmQgdGFyZ2V0IG5hbWVzcGFjZTogIiArIGlzbGFuZHNbaV0uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgTG9jW10gbG9jcyA9IGlzbGFuZHNbaV0uZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbG9jcy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgTG9jYXRpb246ICIgKyBsb2NzW2pdLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgTG9jLlJlZmVyZW5jZVtdIHJlZnMgPSBsb2NzW2pdLmdldFJlZmVyZW5jZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcmVmcy5sZW5ndGg7IGsrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBSZWZlcmVuY2U6ICIgKyByZWZzW2tdLmdldFRvKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9yYW5kb20vUmFuZG9tLmphdmEgYi92MS90ZXN0L3NyYy9yYW5kb20vUmFuZG9tLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MGZkMzAuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvcmFuZG9tL1JhbmRvbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTA1ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuQ29tbWFuZExpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxWYWx1ZURpc2Nvbm5lY3RlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuQ3Vyc29yOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBjb20uZWFzeXBvLlhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4uUHVyY2hhc2VPcmRlcjsKLWltcG9ydCBjb20uZWFzeXBvLlhtbEN1c3RvbWVyQmVhbjsKLWltcG9ydCBjb20uZWFzeXBvLlhtbExpbmVJdGVtQmVhbjsKLWltcG9ydCBjb20uZWFzeXBvLlhtbFNoaXBwZXJCZWFuOwotCi1wdWJsaWMgY2xhc3MgUmFuZG9tIGltcGxlbWVudHMgUnVubmFibGUKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb21tYW5kTGluZSBjbCA9IG5ldyBDb21tYW5kTGluZShhcmdzLCBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJzZWVkIiwgImkiLCAidCIsICJkb2NzIiwgIj8iLCAiaGVscCIgfSkpOwotICAgICAgICBsb25nIHNlZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgaW50IHRocmVhZHMgPSAxOwotICAgICAgICBpbnQgZG9jcyA9IDEwOwotICAgICAgICAKLSAgICAgICAgaWYgKGNsLmdldE9wdCgiPyIpICE9IG51bGwgfHwgY2wuZ2V0T3B0KCJoZWxwIikgIT0gbnVsbCB8fCBjbC5hcmdzKCkubGVuZ3RoICE9IDApCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiByYW5kb20gWy1zZWVkICNdIFstaSBpdGVyYXRpb25zXSBbLXQgdGhyZWFkc10gWy1kb2NzIGRvY3NdIFstcmVhZG9ubHldIFstbm9zYXZlXSIpOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gcmVhZG9ubHkgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gbm9zYXZlID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIG5vcXVlcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNsLmdldE9wdCgic2VlZCIpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2VlZCA9IExvbmcucGFyc2VMb25nKGNsLmdldE9wdCgic2VlZCIpKTsKLSAgICAgICAgICAgIGlmIChjbC5nZXRPcHQoImkiKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGl0ZXJhdGlvbnMgPSBJbnRlZ2VyLnBhcnNlSW50KGNsLmdldE9wdCgiaSIpKTsKLSAgICAgICAgICAgIGlmIChjbC5nZXRPcHQoInQiKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRocmVhZHMgPSBJbnRlZ2VyLnBhcnNlSW50KGNsLmdldE9wdCgidCIpKTsKLSAgICAgICAgICAgIGlmIChjbC5nZXRPcHQoImRvY3MiKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGRvY3MgPSBJbnRlZ2VyLnBhcnNlSW50KGNsLmdldE9wdCgiZG9jcyIpKTsKLSAgICAgICAgICAgIG5vcXVlcnkgPSAoY2wuZ2V0T3B0KCJub3F1ZXJ5IikgIT0gbnVsbCk7Ci0gICAgICAgICAgICByZWFkb25seSA9IChjbC5nZXRPcHQoInJlYWRvbmx5IikgIT0gbnVsbCk7Ci0gICAgICAgICAgICBub3NhdmUgPSAoY2wuZ2V0T3B0KCJub3NhdmUiKSAhPSBudWxsKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2VlZD0iICsgc2VlZCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIml0ZXJhdGlvbnM9IiArIGl0ZXJhdGlvbnMgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGhyZWFkcz0iICsgdGhyZWFkcyk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRvY3M9IiArIGRvY3MgKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZWFkb25seSA/ICJyZWFkb25seSIgOiAicmVhZC93cml0ZSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5vc2F2ZSA/ICJub3NhdmUiIDogIndpdGggc2F2ZSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5vcXVlcnkgPyAibm9xdWVyeSIgOiAid2l0aCBxdWVyeSIpOwotICAgICAgICAgICAgZG9UZXN0cyhzZWVkLCBpdGVyYXRpb25zLCB0aHJlYWRzLCBkb2NzLCByZWFkb25seSwgbm9zYXZlLCBub3F1ZXJ5KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRvVGVzdHMobG9uZyBzZWVkLCBpbnQgaXRlcmF0aW9ucywgaW50IHRocmVhZENvdW50LCBpbnQgZG9jQ291bnQsIGJvb2xlYW4gcmVhZG9ubHksIGJvb2xlYW4gbm9zYXZlLCBib29sZWFuIG5vcXVlcnkpCi0gICAgewotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIAotICAgICAgICBYbWxPYmplY3RbXSBzaGFyZWREb2NzID0gbmV3IFhtbE9iamVjdCBbZG9jQ291bnRdOwotICAgICAgICBUaHJlYWRbXSB0aHJlYWRzID0gbmV3IFRocmVhZFt0aHJlYWRDb3VudF07Ci0gICAgICAgIAotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgaXRlcmF0aW9ucyA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGhyZWFkQ291bnQ7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSYW5kb20gcnVubmFibGUgPSBuZXcgUmFuZG9tKHNlZWQsIHNoYXJlZERvY3MsIHJlYWRvbmx5LCBub3NhdmUsIG5vcXVlcnksIHRocmVhZENvdW50ID4gMSk7Ci0gICAgICAgICAgICAgICAgdGhyZWFkc1tqXSA9IG5ldyBUaHJlYWQocnVubmFibGUpOwotICAgICAgICAgICAgICAgIHRocmVhZHNbal0uc3RhcnQoKTsKLSAgICAgICAgICAgICAgICBzZWVkKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRocmVhZENvdW50OyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJlYWRzW2pdLmpvaW4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlRocmVhZCBpbnRlcnJ1cHRlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCk7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigKLSAgICAgICAgICAgICJTZWNvbmRzIHRvIHJ1biByYW5kb20gdGVzdHM6ICIgKyAoZW5kIC0gc3RhcnQpIC8gMTAwMCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludCggIlxyU2VlZDogIiArIF9zZWVkICk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggaW50IGQgPSAwIDsgZCA8IF9kb2NzLmxlbmd0aCA7IGQrKyApCi0gICAgICAgICAgICAgICAgX2RvY3NbIGQgXSA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgCi0gICAgICAgICAgICBfY3Vyc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAKLSAgICAgICAgICAgIGludCBuSXRlcmF0aW9ucyA9IHJuZCggNjAwMDAgKSArIDUwMDA7Ci0gICAgCi0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbkl0ZXJhdGlvbnMgOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gZ29vZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2l0ZXIrKzsKLSAgICAgICAgICAgICAgICAgICAgaXRlcmF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBnb29kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFnb29kKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIkVycm9yIG9uIGl0ZXJhdGlvbiAiICsgX2l0ZXIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggVGhyb3dhYmxlIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJFcnJvciBvbiBzZWVkICIgKyBfc2VlZCApOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoIFN5c3RlbS5lcnIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgamF2YS51dGlsLlJhbmRvbSBfcm5kOwotICAgIAotICAgIHByaXZhdGUgWG1sT2JqZWN0W10gX2RvY3M7IC8vIHNoYXJlZCBhbW9uZyB0aHJlYWRzISEKLSAgICBwcml2YXRlIEFycmF5TGlzdCAgIF9jdXJzb3JzOwotICAgIHByaXZhdGUgbG9uZyAgICAgICAgX3NlZWQ7Ci0gICAgcHJpdmF0ZSBpbnQgICAgICAgICBfaXRlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gICAgIF9yZWFkb25seTsKLSAgICBwcml2YXRlIGJvb2xlYW4gICAgIF9ub3NhdmU7Ci0gICAgcHJpdmF0ZSBib29sZWFuICAgICBfbm9xdWVyeTsKLSAgICBwcml2YXRlIGJvb2xlYW4gICAgIF9pbnRlcmZlcmVuY2U7Ci0KLQotICAgIHByaXZhdGUgaW50IHJuZCAoIGludCBuICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcm5kLm5leHRJbnQoIG4gKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgcm5kICggaW50IG1pbiwgaW50IG1heFBsdXNPbmUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9ybmQubmV4dEludChtYXhQbHVzT25lIC0gbWluKSArIG1pbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFhtbEN1cnNvciBnZXRDdXJzb3IgKCApCi0gICAgewotICAgICAgICBpbnQgbiA9IF9jdXJzb3JzLnNpemUoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChuID09IDAgfHwgKG4gPCBfZG9jcy5sZW5ndGggKiAzKSAmJiBybmQoIDQgKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxDdXJzb3IgYyA9IF9kb2NzWyBybmQoIF9kb2NzLmxlbmd0aCApIF0ubmV3Q3Vyc29yKCk7Ci0gICAgICAgICAgICBfY3Vyc29ycy5hZGQoIGMgKTsKLSAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChYbWxDdXJzb3IpIF9jdXJzb3JzLmdldCggcm5kKCBuICkgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaXRlcmF0ZSAoICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoIHJuZCAoIDYgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlICAwIDogaW50ZXJhdGVIaWdoKCk7ICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICAxIDogaW50ZXJhdGVIaWdoKCk7ICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICAyIDogaW50ZXJhdGVIaWdoKCk7ICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICAzIDogaW50ZXJhdGVNZWRpdW0oKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICA0IDogaW50ZXJhdGVNZWRpdW0oKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICA1IDogaW50ZXJhdGVMb3coKTsgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIV9pbnRlcmZlcmVuY2UpCi0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghX2ludGVyZmVyZW5jZSkKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYbWxWYWx1ZURpc2Nvbm5lY3RlZEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbnRlcmF0ZUhpZ2ggKCApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoIHJuZCAoIDIgKSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAgMCA6IG1vdmVDdXJzb3JSaWdodE9uZVRva2VuKCk7IGJyZWFrOwotICAgICAgICBjYXNlICAxIDogbW92ZUN1cnNvckxlZnRPbmVUb2tlbigpOyAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGludGVyYXRlTWVkaXVtICggKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzd2l0Y2ggKCBfcmVhZG9ubHkgPyBybmQgKCA0ICkgOiBybmQgKDI0KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgIDAgOiBnZXRDaGFycygpOyAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDEgOiBnZXRUZXh0VmFsdWUoKTsgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDIgOiBjb21wYXJlVmFsdWUoKTsgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDMgOiBwcmV2VG9rZW5UeXBlKCk7ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgIDQgOiBpbnNlcnRUZXh0KCk7ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDUgOiBtb3ZlQ2hhcnNSaWdodCgpOyAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDYgOiBtb3ZlQ2hhcnNMZWZ0KCk7ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDcgOiBpbnNlcnRFbGVtKCk7ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDggOiBpbnNlcnRBdHRyKCk7ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDkgOiByZW1vdmVYbWwoKTsgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTAgOiByZW1vdmVYbWxDb250ZW50cygpOyAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTEgOiBjb3B5WG1sKCk7ICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTIgOiBjb3B5WG1sQ29udGVudHMoKTsgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTMgOiBtb3ZlWG1sKCk7ICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTQgOiBtb3ZlWG1sQ29udGVudHMoKTsgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTUgOiByZW1vdmVUZXh0KCk7ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTYgOiBtb3ZlVGV4dCgpOyAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTcgOiBjb3B5VGV4dCgpOyAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTggOiBpbnNlcnRDb21tZW50KCk7ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTkgOiBpbnNlcnRQcm9jaW5zdCgpOyAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjAgOiBzZXRUZXh0VmFsdWUoKTsgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjEgOiBzZXRTdHJvbmcoKTsgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjIgOiBvYmplY3RTZXQoKTsgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjMgOiBzZXROYW1lKCk7ICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaW50ZXJhdGVMb3cgKCApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoIHJuZCAoX3JlYWRvbmx5ID8gMSA6IDAsIF9ub3NhdmUgPyA4IDogMTcpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAgMCA6IGNoYW5nZVR5cGUoKTsgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgMSA6IGNyZWF0ZUJvb2ttYXJrKCk7ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgMiA6IGNsZWFyQm9va21hcmsoKTsgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlICAzIDogbG9hZERvYygpOyAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICA0IDogbG9hZFNjaGVtYWREb2MoKTsgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICA1IDogY29tcGFyZUN1cnNvcnMoKTsgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICA2IDogZ2V0T2JqZWN0KCk7ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICA3IDogbmV3Q3Vyc29yKCk7ICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgIDggOiB2YWxpZGF0ZSgpOyAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDkgOiBleGVjUXVlcnkoKTsgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTAgOiB4bWxJbnB1dFN0cmVhbSgpOyAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTEgOiBkb2NCeXRlcygpOyAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTIgOiBjdXJzb3JCeXRlcygpOyAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTMgOiBuZXdEb21Ob2RlKCk7ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTQgOiBvYmplY3RTdHJpbmcoKTsgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTUgOiBjdXJzb3JTdHJpbmcoKTsgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTYgOiBwcmV0dHlPYmplY3QoKTsgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgWG1sT2JqZWN0IGZpbmRPYmplY3QgKCApCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgYyA9IGdldEN1cnNvcigpOwotICAgICAgICBjLnB1c2goKTsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlICggIShjLmlzQ29udGFpbmVyKCkgfHwgYy5pc0F0dHIoKSkgKQotICAgICAgICAgICAgaWYgKGMudG9OZXh0VG9rZW4oKS5pc05vbmUoKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoIWMuaXNFbmRkb2MoKSkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sT2JqZWN0IHggPSBjLmdldE9iamVjdCgpOwotICAgICAgICAgICAgYy5wb3AoKTsKLSAgICAgICAgICAgIGlmICh4ID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZ2V0T2JqZWN0IHJldHVybmVkIG51bGwgLSBjb250ZW50IG11c3QgaGF2ZSBjaGFuZ2VkIik7Ci0gICAgICAgICAgICByZXR1cm4geDsKLSAgICAgICAgfQotCi0gICAgICAgIGMucG9wKCk7Ci0gICAgICAgIGMucHVzaCgpOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKCAhKGMuaXNDb250YWluZXIoKSB8fCBjLmlzQXR0cigpKSApCi0gICAgICAgICAgICBpZiAoYy50b1ByZXZUb2tlbigpLmlzTm9uZSgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIFhtbE9iamVjdCB4ID0gYy5nZXRPYmplY3QoKTsKLSAgICAgICAgYy5wb3AoKTsKLSAgICAgICAgaWYgKHggPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImdldE9iamVjdCByZXR1cm5lZCBudWxsIC0gY29udGVudCBtdXN0IGhhdmUgY2hhbmdlZCIpOwotICAgICAgICByZXR1cm4geDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJldHR5T2JqZWN0ICggKQotICAgIHsKLSAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRTYXZlUHJldHR5UHJpbnQoKTsKLSAgICAgICAgZmluZE9iamVjdCgpLnhtbFRleHQoIG9wdGlvbnMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIG9iamVjdFN0cmluZyAoICkKLSAgICB7Ci0gICAgICAgIGZpbmRPYmplY3QoKS50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY3Vyc29yU3RyaW5nICggKQotICAgIHsKLSAgICAgICAgZ2V0Q3Vyc29yKCkudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNoYW5nZVR5cGUgKCApCi0gICAgewotICAgICAgICBYbWxPYmplY3QgbywgbjsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBvID0gZmluZE9iamVjdCgpOwotICAgICAgICAgICAgU2NoZW1hVHlwZSB0eXBlID0gZmluZE9iamVjdCgpLnNjaGVtYVR5cGUoKTsKLSAgICAgICAgICAgIG4gPSBvLmNoYW5nZVR5cGUoIHR5cGUgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgX2RvY3MubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG8gPT0gX2RvY3NbIGkgXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfZG9jc1sgaSBdID0gbjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcHJldlRva2VuVHlwZSAoICkKLSAgICB7Ci0gICAgICAgIGdldEN1cnNvcigpLnByZXZUb2tlblR5cGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIG5ld0N1cnNvciAoICkKLSAgICB7Ci0gICAgICAgIGZpbmRPYmplY3QoKS5uZXdDdXJzb3IoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHNldE5hbWUgKCApCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgYyA9IGZpbmRPYmplY3QoKS5uZXdDdXJzb3IoKTsKLQotICAgICAgICBpZiAoIWMuaXNTdGFydGRvYygpKQotICAgICAgICAgICAgYy5zZXROYW1lKCBnZXRRTmFtZSgpICk7Ci0KLSAgICAgICAgYy5kaXNwb3NlKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBuZXdEb21Ob2RlICggKQotICAgIHsKLSAgICAgICAgaWYgKHJuZCggNSApICE9IDApCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Q3Vyc29yKCkubmV3RG9tTm9kZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgeG1sSW5wdXRTdHJlYW0gKCApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChybmQoIDUgKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgWE1MSW5wdXRTdHJlYW0geGlzOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHhpcyA9IGdldEN1cnNvcigpLm5ld1hNTElucHV0U3RyZWFtKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICggeGlzLm5leHQoKSAhPSBudWxsICkKLSAgICAgICAgICAgIDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb2JqZWN0U2V0ICggKQotICAgIHsKLSAgICAgICAgZmluZE9iamVjdCgpLnNldCggZmluZE9iamVjdCgpICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBzZXRTdHJvbmcgKCApCi0gICAgewotICAgICAgICBYbWxPYmplY3QgeCA9IGZpbmRPYmplY3QoKTsKLQotICAgICAgICBpZiAoeCBpbnN0YW5jZW9mIFB1cmNoYXNlT3JkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFB1cmNoYXNlT3JkZXIgbyA9IChQdXJjaGFzZU9yZGVyKSB4OwotICAgICAgICAgICAgby5zZXREYXRlKCBDYWxlbmRhci5nZXRJbnN0YW5jZSgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoeCBpbnN0YW5jZW9mIFhtbEN1c3RvbWVyQmVhbikKLSAgICAgICAgewotICAgICAgICAgICAgWG1sQ3VzdG9tZXJCZWFuIG8gPSAoWG1sQ3VzdG9tZXJCZWFuKSB4OwotICAgICAgICAgICAgby5zZXROYW1lKCAiQm9iIiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocm5kKCAyICkgPT0gMCkKLSAgICAgICAgICAgICAgICBvLnNldEFnZSggMjMgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHJuZCggMiApID09IDApCi0gICAgICAgICAgICAgICAgby5zZXRNb28oIDI0ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChybmQoIDIgKSA9PSAwKQotICAgICAgICAgICAgICAgIG8uc2V0UG9vKCAyMDAgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh4IGluc3RhbmNlb2YgWG1sTGluZUl0ZW1CZWFuKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxMaW5lSXRlbUJlYW4gbyA9IChYbWxMaW5lSXRlbUJlYW4pIHg7Ci0gICAgICAgICAgICBvLnNldFBlclVuaXRPdW5jZXMoIG5ldyBCaWdEZWNpbWFsKCAxMjIuNDQgKSApOwotICAgICAgICAgICAgby5zZXRQcmljZSggbmV3IEJpZ0RlY2ltYWwoIDU1NS4zMyApICk7Ci0gICAgICAgICAgICBvLnNldFF1YW50aXR5KCBCaWdJbnRlZ2VyLnZhbHVlT2YoIDExMSApICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoeCBpbnN0YW5jZW9mIFhtbFNoaXBwZXJCZWFuKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxTaGlwcGVyQmVhbiBvID0gKFhtbFNoaXBwZXJCZWFuKSB4OwotICAgICAgICAgICAgby5zZXRQZXJPdW5jZVJhdGUoIG5ldyBCaWdEZWNpbWFsKCAzLjE0MTU5ICkgKTsKLSAgICAgICAgICAgIG8uc2V0TmFtZSggIkVyaWMiICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29tcGFyZVZhbHVlICggKQotICAgIHsKLSAgICAgICAgZmluZE9iamVjdCgpLmNvbXBhcmVWYWx1ZSggZmluZE9iamVjdCgpICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSAoICkKLSAgICB7Ci0gICAgICAgIGZpbmRPYmplY3QoKS52YWxpZGF0ZSgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZXhlY1F1ZXJ5ICggKQotICAgIHsKLSAgICAgICAgaWYgKF9ub3F1ZXJ5KQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgaWYgKHJuZCggMjAgKSA+IDApCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBRTmFtZSBuYW1lID0gZ2V0UU5hbWUoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBxdWVyeSA9Ci0gICAgICAgICAgICAiZGVjbGFyZSBuYW1lc3BhY2UgeHh4PSciICsgbmFtZS5nZXROYW1lc3BhY2VVUkkoKSArICInICIgKwotICAgICAgICAgICAgICAgICIuLy94eHg6IiArIG5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIAotICAgICAgICBYbWxPYmplY3QgeCA9IGdldEN1cnNvcigpLmV4ZWNRdWVyeSggcXVlcnkgKS5nZXRPYmplY3QoKTsKLQotICAgICAgICBpZiAocm5kKCAzICkgPT0gMCkKLSAgICAgICAgICAgIF9kb2NzWyBybmQoIF9kb2NzLmxlbmd0aCApIF0gPSB4OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBnZXRPYmplY3QgKCApCi0gICAgewotICAgICAgICBnZXRDdXJzb3IoKS5nZXRPYmplY3QoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGdldENoYXJzICggKQotICAgIHsKLSAgICAgICAgZ2V0Q3Vyc29yKCkuZ2V0Q2hhcnMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29tcGFyZUN1cnNvcnMgKCApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Q3Vyc29yKCkuaXNJblNhbWVEb2N1bWVudCggZ2V0Q3Vyc29yKCkgKTsKLSAgICAgICAgICAgIGdldEN1cnNvcigpLmNvbXBhcmVQb3NpdGlvbiggZ2V0Q3Vyc29yKCkgKTsKLSAgICAgICAgICAgIGdldEN1cnNvcigpLmlzQXRTYW1lUG9zaXRpb25BcyggZ2V0Q3Vyc29yKCkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBfeG1scyA9Ci0gICAgewotICAgICAgICAiPGEvPiIsCi0gICAgfTsKLQotICAgIHByaXZhdGUgU3RyaW5nW10gX3NjaGVtYV94bWxzID0KLSAgICB7Ci0gICAgICAgICI8cG86cHVyY2hhc2Utb3JkZXIgeG1sbnM6cG89J2h0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8nPlxuIiArIAotICAgICAgICAiPHBvOmN1c3RvbWVyIGFnZT0nMzEnIHBvbz0nMjAwJz5cbiIgKyAKLSAgICAgICAgICAgICI8cG86bmFtZT5EYXZpZCBCYXU8L3BvOm5hbWU+XG4iICsgCi0gICAgICAgICAgICAiPHBvOmFkZHJlc3M+R2xhZHd5bmUsIFBBPC9wbzphZGRyZXNzPlxuIiArIAotICAgICAgICAiPC9wbzpjdXN0b21lcj5cbiIgKyAKLSAgICAgICAgIjxwbzpjdXN0b21lciBhZ2U9JzM3Jz5cbiIgKyAKLSAgICAgICAgICAgICI8cG86bmFtZT5FcmljIFZhc2lsaWs8L3BvOm5hbWU+XG4iICsgCi0gICAgICAgICAgICAiPHBvOmFkZHJlc3M+UmVkbW9uZCwgV0E8L3BvOmFkZHJlc3M+XG4iICsgCi0gICAgICAgICI8L3BvOmN1c3RvbWVyPlxuIiArIAotICAgICAgICAiPHBvOmRhdGU+MjAwMi0wOS0zMFQxNDoxNjowMC0wNTowMDwvcG86ZGF0ZT5cbiIgKyAKLSAgICAgICAgIjxwbzpsaW5lLWl0ZW0+XG4iICsgCi0gICAgICAgICAgICAiPHBvOmRlc2NyaXB0aW9uPkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAxPC9wbzpkZXNjcmlwdGlvbj5cbiIgKyAKLSAgICAgICAgICAgICI8cG86cGVyLXVuaXQtb3VuY2VzPjU8L3BvOnBlci11bml0LW91bmNlcz5cbiIgKyAKLSAgICAgICAgICAgICI8cG86cHJpY2U+MjEuNzk8L3BvOnByaWNlPlxuIiArIAotICAgICAgICAgICAgIjxwbzpxdWFudGl0eT4yPC9wbzpxdWFudGl0eT5cbiIgKyAKLSAgICAgICAgIjwvcG86bGluZS1pdGVtPlxuIiArIAotICAgICAgICAiPHBvOmxpbmUtaXRlbT5cbiIgKyAKLSAgICAgICAgICAgICI8cG86ZGVzY3JpcHRpb24+QnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDI8L3BvOmRlc2NyaXB0aW9uPlxuIiArIAotICAgICAgICAgICAgIjxwbzpwZXItdW5pdC1vdW5jZXM+NTwvcG86cGVyLXVuaXQtb3VuY2VzPlxuIiArIAotICAgICAgICAgICAgIjxwbzpwcmljZT4xOS44OTwvcG86cHJpY2U+XG4iICsgCi0gICAgICAgICAgICAiPHBvOnF1YW50aXR5PjI8L3BvOnF1YW50aXR5PlxuIiArIAotICAgICAgICAiPC9wbzpsaW5lLWl0ZW0+XG4iICsgCi0gICAgICAgICI8cG86bGluZS1pdGVtPlxuIiArIAotICAgICAgICAgICAgIjxwbzpkZXNjcmlwdGlvbj5CdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMzwvcG86ZGVzY3JpcHRpb24+XG4iICsgCi0gICAgICAgICAgICAiPHBvOnBlci11bml0LW91bmNlcz41PC9wbzpwZXItdW5pdC1vdW5jZXM+XG4iICsgCi0gICAgICAgICAgICAiPHBvOnByaWNlPjE5Ljg5PC9wbzpwcmljZT5cbiIgKyAKLSAgICAgICAgICAgICI8cG86cXVhbnRpdHk+MTwvcG86cXVhbnRpdHk+XG4iICsgCi0gICAgICAgICI8L3BvOmxpbmUtaXRlbT5cbiIgKyAKLSAgICAgICAgIjxwbzpzaGlwcGVyPlxuIiArIAotICAgICAgICAgICAgIjxwbzpuYW1lPlVQUzwvcG86bmFtZT5cbiIgKyAKLSAgICAgICAgICAgICI8cG86cGVyLW91bmNlLXJhdGU+MC43NDwvcG86cGVyLW91bmNlLXJhdGU+XG4iICsgCi0gICAgICAgICI8L3BvOnNoaXBwZXI+XG4iICsgCi0gICAgICAgICI8L3BvOnB1cmNoYXNlLW9yZGVyPlxuIiArCi0gICAgICAgICIiLAotICAgIH07Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZERvYyAoICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKHJuZCggMTUgKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZG9jc1sgcm5kKCBfZG9jcy5sZW5ndGggKSBdID0KLSAgICAgICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggX3htbHNbIHJuZCggX3htbHMubGVuZ3RoICkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWRTY2hlbWFkRG9jICggKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAocm5kKCA0ICkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgX2RvY3NbIHJuZCggX2RvY3MubGVuZ3RoICkgXSA9Ci0gICAgICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCi0gICAgICAgICAgICAgICAgICAgIF9zY2hlbWFfeG1sc1sgcm5kKCBfc2NoZW1hX3htbHMubGVuZ3RoICkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG1vdmVDdXJzb3JMZWZ0T25lVG9rZW4gKCApCi0gICAgewotICAgICAgICBnZXRDdXJzb3IoKS50b1ByZXZUb2tlbigpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgbW92ZUN1cnNvclJpZ2h0T25lVG9rZW4gKCApCi0gICAgewotICAgICAgICBnZXRDdXJzb3IoKS50b05leHRUb2tlbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgY2hhcltdIF9jaGFycyA9Ci0gICAgewotICAgICAgICAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnLCAnbScsICduJywKLSAgICAgICAgJ28nLCAncCcsICdxJywgJ3InLCAncycsICd0JywgJ3UnLCAndicsICd3JywgJ3gnLCAneScsICd6JywgCi0gICAgICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKLSAgICAgICAgJyAnLCAnPCcsICc+JywgJyYnLCAnLScsICc/JwotICAgIH07Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGdldFRleHRWYWx1ZSAoICkKLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gZ2V0Q3Vyc29yKCk7Ci0KLSAgICAgICAgaWYgKGMuaXNGaW5pc2goKSB8fCBjLmlzTmFtZXNwYWNlKCkgfHwgYy5pc1RleHQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIGMuZ2V0VGV4dFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFRleHRWYWx1ZSAoICkKLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gZ2V0Q3Vyc29yKCk7Ci0KLSAgICAgICAgaWYgKGMuaXNGaW5pc2goKSB8fCBjLmlzTmFtZXNwYWNlKCkgfHwgYy5pc1RleHQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IHJuZCggMTAgKSA7IGkgPj0gMCA7IGktLSApCi0gICAgICAgICAgICBzYi5hcHBlbmQoIF9jaGFyc1sgcm5kKCBfY2hhcnMubGVuZ3RoICkgXSApOwotCi0gICAgICAgIGMuc2V0VGV4dFZhbHVlKCBzYi50b1N0cmluZygpICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG1vdmVUZXh0ICggKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldEN1cnNvcigpLm1vdmVDaGFycyggcm5kKCAxMCApLCBnZXRDdXJzb3IoKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY29weVRleHQgKCApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Q3Vyc29yKCkuY29weUNoYXJzKCBybmQoIDEwICksIGdldEN1cnNvcigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCByZW1vdmVUZXh0ICggKQotICAgIHsKLSAgICAgICAgZ2V0Q3Vyc29yKCkucmVtb3ZlQ2hhcnMoIHJuZCggNiApICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluc2VydENvbW1lbnQgKCApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Q3Vyc29yKCkuaW5zZXJ0Q29tbWVudCggInBvbyIgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGluc2VydFByb2NpbnN0ICggKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldEN1cnNvcigpLmluc2VydFByb2NJbnN0KCAidGFyZ2V0IiwgInZhbCIgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGluc2VydFRleHQgKCApCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgYyA9IGdldEN1cnNvcigpOwotCi0gICAgICAgIGlmIChjLmlzQW55QXR0cigpIHx8IGMuaXNTdGFydGRvYygpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIGZvciAoIGludCBpID0gcm5kKCAxMCApIDsgaSA+PSAwIDsgaS0tICkKLSAgICAgICAgICAgIHNiLmFwcGVuZCggX2NoYXJzWyBybmQoIF9jaGFycy5sZW5ndGggKSBdICk7Ci0KLSAgICAgICAgYy5pbnNlcnRDaGFycyggc2IudG9TdHJpbmcoKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb2NDaGFycyAoICkKLSAgICB7Ci0gICAgICAgIF9kb2NzWyBybmQoIF9kb2NzLmxlbmd0aCApIF0ueG1sVGV4dCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjdXJzb3JDaGFycyAoICkKLSAgICB7Ci0gICAgICAgIGdldEN1cnNvcigpLnhtbFRleHQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9jQnl0ZXMgKCApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIF9kb2NzWyBybmQoIF9kb2NzLmxlbmd0aCApIF0uc2F2ZSggbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGN1cnNvckJ5dGVzICggKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRDdXJzb3IoKS5zYXZlKCBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIG1vdmVDaGFyc1JpZ2h0ICggKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRDdXJzb3IoKS50b05leHRDaGFyKCBybmQoIDEwICkgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbW92ZUNoYXJzTGVmdCAoICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0Q3Vyc29yKCkudG9QcmV2Q2hhciggcm5kKCAxMCApICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBRTmFtZSBnZXRRTmFtZSAoICkKLSAgICB7Ci0gICAgICAgIFFOYW1lIG5hbWUgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgc3dpdGNoICggcm5kKCAzICkgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgMCA6IG5hbWUgPSBYbWxCZWFucy5nZXRRTmFtZSggImZvby5jb20iLCAiZm9vIiApOyBicmVhazsKLSAgICAgICAgY2FzZSAxIDogbmFtZSA9IFhtbEJlYW5zLmdldFFOYW1lKCAiYmFyLmNvbSIsICJiYXIiICk7IGJyZWFrOwotICAgICAgICBjYXNlIDIgOiBuYW1lID0gWG1sQmVhbnMuZ2V0UU5hbWUoICJtb28iICk7IGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBpbnNlcnRFbGVtICggKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgYyA9IGdldEN1cnNvcigpOwotCi0gICAgICAgIGlmIChjLmlzQW55QXR0cigpIHx8IGMuaXNTdGFydGRvYygpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgYy5pbnNlcnRFbGVtZW50KCBnZXRRTmFtZSgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0QXR0ciAoICkKLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gZ2V0Q3Vyc29yKCk7Ci0KLSAgICAgICAgd2hpbGUgKCAhYy5pc0VuZGRvYygpICYmICFjLmlzQ29udGFpbmVyKCkgKQotICAgICAgICAgICAgYy50b05leHRUb2tlbigpOwotCi0gICAgICAgIGlmIChjLmlzRW5kZG9jKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgYy50b05leHRUb2tlbigpOwotICAgICAgICAKLSAgICAgICAgYy5pbnNlcnRBdHRyaWJ1dGUoIGdldFFOYW1lKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlWG1sQ29udGVudHMgKCApCi0gICAgewotICAgICAgICBYbWxDdXJzb3IgYyA9IGdldEN1cnNvcigpOwotCi0gICAgICAgIGMucmVtb3ZlWG1sQ29udGVudHMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY29weVhtbENvbnRlbnRzICggKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldEN1cnNvcigpLmNvcHlYbWxDb250ZW50cyggZ2V0Q3Vyc29yKCkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY29weVhtbCAoICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRDdXJzb3IoKS5jb3B5WG1sKCBnZXRDdXJzb3IoKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBtb3ZlWG1sQ29udGVudHMgKCApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Q3Vyc29yKCkubW92ZVhtbENvbnRlbnRzKCBnZXRDdXJzb3IoKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBtb3ZlWG1sICggKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldEN1cnNvcigpLm1vdmVYbWwoIGdldEN1cnNvcigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVhtbCAoICkKLSAgICB7Ci0gICAgICAgIFhtbEN1cnNvciBjID0gZ2V0Q3Vyc29yKCk7Ci0KLSAgICAgICAgaWYgKCFjLmlzU3RhcnRkb2MoKSAmJiAhYy5pc0ZpbmlzaCgpKQotICAgICAgICAgICAgYy5yZW1vdmVYbWwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJvb2ttYXJrIGV4dGVuZHMgWG1sQ3Vyc29yLlhtbEJvb2ttYXJrCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUJvb2ttYXJrICggKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRDdXJzb3IoKS5zZXRCb29rbWFyayggbmV3IEJvb2ttYXJrKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY2xlYXJCb29rbWFyayAoICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0Q3Vyc29yKCkuY2xlYXJCb29rbWFyayggQm9va21hcmsuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmFuZG9tKGxvbmcgc2VlZCwgWG1sT2JqZWN0W10gc2hhcmVkRG9jcywgYm9vbGVhbiByZWFkb25seSwgYm9vbGVhbiBub3NhdmUsIGJvb2xlYW4gbm9xdWVyeSwgYm9vbGVhbiBpbnRlcmZlcmVuY2UpCi0gICAgewotICAgICAgICBfc2VlZCA9IHNlZWQ7Ci0gICAgICAgIF9ybmQgPSBuZXcgamF2YS51dGlsLlJhbmRvbShzZWVkKTsKLSAgICAgICAgX2RvY3MgPSBzaGFyZWREb2NzOwotICAgICAgICBfcmVhZG9ubHkgPSByZWFkb25seTsKLSAgICAgICAgX25vc2F2ZSA9IG5vc2F2ZTsKLSAgICAgICAgX25vcXVlcnkgPSBub3F1ZXJ5OwotICAgICAgICBfaW50ZXJmZXJlbmNlID0gaW50ZXJmZXJlbmNlOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9zY2hlbWFzL2RlZmF1bHRzLnhzZCBiL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvZGVmYXVsdHMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWEyMTE2Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvZGVmYXVsdHMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPHhzOnNjaGVtYQotICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgeG1sbnM6dG5zPSJodHRwOi8vb3BlbnVyaS5vcmcvZGVmIgotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvZGVmIgotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImRlZmF1bHRzIj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgPHhzOmF0dHJpYnV0ZSByZWY9InRuczpjb29sIi8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czphdHRyaWJ1dGUgbmFtZT0iY29vbCIgdHlwZT0ieHM6aW50IiBkZWZhdWx0PSI3ODMiLz4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9zY2hlbWFzL2luY2x1ZGVkLnhzZCBiL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvaW5jbHVkZWQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjI2M2FmLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvaW5jbHVkZWQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPHhzOnNjaGVtYQotICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImNoYWluIiB0eXBlPSJjaGFpbmxpbmsiLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iY2hhaW5saW5rIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9ImNoYWluIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIHJlZj0ibmFtZSIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InRva2VuIj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgPHhzOm1heExlbmd0aCB2YWx1ZT0iNSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InRva2VuIi8+Ci0KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvc2NoZW1hcy9pbmNsdWRlcjEueHNkIGIvdjEvdGVzdC9zcmMvc2NoZW1hcy9pbmNsdWRlcjEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODExMDIzLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvaW5jbHVkZXIxLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIHhtbG5zOnRucz0iaHR0cDovL29wZW51cmkub3JnL2luY2x1ZGVyMSIKLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL2luY2x1ZGVyMSIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotICA8eHM6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iaW5jbHVkZWQueHNkIi8+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ib25lY2hhaW4iPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0bnM6Y2hhaW4iLz4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvaW5jbHVkZXIyLnhzZCBiL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvaW5jbHVkZXIyLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM1NjVkYy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9zY2hlbWFzL2luY2x1ZGVyMi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczp0bnM9Imh0dHA6Ly9vcGVudXJpLm9yZy9pbmNsdWRlcjIiCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy9pbmNsdWRlcjIiCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0KLSAgPHhzOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImluY2x1ZGVkLnhzZCIvPgotCi0gIDx4czplbGVtZW50IG5hbWU9InR3b2NoYWlucyI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczpjaGFpbiIgbWluT2NjdXJzPSIyIiBtYXhPY2N1cnM9IjIiLz4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvaW50dGVzdC54c2QgYi92MS90ZXN0L3NyYy9zY2hlbWFzL2ludHRlc3QueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTcyMWRlLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvaW50dGVzdC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08eHM6c2NoZW1hCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgIHRhcmdldE5hbWVzcGFjZT0iamF2YTppbnQudGVzdCIKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIHhtbG5zOnRucz0iamF2YTppbnQudGVzdCI+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTGF0aXR1ZGVEZWdyZWVzVHlwZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPGRlZmluaXRpb24+RGVncmVlcyBvZiBMYXRpdHVkZTwvZGVmaW5pdGlvbj4KLSAgICAgICAgPFVTTVRGcmVmPlNlZSBVU01URiBmaWVsZCBsYXRpdHVkZS5kZWdyZWVzLjE3LjE8L1VTTVRGcmVmPgotICAgICAgICA8RG9EWE1McmVmPlRCRDwvRG9EWE1McmVmPgotICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c2hvcnQiPgotICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iMDAiLz4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjkwIi8+Ci0gICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iW1xkXXsyfSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJMb25naXR1ZGVEZWdyZWVzVHlwZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPGRlZmluaXRpb24+RGVncmVlcyBvZiBMb25naXR1ZGU8L2RlZmluaXRpb24+Ci0gICAgICAgIDxVU01URnJlZj5TZWUgVVNNVEYgZmllbGQgbG9uZ2l0dWRlLmRlZ3JlZXMuMTguMTwvVVNNVEZyZWY+Ci0gICAgICAgIDxEb0RYTUxyZWY+VEJEPC9Eb0RYTUxyZWY+Ci0gICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzaG9ydCI+Ci0gICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSIwMDAiLz4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjE4MCIvPgotICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IltcZF17M30iLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0icG9zaXRpb24iPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibGF0IiB0eXBlPSJ0bnM6TGF0aXR1ZGVEZWdyZWVzVHlwZSIvPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJsb24iIHR5cGU9InRuczpMb25naXR1ZGVEZWdyZWVzVHlwZSIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvbGlzdGFuZHVuaW9uLnhzZCBiL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvbGlzdGFuZHVuaW9uLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdkZWFhOC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9zY2hlbWFzL2xpc3RhbmR1bmlvbi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczp0bnM9Imh0dHA6Ly9vcGVudXJpLm9yZy9sdXQiCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy9sdXQiCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idW5pb25zIj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9Im5uaSIgdHlwZT0idG5zOmFsbE5OSSIvPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaXplcyIgdHlwZT0idG5zOmxpc3Qtb3ItYWxsIi8+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdsaXN0LW9mLWludCc+Ci0gICAgPHhzOmxpc3QgaXRlbVR5cGU9J3hzOmludCcvPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYWxsTk5JIj4KLSAgICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czp1bmlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Imxpc3Qtb3ItYWxsIj4KLSAgICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InRuczpsaXN0LW9mLWludCI+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsIi8+Ci0gICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmtub3duIi8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czp1bmlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Imxpc3Qtb2YtYWxsTk5JIj4KLSAgICA8eHM6bGlzdCBpdGVtVHlwZT0idG5zOmFsbE5OSSIvPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibGlzdHMiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW50LWxpc3QiIHR5cGU9InRuczpsaXN0LW9mLWludCIvPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJubmktbGlzdCIgdHlwZT0idG5zOmxpc3Qtb2YtYWxsTk5JIi8+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkYXRlLW9yLWRhdGVUaW1lIj4KLSAgICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzOmRhdGUgeHM6ZGF0ZVRpbWUiLz4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9IndoZW4iIHR5cGU9InRuczpkYXRlLW9yLWRhdGVUaW1lIi8+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iaW5jaWRlbnQtcmVwb3J0cyI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczp3aGVuIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9zY2hlbWFzL25hbWV3b3JsZC54c2QgYi92MS90ZXN0L3NyYy9zY2hlbWFzL25hbWV3b3JsZC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZDBhZTguLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvc2NoZW1hcy9uYW1ld29ybGQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPHhzOnNjaGVtYQotICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgeG1sbnM6bnc9Imh0dHA6Ly9vcGVudXJpLm9yZy9uYW1ld29ybGQiCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy9uYW1ld29ybGQiCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibmFtZXdvcmxkIj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6c2VxdWVuY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpc2xhbmQiPgotICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJudzpsb2MiLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgPC94czplbGVtZW50PgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImxvYyI+Ci0gICAgPHhzOnNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InJlZmVyZW5jZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRvIiB0eXBlPSJ4czpRTmFtZSIvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgPC94czplbGVtZW50PgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9zY2hlbWFzL25vbmFtZXNwYWNlLnhzZCBiL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvbm9uYW1lc3BhY2UueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjQ1NjFkLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvbm9uYW1lc3BhY2UueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPHhzOnNjaGVtYQotICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCi0gIDx4czplbGVtZW50IG5hbWU9Im5jaGFpbiIgdHlwZT0ibmNoYWlubGluayIvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJuY2hhaW5saW5rIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9Im5jaGFpbiIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSByZWY9Im5uYW1lIi8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ibnRva2VuIj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgPHhzOm1heExlbmd0aCB2YWx1ZT0iNSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6YXR0cmlidXRlIG5hbWU9Im5uYW1lIiB0eXBlPSJudG9rZW4iLz4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9zY2hlbWFzL3N1YnN0Z3JvdXAueHNkIGIvdjEvdGVzdC9zcmMvc2NoZW1hcy9zdWJzdGdyb3VwLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYzYTg4NC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9zY2hlbWFzL3N1YnN0Z3JvdXAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy9zZ3MiIHhtbG5zOnNnPSJodHRwOi8vb3BlbnVyaS5vcmcvc2dzIj4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQyIgdHlwZT0ieHNkOnRva2VuIiBzdWJzdGl0dXRpb25Hcm91cD0ic2c6QiIvPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkIiIHR5cGU9InhzZDpub3JtYWxpemVkU3RyaW5nIiBzdWJzdGl0dXRpb25Hcm91cD0ic2c6QSIvPgotCi0gICAgPHhzZDplbGVtZW50IG5hbWU9IloiIHR5cGU9InNnOkV4dCIgc3Vic3RpdHV0aW9uR3JvdXA9InNnOlkiIC8+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlkiIHN1YnN0aXR1dGlvbkdyb3VwPSJzZzpYIiAvPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJYIiB0eXBlPSJzZzpCYXNlIi8+Ci0KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQW55VHlwZSIvPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBbnlUeXBlVGFpbCIgc3Vic3RpdHV0aW9uR3JvdXA9InNnOkFueVR5cGUiLz4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBbm9uU2ltcGxlIj4KLSAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6aW50Ij4KLSAgICAgICAgICAgICAgICA8eHNkOm1heEV4Y2x1c2l2ZSB2YWx1ZT0iMTAwIi8+Ci0gICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFub25TaW1wbGVUYWlsIiBzdWJzdGl0dXRpb25Hcm91cD0ic2c6QW5vblNpbXBsZSIvPgotCi0gICAgPHhzZDplbGVtZW50IG5hbWU9IkFub25Db21wbGV4Ij4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvbyIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQW5vbkNvbXBsZXhUYWlsIiBzdWJzdGl0dXRpb25Hcm91cD0ic2c6QW5vbkNvbXBsZXgiLz4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb290Ij4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InNnOkEiLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCYXNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlVucmVsYXRlZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFeHQiPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2c6QmFzZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJhYnN0cmFjdFRlc3QiPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDphbGw+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0ic2c6YWJzdHJhY3QiLz4KLQkJCTwveHNkOmFsbD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJhYnN0cmFjdCIgdHlwZT0ieHNkOnN0cmluZyIgYWJzdHJhY3Q9InRydWUiLz4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uY3JldGUiIHN1YnN0aXR1dGlvbkdyb3VwPSJzZzphYnN0cmFjdCIvPgotCi0JPHhzZDplbGVtZW50IG5hbWU9ImJsb2NrVGVzdCI+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmFsbD4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJzZzpibG9jayIvPgotCQkJPC94c2Q6YWxsPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCi0JPHhzZDplbGVtZW50IG5hbWU9ImJsb2NrIiB0eXBlPSJ4c2Q6c3RyaW5nIiBibG9jaz0ic3Vic3RpdHV0aW9uIi8+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9InN1YmJsb2NrIiBzdWJzdGl0dXRpb25Hcm91cD0ic2c6YmxvY2siLz4KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvc3RyZWFtdGVzdC9JbnRlcm4uamF2YSBiL3YxL3Rlc3Qvc3JjL3N0cmVhbXRlc3QvSW50ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZDk5YzkuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvc3RyZWFtdGVzdC9JbnRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIHN0cmVhbXRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGNsYXNzIEludGVybgotewotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0lURVIgPSAxMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NSRUFURSA9IDEwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9DT01QID0gMTAwOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgICB7Ci0gICAgICAgIGNoYXJbXSBjYSA9IHsgJ2EnLCAnYScsICdhJ307Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhYWEiID09ICJhYWEiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhYWEiID09IG5ldyBTdHJpbmcoImFhYSIpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhYWEiID09IG5ldyBTdHJpbmcoY2EpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhYWEiID09IG5ldyBTdHJpbmcoY2EpLmludGVybigpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhYWEiID09IFN0cmluZy52YWx1ZU9mKGNhKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIiA9PSBTdHJpbmcuY29weVZhbHVlT2YoY2EpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhYWEiID09ICJhYWEiKTsKLQotICAgICAgICBsb25nIHN0YXJ0OwotICAgICAgICBkb3VibGUgZDEgPSAwOwotICAgICAgICBkb3VibGUgZDIgPSAwOwotICAgICAgICBkb3VibGUgZDMgPSAwOwotCi0gICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpPE1BWF9JVEVSOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDYWNoZSBjYWNoZSA9IG5ldyBDYWNoZSgpOwotICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4xID0gY2FjaGUuY3JlYXRlMShTdHJpbmcudmFsdWVPZiggTWF0aC4KLSAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuaW50ZXJuKCksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuCi0gICAgICAgICAgICAgICAgICAgIGludGVybigpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihxbjEudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBmb3IoIGludCBqPTA7IGo8TUFYX0NSRUFURTsgaisrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjIgPSBjYWNoZS5jcmVhdGUxKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOwotICAgICAgICAgICAgICAgIGZvciggaW50IGs9MDsgazxNQVhfQ09NUDsgaysrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IHFuMSA9PSBxbjI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGQxID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydDsKLQotICAgICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwotICAgICAgICBmb3IoIGludCBpID0gMDsgaTxNQVhfSVRFUjsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ2FjaGUgY2FjaGUgPSBuZXcgQ2FjaGUoKTsKLSAgICAgICAgICAgIENhY2hlLlFOYW1lIHFuMSA9IGNhY2hlLmNyZWF0ZTEoU3RyaW5nLnZhbHVlT2YoIE1hdGguCi0gICAgICAgICAgICAgICAgICAgIHJvdW5kKE1hdGgucmFuZG9tKCkqTUFYX0NSRUFURS8xMCkpLmludGVybigpLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkqTUFYX0NSRUFURS8xMCkpLgotICAgICAgICAgICAgICAgICAgICBpbnRlcm4oKSk7Ci0gICAgICAgICAgICBmb3IoIGludCBqPTA7IGo8TUFYX0NSRUFURTsgaisrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjIgPSBjYWNoZS5jcmVhdGUxKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOwotICAgICAgICAgICAgICAgIGZvciggaW50IGs9MDsgazxNQVhfQ09NUDsgaysrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IHFuMS5lcXVhbEludGVybihxbjIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkMiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7Ci0KLSAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8TUFYX0lURVI7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IENhY2hlKCk7Ci0gICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjEgPSBjYWNoZS5jcmVhdGUxKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKSk7Ci0gICAgICAgICAgICBmb3IoIGludCBqPTA7IGo8TUFYX0NSRUFURTsgaisrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjIgPSBjYWNoZS5jcmVhdGUxKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKSk7Ci0gICAgICAgICAgICAgICAgZm9yKCBpbnQgaz0wOyBrPE1BWF9DT01QOyBrKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBiID0gcW4xLmVxdWFsRXh0ZXJuKHFuMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGQzID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydDsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZTE6XHQiICsgZDEgKyAiXHQiICsgZDIgKyAiXHQiICsgZDMpOwotCi0gICAgICAgIC8vY3JlYXRlMgotICAgICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwotICAgICAgICBmb3IoIGludCBpID0gMDsgaTxNQVhfSVRFUjsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ2FjaGUgY2FjaGUgPSBuZXcgQ2FjaGUoKTsKLSAgICAgICAgICAgIENhY2hlLlFOYW1lIHFuMSA9IGNhY2hlLmNyZWF0ZTIoU3RyaW5nLnZhbHVlT2YoIE1hdGguCi0gICAgICAgICAgICAgICAgICAgIHJvdW5kKE1hdGgucmFuZG9tKCkqTUFYX0NSRUFURS8xMCkpLmludGVybigpLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkqTUFYX0NSRUFURS8xMCkpLgotICAgICAgICAgICAgICAgICAgICBpbnRlcm4oKSk7Ci0gICAgICAgICAgICBmb3IoIGludCBqPTA7IGo8TUFYX0NSRUFURTsgaisrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjIgPSBjYWNoZS5jcmVhdGUyKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOwotICAgICAgICAgICAgICAgIGZvciggaW50IGs9MDsgazxNQVhfQ09NUDsgaysrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IHFuMSA9PSBxbjI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGQxID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydDsKLQotICAgICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwotICAgICAgICBmb3IoIGludCBpID0gMDsgaTxNQVhfSVRFUjsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ2FjaGUgY2FjaGUgPSBuZXcgQ2FjaGUoKTsKLSAgICAgICAgICAgIENhY2hlLlFOYW1lIHFuMSA9IGNhY2hlLmNyZWF0ZTIoU3RyaW5nLnZhbHVlT2YoIE1hdGguCi0gICAgICAgICAgICAgICAgICAgIHJvdW5kKE1hdGgucmFuZG9tKCkqTUFYX0NSRUFURS8xMCkpLmludGVybigpLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkqTUFYX0NSRUFURS8xMCkpLgotICAgICAgICAgICAgICAgICAgICBpbnRlcm4oKSk7Ci0gICAgICAgICAgICBmb3IoIGludCBqPTA7IGo8TUFYX0NSRUFURTsgaisrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjIgPSBjYWNoZS5jcmVhdGUyKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOwotICAgICAgICAgICAgICAgIGZvciggaW50IGs9MDsgazxNQVhfQ09NUDsgaysrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IHFuMS5lcXVhbEludGVybihxbjIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkMiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7Ci0KLSAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8TUFYX0lURVI7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IENhY2hlKCk7Ci0gICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjEgPSBjYWNoZS5jcmVhdGUyKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKSk7Ci0gICAgICAgICAgICBmb3IoIGludCBqPTA7IGo8TUFYX0NSRUFURTsgaisrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjIgPSBjYWNoZS5jcmVhdGUyKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKSk7Ci0gICAgICAgICAgICAgICAgZm9yKCBpbnQgaz0wOyBrPE1BWF9DT01QOyBrKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBiID0gcW4xLmVxdWFsRXh0ZXJuKHFuMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGQzID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydDsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZTI6XHQiICsgZDEgKyAiXHQiICsgZDIgKyAiXHQiICsgZDMpOwotCi0gICAgICAgIC8vY3JlYXRlMwotICAgICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwotICAgICAgICBmb3IoIGludCBpID0gMDsgaTxNQVhfSVRFUjsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ2FjaGUgY2FjaGUgPSBuZXcgQ2FjaGUoKTsKLSAgICAgICAgICAgIENhY2hlLlFOYW1lIHFuMSA9IGNhY2hlLmNyZWF0ZTMoU3RyaW5nLnZhbHVlT2YoIE1hdGguCi0gICAgICAgICAgICAgICAgICAgIHJvdW5kKE1hdGgucmFuZG9tKCkqTUFYX0NSRUFURS8xMCkpLmludGVybigpLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkqTUFYX0NSRUFURS8xMCkpLgotICAgICAgICAgICAgICAgICAgICBpbnRlcm4oKSk7Ci0gICAgICAgICAgICBmb3IoIGludCBqPTA7IGo8TUFYX0NSRUFURTsgaisrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjIgPSBjYWNoZS5jcmVhdGUzKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOwotICAgICAgICAgICAgICAgIGZvciggaW50IGs9MDsgazxNQVhfQ09NUDsgaysrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IHFuMSA9PSBxbjI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGQxID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydDsKLQotICAgICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwotICAgICAgICBmb3IoIGludCBpID0gMDsgaTxNQVhfSVRFUjsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ2FjaGUgY2FjaGUgPSBuZXcgQ2FjaGUoKTsKLSAgICAgICAgICAgIENhY2hlLlFOYW1lIHFuMSA9IGNhY2hlLmNyZWF0ZTMoU3RyaW5nLnZhbHVlT2YoIE1hdGguCi0gICAgICAgICAgICAgICAgICAgIHJvdW5kKE1hdGgucmFuZG9tKCkqTUFYX0NSRUFURS8xMCkpLmludGVybigpLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkqTUFYX0NSRUFURS8xMCkpLgotICAgICAgICAgICAgICAgICAgICBpbnRlcm4oKSk7Ci0gICAgICAgICAgICBmb3IoIGludCBqPTA7IGo8TUFYX0NSRUFURTsgaisrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjIgPSBjYWNoZS5jcmVhdGUzKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOwotICAgICAgICAgICAgICAgIGZvciggaW50IGs9MDsgazxNQVhfQ09NUDsgaysrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IHFuMS5lcXVhbEludGVybihxbjIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkMiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7Ci0KLSAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8TUFYX0lURVI7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IENhY2hlKCk7Ci0gICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjEgPSBjYWNoZS5jcmVhdGUzKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKSk7Ci0gICAgICAgICAgICBmb3IoIGludCBqPTA7IGo8TUFYX0NSRUFURTsgaisrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjIgPSBjYWNoZS5jcmVhdGUzKFN0cmluZy52YWx1ZU9mKCBNYXRoLgotICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKSk7Ci0gICAgICAgICAgICAgICAgZm9yKCBpbnQgaz0wOyBrPE1BWF9DT01QOyBrKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBiID0gcW4xLmVxdWFsRXh0ZXJuKHFuMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGQzID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydDsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZTM6XHQiICsgZDEgKyAiXHQiICsgZDIgKyAiXHQiICsgZDMpOwotICAgIH0KLX0KLQotY2xhc3MgQ2FjaGUKLXsKLSAgICBIYXNoTWFwIGgxID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIFFOYW1lIGNyZWF0ZTEoU3RyaW5nIGwsIFN0cmluZyB1KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShsICx1KTsKLSAgICB9Ci0KLSAgICBRTmFtZSBjcmVhdGUyKFN0cmluZyBsLCBTdHJpbmcgdSkKLSAgICB7Ci0gICAgICAgIGludCBoY29kZSA9IGwuaGFzaENvZGUoKSArIDMzKnUuaGFzaENvZGUoKTsKLSAgICAgICAgSW50ZWdlciBrZXkgPSBuZXcgSW50ZWdlcihoY29kZSk7Ci0KLSAgICAgICAgaWYoIGgxLmNvbnRhaW5zS2V5KCBrZXkgKSApCi0gICAgICAgICAgICByZXR1cm4gKFFOYW1lKWgxLmdldChrZXkpOwotCi0gICAgICAgIFFOYW1lIHFuID0gbmV3IFFOYW1lKGwsIHUpOwotICAgICAgICBoMS5wdXQoa2V5LCBxbik7Ci0gICAgICAgIHJldHVybiBxbjsKLSAgICB9Ci0KLSAgICBzeW5jaHJvbml6ZWQgUU5hbWUgY3JlYXRlMyhTdHJpbmcgbCwgU3RyaW5nIHUpCi0gICAgewotICAgICAgICByZXR1cm4gY3JlYXRlMihsLCB1KTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgUU5hbWUKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGxvY2FsOwotICAgICAgICBwcml2YXRlIFN0cmluZyB1cmk7Ci0KLSAgICAgICAgcHJpdmF0ZSBRTmFtZSgpCi0gICAgICAgIHt9Ci0gICAgICAgIHByaXZhdGUgUU5hbWUoU3RyaW5nIGwsIFN0cmluZyB1KQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2NhbCA9IGw7Ci0gICAgICAgICAgICB1cmkgPSB1OwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBlcXVhbEludGVybiggUU5hbWUgcW4gKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbG9jYWw9PXFuLmxvY2FsICYmIHVyaT09cW4udXJpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBlcXVhbEV4dGVybiggUU5hbWUgcW4gKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbG9jYWwuZXF1YWxzKHFuLmxvY2FsKSAmJiB1cmkuZXF1YWxzKHFuLnVyaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGxvY2FsICsgIiwiICsgdXJpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9zdHJlYW10ZXN0L1N1YlN0cmVhbXNUZXN0LmphdmEgYi92MS90ZXN0L3NyYy9zdHJlYW10ZXN0L1N1YlN0cmVhbXNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YTAyMjcuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvc3RyZWFtdGVzdC9TdWJTdHJlYW1zVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2Ugc3RyZWFtdGVzdDsKLQotLyoKLSogQ3JlYXRlZCBieSBjZXphckBiZWEuY29tCi0qLwotCi1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotCi1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1scHVsbC5zdHJlYW0uWG1sU3RyZWFtU291cmNlOwotaW1wb3J0IG9yZy54bWxwdWxsLnN0cmVhbS5YcHBYbWxTdHJlYW1JbXBsOwotaW1wb3J0IG9yZy54bWxwdWxsLnN0cmVhbS5YbWxTdHJlYW1GYWN0b3J5OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFN1YlN0cmVhbXNUZXN0Ci17Ci0gICAgcHVibGljIFN1YlN0cmVhbXNUZXN0KFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgLy9zdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViU3RyZWFtKCkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSXQgd29ya3MuIik7Ci0KLSAgICAgICAgLy90aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiS2V2aW4ncyBleGNlcHRpb24iKTsKLQotICAgICAgICAvL2Fzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24sIElPRXhjZXB0aW9uLAotICAgICAgICAgICAgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVhZGVyIHJlYWRlcjE7Ci0gICAgICAgIFJlYWRlciByZWFkZXIyOwotICAgICAgICBpZiggYXJncy5sZW5ndGg9PTAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9ICI8YT48Yj48YyBhMT0nYTF2JyBhMj0nYTJ2JyAvPjwvYj48eC8+IiArCi0gICAgICAgICAgICAgICAgIjx5PlNvbWUgdGV4dDwveT48L2E+IjsKLSAgICAgICAgICAgIHJlYWRlcjEgPSBuZXcgU3RyaW5nUmVhZGVyKHMpOwotICAgICAgICAgICAgcmVhZGVyMiA9IG5ldyBTdHJpbmdSZWFkZXIocyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZWFkZXIxID0gbmV3IEZpbGVSZWFkZXIoYXJnc1swXSk7Ci0gICAgICAgICAgICByZWFkZXIyID0gbmV3IEZpbGVSZWFkZXIoYXJnc1swXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlYWRlciAuLi4iKTsKLSAgICAgICAgWG1sU3RyZWFtU291cmNlIHNvdXJjZSA9IG5ldyBYcHBYbWxTdHJlYW1JbXBsKHJlYWRlcjEpOwotICAgICAgICBYTUxJbnB1dFN0cmVhbSBteVN0cmVhbSA9IFhtbFN0cmVhbUZhY3RvcnkuCi0gICAgICAgICAgICAgICAgY3JlYXRlWG1sSW5wdXRTdHJlYW0oIHNvdXJjZSApOwotCi0gICAgICAgIFhNTElucHV0U3RyZWFtIGJhYmVsU3RyZWFtID0gWE1MSW5wdXRTdHJlYW1GYWN0b3J5Lm5ld0luc3RhbmNlKCkuCi0gICAgICAgICAgICBuZXdJbnB1dFN0cmVhbShyZWFkZXIyKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm15U3RyZWFtIC4uLiIpOwotICAgICAgICBmb3IoaW50IGk9MDsgbXlTdHJlYW0uaGFzTmV4dCgpICYmIGk8MzsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteTogIiArIG15U3RyZWFtLmhhc05leHQoKSArICIgJyIgKwotICAgICAgICAgICAgICAgIG15U3RyZWFtLm5leHQoKSArICInIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJiYjogIiArIGJhYmVsU3RyZWFtLmhhc05leHQoKSArICIgJyIgKwotICAgICAgICAgICAgICAgICAgICBiYWJlbFN0cmVhbS5uZXh0KCkgKyAiJyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgWE1MSW5wdXRTdHJlYW0gbXlzcyA9IG15U3RyZWFtLmdldFN1YlN0cmVhbSgpOwotICAgICAgICBYTUxJbnB1dFN0cmVhbSBiYnNzID0gYmFiZWxTdHJlYW0uZ2V0U3ViU3RyZWFtKCk7Ci0KLSAgICAgICAgZm9yKGludCBpPTA7IChteXNzLmhhc05leHQoKSB8fCBiYnNzLmhhc05leHQoKSkgJiYgaTwzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIm15IFNVQlN0cmVhbTogIiArIG15c3MuaGFzTmV4dCgpICsgIiAnIiArCi0gICAgICAgICAgICAgICAgICAgIG15c3MubmV4dCgpICsgIiciKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggImJiIFNVQlN0cmVhbTogIiArIGJic3MuaGFzTmV4dCgpICsgIiAnIiArCi0gICAgICAgICAgICAgICAgICAgIGJic3MubmV4dCgpICsgIiciKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTElucHV0U3RyZWFtIG15c3MyID0gbXlzcy5nZXRTdWJTdHJlYW0oKTsKLSAgICAgICAgWE1MSW5wdXRTdHJlYW0gYmJzczIgPSBteXNzLmdldFN1YlN0cmVhbSgpOwotICAgICAgICBmb3IoOyBteXNzMi5oYXNOZXh0KCkgfHwgYmJzczIuaGFzTmV4dCgpIDspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIm15IFN1YlNVQlN0cmVhbSAyOiAiICsgbXlzczIuaGFzTmV4dCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiAnIiArIG15c3MyLm5leHQoKSArICInIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJiYiBTdWJTVUJTdHJlYW0gMjogIiArIGJic3MyLmhhc05leHQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgJyIgKyBiYnNzMi5uZXh0KCkgKyAiJyIpOwotICAgICAgICB9Ci0gICAgICAgIG15c3MyLmNsb3NlKCk7Ci0gICAgICAgIGJic3MyLmNsb3NlKCk7Ci0KLSAgICAgICAgZm9yKDsgbXlzcy5oYXNOZXh0KCkgfHwgYmJzcy5oYXNOZXh0KCkgOykKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibXkgU1VCU3RyZWFtOiAiICsgbXlzcy5oYXNOZXh0KCkgKyAiICciICsKLSAgICAgICAgICAgICAgICAgICAgbXlzcy5uZXh0KCkgKyAiJyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiYmIgU1VCU3RyZWFtOiAiICsgYmJzcy5oYXNOZXh0KCkgKyAiICciICsKLSAgICAgICAgICAgICAgICAgICAgYmJzcy5uZXh0KCkgKyAiJyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKDsgbXlTdHJlYW0uaGFzTmV4dCgpIHx8IGJhYmVsU3RyZWFtLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIm15OiAiICsgbXlTdHJlYW0uaGFzTmV4dCgpICsgIiAnIiArCi0gICAgICAgICAgICAgICAgICAgIG15U3RyZWFtLm5leHQoKSArICInIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJiYjogIiArIGJhYmVsU3RyZWFtLmhhc05leHQoKSArICIgJyIgKwotICAgICAgICAgICAgICAgICAgICBiYWJlbFN0cmVhbS5uZXh0KCkgKyAiJyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbWFpbjIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbjIoKQotICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24sIElPRXhjZXB0aW9uLAotICAgICAgICAgICAgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVhZGVyIHJlYWRlcjE7Ci0gICAgICAgIFJlYWRlciByZWFkZXIyOwotICAgICAgICAgICAgU3RyaW5nIHMgPSAiPGE+PGI+PGMgYTE9J2ExdicgYTI9J2EydicgLz48L2I+PHgvPiIgKwotICAgICAgICAgICAgICAgICI8eT5Tb21lIHRleHQ8L3k+PC9hPiI7Ci0gICAgICAgICAgICByZWFkZXIxID0gbmV3IFN0cmluZ1JlYWRlcihzKTsKLSAgICAgICAgICAgIHJlYWRlcjIgPSBuZXcgU3RyaW5nUmVhZGVyKHMpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVhZGVyIC4uLiIpOwotICAgICAgICBYbWxTdHJlYW1Tb3VyY2Ugc291cmNlID0gbmV3IFhwcFhtbFN0cmVhbUltcGwocmVhZGVyMSk7Ci0gICAgICAgIFhNTElucHV0U3RyZWFtIG15U3RyZWFtID0gWG1sU3RyZWFtRmFjdG9yeS4KLSAgICAgICAgICAgICAgICBjcmVhdGVYbWxJbnB1dFN0cmVhbSggc291cmNlICk7Ci0KLSAgICAgICAgWE1MSW5wdXRTdHJlYW0gYmFiZWxTdHJlYW0gPSBYTUxJbnB1dFN0cmVhbUZhY3RvcnkubmV3SW5zdGFuY2UoKS4KLSAgICAgICAgICAgIG5ld0lucHV0U3RyZWFtKHJlYWRlcjIpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibXlTdHJlYW0gLi4uIik7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBteVN0cmVhbS5oYXNOZXh0KCkgJiYgaTwzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIm15OiAiICsgIiAnIiArCi0gICAgICAgICAgICAgICAgbXlTdHJlYW0ubmV4dCgpICsgIiciKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggImJiOiAiICsgIiAnIiArCi0gICAgICAgICAgICAgICAgICAgIGJhYmVsU3RyZWFtLm5leHQoKSArICInIik7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxJbnB1dFN0cmVhbSBteXNzID0gbXlTdHJlYW0uZ2V0U3ViU3RyZWFtKCk7Ci0gICAgICAgIFhNTElucHV0U3RyZWFtIGJic3MgPSBiYWJlbFN0cmVhbS5nZXRTdWJTdHJlYW0oKTsKLQotICAgICAgICBmb3IoaW50IGk9MDsgbXlzcy5oYXNOZXh0KCkgJiYgaTwzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIm15IFNVQlN0cmVhbTogIiArICIgJyIgKwotICAgICAgICAgICAgICAgICAgICBteXNzLm5leHQoKSArICInIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJiYiBTVUJTdHJlYW06ICIgKyAiICciICsKLSAgICAgICAgICAgICAgICAgICAgYmJzcy5uZXh0KCkgKyAiJyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgWE1MSW5wdXRTdHJlYW0gbXlzczIgPSBteXNzLmdldFN1YlN0cmVhbSgpOwotICAgICAgICBYTUxJbnB1dFN0cmVhbSBiYnNzMiA9IG15c3MuZ2V0U3ViU3RyZWFtKCk7Ci0gICAgICAgIGZvcig7IG15c3MyLmhhc05leHQoKSA7KQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteSBTdWJTVUJTdHJlYW0gMjogIiArCi0gICAgICAgICAgICAgICAgICAgICIgJyIgKyBteXNzMi5uZXh0KCkgKyAiJyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiYmIgU3ViU1VCU3RyZWFtIDI6ICIgKwotICAgICAgICAgICAgICAgICAgICAiICciICsgYmJzczIubmV4dCgpICsgIiciKTsKLSAgICAgICAgfQotICAgICAgICBteXNzMi5jbG9zZSgpOwotICAgICAgICBiYnNzMi5jbG9zZSgpOwotCi0gICAgICAgIGZvcig7IG15c3MuaGFzTmV4dCgpIHx8IGJic3MuaGFzTmV4dCgpIDspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIm15IFNVQlN0cmVhbTogIiArICIgJyIgKwotICAgICAgICAgICAgICAgICAgICBteXNzLm5leHQoKSArICInIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJiYiBTVUJTdHJlYW06ICIgKyAiICciICsKLSAgICAgICAgICAgICAgICAgICAgYmJzcy5uZXh0KCkgKyAiJyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKDsgbXlTdHJlYW0uaGFzTmV4dCgpIDspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIm15OiAiICsgIiAnIiArCi0gICAgICAgICAgICAgICAgICAgIG15U3RyZWFtLm5leHQoKSArICInIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJiYjogIiArCi0gICAgICAgICAgICAgICAgICAgIC8vYmFiZWxTdHJlYW0uaGFzTmV4dCgpICsgIC8vQkFCRUwgYnVnYnVnOiB1bi9jb21tZW50IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9saW5lIHlvdSdsbCBnZXQgZGlmZmVyZW50IGJlaGF2aW9yIGZvciBuZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgIiAnIiArCi0gICAgICAgICAgICAgICAgICAgIGJhYmVsU3RyZWFtLm5leHQoKSArICInIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtYWluMygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluMygpCi0gICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCi0gICAgICAgICAgICBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZWFkZXIgcmVhZGVyMTsKLSAgICAgICAgUmVhZGVyIHJlYWRlcjI7Ci0gICAgICAgIFN0cmluZyBzID0gIjw/eG1sIHZlcnNpb249JzEuMS4xJz8+PGE+PGIgeG1sbnM9JycgeG1sbnM6YT0nc2Rmc2RmJz48YyBhMT0nYSZsdDsxdicgYTI9J2EydicgLz48L2I+PHgvPiIgKwotICAgICAgICAgICAgIjx5PlNvbWUmbHQ7IGFuZCAmZ3Q7dGV4dDwveT48L2E+IjsKLSAgICAgICAgcmVhZGVyMSA9IG5ldyBTdHJpbmdSZWFkZXIocyk7Ci0gICAgICAgIHJlYWRlcjIgPSBuZXcgU3RyaW5nUmVhZGVyKHMpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVhZGVyIC4uLiBpbiBtYWluMyIpOwotICAgICAgICBYbWxTdHJlYW1Tb3VyY2Ugc291cmNlID0gbmV3IFhwcFhtbFN0cmVhbUltcGwocmVhZGVyMSk7Ci0gICAgICAgIFhNTElucHV0U3RyZWFtIG15U3RyZWFtID0gWG1sU3RyZWFtRmFjdG9yeS4KLSAgICAgICAgICAgICAgICBjcmVhdGVYbWxJbnB1dFN0cmVhbSggc291cmNlICk7Ci0KLSAgICAgICAgLy9YTUxJbnB1dFN0cmVhbSBiYWJlbFN0cmVhbSA9IFhNTElucHV0U3RyZWFtRmFjdG9yeS5uZXdJbnN0YW5jZSgpLgotICAgICAgICAvLyAgICBuZXdJbnB1dFN0cmVhbShyZWFkZXIyKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm15U3RyZWFtIC4uLiIpOwotICAgICAgICBmb3IoaW50IGk9MDsgbXlTdHJlYW0uaGFzTmV4dCgpICYmIGk8MDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteTogIiArICIgJyIgKwotICAgICAgICAgICAgICAgIG15U3RyZWFtLm5leHQoKSArICInIik7Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbiggImJiOiAiICsgIiAnIiArCi0gICAgICAgICAgICAvLyAgICAgICAgYmFiZWxTdHJlYW0ubmV4dCgpICsgIiciKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTElucHV0U3RyZWFtIG15c3MgPSBteVN0cmVhbS5nZXRTdWJTdHJlYW0oKTsKLSAgICAgICAgLy9YTUxJbnB1dFN0cmVhbSBiYnNzID0gYmFiZWxTdHJlYW0uZ2V0U3ViU3RyZWFtKCk7Ci0KLSAgICAgICAgZm9yKGludCBpPTA7IG15c3MuaGFzTmV4dCgpICYmIGk8MzsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteSBTVUJTdHJlYW06ICIgKyAiICciICsKLSAgICAgICAgICAgICAgICAgICAgbXlzcy5uZXh0KCkgKyAiJyIpOwotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oICJiYiBTVUJTdHJlYW06ICIgKyAiICciICsKLSAgICAgICAgICAgIC8vICAgICAgICBiYnNzLm5leHQoKSArICInIik7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxJbnB1dFN0cmVhbSBteXNzMiA9IG15c3MuZ2V0U3ViU3RyZWFtKCk7Ci0gICAgICAgIC8vWE1MSW5wdXRTdHJlYW0gYmJzczIgPSBteXNzLmdldFN1YlN0cmVhbSgpOwotICAgICAgICBmb3IoOyBteXNzMi5oYXNOZXh0KCkgOykKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibXkgU3ViU1VCU3RyZWFtIDI6ICIgKwotICAgICAgICAgICAgICAgICAgICAiICciICsgbXlzczIubmV4dCgpICsgIiciKTsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCAiYmIgU3ViU1VCU3RyZWFtIDI6ICIgKwotICAgICAgICAgICAgLy8gICAgICAgICIgJyIgKyBiYnNzMi5uZXh0KCkgKyAiJyIpOwotICAgICAgICB9Ci0gICAgICAgIG15c3MyLmNsb3NlKCk7Ci0gICAgICAgIC8vYmJzczIuY2xvc2UoKTsKLQotICAgICAgICBmb3IoOyBteXNzLmhhc05leHQoKSAvKnx8IGJic3MuaGFzTmV4dCgpKi8gOykKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibXkgU1VCU3RyZWFtOiAiICsgIiAnIiArCi0gICAgICAgICAgICAgICAgICAgIG15c3MubmV4dCgpICsgIiciKTsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCAiYmIgU1VCU3RyZWFtOiAiICsgIiAnIiArCi0gICAgICAgICAgICAvLyAgICAgICAgYmJzcy5uZXh0KCkgKyAiJyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKDsgbXlTdHJlYW0uaGFzTmV4dCgpIDspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIm15OiAiICsgIiAnIiArCi0gICAgICAgICAgICAgICAgICAgIG15U3RyZWFtLm5leHQoKSArICInIik7Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbiggImJiOiAiICsKLSAgICAgICAgICAgICAgICAgICAgLy9iYWJlbFN0cmVhbS5oYXNOZXh0KCkgKyAgLy9CQUJFTCBidWdidWc6IHVuL2NvbW1lbnQgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xpbmUgeW91J2xsIGdldCBkaWZmZXJlbnQgYmVoYXZpb3IgZm9yIG5leHQoKQotICAgICAgICAgICAgLy8gICAgICAgICIgJyIgKwotICAgICAgICAgICAgLy8gICAgICAgIGJhYmVsU3RyZWFtLm5leHQoKSArICInIik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3N0cmVhbXRlc3QvWG1sU3RyZWFtQ29uZm9ybWFuY2UuamF2YSBiL3YxL3Rlc3Qvc3JjL3N0cmVhbXRlc3QvWG1sU3RyZWFtQ29uZm9ybWFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiYWY5ZS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy9zdHJlYW10ZXN0L1htbFN0cmVhbUNvbmZvcm1hbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBzdHJlYW10ZXN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IG9yZy54bWxwdWxsLm14cDEuTVhQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbHB1bGwubXhwMS5NWFBhcnNlckNhY2hpbmdTdHJpbmdzOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbUZhY3Rvcnk7Ci1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxFdmVudDsKLWltcG9ydCB4bWxleHQueG1sLlhwcEFkYXB0b3I7Ci1pbXBvcnQgb3JnLnhtbHB1bGwuc3RyZWFtLlhwcFhtbFN0cmVhbUltcGw7Ci1pbXBvcnQgb3JnLnhtbHB1bGwuc3RyZWFtLlhtbFN0cmVhbUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLQotLyoqCi0gKiAgIFRlc3RzIHRoZSBjb25mb3JtYW5jZSBvZiB0aGUgWE1MSW5wdXRTdHJlYW0gcHJvZHVjZWQgYnkgWHBwWG1sU3RyZWFtSW1wbC4KLSAqICAgQGF1dGhvciBDZXphciBBbmRyZWkKLSAqLwotcHVibGljIGNsYXNzIFhtbFN0cmVhbUNvbmZvcm1hbmNlCi17Ci0gICAgZmluYWwgc3RhdGljIGludCBUSU1FUyA9IDMwOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoIGFyZ3MubGVuZ3RoPjAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShhcmdzWzBdKTsKLSAgICAgICAgICAgIGlmKCBmLmlzRGlyZWN0b3J5KCkgKQotICAgICAgICAgICAgICAgIGNvbXBhcmVEaXIoZik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgLy9jb21wYXJlRmlsZShmKTsKLSAgICAgICAgICAgICAgICBwcmludEZpbGUoZik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludFVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRUaGlzIGFwcCB0ZXN0cyB0aGUgY29uZm9ybWFuY2Ugb2YgdGhlIHR3byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJYTUxJbnB1dFN0cmVhbSBcblx0cHJvZHVjZWQgYnkgQmFiZWwgcGFyc2VyIGFuZCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJYcHAzIHBhcnNlci4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuXHRVU0FHRTogamF2YSAuLi4gdGVzdC5YbWxTdHJlYW1Db25mb3JtYW5jZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXJ8ZmlsZSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXHRcdGRpclx0XHRNYWtlcyB0aGUgdGVzdCBmb3IgYWxsIHRoZSBmaWxlcyBpbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZGlyLiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRmaWxlXHRcdE1ha2VzIHRoZSB0ZXN0IG9ubHkgZm9yIHRoYXQgZmlsZS4iKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBjb21wYXJlRmlsZShGaWxlIGZpbGUpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihmaWxlLmdldFBhdGgoKSArICIgc2l6ZTogIiArIGZpbGUubGVuZ3RoKCkpOwotCi0gICAgICAgIGlmKCFmaWxlLmlzRmlsZSgpKQotICAgICAgICAgICAgLy90aHJvdyBuZXcgRXhjZXB0aW9uKCJjb21wYXJlRmlsZTogZmlsZSBub3QgYSBGaWxlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgUmVhZGVyIHIxID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBuZXcgRmlsZVJlYWRlcihmaWxlKSk7Ci0gICAgICAgIFJlYWRlciByMiA9IG5ldyBCdWZmZXJlZFJlYWRlciggbmV3IEZpbGVSZWFkZXIoZmlsZSkpOwotCi0gICAgICAgIFhNTElucHV0U3RyZWFtIHhwcCA9IFhtbFN0cmVhbUZhY3RvcnkuCi0gICAgICAgICAgICAgICAgY3JlYXRlWG1sSW5wdXRTdHJlYW0obmV3IFhwcFhtbFN0cmVhbUltcGwocjIpKTsKLSAgICAgICAgWE1MSW5wdXRTdHJlYW0gYmFiZWwgPSBYTUxJbnB1dFN0cmVhbUZhY3RvcnkubmV3SW5zdGFuY2UoKS4KLSAgICAgICAgICAgIG5ld0lucHV0U3RyZWFtKHIxKTsKLQotICAgICAgICB3aGlsZSggeHBwLmhhc05leHQoKSB8fCBiYWJlbC5oYXNOZXh0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBYTUxFdmVudCB4cHBldmVudCA9IHhwcC5wZWVrKCk7Ci0gICAgICAgICAgICBYTUxFdmVudCBiYWJlbGV2ZW50ID0gYmFiZWwucGVlaygpOwotCi0gICAgICAgICAgICBpZiggISgiIit4cHBldmVudCkuZXF1YWxzKCgiIitiYWJlbGV2ZW50KSkgKQotICAgICAgICAgICAgICAgIHByaW50RXJyb3IoeHBwZXZlbnQsIGJhYmVsZXZlbnQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIgICBgIiArIHhwcGV2ZW50ICsgIidcbiAgIGAiICsgYmFiZWxldmVudCArCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIiciKTsgU3lzdGVtLm91dC5mbHVzaCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB4cHBldmVudCA9IHhwcC5uZXh0KCk7Ci0gICAgICAgICAgICBiYWJlbGV2ZW50ID0gYmFiZWwubmV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIiAgIHhwcCAgIG92ZXJsaW1pdDogIiArIHhwcC5uZXh0KCkgKTsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIiAgIGJhYmVsIG92ZXJsaW1pdDogIiArIGJhYmVsLm5leHQoKSApOwotCi0gICAgICAgIHIxLmNsb3NlKCk7Ci0gICAgICAgIHIyLmNsb3NlKCk7Ci0KLSAgICAgICAgLy9jb21wYXJlUGVyZihmaWxlKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBwcmludEZpbGUoRmlsZSBmaWxlKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmlsZS5nZXRQYXRoKCkgKyAiIHNpemU6ICIgKyBmaWxlLmxlbmd0aCgpKTsKLQotICAgICAgICBpZighZmlsZS5pc0ZpbGUoKSkKLSAgICAgICAgICAgIC8vdGhyb3cgbmV3IEV4Y2VwdGlvbigiY29tcGFyZUZpbGU6IGZpbGUgbm90IGEgRmlsZSIpOwotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFJlYWRlciByMiA9IG5ldyBCdWZmZXJlZFJlYWRlciggbmV3IEZpbGVSZWFkZXIoZmlsZSkpOwotCi0gICAgICAgIFhNTElucHV0U3RyZWFtIHhwcCA9IFhtbFN0cmVhbUZhY3RvcnkuCi0gICAgICAgICAgICAgICAgY3JlYXRlWG1sSW5wdXRTdHJlYW0obmV3IFhwcFhtbFN0cmVhbUltcGwocjIpKTsKLSAgICAgICAgWE1MSW5wdXRTdHJlYW0gbW9ycGhlZFN0cmVhbTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgeHF1ZXJ5Iik7Ci0gICAgICAgICAgICBYbWxPYmplY3QgeG1sT2JqID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoeHBwKTsKLSAgICAgICAgICAgIFhtbEN1cnNvciBjcnMgPSB4bWxPYmoubmV3Q3Vyc29yKCk7Ci0gICAgICAgICAgICBYbWxDdXJzb3IgcmVzQ3JzID0gY3JzLmV4ZWNRdWVyeSgiJHRoaXMiKTsKLSAgICAgICAgICAgIC8vIG5vdCB5ZXQgaW1wbGVtZW50ZWQKLSAgICAgICAgICAgIC8vbW9ycGhlZFN0cmVhbSA9IHJlc0Nycy5uZXdYTUxJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgUmVhZGVyIHJlYWRlciA9IHJlc0Nycy5uZXdSZWFkZXIoKTsKLSAgICAgICAgICAgIHJlYWRlciA9IHJlc0Nycy5uZXdSZWFkZXIoKTsKLSAgICAgICAgICAgIG1vcnBoZWRTdHJlYW0gPSBYTUxJbnB1dFN0cmVhbUZhY3RvcnkubmV3SW5zdGFuY2UoKS4KLSAgICAgICAgICAgICAgICBuZXdJbnB1dFN0cmVhbShyZWFkZXIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLi4uIik7Ci0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgbW9ycGhlZFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB4cHAgPSBtb3JwaGVkU3RyZWFtOwotCi0gICAgICAgIHdoaWxlKCB4cHAuaGFzTmV4dCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgWE1MRXZlbnQgeHBwZXZlbnQgPSB4cHAucGVlaygpOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIGAiICsgeHBwZXZlbnQgKyAiJyIpOyBTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICB4cHBldmVudCA9IHhwcC5uZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByMi5jbG9zZSgpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHByaW50RXJyb3IoWE1MRXZlbnQgeHBwZXZlbnQsIFhNTEV2ZW50IGJhYmVsZXZlbnQpCi0gICAgewotICAgICAgICBTdHJpbmcgc3hwcCA9ICIiK3hwcGV2ZW50OwotICAgICAgICBTdHJpbmcgc2JhYiA9ICIiK2JhYmVsZXZlbnQ7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFUlJPUi0tLS0tIik7Ci0gICAgICAgIGlmKCAhc3hwcC50cmltKCkuZXF1YWxzKHNiYWIudHJpbSgpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigieHBwICAgOmAiICsgc3hwcCArICInIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJiYWJlbCA6YCIgKyBzYmFiICsgIiciKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInhwcCAgIDoiKTsKLSAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpPHN4cHAubGVuZ3RoKCk7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBieXRlIGIgPSAoYnl0ZSlzeHBwLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIyIgKyBiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlxuYmFiZWwgOiIpOwotICAgICAgICAgICAgZm9yKGludCBpPTA7IGk8c2JhYi5sZW5ndGgoKTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ5dGUgYiA9IChieXRlKXNiYWIuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAjIiArIGIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4tLS0tLS0tLS0tIik7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgY29tcGFyZURpcihGaWxlIGRpcikKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoIWRpci5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiY29tcGFyZURpcjogZGlyIG5vdCBhIERpcmVjdG9yeSIpOwotCi0gICAgICAgIEZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKLSAgICAgICAgZm9yKCBpbnQgaT0wOyBpPGZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgY29tcGFyZUZpbGUoZmlsZXNbaV0pOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGNvbXBhcmVQZXJmKEZpbGUgZmlsZSkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbG9uZyBzdGFydDsKLSAgICAgICAgZG91YmxlIHhzdGltZSA9IDA7Ci0gICAgICAgIGRvdWJsZSB4cnRpbWUgPSAwOwotICAgICAgICBkb3VibGUgYmFiZWx0aW1lID0gMDsKLQotICAgICAgICAvL2JhYmVsCi0gICAgICAgIGZvciggaW50IGk9MDsgaTxUSU1FUzsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgUmVhZGVyIHIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKLSAgICAgICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgICAgICAgICBYTUxJbnB1dFN0cmVhbSBiYWJlbCA9IFhNTElucHV0U3RyZWFtRmFjdG9yeS5uZXdJbnN0YW5jZSgpLgotICAgICAgICAgICAgICAgIG5ld0lucHV0U3RyZWFtKHIpOwotICAgICAgICAgICAgd2hpbGUoIGJhYmVsLmhhc05leHQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWE1MRXZlbnQgYmFiZWxldmVudCA9IGJhYmVsLnBlZWsoKTsKLSAgICAgICAgICAgICAgICBiYWJlbGV2ZW50ID0gYmFiZWwubmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmFiZWx0aW1lICs9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7Ci0gICAgICAgICAgICByLmNsb3NlKCk7Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnQoIi4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8veHBwIHdpdGggZGlyZWN0IGFjY2VzIHRvIHRoZSB4cHAgcGFyc2VyCi0gICAgICAgIGZvciggaW50IGk9MDsgaTxUSU1FUzsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgUmVhZGVyIHIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKLSAgICAgICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgICAgICAgICBNWFBhcnNlciB4cHAgPSAoTVhQYXJzZXIpIG5ldyBNWFBhcnNlckNhY2hpbmdTdHJpbmdzKCk7Ci0gICAgICAgICAgICB4cHAuc2V0RmVhdHVyZSggTVhQYXJzZXIuRkVBVFVSRV9QUk9DRVNTX05BTUVTUEFDRVMsIHRydWUpOwotICAgICAgICAgICAgeHBwLnNldElucHV0KCByICk7Ci0gICAgICAgICAgICBpbnQgZXZlbnRUeXBlID0geHBwLmdldEV2ZW50VHlwZSgpOwotICAgICAgICAgICAgd2hpbGUgKCBldmVudFR5cGUgIT0geHBwLkVORF9ET0NVTUVOVCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXZlbnRUeXBlID0geHBwLm5leHRUb2tlbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgeHJ0aW1lICs9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7Ci0gICAgICAgICAgICByLmNsb3NlKCk7Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnQoIiciKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8veHBwIHdpdGggWHBwWG1sU3RyZWFtSW1wbAotICAgICAgICBmb3IoIGludCBpPTA7IGk8VElNRVM7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBuZXcgRmlsZVJlYWRlcihmaWxlKSk7Ci0gICAgICAgICAgICAvL1hNTElucHV0U3RyZWFtIHhwcCA9IG5ldyBYcHBBZGFwdG9yKCkuZ2V0U3RyZWFtKHIyKTsKLSAgICAgICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgICAgICAgICBYTUxJbnB1dFN0cmVhbSB4cHAgPSAoWE1MSW5wdXRTdHJlYW0pIG5ldyBYcHBYbWxTdHJlYW1JbXBsKHIpOwotCi0gICAgICAgICAgICB3aGlsZSggeHBwLmhhc05leHQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWE1MRXZlbnQgeHBwZXZlbnQgPSB4cHAucGVlaygpOwotICAgICAgICAgICAgICAgIHhwcGV2ZW50ID0geHBwLm5leHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhzdGltZSArPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0OwotICAgICAgICAgICAgci5jbG9zZSgpOwotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50KCJgIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBFUkY6ICBiYWJlbC94cHBJUyA9ICIgKyBkZWMoYmFiZWx0aW1lL3hzdGltZSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBcdGJhYmVsL3hwcFJhdyA9ICIgKyBkZWMoYmFiZWx0aW1lL3hydGltZSkgKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGRlYyggZG91YmxlIGYpCi0gICAgewotICAgICAgICByZXR1cm4gIiIgKyAoKGRvdWJsZSlNYXRoLnJvdW5kKGYqMTAwKSkvMTAwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3N0c3NjaGVtYS9zdHMueHNkIGIvdjEvdGVzdC9zcmMvc3Rzc2NoZW1hL3N0cy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYWY3ZjYuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvc3Rzc2NoZW1hL3N0cy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgeG1sbnM6c3RzPSJodHRwOi8vYmVhLmNvbS9pbnRlcm5hbC9zb2FwLXRlc3Qtc2NyaXB0IgotICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9iZWEuY29tL2ludGVybmFsL3NvYXAtdGVzdC1zY3JpcHQiCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICBibG9ja0RlZmF1bHQ9IiNhbGwiPgotICAKLQotPHhzOmVsZW1lbnQgbmFtZT0ic29hcC10ZXN0LXNjcmlwdCI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InN0czpyZXF1ZXN0U3BlYyIvPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJldmVudCIgdHlwZT0ic3RzOmV2ZW50U3BlYyIvPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhbGwiIHR5cGU9InN0czpzZXRPZkV2ZW50cyIvPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRpbWVvdXQiIHR5cGU9InhzOmludCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6Y29tcGxleFR5cGUgbmFtZT0ic2V0T2ZFdmVudHMiPgotICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgIDx4czplbGVtZW50IG5hbWU9ImV2ZW50IiB0eXBlPSJzdHM6ZXZlbnRTcGVjIi8+Ci0gIDwveHM6Y2hvaWNlPgotPC94czpjb21wbGV4VHlwZT4KLQotPHhzOmNvbXBsZXhUeXBlIG5hbWU9InJlcXVlc3RTcGVjIj4KLSAgPHhzOnNlcXVlbmNlPgotICAgIDx4czplbGVtZW50IG5hbWU9InVybCIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic3RhcnQiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY29udGludWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgIDwveHM6Y2hvaWNlPgotICAgIDx4czplbGVtZW50IG5hbWU9InNlbmQiIHR5cGU9InhzOnN0cmluZyIvPgotICAgIDx4czplbGVtZW50IG5hbWU9ImV4cGVjdCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgPC94czpzZXF1ZW5jZT4KLTwveHM6Y29tcGxleFR5cGU+Ci0KLTx4czpjb21wbGV4VHlwZSBuYW1lPSJldmVudFNwZWMiPgotICA8eHM6c2VxdWVuY2U+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImNvbnRpbnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImZpbmlzaCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPC94czpjaG9pY2U+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZXhwZWN0IiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDx4czplbGVtZW50IG5hbWU9InNlbmQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gIDwveHM6c2VxdWVuY2U+Ci08L3hzOmNvbXBsZXhUeXBlPgotCi0KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3Rlc3RzdG9yZS9jb20vYmVhL3Rlc3QvVGVzdC5qYXZhIGIvdjEvdGVzdC9zcmMvdGVzdHN0b3JlL2NvbS9iZWEvdGVzdC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ODhmMjAuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvdGVzdHN0b3JlL2NvbS9iZWEvdGVzdC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBjb20uYmVhLnRlc3Q7Ci0KLWltcG9ydCB3ZWJsb2dpYy54bWwuc2NoZW1hLm1vZGVsLnBhcnNlci5YU0RQYXJzZXJGYWN0b3J5OwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zY2hlbWEubW9kZWwucGFyc2VyLlhTRFBhcnNlcjsKLWltcG9ydCB3ZWJsb2dpYy54bWwuc2NoZW1hLm1vZGVsLlNjaGVtYURvY3VtZW50OwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zY2hlbWEubW9kZWwuWFNEU2NoZW1hOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zY2hlbWEubW9kZWwuWFNERXhjZXB0aW9uOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW1GYWN0b3J5OwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uZXZlbnRzLk5hbWU7Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCB4bWwudXRpbC5TY2hlbWFUeXBlOwotaW1wb3J0IHhtbC51dGlsLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zY2hlbWEuU2NoZW1hVHlwZVN5c3RlbUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zY2hlbWEuU2NoZW1hVHlwZUNvZGVQcmludGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMudG9vbC5Db21tYW5kTGluZTsKLWltcG9ydCBvcmcub3BlbnVyaS5teXRlc3QuU2ltcGxpY2l0eTsKLWltcG9ydCBvcmcub3BlbnVyaS5teXRlc3QuUGVyc29uOwotCi1wdWJsaWMgY2xhc3MgVGVzdAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gICAgewotICAgICAgICAvKgotICAgICAgICBDb21tYW5kTGluZSBjbCA9IG5ldyBDb21tYW5kTGluZShhcmdzLCBudWxsKTsKLSAgICAgICAgWFNEUGFyc2VyIHhzZHBhcnNlciA9IFhTRFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVYU0RQYXJzZXIoKTsKLSAgICAgICAgWE1MSW5wdXRTdHJlYW1GYWN0b3J5IHhtbHBhcnNlciA9IFhNTElucHV0U3RyZWFtRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHNpbXBsZXRlc3QgPSBmYWxzZTsKLQotICAgICAgICBTY2hlbWFUeXBlU3lzdGVtQnVpbGRlciBidWlsZGVyID0gbmV3IFNjaGVtYVR5cGVTeXN0ZW1CdWlsZGVyKCJ0ZXN0Iik7Ci0KLSAgICAgICAgYXJncyA9IGNsLmFyZ3MoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSZWFkZXIgaW5wdXQgPSBuZXcgRmlsZVJlYWRlcihhcmdzW2ldKTsKLSAgICAgICAgICAgICAgICBTY2hlbWFEb2N1bWVudCBzZG9jID0geHNkcGFyc2VyLnBhcnNlU2NoZW1hKHhtbHBhcnNlci5uZXdJbnB1dFN0cmVhbShpbnB1dCkpOwotICAgICAgICAgICAgICAgIFhTRFNjaGVtYSBzID0gc2RvYy5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEFsbENvbXBvbmVudHMocyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBvcGVuaW5nIGZpbGUgIiArIGFyZ3NbaV0gKyAiOlxuIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgcGFyc2luZyBmaWxlICIgKyBhcmdzW2ldICsgIjpcbiIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChYU0RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHBhcnNpbmcgc2NoZW1hIGZpbGUgIiArIGFyZ3NbaV0gKyAiOlxuIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYnVpbGRlci5yZXNvbHZlQWxsVHlwZXMoKTsKLSAgICAgICAgYnVpbGRlci5qYXZhaXplQWxsVHlwZXMoKTsKLQotICAgICAgICAvLyBPSywgaGVyZSB3ZSBnbwotCi0gICAgICAgIFNjaGVtYVR5cGVbXSBndHlwZXMgPSBidWlsZGVyLmdsb2JhbFR5cGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3R5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlIHR5cGUgPSBndHlwZXNbaV07Ci0KLSAgICAgICAgICAgIC8vIHByaW50IG9ubHkgdHlwZXMgaW4gdGhpcyB0eXBlIHN5c3RlbQotICAgICAgICAgICAgaWYgKCF0eXBlLmdldFNjaGVtYVR5cGVTeXN0ZW0oKS5lcXVhbHMoYnVpbGRlcikpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiUHJpbnRpbmcgdHlwZSIpOwotICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVDb2RlUHJpbnRlci5wcmludFR5cGUobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KSwgdHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIklPIEVycm9yICIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAqLwotCi0gICAgICAgIGJvb2xlYW4gc2ltcGxldGVzdCA9IGZhbHNlOwotCi0gICAgICAgIGlmIChzaW1wbGV0ZXN0KQotICAgICAgICB7Ci0gICAgICAgICAgICBUZXN0U3RvcmUgc3RvcmUgPSBuZXcgVGVzdFN0b3JlKG9yZy5vcGVudXJpLm15dGVzdC5TaW1wbGVEb2N1bWVudC50eXBlKTsKLSAgICAgICAgICAgIFRlc3RTdG9yZS5DdXJzb3IgY3Vyc29yID0gc3RvcmUubmV3Q3Vyc29yKCk7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiR290IHN0b3JlLCBmaWxsaW5nIGl0IGluLi4uIik7Ci0gICAgICAgICAgICBjdXJzb3IuYWRkQ2hpbGQobmV3IE5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy9teXRlc3QiLCAic2ltcGxlIikpOwotICAgICAgICAgICAgY3Vyc29yLnRvRmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgY3Vyc29yLnNldEF0dHJpYnV0ZShuZXcgTmFtZShudWxsLCAibm90ZSIpLCAiYSBzbWFsbGlzaCBudW1iZXIiKTsKLSAgICAgICAgICAgIGN1cnNvci5zZXRUZXh0KCIxNDMiKTsKLSAgICAgICAgICAgIGN1cnNvci50b1Jvb3QoKTsKLSAgICAgICAgICAgIGN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIFNpbXBsaWNpdHkgc2ltcCA9IChTaW1wbGljaXR5KWN1cnNvci5vYmooKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVGhlIHZhbHVlIG9mIHNpbXBsaWNpdHk6ICIgKyBzaW1wLmludFZhbHVlKCkpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJBbmQgYSBub3RlOiAiICsgc2ltcC5nZXROb3RlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgVGVzdFN0b3JlIHN0b3JlID0gbmV3IFRlc3RTdG9yZShvcmcub3BlbnVyaS5teXRlc3QuQ3VzdG9tZXJEb2N1bWVudC50eXBlKTsKLSAgICAgICAgICAgIFRlc3RTdG9yZS5DdXJzb3IgY3Vyc29yID0gc3RvcmUubmV3Q3Vyc29yKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkdvdCBzdG9yZSwgZmlsbGluZyBpdCBpbi4uLiIpOwotICAgICAgICAgICAgY3Vyc29yLmFkZENoaWxkKG5ldyBOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IiwgImN1c3RvbWVyIikpOwotICAgICAgICAgICAgY3Vyc29yLnRvRmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgY3Vyc29yLmFkZENoaWxkKG5ldyBOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IiwgImZpcnN0bmFtZSIpKTsKLSAgICAgICAgICAgIGN1cnNvci5hZGRDaGlsZChuZXcgTmFtZSgiaHR0cDovL29wZW51cmkub3JnL215dGVzdCIsICJudW1iZXIiKSk7Ci0gICAgICAgICAgICBjdXJzb3IuYWRkQ2hpbGQobmV3IE5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy9teXRlc3QiLCAibnVtYmVyIikpOwotICAgICAgICAgICAgY3Vyc29yLmFkZENoaWxkKG5ldyBOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IiwgImJpcnRoZGF5IikpOwotICAgICAgICAgICAgY3Vyc29yLmFkZENoaWxkKG5ldyBOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IiwgIm51bWJlciIpKTsKLSAgICAgICAgICAgIGN1cnNvci5hZGRDaGlsZChuZXcgTmFtZSgiaHR0cDovL29wZW51cmkub3JnL215dGVzdCIsICJudW1iZXIiKSk7Ci0gICAgICAgICAgICBjdXJzb3IuYWRkQ2hpbGQobmV3IE5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy9teXRlc3QiLCAiYmlydGhkYXkiKSk7Ci0gICAgICAgICAgICBjdXJzb3IudG9GaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICBjdXJzb3Iuc2V0VGV4dCgiSG93ZHkiKTsKLSAgICAgICAgICAgIGN1cnNvci50b05leHQoKTsKLSAgICAgICAgICAgIGN1cnNvci5zZXRUZXh0KCI0MzYiKTsKLSAgICAgICAgICAgIGN1cnNvci50b05leHQoKTsKLSAgICAgICAgICAgIGN1cnNvci5zZXRUZXh0KCIxMjMiKTsKLSAgICAgICAgICAgIGN1cnNvci50b05leHQoKTsKLSAgICAgICAgICAgIGN1cnNvci5zZXRUZXh0KCIxOTk4LTA4LTI2WiIpOwotICAgICAgICAgICAgY3Vyc29yLnRvTmV4dCgpOwotICAgICAgICAgICAgY3Vyc29yLnNldFRleHQoIjQ0Iik7Ci0gICAgICAgICAgICBjdXJzb3IudG9OZXh0KCk7Ci0gICAgICAgICAgICBjdXJzb3Iuc2V0VGV4dCgiOTMzIik7Ci0gICAgICAgICAgICBjdXJzb3IudG9OZXh0KCk7Ci0gICAgICAgICAgICBjdXJzb3Iuc2V0VGV4dCgiMjAwMC0wOC0wNi0wODowMCIpOwotICAgICAgICAgICAgY3Vyc29yLnRvUm9vdCgpOwotICAgICAgICAgICAgY3Vyc29yLnRvRmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgUGVyc29uIHBlcnNvbiA9IChQZXJzb24pY3Vyc29yLm9iaigpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJQZXJzb24uZ2V0Rmlyc3RuYW1lKCkgPSAiICsgcGVyc29uLmdldEZpcnN0bmFtZSgpKTsKLSAgICAgICAgICAgIGludCBzdW0gPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJzb24uY291bnRPZk51bWJlcigpOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJQZXJzb24uZ2V0TnVtYmVyKCIgKyBpICsiKSA9ICIgKyBwZXJzb24uZ2V0TnVtYmVyKGkpKTsKLSAgICAgICAgICAgICAgICBzdW0gKz0gcGVyc29uLmdldE51bWJlcihpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigic3VtIG9mIG51bWJlcnMgPSAiICsgc3VtKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGVyc29uLmNvdW50T2ZCaXJ0aGRheSgpOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJQZXJzb24uZ2V0QmlydGhkYXkoIiArIGkgKyIpID0gIiArIHBlcnNvbi5nZXRCaXJ0aGRheShpKSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJQZXJzb24ueGdldEJpcnRoZGF5KCIgKyBpICsiKSA9ICIgKyBwZXJzb24ueGdldEJpcnRoZGF5KGkpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlBlcnNvbi54Z2V0QmlydGhkYXkoIiArIGkgKyIpLmdEYXRlVmFsdWUoKS5nZXREYXkoKSA9ICIgKyBwZXJzb24ueGdldEJpcnRoZGF5KGkpLmdEYXRlVmFsdWUoKS5nZXREYXkoKSk7Ci0gICAgICAgICAgICAgICAgc3VtICs9IHBlcnNvbi5nZXROdW1iZXIoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNldHRpbmcgZmlyc3RuYW1lIHRvIEdlb3JnZSIpOwotICAgICAgICAgICAgcGVyc29uLnNldEZpcnN0bmFtZSgiR2VvcmdlIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlBlcnNvbi5nZXRGaXJzdG5hbWUoKSA9ICIgKyBwZXJzb24uZ2V0Rmlyc3RuYW1lKCkpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5mbHVzaCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy90ZXN0c3RvcmUvY29tL2JlYS90ZXN0L1Rlc3RTdG9yZS5qYXZhIGIvdjEvdGVzdC9zcmMvdGVzdHN0b3JlL2NvbS9iZWEvdGVzdC9UZXN0U3RvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlkOWUwYy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy90ZXN0c3RvcmUvY29tL2JlYS90ZXN0L1Rlc3RTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgY29tLmJlYS50ZXN0OwotCi1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMudmFsdWVzLlR5cGVTdG9yZVVzZXJGYWN0b3J5OwotaW1wb3J0IHhtbC51dGlsLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgeG1sLnV0aWwuWG1sT2JqZWN0OwotaW1wb3J0IHhtbC51dGlsLlNjaGVtYVR5cGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGNsYXNzIFRlc3RTdG9yZQotewotICAgIFRlc3RUeXBlU3RvcmUgX3Jvb3Q7Ci0KLSAgICBwdWJsaWMgVGVzdFN0b3JlKFNjaGVtYVR5cGUgcm9vdFR5cGUpCi0gICAgewotICAgICAgICBfcm9vdCA9IG1ha2VSb290U3RvcmUocm9vdFR5cGUpOwotICAgIH0KLQotICAgIEN1cnNvciBuZXdDdXJzb3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDdXJzb3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgQ3Vyc29yCi0gICAgewotICAgICAgICBUZXN0VHlwZVN0b3JlIF9jdXJwb3MgPSBfcm9vdDsKLSAgICAgICAgaW50IF9jdXJJbmRleCA9IDA7Ci0KLSAgICAgICAgcHVibGljIFhtbE9iamVjdCBvYmooKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFhtbE9iamVjdClfY3VycG9zLl91c2VyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzUGFyZW50KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9jdXJwb3MuX3BhcmVudCAhPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gdG9Sb290KCkKLSAgICAgICAgewotICAgICAgICAgICAgX2N1cnBvcyA9IF9yb290OwotICAgICAgICAgICAgX2N1ckluZGV4ID0gMDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gdG9QYXJlbnQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWhhc1BhcmVudCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIF9jdXJwb3MgPSBfY3VycG9zLl9wYXJlbnQ7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2N1cnBvcy5fcGFyZW50ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKF9jdXJJbmRleCArIDEgPCBfY3VycG9zLl9wYXJlbnQuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuc2l6ZSgpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gdG9OZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFoYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgX2N1ckluZGV4Kys7Ci0gICAgICAgICAgICBfY3VycG9zID0gKFRlc3RUeXBlU3RvcmUpX2N1cnBvcy5fcGFyZW50Ll9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLmdldChfY3VySW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiB0b1ByZXYoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWhhc1ByZXYoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBfY3VySW5kZXgtLTsKLSAgICAgICAgICAgIF9jdXJwb3MgPSAoVGVzdFR5cGVTdG9yZSlfY3VycG9zLl9wYXJlbnQuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuZ2V0KF9jdXJJbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXYoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2N1cnBvcy5fcGFyZW50ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKF9jdXJJbmRleCAtIDEgPiAwKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3JlcyAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5zaXplKCkgPiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gdG9GaXJzdENoaWxkKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFoYXNDaGlsZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIF9jdXJJbmRleCA9IDA7Ci0gICAgICAgICAgICBfY3VycG9zID0gKFRlc3RUeXBlU3RvcmUpX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5nZXQoX2N1ckluZGV4KTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gdG9MYXN0Q2hpbGQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWhhc0NoaWxkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgX2N1ckluZGV4ID0gX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5zaXplKCkgLSAxOwotICAgICAgICAgICAgX2N1cnBvcyA9IChUZXN0VHlwZVN0b3JlKV9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuZ2V0KF9jdXJJbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHRvQ2hpbGROYW1lZChYTUxOYW1lIG5hbWUsIGludCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFoYXNDaGlsZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGludCB0YXJnZXRpbmRleCA9IDA7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBzdG9yZSA9IChUZXN0VHlwZVN0b3JlKWkubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHN0b3JlLl9uYW1lLmVxdWFscyhuYW1lKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfY3VySW5kZXggPSB0YXJnZXRpbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jdXJwb3MgPSBzdG9yZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4LS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRhcmdldGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiB0b0NoaWxkQXQoaW50IGluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWhhc0NoaWxkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLnNpemUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBfY3VySW5kZXggPSBpbmRleDsKLSAgICAgICAgICAgIF9jdXJwb3MgPSAoVGVzdFR5cGVTdG9yZSlfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLmdldChpbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkQXQoaW50IGluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWhhc0NoaWxkKCkgfHwgaW5kZXggPCAwIHx8IGluZGV4ID49IF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuc2l6ZSgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIFRlc3RUeXBlU3RvcmUgdGFyZ2V0ID0gKFRlc3RUeXBlU3RvcmUpX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgdGFyZ2V0LmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGluc2VydENoaWxkQXQoaW50IGluZGV4LCBYTUxOYW1lIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgKF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgPT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID4gMCA6IGluZGV4ID4gX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5zaXplKCkpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIF9jdXJwb3MuX3RleHRMZWFmQ29udGVudCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3JlcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLmFkZChpbmRleCwgX2N1cnBvcy5tYWtlTmV3Q2hpbGQobmFtZSwgZmFsc2UpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKFhNTE5hbWUgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgX2N1cnBvcy5fdGV4dExlYWZDb250ZW50ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3JlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuYWRkKF9jdXJwb3MubWFrZU5ld0NoaWxkKG5hbWUsIGZhbHNlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGNvdW50Q2hpbGQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3JlcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgcmV0dXJuIF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoWE1MTmFtZSBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2N1cnBvcy5fY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIFRlc3RUeXBlU3RvcmUgYXR0ciA9IChUZXN0VHlwZVN0b3JlKV9jdXJwb3MuX2NoaWxkQXR0cmlidXRlVHlwZVN0b3Jlcy5nZXQobmFtZSk7Ci0gICAgICAgICAgICBpZiAoYXR0ciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gYXR0ci5fdGV4dExlYWZDb250ZW50OwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gIiIgOiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhckF0dHJpYnV0ZShYTUxOYW1lIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfY3VycG9zLl9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoWE1MTmFtZSBuYW1lLCBTdHJpbmcgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfY3VycG9zLl9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBfY3VycG9zLl9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgICAgICBUZXN0VHlwZVN0b3JlIGF0dHIgPSBfY3VycG9zLm1ha2VOZXdDaGlsZChuYW1lLCB0cnVlKTsKLQotICAgICAgICAgICAgYXR0ci5fdGV4dExlYWZDb250ZW50ID0gdmFsdWU7Ci0gICAgICAgICAgICBfY3VycG9zLl9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMucHV0KG5hbWUsIGF0dHIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHN0b3JlID0gKFRlc3RUeXBlU3RvcmUpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3JlLmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3JlcyA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfY3VycG9zLl90ZXh0TGVhZkNvbnRlbnQgPSB0ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7IC8vIGluIHByYWN0aWNlIHBlcmhhcHMgd2Ugd2FudCB0byBjb25jYXRlbmF0ZSBmbGF0dGVuZWQgc3RyaXBwZWQgdGV4dAotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IF9jdXJwb3MuX3RleHRMZWFmQ29udGVudDsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/ICIiIDogcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgQ3Vyc29yIG5ld0N1cnNvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEN1cnNvciByZXN1bHQgPSBuZXcgQ3Vyc29yKCk7Ci0gICAgICAgICAgICByZXN1bHQuX2N1ckluZGV4ID0gX2N1ckluZGV4OwotICAgICAgICAgICAgcmVzdWx0Ll9jdXJwb3MgPSBfY3VycG9zOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgVGVzdFR5cGVTdG9yZSBtYWtlUm9vdFN0b3JlKFNjaGVtYVR5cGUgcm9vdFR5cGUpCi0gICAgewotICAgICAgICBUZXN0VHlwZVN0b3JlIHJlc3VsdCA9IG5ldyBUZXN0VHlwZVN0b3JlKCk7Ci0gICAgICAgIHJlc3VsdC5fcGFyZW50ID0gbnVsbDsKLSAgICAgICAgcmVzdWx0Ll9uYW1lID0gbnVsbDsKLSAgICAgICAgcmVzdWx0Ll9pc0F0dHJpYnV0ZSA9IGZhbHNlOwotICAgICAgICByZXN1bHQuX3VzZXIgPSAoKFR5cGVTdG9yZVVzZXJGYWN0b3J5KXJvb3RUeXBlKS5jcmVhdGVUeXBlU3RvcmVVc2VyKCk7Ci0gICAgICAgIGlmIChyZXN1bHQuX3VzZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgcmVzdWx0Ll91c2VyLmF0dGFjaF9zdG9yZShyZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3Rlc3RzdG9yZS9jb20vYmVhL3Rlc3QvVGVzdFR5cGVTdG9yZS5qYXZhIGIvdjEvdGVzdC9zcmMvdGVzdHN0b3JlL2NvbS9iZWEvdGVzdC9UZXN0VHlwZVN0b3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OTZhZDAuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvdGVzdHN0b3JlL2NvbS9iZWEvdGVzdC9UZXN0VHlwZVN0b3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBjb20uYmVhLnRlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnZhbHVlcy5UeXBlU3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy52YWx1ZXMuVHlwZVN0b3JlVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnZhbHVlcy5UeXBlU3RvcmVWaXNpdG9yOwotaW1wb3J0IHdlYmxvZ2ljLnhtbC5zdHJlYW0uWE1MTmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCB4bWwudXRpbC5TY2hlbWFUeXBlOwotaW1wb3J0IHhtbC51dGlsLlFOYW1lU2V0OwotaW1wb3J0IHhtbC51dGlsLlhtbEN1cnNvcjsKLQotcHVibGljIGNsYXNzIFRlc3RUeXBlU3RvcmUgaW1wbGVtZW50cyBUeXBlU3RvcmUKLXsKLSAgICBUZXN0VHlwZVN0b3JlIF9wYXJlbnQ7Ci0gICAgVHlwZVN0b3JlVXNlciBfdXNlcjsKLSAgICBYTUxOYW1lIF9uYW1lOwotICAgIGJvb2xlYW4gX2lzQXR0cmlidXRlOwotICAgIGJvb2xlYW4gX2lzTmlsOwotICAgIFN0cmluZyBfdGV4dExlYWZDb250ZW50OwotICAgIExpc3QgX2NoaWxkRWxlbWVudFR5cGVTdG9yZXM7Ci0gICAgTWFwIF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXM7Ci0KLSAgICBwdWJsaWMgWG1sQ3Vyc29yIG5ld19jdXJzb3IoKQotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGVfdGV4dChUeXBlU3RvcmVVc2VyIHVzZXIpCi0gICAgewotICAgICAgICBhc3NlcnQoIWhhc0VsZW1lbnRzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZmV0Y2hfdGV4dChpbnQgd2hpdGVzcGFjZVJ1bGUpCi0gICAgewotICAgICAgICBhc3NlcnQoIWhhc0VsZW1lbnRzKCkpOwotICAgICAgICByZXR1cm4gX3RleHRMZWFmQ29udGVudCA9PSBudWxsID8gIiIgOiBhcHBseV93c3IoX3RleHRMZWFmQ29udGVudCwgd2hpdGVzcGFjZVJ1bGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3JlX3RleHQoVHlwZVN0b3JlVXNlciB1c2VyLCBTdHJpbmcgdGV4dCkKLSAgICB7Ci0gICAgICAgIGFzc2VydCghaGFzRWxlbWVudHMoKSk7Ci0gICAgICAgIF90ZXh0TGVhZkNvbnRlbnQgPSB0ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlcmUgdGhlIFR5cGVTdG9yZSBpcyByZXNwb25zaWJsZSBmb3IgbG9jYXRpbmcgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogVGhpcyBpcyBkb25lIGFzIGZvbGxvd3MKLSAgICAgKiAoMSkgZ28gdG8gdGhlIHBhcmVudCBUeXBlU3RvcmVVc2VyCi0gICAgICogKDIpIGFzayBpdCB0byBnZXRfZGVmYXVsdF9lbGVtZW50X3RleHQocW5hbWUpIChvciBfYXR0cmlidXRlXyksIGFuZCByZXR1cm4gaXQgaWYgbm90IG51bGwuCi0gICAgICogKDIpIG90aGVyd2lzZSwgZ3JhYiBhIG5ldyBUeXBlU3RvcmVVc2VyVmlzaXRvciB2aWEgdiA9IHBhcmVudHVzZXIubmV3X3Zpc2l0b3IoKTsKLSAgICAgKiAoMykgY2FsbCB2LnZpc2l0KG5hbWUpIG9uIF9ldmVyeV8gZWxlbWVudCBxbmFtZSB1cCB0byBhbmQgaW5jbHVkaW5nIHRoaXMgb25lIGluIG9yZGVyCi0gICAgICogKDQpIHJldHVybiB0aGUgcmVzdWx0IG9mIHYuZ2V0X2RlZmF1bHRfdGV4dCgpLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgY29tcHV0ZV9kZWZhdWx0X3RleHQoKQotICAgIHsKLSAgICAgICAgaWYgKF9wYXJlbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgU3RyaW5nIGRlZnRleHQgPQotICAgICAgICAgICAgX2lzQXR0cmlidXRlID8gX3BhcmVudC5fdXNlci5nZXRfZGVmYXVsdF9hdHRyaWJ1dGVfdGV4dChfbmFtZSkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgX3BhcmVudC5fdXNlci5nZXRfZGVmYXVsdF9lbGVtZW50X3RleHQoX25hbWUpOwotICAgICAgICBpZiAoZGVmdGV4dCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlU3RvcmVWaXNpdG9yIHZpc2l0b3IgPSBfcGFyZW50Ll91c2VyLm5ld192aXNpdG9yKCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfcGFyZW50Ll9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBzaWJsaW5nID0gKFRlc3RUeXBlU3RvcmUpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdChzaWJsaW5nLl9uYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoc2libGluZyA9PSB0aGlzKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXRvci5nZXRfZGVmYXVsdF90ZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnQoZmFsc2UpIDogIkludmFyaWFudCBlcnJvcjogcGFyZW50IGRvZXNuJ3QgaGF2ZSB0aGlzIGFzIGNoaWxkLiI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlZnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBjb21wdXRlX2VsZW1lbnRmbGFncygpCi0gICAgewotICAgICAgICBpZiAoX3BhcmVudCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGludCBmbGFnczsKLSAgICAgICAgaWYgKF9pc0F0dHJpYnV0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgZmxhZ3MgPSBfcGFyZW50Ll91c2VyLmdldF9hdHRyaWJ1dGVmbGFncyhfbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmbGFncyA9IF9wYXJlbnQuX3VzZXIuZ2V0X2VsZW1lbnRmbGFncyhfbmFtZSk7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgPT0gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVHlwZVN0b3JlVmlzaXRvciB2aXNpdG9yID0gX3BhcmVudC5fdXNlci5uZXdfdmlzaXRvcigpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9wYXJlbnQuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFRlc3RUeXBlU3RvcmUgc2libGluZyA9IChUZXN0VHlwZVN0b3JlKWkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICB2aXNpdG9yLnZpc2l0KHNpYmxpbmcuX25hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZyA9PSB0aGlzKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3IuZ2V0X2VsZW1lbnRmbGFncygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpIDogIkludmFyaWFudCBlcnJvcjogcGFyZW50IGRvZXNuJ3QgaGF2ZSB0aGlzIGFzIGNoaWxkLiI7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmbGFnczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlX25pbChUeXBlU3RvcmVVc2VyIHVzZXIpCi0gICAgewotICAgICAgICAvLyB0aGlzIGNvdWxkIGJlIGRvbmUgbGF0ZXIKLSAgICAgICAgX2lzTmlsID0gX3VzZXIuYnVpbGRfbmlsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZmluZF9uaWwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9pc05pbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGZpbmRfcHJlZml4X2Zvcl9uc3VyaShTdHJpbmcgbnN1cmksIFN0cmluZyBzdWdnZXN0ZWRfcHJlZml4KQotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoZSB0ZXN0IGhhcm5lc3MgaGFzIG5vIG5hbWVzcGFjZSBzdXBwb3J0Iik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBjb3VudF9lbGVtZW50cyhYTUxOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBpbnQgY291bnQgPSAwOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoKFRlc3RUeXBlU3RvcmUpaS5uZXh0KCkpLl9uYW1lLmVxdWFscyhuYW1lKSkKLSAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvdW50OwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGZpbmRfZWxlbWVudF91c2VyKFhNTE5hbWUgbmFtZSwgaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBzdG9yZSA9IChUZXN0VHlwZVN0b3JlKWkubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoc3RvcmUuX25hbWUuZXF1YWxzKG5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuX3VzZXI7Ci0gICAgICAgICAgICAgICAgaW5kZXgtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOyAvLyBubyBleGNlcHRpb24gcGxlYXNlCi0gICAgfQotCi0gICAgcHVibGljIFR5cGVTdG9yZVVzZXIgaW5zZXJ0X2VsZW1lbnRfdXNlcihYTUxOYW1lIG5hbWUsIGludCBpbmRleCkKLSAgICB7Ci0gICAgICAgIFR5cGVTdG9yZVVzZXIgdGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgaW50IGluc2VydGluZGV4ID0gMDsKLQotICAgICAgICBpZiAoX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbGFzdGZvdW5kYXQgPSAwOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRlc3RUeXBlU3RvcmUgc3RvcmUgPSAoVGVzdFR5cGVTdG9yZSlpLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChzdG9yZS5fbmFtZS5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsYXN0Zm91bmRhdCA9IGluc2VydGluZGV4OwotICAgICAgICAgICAgICAgICAgICBpbmRleC0tOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluc2VydGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gZm91bmQgb25lOyBpbnNlcnQgcmlnaHQgYmVmb3JlCi0gICAgICAgICAgICAgICAgaW5zZXJ0aW5kZXggPSBsYXN0Zm91bmRhdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGluZGV4ID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBzZXZlcmFsOyB0aGF0J3MgaWxsZWdhbC4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gZm91bmQgYWxsIGJ1dCBsYXN0IG9uZTogd2UgbXVzdCBiZSBhcHBlbmRpbmcuCi0gICAgICAgICAgICAgICAgLy8gYnV0IHdoZXJlIHRvIGFwcGVuZD8KLQotICAgICAgICAgICAgICAgIFFOYW1lU2V0IGRlbGltaXRlcnMgPSBfcGFyZW50Ll91c2VyLmdldF9lbGVtZW50X2VuZGluZ19kZWxpbWl0ZXJzKG5hbWUpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnNlcnRpbmRleCA9IGxhc3Rmb3VuZGF0ICsgMTsgaW5zZXJ0aW5kZXggPCBfY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5zaXplKCk7IGluc2VydGluZGV4KyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHN0b3JlID0gKFRlc3RUeXBlU3RvcmUpX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuZ2V0KGluc2VydGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGltaXRlcnMuY29udGFpbnMoc3RvcmUuX25hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGluc2VydGluZGV4IGlzIHdoZXJldmVyIHRoZSBmaXJzdCBkZWxpbWl0ZXIgaXMgZm91bmQKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiBub3QgZm91bmQsIGluc2VydGluZGV4IGlzIG9uZSBwYXN0IHRoZSBlbmQuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBUZXN0VHlwZVN0b3JlIG5ld0NoaWxkID0gbWFrZU5ld0NoaWxkKG5hbWUsIGZhbHNlKTsKLSAgICAgICAgX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuYWRkKGluc2VydGluZGV4LCBuZXdDaGlsZCk7Ci0gICAgICAgIHJldHVybiBuZXdDaGlsZC5fdXNlcjsKLSAgICB9Ci0KLSAgICBUZXN0VHlwZVN0b3JlIG1ha2VOZXdDaGlsZChYTUxOYW1lIG5hbWUsIGJvb2xlYW4gaXNBdHRyaWJ1dGUpCi0gICAgewotICAgICAgICBUZXN0VHlwZVN0b3JlIHJlc3VsdCA9IG5ldyBUZXN0VHlwZVN0b3JlKCk7Ci0gICAgICAgIHJlc3VsdC5fcGFyZW50ID0gdGhpczsKLSAgICAgICAgcmVzdWx0Ll9uYW1lID0gbmFtZTsKLSAgICAgICAgcmVzdWx0Ll9pc0F0dHJpYnV0ZSA9IGlzQXR0cmlidXRlOwotICAgICAgICBpZiAoaXNBdHRyaWJ1dGUpCi0gICAgICAgICAgICByZXN1bHQuX3VzZXIgPSBfdXNlci5jcmVhdGVfYXR0cmlidXRlX3VzZXIobmFtZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlc3VsdC5fdXNlciA9IF91c2VyLmNyZWF0ZV9lbGVtZW50X3VzZXIobmFtZSwgbnVsbCk7IC8vIG5vIHhzaTp0eXBlcyBmb3Igbm93Ci0gICAgICAgIGlmIChyZXN1bHQuX3VzZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgcmVzdWx0Ll91c2VyLmF0dGFjaF9zdG9yZShyZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHZvaWQgZGlzY29ubmVjdCgpCi0gICAgewotICAgICAgICBpZiAoX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHN0b3JlID0gKFRlc3RUeXBlU3RvcmUpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgc3RvcmUuZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzID0gbnVsbDsKLSAgICAgICAgaWYgKF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2NoaWxkQXR0cmlidXRlVHlwZVN0b3Jlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRlc3RUeXBlU3RvcmUgc3RvcmUgPSAoVGVzdFR5cGVTdG9yZSlpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzdG9yZS5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgX2NoaWxkQXR0cmlidXRlVHlwZVN0b3JlcyA9IG51bGw7Ci0gICAgICAgIF91c2VyLmRpc2Nvbm5lY3Rfc3RvcmUoKTsKLSAgICAgICAgX3VzZXIgPSBudWxsOwotICAgICAgICBfcGFyZW50ID0gbnVsbDsKLSAgICAgICAgX25hbWUgPSBudWxsOwotICAgICAgICBfdGV4dExlYWZDb250ZW50ID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGZpbmRJbnNlcnRJbmRleEJhc2VkT25PcmRlcihYTUxOYW1lW10gb3JkZXIsIFhNTE5hbWUgbmFtZVRvQWRkKQotICAgIHsKLSAgICAgICAgaW50IG9yZGVyaW5kZXggPSAwOwotICAgICAgICBpbnQgaW5zZXJ0aW5kZXggPSAwOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRlc3RUeXBlU3RvcmUgc3RvcmUgPSAoVGVzdFR5cGVTdG9yZSlpLm5leHQoKTsKLSAgICAgICAgICAgIHdoaWxlIChvcmRlcmluZGV4IDwgb3JkZXIubGVuZ3RoICYmICFvcmRlcltvcmRlcmluZGV4XS5lcXVhbHMoc3RvcmUuX25hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChvcmRlcltvcmRlcmluZGV4XS5lcXVhbHMobmFtZVRvQWRkKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRpbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3JkZXJpbmRleCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5zZXJ0aW5kZXgrKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5zZXJ0aW5kZXg7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVTdG9yZVVzZXIgYWRkX2VsZW1lbnRfdXNlcihYTUxOYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gaW5zZXJ0X2VsZW1lbnRfdXNlcihuYW1lLCBjb3VudF9lbGVtZW50cyhuYW1lKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlX2VsZW1lbnQoWE1MTmFtZSBuYW1lLCBpbnQgaW5kZXgpCi0gICAgewotICAgICAgICBUeXBlU3RvcmVVc2VyIHRhcmdldCA9IG51bGw7Ci0gICAgICAgIGludCByZW1vdmVpbmRleCA9IDA7Ci0gICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHN0b3JlID0gKFRlc3RUeXBlU3RvcmUpaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9yZS5fbmFtZS5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5yZW1vdmUocmVtb3ZlaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4LS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZW1vdmVpbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGZpbmRfYXR0cmlidXRlX3VzZXIoWE1MTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFRlc3RUeXBlU3RvcmUgc3RvcmUgPSAoVGVzdFR5cGVTdG9yZSlfY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHN0b3JlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gc3RvcmUuX3VzZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVTdG9yZVVzZXIgYWRkX2F0dHJpYnV0ZV91c2VyKFhNTE5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChfY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzICE9IG51bGwgJiYgX2NoaWxkQXR0cmlidXRlVHlwZVN0b3Jlcy5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotICAgICAgICBpZiAoX2NoaWxkQXR0cmlidXRlVHlwZVN0b3JlcyA9PSBudWxsKQotICAgICAgICAgICAgX2NoaWxkQXR0cmlidXRlVHlwZVN0b3JlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgVGVzdFR5cGVTdG9yZSBuZXdDaGlsZCA9IG1ha2VOZXdDaGlsZChuYW1lLCB0cnVlKTsKLSAgICAgICAgX2NoaWxkQXR0cmlidXRlVHlwZVN0b3Jlcy5wdXQobmFtZSwgbmV3Q2hpbGQpOwotICAgICAgICByZXR1cm4gbmV3Q2hpbGQuX3VzZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlX2F0dHJpYnV0ZShYTUxOYW1lIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoX2NoaWxkQXR0cmlidXRlVHlwZVN0b3JlcyA9PSBudWxsIHx8ICFfY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICBfY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzLnJlbW92ZShuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdF9lbGVtZW50cyhUeXBlU3RvcmVWaXNpdG9yIHZpc2l0b3IpCi0gICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHN0b3JlID0gKFRlc3RUeXBlU3RvcmUpaS5uZXh0KCk7Ci0gICAgICAgICAgICB2aXNpdG9yLnZpc2l0KHN0b3JlLl9uYW1lKTsKLSAgICAgICAgfQotICAgICAgICB2aXNpdG9yLnZpc2l0KG51bGwpOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0VsZW1lbnRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY2hpbGRFbGVtZW50VHlwZVN0b3JlcyAhPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBhbGdvcml0aG0gdXNlZCBieSBhcHBseV93c2Nhbm9uOiBzb21ldGltZXMgdXNlZCBpbiBpbXBscy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBhcHBseV93c3IoU3RyaW5nIHYsIGludCB3c3IpCi0gICAgewotICAgICAgICBpZiAod3NyID09IFNjaGVtYVR5cGUuV1NfUFJFU0VSVkUgfHwgd3NyID09IFNjaGVtYVR5cGUuV1NfVU5TUEVDSUZJRUQpCi0gICAgICAgICAgICByZXR1cm4gdjsKLQotICAgICAgICBpZiAodi5pbmRleE9mKCdcbicpID49IDApCi0gICAgICAgICAgICB2ID0gdi5yZXBsYWNlKCdcbicsICcgJyk7Ci0gICAgICAgIGlmICh2LmluZGV4T2YoJ1x0JykgPj0gMCkKLSAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UoJ1x0JywgJyAnKTsKLSAgICAgICAgaWYgKHYuaW5kZXhPZignXHInKSA+PSAwKQotICAgICAgICAgICAgdiA9IHYucmVwbGFjZSgnXHInLCAnICcpOwotCi0gICAgICAgIGlmICh3c3IgPT0gU2NoZW1hVHlwZS5XU19SRVBMQUNFKQotICAgICAgICAgICAgcmV0dXJuIHY7Ci0KLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICBpbnQgbGVuID0gdi5sZW5ndGgoKTsKLSAgICAgICAgaWYgKGxlbiA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIHY7Ci0KLSAgICAgICAgLyogYSB0cmljazogZXhhbWluZSBldmVyeSBvdGhlciBjaGFyYWN0ZXIgbG9va2luZyBmb3IgcGFpcnMgb2Ygc3BhY2VzICovCi0gICAgICAgIGV4YW1pbmU6IGlmICh2LmNoYXJBdCgwKSAhPSAnICcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDI7IGogPCBsZW47IGogKz0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodi5jaGFyQXQoaikgPT0gJyAnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHYuY2hhckF0KGogLSAxKSA9PSAnICcpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBleGFtaW5lOwotICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSBsZW4gLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgZXhhbWluZTsKLSAgICAgICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgICAgICAgICBpZiAodi5jaGFyQXQoaikgPT0gJyAnKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgZXhhbWluZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaiA9PSBsZW4gJiYgdi5jaGFyQXQoaiAtIDEpID09ICcgJykKLSAgICAgICAgICAgICAgICBicmVhayBleGFtaW5lOwotICAgICAgICAgICAgcmV0dXJuIHY7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBqIGlzIHBvaW50aW5nIGF0IHRoZSBmaXJzdCB3cyB0byBiZSByZW1vdmVkLCBvciBwYXN0IGVuZCAqLwotICAgICAgICBjaGFyW10gY2ggPSB2LnRvQ2hhckFycmF5KCk7Ci0gICAgICAgIGludCBpID0gajsKLQotICAgICAgICBzaGlmdGVyOiBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGogd2FzIHdzIG9yIHBhc3QgZW5kICovCi0gICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgICAgIGlmIChqID49IGxlbikKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2hpZnRlcjsKLSAgICAgICAgICAgICAgICBpZiAoaiAhPSAnICcpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yICg7OykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBqIHdhcyBub253cyAqLwotICAgICAgICAgICAgICAgIGNoW2krK10gPSBjaFtqKytdOwotICAgICAgICAgICAgICAgIGlmIChqID49IGxlbikKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2hpZnRlcjsKLSAgICAgICAgICAgICAgICBpZiAoY2hbal0gPT0gJyAnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hbaSsrXSA9IGNoW2orK107Ci0gICAgICAgICAgICAgICAgICAgIGlmIChqID49IGxlbikKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNoaWZ0ZXI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaFtqXSA9PSAnICcpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhjaCwgMCwgKGkgPT0gMCB8fCBjaFtpIC0gMV0gIT0gJyAnKSA/IGkgOiBpIC0gMSk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3VubWFyc2hhbC9jb20vYmVhL3Rlc3QvVGVzdFN0cnVjdHVyZS5qYXZhIGIvdjEvdGVzdC9zcmMvdW5tYXJzaGFsL2NvbS9iZWEvdGVzdC9UZXN0U3RydWN0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMWU1NTIuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMvdW5tYXJzaGFsL2NvbS9iZWEvdGVzdC9UZXN0U3RydWN0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0qCi0qCi0qIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotKiByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotKiBhcmUgbWV0OgotKgotKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotKgotKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotKiAgICBkaXN0cmlidXRpb24uCi0qCi0qIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0qICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotKgotKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAKLSogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0qICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0qCi0qIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUgCi0qICAgIFhNTEJlYW5zIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciAKLSogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0qIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0qIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0qIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSogU1VDSCBEQU1BR0UuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0qIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zIAotKiBJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0qLwotCi1wYWNrYWdlIGNvbS5iZWEudGVzdDsKLQotcHVibGljIGNsYXNzIFRlc3RTdHJ1Y3R1cmUKLXsKLSAgICBwdWJsaWMgaW50IHZhckludDsKLSAgICBwdWJsaWMgZmxvYXQgdmFyRmxvYXQ7Ci0gICAgcHVibGljIFN0cmluZyB2YXJTdHJpbmc7Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy91bm1hcnNoYWwvY29tL2JlYS90ZXN0L1VubWFyc2hhbC5qYXZhIGIvdjEvdGVzdC9zcmMvdW5tYXJzaGFsL2NvbS9iZWEvdGVzdC9Vbm1hcnNoYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwOTY5YS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy91bm1hcnNoYWwvY29tL2JlYS90ZXN0L1VubWFyc2hhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0qIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSoKLSoKLSogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0qIHJlc2VydmVkLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qCi0qIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0qICAgIGRpc3RyaWJ1dGlvbi4KLSoKLSogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0qICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0qICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0qICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0qCi0qIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0IAotKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSoKLSogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSAKLSogICAgWE1MQmVhbnMiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIAotKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0qIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0qIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0qIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0qIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotKiBTVUNIIERBTUFHRS4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0qIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCi0qIEluYy4sIDxodHRwOi8vd3d3LmJlYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSovCi0KLXBhY2thZ2UgY29tLmJlYS50ZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy51bm1hcnNoYWwuTWVzc2FnZVBsYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy51bm1hcnNoYWwuVW5tYXJzaGFsUGxhbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnVubWFyc2hhbC5TaW1wbGVUeXBlUGxhbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnVubWFyc2hhbC5TdHJ1Y3R1cmVQbGFuOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMudW5tYXJzaGFsLlVubWFyc2hhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgd2VibG9naWMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFVubWFyc2hhbAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE1lc3NhZ2VQbGFuIG1lc3NhZ2VQbGFuID0gbmV3IE1lc3NhZ2VQbGFuKDIpOwotCi0gICAgICAgIFNpbXBsZVR5cGVQbGFuIHBhcmFtMVBsYW4gPSBuZXcgU2ltcGxlVHlwZVBsYW4oU2ltcGxlVHlwZVBsYW4uSkFWQV9GTE9BVCwgdHJ1ZSwgU2NoZW1hVHlwZS5CVENfRE9VQkxFLCBudWxsLCAwKTsKLQotICAgICAgICBTdHJ1Y3R1cmVQbGFuIHBhcmFtMlBsYW4gPSBuZXcgU3RydWN0dXJlUGxhbigpOwotCi0gICAgICAgIHBhcmFtMlBsYW4uc2V0VGFyZ2V0Q2xhc3MoY29tLmJlYS50ZXN0LlRlc3RTdHJ1Y3R1cmUuY2xhc3MpOwotICAgICAgICBwYXJhbTJQbGFuLnNldEluZm9Gb3JFbGVtZW50KG5ldyBRTmFtZSgidmFySW50IiksIG5ldyBTdHJ1Y3R1cmVQbGFuLkZpZWxkSW5mbygidmFySW50IiwgZmFsc2UsICJjb20uYmVhLnRlc3QuVGVzdFN0cnVjdHVyZSIsIG51bGwsIFN0cnVjdHVyZVBsYW4uRmllbGRJbmZvLlNJTkdMRVRPTiwgbmV3IFNpbXBsZVR5cGVQbGFuKFNpbXBsZVR5cGVQbGFuLkpBVkFfSU5ULCB0cnVlLCBTY2hlbWFUeXBlLkJUQ19JTlRFR0VSLCBudWxsLCAwKSkpOwotICAgICAgICBwYXJhbTJQbGFuLnNldEluZm9Gb3JFbGVtZW50KG5ldyBRTmFtZSgidmFyRmxvYXQiKSwgbmV3IFN0cnVjdHVyZVBsYW4uRmllbGRJbmZvKCJ2YXJGbG9hdCIsIGZhbHNlLCAiY29tLmJlYS50ZXN0LlRlc3RTdHJ1Y3R1cmUiLCBudWxsLCBTdHJ1Y3R1cmVQbGFuLkZpZWxkSW5mby5TSU5HTEVUT04sIG5ldyBTaW1wbGVUeXBlUGxhbihTaW1wbGVUeXBlUGxhbi5KQVZBX0ZMT0FULCB0cnVlLCBTY2hlbWFUeXBlLkJUQ19GTE9BVCwgbnVsbCwgMCkpKTsKLSAgICAgICAgcGFyYW0yUGxhbi5zZXRJbmZvRm9yRWxlbWVudChuZXcgUU5hbWUoInZhclN0cmluZyIpLCBuZXcgU3RydWN0dXJlUGxhbi5GaWVsZEluZm8oInZhclN0cmluZyIsIGZhbHNlLCAiY29tLmJlYS50ZXN0LlRlc3RTdHJ1Y3R1cmUiLCBudWxsLCBTdHJ1Y3R1cmVQbGFuLkZpZWxkSW5mby5TSU5HTEVUT04sIG5ldyBTaW1wbGVUeXBlUGxhbihTaW1wbGVUeXBlUGxhbi5KQVZBX1NUUklORywgZmFsc2UsIFNjaGVtYVR5cGUuQlRDX1NUUklORywgbnVsbCwgMCkpKTsKLQotICAgICAgICBtZXNzYWdlUGxhbi5zZXRJbmZvRm9yRWxlbWVudChuZXcgUU5hbWUoIkxhc3RUcmFkZVByaWNlIiksIG5ldyBNZXNzYWdlUGxhbi5QYXJhbUluZm8oMCwgTWVzc2FnZVBsYW4uUGFyYW1JbmZvLlNJTkdMRVRPTiwgcGFyYW0xUGxhbikpOwotICAgICAgICBtZXNzYWdlUGxhbi5zZXRJbmZvRm9yRWxlbWVudChuZXcgUU5hbWUoImlucHV0U3RydWN0IiksIG5ldyBNZXNzYWdlUGxhbi5QYXJhbUluZm8oMSwgTWVzc2FnZVBsYW4uUGFyYW1JbmZvLlNJTkdMRVRPTiwgcGFyYW0yUGxhbikpOwotCi0gICAgICAgIFhtbE9iamVjdCB4b2JqID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UobmV3IEZpbGUoYXJnc1swXSkpOwotICAgICAgICBYTUxJbnB1dFN0cmVhbSB4aW5wdXQgPSB4b2JqLm5ld1hNTElucHV0U3RyZWFtKCk7Ci0gICAgICAgIHdoaWxlICh4aW5wdXQuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoeGlucHV0LnBlZWsoKS5pc1N0YXJ0RWxlbWVudCgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgeGlucHV0LnNraXAoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVubWFyc2hhbENvbnRleHQgY29udGV4dCA9IG5ldyBVbm1hcnNoYWxDb250ZXh0KCk7Ci0gICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IChPYmplY3RbXSltZXNzYWdlUGxhbi51bm1hcnNoYWwoeGlucHV0LCBjb250ZXh0KTsKLSAgICAgICAgY29udGV4dC5jb21wbGV0ZSgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3VsdCAiICsgaSArICIgPSAiICsgcmVzdWx0W2ldKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHRbaV0gaW5zdGFuY2VvZiBUZXN0U3RydWN0dXJlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRlc3RTdHJ1Y3R1cmUgcyA9IChUZXN0U3RydWN0dXJlKXJlc3VsdFtpXTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgdmFySW50ID0gIiArIHMudmFySW50KTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgdmFyRmxvYXQgPSAiICsgcy52YXJGbG9hdCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIHZhclN0cmluZyA9ICIgKyBzLnZhclN0cmluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy94bWxwYWQvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3htbHBhZC9YbWxQYWQuamF2YSBiL3YxL3Rlc3Qvc3JjL3htbHBhZC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwveG1scGFkL1htbFBhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWMyYTFiLi4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3htbHBhZC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwveG1scGFkL1htbFBhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotKgotKgotKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSogcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSogYXJlIG1ldDoKLSoKLSogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSoKLSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0qICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0qICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSoKLSogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgCi0qICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0qICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotKgotKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIAotKiAgICBYTUxCZWFucyIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3IgCi0qICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0qIFNVQ0ggREFNQUdFLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBCRUEgU3lzdGVtcyAKLSogSW5jLiwgPGh0dHA6Ly93d3cuYmVhLmNvbS8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwueG1scGFkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlJvb3Q7Ci0KLXB1YmxpYyBjbGFzcyBYbWxQYWQKLXsKLSAgICBzdGF0aWMgcHVibGljIHZvaWQgbWFpbiAoIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGkgdGhlcmUhIiApOwotCi0gICAgICAgIG5ldyBYbWxQYWQoKS5ydW4oKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJ1biAoICkKLSAgICB7Ci0vLyAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKCBTeXN0ZW0uaW4ucmVhZCgpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy94c3R5cGVzL2RlZmF1bHQueHNkIGIvdjEvdGVzdC9zcmMveHN0eXBlcy9kZWZhdWx0LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRlOGFlNS4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy94c3R5cGVzL2RlZmF1bHQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCi0gIDx4czplbGVtZW50IG5hbWU9InZhbGlkRWxlbURlZmF1bHQiICAgdHlwZT0ieHM6aW50IiBkZWZhdWx0PSIxIi8+Ci08IS0tIEJBVTogd2UgY2FuJ3QgY29tcGlsZSBhbnkgbW9yZSBiZWNhdXNlIGl0J3MgaW52YWxpZAotICA8eHM6ZWxlbWVudCBuYW1lPSJpbnZhbGlkRWxlbURlZmF1bHQiIHR5cGU9InhzOmludCIgZGVmYXVsdD0iYSIvPgotLS0+Ci0gIDx4czplbGVtZW50IG5hbWU9InZhbGlkRWxlbUZpeGVkIiAgICAgdHlwZT0ieHM6aW50IiBmaXhlZD0iMiIvPgotPCEtLSBCQVU6IHdlIGNhbid0IGNvbXBpbGUgYW55IG1vcmUgYmVjYXVzZSBpdCdzIGludmFsaWQKLSAgPHhzOmVsZW1lbnQgbmFtZT0iaW52YWxpZEVsZW1GaXhlZCIgICB0eXBlPSJ4czppbnQiIGZpeGVkPSJiIi8+Ci0tLT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ2YWxpZEF0dHJEZWZhdWx0Ij4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImF0dHIiIHR5cGU9InhzOmludCIgZGVmYXVsdD0iMyIvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotPCEtLSBCQVU6IHdlIGNhbid0IGNvbXBpbGUgYW55IG1vcmUgYmVjYXVzZSBpdCdzIGludmFsaWQKLSAgPHhzOmVsZW1lbnQgbmFtZT0iaW52YWxpZEF0dHJEZWZhdWx0Ij4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImF0dHIiIHR5cGU9InhzOmludCIgZGVmYXVsdD0iYyIvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLS0tPgotCi0gIDx4czplbGVtZW50IG5hbWU9InZhbGlkQXR0ckZpeGVkIj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFyaWN0dHIiIHR5cGU9InhzOmludCIgZml4ZWQ9IjQiLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLTwhLS0gQkFVOiB3ZSBjYW4ndCBjb21waWxlIGFueSBtb3JlIGJlY2F1c2UgaXQncyBpbnZhbGlkCi0gIDx4czplbGVtZW50IG5hbWU9ImludmFsaWRBdHRyRml4ZWQiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0ciIgdHlwZT0ieHM6aW50IiBmaXhlZD0iZCIvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLS0tPiAgICAKLSAgPCEtLSB0eXBlcyB0byBoZWxwIHRlc3QgbmlsIC0tPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImNhbkJlTmlsIiBuaWxsYWJsZT0idHJ1ZSI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy94c3R5cGVzL3BlcnNvbi54c2QgYi92MS90ZXN0L3NyYy94c3R5cGVzL3BlcnNvbi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OWM2MzIuLjAwMDAwMDAKLS0tIGEvdjEvdGVzdC9zcmMveHN0eXBlcy9wZXJzb24ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLTx4czpzY2hlbWEKLSAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgIHhtbG5zOm10PSJodHRwOi8vb3BlbnVyaS5vcmcveHN0eXBlcy90ZXN0IgotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcveHN0eXBlcy90ZXN0IgotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiID4KLQotICA8eHM6bm90YXRpb24gbmFtZT0ianBlZyIgcHVibGljPSJKUEVHIiAvPgotICA8eHM6bm90YXRpb24gbmFtZT0iZ2lmIiBwdWJsaWM9IkdJRiIgLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0icGVyc29uIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJmaXJzdG5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgPHhzOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9Im51bWJlciI+Ci0gICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnRlZ2VyIj4KLSAgICAgICAgICAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjEwMDAiLz4KLSAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYmlydGhkYXkiIHR5cGU9InhzOmRhdGUiLz4KLSAgICAgICAgPCEtLSB0ZXN0IHRoYXQgaW50LXZhbHVlIGRvZXMgbm90IGNvbGxpZGUgd2l0aCBnZXRJbnRWYWx1ZSgpIG9uIFNpbXBsZVZhbHVlIC0tPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbnQtdmFsdWUiIHR5cGU9InhzOmludCIvPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJoZXgiIHR5cGU9InhzOmhleEJpbmFyeSIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYmFzZTY0IiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImFueXVyaSIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJxbmFtZSIgdHlwZT0ieHM6UU5hbWUiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9Im5vdGF0aW9uIj4KLSAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5PVEFUSU9OIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ianBlZyIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZ2lmIiAvPgotICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgIDwveHM6ZWxlbWVudD4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ2VuZGVyIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0gICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJtYWxlIi8+Ci0gICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJmZW1hbGUiLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImhleEF0dCI+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmhleEJpbmFyeSI+Ci0gICAgICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IihbNDVdWzAtOUEtRl0pKiIvPgotICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJiYXNlNjRBdHQiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpiYXNlNjRCaW5hcnkiPgotICAgICAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIvPgotICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVkdocGN5QnpkSEpwYm1jZ2FYTWdZbUZ6WlRZMFFtbHVZWEo1SUdWdVkyOWtaV1FoIi8+Ci0gICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFueXVyaUF0dCI+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVVSSSI+Ci0gICAgICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIi8+Ci0gICAgICAgICAgPHhzOmxlbmd0aCB2YWx1ZT0iMTAwIi8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJxbmFtZUF0dCI+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOlFOYW1lIj4KLSAgICAgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6YXR0cmlidXRlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibm90YXRpb25BdHQiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOT1RBVElPTiI+Ci0gICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJqcGVnIi8+Ci0gICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJnaWYiLz4KLSAgICAgICAgICA8eHM6bGVuZ3RoIHZhbHVlPSIyMCIvPgotICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iY3VzdG9tZXIiIHR5cGU9Im10OnBlcnNvbiIvPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImVtcGxveWVlIj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ibXQ6cGVyc29uIj4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJlaWQiIHR5cGU9InhzOmludCIvPgotICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLTwveHM6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy94c3R5cGVzL3NldHRlcnMueHNkIGIvdjEvdGVzdC9zcmMveHN0eXBlcy9zZXR0ZXJzLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE1NWNkNy4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy94c3R5cGVzL3NldHRlcnMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgeG1sbnM6dG5zPSJzZXR0ZXJzIiB0YXJnZXROYW1lc3BhY2U9InNldHRlcnMiCi0gICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiPgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3hzdHlwZXMvc2ltcGxlYy54c2QgYi92MS90ZXN0L3NyYy94c3R5cGVzL3NpbXBsZWMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzA3NmE5Li4wMDAwMDAwCi0tLSBhL3YxL3Rlc3Qvc3JjL3hzdHlwZXMvc2ltcGxlYy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczptdD0iaHR0cDovL29wZW51cmkub3JnL215dGVzdCIKLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL215dGVzdCIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaW1wbGljaXR5Ij4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJtdDp0aG91c2FuZCI+Ci0gICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJub3RlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InRob3VzYW5kIj4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnRlZ2VyIj4KLSAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iMSIvPgotICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIxMDAwIi8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlIiB0eXBlPSJtdDpzaW1wbGljaXR5Ii8+Ci0KLTwveHM6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy94c3R5cGVzL3hzdHlwZXMueG1sIGIvdjEvdGVzdC9zcmMveHN0eXBlcy94c3R5cGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQzMGI4OC4uMDAwMDAwMAotLS0gYS92MS90ZXN0L3NyYy94c3R5cGVzL3hzdHlwZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nSVNPLTg4NTktMSc/PgotPGN1c3RvbWVyIHhtbG5zPSJodHRwOi8vb3BlbnVyaS5vcmcveHN0eXBlcy90ZXN0IgotICAgZ2VuZGVyPSJtYWxlIgotICAgaGV4QXR0PSI0NzQ3NDk1MTU0NTc1OTQ3NDciCi0gICBiYXNlNjRBdHQ9IiAgICAgICAgCi0JVkdocGN5QnpkSEpwYm1jZ2FYTWdZbUZ6WlRZMFFtbHVZWEo1SUdWdVkyOWtaV1FoCi0JIgotICAgYW55dXJpQXR0PSJodHRwOi8vZG1vei5vcmcvV29ybGQvRnJhbudhaXMvIgotICAgcW5hbWVBdHQ9InByZWY6bG9jYWxuYW1lIiB4bWxuczpwcmVmPSJzb21lX3VyaSIKLSAgIG5vdGF0aW9uQXR0PSJKUEVHIgotICA+Ci0gIDxmaXJzdG5hbWU+SG93ZHk8L2ZpcnN0bmFtZT4KLSAgPG51bWJlcj40MzY8L251bWJlcj4KLSAgPG51bWJlcj4xMjM8L251bWJlcj4KLSAgPGJpcnRoZGF5PjE5OTgtMDgtMjZaPC9iaXJ0aGRheT4KLSAgPG51bWJlcj40NDwvbnVtYmVyPgotICA8bnVtYmVyPjkzMzwvbnVtYmVyPgotICA8YmlydGhkYXk+MjAwMC0wOC0wNi0wODowMDwvYmlydGhkYXk+Ci0gIDxoZXg+NDU0NzQ5NTE1NDU3NTk1QTRBPC9oZXg+Ci0gIDxiYXNlNjQ+VkdocGN5QnpkSEpwYm1jZ2FYTWdZbUZ6WlRZMFFtbHVZWEo1SUdWdVkyOWtaV1FoPC9iYXNlNjQ+Ci0gIDxhbnl1cmk+aHR0cDovLzNzcGFjZS5vcmcvc3BhY2UlMjBzcGFjZS88L2FueXVyaT4KLSAgPHFuYW1lPm9wZW51cmlfb3JnX2xvY2FsbmFtZTwvcW5hbWU+Ci0gIDxub3RhdGlvbj5HSUY8L25vdGF0aW9uPgotPC9jdXN0b21lcj4KZGlmZiAtLWdpdCBhL3YxL3hiZWFuZW52LmNtZCBiL3YxL3hiZWFuZW52LmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkMTUxZi4uMDAwMDAwMAotLS0gYS92MS94YmVhbmVudi5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1TRVQgWE1MQkVBTlNfSE9NRT0lfmRwMC4KZGlmZiAtLWdpdCBhL3YxL3hraXQvUkVBRE1FLnR4dCBiL3YxL3hraXQvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNlNTVkNS4uMDAwMDAwMAotLS0gYS92MS94a2l0L1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotWE1MQmVhbnMgRGV2ZWxvcG1lbnQgS2l0Ci0KLQotV2VsY29tZSB0byBYTUxCZWFucyEKLQotQXBhY2hlIFhNTEJlYW5zIGlzIGFuIGVmZm9ydCB1bmRlcmdvaW5nIGluY3ViYXRpb24gYXQgdGhlIAotQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRiksIHNwb25zb3JlZCBieSB0aGUgWE1MIHByb2plY3QuIAotSW5jdWJhdGlvbiBpcyByZXF1aXJlZCBvZiBhbGwgbmV3bHkgYWNjZXB0ZWQgcHJvamVjdHMgdW50aWwgYSAKLWZ1cnRoZXIgcmV2aWV3IGluZGljYXRlcyB0aGF0IHRoZSBpbmZyYXN0cnVjdHVyZSwgY29tbXVuaWNhdGlvbnMsIAotYW5kIGRlY2lzaW9uIG1ha2luZyBwcm9jZXNzIGhhdmUgc3RhYmlsaXplZCBpbiBhIG1hbm5lciBjb25zaXN0ZW50IAotd2l0aCBvdGhlciBzdWNjZXNzZnVsIEFTRiBwcm9qZWN0cy4gV2hpbGUgaW5jdWJhdGlvbiBzdGF0dXMgaXMgbm90IAotbmVjZXNzYXJpbHkgYSByZWZsZWN0aW9uIG9mIHRoZSBjb21wbGV0ZW5lc3Mgb3Igc3RhYmlsaXR5IG9mIHRoZSAKLWNvZGUsIGl0IGRvZXMgaW5kaWNhdGUgdGhhdCB0aGUgcHJvamVjdCBoYXMgeWV0IHRvIGJlIGZ1bGx5IAotZW5kb3JzZWQgYnkgdGhlIEFTRi4gCi0KLQotS2l0IGNvbnRlbnRzOgotCi0oMSkgT25lIGNvcHkgb2YgeGJlYW4uamFyLCB3aGljaCBjb250YWlucyBYTUxCZWFucy4KLSAgICBTaG91bGQgd29yayBvbiBhbnkgSkRLIDEuNC54LgotICAgIC4vbGliL3hiZWFuLmphcgotCi0oMikgTGljZW5zZSBpbmZvcm1hdGlvbiBmb3IgWE1MIEJlYW5zIGFuZCBpbmNsdWRlZCBsaWJyYXJpZXMKLSAgICAuL2xpY2Vuc2UudHh0Ci0KLSgzKSBPbmUgZm9sZGVyIGZ1bGwgb2YgY29tbWFuZC1saW5lIHNjcmlwdHMsIHBvaW50aW5nIHRvIHRoZQotICAgIHVzZWZ1bCBtYWluKCkgZnVuY3Rpb25zIGluIHRoZSBKQVIuCi0gICAgLi9iaW4KLQotKDQpIE9uZSBiaXQgb2YgYW50IHRhc2sgZG9jdW1lbnRhdGlvbi4KLSAgICAuL2FudHRhc2suaHRtbAotCi0oNSkgQSBjb3B5IG9mIHRoZSBwbGFpbiBqYXZhZG9jIHRyZWUgZm9yIGNvbS5iZWEueG1sLioKLSAgICAuL2RvY3MvcmVmZXJlbmNlCi0KLSg2KSBBIHByZWxpbWluYXJ5IGNvbGxlY3Rpb24gb2YgbmljZWx5IGZvcm1hdHRlZCB1c2VyLWxldmVsCi0gICAgZG9jdW1lbnRhdGlvbiBIVE1MIChpbmNsdWRlcyByZWZvcm1hdHRlZCBhbmQgbmljZWx5Ci0gICAgb3JnYW5pemVkIGphdmFkb2MgYXMgd2VsbCkKLSAgICAuL2RvY3MvZ3VpZGUKLQotKDcpIEEgZmV3IHNhbXBsZSBzY2hlbWFzCi0gICAgLi9zY2hlbWFzCi0KLQotV2hlcmUgdG8gc3RhcnQ/Ci0KLSgxKSBTZXR1cC4KLQotICAgIDEuIG1ha2Ugc3VyZSB5b3UgaGF2ZSBhIEpESyAxLjQueCBpbnN0YWxsZWQ7IHRoYXQgamF2YVsuZXhlXQotICAgICAgIGlzIG9uIHlvdXIgcGF0aCBhbmQgdGhhdCBKQVZBX0hPTUUvYmluIGNvbnRhaW5zIGphdmFbLmV4ZV0sCi0gICAgICAgamF2YWNbLmV4ZV0sIGFuZCBqYXJbLmV4ZV0uCi0KLSAgICAyLiBzZXQgeW91ciBYTUxCRUFORElSIGVudiB2YXJpYWJsZSB0byBwb2ludCB0byB0aGUgZGlyZWN0b3J5Ci0gICAgICAgY29udGFpbmluZyB4YmVhbi5qYXIgKGkuZS4sIC4vbGliKS4KLQotICAgIDMuIHB1dCB0aGUgc2NyaXB0cyBpbiAuL2JpbiBvbiB5b3VyIHBhdGguCi0KLSAgICA0LiBydW4gInNjb21wIiB3aXRoIG5vIGFyZ3VtZW50cy4gIFlvdSBzaG91bGQgZ2V0IGEgInVzYWdlIgotICAgICAgIG1lc3NhZ2UuCi0KLSgyKSBUcnkgc29tZSBzY2hlbWEgY29tcGlsYXRpb24KLQotICAgIDEuIEluIHRoZSAuL3NjaGVtYXMgZGlyZWN0b3J5IHlvdSdsbCBmaW5kIHNvbWUgY29sbGVjdGlvbnMgb2YKLSAgICAgICBzY2hlbWFzIHlvdSBjYW4gdHJ5IG91dC4KLQotICAgICAgICAgLSBlYXN5cG86IGEgY29udHJpdmVkIHNpbXBsZSBzdGFydGVyICJwdXJjaGFzZSBvcmRlciIKLSAgICAgICAgIC0gY3ljbG9uZTogYW4gYWN0dWFsIGN1c3RvbWVyIHNjaGVtYSAoY3ljbG9uZWNvbW1lcmNlLmNvbSkKLSAgICAgICAgIC0gczRzOiB0aGUgU2NoZW1hIGZvciBTY2hlbWEKLSAgICAgICAgIC0gajJlZTogajJlZSBkZXNjcmlwdG9yIHNjaGVtYXMKLQotICAgICAgIFRvIGNvbXBpbGUgdGhlbSwgeW91IGNhbiBqdXN0IHNlbmQgdGhlIHdob2xlIGRpcmVjdG9yeSB0bwotICAgICAgIHNjb21wLCBmb3IgZXhhbXBsZSwgImNkIHNhbXBsZXMiOyB0aGVuICJzY29tcCBlYXN5cG8iLgotICAgICAgIFlvdSB3aWxsIGdldCBhbiAieG1sdHlwZXMuamFyIiBvdXQgdGhhdCBjb250YWlucyBhbGwgdGhlCi0gICAgICAgY29tcGlsZWQgWE1MQmVhbnMuICBUbyBwaWNrIHlvdXIgb3duIEpBUiBmaWxlbmFtZSBqdXN0IHNheQotCi0gICAgICAgc2NvbXAgLW91dCBteWVhc3lwby5qYXIgZWFzeXBvCi0KLQotICAgIDIuIEVzcGVjaWFsbHkgYXMgeW91IGdldCBzdGFydGVkLCB5b3Ugd2lsbCB3YW50IHRvIHNlZSB0aGUKLSAgICAgICAuamF2YSBzb3VyY2UgY29kZSBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlLiAgVG8gZ2V0IHRoYXQsCi0gICAgICAgdXNlIGEgY29tbWFuZC1saW5lIGxpa2UKLQotICAgICAgIHNjb21wIC1zcmMgbXlzcmNkaXIgLW91dCBteWVhc3lwby5qYXIgZWFzeXBvCi0KLSAgICAgICBUaGUgIm15c3JjZGlyIiB3aWxsIGNvbnRhaW4gYWxsIHRoZSAuamF2YSBzb3VyY2UgY29kZQotICAgICAgIGZvciB0aGUgZ2VuZXJhdGVkIFhNTEJlYW5zLgotCi0oMykgVHJ5IHVzaW5nIHlvdXIgY29tcGlsZWQgWE1MQmVhbnMKLQotICAgIE5vdywgYXJtZWQgd2l0aCB0aGUgWE1MQmVhbnMgc291cmNlIGNvZGUgYW5kIHRoZSBiYXNpYwotICAgIGRvY3MsIHlvdSdyZSByZWFkeSB0byBwcm9ncmFtLiAgVGhpbmdzIHlvdSBuZWVkIHRvIGtub3c6Ci0KLSAgICAqIFRoZSBvcmcuYXBhY2hlLnhtbGJlYW5zIHBhY2thZ2UgaGFzIGFsbCB0aGUgcHVibGljIGNsYXNzZXMKLSAgICAgIGZvciBYTUxCZWFucy4gIFByb2dyYW1zIHNob3VsZCBub3QgbmVlZCB0byBjYWxsIGFueXRoaW5nCi0gICAgICBlbHNlIGluIHhiZWFuLmphciBkaXJlY3RseS4KLQotICAgICogWG1sT2JqZWN0IGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgWE1MQmVhbnMuICBJdAotICAgICAgY29ycmVzcG9uZHMgdG8geHM6YW55VHlwZS4KLQotICAgICogRXZlcnkgc2NoZW1hIHR5cGUgY29ycmVzcG9uZHMgdG8gYW4gWE1MQmVhbiBpbnRlcmZhY2UsCi0gICAgICBlLmcuLCBYbWxBbnlTaW1wbGVUeXBlIGNvcnJlc3BvbmRzIHRvIHhzOmFueVNpbXBsZVR5cGUsIGFuZAotICAgICAgWG1sSW50IGNvcnJlc3BvbmRzIHRvIHhzOmludCwgZXRjLi4gQW5kIG9mIGNvdXJzZSB0aGlzCi0gICAgICBleHRlbmRzIHRvIHRoZSBYTUxCZWFuIGNsYXNzZXMgY29tcGlsZWQgZnJvbSB1c2VyLWRlZmluZWQKLSAgICAgIHNjaGVtYXMuCi0KLSAgICAqIEV2ZXJ5IFhNTEJlYW4gaW50ZXJmYWNlIGhhcyBhbiBpbm5lciBGYWN0b3J5IGNsYXNzIGZvcgotICAgICAgY3JlYXRpbmcgb3IgcGFyc2luZyBpbnN0YW5jZXMsIGUuZy4sIHRvIGxvYWQgYSBmaWxlIG9mCi0gICAgICBnZW5lcmljIHR5cGUsIHVzZSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShteWZpbGUpOyB0bwotICAgICAgcGFyc2UgYSBzdHJpbmcgeW91IGV4cGVjdCB0byBiZSBhIHB1cmNhaHNlLW9yZGVyLCB1c2UKLSAgICAgIFB1cmNoYXNlT3JkZXJEb2N1bWVudC5GYWN0b3J5LnBhcnNlKCI8ZXA6cHVyY2hhc2Utby4uLiIpOwotCi0gICAgKiBYbWxDdXJzb3IgaXMgdGhlIEFQSSBmb3IgZnVsbCBYTUwgaW5mb3NldCB0cmVld2Fsa2luZy4KLSAgICAgIEl0IGlzIG9idGFpbmVkIHZpYSB4bWxvYmplY3QubmV3Q3Vyc29yKCkuIFVzaW5nIGl0IGlzCi0gICAgICBsZXNzIGNvbnZlbmllbnQsIGJ1dCBmYXN0ZXIgdGhhbiB1c2luZyBYTUwgT2JqZWN0cywKLSAgICAgIGJlY2F1c2UgaXQgZG9lcyBub3QgY3JlYXRlIG9iamVjdHMgYXMgaXQgdHJhdmVyc2VzCi0gICAgICB0aGUgWE1MIHRyZWUuCi0KLSAgICAqIFNjaGVtYVR5cGUgaXMgdGhlIGJhc2ljICJzY2hlbWEgcmVmbGVjdGlvbiIgQVBJIChqdXN0IGxpa2UKLSAgICAgIENsYXNzLCBidXQgZm9yIFNjaGVtYSkuICBHZXQgdGhlIGFjdHVhbCBzY2hlbWEgdHlwZSBvZiBhbnkKLSAgICAgIGluc3RhbmNlIGJ5IHNheWluZyAieG9iai5zY2hlbWFUeXBlKCk7IiBnZXQgdGhlIHN0YXRpYwotICAgICAgY29uc3RhbnQgc2NoZW1hIHR5cGUgY29ycmVzcG9uZGluZyB0byBhbnkgWE1MQmVhbiBjbGFzcwotICAgICAgYnkgc2F5aW5nICJNeVB1cmNoYXNlT3JkZXIudHlwZSIgb3IgIlhtbEludC50eXBlIi4KLSAgICAgIChBbmFsb2dvdXMgdG8gIm9iai5nZXRDbGFzcygpIiBhbmQgIk9iamVjdC5jbGFzcyIuKQotCi0gICAgKiBBIG51bWJlciBvZiB1dGlsaXR5IG1ldGhvZHMgYXJlIGF2YWxpYWJsZSBvbgotICAgICAgY29tLmJlYS54bWwuWG1sQmVhbnMsIGluY2x1ZGluZyBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlCi0gICAgICB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgSmF2YSBjbGFzcyBpcyBhbiBYbWxCZWFuIGFuZAotICAgICAgZnVuY3Rpb25zIHRvIG1hbmFnZSBydW50aW1lLWxvYWRpbmcgb2Ygc2NoZW1hIHR5cGUKLSAgICAgIHN5c3RlbXMuCi0KLSAgICBXaXRoIHRoYXQsIHlvdSdyZSByZWFkeSB0byBuYXZpZ2F0ZSB0aGUgamF2YWRvYyBhbmQgcGxheQotICAgIHdpdGggdGhlIGNvZGUuICBBbHNvLCB0cnkgcmVhZGluZyBzb21lIG9mIG91ciAKLSAgICBkb2NzIHRoYXQgYXJlIGluY2x1ZGVkIGluIC4vZG9jcwotCi0oMykgVHJ5IHNvbWUgb2YgdGhlIG90aGVyIHV0aWxpdGllczsgeW91IGNhbiBhbHNvIHNlZSBhIGZldwotICAgIGV4YW1wbGVzIG9mIFhNTEJlYW4gdGVjaG5pcXVlcyBpbiB0aGVpciBzb3VyY2UgY29kZS4KLQotICAgIDEuICJ4cHJldHR5IGluc3RhbmNlLnhtbCIgcHJldHR5LXByaW50cyBhbiBYTUwgaW5zdGFuY2UKLSAgICAgICBkb2N1bWVudC4KLQotICAgICAgIFRoZSBjb2RlIGlzIGluIHhtbC5hcGFjaGUub3JnLnRvb2wuUHJldHR5UHJpbnRlciBhbmQgaXMKLSAgICAgICBhIHJlYXNvbmFibGUgZXhhbXBsZSBvZiBob3cgdG8gbG9hZCBhbmQgc2F2ZSBvdXQgYW4KLSAgICAgICBhcmJpdHJhcnkgWE1MIGRvY3VtZW50LiAgWG1sT3B0aW9ucyBhcmUgdXNlZCB0byBwcm9kdWNlCi0gICAgICAgdGhlIHByZXR0eS1wcmludGluZy4KLQotICAgIDIuICJ2YWxpZGF0ZSBpbnN0YW5jZS54bWwgc2NoZW1hLnhzZCIgd2lsbCB2YWxpZGF0ZSB0aGUKLSAgICAgICBpbnN0YW5jZSBhZ2FpbnN0IHRoZSBzY2hlbWEuICBYTUxCZWFucyBpcyBpbnRlbmRlZCB0bwotICAgICAgIGJlIGEgdmVyeSBhY2N1cmF0ZSBYTUwgc2NoZW1hIHZhbGlkYXRvci4KLQotICAgICAgIFRoZSBjb2RlIGlzIGluIHhtbC5hcGFjaGUub3JnLnRvb2wuSW5zdGFuY2VWYWxpZGF0b3IuCi0gICAgICAgSXQgaXMgYW4gZXhjZWxsZW50IGV4YW1wbGUgb2YgaG93IHRvIGxvYWQgYSBzY2hlbWEKLSAgICAgICB0eXBlIHN5c3RlbSBkeW5hbWljYWxseSBhdCBydW50aW1lLCBsb2FkIGFuZCB2YWxpZGF0ZQotICAgICAgIGFuIGluc3RhbmNlIHdpdGhpbiB0aGF0IHR5cGUgc3lzdGVtLCBhbmQgaG93IHRvIG9idGFpbgotICAgICAgIGxpc3RzIG9mIGFuZCBsb2NhdGlvbnMgZm9yIHZhbGlkYXRpb24gZXJyb3JzLgotCi0gICAgMy4gInhzZHRyZWUgZWFzeXBvIiB3aWxsIHNob3cgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICAgICAgIG9mIHRoZSBzY2hlbWEgdHlwZXMgaW4gdGhhdCBkaXJlY3RvcnkuCi0KLSAgICAgICBUaGUgY29kZSBpcyBpbiB4bWwuYXBhY2hlLm9yZy50b29sLlR5cGVIaWVyYXJjaHlQcmludGVyCi0gICAgICAgYW5kIGlzIGEgZ29vZCBpbnRyb2R1Y3Rpb24gdG8gaG93IHRvIHRyYXZlcnNlIHRoZQotICAgICAgIG1ldGFkYXRhIGluIGEgc2NoZW1hIHR5cGUgc3lzdGVtLgotCi0gICAgNC4gImR1bXB4c2IgeGJlYW4uamFyIiBvciAiZHVtcHhzYiBteWZpbGUueHNiIiB3aWxsIGR1bXAKLSAgICAgICB0aGUgY29udGVudHMgb2YgInhzYiIgKGJpbmFyeSBzY2hlbWEgbWV0YWRhdGEpIGZpbGVzCi0gICAgICAgaW4gYSBodW1hbi1yZWFkYWJsZSBmb3JtLiAgVGhlc2UgLnhzYiBmaWxlcyBjb250YWluCi0gICAgICAgdGhlIGNvbXBpbGVkIG1ldGFkYXRhIHJlc3VsdGluZyBmcm9tIHRoZSAueHNkIGZpbGVzCi0gICAgICAgb2YgYSB0eXBlIHN5c3RlbS4gIFRoZXkgYXJlIGFuYWxvZ291cyB0byAuY2xhc3MgZmlsZXMKLSAgICAgICBmb3IgLmphdmEuCi0KZGlmZiAtLWdpdCBhL3YxL3hraXQvYmluL2R1bXB4c2IgYi92MS94a2l0L2Jpbi9kdW1weHNiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTE4MTA0Li4wMDAwMDAwCi0tLSBhL3YxL3hraXQvYmluL2R1bXB4c2IKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jIS9iaW4vc2gKLQotI1hTQiBmaWxlIGR1bXBlcgotI1ByaW50cyB0aGUgY29udGVudHMgb2YgYW4geHNiIGZpbGUgaW4gaHVtYW4tcmVhZGFibGUgZm9ybQotCi1jcD0KLWNwPSRjcDokWE1MQkVBTkRJUi94YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICRjcCB4bWxiZWFucy5hcGFjaGUub3JnLnRvb2wuWHNiRHVtcGVyICQqCi0KZGlmZiAtLWdpdCBhL3YxL3hraXQvYmluL2R1bXB4c2IuY21kIGIvdjEveGtpdC9iaW4vZHVtcHhzYi5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNjY4ODYuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9iaW4vZHVtcHhzYi5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1AcmVtIFhTQiBmaWxlIGR1bXBlcgotQHJlbQotQHJlbSBQcmludHMgdGhlIGNvbnRlbnRzIG9mIGFuIHhzYiBmaWxlIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0KLQotQGVjaG8gb2ZmCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFORElSJVx4YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgeG1sYmVhbnMuYXBhY2hlLm9yZy50b29sLlhzYkR1bXBlciAlKgotCi06ZG9uZQpkaWZmIC0tZ2l0IGEvdjEveGtpdC9iaW4vc2NvbXAgYi92MS94a2l0L2Jpbi9zY29tcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQxZjFjMi4uMDAwMDAwMAotLS0gYS92MS94a2l0L2Jpbi9zY29tcAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jU2NoZW1hIGNvbXBpbGVyCi0jQnVpbGRzIFhCZWFuIHR5cGVzIGZyb20geHNkIGZpbGVzLgotCi0KLWNwPQotY3A9JGNwOiRYTUxCRUFORElSL3hiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJGNwIHhtbGJlYW5zLmFwYWNoZS5vcmcudG9vbC5TY2hlbWFDb21waWxlciAkKgotCi0KZGlmZiAtLWdpdCBhL3YxL3hraXQvYmluL3Njb21wLmNtZCBiL3YxL3hraXQvYmluL3Njb21wLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE5ZWZjNC4uMDAwMDAwMAotLS0gYS92MS94a2l0L2Jpbi9zY29tcC5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1AcmVtIFNjaGVtYSBjb21waWxlcgotQHJlbQotQHJlbSBCdWlsZHMgWEJlYW4gdHlwZXMgZnJvbSB4c2QgZmlsZXMuCi0KLUBlY2hvIG9mZgotCi1zZXQgY3A9Ci1zZXQgY3A9JWNwJTslWE1MQkVBTkRJUiVceGJlYW4uamFyCi0KLWphdmEgLWNsYXNzcGF0aCAlY3AlIHhtbGJlYW5zLmFwYWNoZS5vcmcudG9vbC5TY2hlbWFDb21waWxlciAlKgotCi06ZG9uZQpkaWZmIC0tZ2l0IGEvdjEveGtpdC9iaW4vc2NvcHkgYi92MS94a2l0L2Jpbi9zY29weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ4YzAyMC4uMDAwMDAwMAotLS0gYS92MS94a2l0L2Jpbi9zY29weQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyEvYmluL3NoCi0KLWNwPQotY3A9JGNwOiRYTUxCRUFORElSL3hiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJGNwIHhtbC5hcGFjaGUub3JnLnRvb2wuU2NoZW1hQ29tcGlsZXIgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS94a2l0L2Jpbi9zY29weS5jbWQgYi92MS94a2l0L2Jpbi9zY29weS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YzcxM2QuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9iaW4vc2NvcHkuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotQHJlbSBTY2hlbWEgY29tcGlsZXIKLUByZW0KLUByZW0gQnVpbGRzIFhCZWFuIHR5cGVzIGZyb20geHNkIGZpbGVzLgotCi1AZWNobyBvZmYKLQotc2V0IGNwPQotc2V0IGNwPSVjcCU7JVhNTEJFQU5ESVIlXHhiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJWNwJSB4bWxiZWFucy5hcGFjaGUub3JnLnRvb2wuU2NoZW1hQ29weSAlKgotCi06ZG9uZQpkaWZmIC0tZ2l0IGEvdjEveGtpdC9iaW4vc2Rvd25sb2FkIGIvdjEveGtpdC9iaW4vc2Rvd25sb2FkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzlhZjc1Li4wMDAwMDAwCi0tLSBhL3YxL3hraXQvYmluL3Nkb3dubG9hZAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyEvYmluL3NoCi0KLWNwPQotY3A9JGNwOiRYTUxCRUFORElSL3hiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJGNwIHhtbC5hcGFjaGUub3JnLnRvb2wuU2NoZW1hUmVzb3VyY2VNYW5hZ2VyICQqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEveGtpdC9iaW4vc2Rvd25sb2FkLmNtZCBiL3YxL3hraXQvYmluL3Nkb3dubG9hZC5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MGFhZGIuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9iaW4vc2Rvd25sb2FkLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotQGVjaG8gb2ZmCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFORElSJVx4YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgeG1sLmFwYWNoZS5vcmcudG9vbC5TY2hlbWFSZXNvdXJjZU1hbmFnZXIgJSoKLQotOmRvbmUKZGlmZiAtLWdpdCBhL3YxL3hraXQvYmluL3NmYWN0b3IgYi92MS94a2l0L2Jpbi9zZmFjdG9yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjA0ZDgwLi4wMDAwMDAwCi0tLSBhL3YxL3hraXQvYmluL3NmYWN0b3IKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMhL2Jpbi9zaAotCi1jcD0KLWNwPSRjcDokWE1MQkVBTkRJUi94YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICRjcCB4bWwuYXBhY2hlLm9yZy50b29sLkZhY3RvckltcG9ydHMgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS94a2l0L2Jpbi9zZmFjdG9yLmNtZCBiL3YxL3hraXQvYmluL3NmYWN0b3IuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmQyMjBjLi4wMDAwMDAwCi0tLSBhL3YxL3hraXQvYmluL3NmYWN0b3IuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotQHJlbSBGYWN0b3JzIG92ZXJsYXBwaW5nIHNjaGVtYXMgaW50byBzY2hlbWFzIHRoYXQgdXNlIGltcG9ydHMKLQotQGVjaG8gb2ZmCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFORElSJVx4YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgeG1sLmFwYWNoZS5vcmcudG9vbC5GYWN0b3JJbXBvcnRzICUqCi0KLTpkb25lCmRpZmYgLS1naXQgYS92MS94a2l0L2Jpbi92YWxpZGF0ZSBiL3YxL3hraXQvYmluL3ZhbGlkYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGEwMWY3Li4wMDAwMDAwCi0tLSBhL3YxL3hraXQvYmluL3ZhbGlkYXRlCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIyEvYmluL3NoCi0jCi0jIEluc3RhbmNlIFZhbGlkYXRvcgotIwotIyBWYWxpZGF0ZXMgYW4gaW5zdGFuY2UgYWdhaW5zdCBhIHNjaGVtYS4KLQotY3A9Ci1jcD0kY3A6JFhNTEJFQU5ESVIveGJlYW4uamFyCi0KLWphdmEgLWNsYXNzcGF0aCAkY3AgeG1sLmFwYWNoZS5vcmcudG9vbC5JbnN0YW5jZVZhbGlkYXRvciAkKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3hraXQvYmluL3ZhbGlkYXRlLmNtZCBiL3YxL3hraXQvYmluL3ZhbGlkYXRlLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVkMTNlOS4uMDAwMDAwMAotLS0gYS92MS94a2l0L2Jpbi92YWxpZGF0ZS5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1AcmVtIEluc3RhbmNlIFZhbGlkYXRvcgotQHJlbQotQHJlbSBWYWxpZGF0ZXMgYW4gaW5zdGFuY2UgYWdhaW5zdCBhIHNjaGVtYS4KLQotQGVjaG8gb2ZmCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFORElSJVx4YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgeG1sLmFwYWNoZS5vcmcudG9vbC5JbnN0YW5jZVZhbGlkYXRvciAlKgotCi06ZG9uZQpkaWZmIC0tZ2l0IGEvdjEveGtpdC9iaW4veHByZXR0eSBiL3YxL3hraXQvYmluL3hwcmV0dHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZDNjMzYuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9iaW4veHByZXR0eQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyEvYmluL3NoCi0KLWNwPQotY3A9JGNwOiRYTUxCRUFORElSL3hiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJGNwIHhtbC5hcGFjaGUub3JnLnRvb2wuUHJldHR5UHJpbnRlciAkKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3hraXQvYmluL3hwcmV0dHkuY21kIGIvdjEveGtpdC9iaW4veHByZXR0eS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNzkwZDguLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9iaW4veHByZXR0eS5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUBlY2hvIG9mZgotCi1zZXQgY3A9Ci1zZXQgY3A9JWNwJTslWE1MQkVBTkRJUiVceGJlYW4uamFyCi0KLWphdmEgLWNsYXNzcGF0aCAlY3AlIHhtbC5hcGFjaGUub3JnLnRvb2wuUHJldHR5UHJpbnRlciAlKgpkaWZmIC0tZ2l0IGEvdjEveGtpdC9iaW4veHNkdHJlZSBiL3YxL3hraXQvYmluL3hzZHRyZWUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZjEzNjIuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9iaW4veHNkdHJlZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyEvYmluL3NoCi0KLWNwPQotY3A9JGNwOiRYTUxCRUFORElSL3hiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJGNwIHhtbC5hcGFjaGUub3JnLnRvb2wuVHlwZUhpZXJhcmNoeVByaW50ZXIgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS94a2l0L2Jpbi94c2R0cmVlLmNtZCBiL3YxL3hraXQvYmluL3hzZHRyZWUuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDM2ZDViLi4wMDAwMDAwCi0tLSBhL3YxL3hraXQvYmluL3hzZHRyZWUuY21kCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1AZWNobyBvZmYKLQotc2V0IGNwPQotc2V0IGNwPSVjcCU7JVhNTEJFQU5ESVIlXHhiZWFuLmphcgotCi1qYXZhIC1jbGFzc3BhdGggJWNwJSB4bWwuYXBhY2hlLm9yZy50b29sLlR5cGVIaWVyYXJjaHlQcmludGVyICUqCmRpZmYgLS1naXQgYS92MS94a2l0L2Jpbi94c3RjIGIvdjEveGtpdC9iaW4veHN0YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNlYzMxYi4uMDAwMDAwMAotLS0gYS92MS94a2l0L2Jpbi94c3RjCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIS9iaW4vc2gKLQotY3A9Ci1jcD0kY3A6JFhNTEJFQU5ESVIveGJlYW4uamFyCi0KLWphdmEgLWNsYXNzcGF0aCAkY3AgeG1sLmFwYWNoZS5vcmcudG9vbC5YU1RDVGVzdGVyICQqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEveGtpdC9iaW4veHN0Yy5jbWQgYi92MS94a2l0L2Jpbi94c3RjLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0MmUxYS4uMDAwMDAwMAotLS0gYS92MS94a2l0L2Jpbi94c3RjLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQGVjaG8gb2ZmCi0KLXNldCBjcD0KLXNldCBjcD0lY3AlOyVYTUxCRUFORElSJVx4YmVhbi5qYXIKLQotamF2YSAtY2xhc3NwYXRoICVjcCUgeG1sLmFwYWNoZS5vcmcudG9vbC5YU1RDVGVzdGVyICUqCmRpZmYgLS1naXQgYS92MS94a2l0L3NjaGVtYXMvY3ljbG9uZS9DeWNsb25lT3JnYW5pemF0aW9uUHJvZmlsZS54c2QgYi92MS94a2l0L3NjaGVtYXMvY3ljbG9uZS9DeWNsb25lT3JnYW5pemF0aW9uUHJvZmlsZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMzE0YzAuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9zY2hlbWFzL2N5Y2xvbmUvQ3ljbG9uZU9yZ2FuaXphdGlvblByb2ZpbGUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNzM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuY3ljbG9uZWNvbW1lcmNlLmNvbS9TY2hlbWFzLzIwMDEvMDgvY29wIiB4bWxucz0iaHR0cDovL3d3dy5jeWNsb25lY29tbWVyY2UuY29tL1NjaGVtYXMvMjAwMS8wOC9jb3AiIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIj4KLQk8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxkc2lnLWNvcmUveG1sZHNpZy1jb3JlLXNjaGVtYS54c2QiLz4KLQk8eHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIHNjaGVtYSByZXByZXNlbnRzIG9yZ2FuaXphdGlvbiBkZXRhaWxzIHJlcXVpcmVkIGZvciB0cmFkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQk8IS0tR2VuZXJhbCBkZWZpbml0aW9ucyB1c2VkIHdpdGhpbiB0aGUgcmVzdCBvZiB0aGUgc2NoZW1hLi0tPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21tZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZnJlZWZvcm0gdGV4dCBmaWVsZCB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgYW4gZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4c2Q6bGFuZ3VhZ2UiIGRlZmF1bHQ9ImVuIi8+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSWRlbnRpZmllciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBpZCBmb3IgYW4gZWxlbWVudC4gIENhbid0IHVzZSB4c2Q6SUQgYmVjYXVzZSBpdCB3b24ndCBhbGxvdyB0aGVtIHRvIGJlZ2luIHdpdGggYSBudW1iZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSWRlbnRpZmllclJlZiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBJZGVudGlmaWVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iSWRlbnRpZmllciIvPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ik9yZ2FuaXphdGlvbklkIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXJ2ZXIncyB1bmlxdWUgaW50ZXJuYWwgaWRlbnRpZmllciBmb3IgYW4gb3JnYW5pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iSWRlbnRpZmllciI+Ci0JCQk8eHNkOm1pbkxlbmd0aCB2YWx1ZT0iMSIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDb21tdW5pdHlJZCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2VydmVyJ3MgdW5pcXVlIGludGVybmFsIGlkZW50aWZpZXIgZm9yIGEgY29tbXVuaXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iSWRlbnRpZmllciI+Ci0JCQk8eHNkOm1pbkxlbmd0aCB2YWx1ZT0iMSIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21tdW5pdHkiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbW11bml0eU5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCcm9rZXJJZCIgdHlwZT0iT3JnYW5pemF0aW9uSWQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb21tdW5pdHlJZCIgdHlwZT0iQ29tbXVuaXR5SWQiIHVzZT0icmVxdWlyZWQiLz4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8IS0tVGhlIGZvbGxvd2luZyBkZWZpbmVzIHN0dWZmIGZvciB0aGUgQWRtaW5pc3RyYXRpdmUgSW5mb3JtYXRpb24tLT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iT3JnYW5pemF0aW9uTmFtZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgb3JnYW5pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iUGVyc29uTmFtZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiBhIHBlcnNvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBob25lIiBtaXhlZD0idHJ1ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHBob25lIG51bWJlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkVtYWlsIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGVtYWlsIGFkZHJlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmZvcm1hdGlvbiBhYm91dCBhIHBlcnNvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDb21tZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iUGVyc29uTmFtZSIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUaXRsZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlcGFydG1lbnQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFbWFpbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FbWFpbCBhZGRyZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iRW1haWwiPgotCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQkJCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJCQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGhvbmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlBob25lIi8+Ci0JCQkJCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBvc3RhbEFkZHJlc3MiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb250YWN0SWQiIHR5cGU9IklkZW50aWZpZXIiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdHMiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Q29sbGVjdGlvbiBvZiBDb250YWN0IGFuZCBDb250YWN0UmVmcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDb250YWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGFsQWRkcmVzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qb3N0YWwgbWFpbGluZyBhZGRyZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkNvbW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3RyZWV0IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzdHJlZXQgYWRkcmVzcy4gIFRoaXMgbWF5IHJlc29sdmUgdG8gd2hhdCBtYXkgYmUgaW50ZXJwcmV0ZWQgYXMgbXVsdGlwbGUgbGluZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q2l0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlN0YXRlcHJvdiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0YXRlIG9yIHByb3ZpbmNlIGRlcGVuZGluZyBvbiB0aGUgY291bnRyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3RhbENvZGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UG9zdGFsIG9yIHppcCBjb2RlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ291bnRyeSIgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iVVMiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q291bnRyeSBjb2RlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJSb3V0aW5nSWRUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0eXBlIG9mIHJvdXRpbmcgaWRlbnRpZmllciwgbGlrZSBEVU5TLCBFREksIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRElGQUNUIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEVU5TIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlJvdXRpbmdJZCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBpZGVudGlmaWVyIHN1Y2ggYXMgRFVOUyBvciBFREkgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSBhIGNvbXBhbnkgZm9yIHRyYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2ltcGxlQ29udGVudD4KLQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0iUm91dGluZ0lkVHlwZSIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkNlcnRpZmljYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZm9ybWF0aW9uIGFib3V0IGEgY2VydGlmaWNhdGUuIFRoZSBpbml0aWFsIHZlcnNpb24gb2YgZWFjaCBJbnRlcmNoYW5nZSBwcm9kdWN0IG9ubHkgc3VwcG9ydCB0aGUgZHM6S2V5SW5mby9kczpYNTA5RGF0YSBzZWN0aW9uIGluY2x1ZGluZyBkczpYNTA5SXNzdWVyU2VyaWFsIGFuZCBYNTA5Q2VydGlmaWNhdGUuICBBbnkgb3RoZXIgZWxlbWVudHMgdXNlZCB3aWxsIGJlIGlnbm9yZWQsIGFuZCBpZiBvbmUgb2YgdGhlIHR3byBzdXBwb3J0ZWQgZWxlbWVudHMgaXMgbm90IGluY2x1ZGVkIHRoZSBjZXJ0aWZpY2F0ZSB3aWxsIGJlIGNvbnNpZGVyZWQgaW52YWxpZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJkczpLZXlJbmZvIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNlcnRJZCIgdHlwZT0iSWRlbnRpZmllciIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJDZXJ0aWZpY2F0ZXRSZWYiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZlcmVuY2UgdG8gYSBDZXJ0aWZpY2F0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2VydElkIiB0eXBlPSJJZGVudGlmaWVyUmVmIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkNlcnRpZmljYXRlcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db2xsZWN0aW9uIG9mIENlcnRpZmljYXRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVmZXJyZWRFbmNyeXB0aW9uQ2VydElkIiB0eXBlPSJJZGVudGlmaWVyUmVmIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkFkbWluaXN0cmF0aXZlSW5mbyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmZvcm1hdGlvbiBkZXNjcmliaW5nIGFuIG9yZ2FuaXphdGlvbiB1c2VmdWwgdG8gaHVtYW5zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ik9yZ2FuaXphdGlvbk5hbWUiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQb3N0YWxBZGRyZXNzIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDb250YWN0cyIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8IS0tVGhlIGZvbGxvd2luZyBkZWZpbmVzIHN0dWZmIGZvciBUcmFuc3BvcnRzLS0+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlVzZXJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlVzZXJuYW1lIHVzZWQgdG8gYWNjZXNzIGEgcmVzb3VyY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYXNzd29yZCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5QYXNzd29yZCB1c2VkIHRvIGFjY2VzcyBhIHNlY3VyZSByZXNvdWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImVuY3J5cHRlZCIgdHlwZT0ieHNkOmJvb2xlYW4iIHVzZT0icmVxdWlyZWQiLz4KLQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJJUEFkZHJlc3MiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+SW50ZXJuZXQgUHJvdG9jYWwgYWRkcmVzcywgZXg6ICAxMi4zNC41Ni43ODwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQk8eHNkOnBhdHRlcm4gdmFsdWU9IigoWzAtMV0/WzAtOV0/WzAtOV18MlswLTRdWzAtOV18MjVbMC05XSl7M30oLlswLTFdP1swLTldP1swLTldfDJbMC00XVswLTldfDI1WzAtNV0pKSI+Ci0JCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBtZXNzIGp1c3QgcmVzdHJpY3RzIHRoZSB2YWx1ZSB0byBzdGFuZGFyZCBJUCBhZGRyZXNzZXMgd2hlcmUgZWFjaCBvZiBmb3VyIG9jdGV0cyBjYW4gaGF2ZSB2YWx1ZXMgMC0yNTUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJPC94c2Q6cGF0dGVybj4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRE5TQWRkcmVzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Eb21haW4gTmFtZSBTZXJ2ZXIgYWRkcmVzcywgZXg6IHd3dy5jeWNsb25lY29tbWVyY2UuY29tPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU29ja2V0U2VjdXJpdHlUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFVVEhFTlRJQ0FURUQgb3IgQU5PTllNT1VTPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVEhFTlRJQ0FURUQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFOT05ZTU9VUyIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJIb3N0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgaG9zdCBhZGRyZXNzLCBlaXRoZXIgaW4gRE5TIG9yIElQLCBmb3IgYSBzZXJ2ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpzaW1wbGVUeXBlPgotCQkJPHhzZDp1bmlvbiBtZW1iZXJUeXBlcz0iRE5TQWRkcmVzcyBJUEFkZHJlc3MiLz4KLQkJPC94c2Q6c2ltcGxlVHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlNvY2tldCBwb3J0IG51bWJlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDppbnRlZ2VyIj4KLQkJCQk8eHNkOm1pbkluY2x1c2l2ZSB2YWx1ZT0iMSIvPgotCQkJCTx4c2Q6bWF4SW5jbHVzaXZlIHZhbHVlPSI2NTAwMCIvPgotCQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JCTwveHNkOnNpbXBsZVR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGlyZWN0b3J5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZGlyZWN0b3J5IG9uIGEgZmlsZSBzeXN0ZW0gb3Igc2VydmVyIHN1Y2ggYXMgRlRQLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkpNU0NvbnN1bWVyVHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgSk1TLCBlaXRoZXIgYSBRdWV1ZSBvciBUb3BpYy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUVVFVUUiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRPUElDIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkZpcmV3YWxsQXV0aGVudGljYXRpb25UeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVpdGhlciBTL0tleSBvciBDbGVhclRleHQ8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0tFWSIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0xFQVJURVhUIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkZpcmV3YWxsIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNwb3J0IHNlcnZlcidzIGZpcmV3YWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ikhvc3QiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQb3J0Ii8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkF1dGhlbnRpY2F0aW9uIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgUy9LZXkgb3IgQ2xlYXIgdGV4dCBhdXRoZW50aWNhdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJVc2VybmFtZSIvPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBhc3N3b3JkIi8+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9IkZpcmV3YWxsQXV0aGVudGljYXRpb25UeXBlIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iU29ja2V0U2VjdXJpdHkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VHlwZSBvZiBTU0wgc2VjdXJpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkNlcnRpZmljYXRldFJlZiIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9IlNvY2tldFNlY3VyaXR5VHlwZSIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNwb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkJhc2UgZGVmaW5pdGlvbiBmb3IgYSB0cmFkaW5nIHRyYW5zcG9ydCBzZXJ2ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCByZWY9IkNvbW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTY2hlZHVsZXMiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29sbGVjdGlvbiBvZiBzY2hlZHVsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZWR1bGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlBlcmlvZCBvZiB0aW1lIGluY2x1ZGluZyBhIHN0YXJ0IGFuZCBzdG9wIHRpbWUgcmVwcmVzZW50aW5nIHRoZSBwZXJpb2Qgb2YgdGltZSB0aGUgdHJhbnNwb3J0IGlzIGF2YWlsYWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RhcnRUaW1lIiB0eXBlPSJ4c2Q6dGltZSIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdG9wVGltZSIgdHlwZT0ieHNkOnRpbWUiIHVzZT0icmVxdWlyZWQiLz4KLQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQkJPC94c2Q6c2VxdWVuY2U+Ci0JCTx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zcG9ydElkIiB0eXBlPSJJZGVudGlmaWVyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydFJlZiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhIFRyYW5zcG9ydCBkZWZpbmVkIGVsc2V3aGVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNwb3J0SWQiIHR5cGU9IklkZW50aWZpZXJSZWYiIHVzZT0icmVxdWlyZWQiLz4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0cyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db2xsZWN0aW9uIG9mIFRyYW5zcG9ydHMgZGVmaW50aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJGaWxlVHJhbnNwb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iRlRQVHJhbnNwb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iSFRUUFRyYW5zcG9ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkhUVFBUcmFuc3BvcnRfQ0kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJTTVRQVHJhbnNwb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iU01UUFRyYW5zcG9ydF9DSSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkpNU1RyYW5zcG9ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ik1RU2VyaWVzVHJhbnNwb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWZlcnJlZFRyYW5zcG9ydFJlZiIgdHlwZT0iSWRlbnRpZmllclJlZiIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJGaWxlVHJhbnNwb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkZpbGUgc3lzdGVtIHRyYW5zcG9ydCBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlRyYW5zcG9ydCI+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGlyZWN0b3J5Ij4KLQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGlyZWN0b3J5IG9uIHRoZSBmaWxlIHN5c3RlbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJCQkJCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iRGlyZWN0b3J5Ij4KLQkJCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc0xvY2FsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJCQkJCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJCQkJCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkZUUFRyYW5zcG9ydCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5GaWxlIFRyYW5zZmVyIFByb3RvY29sIHRyYW5zcG9ydCBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlRyYW5zcG9ydCI+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJIb3N0Ii8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQb3J0Ii8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJVc2VybmFtZSIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iUGFzc3dvcmQiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUZW1wRGlyIiB0eXBlPSJEaXJlY3RvcnkiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRpcmVjdG9yeSBvbiB0aGUgRlRQIHNlcnZlciB3aGVyZSBpbmNvbWluZyBkb2N1bWVudHMgYXJlIHRlbXBvcmFyaWx5IHN0b3JlZCBhcyB0aGV5IGFyZSB0cmFuc2ZlcnJlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBpY2t1cERpciIgdHlwZT0iRGlyZWN0b3J5Ij4KLQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EaXJlY3Rvcnkgd2hlcmUgdGhlIGRvY3VtZW50cyBhcmUgbW92ZWQgYWZ0ZXIgaGF2aW5nIGJlZW4gdHJhbnNmZXJyZWQgdG8gdGhlIFRlbXBEaXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc2ZlclR5cGUiIGRlZmF1bHQ9IkJJTkFSWSI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QklOQVJZIG9yIEFTQ0lJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTQ0lJIi8+Ci0JCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSU5BUlkiLz4KLQkJCQkJCQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JCQkJCQkJPC94c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTW9kZSIgZGVmYXVsdD0iUGFzc2l2ZSI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UG9ydCBvciBQYXNzaXZlLiAgUGFzc2l2ZSBtZWFucyB0aGUgRlRQIHNlcnZlciBzZWxlY3RzIHRoZSBkYXRhIHBvcnQgZm9yIHRoZSBGVFAgZGF0YSB0cmFuc2Zlci4gUG9ydCBtZWFucyB0aGUgRlRQIGNsaWVudCBzZWxlY3RzIHRoZSBkYXRhIHBvcnQgZm9yIHRoZSBGVFAgZGF0YSB0cmFuc2Zlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpzaW1wbGVUeXBlPgotCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydCIvPgotCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc2l2ZSIvPgotCQkJCQkJCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkZpcmV3YWxsIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlNvY2tldFNlY3VyaXR5IiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkhUVFBUcmFuc3BvcnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+SHlwZXJUZXh0IFRyYW5zZmVyIFByb3RvY29sIGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iVHJhbnNwb3J0Ij4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJVUkwiIHR5cGU9InhzZDphbnlVUkkiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlVzZXJuYW1lIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBhc3N3b3JkIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2QiIGRlZmF1bHQ9IlBPU1QiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVpdGhlciBQVVQgb3IgUE9TVCB0aGF0IHRoZSBjbGllbnQgc2hvdWxkIHVzZSB0byBwdXNoIGRvY3VlbW50cyB0byB0aGUgc2VydmVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVVQiLz4KLQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBPU1QiLz4KLQkJCQkJCQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JCQkJCQkJPC94c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRG91YmxlTWltZVdyYXBwZWQiIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U29tZSBzZXJ2ZXJzIHdpbGwgc3RyaXAgb2ZmIE1JTUUgd3JhcHBpbmcgb2YgYSBkb2N1bWVudCByZXF1aXJpbmcgdGhhdCB0aGUgZG9jdW1lbnQgYmUgTUlNRSB3cmFwcGVkIHR3aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJGaXJld2FsbCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJTb2NrZXRTZWN1cml0eSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJCTwveHNkOmNvbXBsZXhDb250ZW50PgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJIVFRQVHJhbnNwb3J0X0NJIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkN5Y2xvbmUgSW50ZXJjaGFuZ2UgRW50ZXJwcmlzZSdzIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgSFRUUC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJUcmFuc3BvcnQiPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlVSTCIgdHlwZT0ieHNkOmFueVVSSSIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iRmlyZXdhbGwiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iU29ja2V0U2VjdXJpdHkiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iU01UUFRyYW5zcG9ydCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TaW1wbGUgTWFpbCBUcmFuc3BvcnQgUHJvdG9jb2wgdHJhbnNwb3J0IGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iVHJhbnNwb3J0Ij4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ikhvc3QiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iUG9ydCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJVc2VybmFtZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQYXNzd29yZCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVjaXBpZW50IiB0eXBlPSJFbWFpbCI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RW1haWwgYWRkcmVzcyBvZiB0aGUgcmVjaXBpZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSXNDb21wbGlhbnQiIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIj4KLQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXQgdG8gZmFsc2UgZm9yIFNNVFAgaW1wbGVtZW50YXRpb25zIHRoYXQgZG8gbm90IGxlYXZlIHRoZSBNSU1FIHdyYXBwaW5nIGluIHRhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkZpcmV3YWxsIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlNvY2tldFNlY3VyaXR5IiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlNNVFBUcmFuc3BvcnRfQ0kiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Q3ljbG9uZSBJbnRlcmNoYW5nZSBFbnRlcnByaXNlJ3Mgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBTTVRQLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlRyYW5zcG9ydCI+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJIb3N0IiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBvcnQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlY2lwaWVudCIgdHlwZT0iRW1haWwiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVtYWlsIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iRmlyZXdhbGwiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iU29ja2V0U2VjdXJpdHkiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iSk1TVHJhbnNwb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkphdmEgTWVzc2FnZSBTZXJ2aWNlIChKTVMpIHRyYW5zcG9ydCBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlRyYW5zcG9ydCI+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJVc2VybmFtZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJQYXNzd29yZCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29ubmVjdGlvbkZhY3RvcnkiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBjb25uZWN0aW9uIGZhY3RvcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25zdW1lciI+Ci0JCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIFF1ZXVlIG9yIFRvcGljLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJCQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJKTVNDb25zdW1lclR5cGUiIGRlZmF1bHQ9IlFVRVVFIi8+Ci0JCQkJCQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQkJCQkJCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkpOREkiPgotCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkphdmEgTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlIGRlZmludGlvbiB0byBsb2NhdGUgdGhlIEpNUyBwcm92aWRlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMb2NhdGlvbiIgdHlwZT0ieHNkOmFueVVSSSI+Ci0JCQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIFVSSSBsb2NhdGlvbiBvZiB0aGUgSk1TIHNlcnZlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iVXNlcm5hbWUiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iUGFzc3dvcmQiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRleHRGYWN0b3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgSk5ESSBjb250ZXh0IGZhY3RvcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTVFTZXJpZXNUcmFuc3BvcnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+SUJNJ3MgTVEgU2VyaWVzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0iVHJhbnNwb3J0Ij4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9Ikhvc3QiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBvcnQiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlVzZXJuYW1lIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlBhc3N3b3JkIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJRdWV1ZU1hbmFnZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJRdWV1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoYW5uZWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPCEtLVRoZSBmb2xsb3dpbmcgZGVmaW5lcyBidXNpbmVzcyBwcm90b2NvbCBpbmZvcm1hdGlvbiAtLT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJ1c2luZXNzUHJvdG9jb2wiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QmFzZSBkZWZpbml0aW9uIGZvciBhIGJ1c2luZXNzIHByb3RvY29sLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmVsZW1lbnQgcmVmPSJUcmFuc3BvcnRSZWYiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwveHNkOnNlcXVlbmNlPgotCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJidXNpbmVzc1Byb3RvY29sSWQiIHR5cGU9IklkZW50aWZpZXIiIHVzZT0icmVxdWlyZWQiLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iQnVzaW5lc3NQcm90b2NvbFJlZiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhIGJ1c2luZXNzIHByb3RvY29sIGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJ1c2luZXNzUHJvdG9jb2xJZCIgdHlwZT0iSWRlbnRpZmllclJlZiIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJCdXNpbmVzc1Byb3RvY29scyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db2xsZWN0aW9uIG9mIEJ1c2luZXNzIHByb3RvY29sIGRlZmluaXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmFsbD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQVMxUHJvdG9jb2wiIHR5cGU9IkJ1c2luZXNzUHJvdG9jb2wiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBUzJQcm90b2NvbCIgdHlwZT0iQnVzaW5lc3NQcm90b2NvbCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvc2V0dGFOZXRQcm90b2NvbCIgdHlwZT0iQnVzaW5lc3NQcm90b2NvbCIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9ImViWE1MUHJvdG9jb2wiIHR5cGU9IkJ1c2luZXNzUHJvdG9jb2wiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94c2Q6YWxsPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTwhLS1UaGUgZm9sbG93aW5nIGRlZmluZXMgdGhlIHRvcC1sZXZlbCBPcmdhbml6YXRpb25EYXRhLS0+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik9yZ2FuaXphdGlvblByb2ZpbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QWxsIGluZm9ybWF0aW9uIG5lZWRlZCB0byB0cmFkZSB3aXRoIGFuIG9yZ2FuaXphdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDb21tZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iQWRtaW5pc3RyYXRpdmVJbmZvIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm91dGluZ0lkcyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbGxlY3Rpb24gb2YgUm91dGluZ0lkczwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9IlJvdXRpbmdJZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkJyb2tlcklkIiB0eXBlPSJPcmdhbml6YXRpb25JZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPldpdGhpbiB0aGlzIGNvbW11bml0eSwgdGhpcyBvcmdhbml6YXRpb24gdHJhZGVzIHRocm91Z2ggYSBicm9rZXIgKGh1YikuIFRoaXMgcmVmZXJlbmNlcyBhbm90aGVyIHByb2ZpbGUgd2l0aCB0aGlzIGlkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29tbXVuaXRpZXMiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db2xsZWN0aW9uIG9mIGNvbW11bml0aWVzIHRoZSB0cmFkaW5nIHByb2ZpbGUgaXMgYWN0aXZlbHkgYSBtZW1iZXIgb2YuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IHJlZj0iQ29tbXVuaXR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJUcmFuc3BvcnRzIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJDZXJ0aWZpY2F0ZXMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9IkJ1c2luZXNzUHJvdG9jb2xzIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9Ik9yZ2FuaXphdGlvbklkIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgT3JnYW5pemF0aW9uSWQgZXhpc3RzIGZvciB2YWxpZCBwcm9maWxlcyBleGlzdGluZyB3aXRoaW4gdGhlIHNlcnZlci4gIElmIGEgY2xpZW50IGlzIHNlbmRpbmcgYSBwcm9maWxlIGZvciBhbiBvcmdhbml6YXRpb24gdGhhdCBpcyBub3QgYWxyZWFkeSBpbiB0aGUgc2VydmVyJ3MgcmVwb3NpdG9yeSwgdGhpcyBpZCB3aWxsIG5vdCBiZSBwcmVzZW50IGFzIHRoZSBzZXJ2ZXIgd2lsbCBiZSBhc3NpZ25pbmcgb25lIGZvciBpdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS94a2l0L3NjaGVtYXMvY3ljbG9uZS9JbnRlcmNoYW5nZVBhcnRuZXJDb25maWcueHNkIGIvdjEveGtpdC9zY2hlbWFzL2N5Y2xvbmUvSW50ZXJjaGFuZ2VQYXJ0bmVyQ29uZmlnLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE0OWIxZC4uMDAwMDAwMAotLS0gYS92MS94a2l0L3NjaGVtYXMvY3ljbG9uZS9JbnRlcmNoYW5nZVBhcnRuZXJDb25maWcueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIGVkaXRlZCB3aXRoIFhNTCBTcHkgdjQuMyBVIChodHRwOi8vd3d3LnhtbHNweS5jb20pIGJ5IEJvYiBLcmllciAoQ3ljbG9uZSBDT21tZXJjZSwgSW5jLikgLS0+Ci08IS0tVzNDIFNjaGVtYSBnZW5lcmF0ZWQgYnkgWE1MIFNweSB2My41IE5UIChodHRwOi8vd3d3LnhtbHNweS5jb20pLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuY3ljbG9uZWNvbW1lcmNlLmNvbS9TY2hlbWFzLzIwMDEvMDkvaXBwIiB4bWxucz0iaHR0cDovL3d3dy5jeWNsb25lY29tbWVyY2UuY29tL1NjaGVtYXMvMjAwMS8wOS9pcHAiIHhtbG5zOmNvcD0iaHR0cDovL3d3dy5jeWNsb25lY29tbWVyY2UuY29tL1NjaGVtYXMvMjAwMS8wOC9jb3AiIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiPgotCTx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5jeWNsb25lY29tbWVyY2UuY29tL1NjaGVtYXMvMjAwMS8wOC9jb3AiIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmN5Y2xvbmVjb21tZXJjZS5jb20vU2NoZW1hcy8yMDAxLzA4L0N5Y2xvbmVPcmdhbml6YXRpb25Qcm9maWxlLnhzZCIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmNoYW5nZVBhcnRuZXJQcm9maWxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkN5Y2xvbmUgSW50ZXJjaGFuZ2UgcGFydG5lciBwcm9maWxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCByZWY9ImNvcDpPcmdhbml6YXRpb25Qcm9maWxlIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2Vjb25kYXJ5SWRzIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2Vjb25kYXJ5SWQiIHR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJmYWxzZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0iUHJlZmVyZW5jZXMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJGaXJld2FsbCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1pblNLZXlJdGVyYXRpb25Db3VudCI+Ci0JCQkJCQkJCTx4c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQkJCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmludCI+Ci0JCQkJCQkJCQkJPHhzZDptaW5JbmNsdXNpdmUgdmFsdWU9IjAiLz4KLQkJCQkJCQkJCQk8eHNkOm1heEluY2x1c2l2ZSB2YWx1ZT0iNjU1MzUiLz4KLQkJCQkJCQkJCTwveHNkOnJlc3RyaWN0aW9uPgotCQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2VjdXJpdHkiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TZWN1cml0eSBwYXJhbWV0ZXJzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEb2N1bWVudFNpZ25pbmciIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Qm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIGRvY3VtZW50cyByZWNlaXZlZCBieSB0aGlzIHBhcnRuZXIgc2hvdWxkIGJlIHNpZ25lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRvY3VtZW50QWNrbm93bGVkZ2VtZW50IiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RG9jdW1lbnQgYWNrbm93bGVkZ2VtZW50IGNvbmZpZ3VyYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcXVlc3RTaWduZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBkb2N1bWVudCBhY2tub3dsZWRnbWVudHMgc2hvdWxkIGJlIHNpZ25lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcXVlc3RTeW5jaHJvbm91cyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Qm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIGFja25vd2xlZGdlbWVudHMgc2hvdWxkIGJlIGltbWVkaWF0ZWx5IHJlY2VpdmVkLiAgUmVxdWlyZXMgYnVuZGxlZCBIVFRQKFMpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpib29sZWFuIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1lc3NhZ2VEaWdlc3QiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBkb2N1bWVudCBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aGltIHRvIHVzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNRDUiLz4KLQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSEExIi8+Ci0JCQkJCQkJCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJCQkJCQkJPC94c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEb2N1bWVudEVuY3J5cHRpb24iIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSB0eXBlIG9mIGRvY3VtZW50IGVuY3J5cHRpb24gYWxnb3JpdGhpbSB0byB1c2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCTx4c2Q6Y2hvaWNlPgotCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSQzJFbmNyeXB0aW9uIj4KLQkJCQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJDMiBFbmNyeXB0aW9uIGFsZ29yaXRoaW0uICBLZXkgbGVuZ3RoIGlzIHJlcXVpcmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJrZXlMZW5ndGgiIHVzZT0icmVxdWlyZWQiPgotCQkJCQkJCQkJCQkJCTx4c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQkJCQkJCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0JCQkJCQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MCIvPgotCQkJCQkJCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjQiLz4KLQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEyOCIvPgotCQkJCQkJCQkJCQkJCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJCQkJCQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJCQkJCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBUkNGb3VyRW5jcnlwdGlvbiI+Ci0JCQkJCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BUkNGb3VyIEVuY3J5cHRpb24gYWxnb3JpdGhpbS4gIEtleSBsZW5ndGggaXMgcmVxdWlyZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImtleUxlbmd0aCIgdXNlPSJyZXF1aXJlZCI+Ci0JCQkJCQkJCQkJCQkJPHhzZDpzaW1wbGVUeXBlPgotCQkJCQkJCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQwIi8+Ci0JCQkJCQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2NCIvPgotCQkJCQkJCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTI4Ii8+Ci0JCQkJCQkJCQkJCQkJCTwveHNkOnJlc3RyaWN0aW9uPgotCQkJCQkJCQkJCQkJCTwveHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRFU0VuY3J5cHRpb24iPgotCQkJCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+REVTIEVuY3J5cHRpb24gYWxnb3JpdGhpbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ia2V5TGVuZ3RoIiB0eXBlPSJ4c2Q6aW50IiB1c2U9Im9wdGlvbmFsIiBmaXhlZD0iNTYiLz4KLQkJCQkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVHJpcGxlREVTRW5jcnlwdGlvbiI+Ci0JCQkJCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UcmlwbGUgREVTIEVuY3J5cHRpb24gYWxnb3JpdGhpbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ia2V5TGVuZ3RoIiB0eXBlPSJ4c2Q6aW50IiB1c2U9Im9wdGlvbmFsIiBmaXhlZD0iMTY4Ii8+Ci0JCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmluYXJ5RGlyZWN0b3JpZXMiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBiaW5hcnkgY29tcGFuaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCaW5hcnlDb21wYW55IiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBiaW5hcnkgZGlyZWN0b3JpZXMgZm9yIGEgY29tcGFueS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmluYXJ5RGlyZWN0b3J5IiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBpbmJvdW5kIGFuZCBvdXRib3VuZCBiaW5hcnkgZGlyZWN0b3JpZXMgZm9yIGEgcGFydG5lci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFydG5lcklkIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCQkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbmJvdW5kUGF0aCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCQkJCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3V0Ym91bmRQYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbXBhbnlJZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Imdyb3VwIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlByZWZlcmVuY2VzIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlBhcnRuZXIgcHJvZmlsZSB0cmFuc3BvcnQgYW5kIGRvY3VtZW50IHNldHRpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTY2hlZHVsZSIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgc2NoZWR1bGUgdG8gdXNlIHdoZW4gc2VuZGluZyBkb2N1bWVudHMgdG8gdGhpcyBwYXJ0bmVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW5ib3VuZEZpbGVQcmVzZXJ2YXRpb24iIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgaW5ib3VuZCBmaWxlcyBzaG91bGQgYmUgcGVyc2lzdGVkIHdpdGggdGhlaXIgb3JpZ2luYWwgZmlsZSBuYW1lLiAgT3B0aW9uIGF0dHJpYnV0ZSBhbGxvd3MgZm9yIG92ZXJ3cml0aW5nIG9yIHNlcXVlbmNpbmcgZmlsZXMgd2l0aCBkdXBsaWNhdGUgZmlsZSBuYW1lcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9IkRvY3VtZW50T3B0aW9ucyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkdsb2JhbCBkb2N1bWVudCBjb25maWd1cmF0aW9uIG9wdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlamVjdER1cGxpY2F0ZUVESSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Qm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIEVESSBkb2N1bWVudCByZWNpZXZlZCB3aXRoIGR1cGxpY2F0ZSBjb250cm9sIElEcyBzaG91bGQgYmUgcmVqZWN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21wcmVzc2lvbiIgZGVmYXVsdD0iTk9ORSIgbmlsbGFibGU9ImZhbHNlIj4KLQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB0aGUgdHlwZSBvZiBjb21wcmVzc2lvbiBhbGdvcml0aGltIHRvIHVzZSAoTk9ORSwgR1pJUCBvciBaTElCKS4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJPHhzZDpzaW1wbGVUeXBlPgotCQkJCQkJCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHWklQIi8+Ci0JCQkJCQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWkxJQiIvPgotCQkJCQkJCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLQkJCQkJCQkJCTwveHNkOnJlc3RyaWN0aW9uPgotCQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc2VuZEF0dGVtcHRzIj4KLQkJCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkludGVnZXIgdmFsdWUgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgZG9jdW1lbnQgc2hvdWxkIGJlIHJlc2VudCBpZiBhbiBhY2tub3dsZWRtZW50IGhhcyBub3QgYmVlbiByZWNpZXZlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDppbnQiPgotCQkJCQkJCQkJCTx4c2Q6bWluSW5jbHVzaXZlIHZhbHVlPSIwIi8+Ci0JCQkJCQkJCQkJPHhzZDptYXhJbmNsdXNpdmUgdmFsdWU9IjYwIi8+Ci0JCQkJCQkJCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJCQkJCQkJPC94c2Q6c2ltcGxlVHlwZT4KLQkJCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNlbmRJbnRlcnZhbCI+Ci0JCQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbnRlZ2VyIHZhbHVlIGluZGljYXRpbmcgdGhlIGR1cmF0aW9uIChpbiBob3VycykgYmV0d2VlbiByZXNlbmQgYXR0ZXB0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQkJCQk8eHNkOnNpbXBsZVR5cGU+Ci0JCQkJCQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDppbnQiPgotCQkJCQkJCQkJCTx4c2Q6bWluSW5jbHVzaXZlIHZhbHVlPSIxIi8+Ci0JCQkJCQkJCQkJPHhzZDptYXhJbmNsdXNpdmUgdmFsdWU9Ijk5OTkiLz4KLQkJCQkJCQkJCTwveHNkOnJlc3RyaWN0aW9uPgotCQkJCQkJCQk8L3hzZDpzaW1wbGVUeXBlPgotCQkJCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0UmV0cmllcyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgVHJhbnNwb3J0IHJldHJpZXMgb3B0aW9uIGFuZCBpbnRlcnZhbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZHVyYXRpb24iIHR5cGU9InhzZDppbnRlZ2VyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmYWxsb2ZmIiB0eXBlPSJ4c2Q6aW50ZWdlciIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCQk8L3hzZDplbGVtZW50PgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCdXNpbmVzc1Byb3RvY29sIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkJhc2UgZGVmaW5pdGlvbiBmb3IgYSBidXNpbmVzcyBwcm90b2NvbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJPHhzZDplbGVtZW50IHJlZj0iVHJhbnNwb3J0UmVmIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYnVzaW5lc3NQcm90b2NvbElkIiB0eXBlPSJ4c2Q6SURSRUYiIHVzZT0icmVxdWlyZWQiLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0UmVmIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmZXJlbmNlIHRvIGEgVHJhbnNwb3J0IGRlZmluZWQgZWxzZXdoZXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3hraXQvc2NoZW1hcy9jeWNsb25lL1RQTS54c2QgYi92MS94a2l0L3NjaGVtYXMvY3ljbG9uZS9UUE0ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmI2MmY0Li4wMDAwMDAwCi0tLSBhL3YxL3hraXQvc2NoZW1hcy9jeWNsb25lL1RQTS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tCUNvcHlyaWdodCAoYykgMjAwMC0yMDAzIEJFQSBTeXN0ZW1zLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCUFsbCByaWdodHMgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCVRISVMgSVMgVU5QVUJMSVNIRUQgUFJPUFJJRVRBUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCVNPVVJDRSBDT0RFIE9GIEJFQSBTeXN0ZW1zLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCVRoZSBjb3B5cmlnaHQgbm90aWNlIGFib3ZlIGRvZXMgbm90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCWV2aWRlbmNlIGFueSBhY3R1YWwgb3IgaW50ZW5kZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCXB1YmxpY2F0aW9uIG9mIHN1Y2ggc291cmNlIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAkSWQ6IFRQTS54c2QsdiAxLjEgMjAwMy8wOS8xNSAxODoyMDo0OCBlcmljdmFzIEV4cCAkIC0tPgotPHhzOnNjaGVtYQotICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuYmVhLmNvbS8yMDAzLzAzL3dsaS90cG0iCi0gIHhtbG5zPSJodHRwOi8vd3d3LmJlYS5jb20vMjAwMy8wMy93bGkvdHBtIgotICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIgotICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0JPHhzOmltcG9ydAotICAgIG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIKLSAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sZHNpZy1jb3JlL3htbGRzaWctY29yZS1zY2hlbWEueHNkIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0idHJhZGluZy1wYXJ0bmVyLW1hbmFnZW1lbnQiPgotCQk8eHM6YW5ub3RhdGlvbj4KLQkJCTx4czpkb2N1bWVudGF0aW9uPlRoaXMgaXMgdGhlIHJvb3QgZWxlbWVudCBpbiB0aGUgVFBNIHJlcG9zaXRvcnkuPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InRyYWRpbmctcGFydG5lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0ic2VydmljZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZS10cmFja2luZy1kZWZhdWx0IiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1FVEFEQVRBIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFMTCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWN1cmUtYXVkaXQtbG9nZ2luZyIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0ZXN0LW1vZGUiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0idHJhZGluZy1wYXJ0bmVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0iYWRkcmVzcyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJleHRlbmRlZC1wcm9wZXJ0eS1zZXQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9ImNsaWVudC1jZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9InNlcnZlci1jZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4czplbGVtZW50IHJlZj0iZW5jcnlwdGlvbi1jZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHM6ZWxlbWVudCByZWY9InNpZ25hdHVyZS1jZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHM6Y2hvaWNlPgotICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iZWJ4bWwtYmluZGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0icm9zZXR0YW5ldC1iaW5kaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ3ZWItc2VydmljZS1iaW5kaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6Y2hvaWNlPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibm90ZXMiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMT0NBTCIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRU1PVEUiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaXMtZGVmYXVsdCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJidXNpbmVzcy1pZC10eXBlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iYnVzaW5lc3MtaWQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbWFpbCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InBob25lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZmF4IiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idXNlcm5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiB0eXBlPSJ4czpzdHJpbmciLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbmRlZC1wcm9wZXJ0eS1zZXQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibm90ZXMiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InhtbC1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWF0dHJpYnV0ZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY2xpZW50LWNlcnRpZmljYXRlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0iZHM6S2V5SW5mbyIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzOmhleEJpbmFyeSIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJzZXJ2ZXItY2VydGlmaWNhdGUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJkczpLZXlJbmZvIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHM6aGV4QmluYXJ5IiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImVuY3J5cHRpb24tY2VydGlmaWNhdGUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJkczpLZXlJbmZvIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHM6aGV4QmluYXJ5IiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InNpZ25hdHVyZS1jZXJ0aWZpY2F0ZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9ImRzOktleUluZm8iIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4czpoZXhCaW5hcnkiIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZWJ4bWwtYmluZGluZyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InNpZ25hdHVyZS10cmFuc2Zvcm1zIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InRyYW5zcG9ydCIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iYnVzaW5lc3MtcHJvdG9jb2wtbmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImJ1c2luZXNzLXByb3RvY29sLXZlcnNpb24iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpcy1kZWZhdWx0IiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImlzLXNpZ25hdHVyZS1yZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpcy1yZWNlaXB0LXNpZ25hdHVyZS1yZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzaWduYXR1cmUtY2VydGlmaWNhdGUtbmFtZSIgdHlwZT0icmVmZXJlbmNlIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRlbGl2ZXJ5LXNlbWFudGljcyIgdXNlPSJvcHRpb25hbCI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCZXN0RWZmb3J0Ii8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJFU1RFRkZPUlQiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPbmNlQW5kT25seU9uY2UiLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT05DRUFORE9OTFlPTkNFIi8+Ci0JCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQXRMZWFzdE9uY2UiLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQVRMRUFTVE9OQ0UiLz4KLQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBdE1vc3RPbmNlIi8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFUTU9TVE9OQ0UiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icmV0cmllcyIgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHJ5LWludGVydmFsIiB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icGVyc2lzdC1kdXJhdGlvbiIgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InNpZ25hdHVyZS10cmFuc2Zvcm1zIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ieHBhdGgiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJ4cGF0aCIvPgotCTx4czplbGVtZW50IG5hbWU9InJvc2V0dGFuZXQtYmluZGluZyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9ImZhaWx1cmUtcmVwb3J0LWFkbWluaXN0cmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IHJlZj0iZmFpbHVyZS1ub3RpZmllciIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJ0cmFuc3BvcnQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImJ1c2luZXNzLXByb3RvY29sLW5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJidXNpbmVzcy1wcm90b2NvbC12ZXJzaW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaXMtZGVmYXVsdCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbmNyeXB0aW9uLWNlcnRpZmljYXRlLW5hbWUiIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJjaXBoZXItYWxnb3JpdGhtIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJDNSIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJERVMiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVFJJUExFX0RFUyIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbmNyeXB0aW9uLWxldmVsIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBBWUxPQUQiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRU5USVJFX1BBWUxPQUQiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaXMtc2lnbmF0dXJlLXJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImlzLXJlY2VpcHQtc2lnbmF0dXJlLXJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InNpZ25hdHVyZS1jZXJ0aWZpY2F0ZS1uYW1lIiB0eXBlPSJyZWZlcmVuY2UiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icmV0cmllcyIgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHJ5LWludGVydmFsIiB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icHJvY2Vzcy10aW1lb3V0IiB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZmFpbHVyZS1yZXBvcnQtYWRtaW5pc3RyYXRvciI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idHJhZGluZy1wYXJ0bmVyLW5hbWUiIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJiaW5kaW5nLW5hbWUiIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJmYWlsdXJlLW5vdGlmaWVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0cmFkaW5nLXBhcnRuZXItbmFtZSIgdHlwZT0icmVmZXJlbmNlIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImJpbmRpbmctbmFtZSIgdHlwZT0icmVmZXJlbmNlIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9IndlYi1zZXJ2aWNlLWJpbmRpbmciPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJ0cmFuc3BvcnQiIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InRyYW5zcG9ydCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9ImF1dGhlbnRpY2F0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwcm90b2NvbCIgdXNlPSJyZXF1aXJlZCI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaHR0cCIvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJIVFRQIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imh0dHBzIi8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkhUVFBTIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImptcyIvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJKTVMiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icHJvdG9jb2wtdmVyc2lvbiIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImVuZHBvaW50IiB0eXBlPSJ4czphbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYXV0aGVudGljYXRpb24iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImNsaWVudC1wYXJ0bmVyLW5hbWUiIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGllbnQtYXV0aGVudGljYXRpb24iIHVzZT0ib3B0aW9uYWwiPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQkFTSUMiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU1NMX0NFUlQiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idXNlcm5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHM6aGV4QmluYXJ5IiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImNsaWVudC1jZXJ0aWZpY2F0ZS1uYW1lIiB0eXBlPSJyZWZlcmVuY2UiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ic2VydmVyLWF1dGhlbnRpY2F0aW9uIiB1c2U9Im9wdGlvbmFsIj4KLQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNTTF9DRVJUX01VVFVBTCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZXJ2ZXItY2VydGlmaWNhdGUtbmFtZSIgdHlwZT0icmVmZXJlbmNlIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InNlcnZpY2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJzZXJ2aWNlLXByb2ZpbGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9InJvc2V0dGFuZXQtc2VydmljZS1kZWZhdWx0cyIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibm90ZXMiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZXJ2aWNlLXR5cGUiIHVzZT0ib3B0aW9uYWwiPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IldFQlNFUlZJQ0UiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPQ0VTUyIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTRVJWSUNFQ09OVFJPTCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJidXNpbmVzcy1wcm90b2NvbCIgdXNlPSJvcHRpb25hbCI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iV0VCU0VSVklDRSIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFQlhNTCIvPgotCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJST1NFVFRBTkVUIi8+Ci0JCQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCQkJPC94czpzaW1wbGVUeXBlPgotCQkJPC94czphdHRyaWJ1dGU+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InNlcnZpY2UtcHJvZmlsZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibG9jYWwtdHJhZGluZy1wYXJ0bmVyIiB0eXBlPSJyZWZlcmVuY2UiIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibG9jYWwtYmluZGluZyIgdHlwZT0icmVmZXJlbmNlIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsLXRyYWRpbmctcGFydG5lciIgdHlwZT0icmVmZXJlbmNlIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsLWJpbmRpbmciIHR5cGU9InJlZmVyZW5jZSIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdGF0dXMiIHVzZT0ib3B0aW9uYWwiPgotCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVOQUJMRUQiLz4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRElTQUJMRUQiLz4KLQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQk8L3hzOnNpbXBsZVR5cGU+Ci0JCQk8L3hzOmF0dHJpYnV0ZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZS10cmFja2luZyIgdXNlPSJvcHRpb25hbCI+Ci0JCQkJPHhzOnNpbXBsZVR5cGU+Ci0JCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJERUZBVUxUIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1FVEFEQVRBIi8+Ci0JCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFMTCIvPgotCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCTwveHM6YXR0cmlidXRlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJyb3NldHRhbmV0LXNlcnZpY2UtZGVmYXVsdHMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InNlcnZpY2UtY29udGVudC1zY2hlbWEiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UtZHRkLXZhbGlkYXRpb24iIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idmFsaWRhdGUtc2VydmljZS1jb250ZW50IiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRlLXNlcnZpY2UtaGVhZGVyIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czpzaW1wbGVUeXBlIG5hbWU9InJlZmVyZW5jZSI+Ci0JCTx4czphbm5vdGF0aW9uPgotCQkJPHhzOmRvY3VtZW50YXRpb24+UmVmZXJlbmNlIHRvIGFub3RoZXIgZWxlbWVudCBpbiB0aGUgVFBNIHJlcG9zaXRvcnkuPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLQk8L3hzOnNpbXBsZVR5cGU+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3hraXQvc2NoZW1hcy9jeWNsb25lL2RzaWcveG1sZHNpZy1jb3JlLXNjaGVtYS54c2QgYi92MS94a2l0L3NjaGVtYXMvY3ljbG9uZS9kc2lnL3htbGRzaWctY29yZS1zY2hlbWEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzZlNzM0Li4wMDAwMDAwCi0tLSBhL3YxL3hraXQvc2NoZW1hcy9jeWNsb25lL2RzaWcveG1sZHNpZy1jb3JlLXNjaGVtYS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhRE9DVFlQRSBzY2hlbWEKLSAgUFVCTElDICItLy9XM0MvL0RURCBYTUxTY2hlbWEgMjAwMTAyLy9FTiIgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLmR0ZCIKLSBbCi0gICA8IUFUVExJU1Qgc2NoZW1hIAotICAgICB4bWxuczpkcyBDREFUQSAjRklYRUQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgotICAgPCFFTlRJVFkgZHNpZyAnaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyc+Ci0gICA8IUVOVElUWSAlIHAgJyc+Ci0gICA8IUVOVElUWSAlIHMgJyc+Ci0gIF0+Ci0KLTwhLS0gU2NoZW1hIGZvciBYTUwgU2lnbmF0dXJlcwotICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMKLSAgICAkUmV2aXNpb246IDEuMSAkIG9uICREYXRlOiAyMDAzLzA5LzE1IDE4OjIwOjQ4ICQgYnkgJEF1dGhvcjogZXJpY3ZhcyAkCi0KLSAgICBDb3B5cmlnaHQgMjAwMSBUaGUgSW50ZXJuZXQgU29jaWV0eSBhbmQgVzNDIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZQotICAgIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4KLSAgICBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLwotCi0gICAgVGhpcyBkb2N1bWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgVzNDIFNvZnR3YXJlIExpY2Vuc2UgWzFdIGFzIGRlc2NyaWJlZAotICAgIGluIHRoZSBGQVEgWzJdLgotCi0gICAgWzFdIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwCi0gICAgWzJdIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvSVBSLUZBUS0yMDAwMDYyMC5odG1sI0RURAotLS0+Ci0KLQotPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIgotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiCi0gICAgICAgIHZlcnNpb249IjAuMSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPiAKLQotPCEtLSBCYXNpYyBUeXBlcyBEZWZpbmVkIGZvciBTaWduYXR1cmVzIC0tPgotCi08c2ltcGxlVHlwZSBuYW1lPSJDcnlwdG9CaW5hcnkiPgotICA8cmVzdHJpY3Rpb24gYmFzZT0iYmFzZTY0QmluYXJ5Ij4KLSAgPC9yZXN0cmljdGlvbj4KLTwvc2ltcGxlVHlwZT4KLQotPCEtLSBTdGFydCBTaWduYXR1cmUgLS0+Ci0KLTxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZSIgdHlwZT0iZHM6U2lnbmF0dXJlVHlwZSIvPgotPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25hdHVyZVR5cGUiPgotICA8c2VxdWVuY2U+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmVkSW5mbyIvPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOlNpZ25hdHVyZVZhbHVlIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6S2V5SW5mbyIgbWluT2NjdXJzPSIwIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6T2JqZWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+IAotICA8L3NlcXVlbmNlPiAgCi0gIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+Ci08L2NvbXBsZXhUeXBlPgotCi0gIDxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZVZhbHVlIiB0eXBlPSJkczpTaWduYXR1cmVWYWx1ZVR5cGUiLz4gCi0gIDxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVWYWx1ZVR5cGUiPgotICAgIDxzaW1wbGVDb250ZW50PgotICAgICAgPGV4dGVuc2lvbiBiYXNlPSJiYXNlNjRCaW5hcnkiPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgPC9leHRlbnNpb24+Ci0gICAgPC9zaW1wbGVDb250ZW50PgotICA8L2NvbXBsZXhUeXBlPgotCi08IS0tIFN0YXJ0IFNpZ25lZEluZm8gLS0+Ci0KLTxlbGVtZW50IG5hbWU9IlNpZ25lZEluZm8iIHR5cGU9ImRzOlNpZ25lZEluZm9UeXBlIi8+Ci08Y29tcGxleFR5cGUgbmFtZT0iU2lnbmVkSW5mb1R5cGUiPgotICA8c2VxdWVuY2U+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCIvPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOlNpZ25hdHVyZU1ldGhvZCIvPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOlJlZmVyZW5jZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gCi0gIDwvc2VxdWVuY2U+ICAKLSAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4gCi08L2NvbXBsZXhUeXBlPgotCi0gIDxlbGVtZW50IG5hbWU9IkNhbm9uaWNhbGl6YXRpb25NZXRob2QiIHR5cGU9ImRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlIi8+IAotICA8Y29tcGxleFR5cGUgbmFtZT0iQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgICA8YW55IG5hbWVzcGFjZT0iIyNhbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwhLS0gKDAsdW5ib3VuZGVkKSBlbGVtZW50cyBmcm9tICgxLDEpIG5hbWVzcGFjZSAtLT4KLSAgICA8L3NlcXVlbmNlPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iQWxnb3JpdGhtIiB0eXBlPSJhbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4gCi0gIDwvY29tcGxleFR5cGU+Ci0KLSAgPGVsZW1lbnQgbmFtZT0iU2lnbmF0dXJlTWV0aG9kIiB0eXBlPSJkczpTaWduYXR1cmVNZXRob2RUeXBlIi8+Ci0gIDxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVNZXRob2RUeXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0iSE1BQ091dHB1dExlbmd0aCIgbWluT2NjdXJzPSIwIiB0eXBlPSJkczpITUFDT3V0cHV0TGVuZ3RoVHlwZSIvPgotICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwhLS0gKDAsdW5ib3VuZGVkKSBlbGVtZW50cyBmcm9tICgxLDEpIGV4dGVybmFsIG5hbWVzcGFjZSAtLT4KLSAgICA8L3NlcXVlbmNlPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iQWxnb3JpdGhtIiB0eXBlPSJhbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4gCi0gIDwvY29tcGxleFR5cGU+Ci0KLTwhLS0gU3RhcnQgUmVmZXJlbmNlIC0tPgotCi08ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2UiIHR5cGU9ImRzOlJlZmVyZW5jZVR5cGUiLz4KLTxjb21wbGV4VHlwZSBuYW1lPSJSZWZlcmVuY2VUeXBlIj4KLSAgPHNlcXVlbmNlPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOlRyYW5zZm9ybXMiIG1pbk9jY3Vycz0iMCIvPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOkRpZ2VzdE1ldGhvZCIvPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOkRpZ2VzdFZhbHVlIi8+IAotICA8L3NlcXVlbmNlPgotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKLSAgPGF0dHJpYnV0ZSBuYW1lPSJVUkkiIHR5cGU9ImFueVVSSSIgdXNlPSJvcHRpb25hbCIvPiAKLSAgPGF0dHJpYnV0ZSBuYW1lPSJUeXBlIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4gCi08L2NvbXBsZXhUeXBlPgotCi0gIDxlbGVtZW50IG5hbWU9IlRyYW5zZm9ybXMiIHR5cGU9ImRzOlRyYW5zZm9ybXNUeXBlIi8+Ci0gIDxjb21wbGV4VHlwZSBuYW1lPSJUcmFuc2Zvcm1zVHlwZSI+Ci0gICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgcmVmPSJkczpUcmFuc2Zvcm0iIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAKLSAgICA8L3NlcXVlbmNlPgotICA8L2NvbXBsZXhUeXBlPgotCi0gIDxlbGVtZW50IG5hbWU9IlRyYW5zZm9ybSIgdHlwZT0iZHM6VHJhbnNmb3JtVHlwZSIvPgotICA8Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNmb3JtVHlwZSIgbWl4ZWQ9InRydWUiPgotICAgIDxjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+IAotICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgICA8IS0tICgxLDEpIGVsZW1lbnRzIGZyb20gKDAsdW5ib3VuZGVkKSBuYW1lc3BhY2VzIC0tPgotICAgICAgPGVsZW1lbnQgbmFtZT0iWFBhdGgiIHR5cGU9InN0cmluZyIvPiAKLSAgICA8L2Nob2ljZT4KLSAgICA8YXR0cmlidXRlIG5hbWU9IkFsZ29yaXRobSIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+IAotICA8L2NvbXBsZXhUeXBlPgotCi08IS0tIEVuZCBSZWZlcmVuY2UgLS0+Ci0KLTxlbGVtZW50IG5hbWU9IkRpZ2VzdE1ldGhvZCIgdHlwZT0iZHM6RGlnZXN0TWV0aG9kVHlwZSIvPgotPGNvbXBsZXhUeXBlIG5hbWU9IkRpZ2VzdE1ldGhvZFR5cGUiIG1peGVkPSJ0cnVlIj4gCi0gIDxzZXF1ZW5jZT4KLSAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgPC9zZXF1ZW5jZT4gICAgCi0gIDxhdHRyaWJ1dGUgbmFtZT0iQWxnb3JpdGhtIiB0eXBlPSJhbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4gCi08L2NvbXBsZXhUeXBlPgotCi08ZWxlbWVudCBuYW1lPSJEaWdlc3RWYWx1ZSIgdHlwZT0iZHM6RGlnZXN0VmFsdWVUeXBlIi8+Ci08c2ltcGxlVHlwZSBuYW1lPSJEaWdlc3RWYWx1ZVR5cGUiPgotICA8cmVzdHJpY3Rpb24gYmFzZT0iYmFzZTY0QmluYXJ5Ii8+Ci08L3NpbXBsZVR5cGU+Ci0KLTwhLS0gRW5kIFNpZ25lZEluZm8gLS0+Ci0KLTwhLS0gU3RhcnQgS2V5SW5mbyAtLT4KLQotPGVsZW1lbnQgbmFtZT0iS2V5SW5mbyIgdHlwZT0iZHM6S2V5SW5mb1R5cGUiLz4gCi08Y29tcGxleFR5cGUgbmFtZT0iS2V5SW5mb1R5cGUiIG1peGVkPSJ0cnVlIj4KLSAgPGNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+ICAgICAKLSAgICA8ZWxlbWVudCByZWY9ImRzOktleU5hbWUiLz4gCi0gICAgPGVsZW1lbnQgcmVmPSJkczpLZXlWYWx1ZSIvPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOlJldHJpZXZhbE1ldGhvZCIvPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOlg1MDlEYXRhIi8+IAotICAgIDxlbGVtZW50IHJlZj0iZHM6UEdQRGF0YSIvPiAKLSAgICA8ZWxlbWVudCByZWY9ImRzOlNQS0lEYXRhIi8+Ci0gICAgPGVsZW1lbnQgcmVmPSJkczpNZ210RGF0YSIvPgotICAgIDxhbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIvPgotICAgIDwhLS0gKDEsMSkgZWxlbWVudHMgZnJvbSAoMCx1bmJvdW5kZWQpIG5hbWVzcGFjZXMgLS0+Ci0gIDwvY2hvaWNlPgotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKLTwvY29tcGxleFR5cGU+Ci0KLSAgPGVsZW1lbnQgbmFtZT0iS2V5TmFtZSIgdHlwZT0ic3RyaW5nIi8+Ci0gIDxlbGVtZW50IG5hbWU9Ik1nbXREYXRhIiB0eXBlPSJzdHJpbmciLz4KLQotICA8ZWxlbWVudCBuYW1lPSJLZXlWYWx1ZSIgdHlwZT0iZHM6S2V5VmFsdWVUeXBlIi8+IAotICA8Y29tcGxleFR5cGUgbmFtZT0iS2V5VmFsdWVUeXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICA8Y2hvaWNlPgotICAgICA8ZWxlbWVudCByZWY9ImRzOkRTQUtleVZhbHVlIi8+Ci0gICAgIDxlbGVtZW50IHJlZj0iZHM6UlNBS2V5VmFsdWUiLz4KLSAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L2Nob2ljZT4KLSAgPC9jb21wbGV4VHlwZT4KLQotICA8ZWxlbWVudCBuYW1lPSJSZXRyaWV2YWxNZXRob2QiIHR5cGU9ImRzOlJldHJpZXZhbE1ldGhvZFR5cGUiLz4gCi0gIDxjb21wbGV4VHlwZSBuYW1lPSJSZXRyaWV2YWxNZXRob2RUeXBlIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCByZWY9ImRzOlRyYW5zZm9ybXMiIG1pbk9jY3Vycz0iMCIvPiAKLSAgICA8L3NlcXVlbmNlPiAgCi0gICAgPGF0dHJpYnV0ZSBuYW1lPSJVUkkiIHR5cGU9ImFueVVSSSIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iVHlwZSIgdHlwZT0iYW55VVJJIiB1c2U9Im9wdGlvbmFsIi8+Ci0gIDwvY29tcGxleFR5cGU+Ci0KLTwhLS0gU3RhcnQgWDUwOURhdGEgLS0+Ci0KLTxlbGVtZW50IG5hbWU9Ilg1MDlEYXRhIiB0eXBlPSJkczpYNTA5RGF0YVR5cGUiLz4gCi08Y29tcGxleFR5cGUgbmFtZT0iWDUwOURhdGFUeXBlIj4KLSAgPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICA8Y2hvaWNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOUlzc3VlclNlcmlhbCIgdHlwZT0iZHM6WDUwOUlzc3VlclNlcmlhbFR5cGUiLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlTS0kiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOVN1YmplY3ROYW1lIiB0eXBlPSJzdHJpbmciLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlDZXJ0aWZpY2F0ZSIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJYNTA5Q1JMIiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4KLSAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgIDwvY2hvaWNlPgotICA8L3NlcXVlbmNlPgotPC9jb21wbGV4VHlwZT4KLQotPGNvbXBsZXhUeXBlIG5hbWU9Ilg1MDlJc3N1ZXJTZXJpYWxUeXBlIj4gCi0gIDxzZXF1ZW5jZT4gCi0gICAgPGVsZW1lbnQgbmFtZT0iWDUwOUlzc3Vlck5hbWUiIHR5cGU9InN0cmluZyIvPiAKLSAgICA8ZWxlbWVudCBuYW1lPSJYNTA5U2VyaWFsTnVtYmVyIiB0eXBlPSJpbnRlZ2VyIi8+IAotICA8L3NlcXVlbmNlPgotPC9jb21wbGV4VHlwZT4KLQotPCEtLSBFbmQgWDUwOURhdGEgLS0+Ci0KLTwhLS0gQmVnaW4gUEdQRGF0YSAtLT4KLQotPGVsZW1lbnQgbmFtZT0iUEdQRGF0YSIgdHlwZT0iZHM6UEdQRGF0YVR5cGUiLz4gCi08Y29tcGxleFR5cGUgbmFtZT0iUEdQRGF0YVR5cGUiPiAKLSAgPGNob2ljZT4KLSAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJQR1BLZXlJRCIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+IAotICAgICAgPGVsZW1lbnQgbmFtZT0iUEdQS2V5UGFja2V0IiB0eXBlPSJiYXNlNjRCaW5hcnkiIG1pbk9jY3Vycz0iMCIvPiAKLSAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJQR1BLZXlQYWNrZXQiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPiAKLSAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgPC9jaG9pY2U+Ci08L2NvbXBsZXhUeXBlPgotCi08IS0tIEVuZCBQR1BEYXRhIC0tPgotCi08IS0tIEJlZ2luIFNQS0lEYXRhIC0tPgotCi08ZWxlbWVudCBuYW1lPSJTUEtJRGF0YSIgdHlwZT0iZHM6U1BLSURhdGFUeXBlIi8+IAotPGNvbXBsZXhUeXBlIG5hbWU9IlNQS0lEYXRhVHlwZSI+Ci0gIDxzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgPGVsZW1lbnQgbmFtZT0iU1BLSVNleHAiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPgotICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIi8+Ci0gIDwvc2VxdWVuY2U+Ci08L2NvbXBsZXhUeXBlPiAKLQotPCEtLSBFbmQgU1BLSURhdGEgLS0+Ci0KLTwhLS0gRW5kIEtleUluZm8gLS0+Ci0KLTwhLS0gU3RhcnQgT2JqZWN0IChNYW5pZmVzdCwgU2lnbmF0dXJlUHJvcGVydHkpIC0tPgotCi08ZWxlbWVudCBuYW1lPSJPYmplY3QiIHR5cGU9ImRzOk9iamVjdFR5cGUiLz4gCi08Y29tcGxleFR5cGUgbmFtZT0iT2JqZWN0VHlwZSIgbWl4ZWQ9InRydWUiPgotICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgPGFueSBuYW1lc3BhY2U9IiMjYW55IiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICA8L3NlcXVlbmNlPgotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKLSAgPGF0dHJpYnV0ZSBuYW1lPSJNaW1lVHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+IDwhLS0gYWRkIGEgZ3JlcCBmYWNldCAtLT4KLSAgPGF0dHJpYnV0ZSBuYW1lPSJFbmNvZGluZyIgdHlwZT0iYW55VVJJIiB1c2U9Im9wdGlvbmFsIi8+IAotPC9jb21wbGV4VHlwZT4KLQotPGVsZW1lbnQgbmFtZT0iTWFuaWZlc3QiIHR5cGU9ImRzOk1hbmlmZXN0VHlwZSIvPiAKLTxjb21wbGV4VHlwZSBuYW1lPSJNYW5pZmVzdFR5cGUiPgotICA8c2VxdWVuY2U+Ci0gICAgPGVsZW1lbnQgcmVmPSJkczpSZWZlcmVuY2UiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+IAotICA8L3NlcXVlbmNlPgotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKLTwvY29tcGxleFR5cGU+Ci0KLTxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZVByb3BlcnRpZXMiIHR5cGU9ImRzOlNpZ25hdHVyZVByb3BlcnRpZXNUeXBlIi8+IAotPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25hdHVyZVByb3BlcnRpZXNUeXBlIj4KLSAgPHNlcXVlbmNlPgotICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmF0dXJlUHJvcGVydHkiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+IAotICA8L3NlcXVlbmNlPgotICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKLTwvY29tcGxleFR5cGU+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZVByb3BlcnR5IiB0eXBlPSJkczpTaWduYXR1cmVQcm9wZXJ0eVR5cGUiLz4gCi0gICA8Y29tcGxleFR5cGUgbmFtZT0iU2lnbmF0dXJlUHJvcGVydHlUeXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICAgIDxjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgIDwhLS0gKDEsMSkgZWxlbWVudHMgZnJvbSAoMSx1bmJvdW5kZWQpIG5hbWVzcGFjZXMgLS0+Ci0gICAgIDwvY2hvaWNlPgotICAgICA8YXR0cmlidXRlIG5hbWU9IlRhcmdldCIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+IAotICAgICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKLSAgIDwvY29tcGxleFR5cGU+Ci0KLTwhLS0gRW5kIE9iamVjdCAoTWFuaWZlc3QsIFNpZ25hdHVyZVByb3BlcnR5KSAtLT4KLQotPCEtLSBTdGFydCBBbGdvcml0aG0gUGFyYW1ldGVycyAtLT4KLQotPHNpbXBsZVR5cGUgbmFtZT0iSE1BQ091dHB1dExlbmd0aFR5cGUiPgotICA8cmVzdHJpY3Rpb24gYmFzZT0iaW50ZWdlciIvPgotPC9zaW1wbGVUeXBlPgotCi08IS0tIFN0YXJ0IEtleVZhbHVlIEVsZW1lbnQtdHlwZXMgLS0+Ci0KLTxlbGVtZW50IG5hbWU9IkRTQUtleVZhbHVlIiB0eXBlPSJkczpEU0FLZXlWYWx1ZVR5cGUiLz4KLTxjb21wbGV4VHlwZSBuYW1lPSJEU0FLZXlWYWx1ZVR5cGUiPgotICA8c2VxdWVuY2U+Ci0gICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJQIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9IlEiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICAgPGVsZW1lbnQgbmFtZT0iRyIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJZIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJKIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiIG1pbk9jY3Vycz0iMCIvPgotICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPGVsZW1lbnQgbmFtZT0iU2VlZCIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJQZ2VuQ291bnRlciIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgPC9zZXF1ZW5jZT4KLTwvY29tcGxleFR5cGU+Ci0KLTxlbGVtZW50IG5hbWU9IlJTQUtleVZhbHVlIiB0eXBlPSJkczpSU0FLZXlWYWx1ZVR5cGUiLz4KLTxjb21wbGV4VHlwZSBuYW1lPSJSU0FLZXlWYWx1ZVR5cGUiPgotICA8c2VxdWVuY2U+Ci0gICAgPGVsZW1lbnQgbmFtZT0iTW9kdWx1cyIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+IAotICAgIDxlbGVtZW50IG5hbWU9IkV4cG9uZW50IiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4gCi0gIDwvc2VxdWVuY2U+Ci08L2NvbXBsZXhUeXBlPiAKLQotPCEtLSBFbmQgS2V5VmFsdWUgRWxlbWVudC10eXBlcyAtLT4KLQotPCEtLSBFbmQgU2lnbmF0dXJlIC0tPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3hraXQvc2NoZW1hcy9lYXN5cG8vZWFzeXBvLnhzZCBiL3YxL3hraXQvc2NoZW1hcy9lYXN5cG8vZWFzeXBvLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyZDFkNi4uMDAwMDAwMAotLS0gYS92MS94a2l0L3NjaGVtYXMvZWFzeXBvL2Vhc3lwby54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08eHM6c2NoZW1hCi0gICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczpwbz0iaHR0cDovL29wZW51cmkub3JnL2Vhc3lwbyIKLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL2Vhc3lwbyIKLSAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJwdXJjaGFzZS1vcmRlciI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjdXN0b21lciIgdHlwZT0icG86Y3VzdG9tZXIiLz4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZGF0ZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiLz4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibGluZS1pdGVtIiB0eXBlPSJwbzpsaW5lLWl0ZW0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2hpcHBlciIgdHlwZT0icG86c2hpcHBlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJjdXN0b21lciI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWdlIiB0eXBlPSJ4czppbnQiLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibGluZS1pdGVtIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwZXItdW5pdC1vdW5jZXMiIHR5cGU9InhzOmRlY2ltYWwiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InByaWNlIiB0eXBlPSJ4czpkZWNpbWFsIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJxdWFudGl0eSIgdHlwZT0ieHM6aW50ZWdlciIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNoaXBwZXIiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGVyLW91bmNlLXJhdGUiIHR5cGU9InhzOmRlY2ltYWwiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3hraXQvc2NoZW1hcy9lYXN5cG8vZWFzeXBvLnhzZGNvbmZpZyBiL3YxL3hraXQvc2NoZW1hcy9lYXN5cG8vZWFzeXBvLnhzZGNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkYjY4NS4uMDAwMDAwMAotLS0gYS92MS94a2l0L3NjaGVtYXMvZWFzeXBvL2Vhc3lwby54c2Rjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08eGI6Y29uZmlnIHhtbG5zOnhiPSJodHRwOi8vd3d3LmJlYS5jb20vMjAwMi8wOS94YmVhbi9jb25maWciCi0gICAgICAgICAgIHhtbG5zOmVwPSJodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvIj4KLQotICA8eGI6bmFtZXNwYWNlIHVyaT0iaHR0cDovL29wZW51cmkub3JnL2Vhc3lwbyI+Ci0gICAgPHhiOnBhY2thZ2U+Y29tLmVhc3lwbzwveGI6cGFja2FnZT4KLSAgPC94YjpuYW1lc3BhY2U+Ci0KLSAgPHhiOm5hbWVzcGFjZSB1cmk9IiMjYW55Ij4KLSAgICA8eGI6cHJlZml4PlhtbDwveGI6cHJlZml4PgotICAgIDx4YjpzdWZmaXg+QmVhbjwveGI6c3VmZml4PgotICA8L3hiOm5hbWVzcGFjZT4KLQotPC94Yjpjb25maWc+CmRpZmYgLS1naXQgYS92MS94a2l0L3NjaGVtYXMvajJlZS9YTUwueHNkIGIvdjEveGtpdC9zY2hlbWFzL2oyZWUvWE1MLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY4YWRkOS4uMDAwMDAwMAotLS0gYS92MS94a2l0L3NjaGVtYXMvajJlZS9YTUwueHNkCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IURPQ1RZUEUgeHM6c2NoZW1hIFBVQkxJQyAiLS8vVzNDLy9EVEQgWE1MU0NIRU1BIDIwMDEwMi8vRU4iICJYTUxTY2hlbWEuZHRkIiA+Ci08eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbDpsYW5nPSJlbiI+Ci0KLSA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBTZWUgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwgYW5kCi0gICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5hbWVzcGFjZS4KLSAgPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj5UaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cAotICAgICAgICBzdWl0YWJsZSBmb3IgdXNlIGJ5Ci0gICAgICAgIHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyB4bWw6YmFzZSwgeG1sOmxhbmcgb3IgeG1sOnNwYWNlIGF0dHJpYnV0ZXMKLSAgICAgICAgb24gZWxlbWVudHMgdGhleSBkZWZpbmUuCi0KLSAgICAgICAgVG8gZW5hYmxlIHRoaXMsIHN1Y2ggYSBzY2hlbWEgbXVzdCBpbXBvcnQgdGhpcyBzY2hlbWEKLSAgICAgICAgZm9yIHRoZSBYTUwgbmFtZXNwYWNlLCBlLmcuIGFzIGZvbGxvd3M6Ci0gICAgICAgICZsdDtzY2hlbWEgLiAuIC4+Ci0gICAgICAgICAuIC4gLgotICAgICAgICAgJmx0O2ltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDMveG1sLnhzZCIvPgotCi0gICAgICAgIFN1YnNlcXVlbnRseSwgcXVhbGlmaWVkIHJlZmVyZW5jZSB0byBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMKLSAgICAgICAgb3IgdGhlIGdyb3VwIGRlZmluZWQgYmVsb3cgd2lsbCBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdCwgZS5nLgotCi0gICAgICAgICZsdDt0eXBlIC4gLiAuPgotICAgICAgICAgLiAuIC4KLSAgICAgICAgICZsdDthdHRyaWJ1dGVHcm91cCByZWY9InhtbDpzcGVjaWFsQXR0cnMiLz4KLSAKLSAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZQotICAgICAgICAgZWxlbWVudCB3aXRoIGFueSBvZiB0aG9zZSBhdHRyaWJ1dGVzPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj5JbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCi0gICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAotICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkLgotICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKLSAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4KLSAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCi0gICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwgU2NoZW1hCi0gICBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywgaWYgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlIGNoYW5nZXMsIHRoZSB2ZXJzaW9uCi0gICBvZiB0aGlzIGRvY3VtZW50IGF0Ci0gICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UKLSAgIGFjY29yZGluZ2x5OyB0aGUgdmVyc2lvbiBhdAotICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkIHdpbGwgbm90IGNoYW5nZS4KLSAgPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZyIgdHlwZT0ieHM6bGFuZ3VhZ2UiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPkluIGR1ZSBjb3Vyc2UsIHdlIHNob3VsZCBpbnN0YWxsIHRoZSByZWxldmFudCBJU08gMi0gYW5kIDMtbGV0dGVyCi0gICAgICAgICBjb2RlcyBhcyB0aGUgZW51bWVyYXRlZCBwb3NzaWJsZSB2YWx1ZXMgLiAuIC48L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmF0dHJpYnV0ZT4KLQotIDx4czphdHRyaWJ1dGUgbmFtZT0ic3BhY2UiIGRlZmF1bHQ9InByZXNlcnZlIj4KLSAgPHhzOnNpbXBsZVR5cGU+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIj4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlZmF1bHQiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByZXNlcnZlIi8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0gPC94czphdHRyaWJ1dGU+Ci0KLSA8eHM6YXR0cmlidXRlIG5hbWU9ImJhc2UiIHR5cGU9InhzOmFueVVSSSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+U2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbGJhc2UvIGZvcgotICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhdHRyaWJ1dGUuPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czphdHRyaWJ1dGU+Ci0KLSA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0ic3BlY2lhbEF0dHJzIj4KLSAgPHhzOmF0dHJpYnV0ZSByZWY9InhtbDpiYXNlIi8+Ci0gIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOnNwYWNlIi8+Ci0gPC94czphdHRyaWJ1dGVHcm91cD4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS94a2l0L3NjaGVtYXMvajJlZS9hcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZCBiL3YxL3hraXQvc2NoZW1hcy9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA0Zjg0Li4wMDAwMDAwCi0tLSBhL3YxL3hraXQvc2NoZW1hcy9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMS40Ij4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLUAoIylhcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZHMJMS43IDA3LzA4LzAyCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1Db3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLVJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLXJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1yZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLVUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci1tYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLWNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgYXBwbGljYXRpb24gY2xpZW50IDEuNAotZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgQWxsIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50Ci1kZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQKLXNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2U6Ci0KLWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgIDxhcHBsaWNhdGlvbi1jbGllbnQgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2QiCi0gICAgIHZlcnNpb249IjEuNCI+Ci0KLSAgICAuLi4KLSAgICA8L2FwcGxpY2F0aW9uLWNsaWVudD4KLQotVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi10aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi1uYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi1odHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLWRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICBzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICBzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLTx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbi1jbGllbnQiIHR5cGU9ImoyZWU6YXBwbGljYXRpb24tY2xpZW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBhcHBsaWNhdGlvbi1jbGllbnQgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuCi0gICAgYXBwbGljYXRpb24gY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBhcHBsaWNhdGlvbgotICAgIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBFSkIgY29tcG9uZW50cwotICAgIGFuZCBleHRlcm5hbCByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGUgYXBwbGljYXRpb24KLSAgICBjbGllbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4KLSAgICBhcHBsaWNhdGlvbiBjbGllbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QKLSAgICBiZSB1bmlxdWUgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnYtZW50cnkiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotICAgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIGFwcGxpY2F0aW9uCi0gICAgY2xpZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotICAgIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuVGhlIG5hbWUKLSAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZgotICAgIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0gICAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQKLSAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLSAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZQotICAgIG5hbWUgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0gICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUKLSAgICBhcHBsaWNhdGlvbiBjbGllbnQgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUKLSAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZQotICAgIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi08L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwbGljYXRpb24tY2xpZW50VHlwZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVudi1lbnRyeVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVzb3VyY2UtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlLWVudi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWxsYmFjay1oYW5kbGVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNhbGxiYWNrLWhhbmRsZXIgZWxlbWVudCBuYW1lcyBhIGNsYXNzIHByb3ZpZGVkIGJ5Ci0gICAgICAgIHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBubyBhcmdzCi0gICAgICAgIGNvbnN0cnVjdG9yIGFuZCBtdXN0IGltcGxlbWVudCB0aGUKLSAgICAgICAgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXIKLSAgICAgICAgaW50ZXJmYWNlLiAgVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIGJ5IHRoZQotICAgICAgICBhcHBsaWNhdGlvbiBjbGllbnQgY29udGFpbmVyIGFuZCB1c2VkIGJ5IHRoZSBjb250YWluZXIKLSAgICAgICAgdG8gY29sbGVjdCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSB1c2VyLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRld2V5LXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIGZpeGVkPSIxLjQiCi0gICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgMS40LgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPC94c2Q6YXR0cmlidXRlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS94a2l0L3NjaGVtYXMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIGIvdjEveGtpdC9zY2hlbWFzL2oyZWUvYXBwbGljYXRpb25fMV80LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUzMTEzYi4uMDAwMDAwMAotLS0gYS92MS94a2l0L3NjaGVtYXMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMS40Ij4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLUAoIylhcHBsaWNhdGlvbl8xXzQueHNkcwkxLjYgMDgvMDkvMDIKLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLUNvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotcmVzZXJ2ZWQuCi0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLXJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi1wYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi1saXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi1hZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1UaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi1kaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi1kaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLW1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi13cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLVRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi1KYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi1DdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi1NaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi1TdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBhcHBsaWNhdGlvbiAxLjQgZGVwbG95bWVudAotZGVzY3JpcHRvci4gIEFsbCBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QKLWluZGljYXRlIHRoYXQgdGhlIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2UKLQotaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCi1hbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci11c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0gICAgPGFwcGxpY2F0aW9uIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLSAgICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIgotICAgICB2ZXJzaW9uPSIxLjQiPgotCi0gICAgLi4uCi0gICAgPC9hcHBsaWNhdGlvbj4KLQotVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi10aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi1uYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi1odHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQotZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0gIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLTx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbiIgdHlwZT0iajJlZTphcHBsaWNhdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgYXBwbGljYXRpb24gZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgSjJFRQotICAgIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImNvbnRleHQtcm9vdC11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIGNvbnRleHQtcm9vdCBlbGVtZW50IGNvbnRlbnQgbXVzdCBiZSB1bmlxdWUKLSAgICBpbiB0aGUgZWFyLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1vZHVsZS9qMmVlOndlYiIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmNvbnRleHQtcm9vdCIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InNlY3VyaXR5LXJvbGUtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBzZWN1cml0eS1yb2xlLW5hbWUgZWxlbWVudCBjb250ZW50Ci0gICAgbXVzdCBiZSB1bmlxdWUgaW4gdGhlIGVhci4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpzZWN1cml0eS1yb2xlIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cm9sZS1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi08L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwbGljYXRpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGFwcGxpY2F0aW9uVHlwZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlCi1hcHBsaWNhdGlvbi4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTppY29uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1vZHVsZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bW9kdWxlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGhhdmUgb25lCi0gICAgICAgIG1vZHVsZSBlbGVtZW50IGZvciBlYWNoIEoyRUUgbW9kdWxlIGluIHRoZQotICAgICAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLiBBIG1vZHVsZSBlbGVtZW50IGlzIGRlZmluZWQKLSAgICAgICAgYnkgbW9kdWxlVHlwZSBkZWZpbml0aW9uLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgZml4ZWQ9IjEuNCIKLSAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyAxLjQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1vZHVsZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbW9kdWxlVHlwZSBkZWZpbmVzIGEgc2luZ2xlIEoyRUUgbW9kdWxlIGFuZCBjb250YWlucyBhCi1jb25uZWN0b3IsIGVqYiwgamF2YSwgb3Igd2ViIGVsZW1lbnQsIHdoaWNoIGluZGljYXRlcyB0aGUKLW1vZHVsZSB0eXBlIGFuZCBjb250YWlucyBhIHBhdGggdG8gdGhlIG1vZHVsZSBmaWxlLCBhbmQgYW4KLW9wdGlvbmFsIGFsdC1kZCBlbGVtZW50LCB3aGljaCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvCi10aGUgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdG9yIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgY29ubmVjdG9yIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYQotICAgICAgICAgICAgcmVzb3VyY2UgYWRhcHRlciBhcmNoaXZlIGZpbGUsIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgICAgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZWpiIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYW4gZWpiLWphciwKLSAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICBwYWNrYWdlLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF2YSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGphdmEgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIGphdmEKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUsIHJlbGF0aXZlIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6d2ViVHlwZSIvPgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbHQtZGQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFsdC1kZCBlbGVtZW50IHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlCi0gICAgICAgIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgICAgIGZpbGUgZm9yIGEgcGFydGljdWxhciBKMkVFIG1vZHVsZS4gIFRoZSBVUkkgbXVzdAotICAgICAgICBzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBkZXBsb3ltZW50Ci0gICAgICAgIGRlc2NyaXB0b3IgZmlsZSByZWxhdGl2ZSB0byB0aGUgYXBwbGljYXRpb24ncyByb290Ci0gICAgICAgIGRpcmVjdG9yeS4gSWYgYWx0LWRkIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBkZXBsb3llcgotICAgICAgICBtdXN0IHJlYWQgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmcm9tIHRoZSBkZWZhdWx0Ci0gICAgICAgIGxvY2F0aW9uIGFuZCBmaWxlIG5hbWUgcmVxdWlyZWQgYnkgdGhlIHJlc3BlY3RpdmUKLSAgICAgICAgY29tcG9uZW50IHNwZWNpZmljYXRpb24uCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYlR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgd2ViVHlwZSBkZWZpbmVzIHRoZSB3ZWItdXJpIGFuZCBjb250ZXh0LXJvb3Qgb2YKLWEgd2ViIGFwcGxpY2F0aW9uIG1vZHVsZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYi11cmkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHdlYi11cmkgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIHdlYgotICAgICAgICBhcHBsaWNhdGlvbiBmaWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZQotICAgICAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250ZXh0LXJvb3QiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNvbnRleHQtcm9vdCBlbGVtZW50IHNwZWNpZmllcyB0aGUgY29udGV4dCByb290Ci0gICAgICAgIG9mIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL3YxL3hraXQvc2NoZW1hcy9qMmVlL2Nvbm5lY3Rvcl8xXzUueHNkIGIvdjEveGtpdC9zY2hlbWFzL2oyZWUvY29ubmVjdG9yXzFfNS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZTU1YmQuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9zY2hlbWFzL2oyZWUvY29ubmVjdG9yXzFfNS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMS41Ij4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLUAoIyljb25uZWN0b3JfMV81LnhzZHMJMS4xNiAwNy8wNi8wMgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCi1Sb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCi1yZXNlcnZlZC4KLQotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLXBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLWxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLWFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi1VLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLVRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLWRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLXdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi1jb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLUphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLUN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLU1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLVN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIENvbm5lY3RvciAxLjUgZGVwbG95bWVudAotZGVzY3JpcHRvci4gIEFsbCBDb25uZWN0b3IgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0Ci1pbmRpY2F0ZSB0aGUgY29ubmVjdG9yIHJlc291cmNlIGFkYXB0ZXIgc2NoZW1hIGJ5IHVzaW5nIHRoZQotSjJFRSBuYW1lc3BhY2U6Ci0KLWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgIDxjb25uZWN0b3IgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotICAgICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9jb25uZWN0b3JfMV81LnhzZCIKLSAgICAgdmVyc2lvbj0iMS41Ij4KLSAgICAuLi4KLSAgICA8L2Nvbm5lY3Rvcj4KLQotVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi10aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi1uYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi1odHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2Nvbm5lY3Rvcl8xXzUueHNkCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLWRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICBzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICBzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLTx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0b3IiIHR5cGU9ImoyZWU6Y29ubmVjdG9yVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBjb25uZWN0b3IgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBlbGVtZW50IGluY2x1ZGVzCi1nZW5lcmFsIGluZm9ybWF0aW9uIC0gdmVuZG9yIG5hbWUsIHJlc291cmNlIGFkYXB0ZXIgdmVyc2lvbiwKLWljb24gLSBhYm91dCB0aGUgcmVzb3VyY2UgYWRhcHRlciBtb2R1bGUuIEl0IGFsc28gaW5jbHVkZXMKLWluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UKLWFkYXB0ZXIgbGlicmFyeSBhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgZWxlbWVudAotcmVzb3VyY2VhZGFwdGVyLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPC94c2Q6ZWxlbWVudD4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWN0aXZhdGlvbnNwZWNUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGFjdGl2YXRpb25zcGVjVHlwZSBzcGVjaWZpZXMgYW4gYWN0aXZhdGlvbgotc3BlY2lmaWNhdGlvbi4gIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseSBxdWFsaWZpZWQKLUphdmEgY2xhc3MgbmFtZSBvZiBhbiBhY3RpdmF0aW9uIHNwZWNpZmljYXRpb24gYW5kIGEgc2V0IG9mCi1yZXF1aXJlZCBjb25maWd1cmF0aW9uIHByb3BlcnR5IG5hbWVzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uc3BlYy1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IGFjdGl2YXRpb25zcGVjLWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkKLSAgICAgICAgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgYWN0aXZhdGlvbgotICAgICAgICBzcGVjaWZpY2F0aW9uIGNsYXNzLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZQotICAgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuQWN0aXZhdGlvblNwZWMgaW50ZXJmYWNlLiBUaGUKLSAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcyBpcyByZXF1aXJlZCB0byBiZSBhCi0gICAgICAgIEphdmFCZWFuLgotCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbnNwZWMtY2xhc3M+Y29tLndvbWJhdC5BY3RpdmF0aW9uU3BlY0ltcGwKLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbnNwZWMtY2xhc3M+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVxdWlyZWQtY29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWRtaW5vYmplY3RUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGFkbWlub2JqZWN0VHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYW4KLWFkbWluaXN0ZXJlZCBvYmplY3QuICBBZG1pbmlzdGVyZWQgb2JqZWN0cyBhcmUgc3BlY2lmaWMgdG8gYQotbWVzc2FnaW5nIHN0eWxlIG9yIG1lc3NhZ2UgcHJvdmlkZXIuICBUaGlzIGNvbnRhaW5zCi1pbmZvcm1hdGlvbiBvbiB0aGUgSmF2YSB0eXBlIG9mIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkKLWFuIGFkbWluaXN0ZXJlZCBvYmplY3QsIGl0cyBKYXZhIGNsYXNzIG5hbWUgYW5kIGl0cwotY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZG1pbm9iamVjdC1pbnRlcmZhY2UiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWxlbWVudCBhZG1pbm9iamVjdC1pbnRlcmZhY2Ugc3BlY2lmaWVzIHRoZQotICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSB0eXBlIG9mIHRoZQotICAgICAgICBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYW4gYWRtaW5pc3RlcmVkIG9iamVjdC4KLQotICAgICAgICAgRXhhbXBsZToKLSAgICAgICAgIDxhZG1pbm9iamVjdC1pbnRlcmZhY2U+amF2YXguam1zLkRlc3RpbmF0aW9uCi0gICAgICAgICA8L2FkbWlub2JqZWN0LWludGVyZmFjZT4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZG1pbm9iamVjdC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IGFkbWlub2JqZWN0LWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkKLSAgICAgICAgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0LgotCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICA8YWRtaW5vYmplY3QtY2xhc3M+Y29tLndvbWJhdC5EZXN0aW5hdGlvbkltcGwKLSAgICAgICAgICAgIDwvYWRtaW5vYmplY3QtY2xhc3M+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpjb25maWctcHJvcGVydHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdXRoZW50aWNhdGlvbi1tZWNoYW5pc21UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbVR5cGUgc3BlY2lmaWVzIGFuIGF1dGhlbnRpY2F0aW9uCi1tZWNoYW5pc20gc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLiBOb3RlIHRoYXQgdGhpcwotc3VwcG9ydCBpcyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgYW5kIG5vdCBmb3IgdGhlCi11bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIHNwZWNpZmllcwotYW55IHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgcmVxdWlyZW1lbnQgZm9yIHRoZSBzdXBwb3J0IG9mCi1zZWN1cml0eSBjb250cmFjdCBhbmQgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotCi1Ob3RlIHRoYXQgQmFzaWNQYXNzd29yZCBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwgaW50ZXJmYWNlLgotVGhlIEtlcmJ2NSBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLW9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbCBpbnRlcmZhY2Ugb3IgdGhlIGRlcHJlY2F0ZWQKLWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbCBpbnRlcmZhY2UuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUgc3BlY2lmaWVzCi0gICAgICAgIHR5cGUgb2YgYW4gYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotCi0gICAgICAgIFRoZSBleGFtcGxlIHZhbHVlcyBhcmU6Ci0KLSAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPkJhc2ljUGFzc3dvcmQKLSAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLQotICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+S2VyYnY1Ci0gICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0KLSAgICAgICAgQW55IGFkZGl0aW9uYWwgc2VjdXJpdHkgbWVjaGFuaXNtcyBhcmUgb3V0c2lkZSB0aGUKLSAgICAgICAgc2NvcGUgb2YgdGhlIENvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjcmVkZW50aWFsLWludGVyZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y3JlZGVudGlhbC1pbnRlcmZhY2VUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjb25maWctcHJvcGVydHktbmFtZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY29uZmlnLXByb3BlcnR5LW5hbWVUeXBlIGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLWNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0KLVRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIGRlZmluZXMgYSBzZXQgb2Ygd2VsbC1kZWZpbmVkCi1wcm9wZXJ0aWVzIGFsbCBvZiB0eXBlIGphdmEubGFuZy5TdHJpbmcuIFRoZXNlIGFyZSBhcwotZm9sbG93cy4KLQotICAgICBTZXJ2ZXJOYW1lCi0gICAgIFBvcnROdW1iZXIKLSAgICAgVXNlck5hbWUKLSAgICAgUGFzc3dvcmQKLSAgICAgQ29ubmVjdGlvblVSTAotCi1BIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgY2FuIGV4dGVuZCB0aGlzIHByb3BlcnR5IHNldCB0bwotaW5jbHVkZSBwcm9wZXJ0aWVzIHNwZWNpZmljIHRvIHRoZSByZXNvdXJjZSBhZGFwdGVyIGFuZCBpdHMKLXVuZGVybHlpbmcgRUlTLgotCi1Qb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZQotICAgICAgICBTZXJ2ZXJOYW1lCi0gICAgICAgIFBvcnROdW1iZXIKLSAgICAgICAgVXNlck5hbWUKLSAgICAgICAgUGFzc3dvcmQKLSAgICAgICAgQ29ubmVjdGlvblVSTAotCi1FeGFtcGxlOiA8Y29uZmlnLXByb3BlcnR5LW5hbWU+U2VydmVyTmFtZTwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjb25maWctcHJvcGVydHktdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY29uZmlnLXByb3BlcnR5LXR5cGVUeXBlIGNvbnRhaW5zIHRoZSBmdWxseQotcXVhbGlmaWVkIEphdmEgdHlwZSBvZiBhIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0KLVRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXM6Ci0gICBqYXZhLmxhbmcuQm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsCi0gICBqYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwgamF2YS5sYW5nLlNob3J0LAotICAgamF2YS5sYW5nLkxvbmcsIGphdmEubGFuZy5GbG9hdCwgamF2YS5sYW5nLkNoYXJhY3RlcgotCi1Vc2VkIGluOiBjb25maWctcHJvcGVydHkKLQotRXhhbXBsZToKLTxjb25maWctcHJvcGVydHktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jb25maWctcHJvcGVydHktdHlwZT4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Cb29sZWFuIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkludGVnZXIiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkRvdWJsZSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQnl0ZSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU2hvcnQiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkxvbmciLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkZsb2F0Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5DaGFyYWN0ZXIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25maWctcHJvcGVydHlUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhIHNpbmdsZQotY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB0aGF0IG1heSBiZSB1c2VkIGZvciBwcm92aWRpbmcKLWNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0KLVRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgbmFtZSwKLXR5cGUgYW5kIGFuIG9wdGlvbmFsIHZhbHVlIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5LiBJZgotdGhlIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgZG9lcyBub3Qgc3BlY2lmeSBhIHZhbHVlIHRoYW4KLXRoZSBkZXBsb3llciBpcyByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIGEgdmFsaWQgdmFsdWUgZm9yCi1hIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0KLUFueSBib3VuZHMgb3Igd2VsbC1kZWZpbmVkIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIHNob3VsZCBiZQotZGVzY3JpYmVkIGluIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50LgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5LW5hbWVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHktdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5LXR5cGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHktdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgY29uZmlnLXByb3BlcnR5LXZhbHVlIGNvbnRhaW5zIHRoZSB2YWx1ZQotICAgICAgICBvZiBhIGNvbmZpZ3VyYXRpb24gZW50cnkuIE5vdGUsIGl0IGlzIHBvc3NpYmxlIGZvciBhCi0gICAgICAgIHJlc291cmNlIGFkYXB0ZXIgZGVwbG95ZXIgdG8gb3ZlcnJpZGUgdGhpcwotICAgICAgICBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGR1cmluZyBkZXBsb3ltZW50LgotCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+V29tYmF0U2VydmVyPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0aW9uLWRlZmluaXRpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNvbm5lY3Rpb24tZGVmaW5pdGlvblR5cGUgZGVmaW5lcyBhIHNldCBvZiBjb25uZWN0aW9uCi1pbnRlcmZhY2VzIGFuZCBjbGFzc2VzIHBlcnRhaW5pbmcgdG8gYSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24KLXR5cGUuIFRoaXMgYWxzbyBpbmNsdWRlcyBjb25maWd1cmFibGUgcHJvcGVydGllcyBmb3IKLU1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZXMgdGhhdCBtYXkgYmUgcHJvZHVjZWQgb3V0Ci1vZiB0aGlzIHNldC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzIHNwZWNpZmllcwotICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdAotICAgICAgICBpbXBsZW1lbnRzIHRoZQotICAgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4KLSAgICAgICAgVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YgcmVzb3VyY2UKLSAgICAgICAgYWRhcHRlcidzIGltcGxlbWVudGF0aW9uIG9mIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUKLSAgICAgICAgc3BlY2lmaWVkIGNvbnRyYWN0cy4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgICAgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYSBKYXZhQmVhbi4KLQotICAgICAgICBFeGFtcGxlOgotICAgICAgICA8bWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotICAgICAgICAgICAgY29tLndvbWJhdC5NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlJbXBsCi0gICAgICAgIDwvbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIHNwZWNpZmllcwotICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5Ci0gICAgICAgIGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuCi0KLSAgICAgICAgRXhhbXBsZToKLSAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5jb20ud29tYmF0LkNvbm5lY3Rpb25GYWN0b3J5Ci0gICAgICAgIDwvY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPgotCi0gICAgICAgIE9SCi0KLSAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbkZhY3RvcnkKLSAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3Mgc3BlY2lmaWVzCi0gICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkKLSAgICAgICAgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIKLSAgICAgICAgc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLgotCi0gICAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Y29tLndvbWJhdC5Db25uZWN0aW9uRmFjdG9yeUltcGwKLSAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWludGVyZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjb25uZWN0aW9uLWludGVyZmFjZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgZnVsbHkKLSAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gaW50ZXJmYWNlIHN1cHBvcnRlZAotICAgICAgICBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLQotICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgICAgICA8Y29ubmVjdGlvbi1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2UuY2NpLkNvbm5lY3Rpb24KLSAgICAgICAgICAgIDwvY29ubmVjdGlvbi1pbnRlcmZhY2U+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24taW1wbC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjb25uZWN0aW9uLWltcGwtY2xhc3NUeXBlIHNwZWNpZmllcyB0aGUgZnVsbHkKLSAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gY2xhc3MgdGhhdAotICAgICAgICBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgQ29ubmVjdGlvbgotICAgICAgICBpbnRlcmZhY2UuICBJdCBpcyB1c2VkIGJ5IHRoZSBjb25uZWN0aW9uLWltcGwtY2xhc3MKLSAgICAgICAgZWxlbWVudHMuCi0KLSAgICAgICAgRXhhbXBsZToKLQotICAgICAgICAgICAgPGNvbm5lY3Rpb24taW1wbC1jbGFzcz5jb20ud29tYmF0LkNvbm5lY3Rpb25JbXBsCi0gICAgICAgICAgICA8L2Nvbm5lY3Rpb24taW1wbC1jbGFzcz4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbm5lY3RvclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY29ubmVjdG9yVHlwZSBkZWZpbmVzIGEgcmVzb3VyY2UgYWRhcHRlci4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVuZG9yLW5hbWUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWxlbWVudCB2ZW5kb3ItbmFtZSBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKLSAgICAgICAgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlciB2ZW5kb3IuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVpcy10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IGVpcy10eXBlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgICAgICB0eXBlIG9mIHRoZSBFSVMuIEZvciBleGFtcGxlLCB0aGUgdHlwZSBvZiBhbiBFSVMgY2FuCi0gICAgICAgIGJlIHByb2R1Y3QgbmFtZSBvZiBFSVMgaW5kZXBlbmRlbnQgb2YgYW55IHZlcnNpb24KLSAgICAgICAgaW5mby4KLQotICAgICAgICBUaGlzIGhlbHBzIGluIGlkZW50aWZ5aW5nIEVJUyBpbnN0YW5jZXMgdGhhdCBjYW4gYmUKLSAgICAgICAgdXNlZCB3aXRoIHRoaXMgcmVzb3VyY2UgYWRhcHRlci4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2VhZGFwdGVyLXZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnQgdmVyc2lvbiBzcGVjaWZpZXMgYSBzdHJpbmctYmFzZWQgdmVyc2lvbgotICAgICAgICBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBmcm9tIHRoZSByZXNvdXJjZSBhZGFwdGVyCi0gICAgICAgIHByb3ZpZGVyLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpY2Vuc2UiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmxpY2Vuc2VUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZWFkYXB0ZXIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlYWRhcHRlclR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgZXh0ZW5zaW9ucyBjYW4gYmUKLSAgICAgICAgc3BlY2lmaWVkIGJ5IHVzaW5nIHRoZSBkZXBsb3ltZW50LWV4dGVuc2lvbgotICAgICAgICBlbGVtZW50cy4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRld2V5LXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIGZpeGVkPSIxLjUiCi0gICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSB2ZXJzaW9uIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUKLSAgICBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gdGhhdCBpcwotICAgIHN1cHBvcnRlZCBieSB0aGlzIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgaW5mb3JtYXRpb24KLSAgICBlbmFibGVzIGRlcGxveWVyIHRvIGNvbmZpZ3VyZSB0aGUgcmVzb3VyY2UgYWRhcHRlciB0bwotICAgIHN1cHBvcnQgZGVwbG95bWVudCBhbmQgcnVudGltZSByZXF1aXJlbWVudHMgb2YgdGhlCi0gICAgY29ycmVzcG9uZGluZyBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iY3JlZGVudGlhbC1pbnRlcmZhY2VUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNyZWRlbnRpYWwtaW50ZXJmYWNlVHlwZSBzcGVjaWZpZXMgdGhlCi1pbnRlcmZhY2UgdGhhdCB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbgotc3VwcG9ydHMgZm9yIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUKLWNyZWRlbnRpYWxzLiBUaGlzIGVsZW1lbnQocykgdGhhdCB1c2UgdGhpcyB0eXBlLAotaS5lLiBjcmVkZW50aWFsLWludGVyZmFjZSwgIHNob3VsZCBiZSB1c2VkIGJ5Ci1hcHBsaWNhdGlvbiBzZXJ2ZXIgdG8gZmluZCBvdXQgdGhlIENyZWRlbnRpYWwKLWludGVyZmFjZSBpdCBzaG91bGQgdXNlIGFzIHBhcnQgb2YgdGhlIHNlY3VyaXR5Ci1jb250cmFjdC4KLQotVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6Ci0KLWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwKLW9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbAotamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbgotICAgICAgICAgICAgdmFsdWU9ImphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbgotICAgICAgICAgICAgdmFsdWU9Im9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uCi0gICAgICAgICAgICB2YWx1ZT0iamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgaW5ib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbgotYWJvdXQgYW4gaW5ib3VuZCByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGNvbnRhaW5zIGluZm9ybWF0aW9uCi1zcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIKLWxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlIG1lc3NhZ2VhZGFwdGVyIGVsZW1lbnQuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2VhZGFwdGVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlYWRhcHRlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlbGlzdGVuZXItdHlwZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG1lc3NhZ2VsaXN0ZW5lci10eXBlIGVsZW1lbnQgY29udGVudCBtdXN0IGJlCi0gICAgICAgIHVuaXF1ZSBpbiB0aGUgbWVzc2FnZWFkYXB0ZXIuIFNldmVyYWwgbWVzc2FnZWxpc3RlbmVycwotICAgICAgICBjYW4gbm90IHVzZSB0aGUgc2FtZSBtZXNzYWdlbGlzdGVuZXItdHlwZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1lc3NhZ2VsaXN0ZW5lciIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOm1lc3NhZ2VsaXN0ZW5lci10eXBlIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaWNlbnNlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBsaWNlbnNlVHlwZSBzcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlCi1yZXNvdXJjZSBhZGFwdGVyIG1vZHVsZS4gVGhpcyB0eXBlIHNwZWNpZmllcyB3aGV0aGVyIGEKLWxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhpcyByZXNvdXJjZSBhZGFwdGVyLAotYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBsaWNlbnNpbmcgdGVybXMKLShleGFtcGxlczogZHVyYXRpb24gb2YgbGljZW5zZSwgbnVtYmVyIG9mIGNvbm5lY3Rpb24KLXJlc3RyaWN0aW9ucykuIEl0IGlzIHVzZWQgYnkgdGhlIGxpY2Vuc2UgZWxlbWVudC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpY2Vuc2UtcmVxdWlyZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBlbGVtZW50IGxpY2Vuc2UtcmVxdWlyZWQgc3BlY2lmaWVzIHdoZXRoZXIgYQotICAgICAgICAgICAgbGljZW5zZSBpcyByZXF1aXJlZCB0byBkZXBsb3kgYW5kIHVzZSB0aGUKLSAgICAgICAgICAgIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZgotICAgICAgICAgICAgdGhlIGZvbGxvd2luZywgInRydWUiIG9yICJmYWxzZSIuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZWFkYXB0ZXJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi1tZXNzYWdpbmcgY2FwYWJpbGl0aWVzIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyLiBUaGlzCi1jb250YWlucyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCi1yZXNvdXJjZSBhZGFwdGVyIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlCi1tZXNzYWdlbGlzdGVuZXIgZWxlbWVudC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZWxpc3RlbmVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlbGlzdGVuZXJUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlbGlzdGVuZXJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2VsaXN0ZW5lclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGEKLXNwZWNpZmljIG1lc3NhZ2UgbGlzdGVuZXIgc3VwcG9ydGVkIGJ5IHRoZSBtZXNzYWdpbmcKLXJlc291cmNlIGFkYXB0ZXIuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBKYXZhIHR5cGUKLW9mIHRoZSBtZXNzYWdlIGxpc3RlbmVyIGludGVyZmFjZSBhbmQgYW4gYWN0aXZhdGlvbgotc3BlY2lmaWNhdGlvbi4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZWxpc3RlbmVyLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWxlbWVudCBtZXNzYWdlbGlzdGVuZXItdHlwZSBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0gICAgICAgIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIHR5cGUgb2YgYSBtZXNzYWdlCi0gICAgICAgIGxpc3RlbmVyIGludGVyZmFjZS4KLQotICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgICAgPG1lc3NhZ2VsaXN0ZW5lci10eXBlPmphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIKLSAgICAgICAgICA8L21lc3NhZ2VsaXN0ZW5lci10eXBlPgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb25zcGVjIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTphY3RpdmF0aW9uc3BlY1R5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG91dGJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0Ci1hbiBvdXRib3VuZCByZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHkKLXF1YWxpZmllZCBuYW1lcyBvZiBjbGFzc2VzL2ludGVyZmFjZXMgcmVxdWlyZWQgYXMgcGFydCBvZgotdGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGNvbnRyYWN0cyBmb3IKLWNvbm5lY3Rpb24gbWFuYWdlbWVudCwgbGV2ZWwgb2YgdHJhbnNhY3Rpb24gc3VwcG9ydAotcHJvdmlkZWQsIG9uZSBvciBtb3JlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgc3VwcG9ydGVkCi1hbmQgYWRkaXRpb25hbCByZXF1aXJlZCBzZWN1cml0eSBwZXJtaXNzaW9ucy4KLQotSWYgdGhlcmUgaXMgbm8gYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllZCBhcyBwYXJ0IG9mCi1yZXNvdXJjZSBhZGFwdGVyIGVsZW1lbnQgdGhlbiB0aGUgcmVzb3VyY2UgYWRhcHRlciBkb2VzIG5vdAotc3VwcG9ydCBhbnkgc3RhbmRhcmQgc2VjdXJpdHkgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBhcwotcGFydCBvZiBzZWN1cml0eSBjb250cmFjdC4gVGhlIGFwcGxpY2F0aW9uIHNlcnZlciBpZ25vcmVzCi10aGUgc2VjdXJpdHkgcGFydCBvZiB0aGUgc3lzdGVtIGNvbnRyYWN0cyBpbiB0aGlzIGNhc2UuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tZGVmaW5pdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y29ubmVjdGlvbi1kZWZpbml0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2FjdGlvbi1zdXBwb3J0IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0cmFuc2FjdGlvbi1zdXBwb3J0VHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTphdXRoZW50aWNhdGlvbi1tZWNoYW5pc21UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYXV0aGVudGljYXRpb24tc3VwcG9ydCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWxlbWVudCByZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQgc3BlY2lmaWVzCi0gICAgICAgIHdoZXRoZXIgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMKLSAgICAgICAgcmUtYXV0aGVudGljYXRpb24gb2YgZXhpc3RpbmcgTWFuYWdlZC0gQ29ubmVjdGlvbgotICAgICAgICBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoaXMgaW5mb3JtYXRpb24gaXMgZm9yIHRoZQotICAgICAgICByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIGFuZCBub3QgZm9yIHRoZQotICAgICAgICB1bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4gVGhpcyBlbGVtZW50IG11c3QgaGF2ZQotICAgICAgICBlaXRoZXIgYSAidHJ1ZSIgb3IgImZhbHNlIiB2YWx1ZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1wZXJtaXNzaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZWN1cml0eS1wZXJtaXNzaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXF1aXJlZC1jb25maWctcHJvcGVydHlUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotb2YgYSBzaW5nbGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB1c2VkIGZvciBzcGVjaWZ5aW5nIGEKLXJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgbmFtZS4gSXQgaXMgdXNlZAotYnkgcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5IGVsZW1lbnRzLgotCi1FeGFtcGxlOgotCi08cmVxdWlyZWQtY29uZmlnLXByb3BlcnR5PkRlc3RpbmF0aW9uPC9yZXF1aXJlZC1jb25maWctcHJvcGVydHk+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmNvbmZpZy1wcm9wZXJ0eS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlYWRhcHRlclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcmVzb3VyY2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi1yZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHkgcXVhbGlmaWVkCi1yZXNvdXJjZSBhZGFwdGVyIEphdmEgY2xhc3MgbmFtZSwgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLAotaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXNvdXJjZQotYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZQotb3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyIGFuZCBpbmJvdW5kLXJlc291cmNlYWRhcHRlcgotZWxlbWVudHMsIGFuZCBhbiBvcHRpb25hbCBzZXQgb2YgYWRtaW5pc3RlcmVkIG9iamVjdHMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlYWRhcHRlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlci1jbGFzcyBzcGVjaWZpZXMgdGhlCi0gICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMKLSAgICAgICAgdGhlIGphdmF4LnJlc291cmNlLnNwaS5SZXNvdXJjZUFkYXB0ZXIKLSAgICAgICAgaW50ZXJmYWNlLiBUaGlzIEphdmEgY2xhc3MgaXMgcHJvdmlkZWQgYXMgcGFydCBvZgotICAgICAgICByZXNvdXJjZSBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yCi0gICAgICAgIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgY29udHJhY3RzLiBUaGUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgb2YgdGhpcyBjbGFzcyBpcyByZXF1aXJlZCB0byBiZSBhIEphdmFCZWFuLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm91dGJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluYm91bmQtcmVzb3VyY2VhZGFwdGVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTppbmJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkbWlub2JqZWN0IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTphZG1pbm9iamVjdFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LXBlcm1pc3Npb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlY3VyaXR5LXBlcm1pc3Npb25UeXBlIHNwZWNpZmllcyBhIHNlY3VyaXR5Ci1wZXJtaXNzaW9uIHRoYXQgaXMgcmVxdWlyZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIgY29kZS4KLQotVGhlIHNlY3VyaXR5IHBlcm1pc3Npb24gbGlzdGVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLWFyZSBvbmVzIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIHJlcXVpcmVkIGJ5IHRoZQotZGVmYXVsdCBwZXJtaXNzaW9uIHNldCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbm5lY3Rvcgotc3BlY2lmaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGNhbiBtZW50aW9uIHNwZWNpZmljCi1yZWFzb24gdGhhdCByZXNvdXJjZSBhZGFwdGVyIHJlcXVpcmVzIGEgZ2l2ZW4gc2VjdXJpdHkKLXBlcm1pc3Npb24uCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcGVybWlzc2lvbi1zcGVjIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50IHBlcm1pc3Npb24tc3BlYyBzcGVjaWZpZXMgYSBzZWN1cml0eQotICAgICAgICBwZXJtaXNzaW9uIGJhc2VkIG9uIHRoZSBTZWN1cml0eSBwb2xpY3kgZmlsZQotICAgICAgICBzeW50YXguIFJlZmVyIHRvIHRoZSBmb2xsb3dpbmcgVVJMIGZvciBTdW4ncwotICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcGVybWlzc2lvbgotICAgICAgICBzcGVjaWZpY2F0aW9uOgotCi0gICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuNC9kb2NzL2d1aWRlL3NlY3VyaXR5L1BvbGljeUZpbGVzLmh0bWwjRmlsZVN5bnRheAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0idHJhbnNhY3Rpb24tc3VwcG9ydFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgdHJhbnNhY3Rpb24tc3VwcG9ydFR5cGUgc3BlY2lmaWVzIHRoZSBsZXZlbCBvZgotdHJhbnNhY3Rpb24gc3VwcG9ydCBwcm92aWRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4gSXQgaXMKLXVzZWQgYnkgdHJhbnNhY3Rpb24tc3VwcG9ydCBlbGVtZW50cy4KLQotVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBOb1RyYW5zYWN0aW9uCi0gICAgTG9jYWxUcmFuc2FjdGlvbgotICAgIFhBVHJhbnNhY3Rpb24KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9UcmFuc2FjdGlvbiIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFRyYW5zYWN0aW9uIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhBVHJhbnNhY3Rpb24iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS94a2l0L3NjaGVtYXMvajJlZS9lamItamFyXzJfMS54c2QgYi92MS94a2l0L3NjaGVtYXMvajJlZS9lamItamFyXzJfMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNmMxMmUuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9zY2hlbWFzL2oyZWUvZWpiLWphcl8yXzEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjM4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjIuMSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci1AKCMpZWpiLWphcl8yXzEueHNkcwkxLjEwIDA3LzI0LzAyCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1Db3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLVJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLXJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1yZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLVUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci1tYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLWNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgRUpCIDIuMSBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yLiAgQWxsIEVKQiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUKLXRoZSBlamItamFyIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2U6Ci0KLWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgIDxlamItamFyIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLSAgICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvZWpiLWphcl8yXzEueHNkIgotICAgICB2ZXJzaW9uPSIyLjEiPgotICAgIC4uLgotICAgIDwvZWpiLWphcj4KLQotVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi10aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciB0aGUKLUoyRUUgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9lamItamFyXzJfMS54c2QKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQotZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0gIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotPHhzZDplbGVtZW50IG5hbWU9ImVqYi1qYXIiIHR5cGU9ImoyZWU6ZWpiLWphclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGlzIGlzIHRoZSByb290IG9mIHRoZSBlamItamFyIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6a2V5IG5hbWU9ImVqYi1uYW1lLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBlamItbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIGVudGVycHJpc2UKLSAgICBiZWFuLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnRlcnByaXNlLWJlYW5zLyoiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItbmFtZSIvPgotICAgIDwveHNkOmtleT4KLQotICAgIDx4c2Q6a2V5cmVmIG5hbWU9ImVqYi1uYW1lLXJlZmVyZW5jZXMiCi0gICAgICAgICAgICByZWZlcj0iajJlZTplamItbmFtZS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCi0gICAgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIG11c3QgYmUgdG8gYSBzcGVjaWZpYyBlamItbmFtZQotICAgIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBlbnRlcnByaXNlLWJlYW5zIGVsZW1lbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IKLSAgICAgICAgICAgIHhwYXRoPSIuLy9qMmVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZS9qMmVlOnJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSIvPgotICAgICAgICA8eHNkOmZpZWxkCi0gICAgICAgICAgICB4cGF0aD0iajJlZTplamItbmFtZSIvPgotICAgIDwveHNkOmtleXJlZj4KLQotICAgIDx4c2Q6a2V5IG5hbWU9InJvbGUtbmFtZS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBBIHJvbGUtbmFtZS1rZXkgaXMgc3BlY2lmaWVkIHRvIGFsbG93IHRoZSByZWZlcmVuY2VzCi0gICAgZnJvbSB0aGUgc2VjdXJpdHktcm9sZS1yZWZzLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudGVycHJpc2UtYmVhbnMvKi9qMmVlOnNlY3VyaXR5LXJvbGUiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyb2xlLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0KLSAgICA8eHNkOmtleXJlZiBuYW1lPSJyb2xlLW5hbWUtcmVmZXJlbmNlcyIKLSAgICAgICAgICAgIHJlZmVyPSJqMmVlOnJvbGUtbmFtZS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCi0gICAgc2VjdXJpdHktcm9sZS1yZWYgdG8gYSBzcGVjaWZpZWQgcm9sZS1uYW1lLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudGVycHJpc2UtYmVhbnMvKi9qMmVlOnNlY3VyaXR5LXJvbGUtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cm9sZS1saW5rIi8+Ci0gICAgPC94c2Q6a2V5cmVmPgotCi08L3hzZDplbGVtZW50PgotCi0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBuYW1lL3ZhbHVlCi1jb25maWd1cmF0aW9uIHByb3BlcnR5IHBhaXIgZm9yIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQotVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyCi1tZXNzYWdlLWRyaXZlbiBiZWFuIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBtZXNzYWdpbmcgdHlwZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktbmFtZSBlbGVtZW50IGNvbnRhaW5zCi0gICAgICAgIHRoZSBuYW1lIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgb2YKLSAgICAgICAgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCi0gICAgICAgIEZvciBKTVMgbWVzc2FnZS1kcml2ZW4gYmVhbnMsIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkKLSAgICAgICAgbmFtZXMgYXJlIHJlY29nbml6ZWQ6IGFja25vd2xlZGdlTW9kZSwKLSAgICAgICAgbWVzc2FnZVNlbGVjdG9yLCBkZXN0aW5hdGlvblR5cGUsIHN1YnNjcmlwdGlvbkR1cmFiaWxpdHkKLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LXZhbHVlIGVsZW1lbnQKLSAgICAgICAgY29udGFpbnMgdGhlIHZhbHVlIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgcHJvcGVydHkgb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWN0aXZhdGlvbi1jb25maWdUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGFjdGl2YXRpb24tY29uZmlnVHlwZSBkZWZpbmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotZXhwZWN0ZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuCi1pbiBpdHMgb3BlcmF0aW9uYWwgZW52aXJvbm1lbnQuIFRoaXMgbWF5IGluY2x1ZGUgaW5mb3JtYXRpb24KLWFib3V0IG1lc3NhZ2UgYWNrbm93bGVkZ2VtZW50LCBtZXNzYWdlIHNlbGVjdG9yLCBleHBlY3RlZAotZGVzdGluYXRpb24gdHlwZSwgZXRjLgotCi1UaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBleHByZXNzZWQgaW4gdGVybXMgb2YKLW5hbWUvdmFsdWUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgotCi1UaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXIKLW1lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTphY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhc3NlbWJseS1kZXNjcmlwdG9yVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBhc3NlbWJseS1kZXNjcmlwdG9yVHlwZSBkZWZpbmVzCi1hcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbi4KLQotVGhlIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uIGNvbnNpc3RzIG9mIHRoZQotZm9sbG93aW5nIHBhcnRzOiB0aGUgZGVmaW5pdGlvbiBvZiBzZWN1cml0eSByb2xlcywgdGhlCi1kZWZpbml0aW9uIG9mIG1ldGhvZCBwZXJtaXNzaW9ucywgdGhlIGRlZmluaXRpb24gb2YKLXRyYW5zYWN0aW9uIGF0dHJpYnV0ZXMgZm9yIGVudGVycHJpc2UgYmVhbnMgd2l0aAotY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gYW5kIGEgbGlzdCBvZgotbWV0aG9kcyB0byBiZSBleGNsdWRlZCBmcm9tIGJlaW5nIGludm9rZWQuCi0KLUFsbCB0aGUgcGFydHMgYXJlIG9wdGlvbmFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlCi1vbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4KLQotUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wZXJtaXNzaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXRob2QtcGVybWlzc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXRyYW5zYWN0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtbGlzdCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZXhjbHVkZS1saXN0VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXAtZmllbGRUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNtcC1maWVsZFR5cGUgZGVzY3JpYmVzIGEgY29udGFpbmVyLW1hbmFnZWQgZmllbGQuIFRoZQotY21wLWZpZWxkVHlwZSBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGQsCi1hbmQgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZC1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotICAgICAgICBjb250YWluZXIgbWFuYWdlZCBmaWVsZC4KLQotICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLSAgICAgICAgY21wLXZlcnNpb24gMi54IG11c3QgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZQotICAgICAgICBsZXR0ZXIuIFRoaXMgZmllbGQgaXMgYWNjZXNzZWQgYnkgbWV0aG9kcyB3aG9zZQotICAgICAgICBuYW1lcyBjb25zaXN0cyBvZiB0aGUgbmFtZSBvZiB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5Ci0gICAgICAgIGZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0IGxldHRlciBpcyB1cHBlcmNhc2VkLAotICAgICAgICBwcmVmaXhlZCBieSAiZ2V0IiBvciAic2V0Ii4KLQotICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLSAgICAgICAgY21wLXZlcnNpb24gMS54IG11c3QgZGVub3RlIGEgcHVibGljIGZpZWxkIG9mIHRoZQotICAgICAgICBlbnRlcnByaXNlIGJlYW4gY2xhc3Mgb3Igb25lIG9mIGl0cyBzdXBlcmNsYXNzZXMuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iY21wLXZlcnNpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNtcC12ZXJzaW9uVHlwZSBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgYW4gZW50aXR5IGJlYW4KLXdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuIEl0IGlzIHVzZWQgYnkKLWNtcC12ZXJzaW9uIGVsZW1lbnRzLgotCi1UaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLSAgICAxLngKLSAgICAyLngKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMS54Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIueCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjbXItZmllbGQtdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNsYXNzIG9mIGEKLWNvbGxlY3Rpb24tdmFsdWVkIGxvZ2ljYWwgcmVsYXRpb25zaGlwIGZpZWxkIGluIHRoZSBlbnRpdHkKLWJlYW4gY2xhc3MuIFRoZSB2YWx1ZSBvZiBhbiBlbGVtZW50IHVzaW5nIGNtci1maWVsZC10eXBlVHlwZQotbXVzdCBiZSBlaXRoZXI6IGphdmEudXRpbC5Db2xsZWN0aW9uIG9yIGphdmEudXRpbC5TZXQuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEudXRpbC5TZXQiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtci1maWVsZFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgY21yLWZpZWxkVHlwZSBkZXNjcmliZXMgdGhlIGJlYW4gcHJvdmlkZXIncyB2aWV3IG9mCi1hIHJlbGF0aW9uc2hpcC4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZAotdGhlIG5hbWUgYW5kIHRoZSBjbGFzcyB0eXBlIG9mIGEgZmllbGQgaW4gdGhlIHNvdXJjZSBvZiBhCi1yb2xlIG9mIGEgcmVsYXRpb25zaGlwLiBUaGUgY21yLWZpZWxkLW5hbWUgZWxlbWVudAotY29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgdXNlZCBmb3IgdGhlIGdldCBhbmQgc2V0IGFjY2Vzc29yCi1tZXRob2RzIGZvciB0aGUgcmVsYXRpb25zaGlwLiBUaGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBpcwotdXNlZCBvbmx5IGZvciBjb2xsZWN0aW9uLXZhbHVlZCBjbXItZmllbGRzLiBJdCBzcGVjaWZpZXMgdGhlCi10eXBlIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgaXMgdXNlZC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXItZmllbGQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNtci1maWVsZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgbG9naWNhbCByZWxhdGlvbnNoaXAgZmllbGQgaW4gdGhlIGVudGl0eSBiZWFuCi0gICAgICAgIGNsYXNzLiBUaGUgbmFtZSBvZiB0aGUgY21yLWZpZWxkIG11c3QgYmVnaW4gd2l0aCBhCi0gICAgICAgIGxvd2VyY2FzZSBsZXR0ZXIuIFRoaXMgZmllbGQgaXMgYWNjZXNzZWQgYnkgbWV0aG9kcwotICAgICAgICB3aG9zZSBuYW1lcyBjb25zaXN0IG9mIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAotICAgICAgICBzcGVjaWZpZWQgYnkgY21yLWZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0Ci0gICAgICAgIGxldHRlciBpcyB1cHBlcmNhc2VkLCBwcmVmaXhlZCBieSAiZ2V0IiBvciAic2V0Ii4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21yLWZpZWxkLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmNtci1maWVsZC10eXBlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGNvbnRhaW5lci10cmFuc2FjdGlvblR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyCi1tdXN0IG1hbmFnZSB0cmFuc2FjdGlvbiBzY29wZXMgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4ncwotbWV0aG9kIGludm9jYXRpb25zLiBJdCBkZWZpbmVzIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhCi1saXN0IG9mIG1ldGhvZCBlbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLiBUaGUKLXRyYW5zYWN0aW9uIGF0dHJpYnV0ZSBpcyB0byBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3BlY2lmaWVkCi1tZXRob2RzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFucy1hdHRyaWJ1dGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnRyYW5zLWF0dHJpYnV0ZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVqYi1jbGFzc1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWpiLWNsYXNzVHlwZSBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi1lbnRlcnByaXNlIGJlYW4ncyBjbGFzcy4gSXQgaXMgdXNlZCBieSBlamItY2xhc3MgZWxlbWVudHMuCi0KLUV4YW1wbGU6Ci0KLSAgICA8ZWpiLWNsYXNzPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2VCZWFuPC9lamItY2xhc3M+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1qYXJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVqYi1qYXJUeXBlIGRlZmluZXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgRUpCCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IuIEl0IGNvbnRhaW5zCi0KLSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBlamItamFyIGZpbGUKLSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotICAgIC0gYW4gb3B0aW9uYWwgaWNvbiB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UKLSAgICAgIGljb24gZmlsZSBuYW1lCi0gICAgLSBtYW5kYXRvcnkgc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgaW5jbHVkZWQKLSAgICAgIGVudGVycHJpc2UgYmVhbnMKLSAgICAtIGEgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcywKLSAgICAgIGlmIGFueQotICAgIC0gYW4gb3B0aW9uYWwgYXBwbGljYXRpb24tYXNzZW1ibHkgZGVzY3JpcHRvcgotICAgIC0gYW4gb3B0aW9uYWwgbmFtZSBvZiBhbiBlamItY2xpZW50LWphciBmaWxlIGZvciB0aGUKLSAgICAgIGVqYi1qYXIuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmljb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGVycHJpc2UtYmVhbnMiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVudGVycHJpc2UtYmVhbnNUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxhdGlvbnNoaXBzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZWxhdGlvbnNoaXBzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9InJlbGF0aW9uc2hpcC1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWpiLXJlbGF0aW9uLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICByZWxhdGlvbi4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0gICAgICAgIHJlbGF0aW9uc2hpcHMuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLXJlbGF0aW9uIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWxhdGlvbi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc2VtYmx5LWRlc2NyaXB0b3IiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmFzc2VtYmx5LWRlc2NyaXB0b3JUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQKLSAgICAgICAgZGVzY3JpcHRvciBpcyBvcHRpb25hbCBmb3IgdGhlIGVqYi1qYXIgZmlsZQotICAgICAgICBwcm9kdWNlci4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWNsaWVudC1qYXIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG9wdGlvbmFsIGVqYi1jbGllbnQtamFyIGVsZW1lbnQgc3BlY2lmaWVzIGEgSkFSCi0gICAgICAgIGZpbGUgdGhhdCBjb250YWlucyB0aGUgY2xhc3MgZmlsZXMgbmVjZXNzYXJ5IGZvciBhCi0gICAgICAgIGNsaWVudCBwcm9ncmFtIHRvIGFjY2VzcyB0aGUKLSAgICAgICAgZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgZWpiLWphciBmaWxlLgotCi0gICAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICAgICAgIDxlamItY2xpZW50LWphcj5lbXBsb3llZV9zZXJ2aWNlX2NsaWVudC5qYXIKLSAgICAgICAgICAgIDwvZWpiLWNsaWVudC1qYXI+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgZml4ZWQ9IjIuMSIKLSAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIHZlcnNpb24gc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIHRoZQotICAgIEVKQiBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIGluc3RhbmNlIGRvY3VtZW50IG11c3QKLSAgICBjb21wbHkgd2l0aC4gVGhpcyBpbmZvcm1hdGlvbiBlbmFibGVzIGRlcGxveW1lbnQgdG9vbHMKLSAgICB0byB2YWxpZGF0ZSBhIHBhcnRpY3VsYXIgRUpCIERlcGxveW1lbnQKLSAgICBEZXNjcmlwdG9yIHdpdGggcmVzcGVjdCB0byBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIEVKQgotICAgIHNjaGVtYS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlamItbmFtZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWpiLW5hbWVUeXBlIHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncyBuYW1lLiBJdCBpcwotdXNlZCBieSBlamItbmFtZSBlbGVtZW50cy4gVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZQotZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIG5hbWUgdGhlIGVudGVycHJpc2UgYmVhbiBpbiB0aGUKLWVqYi1qYXIgZmlsZSdzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZQotdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgc2FtZQotZWpiLWphciBmaWxlLgotCi1UaGVyZSBpcyBubyBhcmNoaXRlY3RlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgdXNlZAotZWpiLW5hbWUgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgdGhlIEpOREkgbmFtZSB0aGF0Ci10aGUgRGVwbG95ZXIgd2lsbCBhc3NpZ24gdG8gdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUuCi0KLVRoZSBuYW1lIGZvciBhbiBlbnRpdHkgYmVhbiBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwKLXJ1bGVzIGZvciBhbiBOTVRPS0VOLgotCi1FeGFtcGxlOgotCi08ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgPHhzZDp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlbGF0aW9uVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBlamItcmVsYXRpb25UeXBlIGRlc2NyaWJlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3bwotZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuICBJdCBpcyB1c2VkCi1ieSBlamItcmVsYXRpb24gZWxlbWVudHMuIEl0IGNvbnRhaW5zIGEgZGVzY3JpcHRpb247IGFuCi1vcHRpb25hbCBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50OyBhbmQgZXhhY3RseSB0d28KLXJlbGF0aW9uc2hpcCByb2xlIGRlY2xhcmF0aW9ucywgZGVmaW5lZCBieSB0aGUKLWVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50cy4gVGhlIG5hbWUgb2YgdGhlCi1yZWxhdGlvbnNoaXAsIGlmIHNwZWNpZmllZCwgaXMgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphcgotZmlsZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb24tbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWxhdGlvbi1uYW1lIGVsZW1lbnQgcHJvdmlkZXMgYSB1bmlxdWUgbmFtZQotICAgICAgICB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZSBmb3IgYSByZWxhdGlvbnNoaXAuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSBkZXNjcmliZXMgYSByb2xlIHdpdGhpbiBhCi1yZWxhdGlvbnNoaXAuIFRoZXJlIGFyZSB0d28gcm9sZXMgaW4gZWFjaCByZWxhdGlvbnNoaXAuCi0KLVRoZSBlamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbjsgYW4gb3B0aW9uYWwgbmFtZSBmb3IgdGhlIHJlbGF0aW9uc2hpcCByb2xlOyBhCi1zcGVjaWZpY2F0aW9uIG9mIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJvbGU7IGFuIG9wdGlvbmFsCi1zcGVjaWZpY2F0aW9uIG9mIGNhc2NhZGUtZGVsZXRlIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByb2xlOwotdGhlIHJvbGUgc291cmNlOyBhbmQgYSBkZWNsYXJhdGlvbiBvZiB0aGUgY21yLWZpZWxkLCBpZiBhbnksCi1ieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGlzCi1hY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UuCi0KLVRoZSBtdWx0aXBsaWNpdHkgYW5kIHJvbGUtc291cmNlIGVsZW1lbnQgYXJlIG1hbmRhdG9yeS4KLQotVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGRlc2lnbmF0ZXMgYW4gZW50aXR5Ci1iZWFuIGJ5IG1lYW5zIG9mIGFuIGVqYi1uYW1lIGVsZW1lbnQuIEZvciBiaWRpcmVjdGlvbmFsCi1yZWxhdGlvbnNoaXBzLCBib3RoIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG11c3QgZGVjbGFyZSBhCi1yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB0aGF0IHNwZWNpZmllcyBhIGNtci1maWVsZAotaW4gdGVybXMgb2Ygd2hpY2ggdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZC4gVGhlIGxhY2sgb2YKLWEgY21yLWZpZWxkIGVsZW1lbnQgaW4gYW4gZWpiLXJlbGF0aW9uc2hpcC1yb2xlIHNwZWNpZmllcwotdGhhdCB0aGUgcmVsYXRpb25zaGlwIGlzIHVuaWRpcmVjdGlvbmFsIGluIG5hdmlnYWJpbGl0eSBhbmQKLXRoZSBlbnRpdHkgYmVhbiB0aGF0IHBhcnRpY2lwYXRlcyBpbiB0aGUgcmVsYXRpb25zaGlwIGlzCi0ibm90IGF3YXJlIiBvZiB0aGUgcmVsYXRpb25zaGlwLgotCi1FeGFtcGxlOgotCi08ZWpiLXJlbGF0aW9uPgotICAgIDxlamItcmVsYXRpb24tbmFtZT5Qcm9kdWN0LUxpbmVJdGVtPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cHJvZHVjdC1oYXMtbGluZWl0ZW1zCi0gICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgIDxlamItbmFtZT5Qcm9kdWN0RUpCPC9lamItbmFtZT4KLSAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotPC9lamItcmVsYXRpb24+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSBlbGVtZW50IGRlZmluZXMgYQotICAgICAgICBuYW1lIGZvciBhIHJvbGUgdGhhdCBpcyB1bmlxdWUgd2l0aGluIGFuCi0gICAgICAgIGVqYi1yZWxhdGlvbi4gRGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgY2FuIHVzZSB0aGUKLSAgICAgICAgc2FtZSBuYW1lIGZvciBhIHJvbGUuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im11bHRpcGxpY2l0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bXVsdGlwbGljaXR5VHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1kZWxldGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0LCB3aXRoaW4gYQotICAgICAgICBwYXJ0aWN1bGFyIHJlbGF0aW9uc2hpcCwgdGhlIGxpZmV0aW1lIG9mIG9uZSBvciBtb3JlCi0gICAgICAgIGVudGl0eSBiZWFucyBpcyBkZXBlbmRlbnQgdXBvbiB0aGUgbGlmZXRpbWUgb2YKLSAgICAgICAgYW5vdGhlciBlbnRpdHkgYmVhbi4gVGhlIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgY2FuCi0gICAgICAgIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUKLSAgICAgICAgZWxlbWVudCBjb250YWluZWQgaW4gYW4gZWpiLXJlbGF0aW9uIGVsZW1lbnQgaW4KLSAgICAgICAgd2hpY2ggdGhlIG90aGVyIGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotICAgICAgICBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21yLWZpZWxkIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpjbXItZmllbGRUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGVycHJpc2UtYmVhbnNUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVudGVycHJpc2UtYmVhbnNUeXBlIGRlY2xhcmVzIG9uZSBvciBtb3JlIGVudGVycHJpc2UKLWJlYW5zLiBFYWNoIGJlYW4gY2FuIGJlIGEgc2Vzc2lvbiwgZW50aXR5IG9yIG1lc3NhZ2UtZHJpdmVuCi1iZWFuLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlc3Npb24tYmVhblR5cGUiPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mCi0gICAgICAgIGFuIEVKQiByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluCi0gICAgICAgIHRoZSBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotICAgICAgICB0aGUgY29tcG9uZW50LgotCi0gICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItbG9jYWwtcmVmIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLSAgICAgICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLSAgICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0gICAgICAgIHdpdGhpbiB0aGUgY29tcG9uZW50LgotCi0gICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVmIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLSAgICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0gICAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgICAgICBjb21wb25lbnQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotICAgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLSAgICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0gICAgICAgIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLXJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0gICAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0gICAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0gICAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtcmVmIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJlcy1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLSAgICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudi1lbnRyeSIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZW50aXR5LWJlYW5UeXBlIj4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mCi0gICAgICAgIGFuIEVKQiByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluCi0gICAgICAgIHRoZSBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotICAgICAgICB0aGUgY29tcG9uZW50LgotCi0gICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItbG9jYWwtcmVmIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotICAgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0KLSAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktcmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotICAgICAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0gICAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotICAgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLSAgICAgICAgY29tcG9uZW50LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotICAgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLSAgICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0gICAgICAgIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLSAgICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLSAgICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLSAgICAgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlCi0gICAgICAgIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnYtZW50cnkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZW52LWVudHJ5LW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRyaXZlbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kcml2ZW4tYmVhblR5cGUiPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1lamItbG9jYWwtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZgotICAgICAgICBhbiBFSkIgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbgotICAgICAgICB0aGUgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLSAgICAgICAgdGhlIGNvbXBvbmVudC4KLQotICAgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgYmUgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLWxvY2FsLXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotICAgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0KLSAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLSAgICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0gICAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgICAgICBjb21wb25lbnQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLW1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotICAgICAgICBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLSAgICAgICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0gICAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgICAgICBjb21wb25lbnQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLSAgICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLSAgICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1yZWYiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLSAgICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudi1lbnRyeSIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpjaG9pY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWJlYW5UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVudGl0eS1iZWFuVHlwZSBkZWNsYXJlcyBhbiBlbnRpdHkgYmVhbi4gVGhlIGRlY2xhcmF0aW9uCi1jb25zaXN0cyBvZjoKLQotICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotICAgICAgaWNvbiBmaWxlIG5hbWUKLSAgICAtIGEgdW5pcXVlIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbgotICAgICAgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBob21lCi0gICAgICBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueQotICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIGxvY2FsIGhvbWUgYW5kIGxvY2FsCi0gICAgICBpbnRlcmZhY2VzLCBpZiBhbnkKLSAgICAtIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgLSB0aGUgZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZSBtYW5hZ2VtZW50IHR5cGUKLSAgICAtIHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzIG5hbWUKLSAgICAtIGFuIGluZGljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVlbnRyYW5jeQotICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUKLSAgICAgIGVudGl0eSBiZWFuJ3MgY21wLXZlcnNpb24KLSAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MKLSAgICAgIGFic3RyYWN0IHNjaGVtYSBuYW1lCi0gICAgLSBhbiBvcHRpb25hbCBsaXN0IG9mIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcwotICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkKLSAgICAgIGZpZWxkCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50Ci0gICAgICBlbnRyaWVzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQgotICAgICAgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbAotICAgICAgRUpCIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViCi0gICAgICBzZXJ2aWNlIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlCi0gICAgICByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkKLSAgICAgIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0gICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0gICAgICByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UKLSAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIHNldCBvZiBxdWVyeSBkZWNsYXJhdGlvbnMKLSAgICAgIGZvciBmaW5kZXIgYW5kIHNlbGVjdCBtZXRob2RzIGZvciBhbiBlbnRpdHkKLSAgICAgIGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnguCi0gICAgLSBhbiBvcHRpb25hbCBzZXQgb2YgZGVwbG95bWVudC1leHRlbnNpb24KLSAgICAgIGRlY2xhcmF0aW9ucy4KLQotVGhlIG9wdGlvbmFsIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQKLWZvciBhbiBlbnRpdHkgYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlIGFuZAotY21wLXZlcnNpb24gMi54LgotCi1UaGUgb3B0aW9uYWwgcHJpbWtleS1maWVsZCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvcgotaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLgotCi1UaGUgb3B0aW9uYWwgY21wLXZlcnNpb24gZWxlbWVudCBtYXkgYmUgcHJlc2VudCBpbiB0aGUKLWRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLiBJZgotdGhlIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24KLWVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXRzIHZhbHVlIGRlZmF1bHRzIHRvIDIueC4KLQotVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZgotdGhlIGVudGl0eSBiZWFuIGNtcC12ZXJzaW9uIGlzIDEueC4KLQotVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZgotdGhlIGVudGl0eSBiZWFuIGhhcyBhIHJlbW90ZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlLgotCi1UaGUgb3B0aW9uYWwgbG9jYWwtaG9tZSBhbmQgbG9jYWwgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQKLWlmIHRoZSBlbnRpdHkgYmVhbiBoYXMgYSBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2UuCi0KLUVpdGhlciBib3RoIHRoZSBsb2NhbC1ob21lIGFuZCB0aGUgbG9jYWwgZWxlbWVudHMgb3IgYm90aAotdGhlIGhvbWUgYW5kIHRoZSByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQuCi0KLVRoZSBvcHRpb25hbCBxdWVyeSBlbGVtZW50cyBtdXN0IGJlIHByZXNlbnQgaWYgdGhlCi1wZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDIueCBhbmQKLXF1ZXJ5IG1ldGhvZHMgb3RoZXIgdGhhbiBmaW5kQnlQcmltYXJ5S2V5IGhhdmUgYmVlbiBkZWZpbmVkCi1mb3IgdGhlIGVudGl0eSBiZWFuLgotCi1UaGUgb3RoZXIgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlCi1zZW5zZSB0aGF0IHRoZXkgYXJlIG9taXR0ZWQgaWYgdGhlIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0KLWFyZSBlbXB0eS4KLQotQXQgbGVhc3Qgb25lIGNtcC1maWVsZCBlbGVtZW50IG11c3QgYmUgcHJlc2VudCBpbiB0aGUKLWRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZAotdGhlIGNtcC12ZXJzaW9uIGlzIDEueCwgYW5kIG5vbmUgbXVzdCBub3QgYmUgcHJlc2VudCBpZiB0aGUKLWVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQmVhbi4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1uYW1lVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaG9tZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aG9tZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVtb3RlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwtaG9tZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bG9jYWwtaG9tZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpsb2NhbFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLWNsYXNzVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGVyc2lzdGVuY2UtdHlwZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW0ta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHByaW0ta2V5LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlCi0gICAgICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCi0gICAgICAgIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MuCi0KLSAgICAgICAgSWYgdGhlIGRlZmluaXRpb24gb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIGlzCi0gICAgICAgIGRlZmVycmVkIHRvIGRlcGxveW1lbnQgdGltZSwgdGhlIHByaW0ta2V5LWNsYXNzCi0gICAgICAgIGVsZW1lbnQgc2hvdWxkIHNwZWNpZnkgamF2YS5sYW5nLk9iamVjdC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVlbnRyYW50IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSByZWVudHJhbnQgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhbiBlbnRpdHkKLSAgICAgICAgYmVhbiBpcyByZWVudHJhbnQgb3Igbm90LgotCi0gICAgICAgIFRoZSByZWVudHJhbnQgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvCi0gICAgICAgIGZvbGxvd2luZzogdHJ1ZSBvciBmYWxzZQotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXAtdmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Y21wLXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhYnN0cmFjdC1zY2hlbWEtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6amF2YS1pZGVudGlmaWVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotICAgICAgICBvZiB0aGUgYWJzdHJhY3Qgc2NoZW1hIHR5cGUgb2YgYW4gZW50aXR5IGJlYW4gd2l0aAotICAgICAgICBjbXAtdmVyc2lvbiAyLnguIEl0IGlzIHVzZWQgaW4gRUpCIFFMIHF1ZXJpZXMuCi0KLSAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBmb3IgYW4gZW50aXR5Ci0gICAgICAgIGJlYW4gd2hvc2UgbG9jYWwgaW50ZXJmYWNlIGlzCi0gICAgICAgIGNvbS5hY21lLmNvbW1lcmNlLk9yZGVyIG1pZ2h0IGJlIE9yZGVyLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXAtZmllbGQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmNtcC1maWVsZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWtleS1maWVsZCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCi0gICAgICAgIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5IGZpZWxkIGZvciBhbiBlbnRpdHkgd2l0aAotICAgICAgICBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4KLQotICAgICAgICBUaGUgcHJpbWtleS1maWVsZCBtdXN0IGJlIG9uZSBvZiB0aGUgZmllbGRzIGRlY2xhcmVkCi0gICAgICAgIGluIHRoZSBjbXAtZmllbGQgZWxlbWVudCwgYW5kIHRoZSB0eXBlIG9mIHRoZSBmaWVsZAotICAgICAgICBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBwcmltYXJ5IGtleSB0eXBlLgotCi0gICAgICAgIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgbm90IHVzZWQgaWYgdGhlIHByaW1hcnkKLSAgICAgICAga2V5IG1hcHMgdG8gbXVsdGlwbGUgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0gICAgICAgIChpLmUuIHRoZSBrZXkgaXMgYSBjb21wb3VuZCBrZXkpLiBJbiB0aGlzIGNhc2UsIHRoZQotICAgICAgICBmaWVsZHMgb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLCBhbmQKLSAgICAgICAgdGhlaXIgbmFtZXMgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBmaWVsZCBuYW1lcyBvZgotICAgICAgICB0aGUgZW50aXR5IGJlYW4gY2xhc3MgdGhhdCBjb21wcmlzZSB0aGUga2V5LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVudi1lbnRyeVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1sb2NhbC1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1sb2NhbC1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlcnZpY2UtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VjdXJpdHktaWRlbnRpdHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXNvdXJjZS1lbnYtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnF1ZXJ5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXhjbHVkZS1saXN0VHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBleGNsdWRlLWxpc3RUeXBlIHNwZWNpZmllcyBvbmUgb3IgbW9yZSBtZXRob2RzIHdoaWNoCi10aGUgQXNzZW1ibGVyIG1hcmtzIHRvIGJlIHVuY2FsbGFibGUuCi0KLUlmIHRoZSBtZXRob2QgcGVybWlzc2lvbiByZWxhdGlvbiBjb250YWlucyBtZXRob2RzIHRoYXQgYXJlCi1pbiB0aGUgZXhjbHVkZSBsaXN0LCB0aGUgRGVwbG95ZXIgc2hvdWxkIGNvbnNpZGVyIHRob3NlCi1tZXRob2RzIHRvIGJlIHVuY2FsbGFibGUuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImphdmEtdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIGlzIGEgZ2VuZXJpYyB0eXBlIHRoYXQgZGVzaWduYXRlcyBhIEphdmEgcHJpbWl0aXZlCi10eXBlIG9yIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGludGVyZmFjZS90eXBlLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlteXHB7Wn1dKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZHJpdmVuLWJlYW5UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2UtZHJpdmVuIGVsZW1lbnQgZGVjbGFyZXMgYSBtZXNzYWdlLWRyaXZlbgotYmVhbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0gICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0gICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0gICAgICBpY29uIGZpbGUgbmFtZS4KLSAgICAtIGEgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuIGluCi0gICAgICB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgLSB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2luZwotICAgICAgdHlwZQotICAgIC0gdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLSAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZQotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotICAgICAgbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzCi0gICAgICBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudAotICAgICAgZW50cmllcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbCBFSkIKLSAgICAgIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViIHNlcnZpY2UKLSAgICAgIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eQotICAgICAgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzCi0gICAgICBtZXRob2RzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0gICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeQotICAgICAgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZQotICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgZGVwbG95bWVudCBleHRlbnNpb25zCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLWNsYXNzVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnaW5nLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UKLSAgICAgICAgbGlzdGVuZXIgaW50ZXJmYWNlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuLiBJZgotICAgICAgICB0aGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcwotICAgICAgICBhc3N1bWVkIHRvIGJlIGphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zYWN0aW9uLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnRyYW5zYWN0aW9uLXR5cGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbGluayIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmFjdGl2YXRpb24tY29uZmlnVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbnYtZW50cnlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbG9jYWwtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbG9jYWwtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZXJ2aWNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VjdXJpdHktaWRlbnRpdHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXNvdXJjZS1lbnYtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtZXRob2QtaW50ZlR5cGUiPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyBhIG1ldGhvZCBlbGVtZW50IHRvCi1kaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZAotc2lnbmF0dXJlIHRoYXQgYXJlIG11bHRpcGx5IGRlZmluZWQgYWNyb3NzIHRoZSBob21lIGFuZAotY29tcG9uZW50IGludGVyZmFjZXMgKGUuZywgaW4gYm90aCBhbiBlbnRlcnByaXNlIGJlYW4ncwotcmVtb3RlIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9yIGluIGJvdGggYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLWhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLCBldGMuKTsgdGhlIGNvbXBvbmVudCBhbmQgd2ViCi1zZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMsIGFuZCBzbyBvbi4KLQotVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIEhvbWUKLSAgICBSZW1vdGUKLSAgICBMb2NhbEhvbWUKLSAgICBMb2NhbAotICAgIFNlcnZpY2VFbmRwb2ludAotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lIi8+Ci0gICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3RlIi8+Ci0gICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxIb21lIi8+Ci0gICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWwiLz4KLSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRW5kcG9pbnQiLz4KLSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im1ldGhvZC1uYW1lVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtZXRob2QtbmFtZVR5cGUgY29udGFpbnMgYSBuYW1lIG9mIGFuIGVudGVycHJpc2UKLWJlYW4gbWV0aG9kIG9yIHRoZSBhc3RlcmlzayAoKikgY2hhcmFjdGVyLiBUaGUgYXN0ZXJpc2sgaXMKLXVzZWQgd2hlbiB0aGUgZWxlbWVudCBkZW5vdGVzIGFsbCB0aGUgbWV0aG9kcyBvZiBhbgotZW50ZXJwcmlzZSBiZWFuJ3MgY2xpZW50IHZpZXcgaW50ZXJmYWNlcy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtcGFyYW1zVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtZXRob2QtcGFyYW1zVHlwZSBkZWZpbmVzIGEgbGlzdCBvZiB0aGUKLWZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZXMgb2YgdGhlIG1ldGhvZCBwYXJhbWV0ZXJzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtcGFyYW0iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmphdmEtdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXRob2QtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIHByaW1pdGl2ZQotICAgICAgICBvciBhIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZSBvZiBhIG1ldGhvZAotICAgICAgICBwYXJhbWV0ZXIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtcGVybWlzc2lvblR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlIHNwZWNpZmllcyB0aGF0IG9uZSBvciBtb3JlCi1zZWN1cml0eSByb2xlcyBhcmUgYWxsb3dlZCB0byBpbnZva2Ugb25lIG9yIG1vcmUgZW50ZXJwcmlzZQotYmVhbiBtZXRob2RzLiBUaGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlIGNvbnNpc3RzIG9mIGFuCi1vcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIHNlY3VyaXR5IHJvbGUgbmFtZXMgb3IgYW4KLWluZGljYXRvciB0byBzdGF0ZSB0aGF0IHRoZSBtZXRob2QgaXMgdW5jaGVja2VkIGZvcgotYXV0aG9yaXphdGlvbiwgYW5kIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMuCi0KLVRoZSBzZWN1cml0eSByb2xlcyB1c2VkIGluIHRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUKLW11c3QgYmUgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cyBvZiB0aGUKLWRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHRoZSBtZXRob2RzIG11c3QgYmUgbWV0aG9kcwotZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSwgY29tcG9uZW50IGFuZC9vciB3ZWIKLXNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmNoZWNrZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbXB0eVR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgdW5jaGVja2VkIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgYSBtZXRob2QgaXMKLSAgICAgICAgICAgIG5vdCBjaGVja2VkIGZvciBhdXRob3JpemF0aW9uIGJ5IHRoZSBjb250YWluZXIKLSAgICAgICAgICAgIHByaW9yIHRvIGludm9jYXRpb24gb2YgdGhlIG1ldGhvZC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbWV0aG9kVHlwZSBpcyB1c2VkIHRvIGRlbm90ZSBhIG1ldGhvZCBvZiBhbiBlbnRlcnByaXNlCi1iZWFuJ3MgaG9tZSwgY29tcG9uZW50LCBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQKLWludGVyZmFjZSwgb3IsIGluIHRoZSBjYXNlIG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbiwgdGhlCi1iZWFuJ3MgbWVzc2FnZSBsaXN0ZW5lciBtZXRob2QsIG9yIGEgc2V0IG9mIHN1Y2gKLW1ldGhvZHMuIFRoZSBlamItbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZQotZW50ZXJwcmlzZSBiZWFucyBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yOyB0aGUKLW9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgYWxsb3dzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYQotbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIHRoYXQgaXMgbXVsdGlwbHkgZGVmaW5lZAotYWNyb3NzIHRoZSBob21lLCBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludAotaW50ZXJmYWNlczsgdGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtZXRob2QKLW5hbWU7IGFuZCB0aGUgb3B0aW9uYWwgbWV0aG9kLXBhcmFtcyBlbGVtZW50cyBpZGVudGlmeSBhCi1zaW5nbGUgbWV0aG9kIGFtb25nIG11bHRpcGxlIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkCi1tZXRob2QgbmFtZS4KLQotVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0eWxlcyBvZiB1c2luZyBtZXRob2RUeXBlIGVsZW1lbnQKLXdpdGhpbiBhIG1ldGhvZCBlbGVtZW50OgotCi0xLgotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotPC9tZXRob2Q+Ci0KLSAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlCi0gICBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSwgY29tcG9uZW50LCBhbmQvb3Igd2ViCi0gICBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMuCi0KLTIuCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLTwvbWV0aG9kPj4KLQotICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mCi0gICB0aGUgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCi0gICBtZXRob2RzIHdpdGggdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGUgZWxlbWVudCBvZgotICAgdGhpcyBzdHlsZSByZWZlcnMgdG8gYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQKLSAgIG5hbWUuCi0KLTMuCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLSAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS0xPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+UEFSQU0tMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAuLi4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS1uPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLSAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEKLSAgIHNldCBvZiBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBuYW1lLiBQQVJBTS0xIHRocm91Z2gKLSAgIFBBUkFNLW4gYXJlIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlcyBvZiB0aGUKLSAgIG1ldGhvZCdzIGlucHV0IHBhcmFtZXRlcnMgKGlmIHRoZSBtZXRob2QgaGFzIG5vIGlucHV0Ci0gICBhcmd1bWVudHMsIHRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQgY29udGFpbnMgbm8KLSAgIG1ldGhvZC1wYXJhbSBlbGVtZW50cykuIEFycmF5cyBhcmUgc3BlY2lmaWVkIGJ5IHRoZQotICAgYXJyYXkgZWxlbWVudCdzIHR5cGUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBhaXIgb2YKLSAgIHNxdWFyZSBicmFja2V0cyAoZS5nLiBpbnRbXVtdKS4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCi0gICBtZXRob2RzIHdpdGggdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGlzIHN0eWxlIHJlZmVycwotICAgdG8gYWxsIG9mIHRoZSBvdmVybG9hZGVkIG1ldGhvZHMuCi0KLUV4YW1wbGVzOgotCi1TdHlsZSAxOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlCi1tZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUsIGNvbXBvbmVudCwKLWFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzOgotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4KLTwvbWV0aG9kPgotCi1TdHlsZSAyOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlCi1jcmVhdGUgbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lCi1pbnRlcmZhY2UocykuCi0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci08L21ldGhvZD4KLQotU3R5bGUgMzogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gdGhlCi1jcmVhdGUoU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIExhc3ROYW1lKSBtZXRob2Qgb2YgdGhlCi1FbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlKHMpLgotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBhIFN0eWxlIDMgZWxlbWVudCB3aXRoCi1tb3JlIGNvbXBsZXggcGFyYW1ldGVyIHR5cGVzLiBUaGUgbWV0aG9kCi1mb29iYXIoY2hhciBzLCBpbnQgaSwgaW50W10gaWFyLCBteXBhY2thZ2UuTXlDbGFzcyBteWNsLAotbXlwYWNrYWdlLk15Q2xhc3NbXVtdIG15Y2xhYXIpIHdvdWxkIGJlIHNwZWNpZmllZCBhczoKLQotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLW5hbWU+Zm9vYmFyPC9tZXRob2QtbmFtZT4KLSAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5jaGFyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+aW50PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+aW50W108L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzczwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzW11bXTwvbWV0aG9kLXBhcmFtPgotICAgIDwvbWV0aG9kLXBhcmFtcz4KLTwvbWV0aG9kPgotCi1UaGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aGVuIGl0IGJlY29tZXMKLW5lY2Vzc2FyeSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBtZXRob2QgdGhhdCBpcyBtdWx0aXBseQotZGVmaW5lZCBhY3Jvc3MgdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUsIGNvbXBvbmVudCwgYW5kL29yCi13ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQKLXNpZ25hdHVyZS4KLQotRm9yIGV4YW1wbGUsIHRoZSBtZXRob2QgZWxlbWVudAotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLWNhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykKLW1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlIGZyb20gdGhlCi1jcmVhdGUoU3RyaW5nLCBTdHJpbmcpIG1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaG9tZQotaW50ZXJmYWNlLCB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLWFuZCB0aGUgY3JlYXRlIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQgaW4gdGhlIGxvY2FsIGhvbWUKLWludGVyZmFjZSB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0gICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICA8L21ldGhvZC1wYXJhbXM+Ci08L21ldGhvZD4KLQotVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2l0aCBhbGwgdGggcmVlIFN0eWxlcwotb2YgdGhlIG1ldGhvZCBlbGVtZW50IHVzYWdlLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwotbWV0aG9kIGVsZW1lbnQgZXhhbXBsZSBjb3VsZCBiZSB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUKLW1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgcmVtb3RlIGhvbWUgaW50ZXJmYWNlLgotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci08L21ldGhvZD4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1pbnRmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXRob2QtaW50ZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1ldGhvZC1uYW1lVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWV0aG9kLXBhcmFtc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtdWx0aXBsaWNpdHlUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG11bHRpcGxpY2l0eVR5cGUgZGVzY3JpYmVzIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlCi1yb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb24uCi0KLVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotICAgIE9uZQotICAgIE1hbnkKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnkiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcGVyc2lzdGVuY2UtdHlwZVR5cGUgc3BlY2lmaWVzIGFuIGVudGl0eSBiZWFuJ3MgcGVyc2lzdGVuY2UKLW1hbmFnZW1lbnQgdHlwZS4KLQotVGhlIHBlcnNpc3RlbmNlLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotICAgIEJlYW4KLSAgICBDb250YWluZXIKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbiIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LW1ldGhvZFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcXVlcnktbWV0aG9kIHNwZWNpZmllcyB0aGUgbWV0aG9kIGZvciBhIGZpbmRlciBvciBzZWxlY3QKLXF1ZXJ5LgotCi1UaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBmaW5kZXIgb3Igc2VsZWN0Ci1tZXRob2QgaW4gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0KLUVhY2ggbWV0aG9kLXBhcmFtIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBxdWVyeS1tZXRob2QgdXNpbmcgdGhlCi1tZXRob2QtcGFyYW1zIGVsZW1lbnQuCi0KLUl0IGlzIHVzZWQgYnkgdGhlIHF1ZXJ5LW1ldGhvZCBlbGVtZW50LgotCi1FeGFtcGxlOgotCi08cXVlcnk+Ci0gICAgPGRlc2NyaXB0aW9uPk1ldGhvZCBmaW5kcyBsYXJnZSBvcmRlcnM8L2Rlc2NyaXB0aW9uPgotICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgIDxtZXRob2QtbmFtZT5maW5kTGFyZ2VPcmRlcnM8L21ldGhvZC1uYW1lPgotICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgPGVqYi1xbD5TRUxFQ1QgT0JKRUNUKG8pIEZST00gT3JkZXIgbyBXSEVSRSBvLmFtb3VudCAmZ3Q7IDEwMDA8L2VqYi1xbD4KLTwvcXVlcnk+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXRob2QtbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wYXJhbXMiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1ldGhvZC1wYXJhbXNUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5VHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBxdWVyeVR5cGUgZGVmaW5lcyBhIGZpbmRlciBvciBzZWxlY3QKLXF1ZXJ5LiBJdCBjb250YWlucwotICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHF1ZXJ5Ci0gICAgLSB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmluZGVyIG9yIHNlbGVjdAotICAgICAgbWV0aG9kIGl0IGlzIHVzZWQgYnkKLSAgICAgICAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSByZXN1bHQgdHlwZQotICAgICAgICAgIG1hcHBpbmcsIGlmIHRoZSBxdWVyeSBpcyBmb3IgYSBzZWxlY3QgbWV0aG9kCi0gICAgICAgICAgYW5kIGVudGl0eSBvYmplY3RzIGFyZSByZXR1cm5lZC4KLSAgICAgICAgLSB0aGUgRUpCIFFMIHF1ZXJ5IHN0cmluZyB0aGF0IGRlZmluZXMgdGhlIHF1ZXJ5LgotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgZGVwbG95bWVudCBleHRlbnNpb25zCi0KLVF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMIG11c3QgdXNlIHRoZSBlamItcWwKLWVsZW1lbnQgdG8gc3BlY2lmeSB0aGUgcXVlcnkuIElmIGEgcXVlcnkgaXMgbm90IGV4cHJlc3NpYmxlCi1pbiBFSkIgUUwsIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBiZSB1c2VkIHRvCi1kZXNjcmliZSB0aGUgc2VtYW50aWNzIG9mIHRoZSBxdWVyeSBhbmQgdGhlIGVqYi1xbCBlbGVtZW50Ci1zaG91bGQgYmUgZW1wdHkuCi0KLVRoZSByZXN1bHQtdHlwZS1tYXBwaW5nIGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIEl0IGNhbiBvbmx5Ci1iZSBwcmVzZW50IGlmIHRoZSBxdWVyeS1tZXRob2Qgc3BlY2lmaWVzIGEgc2VsZWN0IG1ldGhvZAotdGhhdCByZXR1cm5zIGVudGl0eSBvYmplY3RzLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZQotcmVzdWx0LXR5cGUtbWFwcGluZyBlbGVtZW50IGlzICJMb2NhbCIuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktbWV0aG9kIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpxdWVyeS1tZXRob2RUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXN1bHQtdHlwZS1tYXBwaW5nIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXN1bHQtdHlwZS1tYXBwaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXFsIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUgZGVzaWduYXRlcyB0aGUgc291cmNlIG9mIGEKLXJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIEEKLXJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUgaXMgdXNlZCBieQotcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnRzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuCi1lbnRpdHkgYmVhbi4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwc1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcmVsYXRpb25zaGlwc1R5cGUgZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXBzIGluCi13aGljaCBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZQotcGFydGljaXBhdGUuIFRoZSByZWxhdGlvbnNoaXBzVHlwZSBjb250YWlucyBhbiBvcHRpb25hbAotZGVzY3JpcHRpb247IGFuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaAotc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1yZWxhdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0icm9sZS1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICByZWxhdGlvbnNoaXAgcm9sZS4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0gICAgICAgIGEgcmVsYXRpb25zaGlwLCBidXQgY2FuIGJlIHJldXNlZCBpbiBkaWZmZXJlbnQKLSAgICAgICAgcmVsYXRpb25zaGlwcy4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvcgotICAgICAgICAgICAgICAgIHhwYXRoPSIuLy9qMmVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkCi0gICAgICAgICAgICAgICAgeHBhdGg9Ii4iLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVwbG95bWVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIGlzIHVzZWQgaW4gdGhlIHF1ZXJ5IGVsZW1lbnQgdG8KLXNwZWNpZnkgd2hldGhlciBhbiBhYnN0cmFjdCBzY2hlbWEgdHlwZSByZXR1cm5lZCBieSBhIHF1ZXJ5Ci1mb3IgYSBzZWxlY3QgbWV0aG9kIGlzIHRvIGJlIG1hcHBlZCB0byBhbiBFSkJMb2NhbE9iamVjdCBvcgotRUpCT2JqZWN0IHR5cGUuCi0KLVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgTG9jYWwKLSAgICBSZW1vdGUKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWwiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3RlIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1pZGVudGl0eVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgc2VjdXJpdHktaWRlbnRpdHlUeXBlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncwotc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLW1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgYmVhbiBvciB3aGV0aGVyIGEgc3BlY2lmaWMgcnVuLWFzCi1pZGVudGl0eSBpcyB0byBiZSB1c2VkLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZS1jYWxsZXItaWRlbnRpdHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbXB0eVR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgdXNlLWNhbGxlci1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB0aGF0Ci0gICAgICAgICAgICB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgYmUgdXNlZCBhcyB0aGUKLSAgICAgICAgICAgIHNlY3VyaXR5IGlkZW50aXR5IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZQotICAgICAgICAgICAgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kcy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJ1bi1hcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJ1bi1hc1R5cGUiLz4KLSAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtcmVmVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRISVMgSVMgQSBQTEFDRUhPTERFUiBUWVBFIHdoaWNoIHdpbGwKLWJlIFJFUExBQ0VELiBJdCB3aWxsIGJlIGRlZmluZWQgYmFzZWQgb24KLWRlZmluaXRpb24gdG8gYmUgc3VwcGxpZWQgYnkgSlNSMTA5LgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWJlYW5UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlc3Npb24tYmVhblR5cGUgZGVjbGFyZXMgYW4gc2Vzc2lvbiBiZWFuLiBUaGUKLWRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0gICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0gICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0gICAgICBpY29uIGZpbGUgbmFtZQotICAgIC0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4KLSAgICAgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0aW9uCi0gICAgLSB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSBob21lIGFuZAotICAgICAgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueQotICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBsb2NhbCBob21lIGFuZAotICAgICAgbG9jYWwgaW50ZXJmYWNlcywgaWYgYW55Ci0gICAgLSB0aGUgbmFtZSBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3Mgd2ViIHNlcnZpY2UgZW5kcG9pbnQKLSAgICAgIGludGVyZmFjZSwgaWYgYW55Ci0gICAgLSB0aGUgc2Vzc2lvbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyBzdGF0ZSBtYW5hZ2VtZW50IHR5cGUKLSAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLSAgICAgIGVudmlyb25tZW50IGVudHJpZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMKLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwKLSAgICAgIEVKQiByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYgotICAgICAgc2VydmljZSByZWZlcmVuY2VzCi0gICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZQotICAgICAgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5Ci0gICAgICB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotICAgICAgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZQotICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gZGVwbG95bWVudCBleHRlbnNpb25zCi0KLVRoZSBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgIm9wdGlvbmFsIiBpbiB0aGUgc2Vuc2UKLXRoYXQgdGhleSBhcmUgb21pdHRlZCB3aGVuIGlmIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlCi1lbXB0eS4KLQotRWl0aGVyIGJvdGggdGhlIGxvY2FsLWhvbWUgYW5kIHRoZSBsb2NhbCBlbGVtZW50cyBvciBib3RoCi10aGUgaG9tZSBhbmQgdGhlIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlCi1zZXNzaW9uIGJlYW4uCi0KLVRoZSBzZXJ2aWNlLWVuZHBvaW50IGVsZW1lbnQgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGlmIHRoZQotYmVhbiBpcyBhIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4uCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmljb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhvbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmhvbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlbW90ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsLWhvbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmxvY2FsLWhvbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bG9jYWxUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHNlcnZpY2UtZW5kcG9pbnQgZWxlbWVudCBjb250YWlucyB0aGUKLSAgICAgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIHdlYgotICAgICAgICBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4gVGhlIHNlcnZpY2UtZW5kcG9pbnQKLSAgICAgICAgZWxlbWVudCBtYXkgb25seSBiZSBzcGVjaWZpZWQgZm9yIGEgc3RhdGVsZXNzCi0gICAgICAgIHNlc3Npb24gYmVhbi4gVGhlIHNwZWNpZmllZCBpbnRlcmZhY2UgbXVzdCBiZSBhCi0gICAgICAgIHZhbGlkIEpBWC1SUEMgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLWNsYXNzVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZXNzaW9uLXR5cGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp0cmFuc2FjdGlvbi10eXBlVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbnYtZW50cnlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1sb2NhbC1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1sb2NhbC1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZXJ2aWNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGUtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VjdXJpdHktaWRlbnRpdHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cmVzb3VyY2UtZW52LXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InNlc3Npb24tdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgc2Vzc2lvbi10eXBlVHlwZSBkZXNjcmliZXMgd2hldGhlciB0aGUgc2Vzc2lvbiBiZWFuIGlzIGEKLXN0YXRlZnVsIHNlc3Npb24gb3Igc3RhdGVsZXNzIHNlc3Npb24uIEl0IGlzIHVzZWQgYnkKLXNlc3Npb24tdHlwZSBlbGVtZW50cy4KLQotVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0gICAgU3RhdGVmdWwKLSAgICBTdGF0ZWxlc3MKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVmdWwiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVsZXNzIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRyYW5zLWF0dHJpYnV0ZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgdHJhbnMtYXR0cmlidXRlVHlwZSBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdAotbWFuYWdlIHRoZSB0cmFuc2FjdGlvbiBib3VuZGFyaWVzIHdoZW4gZGVsZWdhdGluZyBhIG1ldGhvZAotaW52b2NhdGlvbiB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcyBtZXRob2QuCi0KLVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgTm90U3VwcG9ydGVkCi0gICAgU3VwcG9ydHMKLSAgICBSZXF1aXJlZAotICAgIFJlcXVpcmVzTmV3Ci0gICAgTWFuZGF0b3J5Ci0gICAgTmV2ZXIKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90U3VwcG9ydGVkIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBvcnRzIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVkIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVzTmV3Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmRhdG9yeSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXZlciIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSB0cmFuc2FjdGlvbi10eXBlVHlwZSBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLXRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZS4KLQotVGhlIHRyYW5zYWN0aW9uLXR5cGUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLSAgICBCZWFuCi0gICAgQ29udGFpbmVyCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlYW4iLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEveGtpdC9zY2hlbWFzL2oyZWUvZXhwb3J0ZWRfYnVpbGQueG1sIGIvdjEveGtpdC9zY2hlbWFzL2oyZWUvZXhwb3J0ZWRfYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjdhMzhjLi4wMDAwMDAwCi0tLSBhL3YxL3hraXQvc2NoZW1hcy9qMmVlL2V4cG9ydGVkX2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPHByb2plY3QgbmFtZT0iU2NoZW1hIHByb2plY3QgYnVpbGQiIGRlZmF1bHQ9ImJ1aWxkIj4KLSAgICAKLSAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlc3lzdGVtbmFtZSIgdmFsdWU9IlNjaGVtYSIgLz4KLSAgPHByb3BlcnR5IG5hbWU9ImNsYXNzLnBhdGgiIHZhbHVlPSJDOi9wZXJmb3JjZS92Mi9iZWEvamRrMTQxXzAyL2pyZS9saWIvcnQuamFyO0M6L3BlcmZvcmNlL3YyL2JlYS9qZGsxNDFfMDIvbGliL3Rvb2xzLmphcjtDOi9wZXJmb3JjZS92Mi9iZWEvd2VibG9naWM4MWIvc2VydmVyL2xpYi9rbmV4LmphcjtDOi9wZXJmb3JjZS92Mi9iZWEvd2VibG9naWM4MWIvY29tbW9uL2xpYi9sb2c0ai5qYXI7QzovcGVyZm9yY2UvdjIvYmVhL3dlYmxvZ2ljODFiL3NlcnZlci9saWIvZGVidWdnaW5nLmphcjtDOi9wZXJmb3JjZS92Mi9iZWEvd2VibG9naWM4MWIvc2VydmVyL2xpYi9qYXZlbGluLmphcjtDOi9wZXJmb3JjZS92Mi9iZWEvd2VibG9naWM4MWIvc2VydmVyL2xpYi93bHctbGFuZy5qYXI7QzovcGVyZm9yY2UvdjIvYmVhL3dlYmxvZ2ljODFiL3NlcnZlci9saWIvd2VibG9naWMuamFyO0M6L3BlcmZvcmNlL3YyL2JlYS93ZWJsb2dpYzgxYi9jb21tb24vZXZhbC9wb2ludGJhc2UvbGliL3Bic2VydmVyNDQuamFyO0M6L3BlcmZvcmNlL3YyL2JlYS93ZWJsb2dpYzgxYi9jb21tb24vZXZhbC9wb2ludGJhc2UvbGliL3BiY2xpZW50NDQuamFyO0M6L3BlcmZvcmNlL3YyL2JlYS93ZWJsb2dpYzgxYi9zZXJ2ZXIvbGliL3dlYnNlcnZpY2VzLmphcjtDOi9wZXJmb3JjZS92Mi9iZWEvd2VibG9naWM4MWIvc2VydmVyL2xpYi93ZWJzZXJ2aWNlY2xpZW50LmphcjtDOi9wZXJmb3JjZS92Mi9iZWEvd2VibG9naWM4MWIvc2VydmVyL2xpYi93ZWJzZXJ2aWNlY2xpZW50K3NzbC5qYXI7QzovcGVyZm9yY2UvdjIvYmVhL3dlYmxvZ2ljODFiL3NlcnZlci9saWIvd2xpLmphcjtDOi9wZXJmb3JjZS92Mi9iZWEvd2VibG9naWM4MWIvc2VydmVyL2xpYi94YmVhbi5qYXI7QzovcGVyZm9yY2UvdjIvYmVhL3dlYmxvZ2ljODFiL3NlcnZlci9saWIvd2x4YmVhbi5qYXI7QzovcGVyZm9yY2UvdjIvYmVhL3dlYmxvZ2ljODFiL3NlcnZlci9saWIveHFybC5qYXI7QzovcGVyZm9yY2UvdjIvYmVhL3dlYmxvZ2ljODFiL3NlcnZlci9saWIvd2x4dHJ0LmphcjtDOi9wZXJmb3JjZS92Mi9iZWEvd2VibG9naWM4MWIvc2VydmVyL2xpYi9uZXR1aS9uZXR1aS1jb21waWxlci5qYXI7QzovcGVyZm9yY2UvdjIvYmVhL3dlYmxvZ2ljODFiL2ludGVncmF0aW9uL2xpYi93bGFpLXNlcnZlci5qYXI7QzovRG9jdW1lbnRzIGFuZCBTZXR0aW5ncy9tYmlzaG9wL015IERvY3VtZW50cy90ZXN0L0FQUC1JTkYvbGliL0NvbnRyb2wuamFyO0M6L0RvY3VtZW50cyBhbmQgU2V0dGluZ3MvbWJpc2hvcC9NeSBEb2N1bWVudHMvdGVzdC9BUFAtSU5GL2xpYi9KYXZhU3R1ZmYuamFyO0M6L0RvY3VtZW50cyBhbmQgU2V0dGluZ3MvbWJpc2hvcC9NeSBEb2N1bWVudHMvdGVzdC9BUFAtSU5GL2xpYi9NYWMuamFyO0M6L0RvY3VtZW50cyBhbmQgU2V0dGluZ3MvbWJpc2hvcC9NeSBEb2N1bWVudHMvdGVzdC9BUFAtSU5GL2xpYi9TY2hlbWEuamFyO0M6L0RvY3VtZW50cyBhbmQgU2V0dGluZ3MvbWJpc2hvcC9NeSBEb2N1bWVudHMvdGVzdC9BUFAtSU5GL2xpYi9TaW1wQ29udHJvbFR3by5qYXIiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMucGF0aCIgdmFsdWU9IkM6L0RvY3VtZW50cyBhbmQgU2V0dGluZ3MvbWJpc2hvcC9NeSBEb2N1bWVudHMvdGVzdC9TY2hlbWEvIiAvPgotICA8cHJvcGVydHkgbmFtZT0iamFyLnBhdGgiIHZhbHVlPSJDOi9Eb2N1bWVudHMgYW5kIFNldHRpbmdzL21iaXNob3AvTG9jYWwgU2V0dGluZ3MvVGVtcC93bHdfY29tcGlsZTIzMjE3IiAvPgotICA8cHJvcGVydHkgbmFtZT0iamFybmFtZSIgdmFsdWU9IlNjaGVtYS5qYXIiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LnBhdGgiIHZhbHVlPSJDOi9Eb2N1bWVudHMgYW5kIFNldHRpbmdzL21iaXNob3AvTXkgRG9jdW1lbnRzL3Rlc3QvQVBQLUlORi9saWIvIiAvPgotICA8cHJvcGVydHkgbmFtZT0id2xob21lLnBhdGgiIHZhbHVlPSJDOi9wZXJmb3JjZS92Mi9iZWEvd2VibG9naWM4MWIvIiAvPgotICAKLSAgPHBhdGggaWQ9InRhc2suY2xhc3NwYXRoIj4KLSAgICA8ZmlsZXNldCBkaXI9IiR7d2xob21lLnBhdGh9Ij4KLSAgICAgIDxpbmNsdWRlIG5hbWU9InNlcnZlci9saWIveGJlYW4uamFyIiAvPgotICAgICAgPGluY2x1ZGUgbmFtZT0ic2VydmVyL2xpYi93ZWJsb2dpYy5qYXIiLz4KLSAgICA8L2ZpbGVzZXQ+Ci0gIDwvcGF0aD4KLSAgCi0gIDx0YXNrZGVmIG5hbWU9InhtbGJlYW4iIGNsYXNzbmFtZT0ieG1sLmFwYWNoZS5vcmcudG9vbC5YTUxCZWFuIiBjbGFzc3BhdGhyZWY9InRhc2suY2xhc3NwYXRoIi8+Ci0gIAotICA8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXNjcmlwdGlvbj0iQnVpbGQgdGhlIFNjaGVtYXMgcHJvamVjdCBhbmQgY29weSBpdCB0byBMaWJyYXJpZXMiPgotICAJCi0gICAgPG1rZGlyIGRpcj0iJHtqYXIucGF0aH0iIC8+Ci0gICAgPHhtbGJlYW4KLSAgICAgIGRlc3RmaWxlPSIke2phci5wYXRofS8ke2phcm5hbWV9IgotICAgICAgc2NoZW1hPSIke3NyYy5wYXRofSIKLSAgICAgIHR5cGVzeXN0ZW1uYW1lPSIke3R5cGVzeXN0ZW1uYW1lfSIKLSAgICAgIGNsYXNzcGF0aD0iJHtjbGFzcy5wYXRofSIKLSAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIiAvPgotICAgICAgPCEtLSBXaXRoIGZhaWxvbmVycm9yPXRydWUsIGFuIHRoZSB0YXJnZXQgc2hvdWxkIGFib3J0IGJlZm9yZQotICAgICAgICAgICBoZXJlIGlmIHRoZXJlJ3MgYW4gZXJyb3IuCi0gICAgICAgICAgIFRoZXJlZm9yZSBpZiB0aGVyZSdzIG5vIGphciwgdGhlbiBpdCBtdXN0IG1lYW4gdGhhdCB0aGVyZQotICAgICAgICAgICB3ZXJlIG5vIHNvdXJjZSBmaWxlcyB0byBjb21waWxlLCBzbyBkZWxldGUgdGhlIGphciBpbiBsaWJyYXJpZXMuIC0tPgotICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImlzLWphciIgZmlsZT0iJHtqYXIucGF0aH0vJHtqYXJuYW1lfSIvPgotICAgIDxhbnRjYWxsIHRhcmdldD0ibW92ZS1qYXIiLz4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9ImNoZWNrLWNsZWFudXAtamFyIi8+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPHRhcmdldCBuYW1lPSJtb3ZlLWphciIgaWY9ImlzLWphciI+Ci0gICAgPG1vdmUgdG9kaXI9IiR7bGlicmFyeS5wYXRofSIgZmlsZT0iJHtqYXIucGF0aH0vJHtqYXJuYW1lfSIgZmFpbG9uZXJyb3I9ImZhbHNlIiAvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImNoZWNrLWNsZWFudXAtamFyIiB1bmxlc3M9ImlzLWphciI+Ci0gICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNsZWFuIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotICAgICAgPGRlbGV0ZSBmaWxlPSIke2xpYnJhcnkucGF0aH0vJHtqYXJuYW1lfSIgZmFpbG9uZXJyb3I9ImZhbHNlIi8+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS94a2l0L3NjaGVtYXMvajJlZS9qMmVlXzFfNC54c2QgYi92MS94a2l0L3NjaGVtYXMvajJlZS9qMmVlXzFfNC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MTQyNzIuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9zY2hlbWFzL2oyZWUvajJlZV8xXzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLUdlbmVyYXRlZCBieSBVbWl0IFlhbGNpbmFscCBNYXJjaCAyMDAyLS0+Ci08eHNkOnNjaGVtYQotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjEuNCI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci1AKCMpajJlZV8xXzQueHNkcwkxLjIwIDAyLzA3LzEyCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1Db3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLVJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLXJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1yZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLVUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci1tYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLWNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHRoYXQgYXBwZWFyIGluIHRoZSBjb21tb24KLXNoYXJlYWJsZSBzY2hlbWEocykgb2YgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIHNob3VsZCBiZQotaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb250ZXh0IHRoZXkgYXJlIGluY2x1ZGVkOgotCi1EZXBsb3ltZW50IENvbXBvbmVudCBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgajJlZSBhcHBsaWNhdGlvbjsKLSAgICBhcHBsaWNhdGlvbiBjbGllbnQ7Ci0gICAgd2ViIGFwcGxpY2F0aW9uOwotICAgIGVudGVycHJpc2UgYmVhbjsKLSAgICByZXNvdXJjZSBhZGFwdGVyOwotCi1EZXBsb3ltZW50IEZpbGUgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgIGVhciBmaWxlOwotICAgIHdhciBmaWxlOwotICAgIGphciBmaWxlOwotICAgIHJhciBmaWxlOwotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlcGxveW1lbnQtZXh0ZW5zaW9uVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBkZXBsb3ltZW50LWV4dGVuc2lvblR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZQotZXh0ZW5zaW9ucyB0byB0aGUgc3BlY2lmaWMgRGVwbG95bWVudCBDb21wb25lbnQuCi0KLUl0IGlzIHVzZWQgYnkgZGVwbG95bWVudC1leHRlbnNpb24gZWxlbWVudHMgdG8gZGVzaWduYXRlIGFuCi1leHRlbnNpb24gYmxvY2sgdGhhdCBpcyB0YXJnZXRlZCB0byBhIHNwZWNpZmljIGV4dGVuc2lvbgotZGVzaWduYXRlZCBieSBhIHNldCBvZiBleHRlbnNpb24gZWxlbWVudHMgdGhhdCBhcmUgZGVjbGFyZWQKLWJ5IGEgbmFtZXNwYWNlLiBUaGUgbmFtZXNwYWNlIGlkZW50aWZpZXMgdGhlIGV4dGVuc2lvbiB0bwotdGhlIGRlcGxveW1lbnQgdG9vbCB0aGF0IHByb2Nlc3NlcyB0aGUgZXh0ZW5zaW9uLgotCi1UaGUgbXVzdFVuZGVyc3RhbmQgYXR0cmlidXRlIGlzIHByb3ZpZGVkIGJ5IHRoZSBBcHBsaWNhdGlvbgotQXNzZW1ibGVyIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGV4dGVuc2lvbiBkZXNjcmliZWQgaXMgYW4KLWVzc2VudGlhbCBleHRlbnNpb24gdGhhdCBtdXN0IGV4aXN0IGluIHRoZSBjb250YWluZXIuIElmCi1tdXN0VW5kZXJzdGFuZCBpcyAidHJ1ZSIsIHRoZSBkZXBsb3ltZW50IHRvb2wgbXVzdCBpbmRpY2F0ZQotYW4gZXJyb3Igd2hlbiBwcm9jZXNzaW5nIGEgZGVwbG95bWVudC1leHRlbnNpb24gZWxlbWVudCB3aXRoCi1hIG5hbWVzcGFjZSBpdCBkb2VzIG5vdCB1bmRlcnN0YW5kLiAgRXh0ZW5zaW9ucyB0aGF0IGFyZSBub3QKLWVzc2VudGlhbCBhcmUgZGVjbGFyZWQgYnkgZGVmYXVsdCBhcyBvcHRpb25hbCBleHRlbnNpb25zCi10aGF0IG5lZWQgbm90IGJlIHByb3ZpZGVkIGJ5IGEgY29udGFpbmVyLiAgQXBwbGljYXRpb25zIHRoYXQKLXVzZSBzdWNoIGV4dGVuc2lvbnMgYXJlIHBvcnRhYmxlIHRvIG90aGVyIGNvbnRhaW5lcnMgYmVjYXVzZQotZGVwbG95bWVudCB0b29scyB3aWxsIGlnbm9yZSBleHRlbnNpb25zIHRoYXQgdGhleSBkb24ndAotc3VwcG9ydC4KLQotVGhlIHR5cGUgb2YgdGhlIGV4dGVuc2lvbi1lbGVtZW50IGlzIGFic3RyYWN0LiBUaGVyZWZvcmUsIGEKLWNvbmNyZXRlIHR5cGUgbXVzdCBiZSBzcGVjaWZpZWQgYnkgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotdXNpbmcgeHNpOnR5cGUgYXR0cmlidXRlIGZvciBlYWNoIGV4dGVuc2lvbi1lbGVtZW50LgotCi1UaGUgdmFsdWUgb2YgdGhlIG11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZSBpcyAiZmFsc2UiCi1ieSBkZWZhdWx0LgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVuc2lvbi1lbGVtZW50IgotICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmV4dGVuc2libGVUeXBlIgotICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIgotICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmFueVVSSSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11c3RVbmRlcnN0YW5kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIi8+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVzY3JpcHRpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGRlc2NyaXB0aW9uIHR5cGUgaXMgdXNlZCBieSBhIGRlc2NyaXB0aW9uIGVsZW1lbnQgdG8KLXByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBlbGVtZW50cwotdGhhdCB1c2UgdGhpcyB0eXBlIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZQotRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUgZmlsZSBwcm9kdWNlciB3YW50cwotdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLURlcGxveW1lbnQgRmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUKLXRvb2xzIHVzZWQgYnkgc3VjaCBhIERlcGxveW1lbnQgRmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkKLXRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQKLWNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4KLQotVGhlIGxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlCi1kZXNjcmlwdGlvbiBpcyBwcm92aWRlZCBpbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgImVuIiAoRW5nbGlzaCkuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRld2V5LXZlcnNpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhpcyB0eXBlIGRlZmluZXMgYSBkZXdleSBkZWNpbWFsIHdoaWNoIGlzIHVzZWQKLXRvIGRlc2NyaWJlIHZlcnNpb25zIG9mIGRvY3VtZW50cy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KLSAgICAgICAgPHhzZDp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzcGxheS1uYW1lVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBkaXNwbGF5LW5hbWUgdHlwZSBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZAotdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzLiBJdCBpcyB1c2VkIGJ5IGRpc3BsYXktbmFtZQotZWxlbWVudHMuICBUaGUgZGlzcGxheSBuYW1lIG5lZWQgbm90IGJlIHVuaXF1ZS4KLQotRXhhbXBsZToKLQotLi4uCi0gICA8ZGlzcGxheS1uYW1lIHhtbDpsYW5nPSJlbiI+RW1wbG95ZWUgU2VsZiBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+Ci0KLVRoZSB2YWx1ZSBvZiB0aGUgeG1sOmxhbmcgYXR0cmlidXRlIGlzICJlbiIgKEVuZ2xpc2gpIGJ5IGRlZmF1bHQuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlamItbGlua1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWpiLWxpbmtUeXBlIGlzIHVzZWQgYnkgZWpiLWxpbmsKLWVsZW1lbnRzIGluIHRoZSBlamItcmVmIG9yIGVqYi1sb2NhbC1yZWYgZWxlbWVudHMgdG8gc3BlY2lmeQotdGhhdCBhbiBFSkIgcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBlbnRlcnByaXNlIGJlYW4uCi0KLVRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbgotZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBzYW1lIGVqYi1qYXIgZmlsZSBvciBpbiBhbm90aGVyIGVqYi1qYXIKLWZpbGUgaW4gdGhlIHNhbWUgSjJFRSBhcHBsaWNhdGlvbiB1bml0LgotCi1BbHRlcm5hdGl2ZWx5LCB0aGUgbmFtZSBpbiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtYXkgYmUgY29tcG9zZWQgb2YgYQotcGF0aCBuYW1lIHNwZWNpZnlpbmcgdGhlIGVqYi1qYXIgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlCi1iZWFuIHdpdGggdGhlIGVqYi1uYW1lIG9mIHRoZSB0YXJnZXQgYmVhbiBhcHBlbmRlZCBhbmQgc2VwYXJhdGVkIGZyb20KLXRoZSBwYXRoIG5hbWUgYnkgIiMiLiAgVGhlIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgRGVwbG95bWVudCBGaWxlCi1jb250YWluaW5nIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQgaXMgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbi4KLVRoaXMgYWxsb3dzIG11bHRpcGxlIGVudGVycHJpc2UgYmVhbnMgd2l0aCB0aGUgc2FtZSBlamItbmFtZSB0byBiZQotdW5pcXVlbHkgaWRlbnRpZmllZC4KLQotRXhhbXBsZXM6Ci0KLSAgICA8ZWpiLWxpbms+RW1wbG95ZWVSZWNvcmQ8L2VqYi1saW5rPgotCi0gICAgPGVqYi1saW5rPi4uL3Byb2R1Y3RzL3Byb2R1Y3QuamFyI1Byb2R1Y3RFSkI8L2VqYi1saW5rPgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1sb2NhbC1yZWZUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVqYi1sb2NhbC1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLWxvY2FsLXJlZiBlbGVtZW50cyBmb3IKLXRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbAotaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0gICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgIC0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSBEZXBsb3ltZW50Ci0gICAgICBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4KLSAgICAtIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICAgIC0gdGhlIGV4cGVjdGVkIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZXMgb2YgdGhlCi0gICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUKLSAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVmLW5hbWVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1yZWYtdHlwZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsLWhvbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmxvY2FsLWhvbWVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bG9jYWxUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbGluayIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLWxpbmtUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlamItcmVmLW5hbWVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLURlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotRGVwbG95bWVudCBDb21wb25lbnQuCi0KLUl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotRXhhbXBsZToKLQotPGVqYi1yZWYtbmFtZT5lamIvUGF5cm9sbDwvZWpiLXJlZi1uYW1lPgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpqbmRpLW5hbWVUeXBlIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVqYi1yZWYtdHlwZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWpiLXJlZi10eXBlVHlwZSBjb250YWlucyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUKLXJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLgotCi1UaGUgZWpiLXJlZi10eXBlIGRlc2lnbmF0ZXMgYSB2YWx1ZQotdGhhdCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgRW50aXR5Ci0gICAgU2Vzc2lvbgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRpdHkiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vzc2lvbiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlZlR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZWpiLXJlZlR5cGUgaXMgdXNlZCBieSBlamItcmVmIGVsZW1lbnRzIGZvciB0aGUKLWRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGhvbWUuIFRoZQotZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gICAgLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YKLSAgICAgIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UKLSAgICAgIGJlYW4KLSAgICAtIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICAgIC0gdGhlIGV4cGVjdGVkIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzIG9mIHRoZSByZWZlcmVuY2VkCi0gICAgICBlbnRlcnByaXNlIGJlYW4KLSAgICAtIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlCi0gICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZWpiLXJlZi1uYW1lVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItcmVmLXR5cGVUeXBlIi8+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhvbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmhvbWVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlbW90ZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1saW5rIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplamItbGlua1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGlzIHR5cGUgaXMgdXNlZCB0byBkZXNpZ25hdGUgYW4gZW1wdHkKLWVsZW1lbnQgd2hlbiB1c2VkLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mIHRoZQotZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUKLWFwcGxpY2F0aW9uJ3MgY29kZS4KLQotVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlOgotCi0gICAgamF2YS5sYW5nLkJvb2xlYW4KLSAgICBqYXZhLmxhbmcuQnl0ZQotICAgIGphdmEubGFuZy5DaGFyYWN0ZXIKLSAgICBqYXZhLmxhbmcuU3RyaW5nCi0gICAgamF2YS5sYW5nLlNob3J0Ci0gICAgamF2YS5sYW5nLkludGVnZXIKLSAgICBqYXZhLmxhbmcuTG9uZwotICAgIGphdmEubGFuZy5GbG9hdAotICAgIGphdmEubGFuZy5Eb3VibGUKLQotRXhhbXBsZToKLQotPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkJvb2xlYW4iLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkJ5dGUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkNoYXJhY3RlciIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5TaG9ydCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuSW50ZWdlciIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuTG9uZyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuRmxvYXQiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkRvdWJsZSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW52LWVudHJ5VHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBlbnYtZW50cnlUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhbiBhcHBsaWNhdGlvbidzCi1lbnZpcm9ubWVudCBlbnRyeS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhbmQgYW4KLW9wdGlvbmFsIHZhbHVlLiAgSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLCBvbmUgbXVzdCBiZQotc3VwcGxpZWQgZHVyaW5nIGRlcGxveW1lbnQuCi0KLUl0IGlzIHVzZWQgYnkgZW52LWVudHJ5IGVsZW1lbnRzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpqbmRpLW5hbWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUKLSAgICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKLSAgICAgICAgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhCi0gICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50LiBUaGUgdW5pcXVlbmVzcwotICAgICAgICBjb25zdHJhaW50cyBtdXN0IGJlIGRlZmluZWQgd2l0aGluIHRoZSBkZWNsYXJlZAotICAgICAgICBjb250ZXh0LgotCi0gICAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm1pbkFtb3VudDwvZW52LWVudHJ5LW5hbWU+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5LXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGUiLz4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5LXZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbnYtZW50cnktdmFsdWUgZGVzaWduYXRlcyB0aGUgdmFsdWUgb2YgYQotICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiBUaGUgdmFsdWUKLSAgICAgICAgbXVzdCBiZSBhIFN0cmluZyB0aGF0IGlzIHZhbGlkIGZvciB0aGUKLSAgICAgICAgY29uc3RydWN0b3Igb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRoYXQgdGFrZXMgYQotICAgICAgICBzaW5nbGUgU3RyaW5nIHBhcmFtZXRlciwgb3IgZm9yIGphdmEubGFuZy5DaGFyYWN0ZXIsCi0gICAgICAgIGEgc2luZ2xlIGNoYXJhY3Rlci4KLQotICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+MTAwLjAwPC9lbnYtZW50cnktdmFsdWU+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJleHRlbnNpYmxlVHlwZSIgYWJzdHJhY3Q9InRydWUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZXh0ZW5zaWJsZVR5cGUgaXMgYW4gYWJzdHJhY3QgYmFzZSB0eXBlIHdoaWNoIGlzIHVzZWQgdG8KLWRlZmluZSB0aGUgdHlwZSBvZiBleHRlbnNpb24tZWxlbWVudHMuIEluc3RhbmNlIGRvY3VtZW50cwotbXVzdCBzdWJzdGl0dXRlIGEga25vd24gdHlwZSB0byBkZWZpbmUgdGhlIGV4dGVuc2lvbiBieQotdXNpbmcgeHNpOnR5cGUgYXR0cmlidXRlIHRvIGRlZmluZSB0aGUgYWN0dWFsIHR5cGUgb2YKLWV4dGVuc2lvbi1lbGVtZW50cy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBlbGVtZW50cyB0aGF0IHVzZSB0aGlzIHR5cGUgZGVzaWduYXRlIHRoZSBuYW1lIG9mIGEKLUphdmEgY2xhc3Mgb3IgaW50ZXJmYWNlLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iZ2VuZXJpYy1ib29sZWFuVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgdHlwZSBkZWZpbmVzIGZvdXIgZGlmZmVyZW50IHZhbHVlcyB3aGljaCBjYW4gZGVzaWduYXRlCi1ib29sZWFuIHZhbHVlcy4gVGhpcyBpbmNsdWRlcyB2YWx1ZXMgeWVzIGFuZCBubyB3aGljaCBhcmUKLW5vdCBkZXNpZ25hdGVkIGJ5IHhzZDpib29sZWFuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRydWUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ieWVzIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImhvbWVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGhvbWVUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mCi1hbiBlbnRlcnByaXNlIGJlYW4ncyBob21lIGludGVyZmFjZS4KLQotRXhhbXBsZToKLQotICAgIDxob21lPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxIb21lPC9ob21lPgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpY29uVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBpY29uIHR5cGUgY29udGFpbnMgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50cwotdGhhdCBzcGVjaWZ5IHRoZSBmaWxlIG5hbWVzIGZvciBzbWFsbCBhbmQgbGFyZ2UgR0lGIG9yCi1KUEVHIGljb24gaW1hZ2VzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhCi1HVUkgdG9vbC4KLQotVGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsYW5ndWFnZSB0aGF0IHRoZQotaWNvbiBmaWxlIG5hbWVzIGFyZSBwcm92aWRlZCBpbi4gSXRzIHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpCi1ieSBkZWZhdWx0LgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzbWFsbC1pY29uIiB0eXBlPSJqMmVlOnBhdGhUeXBlIgotICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICBUaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotICAgICAgICBjb250YWluaW5nIGEgc21hbGwgKDE2IHggMTYpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi0gICAgICAgIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgRGVwbG95bWVudAotICAgICAgICBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUuCi0KLSAgICAgICAgVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLSAgICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLSAgICAgICAgRXhhbXBsZToKLQotICAgICAgICA8c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsYXJnZS1pY29uIiB0eXBlPSJqMmVlOnBhdGhUeXBlIgotICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi0gICAgICAgIGNvbnRhaW5pbmcgYSBsYXJnZQotICAgICAgICAoMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlCi0gICAgICAgIHBhdGggd2l0aGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzIERlcGxveW1lbnQKLSAgICAgICAgRmlsZS4KLQotICAgICAgICBUaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotICAgICAgICBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgIDxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iamF2YS1pZGVudGlmaWVyVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBqYXZhLWlkZW50aWZpZXJUeXBlIGRlZmluZXMgYSBKYXZhIGlkZW50aWZpZXIuCi1UaGUgdXNlcnMgb2YgdGhpcyB0eXBlIHNob3VsZCBmdXJ0aGVyIHZlcmlmeSB0aGF0Ci10aGUgY29udGVudCBkb2VzIG5vdCBjb250YWluIEphdmEgcmVzZXJ2ZWQga2V5d29yZHMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iKCR8X3xccHtMfSkoXHB7TH18XHB7TmR9fF98JCkqIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpuZGktbmFtZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgam5kaS1uYW1lVHlwZSB0eXBlIGRlc2lnbmF0ZXMgYSBKTkRJIG5hbWUgaW4gdGhlCi1EZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLWphdmE6Y29tcC9lbnYgY29udGV4dC4gIEEgSk5ESSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLURlcGxveW1lbnQgQ29tcG9uZW50LgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9jYWwtaG9tZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbG9jYWwtaG9tZVR5cGUgZGVmaW5lcyB0aGUgZnVsbHktcXVhbGlmaWVkCi1uYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbidzIGxvY2FsIGhvbWUgaW50ZXJmYWNlLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2FsVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBsb2NhbFR5cGUgZGVmaW5lcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYW4KLWVudGVycHJpc2UgYmVhbidzIGxvY2FsIGludGVyZmFjZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUgaXMgdXNlZCB0byBsaW5rIGEgbWVzc2FnZQotZGVzdGluYXRpb24gcmVmZXJlbmNlIG9yIG1lc3NhZ2UtZHJpdmVuIGJlYW4gdG8gYSBtZXNzYWdlCi1kZXN0aW5hdGlvbi4KLQotVGhlIEFzc2VtYmxlciBzZXRzIHRoZSB2YWx1ZSB0byByZWZsZWN0IHRoZSBmbG93IG9mIG1lc3NhZ2VzCi1iZXR3ZWVuIHByb2R1Y2VycyBhbmQgY29uc3VtZXJzIGluIHRoZSBhcHBsaWNhdGlvbi4KLQotVGhlIHZhbHVlIG11c3QgYmUgdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBvZiBhIG1lc3NhZ2UKLWRlc3RpbmF0aW9uIGluIHRoZSBzYW1lIERlcGxveW1lbnQgRmlsZSBvciBpbiBhbm90aGVyCi1EZXBsb3ltZW50IEZpbGUgaW4gdGhlIHNhbWUgSjJFRSBhcHBsaWNhdGlvbiB1bml0LgotCi1BbHRlcm5hdGl2ZWx5LCB0aGUgdmFsdWUgbWF5IGJlIGNvbXBvc2VkIG9mIGEgcGF0aCBuYW1lCi1zcGVjaWZ5aW5nIGEgRGVwbG95bWVudCBGaWxlIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZWQKLW1lc3NhZ2UgZGVzdGluYXRpb24gd2l0aCB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIG9mIHRoZQotZGVzdGluYXRpb24gYXBwZW5kZWQgYW5kIHNlcGFyYXRlZCBmcm9tIHRoZSBwYXRoIG5hbWUgYnkKLSIjIi4gVGhlIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgRGVwbG95bWVudCBGaWxlCi1jb250YWluaW5nIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQgaXMgcmVmZXJlbmNpbmcgdGhlCi1tZXNzYWdlIGRlc3RpbmF0aW9uLiAgVGhpcyBhbGxvd3MgbXVsdGlwbGUgbWVzc2FnZQotZGVzdGluYXRpb25zIHdpdGggdGhlIHNhbWUgbmFtZSB0byBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uCi1vZiBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhIG1lc3NhZ2UgZGVzdGluYXRpb24KLWFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLWVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZjoKLQotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gICAgICAgIC0gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUKLSAgICAgICAgLSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiB0eXBlCi0gICAgICAgIC0gYSBzcGVjaWZpY2F0aW9uIGFzIHRvIHdoZXRoZXIgdGhlCi0gICAgICAgICAgZGVzdGluYXRpb24gaXMgdXNlZCBmb3IKLSAgICAgICAgICBjb25zdW1pbmcgb3IgcHJvZHVjaW5nIG1lc3NhZ2VzLCBvciBib3RoCi0gICAgICAgIC0gYSBsaW5rIHRvIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uCi0KLUV4YW1wbGVzOgotCi08bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWY+Ci0gICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlCi0gICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZT4KLSAgICAgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT5qYXZheC5qbXMuUXVldWUKLSAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+Ci0gICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlPkNvbnN1bWVzCi0gICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZT4KLSAgICAgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tbGluaz5Db3Jwb3JhdGVTdG9ja3MKLSAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLWxpbms+Ci08L21lc3NhZ2UtZGVzdGluYXRpb24tcmVmPgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpqbmRpLW5hbWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMKLSAgICAgICAgdGhlIG5hbWUgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzCi0gICAgICAgIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLSAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lCi0gICAgICAgIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUKLSAgICAgICAgdW5pcXVlIHdpdGhpbiBhbiBlamItamFyIChmb3IgZW50ZXJwcmlzZSBiZWFucykgb3IgYQotICAgICAgICBEZXBsb3ltZW50IEZpbGUgKGZvciBvdGhlcnMpLgotICAgICAgICAlJSUKLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUgc3BlY2lmaWVzIHRoZSB0eXBlIG9mCi10aGUgZGVzdGluYXRpb24uIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgSmF2YSBpbnRlcmZhY2UKLWV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkZXN0aW5hdGlvbi4KLQotRXhhbXBsZToKLQotIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlCi0gPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUgc3BlY2lmaWVzIHRoZSB1c2Ugb2YgdGhlCi1tZXNzYWdlIGRlc3RpbmF0aW9uIGluZGljYXRlZCBieSB0aGUgcmVmZXJlbmNlLiAgVGhlIHZhbHVlCi1pbmRpY2F0ZXMgd2hldGhlciBtZXNzYWdlcyBhcmUgY29uc3VtZWQgZnJvbSB0aGUgbWVzc2FnZQotZGVzdGluYXRpb24sIHByb2R1Y2VkIGZvciB0aGUgZGVzdGluYXRpb24sIG9yIGJvdGguICBUaGUKLUFzc2VtYmxlciBtYWtlcyB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbiBpbiBsaW5raW5nIHByb2R1Y2Vycwotb2YgYSBkZXN0aW5hdGlvbiB3aXRoIGl0cyBjb25zdW1lcnMuCi0KLVRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSBlbGVtZW50IG11c3QgYmUKLW9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgIENvbnN1bWVzCi0gICAgUHJvZHVjZXMKLSAgICBDb25zdW1lc1Byb2R1Y2VzCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVzIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y2VzIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVzUHJvZHVjZXMiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIG1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIHNwZWNpZmllcyBhIG1lc3NhZ2UKLWRlc3RpbmF0aW9uLiBUaGUgbG9naWNhbCBkZXN0aW5hdGlvbiBkZXNjcmliZWQgYnkgdGhpcwotZWxlbWVudCBpcyBtYXBwZWQgdG8gYSBwaHlzaWNhbCBkZXN0aW5hdGlvbiBieSB0aGUgRGVwbG95ZXIuCi0KLVRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIGVsZW1lbnQgY29udGFpbnM6Ci0KLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgICAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXktbmFtZQotICAgICAgICAtIGFuIG9wdGlvbmFsIGljb24KLSAgICAgICAgLSBhIG1lc3NhZ2UgZGVzdGluYXRpb24gbmFtZSB3aGljaCBtdXN0IGJlIHVuaXF1ZQotICAgICAgICAgIGFtb25nIG1lc3NhZ2UgZGVzdGluYXRpb24gbmFtZXMgd2l0aGluIHRoZSBzYW1lCi0gICAgICAgICAgRGVwbG95bWVudCBGaWxlLgotCi1FeGFtcGxlOgotCi08bWVzc2FnZS1kZXN0aW5hdGlvbj4KLSAgICAgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZT5Db3Jwb3JhdGVTdG9ja3MKLSAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+Ci08L21lc3NhZ2UtZGVzdGluYXRpb24+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTppY29uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYQotICAgICAgICBuYW1lIGZvciBhIG1lc3NhZ2UgZGVzdGluYXRpb24uICBUaGlzIG5hbWUgbXVzdCBiZQotICAgICAgICB1bmlxdWUgYW1vbmcgdGhlIG5hbWVzIG9mIG1lc3NhZ2UgZGVzdGluYXRpb25zCi0gICAgICAgIHdpdGhpbiB0aGUgRGVwbG95bWVudCBGaWxlLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFyYW0tdmFsdWVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhpcyB0eXBlIGlzIGEgZ2VuZXJhbCB0eXBlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVjbGFyZQotcGFyYW1ldGVyL3ZhbHVlIGxpc3RzLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtLW5hbWUiCi0gICAgICAgICAgICAgdHlwZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgcGFyYW1ldGVyLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtLXZhbHVlIgotICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYQotICAgICAgICBwYXJhbWV0ZXIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InBhdGhUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGVsZW1lbnRzIHRoYXQgdXNlIHRoaXMgdHlwZSBkZXNpZ25hdGUgZWl0aGVyIGEgcmVsYXRpdmUKLXBhdGggb3IgYW4gYWJzb2x1dGUgcGF0aCBzdGFydGluZyB3aXRoIGEgIi8iLgotCi1JbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotc2FtZSBEZXBsb3ltZW50IEZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci1zdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLXRoZSBEZXBsb3ltZW50IEZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sCi10aG9zZSBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mCi10aGUgRGVwbG95bWVudCBGaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMKLWFyZSBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0icmVtb3RlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUKLW9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLgotCi1FeGFtcGxlOgotCi0gICAgPHJlbW90ZT5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlPC9yZW1vdGU+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0icmVzLWF1dGhUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHJlcy1hdXRoVHlwZSBzcGVjaWZpZXMgd2hldGhlciB0aGUgRGVwbG95bWVudCBDb21wb25lbnQKLWNvZGUgc2lnbnMgb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3IKLXdoZXRoZXIgdGhlIENvbnRhaW5lciB3aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIKLW9uIGJlaGFsZiBvZiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQuIEluIHRoZSBsYXR0ZXIgY2FzZSwKLXRoZSBDb250YWluZXIgdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZQotRGVwbG95ZXIuCi0KLVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotICAgIEFwcGxpY2F0aW9uCi0gICAgQ29udGFpbmVyCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lciIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJyZXMtc2hhcmluZy1zY29wZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgcmVzLXNoYXJpbmctc2NvcGUgdHlwZSBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucwotb2J0YWluZWQgdGhyb3VnaCB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uCi1mYWN0b3J5IHJlZmVyZW5jZSBjYW4gYmUgc2hhcmVkLiBUaGUgdmFsdWUsIGlmIHNwZWNpZmllZCwKLW11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0gICAgU2hhcmVhYmxlCi0gICAgVW5zaGFyZWFibGUKLQotVGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZWFibGUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zaGFyZWFibGUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlLWVudi1yZWZUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHJlc291cmNlLWVudi1yZWZUeXBlIGlzIHVzZWQgdG8gZGVmaW5lCi1yZXNvdXJjZS1lbnYtdHlwZSBlbGVtZW50cy4gIEl0IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQotRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdAotYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLWVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZQotcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbiBpbmRpY2F0aW9uIG9mCi10aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkgdGhlCi1EZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLgotCi1FeGFtcGxlOgotCi08cmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlCi0gICAgPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZheC5qbXMuUXVldWUKLSAgICA8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLTwvcmVzb3VyY2UtZW52LXJlZj4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmpuZGktbmFtZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLSAgICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotICAgICAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QKLSAgICAgICAgYmUgdW5pcXVlIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUKLSAgICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UuICBJdCBpcyB0aGUKLSAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yCi0gICAgICAgIGludGVyZmFjZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzb3VyY2UtcmVmVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSByZXNvdXJjZS1yZWZUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQotRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuIEl0Ci1jb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIG1hbmFnZXIKLWNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwgdGhlIGluZGljYXRpb24gb2YgdGhlCi1yZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSB0eXBlIGV4cGVjdGVkIGJ5IHRoZQotRGVwbG95bWVudCBDb21wb25lbnQgY29kZSwgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRpb24KLShBcHBsaWNhdGlvbiBvciBDb250YWluZXIpLCBhbmQgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZgotdGhlIHNoYXJlYWJpbGl0eSBvZiBjb25uZWN0aW9ucyBvYnRhaW5lZCBmcm9tIHRoZSByZXNvdXJjZQotKFNoYXJlYWJsZSBvciBVbnNoYXJlYWJsZSkuCi0KLUV4YW1wbGU6Ci0KLTxyZXNvdXJjZS1yZWY+Ci0gICAgPHJlcy1yZWYtbmFtZT5qZGJjL0VtcGxveWVlQXBwREI8L3Jlcy1yZWYtbmFtZT4KLSAgICA8cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L3Jlcy10eXBlPgotICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotPC9yZXNvdXJjZS1yZWY+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzLXJlZi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpqbmRpLW5hbWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0gICAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4KLSAgICAgICAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLSAgICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgRGVwbG95bWVudCBGaWxlLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhCi0gICAgICAgIHNvdXJjZS4gVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBmdWxseSBxdWFsaWZpZWQKLSAgICAgICAgSmF2YSBsYW5ndWFnZSBjbGFzcyBvciBpbnRlcmZhY2UKLSAgICAgICAgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRhdGEgc291cmNlLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1hdXRoIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXMtYXV0aFR5cGUiLz4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzLXNoYXJpbmctc2NvcGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlcy1zaGFyaW5nLXNjb3BlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0icm9sZS1uYW1lVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSByb2xlLW5hbWVUeXBlIGRlc2lnbmF0ZXMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi1UaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icnVuLWFzVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBydW4tYXNUeXBlIHNwZWNpZmllcyB0aGUgcnVuLWFzIGlkZW50aXR5IHRvIGJlCi11c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIGEgY29tcG9uZW50LiBJdCBjb250YWlucyBhbgotb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyb2xlLW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWZUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlY3VyaXR5LXJvbGUtcmVmVHlwZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYQotc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgaW4gYSBjb21wb25lbnQncyBvciBhCi1EZXBsb3ltZW50IENvbXBvbmVudCdzIGNvZGUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbgotb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSBzZWN1cml0eSByb2xlIG5hbWUgdXNlZCBpbiB0aGUKLWNvZGUsIGFuZCBhbiBvcHRpb25hbCBsaW5rIHRvIGEgc2VjdXJpdHkgcm9sZS4gSWYgdGhlCi1zZWN1cml0eSByb2xlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBEZXBsb3llciBtdXN0IGNob29zZSBhbgotYXBwcm9wcmlhdGUgc2VjdXJpdHkgcm9sZS4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHJvbGUtbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIFN0cmluZyB1c2VkCi0gICAgICAgIGFzIHRoZSBwYXJhbWV0ZXIgdG8gdGhlCi0gICAgICAgIEVKQkNvbnRleHQuaXNDYWxsZXJJblJvbGUoU3RyaW5nIHJvbGVOYW1lKSBtZXRob2Qgb3IgdGhlCi0gICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdC5pc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIG1ldGhvZC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLWxpbmsiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcm9sZS1saW5rIGVsZW1lbnQgaXMgYSByZWZlcmVuY2UgdG8gYSBkZWZpbmVkCi0gICAgICAgIHNlY3VyaXR5IHJvbGUuIFRoZSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGNvbnRhaW4KLSAgICAgICAgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluIHRoZQotICAgICAgICBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktcm9sZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgc2VjdXJpdHktcm9sZVR5cGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBzZWN1cml0eQotcm9sZS4gVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlCi1zZWN1cml0eSByb2xlLCBhbmQgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZS4KLQotRXhhbXBsZToKLQotICAgIDxzZWN1cml0eS1yb2xlPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgVGhpcyByb2xlIGluY2x1ZGVzIGFsbCBlbXBsb3llZXMgd2hvIGFyZSBhdXRob3JpemVkCi0gICAgICAgIHRvIGFjY2VzcyB0aGUgZW1wbG95ZWUgc2VydmljZSBhcHBsaWNhdGlvbi4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxyb2xlLW5hbWU+ZW1wbG95ZWU8L3JvbGUtbmFtZT4KLSAgICA8L3NlY3VyaXR5LXJvbGU+Ci08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cm9sZS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0ic3RyaW5nIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhpcyBpcyBhIHNwZWNpYWwgc3RyaW5nIGRhdGF0eXBlIHRoYXQgaXMgZGVmaW5lZCBieSBKMkVFIGFzCi1hIGJhc2UgdHlwZSBmb3IgZGVmaW5pbmcgY29sbGFwc2VkIHN0cmluZ3MuIFdoZW4gc2NoZW1hcwotcmVxdWlyZSB0cmFpbGluZy9sZWFkaW5nIHNwYWNlIGVsaW1pbmF0aW9uIGFzIHdlbGwgYXMKLWNvbGxhcHNpbmcgdGhlIGV4aXN0aW5nIHdoaXRlc3BhY2UsIHRoaXMgYmFzZSB0eXBlIG1heSBiZQotdXNlZC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRydWUtZmFsc2VUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhpcyBzaW1wbGUgdHlwZSBkZXNpZ25hdGVzIGEgYm9vbGVhbiB3aXRoIG9ubHkgdHdvCi1wZXJtaXNzaWJsZSB2YWx1ZXMKLQotLSB0cnVlCi0tIGZhbHNlCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iKHRydWV8ZmFsc2UpIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ1cmwtcGF0dGVyblR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgdXJsLXBhdHRlcm5UeXBlIGNvbnRhaW5zIHRoZSB1cmwgcGF0dGVybiBvZiB0aGUgbWFwcGluZy4gSXQgbXVzdAotZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMS4yIG9mIHRoZSBTZXJ2bGV0IEFQSQotU3BlY2lmaWNhdGlvbi4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9Indhci1wYXRoVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBlbGVtZW50cyB0aGF0IHVzZSB0aGlzIHR5cGUgZGVzaWduYXRlIGEgcGF0aCBzdGFydGluZwotd2l0aCBhICIvIiBhbmQgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgYSBXQVIKLWZpbGUuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iLy4qIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdjEveGtpdC9zY2hlbWFzL2oyZWUvanNwXzJfMC54c2QgYi92MS94a2l0L3NjaGVtYXMvajJlZS9qc3BfMl8wLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFkNTY2OC4uMDAwMDAwMAotLS0gYS92MS94a2l0L3NjaGVtYXMvajJlZS9qc3BfMl8wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjIuMCI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci1AKCMpanNwXzJfMC54c2RzCTEuMTAgMDgvMjAvMDIKLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLUNvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotcmVzZXJ2ZWQuCi0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLXJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi1wYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi1saXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi1hZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1UaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi1kaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi1kaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLW1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi13cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLVRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi1KYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi1DdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi1NaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi1TdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKU1AgMi4wIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotdHlwZXMuICBUaGUgSlNQIDIuMCBzY2hlbWEgY29udGFpbnMgYWxsIHRoZSBzcGVjaWFsCi1zdHJ1Y3R1cmVzIGFuZCBkYXRhdHlwZXMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIHVzZSBKU1AgZmlsZXMKLWZyb20gYSB3ZWIgYXBwbGljYXRpb24uCi0KLVRoZSBjb250ZW50cyBvZiB0aGlzIHNjaGVtYSBpcyB1c2VkIGJ5IHRoZSB3ZWItYXBwXzJfNC54c2QKLWZpbGUgdG8gZGVmaW5lIEpTUCBzcGVjaWZpYyBjb250ZW50LgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLS0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLSAgc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAgc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0gIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLSAgc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLSAgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0gIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLWNvbmZpZ1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUganNwLWNvbmZpZ1R5cGUgaXMgdXNlZCB0byBwcm92aWRlIGdsb2JhbCBjb25maWd1cmF0aW9uCi1pbmZvcm1hdGlvbiBmb3IgdGhlIEpTUCBmaWxlcyBpbiBhIHdlYiBhcHBsaWNhdGlvbi4gSXQgaGFzCi10d28gc3ViZWxlbWVudHMsIHRhZ2xpYiBhbmQganNwLXByb3BlcnR5LWdyb3VwLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnRhZ2xpYlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianNwLXByb3BlcnR5LWdyb3VwIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpqc3AtcHJvcGVydHktZ3JvdXBUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpzcC1maWxlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBqc3AtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxsIHBhdGggdG8gYSBKU1AgZmlsZQotd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24gYmVnaW5uaW5nIHdpdGggYSBgLycuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnBhdGhUeXBlIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqc3AtcHJvcGVydHktZ3JvdXBUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGpzcC1wcm9wZXJ0eS1ncm91cFR5cGUgaXMgdXNlZCB0byBncm91cCBhIG51bWJlciBvZgotZmlsZXMgc28gdGhleSBjYW4gYmUgZ2l2ZW4gZ2xvYmFsIHByb3BlcnR5IGluZm9ybWF0aW9uLgotQWxsIGZpbGVzIHNvIGRlc2NyaWJlZCBhcmUgZGVlbWVkIHRvIGJlIEpTUCBmaWxlcy4gIFRoZQotZm9sbG93aW5nIGFkZGl0aW9uYWwgcHJvcGVydGllcyBjYW4gYmUgZGVzY3JpYmVkOgotCi0gICAgLSBDb250cm9sIGVuYWJsaW5nIG9mIEVMIGV2YWx1YXRpb24uCi0gICAgLSBDb250cm9sIGVuYWJsaW5nIG9mIFNjcmlwdGluZyBlbGVtZW50cy4KLSAgICAtIEluZGljYXRlIHBhZ2VFbmNvZGluZyBpbmZvcm1hdGlvbi4KLSAgICAtIEluZGljYXRpbmcgdGhhdCBhIHJlc291cmNlIGlzIGEgSlNQIGRvY3VtZW50Ci0gICAgLSBQcmVsdWRlIGFuZCBDb2RhIGF1dG9tYXRpYyBpbmNsdWRlcy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0JCSAgICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotCQkgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp1cmwtcGF0dGVyblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWwtZW5hYmxlZCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBDYW4gYmUgdXNlZCB0byBlYXNpbHkgc2V0IHRoZSBpc0VMRW5hYmxlZAotICAgICAgICBwcm9wZXJ0eSBvZiBhIGdyb3VwIG9mIEpTUCBwYWdlcy4gIEJ5IGRlZmF1bHQsIHRoZQotICAgICAgICBFTCBldmFsdWF0aW9uIGlzIGVuYWJsZWQgZm9yIFdlYiBBcHBsaWNhdGlvbnMgdXNpbmcKLSAgICAgICAgYSBTZXJ2bGV0IDIuNCBvciBncmVhdGVyIHdlYi54bWwuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhZ2UtZW5jb2RpbmciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSB2YWxpZCB2YWx1ZXMgb2YgcGFnZS1lbmNvZGluZyBhcmUgdGhvc2Ugb2YgdGhlCi0gICAgICAgIHBhZ2VFbmNvZGluZyBwYWdlIGRpcmVjdGl2ZS4gSXQgaXMgYQotICAgICAgICB0cmFuc2xhdGlvbi10aW1lIGVycm9yIHRvIGRlZmluZSB0aGUgcGFnZUVuY29kaW5nCi0gICAgICAgIG9mIGEgSlNQIHBhZ2UgdGhyb3VnaCBvbmUgdmFsdWUgaW4gdGhlIEpTUAotICAgICAgICBjb25maWd1cmF0aW9uIGVsZW1lbnQgYW5kIHRoZW4gZ2l2ZSBpdCBhIGRpZmZlcmVudAotICAgICAgICB2YWx1ZSBpbiBhIHBhZ2VFbmNvZGluZyBkaXJlY3RpdmUsIGJ1dCBpdCBpcyBsZWdhbAotICAgICAgICB0byBnaXZlIGl0IHRoZSBzYW1lIHZhbHVlLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY3JpcHRpbmctZW5hYmxlZCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBDYW4gYmUgdXNlZCB0byBlYXNpbHkgc2V0IHRoZSBpc1NjcmlwdGluZ0VuYWJsZWQKLSAgICAgICAgcHJvcGVydHkgb2YgYSBncm91cCBvZiBKU1AgcGFnZXMuICBCeSBkZWZhdWx0LAotICAgICAgICBzY3JpcHRpbmcgaXMgZW5hYmxlZC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJpcy14bWwiCi0JCSAgICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBJZiB0cnVlLCBkZW5vdGVzIHRoYXQgdGhlIGdyb3VwIG9mIHJlc291cmNlcwotCXRoYXQgbWF0Y2ggdGhlIFVSTCBwYXR0ZXJuIGFyZSBKU1AgZG9jdW1lbnRzLAotCWFuZCB0aHVzIG11c3QgYmUgaW50ZXJwcmV0ZWQgYXMgWE1MIGRvY3VtZW50cy4KLQlJZiBmYWxzZSwgdGhlIHJlc291cmNlcyBhcmUgYXNzdW1lZCB0byBub3QKLQliZSBKU1AgZG9jdW1lbnRzLCB1bmxlc3MgdGhlcmUgaXMgYW5vdGhlcgotCXByb3BlcnR5IGdyb3VwIHRoYXQgaW5kaWNhdGVzIG90aGVyd2lzZS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5jbHVkZS1wcmVsdWRlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpwYXRoVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGluY2x1ZGUtcHJlbHVkZSBlbGVtZW50IGlzIGEgY29udGV4dC1yZWxhdGl2ZQotICAgICAgICBwYXRoIHRoYXQgbXVzdCBjb3JyZXNwb25kIHRvIGFuIGVsZW1lbnQgaW4gdGhlCi0gICAgICAgIFdlYiBBcHBsaWNhdGlvbi4gIFdoZW4gdGhlIGVsZW1lbnQgaXMgcHJlc2VudCwKLSAgICAgICAgdGhlIGdpdmVuIHBhdGggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIChhcwotICAgICAgICBpbiBhbiBpbmNsdWRlIGRpcmVjdGl2ZSkgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoCi0gICAgICAgIEpTUCBwYWdlIGluIHRoaXMganNwLXByb3BlcnR5LWdyb3VwLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmNsdWRlLWNvZGEiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgaW5jbHVkZS1jb2RhIGVsZW1lbnQgaXMgYSBjb250ZXh0LXJlbGF0aXZlCi0gICAgICAgIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gZWxlbWVudCBpbiB0aGUKLSAgICAgICAgV2ViIEFwcGxpY2F0aW9uLiAgV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LAotICAgICAgICB0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgKGFzCi0gICAgICAgIGluIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSBhdCB0aGUgZW5kIG9mIGVhY2gKLSAgICAgICAgSlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWdsaWJUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotQSB0YWdsaWIgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBhIHRhZwotbGlicmFyeSB0aGF0IGlzIHVzZWQgYnkgYSBKU1AgcGFnZSB3aXRoaW4gdGhlIFdlYgotQXBwbGljYXRpb24uCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYi11cmkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEEgdGFnbGliLXVyaSBlbGVtZW50IGRlc2NyaWJlcyBhIFVSSSBpZGVudGlmeWluZyBhCi0gICAgICAgIHRhZyBsaWJyYXJ5IHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gIFRoZSBib2R5Ci0gICAgICAgIG9mIHRoZSB0YWdsaWItdXJpIGVsZW1lbnQgbWF5IGJlIGVpdGhlciBhbgotICAgICAgICBhYnNvbHV0ZSBVUkkgc3BlY2lmaWNhdGlvbiwgb3IgYSByZWxhdGl2ZSBVUkkuCi0gICAgICAgIFRoZXJlIHNob3VsZCBiZSBubyBlbnRyaWVzIGluIHdlYi54bWwgd2l0aCB0aGUKLSAgICAgICAgc2FtZSB0YWdsaWItdXJpIHZhbHVlLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYi1sb2NhdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICB0aGUgdGFnbGliLWxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uCi0gICAgICAgIChhcyBhIHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIKLSAgICAgICAgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZyBMaWJyYXJ5Ci0gICAgICAgIERlc2NyaXB0aW9uIGZpbGUgZm9yIHRoZSB0YWcgbGlicmFyeS4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL3YxL3hraXQvc2NoZW1hcy9qMmVlL3dlYi1hcHBfMl80LnhzZCBiL3YxL3hraXQvc2NoZW1hcy9qMmVlL3dlYi1hcHBfMl80LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4YzE1OC4uMDAwMDAwMAotLS0gYS92MS94a2l0L3NjaGVtYXMvajJlZS93ZWItYXBwXzJfNC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMi40Ij4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLUAoIyl3ZWItYXBwXzJfNC54c2RzCTEuMzQgMDIvMDgvMDEKLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLUNvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotcmVzZXJ2ZWQuCi0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLXJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi1wYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi1saXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi1hZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1UaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi1kaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi1kaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLW1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi13cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLVRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi1KYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi1DdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi1NaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi1TdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBTZXJ2bGV0IDIuNCBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yLiAgQWxsIFNlcnZsZXQgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0Ci1pbmRpY2F0ZSB0aGUgd2ViIGFwcGxpY2F0aW9uIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRQotbmFtZXNwYWNlOgotCi1odHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0KLWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLXVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLSAgICA8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSIuLi4iCi0gICAgIHZlcnNpb249IjIuNCI+Ci0gICAgLi4uCi0gICAgPC93ZWItYXBwPgotCi1UaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLXRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIEoyRUUKLW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLWRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICBzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICBzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImoyZWVfMV80LnhzZCIvPgotPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqc3BfMl8wLnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotCi08eHNkOmVsZW1lbnQgbmFtZT0id2ViLWFwcCIgdHlwZT0iajJlZTp3ZWItYXBwVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSB3ZWItYXBwIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGRlcGxveW1lbnQKLSAgICBkZXNjcmlwdG9yIGZvciBhIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InNlcnZsZXQtbmFtZS11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIHNlcnZsZXQgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlcnZsZXQuCi0gICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6c2VydmxldCIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnNlcnZsZXQtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImZpbHRlci1uYW1lLXVuaXF1ZW5lc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgZmlsdGVyIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWx0ZXIuCi0gICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZmlsdGVyIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZmlsdGVyLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlamItbG9jYWwtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBlamItbG9jYWwtcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLSAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSB3ZWIKLSAgICBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLSAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLSAgICB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1sb2NhbC1yZWYiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLSAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSB3ZWIKLSAgICBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLSAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLSAgICB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWYiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCi0gICAgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUKLSAgICBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlLgotICAgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52Ci0gICAgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYiLz4KLSAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKLSAgICBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0gICAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gY29kZS4KLSAgICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudgotICAgIGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJyZXMtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0gICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLSAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0iZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgd2ViCi0gICAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lCi0gICAgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZW52LWVudHJ5Ii8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZW52LWVudHJ5LW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDprZXkgbmFtZT0icm9sZS1uYW1lLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIEEgcm9sZS1uYW1lLWtleSBpcyBzcGVjaWZpZWQgdG8gYWxsb3cgdGhlIHJlZmVyZW5jZXMKLSAgICBmcm9tIHRoZSBzZWN1cml0eS1yb2xlLXJlZnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6c2VjdXJpdHktcm9sZSIvPgotICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJvbGUtbmFtZSIvPgotICAgIDwveHNkOmtleT4KLQotICAgIDx4c2Q6a2V5cmVmIG5hbWU9InJvbGUtbmFtZS1yZWZlcmVuY2VzIgotICAgICAgICAgICAgcmVmZXI9ImoyZWU6cm9sZS1uYW1lLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgIFRoZSBrZXlyZWYgaW5kaWNhdGVzIHRoZSByZWZlcmVuY2VzIGZyb20KLSAgICBzZWN1cml0eS1yb2xlLXJlZiB0byBhIHNwZWNpZmllZCByb2xlLW5hbWUuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6c2VydmxldC9qMmVlOnNlY3VyaXR5LXJvbGUtcmVmIi8+Ci0gICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cm9sZS1saW5rIi8+Ci0gICAgPC94c2Q6a2V5cmVmPgotCi08L3hzZDplbGVtZW50PgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdXRoLWNvbnN0cmFpbnRUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGF1dGgtY29uc3RyYWludFR5cGUgaW5kaWNhdGVzIHRoZSB1c2VyIHJvbGVzIHRoYXQKLXNob3VsZCBiZSBwZXJtaXR0ZWQgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UKLWNvbGxlY3Rpb24uIFRoZSByb2xlLW5hbWUgdXNlZCBoZXJlIG11c3QgZWl0aGVyIGNvcnJlc3BvbmQKLXRvIHRoZSByb2xlLW5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzCi1kZWZpbmVkIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwgb3IgYmUgdGhlIHNwZWNpYWxseQotcmVzZXJ2ZWQgcm9sZS1uYW1lICIqIiB0aGF0IGlzIGEgY29tcGFjdCBzeW50YXggZm9yCi1pbmRpY2F0aW5nIGFsbCByb2xlcyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBJZiBib3RoICIqIgotYW5kIHJvbGVuYW1lcyBhcHBlYXIsIHRoZSBjb250YWluZXIgaW50ZXJwcmV0cyB0aGlzIGFzIGFsbAotcm9sZXMuICBJZiBubyByb2xlcyBhcmUgZGVmaW5lZCwgbm8gdXNlciBpcyBhbGxvd2VkIGFjY2VzcwotdG8gdGhlIHBvcnRpb24gb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXNjcmliZWQgYnkgdGhlCi1jb250YWluaW5nIHNlY3VyaXR5LWNvbnN0cmFpbnQuICBUaGUgY29udGFpbmVyIG1hdGNoZXMKLXJvbGUgbmFtZXMgY2FzZSBzZW5zaXRpdmVseSB3aGVuIGRldGVybWluaW5nIGFjY2Vzcy4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0gICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cm9sZS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iYXV0aC1tZXRob2RUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGF1dGgtbWV0aG9kVHlwZSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KLW1lY2hhbmlzbSBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbi4gQXMgYSBwcmVyZXF1aXNpdGUgdG8KLWdhaW5pbmcgYWNjZXNzIHRvIGFueSB3ZWIgcmVzb3VyY2VzIHdoaWNoIGFyZSBwcm90ZWN0ZWQgYnkKLWFuIGF1dGhvcml6YXRpb24gY29uc3RyYWludCwgYSB1c2VyIG11c3QgaGF2ZSBhdXRoZW50aWNhdGVkCi11c2luZyB0aGUgY29uZmlndXJlZCBtZWNoYW5pc20uIExlZ2FsIHZhbHVlcyBhcmUgIkJBU0lDIiwKLSJESUdFU1QiLCAiRk9STSIsIG9yICJDTElFTlQtQ0VSVCIuCi0KLVVzZWQgaW46IGxvZ2luLWNvbmZpZwotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCQVNJQyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESUdFU1QiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRk9STSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTElFTlQtQ0VSVCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNwYXRjaGVyVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBkaXNwYXRjaGVyIGhhcyB0aHJlZSBsZWdhbCB2YWx1ZXMsIEZPUldBUkQgYW5kIFJFUVVFU1QKLWFuZCBJTkNMVURFLiBBIHZhbHVlIG9mIEZPUldBUkQgbWVhbnMgdGhlIEZpbHRlcgotd2lsbCBiZSBhcHBsaWVkIHVuZGVyIFJlcXVlc3REaXNwYXRjaGVyLmZvcndhcmQoKSBjYWxscy4KLUEgdmFsdWUgb2YgUkVRVUVTVCBtZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUgYXBwbGllZAotdW5kZXIgb3JkaW5hcnkgY2xpZW50IGNhbGxzIHRvIHRoZSBwYXRoIG9yIHNlcnZsZXQuIEEgdmFsdWUgb2YKLUlOQ0xVREUgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIKLVJlcXVlc3REaXNwYXRjaGVyLmluY2x1ZGUoKSBjYWxscy4KLVRoZSBhYnNlbmNlIG9mIGFueSBkaXNwYXRjaGVyIGVsZW1lbnRzIGluIGEKLWZpbHRlci1tYXBwaW5nIGluZGljYXRlcyBhIGRlZmF1bHQgb2YgYXBwbHlpbmcKLWZpbHRlcnMgb25seSB1bmRlciBvcmRpbmFyeSBjbGllbnQgY2FsbHMgdG8gdGhlIHBhdGggb3Igc2VydmxldC4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRk9SV0FSRCIvPgotICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOQ0xVREUiLz4KLSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRVFVRVNUIi8+Ci0KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXJyb3ItY29kZVR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZXJyb3ItY29kZSBjb250YWlucyBhbiBIVFRQIGVycm9yIGNvZGUsIGV4OiA0MDQKLQotVXNlZCBpbjogZXJyb3ItcGFnZQotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0icG9zaXRpdmVJbnRlZ2VyIi8+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlcnJvci1wYWdlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBlcnJvci1wYWdlVHlwZSBjb250YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBlcnJvciBjb2RlCi1vciBleGNlcHRpb24gdHlwZSB0byB0aGUgcGF0aCBvZiBhIHJlc291cmNlIGluIHRoZSB3ZWIKLWFwcGxpY2F0aW9uLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPGNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVycm9yLWNvZGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVycm9yLWNvZGVUeXBlIi8+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2VwdGlvbi10eXBlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGV4Y2VwdGlvbi10eXBlIGNvbnRhaW5zIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi0gICAgICAgIG5hbWUgb2YgYSBKYXZhIGV4Y2VwdGlvbiB0eXBlLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwvY2hvaWNlPgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlCi0gICAgICAgIHJlc291cmNlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAgICAgICAgdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBtdXN0IGhhdmUKLSAgICAgICAgYSBsZWFkaW5nIGAvJy4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpbHRlci1tYXBwaW5nVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLURlY2xhcmF0aW9uIG9mIHRoZSBmaWx0ZXIgbWFwcGluZ3MgaW4gdGhpcyB3ZWIKLWFwcGxpY2F0aW9uIGlzIGRvbmUgYnkgdXNpbmcgZmlsdGVyLW1hcHBpbmdUeXBlLgotVGhlIGNvbnRhaW5lciB1c2VzIHRoZSBmaWx0ZXItbWFwcGluZwotZGVjbGFyYXRpb25zIHRvIGRlY2lkZSB3aGljaCBmaWx0ZXJzIHRvIGFwcGx5IHRvIGEgcmVxdWVzdCwKLWFuZCBpbiB3aGF0IG9yZGVyLiBUaGUgY29udGFpbmVyIG1hdGNoZXMgdGhlIHJlcXVlc3QgVVJJIHRvCi1hIFNlcnZsZXQgaW4gdGhlIG5vcm1hbCB3YXkuIFRvIGRldGVybWluZSB3aGljaCBmaWx0ZXJzIHRvCi1hcHBseSBpdCBtYXRjaGVzIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyBlaXRoZXIgb24KLXNlcnZsZXQtbmFtZSwgb3Igb24gdXJsLXBhdHRlcm4gZm9yIGVhY2ggZmlsdGVyLW1hcHBpbmcKLWVsZW1lbnQsIGRlcGVuZGluZyBvbiB3aGljaCBzdHlsZSBpcyB1c2VkLiBUaGUgb3JkZXIgaW4KLXdoaWNoIGZpbHRlcnMgYXJlIGludm9rZWQgaXMgdGhlIG9yZGVyIGluIHdoaWNoCi1maWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdGhhdCBtYXRjaCBhIHJlcXVlc3QgVVJJIGZvciBhCi1zZXJ2bGV0IGFwcGVhciBpbiB0aGUgbGlzdCBvZiBmaWx0ZXItbWFwcGluZyBlbGVtZW50cy5UaGUKLWZpbHRlci1uYW1lIHZhbHVlIG11c3QgYmUgdGhlIHZhbHVlIG9mIHRoZSBmaWx0ZXItbmFtZQotc3ViLWVsZW1lbnRzIG9mIG9uZSBvZiB0aGUgZmlsdGVyIGRlY2xhcmF0aW9ucyBpbiB0aGUKLWRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLW5hbWUiCi0gICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZmlsdGVyLW5hbWVUeXBlIi8+Ci0gICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsLXBhdHRlcm4iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnVybC1wYXR0ZXJuVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VydmxldC1uYW1lVHlwZSIvPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BhdGNoZXJUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmlsdGVyLW5hbWVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZmlsdGVyIGlzIGRlY2xhcmUKLWJ5IHVzaW5nIGZpbHRlci1uYW1lVHlwZS4gVGhpcyBuYW1lIGlzIHVzZWQgdG8gbWFwIHRoZQotZmlsdGVyLiAgRWFjaCBmaWx0ZXIgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWIKLWFwcGxpY2F0aW9uLgotCi1Vc2VkIGluOiBmaWx0ZXIsIGZpbHRlci1tYXBwaW5nCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmlsdGVyVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBmaWx0ZXJUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhIGZpbHRlciBpbiB0aGUgd2ViCi1hcHBsaWNhdGlvbi4gVGhlIGZpbHRlciBpcyBtYXBwZWQgdG8gZWl0aGVyIGEgc2VydmxldCBvciBhCi1VUkwgcGF0dGVybiBpbiB0aGUgZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgdXNpbmcgdGhlCi1maWx0ZXItbmFtZSB2YWx1ZSB0byByZWZlcmVuY2UuIEZpbHRlcnMgY2FuIGFjY2VzcyB0aGUKLWluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZGVjbGFyZWQgaW4gdGhlIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IgYXQgcnVudGltZSB2aWEgdGhlIEZpbHRlckNvbmZpZyBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IHdlYi1hcHAKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmljb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmaWx0ZXItbmFtZVR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBmaWx0ZXIuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGFyYW0tdmFsdWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMKLSAgICAgICAgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgYSBzZXJ2bGV0IGZpbHRlcgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZm9ybS1sb2dpbi1jb25maWdUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGZvcm0tbG9naW4tY29uZmlnVHlwZSBzcGVjaWZpZXMgdGhlIGxvZ2luIGFuZCBlcnJvcgotcGFnZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiBmb3JtIGJhc2VkIGxvZ2luLiBJZiBmb3JtIGJhc2VkCi1hdXRoZW50aWNhdGlvbiBpcyBub3QgdXNlZCwgdGhlc2UgZWxlbWVudHMgYXJlIGlnbm9yZWQuCi0KLVVzZWQgaW46IGxvZ2luLWNvbmZpZwotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcm0tbG9naW4tcGFnZSIKLSAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp3YXItcGF0aFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZm9ybS1sb2dpbi1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYiBhcHAKLSAgICAgICAgd2hlcmUgdGhlIHBhZ2UgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbG9naW4gY2FuIGJlIGZvdW5kLgotICAgICAgICBUaGUgcGF0aCBiZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMKLSAgICAgICAgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JtLWVycm9yLXBhZ2UiCi0gICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6d2FyLXBhdGhUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGZvcm0tZXJyb3ItcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluCi0gICAgICAgIHRoZSB3ZWIgYXBwIHdoZXJlIHRoZSBlcnJvciBwYWdlIHRoYXQgaXMgZGlzcGxheWVkCi0gICAgICAgIHdoZW4gbG9naW4gaXMgbm90IHN1Y2Nlc3NmdWwgY2FuIGJlIGZvdW5kLgotICAgICAgICBUaGUgcGF0aCBiZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMgaW50ZXJwcmV0ZWQKLSAgICAgICAgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJodHRwLW1ldGhvZFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotCi08eHNkOmRvY3VtZW50YXRpb24+Ci1UaGUgaHR0cC1tZXRob2QgY29udGFpbnMgYW4gSFRUUCBtZXRob2QgcmVjb2duaXplZCBieSB0aGUgd2ViLWFwcCwgaS5lLgotKEdFVCB8IFBPU1QgfC4uLikuCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdFVCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQT1NUIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBVVCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERUxFVEUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEVBRCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUFRJT05TIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSQUNFIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaXN0ZW5lclR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgbGlzdGVuZXJUeXBlIGluZGljYXRlcyB0aGUgZGVwbG95bWVudCBwcm9wZXJ0aWVzIGZvciBhIHdlYgotYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4KLQotVXNlZCBpbjogd2ViLWFwcDpsaXN0ZW5lclR5cGUKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdGVuZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZQotICAgICAgICBhcHBsaWNhdGlvbiBtdXN0IGJlIHJlZ2lzdGVyZWQgYXMgYSB3ZWIKLSAgICAgICAgYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4gVGhlIHZhbHVlIGlzIHRoZSBmdWxseQotICAgICAgICBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBsaXN0ZW5lciBjbGFzcy4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3RUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QgY29udGFpbnMgb25lIG9yIG1vcmUKLWxvY2FsZS1lbmNvZGluZy1tYXBwaW5nKHMpLgotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWxlLWVuY29kaW5nLW1hcHBpbmciCi0gICAgICAgIHR5cGU9ImoyZWU6bG9jYWxlLWVuY29kaW5nLW1hcHBpbmdUeXBlIgotICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotPC94c2Q6c2VxdWVuY2U+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBsb2NhbGUtZW5jb2RpbmctbWFwcGluZyBjb250YWlucyBsb2NhbGUgbmFtZSBhbmQKLWVuY29kaW5nIG5hbWUuIFRoZSBsb2NhbGUgbmFtZSBtdXN0IGJlIGVpdGhlciAiTGFuZ3VhZ2UtY29kZSIsCi1zdWNoIGFzICJqYSIsIGRlZmluZWQgYnkgSVNPLTYzOSBvciAiTGFuZ3VhZ2UtY29kZV9Db3VudHJ5LWNvZGUiLAotc3VjaCBhcyAiamFfSlAiLiAgIkNvdW50cnkgY29kZSIgaXMgZGVmaW5lZCBieSBJU08tMzE2Ni4KLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsZSIKLSAgICAgICAgdHlwZT0iajJlZTpzdHJpbmciLz4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5jb2RpbmciCi0gICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIi8+Ci08L3hzZDpzZXF1ZW5jZT4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9naW4tY29uZmlnVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBsb2dpbi1jb25maWdUeXBlIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbgotbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHVzZWQsIHRoZSByZWFsbSBuYW1lIHRoYXQgc2hvdWxkIGJlCi11c2VkIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgdGhlIGF0dHJpYnV0ZXMgdGhhdCBhcmUKLW5lZWRlZCBieSB0aGUgZm9ybSBsb2dpbiBtZWNoYW5pc20uCi0KLVVzZWQgaW46IHdlYi1hcHAKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aC1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmF1dGgtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhbG0tbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVhbG0gbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgcmVhbG0gbmFtZSB0bwotICAgICAgICB1c2UgaW4gSFRUUCBCYXNpYyBhdXRob3JpemF0aW9uLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JtLWxvZ2luLWNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6Zm9ybS1sb2dpbi1jb25maWdUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWltZS1tYXBwaW5nVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtaW1lLW1hcHBpbmdUeXBlIGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXh0ZW5zaW9uCi1hbmQgYSBtaW1lIHR5cGUuCi0KLVVzZWQgaW46IHdlYi1hcHAKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZXh0ZW5zaW9uIGVsZW1lbnQgY29udGFpbnMgYSBzdHJpbmcgZGVzY3JpYmluZyBhbgotICAgICAgICBleHRlbnNpb24uIGV4YW1wbGU6ICJ0eHQiCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzdHJpbmciLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbWUtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bWltZS10eXBlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOnNpbXBsZVR5cGUgbmFtZT0ibWltZS10eXBlVHlwZSI+Ci08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBtaW1lLXR5cGVUeXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBkZWZpbmVkIG1pbWUgdHlwZS4KLQotRXhhbXBsZToKLSJ0ZXh0L3BsYWluIgotCi1Vc2VkIGluOiBtaW1lLW1hcHBpbmcKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbXHB7TH1cLVxwe05kfV0rL1tccHtMfVwtXHB7TmR9XC5dKyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktY29uc3RyYWludFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgc2VjdXJpdHktY29uc3RyYWludFR5cGUgaXMgdXNlZCB0byBhc3NvY2lhdGUKLXNlY3VyaXR5IGNvbnN0cmFpbnRzIHdpdGggb25lIG9yIG1vcmUgd2ViIHJlc291cmNlCi1jb2xsZWN0aW9ucwotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6d2ViLXJlc291cmNlLWNvbGxlY3Rpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF1dGgtY29uc3RyYWludCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6YXV0aC1jb25zdHJhaW50VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlci1kYXRhLWNvbnN0cmFpbnQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnVzZXItZGF0YS1jb25zdHJhaW50VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZsZXQtbWFwcGluZ1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgc2VydmxldC1tYXBwaW5nVHlwZSBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGEKLXNlcnZsZXQgYW5kIGEgdXJsIHBhdHRlcm4uCi0KLVVzZWQgaW46IHdlYi1hcHAKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZXJ2bGV0LW5hbWVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6dXJsLXBhdHRlcm5UeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJzZXJ2bGV0LW5hbWVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUKLXNlcnZsZXQuIEVhY2ggc2VydmxldCBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYgotYXBwbGljYXRpb24uCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmxldFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgc2VydmxldFR5cGUgaXMgdXNlZCB0byBkZWNsYXJlIGEgc2VydmxldC4KLUl0IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGl2ZSBkYXRhIG9mIGEKLXNlcnZsZXQuIElmIGEganNwLWZpbGUgaXMgc3BlY2lmaWVkIGFuZCB0aGUgbG9hZC1vbi1zdGFydHVwCi1lbGVtZW50IGlzIHByZXNlbnQsIHRoZW4gdGhlIEpTUCBzaG91bGQgYmUgcHJlY29tcGlsZWQgYW5kCi1sb2FkZWQuCi0KLVVzZWQgaW46IHdlYi1hcHAKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmljb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VydmxldC1uYW1lVHlwZSIvPgotICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHNlcnZsZXQtY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkKLSAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBzZXJ2bGV0LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqc3AtZmlsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmpzcC1maWxlVHlwZSIvPgotCi0gICAgICAgIDwvY2hvaWNlPgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpwYXJhbS12YWx1ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2FkLW9uLXN0YXJ0dXAiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzCi0gICAgICAgIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZCAoaW5zdGFudGlhdGVkIGFuZCBoYXZlCi0gICAgICAgIGl0cyBpbml0KCkgY2FsbGVkKSBvbiB0aGUgc3RhcnR1cCBvZiB0aGUgd2ViCi0gICAgICAgIGFwcGxpY2F0aW9uLiBUaGUgb3B0aW9uYWwgY29udGVudHMgb2YgdGhlc2UKLSAgICAgICAgZWxlbWVudCBtdXN0IGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3JkZXIgaW4KLSAgICAgICAgd2hpY2ggdGhlIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZC4gSWYgdGhlIHZhbHVlCi0gICAgICAgIGlzIGEgbmVnYXRpdmUgaW50ZWdlciwgb3IgdGhlIGVsZW1lbnQgaXMgbm90Ci0gICAgICAgIHByZXNlbnQsIHRoZSBjb250YWluZXIgaXMgZnJlZSB0byBsb2FkIHRoZSBzZXJ2bGV0Ci0gICAgICAgIHdoZW5ldmVyIGl0IGNob29zZXMuIElmIHRoZSB2YWx1ZSBpcyBhIHBvc2l0aXZlCi0gICAgICAgIGludGVnZXIgb3IgMCwgdGhlIGNvbnRhaW5lciBtdXN0IGxvYWQgYW5kCi0gICAgICAgIGluaXRpYWxpemUgdGhlIHNlcnZsZXQgYXMgdGhlIGFwcGxpY2F0aW9uIGlzCi0gICAgICAgIGRlcGxveWVkLiBUaGUgY29udGFpbmVyIG11c3QgZ3VhcmFudGVlIHRoYXQKLSAgICAgICAgc2VydmxldHMgbWFya2VkIHdpdGggbG93ZXIgaW50ZWdlcnMgYXJlIGxvYWRlZAotICAgICAgICBiZWZvcmUgc2VydmxldHMgbWFya2VkIHdpdGggaGlnaGVyIGludGVnZXJzLiBUaGUKLSAgICAgICAgY29udGFpbmVyIG1heSBjaG9vc2UgdGhlIG9yZGVyIG9mIGxvYWRpbmcgb2YKLSAgICAgICAgc2VydmxldHMgd2l0aCB0aGUgc2FtZSBsb2FkLW9uLXN0YXJ0LXVwIHZhbHVlLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJydW4tYXMiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJ1bi1hc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWNvbmZpZ1R5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgc2Vzc2lvbi1jb25maWdUeXBlIGRlZmluZXMgdGhlIHNlc3Npb24gcGFyYW1ldGVycwotZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tdGltZW91dCIKLSAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOm5vbk5lZ2F0aXZlSW50ZWdlciIKLSAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHNlc3Npb24tdGltZW91dCBlbGVtZW50IGRlZmluZXMgdGhlIGRlZmF1bHQKLSAgICAgICAgc2Vzc2lvbiB0aW1lb3V0IGludGVydmFsIGZvciBhbGwgc2Vzc2lvbnMgY3JlYXRlZAotICAgICAgICBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHNwZWNpZmllZCB0aW1lb3V0Ci0gICAgICAgIG11c3QgYmUgZXhwcmVzc2VkIGluIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMuCi0gICAgICAgIElmIHRoZSB0aW1lb3V0IGlzIDAgb3IgbGVzcywgdGhlIGNvbnRhaW5lciBlbnN1cmVzCi0gICAgICAgIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiBzZXNzaW9ucyBpcyBuZXZlciB0byB0aW1lCi0gICAgICAgIG91dC4gSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBjb250YWluZXIKLSAgICAgICAgbXVzdCBzZXQgaXRzIGRlZmF1bHQgdGltZW91dCBwZXJpb2QuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIHRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIHNwZWNpZmllcyB0aGF0IHRoZSBjb21tdW5pY2F0aW9uCi1iZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyIHNob3VsZCBiZSBOT05FLCBJTlRFR1JBTCwgb3IKLUNPTkZJREVOVElBTC4gTk9ORSBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdAotcmVxdWlyZSBhbnkgdHJhbnNwb3J0IGd1YXJhbnRlZXMuIEEgdmFsdWUgb2YgSU5URUdSQUwgbWVhbnMKLXRoYXQgdGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgc2VudCBiZXR3ZWVuIHRoZQotY2xpZW50IGFuZCBzZXJ2ZXIgYmUgc2VudCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgY2FuJ3QgYmUKLWNoYW5nZWQgaW4gdHJhbnNpdC4gQ09ORklERU5USUFMIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uCi1yZXF1aXJlcyB0aGF0IHRoZSBkYXRhIGJlIHRyYW5zbWl0dGVkIGluIGEgZmFzaGlvbiB0aGF0Ci1wcmV2ZW50cyBvdGhlciBlbnRpdGllcyBmcm9tIG9ic2VydmluZyB0aGUgY29udGVudHMgb2YgdGhlCi10cmFuc21pc3Npb24uIEluIG1vc3QgY2FzZXMsIHRoZSBwcmVzZW5jZSBvZiB0aGUgSU5URUdSQUwgb3IKLUNPTkZJREVOVElBTCBmbGFnIHdpbGwgaW5kaWNhdGUgdGhhdCB0aGUgdXNlIG9mIFNTTCBpcwotcmVxdWlyZWQuCi0KLVVzZWQgaW46IHVzZXItZGF0YS1jb25zdHJhaW50Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5URUdSQUwiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ09ORklERU5USUFMIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLTwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1c2VyLWRhdGEtY29uc3RyYWludFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgdXNlci1kYXRhLWNvbnN0cmFpbnRUeXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgaG93Ci1kYXRhIGNvbW11bmljYXRlZCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIGNvbnRhaW5lciBzaG91bGQgYmUKLXByb3RlY3RlZC4KLQotVXNlZCBpbjogc2VjdXJpdHktY29uc3RyYWludAotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zcG9ydC1ndWFyYW50ZWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ3ZWItYXBwLXZlcnNpb25UeXBlIj4KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSByZWNvZ25pemVkIHZlcnNpb25zIG9mCi13ZWItYXBwbGljYXRpb24gc3VwcG9ydGVkLiBJdCBpcyB1c2VkIHRvIGRlc2lnbmF0ZSB0aGUKLXZlcnNpb24gb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotRXhhbXBsZToKLQotPHdlYi1hcHA+Ci0gICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgotLi4uCi08L3dlYi1hcHA+Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIuNCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi08L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2ViLWFwcFR5cGUiPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmljb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3RyaWJ1dGFibGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGV4dC1wYXJhbSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6cGFyYW0tdmFsdWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjb250ZXh0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uCi0gICAgICAgIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3Mgc2VydmxldCBjb250ZXh0Ci0gICAgICAgIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpmaWx0ZXJUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLW1hcHBpbmciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmZpbHRlci1tYXBwaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaXN0ZW5lciIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bGlzdGVuZXJUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlcnZsZXRUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbWFwcGluZyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VydmxldC1tYXBwaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLWNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2Vzc2lvbi1jb25maWdUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtaW1lLW1hcHBpbmciCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1pbWUtbWFwcGluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2VsY29tZS1maWxlLWxpc3QiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOndlbGNvbWUtZmlsZS1saXN0VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXJyb3ItcGFnZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZXJyb3ItcGFnZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianNwLWNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6anNwLWNvbmZpZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnJlc291cmNlLWVudi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtcmVmIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTpyZXNvdXJjZS1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LWNvbnN0cmFpbnQiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luLWNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6bG9naW4tY29uZmlnVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c2VjdXJpdHktcm9sZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTplbnYtZW50cnlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1sb2NhbC1yZWYiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmVqYi1sb2NhbC1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3RUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBsb3ltZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVwbG95bWVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp3ZWItYXBwLXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiLz4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWItcmVzb3VyY2UtY29sbGVjdGlvblR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgd2ViLXJlc291cmNlLWNvbGxlY3Rpb25UeXBlIGlzIHVzZWQgdG8gaWRlbnRpZnkgYSBzdWJzZXQKLW9mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluCi1hIHdlYiBhcHBsaWNhdGlvbiB0byB3aGljaCBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcy4gSWYKLW5vIEhUVFAgbWV0aG9kcyBhcmUgc3BlY2lmaWVkLCB0aGVuIHRoZSBzZWN1cml0eSBjb25zdHJhaW50Ci1hcHBsaWVzIHRvIGFsbCBIVFRQIG1ldGhvZHMuCi0KLVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLXJlc291cmNlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSB3ZWItcmVzb3VyY2UtbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGlzIHdlYgotICAgICAgICByZXNvdXJjZSBjb2xsZWN0aW9uLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iajJlZTp1cmwtcGF0dGVyblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaHR0cC1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqMmVlOmh0dHAtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWxjb21lLWZpbGUtbGlzdFR5cGUiPgotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgd2VsY29tZS1maWxlLWxpc3QgY29udGFpbnMgYW4gb3JkZXJlZCBsaXN0IG9mIHdlbGNvbWUKLWZpbGVzIGVsZW1lbnRzLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlbGNvbWUtZmlsZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImoyZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgd2VsY29tZS1maWxlIGVsZW1lbnQgY29udGFpbnMgZmlsZSBuYW1lIHRvIHVzZQotICAgICAgICBhcyBhIGRlZmF1bHQgd2VsY29tZSBmaWxlLCBzdWNoIGFzIGluZGV4Lmh0bWwKLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi08L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS94a2l0L3NjaGVtYXMvczRzL1hNTC54c2QgYi92MS94a2l0L3NjaGVtYXMvczRzL1hNTC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOGFkZDkuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9zY2hlbWFzL3M0cy9YTUwueHNkCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IURPQ1RZUEUgeHM6c2NoZW1hIFBVQkxJQyAiLS8vVzNDLy9EVEQgWE1MU0NIRU1BIDIwMDEwMi8vRU4iICJYTUxTY2hlbWEuZHRkIiA+Ci08eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbDpsYW5nPSJlbiI+Ci0KLSA8eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBTZWUgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwgYW5kCi0gICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5hbWVzcGFjZS4KLSAgPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj5UaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cAotICAgICAgICBzdWl0YWJsZSBmb3IgdXNlIGJ5Ci0gICAgICAgIHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyB4bWw6YmFzZSwgeG1sOmxhbmcgb3IgeG1sOnNwYWNlIGF0dHJpYnV0ZXMKLSAgICAgICAgb24gZWxlbWVudHMgdGhleSBkZWZpbmUuCi0KLSAgICAgICAgVG8gZW5hYmxlIHRoaXMsIHN1Y2ggYSBzY2hlbWEgbXVzdCBpbXBvcnQgdGhpcyBzY2hlbWEKLSAgICAgICAgZm9yIHRoZSBYTUwgbmFtZXNwYWNlLCBlLmcuIGFzIGZvbGxvd3M6Ci0gICAgICAgICZsdDtzY2hlbWEgLiAuIC4+Ci0gICAgICAgICAuIC4gLgotICAgICAgICAgJmx0O2ltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDMveG1sLnhzZCIvPgotCi0gICAgICAgIFN1YnNlcXVlbnRseSwgcXVhbGlmaWVkIHJlZmVyZW5jZSB0byBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMKLSAgICAgICAgb3IgdGhlIGdyb3VwIGRlZmluZWQgYmVsb3cgd2lsbCBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdCwgZS5nLgotCi0gICAgICAgICZsdDt0eXBlIC4gLiAuPgotICAgICAgICAgLiAuIC4KLSAgICAgICAgICZsdDthdHRyaWJ1dGVHcm91cCByZWY9InhtbDpzcGVjaWFsQXR0cnMiLz4KLSAKLSAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZQotICAgICAgICAgZWxlbWVudCB3aXRoIGFueSBvZiB0aG9zZSBhdHRyaWJ1dGVzPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj5JbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCi0gICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAotICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkLgotICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKLSAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4KLSAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCi0gICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwgU2NoZW1hCi0gICBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywgaWYgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlIGNoYW5nZXMsIHRoZSB2ZXJzaW9uCi0gICBvZiB0aGlzIGRvY3VtZW50IGF0Ci0gICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UKLSAgIGFjY29yZGluZ2x5OyB0aGUgdmVyc2lvbiBhdAotICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkIHdpbGwgbm90IGNoYW5nZS4KLSAgPC94czpkb2N1bWVudGF0aW9uPgotIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZyIgdHlwZT0ieHM6bGFuZ3VhZ2UiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPkluIGR1ZSBjb3Vyc2UsIHdlIHNob3VsZCBpbnN0YWxsIHRoZSByZWxldmFudCBJU08gMi0gYW5kIDMtbGV0dGVyCi0gICAgICAgICBjb2RlcyBhcyB0aGUgZW51bWVyYXRlZCBwb3NzaWJsZSB2YWx1ZXMgLiAuIC48L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmF0dHJpYnV0ZT4KLQotIDx4czphdHRyaWJ1dGUgbmFtZT0ic3BhY2UiIGRlZmF1bHQ9InByZXNlcnZlIj4KLSAgPHhzOnNpbXBsZVR5cGU+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIj4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlZmF1bHQiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByZXNlcnZlIi8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0gPC94czphdHRyaWJ1dGU+Ci0KLSA8eHM6YXR0cmlidXRlIG5hbWU9ImJhc2UiIHR5cGU9InhzOmFueVVSSSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+U2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbGJhc2UvIGZvcgotICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhdHRyaWJ1dGUuPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czphdHRyaWJ1dGU+Ci0KLSA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0ic3BlY2lhbEF0dHJzIj4KLSAgPHhzOmF0dHJpYnV0ZSByZWY9InhtbDpiYXNlIi8+Ci0gIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOnNwYWNlIi8+Ci0gPC94czphdHRyaWJ1dGVHcm91cD4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS94a2l0L3NjaGVtYXMvczRzL1hNTFNjaGVtYS54c2QgYi92MS94a2l0L3NjaGVtYXMvczRzL1hNTFNjaGVtYS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNzcyNTEuLjAwMDAwMDAKLS0tIGEvdjEveGtpdC9zY2hlbWFzL3M0cy9YTUxTY2hlbWEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjUwMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBYTUwgU2NoZW1hIHNjaGVtYSBmb3IgWE1MIFNjaGVtYXM6IFBhcnQgMTogU3RydWN0dXJlcyAtLT4KLTwhLS0gTm90ZSB0aGlzIHNjaGVtYSBpcyBOT1QgdGhlIG5vcm1hdGl2ZSBzdHJ1Y3R1cmVzIHNjaGVtYS4gLS0+Ci0KLTwhLS0gVGhlIHByb3NlIGNvcHkgaW4gdGhlIHN0cnVjdHVyZXMgUkVDIGlzIHRoZSBub3JtYXRpdmUgLS0+Ci0KLTwhLS0gdmVyc2lvbiAod2hpY2ggc2hvdWxkbid0IGRpZmZlciBmcm9tIHRoaXMgb25lIGV4Y2VwdCBmb3IgLS0+Ci0KLTwhLS0gdGhpcyBjb21tZW50IGFuZCBlbnRpdHkgZXhwYW5zaW9ucywgYnV0IGp1c3QgaW4gY2FzZSAtLT4KLQotPCFET0NUWVBFIHhzOnNjaGVtYSBQVUJMSUMgIi0vL1czQy8vRFREIFhNTFNDSEVNQSAyMDAxMDIvL0VOIiAiWE1MU2NoZW1hLmR0ZCIgWwotCi08IS0tIHByb3ZpZGUgSUQgdHlwZSBpbmZvcm1hdGlvbiBldmVuIGZvciBwYXJzZXJzIHdoaWNoIG9ubHkgcmVhZCB0aGUKLSAgICAgaW50ZXJuYWwgc3Vic2V0IC0tPgotPCFBVFRMSVNUIHhzOnNjaGVtYSAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmNvbXBsZXhUeXBlICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmNvbXBsZXhDb250ZW50ICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOnNpbXBsZUNvbnRlbnQgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmV4dGVuc2lvbiAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmVsZW1lbnQgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgotPCFBVFRMSVNUIHhzOmdyb3VwICAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPiAKLTwhQVRUTElTVCB4czphbGwgICAgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpjaG9pY2UgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpzZXF1ZW5jZSAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czphbnkgICAgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czphbnlBdHRyaWJ1dGUgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czphdHRyaWJ1dGUgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czphdHRyaWJ1dGVHcm91cCAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czp1bmlxdWUgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czprZXkgICAgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czprZXlyZWYgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpzZWxlY3RvciAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpmaWVsZCAgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czppbmNsdWRlICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czppbXBvcnQgICAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpyZWRlZmluZSAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhQVRUTElTVCB4czpub3RhdGlvbiAgICAgICAgaWQgIElEICAjSU1QTElFRD4KLTwhLS0KLSAgICAga2VlcCB0aGlzIHNjaGVtYSBYTUwxLjAgRFREIHZhbGlkCi0gIC0tPgotICAgICAgICA8IUVOVElUWSAlIHNjaGVtYUF0dHJzICd4bWxuczpoZnAgQ0RBVEEgI0lNUExJRUQnPgotCi0gICAgICAgIDwhRUxFTUVOVCBoZnA6aGFzRmFjZXQgRU1QVFk+Ci0gICAgICAgIDwhQVRUTElTVCBoZnA6aGFzRmFjZXQKLSAgICAgICAgICAgICAgICBuYW1lIE5NVE9LRU4gI1JFUVVJUkVEPgotCi0gICAgICAgIDwhRUxFTUVOVCBoZnA6aGFzUHJvcGVydHkgRU1QVFk+Ci0gICAgICAgIDwhQVRUTElTVCBoZnA6aGFzUHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lIE5NVE9LRU4gI1JFUVVJUkVECi0gICAgICAgICAgICAgICAgdmFsdWUgQ0RBVEEgI1JFUVVJUkVEPgotPCEtLQotICAgICAgICBNYWtlIHN1cmUgdGhhdCBwcm9jZXNzb3JzIHRoYXQgZG8gbm90IHJlYWQgdGhlIGV4dGVybmFsCi0gICAgICAgIHN1YnNldCB3aWxsIGtub3cgYWJvdXQgdGhlIHZhcmlvdXMgSURzIHdlIGRlY2xhcmUKLSAgLS0+Ci0gICAgICAgIDwhQVRUTElTVCB4czpzaW1wbGVUeXBlIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6bWF4RXhjbHVzaXZlIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6bWluRXhjbHVzaXZlIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6bWF4SW5jbHVzaXZlIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6bWluSW5jbHVzaXZlIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6dG90YWxEaWdpdHMgaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czpmcmFjdGlvbkRpZ2l0cyBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOmxlbmd0aCBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOm1pbkxlbmd0aCBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOm1heExlbmd0aCBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOmVudW1lcmF0aW9uIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6cGF0dGVybiBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOmFwcGluZm8gaWQgSUQgI0lNUExJRUQ+Ci0gICAgICAgIDwhQVRUTElTVCB4czpkb2N1bWVudGF0aW9uIGlkIElEICNJTVBMSUVEPgotICAgICAgICA8IUFUVExJU1QgeHM6bGlzdCBpZCBJRCAjSU1QTElFRD4KLSAgICAgICAgPCFBVFRMSVNUIHhzOnVuaW9uIGlkIElEICNJTVBMSUVEPgotICAgICAgICBdPgotPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBibG9ja0RlZmF1bHQ9IiNhbGwiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sOmxhbmc9IkVOIiB4bWxuczpoZnA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWhhc0ZhY2V0QW5kUHJvcGVydHkiPgotIDx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICBQYXJ0IDEgdmVyc2lvbjogSWQ6IFhNTFNjaGVtYS54c2QsdiAxLjUzIDIwMDMvMDIvMjQgMTc6NDA6MDcgaHQgRXhwIAotICAgIFBhcnQgMiB2ZXJzaW9uOiBJZDogZGF0YXR5cGVzLnhzZCx2IDEuNTggMjAwMy8wMi8yNiAxNDowMToyOSBodCBFeHAgCi0gIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSA8L3hzOmFubm90YXRpb24+Ci0KLQotIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvR3JvdXAvMjAwMi8wOS94bWxzY2hlbWEtMS9zdHJ1Y3R1cmVzLXdpdGgtZXJyYXRhLmh0bWwiPgotICAgVGhlIHNjaGVtYSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZG9jdW1lbnQgaXMgbm9ybWF0aXZlLAotICAgd2l0aCByZXNwZWN0IHRvIHRoZSBzeW50YWN0aWMgY29uc3RyYWludHMgaXQgZXhwcmVzc2VzIGluIHRoZQotICAgWE1MIFNjaGVtYSBsYW5ndWFnZS4gIFRoZSBkb2N1bWVudGF0aW9uICh3aXRoaW4gJmx0O2RvY3VtZW50YXRpb24+IGVsZW1lbnRzKQotICAgYmVsb3csIGlzIG5vdCBub3JtYXRpdmUsIGJ1dCByYXRoZXIgaGlnaGxpZ2h0cyBpbXBvcnRhbnQgYXNwZWN0cyBvZgotICAgdGhlIFczQyBSZWNvbW1lbmRhdGlvbiBvZiB3aGljaCB0aGlzIGlzIGEgcGFydDwveHM6ZG9jdW1lbnRhdGlvbj4KLSA8L3hzOmFubm90YXRpb24+Ci0KLSA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgVGhlIHNpbXBsZVR5cGUgZWxlbWVudCBhbmQgYWxsIG9mIGl0cyBtZW1iZXJzIGFyZSBkZWZpbmVkCi0gICAgICB0b3dhcmRzIHRoZSBlbmQgb2YgdGhpcyBzY2hlbWEgZG9jdW1lbnQ8L3hzOmRvY3VtZW50YXRpb24+Ci0gPC94czphbm5vdGF0aW9uPgotCi0gPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgR2V0IGFjY2VzcyB0byB0aGUgeG1sOiBhdHRyaWJ1dGUgZ3JvdXBzIGZvciB4bWw6bGFuZwotICAgICAgIGFzIGRlY2xhcmVkIG9uICdzY2hlbWEnIGFuZCAnZG9jdW1lbnRhdGlvbicgYmVsb3cKLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgPC94czphbm5vdGF0aW9uPgotIDwveHM6aW1wb3J0PgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im9wZW5BdHRycyI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgVGhpcyB0eXBlIGlzIGV4dGVuZGVkIGJ5IGFsbW9zdCBhbGwgc2NoZW1hIHR5cGVzCi0gICAgICAgdG8gYWxsb3cgYXR0cmlidXRlcyBmcm9tIG90aGVyIG5hbWVzcGFjZXMgdG8gYmUKLSAgICAgICBhZGRlZCB0byB1c2VyIHNjaGVtYXMuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVR5cGUiPgotICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImFubm90YXRlZCI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgVGhpcyB0eXBlIGlzIGV4dGVuZGVkIGJ5IGFsbCB0eXBlcyB3aGljaCBhbGxvdyBhbm5vdGF0aW9uCi0gICAgICAgb3RoZXIgdGhhbiAmbHQ7c2NoZW1hJmd0OyBpdHNlbGYKLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgPC94czphbm5vdGF0aW9uPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm9wZW5BdHRycyI+Ci0gICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+Ci0gICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmdyb3VwIG5hbWU9InNjaGVtYVRvcCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBUaGlzIGdyb3VwIGlzIGZvciB0aGUKLSAgIGVsZW1lbnRzIHdoaWNoIG9jY3VyIGZyZWVseSBhdCB0aGUgdG9wIGxldmVsIG9mIHNjaGVtYXMuCi0gICBBbGwgb2YgdGhlaXIgdHlwZXMgYXJlIGJhc2VkIG9uIHRoZSAiYW5ub3RhdGVkIiB0eXBlIGJ5IGV4dGVuc2lvbi48L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNob2ljZT4KLSAgIDx4czpncm91cCByZWY9InhzOnJlZGVmaW5hYmxlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmVsZW1lbnQiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6YXR0cmlidXRlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOm5vdGF0aW9uIi8+Ci0gIDwveHM6Y2hvaWNlPgotIDwveHM6Z3JvdXA+Ci0gCi0gPHhzOmdyb3VwIG5hbWU9InJlZGVmaW5hYmxlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIFRoaXMgZ3JvdXAgaXMgZm9yIHRoZQotICAgZWxlbWVudHMgd2hpY2ggY2FuIHNlbGYtcmVkZWZpbmUgKHNlZSAmbHQ7cmVkZWZpbmU+IGJlbG93KS48L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNob2ljZT4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6c2ltcGxlVHlwZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpjb21wbGV4VHlwZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpncm91cCIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphdHRyaWJ1dGVHcm91cCIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0iZm9ybUNob2ljZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBBIHV0aWxpdHkgdHlwZSwgbm90IGZvciBwdWJsaWMgdXNlPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icXVhbGlmaWVkIi8+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVucXVhbGlmaWVkIi8+Ci0gIDwveHM6cmVzdHJpY3Rpb24+Ci0gPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0icmVkdWNlZERlcml2YXRpb25Db250cm9sIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmRlcml2YXRpb25Db250cm9sIj4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5zaW9uIi8+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlc3RyaWN0aW9uIi8+Ci0gIDwveHM6cmVzdHJpY3Rpb24+Ci0gPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0iZGVyaXZhdGlvblNldCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBBIHV0aWxpdHkgdHlwZSwgbm90IGZvciBwdWJsaWMgdXNlPC94czpkb2N1bWVudGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAjYWxsIG9yIChwb3NzaWJseSBlbXB0eSkgc3Vic2V0IG9mIHtleHRlbnNpb24sIHJlc3RyaWN0aW9ufTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24+Ci0gICA8eHM6c2ltcGxlVHlwZT4gICAgCi0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjYWxsIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSAgIDx4czpzaW1wbGVUeXBlPgotICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpyZWR1Y2VkRGVyaXZhdGlvbkNvbnRyb2wiLz4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLSA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIGlkPSJzY2hlbWEiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXNjaGVtYSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm9wZW5BdHRycyI+Ci0gICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czppbmNsdWRlIi8+Ci0gICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czppbXBvcnQiLz4KLSAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOnJlZGVmaW5lIi8+Ci0gICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIi8+Ci0gICAgICA8L3hzOmNob2ljZT4KLSAgICAgIDx4czpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpzY2hlbWFUb3AiLz4KLSAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0TmFtZXNwYWNlIiB0eXBlPSJ4czphbnlVUkkiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4czpub3JtYWxpemVkU3RyaW5nIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmluYWxEZWZhdWx0IiB0eXBlPSJ4czpkZXJpdmF0aW9uU2V0IiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJibG9ja0RlZmF1bHQiIHR5cGU9InhzOmJsb2NrU2V0IiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGVGb3JtRGVmYXVsdCIgdHlwZT0ieHM6Zm9ybUNob2ljZSIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0idW5xdWFsaWZpZWQiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbGVtZW50Rm9ybURlZmF1bHQiIHR5cGU9InhzOmZvcm1DaG9pY2UiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9InVucXVhbGlmaWVkIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6a2V5IG5hbWU9ImVsZW1lbnQiPgotICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ4czplbGVtZW50Ii8+Ci0gICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+Ci0gIDwveHM6a2V5PgotCi0gIDx4czprZXkgbmFtZT0iYXR0cmlidXRlIj4KLSAgIDx4czpzZWxlY3RvciB4cGF0aD0ieHM6YXR0cmlidXRlIi8+Ci0gICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+Ci0gIDwveHM6a2V5PgotCi0gIDx4czprZXkgbmFtZT0idHlwZSI+Ci0gICA8eHM6c2VsZWN0b3IgeHBhdGg9InhzOmNvbXBsZXhUeXBlfHhzOnNpbXBsZVR5cGUiLz4KLSAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiLz4KLSAgPC94czprZXk+Ci0gCi0gIDx4czprZXkgbmFtZT0iZ3JvdXAiPgotICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ4czpncm91cCIvPgotICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIvPgotICA8L3hzOmtleT4KLSAKLSAgPHhzOmtleSBuYW1lPSJhdHRyaWJ1dGVHcm91cCI+Ci0gICA8eHM6c2VsZWN0b3IgeHBhdGg9InhzOmF0dHJpYnV0ZUdyb3VwIi8+Ci0gICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+Ci0gIDwveHM6a2V5PgotIAotICA8eHM6a2V5IG5hbWU9Im5vdGF0aW9uIj4KLSAgIDx4czpzZWxlY3RvciB4cGF0aD0ieHM6bm90YXRpb24iLz4KLSAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiLz4KLSAgPC94czprZXk+Ci0KLSAgPHhzOmtleSBuYW1lPSJpZGVudGl0eUNvbnN0cmFpbnQiPgotICAgPHhzOnNlbGVjdG9yIHhwYXRoPSIuLy94czprZXl8Li8veHM6dW5pcXVlfC4vL3hzOmtleXJlZiIvPgotICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIvPgotICA8L3hzOmtleT4KLQotIDwveHM6ZWxlbWVudD4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImFsbE5OSSI+Ci0gIDx4czphbm5vdGF0aW9uPjx4czpkb2N1bWVudGF0aW9uPgotICAgZm9yIG1heE9jY3VyczwveHM6ZG9jdW1lbnRhdGlvbj48L3hzOmFubm90YXRpb24+Ci0gIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAgIDx4czpzaW1wbGVUeXBlPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJvY2N1cnMiPgotICA8eHM6YW5ub3RhdGlvbj48eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIGZvciBhbGwgcGFydGljbGVzPC94czpkb2N1bWVudGF0aW9uPjwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHR5cGU9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iMSIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdHlwZT0ieHM6YWxsTk5JIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIi8+Ci0gPC94czphdHRyaWJ1dGVHcm91cD4KLQotIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJkZWZSZWYiPgotICA8eHM6YW5ub3RhdGlvbj48eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIGZvciBlbGVtZW50LCBncm91cCBhbmQgYXR0cmlidXRlR3JvdXAsCi0gICB3aGljaCBib3RoIGRlZmluZSBhbmQgcmVmZXJlbmNlPC94czpkb2N1bWVudGF0aW9uPjwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHR5cGU9InhzOlFOYW1lIi8+Ci0gPC94czphdHRyaWJ1dGVHcm91cD4KLQotIDx4czpncm91cCBuYW1lPSJ0eXBlRGVmUGFydGljbGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICdjb21wbGV4VHlwZScgdXNlcyB0aGlzPC94czpkb2N1bWVudGF0aW9uPjwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNob2ljZT4KLSAgIDx4czplbGVtZW50IG5hbWU9Imdyb3VwIiB0eXBlPSJ4czpncm91cFJlZiIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbGwiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Y2hvaWNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOnNlcXVlbmNlIi8+Ci0gIDwveHM6Y2hvaWNlPgotIDwveHM6Z3JvdXA+Ci0gCi0gCi0KLSA8eHM6Z3JvdXAgbmFtZT0ibmVzdGVkUGFydGljbGUiPgotICA8eHM6Y2hvaWNlPgotICAgPHhzOmVsZW1lbnQgbmFtZT0iZWxlbWVudCIgdHlwZT0ieHM6bG9jYWxFbGVtZW50Ii8+Ci0gICA8eHM6ZWxlbWVudCBuYW1lPSJncm91cCIgdHlwZT0ieHM6Z3JvdXBSZWYiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Y2hvaWNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOnNlcXVlbmNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmFueSIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotIAotIDx4czpncm91cCBuYW1lPSJwYXJ0aWNsZSI+Ci0gIDx4czpjaG9pY2U+Ci0gICA8eHM6ZWxlbWVudCBuYW1lPSJlbGVtZW50IiB0eXBlPSJ4czpsb2NhbEVsZW1lbnQiLz4KLSAgIDx4czplbGVtZW50IG5hbWU9Imdyb3VwIiB0eXBlPSJ4czpncm91cFJlZiIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbGwiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6Y2hvaWNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOnNlcXVlbmNlIi8+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmFueSIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ieHM6ZGVmUmVmIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpRTmFtZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJvcHRpb25hbCI+Ci0gICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJvaGliaXRlZCIvPgotICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ib3B0aW9uYWwiLz4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlcXVpcmVkIi8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0IiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpeGVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZvcm0iIHR5cGU9InhzOmZvcm1DaG9pY2UiLz4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRvcExldmVsQXR0cmlidXRlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmF0dHJpYnV0ZSI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZm9ybSIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Z3JvdXAgbmFtZT0iYXR0ckRlY2xzIj4KLSAgPHhzOnNlcXVlbmNlPgotICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiIHR5cGU9InhzOmF0dHJpYnV0ZSIvPgotICAgIDx4czplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZUdyb3VwIiB0eXBlPSJ4czphdHRyaWJ1dGVHcm91cFJlZiIvPgotICAgPC94czpjaG9pY2U+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOmFueUF0dHJpYnV0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gIDwveHM6c2VxdWVuY2U+Ci0gPC94czpncm91cD4KLQotIDx4czplbGVtZW50IG5hbWU9ImFueUF0dHJpYnV0ZSIgdHlwZT0ieHM6d2lsZGNhcmQiIGlkPSJhbnlBdHRyaWJ1dGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtYW55QXR0cmlidXRlIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6Z3JvdXAgbmFtZT0iY29tcGxleFR5cGVNb2RlbCI+Ci0gIDx4czpjaG9pY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOnNpbXBsZUNvbnRlbnQiLz4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6Y29tcGxleENvbnRlbnQiLz4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBUaGlzIGJyYW5jaCBpcyBzaG9ydCBmb3IKLSAgICZsdDtjb21wbGV4Q29udGVudD4KLSAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlUeXBlIj4KLSAgIC4uLgotICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAgICZsdDsvY29tcGxleENvbnRlbnQ+PC94czpkb2N1bWVudGF0aW9uPgotICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czp0eXBlRGVmUGFydGljbGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpjaG9pY2U+Ci0gPC94czpncm91cD4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJjb21wbGV4VHlwZSIgYWJzdHJhY3Q9InRydWUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOmdyb3VwIHJlZj0ieHM6Y29tcGxleFR5cGVNb2RlbCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIj4KLSAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIFdpbGwgYmUgcmVzdHJpY3RlZCB0byByZXF1aXJlZCBvciBmb3JiaWRkZW48L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1peGVkIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJmYWxzZSI+Ci0gICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBOb3QgYWxsb3dlZCBpZiBzaW1wbGVDb250ZW50IGNoaWxkIGlzIGNob3Nlbi4KLSAgICAgIE1heSBiZSBvdmVycmlkZW4gYnkgc2V0dGluZyBvbiBjb21wbGV4Q29udGVudCBjaGlsZC48L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDwveHM6YXR0cmlidXRlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWJzdHJhY3QiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9ImZhbHNlIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaW5hbCIgdHlwZT0ieHM6ZGVyaXZhdGlvblNldCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmxvY2siIHR5cGU9InhzOmRlcml2YXRpb25TZXQiLz4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRvcExldmVsQ29tcGxleFR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Y29tcGxleFR5cGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6Y29tcGxleFR5cGVNb2RlbCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxDb21wbGV4VHlwZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpjb21wbGV4VHlwZSI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpjb21wbGV4VHlwZU1vZGVsIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWJzdHJhY3QiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmluYWwiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmxvY2siIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJyZXN0cmljdGlvblR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4czp0eXBlRGVmUGFydGljbGUiLz4KLSAgICAgIDx4czpncm91cCByZWY9InhzOnNpbXBsZVJlc3RyaWN0aW9uTW9kZWwiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJiYXNlIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+ICAgICAgIAotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iY29tcGxleFJlc3RyaWN0aW9uVHlwZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpyZXN0cmljdGlvblR5cGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGhpcyBjaG9pY2UgaXMgYWRkZWQgc2ltcGx5IHRvCi0gICAgICAgICAgICAgICAgICAgbWFrZSB0aGlzIGEgdmFsaWQgcmVzdHJpY3Rpb24gcGVyIHRoZSBSRUM8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4czp0eXBlRGVmUGFydGljbGUiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PiAgICAgICAKLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImV4dGVuc2lvblR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czp0eXBlRGVmUGFydGljbGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmFzZSIgdHlwZT0ieHM6UU5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PiAgICAgICAKLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iY29tcGxleENvbnRlbnQiIGlkPSJjb21wbGV4Q29udGVudCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1jb21wbGV4Q29udGVudCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgIDx4czpjaG9pY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXN0cmljdGlvbiIgdHlwZT0ieHM6Y29tcGxleFJlc3RyaWN0aW9uVHlwZSIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJ4czpleHRlbnNpb25UeXBlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPiAgICAgCi0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWl4ZWQiIHR5cGU9InhzOmJvb2xlYW4iPgotICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgT3ZlcnJpZGVzIGFueSBzZXR0aW5nIG9uIGNvbXBsZXhUeXBlIHBhcmVudC48L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaW1wbGVSZXN0cmljdGlvblR5cGUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6cmVzdHJpY3Rpb25UeXBlIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlRoaXMgY2hvaWNlIGlzIGFkZGVkIHNpbXBseSB0bwotICAgICAgICAgICAgICAgICAgIG1ha2UgdGhpcyBhIHZhbGlkIHJlc3RyaWN0aW9uIHBlciB0aGUgUkVDPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6c2ltcGxlUmVzdHJpY3Rpb25Nb2RlbCIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YXR0ckRlY2xzIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaW1wbGVFeHRlbnNpb25UeXBlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmV4dGVuc2lvblR5cGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIE5vIHR5cGVEZWZQYXJ0aWNsZSBncm91cCByZWZlcmVuY2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YXR0ckRlY2xzIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9InNpbXBsZUNvbnRlbnQiIGlkPSJzaW1wbGVDb250ZW50Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXNpbXBsZUNvbnRlbnQiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6Y2hvaWNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmVzdHJpY3Rpb24iIHR5cGU9InhzOnNpbXBsZVJlc3RyaWN0aW9uVHlwZSIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJ4czpzaW1wbGVFeHRlbnNpb25UeXBlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0gCi0gPHhzOmVsZW1lbnQgbmFtZT0iY29tcGxleFR5cGUiIHR5cGU9InhzOnRvcExldmVsQ29tcGxleFR5cGUiIGlkPSJjb21wbGV4VHlwZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1jb21wbGV4VHlwZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYmxvY2tTZXQiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAjYWxsIG9yIChwb3NzaWJseSBlbXB0eSkgc3Vic2V0IG9mIHtzdWJzdGl0dXRpb24sIGV4dGVuc2lvbiwKLSAgICByZXN0cmljdGlvbn08L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6dW5pb24+Ci0gICAgPHhzOnNpbXBsZVR5cGU+ICAgIAotICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjYWxsIi8+Ci0gICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICA8eHM6bGlzdD4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpkZXJpdmF0aW9uQ29udHJvbCI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5zaW9uIi8+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVzdHJpY3Rpb24iLz4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzdWJzdGl0dXRpb24iLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmxpc3Q+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgPC94czp1bmlvbj4gIAotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudCIgYWJzdHJhY3Q9InRydWUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgVGhlIGVsZW1lbnQgZWxlbWVudCBjYW4gYmUgdXNlZCBlaXRoZXIKLSAgIGF0IHRoZSB0b3AgbGV2ZWwgdG8gZGVmaW5lIGFuIGVsZW1lbnQtdHlwZSBiaW5kaW5nIGdsb2JhbGx5LAotICAgb3Igd2l0aGluIGEgY29udGVudCBtb2RlbCB0byBlaXRoZXIgcmVmZXJlbmNlIGEgZ2xvYmFsbHktZGVmaW5lZAotICAgZWxlbWVudCBvciB0eXBlIG9yIGRlY2xhcmUgYW4gZWxlbWVudC10eXBlIGJpbmRpbmcgbG9jYWxseS4KLSAgIFRoZSByZWYgZm9ybSBpcyBub3QgYWxsb3dlZCBhdCB0aGUgdG9wIGxldmVsLjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InNpbXBsZVR5cGUiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY29tcGxleFR5cGUiIHR5cGU9InhzOmxvY2FsQ29tcGxleFR5cGUiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czpncm91cCByZWY9InhzOmlkZW50aXR5Q29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ieHM6ZGVmUmVmIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpRTmFtZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3Vic3RpdHV0aW9uR3JvdXAiIHR5cGU9InhzOlFOYW1lIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ieHM6b2NjdXJzIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0IiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpeGVkIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5pbGxhYmxlIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJmYWxzZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWJzdHJhY3QiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9ImZhbHNlIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaW5hbCIgdHlwZT0ieHM6ZGVyaXZhdGlvblNldCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmxvY2siIHR5cGU9InhzOmJsb2NrU2V0Ii8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmb3JtIiB0eXBlPSJ4czpmb3JtQ2hvaWNlIi8+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0b3BMZXZlbEVsZW1lbnQiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZWxlbWVudCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImNvbXBsZXhUeXBlIiB0eXBlPSJ4czpsb2NhbENvbXBsZXhUeXBlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czppZGVudGl0eUNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZvcm0iIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxFbGVtZW50Ij4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmVsZW1lbnQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb21wbGV4VHlwZSIgdHlwZT0ieHM6bG9jYWxDb21wbGV4VHlwZSIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6aWRlbnRpdHlDb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN1YnN0aXR1dGlvbkdyb3VwIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpbmFsIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFic3RyYWN0IiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImVsZW1lbnQiIHR5cGU9InhzOnRvcExldmVsRWxlbWVudCIgaWQ9ImVsZW1lbnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtZWxlbWVudCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9Imdyb3VwIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBncm91cCB0eXBlIGZvciBleHBsaWNpdCBncm91cHMsIG5hbWVkIHRvcC1sZXZlbCBncm91cHMgYW5kCi0gICBncm91cCByZWZlcmVuY2VzPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ4czpwYXJ0aWNsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOmRlZlJlZiIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOm9jY3VycyIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0icmVhbEdyb3VwIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmdyb3VwIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbGwiLz4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6Y2hvaWNlIi8+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOnNlcXVlbmNlIi8+Ci0gICAgIDwveHM6Y2hvaWNlPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWRHcm91cCI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpyZWFsR3JvdXAiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSI+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhbGwiPgotICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFsbCI+Ci0gICAgICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YWxsTW9kZWwiLz4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1pbk9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHVzZT0icHJvaGliaXRlZCIvPgotICAgICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgPC94czplbGVtZW50PgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlIiB0eXBlPSJ4czpzaW1wbGVFeHBsaWNpdEdyb3VwIi8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZSIgdHlwZT0ieHM6c2ltcGxlRXhwbGljaXRHcm91cCIvPgotICAgICA8L3hzOmNob2ljZT4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ3JvdXBSZWYiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6cmVhbEdyb3VwIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6UU5hbWUiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImV4cGxpY2l0R3JvdXAiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgZ3JvdXAgdHlwZSBmb3IgdGhlIHRocmVlIGtpbmRzIG9mIGdyb3VwPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpncm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpuZXN0ZWRQYXJ0aWNsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNpbXBsZUV4cGxpY2l0R3JvdXAiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZXhwbGljaXRHcm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpuZXN0ZWRQYXJ0aWNsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4T2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Z3JvdXAgbmFtZT0iYWxsTW9kZWwiPgotICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGhpcyBjaG9pY2Ugd2l0aCBtaW4vbWF4IGlzIGhlcmUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXZvaWQgYSBwYmxtIHdpdGggdGhlIEVsdDpBbGwvQ2hvaWNlL1NlcQotICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aWNsZSBkZXJpdmF0aW9uIGNvbnN0cmFpbnQ8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgIDx4czplbGVtZW50IG5hbWU9ImVsZW1lbnQiIHR5cGU9InhzOmVsZW1lbnRJbkFsbCIvPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgIDwveHM6c2VxdWVuY2U+Ci0gPC94czpncm91cD4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudEluQWxsIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPnJlc3RyaWN0ZWQgbWF4L21pbjwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bG9jYWxFbGVtZW50Ij4KLSAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiLz4KLSAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb21wbGV4VHlwZSIgdHlwZT0ieHM6bG9jYWxDb21wbGV4VHlwZSIvPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4czppZGVudGl0eUNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMCIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFsbE5OSSI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMCIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+ICAgIAotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhbGwiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBPbmx5IGVsZW1lbnRzIGFsbG93ZWQgaW5zaWRlPC94czpkb2N1bWVudGF0aW9uPgotICAgPC94czphbm5vdGF0aW9uPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpleHBsaWNpdEdyb3VwIj4KLSAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YWxsTW9kZWwiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMCIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFsbE5OSSI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPgotICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgIDwveHM6YXR0cmlidXRlPgotICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImFsbCIgaWQ9ImFsbCIgdHlwZT0ieHM6YWxsIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWFsbCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlIiB0eXBlPSJ4czpleHBsaWNpdEdyb3VwIiBpZD0iY2hvaWNlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWNob2ljZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UiIHR5cGU9InhzOmV4cGxpY2l0R3JvdXAiIGlkPSJzZXF1ZW5jZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1zZXF1ZW5jZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iZ3JvdXAiIHR5cGU9InhzOm5hbWVkR3JvdXAiIGlkPSJncm91cCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1ncm91cCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9IndpbGRjYXJkIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpuYW1lc3BhY2VMaXN0IiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIjI2FueSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHJvY2Vzc0NvbnRlbnRzIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJzdHJpY3QiPgotICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InNraXAiLz4KLSAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImxheCIvPgotICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaWN0Ii8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iYW55IiBpZD0iYW55Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWFueSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOndpbGRjYXJkIj4KLSAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ieHM6b2NjdXJzIi8+Ci0gICAgPC94czpleHRlbnNpb24+Ci0gICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgc2ltcGxlIHR5cGUgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgJ25hbWVzcGFjZScgYXR0ciBvZgotICAgJ2FueScgYW5kICdhbnlBdHRyaWJ1dGUnPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBWYWx1ZSBpcwotICAgICAgICAgICAgICAjI2FueSAgICAgIC0gLSBhbnkgbm9uLWNvbmZsaWN0aW5nIFdGWE1ML2F0dHJpYnV0ZSBhdCBhbGwKLQotICAgICAgICAgICAgICAjI290aGVyICAgIC0gLSBhbnkgbm9uLWNvbmZsaWN0aW5nIFdGWE1ML2F0dHJpYnV0ZSBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugb3RoZXIgdGhhbiB0YXJnZXROUwotCi0gICAgICAgICAgICAgICMjbG9jYWwgICAgLSAtIGFueSB1bnF1YWxpZmllZCBub24tY29uZmxpY3RpbmcgV0ZYTUwvYXR0cmlidXRlIAotCi0gICAgICAgICAgICAgIG9uZSBvciAgICAgLSAtIGFueSBub24tY29uZmxpY3RpbmcgV0ZYTUwvYXR0cmlidXRlIGZyb20KLSAgICAgICAgICAgICAgbW9yZSBVUkkgICAgICAgIHRoZSBsaXN0ZWQgbmFtZXNwYWNlcwotICAgICAgICAgICAgICByZWZlcmVuY2VzCi0gICAgICAgICAgICAgIChzcGFjZSBzZXBhcmF0ZWQpCi0KLSAgICAjI3RhcmdldE5hbWVzcGFjZSBvciAjI2xvY2FsIG1heSBhcHBlYXIgaW4gdGhlIGFib3ZlIGxpc3QsIHRvCi0gICAgICAgIHJlZmVyIHRvIHRoZSB0YXJnZXROYW1lc3BhY2Ugb2YgdGhlIGVuY2xvc2luZwotICAgICAgICBzY2hlbWEgb3IgYW4gYWJzZW50IHRhcmdldE5hbWVzcGFjZSByZXNwZWN0aXZlbHk8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9Im5hbWVzcGFjZUxpc3QiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjYW55Ii8+Ci0gICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iIyNvdGhlciIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6bGlzdD4KLSAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzOmFueVVSSSI+Ci0gICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjbG9jYWwiLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzOnVuaW9uPgotICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czpsaXN0PgotICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgdHlwZT0ieHM6dG9wTGV2ZWxBdHRyaWJ1dGUiIGlkPSJhdHRyaWJ1dGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtYXR0cmlidXRlIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlR3JvdXAiIGFic3RyYWN0PSJ0cnVlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgIDx4czpncm91cCByZWY9InhzOmF0dHJEZWNscyIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOmRlZlJlZiIvPgotICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gPC94czpjb21wbGV4VHlwZT4KLSAKLSA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWRBdHRyaWJ1dGVHcm91cCI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphdHRyaWJ1dGVHcm91cCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZUdyb3VwUmVmIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmF0dHJpYnV0ZUdyb3VwIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6UU5hbWUiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icHJvaGliaXRlZCIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlR3JvdXAiIHR5cGU9InhzOm5hbWVkQXR0cmlidXRlR3JvdXAiIGlkPSJhdHRyaWJ1dGVHcm91cCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hdHRyaWJ1dGVHcm91cCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZSIgaWQ9ImluY2x1ZGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtaW5jbHVkZSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hTG9jYXRpb24iIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJyZWRlZmluZSIgaWQ9InJlZGVmaW5lIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXJlZGVmaW5lIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6b3BlbkF0dHJzIj4KLSAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIvPgotICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6cmVkZWZpbmFibGUiLz4KLSAgICAgPC94czpjaG9pY2U+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hTG9jYXRpb24iIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJpbXBvcnQiIGlkPSJpbXBvcnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtaW1wb3J0Ii8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjaGVtYUxvY2F0aW9uIiB0eXBlPSJ4czphbnlVUkkiLz4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0ic2VsZWN0b3IiIGlkPSJzZWxlY3RvciI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1zZWxlY3RvciIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhwYXRoIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5BIHN1YnNldCBvZiBYUGF0aCBleHByZXNzaW9ucyBmb3IgdXNlCi1pbiBzZWxlY3RvcnM8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDx4czpkb2N1bWVudGF0aW9uPkEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYwotdXNlPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlRoZSBmb2xsb3dpbmcgcGF0dGVybiBpcyBpbnRlbmRlZCB0byBhbGxvdyBYUGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMgcGVyIHRoZSBmb2xsb3dpbmcgRUJORjoKLSAgICAgICAgICBTZWxlY3RvciAgICA6Oj0gICAgUGF0aCAoICd8JyBQYXRoICkqICAKLSAgICAgICAgICBQYXRoICAgIDo6PSAgICAoJy4vLycpPyBTdGVwICggJy8nIFN0ZXAgKSogIAotICAgICAgICAgIFN0ZXAgICAgOjo9ICAgICcuJyB8IE5hbWVUZXN0ICAKLSAgICAgICAgICBOYW1lVGVzdCAgICA6Oj0gICAgUU5hbWUgfCAnKicgfCBOQ05hbWUgJzonICcqJyAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZDo6IGlzIGFsc28gYWxsb3dlZAotICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwhLS0gVFNIIGNvbW1lbnRlZCBvdXQgc2luY2UgdGhpcyBpbmNvcnJlY3RseSBkb2VzIG5vdCBhbGxvdyB3aGl0ZSBzcGFjZSAtLT4KLSAgICAgICAgPCEtLSA8eHM6cGF0dGVybiB2YWx1ZT0iKFwuLy8pPygoKGNoaWxkOjopPygoXGlcYyo6KT8oXGlcYyp8XCopKSl8XC4pKC8oKChjaGlsZDo6KT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKSkqKFx8KFwuLy8pPygoKGNoaWxkOjopPygoXGlcYyo6KT8oXGlcYyp8XCopKSl8XC4pKC8oKChjaGlsZDo6KT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKSkqKSoiPiAKLSAgICAgICAgPC94czpwYXR0ZXJuPiAtLT4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0iZmllbGQiIGlkPSJmaWVsZCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1maWVsZCIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhwYXRoIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5BIHN1YnNldCBvZiBYUGF0aCBleHByZXNzaW9ucyBmb3IgdXNlCi1pbiBmaWVsZHM8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDx4czpkb2N1bWVudGF0aW9uPkEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYwotdXNlPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlRoZSBmb2xsb3dpbmcgcGF0dGVybiBpcyBpbnRlbmRlZCB0byBhbGxvdyBYUGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMgcGVyIHRoZSBzYW1lIEVCTkYgYXMgZm9yIHNlbGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgZm9sbG93aW5nIGNoYW5nZToKLSAgICAgICAgICBQYXRoICAgIDo6PSAgICAoJy4vLycpPyAoIFN0ZXAgJy8nICkqICggU3RlcCB8ICdAJyBOYW1lVGVzdCApIAotICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwhLS0gVFNIIGNvbW1lbnRlZCBvdXQgc2luY2UgdGhpcyBpbmNvcnJlY3RseSBkb2VzIG5vdCBhbGxvdyB3aGl0ZSBzcGFjZSAtLT4KLSAgICAgICAgPCEtLSA8eHM6cGF0dGVybiB2YWx1ZT0iKFwuLy8pPygoKChjaGlsZDo6KT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKS8pKigoKChjaGlsZDo6KT8oKFxpXGMqOik/KFxpXGMqfFwqKSkpfFwuKXwoKGF0dHJpYnV0ZTo6fEApKChcaVxjKjopPyhcaVxjKnxcKikpKSkoXHwoXC4vLyk/KCgoKGNoaWxkOjopPygoXGlcYyo6KT8oXGlcYyp8XCopKSl8XC4pLykqKCgoKGNoaWxkOjopPygoXGlcYyo6KT8oXGlcYyp8XCopKSl8XC4pfCgoYXR0cmlidXRlOjp8QCkoKFxpXGMqOik/KFxpXGMqfFwqKSkpKSkqIj4gCi0gICAgICAgIDwveHM6cGF0dGVybj4tLT4KLSAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImtleWJhc2UiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOnNlbGVjdG9yIi8+Ci0gICAgIDx4czplbGVtZW50IHJlZj0ieHM6ZmllbGQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLSA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmdyb3VwIG5hbWU9ImlkZW50aXR5Q29uc3RyYWludCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+VGhlIHRocmVlIGtpbmRzIG9mIGlkZW50aXR5IGNvbnN0cmFpbnRzLCBhbGwgd2l0aAotICAgICAgICAgICAgICAgICAgICAgdHlwZSBvZiBvciBkZXJpdmVkIGZyb20gJ2tleWJhc2UnLgotICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjaG9pY2U+Ci0gICA8eHM6ZWxlbWVudCByZWY9InhzOnVuaXF1ZSIvPgotICAgPHhzOmVsZW1lbnQgcmVmPSJ4czprZXkiLz4KLSAgIDx4czplbGVtZW50IHJlZj0ieHM6a2V5cmVmIi8+Ci0gIDwveHM6Y2hvaWNlPgotIDwveHM6Z3JvdXA+Ci0KLSA8eHM6ZWxlbWVudCBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzOmtleWJhc2UiIGlkPSJ1bmlxdWUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtdW5pcXVlIi8+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSA8L3hzOmVsZW1lbnQ+Ci0gPHhzOmVsZW1lbnQgbmFtZT0ia2V5IiB0eXBlPSJ4czprZXliYXNlIiBpZD0ia2V5Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWtleSIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gPC94czplbGVtZW50PgotIDx4czplbGVtZW50IG5hbWU9ImtleXJlZiIgaWQ9ImtleXJlZiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1rZXlyZWYiLz4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czprZXliYXNlIj4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWZlciIgdHlwZT0ieHM6UU5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gPC94czplbGVtZW50PgotCi0gPHhzOmVsZW1lbnQgbmFtZT0ibm90YXRpb24iIGlkPSJub3RhdGlvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1ub3RhdGlvbiIvPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHVibGljIiB0eXBlPSJ4czpwdWJsaWMiLz4KLSAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzeXN0ZW0iIHR5cGU9InhzOmFueVVSSSIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSA8L3hzOmVsZW1lbnQ+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJwdWJsaWMiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSBwdWJsaWMgaWRlbnRpZmllciwgcGVyIElTTyA4ODc5PC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiIvPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czplbGVtZW50IG5hbWU9ImFwcGluZm8iIGlkPSJhcHBpbmZvIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWFwcGluZm8iLz4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0gICAgPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICA8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNvdXJjZSIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9ImRvY3VtZW50YXRpb24iIGlkPSJkb2N1bWVudGF0aW9uIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWRvY3VtZW50YXRpb24iLz4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0gICAgPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICA8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNvdXJjZSIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czplbGVtZW50IG5hbWU9ImFubm90YXRpb24iIGlkPSJhbm5vdGF0aW9uIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWFubm90YXRpb24iLz4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6b3BlbkF0dHJzIj4KLSAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphcHBpbmZvIi8+Ci0gICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpkb2N1bWVudGF0aW9uIi8+Ci0gICAgICA8L3hzOmNob2ljZT4KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+Ci0gICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotIDx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIG5vdGF0aW9ucyBmb3IgdXNlIHdpdGhpbiBYTUwgU2NoZW1hIHNjaGVtYXM8L3hzOmRvY3VtZW50YXRpb24+Ci0gPC94czphbm5vdGF0aW9uPgotCi0gPHhzOm5vdGF0aW9uIG5hbWU9IlhNTFNjaGVtYVN0cnVjdHVyZXMiIHB1YmxpYz0ic3RydWN0dXJlcyIgc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA4L1hNTFNjaGVtYS54c2QiLz4KLSA8eHM6bm90YXRpb24gbmFtZT0iWE1MIiBwdWJsaWM9IlJFQy14bWwtMTk5ODAyMTAiIHN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMteG1sLTE5OTgwMjEwIi8+Ci0gIAotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhbnlUeXBlIiBtaXhlZD0idHJ1ZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICBOb3QgdGhlIHJlYWwgdXJUeXBlLCBidXQgYXMgY2xvc2UgYW4gYXBwcm94aW1hdGlvbiBhcyB3ZSBjYW4KLSAgIGdldCBpbiB0aGUgWE1MIHJlcHJlc2VudGF0aW9uPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpzZXF1ZW5jZT4KLSAgIDx4czphbnkgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgPC94czpzZXF1ZW5jZT4KLSAgPHhzOmFueUF0dHJpYnV0ZSBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBGaXJzdCB0aGUgYnVpbHQtaW4gcHJpbWl0aXZlIGRhdGF0eXBlcy4gIFRoZXNlIGRlZmluaXRpb25zIGFyZSBmb3IKLSAgICAgIGluZm9ybWF0aW9uIG9ubHksIHRoZSByZWFsIGJ1aWx0LWluIGRlZmluaXRpb25zIGFyZSBtYWdpYy4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEZvciBlYWNoIGJ1aWx0LWluIGRhdGF0eXBlIGluIHRoaXMgc2NoZW1hIChib3RoIHByaW1pdGl2ZSBhbmQKLSAgICAgIGRlcml2ZWQpIGNhbiBiZSB1bmlxdWVseSBhZGRyZXNzZWQgdmlhIGEgVVJJIGNvbnN0cnVjdGVkCi0gICAgICBhcyBmb2xsb3dzOgotICAgICAgICAxKSB0aGUgYmFzZSBVUkkgaXMgdGhlIFVSSSBvZiB0aGUgWE1MIFNjaGVtYSBuYW1lc3BhY2UKLSAgICAgICAgMikgdGhlIGZyYWdtZW50IGlkZW50aWZpZXIgaXMgdGhlIG5hbWUgb2YgdGhlIGRhdGF0eXBlCi0KLSAgICAgIEZvciBleGFtcGxlLCB0byBhZGRyZXNzIHRoZSBpbnQgZGF0YXR5cGUsIHRoZSBVUkkgaXM6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50Ci0KLSAgICAgIEFkZGl0aW9uYWxseSwgZWFjaCBmYWNldCBkZWZpbml0aW9uIGVsZW1lbnQgY2FuIGJlIHVuaXF1ZWx5Ci0gICAgICBhZGRyZXNzZWQgdmlhIGEgVVJJIGNvbnN0cnVjdGVkIGFzIGZvbGxvd3M6Ci0gICAgICAgIDEpIHRoZSBiYXNlIFVSSSBpcyB0aGUgVVJJIG9mIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZQotICAgICAgICAyKSB0aGUgZnJhZ21lbnQgaWRlbnRpZmllciBpcyB0aGUgbmFtZSBvZiB0aGUgZmFjZXQKLQotICAgICAgRm9yIGV4YW1wbGUsIHRvIGFkZHJlc3MgdGhlIG1heEluY2x1c2l2ZSBmYWNldCwgdGhlIFVSSSBpczoKLQotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNtYXhJbmNsdXNpdmUKLQotICAgICAgQWRkaXRpb25hbGx5LCBlYWNoIGZhY2V0IHVzYWdlIGluIGEgYnVpbHQtaW4gZGF0YXR5cGUgZGVmaW5pdGlvbgotICAgICAgY2FuIGJlIHVuaXF1ZWx5IGFkZHJlc3NlZCB2aWEgYSBVUkkgY29uc3RydWN0ZWQgYXMgZm9sbG93czoKLSAgICAgICAgMSkgdGhlIGJhc2UgVVJJIGlzIHRoZSBVUkkgb2YgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlCi0gICAgICAgIDIpIHRoZSBmcmFnbWVudCBpZGVudGlmaWVyIGlzIHRoZSBuYW1lIG9mIHRoZSBkYXRhdHlwZSwgZm9sbG93ZWQKLSAgICAgICAgICAgYnkgYSBwZXJpb2QgKCIuIikgZm9sbG93ZWQgYnkgdGhlIG5hbWUgb2YgdGhlIGZhY2V0Ci0KLSAgICAgIEZvciBleGFtcGxlLCB0byBhZGRyZXNzIHRoZSB1c2FnZSBvZiB0aGUgbWF4SW5jbHVzaXZlIGZhY2V0IGluCi0gICAgICB0aGUgZGVmaW5pdGlvbiBvZiBpbnQsIHRoZSBVUkkgaXM6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50Lm1heEluY2x1c2l2ZQotCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ic3RyaW5nIiBpZD0ic3RyaW5nIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNzdHJpbmciLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9InByZXNlcnZlIiBpZD0ic3RyaW5nLnByZXNlcnZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImJvb2xlYW4iIGlkPSJib29sZWFuIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiIHZhbHVlPSJmaW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2Jvb2xlYW4iLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImJvb2xlYW4ud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJmbG9hdCIgaWQ9ImZsb2F0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0idG90YWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IiB2YWx1ZT0iZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2Zsb2F0Ii8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJmbG9hdC53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImRvdWJsZSIgaWQ9ImRvdWJsZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InRvdGFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIgdmFsdWU9ImZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkb3VibGUiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJkb3VibGUud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkZWNpbWFsIiBpZD0iZGVjaW1hbCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ0b3RhbERpZ2l0cyIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImZyYWN0aW9uRGlnaXRzIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJ0b3RhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImRlY2ltYWwud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgIDx4czpzaW1wbGVUeXBlIG5hbWU9ImR1cmF0aW9uIiBpZD0iZHVyYXRpb24iPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZHVyYXRpb24iLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJkdXJhdGlvbi53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpzaW1wbGVUeXBlIG5hbWU9ImRhdGVUaW1lIiBpZD0iZGF0ZVRpbWUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RhdGVUaW1lIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZGF0ZVRpbWUud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ0aW1lIiBpZD0idGltZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdGltZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9InRpbWUud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkYXRlIiBpZD0iZGF0ZSI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkYXRlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iZGF0ZS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImdZZWFyTW9udGgiIGlkPSJnWWVhck1vbnRoIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dZZWFyTW9udGgiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJnWWVhck1vbnRoLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZ1llYXIiIGlkPSJnWWVhciI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ1llYXIiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJnWWVhci53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0iZ01vbnRoRGF5IiBpZD0iZ01vbnRoRGF5Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnTW9udGhEYXkiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiBmaXhlZD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBpZD0iZ01vbnRoRGF5LndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZ0RheSIgaWQ9ImdEYXkiPgotICAgIDx4czphbm5vdGF0aW9uPgotICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnRGF5Ii8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICAgICAgICAgIGlkPSJnRGF5LndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8eHM6c2ltcGxlVHlwZSBuYW1lPSJnTW9udGgiIGlkPSJnTW9udGgiPgotICAgIDx4czphbm5vdGF0aW9uPgotICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnTW9udGgiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgICAgICAgICAgaWQ9ImdNb250aC53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJoZXhCaW5hcnkiIGlkPSJoZXhCaW5hcnkiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluTGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4TGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2JpbmFyeSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iaGV4QmluYXJ5LndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0iYmFzZTY0QmluYXJ5IiBpZD0iYmFzZTY0QmluYXJ5Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2Jhc2U2NEJpbmFyeSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iYmFzZTY0QmluYXJ5LndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotCi0gICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJhbnlVUkkiIGlkPSJhbnlVUkkiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluTGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4TGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2FueVVSSSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKLSAgICAgICAgaWQ9ImFueVVSSS53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJRTmFtZSIgaWQ9IlFOYW1lIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluTGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4TGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI1FOYW1lIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgotICAgICAgICBpZD0iUU5hbWUud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTk9UQVRJT04iIGlkPSJOT1RBVElPTiI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czphcHBpbmZvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOT1RBVElPTiIvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIE5PVEFUSU9OIGNhbm5vdCBiZSB1c2VkIGRpcmVjdGx5IGluIGEgc2NoZW1hOyByYXRoZXIgYSB0eXBlCi0gICAgICAgIG11c3QgYmUgZGVyaXZlZCBmcm9tIGl0IGJ5IHNwZWNpZnlpbmcgYXQgbGVhc3Qgb25lIGVudW1lcmF0aW9uCi0gICAgICAgIGZhY2V0IHdob3NlIHZhbHVlIGlzIHRoZSBuYW1lIG9mIGEgTk9UQVRJT04gZGVjbGFyZWQgaW4gdGhlCi0gICAgICAgIHNjaGVtYS4KLSAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgotICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCi0gICAgICAgIGlkPSJOT1RBVElPTi53aGl0ZVNwYWNlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgTm93IHRoZSBkZXJpdmVkIHByaW1pdGl2ZSB0eXBlcwotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Im5vcm1hbGl6ZWRTdHJpbmciIGlkPSJub3JtYWxpemVkU3RyaW5nIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25vcm1hbGl6ZWRTdHJpbmciLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0icmVwbGFjZSIKLSAgICAgICAgaWQ9Im5vcm1hbGl6ZWRTdHJpbmcud2hpdGVTcGFjZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ0b2tlbiIgaWQ9InRva2VuIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Rva2VuIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpub3JtYWxpemVkU3RyaW5nIj4KLSAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgaWQ9InRva2VuLndoaXRlU3BhY2UiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ibGFuZ3VhZ2UiIGlkPSJsYW5ndWFnZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNsYW5ndWFnZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgPHhzOnBhdHRlcm4KLSAgICAgICAgdmFsdWU9IlthLXpBLVpdezEsOH0oLVthLXpBLVowLTldezEsOH0pKiIKLSAgICAgICAgICAgICAgICBpZD0ibGFuZ3VhZ2UucGF0dGVybiI+Ci0gICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sI05ULUxhbmd1YWdlSUQiPgotICAgICAgICAgICAgcGF0dGVybiBzcGVjaWZpZXMgdGhlIGNvbnRlbnQgb2Ygc2VjdGlvbiAyLjEyIG9mIFhNTCAxLjBlMgotICAgICAgICAgICAgYW5kIFJGQyAzMDY2IChSZXZpc2VkIHZlcnNpb24gb2YgUkZDIDE3NjYpLgotICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPC94czpwYXR0ZXJuPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJJRFJFRlMiIGlkPSJJRFJFRlMiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluTGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4TGVuZ3RoIi8+Ci0gICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgPC94czphcHBpbmZvPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jSURSRUZTIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6SURSRUYiLz4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOm1pbkxlbmd0aCB2YWx1ZT0iMSIgaWQ9IklEUkVGUy5taW5MZW5ndGgiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iRU5USVRJRVMiIGlkPSJFTlRJVElFUyI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNFTlRJVElFUyIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOkVOVElUWSIvPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6bWluTGVuZ3RoIHZhbHVlPSIxIiBpZD0iRU5USVRJRVMubWluTGVuZ3RoIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Ik5NVE9LRU4iIGlkPSJOTVRPS0VOIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05NVE9LRU4iLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJcYysiIGlkPSJOTVRPS0VOLnBhdHRlcm4iPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCNOVC1ObXRva2VuIj4KLSAgICAgICAgICAgIHBhdHRlcm4gbWF0Y2hlcyBwcm9kdWN0aW9uIDcgZnJvbSB0aGUgWE1MIHNwZWMKLSAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDwveHM6cGF0dGVybj4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTk1UT0tFTlMiIGlkPSJOTVRPS0VOUyI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KLSAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgotICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+Ci0gICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOTVRPS0VOUyIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOk5NVE9LRU4iLz4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOm1pbkxlbmd0aCB2YWx1ZT0iMSIgaWQ9Ik5NVE9LRU5TLm1pbkxlbmd0aCIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJOYW1lIiBpZD0iTmFtZSI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOYW1lIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iXGlcYyoiIGlkPSJOYW1lLnBhdHRlcm4iPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sI05ULU5hbWUiPgotICAgICAgICAgICAgcGF0dGVybiBtYXRjaGVzIHByb2R1Y3Rpb24gNSBmcm9tIHRoZSBYTUwgc3BlYwotICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPC94czpwYXR0ZXJuPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJOQ05hbWUiIGlkPSJOQ05hbWUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTkNOYW1lIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOYW1lIj4KLSAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJbXGktWzpdXVtcYy1bOl1dKiIgaWQ9Ik5DTmFtZS5wYXR0ZXJuIj4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwtbmFtZXMvI05ULU5DTmFtZSI+Ci0gICAgICAgICAgICBwYXR0ZXJuIG1hdGNoZXMgcHJvZHVjdGlvbiA0IGZyb20gdGhlIE5hbWVzcGFjZXMgaW4gWE1MIHNwZWMKLSAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDwveHM6cGF0dGVybj4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgIDx4czpzaW1wbGVUeXBlIG5hbWU9IklEIiBpZD0iSUQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jSUQiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5DTmFtZSIvPgotICAgPC94czpzaW1wbGVUeXBlPgotCi0gICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJJRFJFRiIgaWQ9IklEUkVGIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0lEUkVGIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOQ05hbWUiLz4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iRU5USVRZIiBpZD0iRU5USVRZIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0VOVElUWSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIi8+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iaW50ZWdlciIgaWQ9ImludGVnZXIiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jaW50ZWdlciIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZGVjaW1hbCI+Ci0gICAgICA8eHM6ZnJhY3Rpb25EaWdpdHMgdmFsdWU9IjAiIGZpeGVkPSJ0cnVlIiBpZD0iaW50ZWdlci5mcmFjdGlvbkRpZ2l0cyIvPgotICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9J1stK10/WzAtOV0rJy8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Im5vblBvc2l0aXZlSW50ZWdlciIgaWQ9Im5vblBvc2l0aXZlSW50ZWdlciI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNub25Qb3NpdGl2ZUludGVnZXIiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludGVnZXIiPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMCIgaWQ9Im5vblBvc2l0aXZlSW50ZWdlci5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ibmVnYXRpdmVJbnRlZ2VyIiBpZD0ibmVnYXRpdmVJbnRlZ2VyIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25lZ2F0aXZlSW50ZWdlciIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9uUG9zaXRpdmVJbnRlZ2VyIj4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9Ii0xIiBpZD0ibmVnYXRpdmVJbnRlZ2VyLm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJsb25nIiBpZD0ibG9uZyI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IiB2YWx1ZT0iZmluaXRlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNsb25nIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnRlZ2VyIj4KLSAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9Ii05MjIzMzcyMDM2ODU0Nzc1ODA4IiBpZD0ibG9uZy5taW5JbmNsdXNpdmUiLz4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjkyMjMzNzIwMzY4NTQ3NzU4MDciIGlkPSJsb25nLm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJpbnQiIGlkPSJpbnQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jaW50Ii8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpsb25nIj4KLSAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9Ii0yMTQ3NDgzNjQ4IiBpZD0iaW50Lm1pbkluY2x1c2l2ZSIvPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMjE0NzQ4MzY0NyIgaWQ9ImludC5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ic2hvcnQiIGlkPSJzaG9ydCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNzaG9ydCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aW50Ij4KLSAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9Ii0zMjc2OCIgaWQ9InNob3J0Lm1pbkluY2x1c2l2ZSIvPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMzI3NjciIGlkPSJzaG9ydC5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYnl0ZSIgaWQ9ImJ5dGUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYnl0ZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c2hvcnQiPgotICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iLTEyOCIgaWQ9ImJ5dGUubWluSW5jbHVzaXZlIi8+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIxMjciIGlkPSJieXRlLm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJub25OZWdhdGl2ZUludGVnZXIiIGlkPSJub25OZWdhdGl2ZUludGVnZXIiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9uTmVnYXRpdmVJbnRlZ2VyIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnRlZ2VyIj4KLSAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9IjAiIGlkPSJub25OZWdhdGl2ZUludGVnZXIubWluSW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InVuc2lnbmVkTG9uZyIgaWQ9InVuc2lnbmVkTG9uZyI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbz4KLSAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IiB2YWx1ZT0iZmluaXRlIi8+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZExvbmciLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIxODQ0Njc0NDA3MzcwOTU1MTYxNSIKLSAgICAgICAgaWQ9InVuc2lnbmVkTG9uZy5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idW5zaWduZWRJbnQiIGlkPSJ1bnNpZ25lZEludCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZEludCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dW5zaWduZWRMb25nIj4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjQyOTQ5NjcyOTUiCi0gICAgICAgIGlkPSJ1bnNpZ25lZEludC5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idW5zaWduZWRTaG9ydCIgaWQ9InVuc2lnbmVkU2hvcnQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRTaG9ydCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dW5zaWduZWRJbnQiPgotICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iNjU1MzUiCi0gICAgICAgIGlkPSJ1bnNpZ25lZFNob3J0Lm1heEluY2x1c2l2ZSIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ1bnNpZ25lZEJ5dGUiIGlkPSJ1bnNpZ25lZEJ5dGUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRCeXRlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp1bnNpZ25lZFNob3J0Ij4KLSAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjI1NSIgaWQ9InVuc2lnbmVkQnl0ZS5tYXhJbmNsdXNpdmUiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0icG9zaXRpdmVJbnRlZ2VyIiBpZD0icG9zaXRpdmVJbnRlZ2VyIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Bvc2l0aXZlSW50ZWdlciIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9IjEiIGlkPSJwb3NpdGl2ZUludGVnZXIubWluSW5jbHVzaXZlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0iZGVyaXZhdGlvbkNvbnRyb2wiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0gICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InN1YnN0aXR1dGlvbiIvPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbnNpb24iLz4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVzdHJpY3Rpb24iLz4KLSAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGlzdCIvPgotICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmlvbiIvPgotICA8L3hzOnJlc3RyaWN0aW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotIDx4czpncm91cCBuYW1lPSJzaW1wbGVEZXJpdmF0aW9uIj4KLSAgPHhzOmNob2ljZT4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOnJlc3RyaWN0aW9uIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpsaXN0Ii8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czp1bmlvbiIvPgotICA8L3hzOmNob2ljZT4KLSA8L3hzOmdyb3VwPgotCi0gPHhzOnNpbXBsZVR5cGUgbmFtZT0ic2ltcGxlRGVyaXZhdGlvblNldCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAjYWxsIG9yIChwb3NzaWJseSBlbXB0eSkgc3Vic2V0IG9mIHtyZXN0cmljdGlvbiwgdW5pb24sIGxpc3R9Ci0gICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnVuaW9uPgotICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjYWxsIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSAgIDx4czpzaW1wbGVUeXBlPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpkZXJpdmF0aW9uQ29udHJvbCI+Ci0gICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGlzdCIvPgotICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVuaW9uIi8+Ci0gICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVzdHJpY3Rpb24iLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ic2ltcGxlVHlwZSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6c2ltcGxlRGVyaXZhdGlvbiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpbmFsIiB0eXBlPSJ4czpzaW1wbGVEZXJpdmF0aW9uU2V0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIj4KLSAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICBDYW4gYmUgcmVzdHJpY3RlZCB0byByZXF1aXJlZCBvciBmb3JiaWRkZW4KLSAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idG9wTGV2ZWxTaW1wbGVUeXBlIj4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4czpncm91cCByZWY9InhzOnNpbXBsZURlcml2YXRpb24iLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InJlcXVpcmVkIgotICAgICAgICAgICAgIHR5cGU9InhzOk5DTmFtZSI+Ci0gICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgUmVxdWlyZWQgYXQgdGhlIHRvcCBsZXZlbAotICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsU2ltcGxlVHlwZSI+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnNpbXBsZVR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpzaW1wbGVEZXJpdmF0aW9uIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJwcm9oaWJpdGVkIj4KLSAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICBGb3JiaWRkZW4gd2hlbiBuZXN0ZWQKLSAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpbmFsIiB1c2U9InByb2hpYml0ZWQiLz4KLSAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czp0b3BMZXZlbFNpbXBsZVR5cGUiIGlkPSJzaW1wbGVUeXBlIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtc2ltcGxlVHlwZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpncm91cCBuYW1lPSJmYWNldHMiPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgV2Ugc2hvdWxkIHVzZSBhIHN1YnN0aXR1dGlvbiBncm91cCBmb3IgZmFjZXRzLCBidXQKLSAgICAgICB0aGF0J3MgcnVsZWQgb3V0IGJlY2F1c2UgaXQgd291bGQgYWxsb3cgdXNlcnMgdG8KLSAgICAgICBhZGQgdGhlaXIgb3duLCB3aGljaCB3ZSdyZSBub3QgcmVhZHkgZm9yIHlldC4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6Y2hvaWNlPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6bWluRXhjbHVzaXZlIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czptaW5JbmNsdXNpdmUiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOm1heEV4Y2x1c2l2ZSIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6bWF4SW5jbHVzaXZlIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czp0b3RhbERpZ2l0cyIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6ZnJhY3Rpb25EaWdpdHMiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOmxlbmd0aCIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHM6bWluTGVuZ3RoIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czptYXhMZW5ndGgiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzOmVudW1lcmF0aW9uIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czp3aGl0ZVNwYWNlIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpwYXR0ZXJuIi8+Ci0gICA8L3hzOmNob2ljZT4KLSAgPC94czpncm91cD4KLQotICA8eHM6Z3JvdXAgbmFtZT0ic2ltcGxlUmVzdHJpY3Rpb25Nb2RlbCI+Ci0gICA8eHM6c2VxdWVuY2U+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ4czpmYWNldHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Z3JvdXA+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0icmVzdHJpY3Rpb24iIGlkPSJyZXN0cmljdGlvbiI+Ci0gICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtcmVzdHJpY3Rpb24iPgotICAgICAgICAgIGJhc2UgYXR0cmlidXRlIGFuZCBzaW1wbGVUeXBlIGNoaWxkIGFyZSBtdXR1YWxseQotICAgICAgICAgIGV4Y2x1c2l2ZSwgYnV0IG9uZSBvciBvdGhlciBpcyByZXF1aXJlZAotICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgICAgIDx4czpncm91cCByZWY9InhzOnNpbXBsZVJlc3RyaWN0aW9uTW9kZWwiLz4KLSAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmFzZSIgdHlwZT0ieHM6UU5hbWUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJsaXN0IiBpZD0ibGlzdCI+Ci0gICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbGlzdCI+Ci0gICAgICAgICAgaXRlbVR5cGUgYXR0cmlidXRlIGFuZCBzaW1wbGVUeXBlIGNoaWxkIGFyZSBtdXR1YWxseQotICAgICAgICAgIGV4Y2x1c2l2ZSwgYnV0IG9uZSBvciBvdGhlciBpcyByZXF1aXJlZAotICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Iml0ZW1UeXBlIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czplbGVtZW50IG5hbWU9InVuaW9uIiBpZD0idW5pb24iPgotICAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LXVuaW9uIj4KLSAgICAgICAgICBtZW1iZXJUeXBlcyBhdHRyaWJ1dGUgbXVzdCBiZSBub24tZW1wdHkgb3IgdGhlcmUgbXVzdCBiZQotICAgICAgICAgIGF0IGxlYXN0IG9uZSBzaW1wbGVUeXBlIGNoaWxkCi0gICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgotICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InNpbXBsZVR5cGUiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lbWJlclR5cGVzIiB1c2U9Im9wdGlvbmFsIj4KLSAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6UU5hbWUiLz4KLSAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXQiPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpeGVkIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIgotICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5vRml4ZWRGYWNldCI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpmYWNldCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaXhlZCIgdXNlPSJwcm9oaWJpdGVkIi8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibWluRXhjbHVzaXZlIiBpZD0ibWluRXhjbHVzaXZlIiB0eXBlPSJ4czpmYWNldCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LW1pbkV4Y2x1c2l2ZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotICA8eHM6ZWxlbWVudCBuYW1lPSJtaW5JbmNsdXNpdmUiIGlkPSJtaW5JbmNsdXNpdmUiIHR5cGU9InhzOmZhY2V0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbWluSW5jbHVzaXZlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibWF4RXhjbHVzaXZlIiBpZD0ibWF4RXhjbHVzaXZlIiB0eXBlPSJ4czpmYWNldCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LW1heEV4Y2x1c2l2ZSIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotICA8eHM6ZWxlbWVudCBuYW1lPSJtYXhJbmNsdXNpdmUiIGlkPSJtYXhJbmNsdXNpdmUiIHR5cGU9InhzOmZhY2V0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbWF4SW5jbHVzaXZlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im51bUZhY2V0Ij4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZmFjZXQiPgotICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ0b3RhbERpZ2l0cyIgaWQ9InRvdGFsRGlnaXRzIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtdG90YWxEaWdpdHMiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bnVtRmFjZXQiPgotICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpwb3NpdGl2ZUludGVnZXIiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0gIDx4czplbGVtZW50IG5hbWU9ImZyYWN0aW9uRGlnaXRzIiBpZD0iZnJhY3Rpb25EaWdpdHMiIHR5cGU9InhzOm51bUZhY2V0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtZnJhY3Rpb25EaWdpdHMiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJsZW5ndGgiIGlkPSJsZW5ndGgiIHR5cGU9InhzOm51bUZhY2V0Ij4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbGVuZ3RoIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0gIDx4czplbGVtZW50IG5hbWU9Im1pbkxlbmd0aCIgaWQ9Im1pbkxlbmd0aCIgdHlwZT0ieHM6bnVtRmFjZXQiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1taW5MZW5ndGgiLz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gIDwveHM6ZWxlbWVudD4KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibWF4TGVuZ3RoIiBpZD0ibWF4TGVuZ3RoIiB0eXBlPSJ4czpudW1GYWNldCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LW1heExlbmd0aCIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czplbGVtZW50IG5hbWU9ImVudW1lcmF0aW9uIiBpZD0iZW51bWVyYXRpb24iIHR5cGU9InhzOm5vRml4ZWRGYWNldCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbgotICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LWVudW1lcmF0aW9uIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0id2hpdGVTcGFjZSIgaWQ9IndoaXRlU3BhY2UiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24KLSAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC13aGl0ZVNwYWNlIi8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmZhY2V0Ij4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJlc2VydmUiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlcGxhY2UiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNvbGxhcHNlIi8+Ci0gICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czplbGVtZW50IG5hbWU9InBhdHRlcm4iIGlkPSJwYXR0ZXJuIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgIDx4czpkb2N1bWVudGF0aW9uCi0gICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtcGF0dGVybiIvPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpub0ZpeGVkRmFjZXQiPgotICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLTwveHM6c2NoZW1hPgo=